[
  {
    "path": "BingSiteAuth.xml",
    "content": "<?xml version=\"1.0\"?>\n<users>\n\t<user>D45AA4276907D8A86808F0D7C84BC7BC</user>\n</users>"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\n### 5.3.1\n- Added basic Typescript support\n\n### 5.3.0\n\n- BGSet: Support adding multiple images/backgrounds through `event.detail.fullSrc` ([#827](https://github.com/aFarkas/lazysizes/issues/827))\n- RiaS plugin: Use `source` based config in case of `picture` element usage ([#764](https://github.com/aFarkas/lazysizes/issues/831))\n- BlurUp plugin: Added possibility to change classNames ([#814](https://github.com/aFarkas/lazysizes/pull/814))\n- Core: Added `iframeLoadMode` option (see [#810](https://github.com/aFarkas/lazysizes/pull/810))\n\n## 5.2.2\n- Add correct AMD module pattern for plugins.\n\n## 5.2.1\n\n- BlurUp-Plugin: Copy style attribute ([#764](https://github.com/aFarkas/lazysizes/pull/764))\n- Fixes minor security issue with video-embed plugin ([#764](https://github.com/aFarkas/lazysizes/pull/764))\n- Built: Update dependencies ([#774](https://github.com/aFarkas/lazysizes/pull/774), [#756](https://github.com/aFarkas/lazysizes/pull/756))\n- Fixes diverse issues with old AMD module pattern ([#780](https://github.com/aFarkas/lazysizes/pull/780), [#779](https://github.com/aFarkas/lazysizes/pull/779))\n\n## 5.2.0\n\n* Fix wrong window context under very rare SSR  (fixes [#717](https://github.com/aFarkas/lazysizes/pull/717))\n* Fix Safari Back-Forward Cache issue with lazyloading image elements (fixes [#711](https://github.com/aFarkas/lazysizes/issues/711))\n* Add lazyload of autoplay videos to unveilhooks  (fixes [#697](https://github.com/aFarkas/lazysizes/issues/697))\n\n## 5.1.2\n\n* Fix visibility check (fixes [#709](https://github.com/aFarkas/lazysizes/issues/709))\n\n## 5.1.1\n\n* Fix ratio calculation in rias plugin (fixed in [#685](https://github.com/aFarkas/lazysizes/pull/685) by [tikotzky](https://github.com/tikotzky))\n* Make  thumb size for youtube poster image in video-embed plugin configurable (see [#681](https://github.com/aFarkas/lazysizes/pull/681) thx to [@nikitasol](https://github.com/nikitasol))\n\n## 5.1.0\n\n* Allow import/execution in node environment\n* Use \"hqdefault\" for youtube poster image in video-embed plugin fixes [#666](https://github.com/aFarkas/lazysizes/issues/666)\n\n## 5.0.0\n\n* Use `width`/`height` content attributes to detect physical aspect ratio of image candidates, if `data-aspectratio` and `h`/`w` descriptors are missing. [#642](https://github.com/aFarkas/lazysizes/issues/642)\n* Do not leak global `lazySizesConfig` anymore fixes [#647](https://github.com/aFarkas/lazysizes/issues/647)\n* Improve handling of cloned object-fit images fixes [#648](https://github.com/aFarkas/lazysizes/issues/648)\n* Improve blur-up/effect plugin.\n* Add support for native `loading=\"lazy\"` feature as a [native loading plugin](https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins/native-loading).\n\n## 4.1.8\n\n* Added the class `ls-is-cached` to already cached images.\n* Added h descriptor parsing fix plugin for MS edge (was already included in respimg polyfill.)\n* Effects-Plugin/Blur Up plugin: Remove [].find because IE..., fixes [#631](https://github.com/aFarkas/lazysizes/issues/631)\n* Documentation stuff\n* Bring back *.min.js files to npm package, but don't use them in your `import`/`require`. These are mostly for CDNs. Not for Common JS bundlers.\n\n## 4.1.7\n\n* Blur Up plugin: make blur up mode configurable by script\n* Unload Plugin: Fix unload plugin not knowing current expand, fixes [#608](https://github.com/aFarkas/lazysizes/issues/608)\n* simplify resetPreloading and switchLoadingClass, fixes [#614](https://github.com/aFarkas/lazysizes/issues/614)\n\n## 4.1.6\n\n* Several Readme fixes\n* Allow expand, hFax and expFactor to be changed after initialization, see [#581](https://github.com/aFarkas/lazysizes/issues/581)\n\n## 4.1.5\n\n* Blur Up plugin: Add an empty alt attribute to the blur image to satisfy a11y [c3256d6](https://github.com/aFarkas/lazysizes/commit/c3256d61c002a984ab3e644e922b0fdc052519d8)\n* Blur Up plugin: added aria-hidden attribute [1d62efb](https://github.com/aFarkas/lazysizes/commit/1d62efb352f579d4505bd3d76d8166db2db9481f)\n* RiaS plugin: fix wrong ratio calculation, fixes [#550](https://github.com/aFarkas/lazysizes/issues/550)\n* Rias Plugin: add aspect-ratio to rias for calculating height, fixes [#557](https://github.com/aFarkas/lazysizes/issues/557)\n\n## 4.1.4\n\n* Resolve race condition with blurImg [dffa93b](https://github.com/aFarkas/lazysizes/commit/dffa93b804302363aceb7dc814b01629014ed03b)\n* make intersectionobserver version compatible with plugins [2f1a025](https://github.com/aFarkas/lazysizes/commit/2f1a02531eb96e828d42fb7877e776b810d7f346)\n\n## 4.1.3\n\n* change from custom to basic event interface (maybe fixes [#520](https://github.com/aFarkas/lazysizes/issues/527))\n* Clarify data-aspectratio attribute [d868605](https://github.com/aFarkas/lazysizes/commit/d8686050adeb68aae14e522bed12d68ab00b7595)\n\n## 4.1.2\n\n* fixes race condition with blurupimg [#527](https://github.com/aFarkas/lazysizes/issues/527)\n* add proxy change event to extend bgset [#532](https://github.com/aFarkas/lazysizes/issues/532)\n\n\n## 4.1.1\n\n* See [3ace9f3](https://github.com/aFarkas/lazysizes/commit/3ace9f359617409fe2824311032439fcf76a7c99)\n\n## 4.1.0\n\n* improve effect plugin\n\n## 4.0.4\n\n* fixes issue in bgset introduced with version 4.0.3\n\n## 4.0.3\n\n* add [blur up plugin](https://jsfiddle.net/trixta/v0oq0412/embedded/result/)\n\n## 4.0.0\n\n* make all plugins CommonJS compatible (thx to @claudiobmgrtnr and @jantimon)\n* added `loadHidden` option(thx to @justinvoelker)\n* added artdirection plugin (no documentation yet, but great)\n* iOS 8.1 fixes has to be loaded explicitly in non CommonJS environments (not included in respimg plugin anymore)\n* removed `picture` support for old FF 38-\n\n## 2.0.0\n\n* lazysizes core:\n\t* heavily improved performance (`requestIdleCallback`, better debouncing and a lot more).\n* plugins:\n\t* new plugin: [**object fit polyfill**](plugins/object-fit).\n\t* improved new options for [parent-fit plugin](plugins/parent-fit).\n\n## 1.5.0\nBreaking change:\n\t* the lazysizes.js and lazysizes.min.js files do not register as AMD modules anymore, if you need an AMD module use the new lazysizes-umd.js or lazysizes-umd.min.js file.\n* lazysizes core:\n\t* improved lazyloading in background tabs.\n\t* fixed set lazyloaded class to early in FF.\n* bgset/parentFit plugin:\n\t* improved avoiding layout thrashing.\n* respimg/bgset/parentFit plugin:\n\t* fixed bug in Edge 14 to parse height descriptors correctly.\n* unload plugin:\n\tunload plugin was broken since version 1.4.0 (thanks to @hokamoto)\n\n## 1.4.0\n* lazysizes core:\n\t* improved lazyloading in background tabs.\n\t* improved avoiding layout thrashing\n\t* support of SVG elements (`svg`/`image`/`use`...)\n* bgset/parentFit plugin:\n\t* improved avoiding layout thrashing\n* rias (and bgset):\n\t* added support for height calculation (thx to @LRancez, [#213](https://github.com/aFarkas/lazysizes/pull/213))\n\n## 1.3.2\n\n* lazysizes core:\n\t* add `hFactor` option (see #181).\n* unload plugin:\n\t* simplified `unloadPixelThreshold` calculation.\n* bgset plugin:\n\t* add an empty alt to image (see #200).\n\n## 1.3.1 version\n\n* lazysizes core:\n\t* replace `setImmediate` with `setTimeout` (improved performance for IE/EDGE).\n* plugins:\n\t* fixed conflict with respimg plugin in combination with bgset plugin, in case of art direction and resize to smaller.\n\t* fixed conflict with RIaS plugin in combination with respimg plugin/picturefill in Safari 8/9.\n"
  },
  {
    "path": "Gruntfile.js",
    "content": "/*global module:true*/\n(function () {\n\t\"use strict\";\n\n\tvar pkg;\n\n\tmodule.exports = function (grunt) {\n\n\t\t// Project configuration.\n\t\tgrunt.initConfig({\n\t\t\t// Metadata.\n\t\t\tpkg: pkg = grunt.file.readJSON(\"package.json\"),\n\t\t\tbanner: \"/*! <%= pkg.name %> - v<%= pkg.version %> */\\n\",\n\t\t\t// Task configuration.\n\t\t\tuglify: {\n\t\t\t\toptions: {\n\t\t\t\t\tbanner: \"<%= banner %>\",\n\n\t\t\t\t\tcompress: {\n\t\t\t\t\t\tdead_code: true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tplugins: {\n\t\t\t\t\tfiles: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\texpand: true,\n\t\t\t\t\t\t\tcwd: 'plugins/',\n\t\t\t\t\t\t\tsrc: ['**/*.js', '!*.min.js', '!**/*.min.js'],\n\t\t\t\t\t\t\tdest: 'plugins/',\n\t\t\t\t\t\t\text: '.min.js',\n\t\t\t\t\t\t\textDot: 'last'\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\texpand: true,\n\t\t\t\t\t\t\tcwd: '',\n\t\t\t\t\t\t\tsrc: ['lazysizes*.js', '!*.min.js'],\n\t\t\t\t\t\t\tdest: '',\n\t\t\t\t\t\t\text: '.min.js',\n\t\t\t\t\t\t\textDot: 'last'\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\tjshint: {\n\t\t\t\tall: {\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tjshintrc: true\n\t\t\t\t\t},\n\t\t\t\t\tsrc: [ \"lazysizes.js\", \"plugins/**/*.js\", \"!*.min.js\", \"!plugins/**/*.min.js\" ] //, \"Gruntfile.js\", \"tests/*.js\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tqunit: {\n\t\t\t\tall: ['tests/*.html']\n\t\t\t},\n\t\t\twatch: {\n\t\t\t\tgruntfile: {\n\t\t\t\t\tfiles: [ \"Gruntfile.js\", \"lazysizes.js\" ],\n\t\t\t\t\ttasks: [ \"default\" ]\n\t\t\t\t}\n\t\t\t},\n\t\t\tbytesize: {\n\t\t\t\tall: {\n\t\t\t\t\tsrc: [ \"lazysizes.min.js\" ]\n\t\t\t\t}\n\t\t\t},\n\t\t\tuncss: {\n\t\t\t\tdist: {\n\t\t\t\t\tfiles: {\n\t\t\t\t\t\t'assets/css/tidy.css': ['index.html', 'maxdpr/*.html']\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tmaxFilesize: {\n\t\t\t\toptions: {\n\t\t\t\t\t// Task-specific options go here.\n\t\t\t\t},\n\t\t\t\tminified: {\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tmaxBytes: (1024 * 7.8)\n\t\t\t\t\t},\n\t\t\t\t\tsrc: [\"lazysizes.min.js\"]\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// These plugins provide necessary tasks.\n\t\tgrunt.loadNpmTasks(\"grunt-contrib-jshint\");\n\t\tgrunt.loadNpmTasks(\"grunt-contrib-uglify\");\n\t\tgrunt.loadNpmTasks(\"grunt-contrib-watch\");\n\t\tgrunt.loadNpmTasks('grunt-uncss');\n\t\tgrunt.loadNpmTasks('grunt-bytesize');\n\t\tgrunt.loadNpmTasks('grunt-max-filesize');\n\t\tgrunt.loadNpmTasks('grunt-contrib-qunit');\n\n\t\tgrunt.registerTask('wrapcore', 'wraps lazysizes into umd and common wrapper.', function() {\n\t\t\tvar ls = grunt.file.read('src/lazysizes-core.js');\n\t\t\tvar common = grunt.file.read('src/common.wrapper');\n\t\t\tvar umd = grunt.file.read('src/umd.wrapper');\n\n\t\t\tgrunt.file.write('lazysizes.js', common.replace('{{ls}}', ls));\n\t\t\tgrunt.file.write('lazysizes-umd.js', umd.replace('{{ls}}', ls));\n\t\t});\n\n\t\tgrunt.registerTask('importTs', 'import global typescript.', function() {\n\t\t\tconst fileName = './lazysizes.d.ts';\n\t\t\tconst importStr =  `import './types/global';\\n\\n`;\n\t\t\tconst tsContent = grunt.file.read(fileName);\n\n\t\t\tgrunt.file.write(fileName, importStr + tsContent);\n\t\t});\n\n\n\t\t// Default task.\n\t\tgrunt.registerTask(\"default\", [ \"wrapcore\", \"test\", \"uglify\", \"bytesize\", \"maxFilesize\" ]);\n\t\tgrunt.registerTask(\"test\", [ \"jshint\" ]);\n\t};\n})();\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Alexander Farkas\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "README.md",
    "content": "# lazysizes\n\n**lazysizes** is a fast (jank-free), SEO-friendly and self-initializing lazyloader for images (including responsive images ``picture``/``srcset``), iframes, scripts/widgets and much more. It also prioritizes resources by differentiating between crucial in view and near view elements to make perceived performance even faster.\n\nIt may become also your number one tool to integrate responsive images. It can automatically calculate the ``sizes`` attribute for your responsive images, it allows you to share media queries for your ``media`` attributes with your CSS, helping to separate layout (CSS) from content/structure (HTML) and it makes integrating responsive images into any environment really simple. It also includes a set of optional plugins to further extend its functionality.\n\n## How to\n\n1. Download the [lazysizes.min.js script](http://afarkas.github.io/lazysizes/lazysizes.min.js) and include **lazysizes** in your webpage. (Or install via npm: ``npm install lazysizes --save`` or bower ``bower install lazysizes --save``)\n\n    ```html\n    <script src=\"lazysizes.min.js\" async=\"\"></script>\n    ```\n\n    Or:\n\t```js\n\timport 'lazysizes';\n\t// import a plugin\n\timport 'lazysizes/plugins/parent-fit/ls.parent-fit';\n\n\t// Note: Never import/require the *.min.js files from the npm package.\n\t```\n\n\tNote: For more information see [here](#include-early).\n\n2. lazysizes does not need any JS configuration: Add the ``class`` ``\"lazyload\"`` to your images/iframes in conjunction with a ``data-src`` and/or ``data-srcset`` attribute. Optionally you can also add a ``src`` attribute with a low quality image:\n\n    ```html\n    <!-- non-responsive: -->\n    <img data-src=\"image.jpg\" class=\"lazyload\" />\n    ```\n\n    ```html\n    <!-- responsive example with automatic sizes calculation: -->\n    <img\n        data-sizes=\"auto\"\n        data-src=\"image2.jpg\"\n        data-srcset=\"image1.jpg 300w,\n        image2.jpg 600w,\n        image3.jpg 900w\" class=\"lazyload\" />\n    ```\n\n    ```html\n    <!-- iframe example -->\n    <iframe frameborder=\"0\"\n    \tclass=\"lazyload\"\n        allowfullscreen=\"\"\n        data-src=\"//www.youtube.com/embed/ZfV-aYdU4uE\">\n    </iframe>\n    ```\n\n\n## [Demo with code examples](http://afarkas.github.io/lazysizes/#examples)\nCan be seen [here](http://afarkas.github.io/lazysizes/#examples)\n\n## Responsive image support (picture and/or srcset)\n\nLazysizes is built upon the Responsive image standard and extends it with additional functionality. For full cross browser responsive image support you must use either a full polyfill like [picturefill](https://github.com/scottjehl/picturefill) or use the extreme lightweight partial [respimg polyfill plugin](plugins/respimg) or the [responsive image on demand plugin](plugins/rias). Alternatively, you can simply define a fallback src via the ``data-src`` attribute. If you want to learn more about the responsive image syntax read \"[The anatomy of responsive images](https://jakearchibald.com/2015/anatomy-of-responsive-images/)\".\n\n## What makes lazysizes so awesome:\n**lazysizes** is different than other lazy image loaders.\n\n1. **Detects any visibility changes on current and future lazyload elements in any web environment automatically**: The script works as an universal, self-initializing, self-configuring and self-destroying component and detects any changes to the visibility of any current and future image/iframe elements automatically no matter whether it becomes visible through a user scroll, a CSS animation triggered through ``:hover`` or through any kind of JS behavior (carousel, slider, infinite scroll, masonry, isotope/filtering/sorting, AJAX, SPAs...). It also works automatically in conjunction with any kind of JS-/CSS-/Frontend-Framework (jQuery mobile, Bootstrap, Backbone, Angular, React, Ember (see also the [attrchange/re-initialization extension](plugins/attrchange))).\n2. **Future-proof**: It directly includes standard responsive image support (``picture`` and ``srcset``)\n3. **Separation of concerns**: For responsive image support it adds an automatic ``sizes`` calculation as also alias names for media queries feature. There is also no JS change needed if you add a scrollable container with CSS (overflow: auto) or create a mega menu containing images.\n4. **Performance**: It's based on highly efficient, best practice code (runtime **and** network) to work jank-free at 60fps and can be used with hundreds of images/iframes on CSS and JS-heavy pages or webapps.\n5. **Extendable**: It provides JS and CSS hooks to extend lazysizes with any kind of lazy loading, lazy instantiation, in view callbacks or effects (see also the [available plugins/snippets](#plugins)).\n6. **Intelligent prefetch/Intelligent resource prioritization**: lazysizes prefetches/preloads near the view assets to improve user experience, but only while the browser network is idling (see also ``expand``, ``expFactor`` and ``loadMode`` options). This way in view elements are loaded faster and near of view images are preloaded lazily before they come into view.\n7. **Lightweight, but mature solution**: lazysizes has the right balance between a lightweight and a fast, reliable solution\n8. **SEO improved**: lazysizes does not hide images/assets from Google. No matter what markup pattern you use. Google doesn't scroll/interact with your website. lazysizes detects, whether the user agent is capable to scroll and if not, reveals all images instantly.\n\n## More about the API\n**lazysizes** comes with a simple markup and JS API. Normally you will only need to use the markup API.\n\n### Markup API\nAdd the ``class`` ``lazyload`` to all ``img`` and ``iframe`` elements, which should be loaded lazy. *Instead* of a ``src`` or ``srcset`` attribute use a ``data-src`` or ``data-srcset`` attribute:\n\n```html\n<img data-src=\"image.jpg\" class=\"lazyload\" />\n<!-- retina optimized image: -->\n<img data-srcset=\"responsive-image1.jpg 1x, responsive-image2.jpg 2x\" class=\"lazyload\" />\n```\n#### <a name=\"data-sizes-auto\"></a>Automatically setting the `sizes` attribute\n**lazysizes** supports setting the ``sizes`` attribute automatically, corresponding to the current size of your image - just set the value of ``data-sizes`` to  ``auto``.\n\n```html\n<img\n\tdata-sizes=\"auto\"\n\tdata-srcset=\"responsive-image1.jpg 300w,\n\t    responsive-image2.jpg 600w,\n\t    responsive-image3.jpg 900w\"\n    class=\"lazyload\" />\n```\n\n**<a name=\"sizes-calculation\"></a>Important: How ``sizes`` is calculated**: The automatic sizes calculation uses the display width of the image. This means that the width of the image has to be calculable at least approximately before the image itself is loaded (This means you can not use `width: auto`). Often the following general CSS rule might help: ``img[data-sizes=\"auto\"] { display: block; width: 100%; }`` (see also [specifying image/iframe dimensions with the recommended aspect ratio definition](#specify-dimensions)). If it is below ``40`` (can be configured through the ``minSize`` option), lazysizes traverses up the DOM tree until it finds a parent which is over ``40`` and uses this number.\n\nThe width auto-calculated by lazysizes can be modified using the ``lazybeforesizes`` event ([lazybeforesizes documentation](#lazybeforesizes-documentation)). Alternatively, the [parent fit plugin](plugins/parent-fit) can be used for sizing images to fit a parent / container, and is the only solution when an image's height needs to be taken into account when fitting it to its container (This also includes the use of `object-fit`).\n\nThe ``data-sizes=\"auto\"`` feature only makes sense if you use the ``data-srcset`` attribute with *width* descriptors which allows the most appropriate image can be selected (It does not make sense if you use the x descriptor or only ``src``.).\n\n## Recommended/possible markup patterns\n\nlazysizes allows you to write an endless variety of different markup patterns. Find your own/best pattern or choose one of the following. (All of the following patterns can be also used for art direction using the ``picture`` element.)\n\n### Simple pattern\n\nAdd the class ``lazyload`` and simply omit the ``src`` attribute  or add a data uri as fallback ``src``.\n\n```html\n\n<!--  responsive adaptive example -->\n\n<img\n\tclass=\"lazyload\"\n\tdata-srcset=\"image.jpg 1x, image2.jpg 2x\"\n    alt=\"my image\" />\n<!--  retina optimized example -->\n<img class=\"lazyload\"\n\tdata-srcset=\"progressive-image.jpg 1x, progressive-image2.jpg 2x\"\n    alt=\"my image\" />\n\n<!-- or non-responsive: -->\n<img\n\tdata-src=\"image.jpg\"\n\tclass=\"lazyload\" />\n```\n\nNote: In case you are using either ``srcset``/``data-srcset`` or ``picture``, we recommend to extend this pattern with either a ``data-src`` (see next pattern: \"Combine ``data-srcset`` with ``data-src``\") or with a suitable ``src`` attribute (see:  \"modern pattern\" or \"LQIP\").\n\n### Combine ``data-srcset`` with ``data-src``\n\nIn case you want to use responsive images for supporting browsers, but don't want to include a polyfill, simply combine your ``data-srcset`` with a ``data-src`` attribute.\n\n```html\n<!-- responsive example: -->\n<img\n\tdata-sizes=\"auto\"\n    data-src=\"image3.jpg\"\n\tdata-srcset=\"image3.jpg 600w,\n\t    image1.jpg 220w,\n\t    image2.jpg 300w,\n\t    image3.jpg 600w,\n\t    image4.jpg 900w\"\n\tclass=\"lazyload\" />\n```\n\nNote: Due to the fact that the ``data-src`` will also be picked up by \"Read-Later\" Apps and other tools (for example Pin it button), this pattern also makes sense if you use a polyfill. In case you don't use a polyfill it is recommended that the first image candidate matches the fallback `src`.\n\n### LQIP/blurry image placeholder/Blur up image technique\nIf you are using the LQIP (Low Quality Image Placeholder) pattern, simply add a low quality image as the ``src``:\n\n```html\n<!-- responsive example: -->\n<img\n\tdata-sizes=\"auto\"\n    src=\"lqip-src.jpg\"\n\tdata-srcset=\"lqip-src.jpg 220w,\n    image2.jpg 300w,\n    image3.jpg 600w,\n    image4.jpg 900w\" class=\"lazyload\" />\n\n<!-- or non-responsive: -->\n<img src=\"lqip-src.jpg\" data-src=\"image.jpg\" class=\"lazyload\" />\n```\n\nThe LQIP technique can be enhanced by combining it with CSS transitions/animation to sharpen/unblur or overfade the LQIP image.\n\nPlease also have a look at our [lazysizes Blur Up plugin](https://jsfiddle.net/trixta/v0oq0412/embedded/result/) (recommended).\n\n```html\n<style>\n\t.blur-up {\n\t\t-webkit-filter: blur(5px);\n\t\tfilter: blur(5px);\n\t\ttransition: filter 400ms, -webkit-filter 400ms;\n\t}\n\n\t.blur-up.lazyloaded {\n\t\t-webkit-filter: blur(0);\n\t\tfilter: blur(0);\n\t}\n</style>\n\n<img src=\"lqip-src.jpg\" data-src=\"image.jpg\" class=\"lazyload blur-up\" />\n\n<!-- ... -->\n\n<style>\n\t.fade-box .lazyload,\n\t .fade-box .lazyloading {\n\t\topacity: 0;\n\t\ttransition: opacity 400ms;\n\t}\n\n\t.fade-box img.lazyloaded {\n\t\topacity: 1;\n\t}\n</style>\n\n<div class=\"ratio-box fade-box\">\n\t<img src=\"lqip-src.jpg\" />\n\t<img data-src=\"image.jpg\" class=\"lazyload\" />\n</div>\n```\n\n\n### modern transparent ``srcset`` pattern\n\nCombine a normal ``src`` attribute with a transparent or low quality image as ``srcset`` value and a ``data-srcset`` attribute. This way modern browsers will lazy load without loading the ``src`` attribute and all others will simply fallback to the initial ``src`` attribute (without lazyload). (This nice pattern originated from @ivopetkov.)\n\n```html\n<img\n    src=\"image3.jpg\"\n    srcset=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\tdata-srcset=\"image3.jpg 600w,\n\t\timage1.jpg 220w,\n\t    image2.jpg 300w,\n\t    image4.jpg 900w\"\n\tdata-sizes=\"auto\"\n\tclass=\"lazyload\" />\n```\n\n### The noscript pattern\n\nIn case disabled JavaScript is a concern you can combine this simple pattern with an image inside a ``noscript`` element.\n\n```html\n<style>\n\t.no-js img.lazyload {\n    \tdisplay: none;\n    }\n</style>\n\n<!-- noscript pattern -->\n<noscript>\n\t<img src=\"image.jpg\" />\n</noscript>\n<img src=\"transparent.jpg\" data-src=\"image.jpg\" class=\"lazyload\" />\n```\n\nNote: As an alternative to the noscript pattern also checkout the [noscript extension](plugins/noscript).\n\n### [data-expand] attribute\nNormally lazysizes will expand the viewport area to lazy preload images/iframes which might become visible soon. This value can be adjusted using the ``expand`` option.\n\nAdditionally, this general option can be overridden with the ``data-expand`` attribute for each element. Different than the general ``expand`` option the ``data-expand`` attribute also accepts negative values (All numbers but ``0`` are accepted!).\n\nThis becomes especially handy to add unveiling effects for teasers or other elements:\n\n\n```html\n<style>\n.lazyload,\n.lazyloading {\n\topacity: 0;\n}\n.lazyloaded {\n\topacity: 1;\n\ttransition: opacity 300ms;\n}\n</style>\n\n<div class=\"teaser lazyload\" data-expand=\"-20\">\n    <img data-src=\"image.jpg\" class=\"lazyload\" />\n    <h1>Teaser Title</h1>\n    <p>...</p>\n</div>\n```\n\n### CSS API\nlazysizes adds the class ``lazyloading`` while the images are loading and the class ``lazyloaded`` as soon as the image is loaded. This can be used to add unveil effects:\n\n```css\n/* fade image in after load */\n.lazyload,\n.lazyloading {\n\topacity: 0;\n}\n.lazyloaded {\n\topacity: 1;\n\ttransition: opacity 300ms;\n}\n```\n\n```css\n/* fade image in while loading and show a spinner as background image (good for progressive images) */\n\n.lazyload {\n\topacity: 0;\n}\n\n.lazyloading {\n\topacity: 1;\n\ttransition: opacity 300ms;\n\tbackground: #f7f7f7 url(loader.gif) no-repeat center;\n}\n```\n\n### Broken image symbol\n\nIn case you are using an `alt` attribute but do not declare a `src`/`srcset` attribute you will end up with a broken image symbol.\n\nThere are two easy ways to deal with it.\n\nEither define a `src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"` or add the following CSS.\n\n```css\nimg.lazyload:not([src]) {\n\tvisibility: hidden;\n}\n```\n\n\n### JS API\n**lazysizes** automatically detects new elements with the class ``lazyload`` so you won't need to call or configure anything in most situations.\n\n#### JS API - options\n\nOptions can be set by declaring a global configuration option object named ``lazySizesConfig``. This object must be defined before the lazysizes script. A basic example:\n\n```js\nwindow.lazySizesConfig = window.lazySizesConfig || {};\n\n// use .lazy instead of .lazyload\nwindow.lazySizesConfig.lazyClass = 'lazy';\n\n// use data-original instead of data-src\nlazySizesConfig.srcAttr = 'data-original';\n\n//page is optimized for fast onload event\nlazySizesConfig.loadMode = 1;\n```\n\nIn case you are using a module bundler it is recommended to change the options directly after importing the `lazysizes` module:\n\n```js\nimport lazySizes from 'lazysizes';\n// other imports ...\n\nlazySizes.cfg.lazyClass = 'lazy';\n```\n\nHere the list of options:\n\n* ``lazySizesConfig.lazyClass`` (default: ``\"lazyload\"``): Marker class for all elements which should be lazy loaded (There can be only one ``class``. In case you need to add some other element, without the defined class, simply add it per JS: ``$('.lazy-others').addClass('lazyload');``)\n* ``lazySizesConfig.preloadAfterLoad`` (default: ``false``): Whether lazysizes should load all elements after the window onload event. Note: lazySizes will then still download those not-in-view images inside of a lazy queue, so that other downloads after onload are not blocked.)\n* ``lazySizesConfig.preloadClass`` (default: ``\"lazypreload\"``): Marker class for elements which should be lazy pre-loaded after onload. Those elements will be even preloaded, if the ``preloadAfterLoad`` option is set to ``false``. Note: This *class* can be also dynamically set (``$currentSlide.next().find('.lazyload').addClass('lazypreload');``).\n* ``lazySizesConfig.loadingClass`` (default: ``\"lazyloading\"``): This ``class`` will be added to ``img`` element as soon as image loading starts. Can be used to add unveil effects.\n* ``lazySizesConfig.loadedClass`` (default: ``\"lazyloaded\"``): This ``class`` will be added to any element as soon as the image is loaded or the image comes into view. Can be used to add unveil effects or to apply styles.\n* ``lazySizesConfig.expand`` (default: ``370-500``): The ``expand`` option expands the calculated visual viewport area in all directions, so that elements can be loaded before they become visible. The default value is calculated depending on the viewport size of the device. (Note: Reasonable values are between ``300`` and ``1000`` (depending on the ``expFactor`` option.) In case you have a lot of small images or you are using the LQIP pattern you can lower the value, in case you have larger images set it to a higher value. Also note, that lazySizes will dynamically shrink this value to ``0`` if the browser is currently downloading and expand it if the browser network is currently idling and the user not scrolling (by multiplying the ``expand`` option with ``1.5`` (``expFactor``)). This option can also be overridden with the ``[data-expand]`` attribute.\n* ``lazySizesConfig.minSize`` (default: ``40``): For ``data-sizes=\"auto\"`` feature. The minimum size of an image that is used to calculate the ``sizes`` attribute. In case it is under ``minSize`` the script traverses up the DOM tree until it finds a parent that is over ``minSize``.\n* ``lazySizesConfig.srcAttr`` (default: ``\"data-src\"``): The attribute, which should be transformed to ``src``.\n* ``lazySizesConfig.srcsetAttr`` (default: ``\"data-srcset\"``): The attribute, which should be transformed to ``srcset``.\n* ``lazySizesConfig.sizesAttr`` (default: ``\"data-sizes\"``): The attribute, which should be transformed to ``sizes``. Makes almost only makes sense with the value ``\"auto\"``. Otherwise, the ``sizes`` attribute should be used directly.\n* ``lazySizesConfig.customMedia`` (default: ``{}``): The ``customMedia`` option object is an alias map for different media queries. It can be used to separate/centralize your multiple specific media queries implementation (layout) from the ``source[media]`` attribute (content/structure) by creating labeled media queries. (See also the [custommedia extension](plugins/custommedia)).\n* ``lazySizesConfig.loadHidden`` (default: ``true``): Whether to load `visibility: hidden` elements. Important: lazySizes will load hidden images always delayed. If you want them to be loaded as fast as possible you can use `opacity: 0.001` but never `visibility: hidden` or `opacity: 0`.\n* ``lazySizesConfig.ricTimeout`` (default: ``0``): The timeout option used for the `requestIdleCallback`. Reasonable values between: 0, 100 - 1000. (Values below 50 disable the `requestIdleCallback` feature.)\n* ``lazySizesConfig.throttleDelay`` (default: ``125``): The timeout option used to throttle all listeners. Reasonable values between: 66 - 200.\n```html\n<script>\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nwindow.lazySizesConfig.customMedia = {\n    '--small': '(max-width: 480px)',\n    '--medium': '(max-width: 900px)',\n    '--large': '(max-width: 1400px)',\n};\n</script>\n\n\n<picture>\n\t<!--[if IE 9]><video style=\"display: none;><![endif]-->\n\t<source\n\t\tdata-srcset=\"http://placehold.it/500x600/11e87f/fff\"\n\t\tmedia=\"--small\" />\n\t<source\n\t\tdata-srcset=\"http://placehold.it/700x300\"\n\t\tmedia=\"--medium\" />\n\t<source\n\t\tdata-srcset=\"http://placehold.it/1400x600/e8117f/fff\"\n\t\tmedia=\"--large\" />\n\t<source\n        data-srcset=\"http://placehold.it/1800x900/117fe8/fff\" />\n    <!--[if IE 9]></video><![endif]-->\n    <img\n\n        data-src=\"http://placehold.it/1400x600/e8117f/fff\"\n        class=\"lazyload\"\n        alt=\"image with artdirection\" />\n</picture>\n```\n* ``lazySizesConfig.expFactor`` (default: ``1.5``): The ``expFactor`` is used to calculate the \"preload expand\", by multiplying the normal ``expand`` with the ``expFactor`` which is used to preload assets while the browser is idling (no important network traffic and no scrolling). (Reasonable values are between ``1.5`` and ``4`` depending on the ``expand`` option).\n* ``lazySizesConfig.hFac`` (default: ``0.8``): The ``hFac`` (horizontal factor) modifies the horizontal expand by multiplying the ``expand`` value with the ``hFac`` value. Use case: In case of carousels there is often the wish to make the horizontal expand narrower than the normal vertical expand option. Reasonable values are between 0.4 - 1. In the unlikely case of a horizontal scrolling website also 1 - 1.5.\n* ``lazySizesConfig.loadMode`` (default: ``2``): The ``loadMode`` can be used to constrain the allowed loading mode. Possible values are 0 = don't load anything, 1 = only load visible elements, 2 = load also very near view elements (``expand`` option) and 3 = load also not so near view elements (``expand`` * ``expFactor`` option). This value is automatically set to ``3`` after onload. Change this value to ``1`` if you (also) optimize for the onload event or change it to ``3`` if your onload event is already heavily delayed.\n* ``lazySizesConfig.init`` (default: ``true``): By default lazysizes initializes itself, to load in view assets as soon as possible. In the unlikely case you need to setup/configure something with a later script you can set this option to ``false`` and call ``lazySizes.init();`` later explicitly.\n\n#### JS API - events\n**lazysizes** provides three events to modify or extend the behavior of **lazysizes**.\n\n* ``lazybeforeunveil``: This event will be fired on each lazyload element right before of the \"unveil\" transformation. This event can be used to extend the unveil functionality. In case the event is ``defaultPrevented`` the default transformation action will be prevented (see also the [ls.unveilhooks.js plugin](plugins/unveilhooks/ls.unveilhooks.js)):\n```js\n//add simple support for background images:\ndocument.addEventListener('lazybeforeunveil', function(e){\n    var bg = e.target.getAttribute('data-bg');\n    if(bg){\n        e.target.style.backgroundImage = 'url(' + bg + ')';\n    }\n});\n//or add AJAX loading\n//<div class=\"lazyload\" data-ajax=\"my-url.html\"></div>\n\n$(document).on('lazybeforeunveil', function(){\n\tvar ajax = $(e.target).data('ajax');\n    if(ajax){\n        $(e.target).load(ajax);\n    }\n});\n```\n\nThe ``lazybeforeunveil`` can also be used for lazy initialization and due to the fact that lazysizes also detects new elements in the DOM automatically also for auto- and self-initialization of UI widgets:\n\n```html\n<script>\ndocument.addEventListener('lazybeforeunveil', function(e){\n    $(e.target)\n        .filter('.slider')\n        .slider({\n            sliderOption: true\n        })\n    ;\n});\n\ndocument.addEventListener('lazybeforeunveil', function(e){\n    $(e.target)\n        .filter('.chart')\n        .chart({\n            animate: true\n        })\n    ;\n});\n</script>\n\n<div class=\"slider lazyload lazypreload\"></div>\n\n<div class=\"chart lazyload\" data-expand=\"-10\"></div>\n```\n* <a id=\"lazyloaded-documentation\"></a>`lazyloaded`: After the image is fully loaded lazysizes dispatches a `lazyloaded` event. While this often duplicates the native `load` event it is often more convenient to use.\n\n* <a id=\"lazybeforesizes-documentation\"></a>``lazybeforesizes``: This event will be fired on each element with the ``data-sizes=\"auto\"`` attribute right before the calculated ``sizes`` attribute will be set. The ``event.detail.width`` property is set to the calculated width of the element and can be changed to any number. In case the event is ``defaultPrevented`` the ``sizes`` attribute won't be set. See also the [parent-fit extension](plugins/parent-fit).\n```js\n$(document).on('lazybeforesizes', function(e){\n    //use width of parent node instead of the image width itself\n    e.detail.width = $(e.target).parents(':not(picture)').innerWidth() || e.detail.width;\n});\n```\n\n#### JS API - methods\n##### ``lazySizes.loader.unveil(DOMNode)``\n\nIn case a developer wants to show an image even if it is not inside the viewport the ``lazySizes.loader.unveil(DOMNode)`` can be called:\n\n```js\nlazySizes.loader.unveil(imgElem);\n```\n\nNote: As a more lazy alternative the ``lazypreload`` class can be set: ``$(imgElem).addClass('lazypreload');``.\n\n##### ``lazySizes.autoSizer.checkElems()``\n\nIn case one or more image elements with the attribute ``data-sizes=\"auto\"`` have changed in size ``lazySizes.autoSizer.updateElems`` can be called (For example to implement element queries):\n\n```js\nlazySizes.autoSizer.checkElems();\n```\n\n##### ``lazySizes.loader.checkElems()``\n\nTests whether new elements has came into view. Normally this method only needs to be called, if ``lazySizesConfig.loadMode`` was set to ``0``.\n\n##### ``lazySizes.init()``\n\nLazySizes initializes itself automatically. In case you set ``lazySizesConfig.init`` to ``false`` you need to explicitly call ``lazySizes.init()``. Note: You can speed up initial loading of in view images if you call `lazySizesConfig.init()` explicitly after lazysizes and all plugins are loaded.\n\n```html\n<script>\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nwindow.lazySizesConfig.init = false;\n</script>\n\n<script src=\"lazysizes.js\"></script>\n<script src=\"other-script.js\"></script>\n<script>\nlazySizes.init();\n</script>\n```\n\n## Browser Support\n**lazysizes** supports all browsers, that support [``document.getElementsByClassName``](http://caniuse.com/#feat=getelementsbyclassname) (== all browsers but not IE8-). In case you need to support IE8, see also the [noscript extension](plugins/noscript/README.md#ie8) (or use a modified noscript pattern or the LQIP pattern).\n\n## Contributing\nFixes, PRs and issues are always welcome, make sure to create a new branch from the **master** (not the gh-pages branch), validate against JSHint and test in all browsers. In case of an API/documentation change make sure to also document it here in the readme.md.\n### Build\nRun `npx grunt` to validate JSHint and uglify/minify all files.\n### Tests\nRun `npx serverino -p 3333` and navigate to [http://localhost:3333/tests/](http://localhost:3333/tests/)\n\n## <a name=\"plugins\"></a>Available plugins in this repo\nIt is recommended to concat all plugins together with lazySizes. In case you don't concat it is recommended to include the plugin scripts *before* the lazySizes main script.\n\n### [respimg polyfill plugin](plugins/respimg)\n\nThe respimg polyfill plugin is an extremely lightweight alternate polyfill for the most important subsets of responsive images (srcset and picture).\n\n### [OPTIMUMX plugin](plugins/optimumx)\nThe ``srcset`` attribute with the *w* descriptor and ``sizes`` attribute automatically also includes high DPI images. But each image has a different optimal pixel density, which might be lower (for example 1.5x) than the pixel density of your device (2x or 3x). This information is unknown to the browser and therefore can't be optimized for. The [lazySizes optimumx extension](plugins/optimumx) gives you more control to trade between perceived quality vs. perceived performance.\n\n### [parent-fit extension](plugins/parent-fit)\nThe [parent fit plugin](plugins/parent-fit) extends the ``data-sizes=\"auto\"`` feature to also calculate the right ``sizes`` for ``object-fit: contain|cover`` image elements and other **height** ( and width) constrained image elements in general.\n\n### [object-fit polyfill extension](plugins/object-fit)\nThe [object fit polyfill plugin](plugins/object-fit) polyfills the `object-fit` and the `object-position` property in non supporting browsers.\n\n### [blur up / effect plugin](plugins/blur-up)\nThe [blur up / effect plugin](plugins/blur-up) allows you to create [great over fade / blur up effects](https://jsfiddle.net/trixta/v0oq0412/embedded/result/) with low quality image placeholder, which improves the user experience and perceived performance in case you are using a low quality image approach.\n\n### [attrchange / re-initialization extension](plugins/attrchange)  (strongly recommended if you use React, Angular etc.)\nIn case you are changing the ``data-src``/``data-srcset`` attributes of already transformed lazyload elements, you must normally also re-add the ``lazyload`` class to the element.\n\nThis [attrchange / re-initialization extension](plugins/attrchange) automatically detects changes to your ``data-*`` attributes and adds the class for you.\n\n### [artdirect plugin](plugins/artdirect)\nThe [artdirect plugin](plugins/artdirect) allows you to fully control art direction via CSS.\n\n\n### Other [plugins/extensions](plugins)\n\nThere are also other plugins/extension in the [plugins folder](plugins). As always you are open to create new ones for your project.\n\n## <a name=\"specify-dimensions\"></a>Tip: Specifying image dimensions (minimizing reflows and avoiding page jumps)\nTo minimize reflows, content jumping or unpredictable behavior with some other JS widgets (isotope, masonry, some sliders/carousels...) the width **and** the height of an image should be calculable by the browser before the image source itself is loaded:\n\n```html\n<img\n\n    style=\"width: 350px; height: 150px;\"\n\tdata-srcset=\"http://placehold.it/350x150 1x,\n    http://placehold.it/700x300 2x\"\n    data-src=\"http://placehold.it/350x150\"\n    class=\"lazyload\" />\n```\n\nFor flexible responsive images the [CSS intrinsic ratio scaling technique](http://www.mademyday.de/css-height-equals-width-with-pure-css.html) should be used:\n\n```html\n<style>\n.ratio-container {\n    position: relative;\n}\n.ratio-container:after {\n    content: '';\n    display: block;\n    height: 0;\n    width: 100%;\n    /* 16:9 = 56.25% = calc(9 / 16 * 100%) */\n    padding-bottom: 42.86%;\n}\n.ratio-container > * {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    display: block;\n}\n</style>\n\n<div class=\"ratio-container\">\n    <img\n\n        data-sizes=\"auto\"\n        data-srcset=\"http://placehold.it/175x75 175w,\n        http://placehold.it/350x150 350w,\n        http://placehold.it/700x300 700w,\n        http://placehold.it/1400x600 1400w\"\n        data-src=\"http://placehold.it/700x300\"\n        class=\"lazyload\" />\n</div>\n```\n\nIn case you want to dynamically calculate your intrinsic ratios for many different formats you can vary the pattern to something like this:\n\n```html\n<style>\n.ratio-box {\n\tposition: relative;\n\theight: 0;\n\tdisplay: block;\n\twidth: 100%;\n\t/* padding-bottom is calculated and rendered in to HTML */\n}\n\n.ratio-box img,\n.ratio-box iframe,\n.ratio-box video {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: block;\n}\n</style>\n\n<div class=\"ratio-box\" style=\"padding-bottom: 42.85% /* calc(75 / 175 * 100%)*/;\">\n    <img\n\n        data-sizes=\"auto\"\n        data-srcset=\"http://placehold.it/175x75 175w,\n        http://placehold.it/350x150 350w,\n        http://placehold.it/700x300 700w,\n        http://placehold.it/1400x600 1400w\"\n        data-src=\"http://placehold.it/700x300\"\n        class=\"lazyload\" />\n</div>\n```\n\nIn case the exact ratio of your image is unknown you can also vary the intrinsic ratio like this:\n\n```html\n<style>\n.ratio-container {\n    position: relative;\n}\n.ratio-container:after {\n    content: '';\n    display: block;\n    height: 0;\n    width: 100%;\n    /* 16:9 = 56.25% = calc(9 / 16 * 100%) */\n    padding-bottom: 56.25%;\n    content: \"\";\n}\n.ratio-container > * {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n}\n\n/* unknown ration variation */\n.unknown-ratio-container > * {\n    max-width: 100%;\n    max-height: 100%;\n    width: auto;\n    height: auto;\n}\n</style>\n\n<div class=\"ratio-container unknown-ratio-container\">\n    <img\n\n        data-src=\"http://placehold.it/350x150\"\n        class=\"lazyload\" />\n</div>\n```\n\nor at least add a ``min-height`` (and ``min-width``) to minimize content jumps:\n\n```css\n.lazyload,\n.lazyloading {\n\tmin-height: 200px;\n}\n```\n\n**Note**:\n\n* If you use the \"unknown intrinsic ratio pattern\" and the width of the loaded image will not (approximately) match the width of its container, the ``data-sizes=\"auto\"`` feature will not be effective when used on its own. In this situation, the most appropriate size for the image to fit in the available space can be calculated automatically using the [parent fit plugin](plugins/parent-fit).\n\n### Updating layout of JS widgets\nIn case you can't specify the image dimensions using CSS or one of the above suggested methods and your JS widgets have problems to calculate the right dimensions. You can use the following pattern to update your JS widgets (sliders/masonry):\n\n```js\n$('.my-widget').each(function(){\n    var $module = $(this);\n    var update = function(){\n        $module.myWidget('updateLayout');\n    };\n\n    // Note: Instead of waiting for all images until we initialize the widget\n    // we use event capturing to update the widget's layout progressively.\n    this.addEventListener('load', update, true);\n\n    $module.myWidget();\n});\n```\n\nFor this update pattern you may want to combine this at least with the ``min-height`` pattern explained above.\n\n## <a id=\"include-early\"></a>Tip: Where/How to include lazySizes\nWhile lazy loading is a great feature, it is important for users that crucial in view images are loaded as fast as possible. (Most users start to interact with a page after in view images are loaded.)\n\nIn case you normally combine all your scripts into one large script and add this to the bottom of your page, it can be better for perceived performance to generate two or sometimes more script packages: One small package, which includes all scripts which have heavy influence on the content or the UI and another larger one which includes the normal behavior of the page.\n\nThis smaller script, which should include lazySizes (and all its plugins), should then be placed **before** any other blocking elements (i.e.: script(s)) at the end of the body or after any blocking elements (i.e.: scripts, stylesheets) in the head to load the crucial content as fast possible. (Note: It might make also sense to call `lazySizes.init();` explicitly right after lazySizes and all its plugins are added.)\n\n## Why lazysizes\nIn the past, I often struggled using lazy image loaders, because the \"main check function\" is called repeatedly and with a high frequency. Which makes it hard to fulfill two purposes runtime and memory efficiency. And looking into the source code of most so called lazy loaders often also unveils lazy developers...\n\nBut in a world of responsive retina optimized images on the one hand and JS widgets like carousels or tabs (a lot of initially hidden images) on the other hand lazy loading images becomes more and more important, so I created this project.\n\n**lazysizes** is different:\n\nDue to the fact, that it is designed to be invoked with a high frequency and therefore works highly efficient, it was possible to hook into all kinds of events as a mutationobserver meaning this lazyloader works as a simple drop in solution - you simply write/render your markup and no matter whether the ``.lazyload`` element was added by AJAX or revealed by a JS or CSS animation it will be picked up by **lazysizes**.\n\n```html\n<!-- responsive example: -->\n<img\n\tdata-sizes=\"auto\"\n\n\tdata-srcset=\"image2.jpg 300w,\n    image3.jpg 600w,\n    image4.jpg 900w\"\n    data-src=\"image3.jpg\"\n    class=\"lazyload\" />\n\n<!-- or non-responsive: -->\n<img\n    data-src=\"image.jpg\"\n    class=\"lazyload\" />\n```\n"
  },
  {
    "path": "animate.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n\t<meta charset=\"UTF-8\" />\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t<title>lazysizes - the umltimate lazyloader for responsive images, iframes and widget</title>\n\t<link rel=\"canonical\" href=\"http://afarkas.github.io/lazysizes/index.html\" />\n\n\t<!-- polyfill responsive images: https://github.com/aFarkas/respimage -->\n\t<script>\n\t\tfunction loadJS(u){var r=document.getElementsByTagName(\"script\")[ 0 ],s=document.createElement(\"script\");s.src=u;r.parentNode.insertBefore(s,r);}\n\n\t\tif(!window.HTMLPictureElement || !('sizes' in document.createElement('img'))){\n\t\t\tdocument.createElement('picture');\n\t\t\t//generating the config array\n\t\t\twindow.picturefillCFG = window.picturefillCFG || [];\n\t\t\tpicturefillCFG.push([ \"algorithm\", \"saveData\" ]);\n\n\t\t\tloadJS(\"https://cdnjs.cloudflare.com/ajax/libs/picturefill/3.0.0-beta1/picturefill.min.js\");\n\t\t}\n\t</script>\n\n\t<link href=\"assets/css/tidy.css\" rel=\"stylesheet\" />\n\t<style>\n\t\t.nav {\n\t\t\tmargin-bottom: 30px;\n\t\t}\n\t\t.intrinsic {\n\t\t\tposition: relative;\n\t\t\tpadding-bottom: 75%;\n\t\t\theight: 0;\n\t\t}\n\t\t.intrinsic-2 {\n\t\t\tpadding-bottom: 56.25%;\n\t\t}\n\t\t.intrinsic img,\n\t\t.intrinsic iframe,\n\t\t.intrinsic .lazyload {\n\t\t\tposition:absolute;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tleft: 0;\n\t\t\ttop: 0;\n\t\t\tborder: none;\n\t\t\toverflow: hidden;\n\t\t}\n\n\t\t.thumbnail-small {\n\t\t\twidth: 32%;\n\t\t\tdisplay: inline-block;\n\t\t\tmargin-bottom: 35px;\n\t\t}\n\n\t\tpre {\n\t\t\t-moz-tab-size: 2;\n\t\t\ttab-size: 2;\n\t\t}\n\n\t\t.scroll-view {\n\t\t\toverflow: auto;\n\t\t\toverflow-x: auto;\n\t\t\toverflow-y: hidden;\n\t\t\tposition: relative;\n\t\t\twidth: 100%;\n\t\t\tpadding: 2px 2px 10px;\n\t\t}\n\t\t.scroll-doc {\n\t\t\tdisplay: table;\n\t\t\tposition: relative;\n\t\t\ttext-align: left;\n\t\t}\n\t\t.scroll-item {\n\t\t\tdisplay: table-cell;\n\t\t\tvertical-align: middle;\n\t\t}\n\t\t.scroll-item .thumbnail {\n\t\t\tmargin: 5px 10px;\n\t\t\twidth: 230px;\n\t\t}\n\t\t.scroll-item .thumbnail img {\n\t\t\twidth: 100%;\n\t\t\theight: auto;\n\t\t}\n\n\t\t.lazyloading:not(iframe) {\n\t\t\topacity: 0;\n\t\t}\n\n\t\t.lazyloaded {\n\t\t\topacity: 1;\n\t\t\ttransition: 400ms opacity;\n\t\t}\n\n\t\t[data-expand].lazyload {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.8);\n\t\t}\n\n\t\t[data-expand].lazyloaded {\n\t\t\topacity: 1;\n\t\t\ttransition: all 700ms;\n\t\t\ttransform: scale(1);\n\t\t}\n\n\t\t.effect-row-middle  > [data-expand]:nth-child(2),\n\t\t.effect-row-reverse  > [data-expand]:nth-child(3),\n\t\t.effect-row > [data-expand]:nth-child(1) {\n\t\t\ttransition-delay: 100ms;\n\t\t}\n\n\t\t.effect-row-middle  > [data-expand]:nth-child(1),\n\t\t.effect-row-middle  > [data-expand]:nth-child(3),\n\t\t.effect-row-reverse  > [data-expand]:nth-child(2),\n\t\t.effect-row > [data-expand]:nth-child(2) {\n\t\t\ttransition-delay: 400ms;\n\t\t}\n\n\t\t.effect-row-reverse  > [data-expand]:nth-child(1),\n\t\t.effect-row > [data-expand]:nth-child(3) {\n\t\t\ttransition-delay: 700ms;\n\t\t}\n\n\t</style>\n\n\t<script>\n        window.lazySizesConfig = window.lazySizesConfig || {};\n\n        //window.lazySizesConfig.preloadAfterLoad = true;\n        window.lazySizesConfig.expand = 10;\n\t</script>\n\n\t<script src=\"plugins/unveilhooks/ls.unveilhooks.min.js\" async=\"\"></script>\n\n\t<script src=\"lazysizes.min.js\" async=\"\"></script>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n\n\t<div class=\"jumbotron\">\n\t\t<h1>lazySizes</h1>\n\t\t<p><strong>lazySizes</strong> is the ultimate and lightweight lazyLoader which lazy loads images (including responsive images (picture/srcset)), iframes and scripts. It is written in VanillaJS and with high performance in mind.</p>\n\t\t<p>Simply add the JS to your website and put the <code>class</code> <code>lazyload</code> to all elements, which should be lazy loaded. For a short <a href=\"https://github.com/aFarkas/lazysizes/blob/gh-pages/README.md\">API description go to the readme.md</a>.</p>\n\t</div>\n\n\t<div id=\"examples\">\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<img alt=\"Boat\"\n\t\t\t\t\t\t\t data-src=\"https://farm5.staticflickr.com/4094/4859138371_9713d4396e_b.jpg\"\n\t\t\t\t\t\t\t class=\"lazyload\" />\n\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>Image with LQIP technique</h3>\n\t\t\t\t\t\t<p>The low quality image placeholder pattern is a performance technique. While it might increase measuered time until the <code>onload</code> event, it dramatically increases percieved performance.</p>\n\t\t\t\t\t\t<p>This pattern is recommend for above the fold/crictical images.</p>\n<pre>&lt;img\n\talt=\"100%x200\"\n\tsrc=\"low-quality.jpg\"\n\tdata-src=\"normal-quality.jpg\"\n\tclass=\"lazyload\" /&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<img alt=\"Desert Road\" data-src=\"https://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_b.jpg\" class=\"lazyload\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>Normal lazy image</h3>\n\t\t\t\t\t\t<p>The normal image pattern is can be used for non-critical images or in case there is no low quality image available:</p>\n<pre>&lt;img class=\"lazyload\" data-src=\"image.jpg\" alt=\"Desert Road\" /&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t  sizes=\"(min-width: 1000px) 930px, 90vw\"\n\t\t\t\t\t\t\t  data-srcset=\"https://farm5.staticflickr.com/4078/5441060528_31db7838ba_m.jpg 240w,\n\thttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_n.jpg 320w,\n\thttps://farm5.staticflickr.com/4078/5441060528_31db7838ba.jpg 500w,\n\thttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_z.jpg 640w,\n\thttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_b.jpg 1024w\"\n\t\t\t\t\t\t\t  class=\"lazyload\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>responsive image with srcset and sizes attribute</h3>\n\t\t\t\t\t\t<p>Simply use <code>data-srcset</code> and <code>data-sizes</code> and you can support responsive images.</p>\n<pre>&lt;img\n\talt=\"\"\n\tsrc=\"small.jpg\"\n\tsizes=\"(min-width: 1000px) 930px, 90vw\"\n\tdata-srcset=\"small.jpg 500w,\n\t\tmedium.jpg 640w,\n\t\tbig.jpg 1024w\"\n\tclass=\"lazyload\" /&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<picture>\n\t\t\t\t\t\t\t<!--[if IE 9]><audio><![endif]-->\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-srcset=\"http://lorempixel.com/710/533/people/9/\"\n\t\t\t\t\t\t\t\t\tmedia=\"(max-width: 990px)\" />\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-srcset=\"http://lorempixel.com/930/698/people/8/\"\n\t\t\t\t\t\t\t\t\tmedia=\"(max-width: 1024px)\" />\n\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-srcset=\"http://lorempixel.com/1130/848/people/\" />\n\t\t\t\t\t\t\t<!--[if IE 9]></audio><![endif]-->\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\talt=\"image with artdirection\" />\n\t\t\t\t\t\t</picture>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>responsive image with the <code>picture</code> element</h3>\n\t\t\t\t\t\t<p>The picture element is also supported. Simply add the <code>lazyload</code> class to the <code>img</code> and use <code>data-srcset</code> on your <code>source</code> and the <code>img</code> element.</p>\n<pre>&lt;picture&gt;\n\t&lt;!--[if IE 9]&gt;&lt;video style=\"display: none\"&gt;&lt;![endif]--&gt;\n\t&lt;source\n\t\tdata-srcset=\"500.jpg\"\n\t\tmedia=\"(max-width: 500px)\" /&gt;\n\t&lt;source\n\t\t\tdata-srcset=\"1024.jpg\"\n\t\t\tmedia=\"(max-width: 1024px)\" /&gt;\n\t&lt;source\n\t\t\tdata-srcset=\"1200.jpg\" /&gt;\n&lt;!--[if IE 9]>&lt;/video&gt;&lt;![endif]--&gt;\n&lt;img\n\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\tclass=\"lazyload\"\n\t\talt=\"image with artdirection\" /&gt;\n&lt;/picture&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\" id=\"autosizes-example\">\n\t\t\t<div class=\"alert alert-info\">\n\t\t\t\t<p><strong>automatic sizes feature</strong>: In case of lazy loading images the <code>sizes</code> attribute of the <code>img</code>/<code>source</code> elements can be calculated with JS.</p>\n\t\t\t\t<p>This automatic sizes feature is directly included in <strong>lazySizes</strong>. Simply use the keyword <code>auto</code> inside of the <code>data-sizes</code> attributes (<code>data-sizes=\"auto\"</code>).</p>\n\t\t\t\t<p><strong>Important: How <code>sizes</code> is calculated</strong>: The automatic sizes calculation takes the width of the image if it is over <code>40</code> (see also <code>minSize</code> option). In case it's below the <code>minSize</code> threshold, it traverses up the DOM tree until it finds a parent which is over <code>40</code> and uses this number. Often the following general CSS rule might help: <code>img[data-sizes=\"auto\"] { display: block; }</code>.</p>\n\t\t\t</div>\n\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\tdata-srcset=\"https://farm9.staticflickr.com/8200/8248153196_7a7664e147_m.jpg 240w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_n.jpg 320w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147.jpg 500w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_c.jpg 800w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_b.jpg 1024w\"\n\t\t\t\t\t\t\t\tclass=\"lazyload\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>responsive image with srcset and <strong>automatic sizes</strong> attribute</h3>\n\t\t\t\t\t\t<p>The <strong>autosizes feature</strong> makes using responsive images with the right <code>sizes</code> value easy as hell.</p>\n\n<pre>&lt;img\n\talt=\"\"\n\tdata-sizes=\"auto\"\n\tsrc=\"small.jpg\"\n\tdata-srcset=\"small.jpg 500w,\n\t\tmedium.jpg 640w,\n\t\tbig.jpg 1024w\"\n\tclass=\"lazyload\" /&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"alert alert-danger\">\n\t\t\t\t<p>For responsive images support you must use either use a full polyfill like <a href=\"https://github.com/scottjehl/picturefill\" target=\"_blank\">picturefill</a> or <a href=\"https://github.com/aFarkas/respimage\">respimage</a> or use the <a href=\"https://github.com/aFarkas/lazysizes/blob/gh-pages/plugins/respimg\">extreme lightweight partial respimg polyfill plugin</a> or use the <a href=\"https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins/rias\">Responsive Images as a Service extension</a>.</p>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic intrinsic-2\">\n\t\t\t\t\t\t<iframe data-src=\"//www.youtube.com/embed/ZfV-aYdU4uE\" frameborder=\"0\" allowfullscreen=\"\" class=\"lazyload\">\n\t\t\t\t\t\t</iframe>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>iframe</h3>\n\t\t\t\t\t\t<p>Iframes can be loaded too:</p>\n<pre>&lt;iframe data-src=\"//www.youtube.com/embed/ZfV-aYdU4uE\" class=\"lazyload\" frameborder=\"0\" allowfullscreen>&lt;/iframe&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<script src=\"//code.jquery.com/jquery-2.1.1.min.js\"></script>\n\t\t\t\t\t<div data-ride=\"carousel\" data-script=\"assets/js/bootstrap.min.js\" data-link=\"assets/css/carousel.css\" class=\"carousel lazyload lazypreload slide\" data-interval=\"false\" id=\"carousel-example-captions\">\n\t\t\t\t\t\t<ol class=\"carousel-indicators\">\n\t\t\t\t\t\t\t<li data-slide-to=\"0\" data-target=\"#carousel-example-captions\"></li>\n\t\t\t\t\t\t\t<li data-slide-to=\"1\" data-target=\"#carousel-example-captions\"></li>\n\t\t\t\t\t\t</ol>\n\t\t\t\t\t\t<div class=\"carousel-inner\">\n\n\t\t\t\t\t\t\t<div class=\"item\">\n\t\t\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t\t\t<img alt=\"100%x200\"\n\t\t\t\t\t\t\t\t\t\t data-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\t\t data-srcset=\"https://farm1.staticflickr.com/113/284651694_69e63b374d_m.jpg 240w,\n\t\t\t\t\t\t\t\t\t\t https://farm1.staticflickr.com/113/284651694_69e63b374d.jpg 500w,\nhttps://farm1.staticflickr.com/113/284651694_69e63b374d_z.jpg?zz=1 640w,\nhttps://farm1.staticflickr.com/113/284651694_69e63b374d_o.jpg 800w\"\n\t\t\t\t\t\t\t\t\t\t class=\"lazyload\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"carousel-caption\">\n\t\t\t\t\t\t\t\t\t<h3>First slide label</h3>\n\t\t\t\t\t\t\t\t\t<p>Nulla vitae elit libero, a pharetra augue mollis interdum.</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"item active\">\n\t\t\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t\t\t<img alt=\"100%x200\"\n\t\t\t\t\t\t\t\t\t\t data-srcset=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34_m.jpg 240w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_n.jpg 320w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34.jpg 500w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_z.jpg 640w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_b.jpg 1024w\"\n\t\t\t\t\t\t\t\t\t\t data-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\t\t class=\"lazyload\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"carousel-caption\">\n\t\t\t\t\t\t\t\t\t<h3>Third slide label</h3>\n\t\t\t\t\t\t\t\t\t<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<a data-slide=\"prev\" role=\"button\" href=\"#carousel-example-captions\" class=\"left carousel-control\">\n\t\t\t\t\t\t\t<span class=\"glyphicon glyphicon-chevron-left\"></span>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<a data-slide=\"next\" role=\"button\" href=\"#carousel-example-captions\" class=\"right carousel-control\">\n\t\t\t\t\t\t\t<span class=\"glyphicon glyphicon-chevron-right\"></span>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>Widgets/Javascript/Script</h3>\n\t\t\t\t\t\t<p>LazySizes can be extended to load nearly everything lazily. The <a href=\"https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins\">ls.unveilhooks.js</a> plugin can be used to lazy load scripts, background images, and videos. Simply add a <code>data-script</code> to your widget and you are done:</p>\n<pre>&lt;div data-ride=\"carousel\" data-script=\"assets/js/bootstrap.min.js\" class=\"carousel lazyload\"&gt;\n\t&lt;!-- widget content --&gt;\n&lt;div&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<div class=\"scroll-view\">\n\t\t\t\t<div class=\"scroll-doc\">\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_m.jpg 240w,\n\t\t\t\t\t\thttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_n.jpg 320w,\n\t\t\t\t\t\thttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8.jpg 500w,\n\t\t\t\t\t\thttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_z.jpg 640w,\n\t\t\t\t\t\thttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_c.jpg 800w,\n\t\t\t\t\t\thttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_b.jpg 1024w\"\n\t\t\t\t\t\t\t\t\talt=\"Desert Road\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm5.staticflickr.com/4078/5441060528_31db7838ba_m.jpg 240w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_n.jpg 320w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba.jpg 500w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_z.jpg 640w\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm9.staticflickr.com/8200/8248153196_7a7664e147_m.jpg 240w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_n.jpg 320w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"@ The Desert Tortoise Natural Area\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/113/284651694_69e63b374d_m.jpg 240w,\nhttps://farm1.staticflickr.com/113/284651694_69e63b374d.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"Woman in water\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm3.staticflickr.com/2401/2171553538_37d0a133da_m.jpg 240w,\nhttps://farm3.staticflickr.com/2401/2171553538_37d0a133da.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"Borobudur\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/17/92230866_713ae1eeef_n.jpg 240w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef.jpg 375w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef_z.jpg 480w\"\n\t\t\t\t\t\t\t\t\talt=\"A tree in the blue\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/192/504251019_ffc94c77b5_n.jpg 240w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5.jpg 375w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5_z.jpg 480w\"\n\t\t\t\t\t\t\t\t\talt=\"Windows on Istanbul\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5139/5546134597_0b19627066_m.jpg 240w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066_n.jpg 320w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"Goldie Dawn\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm3.staticflickr.com/2727/4393975099_c212622aa0_m.jpg 240w,\nhttps://farm3.staticflickr.com/2727/4393975099_c212622aa0_n.jpg 320w\"\n\t\t\t\t\t\t\t\t\talt=\"Avebury Stone Circle\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34_m.jpg 240w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_n.jpg 320w\"\n\t\t\t\t\t\t\t\t\talt=\"el castil de tierra\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm8.staticflickr.com/7356/11122919374_55294abec3_m.jpg 240w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3_n.jpg 320w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"sunset\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_m.jpg 240w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_n.jpg 320w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"Sky and earth\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_n.jpg 240w,\nhttps://farm4.staticflickr.com/3023/2994603808_a3036a3cdf.jpg 375w,\nhttps://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_z.jpg 480w\"\n\t\t\t\t\t\t\t\t\talt=\"Missing Ulsoor lake (Explore)\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_n.jpg 227w,\nhttps://farm7.staticflickr.com/6211/6254520191_c7868f3a5d.jpg 354w,\nhttps://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_z.jpg 453w\"\n\t\t\t\t\t\t\t\t\talt=\"Oxford Path 2\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<div class=\"alert alert-info\">\n\t\t\t\t<p>While other lazy loaders or responsive images solution need to be called, if new elements are added to the DOM or do become visible through a special user interaction or a JavaScript behavior.</p>\n\t\t\t\t<p>LazySizes does automatically detect any changes to the DOM and the visibility of <code>.lazyload</code> elements.</p>\n\t\t\t\t<button type=\"button\" class=\"add-new btn btn-primary\">click to add new elements</button>\n\t\t\t</div>\n\n\t\t\t<script type=\"text/html\" class=\"template\">\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/abstract/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/animals/1\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/business/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"row effect-row\">\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload lightSpeedIn\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/cats/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload lightSpeedIn\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/city/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload lightSpeedIn\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/food/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"row effect-row-middle\">\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/nature/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/sports/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/technics/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"row effect-row-reverse\">\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload flipInX\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/nightlife/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload flipInX\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/fashion/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload flipInX\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/people/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\n\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/transport/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/animals/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://lorempixel.com/400/300/food/2/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</script>\n\t\t\t<script>\n\t\t\t\t$('.add-new').on('click', function(){\n\t\t\t\t\tvar $template = $('.template');\n\t\t\t\t\t$template.after($template.html());\n\t\t\t\t});\n\t\t\t</script>\n\t\t\t<br />\n\t\t\t<br />\n\t\t\t<br />\n\t\t\t<br />\n\t\t\t<br />\n\t\t\t<br />\n\n\t\t</div>\n\n\t</div>\n\n\n\n\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "assets/css/bootstrap-theme.css",
    "content": "/*!\n * Bootstrap v3.3.0 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*!\n * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=5e2acd9519dbb9aaf550)\n * Config saved to config.json and https://gist.github.com/5e2acd9519dbb9aaf550\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n  text-shadow: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n.btn-default {\n  background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n  background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #dbdbdb;\n  text-shadow: 0 1px 0 #fff;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n  background-color: #e0e0e0;\n  background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n  background-color: #e0e0e0;\n  border-color: #dbdbdb;\n}\n.btn-default:disabled,\n.btn-default[disabled] {\n  background-color: #e0e0e0;\n  background-image: none;\n}\n.btn-primary {\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);\n  background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #2b669a;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #2d6ca2;\n  background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #2d6ca2;\n  border-color: #2b669a;\n}\n.btn-primary:disabled,\n.btn-primary[disabled] {\n  background-color: #2d6ca2;\n  background-image: none;\n}\n.btn-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n  background-color: #419641;\n  background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #419641;\n  border-color: #3e8f3e;\n}\n.btn-success:disabled,\n.btn-success[disabled] {\n  background-color: #419641;\n  background-image: none;\n}\n.btn-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n  background-color: #2aabd2;\n  background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #2aabd2;\n  border-color: #28a4c9;\n}\n.btn-info:disabled,\n.btn-info[disabled] {\n  background-color: #2aabd2;\n  background-image: none;\n}\n.btn-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n  background-color: #eb9316;\n  background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #eb9316;\n  border-color: #e38d13;\n}\n.btn-warning:disabled,\n.btn-warning[disabled] {\n  background-color: #eb9316;\n  background-image: none;\n}\n.btn-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n  background-color: #c12e2a;\n  background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #c12e2a;\n  border-color: #b92c28;\n}\n.btn-danger:disabled,\n.btn-danger[disabled] {\n  background-color: #c12e2a;\n  background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n  background-color: #357ebd;\n}\n.navbar-default {\n  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n  background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n  background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n  background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n  border-color: #b2dba1;\n}\n.alert-info {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n  border-color: #9acfea;\n}\n.alert-warning {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n  border-color: #f5e79e;\n}\n.alert-danger {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n  border-color: #dca7a7;\n}\n.progress {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);\n  background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);\n}\n.progress-bar-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #3071a9;\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);\n  background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);\n  border-color: #3278b3;\n}\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n}\n.panel-success > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  border-color: #dcdcdc;\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n"
  },
  {
    "path": "assets/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.3.0 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*!\n * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=5e2acd9519dbb9aaf550)\n * Config saved to config.json and https://gist.github.com/5e2acd9519dbb9aaf550\n */\n/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\nmark {\n  background: #ff0;\n  color: #000;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n  border: 0;\n  padding: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\ntd,\nth {\n  padding: 0;\n}\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333333;\n  background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #428bca;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  background-color: #fcf8e3;\n  padding: .2em;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777777;\n}\n.text-primary {\n  color: #428bca;\n}\na.text-primary:hover {\n  color: #3071a9;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #428bca;\n}\na.bg-primary:hover {\n  background-color: #3071a9;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #ffffff;\n  background-color: #333333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.row {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0%;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0%;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n.table .table {\n  background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #dddddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n  color: #999999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  line-height: 34px;\n  line-height: 1.42857143 \\0;\n}\ninput[type=\"date\"].input-sm,\ninput[type=\"time\"].input-sm,\ninput[type=\"datetime-local\"].input-sm,\ninput[type=\"month\"].input-sm {\n  line-height: 30px;\n  line-height: 1.5 \\0;\n}\ninput[type=\"date\"].input-lg,\ninput[type=\"time\"].input-lg,\ninput[type=\"datetime-local\"].input-lg,\ninput[type=\"month\"].input-lg {\n  line-height: 46px;\n  line-height: 1.33 \\0;\n}\n_:-ms-fullscreen,\n:root input[type=\"date\"],\n_:-ms-fullscreen,\n:root input[type=\"time\"],\n_:-ms-fullscreen,\n:root input[type=\"datetime-local\"],\n_:-ms-fullscreen,\n:root input[type=\"month\"] {\n  line-height: 1.42857143;\n}\n_:-ms-fullscreen.input-sm,\n:root input[type=\"date\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"time\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"datetime-local\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"month\"].input-sm {\n  line-height: 1.5;\n}\n_:-ms-fullscreen.input-lg,\n:root input[type=\"date\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"time\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"datetime-local\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"month\"].input-lg {\n  line-height: 1.33;\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-sm,\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm,\nselect.form-group-sm .form-control {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control {\n  height: auto;\n}\n.input-lg,\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg,\nselect.form-group-lg .form-control {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control {\n  height: auto;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  border-color: #3c763d;\n  background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n    margin-bottom: 0;\n    padding-top: 7px;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.3px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  outline: 0;\n  background-image: none;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  pointer-events: none;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n.btn-default .badge {\n  color: #ffffff;\n  background-color: #333333;\n}\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3071a9;\n  border-color: #285e8e;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n.btn-primary .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #ffffff;\n}\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #ffffff;\n}\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #ffffff;\n}\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #ffffff;\n}\n.btn-link {\n  color: #428bca;\n  font-weight: normal;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777777;\n  text-decoration: none;\n}\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #428bca;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n  .container .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: border 0.2s ease-in-out;\n  -o-transition: border 0.2s ease-in-out;\n  transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-left: auto;\n  margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #428bca;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #3c763d;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-left-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n  border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #dddddd;\n}\n.panel-primary {\n  border-color: #428bca;\n}\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #428bca;\n}\n.panel-primary > .panel-heading .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #428bca;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    transition: transform 0.6s ease-in-out;\n    backface-visibility: hidden;\n    perspective: 1000;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    transform: translate3d(100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    transform: translate3d(-100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    transform: translate3d(0, 0, 0);\n    left: 0;\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n  left: auto;\n  right: 0;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  outline: 0;\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n  margin: 0;\n  width: 12px;\n  height: 12px;\n  background-color: #ffffff;\n}\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.panel-body:before,\n.panel-body:after {\n  content: \" \";\n  display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.panel-body:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n"
  },
  {
    "path": "assets/css/carousel.css",
    "content": "\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n\tdisplay: block;\n\twidth: 100% \\9;\n\tmax-width: 100%;\n\theight: auto;\n}\n.carousel {\n\tposition: relative;\n}\n.carousel-inner {\n\tposition: relative;\n\toverflow: hidden;\n\twidth: 100%;\n}\n.carousel-inner > .item {\n\tdisplay: none;\n\tposition: relative;\n\t-webkit-transition: 0.6s ease-in-out left;\n\t-o-transition: 0.6s ease-in-out left;\n\ttransition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n\tline-height: 1;\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n\tdisplay: block;\n}\n.carousel-inner > .active {\n\tleft: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n\tposition: absolute;\n\ttop: 0;\n\twidth: 100%;\n}\n.carousel-inner > .next {\n\tleft: 100%;\n}\n.carousel-inner > .prev {\n\tleft: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n\tleft: 0;\n}\n.carousel-inner > .active.left {\n\tleft: -100%;\n}\n.carousel-inner > .active.right {\n\tleft: 100%;\n}\n.carousel-control {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\twidth: 15%;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50);\n\tfont-size: 20px;\n\tcolor: #ffffff;\n\ttext-align: center;\n\ttext-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n\tbackground-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n\tbackground-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n\tbackground-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n\tbackground-repeat: repeat-x;\n\tfilter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n\tleft: auto;\n\tright: 0;\n\tbackground-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n\tbackground-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n\tbackground-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n\tbackground-repeat: repeat-x;\n\tfilter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n\toutline: 0;\n\tcolor: #ffffff;\n\ttext-decoration: none;\n\topacity: 0.9;\n\tfilter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n\tposition: absolute;\n\ttop: 50%;\n\tz-index: 5;\n\tdisplay: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n\tleft: 50%;\n\tmargin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n\tright: 50%;\n\tmargin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n\twidth: 20px;\n\theight: 20px;\n\tmargin-top: -10px;\n\tfont-family: serif;\n}\n.carousel-control .icon-prev:before {\n\tcontent: '\\2039';\n}\n.carousel-control .icon-next:before {\n\tcontent: '\\203a';\n}\n.carousel-indicators {\n\tposition: absolute;\n\tbottom: 10px;\n\tleft: 50%;\n\tz-index: 15;\n\twidth: 60%;\n\tmargin-left: -30%;\n\tpadding-left: 0;\n\tlist-style: none;\n\ttext-align: center;\n}\n.carousel-indicators li {\n\tdisplay: inline-block;\n\twidth: 10px;\n\theight: 10px;\n\tmargin: 1px;\n\ttext-indent: -999px;\n\tborder: 1px solid #ffffff;\n\tborder-radius: 10px;\n\tcursor: pointer;\n\tbackground-color: #000 \\9;\n\tbackground-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n\tmargin: 0;\n\twidth: 12px;\n\theight: 12px;\n\tbackground-color: #ffffff;\n}\n.carousel-caption {\n\tposition: absolute;\n\tleft: 15%;\n\tright: 15%;\n\tbottom: 20px;\n\tz-index: 10;\n\tpadding-top: 20px;\n\tpadding-bottom: 20px;\n\tcolor: #ffffff;\n\ttext-align: center;\n\ttext-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n\ttext-shadow: none;\n}\n@media screen and (min-width: 768px) {\n\t.carousel-control .glyphicon-chevron-left,\n\t.carousel-control .glyphicon-chevron-right,\n\t.carousel-control .icon-prev,\n\t.carousel-control .icon-next {\n\t\twidth: 30px;\n\t\theight: 30px;\n\t\tmargin-top: -15px;\n\t\tfont-size: 30px;\n\t}\n\t.carousel-control .glyphicon-chevron-left,\n\t.carousel-control .icon-prev {\n\t\tmargin-left: -15px;\n\t}\n\t.carousel-control .glyphicon-chevron-right,\n\t.carousel-control .icon-next {\n\t\tmargin-right: -15px;\n\t}\n\t.carousel-caption {\n\t\tleft: 20%;\n\t\tright: 20%;\n\t\tpadding-bottom: 30px;\n\t}\n\t.carousel-indicators {\n\t\tbottom: 20px;\n\t}\n}\n"
  },
  {
    "path": "assets/css/tidy.css",
    "content": "/*!\n * Bootstrap v3.3.0 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*!\n * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=5e2acd9519dbb9aaf550)\n * Config saved to config.json and https://gist.github.com/5e2acd9519dbb9aaf550\n */\n\n/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na {\n  background-color: transparent;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nstrong {\n  font-weight: bold;\n}\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\nimg {\n  border: 0;\n}\n\npre {\n  overflow: auto;\n}\n\ncode,\npre {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\nbutton,\ninput {\n  color: inherit;\n  font: inherit;\n  margin: 0;\n}\n\nbutton {\n  overflow: visible;\n}\n\nbutton {\n  text-transform: none;\n}\n\nbutton {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\ninput {\n  line-height: normal;\n}\n\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\nlegend {\n  border: 0;\n  padding: 0;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: \"Helvetica Neue\",Helvetica,Arial,sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333;\n  background-color: #fff;\n}\n\ninput,\nbutton {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.thumbnail>img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n\nh1,\nh3 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\n\nh1,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh1 {\n  font-size: 36px;\n}\n\nh3 {\n  font-size: 24px;\n}\n\np {\n  margin: 0 0 10px;\n}\n\ncode,\npre {\n  font-family: Menlo,Monaco,Consolas,\"Courier New\",monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n\n@media (min-width:768px) {\n  .container {\n    width: 750px;\n  }\n}\n\n@media (min-width:992px) {\n  .container {\n    width: 970px;\n  }\n}\n\n@media (min-width:1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n\n.row {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n\n.col-sm-4,\n.col-sm-6,\n.col-sm-12 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n\n@media (min-width:768px) {\n  .col-sm-4,\n  .col-sm-6,\n  .col-sm-12 {\n    float: left;\n  }\n\n  .col-sm-12 {\n    width: 100%;\n  }\n\n  .col-sm-4 {\n    width: 33%;\n  }\n\n  .col-sm-6 {\n    width: 50%;\n  }\n}\n\ntable {\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n\n.table>thead>tr>th,\n.table>tbody>tr>th,\n.table>tbody>tr>td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n\n.table>thead>tr>th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n\n.table>thead:first-child>tr:first-child>th {\n  border-top: 0;\n}\n\n.table-condensed>thead>tr>th,\n.table-condensed>tbody>tr>th,\n.table-condensed>tbody>tr>td {\n  padding: 5px;\n}\n\n.table-striped>tbody>tr:nth-child(odd) {\n  background-color: #f9f9f9;\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\n\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n\n_:-ms-fullscreen,\n_:-ms-fullscreen,\n_:-ms-fullscreen,\n_:-ms-fullscreen {\n  line-height: 1.42857143;\n}\n\n_:-ms-fullscreen.input-sm,\n_:-ms-fullscreen.input-sm,\n_:-ms-fullscreen.input-sm,\n_:-ms-fullscreen.input-sm {\n  line-height: 1.5;\n}\n\n_:-ms-fullscreen.input-lg,\n_:-ms-fullscreen.input-lg,\n_:-ms-fullscreen.input-lg,\n_:-ms-fullscreen.input-lg {\n  line-height: 1.33;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n\n.checkbox input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.btn:focus,\n.btn:active:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333;\n  text-decoration: none;\n}\n\n.btn:active {\n  outline: 0;\n  background-image: none;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125);\n  box-shadow: inset 0 3px 5px rgba(0,0,0,0.125);\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active {\n  color: #fff;\n  background-color: #3071a9;\n  border-color: #285e8e;\n}\n\n.btn-primary:active {\n  background-image: none;\n}\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label-default {\n  background-color: #777;\n}\n\n.label-success {\n  background-color: #5cb85c;\n}\n\n.label-danger {\n  background-color: #d9534f;\n}\n\n.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eee;\n}\n\n.jumbotron h1 {\n  color: inherit;\n}\n\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n@media screen and (min-width:768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n\n  .container .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n\n  .jumbotron h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border .2s ease-in-out;\n  -o-transition: border .2s ease-in-out;\n  transition: border .2s ease-in-out;\n}\n\n.thumbnail>img {\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert>p {\n  margin-bottom: 0;\n}\n\n.alert>p+p {\n  margin-top: 5px;\n}\n\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f;\n}\n\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.05);\n  box-shadow: 0 1px 1px rgba(0,0,0,0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.panel-default {\n  border-color: #ddd;\n}\n\n.panel-default>.panel-heading {\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n\n.container:before,\n.container:after,\n.row:before,\n.row:after,\n.panel-body:before,\n.panel-body:after {\n  content: \" \";\n  display: table;\n}\n\n.container:after,\n.row:after,\n.panel-body:after {\n  clear: both;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n/*!\n * Bootstrap v3.3.0 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*!\n * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=5e2acd9519dbb9aaf550)\n * Config saved to config.json and https://gist.github.com/5e2acd9519dbb9aaf550\n */\n\n.btn-primary {\n  text-shadow: 0 -1px 0 rgba(0,0,0,0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);\n}\n\n.btn-primary:active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125);\n  box-shadow: inset 0 3px 5px rgba(0,0,0,0.125);\n}\n\n.btn:active {\n  background-image: none;\n}\n\n.btn-primary {\n  background-image: -webkit-linear-gradient(top, #428bca 0, #2d6ca2 100%);\n  background-image: -o-linear-gradient(top, #428bca 0, #2d6ca2 100%);\n  background-image: linear-gradient(to bottom, #428bca 0, #2d6ca2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #2b669a;\n}\n\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #2d6ca2;\n  background-position: 0 -15px;\n}\n\n.btn-primary:active {\n  background-color: #2d6ca2;\n  border-color: #2b669a;\n}\n\n.btn-primary:disabled {\n  background-color: #2d6ca2;\n  background-image: none;\n}\n\n.thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.075);\n  box-shadow: 0 1px 2px rgba(0,0,0,0.075);\n}\n\n.alert {\n  text-shadow: 0 1px 0 rgba(255,255,255,0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);\n}\n\n.alert-info {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);\n  background-image: -o-linear-gradient(top, #d9edf7 0, #b9def0 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n  border-color: #9acfea;\n}\n\n.alert-danger {\n  background-image: -webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);\n  background-image: -o-linear-gradient(top, #f2dede 0, #e7c3c3 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n  border-color: #dca7a7;\n}\n\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n  box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n}\n\n.panel-default>.panel-heading {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);\n  background-image: -o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n"
  },
  {
    "path": "assets/js/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.2.0 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*!\n * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=43210ccffbad43b37f66)\n * Config saved to config.json and https://gist.github.com/43210ccffbad43b37f66\n */\nif (typeof jQuery === \"undefined\") { throw new Error(\"Bootstrap's JavaScript requires jQuery\") }\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.2.0\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.2.0'\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var href\n    var $this   = $(this)\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n    if (!$target.hasClass('carousel')) return\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: transition.js v3.2.0\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "bower.json",
    "content": "{\n\t\"name\": \"lazysizes\",\n\t\"repo\": \"afarkas/lazysizes\",\n\t\"main\": \"lazysizes.js\",\n\t\"scripts\": [\n\t\t\"lazysizes.js\",\n\t\t\"lazysizes.min.js\"\n\t],\n\t\"license\": \"MIT\",\n\t\"authors\": [\n\t\t\"Alexander Farkas <info@corrupt-system.de>\"\n\t],\n\t\"moduleType\": [\n\t\t\"amd\",\n\t\t\"globals\"\n\t],\n\t\"description\": \"High performance (jankfree) lazy loader for images (including responsive images), iframes and scripts (widgets).\",\n\t\"keywords\": [\"lazy\", \"lazyloader\", \"performance\", \"responsive\", \"image\", \"responsive images\", \"picture\", \"srcset\"],\n\t\"ignore\": [\n\t\t\"**/.*\",\n\t\t\"node_modules\",\n\t\t\"/assets\",\n\t\t\"/maxdpr\",\n\t\t\"/rias\",\n\t\t\"/include\",\n\t\t\"/optimumx\",\n\t\t\"bower_components\",\n\t\t\"/test\",\n\t\t\"/tests\",\n\t\t\"index.html\",\n\t  \t\"no-src.html\",\n\t  \t\"animate.html\",\n\t\t\"Gruntfile.js\",\n\t\t\"component.json\",\n\t\t\"package.json\",\n\t    \"plato-report\"\n\t]\n}\n"
  },
  {
    "path": "component.json",
    "content": "{\n\t\"name\": \"lazysizes\",\n\t\"version\": \"1.4.0\",\n\t\"repo\": \"afarkas/lazysizes\",\n\t\"main\": \"lazysizes.min.js\",\n\t\"scripts\": [\"lazysizes.min.js\"],\n\t\"description\": \"High performance (jankfree) lazy loader for images (including responsive images), iframes and scripts (widgets).\",\n\t\"keywords\": [\"lazy\", \"lazyloader\", \"performance\", \"responsive\", \"image\", \"responsive images\", \"picture\", \"srcset\"],\n\t\"license\": \"MIT\"\n}\n"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"UTF-8\" />\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t<title>lazysizes - the ultimate lazyloader for responsive images, iframes and widget</title>\n\t<link rel=\"canonical\" href=\"https://afarkas.github.io/lazysizes/index.html\" />\n\n\t<script>\n\t\tfunction loadJS(u){var r=document.getElementsByTagName(\"script\")[ 0 ],s=document.createElement(\"script\");s.src=u;r.parentNode.insertBefore(s,r);}\n\n\t\tif(!window.HTMLPictureElement || !('sizes' in document.createElement('img'))){\n\t\t\tdocument.createElement('picture');\n\t\t\tloadJS(\"plugins/respimg/ls.respimg.min.js\");\n\t\t}\n\t</script>\n\n\t<link href=\"assets/css/tidy.css\" rel=\"stylesheet\" />\n\t<style>\n\t\t.nav {\n\t\t\tmargin-bottom: 30px;\n\t\t}\n\t\t.intrinsic {\n\t\t\tposition: relative;\n\t\t\tpadding-bottom: 75%;\n\t\t\theight: 0;\n\t\t}\n\n\t\t.intrinsic-2 {\n\t\t\tpadding-bottom: 56.25%;\n\t\t}\n\t\t.intrinsic-3 {\n\t\t\tpadding-bottom: 133.333%;\n\t\t}\n\t\t.intrinsic img,\n\t\t.intrinsic iframe,\n\t\t.intrinsic .lazyload {\n\t\t\tposition:absolute;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tleft: 0;\n\t\t\ttop: 0;\n\t\t\tborder: none;\n\t\t\toverflow: hidden;\n\t\t}\n\t\t.thumbnail-small {\n\t\t\twidth: 32%;\n\t\t\tdisplay: inline-block;\n\t\t\tmargin-bottom: 35px;\n\t\t}\n\t\tpre {\n\t\t\t-moz-tab-size: 2;\n\t\t\ttab-size: 2;\n\t\t}\n\n\t\t.scroll-view {\n\t\t\toverflow: auto;\n\t\t\toverflow-x: auto;\n\t\t\toverflow-y: hidden;\n            -webkit-overflow-scrolling: touch;\n\t\t\tposition: relative;\n\t\t\twidth: 100%;\n\t\t\tpadding: 2px 2px 10px;\n\t\t}\n\t\t.scroll-doc {\n\t\t\tdisplay: table;\n\t\t\tposition: relative;\n\t\t\ttext-align: left;\n\t\t}\n\t\t.scroll-item {\n\t\t\tdisplay: table-cell;\n\t\t\tvertical-align: middle;\n\t\t}\n\t\t.scroll-item .thumbnail {\n\t\t\tmargin: 5px 10px;\n\t\t\twidth: 230px;\n\t\t}\n\t\t.scroll-item .thumbnail img {\n\t\t\twidth: 100%;\n\t\t\theight: auto;\n\t\t}\n\n\t\t.no-src.lazyload,\n\t\t.no-src.lazyloading {\n\t\t\topacity: 0;\n\t\t}\n\n\t\t.no-src.lazyloaded {\n\t\t\topacity: 1;\n\t\t\ttransition: opacity 300ms;\n\t\t}\n\n\t\t[data-expand].lazyload {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.8);\n\t\t}\n\n\t\t[data-expand].lazyloaded {\n\t\t\topacity: 1;\n\t\t\ttransition: all 700ms;\n\t\t\ttransform: scale(1);\n\t\t}\n\n\t\t.effect-row-middle  > [data-expand]:nth-child(2),\n\t\t.effect-row-reverse  > [data-expand]:nth-child(3),\n\t\t.effect-row > [data-expand]:nth-child(1) {\n\t\t\ttransition-delay: 100ms;\n\t\t}\n\n\t\t.effect-row-middle  > [data-expand]:nth-child(1),\n\t\t.effect-row-middle  > [data-expand]:nth-child(3),\n\t\t.effect-row-reverse  > [data-expand]:nth-child(2),\n\t\t.effect-row > [data-expand]:nth-child(2) {\n\t\t\ttransition-delay: 400ms;\n\t\t}\n\n\t\t.effect-row-reverse  > [data-expand]:nth-child(1),\n\t\t.effect-row > [data-expand]:nth-child(3) {\n\t\t\ttransition-delay: 700ms;\n\t\t}\n\n\t\t/*.blur-up {*/\n\t\t\t/*-webkit-filter: blur(4px);*/\n\t\t\t/*filter: blur(4px);*/\n\t\t\t/*transition: filter 400ms, -webkit-filter 400ms;*/\n\t\t/*}*/\n\n\t\t/*.blur-up.lazyloaded {*/\n\t\t\t/*-webkit-filter: blur(0);*/\n\t\t\t/*filter: blur(0);*/\n\t\t/*}*/\n\t</style>\n\n\t<script>\n\t\t(function(){\n\t\t\tvar docElem = document.documentElement;\n\n\t\t\twindow.lazySizesConfig = window.lazySizesConfig || {};\n\n\t\t\twindow.lazySizesConfig.loadMode = 1;\n\n\t\t\t//set expand to a higher value on larger displays\n\t\t\twindow.lazySizesConfig.expand = Math.max(Math.min(docElem.clientWidth, docElem.clientHeight, 1222) - 1, 359);\n\t\t\twindow.lazySizesConfig.expFactor = lazySizesConfig.expand < 380 ? 3 : 2;\n\t\t})();\n\t</script>\n\n\t<script src=\"plugins/unveilhooks/ls.unveilhooks.min.js\" async=\"\"></script>\n\n\t<script src=\"lazysizes.min.js\" async=\"\"></script>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n\n\t<div class=\"jumbotron\">\n\t\t<h1>lazySizes</h1>\n\t\t<p><strong>lazySizes</strong> is the ultimate and lightweight lazyLoader which lazy loads images (including responsive images (picture/srcset)), iframes and scripts. It is written in VanillaJS and with high performance in mind.</p>\n\t\t<p>Simply add the JS to your website and put the <code>class</code> <code>lazyload</code> to all elements, which should be lazy loaded. For a short <a href=\"https://github.com/aFarkas/lazysizes/blob/gh-pages/README.md\">API description go to the readme.md</a>.</p>\n\t</div>\n\n\t<div id=\"examples\">\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\talt=\"bird\"\n\t\t\t\t\t\t\tsrc=\"https://images.unsplash.com/photo-1470116073782-48ae2ccd8ffd?ixlib=rb-1.2.1&auto=format&fit=crop&w=100\"\n\t\t\t\t\t\t\tdata-src=\"https://images.unsplash.com/photo-1470116073782-48ae2ccd8ffd?ixlib=rb-1.2.1&auto=format&fit=crop&w=1600&q=80\"\n\t\t\t\t\t\t\tclass=\"lazyload\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>Image with LQIP technique</h3>\n\t\t\t\t\t\t<p>The low quality image placeholder pattern uses a low quality image for the first impression.</p>\n<pre>&lt;img\n\talt=\"bird\"\n\tsrc=\"low-quality.jpg\"\n\tdata-src=\"normal-quality.jpg\"\n\tclass=\"lazyload\" /&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<img alt=\"Mountain\" data-src=\"https://images.unsplash.com/photo-1544198365-f5d60b6d8190?ixlib=rb-1.2.1&auto=format&fit=crop&w=1130&q=80\" class=\"lazyload no-src\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>Normal lazy image</h3>\n\t\t\t\t\t\t<p>Of course the low quality image can be simply omitted to save more image data.</p>\n<pre>&lt;img class=\"lazyload\" data-src=\"image.jpg\" alt=\"Mountain\" /&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t  alt=\"Jellyfish\"\n\t\t\t\t\t\t\t  sizes=\"(min-width: 1000px) 930px, 90vw\"\n\t\t\t\t\t\t\t  data-sizes=\"auto\"\n\t\t\t\t\t\t\t  data-src=\"https://images.unsplash.com/photo-1523264629844-40dd6bf17c2b?ixlib=rb-1.2.1&auto=format&fit=crop&w=1024&q=60\"\n\t\t\t\t\t\t\t  data-srcset=\"https://images.unsplash.com/photo-1523264629844-40dd6bf17c2b?ixlib=rb-1.2.1&auto=format&fit=crop&w=240&q=60 240w,\n\thttps://images.unsplash.com/photo-1523264629844-40dd6bf17c2b?ixlib=rb-1.2.1&auto=format&fit=crop&w=320&q=60 320w,\n\thttps://images.unsplash.com/photo-1523264629844-40dd6bf17c2b?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60 500w,\n\thttps://images.unsplash.com/photo-1523264629844-40dd6bf17c2b?ixlib=rb-1.2.1&auto=format&fit=crop&w=640&q=60 640w,\n\thttps://images.unsplash.com/photo-1523264629844-40dd6bf17c2b?ixlib=rb-1.2.1&auto=format&fit=crop&w=1024&q=60 1024w\"\n\t\t\t\t\t\t\t  class=\"lazyload no-src\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>responsive image with srcset and sizes attribute</h3>\n\t\t\t\t\t\t<p>Simply use <code>data-srcset</code> and you can support responsive images.</p>\n<pre>&lt;img\n\talt=\"Jellyfish\"\n\tsizes=\"(min-width: 1000px) 930px, 90vw\"\n\tdata-srcset=\"small.jpg 500w,\n\t\tmedium.jpg 640w,\n\t\tbig.jpg 1024w\"\n\tdata-src=\"medium.jpg\"\n\tclass=\"lazyload\" /&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<picture>\n\t\t\t\t\t\t\t<!--[if IE 9]><audio><![endif]-->\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-src=\"https://images.unsplash.com/photo-1501785888041-af3ef285b470?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&crop=focalpoint&w=550&q=80&ar=1.5:1&fp-x=0.55&fp-y=0.35&fp-z=2\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://images.unsplash.com/photo-1501785888041-af3ef285b470?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&crop=focalpoint&w=240&q=80&ar=1.5:1&fp-x=0.55&fp-y=0.35&fp-z=2 240w,\n\t\t\t\t\t\t\t\t\thttps://images.unsplash.com/photo-1501785888041-af3ef285b470?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&crop=focalpoint&w=320&q=80&ar=1.5:1&fp-x=0.55&fp-y=0.35&fp-z=2 320w,\n\t\t\t\t\t\t\t\t\thttps://images.unsplash.com/photo-1501785888041-af3ef285b470?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&crop=focalpoint&w=500&q=80&ar=1.5:1&fp-x=0.55&fp-y=0.35&fp-z=2 500w\"\n\t\t\t\t\t\t\t\t\tmedia=\"(max-width: 550px)\" />\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-src=\"https://images.unsplash.com/photo-1501785888041-af3ef285b470?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1024&q=80&ar=1.5:1\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://images.unsplash.com/photo-1501785888041-af3ef285b470?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&crop=focalpoint&w=640&q=80&ar=1.5:1&fp-x=0.35&fp-y=0.56&fp-z=2 640w,\n\t\t\t\t\t\t\t\t\thttps://images.unsplash.com/photo-1501785888041-af3ef285b470?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&crop=focalpoint&w=990&q=80&ar=1.5:1&fp-x=0.35&fp-y=0.56&fp-z=2 990w,\n\t\t\t\t\t\t\t\t\thttps://images.unsplash.com/photo-1501785888041-af3ef285b470?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&crop=focalpoint&w=1024&q=80&ar=1.5:1&fp-x=0.35&fp-y=0.56&fp-z=2 1024w\"\n\t\t\t\t\t\t\t\t\tmedia=\"(max-width: 1024px)\" />\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-src=\"https://images.unsplash.com/photo-1501785888041-af3ef285b470?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1200&q=80&ar=2:1\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://images.unsplash.com/photo-1501785888041-af3ef285b470?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1200&q=80&ar=2:1 1200w\" />\n\t\t\t\t\t\t\t<!--[if IE 9]></audio><![endif]-->\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://images.unsplash.com/photo-1501785888041-af3ef285b470?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1130&q=80&ar=1.5:1 1130w\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\talt=\"image with artdirection\" />\n\t\t\t\t\t\t</picture>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>responsive image with the <code>picture</code> element</h3>\n\t\t\t\t\t\t<p>The picture element is also supported. Simply add the <code>lazyload</code> class to the <code>img</code> and use <code>data-srcset</code> on your <code>source</code> and the <code>img</code> element.</p>\n<pre>&lt;picture&gt;\n\t&lt;!--[if IE 9]&gt;&lt;video style=\"display: none\"&gt;&lt;![endif]--&gt;\n\t&lt;source\n\t\tdata-srcset=\"240.jpg 240w,\n\t\t\t320.jpg 320w,\n\t\t\t500.jpg 500w\"\n\t\tmedia=\"(max-width: 550px)\" /&gt;\n\t&lt;source\n\t\t\tdata-srcset=\"640.jpg 640w,\n\t\t\t\t990.jpg 990w,\n\t\t\t\t1024.jpg 1024w\"\n\t\t\tmedia=\"(max-width: 1024px)\" /&gt;\n\t&lt;source\n\t\t\tdata-srcset=\"1200.jpg 1200w\" /&gt;\n&lt;!--[if IE 9]>&lt;/video&gt;&lt;![endif]--&gt;\n&lt;img\n\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\tdata-src=\"1024.jpg\"\n\t\tclass=\"lazyload\"\n\t\talt=\"image with artdirection\" /&gt;\n&lt;/picture&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\" id=\"autosizes-example\">\n\t\t\t<div class=\"alert alert-info\">\n\t\t\t\t<p><strong>automatic sizes feature</strong>: In case of lazy loading images the <code>sizes</code> attribute of the <code>img</code>/<code>source</code> elements can be calculated with JS.</p>\n\t\t\t\t<p>This automatic sizes feature is directly included in <strong>lazySizes</strong>. Simply use the keyword <code>auto</code> inside of the <code>data-sizes</code> attributes (<code>data-sizes=\"auto\"</code>).</p>\n\t\t\t\t<p><strong>Important: How <code>sizes</code> is calculated</strong>: The automatic sizes calculation takes the width of the image if it is over <code>40</code> (see also <code>minSize</code> option). In case it's below the <code>minSize</code> threshold, it traverses up the DOM tree until it finds a parent which is over <code>40</code> and uses this number. Often the following general CSS rule might help: <code>img[data-sizes=\"auto\"] { display: block; }</code>.</p>\n\t\t\t</div>\n\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\talt=\"house by the lake\"\n\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\tsrc=\"https://images.unsplash.com/photo-1470770841072-f978cf4d019e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&ar=1:1&w=1024\"\n\t\t\t\t\t\t\t\tdata-src=\"https://images.unsplash.com/photo-1470770841072-f978cf4d019e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&ar=1:1&w=100\"\n\t\t\t\t\t\t\t\tdata-srcset=\"https://images.unsplash.com/photo-1470770841072-f978cf4d019e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&ar=1:1&w=240 240w,\nhttps://images.unsplash.com/photo-1470770841072-f978cf4d019e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&ar=1.5:1&w=320 320w,\nhttps://images.unsplash.com/photo-1470770841072-f978cf4d019e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&ar=1.5:1&w=500 500w,\nhttps://images.unsplash.com/photo-1470770841072-f978cf4d019e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&ar=1.5:1&w=800 800w,\nhttps://images.unsplash.com/photo-1470770841072-f978cf4d019e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&ar=1.5:1&w=1024 1024w\"\n\t\t\t\t\t\t\t\tclass=\"lazyload\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>responsive image with srcset and <strong>automatic sizes</strong> attribute</h3>\n\t\t\t\t\t\t<p>The <strong>autosizes feature</strong> makes using responsive images with the right <code>sizes</code> value easy as hell.</p>\n\n<pre>&lt;img\n\talt=\"house by the lake\"\n\tdata-sizes=\"auto\"\n\tdata-srcset=\"small.jpg 500w,\n\t\tmedium.jpg 640w,\n\t\tbig.jpg 1024w\"\n\tdata-src=\"medium\"\n\tclass=\"lazyload\" /&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"alert alert-danger\">\n\t\t\t\t<p>For responsive images support you must use either use a full polyfill like <a href=\"https://github.com/scottjehl/picturefill\" target=\"_blank\">picturefill</a> or use the <a href=\"https://github.com/aFarkas/lazysizes/blob/gh-pages/plugins/respimg\">extreme lightweight partial respimg polyfill plugin</a> or use the <a href=\"https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins/rias\">Responsive Images as a Service extension</a>.</p>\n\t\t\t</div>\n\t\t</div>\n\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic intrinsic-2\">\n\t\t\t\t\t\t<iframe data-src=\"//www.youtube.com/embed/ZfV-aYdU4uE\" frameborder=\"0\" allowfullscreen=\"\" class=\"lazyload\">\n\t\t\t\t\t\t</iframe>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>iframe</h3>\n\t\t\t\t\t\t<p>Iframes can be loaded too:</p>\n<pre>&lt;iframe data-src=\"//www.youtube.com/embed/ZfV-aYdU4uE\" class=\"lazyload\" frameborder=\"0\" allowfullscreen&gt;&lt;/iframe&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row lazyload\" data-expand=\"-110\">\n\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic intrinsic-3\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\tdata-src=\"https://farm1.staticflickr.com/192/504251019_ffc94c77b5_b.jpg\"\n\t\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/192/504251019_ffc94c77b5_n.jpg 240w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5.jpg 375w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5_z.jpg 480w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5_b.jpg 768w\"\n\t\t\t\t\t\t\t\talt=\"Windows on Istanbul\" />\n\t\t\t\t\t</div>\n\n\t\t\t</div>\n\n\t\t\t\t</div>\n\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t<h3><code>[data-expand]</code>: More than lazyloading</h3>\n\t\t\t\t\t<p>LazySizes normally loads in view elements as fast as possible and near the view elements are lazily pre-loaded. This can be modified in general using the <code>expand</code> option. With the <code>data-expand</code> attribute this can be changed element specific to expand or shrink the viewport.</p>\n\n\t\t\t\t\t<p>This can be used to create unveiling effects for elements with or even without loading anything.</p>\n<pre>\n&lt;style&gt;\n.teaser.lazyload {\n\topacity: 0;\n\ttransform: scale(0.8);\n}\n\n.teaser.lazyloaded {\n\topacity: 1;\n\ttransform: scale(1);\n\ttransition: all 700ms;\n}\n&lt;/style&gt;\n\n&lt;script&gt;\n\nwindow.lazySizesConfig = {\n\taddClasses: true\n};\n&lt;/script&gt;\n\n&lt;div class=\"teaser lazyload\" data-expand=\"-110\"&gt;\n\t&lt;img data-src=\"image.jpg\" class=\"lazyload\" /&gt;\n\t&lt;h1&gt;Teaser Title&lt;/h1&gt;\n\t&lt;p&gt;...&lt;/p&gt;\n&lt;/div&gt;\n</pre>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<script src=\"//code.jquery.com/jquery-2.1.1.min.js\"></script>\n\t\t\t\t\t<div data-ride=\"carousel\" data-script=\"assets/js/bootstrap.min.js\" data-link=\"assets/css/carousel.css\" class=\"carousel lazyload lazypreload slide no-src\" data-interval=\"false\" id=\"carousel-example-captions\">\n\t\t\t\t\t\t<ol class=\"carousel-indicators\">\n\t\t\t\t\t\t\t<li data-slide-to=\"0\" data-target=\"#carousel-example-captions\"></li>\n\t\t\t\t\t\t\t<li data-slide-to=\"1\" data-target=\"#carousel-example-captions\"></li>\n\t\t\t\t\t\t</ol>\n\t\t\t\t\t\t<div class=\"carousel-inner\">\n\n\t\t\t\t\t\t\t<div class=\"item\">\n\t\t\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t\t\t<img alt=\"100%x200\" src=\"https://i.picsum.photos/id/1031/300/225.jpg\"\n\t\t\t\t\t\t\t\t\t\t data-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\t\t data-srcset=\"https://i.picsum.photos/id/1031/300/225.jpg 300w,\n\t\t\t\t\t\t\t\t\t\t https://i.picsum.photos/id/1031/600/450.jpg 600w,\nhttps://i.picsum.photos/id/1031/1024/768.jpg 1024w,\nhttps://i.picsum.photos/id/1031/1440/1080.jpg 1440w\"\n\t\t\t\t\t\t\t\t\t\t class=\"lazyload\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"carousel-caption\">\n\t\t\t\t\t\t\t\t\t<h3>First slide label</h3>\n\t\t\t\t\t\t\t\t\t<p>Nulla vitae elit libero, a pharetra augue mollis interdum.</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div class=\"item active\">\n\t\t\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t\t\t<img alt=\"100%x200\"\n\t\t\t\t\t\t\t\t\t\t src=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34_m.jpg\"\n\t\t\t\t\t\t\t\t\t\t data-srcset=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34_m.jpg 240w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_n.jpg 320w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34.jpg 500w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_z.jpg 640w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_b.jpg 1024w\"\n\t\t\t\t\t\t\t\t\t\t data-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\t\t class=\"lazyload\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"carousel-caption\">\n\t\t\t\t\t\t\t\t\t<h3>Third slide label</h3>\n\t\t\t\t\t\t\t\t\t<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<a data-slide=\"prev\" role=\"button\" href=\"#carousel-example-captions\" class=\"left carousel-control\">\n\t\t\t\t\t\t\t<span class=\"glyphicon glyphicon-chevron-left\"></span>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<a data-slide=\"next\" role=\"button\" href=\"#carousel-example-captions\" class=\"right carousel-control\">\n\t\t\t\t\t\t\t<span class=\"glyphicon glyphicon-chevron-right\"></span>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>Widgets/Javascript/Script</h3>\n\t\t\t\t\t\t<p>LazySizes can be extended to load nearly everything lazily. The <a href=\"https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins\">ls.unveilhooks.js</a> plugin can be used to lazy load scripts, background images, and videos. Simply add a <code>data-script</code> to your widget and you are done:</p>\n<pre>&lt;div data-ride=\"carousel\" data-script=\"assets/js/bootstrap.min.js\" class=\"carousel lazyload\"&gt;\n\t&lt;!-- widget content --&gt;\n&lt;div&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<div class=\"scroll-view\">\n\t\t\t\t<div class=\"scroll-doc\">\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://images.unsplash.com/photo-1470116073782-48ae2ccd8ffd?ixlib=rb-1.2.1&auto=format&fit=crop&w=1024\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://images.unsplash.com/photo-1470116073782-48ae2ccd8ffd?ixlib=rb-1.2.1&auto=format&fit=crop&w=240 240w,\nhttps://images.unsplash.com/photo-1470116073782-48ae2ccd8ffd?ixlib=rb-1.2.1&auto=format&fit=crop&w=320 320w,\nhttps://images.unsplash.com/photo-1470116073782-48ae2ccd8ffd?ixlib=rb-1.2.1&auto=format&fit=crop&w=500 500w,\nhttps://images.unsplash.com/photo-1470116073782-48ae2ccd8ffd?ixlib=rb-1.2.1&auto=format&fit=crop&w=640 640w,\nhttps://images.unsplash.com/photo-1470116073782-48ae2ccd8ffd?ixlib=rb-1.2.1&auto=format&fit=crop&w=800 800w,\nhttps://images.unsplash.com/photo-1470116073782-48ae2ccd8ffd?ixlib=rb-1.2.1&auto=format&fit=crop&w=1024 1024w\"\n\t\t\t\t\t\t\t\t\talt=\"Bird\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://images.unsplash.com/photo-1544198365-f5d60b6d8190?ixlib=rb-1.2.1&auto=format&fit=crop&w=640&q=80\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://images.unsplash.com/photo-1544198365-f5d60b6d8190?ixlib=rb-1.2.1&auto=format&fit=crop&w=240&q=80 240w,\nhttps://images.unsplash.com/photo-1544198365-f5d60b6d8190?ixlib=rb-1.2.1&auto=format&fit=crop&w=320&q=80 320w,\nhttps://images.unsplash.com/photo-1544198365-f5d60b6d8190?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=80 500w,\nhttps://images.unsplash.com/photo-1544198365-f5d60b6d8190?ixlib=rb-1.2.1&auto=format&fit=crop&w=640&q=80 640w\"\n\t\t\t\t\t\t\t\t\talt=\"Mountains\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://images.unsplash.com/photo-1523264629844-40dd6bf17c2b?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://images.unsplash.com/photo-1523264629844-40dd6bf17c2b?ixlib=rb-1.2.1&auto=format&fit=crop&w=240&q=60 240w,\nhttps://images.unsplash.com/photo-1523264629844-40dd6bf17c2b?ixlib=rb-1.2.1&auto=format&fit=crop&w=320&q=60 320w,\nhttps://images.unsplash.com/photo-1523264629844-40dd6bf17c2b?ixlib=rb-1.2.1&auto=format&fit=crop&w=500&q=60 500w\"\n\t\t\t\t\t\t\t\t\talt=\"Jellyfish\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://images.unsplash.com/photo-1606041008023-472dfb5e530f?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=80&ar=1.5:1\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://images.unsplash.com/photo-1606041008023-472dfb5e530f?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=240&q=80&ar=1.5:1 240w,\nhttps://images.unsplash.com/photo-1606041008023-472dfb5e530f?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=80&ar=1.5:1 500w\"\n\t\t\t\t\t\t\t\t\talt=\"Flower\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm3.staticflickr.com/2401/2171553538_37d0a133da_m.jpg\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm3.staticflickr.com/2401/2171553538_37d0a133da_m.jpg 240w,\nhttps://farm3.staticflickr.com/2401/2171553538_37d0a133da.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"Borobudur\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm1.staticflickr.com/17/92230866_713ae1eeef_n.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/17/92230866_713ae1eeef_n.jpg 240w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef.jpg 375w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef_z.jpg 480w\"\n\t\t\t\t\t\t\t\t\talt=\"A tree in the blue\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm1.staticflickr.com/192/504251019_ffc94c77b5_n.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/192/504251019_ffc94c77b5_n.jpg 240w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5.jpg 375w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5_z.jpg 480w\"\n\t\t\t\t\t\t\t\t\talt=\"Windows on Istanbul\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm6.staticflickr.com/5139/5546134597_0b19627066_m.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5139/5546134597_0b19627066_m.jpg 240w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066_n.jpg 320w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"Goldie Dawn\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm3.staticflickr.com/2727/4393975099_c212622aa0_m.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm3.staticflickr.com/2727/4393975099_c212622aa0_m.jpg 240w,\nhttps://farm3.staticflickr.com/2727/4393975099_c212622aa0_n.jpg 320w\"\n\t\t\t\t\t\t\t\t\talt=\"Avebury Stone Circle\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34_m.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34_m.jpg 240w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_n.jpg 320w\"\n\t\t\t\t\t\t\t\t\talt=\"el castil de tierra\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm8.staticflickr.com/7356/11122919374_55294abec3_m.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm8.staticflickr.com/7356/11122919374_55294abec3_m.jpg 240w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3_n.jpg 320w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"sunset\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_m.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_m.jpg 240w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_n.jpg 320w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"Sky and earth\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_n.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_n.jpg 240w,\nhttps://farm4.staticflickr.com/3023/2994603808_a3036a3cdf.jpg 375w,\nhttps://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_z.jpg 480w\"\n\t\t\t\t\t\t\t\t\talt=\"Missing Ulsoor lake (Explore)\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tsrc=\"https://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_n.jpg\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_n.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_n.jpg 227w,\nhttps://farm7.staticflickr.com/6211/6254520191_c7868f3a5d.jpg 354w,\nhttps://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_z.jpg 453w\"\n\t\t\t\t\t\t\t\t\talt=\"Oxford Path 2\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"alert alert-info\">\n\t\t\t\t<p>While other lazy loaders or responsive images solution need to be called, if new elements are added to the DOM or do become visible through a special user interaction or a JavaScript behavior.</p>\n\t\t\t\t<p>LazySizes does automatically detect any changes to the DOM and the visibility of <code>.lazyload</code> elements.</p>\n\t\t\t\t<button type=\"button\" class=\"add-new btn btn-primary\">click to add new elements</button>\n\t\t\t</div>\n\n\t\t\t<script type=\"text/html\" class=\"template\">\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/1031/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/1059/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/1062/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"row effect-row\">\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload lightSpeedIn\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/1065/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload lightSpeedIn\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/1069/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload lightSpeedIn\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/1072/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"row effect-row-middle\">\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/1074/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/110/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/111/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"row effect-row-reverse\">\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload flipInX\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/116/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload flipInX\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/122/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload flipInX\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/1031/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\n\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/134/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/133/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://i.picsum.photos/id/137/460/345.jpg\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</script>\n\t\t\t<script>\n\t\t\t\t$('.add-new').on('click', function(){\n\t\t\t\t\tvar $template = $('.template');\n\t\t\t\t\t$template.after($template.html());\n\t\t\t\t});\n\t\t\t</script>\n\t\t\t<br />\n\t\t\t<br />\n\t\t\t<br />\n\t\t\t<br />\n\t\t\t<br />\n\t\t\t<br />\n\n\t\t</div>\n\n\n\t</div>\n\n\n\n\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "lazysizes-umd.js",
    "content": "(function(window, factory) {\n\tvar lazySizes = factory(window, window.document, Date);\n\tif(typeof module == 'object' && module.exports){\n\t\tmodule.exports = lazySizes;\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(lazySizes);\n\t} else {\n\t\twindow.lazySizes = lazySizes;\n\t}\n}(window, \n/**\n * @typedef { import(\"./types/global\").LazySizesConfigPartial } LazySizesConfigPartial\n */\nfunction l(window, document, Date) { // Pass in the window Date function also for SSR because the Date class can be lost\n\t'use strict';\n\t/*jshint eqnull:true */\n\n\tvar lazysizes,\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tlazySizesCfg;\n\n\t(function(){\n\t\tvar prop;\n\n\t\tvar lazySizesDefaults = {\n\t\t\tlazyClass: 'lazyload',\n\t\t\tloadedClass: 'lazyloaded',\n\t\t\tloadingClass: 'lazyloading',\n\t\t\tpreloadClass: 'lazypreload',\n\t\t\terrorClass: 'lazyerror',\n\t\t\t//strictClass: 'lazystrict',\n\t\t\tautosizesClass: 'lazyautosizes',\n\t\t\tfastLoadedClass: 'ls-is-cached',\n\t\t\tiframeLoadMode: 0,\n\t\t\tsrcAttr: 'data-src',\n\t\t\tsrcsetAttr: 'data-srcset',\n\t\t\tsizesAttr: 'data-sizes',\n\t\t\t//preloadAfterLoad: false,\n\t\t\tminSize: 40,\n\t\t\tcustomMedia: {},\n\t\t\tinit: true,\n\t\t\texpFactor: 1.5,\n\t\t\thFac: 0.8,\n\t\t\tloadMode: 2,\n\t\t\tloadHidden: true,\n\t\t\tricTimeout: 0,\n\t\t\tthrottleDelay: 125,\n\t\t};\n\n\t\tlazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {};\n\n\t\tfor(prop in lazySizesDefaults){\n\t\t\tif(!(prop in lazySizesCfg)){\n\t\t\t\tlazySizesCfg[prop] = lazySizesDefaults[prop];\n\t\t\t}\n\t\t}\n\t})();\n\n\tif (!document || !document.getElementsByClassName) {\n\t\treturn {\n\t\t\tinit: function () {},\n\t\t\t/**\n\t\t\t * @type { LazySizesConfigPartial }\n\t\t\t */\n\t\t\tcfg: lazySizesCfg,\n\t\t\t/**\n\t\t\t * @type { true }\n\t\t\t */\n\t\t\tnoSupport: true,\n\t\t};\n\t}\n\n\tvar docElem = document.documentElement;\n\n\tvar supportPicture = window.HTMLPictureElement;\n\n\tvar _addEventListener = 'addEventListener';\n\n\tvar _getAttribute = 'getAttribute';\n\n\t/**\n\t * Update to bind to window because 'this' becomes null during SSR\n\t * builds.\n\t */\n\tvar addEventListener = window[_addEventListener].bind(window);\n\n\tvar setTimeout = window.setTimeout;\n\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n\n\tvar requestIdleCallback = window.requestIdleCallback;\n\n\tvar regPicture = /^picture$/i;\n\n\tvar loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];\n\n\tvar regClassCache = {};\n\n\tvar forEach = Array.prototype.forEach;\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar hasClass = function(ele, cls) {\n\t\tif(!regClassCache[cls]){\n\t\t\tregClassCache[cls] = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n\t\t}\n\t\treturn regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar addClass = function(ele, cls) {\n\t\tif (!hasClass(ele, cls)){\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);\n\t\t}\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar removeClass = function(ele, cls) {\n\t\tvar reg;\n\t\tif ((reg = hasClass(ele,cls))) {\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));\n\t\t}\n\t};\n\n\tvar addRemoveLoadEvents = function(dom, fn, add){\n\t\tvar action = add ? _addEventListener : 'removeEventListener';\n\t\tif(add){\n\t\t\taddRemoveLoadEvents(dom, fn);\n\t\t}\n\t\tloadEvents.forEach(function(evt){\n\t\t\tdom[action](evt, fn);\n\t\t});\n\t};\n\n\t/**\n\t * @param elem { Element }\n\t * @param name { string }\n\t * @param detail { any }\n\t * @param noBubbles { boolean }\n\t * @param noCancelable { boolean }\n\t * @returns { CustomEvent }\n\t */\n\tvar triggerEvent = function(elem, name, detail, noBubbles, noCancelable){\n\t\tvar event = document.createEvent('Event');\n\n\t\tif(!detail){\n\t\t\tdetail = {};\n\t\t}\n\n\t\tdetail.instance = lazysizes;\n\n\t\tevent.initEvent(name, !noBubbles, !noCancelable);\n\n\t\tevent.detail = detail;\n\n\t\telem.dispatchEvent(event);\n\t\treturn event;\n\t};\n\n\tvar updatePolyfill = function (el, full){\n\t\tvar polyfill;\n\t\tif( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){\n\t\t\tif(full && full.src && !el[_getAttribute]('srcset')){\n\t\t\t\tel.setAttribute('srcset', full.src);\n\t\t\t}\n\t\t\tpolyfill({reevaluate: true, elements: [el]});\n\t\t} else if(full && full.src){\n\t\t\tel.src = full.src;\n\t\t}\n\t};\n\n\tvar getCSS = function (elem, style){\n\t\treturn (getComputedStyle(elem, null) || {})[style];\n\t};\n\n\t/**\n\t *\n\t * @param elem { Element }\n\t * @param parent { Element }\n\t * @param [width] {number}\n\t * @returns {number}\n\t */\n\tvar getWidth = function(elem, parent, width){\n\t\twidth = width || elem.offsetWidth;\n\n\t\twhile(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){\n\t\t\twidth =  parent.offsetWidth;\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\treturn width;\n\t};\n\n\tvar rAF = (function(){\n\t\tvar running, waiting;\n\t\tvar firstFns = [];\n\t\tvar secondFns = [];\n\t\tvar fns = firstFns;\n\n\t\tvar run = function(){\n\t\t\tvar runFns = fns;\n\n\t\t\tfns = firstFns.length ? secondFns : firstFns;\n\n\t\t\trunning = true;\n\t\t\twaiting = false;\n\n\t\t\twhile(runFns.length){\n\t\t\t\trunFns.shift()();\n\t\t\t}\n\n\t\t\trunning = false;\n\t\t};\n\n\t\tvar rafBatch = function(fn, queue){\n\t\t\tif(running && !queue){\n\t\t\t\tfn.apply(this, arguments);\n\t\t\t} else {\n\t\t\t\tfns.push(fn);\n\n\t\t\t\tif(!waiting){\n\t\t\t\t\twaiting = true;\n\t\t\t\t\t(document.hidden ? setTimeout : requestAnimationFrame)(run);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\trafBatch._lsFlush = run;\n\n\t\treturn rafBatch;\n\t})();\n\n\tvar rAFIt = function(fn, simple){\n\t\treturn simple ?\n\t\t\tfunction() {\n\t\t\t\trAF(fn);\n\t\t\t} :\n\t\t\tfunction(){\n\t\t\t\tvar that = this;\n\t\t\t\tvar args = arguments;\n\t\t\t\trAF(function(){\n\t\t\t\t\tfn.apply(that, args);\n\t\t\t\t});\n\t\t\t}\n\t\t;\n\t};\n\n\tvar throttle = function(fn){\n\t\tvar running;\n\t\tvar lastTime = 0;\n\t\tvar gDelay = lazySizesCfg.throttleDelay;\n\t\tvar rICTimeout = lazySizesCfg.ricTimeout;\n\t\tvar run = function(){\n\t\t\trunning = false;\n\t\t\tlastTime = Date.now();\n\t\t\tfn();\n\t\t};\n\t\tvar idleCallback = requestIdleCallback && rICTimeout > 49 ?\n\t\t\tfunction(){\n\t\t\t\trequestIdleCallback(run, {timeout: rICTimeout});\n\n\t\t\t\tif(rICTimeout !== lazySizesCfg.ricTimeout){\n\t\t\t\t\trICTimeout = lazySizesCfg.ricTimeout;\n\t\t\t\t}\n\t\t\t} :\n\t\t\trAFIt(function(){\n\t\t\t\tsetTimeout(run);\n\t\t\t}, true)\n\t\t;\n\n\t\treturn function(isPriority){\n\t\t\tvar delay;\n\n\t\t\tif((isPriority = isPriority === true)){\n\t\t\t\trICTimeout = 33;\n\t\t\t}\n\n\t\t\tif(running){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trunning =  true;\n\n\t\t\tdelay = gDelay - (Date.now() - lastTime);\n\n\t\t\tif(delay < 0){\n\t\t\t\tdelay = 0;\n\t\t\t}\n\n\t\t\tif(isPriority || delay < 9){\n\t\t\t\tidleCallback();\n\t\t\t} else {\n\t\t\t\tsetTimeout(idleCallback, delay);\n\t\t\t}\n\t\t};\n\t};\n\n\t//based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html\n\tvar debounce = function(func) {\n\t\tvar timeout, timestamp;\n\t\tvar wait = 99;\n\t\tvar run = function(){\n\t\t\ttimeout = null;\n\t\t\tfunc();\n\t\t};\n\t\tvar later = function() {\n\t\t\tvar last = Date.now() - timestamp;\n\n\t\t\tif (last < wait) {\n\t\t\t\tsetTimeout(later, wait - last);\n\t\t\t} else {\n\t\t\t\t(requestIdleCallback || run)(run);\n\t\t\t}\n\t\t};\n\n\t\treturn function() {\n\t\t\ttimestamp = Date.now();\n\n\t\t\tif (!timeout) {\n\t\t\t\ttimeout = setTimeout(later, wait);\n\t\t\t}\n\t\t};\n\t};\n\n\tvar loader = (function(){\n\t\tvar preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;\n\n\t\tvar eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;\n\n\t\tvar regImg = /^img$/i;\n\t\tvar regIframe = /^iframe$/i;\n\n\t\tvar supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent));\n\n\t\tvar shrinkExpand = 0;\n\t\tvar currentExpand = 0;\n\n\t\tvar isLoading = 0;\n\t\tvar lowRuns = -1;\n\n\t\tvar resetPreloading = function(e){\n\t\t\tisLoading--;\n\t\t\tif(!e || isLoading < 0 || !e.target){\n\t\t\t\tisLoading = 0;\n\t\t\t}\n\t\t};\n\n\t\tvar isVisible = function (elem) {\n\t\t\tif (isBodyHidden == null) {\n\t\t\t\tisBodyHidden = getCSS(document.body, 'visibility') == 'hidden';\n\t\t\t}\n\n\t\t\treturn isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden');\n\t\t};\n\n\t\tvar isNestedVisible = function(elem, elemExpand){\n\t\t\tvar outerRect;\n\t\t\tvar parent = elem;\n\t\t\tvar visible = isVisible(elem);\n\n\t\t\teLtop -= elemExpand;\n\t\t\teLbottom += elemExpand;\n\t\t\teLleft -= elemExpand;\n\t\t\teLright += elemExpand;\n\n\t\t\twhile(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){\n\t\t\t\tvisible = ((getCSS(parent, 'opacity') || 1) > 0);\n\n\t\t\t\tif(visible && getCSS(parent, 'overflow') != 'visible'){\n\t\t\t\t\touterRect = parent.getBoundingClientRect();\n\t\t\t\t\tvisible = eLright > outerRect.left &&\n\t\t\t\t\t\teLleft < outerRect.right &&\n\t\t\t\t\t\teLbottom > outerRect.top - 1 &&\n\t\t\t\t\t\teLtop < outerRect.bottom + 1\n\t\t\t\t\t;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn visible;\n\t\t};\n\n\t\tvar checkElements = function() {\n\t\t\tvar eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal,\n\t\t\t\tbeforeExpandVal, defaultExpand, preloadExpand, hFac;\n\t\t\tvar lazyloadElems = lazysizes.elements;\n\n\t\t\tif((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){\n\n\t\t\t\ti = 0;\n\n\t\t\t\tlowRuns++;\n\n\t\t\t\tfor(; i < eLlen; i++){\n\n\t\t\t\t\tif(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}\n\n\t\t\t\t\tif(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;}\n\n\t\t\t\t\tif(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){\n\t\t\t\t\t\telemExpand = currentExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!defaultExpand) {\n\t\t\t\t\t\tdefaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ?\n\t\t\t\t\t\t\tdocElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 :\n\t\t\t\t\t\t\tlazySizesCfg.expand;\n\n\t\t\t\t\t\tlazysizes._defEx = defaultExpand;\n\n\t\t\t\t\t\tpreloadExpand = defaultExpand * lazySizesCfg.expFactor;\n\t\t\t\t\t\thFac = lazySizesCfg.hFac;\n\t\t\t\t\t\tisBodyHidden = null;\n\n\t\t\t\t\t\tif(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){\n\t\t\t\t\t\t\tcurrentExpand = preloadExpand;\n\t\t\t\t\t\t\tlowRuns = 0;\n\t\t\t\t\t\t} else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){\n\t\t\t\t\t\t\tcurrentExpand = defaultExpand;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentExpand = shrinkExpand;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(beforeExpandVal !== elemExpand){\n\t\t\t\t\t\teLvW = innerWidth + (elemExpand * hFac);\n\t\t\t\t\t\telvH = innerHeight + elemExpand;\n\t\t\t\t\t\telemNegativeExpand = elemExpand * -1;\n\t\t\t\t\t\tbeforeExpandVal = elemExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\trect = lazyloadElems[i].getBoundingClientRect();\n\n\t\t\t\t\tif ((eLbottom = rect.bottom) >= elemNegativeExpand &&\n\t\t\t\t\t\t(eLtop = rect.top) <= elvH &&\n\t\t\t\t\t\t(eLright = rect.right) >= elemNegativeExpand * hFac &&\n\t\t\t\t\t\t(eLleft = rect.left) <= eLvW &&\n\t\t\t\t\t\t(eLbottom || eLright || eLleft || eLtop) &&\n\t\t\t\t\t\t(lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) &&\n\t\t\t\t\t\t((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){\n\t\t\t\t\t\tunveilElement(lazyloadElems[i]);\n\t\t\t\t\t\tloadedSomething = true;\n\t\t\t\t\t\tif(isLoading > 9){break;}\n\t\t\t\t\t} else if(!loadedSomething && isCompleted && !autoLoadElem &&\n\t\t\t\t\t\tisLoading < 4 && lowRuns < 4 && loadMode > 2 &&\n\t\t\t\t\t\t(preloadElems[0] || lazySizesCfg.preloadAfterLoad) &&\n\t\t\t\t\t\t(preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){\n\t\t\t\t\t\tautoLoadElem = preloadElems[0] || lazyloadElems[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(autoLoadElem && !loadedSomething){\n\t\t\t\t\tunveilElement(autoLoadElem);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar throttledCheckElements = throttle(checkElements);\n\n\t\tvar switchLoadingClass = function(e){\n\t\t\tvar elem = e.target;\n\n\t\t\tif (elem._lazyCache) {\n\t\t\t\tdelete elem._lazyCache;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresetPreloading(e);\n\t\t\taddClass(elem, lazySizesCfg.loadedClass);\n\t\t\tremoveClass(elem, lazySizesCfg.loadingClass);\n\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass);\n\t\t\ttriggerEvent(elem, 'lazyloaded');\n\t\t};\n\t\tvar rafedSwitchLoadingClass = rAFIt(switchLoadingClass);\n\t\tvar rafSwitchLoadingClass = function(e){\n\t\t\trafedSwitchLoadingClass({target: e.target});\n\t\t};\n\n\t\tvar changeIframeSrc = function(elem, src){\n\t\t\tvar loadMode = elem.getAttribute('data-load-mode') || lazySizesCfg.iframeLoadMode;\n\n\t\t\t// loadMode can be also a string!\n\t\t\tif (loadMode == 0) {\n\t\t\t\telem.contentWindow.location.replace(src);\n\t\t\t} else if (loadMode == 1) {\n\t\t\t\telem.src = src;\n\t\t\t}\n\t\t};\n\n\t\tvar handleSources = function(source){\n\t\t\tvar customMedia;\n\n\t\t\tvar sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);\n\n\t\t\tif( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){\n\t\t\t\tsource.setAttribute('media', customMedia);\n\t\t\t}\n\n\t\t\tif(sourceSrcset){\n\t\t\t\tsource.setAttribute('srcset', sourceSrcset);\n\t\t\t}\n\t\t};\n\n\t\tvar lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){\n\t\t\tvar src, srcset, parent, isPicture, event, firesLoad;\n\n\t\t\tif(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){\n\n\t\t\t\tif(sizes){\n\t\t\t\t\tif(isAuto){\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.autosizesClass);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.setAttribute('sizes', sizes);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsrcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);\n\t\t\t\tsrc = elem[_getAttribute](lazySizesCfg.srcAttr);\n\n\t\t\t\tif(isImg) {\n\t\t\t\t\tparent = elem.parentNode;\n\t\t\t\t\tisPicture = parent && regPicture.test(parent.nodeName || '');\n\t\t\t\t}\n\n\t\t\t\tfiresLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));\n\n\t\t\t\tevent = {target: elem};\n\n\t\t\t\taddClass(elem, lazySizesCfg.loadingClass);\n\n\t\t\t\tif(firesLoad){\n\t\t\t\t\tclearTimeout(resetPreloadingTimer);\n\t\t\t\t\tresetPreloadingTimer = setTimeout(resetPreloading, 2500);\n\t\t\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass, true);\n\t\t\t\t}\n\n\t\t\t\tif(isPicture){\n\t\t\t\t\tforEach.call(parent.getElementsByTagName('source'), handleSources);\n\t\t\t\t}\n\n\t\t\t\tif(srcset){\n\t\t\t\t\telem.setAttribute('srcset', srcset);\n\t\t\t\t} else if(src && !isPicture){\n\t\t\t\t\tif(regIframe.test(elem.nodeName)){\n\t\t\t\t\t\tchangeIframeSrc(elem, src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.src = src;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(isImg && (srcset || isPicture)){\n\t\t\t\t\tupdatePolyfill(elem, {src: src});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(elem._lazyRace){\n\t\t\t\tdelete elem._lazyRace;\n\t\t\t}\n\t\t\tremoveClass(elem, lazySizesCfg.lazyClass);\n\n\t\t\trAF(function(){\n\t\t\t\t// Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015)\n\t\t\t\tvar isLoaded = elem.complete && elem.naturalWidth > 1;\n\n\t\t\t\tif( !firesLoad || isLoaded){\n\t\t\t\t\tif (isLoaded) {\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.fastLoadedClass);\n\t\t\t\t\t}\n\t\t\t\t\tswitchLoadingClass(event);\n\t\t\t\t\telem._lazyCache = true;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tif ('_lazyCache' in elem) {\n\t\t\t\t\t\t\tdelete elem._lazyCache;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 9);\n\t\t\t\t}\n\t\t\t\tif (elem.loading == 'lazy') {\n\t\t\t\t\tisLoading--;\n\t\t\t\t}\n\t\t\t}, true);\n\t\t});\n\n\t\t/**\n\t\t *\n\t\t * @param elem { Element }\n\t\t */\n\t\tvar unveilElement = function (elem){\n\t\t\tif (elem._lazyRace) {return;}\n\t\t\tvar detail;\n\n\t\t\tvar isImg = regImg.test(elem.nodeName);\n\n\t\t\t//allow using sizes=\"auto\", but don't use. it's invalid. Use data-sizes=\"auto\" or a valid value for sizes instead (i.e.: sizes=\"80vw\")\n\t\t\tvar sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes'));\n\t\t\tvar isAuto = sizes == 'auto';\n\n\t\t\tif( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;}\n\n\t\t\tdetail = triggerEvent(elem, 'lazyunveilread').detail;\n\n\t\t\tif(isAuto){\n\t\t\t\t autoSizer.updateElem(elem, true, elem.offsetWidth);\n\t\t\t}\n\n\t\t\telem._lazyRace = true;\n\t\t\tisLoading++;\n\n\t\t\tlazyUnveil(elem, detail, isAuto, sizes, isImg);\n\t\t};\n\n\t\tvar afterScroll = debounce(function(){\n\t\t\tlazySizesCfg.loadMode = 3;\n\t\t\tthrottledCheckElements();\n\t\t});\n\n\t\tvar altLoadmodeScrollListner = function(){\n\t\t\tif(lazySizesCfg.loadMode == 3){\n\t\t\t\tlazySizesCfg.loadMode = 2;\n\t\t\t}\n\t\t\tafterScroll();\n\t\t};\n\n\t\tvar onload = function(){\n\t\t\tif(isCompleted){return;}\n\t\t\tif(Date.now() - started < 999){\n\t\t\t\tsetTimeout(onload, 999);\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\tisCompleted = true;\n\n\t\t\tlazySizesCfg.loadMode = 3;\n\n\t\t\tthrottledCheckElements();\n\n\t\t\taddEventListener('scroll', altLoadmodeScrollListner, true);\n\t\t};\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tstarted = Date.now();\n\n\t\t\t\tlazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass);\n\t\t\t\tpreloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass);\n\n\t\t\t\taddEventListener('scroll', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('resize', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('pageshow', function (e) {\n\t\t\t\t\tif (e.persisted) {\n\t\t\t\t\t\tvar loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass);\n\n\t\t\t\t\t\tif (loadingElements.length && loadingElements.forEach) {\n\t\t\t\t\t\t\trequestAnimationFrame(function () {\n\t\t\t\t\t\t\t\tloadingElements.forEach( function (img) {\n\t\t\t\t\t\t\t\t\tif (img.complete) {\n\t\t\t\t\t\t\t\t\t\tunveilElement(img);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif(window.MutationObserver){\n\t\t\t\t\tnew MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );\n\t\t\t\t} else {\n\t\t\t\t\tdocElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);\n\t\t\t\t\tdocElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);\n\t\t\t\t\tsetInterval(throttledCheckElements, 999);\n\t\t\t\t}\n\n\t\t\t\taddEventListener('hashchange', throttledCheckElements, true);\n\n\t\t\t\t//, 'fullscreenchange'\n\t\t\t\t['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){\n\t\t\t\t\tdocument[_addEventListener](name, throttledCheckElements, true);\n\t\t\t\t});\n\n\t\t\t\tif((/d$|^c/.test(document.readyState))){\n\t\t\t\t\tonload();\n\t\t\t\t} else {\n\t\t\t\t\taddEventListener('load', onload);\n\t\t\t\t\tdocument[_addEventListener]('DOMContentLoaded', throttledCheckElements);\n\t\t\t\t\tsetTimeout(onload, 20000);\n\t\t\t\t}\n\n\t\t\t\tif(lazysizes.elements.length){\n\t\t\t\t\tcheckElements();\n\t\t\t\t\trAF._lsFlush();\n\t\t\t\t} else {\n\t\t\t\t\tthrottledCheckElements();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcheckElems: throttledCheckElements,\n\t\t\tunveil: unveilElement,\n\t\t\t_aLSL: altLoadmodeScrollListner,\n\t\t};\n\t})();\n\n\n\tvar autoSizer = (function(){\n\t\tvar autosizesElems;\n\n\t\tvar sizeElement = rAFIt(function(elem, parent, event, width){\n\t\t\tvar sources, i, len;\n\t\t\telem._lazysizesWidth = width;\n\t\t\twidth += 'px';\n\n\t\t\telem.setAttribute('sizes', width);\n\n\t\t\tif(regPicture.test(parent.nodeName || '')){\n\t\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tsources[i].setAttribute('sizes', width);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!event.detail.dataAttr){\n\t\t\t\tupdatePolyfill(elem, event.detail);\n\t\t\t}\n\t\t});\n\t\t/**\n\t\t *\n\t\t * @param elem {Element}\n\t\t * @param dataAttr\n\t\t * @param [width] { number }\n\t\t */\n\t\tvar getSizeElement = function (elem, dataAttr, width){\n\t\t\tvar event;\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif(parent){\n\t\t\t\twidth = getWidth(elem, parent, width);\n\t\t\t\tevent = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});\n\n\t\t\t\tif(!event.defaultPrevented){\n\t\t\t\t\twidth = event.detail.width;\n\n\t\t\t\t\tif(width && width !== elem._lazysizesWidth){\n\t\t\t\t\t\tsizeElement(elem, parent, event, width);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar updateElementsSizes = function(){\n\t\t\tvar i;\n\t\t\tvar len = autosizesElems.length;\n\t\t\tif(len){\n\t\t\t\ti = 0;\n\n\t\t\t\tfor(; i < len; i++){\n\t\t\t\t\tgetSizeElement(autosizesElems[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar debouncedUpdateElementsSizes = debounce(updateElementsSizes);\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tautosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass);\n\t\t\t\taddEventListener('resize', debouncedUpdateElementsSizes);\n\t\t\t},\n\t\t\tcheckElems: debouncedUpdateElementsSizes,\n\t\t\tupdateElem: getSizeElement\n\t\t};\n\t})();\n\n\tvar init = function(){\n\t\tif(!init.i && document.getElementsByClassName){\n\t\t\tinit.i = true;\n\t\t\tautoSizer._();\n\t\t\tloader._();\n\t\t}\n\t};\n\n\tsetTimeout(function(){\n\t\tif(lazySizesCfg.init){\n\t\t\tinit();\n\t\t}\n\t});\n\n\tlazysizes = {\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tcfg: lazySizesCfg,\n\t\tautoSizer: autoSizer,\n\t\tloader: loader,\n\t\tinit: init,\n\t\tuP: updatePolyfill,\n\t\taC: addClass,\n\t\trC: removeClass,\n\t\thC: hasClass,\n\t\tfire: triggerEvent,\n\t\tgW: getWidth,\n\t\trAF: rAF,\n\t};\n\n\treturn lazysizes;\n}\n));\n"
  },
  {
    "path": "lazysizes.d.ts",
    "content": "import './types/global';\n\nexport = lazySizes;\ndeclare var lazySizes: {\n    init: () => void;\n    /**\n     * @type { LazySizesConfigPartial }\n     */\n    cfg: LazySizesConfigPartial;\n    /**\n     * @type { true }\n     */\n    noSupport: true;\n    autoSizer?: undefined;\n    loader?: undefined;\n    uP?: undefined;\n    aC?: undefined;\n    rC?: undefined;\n    hC?: undefined;\n    fire?: undefined;\n    gW?: undefined;\n    rAF?: undefined;\n} | {\n    /**\n     * @type { LazySizesConfigPartial }\n     */\n    cfg: LazySizesConfigPartial;\n    autoSizer: {\n        _: () => void;\n        checkElems: () => void;\n        updateElem: (elem: Element, dataAttr: any, width?: number) => void;\n    };\n    loader: {\n        _: () => void;\n        checkElems: (isPriority: any) => void;\n        unveil: (elem: Element) => void;\n        _aLSL: () => void;\n    };\n    init: () => void;\n    uP: (el: any, full: any) => void;\n    aC: (ele: Element, cls: string) => void;\n    rC: (ele: Element, cls: string) => void;\n    hC: (ele: Element, cls: string) => any;\n    fire: (elem: Element, name: string, detail: any, noBubbles: boolean, noCancelable: boolean) => CustomEvent;\n    gW: (elem: Element, parent: Element, width?: number) => number;\n    rAF: {\n        (fn: any, queue: any, ...args: any[]): void;\n        _lsFlush: () => void;\n    };\n    /**\n     * @type { true }\n     */\n    noSupport?: undefined;\n};\ndeclare namespace lazySizes {\n    export { LazySizesConfigPartial };\n}\ntype LazySizesConfigPartial = {\n    [x: string]: any;\n    lazyClass?: string;\n    loadedClass?: string;\n    loadingClass?: string;\n    preloadClass?: string;\n    errorClass?: string;\n    autosizesClass?: string;\n    fastLoadedClass?: string;\n    iframeLoadMode?: 0 | 1;\n    srcAttr?: string;\n    srcsetAttr?: string;\n    sizesAttr?: string;\n    preloadAfterLoad?: boolean;\n    minSize?: number;\n    customMedia?: Record<string, string>;\n    init?: boolean;\n    expFactor?: number;\n    hFac?: number;\n    loadMode?: 0 | 1 | 2 | 3;\n    loadHidden?: boolean;\n    ricTimeout?: number;\n    throttleDelay?: number;\n};\n"
  },
  {
    "path": "lazysizes.js",
    "content": "(function(window, factory) {\n\tvar lazySizes = factory(window, window.document, Date);\n\twindow.lazySizes = lazySizes;\n\tif(typeof module == 'object' && module.exports){\n\t\tmodule.exports = lazySizes;\n\t}\n}(typeof window != 'undefined' ?\n      window : {}, \n/**\n * @typedef { import(\"./types/global\").LazySizesConfigPartial } LazySizesConfigPartial\n */\nfunction l(window, document, Date) { // Pass in the window Date function also for SSR because the Date class can be lost\n\t'use strict';\n\t/*jshint eqnull:true */\n\n\tvar lazysizes,\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tlazySizesCfg;\n\n\t(function(){\n\t\tvar prop;\n\n\t\tvar lazySizesDefaults = {\n\t\t\tlazyClass: 'lazyload',\n\t\t\tloadedClass: 'lazyloaded',\n\t\t\tloadingClass: 'lazyloading',\n\t\t\tpreloadClass: 'lazypreload',\n\t\t\terrorClass: 'lazyerror',\n\t\t\t//strictClass: 'lazystrict',\n\t\t\tautosizesClass: 'lazyautosizes',\n\t\t\tfastLoadedClass: 'ls-is-cached',\n\t\t\tiframeLoadMode: 0,\n\t\t\tsrcAttr: 'data-src',\n\t\t\tsrcsetAttr: 'data-srcset',\n\t\t\tsizesAttr: 'data-sizes',\n\t\t\t//preloadAfterLoad: false,\n\t\t\tminSize: 40,\n\t\t\tcustomMedia: {},\n\t\t\tinit: true,\n\t\t\texpFactor: 1.5,\n\t\t\thFac: 0.8,\n\t\t\tloadMode: 2,\n\t\t\tloadHidden: true,\n\t\t\tricTimeout: 0,\n\t\t\tthrottleDelay: 125,\n\t\t};\n\n\t\tlazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {};\n\n\t\tfor(prop in lazySizesDefaults){\n\t\t\tif(!(prop in lazySizesCfg)){\n\t\t\t\tlazySizesCfg[prop] = lazySizesDefaults[prop];\n\t\t\t}\n\t\t}\n\t})();\n\n\tif (!document || !document.getElementsByClassName) {\n\t\treturn {\n\t\t\tinit: function () {},\n\t\t\t/**\n\t\t\t * @type { LazySizesConfigPartial }\n\t\t\t */\n\t\t\tcfg: lazySizesCfg,\n\t\t\t/**\n\t\t\t * @type { true }\n\t\t\t */\n\t\t\tnoSupport: true,\n\t\t};\n\t}\n\n\tvar docElem = document.documentElement;\n\n\tvar supportPicture = window.HTMLPictureElement;\n\n\tvar _addEventListener = 'addEventListener';\n\n\tvar _getAttribute = 'getAttribute';\n\n\t/**\n\t * Update to bind to window because 'this' becomes null during SSR\n\t * builds.\n\t */\n\tvar addEventListener = window[_addEventListener].bind(window);\n\n\tvar setTimeout = window.setTimeout;\n\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n\n\tvar requestIdleCallback = window.requestIdleCallback;\n\n\tvar regPicture = /^picture$/i;\n\n\tvar loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];\n\n\tvar regClassCache = {};\n\n\tvar forEach = Array.prototype.forEach;\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar hasClass = function(ele, cls) {\n\t\tif(!regClassCache[cls]){\n\t\t\tregClassCache[cls] = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n\t\t}\n\t\treturn regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar addClass = function(ele, cls) {\n\t\tif (!hasClass(ele, cls)){\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);\n\t\t}\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar removeClass = function(ele, cls) {\n\t\tvar reg;\n\t\tif ((reg = hasClass(ele,cls))) {\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));\n\t\t}\n\t};\n\n\tvar addRemoveLoadEvents = function(dom, fn, add){\n\t\tvar action = add ? _addEventListener : 'removeEventListener';\n\t\tif(add){\n\t\t\taddRemoveLoadEvents(dom, fn);\n\t\t}\n\t\tloadEvents.forEach(function(evt){\n\t\t\tdom[action](evt, fn);\n\t\t});\n\t};\n\n\t/**\n\t * @param elem { Element }\n\t * @param name { string }\n\t * @param detail { any }\n\t * @param noBubbles { boolean }\n\t * @param noCancelable { boolean }\n\t * @returns { CustomEvent }\n\t */\n\tvar triggerEvent = function(elem, name, detail, noBubbles, noCancelable){\n\t\tvar event = document.createEvent('Event');\n\n\t\tif(!detail){\n\t\t\tdetail = {};\n\t\t}\n\n\t\tdetail.instance = lazysizes;\n\n\t\tevent.initEvent(name, !noBubbles, !noCancelable);\n\n\t\tevent.detail = detail;\n\n\t\telem.dispatchEvent(event);\n\t\treturn event;\n\t};\n\n\tvar updatePolyfill = function (el, full){\n\t\tvar polyfill;\n\t\tif( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){\n\t\t\tif(full && full.src && !el[_getAttribute]('srcset')){\n\t\t\t\tel.setAttribute('srcset', full.src);\n\t\t\t}\n\t\t\tpolyfill({reevaluate: true, elements: [el]});\n\t\t} else if(full && full.src){\n\t\t\tel.src = full.src;\n\t\t}\n\t};\n\n\tvar getCSS = function (elem, style){\n\t\treturn (getComputedStyle(elem, null) || {})[style];\n\t};\n\n\t/**\n\t *\n\t * @param elem { Element }\n\t * @param parent { Element }\n\t * @param [width] {number}\n\t * @returns {number}\n\t */\n\tvar getWidth = function(elem, parent, width){\n\t\twidth = width || elem.offsetWidth;\n\n\t\twhile(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){\n\t\t\twidth =  parent.offsetWidth;\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\treturn width;\n\t};\n\n\tvar rAF = (function(){\n\t\tvar running, waiting;\n\t\tvar firstFns = [];\n\t\tvar secondFns = [];\n\t\tvar fns = firstFns;\n\n\t\tvar run = function(){\n\t\t\tvar runFns = fns;\n\n\t\t\tfns = firstFns.length ? secondFns : firstFns;\n\n\t\t\trunning = true;\n\t\t\twaiting = false;\n\n\t\t\twhile(runFns.length){\n\t\t\t\trunFns.shift()();\n\t\t\t}\n\n\t\t\trunning = false;\n\t\t};\n\n\t\tvar rafBatch = function(fn, queue){\n\t\t\tif(running && !queue){\n\t\t\t\tfn.apply(this, arguments);\n\t\t\t} else {\n\t\t\t\tfns.push(fn);\n\n\t\t\t\tif(!waiting){\n\t\t\t\t\twaiting = true;\n\t\t\t\t\t(document.hidden ? setTimeout : requestAnimationFrame)(run);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\trafBatch._lsFlush = run;\n\n\t\treturn rafBatch;\n\t})();\n\n\tvar rAFIt = function(fn, simple){\n\t\treturn simple ?\n\t\t\tfunction() {\n\t\t\t\trAF(fn);\n\t\t\t} :\n\t\t\tfunction(){\n\t\t\t\tvar that = this;\n\t\t\t\tvar args = arguments;\n\t\t\t\trAF(function(){\n\t\t\t\t\tfn.apply(that, args);\n\t\t\t\t});\n\t\t\t}\n\t\t;\n\t};\n\n\tvar throttle = function(fn){\n\t\tvar running;\n\t\tvar lastTime = 0;\n\t\tvar gDelay = lazySizesCfg.throttleDelay;\n\t\tvar rICTimeout = lazySizesCfg.ricTimeout;\n\t\tvar run = function(){\n\t\t\trunning = false;\n\t\t\tlastTime = Date.now();\n\t\t\tfn();\n\t\t};\n\t\tvar idleCallback = requestIdleCallback && rICTimeout > 49 ?\n\t\t\tfunction(){\n\t\t\t\trequestIdleCallback(run, {timeout: rICTimeout});\n\n\t\t\t\tif(rICTimeout !== lazySizesCfg.ricTimeout){\n\t\t\t\t\trICTimeout = lazySizesCfg.ricTimeout;\n\t\t\t\t}\n\t\t\t} :\n\t\t\trAFIt(function(){\n\t\t\t\tsetTimeout(run);\n\t\t\t}, true)\n\t\t;\n\n\t\treturn function(isPriority){\n\t\t\tvar delay;\n\n\t\t\tif((isPriority = isPriority === true)){\n\t\t\t\trICTimeout = 33;\n\t\t\t}\n\n\t\t\tif(running){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trunning =  true;\n\n\t\t\tdelay = gDelay - (Date.now() - lastTime);\n\n\t\t\tif(delay < 0){\n\t\t\t\tdelay = 0;\n\t\t\t}\n\n\t\t\tif(isPriority || delay < 9){\n\t\t\t\tidleCallback();\n\t\t\t} else {\n\t\t\t\tsetTimeout(idleCallback, delay);\n\t\t\t}\n\t\t};\n\t};\n\n\t//based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html\n\tvar debounce = function(func) {\n\t\tvar timeout, timestamp;\n\t\tvar wait = 99;\n\t\tvar run = function(){\n\t\t\ttimeout = null;\n\t\t\tfunc();\n\t\t};\n\t\tvar later = function() {\n\t\t\tvar last = Date.now() - timestamp;\n\n\t\t\tif (last < wait) {\n\t\t\t\tsetTimeout(later, wait - last);\n\t\t\t} else {\n\t\t\t\t(requestIdleCallback || run)(run);\n\t\t\t}\n\t\t};\n\n\t\treturn function() {\n\t\t\ttimestamp = Date.now();\n\n\t\t\tif (!timeout) {\n\t\t\t\ttimeout = setTimeout(later, wait);\n\t\t\t}\n\t\t};\n\t};\n\n\tvar loader = (function(){\n\t\tvar preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;\n\n\t\tvar eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;\n\n\t\tvar regImg = /^img$/i;\n\t\tvar regIframe = /^iframe$/i;\n\n\t\tvar supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent));\n\n\t\tvar shrinkExpand = 0;\n\t\tvar currentExpand = 0;\n\n\t\tvar isLoading = 0;\n\t\tvar lowRuns = -1;\n\n\t\tvar resetPreloading = function(e){\n\t\t\tisLoading--;\n\t\t\tif(!e || isLoading < 0 || !e.target){\n\t\t\t\tisLoading = 0;\n\t\t\t}\n\t\t};\n\n\t\tvar isVisible = function (elem) {\n\t\t\tif (isBodyHidden == null) {\n\t\t\t\tisBodyHidden = getCSS(document.body, 'visibility') == 'hidden';\n\t\t\t}\n\n\t\t\treturn isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden');\n\t\t};\n\n\t\tvar isNestedVisible = function(elem, elemExpand){\n\t\t\tvar outerRect;\n\t\t\tvar parent = elem;\n\t\t\tvar visible = isVisible(elem);\n\n\t\t\teLtop -= elemExpand;\n\t\t\teLbottom += elemExpand;\n\t\t\teLleft -= elemExpand;\n\t\t\teLright += elemExpand;\n\n\t\t\twhile(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){\n\t\t\t\tvisible = ((getCSS(parent, 'opacity') || 1) > 0);\n\n\t\t\t\tif(visible && getCSS(parent, 'overflow') != 'visible'){\n\t\t\t\t\touterRect = parent.getBoundingClientRect();\n\t\t\t\t\tvisible = eLright > outerRect.left &&\n\t\t\t\t\t\teLleft < outerRect.right &&\n\t\t\t\t\t\teLbottom > outerRect.top - 1 &&\n\t\t\t\t\t\teLtop < outerRect.bottom + 1\n\t\t\t\t\t;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn visible;\n\t\t};\n\n\t\tvar checkElements = function() {\n\t\t\tvar eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal,\n\t\t\t\tbeforeExpandVal, defaultExpand, preloadExpand, hFac;\n\t\t\tvar lazyloadElems = lazysizes.elements;\n\n\t\t\tif((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){\n\n\t\t\t\ti = 0;\n\n\t\t\t\tlowRuns++;\n\n\t\t\t\tfor(; i < eLlen; i++){\n\n\t\t\t\t\tif(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}\n\n\t\t\t\t\tif(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;}\n\n\t\t\t\t\tif(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){\n\t\t\t\t\t\telemExpand = currentExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!defaultExpand) {\n\t\t\t\t\t\tdefaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ?\n\t\t\t\t\t\t\tdocElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 :\n\t\t\t\t\t\t\tlazySizesCfg.expand;\n\n\t\t\t\t\t\tlazysizes._defEx = defaultExpand;\n\n\t\t\t\t\t\tpreloadExpand = defaultExpand * lazySizesCfg.expFactor;\n\t\t\t\t\t\thFac = lazySizesCfg.hFac;\n\t\t\t\t\t\tisBodyHidden = null;\n\n\t\t\t\t\t\tif(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){\n\t\t\t\t\t\t\tcurrentExpand = preloadExpand;\n\t\t\t\t\t\t\tlowRuns = 0;\n\t\t\t\t\t\t} else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){\n\t\t\t\t\t\t\tcurrentExpand = defaultExpand;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentExpand = shrinkExpand;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(beforeExpandVal !== elemExpand){\n\t\t\t\t\t\teLvW = innerWidth + (elemExpand * hFac);\n\t\t\t\t\t\telvH = innerHeight + elemExpand;\n\t\t\t\t\t\telemNegativeExpand = elemExpand * -1;\n\t\t\t\t\t\tbeforeExpandVal = elemExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\trect = lazyloadElems[i].getBoundingClientRect();\n\n\t\t\t\t\tif ((eLbottom = rect.bottom) >= elemNegativeExpand &&\n\t\t\t\t\t\t(eLtop = rect.top) <= elvH &&\n\t\t\t\t\t\t(eLright = rect.right) >= elemNegativeExpand * hFac &&\n\t\t\t\t\t\t(eLleft = rect.left) <= eLvW &&\n\t\t\t\t\t\t(eLbottom || eLright || eLleft || eLtop) &&\n\t\t\t\t\t\t(lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) &&\n\t\t\t\t\t\t((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){\n\t\t\t\t\t\tunveilElement(lazyloadElems[i]);\n\t\t\t\t\t\tloadedSomething = true;\n\t\t\t\t\t\tif(isLoading > 9){break;}\n\t\t\t\t\t} else if(!loadedSomething && isCompleted && !autoLoadElem &&\n\t\t\t\t\t\tisLoading < 4 && lowRuns < 4 && loadMode > 2 &&\n\t\t\t\t\t\t(preloadElems[0] || lazySizesCfg.preloadAfterLoad) &&\n\t\t\t\t\t\t(preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){\n\t\t\t\t\t\tautoLoadElem = preloadElems[0] || lazyloadElems[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(autoLoadElem && !loadedSomething){\n\t\t\t\t\tunveilElement(autoLoadElem);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar throttledCheckElements = throttle(checkElements);\n\n\t\tvar switchLoadingClass = function(e){\n\t\t\tvar elem = e.target;\n\n\t\t\tif (elem._lazyCache) {\n\t\t\t\tdelete elem._lazyCache;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresetPreloading(e);\n\t\t\taddClass(elem, lazySizesCfg.loadedClass);\n\t\t\tremoveClass(elem, lazySizesCfg.loadingClass);\n\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass);\n\t\t\ttriggerEvent(elem, 'lazyloaded');\n\t\t};\n\t\tvar rafedSwitchLoadingClass = rAFIt(switchLoadingClass);\n\t\tvar rafSwitchLoadingClass = function(e){\n\t\t\trafedSwitchLoadingClass({target: e.target});\n\t\t};\n\n\t\tvar changeIframeSrc = function(elem, src){\n\t\t\tvar loadMode = elem.getAttribute('data-load-mode') || lazySizesCfg.iframeLoadMode;\n\n\t\t\t// loadMode can be also a string!\n\t\t\tif (loadMode == 0) {\n\t\t\t\telem.contentWindow.location.replace(src);\n\t\t\t} else if (loadMode == 1) {\n\t\t\t\telem.src = src;\n\t\t\t}\n\t\t};\n\n\t\tvar handleSources = function(source){\n\t\t\tvar customMedia;\n\n\t\t\tvar sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);\n\n\t\t\tif( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){\n\t\t\t\tsource.setAttribute('media', customMedia);\n\t\t\t}\n\n\t\t\tif(sourceSrcset){\n\t\t\t\tsource.setAttribute('srcset', sourceSrcset);\n\t\t\t}\n\t\t};\n\n\t\tvar lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){\n\t\t\tvar src, srcset, parent, isPicture, event, firesLoad;\n\n\t\t\tif(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){\n\n\t\t\t\tif(sizes){\n\t\t\t\t\tif(isAuto){\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.autosizesClass);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.setAttribute('sizes', sizes);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsrcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);\n\t\t\t\tsrc = elem[_getAttribute](lazySizesCfg.srcAttr);\n\n\t\t\t\tif(isImg) {\n\t\t\t\t\tparent = elem.parentNode;\n\t\t\t\t\tisPicture = parent && regPicture.test(parent.nodeName || '');\n\t\t\t\t}\n\n\t\t\t\tfiresLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));\n\n\t\t\t\tevent = {target: elem};\n\n\t\t\t\taddClass(elem, lazySizesCfg.loadingClass);\n\n\t\t\t\tif(firesLoad){\n\t\t\t\t\tclearTimeout(resetPreloadingTimer);\n\t\t\t\t\tresetPreloadingTimer = setTimeout(resetPreloading, 2500);\n\t\t\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass, true);\n\t\t\t\t}\n\n\t\t\t\tif(isPicture){\n\t\t\t\t\tforEach.call(parent.getElementsByTagName('source'), handleSources);\n\t\t\t\t}\n\n\t\t\t\tif(srcset){\n\t\t\t\t\telem.setAttribute('srcset', srcset);\n\t\t\t\t} else if(src && !isPicture){\n\t\t\t\t\tif(regIframe.test(elem.nodeName)){\n\t\t\t\t\t\tchangeIframeSrc(elem, src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.src = src;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(isImg && (srcset || isPicture)){\n\t\t\t\t\tupdatePolyfill(elem, {src: src});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(elem._lazyRace){\n\t\t\t\tdelete elem._lazyRace;\n\t\t\t}\n\t\t\tremoveClass(elem, lazySizesCfg.lazyClass);\n\n\t\t\trAF(function(){\n\t\t\t\t// Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015)\n\t\t\t\tvar isLoaded = elem.complete && elem.naturalWidth > 1;\n\n\t\t\t\tif( !firesLoad || isLoaded){\n\t\t\t\t\tif (isLoaded) {\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.fastLoadedClass);\n\t\t\t\t\t}\n\t\t\t\t\tswitchLoadingClass(event);\n\t\t\t\t\telem._lazyCache = true;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tif ('_lazyCache' in elem) {\n\t\t\t\t\t\t\tdelete elem._lazyCache;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 9);\n\t\t\t\t}\n\t\t\t\tif (elem.loading == 'lazy') {\n\t\t\t\t\tisLoading--;\n\t\t\t\t}\n\t\t\t}, true);\n\t\t});\n\n\t\t/**\n\t\t *\n\t\t * @param elem { Element }\n\t\t */\n\t\tvar unveilElement = function (elem){\n\t\t\tif (elem._lazyRace) {return;}\n\t\t\tvar detail;\n\n\t\t\tvar isImg = regImg.test(elem.nodeName);\n\n\t\t\t//allow using sizes=\"auto\", but don't use. it's invalid. Use data-sizes=\"auto\" or a valid value for sizes instead (i.e.: sizes=\"80vw\")\n\t\t\tvar sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes'));\n\t\t\tvar isAuto = sizes == 'auto';\n\n\t\t\tif( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;}\n\n\t\t\tdetail = triggerEvent(elem, 'lazyunveilread').detail;\n\n\t\t\tif(isAuto){\n\t\t\t\t autoSizer.updateElem(elem, true, elem.offsetWidth);\n\t\t\t}\n\n\t\t\telem._lazyRace = true;\n\t\t\tisLoading++;\n\n\t\t\tlazyUnveil(elem, detail, isAuto, sizes, isImg);\n\t\t};\n\n\t\tvar afterScroll = debounce(function(){\n\t\t\tlazySizesCfg.loadMode = 3;\n\t\t\tthrottledCheckElements();\n\t\t});\n\n\t\tvar altLoadmodeScrollListner = function(){\n\t\t\tif(lazySizesCfg.loadMode == 3){\n\t\t\t\tlazySizesCfg.loadMode = 2;\n\t\t\t}\n\t\t\tafterScroll();\n\t\t};\n\n\t\tvar onload = function(){\n\t\t\tif(isCompleted){return;}\n\t\t\tif(Date.now() - started < 999){\n\t\t\t\tsetTimeout(onload, 999);\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\tisCompleted = true;\n\n\t\t\tlazySizesCfg.loadMode = 3;\n\n\t\t\tthrottledCheckElements();\n\n\t\t\taddEventListener('scroll', altLoadmodeScrollListner, true);\n\t\t};\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tstarted = Date.now();\n\n\t\t\t\tlazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass);\n\t\t\t\tpreloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass);\n\n\t\t\t\taddEventListener('scroll', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('resize', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('pageshow', function (e) {\n\t\t\t\t\tif (e.persisted) {\n\t\t\t\t\t\tvar loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass);\n\n\t\t\t\t\t\tif (loadingElements.length && loadingElements.forEach) {\n\t\t\t\t\t\t\trequestAnimationFrame(function () {\n\t\t\t\t\t\t\t\tloadingElements.forEach( function (img) {\n\t\t\t\t\t\t\t\t\tif (img.complete) {\n\t\t\t\t\t\t\t\t\t\tunveilElement(img);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif(window.MutationObserver){\n\t\t\t\t\tnew MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );\n\t\t\t\t} else {\n\t\t\t\t\tdocElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);\n\t\t\t\t\tdocElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);\n\t\t\t\t\tsetInterval(throttledCheckElements, 999);\n\t\t\t\t}\n\n\t\t\t\taddEventListener('hashchange', throttledCheckElements, true);\n\n\t\t\t\t//, 'fullscreenchange'\n\t\t\t\t['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){\n\t\t\t\t\tdocument[_addEventListener](name, throttledCheckElements, true);\n\t\t\t\t});\n\n\t\t\t\tif((/d$|^c/.test(document.readyState))){\n\t\t\t\t\tonload();\n\t\t\t\t} else {\n\t\t\t\t\taddEventListener('load', onload);\n\t\t\t\t\tdocument[_addEventListener]('DOMContentLoaded', throttledCheckElements);\n\t\t\t\t\tsetTimeout(onload, 20000);\n\t\t\t\t}\n\n\t\t\t\tif(lazysizes.elements.length){\n\t\t\t\t\tcheckElements();\n\t\t\t\t\trAF._lsFlush();\n\t\t\t\t} else {\n\t\t\t\t\tthrottledCheckElements();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcheckElems: throttledCheckElements,\n\t\t\tunveil: unveilElement,\n\t\t\t_aLSL: altLoadmodeScrollListner,\n\t\t};\n\t})();\n\n\n\tvar autoSizer = (function(){\n\t\tvar autosizesElems;\n\n\t\tvar sizeElement = rAFIt(function(elem, parent, event, width){\n\t\t\tvar sources, i, len;\n\t\t\telem._lazysizesWidth = width;\n\t\t\twidth += 'px';\n\n\t\t\telem.setAttribute('sizes', width);\n\n\t\t\tif(regPicture.test(parent.nodeName || '')){\n\t\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tsources[i].setAttribute('sizes', width);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!event.detail.dataAttr){\n\t\t\t\tupdatePolyfill(elem, event.detail);\n\t\t\t}\n\t\t});\n\t\t/**\n\t\t *\n\t\t * @param elem {Element}\n\t\t * @param dataAttr\n\t\t * @param [width] { number }\n\t\t */\n\t\tvar getSizeElement = function (elem, dataAttr, width){\n\t\t\tvar event;\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif(parent){\n\t\t\t\twidth = getWidth(elem, parent, width);\n\t\t\t\tevent = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});\n\n\t\t\t\tif(!event.defaultPrevented){\n\t\t\t\t\twidth = event.detail.width;\n\n\t\t\t\t\tif(width && width !== elem._lazysizesWidth){\n\t\t\t\t\t\tsizeElement(elem, parent, event, width);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar updateElementsSizes = function(){\n\t\t\tvar i;\n\t\t\tvar len = autosizesElems.length;\n\t\t\tif(len){\n\t\t\t\ti = 0;\n\n\t\t\t\tfor(; i < len; i++){\n\t\t\t\t\tgetSizeElement(autosizesElems[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar debouncedUpdateElementsSizes = debounce(updateElementsSizes);\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tautosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass);\n\t\t\t\taddEventListener('resize', debouncedUpdateElementsSizes);\n\t\t\t},\n\t\t\tcheckElems: debouncedUpdateElementsSizes,\n\t\t\tupdateElem: getSizeElement\n\t\t};\n\t})();\n\n\tvar init = function(){\n\t\tif(!init.i && document.getElementsByClassName){\n\t\t\tinit.i = true;\n\t\t\tautoSizer._();\n\t\t\tloader._();\n\t\t}\n\t};\n\n\tsetTimeout(function(){\n\t\tif(lazySizesCfg.init){\n\t\t\tinit();\n\t\t}\n\t});\n\n\tlazysizes = {\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tcfg: lazySizesCfg,\n\t\tautoSizer: autoSizer,\n\t\tloader: loader,\n\t\tinit: init,\n\t\tuP: updatePolyfill,\n\t\taC: addClass,\n\t\trC: removeClass,\n\t\thC: hasClass,\n\t\tfire: triggerEvent,\n\t\tgW: getWidth,\n\t\trAF: rAF,\n\t};\n\n\treturn lazysizes;\n}\n));\n"
  },
  {
    "path": "no-src.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n\t<meta charset=\"UTF-8\" />\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t<title>lazysizes - the umltimate lazyloader for responsive images, iframes and widget</title>\n\t<link rel=\"canonical\" href=\"http://afarkas.github.io/lazysizes/index.html\" />\n\n\t<script>\n\t\tfunction loadJS(u){var r=document.getElementsByTagName(\"script\")[ 0 ],s=document.createElement(\"script\");s.src=u;r.parentNode.insertBefore(s,r);}\n\n\t\tif(!window.HTMLPictureElement || !('sizes' in document.createElement('img'))){\n\t\t\tdocument.createElement('picture');\n\t\t\t//generating the config array\n\t\t\twindow.picturefillCFG = window.picturefillCFG || [];\n\t\t\tpicturefillCFG.push([ \"algorithm\", \"saveData\" ]);\n\n\t\t\tloadJS(\"https://cdnjs.cloudflare.com/ajax/libs/picturefill/3.0.0-beta1/picturefill.min.js\");\n\t\t}\n\t</script>\n\n\t<link href=\"assets/css/tidy.css\" rel=\"stylesheet\" />\n\t<style>\n\t\t.nav {\n\t\t\tmargin-bottom: 30px;\n\t\t}\n\t\t.intrinsic {\n\t\t\tposition: relative;\n\t\t\tpadding-bottom: 75%;\n\t\t\theight: 0;\n\t\t}\n\t\t.intrinsic-2 {\n\t\t\tpadding-bottom: 56.25%;\n\t\t}\n\t\t.intrinsic-3 {\n\t\t\tpadding-bottom: 133.333%;\n\t\t}\n\t\t.intrinsic img,\n\t\t.intrinsic iframe,\n\t\t.intrinsic .lazyload {\n\t\t\tposition:absolute;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tleft: 0;\n\t\t\ttop: 0;\n\t\t\tborder: none;\n\t\t\toverflow: hidden;\n\t\t}\n\t\tpre {\n\t\t\t-moz-tab-size: 2;\n\t\t\ttab-size: 2;\n\t\t}\n\n\t\t.thumbnail-small {\n\t\t\twidth: 32%;\n\t\t\tdisplay: inline-block;\n\t\t\tmargin-bottom: 35px;\n\t\t}\n\n\t\t.scroll-view {\n\t\t\toverflow: auto;\n\t\t\t-webkit-overflow-scrolling: touch;\n\t\t\toverflow-x: auto;\n\t\t\toverflow-y: hidden;\n\t\t\tposition: relative;\n\t\t\twidth: 100%;\n\t\t\tpadding: 2px 2px 10px;\n\t\t}\n\t\t.scroll-doc {\n\t\t\tdisplay: table;\n\t\t\tposition: relative;\n\t\t\ttext-align: left;\n\t\t}\n\t\t.scroll-item {\n\t\t\tdisplay: table-cell;\n\t\t\tvertical-align: middle;\n\t\t}\n\t\t.scroll-item .thumbnail {\n\t\t\tmargin: 5px 10px;\n\t\t\twidth: 230px;\n\t\t}\n\t\t.scroll-item .thumbnail img {\n\t\t\twidth: 100%;\n\t\t\theight: auto;\n\t\t}\n\n\t\t.lazyload:not(iframe) {\n\t\t\topacity: 0;\n\t\t}\n\n\t\timg {\n\t\t\tmax-width: 100%;\n\t\t}\n\n\t\t.lazyloading:not(iframe) {\n\t\t\topacity: 1;\n\t\t\ttransition: 600ms opacity;\n\t\t\tbackground: #f7f7f7 url(assets/imgs/loader.gif) no-repeat center;\n\t\t\tmin-height: 60px;\n\t\t}\n\n\t\t.lazyloaded {\n\t\t\topacity: 1;\n\t\t\ttransition: 100ms opacity;\n\t\t}\n\n\t\t[data-expand].lazyload {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.8) translateY(-100px);\n\t\t}\n\n\t\t[data-expand].lazyloaded {\n\t\t\topacity: 1;\n\t\t\ttransition: all 700ms;\n\t\t\ttransform: scale(1) translateY(0px);\n\t\t}\n\n\t\t.effect-row-middle  > [data-expand]:nth-child(2),\n\t\t.effect-row-reverse  > [data-expand]:nth-child(3),\n\t\t.effect-row > [data-expand]:nth-child(1) {\n\t\t\ttransition-delay: 100ms;\n\t\t}\n\n\t\t.effect-row-middle  > [data-expand]:nth-child(1),\n\t\t.effect-row-middle  > [data-expand]:nth-child(3),\n\t\t.effect-row-reverse  > [data-expand]:nth-child(2),\n\t\t.effect-row > [data-expand]:nth-child(2) {\n\t\t\ttransition-delay: 400ms;\n\t\t}\n\n\t\t.effect-row-reverse  > [data-expand]:nth-child(1),\n\t\t.effect-row > [data-expand]:nth-child(3) {\n\t\t\ttransition-delay: 700ms;\n\t\t}\n\n\t</style>\n\t<script>\n\t\t(function(){\n\t\t\tvar docElem = document.documentElement;\n\n\t\t\twindow.lazySizesConfig = window.lazySizesConfig || {};\n\n\t\t\twindow.lazySizesConfig.loadMode = 1;\n\n\t\t\t//set expand to a higher value on larger displays\n\t\t\twindow.lazySizesConfig.expand = Math.max(Math.min(docElem.clientWidth, docElem.clientHeight, 1222) - 1, 359);\n\t\t\twindow.lazySizesConfig.expFactor = lazySizesConfig.expand < 380 ? 3 : 2;\n\t\t})();\n\t</script>\n\t<script src=\"plugins/unveilhooks/ls.unveilhooks.min.js\" async=\"\"></script>\n\n\t<script src=\"plugins/unload/ls.unload.min.js\" async=\"\"></script>\n\t<script src=\"lazysizes.min.js\" async=\"\"></script>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n\n\t<div class=\"jumbotron\">\n\t\t<h1>lazySizes</h1>\n\t\t<p><strong>lazySizes</strong> is the ultimate and lightweight lazyLoader which lazy loads images (including responsive images (picture/srcset)), iframes and scripts. It is written in VanillaJS and with high performance in mind.</p>\n\t\t<p>Simply add the JS to your website and put the <code>class</code> <code>lazyload</code> to all elements, which should be lazy loaded. For a short <a href=\"https://github.com/aFarkas/lazysizes/blob/gh-pages/README.md\">API description go to the readme.md</a>.</p>\n\t</div>\n\n\t<div id=\"examples\">\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<img alt=\"Boat\"\n\t\t\t\t\t\t\t data-src=\"https://farm5.staticflickr.com/4094/4859138371_9713d4396e_b.jpg\"\n\t\t\t\t\t\t\t class=\"lazyload\" />\n\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>Image with LQIP technique</h3>\n\t\t\t\t\t\t<p>The low quality image placeholder pattern is a performance technique. While it might increase measured time until the <code>onload</code> event, it dramatically increases perceived performance.</p>\n\t\t\t\t\t\t<p>This pattern is recommended for above the fold/critical images.</p>\n<pre>&lt;img\n\talt=\"100%x200\"\n\tsrc=\"low-quality.jpg\"\n\tdata-src=\"normal-quality.jpg\"\n\tclass=\"lazyload\" /&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<img alt=\"Desert Road\"\n\t\t\t\t\t\t\t data-src=\"https://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_b.jpg\" class=\"lazyload\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>Normal lazy image</h3>\n\t\t\t\t\t\t<p>The normal image pattern can be used for non-critical/below the fold images or in case there is no low quality image available:</p>\n<pre>&lt;img class=\"lazyload\" data-src=\"image.jpg\" alt=\"Desert Road\" /&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsizes=\"(min-width: 1000px) 930px, 90vw\"\n\t\t\t\t\t\t\tdata-src=\"https://farm5.staticflickr.com/4078/5441060528_31db7838ba_n.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm5.staticflickr.com/4078/5441060528_31db7838ba_m.jpg 240w,\n\thttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_n.jpg 320w,\n\thttps://farm5.staticflickr.com/4078/5441060528_31db7838ba.jpg 500w,\n\thttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_z.jpg 640w,\n\thttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_b.jpg 1024w\"\n\t\t\t\t\t\t\t  class=\"lazyload\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>responsive image with srcset and sizes attribute</h3>\n\t\t\t\t\t\t<p>Simply use <code>data-srcset</code> and <code>data-sizes</code> and you can support responsive images.</p>\n<pre>&lt;img\n\talt=\"\"\n\tsrc=\"small.jpg\"\n\tsizes=\"(min-width: 1000px) 930px, 90vw\"\n\tdata-srcset=\"small.jpg 500w,\n\t\tmedium.jpg 640w,\n\t\tbig.jpg 1024w\"\n\tclass=\"lazyload\" /&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<picture>\n\t\t\t\t\t\t\t<!--[if IE 9]><audio><![endif]-->\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-srcset=\"//lorempixel.com/710/533/people/9/\"\n\t\t\t\t\t\t\t\t\tmedia=\"(max-width: 990px)\" />\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-srcset=\"//lorempixel.com/930/698/people/8/\"\n\t\t\t\t\t\t\t\t\tmedia=\"(max-width: 1024px)\" />\n\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-srcset=\"//lorempixel.com/1130/848/people/\" />\n\t\t\t\t\t\t\t<!--[if IE 9]></audio><![endif]-->\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/1130/848/people/\"\n\t\t\t\t\t\t\t\talt=\"image with artdirection\" />\n\t\t\t\t\t\t</picture>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>responsive image with the <code>picture</code> element</h3>\n\t\t\t\t\t\t<p>The picture element is also supported. Simply add the <code>lazyload</code> class to the <code>img</code> and use <code>data-srcset</code> on your <code>source</code> and the <code>img</code> element.</p>\n<pre>&lt;picture&gt;\n\t&lt;!--[if IE 9]&gt;&lt;video style=\"display: none\"&gt;&lt;![endif]--&gt;\n\t&lt;source\n\t\tdata-srcset=\"500.jpg\"\n\t\tmedia=\"(max-width: 500px)\" /&gt;\n\t&lt;source\n\t\t\tdata-srcset=\"1024.jpg\"\n\t\t\tmedia=\"(max-width: 1024px)\" /&gt;\n\t&lt;source\n\t\t\tdata-srcset=\"1200.jpg\" /&gt;\n&lt;!--[if IE 9]>&lt;/video&gt;&lt;![endif]--&gt;\n&lt;img\n\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\tclass=\"lazyload\"\n\t\tdata-src=\"1024.jpg\"\n\t\talt=\"image with artdirection\" /&gt;\n&lt;/picture&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\" id=\"autosizes-example\">\n\t\t\t<div class=\"alert alert-info\">\n\t\t\t\t<p><strong>automatic sizes feature</strong>: In case of lazy loading images the <code>sizes</code> attribute of the <code>img</code>/<code>source</code> elements can be calculated with JS.</p>\n\t\t\t\t<p>This automatic sizes feature is directly included in <strong>lazySizes</strong>. Simply use the keyword <code>auto</code> inside of the <code>data-sizes</code> attributes (<code>data-sizes=\"auto\"</code>).</p>\n\t\t\t\t<p><strong>Important: How <code>sizes</code> is calculated</strong>: The automatic sizes calculation takes the width of the image if it is over <code>40</code> (see also <code>minSize</code> option). In case it's below the <code>minSize</code> threshold, it traverses up the DOM tree until it finds a parent which is over <code>40</code> and uses this number. Often the following general CSS rule might help: <code>img[data-sizes=\"auto\"] { display: block; }</code>.</p>\n\t\t\t</div>\n\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\tdata-src=\"https://farm9.staticflickr.com/8200/8248153196_7a7664e147_n.jpg\"\n\t\t\t\t\t\t\t\tdata-srcset=\"https://farm9.staticflickr.com/8200/8248153196_7a7664e147_m.jpg 240w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_n.jpg 320w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147.jpg 500w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_c.jpg 800w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_b.jpg 1024w\"\n\t\t\t\t\t\t\t\tclass=\"lazyload\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>responsive image with srcset and <strong>automatic sizes</strong> attribute</h3>\n\t\t\t\t\t\t<p>The <strong>autosizes feature</strong> makes using responsive images with the right <code>sizes</code> value easy as hell.</p>\n\n<pre>&lt;img\n\talt=\"\"\n\tdata-sizes=\"auto\"\n\tdata-src=\"medium.jpg\"\n\tdata-srcset=\"small.jpg 500w,\n\t\tmedium.jpg 640w,\n\t\tbig.jpg 1024w\"\n\tclass=\"lazyload\" /&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"alert alert-danger\">\n\t\t\t\t<p>For responsive images support you must use either use a full polyfill like <a href=\"https://github.com/scottjehl/picturefill\" target=\"_blank\">picturefill</a> or use the <a href=\"https://github.com/aFarkas/lazysizes/blob/gh-pages/plugins/respimg\">extreme lightweight partial respimg polyfill plugin</a> or use the <a href=\"https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins/rias\">Responsive Images as a Service extension</a>.</p>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic intrinsic-2\">\n\t\t\t\t\t\t<iframe data-src=\"//www.youtube.com/embed/ZfV-aYdU4uE\" frameborder=\"0\" allowfullscreen=\"\" class=\"lazyload\">\n\t\t\t\t\t\t</iframe>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>iframe</h3>\n\t\t\t\t\t\t<p>Iframes can be loaded too:</p>\n<pre>&lt;iframe data-src=\"//www.youtube.com/embed/ZfV-aYdU4uE\" class=\"lazyload\" frameborder=\"0\" allowfullscreen>&lt;/iframe&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row lazyload\" data-expand=\"-110\">\n\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic intrinsic-3\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\tdata-src=\"https://farm1.staticflickr.com/192/504251019_ffc94c77b5.jpg\"\n\t\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/192/504251019_ffc94c77b5_n.jpg 240w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5.jpg 375w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5_z.jpg 480w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5_b.jpg 768w\"\n\t\t\t\t\t\t\t\talt=\"Windows on Istanbul\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t</div>\n\n\t\t\t</div>\n\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t<h3><code>[data-expand]</code>: More than lazyloading</h3>\n\t\t\t\t\t<p>LazySizes normally loads in view elements as fast as possible and near the view elements are lazily pre-loaded. This can be modified in general using the <code>expand</code> option. With the <code>data-expand</code> attribute this can be changed element specific to expand or shrink the viewport.</p>\n\n\t\t\t\t\t<p>This can be used to create unveiling effects for elements with or even without loading anything.</p>\n<pre>\n&lt;style&gt;\n.teaser.lazyload {\n\topacity: 0;\n\ttransform: scale(0.8);\n}\n\n.teaser.lazyloaded {\n\topacity: 1;\n\ttransform: scale(1);\n\ttransition: all 700ms;\n}\n&lt;/style&gt;\n\n&lt;script&gt;\n\nwindow.lazySizesConfig = {\n\taddClasses: true\n};\n&lt;/script&gt;\n\n&lt;div class=\"teaser lazyload\" data-expand=\"-80\"&gt;\n\t&lt;img data-src=\"image.jpg\" class=\"lazyload\" /&gt;\n\t&lt;h1&gt;Teaser Title&lt;/h1&gt;\n\t&lt;p&gt;...&lt;/p&gt;\n&lt;/div&gt;\n</pre>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<script src=\"//code.jquery.com/jquery-2.1.1.min.js\"></script>\n\t\t\t\t\t<div data-ride=\"carousel\" data-script=\"assets/js/bootstrap.min.js\" data-link=\"assets/css/carousel.css\" class=\"carousel lazyload lazypreload slide\" data-interval=\"false\" id=\"carousel-example-captions\">\n\t\t\t\t\t\t<ol class=\"carousel-indicators\">\n\t\t\t\t\t\t\t<li data-slide-to=\"0\" data-target=\"#carousel-example-captions\"></li>\n\t\t\t\t\t\t\t<li data-slide-to=\"1\" data-target=\"#carousel-example-captions\"></li>\n\t\t\t\t\t\t</ol>\n\t\t\t\t\t\t<div class=\"carousel-inner\">\n\n\t\t\t\t\t\t\t<div class=\"item\">\n\t\t\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t\t\t<img alt=\"100%x200\"\n\t\t\t\t\t\t\t\t\t\t data-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\t\t data-src=\"https://farm1.staticflickr.com/113/284651694_69e63b374d.jpg\"\n\t\t\t\t\t\t\t\t\t\t data-srcset=\"https://farm1.staticflickr.com/113/284651694_69e63b374d_m.jpg 240w,\n\t\t\t\t\t\t\t\t\t\t https://farm1.staticflickr.com/113/284651694_69e63b374d.jpg 500w,\nhttps://farm1.staticflickr.com/113/284651694_69e63b374d_z.jpg?zz=1 640w,\nhttps://farm1.staticflickr.com/113/284651694_69e63b374d_o.jpg 800w\"\n\t\t\t\t\t\t\t\t\t\t class=\"lazyload\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"carousel-caption\">\n\t\t\t\t\t\t\t\t\t<h3>First slide label</h3>\n\t\t\t\t\t\t\t\t\t<p>Nulla vitae elit libero, a pharetra augue mollis interdum.</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div class=\"item active\">\n\t\t\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t\t\t<img alt=\"100%x200\"\n\t\t\t\t\t\t\t\t\t\t data-src=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34.jpg\"\n\t\t\t\t\t\t\t\t\t\t data-srcset=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34_m.jpg 240w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_n.jpg 320w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34.jpg 500w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_z.jpg 640w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_b.jpg 1024w\"\n\t\t\t\t\t\t\t\t\t\t data-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\t\t class=\"lazyload\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"carousel-caption\">\n\t\t\t\t\t\t\t\t\t<h3>Third slide label</h3>\n\t\t\t\t\t\t\t\t\t<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<a data-slide=\"prev\" role=\"button\" href=\"#carousel-example-captions\" class=\"left carousel-control\">\n\t\t\t\t\t\t\t<span class=\"glyphicon glyphicon-chevron-left\"></span>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<a data-slide=\"next\" role=\"button\" href=\"#carousel-example-captions\" class=\"right carousel-control\">\n\t\t\t\t\t\t\t<span class=\"glyphicon glyphicon-chevron-right\"></span>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3>Widgets/Javascript/Script</h3>\n\t\t\t\t\t\t<p>LazySizes can be extended to load nearly everything lazily. The <a href=\"https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins\">ls.unveilhooks.js</a> plugin can be used to lazy load scripts, background images, and videos. Simply add a <code>data-script</code> to your widget and you are done:</p>\n<pre>&lt;div data-ride=\"carousel\" data-script=\"assets/js/bootstrap.min.js\" class=\"carousel lazyload\"&gt;\n\t&lt;!-- widget content --&gt;\n&lt;div&gt;\n</pre>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<div class=\"scroll-view\">\n\t\t\t\t<div class=\"scroll-doc\">\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_z.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_m.jpg 240w,\n\t\t\t\t\t\thttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_n.jpg 320w,\n\t\t\t\t\t\thttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8.jpg 500w,\n\t\t\t\t\t\thttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_z.jpg 640w,\n\t\t\t\t\t\thttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_c.jpg 800w,\n\t\t\t\t\t\thttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_b.jpg 1024w\"\n\t\t\t\t\t\t\t\t\talt=\"Desert Road\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm5.staticflickr.com/4078/5441060528_31db7838ba.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm5.staticflickr.com/4078/5441060528_31db7838ba_m.jpg 240w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_n.jpg 320w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba.jpg 500w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_z.jpg 640w\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm9.staticflickr.com/8200/8248153196_7a7664e147.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm9.staticflickr.com/8200/8248153196_7a7664e147_m.jpg 240w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_n.jpg 320w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"@ The Desert Tortoise Natural Area\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm1.staticflickr.com/113/284651694_69e63b374d.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/113/284651694_69e63b374d_m.jpg 240w,\nhttps://farm1.staticflickr.com/113/284651694_69e63b374d.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"Woman in water\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm3.staticflickr.com/2401/2171553538_37d0a133da.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm3.staticflickr.com/2401/2171553538_37d0a133da_m.jpg 240w,\nhttps://farm3.staticflickr.com/2401/2171553538_37d0a133da.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"Borobudur\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm1.staticflickr.com/17/92230866_713ae1eeef_z.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/17/92230866_713ae1eeef_n.jpg 240w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef.jpg 375w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef_z.jpg 480w\"\n\t\t\t\t\t\t\t\t\talt=\"A tree in the blue\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<div class=\"intrinsic intrinsic-3\">\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\t\tdata-src=\"https://farm1.staticflickr.com/192/504251019_ffc94c77b5_z.jpg\"\n\t\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/192/504251019_ffc94c77b5_n.jpg 240w,\n\thttps://farm1.staticflickr.com/192/504251019_ffc94c77b5.jpg 375w,\n\thttps://farm1.staticflickr.com/192/504251019_ffc94c77b5_z.jpg 480w\"\n\t\t\t\t\t\t\t\t\t\talt=\"Windows on Istanbul\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm6.staticflickr.com/5139/5546134597_0b19627066.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5139/5546134597_0b19627066_m.jpg 240w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066_n.jpg 320w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"Goldie Dawn\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm3.staticflickr.com/2727/4393975099_c212622aa0_n.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm3.staticflickr.com/2727/4393975099_c212622aa0_m.jpg 240w,\nhttps://farm3.staticflickr.com/2727/4393975099_c212622aa0_n.jpg 320w\"\n\t\t\t\t\t\t\t\t\talt=\"Avebury Stone Circle\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34_n.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34_m.jpg 240w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_n.jpg 320w\"\n\t\t\t\t\t\t\t\t\talt=\"el castil de tierra\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm8.staticflickr.com/7356/11122919374_55294abec3_n.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm8.staticflickr.com/7356/11122919374_55294abec3_m.jpg 240w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3_n.jpg 320w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"sunset\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_n.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_m.jpg 240w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_n.jpg 320w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc.jpg 500w\"\n\t\t\t\t\t\t\t\t\talt=\"Sky and earth\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"scroll-item\">\n\t\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\tdata-src=\"https://farm4.staticflickr.com/3023/2994603808_a3036a3cdf.jpg\"\n\t\t\t\t\t\t\t\t\tdata-srcset=\"https://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_n.jpg 240w,\nhttps://farm4.staticflickr.com/3023/2994603808_a3036a3cdf.jpg 375w,\nhttps://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_z.jpg 480w\"\n\t\t\t\t\t\t\t\t\talt=\"Missing Ulsoor lake (Explore)\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<div class=\"alert alert-info\">\n\t\t\t\t<p>While other lazy loaders or responsive images solution need to be called, if new elements are added to the DOM or do become visible through a special user interaction or a JavaScript behavior.</p>\n\t\t\t\t<p>LazySizes does automatically detect any changes to the DOM and the visibility of <code>.lazyload</code> elements.</p>\n\t\t\t\t<button type=\"button\" class=\"add-new btn btn-primary\">click to add new elements</button>\n\t\t\t</div>\n\n\t\t\t<script type=\"text/html\" class=\"template\">\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/abstract/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/animals/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/business/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"row effect-row\">\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload lightSpeedIn\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/cats/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload lightSpeedIn\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/city/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload lightSpeedIn\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/food/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"row effect-row-middle\">\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/nature/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/sports/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/technics/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"row effect-row-reverse\">\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload flipInX\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/nightlife/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload flipInX\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/fashion/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload flipInX\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/people/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\n\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/transport/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/animals/1/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"thumbnail thumbnail-small lazyload\" data-expand=\"-40\">\n\t\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"lazyload no-src\"\n\t\t\t\t\t\t\t\t\tdata-src=\"//lorempixel.com/400/300/food/2/\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</script>\n\t\t\t<script>\n\t\t\t\t$('.add-new').on('click', function(){\n\t\t\t\t\tvar $template = $('.template');\n\t\t\t\t\t$template.after($template.html());\n\t\t\t\t});\n\t\t\t</script>\n\t\t\t<br />\n\t\t\t<br />\n\t\t\t<br />\n\t\t\t<br />\n\t\t\t<br />\n\t\t\t<br />\n\n\t\t</div>\n\n\t</div>\n\n\n\n\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "optimumx/child.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n\t<meta charset=\"UTF-8\">\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\t<title>respimage performance test</title>\n\t<link href=\"../assets/css/tidy.css\" rel=\"stylesheet\" />\n\t<style>\n\t\t* {\n\t\t\tbox-sizing: border-box;\n\t\t}\n\n\t\tbody {\n\t\t\tmargin-top: 35px;\n\t\t}\n\n\t\t.thumbnail {\n\t\t\tposition: relative;\n\t\t\tdisplay: inline-block;\n\t\t\tvertical-align: top;\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t.dpr-info {\n\t\t\tposition: absolute;\n\t\t\ttop: 10px;\n\t\t\tleft: 10px;\n\t\t}\n\n\t\t.thumbnail img {\n\t\t\twidth: 100%;\n\t\t\theight: auto;\n\t\t}\n\n\t\t.label-optimum {\n\t\t\tposition: absolute;\n\t\t\tbottom: 10px;\n\t\t\tright: 10px;\n\t\t}\n\n\t\t.label-config {\n\t\t\tposition: fixed;\n\t\t\ttop: 20px;\n\t\t\tright: 10px;\n\t\t\tz-index: 99;\n\t\t\tfont-size: 120%;\n\t\t}\n\n\t</style>\n</head>\n<body>\n<!-- 4 : 7 : 6 -->\n<div class=\"alert alert-info alert-legend\">\n\t<p>The numbers on the top are the calculated resolutions for the image:</p>\n\t<p><span class=\"label label-success\">number in green</span> is the image selected. While <span class=\"label label-default\">number in gray</span> is the next lower and <span class=\"label label-danger\">number in red</span> is the next higher candidate.</p>\n\t<p>The image on the left side has the <code>data-optimumx</code> attribute attached, while the same image on the right side is always loaded with the full density.</p>\n</div>\n<div class=\"alert alert-info\">\n\t<p>As you will see with this demo. Some images do gain significant quality with retina, but some others don't. The standard HTML responsive image markup has no way to tell the browser about does differences, therefore the browser often can't make educated decisions. The optimumx plugin solves this by limiting the source canidates to reasonable ones.</p>\n</div>\n<table class=\"table table-condensed table-striped\">\n\t<thead>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t</thead>\n\t<tbody>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tdata-optimumx=\"2.5\"\n\t\t\t\t\t\t\tsrc=\"http://placehold.it/175x75\"\n\t\t\t\t\t\t\tdata-srcset=\"http://placehold.it/175x75 175w,\n\t\t\t\t\thttp://placehold.it/350x150 350w,\n\t\t\t\t\thttp://placehold.it/525x225 525w,\n\t\t\t\t\thttp://placehold.it/788x338 788w,\n\t\t\t\t\thttp://placehold.it/1182x507 1182w,\n\t\t\t\t\thttp://placehold.it/1773x761 1773w,\n\t\t\t\t\thttp://placehold.it/2659x1141 2659w\"\n\t\t\t\t\t\t\talt=\"Abandoned Boat\" />\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"http://placehold.it/175x75\"\n\t\t\t\t\t\t\tdata-srcset=\"http://placehold.it/175x75 175w,\n\t\t\t\thttp://placehold.it/350x150 350w,\n\t\t\t\thttp://placehold.it/525x225 525w,\n\t\t\t\thttp://placehold.it/788x338 788w,\n\t\t\t\thttp://placehold.it/1182x507 1182w,\n\t\t\t\thttp://placehold.it/1773x761 1773w,\n\t\t\t\thttp://placehold.it/2659x1141 2659w\"\n\t\t\t\t\t\t\talt=\"Abandoned Boat\" />\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm1.staticflickr.com/192/504251019_ffc94c77b5_n.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/192/504251019_ffc94c77b5_n.jpg 240w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5.jpg 375w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5_z.jpg 480w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5_b.jpg 768w,\nhttps://farm1.staticflickr.com/192/504251019_af1d042c1a_o.jpg 1944w\"\n\t\t\t\t\t\t\tdata-optimumx=\"1.3\"\n\t\t\t\t\t\t\talt=\"Windows on Istanbul\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm1.staticflickr.com/192/504251019_ffc94c77b5_n.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/192/504251019_ffc94c77b5_n.jpg 240w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5.jpg 375w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5_z.jpg 480w,\nhttps://farm1.staticflickr.com/192/504251019_ffc94c77b5_b.jpg 768w,\nhttps://farm1.staticflickr.com/192/504251019_af1d042c1a_o.jpg 1944w\"\n\t\t\t\t\t\t\talt=\"Windows on Istanbul\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm6.staticflickr.com/5139/5546134597_0b19627066_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5139/5546134597_0b19627066_m.jpg 240w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066_n.jpg 320w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066.jpg 500w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066_z.jpg 640w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066_b.jpg 1024w,\nhttps://farm6.staticflickr.com/5139/5546134597_82084e246c_o.jpg 2844w\"\n\t\t\t\t\t\t\tdata-optimumx=\"1.2\"\n\t\t\t\t\t\t\talt=\"Goldie Dawn\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm6.staticflickr.com/5139/5546134597_0b19627066_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5139/5546134597_0b19627066_m.jpg 240w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066_n.jpg 320w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066.jpg 500w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066_z.jpg 640w,\nhttps://farm6.staticflickr.com/5139/5546134597_0b19627066_b.jpg 1024w,\nhttps://farm6.staticflickr.com/5139/5546134597_82084e246c_o.jpg 2844w\"\n\t\t\t\t\t\t\talt=\"Goldie Dawn\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm5.staticflickr.com/4094/4859138371_9713d4396e_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm5.staticflickr.com/4094/4859138371_9713d4396e_m.jpg 240w,\nhttps://farm5.staticflickr.com/4094/4859138371_9713d4396e.jpg 500w,\nhttps://farm5.staticflickr.com/4094/4859138371_9713d4396e_b.jpg 1024w,\nhttps://farm5.staticflickr.com/4094/4859138371_9713d4396e_z.jpg 640w,\nhttps://farm5.staticflickr.com/4094/4859138371_9713d4396e_n.jpg 320w,\nhttps://farm5.staticflickr.com/4094/4859138371_a1b9081485_o.jpg 3648w\"\n\t\t\t\t\t\t\tdata-optimumx=\"1.4\"\n\t\t\t\t\t\t\talt=\"Abandoned Boat\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm5.staticflickr.com/4094/4859138371_9713d4396e_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm5.staticflickr.com/4094/4859138371_9713d4396e_m.jpg 240w,\nhttps://farm5.staticflickr.com/4094/4859138371_9713d4396e_n.jpg 320w,\nhttps://farm5.staticflickr.com/4094/4859138371_9713d4396e.jpg 500w,\nhttps://farm5.staticflickr.com/4094/4859138371_9713d4396e_z.jpg 640w,\nhttps://farm5.staticflickr.com/4094/4859138371_9713d4396e_b.jpg 1024w,\nhttps://farm5.staticflickr.com/4094/4859138371_a1b9081485_o.jpg 3648w\"\n\t\t\t\t\t\t\talt=\"Abandoned Boat\" />\n\t\t\t\t</div>\n\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_m.jpg 240w,\nhttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_n.jpg 320w,\nhttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8.jpg 500w,\nhttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_z.jpg 640w,\nhttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_c.jpg 800w,\nhttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_b.jpg 1024w,\nhttps://farm6.staticflickr.com/5531/9638435181_ecbab20fc0_h.jpg 1600w,\nhttps://farm6.staticflickr.com/5531/9638435181_9da37d35d4_k.jpg 2048w,\nhttps://farm6.staticflickr.com/5531/9638435181_6b5ed94330_o.jpg 3648w\"\n\t\t\t\t\t\t\tdata-optimumx=\"1.7\"\n\t\t\t\t\t\t\talt=\"Desert Road\" />\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_m.jpg 240w,\nhttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_n.jpg 320w,\nhttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8.jpg 500w,\nhttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_z.jpg 640w,\nhttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_c.jpg 800w,\nhttps://farm6.staticflickr.com/5531/9638435181_7e3e44c2b8_b.jpg 1024w,\nhttps://farm6.staticflickr.com/5531/9638435181_ecbab20fc0_h.jpg 1600w,\nhttps://farm6.staticflickr.com/5531/9638435181_9da37d35d4_k.jpg 2048w,\nhttps://farm6.staticflickr.com/5531/9638435181_6b5ed94330_o.jpg 3648w\"\n\t\t\t\t\t\t\talt=\"Desert Road\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm5.staticflickr.com/4078/5441060528_31db7838ba_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm5.staticflickr.com/4078/5441060528_31db7838ba_m.jpg 240w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_n.jpg 320w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba.jpg 500w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_z.jpg 640w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_b.jpg 1024w,\nhttps://farm5.staticflickr.com/4078/5441060528_b066ce464a_o.jpg 1932w\"\n\t\t\t\t\t\t\tdata-optimumx=\"1.4\"\n\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm5.staticflickr.com/4078/5441060528_31db7838ba_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm5.staticflickr.com/4078/5441060528_31db7838ba_m.jpg 240w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_n.jpg 320w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba.jpg 500w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_z.jpg 640w,\nhttps://farm5.staticflickr.com/4078/5441060528_31db7838ba_b.jpg 1024w,\nhttps://farm5.staticflickr.com/4078/5441060528_b066ce464a_o.jpg 1932w\"\n\t\t\t\t\t\t\talt=\"\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th>with <code>data-optimumx</code></th>\n\t\t\t<th>without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm9.staticflickr.com/8200/8248153196_7a7664e147_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm9.staticflickr.com/8200/8248153196_7a7664e147_m.jpg 240w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_n.jpg 320w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147.jpg 500w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_c.jpg 800w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_b.jpg 1024w,\nhttps://farm9.staticflickr.com/8200/8248153196_439515a267_h.jpg 1600w,\nhttps://farm9.staticflickr.com/8200/8248153196_891960c5f5_k.jpg 2048w,\nhttps://farm9.staticflickr.com/8200/8248153196_c259fd3d58_o.jpg 9910w\"\n\t\t\t\t\t\t\tdata-optimumx=\"1.5\"\n\t\t\t\t\t\t\talt=\"@ The Desert Tortoise Natural Area\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm9.staticflickr.com/8200/8248153196_7a7664e147_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm9.staticflickr.com/8200/8248153196_7a7664e147_m.jpg 240w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_n.jpg 320w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147.jpg 500w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_c.jpg 800w,\nhttps://farm9.staticflickr.com/8200/8248153196_7a7664e147_b.jpg 1024w,\nhttps://farm9.staticflickr.com/8200/8248153196_439515a267_h.jpg 1600w,\nhttps://farm9.staticflickr.com/8200/8248153196_891960c5f5_k.jpg 2048w,\nhttps://farm9.staticflickr.com/8200/8248153196_c259fd3d58_o.jpg 9910w\"\n\t\t\t\t\t\t\talt=\"@ The Desert Tortoise Natural Area\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm3.staticflickr.com/2401/2171553538_37d0a133da_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm3.staticflickr.com/2401/2171553538_37d0a133da_m.jpg 240w,\nhttps://farm3.staticflickr.com/2401/2171553538_37d0a133da.jpg 500w,\nhttps://farm3.staticflickr.com/2401/2171553538_37d0a133da_z.jpg?zz=1 640w\"\n\t\t\t\t\t\t\tdata-optimumx=\"1.7\"\n\t\t\t\t\t\t\talt=\"Borobudur\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm3.staticflickr.com/2401/2171553538_37d0a133da_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm3.staticflickr.com/2401/2171553538_37d0a133da_m.jpg 240w,\nhttps://farm3.staticflickr.com/2401/2171553538_37d0a133da.jpg 500w,\nhttps://farm3.staticflickr.com/2401/2171553538_37d0a133da_z.jpg?zz=1 640w\"\n\t\t\t\t\t\t\talt=\"Borobudur\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th>with <code>data-optimumx</code></th>\n\t\t\t<th>without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm1.staticflickr.com/17/92230866_713ae1eeef_n.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/17/92230866_713ae1eeef_n.jpg 240w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef.jpg 375w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef_z.jpg 480w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef_b.jpg 768w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef_o.jpg 1536w\"\n\t\t\t\t\t\t\tdata-optimumx=\"2\"\n\t\t\t\t\t\t\talt=\"A tree in the blue\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm1.staticflickr.com/17/92230866_713ae1eeef_n.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/17/92230866_713ae1eeef_n.jpg 240w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef.jpg 375w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef_z.jpg 480w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef_b.jpg 768w,\nhttps://farm1.staticflickr.com/17/92230866_713ae1eeef_o.jpg 1536w\"\n\t\t\t\t\t\t\talt=\"A tree in the blue\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th>with <code>data-optimumx</code></th>\n\t\t\t<th>without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm3.staticflickr.com/2377/1657712955_131576bcd8_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm3.staticflickr.com/2377/1657712955_131576bcd8_m.jpg 240w,\nhttps://farm3.staticflickr.com/2377/1657712955_131576bcd8.jpg 500w,\nhttps://farm3.staticflickr.com/2377/1657712955_131576bcd8_z.jpg?zz=1 640w,\nhttps://farm3.staticflickr.com/2377/1657712955_1b941645fd_o.jpg 800w\"\n\t\t\t\t\t\t\tdata-optimumx=\"1.7\"\n\t\t\t\t\t\t\talt=\"Sant Miquel del Fai\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm3.staticflickr.com/2377/1657712955_131576bcd8_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm3.staticflickr.com/2377/1657712955_131576bcd8_m.jpg 240w,\nhttps://farm3.staticflickr.com/2377/1657712955_131576bcd8.jpg 500w,\nhttps://farm3.staticflickr.com/2377/1657712955_131576bcd8_z.jpg?zz=1 640w,\nhttps://farm3.staticflickr.com/2377/1657712955_1b941645fd_o.jpg 800w\"\n\t\t\t\t\t\t\talt=\"Sant Miquel del Fai\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm3.staticflickr.com/2727/4393975099_c212622aa0_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm3.staticflickr.com/2727/4393975099_c212622aa0_m.jpg 240w,\nhttps://farm3.staticflickr.com/2727/4393975099_c212622aa0_n.jpg 320w,\nhttps://farm3.staticflickr.com/2727/4393975099_c212622aa0_z.jpg 640w,\nhttps://farm3.staticflickr.com/2727/4393975099_c212622aa0_b.jpg 1024w,\nhttps://farm3.staticflickr.com/2727/4393975099_4413ef4037_o.jpg 1600w\"\n\t\t\t\t\t\t\tdata-optimumx=\"1.5\"\n\t\t\t\t\t\t\talt=\"Avebury Stone Circle\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm3.staticflickr.com/2727/4393975099_c212622aa0_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm3.staticflickr.com/2727/4393975099_c212622aa0_m.jpg 240w,\nhttps://farm3.staticflickr.com/2727/4393975099_c212622aa0_n.jpg 320w,\nhttps://farm3.staticflickr.com/2727/4393975099_c212622aa0_z.jpg 640w,\nhttps://farm3.staticflickr.com/2727/4393975099_c212622aa0_b.jpg 1024w,\nhttps://farm3.staticflickr.com/2727/4393975099_4413ef4037_o.jpg 1600w\"\n\t\t\t\t\t\t\talt=\"Avebury Stone Circle\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34_m.jpg 240w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_n.jpg 320w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34.jpg 500w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_z.jpg 640w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_b.jpg 1024w,\nhttps://farm4.staticflickr.com/3059/2835191823_c3bdbcbbee_o.jpg 3028w\"\n\t\t\t\t\t\t\tdata-optimumx=\"1.4\"\n\t\t\t\t\t\t\talt=\"el castil de tierra\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm4.staticflickr.com/3059/2835191823_e3636abb34_m.jpg 240w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_n.jpg 320w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34.jpg 500w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_z.jpg 640w,\nhttps://farm4.staticflickr.com/3059/2835191823_e3636abb34_b.jpg 1024w,\nhttps://farm4.staticflickr.com/3059/2835191823_c3bdbcbbee_o.jpg 3028w\"\n\t\t\t\t\t\t\talt=\"el castil de tierra\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm8.staticflickr.com/7356/11122919374_55294abec3_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm8.staticflickr.com/7356/11122919374_55294abec3_m.jpg 240w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3_n.jpg 320w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3.jpg 500w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3_z.jpg 640w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3_c.jpg 800w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3_b.jpg 1024w,\nhttps://farm8.staticflickr.com/7356/11122919374_dba478083f_h.jpg 1600w,\nhttps://farm8.staticflickr.com/7356/11122919374_237fb819f1_k.jpg 2048w,\nhttps://farm8.staticflickr.com/7356/11122919374_58ccd9e84c_o.jpg 3294w\"\n\t\t\t\t\t\t\tdata-optimumx=\"1.3\"\n\t\t\t\t\t\t\talt=\"sunset\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\n\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm8.staticflickr.com/7356/11122919374_55294abec3_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm8.staticflickr.com/7356/11122919374_55294abec3_m.jpg 240w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3_n.jpg 320w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3.jpg 500w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3_z.jpg 640w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3_c.jpg 800w,\nhttps://farm8.staticflickr.com/7356/11122919374_55294abec3_b.jpg 1024w,\nhttps://farm8.staticflickr.com/7356/11122919374_dba478083f_h.jpg 1600w,\nhttps://farm8.staticflickr.com/7356/11122919374_237fb819f1_k.jpg 2048w,\nhttps://farm8.staticflickr.com/7356/11122919374_58ccd9e84c_o.jpg 3294w\"\n\t\t\t\t\t\t\talt=\"sunset\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_m.jpg 240w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_n.jpg 320w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc.jpg 500w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_z.jpg 640w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_c.jpg 800w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_b.jpg 1024w,\nhttps://farm6.staticflickr.com/5506/11122805655_2992b75835_h.jpg 1600w,\nhttps://farm6.staticflickr.com/5506/11122805655_a6418efdc5_k.jpg 2048w,\nhttps://farm6.staticflickr.com/5506/11122805655_c2bf7d14ea_o.jpg 3008w\"\n\t\t\t\t\t\t\tdata-optimumx=\"2.2\"\n\t\t\t\t\t\t\talt=\"Sky and earth\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_m.jpg 240w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_n.jpg 320w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc.jpg 500w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_z.jpg 640w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_c.jpg 800w,\nhttps://farm6.staticflickr.com/5506/11122805655_e63cb3a9fc_b.jpg 1024w,\nhttps://farm6.staticflickr.com/5506/11122805655_2992b75835_h.jpg 1600w,\nhttps://farm6.staticflickr.com/5506/11122805655_a6418efdc5_k.jpg 2048w,\nhttps://farm6.staticflickr.com/5506/11122805655_c2bf7d14ea_o.jpg 3008w\"\n\t\t\t\t\t\t\talt=\"Sky and earth\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_n.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_n.jpg 240w,\nhttps://farm4.staticflickr.com/3023/2994603808_a3036a3cdf.jpg 375w,\nhttps://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_z.jpg 480w,\nhttps://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_b.jpg 768w,\nhttps://farm4.staticflickr.com/3023/2994603808_8ac98ed34d_o.jpg 3648w\"\n\t\t\t\t\t\t\tdata-optimumx=\"1.4\"\n\t\t\t\t\t\t\talt=\"Missing Ulsoor lake (Explore)\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_n.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_n.jpg 240w,\nhttps://farm4.staticflickr.com/3023/2994603808_a3036a3cdf.jpg 375w,\nhttps://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_z.jpg 480w,\nhttps://farm4.staticflickr.com/3023/2994603808_a3036a3cdf_b.jpg 768w,\nhttps://farm4.staticflickr.com/3023/2994603808_8ac98ed34d_o.jpg 3648w\"\n\t\t\t\t\t\t\talt=\"Missing Ulsoor lake (Explore)\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_n.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_n.jpg 227w,\nhttps://farm7.staticflickr.com/6211/6254520191_c7868f3a5d.jpg 354w,\nhttps://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_z.jpg 453w,\nhttps://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_b.jpg 725w,\nhttps://farm7.staticflickr.com/6211/6254520191_6878432c01_o.jpg 3407w\"\n\t\t\t\t\t\t\tdata-optimumx=\"1.5\"\n\t\t\t\t\t\t\talt=\"Oxford Path 2\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_n.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_n.jpg 227w,\nhttps://farm7.staticflickr.com/6211/6254520191_c7868f3a5d.jpg 354w,\nhttps://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_z.jpg 453w,\nhttps://farm7.staticflickr.com/6211/6254520191_c7868f3a5d_b.jpg 725w,\nhttps://farm7.staticflickr.com/6211/6254520191_6878432c01_o.jpg 3407w\"\n\t\t\t\t\t\t\talt=\"Oxford Path 2\" />\n\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th style=\"width: 50%;\">with <code>data-optimumx</code></th>\n\t\t\t<th style=\"width: 50%;\">without <code>data-optimumx</code></th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload optimumx\"\n\t\t\t\t\t\t\tsrc=\"https://farm1.staticflickr.com/113/284651694_69e63b374d_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/113/284651694_69e63b374d_m.jpg 240w,\nhttps://farm1.staticflickr.com/113/284651694_69e63b374d.jpg 500w,\nhttps://farm1.staticflickr.com/113/284651694_69e63b374d_z.jpg?zz=1 640w,\nhttps://farm1.staticflickr.com/113/284651694_69e63b374d_o.jpg 800w\"\n\t\t\t\t\t\t\tdata-optimumx=\"2\"\n\t\t\t\t\t\t\talt=\"Woman in water\" />\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t\t<td>\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\tsrc=\"https://farm1.staticflickr.com/113/284651694_69e63b374d_m.jpg\"\n\t\t\t\t\t\t\tdata-srcset=\"https://farm1.staticflickr.com/113/284651694_69e63b374d_m.jpg 240w,\nhttps://farm1.staticflickr.com/113/284651694_69e63b374d.jpg 500w,\nhttps://farm1.staticflickr.com/113/284651694_69e63b374d_z.jpg?zz=1 640w,\nhttps://farm1.staticflickr.com/113/284651694_69e63b374d_o.jpg 800w\"\n\t\t\t\t\t\t\talt=\"Woman in water\" />\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t</tbody>\n</table>\n\n\n\n\n\n\n\n\n\n<script src=\"https://afarkas.github.io/respimage/respimage.min.js\"></script>\n\n<script src=\"//code.jquery.com/jquery-1.11.1.min.js\"></script>\n<script>\n\tvar params = {};\n\t(function(){\n\n\t\tlocation.search.replace(/^\\?/, '').split('&').forEach(function(param){\n\t\t\tparam = param.split('=');\n\t\t\tparams[param[0]] = param[1] || '';\n\t\t});\n\t\tArray.prototype.slice.call(document.querySelectorAll('img[data-sizes=\"auto\"].optimumx')).forEach(function(elem){\n\t\t\tvar optimum = elem.getAttribute('data-optimumx') || 3;\n\t\t\t$(elem).after('<strong class=\"label label-success label-optimum\">image specific optimum: '+ optimum +'</strong>');\n\n\t\t});\n\n\t\tif(params.optimumx){\n\t\t\tArray.prototype.slice.call(document.querySelectorAll('img[data-sizes=\"auto\"].optimumx')).forEach(function(elem){\n\t\t\t\telem.setAttribute('data-optimumx', params.optimumx);\n\t\t\t});\n\t\t}\n\n\t\tfunction ascendingSort( a, b ) {\n\t\t\treturn a.w - b.w;\n\t\t}\n\n\t\tfunction mapSetCan(can){\n\t\t\tvar nCan = {\n\t\t\t\turl: can.url\n\t\t\t};\n\t\t\tnCan[can.desc.type] = can.desc.val;\n\t\t\treturn nCan;\n\t\t}\n\n\t\tArray.prototype.slice.call(document.querySelectorAll('img[data-srcset]')).forEach(function(elem){\n\t\t\tvar lazyData = {srcset: elem.getAttribute('data-srcset')} || '';\n\t\t\tvar cands = respimage._.parseSet(lazyData);\n\n\t\t\telem._demoSrcset = lazyData;\n\n\t\t\tif(cands[0] && cands[0].desc){\n\t\t\t\tcands = cands.map(mapSetCan);\n\t\t\t\tlazyData.cands = cands;\n\t\t\t}\n\n\t\t\tcands.sort(ascendingSort);\n\t\t});\n\t})();\n</script>\n<script>\n\twindow.lazySizesConfig = window.lazySizesConfig || {};\n\twindow.lazySizesConfig.loadMode = 1;\n</script>\n<script src=\"../lazysizes.min.js\"></script>\n<script src=\"../plugins/optimumx/ls.optimumx.min.js\"></script>\n<script>\n\n\t(function(){\n\n\t\tvar dpr = (window.devicePixelRatio || 1);\n\t\tvar max = params.optimumx || 'image specific optimum';\n\t\tvar calcDpr = Math.min(dpr, max) || params.optimumx == 'auto' ? 'what the default <code>getOptimumX</code></code> callback returns' : 'image specific';\n\t\t$('<div class=\"alert alert-info\"><p>Your device has a pixel ratio of '+ dpr +', ' +\n\t\t'while <code>data-optimumx=\"'+ max +'\"</code> is set.</p>' +\n\t\t'<p>This means images should be around a pixel density of \"'+ calcDpr +'\".</p></div>')\n\t\t\t\t.insertAfter('.alert-legend');\n\n\t\t$('body').before('<strong class=\"label label-default label-config\">Used optimumx option: '+max+'</strong>');\n\n\t})();\n\t(function(){\n\t\tvar timer;\n\t\tvar _ = window.respimage._;\n\t\tvar dpr = _.DPR;\n\t\tvar showdpr = function(){\n\t\t\tvar beforeCandidate, afterCandidate, curCandidate, can, curRes, size;\n\t\t\tvar info = '<div class=\"dpr-info\">';\n\t\t\tvar img = this;\n\t\t\tvar imgData = this._demoSrcset;\n\t\t\tvar curSrc = this.currentSrc || this.src;\n\n\t\t\tif(!imgData || !curSrc){return;}\n\t\t\tbeforeCandidate = '<strong class=\"label label-default\">--</strong>';\n\t\t\tafterCandidate = '<strong class=\"label label-danger\">--</strong>';\n\t\t\tcurCandidate = '<strong class=\"label label-success\">--</strong>';\n\t\t\tsize = '';\n\n\t\t\tfor(var i = 0; i < imgData.cands.length; i++){\n\t\t\t\tcan = imgData.cands[i];\n\t\t\t\tif(can.url == curSrc){\n\t\t\t\t\tcurRes = Math.floor((can.w / this.offsetWidth) * 1000) / 1000;\n\n\t\t\t\t\tcurCandidate = '<strong class=\"label label-success\">'+ curRes +'x</strong>';\n\t\t\t\t\tcan = imgData.cands[i - 1];\n\t\t\t\t\tif(can){\n\t\t\t\t\t\tbeforeCandidate = '<strong class=\"label label-default\">'+ (Math.floor((can.w / this.offsetWidth) * 1000) / 1000) +'x</strong>';\n\t\t\t\t\t}\n\t\t\t\t\tcan = imgData.cands[i + 1];\n\t\t\t\t\tif(can){\n\t\t\t\t\t\tafterCandidate = '<strong class=\"label label-danger\">'+ (Math.floor((can.w / this.offsetWidth) * 1000) / 1000) +'x</strong>';\n\t\t\t\t\t}\n\n\t\t\t\t\tsize = '<br /><strong class=\"label label-danger\">Estimated file size: '+ Math.round(this.offsetWidth * this.offsetHeight * Math.pow(curRes, 2) / 1500) +'kb</strong>';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinfo += beforeCandidate +' '+ curCandidate +' ' + afterCandidate + size;\n\n\t\t\tinfo += '</div>';\n\t\t\t$(img)\n\t\t\t\t\t.parent()\n\t\t\t\t\t.find('.dpr-info')\n\t\t\t\t\t.remove()\n\t\t\t\t\t.end()\n\t\t\t\t\t.append(info)\n\t\t\t;\n\t\t};\n\n\t\tvar showDprs = function(){\n\t\t\t$('img').each(showdpr);\n\t\t};\n\t\tvar tShowDprs = function(){\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = setTimeout(showDprs, 300);\n\t\t};\n\t\tdocument.addEventListener('load', tShowDprs, true);\n\t\twindow.addEventListener('resize', tShowDprs);\n\t})();\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "optimumx/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n\t<meta charset=\"UTF-8\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n\t<title>controlling retina/density of responsive images with lazysizes and the optimumx plugin</title>\n\t<link href=\"../assets/css/tidy.css\" rel=\"stylesheet\" />\n\t<style>\n\t\t.container {\n\t\t\tmax-width: 1200px;\n\t\t\tmin-width: 320px;\n\t\t\tmargin: auto;\n\t\t\tpadding: 10px;\n\t\t}\n\t\t#arena {\n\t\t\tdisplay: block;\n\t\t\tmargin: auto;\n\t\t\tborder: 1px solid #000;\n\t\t\twidth: 75%;\n\t\t\theight: 720px;\n\t\t\tresize: both;\n\t\t}\n\n\t\tform .row {\n\t\t\tmargin-bottom: 15px;\n\t\t}\n\t\t.alert-noretina {\n\t\t\tdisplay: none;\n\t\t}\n\t\t.no-retina .alert-noretina {\n\t\t\tdisplay: block;\n\t\t}\n\t</style>\n\t<script src=\"//code.jquery.com/jquery-1.11.1.min.js\"></script>\n\t<script src=\"//afarkas.github.io/webshim/js-webshim/minified/polyfiller.js\"></script>\n\n\t<script src=\"js/parent.js\"></script>\n</head>\n<body>\n\n<div class=\"container\">\n\t<div class=\"alert alert-info\">\n\t\t<p>The <code>srcset</code> with the <code>sizes</code> attribute is definitely the way to go to create responsive, flexibel, adaptive images.</p>\n\t\t<p>Unfortunately there is no way to tell the browser, that a specific image doesn't gain much perceived quality with a higher density or that image quality of a specific image isn't important for the user experience.</p>\n\t\t<p>Due to the fact, that a 2x retina means 4x data and 3x retina means 9x data, performance can suffer even on good connections badly.</p>\n\t\t<p><a href=\"https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins/optimumx\">lazySizes <code>data-optimumx</code> feature</a> (build on top of <code>data-sizes=\"auto\"</code>) gives the developer more control to use adaptive images markup, but opt-out from to high retina at some point by defining the optimum density.</p>\n\t</div>\n\t<div class=\"alert alert-danger alert-noretina\">\n\t\t<p>Unfortunately this demo makes only sense, if you are using a retina device. Maybe come back with one (tablet / smartphone)? Sorry!</p>\n\t</div>\n\t<div class=\"panel panel-default\">\n\t\t<div class=\"panel-heading\">Configure the <code>data-optimumx</code> attribute</div>\n\t\t<div class=\"panel-body\">\n\t\t\t<form role=\"form\" class=\"arena-config show-activelabeltooltip\">\n\t\t\t\t<fieldset>\n\t\t\t\t\t<legend><code>data-optimumx</code></legend>\n\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t\t\t\t\t<label for=\"optimumx\">optimumx</label>\n\t\t\t\t\t\t\t\t<input id=\"optimumx\" name=\"optimumx\" value=\"1.5\" min=\"1\" max=\"1.9\" step=\"0.1\" type=\"range\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t</fieldset>\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"form-group start-buttons\">\n\t\t\t\t\t\t<div class=\"col-sm-4\">\n\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\">load config</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"col-sm-4\">\n\t\t\t\t\t\t\t<button type=\"button\" class=\"btn btn-primary btn-optimum\">load image specific</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"col-sm-4\">\n\t\t\t\t\t\t\t<button type=\"button\" class=\"btn btn-primary btn-auto\">load with \"auto\" value</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t\t\t\t<label for=\"viewport\">viewport width</label>\n\t\t\t\t\t\t\t<input id=\"viewport\" value=\"75\" min=\"50\" max=\"100\" step=\"1\" type=\"range\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t\t\t\t<div class=\"checkbox\">\n\t\t\t\t\t\t\t\t<label>\n\t\t\t\t\t\t\t\t\t<input id=\"vw-input\" type=\"checkbox\" checked=\"\"> oninput / onchange\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p class=\"help-block\">Wether viewport should be changed while dragging (input/checked) or on drag release (change/unchecked).</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</div>\n\t</div>\n\n\t<iframe id=\"arena\"></iframe>\n</div>\n\n</body>\n</html>\n"
  },
  {
    "path": "optimumx/js/parent.js",
    "content": "(function(window, document){\n\n\tif ( window.HTMLPictureElement ) {\n\t\t$('html').addClass('resp-supported');\n\t}\n\n\tif ( (window.devicePixelRatio || 1) < 1.4 ) {\n\t\t$('html').addClass('no-retina');\n\t}\n\n\twebshim.setOptions('forms-ext', {\n\t\treplaceUI: 'auto'\n\t});\n\n\n\twebshim.polyfill('forms forms-ext');\n\n\n\t$(function(){\n\t\tvar oninput;\n\n\t\t$('#vw-input')\n\t\t\t.on('change.smooth-vwchange', function(){\n\t\t\t\toninput = $.prop(this, 'checked');\n\t\t\t})\n\t\t\t.trigger('change.smooth-vwchange')\n\t\t;\n\t\t$('#viewport').each(function(){\n\t\t\tvar onChange = function(e){\n\t\t\t\tif (!e || (oninput && e.type == 'input') || (e.type == 'change' && !oninput)){\n\t\t\t\t\tvar val = $(this).val();\n\t\t\t\t\t$('#arena').width(val+'%');\n\t\t\t\t}\n\t\t\t};\n\t\t\t$(this).on('input change', onChange).each(onChange);\n\t\t});\n\t\t$('#arena').removeAttr('src').prop('src', 'javascript:false');\n\n\n\n\t\t$('.arena-config')\n\t\t\t.on('submit', function(){\n\t\t\t\tvar data = $(this).serialize();\n\t\t\t\t$('#arena').prop('src', 'child.html?' + data);\n\t\t\t\treturn false;\n\t\t\t})\n\t\t;\n\n\t\t$('.btn-optimum').on('click', function(){\n\t\t\t$('#arena').prop('src', 'child.html?'+ (new Date().getTime()));\n\t\t\treturn false;\n\t\t});\n\t\t$('.btn-auto').on('click', function(){\n\t\t\t$('#arena').prop('src', 'child.html?optimumx=auto');\n\t\t\treturn false;\n\t\t});\n\t\t$('#arena').prop('src', 'child.html');\n\t})\n\n})(window, document);\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"lazysizes\",\n  \"version\": \"5.3.2\",\n  \"filename\": \"lazysizes.min.js\",\n  \"license\": \"MIT\",\n  \"author\": \"Alexander Farkas <alex@boffinhouse.com>\",\n  \"scripts\": {\n\t\t\"build\": \"grunt && tsc && grunt importTs\",\n    \"prepublishOnly\": \"npm run build\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/aFarkas/lazysizes.git\"\n  },\n  \"namespace\": \"lazySizes\",\n  \"main\": \"lazysizes.js\",\n  \"browser\": \"lazysizes.js\",\n  \"types\": \"lazysizes.d.ts\",\n  \"devDependencies\": {\n    \"grunt\": \"~1.1.0\",\n    \"grunt-bytesize\": \"~0.2.0\",\n    \"grunt-cli\": \"~1.3\",\n    \"grunt-contrib-jshint\": \"^2.1.0\",\n    \"grunt-contrib-qunit\": \"^3.1.0\",\n    \"grunt-contrib-uglify\": \"^4.0.1\",\n    \"grunt-contrib-watch\": \"~1.1.0\",\n    \"grunt-max-filesize\": \"^0.1.1\",\n    \"grunt-uncss\": \"~0.9.1\",\n    \"jquery\": \"^3.5.1\",\n    \"jquery-deparam\": \"^0.5.3\",\n    \"picturefill\": \"^3.0.3\",\n    \"qunitjs\": \"^2.4.1\",\n    \"respimage\": \"^1.4.2\",\n    \"typescript\": \"^4.1.5\"\n  },\n  \"npmName\": \"lazysizes\",\n  \"npmFileMap\": [\n    {\n      \"basePath\": \"\",\n      \"files\": [\n        \"lazysizes.min.js\",\n        \"plugins/**/*.min.js\"\n      ]\n    }\n  ],\n  \"description\": \"High performance (jankfree) lazy loader for images (including responsive images), iframes and scripts (widgets).\",\n  \"keywords\": [\n    \"lazy\",\n    \"loader\",\n    \"lazyloader\",\n    \"lazyload\",\n    \"lazySizes\",\n    \"performance\",\n    \"responsive\",\n    \"image\",\n    \"images\",\n    \"responsive images\",\n    \"picture\",\n    \"srcset\",\n    \"respimg\",\n    \"respimage\",\n    \"include\",\n    \"ajax\",\n    \"img\",\n    \"imager\",\n    \"imager.js\",\n    \"picturefill\",\n    \"component\"\n  ]\n}\n"
  },
  {
    "path": "plugins/README.md",
    "content": "# lazysizes plugins/extensions/snippets\n\n**lazysizes** works out of the box with standard and responsive images (``src``, ``srcset`` and ``picture``) and iframes.\n\nThe scripts in this folder can be used as extensions or as boilerplate snippets to extend and adjust lazysizes to your needs. \n"
  },
  {
    "path": "plugins/artdirect/README.md",
    "content": "# lazysizes artdirect extension\n\nThe artdirect extension allows you to fully control art direction through your CSS. This is accomplished by two techniques which you can be used separately or combined. The extension hooks into the `data-sizes=\"auto\"` feature.\n\nThe first feature is by tagging and the second feature uses the information of the displayed aspect ratio of the `img` elements and the physical aspect ratio of your images.\n\n## Enabling artdirect extension for a ``picture > img``\n\nYou can either enable the artdirect extension for all images using JavaScript:\n\n```js\n// never try to import *.min.js files \nimport lazySizes from 'lazysizes';\nimport 'lazysizes/plugins/artdiect/ls.artdirect';\n\nlazySizes.cfg.autoArtDirect = true;\n```\n\nOr for a specific `img` element using CSS:\n\n```css\npicture > img.is-autoartdirect {\n\tfont-family: \"artdirect\";\n}\n```\n\n## Tagging `source` elements and controlling it via CSS\n\nYou can use a whitespace separated list of tags on the `source` elements `data-tag` attribute as also a whitespace separated list of tags inside of the CSS `font-family`:\n\n```html\n<style>\n\tpicture > img.is-autoartdirect {\n    \tfont-family: \"artdirect: tag-default\";\n    }\n    \n    @media (max-width: 960px) {\n    \tpicture > img.is-autoartdirect {\n        \tfont-family: \"artdirect: tag-cropped\";\n        }\n    }\n</style>\n\n<picture>\n\t<source\n\t\tdata-srcset=\"http://placehold.it/500x600/11e87f/fff\"\n\t\tdata-tag=\"tag-default\" />\n\t<source\n\t\tdata-srcset=\"http://placehold.it/300x300\"\n\t\tdata-tag=\"tag-cropped\" />\n    <img\n\n        data-src=\"http://placehold.it/500x600/11e87f/fff\"\n        class=\"lazyload\"\n        data-sizes=\"auto\"\n        alt=\"image with artdirection\" />\n</picture>\n```\n\n## Providing aspect ratio information of physical images\n\nBy providing the specific layout height and width (no `auto` values) through CSS and providing the physical aspect ratio of the images through either a `data-aspectratio` attribute or through `w` **and**`h` descriptors or through `width` and `height` content attributes the plugin can choose the best image source.\n\n```html\n<style>\n\tpicture > img.is-autoartdirect {\n\t\tdisplay: block;\n\t\theight: 200px;\n\t\tmax-height: 60vh;\n\t\twidth: 100%;\n\t\tobject-fit: cover;\n    \tfont-family: \"artdirect\", \"object-fit: cover\";\n    }\n    \n    \n</style>\n\n<picture>\n\t<source\n\t\tdata-srcset=\"http://placehold.it/500x600/11e87f/fff\"\n\t\tdata-aspectratio=\"0.834\"\n\t/>\n\t<source\n\t\tdata-srcset=\"http://placehold.it/700x300\"\n\t\tdata-aspectratio=\"2.34\"\n\t />\n    <img\n\n        data-src=\"http://placehold.it/500x600/11e87f/fff\"\n        class=\"lazyload\"\n        data-sizes=\"auto\"\n        alt=\"image with artdirection\" />\n</picture>\n```\n\nThe aspect ratio feature can be perfectly combined with the tagging feature.\n\n```html\n<style>\n\tpicture > img.is-autoartdirect {\n\t\tdisplay: block;\n\t\theight: 200px;\n\t\tmax-height: 60vh;\n\t\twidth: 100%;\n\t\tobject-fit: cover;\n    \tfont-family: \"artdirect\", \"object-fit: cover\";\n    }\n    \n    @media (max-width: 1100px) {\n    \tfont-family: \"artdirect: tag-foo tag-baz\", \"object-fit: cover\";\n    }\n</style>\n\n<picture>\n\t<source\n\t\tdata-srcset=\"http://placehold.it/500x600/11e87f/fff\"\n\t\tdata-aspectratio=\"0.834\"\n\t\tdata-tag=\"tag-foo\"\n\t/>\n\t<source\n\t\tdata-srcset=\"http://placehold.it/1400x600/e8117f/fff 1400w 600h\"\n\t\tdata-aspectratio=\"0.834\"\n\t/>\n\t<source\n\t\tdata-srcset=\"http://placehold.it/700x300\"\n\t\tdata-aspectratio=\"2.34\"\n\t\tdata-tag=\"tag-baz tag-foobar\"\n\t />\n    <img\n\n        data-src=\"http://placehold.it/500x600/11e87f/fff\"\n        class=\"lazyload\"\n        data-sizes=\"auto\"\n        alt=\"image with artdirection\" />\n</picture>\n```\n\n \n"
  },
  {
    "path": "plugins/artdirect/ls.artdirect.js",
    "content": "(function(window, factory) {\n\tif (!window) {return;}\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes) {\n\t'use strict';\n\n\tif(!window.addEventListener){return;}\n\tvar lazySizesConfig = lazySizes.cfg;\n\n\tvar  ElementPrototype = (window.Element || Node || window.HTMLElement).prototype;\n\tvar regArtDirect = /artdirect/;\n\tvar regDescriptors = /\\s+(\\d+)(w|h)\\s+(\\d+)(w|h)/;\n\tvar regArtDirectTags = /artdirect[\"']*\\s*:\\s*[\"']*(.+?)(?=($|'|\"|;))/;\n\tvar regPicture = /^picture$/i;\n\tvar regSplit = /[\\s,]+/g;\n\tvar slice = [].slice;\n\n\tfunction getCandidatesAspectRatio(element){\n\t\tvar match, width, height;\n\t\tvar ratio = parseFloat(element.getAttribute('data-aspectratio'));\n\t\tvar srcset = element.getAttribute(lazySizesConfig.srcsetAttr) || element.getAttribute('srcset');\n\n\n\t\tif(!ratio){\n\t\t\tmatch = srcset.match(regDescriptors);\n\n\t\t\tif (match) {\n\t\t\t\tif(match[2] == 'w'){\n\t\t\t\t\twidth = match[1];\n\t\t\t\t\theight = match[3];\n\t\t\t\t} else {\n\t\t\t\t\twidth = match[3];\n\t\t\t\t\theight = match[1];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twidth = element.getAttribute('width');\n\t\t\t\theight = element.getAttribute('height');\n\t\t\t}\n\n\t\t\tratio = width / height;\n\t\t}\n\n\t\treturn ratio;\n\t}\n\n\tfunction getLayoutAspectRatio(element){\n\t\treturn element.offsetWidth / element.offsetHeight;\n\t}\n\n\tfunction toTagSelector(tag){\n\t\treturn 'source[data-tag~=\"' + tag + '\"]';\n\t}\n\n\tfunction getArtDirectConfig(img){\n\t\tvar picture = img.parentNode;\n\t\tvar isPicture = regPicture.test(picture.nodeName || '');\n\t\tvar content = (window.getComputedStyle(img) || {}).fontFamily;\n\t\tvar config = null;\n\n\t\tif(isPicture && (lazySizesConfig.autoArtDirect || regArtDirect.test(content || ''))){\n\t\t\tconfig = {\n\t\t\t\tpicture: picture,\n\t\t\t\timg: img,\n\t\t\t\ttags: content.match(regArtDirectTags)\n\t\t\t};\n\n\t\t\tif(config.tags){\n\t\t\t\tconfig.selector = config.tags[1].split(regSplit).map(toTagSelector).join(',');\n\t\t\t}\n\t\t}\n\n\t\treturn config;\n\t}\n\n\tfunction toSourceObj(source){\n\t\tvar media = source.getAttribute('media');\n\n\t\treturn {\n\t\t\tsource: source,\n\t\t\taspectRatio: getCandidatesAspectRatio(source),\n\t\t\tisSelected: !media || window.matchMedia(media).matches,\n\t\t};\n\t}\n\n\tfunction sortAspectRatio(source1, source2){\n\t\treturn source1.aspectRatio < source2.aspectRatio;\n\t}\n\n\tfunction getClosestSource(sources, aspecRatio){\n\t\tvar i, len;\n\t\tvar closest = sources[0];\n\n\t\tfor(i = 1, len = sources.length; i < len; i++){\n\t\t\tif(Math.abs(closest.aspectRatio - aspecRatio) > Math.abs(sources[i].aspectRatio - aspecRatio)){\n\t\t\t\tclosest = sources[i];\n\t\t\t}\n\t\t}\n\n\t\treturn closest;\n\t}\n\n\tfunction setMedia(source, media){\n\t\tsource._lsMedia = media;\n\t\tlazySizes.rAF(function(){\n\t\t\tif(source._lsMedia){\n\t\t\t\tdelete source._lsMedia;\n\t\t\t}\n\t\t\tsource.setAttribute('media', media);\n\t\t});\n\t}\n\n\tfunction selectSource(imgCfg){\n\t\tvar imgAspectRatio = getLayoutAspectRatio(imgCfg.img);\n\t\tvar sources = slice.call(imgCfg.picture.getElementsByTagName('source'))\n\t\t\t.map(toSourceObj)\n\t\t\t.sort(sortAspectRatio)\n\t\t;\n\t\tvar matchedSources = imgCfg.selector ?\n\t\t\tsources.filter(function(source){\n\t\t\t\treturn source.source.matches(imgCfg.selector);\n\t\t\t}) :\n\t\t\tsources\n\t\t;\n\t\tvar closestSource = getClosestSource(matchedSources, imgAspectRatio);\n\n\t\tif(!closestSource.isSelected){\n\t\t\tsetMedia(closestSource.source, '(min-width: 1px)');\n\t\t}\n\n\t\tsources\n\t\t\t.filter(function(source){\n\t\t\t\treturn (source != closestSource && source.isSelected);\n\t\t\t})\n\t\t\t.forEach(function (source) {\n\t\t\t\tsetMedia(source.source, '(x)');\n\t\t\t})\n\t\t;\n\t}\n\n\tfunction addAutoArtDirection(e){\n\n\t\tif(e.detail.instance != lazySizes){return;}\n\n\t\tvar img = e.target;\n\t\tvar imgCfg = getArtDirectConfig(img);\n\n\t\tif(imgCfg){\n\t\t\tselectSource(imgCfg);\n\t\t}\n\t}\n\n\tif(!ElementPrototype.matches){\n\t\tElementPrototype.matches = ElementPrototype.matchesSelector ||\n\t\t\tElementPrototype.webkitMatchesSelector ||\n\t\t\tElementPrototype.msMatchesSelector ||\n\t\t\tElementPrototype.oMatchesSelector;\n\t}\n\n\twindow.addEventListener('lazybeforesizes', addAutoArtDirection, true);\n}));\n"
  },
  {
    "path": "plugins/aspectratio/README.md",
    "content": "# lazysizes aspectratio extension\n\nThis plugin helps to pre-occupy the space needed for an image by calculating the height from the image width or the width from the height (This means the width or height has to be calculable before the image is loaded). This can serve as an alternative to the different CSS intrinsic ratio patterns.\n\nNote: The CSS patterns are recommended, but especially in case of different ratio's for art directed images not so convenient. This plugin removes the ``data-aspectratio`` attribute after processing each image and my not play well with other plugins that rely on this attribute.\n\n## Markup API:\n\nThe value of the ``data-aspectratio`` has to be defined as the *width* divided by the *height*  of the image and can be represented as a ratio or a floating point number.\n\nExample values for an image with a width of 400 and a height of 200 (all mean the same): ``\"400/200\"``, ``\"4/2\"``, ``\"2/1\"``, ``\"2\"``, ``\"2.0\"``\n\n```html\n<img\n\tdata-sizes=\"auto\"\n    src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n    data-aspectratio=\"2/1\"\n\tdata-srcset=\"http://lorempixel.com/400/200/people/1/ 400w,\n    http://lorempixel.com/600/300/people/1/ 600w,\n    http://lorempixel.com/800/400/people/1/ 800w\" class=\"lazyload\" />\n\n<picture>\n\t<!--[if IE 9]><video style=\"display: none;\"><![endif]-->\n\t<source\n\t\tdata-srcset=\"http://placehold.it/500x600/11e87f/fff\"\n\t\tdata-aspectratio=\"5/6\"\n\t\tmedia=\"--small\" />\n\t<source\n\t\tdata-srcset=\"http://placehold.it/700x300\"\n\t\tdata-aspectratio=\"700/300\"\n\t\tmedia=\"--medium\" />\n\t<source\n\t\tdata-srcset=\"http://placehold.it/1400x600/e8117f/fff\"\n\t\tdata-aspectratio=\"14/6\"\n\t\tmedia=\"--large\" />\n\t<source\n        data-srcset=\"http://placehold.it/1800x900/117fe8/fff\"\n\t\tdata-aspectratio=\"2\" />\n    <!--[if IE 9]></video><![endif]-->\n    <!-- note: the img element always has to have data-apsectratio attribute, even if it is using a dummy/placeholder image -->\n    <img\n        src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n        class=\"lazyload\"\n\t\tdata-aspectratio=\"\"\n        alt=\"image with artdirection\"\n        style=\"width: 100%;\" />\n</picture>\n```\n\n## JS API\n\nIn case new elements are added to the DOM the global ``imageRatio.processImages`` method can be used. The method takes either an element representing the container/wrapper of the new elements or a list of image elements:\n\n```js\nimageRatio.processImages(document.querySelector('#dynaimc-wrapper');\nimageRatio.processImages(document.querySelectorAll('#dynaimc-wrapper img[data-aspectratio]');\n```\n\nIn case jQuery, ZEPTO, shoestring or another jQuery-like library is used the ``imageRatio`` plugin is added also:\n\n```js\n$('.dynamic-wrapper').imageRatio();\n$('.dynamic-wrapper img[data-aspectratio]').imageRatio();\n```\n\nNote: This plugin can also be used without lazySizes core script.\n"
  },
  {
    "path": "plugins/aspectratio/ls.aspectratio.js",
    "content": "(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t'use strict';\n\n\tif(!window.addEventListener){return;}\n\n\tvar forEach = Array.prototype.forEach;\n\n\tvar imageRatio, extend$, $;\n\n\tvar regPicture = /^picture$/i;\n\tvar aspectRatioAttr = 'data-aspectratio';\n\tvar aspectRatioSel = 'img[' + aspectRatioAttr + ']';\n\n\tvar matchesMedia = function(media){\n\t\tif(window.matchMedia){\n\t\t\tmatchesMedia = function(media){\n\t\t\t\treturn !media || (matchMedia(media) || {}).matches;\n\t\t\t};\n\t\t} else if(window.Modernizr && Modernizr.mq){\n\t\t\treturn !media || Modernizr.mq(media);\n\t\t} else {\n\t\t\treturn !media;\n\t\t}\n\t\treturn matchesMedia(media);\n\t};\n\n\tvar addClass = lazySizes.aC;\n\tvar removeClass = lazySizes.rC;\n\tvar lazySizesConfig = lazySizes.cfg;\n\n\tfunction AspectRatio(){\n\t\tthis.ratioElems = document.getElementsByClassName('lazyaspectratio');\n\t\tthis._setupEvents();\n\t\tthis.processImages();\n\t}\n\n\tAspectRatio.prototype = {\n\t\t_setupEvents: function(){\n\t\t\tvar module = this;\n\n\t\t\tvar addRemoveAspectRatio = function(elem){\n\t\t\t\tif(elem.naturalWidth < 36){\n\t\t\t\t\tmodule.addAspectRatio(elem, true);\n\t\t\t\t} else {\n\t\t\t\t\tmodule.removeAspectRatio(elem, true);\n\t\t\t\t}\n\t\t\t};\n\t\t\tvar onload = function(){\n\t\t\t\tmodule.processImages();\n\t\t\t};\n\n\t\t\tdocument.addEventListener('load', function(e){\n\t\t\t\tif(e.target.getAttribute && e.target.getAttribute(aspectRatioAttr)){\n\t\t\t\t\taddRemoveAspectRatio(e.target);\n\t\t\t\t}\n\t\t\t}, true);\n\n\t\t\taddEventListener('resize', (function(){\n\t\t\t\tvar timer;\n\t\t\t\tvar resize = function(){\n\t\t\t\t\tforEach.call(module.ratioElems, addRemoveAspectRatio);\n\t\t\t\t};\n\n\t\t\t\treturn function(){\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ttimer = setTimeout(resize, 99);\n\t\t\t\t};\n\t\t\t})());\n\n\t\t\tdocument.addEventListener('DOMContentLoaded', onload);\n\n\t\t\taddEventListener('load', onload);\n\t\t},\n\t\tprocessImages: function(context){\n\t\t\tvar elements, i;\n\n\t\t\tif(!context){\n\t\t\t\tcontext = document;\n\t\t\t}\n\n\t\t\tif('length' in context && !context.nodeName){\n\t\t\t\telements = context;\n\t\t\t} else {\n\t\t\t\telements = context.querySelectorAll(aspectRatioSel);\n\t\t\t}\n\n\t\t\tfor(i = 0; i < elements.length; i++){\n\t\t\t\tif(elements[i].naturalWidth > 36){\n\t\t\t\t\tthis.removeAspectRatio(elements[i]);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthis.addAspectRatio(elements[i]);\n\t\t\t}\n\t\t},\n\t\tgetSelectedRatio: function(img){\n\t\t\tvar i, len, sources, customMedia, ratio;\n\t\t\tvar parent = img.parentNode;\n\t\t\tif(parent && regPicture.test(parent.nodeName || '')){\n\t\t\t\tsources = parent.getElementsByTagName('source');\n\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tcustomMedia = sources[i].getAttribute('data-media') || sources[i].getAttribute('media');\n\n\t\t\t\t\tif(lazySizesConfig.customMedia[customMedia]){\n\t\t\t\t\t\tcustomMedia = lazySizesConfig.customMedia[customMedia];\n\t\t\t\t\t}\n\n\t\t\t\t\tif(matchesMedia(customMedia)){\n\t\t\t\t\t\tratio = sources[i].getAttribute(aspectRatioAttr);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ratio || img.getAttribute(aspectRatioAttr) || '';\n\t\t},\n\t\tparseRatio: (function(){\n\t\t\tvar regRatio = /^\\s*([+\\d\\.]+)(\\s*[\\/x]\\s*([+\\d\\.]+))?\\s*$/;\n\t\t\tvar ratioCache = {};\n\t\t\treturn function(ratio){\n\t\t\t\tvar match;\n\n\t\t\t\tif(!ratioCache[ratio] && (match = ratio.match(regRatio))){\n\t\t\t\t\tif(match[3]){\n\t\t\t\t\t\tratioCache[ratio] = match[1] / match[3];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tratioCache[ratio] = match[1] * 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn ratioCache[ratio];\n\t\t\t};\n\t\t})(),\n\t\taddAspectRatio: function(img, notNew){\n\t\t\tvar ratio;\n\t\t\tvar width = img.offsetWidth;\n\t\t\tvar height = img.offsetHeight;\n\n\t\t\tif(!notNew){\n\t\t\t\taddClass(img, 'lazyaspectratio');\n\t\t\t}\n\n\t\t\tif(width < 36 && height <= 0){\n\t\t\t\tif(width || height && window.console){\n\t\t\t\t\tconsole.log('Define width or height of image, so we can calculate the other dimension');\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tratio = this.getSelectedRatio(img);\n\t\t\tratio = this.parseRatio(ratio);\n\n\t\t\tif(ratio){\n\t\t\t\tif(width){\n\t\t\t\t\timg.style.height = (width / ratio) + 'px';\n\t\t\t\t} else {\n\t\t\t\t\timg.style.width = (height * ratio) + 'px';\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tremoveAspectRatio: function(img){\n\t\t\tremoveClass(img, 'lazyaspectratio');\n\t\t\timg.style.height = '';\n\t\t\timg.style.width = '';\n\t\t\timg.removeAttribute(aspectRatioAttr);\n\t\t}\n\t};\n\n\textend$ = function(){\n\t\t$ = window.jQuery || window.Zepto || window.shoestring || window.$;\n\t\tif($ && $.fn && !$.fn.imageRatio && $.fn.filter && $.fn.add && $.fn.find){\n\t\t\t$.fn.imageRatio = function(){\n\t\t\t\timageRatio.processImages(this.find(aspectRatioSel).add(this.filter(aspectRatioSel)));\n\t\t\t\treturn this;\n\t\t\t};\n\t\t} else {\n\t\t\t$ = false;\n\t\t}\n\t};\n\n\textend$();\n\tsetTimeout(extend$);\n\n\timageRatio = new AspectRatio();\n\n\twindow.imageRatio = imageRatio;\n\n\tif(typeof module == 'object' && module.exports){\n\t\tmodule.exports = imageRatio;\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(imageRatio);\n\t}\n\n}));\n"
  },
  {
    "path": "plugins/attrchange/README.md",
    "content": "# lazysizes attribute change / re-initialization extension\n\nIn case you are changing the ``data-src``/``data-srcset`` attributes of already transformed lazyload elements dynamically, you normally also must re-add the ``lazyload`` class to the element.\n\nThis extension automatically detects changes to your ``data-*`` attributes and adds the class for you. This is very comfortable in case you are using highly dynamic or reactive View libraries like React, Angular, Ember etc..\n\nIn case you are using React you can also try the following [react-lazysizes](https://www.npmjs.com/package/react-lazysizes) module as another possible alternative.\n\n```js\n// never try to import *.min.js files \nimport lazySizes from 'lazysizes';\nimport 'lazysizes/plugins/attrchange/ls.attrchange';\n```\n"
  },
  {
    "path": "plugins/attrchange/ls.attrchange.js",
    "content": "(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes) {\n\t'use strict';\n\n\tvar addObserver = function(){\n\t\tvar connect, disconnect, observer, connected;\n\t\tvar lsCfg = lazySizes.cfg;\n\t\tvar attributes = {'data-bgset': 1, 'data-include': 1, 'data-poster': 1, 'data-bg': 1, 'data-script': 1};\n\t\tvar regClassTest = '(\\\\s|^)(' + lsCfg.loadedClass;\n\t\tvar docElem = document.documentElement;\n\n\t\tvar setClass = function(target){\n\t\t\tlazySizes.rAF(function(){\n\t\t\t\tlazySizes.rC(target, lsCfg.loadedClass);\n\t\t\t\tif(lsCfg.unloadedClass){\n\t\t\t\t\tlazySizes.rC(target, lsCfg.unloadedClass);\n\t\t\t\t}\n\t\t\t\tlazySizes.aC(target, lsCfg.lazyClass);\n\n\t\t\t\tif(target.style.display == 'none' || (target.parentNode && target.parentNode.style.display == 'none')){\n\t\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t\tlazySizes.loader.unveil(target);\n\t\t\t\t\t}, 0);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tvar onMutation = function(mutations){\n\t\t\tvar i, len, mutation, target;\n\t\t\tfor(i = 0, len = mutations.length; i < len; i++){\n\t\t\t\tmutation = mutations[i];\n\t\t\t\ttarget = mutation.target;\n\n\t\t\t\tif(!target.getAttribute(mutation.attributeName)){continue;}\n\n\t\t\t\tif(target.localName == 'source' && target.parentNode){\n\t\t\t\t\ttarget = target.parentNode.querySelector('img');\n\t\t\t\t}\n\n\t\t\t\tif(target && regClassTest.test(target.className)){\n\t\t\t\t\tsetClass(target);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif(lsCfg.unloadedClass){\n\t\t\tregClassTest += '|' + lsCfg.unloadedClass;\n\t\t}\n\n\t\tregClassTest += '|' + lsCfg.loadingClass + ')(\\\\s|$)';\n\n\t\tregClassTest = new RegExp(regClassTest);\n\n\t\tattributes[lsCfg.srcAttr] = 1;\n\t\tattributes[lsCfg.srcsetAttr] = 1;\n\n\t\tif(window.MutationObserver){\n\t\t\tobserver = new MutationObserver(onMutation);\n\n\t\t\tconnect = function(){\n\t\t\t\tif(!connected){\n\t\t\t\t\tconnected = true;\n\t\t\t\t\tobserver.observe( docElem, { subtree: true, attributes: true, attributeFilter: Object.keys(attributes)} );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdisconnect = function(){\n\t\t\t\tif(connected){\n\t\t\t\t\tconnected = false;\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\tdocElem.addEventListener('DOMAttrModified', (function(){\n\t\t\t\tvar runs;\n\t\t\t\tvar modifications = [];\n\t\t\t\tvar callMutations = function(){\n\t\t\t\t\tonMutation(modifications);\n\t\t\t\t\tmodifications = [];\n\t\t\t\t\truns = false;\n\t\t\t\t};\n\t\t\t\treturn function(e){\n\t\t\t\t\tif(connected && attributes[e.attrName] && e.newValue){\n\t\t\t\t\t\tmodifications.push({target: e.target, attributeName: e.attrName});\n\t\t\t\t\t\tif(!runs){\n\t\t\t\t\t\t\tsetTimeout(callMutations);\n\t\t\t\t\t\t\truns = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t})(), true);\n\n\t\t\tconnect = function(){\n\t\t\t\tconnected = true;\n\t\t\t};\n\t\t\tdisconnect = function(){\n\t\t\t\tconnected = false;\n\t\t\t};\n\t\t}\n\n\t\taddEventListener('lazybeforeunveil', disconnect, true);\n\t\taddEventListener('lazybeforeunveil', connect);\n\n\t\taddEventListener('lazybeforesizes', disconnect, true);\n\t\taddEventListener('lazybeforesizes', connect);\n\t\tconnect();\n\n\t\tremoveEventListener('lazybeforeunveil', addObserver);\n\t};\n\n\n\taddEventListener('lazybeforeunveil', addObserver);\n}));\n"
  },
  {
    "path": "plugins/bgset/README.md",
    "content": "# lazysizes bgset extension - responsive background images\n\nThis simple and small plugin allows you to define multiple background images with a width descriptor, similar to how ``img[srcset]`` works as also art directed images using media queries, similar to how ``picture`` works.\n\nThe extension will then load the best image size for the current viewport and device. In case the browser does not support responsive images natively either picturefill or the [respimg polyfill plugin](../respimg) has to be used:\n\nNote: This plugin is deprecated in most cases. Check wether the object-fit CSS property in combination with the [object-fit polyfill](../object-fit) is better for your needs.\n\n```html\n<script>\n    function loadJS(u){var r=document.getElementsByTagName(\"script\")[0],s=document.createElement(\"script\");s.src=u;r.parentNode.insertBefore(s,r);}\n\n    if(!window.HTMLPictureElement || !('sizes' in document.createElement('img'))){\n        loadJS(\"ls.respimg.min.js\");\n    }\n</script>\n\n<!--  your stylesheets -->\n\n<script src=\"ls.bgset.min.js\"></script>\n<script src=\"lazysizes.min.js\"></script>\n\n<div class=\"lazyload\" data-bgset=\"image-200.jpg 200w, image-300.jpg 300w, image-400.jpg 400w\" data-sizes=\"auto\">\n\n</div>\n```\n\nThe bgset also supports art direction through multiple media query sets. To use this feature each set has to be separated using the ``\" | \"`` signs and the media query has to be added at the end of the set inside of square brackets.\n\nAlso the ``customMedia`` option can be used to separate the media queries implementation from the markup.\n\n```html\n<script>\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nwindow.lazySizesConfig.customMedia = {\n    '--small': '(max-width: 480px)',\n    '--medium': '(max-width: 700px)'\n};\n</script>\n\n<div class=\"lazyload\" data-bgset=\"image-200.jpg [--small] | image-300.jpg [--medium] | image-400.jpg\"></div>\n<!-- or without customMedia options: -->\n<div class=\"lazyload\" data-bgset=\"image-200.jpg [(max-width: 480px)] | image-300.jpg [(max-width: 700px)] | image-400.jpg\"></div>\n<!-- or with type attribute: -->\n<div class=\"lazyload\" data-bgset=\"logo.svg [type: image/svg+xml] | logo.png\"></div>\n```\n\nOf course also resolution switching and art direction can be combined:\n\n```html\n<div class=\"lazyload\" data-bgset=\"image1-200.jpg 200w, image2-400.jpg 400w [(max-width: 480px)] |\n    image2-300.jpg 300w, image2-600.jpg 600w [(max-width: 700px)] |\n    image-400.jpg 400w, image-800.jpg 800w\" data-sizes=\"auto\"></div>\n```\n\nHere you find a [small bgset demo](http://jsfiddle.net/trixta/bfqqnosp/embedded/result/).\n\n**Note: In case you use this plugin with ``background-size: cover|contain`` and the ``data-sizes=\"auto\"`` feature, we recommend to also use the [parent-fit extension](../parent-fit/) to calculate the right ``sizes`` attribute for you. See also the following [demo](http://jsfiddle.net/trixta/w96o9xm5/). In these cases the [object-fit polyfill plugin](../object-fit) should be a better option than bgset.**\n"
  },
  {
    "path": "plugins/bgset/ls.bgset.js",
    "content": "(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t'use strict';\n\tif(!window.addEventListener){return;}\n\n\tvar lazySizesCfg = lazySizes.cfg;\n\tvar regWhite = /\\s+/g;\n\tvar regSplitSet = /\\s*\\|\\s+|\\s+\\|\\s*/g;\n\tvar regSource = /^(.+?)(?:\\s+\\[\\s*(.+?)\\s*\\])(?:\\s+\\[\\s*(.+?)\\s*\\])?$/;\n\tvar regType = /^\\s*\\(*\\s*type\\s*:\\s*(.+?)\\s*\\)*\\s*$/;\n\tvar regBgUrlEscape = /\\(|\\)|'/;\n\tvar allowedBackgroundSize = {contain: 1, cover: 1};\n\tvar proxyWidth = function(elem){\n\t\tvar width = lazySizes.gW(elem, elem.parentNode);\n\n\t\tif(!elem._lazysizesWidth || width > elem._lazysizesWidth){\n\t\t\telem._lazysizesWidth = width;\n\t\t}\n\t\treturn elem._lazysizesWidth;\n\t};\n\tvar getBgSize = function(elem){\n\t\tvar bgSize;\n\n\t\tbgSize = (getComputedStyle(elem) || {getPropertyValue: function(){}}).getPropertyValue('background-size');\n\n\t\tif(!allowedBackgroundSize[bgSize] && allowedBackgroundSize[elem.style.backgroundSize]){\n\t\t\tbgSize = elem.style.backgroundSize;\n\t\t}\n\n\t\treturn bgSize;\n\t};\n\tvar setTypeOrMedia = function(source, match){\n\t\tif(match){\n\t\t\tvar typeMatch = match.match(regType);\n\t\t\tif(typeMatch && typeMatch[1]){\n\t\t\t\tsource.setAttribute('type', typeMatch[1]);\n\t\t\t} else {\n\t\t\t\tsource.setAttribute('media', lazySizesCfg.customMedia[match] || match);\n\t\t\t}\n\t\t}\n\t};\n\tvar createPicture = function(sets, elem, img){\n\t\tvar picture = document.createElement('picture');\n\t\tvar sizes = elem.getAttribute(lazySizesCfg.sizesAttr);\n\t\tvar ratio = elem.getAttribute('data-ratio');\n\t\tvar optimumx = elem.getAttribute('data-optimumx');\n\n\t\tif(elem._lazybgset && elem._lazybgset.parentNode == elem){\n\t\t\telem.removeChild(elem._lazybgset);\n\t\t}\n\n\t\tObject.defineProperty(img, '_lazybgset', {\n\t\t\tvalue: elem,\n\t\t\twritable: true\n\t\t});\n\t\tObject.defineProperty(elem, '_lazybgset', {\n\t\t\tvalue: picture,\n\t\t\twritable: true\n\t\t});\n\n\t\tsets = sets.replace(regWhite, ' ').split(regSplitSet);\n\n\t\tpicture.style.display = 'none';\n\t\timg.className = lazySizesCfg.lazyClass;\n\n\t\tif(sets.length == 1 && !sizes){\n\t\t\tsizes = 'auto';\n\t\t}\n\n\t\tsets.forEach(function(set){\n\t\t\tvar match;\n\t\t\tvar source = document.createElement('source');\n\n\t\t\tif(sizes && sizes != 'auto'){\n\t\t\t\tsource.setAttribute('sizes', sizes);\n\t\t\t}\n\n\t\t\tif((match = set.match(regSource))){\n\t\t\t\tsource.setAttribute(lazySizesCfg.srcsetAttr, match[1]);\n\n\t\t\t\tsetTypeOrMedia(source, match[2]);\n\t\t\t\tsetTypeOrMedia(source, match[3]);\n\t\t\t} else {\n\t\t\t\tsource.setAttribute(lazySizesCfg.srcsetAttr, set);\n\t\t\t}\n\n\t\t\tpicture.appendChild(source);\n\t\t});\n\n\t\tif(sizes){\n\t\t\timg.setAttribute(lazySizesCfg.sizesAttr, sizes);\n\t\t\telem.removeAttribute(lazySizesCfg.sizesAttr);\n\t\t\telem.removeAttribute('sizes');\n\t\t}\n\t\tif(optimumx){\n\t\t\timg.setAttribute('data-optimumx', optimumx);\n\t\t}\n\t\tif(ratio) {\n\t\t\timg.setAttribute('data-ratio', ratio);\n\t\t}\n\n\t\tpicture.appendChild(img);\n\n\t\telem.appendChild(picture);\n\t};\n\n\tvar proxyLoad = function(e){\n\t\tif(!e.target._lazybgset){return;}\n\n\t\tvar image = e.target;\n\t\tvar elem = image._lazybgset;\n\t\tvar bg = image.currentSrc || image.src;\n\n\n\t\tif(bg){\n\t\t\tvar useSrc = regBgUrlEscape.test(bg) ? JSON.stringify(bg) : bg;\n\t\t\tvar event = lazySizes.fire(elem, 'bgsetproxy', {\n\t\t\t\tsrc: bg,\n\t\t\t\tuseSrc: useSrc,\n\t\t\t\tfullSrc: null,\n\t\t\t});\n\n\t\t\tif(!event.defaultPrevented){\n\t\t\t\telem.style.backgroundImage = event.detail.fullSrc || 'url(' + event.detail.useSrc + ')';\n\t\t\t}\n\t\t}\n\n\t\tif(image._lazybgsetLoading){\n\t\t\tlazySizes.fire(elem, '_lazyloaded', {}, false, true);\n\t\t\tdelete image._lazybgsetLoading;\n\t\t}\n\t};\n\n\taddEventListener('lazybeforeunveil', function(e){\n\t\tvar set, image, elem;\n\n\t\tif(e.defaultPrevented || !(set = e.target.getAttribute('data-bgset'))){return;}\n\n\t\telem = e.target;\n\t\timage = document.createElement('img');\n\n\t\timage.alt = '';\n\n\t\timage._lazybgsetLoading = true;\n\t\te.detail.firesLoad = true;\n\n\t\tcreatePicture(set, elem, image);\n\n\t\tsetTimeout(function(){\n\t\t\tlazySizes.loader.unveil(image);\n\n\t\t\tlazySizes.rAF(function(){\n\t\t\t\tlazySizes.fire(image, '_lazyloaded', {}, true, true);\n\t\t\t\tif(image.complete) {\n\t\t\t\t\tproxyLoad({target: image});\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t});\n\n\tdocument.addEventListener('load', proxyLoad, true);\n\n\twindow.addEventListener('lazybeforesizes', function(e){\n\t\tif(e.detail.instance != lazySizes){return;}\n\t\tif(e.target._lazybgset && e.detail.dataAttr){\n\t\t\tvar elem = e.target._lazybgset;\n\t\t\tvar bgSize = getBgSize(elem);\n\n\t\t\tif(allowedBackgroundSize[bgSize]){\n\t\t\t\te.target._lazysizesParentFit = bgSize;\n\n\t\t\t\tlazySizes.rAF(function(){\n\t\t\t\t\te.target.setAttribute('data-parent-fit', bgSize);\n\t\t\t\t\tif(e.target._lazysizesParentFit){\n\t\t\t\t\t\tdelete e.target._lazysizesParentFit;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}, true);\n\n\tdocument.documentElement.addEventListener('lazybeforesizes', function(e){\n\t\tif(e.defaultPrevented || !e.target._lazybgset || e.detail.instance != lazySizes){return;}\n\t\te.detail.width = proxyWidth(e.target._lazybgset);\n\t});\n}));\n"
  },
  {
    "path": "plugins/blur-up/README.md",
    "content": "# The lazysizes Blur Up/effect plugin\n\nThe lazysizes Blur Up plugin ([demo](https://jsfiddle.net/trixta/v0oq0412/embedded/result/)) gives you the possibility to also lazyload the low quality placeholder and enables you to create a blur up/fade over effect.\n\nThis way the low quality image placeholder technique is more appealing to the user.\n\n```js\n// never try to import *.min.js files\nimport lazySizes from 'lazysizes';\nimport 'lazysizes/plugins/blur-up/ls.blur-up';\n```\n\n## How to\n\nSimply add a `data-lowsrc` attribute with the low quality image placeholder image to your `img` and in case of `picture` to your `source` elements.\n\nLazysizes will then create a new image right after your original image with the following class `ls-blur-up-img`.\n\nThe new image (`.ls-blur-up-img`) will get the following state classes to enable you to write a custom CSS animation/transition as soon as the image is in view and loaded: `ls-inview`/`ls-original-loaded`, while your original `img` gets the class `.ls-blur-up-is-loading` until the `.ls-blur-up-img` is loaded.\n\n\n```html\n<style>\n\t.wrapper {\n\t\twidth: 80%;\n\t\tmin-width: 320px;\n\t\tmax-width: 900px;\n\t}\n\n\t.mediabox {\n\t\tposition: relative;\n\t\tdisplay: block;\n\t\theight: 0;\n\t\twidth: 100%;\n\t\tpadding-bottom: 66.6667%;\n\t}\n\n\t.mediabox-img.ls-blur-up-is-loading,\n\t.mediabox-img.lazyload:not([src]) {\n\t\tvisibility: hidden;\n\t}\n\n\t.ls-blur-up-img,\n\t.mediabox-img {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tdisplay: block;\n\n\t\t/* only if you want to change the blur-up option from always to auto or want to use blur up effect without a lowsrc image. */\n\t\tfont-family: \"blur-up: auto\", \"object-fit: cover\";\n\n\t\tobject-fit: cover;\n\t}\n\n\t.ls-blur-up-img {\n\t\tfilter: blur(10px);\n\t\topacity: 1;\n\t\ttransition: opacity 1000ms, filter 1500ms;\n\t}\n\n\t.ls-blur-up-img.ls-inview.ls-original-loaded {\n\t\topacity: 0;\n\t\tfilter: blur(5px);\n\t}\n</style>\n<div class=\"wrapper\">\n\t<div class=\"mediabox\">\n\t\t<img\n\t\t\tclass=\"mediabox-img lazyload\"\n\t\t\tdata-srcset=\"https://picsum.photos/400/600?image=1074 600w 400h,\n\t\t\t\thttps://picsum.photos/800/1200?image=1074 1200w\"\n\t\t\tdata-lowsrc=\"https://picsum.photos/200/300?image=1074\"\n\t\t\tdata-sizes=\"auto\"\n\t\t/>\n\t</div>\n</div>\n\n<script src=\"../plugins/object-fit/ls.object-fit.js\"></script>\n<script src=\"../plugins/parent-fit/ls.parent-fit.js\"></script>\n<script src=\"../plugins/blur-up/ls.blur-up.js\"></script>\n<script src=\"../lazysizes.js\"></script>\n```\n\n\n### Blur-up options\n\n#### BlurUp Mode\n\nThe effect mode has two possible value: `\"always\"` (default: The effect is generated always) and `\"auto\"` (The effect is only used with non cached images).\n\nThe blur up mode can be configured using JS or CSS:\n\n```js\nimport lazysizes from 'lazysizes';\nimport 'lazysizes/plugins/blur-up/ls.blur-up';\n\nlazysizes.cfg.blurupMode = 'auto';\n```\n\n```css\n.mediabox-img {\n\tfont-family: \"blur-up: auto\", \"object-fit: cover\";\n}\n```\n\n#### You can override blur-up classes\n\n```js\nimport lazysizes from 'lazysizes';\nimport 'lazysizes/plugins/blur-up/ls.blur-up';\n\n\nlazySizes.cfg.blurUpClass = 'blurred-image'\n```\nHere the list of override classes:\n\n* ``lazySizes.cfg.blurUpLoadingClass`` ls-blur-up-is-loading\n* ``lazySizes.cfg.blurUpInviewClass`` ls-inview\n* ``lazySizes.cfg.blurUpLoadedClass`` ls-blur-up-loaded\n* ``lazySizes.cfg.blurUpLoadedOriginalClass`` ls-original-loaded\n"
  },
  {
    "path": "plugins/blur-up/ls.blur-up.js",
    "content": "(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes) {\n\t'use strict';\n\n\tvar lazySizesCfg;\n\n\t(function(){\n\t\tvar prop;\n\n\t\tvar blurUpDefaults = {\n\t\t\tblurUpClass: 'ls-blur-up-img',\n\t\t\tblurUpLoadingClass: 'ls-blur-up-is-loading',\n\t\t\tblurUpInviewClass: 'ls-inview',\n\t\t\tblurUpLoadedClass: 'ls-blur-up-loaded',\n\t\t\tblurUpLoadedOriginalClass: 'ls-original-loaded'\n\t\t};\n\n\t\tlazySizesCfg = lazySizes.cfg || {};\n\n\t\tfor(prop in blurUpDefaults){\n\t\t\tif(!(prop in lazySizesCfg)){\n\t\t\t\tlazySizesCfg[prop] = blurUpDefaults[prop];\n\t\t\t}\n\t\t}\n\t})();\n\n\tvar slice = [].slice;\n\tvar regBlurUp = /blur-up[\"']*\\s*:\\s*[\"']*(always|auto)/;\n\tvar regType = /image\\/(jpeg|png|gif|svg\\+xml)/;\n\tvar transSrc = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\n\tvar matchesMedia = function (source) {\n\t\tvar media = source.getAttribute('data-media') || source.getAttribute('media');\n\t\tvar type = source.getAttribute('type');\n\n\t\treturn (!type || regType.test(type)) && (!media || window.matchMedia(lazySizes.cfg.customMedia[media] || media).matches);\n\t};\n\n\tvar getLowSrc = function (picture, img) {\n\t\tvar matchingLowSrc;\n\t\tvar sources = picture ? slice.call(picture.querySelectorAll('source, img')) : [img];\n\n\t\tsources.forEach(function (src) {\n\t\t\tif (matchingLowSrc) {return;}\n\t\t\tvar lowSrc = src.getAttribute('data-lowsrc');\n\n\t\t\tif (lowSrc && matchesMedia(src)) {\n\t\t\t\tmatchingLowSrc = lowSrc;\n\t\t\t}\n\t\t});\n\n\t\treturn matchingLowSrc;\n\t};\n\n\tvar createBlurup = function(picture, img, src, blurUp){\n\t\tvar blurImg;\n\t\tvar isBlurUpLoaded = false;\n\t\tvar isForced = false;\n\t\tvar start = blurUp == 'always' ? 0 : Date.now();\n\t\tvar isState = 0;\n\t\tvar parent = (picture || img).parentNode;\n\n\t\tvar createBlurUpImg = function () {\n\n\t\t\tif(!src){return;}\n\n\t\t\tvar onloadBlurUp = function(e){\n\t\t\t\tisBlurUpLoaded = true;\n\n\t\t\t\tif (!blurImg) {\n\t\t\t\t\tblurImg = e.target;\n\t\t\t\t}\n\n\t\t\t\tlazySizes.rAF(function () {\n\t\t\t\t\tlazySizes.rC(img, lazySizes.cfg.blurUpLoadingClass);\n\t\t\t\t\tif(blurImg) {\n\t\t\t\t\t\tlazySizes.aC(blurImg, lazySizes.cfg.blurUpLoadedClass);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif(blurImg){\n\t\t\t\t\tblurImg.removeEventListener('load', onloadBlurUp);\n\t\t\t\t\tblurImg.removeEventListener('error', onloadBlurUp);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tblurImg = document.createElement('img');\n\n\t\t\tblurImg.addEventListener('load', onloadBlurUp);\n\t\t\tblurImg.addEventListener('error', onloadBlurUp);\n\n\t\t\tblurImg.className = lazySizes.cfg.blurUpClass;\n\t\t\tblurImg.cssText = img.cssText;\n\t\t\tblurImg.src = src;\n\t\t\tblurImg.alt = '';\n\t\t\tblurImg.setAttribute('aria-hidden', 'true');\n\n\t\t\tparent.insertBefore(blurImg, (picture || img).nextSibling);\n\n\t\t\tif(blurUp != 'always'){\n\t\t\t\tblurImg.style.visibility = 'hidden';\n\n\t\t\t\tlazySizes.rAF(function () {\n\t\t\t\t\tif (blurImg) {\n\t\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\t\tif (blurImg) {\n\t\t\t\t\t\t\t\tlazySizes.rAF(function () {\n\t\t\t\t\t\t\t\t\tif(!isForced && blurImg){\n\t\t\t\t\t\t\t\t\t\tblurImg.style.visibility = '';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, lazySizes.cfg.blurupCacheDelay || 33);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tvar remove = function () {\n\t\t\tif(blurImg){\n\t\t\t\tlazySizes.rAF(function() {\n\t\t\t\t\tlazySizes.rC(img, lazySizes.cfg.blurUpLoadingClass);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tblurImg.parentNode.removeChild(blurImg);\n\t\t\t\t\t} catch(er){}\n\t\t\t\t\tblurImg = null;\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tvar setStateUp = function(force){\n\t\t\tisState++;\n\n\t\t\tisForced = force || isForced;\n\n\t\t\tif(force){\n\t\t\t\tremove();\n\t\t\t} else if(isState > 1) {\n\t\t\t\tsetTimeout(remove, 5000);\n\t\t\t}\n\t\t};\n\n\t\tvar onload = function() {\n\t\t\timg.removeEventListener('load', onload);\n\t\t\timg.removeEventListener('error', onload);\n\n\t\t\tif(blurImg){\n\t\t\t\tlazySizes.rAF(function(){\n\t\t\t\t\tif(blurImg) {\n\t\t\t\t\t\tlazySizes.aC(blurImg, lazySizes.cfg.blurUpLoadedOriginalClass);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlazySizes.fire(img, 'blurUpLoaded');\n\n\t\t\tif(blurUp != 'always' && (!isBlurUpLoaded || Date.now() - start < 66)){\n\t\t\t\tsetStateUp(true);\n\t\t\t} else {\n\t\t\t\tsetStateUp();\n\t\t\t}\n\t\t};\n\n\t\tcreateBlurUpImg();\n\n\t\timg.addEventListener('load', onload);\n\t\timg.addEventListener('error', onload);\n\n\t\tlazySizes.aC(img, lazySizes.cfg.blurUpLoadingClass);\n\n\t\tvar parentUnveil = function (e) {\n\t\t\tif(parent != e.target){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlazySizes.aC(blurImg || img, lazySizes.cfg.blurUpInviewClass);\n\n\t\t\tsetStateUp();\n\n\t\t\tparent.removeEventListener('lazybeforeunveil', parentUnveil);\n\t\t};\n\n\t\tif(!parent.getAttribute('data-expand')){\n\t\t\tparent.setAttribute('data-expand', -1);\n\t\t}\n\n\t\tparent.addEventListener('lazybeforeunveil', parentUnveil);\n\n\t\tlazySizes.aC(parent, lazySizes.cfg.lazyClass);\n\n\t};\n\n\twindow.addEventListener('lazybeforeunveil', function (e) {\n\t\tvar detail = e.detail;\n\n\t\tif(detail.instance != lazySizes || !detail.blurUp){return;}\n\n\t\tvar img = e.target;\n\t\tvar picture = img.parentNode;\n\n\t\tif(picture.nodeName != 'PICTURE'){\n\t\t\tpicture = null;\n\t\t}\n\n\t\tcreateBlurup(picture, img, getLowSrc(picture, img) || transSrc, detail.blurUp);\n\t});\n\n\twindow.addEventListener('lazyunveilread', function (e) {\n\t\tvar detail = e.detail;\n\n\t\tif(detail.instance != lazySizes){return;}\n\n\t\tvar img = e.target;\n\t\tvar match = (getComputedStyle(img, null) || {fontFamily: ''}).fontFamily.match(regBlurUp);\n\n\t\tif(!match && !img.getAttribute('data-lowsrc')){return;}\n\n\t\tdetail.blurUp = match && match[1] || lazySizes.cfg.blurupMode || 'always';\n\t});\n}));\n"
  },
  {
    "path": "plugins/custommedia/README.md",
    "content": "# lazysizes custommedia extension\n\nlazySizes custommedia extension allows you to automatically sync and manage your breakpoints between your CSS and the ``media`` attributes of your ``\"picture > source\"`` elements using the ``customMedia`` option of lazySizes.\n\n## Configuration via CSS\n\nThe following CSS...\n\n```css\nhtml:after {\n\tdisplay: none;\n\tcontent: '--small: (max-width: 500px) | --medium: (max-width: 1100px) | --large: (max-width: 1500px)';\n}\n```\n\n... allows you to write the following markup:\n\n```html\n<picture>\n\t<!--[if IE 9]><video style=\"display: none;\"><![endif]-->\n\t<source\n\t\tdata-srcset=\"http://placehold.it/500x600/11e87f/fff\"\n\t\tmedia=\"--small\" />\n\t<source\n\t\tdata-srcset=\"http://placehold.it/700x300\"\n\t\tmedia=\"--medium\" />\n\t<source\n\t\tdata-srcset=\"http://placehold.it/1400x600/e8117f/fff\"\n\t\tmedia=\"--large\" />\n\t<!--[if IE 9]></video><![endif]-->\n\t<img\n\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\tclass=\"lazyload\"\n\t\tdata-srcset=\"http://placehold.it/1800x900/117fe8/fff\"\n\t\talt=\"image with artdirection\" />\n</picture>\n```\n\nThe parsed custom media query object can be accessed through the ``lazySizesConfig.customMedia`` option object:\n\n```js\nwindow.lazySizesConfig.customMedia; // returns:\n\n/*\n{\n\t'--small': '(max-width: 500px)',\n    '--medium': (min-width: 1100px)',\n    '--large': '(max-width: 1100px)'\n}\n*/\n```\n\n```scss\n/*\n Simple Sass mixin to share a map of breakpoints between CSS and JS\n Usage:\n $breakpoints: (\n   --small: (max-width: 480px),\n   --medium: (max-width: 1024px),\n   --large: (min-width: 1280px)\n );\n\n html:after {\n \t@include shareBreakpoints($breakpoints);\n }\n*/\n@mixin shareBreakpoints($map , $cssprop: content){\n  $description: '';\n\n  @each $property, $value in $map\n   {\n    @if $description !=  '' {\n      $description: $description + ' | ';\n    }\n    $description: $description + $property +': '+ inspect($value);\n  }\n\n  display: none;\n  #{$cssprop}:  $description;\n}\n```\n\n\n"
  },
  {
    "path": "plugins/custommedia/ls.custommedia.js",
    "content": "/*\n html:after {\n \tdisplay: none;\n \tcontent: '--small: (max-width: 500px) | --medium: (max-width: 1100px) | --large: (min-width: 1100px)';\n }\n*/\n(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\tvar docElem = document.documentElement;\n\n\tlazySizes.getCustomMedias = (function(){\n\t\tvar regCleanPseudos = /['\"]/g;\n\t\tvar regSplit = /\\s*\\|\\s*/g;\n\t\tvar regNamedQueries = /^([a-z0-9_-]+)\\s*:\\s*(.+)$/i;\n\n\t\tvar getStyle = function(elem, pseudo){\n\t\t\treturn ((getComputedStyle(elem, pseudo) || {getPropertyValue: function(){}}).getPropertyValue('content') || 'none').replace(regCleanPseudos, '').trim();\n\t\t};\n\t\tvar parse = function(string, object){\n\t\t\tstring.split(regSplit).forEach(function(query){\n\t\t\t\tvar match = query.match(regNamedQueries);\n\n\t\t\t\tif(match){\n\t\t\t\t\tobject[match[1]] = match[2];\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\treturn function(object, element){\n\t\t\tobject = object || lazySizes.cfg.customMedia;\n\t\t\telement = element || document.querySelector('html');\n\t\t\tparse(getStyle(element, ':before'), object);\n\t\t\tparse(getStyle(element, ':after'), object);\n\t\t\treturn object;\n\t\t};\n\t})();\n\n\tlazySizes.updateCustomMedia = function(){\n\t\tvar i, len, customMedia;\n\t\tvar elems = docElem.querySelectorAll('source[media][data-media][srcset]');\n\n\t\tlazySizes.getCustomMedias();\n\n\t\tfor(i = 0, len = elems.length; i < len; i++){\n\t\t\tif( (customMedia = lazySizes.cfg.customMedia[elems[i].getAttribute('data-media') || elems[i].getAttribute('media')]) ){\n\t\t\t\telems[i].setAttribute('media', customMedia);\n\t\t\t}\n\t\t}\n\n\t\telems = docElem.querySelector('source[media][data-media][srcset] ~ img');\n\t\tfor(i = 0, len = elems.length; i < len; i++){\n\t\t\tlazySizes.uP(elems[i]);\n\t\t}\n\n\t\tlazySizes.autoSizer.checkElems();\n\t};\n\n\tlazySizes.getCustomMedias();\n\n}));\n"
  },
  {
    "path": "plugins/fix-edge-h-descriptor/README.md",
    "content": "# MS Edge h descriptor fix\n\nThis plugin/polyfill fixes the missing `h` descriptor parsing in MS Edge by removing the `h` from all candidates of `source` and `img` elements and storing the physical aspect ratio of the candidates into a `data-aspectratio` attribute.\n\nNote: This polyfill is already included in the [respimg polyfill plugin](../respimg) and must **not** be included along site with it. But it is a good script in case you either use picturefill or do not use a polyfill at all.\n"
  },
  {
    "path": "plugins/fix-edge-h-descriptor/ls.fix-edge-h-descriptor.js",
    "content": "(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\tvar img = document.createElement('img');\n\tvar supportSrcset = ('sizes' in img) && ('srcset' in img);\n\tvar regHDesc = /\\s+\\d+h/g;\n\tvar fixEdgeHDescriptor = (function(){\n\t\tvar regDescriptors = /\\s+(\\d+)(w|h)\\s+(\\d+)(w|h)/;\n\t\tvar forEach = Array.prototype.forEach;\n\n\t\treturn function(){\n\t\t\tvar img = document.createElement('img');\n\t\t\tvar removeHDescriptors = function(source){\n\t\t\t\tvar ratio, match;\n\t\t\t\tvar srcset = source.getAttribute(lazySizesConfig.srcsetAttr);\n\t\t\t\tif(srcset){\n\t\t\t\t\tif((match = srcset.match(regDescriptors))){\n\t\t\t\t\t\tif(match[2] == 'w'){\n\t\t\t\t\t\t\tratio = match[1] / match[3];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tratio = match[3] / match[1];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(ratio){\n\t\t\t\t\t\t\tsource.setAttribute('data-aspectratio', ratio);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsource.setAttribute(lazySizesConfig.srcsetAttr, srcset.replace(regHDesc, ''));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tvar handler = function(e){\n\t\t\t\tif(e.detail.instance != lazySizes){return;}\n\t\t\t\tvar picture = e.target.parentNode;\n\n\t\t\t\tif(picture && picture.nodeName == 'PICTURE'){\n\t\t\t\t\tforEach.call(picture.getElementsByTagName('source'), removeHDescriptors);\n\t\t\t\t}\n\t\t\t\tremoveHDescriptors(e.target);\n\t\t\t};\n\n\t\t\tvar test = function(){\n\t\t\t\tif(!!img.currentSrc){\n\t\t\t\t\tdocument.removeEventListener('lazybeforeunveil', handler);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.addEventListener('lazybeforeunveil', handler);\n\n\t\t\timg.onload = test;\n\t\t\timg.onerror = test;\n\n\t\t\timg.srcset = 'data:,a 1w 1h';\n\n\t\t\tif(img.complete){\n\t\t\t\ttest();\n\t\t\t}\n\t\t};\n\t})();\n\n\tif(!lazySizes.hasHDescriptorFix && window.HTMLPictureElement && supportSrcset && document.msElementsFromPoint){\n\t\tlazySizes.hasHDescriptorFix = true;\n\t\tfixEdgeHDescriptor();\n\t}\n}));\n"
  },
  {
    "path": "plugins/fix-ios-sizes/fix-ios-sizes.js",
    "content": "/**\n * Some versions of iOS (8.1-) do load the first candidate of a srcset candidate list, if width descriptors with the sizes attribute is used.\n * This tiny extension prevents this wasted download by creating a picture structure around the image.\n * Note: This extension is already included in the ls.respimg.js file.\n *\n * Usage:\n *\n * <img\n * \tclass=\"lazyload\"\n * \tdata-sizes=\"auto\"\n * \tdata-srcset=\"small.jpg 640px,\n * \t\tmedium.jpg 980w,\n * \t\tlarge.jpg 1280w\"\n * \t/>\n */\n\n(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t'use strict';\n\tvar regPicture;\n\tvar lazySizesCfg = lazySizes.cfg;\n\tvar img = document.createElement('img');\n\n\tif(('srcset' in img) && !('sizes' in img) && !window.HTMLPictureElement){\n\t\tregPicture = /^picture$/i;\n\t\tdocument.addEventListener('lazybeforeunveil', function(e){\n\t\t\tif(e.detail.instance != lazySizes){return;}\n\n\t\t\tvar elem, parent, srcset, sizes, isPicture;\n\t\t\tvar picture, source;\n\t\t\tif(e.defaultPrevented ||\n\t\t\t\tlazySizesCfg.noIOSFix ||\n\t\t\t\t!(elem = e.target) ||\n\t\t\t\t!(srcset = elem.getAttribute(lazySizesCfg.srcsetAttr)) ||\n\t\t\t\t!(parent = elem.parentNode) ||\n\t\t\t\t(\n\t\t\t\t\t!(isPicture = regPicture.test(parent.nodeName || '')) &&\n\t\t\t\t\t!(sizes = elem.getAttribute('sizes') || elem.getAttribute(lazySizesCfg.sizesAttr))\n\t\t\t\t)\n\t\t\t){return;}\n\n\t\t\tpicture = isPicture ? parent : document.createElement('picture');\n\n\t\t\tif(!elem._lazyImgSrc){\n\t\t\t\tObject.defineProperty(elem, '_lazyImgSrc', {\n\t\t\t\t\tvalue: document.createElement('source'),\n\t\t\t\t\twritable: true\n\t\t\t\t});\n\t\t\t}\n\t\t\tsource = elem._lazyImgSrc;\n\n\t\t\tif(sizes){\n\t\t\t\tsource.setAttribute('sizes', sizes);\n\t\t\t}\n\n\t\t\tsource.setAttribute(lazySizesCfg.srcsetAttr, srcset);\n\t\t\telem.setAttribute('data-pfsrcset', srcset);\n\t\t\telem.removeAttribute(lazySizesCfg.srcsetAttr);\n\n\t\t\tif(!isPicture){\n\t\t\t\tparent.insertBefore(picture, elem);\n\t\t\t\tpicture.appendChild(elem);\n\t\t\t}\n\t\t\tpicture.insertBefore(source, elem);\n\t\t});\n\t}\n}));\n"
  },
  {
    "path": "plugins/include/README.md",
    "content": "# lazysizes include plugin\n\n**lazysizes** include extension/plugin asynchronously include non crucial content, styles or JS modules. Due to lazyloading, prioritized queuing and preload after load techniques lazySizes include extension scales much better than similar other solutions.\n\nTypical use cases are:\n\n* lazy loading different content, styles or JS modules depending on certain conditions (responsive content, responsive behavior, media queries, existence of a DOM element, browser features, user preferences, element queries...)\n* deferring heavy to render or uncacheable content (client or server side)\n* progressively enhancing the document with new JS enabled content\n* splitting or deferred loading of large JS/CSS modules in larger projects\n* clean and simple architecture for initialization/loading and/or destroying/unloading of (conditional) JS behaviors\n* deferred self-initializing of DOM behaviors\n\n## Basic usage\n\nPut a ``data-include`` attribute on your ``.lazyload`` element and reference the URL to load:\n\n```html\n<aside class=\"related-articles lazyload\" data-include=\"related-articles.html?contentid=32\">\n</aside>\n```\n\nThe ``data-include`` can also consume a list of candidates represented by a URL in combination with an optional parenthesised condition. The lazySizes include extension will then take the first URL, that matches the condition:\n\n```html\n<div class=\"dynamic-content lazyload\"\n\tdata-include=\"large.html (min-width: 800px), small.html\">\n</div>\n```\n\nThe condition is either a media query or the name of a configured condition rule. The condition rule can be configured through CSS or through JS via the ``include.conditions`` option.\n\n### Condition configuration through CSS\n\nThe Lazysizes include extension checks wether the condition name matches the CSS ``content`` value the of ``:after`` or ``:before`` pseudo elements from the ``html`` element (can be configured).\n\n```html\n<style>\nhtml:after {\n\tdisplay: none;\n\tcontent: \"small\";\n}\n\n@media (min-width: 760px){\n\thtml:after {\n\t\tcontent: \"medium\";\n\t}\n}\n\n@media (min-width: 980px){\n\thtml:after {\n\t\tcontent: \"large\";\n\t}\n}\n</style>\n\n<div class=\"dynamic-content lazyload\"\n\tdata-include=\"large.html (large), medium.html (medium), small.html\">\n</div>\n```\n\n### Condition configuration through JS\n\nA condition can also be configured through the ``lazySizesConfig.include.conditions`` option map. Each key is either a string representing a media query or a function:\n\n```html\n<script>\nwindow.lazySizesConfig = {\n\tinclude: {\n\t\tconditions: {\n\t\t\tsmall: '(max-width: 480px)',\n\t\t\tcustom: function(element, data){\n\t\t\t\treturn true || false;\n\t\t\t}\n\t\t}\n\t}\n};\n</script>\n\n<div class=\"dynamic-content lazyload\"\n\tdata-include=\"small.html (small), custom.html (custom), default.html\">\n</div>\n```\n\nIf the last include candidate has a condition, the ``innerHTML`` of the initial content is used as unconditioned fallback content.\n\n```html\n<div class=\"dynamic-content lazyload\"\n\tdata-include=\"large.html (min-width: 800px)\">\n\t<!-- initial content + content for (max-width 799px) -->\n</div>\n```\n\nAs soon as the content is changed a ``lazyincluded`` event is fired at the element:\n\n```html\n<script>\ndocument.addEventListener('lazyincluded', function(e){\n\t// e.target has new content\n});\n</script>\n\n<div class=\"dynamic-content lazyload\" data-include=\"small.html\">\n</div>\n```\n\n### Loading Styles or (AMD) Modules\n\nThe include feature can also load CSS, AMD or ES6 modules. To mark an URL as CSS put a ``css:``, to load an AMD module put a ``amd:`` or to load an ES6 module put a ``module:`` identifier in front of the URL:\n\n```html\n<div class=\"dynamic-content lazyload\" data-include=\"css:my-style.css (large)\">\n</div>\n\n<div class=\"slider lazyload\" data-include=\"amd:path/slider-module\">\n</div>\n```\n\nContent, Style and AMD includes can also be mixed and used with or without conditions:\n\n```html\n<div class=\"slider lazyload\"\n\tdata-include=\"slider.html amd:path/slider-module css:slider.css (large),\n\t\tmodule:path/mobile-slider, css:mobile-slider.css\">\n</div>\n```\n\nIn case content and a behavior include is used together lazySizes will load them in parallel but makes sure to first include the content and then initialize the behavior.\n\n#### AMD/ES6 module features\n\nWhile you can write your AMD/ES6 module how you want lazysizes include extension will check wether your module provides the following methods:\n\n* ``yourmodule.lazytransform``: Will be invoked before the content is inserted. Especially to transform the AJAX response. (For example JSON to HTML)\n* ``yourmodule.lazyload``: Callback function to initialize the module. Will be invoked after the content was inserted.\n* ``yourmodule.lazyunload``: Callback function to destroy your widget. Will be invoked before old content is removed\n\nEach of those methods are optional static methods of a module. Here is a simple example:\n\n```js\ndefine(function(){\n\n\t// constructor\n\tvar Slider = function(element,options) {\n\n\t};\n\n\tSlider.prototype = {\n\t\tdestroy: function(){}\n\t};\n\n\t// lazysizes include features:\n\n\t// called with the DOM element (data.target) and some other useful data (data.detail)\n\t// useful to initialize with the DOM element\n\tSlider.lazyload = function(data){\n\t\tvar\tSlider = new Slider(data.target);\n\t\t// save instance for destroy / lazyunload\n\t\t// data.element._slider = Slider;\n\t};\n\n\t// in case of a conditioned include and\n\t// the need to destroy the instance (i.e.: unbind global events)\n\tSlider.lazyunload = function(data){\n\t\t// data.target._slider.destroy();\n\t};\n\n\t// gets invoked with the a simplified XHR object (data.detail)\n\t// and the dom element (data.target)\n\tSlider.lazytransform = function(data){\n\t\t// var json = JSON.parse(data.detail.responseText);\n\t\t// data.detail.response = template(json);\n\t};\n\n\treturn Slider;\n});\n```\n\nIn case a candidate includes new markup while another candidate only includes an AMD behavior. The initial content will be automatically resetted in case of a condition switch:\n\n```html\n<div class=\"lazyload\" data-include=\"slider.html amd:js/slider (big),\n\tamd:js/mobileSlider\">\n    <!-- amd:mobileSlider always works with the initial content and never on the slider.html include -->\n</div>\n```\n\nIn case both candidates has an amd module but not a content include the markup won't be resetted automatically. But the unloading module can request this behavior inside of it's unload method or the to initialized module can request this inside the ``lazytransform`` method using the ``resetHTML`` propety:\n\n```js\nSlider.lazyunload = function(data){\n    // data.element._slider.destroy();\n    data.resetHTML = true;\n};\n\n//or\n\nNewSlider.lazytransform = function(data){\n    // data.element._slider.destroy();\n    data.resetHTML = true;\n};\n```\n\nIn case the content doesn't contain any mutable states, that need to be transferred to the new behavior (i.e. input fields etc.), this option makes it extremley simple to cleanup the HTML for the next module.\n\nThe data object is shared between the ``lazyunload``, ``lazytransform`` and ``lazyload`` so that a possible state can be transferred.\n\n#### Loading multiple styles and modules\n\nMultiple styles or AMD modules for one candidate can be configured by separating them with ``|,|`` signs:\n\n\n```html\n<div class=\"slider lazyload\"\n\tdata-include=\"amd:path/uiModule|,|path/slider-module css:slider-core.css|,|slider.css (large),\n\t\tamd:path/mobile-slider, css:slider-core.css|,|mobile-slider.css\">\n</div>\n```\n\n### Scalability and queue priority\n\nThe include feature will always use a download queue to make sure, that multiple includes do not jam the browsers own request queue. In case of many non crucial includes mixed with some crucial includes on one page the ``data-lazyqueue`` attribute can be used to add a queue priority for the include extension:\n\n```html\n<li>\n\t<a href=\"\">Category 1\n\t\t(articles:\n\t\t<span class=\"lazyload\" data-include=\"count-service?id=32\" data-lazyqueue=\"\"></span>\n\t\t)\n\t</a>\n</li>\n\n<li>\n\t<a href=\"\">Category 2\n\t\t(articles:\n\t\t<span class=\"lazyload\" data-include=\"count-service?id=33\" data-lazyqueue=\"\"></span>\n\t\t)\n\t</a>\n</li>\n\n<li>\n\t<a href=\"\">Category 3\n\t\t(articles:\n\t\t<span class=\"lazyload\" data-include=\"count-service?id=34\" data-lazyqueue=\"\"></span>\n\t\t)\n\t</a>\n</li>\n<!-- more lazyqueued elements -->\n\n<div class=\"lazyload\" data-include=\"large.html (min-width: 800px), default.html\">\n\t<!-- crucial conditional content -->\n</div>\n```\n\n### Events\n\n* ``lazyincludeload`` is a cancelable event fired at the element before the request is started. The ``event.detail`` object can be used to modify the XHR request.\n* ``lazyincludeloaded`` is a cancelable event fired at the element after the request is complete, but before the content is added. The ``event.detail.content`` property can be used to modify the content (for example to transform JSON to HTML).\n* ``lazyincluded`` is an event fired at the element right after the HTML was injected.\n\nHere are some examples:\n\n```js\nconst component = document.querySelector('.lazy-component');\n\n// Modify the request headers when the targeted component kicks off an XHR\ncomponent.addEventListener('lazyincludeload', function(event) {\n  if (event.detail) {\n    event.detail.xhrModifier = function(request, candidate) {\n      request.setRequestHeader('Accept', 'application/json');\n    }\n  }\n});\n\n// Transform a JSON response into HTML before it is injected\ncomponent.addEventListener('lazyincludeloaded', function(event) {\n  if (event.detail.content) {\n    var json = JSON.parse(event.detail.content);\n    var html = '<h1>' + json.title + '</h1>';\n    html += '<div>' + json.body + '</div>';\n    event.detail.content = html;\n  }\n});\n```\n\n### Options\nAll include options are configurable through the ``lazySizesConfig.include`` option object:\n\n#### ``contentElement`` (default: ``\"html\"``):\n\nThe selector of the element, which should be used to check for the CSS content value:\n\n\n```js\nwindow.lazySizesConfig = {\n\tinclude: {\n\t\tcontentElement: '#mediaqueries' // 'html'\n\t}\n};\n```\n\n#### ``conditions`` option (default: ``{}``):\nThe conditions option can be used to create new custom conditions.\n\n```js\nwindow.lazySizesConfig = {\n\taddClasses: true, // good to add loading styles\n\tinclude: {\n\t\tconditions: {\n\t\t\tsmall: '(max-width: 480px)',\n\t\t\tcustom: function(elem, data){\n\t\t\t\treturn true || false;\n\t\t\t}\n\t\t}\n\t}\n};\n```\n\n#### ``map`` option (default: ``{}``):\n\nThe ``map`` option allows to map the value of the ``data-include`` attribute to another string. This does not only work for the hole value, but also for parsed parts.\n\n```html\n<script>\nwindow.lazySizesConfig = {\n\taddClasses: true, // good to add loading styles\n\tinclude: {\n\t\tmap: {\n\t\t\tslider: 'slider.html amd:path/slider (large)',\n\t\t\tamdSlider: 'jquery|,|path/ui-slick'\n\t\t}\n\t}\n};\n</script>\n\n<div class=\"lazyload\" data-include=\"slider\"></div>\n\n<div class=\"lazyload\" data-include=\"amd:amdSlider\"></div>\n```\n\nThis option becomes useful to separate content from behavior.\n\nThe include feature works together with all normal lazySizes options (i.e.: ``addClasses`` for load indicators), events and methods.\n\n## Reacting to user interaction\n\nOf course it is also possible to react to a user interaction.\n\n```html\n<!-- markup has data-include, but no lazyload class -->\n<div class=\"dynamic-content\" data-include=\"include.html\">\n\t<button type=\"button\" class=\"load-include\">load content</button>\n</div>\n\n\n<script>\n$(document).on('click', '.load-include', function(){\n\t$(this)\n\t\t//set button to disabled\n\t\t.prop('disabled', true)\n\t\t\t//get parent include area\n\t\t\t.closest('[data-include]')\n\t\t\t// and activate lazySizes by adding lazyload class\n\t\t\t.addClass('lazyload')\n\t;\n});\n</script>\n```\n\nIt's also possible to change the ``data-include`` value and reevaluate it:\n\n```html\n<div class=\"dynamic-content lazyload\" data-include=\"include.html amd:module (min-width: 800px)\">\n\t<button type=\"button\" class=\"load-include\" data-setinclude=\"include.html amd:module\">load content</button>\n</div>\n\n\n<script>\n$(document).on('click', '.load-include', function(){\n\t$(this)\n\t\t//set button to disabled\n\t\t.prop('disabled', true)\n\t\t\t//get parent include area\n\t\t\t.closest('[data-include]')\n\t\t\t//change data-include value\n\t\t\t.attr('data-include', $.attr(this, 'data-setinclude'))\n\t\t\t// and activate/refresh lazySizes by re-adding lazyload class\n\t\t\t.addClass('lazyload')\n\t;\n});\n</script>\n```\n\n## Sharing States between two modules\n\n\n```html\n<nav class=\"lazyload\" data-include=\"amd:js/nav (big),\n\tamd:js/mobileNav\">\n    <!-- content  -->\n</nav>\n```\n\n```js\ndefine(function(){\n\n\t// constructor\n\tvar Nav = function(element,options) {\n\n\t};\n\n\tNav.prototype = {\n\n\t};\n\n\tNav.lazyunload = function(data){\n    \t//Reset HTML for mobileNav\n\t    data.resetHTML = true;\n        //share the value of the input field with mobileNav\n\t\tdata.shareState = {\n        \tsearchValue: $('input.search', data.target).val();\n        };\n\t};\n\n\tNav.lazyload = function(data){\n    \t//check wether mobileNav has shared some data\n\t\tif(data.shareState){\n\t        $('input.search', data.target).val(data.shareState.searchValue || '');\n        }\n\t};\n\n\treturn Nav;\n});\n```\n\nNote: For amd require JS or SystemJS to work the `requireJs` and/or the `systemJs` option has to be provided:\n\n\n```js\nwindow.lazySizesConfig = window.lazySizesConfig || {};\n\nwindow.lazySizesConfig.requireJs = function(modules, cb){\n\twindow.require(modules, cb);\n};\n\nwindow.lazySizesConfig.systemJs = function(module, cb){\n\twindow.System.import(module).then(cb);\n};\n```\n"
  },
  {
    "path": "plugins/include/ls.include.js",
    "content": "/*\n This plugin extends lazySizes to lazyLoad and/or conditionally load content\n */\n\n(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\n\tif(!document.getElementsByClassName) {\n\t\treturn;\n\t}\n\tvar config, includeConfig, baseContentElement, basePseudos;\n\tvar regSplitCan = /\\s*,+\\s+/;\n\tvar cssComplete = {complete: 1, loaded: 1};\n\tvar uniqueUrls = {};\n\tvar regWhite = /\\s+/;\n\tvar regTypes = /^(amd|css|module)\\:(.+)/i;\n\tvar regUrlCan = /(.+)\\s+(\\(\\s*(.+)\\s*\\))/;\n\tvar regCleanPseudos = /['\"]/g;\n\tvar docElem = document.documentElement;\n\tvar conditionalIncludes = document.getElementsByClassName('lazyconditionalinclude');\n\n\tvar getStyles = function (element, pseudo) {\n\t\tvar view = element.ownerDocument.defaultView;\n\n\t\tif (!view.opener) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle(element, pseudo || null) || {getPropertyValue: function(){}, isNull: true};\n\t};\n\n\tvar queue = (function(){\n\t\tvar lowTreshold = 2;\n\t\tvar highTreshold = 3;\n\t\tvar queueThreshold = lowTreshold;\n\t\tvar inProgress = 0;\n\t\tvar priosInProgress = 0;\n\t\tvar queue = [];\n\t\tvar resetQueue = (function(){\n\t\t\tvar timer;\n\t\t\tvar reset = function(){\n\t\t\t\tif(queue.length){\n\t\t\t\t\tinProgress = 0;\n\t\t\t\t\tqueue.d();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn function(){\n\t\t\t\tclearTimeout(timer);\n\t\t\t\ttimer = setTimeout(reset, 999);\n\t\t\t};\n\t\t})();\n\n\t\treturn {\n\t\t\tq: function(element){\n\t\t\t\tvar isPrio = element.getAttribute('data-lazyqueue') == null;\n\t\t\t\tif(isPrio){\n\t\t\t\t\tpriosInProgress++;\n\t\t\t\t\tqueueThreshold = highTreshold;\n\t\t\t\t}\n\n\t\t\t\tif(inProgress > queueThreshold){\n\t\t\t\t\tqueue[isPrio ? 'unshift' : 'push'](element);\n\t\t\t\t} else if(findLoadCandidate(element)) {\n\t\t\t\t\tinProgress++;\n\t\t\t\t\tresetQueue();\n\t\t\t\t}\n\t\t\t},\n\t\t\td: function(){\n\t\t\t\tif(inProgress){\n\t\t\t\t\tinProgress--;\n\t\t\t\t}\n\t\t\t\tif(priosInProgress > 0){\n\t\t\t\t\tpriosInProgress--;\n\n\t\t\t\t\tif(!priosInProgress){\n\t\t\t\t\t\tqueueThreshold = lowTreshold;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(inProgress > queueThreshold){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\twhile(queue.length){\n\t\t\t\t\tif(findLoadCandidate(queue.shift())){\n\t\t\t\t\t\tinProgress++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresetQueue();\n\t\t\t}\n\t\t};\n\t})();\n\tvar refreshIncludes = (function(){\n\t\tvar timer;\n\t\tvar run = function(){\n\t\t\tvar i = 0;\n\t\t\tvar len = conditionalIncludes.length;\n\t\t\tfor(; i < len; i++){\n\t\t\t\tif(!lazySizes.hC(conditionalIncludes[i], config.lazyClass) && findCandidate(conditionalIncludes[i])){\n\t\t\t\t\tlazySizes.aC(conditionalIncludes[i], config.lazyClass);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn function(e){\n\t\t\tclearTimeout(timer);\n\t\t\tbasePseudos = null;\n\t\t\ttimer = setTimeout(run, e.type == 'resize' ? 31 : 0);\n\t\t};\n\t})();\n\n\tconfig = lazySizes && lazySizes.cfg;\n\n\tif(!config.include){\n\t\tconfig.include = {};\n\t}\n\n\tincludeConfig = config.include;\n\n\tif(!includeConfig.contentElement){\n\t\tincludeConfig.contentElement = 'html';\n\t}\n\n\tif(!includeConfig.conditions){\n\t\tincludeConfig.conditions = {};\n\t}\n\n\tif(!includeConfig.map){\n\t\tincludeConfig.map = {};\n\t}\n\n\tfunction addUrl(url){\n\t\t/*jshint validthis:true */\n\t\tvar match;\n\t\tif((match = url.match(regTypes))){\n\t\t\tthis.urls[match[1]] = includeConfig.map[match[2]] || match[2];\n\t\t} else {\n\t\t\tthis.urls.include = includeConfig.map[url] || url;\n\t\t}\n\t}\n\n\tfunction parseCandidate(input){\n\t\tvar output, map, url;\n\t\tinput = input.trim();\n\n\t\tinput = includeConfig.map[input] || input;\n\n\t\tmap = input.match(regUrlCan);\n\n\t\tif(map){\n\t\t\turl = map[1];\n\t\t\toutput = {\n\t\t\t\tcondition: config.include.conditions[map[3]] || config.customMedia[map[3]] || map[2] || null,\n\t\t\t\tname: map[3]\n\t\t\t};\n\t\t} else {\n\t\t\turl = input;\n\t\t\toutput = {\n\t\t\t\tcondition: null,\n\t\t\t\tname: ''\n\t\t\t};\n\t\t}\n\n\t\toutput.urls = {};\n\n\t\t(includeConfig.map[url] || url).split(regWhite).forEach(addUrl, output);\n\n\t\tif(!output.urls.include && output.urls.amd){\n\t\t\t/*jshint validthis:true */\n\t\t\tthis.saved = true;\n\t\t\toutput.initial = this;\n\t\t}\n\n\t\treturn output;\n\t}\n\n\tfunction getIncludeData(elem){\n\t\tvar len;\n\t\tvar includeStr = (elem.getAttribute('data-include') || '');\n\t\tvar includeData = elem.lazyInclude;\n\t\tvar initialContent;\n\t\tif(!includeData || includeData.str != includeStr || includeConfig.allowReload){\n\t\t\tinitialContent = {saved: false, content: null};\n\t\t\tincludeData = {\n\t\t\t\tstr: includeStr,\n\t\t\t\tcandidates: (includeConfig.map[includeStr] || includeStr).split(regSplitCan).map(parseCandidate, initialContent)\n\t\t\t};\n\n\t\t\tif(!(len = includeData.candidates.length) || includeData.candidates[len - 1].condition){\n\t\t\t\tinitialContent.saved = true;\n\n\t\t\t\tincludeData.candidates.push({\n\t\t\t\t\turls: {},\n\t\t\t\t\tcondition: null,\n\t\t\t\t\tname: 'initial',\n\t\t\t\t\tcontent: initialContent\n\t\t\t\t});\n\t\t\t} else if(initialContent.saved && includeData.candidates.length == 1){\n\t\t\t\tinitialContent.saved = false;\n\t\t\t}\n\n\t\t\tincludeData.initialContent = initialContent;\n\t\t\tif(initialContent.saved){\n\t\t\t\tinitialContent.content = elem.innerHTML;\n\t\t\t}\n\n\t\t\telem.lazyInclude = includeData;\n\t\t\tif(includeData.candidates.length > 1){\n\t\t\t\tlazySizes.aC(elem, 'lazyconditionalinclude');\n\t\t\t} else {\n\t\t\t\tlazySizes.rC(elem, 'lazyconditionalinclude');\n\t\t\t}\n\t\t}\n\t\treturn includeData;\n\t}\n\n\tfunction matchesCondition(elem, candidate){\n\t\tvar matches = !candidate.condition;\n\n\t\tif(candidate.condition){\n\t\t\tcreatePseudoCondition();\n\t\t\tif(basePseudos[candidate.name]){\n\t\t\t\tmatches = true;\n\t\t\t} else if(window.matchMedia && typeof candidate.condition == 'string'){\n\t\t\t\tmatches = (matchMedia(candidate.condition) || {}).matches;\n\t\t\t} else if(typeof candidate.condition == 'function'){\n\t\t\t\tmatches = candidate.condition(elem, candidate);\n\t\t\t}\n\t\t}\n\t\treturn matches;\n\t}\n\n\n\tfunction createPseudoCondition(){\n\t\tvar cStyle;\n\n\t\tif(!basePseudos){\n\n\t\t\tif(!baseContentElement){\n\t\t\t\tbaseContentElement = document.querySelector(includeConfig.contentElement);\n\t\t\t}\n\n\t\t\tif(baseContentElement){\n\t\t\t\tcStyle = (getStyles(baseContentElement, ':after').getPropertyValue('content') || 'none').replace(regCleanPseudos, '');\n\n\t\t\t\tbasePseudos = {};\n\n\t\t\t\tif(cStyle){\n\t\t\t\t\tbasePseudos[cStyle] = 1;\n\t\t\t\t}\n\t\t\t\tcStyle = (getStyles(baseContentElement, ':before').getPropertyValue('content') || 'none').replace(regCleanPseudos, '');\n\t\t\t\tif(cStyle){\n\t\t\t\t\tbasePseudos[cStyle] = 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbasePseudos = {};\n\t\t\t}\n\t\t}\n\n\t}\n\n\tfunction findCandidate(elem){\n\t\tvar i, candidate;\n\t\tvar includeData = elem.lazyInclude;\n\t\tif(includeData && includeData.candidates){\n\t\t\tfor(i = 0; i < includeData.candidates.length; i++){\n\t\t\t\tcandidate = includeData.candidates[i];\n\t\t\t\tif(matchesCondition(elem, candidate)){\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(!candidate || candidate == includeData.current){\n\t\t\tcandidate = null;\n\t\t}\n\t\treturn candidate;\n\t}\n\n\tfunction loadInclude(detail, includeCallback){\n\t\tvar request = new XMLHttpRequest();\n\n\t\trequest.addEventListener('readystatechange', function () {\n\t\t\tvar DONE = this.DONE || 4;\n\t\t\tif (this.readyState === DONE){\n\n\t\t\t\tincludeCallback(request);\n\t\t\t\trequest = null;\n\t\t\t}\n\t\t}, false);\n\n\t\trequest.open.apply(request, detail.openArgs);\n\t\trequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\t\tif(detail.xhrModifier){\n\t\t\tdetail.xhrModifier(request, detail.candidate);\n\t\t}\n\t\trequest.send(detail.sendData);\n\t}\n\n\tfunction loadRequire(urls, callback){\n\t\turls = urls.split('|,|');\n\n\t\tvar last = urls.length - 1;\n\n\t\tif(lazySizes.cfg.requireJs){\n\t\t\tlazySizes.cfg.requireJs(urls, callback);\n\t\t} else {\n\t\t\turls.forEach(function(url, index){\n\t\t\t\tloadStyleScript(url, index == last ? callback : null);\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction loadSystemJs(url, callback){\n\t\tif(lazySizes.cfg.systemJs){\n\t\t\tlazySizes.cfg.systemJs(url, callback);\n\t\t} else {\n\t\t\tloadStyleScript(url, callback);\n\t\t}\n\t}\n\n\tfunction isStyleReady(link){\n\t\tvar ready = false;\n\t\tvar sheets = document.styleSheets;\n\t\tvar href = link.href;\n\n\t\tfor(var i = 0, length = sheets.length; i < length; i++){\n\t\t\tif(sheets[i].href == href){\n\t\t\t\tready = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\n\t\treturn ready;\n\t}\n\n\tfunction loadStyleScript(url, isScript, cb){\n\t\tif(!uniqueUrls[url]){\n\t\t\tvar elem = document.createElement(isScript === true ? 'script' : 'link');\n\t\t\tvar insertElem = document.getElementsByTagName('script')[0];\n\n\t\t\tif(isScript){\n\t\t\t\telem.src = url;\n\t\t\t\telem.async = false;\n\t\t\t} else {\n\t\t\t\telem.rel = 'stylesheet';\n\t\t\t\telem.href = url;\n\t\t\t}\n\n\t\t\tuniqueUrls[url] = [];\n\t\t\tuniqueUrls[elem.href] = uniqueUrls[url];\n\n\t\t\tif(cb){\n\t\t\t\tvar timer;\n\t\t\t\tvar load = function(e){\n\t\t\t\t\tif(e.type == 'readystatechange' && !cssComplete[e.target.readyState]){return;}\n\n\t\t\t\t\tvar cbs = uniqueUrls[url];\n\n\t\t\t\t\telem.removeEventListener('load', load);\n\t\t\t\t\telem.removeEventListener('error', load);\n\t\t\t\t\telem.removeEventListener('readystatechange', load);\n\t\t\t\t\telem.removeEventListener('loadcssdefined', load);\n\n\t\t\t\t\tif(timer){\n\t\t\t\t\t\tclearInterval(timer);\n\t\t\t\t\t}\n\n\t\t\t\t\tuniqueUrls[url] = true;\n\t\t\t\t\tuniqueUrls[elem.href] = true;\n\n\t\t\t\t\twhile(cbs.length){\n\t\t\t\t\t\tcbs.shift()();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tuniqueUrls[elem.href][0] = cb;\n\n\t\t\t\tif(!isScript){\n\t\t\t\t\ttimer = setInterval(function(){\n\t\t\t\t\t\tif(isStyleReady(elem)){\n\t\t\t\t\t\t\tload({});\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 60);\n\t\t\t\t}\n\n\t\t\t\telem.addEventListener('load', load);\n\t\t\t\telem.addEventListener('error', load);\n\t\t\t\telem.addEventListener('readystatechange', load);\n\t\t\t\telem.addEventListener('loadcssdefined', load);\n\n\t\t\t}\n\n\t\t\tinsertElem.parentNode.insertBefore(elem, insertElem);\n\t\t} else if(cb){\n\t\t\tif(uniqueUrls[url] === true){\n\t\t\t\tsetTimeout(cb);\n\t\t\t} else {\n\t\t\t\tuniqueUrls[url].push(cb);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction loadStyles(urls, cb){\n\t\turls = urls.split('|,|');\n\n\t\tvar last = urls.length - 1;\n\n\t\turls.forEach(function(url, index){\n\t\t\tloadStyleScript(url, false, index == last ? cb : null);\n\t\t});\n\t}\n\n\tfunction transformInclude(module){\n\t\tif(module && typeof module.lazytransform == 'function'){\n\t\t\t/*jshint validthis:true */\n\t\t\tmodule.lazytransform(this);\n\t\t}\n\t}\n\n\tfunction unloadModule(module){\n\t\tif(module && typeof module.lazyunload == 'function'){\n\t\t\t/*jshint validthis:true */\n\t\t\tmodule.lazyunload(this);\n\t\t}\n\t}\n\n\tfunction loadModule(module){\n\t\tif(module && typeof module.lazyload == 'function'){\n\t\t\t/*jshint validthis:true */\n\t\t\tmodule.lazyload(this);\n\t\t}\n\t}\n\n\tfunction loadCandidate(elem, candidate){\n\t\tvar include, xhrObj, modules, waitCss, runInclude;\n\t\tvar old = elem.lazyInclude.current || null;\n\t\tvar detail = {\n\t\t\tcandidate: candidate,\n\t\t\topenArgs: ['GET', candidate.urls.include, true],\n\t\t\tsendData: null,\n\t\t\txhrModifier: null,\n\t\t\tcontent: candidate.content && candidate.content.content || candidate.content,\n\t\t\toldCandidate: old\n\t\t};\n\t\tvar event = lazySizes.fire(elem, 'lazyincludeload', detail);\n\n\t\tif(event.defaultPrevented){\n\t\t\tqueue.d();\n\t\t\treturn;\n\t\t}\n\n\t\trunInclude = function(){\n\t\t\tif(xhrObj && modules && !waitCss){\n\t\t\t\tinclude();\n\t\t\t}\n\t\t};\n\n\t\tinclude = function(){\n\t\t\tvar event;\n\t\t\tvar status = xhrObj.status;\n\t\t\tvar content = xhrObj.content || xhrObj.responseText;\n\t\t\tvar reset = !!(content == null && old && old.urls.include);\n\t\t\tvar detail = {\n\t\t\t\tcandidate: candidate,\n\t\t\t\tcontent: content,\n\t\t\t\ttext: xhrObj.responseText || xhrObj.content,\n\t\t\t\tresponse: xhrObj.response,\n\t\t\t\txml: xhrObj.responseXML,\n\t\t\t\tisSuccess: ('status' in xhrObj) ? status >= 200 && status < 300 || status === 304 : true,\n\t\t\t\toldCandidate: old,\n\t\t\t\tinsert: true,\n\t\t\t\tresetHTML: reset\n\t\t\t};\n\t\t\tvar moduleObj = {target: elem, details: detail, detail: detail};\n\n\t\t\tcandidate.modules = modules;\n\n\t\t\tif(old && old.modules){\n\t\t\t\told.modules.forEach(unloadModule, moduleObj);\n\t\t\t\told.modules = null;\n\n\t\t\t\tif(detail.resetHTML && detail.content == null && candidate.initial && candidate.initial.saved){\n\t\t\t\t\tdetail.content = candidate.initial.content;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tmodules.forEach(transformInclude, moduleObj);\n\n\t\t\tevent = lazySizes.fire(elem, 'lazyincludeloaded', detail);\n\n\t\t\tif(detail.insert && detail.isSuccess && !event.defaultPrevented && detail.content != null && detail.content != elem.innerHTML){\n\t\t\t\telem.innerHTML = detail.content;\n\t\t\t}\n\n\t\t\tqueue.d();\n\n\t\t\tmodules.forEach(loadModule, moduleObj);\n\n\t\t\tsetTimeout(function(){\n\t\t\t\tlazySizes.fire(elem, 'lazyincluded', detail);\n\t\t\t});\n\n\t\t\txhrObj = null;\n\t\t\tmodules = null;\n\t\t};\n\n\t\telem.lazyInclude.current = candidate;\n\t\telem.setAttribute('data-currentinclude', candidate.name);\n\n\t\tif(candidate.urls.css){\n\t\t\twaitCss = true;\n\t\t\tloadStyles(candidate.urls.css, function () {\n\t\t\t\twaitCss = false;\n\t\t\t\trunInclude();\n\t\t\t});\n\t\t}\n\t\tif(detail.content == null && candidate.urls.include){\n\t\t\tloadInclude(detail, function(data){\n\t\t\t\txhrObj = data;\n\t\t\t\trunInclude();\n\t\t\t});\n\t\t} else {\n\t\t\txhrObj = detail;\n\t\t}\n\n\t\tif(candidate.urls.amd || candidate.urls.module){\n\t\t\tvar loadRequireImportCB = function(){\n\t\t\t\tmodules = Array.prototype.slice.call(arguments);\n\t\t\t\trunInclude();\n\t\t\t};\n\n\t\t\tif(candidate.urls.amd){\n\t\t\t\tloadRequire(candidate.urls.amd, loadRequireImportCB);\n\t\t\t} else {\n\t\t\t\tloadSystemJs(candidate.urls.module, loadRequireImportCB);\n\t\t\t}\n\n\t\t} else {\n\t\t\tmodules = [];\n\t\t}\n\n\t\trunInclude();\n\t}\n\n\tfunction findLoadCandidate(elem){\n\t\tvar candidate;\n\t\tvar includeData = getIncludeData(elem);\n\t\tif(!includeData.candidates.length || !docElem.contains(elem) ){return;}\n\t\tcandidate = findCandidate(elem);\n\t\tif(candidate){\n\t\t\tloadCandidate(elem, candidate);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction beforeUnveil(e){\n\t\tif(e.detail.instance != lazySizes || e.defaultPrevented || !e.target.getAttribute('data-include')){return;}\n\t\tqueue.q(e.target);\n\t\te.detail.firesLoad = true;\n\t}\n\n\taddEventListener('lazybeforeunveil', beforeUnveil, false);\n\n\taddEventListener('resize', refreshIncludes, false);\n\taddEventListener('lazyrefreshincludes', refreshIncludes, false);\n\n}));\n"
  },
  {
    "path": "plugins/native-loading/README.md",
    "content": "# lazysizes native loading extension\n\nThis extension automatically transforms `img.lazyload`/`iframe.lazyload` elements in browsers that support native lazy loading.\n\n## Usage\n\nSimply include the plugin:\n\n```js\nimport lazySizes from 'lazysizes';\nimport 'lazysizes/plugins/native-loading/ls.native-loading';\n```\n\nAnd use normal lazySizes markup in combination with the `loading` attribute:\n\n```html\n<img\n\tloading=\"lazy\"\n\tdata-sizes=\"auto\"\n\tdata-srcset=\"http://placehold.it/175x75 175w,\n\thttp://placehold.it/350x150 350w,\n\thttp://placehold.it/700x300 700w,\n\thttp://placehold.it/1400x600 1400w\"\n\tdata-src=\"http://placehold.it/700x300\"\n\tclass=\"lazyload\" />\n```\n\n## `nativeLoading` Options\n\nOptions are changed at the `lazySizes.cfg.nativeLoading` options object:\n\n```js\nimport lazySizes from 'lazysizes';\nimport 'lazysizes/plugins/native-loading/ls.native-loading';\n\nlazySizes.cfg.nativeLoading = {\n\tsetLoadingAttribute: true,\n\tdisableListeners: {\n\t\tscroll: true\n\t},\n};\n```\n\n### `setLoadingAttribute` `boolean` option\n\nBy setting `setLoadingAttribute` to `true`. LazySizes will automatically set the `loading=\"lazy\"` attribute for you. `\n\nThis way all `img`/`iframe` elements will natively lazyloaded without any changes to your normal lazySizes markup.\n\n### `disableListeners` `boolean`/`eventMap`\n\nDue to the fact that you can use lazySizes for many things. Native lazy loading does not remove any event listeners automatically.\n\nBy setting `disableListeners` to `true` all events listeners are removed. Often it makes sense to only remove specific events like the scroll event for example.\n\nThe possible full event map looks like this:\n\n```html\n{\n\tfocus: true,\n\tmouseover: true,\n\tclick: true,\n\tload: true,\n\ttransitionend: true,\n\tanimationend: true,\n\tscroll: true,\n\tresize: true,\n}\n```\n"
  },
  {
    "path": "plugins/native-loading/ls.native-loading.js",
    "content": "(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t'use strict';\n\n\tvar imgSupport = 'loading' in HTMLImageElement.prototype;\n\tvar iframeSupport = 'loading' in HTMLIFrameElement.prototype;\n\tvar isConfigSet = false;\n\tvar oldPrematureUnveil = lazySizes.prematureUnveil;\n\tvar cfg = lazySizes.cfg;\n\tvar listenerMap = {\n\t\tfocus: 1,\n\t\tmouseover: 1,\n\t\tclick: 1,\n\t\tload: 1,\n\t\ttransitionend: 1,\n\t\tanimationend: 1,\n\t\tscroll: 1,\n\t\tresize: 1,\n\t};\n\n\tif (!cfg.nativeLoading) {\n\t\tcfg.nativeLoading = {};\n\t}\n\n\tif (!window.addEventListener || !window.MutationObserver || (!imgSupport && !iframeSupport)) {\n\t\treturn;\n\t}\n\n\tfunction disableEvents() {\n\t\tvar loader = lazySizes.loader;\n\t\tvar throttledCheckElements = loader.checkElems;\n\t\tvar removeALSL = function(){\n\t\t\tsetTimeout(function(){\n\t\t\t\twindow.removeEventListener('scroll', loader._aLSL, true);\n\t\t\t}, 1000);\n\t\t};\n\t\tvar currentListenerMap = typeof cfg.nativeLoading.disableListeners == 'object' ?\n\t\t\tcfg.nativeLoading.disableListeners :\n\t\t\tlistenerMap;\n\n\t\tif (currentListenerMap.scroll) {\n\t\t\twindow.addEventListener('load', removeALSL);\n\t\t\tremoveALSL();\n\n\t\t\twindow.removeEventListener('scroll', throttledCheckElements, true);\n\t\t}\n\n\t\tif (currentListenerMap.resize) {\n\t\t\twindow.removeEventListener('resize', throttledCheckElements, true);\n\t\t}\n\n\t\tObject.keys(currentListenerMap).forEach(function(name) {\n\t\t\tif (currentListenerMap[name]) {\n\t\t\t\tdocument.removeEventListener(name, throttledCheckElements, true);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction runConfig() {\n\t\tif (isConfigSet) {return;}\n\t\tisConfigSet = true;\n\n\t\tif (imgSupport && iframeSupport && cfg.nativeLoading.disableListeners) {\n\t\t\tif (cfg.nativeLoading.disableListeners === true) {\n\t\t\t\tcfg.nativeLoading.setLoadingAttribute = true;\n\t\t\t}\n\n\t\t\tdisableEvents();\n\t\t}\n\n\t\tif (cfg.nativeLoading.setLoadingAttribute) {\n\t\t\twindow.addEventListener('lazybeforeunveil', function(e){\n\t\t\t\tvar element = e.target;\n\n\t\t\t\tif ('loading' in element && !element.getAttribute('loading')) {\n\t\t\t\t\telement.setAttribute('loading', 'lazy');\n\t\t\t\t}\n\t\t\t}, true);\n\t\t}\n\t}\n\n\tlazySizes.prematureUnveil = function prematureUnveil(element) {\n\n\t\tif (!isConfigSet) {\n\t\t\trunConfig();\n\t\t}\n\n\t\tif ('loading' in element &&\n\t\t\t(cfg.nativeLoading.setLoadingAttribute || element.getAttribute('loading')) &&\n\t\t\t(element.getAttribute('data-sizes') != 'auto' || element.offsetWidth)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (oldPrematureUnveil) {\n\t\t\treturn oldPrematureUnveil(element);\n\t\t}\n\t};\n\n}));\n"
  },
  {
    "path": "plugins/noscript/README.md",
    "content": "# lazysizes noscript/progressive enhancement extension\n\nThe noscript extension is the true ultimate progressive enhancement extension for lazySizes. It allows you to transform any HTML inside a ``noscript`` element as soon as it becomes visible.\n\n## Markup\n\nThe ``lazyload`` class has to be added to the parent element of the ``noscript`` element and this element has to also have a ``data-noscript`` attribute. As soon as it is near the viewport the content of the ``noscript`` element will replace the content of the ``.lazyload`  element.\n\n```html\n<div class=\"lazyload\" data-noscript=\"\">\n    <noscript>\n        <p>any kind of content you want to be unveiled</p>\n    </noscript>\n</div>\n\n<!-- or -->\n\n<div class=\"lazyload\" data-noscript=\"\">\n    <noscript>\n        <picture>\n            <!--[if IE 9]><video style=\"display: none;><![endif]-->\n            <source\n                srcset=\"http://placehold.it/500x600/11e87f/fff\"\n                media=\"(max-width: 480px)\" />\n            <source\n                srcset=\"http://placehold.it/700x300\"\n                media=\"(max-width: 700px)\" />\n            <source\n                srcset=\"http://placehold.it/1400x600/e8117f/fff\"\n                media=\"(max-width: 1400px)\" />\n            <source\n                srcset=\"http://placehold.it/1800x900/117fe8/fff\" />\n            <!--[if IE 9]></video><![endif]-->\n            <img\n                src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n                alt=\"image with artdirection\" />\n        </picture>\n\n\n         <iframe frameborder=\"0\"\n                allowfullscreen=\"\"\n                src=\"//www.youtube.com/embed/ZfV-aYdU4uE\">\n            </iframe>\n    </noscript>\n</div>\n```\n\n**Important note**: While you also can transform responsive images with this plugin, neither the ``data-sizes`` nor the ``customMedia`` features do work with the ``noscript`` extension. Also note: Android 2.x is not supported with this plugin.\n\n## Troubleshooting: Escaped HTML entities\nNormally the content of a ``noscript`` must be retrieved as text. But in some cases for example, if the ``noscript`` element was created in a XML documented/context, it must be retrieved as HTML. This can't be automatically detected.\n\nIn case this happens, you can fix this either by making sure that ``noscript`` elements are always created in a *text/html* context or by overriding the ``getNoscriptContent`` option callback:\n\n```js\nwindow.lazySizesConfig = window.lazySizesConfig || {};\n\nwindow.lazySizesConfig.getNoscriptContent =  function(noScript){\n    return (noScript.isXML) ? noScript.innerHTML : (noScript.textContent || noScript.innerText);\n};\n```\n\n## <a name=\"ie8\"></a>Add IE8- support with conditional comments\nThe noscript extension can also be used in conjunction with conditional comments to add progressive enhancement support for IE8-:\n\n```html\n<div class=\"lazyload\" data-noscript=\"\">\n    <!--[if lte IE 8]><noscript><![endif]-->\n        <p>any kind of content you want to be unveiled</p>\n    <!--[if lte IE 8]></noscript><![endif]-->\n</div>\n```\n"
  },
  {
    "path": "plugins/noscript/ls.noscript.js",
    "content": "(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\n\tvar dummyParent = {nodeName: ''};\n\tvar supportPicture = !!window.HTMLPictureElement && ('sizes' in document.createElement('img'));\n\tvar config = window.lazySizes && lazySizes.cfg;\n\n\tvar handleLoadingElements = function(e){\n\t\tvar i, isResponsive, hasTriggered, onload, loading;\n\n\t\tvar loadElements = e.target.querySelectorAll('img, iframe');\n\n\t\tfor(i = 0; i < loadElements.length; i++){\n\t\t\tisResponsive = loadElements[i].getAttribute('srcset') || (loadElements[i].parentNode || dummyParent).nodeName.toLowerCase() == 'picture';\n\n\t\t\tif(!supportPicture && isResponsive){\n\t\t\t\tlazySizes.uP(loadElements[i]);\n\t\t\t}\n\n\t\t\tif(!loadElements[i].complete && (isResponsive || loadElements[i].src)){\n\t\t\t\te.detail.firesLoad = true;\n\n\t\t\t\tif(!onload || !loading){\n\t\t\t\t\tloading = 0;\n\t\t\t\t\t/*jshint loopfunc:true */\n\t\t\t\t\tonload = function(evt){\n\t\t\t\t\t\tloading--;\n\t\t\t\t\t\tif((!evt || loading < 1) && !hasTriggered){\n\t\t\t\t\t\t\thasTriggered = true;\n\t\t\t\t\t\t\te.detail.firesLoad = false;\n\t\t\t\t\t\t\tlazySizes.fire(e.target, '_lazyloaded', {}, false, true);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(evt && evt.target){\n\t\t\t\t\t\t\tevt.target.removeEventListener('load', onload);\n\t\t\t\t\t\t\tevt.target.removeEventListener('error', onload);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tsetTimeout(onload, 3500);\n\t\t\t\t}\n\n\t\t\t\tloading++;\n\n\t\t\t\tloadElements[i].addEventListener('load', onload);\n\t\t\t\tloadElements[i].addEventListener('error', onload);\n\t\t\t}\n\t\t}\n\t};\n\n\tconfig.getNoscriptContent =  function(noScript){\n\t\treturn noScript.textContent || noScript.innerText;\n\t};\n\n\twindow.addEventListener('lazybeforeunveil', function(e){\n\t\tif(e.detail.instance != lazySizes || e.defaultPrevented || e.target.getAttribute('data-noscript') == null){return;}\n\n\t\tvar noScript = e.target.querySelector('noscript, script[type*=\"html\"]') || {};\n\t\tvar content = config.getNoscriptContent(noScript);\n\n\t\tif(content){\n\t\t\te.target.innerHTML = content;\n\t\t\thandleLoadingElements(e);\n\t\t}\n\t});\n}));\n"
  },
  {
    "path": "plugins/object-fit/README.md",
    "content": "# lazySizes object fit extension\n\nThis extension polyfills `object-fit`: `cover` and `contain` properties as also the `object-position` in non supporting browsers. Here you find a [simple demo](https://jsfiddle.net/trixta/x2p17f31/).\n\n## Usage\n\n### Include JS files:\nInclude lazysizes and lazysizes object fit and optionally lazysizes [parent-fit](../parent-fit) and lazysizes respimg plugin. Lazysizes object-fit and respimg plugin are only needed in browser that don't support object fit or responsive images. Lazysizes parent-fit is recommended if you use object fit responsive images in combination with `data-sizes=\"auto\"`.\n\n```html\n<!-- polyfill for object-fit (only needed in browsers that don't support object-fit) -->\n<script src=\"../plugins/object-fit/ls.object-fit.min.js\"></script>\n<!-- required: -->\n<script src=\"../lazysizes.min.js\" async=\"\"></script>\n\n<!-- only for data-sizes=\"auto\" in combination with object-fit CSS property (native or polyfill) -->\n<script src=\"../plugins/parent-fit/ls.parent-fit.min.js\"></script>\n<!-- respimg polyfill (only needed in browser that don't support respimg) -->\n<script src=\"../plugins/respimg/ls.respimg.min.js\"></script>\n```\n\n```js\n// never try to import *.min.js files \nimport lazySizes from 'lazysizes';\nimport 'lazysizes/plugins/parent-fit/ls.parent-fit';\n\n// polyfills\nimport 'lazysizes/plugins/respimg/ls.respimg';\n\nif (!('object-fit' in document.createElement('a').style)) {\n\trequire('lazysizes/plugins/object-fit/ls.object-fit');\n}\n```\n\n### Add markup\nThe object-fit plugin is not a full polyfill.\n\n```html\n<div class=\"imagecontainer\">\n\t<img class=\"imagecontainer-img lazyload\"\n\t\t data-srcset=\"https://placehold.it/800x400 800w 400h,\n\t\t \thttps://placehold.it/1200x600 1200w\"\n\t\t data-sizes=\"auto\" >\n\t/>\n</div>\n\n<div class=\"imagecontainer\">\n\t<img class=\"imagecontainer-img lazyload\"\n\t\t data-srcset=\"https://placehold.it/500x700 500w 700h,\n\t\t \thttps://placehold.it/643x900 643w\"\n\t\t data-sizes=\"auto\" >\n\t/>\n</div>\n```\n\n### CSS\n\nTo init the plugin on an image simply use the `font-family` property directly on your image.\n\n```css\n.imagecontainer {\n\tposition: relative;\n\tborder: 3px solid #ccc;\n}\n\n.imagecontainer:before {\n\tdisplay: block;\n\twidth: 100%;\n\tcontent: \"\";\n\tpadding-bottom: 100%;\n\theight: 0;\n}\n\n.imagecontainer-img {\n\tposition: absolute;\n\tdisplay: block;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\ttransition: 400ms transform;\n\n\tobject-fit: contain;\n\tfont-family: \"object-fit: contain\";\n}\n\n.imagecontainer-img:hover {\n\ttransform: scale(1.1);\n}\n```\n"
  },
  {
    "path": "plugins/object-fit/ls.object-fit.js",
    "content": "(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(initialEvent){\n\t\tfactory(window.lazySizes, initialEvent);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes, initialEvent) {\n\t'use strict';\n\tvar cloneElementClass;\n\tvar style = document.createElement('a').style;\n\tvar fitSupport = 'objectFit' in style;\n\tvar positionSupport = fitSupport && 'objectPosition' in style;\n\tvar regCssFit = /object-fit[\"']*\\s*:\\s*[\"']*(contain|cover)/;\n\tvar regCssPosition = /object-position[\"']*\\s*:\\s*[\"']*(.+?)(?=($|,|'|\"|;))/;\n\tvar blankSrc = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\tvar regBgUrlEscape = /\\(|\\)|'/;\n\tvar positionDefaults = {\n\t\tcenter: 'center',\n\t\t'50% 50%': 'center',\n\t};\n\n\tfunction getObject(element){\n\t\tvar css = (getComputedStyle(element, null) || {});\n\t\tvar content = css.fontFamily || '';\n\t\tvar objectFit = content.match(regCssFit) || '';\n\t\tvar objectPosition = objectFit && content.match(regCssPosition) || '';\n\n\t\tif(objectPosition){\n\t\t\tobjectPosition = objectPosition[1];\n\t\t}\n\n\t\treturn {\n\t\t\tfit: objectFit && objectFit[1] || '',\n\t\t\tposition: positionDefaults[objectPosition] || objectPosition || 'center',\n\t\t};\n\t}\n\n\tfunction generateStyleClass() {\n\t\tif (cloneElementClass) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar styleElement = document.createElement('style');\n\n\t\tcloneElementClass = lazySizes.cfg.objectFitClass || 'lazysizes-display-clone';\n\n\t\tdocument.querySelector('head').appendChild(styleElement);\n\t}\n\n\tfunction removePrevClone(element) {\n\t\tvar prev = element.previousElementSibling;\n\n\t\tif (prev && lazySizes.hC(prev, cloneElementClass)) {\n\t\t\tprev.parentNode.removeChild(prev);\n\t\t\telement.style.position = prev.getAttribute('data-position') || '';\n\t\t\telement.style.visibility = prev.getAttribute('data-visibility') || '';\n\t\t}\n\t}\n\n\tfunction initFix(element, config){\n\t\tvar switchClassesAdded, addedSrc, styleElement, styleElementStyle;\n\t\tvar lazysizesCfg = lazySizes.cfg;\n\n\t\tvar onChange = function(){\n\t\t\tvar src = element.currentSrc || element.src;\n\n\t\t\tif(src && addedSrc !== src){\n\t\t\t\taddedSrc = src;\n\t\t\t\tstyleElementStyle.backgroundImage = 'url(' + (regBgUrlEscape.test(src) ? JSON.stringify(src) : src ) + ')';\n\n\t\t\t\tif(!switchClassesAdded){\n\t\t\t\t\tswitchClassesAdded = true;\n\t\t\t\t\tlazySizes.rC(styleElement, lazysizesCfg.loadingClass);\n\t\t\t\t\tlazySizes.aC(styleElement, lazysizesCfg.loadedClass);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tvar rafedOnChange = function(){\n\t\t\tlazySizes.rAF(onChange);\n\t\t};\n\n\t\telement._lazysizesParentFit = config.fit;\n\n\t\telement.addEventListener('lazyloaded', rafedOnChange, true);\n\t\telement.addEventListener('load', rafedOnChange, true);\n\n\t\tlazySizes.rAF(function(){\n\n\t\t\tvar hideElement = element;\n\t\t\tvar container = element.parentNode;\n\n\t\t\tif(container.nodeName.toUpperCase() == 'PICTURE'){\n\t\t\t\thideElement = container;\n\t\t\t\tcontainer = container.parentNode;\n\t\t\t}\n\n\t\t\tremovePrevClone(hideElement);\n\n\t\t\tif (!cloneElementClass) {\n\t\t\t\tgenerateStyleClass();\n\t\t\t}\n\n\t\t\tstyleElement = element.cloneNode(false);\n\t\t\tstyleElementStyle = styleElement.style;\n\n\t\t\tstyleElement.addEventListener('load', function(){\n\t\t\t\tvar curSrc = styleElement.currentSrc || styleElement.src;\n\n\t\t\t\tif(curSrc && curSrc != blankSrc){\n\t\t\t\t\tstyleElement.src = blankSrc;\n\t\t\t\t\tstyleElement.srcset = '';\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlazySizes.rC(styleElement, lazysizesCfg.loadedClass);\n\t\t\tlazySizes.rC(styleElement, lazysizesCfg.lazyClass);\n\t\t\tlazySizes.rC(styleElement, lazysizesCfg.autosizesClass);\n\t\t\tlazySizes.aC(styleElement, lazysizesCfg.loadingClass);\n\t\t\tlazySizes.aC(styleElement, cloneElementClass);\n\n\t\t\t['data-parent-fit', 'data-parent-container', 'data-object-fit-polyfilled',\n\t\t\t\tlazysizesCfg.srcsetAttr, lazysizesCfg.srcAttr].forEach(function(attr) {\n\t\t\t\tstyleElement.removeAttribute(attr);\n\t\t\t});\n\n\t\t\tstyleElement.src = blankSrc;\n\t\t\tstyleElement.srcset = '';\n\n\t\t\tstyleElementStyle.backgroundRepeat = 'no-repeat';\n\t\t\tstyleElementStyle.backgroundPosition = config.position;\n\t\t\tstyleElementStyle.backgroundSize = config.fit;\n\n\t\t\tstyleElement.setAttribute('data-position', hideElement.style.position);\n\t\t\tstyleElement.setAttribute('data-visibility', hideElement.style.visibility);\n\n\t\t\thideElement.style.visibility = 'hidden';\n\t\t\thideElement.style.position = 'absolute';\n\n\t\t\telement.setAttribute('data-parent-fit', config.fit);\n\t\t\telement.setAttribute('data-parent-container', 'prev');\n\t\t\telement.setAttribute('data-object-fit-polyfilled', '');\n\t\t\telement._objectFitPolyfilledDisplay = styleElement;\n\n\t\t\tcontainer.insertBefore(styleElement, hideElement);\n\n\t\t\tif(element._lazysizesParentFit){\n\t\t\t\tdelete element._lazysizesParentFit;\n\t\t\t}\n\n\t\t\tif(element.complete){\n\t\t\t\tonChange();\n\t\t\t}\n\t\t});\n\t}\n\n\tif(!fitSupport || !positionSupport){\n\t\tvar onRead = function(e){\n\t\t\tif(e.detail.instance != lazySizes){return;}\n\n\t\t\tvar element = e.target;\n\t\t\tvar obj = getObject(element);\n\n\t\t\tif(obj.fit && (!fitSupport || (obj.position != 'center'))){\n\t\t\t\tinitFix(element, obj);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\twindow.addEventListener('lazybeforesizes', function(e) {\n\t\t\tif(e.detail.instance != lazySizes){return;}\n\t\t\tvar element = e.target;\n\n\t\t\tif (element.getAttribute('data-object-fit-polyfilled') != null && !element._objectFitPolyfilledDisplay) {\n\t\t\t\tif(!onRead(e)){\n\t\t\t\t\tlazySizes.rAF(function () {\n\t\t\t\t\t\telement.removeAttribute('data-object-fit-polyfilled');\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\twindow.addEventListener('lazyunveilread', onRead, true);\n\n\t\tif(initialEvent && initialEvent.detail){\n\t\t\tonRead(initialEvent);\n\t\t}\n\t}\n}));\n"
  },
  {
    "path": "plugins/optimumx/README.md",
    "content": "# lazysizes optimumx plugin\n\n**lazysizes** optimumx plugin helps you to limit/constrain the maximum resolution in case the **w descriptor** is used. Simply add the attribute ``data-optimumx=\"1.6\"`` to constrain the max resolution to 1.6.\n\nIt gives you therefore more control to trade perceived quality against perceived performance on HD retina devices, than the HTML responsive image standard gives you.\n\nThis plugin depends on the ``data-sizes=\"auto\"`` feature of **lazysizes**.\n\n```html\n<img\n    data-srcset=\"http://placehold.it/300x150 300w,\n    \thttp://placehold.it/700x300 700w,\n    \thttp://placehold.it/1400x600 1400w,\n    \thttp://placehold.it/2800x1200 2800w\"\n     data-sizes=\"auto\"\n     data-optimumx=\"1.5\"\n     class=\"lazyload\"\n     src=\"http://placehold.it/300x150\"\n     alt=\"flexible image\" />\n```\n\nA **simple [demo can be seen here](http://afarkas.github.io/lazysizes/optimumx/)**. This extension also supports art-directed responsive images using the ``picture`` element.\n\n## Usage\n\n```html\n<!-- concat the following scripts into one and add them to your HTML -->\n<script src=\"lazysizes.min.js\"></script>\n<script src=\"ls.optimumx.js\"></script>\n\n<!-- then use it -->\n<img\n    data-srcset=\"http://placehold.it/300x150 300w,\n    \thttp://placehold.it/700x300 700w,\n    \thttp://placehold.it/1400x600 1400w,\n    \thttp://placehold.it/2800x1200 2800w\"\n     data-sizes=\"auto\"\n     data-optimumx=\"1.5\"\n     class=\"lazyload\"\n     src=\"http://placehold.it/300x150\"\n     alt=\"flexible image\" />\n```\n \n Or include via import:\n\n```js\n// never try to import *.min.js files \nimport lazySizes from 'lazysizes';\nimport 'lazysizes/plugins/optimumx/ls.optimumx';\n```\n\nIn case you want to use a CDN you can use the combohandler service provided by jsDelivr:\n\n```html\n<script src=\"http://cdn.jsdelivr.net/g/lazysizes(lazysizes.min.js+plugins/optimumx/ls.optimumx.min.js)\" async=\"\"></script>\n```\n\n**Note**: For full cross-browser support either a [responsive images polyfill like respimage or picturefill](https://github.com/aFarkas/respimage) or the [neat Responsive Images as a Service extension (RIaS)](../rias) or the [extreme lightweight alternate mini respimg polyfill extension](../respimg) needs to be used.\n\n```html\n<!--  RIaS example: -->\n<script src=\"http://cdn.jsdelivr.net/g/lazysizes(lazysizes.min.js+plugins/optimumx/ls.optimumx.min.js+plugins/rias/ls.rias.min.js)\" async=\"\"></script>\n\n<img\n    data-src=\"http://wit.wurfl.io/w_{width}/http://wurfl.io/assets/sunsetbeach.jpg\"\n\tdata-sizes=\"auto\"\n\tdata-optimumx=\"1.5\"\n\tclass=\"lazyload\"\n\talt=\"\" />\n```\n\n```html\n<!--  respimage example: -->\n<script>\n    function loadJS(u){var r=document.getElementsByTagName(\"script\")[0],s=document.createElement(\"script\");s.src=u;r.parentNode.insertBefore(s,r);}\n\n    if(!window.HTMLPictureElement || !('sizes' in document.createElement('img'))){\n        loadJS(\"http://cdn.jsdelivr.net/g/respimage(respimage.min.js)\");\n    }\n</script>\n\n<!--  your stylesheets -->\n\n<script src=\"http://cdn.jsdelivr.net/g/lazysizes(lazysizes.min.js+plugins/optimumx/ls.optimumx.min.js)\" async=\"\"></script>\n```\n\n### The ``getOptimumX`` option callback\n\nNormally the image specific optimal pixel density should be added as a floating point number using the ``data-optimumx`` attribute. Additionally it is also possible to add the ``\"auto\"`` keyword as a value of the ``data-optimumx`` attribute. In that case the ``getOptimumX`` option callback is invoked with the element as the first argument.\n\n```html\n<script>\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nwindow.lazySizesConfig.getOptimumX = function(_element){\n    return window.devicePixelRatio > 1.6 ? devicePixelRatio * 0.9 : 1;\n};\n</script>\n\n<img\n    data-srcset=\"http://placehold.it/300x150 300w,\n    \thttp://placehold.it/700x300 700w,\n    \thttp://placehold.it/1400x600 1400w,\n    \thttp://placehold.it/2800x1200 2800w\"\n     data-sizes=\"auto\"\n     data-optimumx=\"auto\"\n     class=\"lazyload\"\n     src=\"http://placehold.it/300x150\"\n     alt=\"flexible image\" />\n```\n\nThe predefined (ugly) ``getOptimumX`` callback looks like this:\n\n```js\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nwindow.lazySizesConfig.config.getOptimumX = function(/*element*/){\n    var dpr = window.devicePixelRatio || 1;\n    if(dpr > 2.5){\n        dpr *= 0.6; // returns 1.8 for 3\n    } else if(dpr > 1.9){\n        dpr *= 0.8; // returns 1.6 for 2\n    } else {\n        dpr -= 0.01;\n    }\n    return Math.min(Math.round(dpr * 100) / 100, 2);\n};\n```\n\n### The `constrainPixelDensity` option\n\nIn case the `constrainPixelDensity` is set to `true`. All images without a `data-optimumx` attribute are treated as they would have a `data-optimumx=\"auto\"` attribute.\n\n```html\n<script>\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nwindow.lazySizesConfig.constrainPixelDensity = true;\n</script>\n\n<img\n    data-srcset=\"http://placehold.it/300x150 300w,\n    \thttp://placehold.it/700x300 700w,\n    \thttp://placehold.it/1400x600 1400w,\n    \thttp://placehold.it/2800x1200 2800w\"\n     data-sizes=\"auto\"\n     class=\"lazyload\"\n     src=\"http://placehold.it/300x150\"\n     alt=\"flexible image\" />\n```\n\n## <a name=\"compressive-picture-pattern\"></a>Background information: Compressive picture pattern\n\nFrom a perceived performance vs. perceived quality standpoint the best way to deal with High DPI images is to serve higher compressed candidates to clients with high resolution displays.\n\nThis is due to the fact, that on higher DPI displays small details can be compressed more aggressively.\n\nFor native images support the ``picture`` element can be used to achieve the result:\n\n```html\n<picture>\n<!--[if IE 9]><video style=\"display: none;\"><![endif]-->\n\t<source\n\t    data-srcset=\"image-w1600-q50.jpg 1600w,\n\t        image-w1440-q50.jpg 1440w,\n\t        image-w1200-q50.jpg 1200w,\n\t        image-w800-q50.jpg 800w,\n\t        image-w600-q50.jpg 600w\"\n\t    media=\"(-webkit-min-device-pixel-ratio: 1.9),\n\t        (min-resolution: 1.9dppx)\" />\n\t<source\n    \tdata-srcset=\"image-w1440-q80.jpg 1440w,\n                image-w1200-q80.jpg 1200w,\n                image-w800-q80.jpg 800w,\n                image-w600-q80.jpg 600w,\n                image-w400-q80.jpg 400w\" />\n<!--[if IE 9]></video><![endif]-->\n<img\n    src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n    data-sizes=\"auto\"\n    class=\"lazyload\"\n    alt=\"picture but without artdirection\" />\n</picture>\n```\n\nOr in case you are using the [Responsive Images as a Service extension (RIaS)](../rias):\n\n```html\n<script>\ndocument.addEventListener('lazyriasmodifyoptions', function(data){\n    data.detail.quality = (window.devicePixelRatio || 1) > 1.9 ?\n        50 :\n        80;\n});\n</script>\n\n<img\n    data-src=\"image-w{width}-q{quality}.jpg\"\n    data-sizes=\"auto\"\n    class=\"lazyload\"\n    alt=\"\" />\n```\n\nUnfortunately these techniques also double or even triple (think 1x: 65-85q, 2x: 30-50q, 3x/4x 15-40q) the amount of generated image candidates. In case you don't have so much resources the optimumx extension in conjunction with proper image compression is the best thing you can do.\n\nBut be aware each image has different characteristics: While some images look great on a HIGH DPI device even with a ``data-optimumx=\"1.2\"`` other will need a much higher density for a good perceived quality.\n\n## <a name=\"lying-sizes\"></a>Background information: Lying sizes attribute\n\nThere is also another much more lightweight way to get a similar effect. Instead of parsing and constraining the ``srcset`` to meet the ``data-optimumx`` constraint, there is also the possibility to modify the ``sizes`` attribute instead.\n\nA ``data-optimumx`` implementation with the ``lazybeforesizes`` event could then look something like this:\n\n```html\n<script>\ndocument.addEventListener('lazybeforesizes', function(e){\n    var maxx = parseFloat(e.target.getAttribute('data-optimumx') || '', 10);\n    var dpr = (window.devicePixelRatio || 1);\n    if(maxx && maxx < (window.devicePixelRatio || 1)){\n        e.detail.width = e.detail.width * (maxx / dpr);\n    }\n});\n</script>\n\n<img class=\"lazyload\" data-sizes=\"auto\" data-optimumx=\"1.5\" data-srcset=\"...\" />\n```\n\nCompared to the size of this plugin this is a very neat, simple and lightweight technique.\n\nBut this technique should be used with caution because the browsers algorithm is tricked and operates with wrong values, which can result in unpredictable and bad results.\n\nIn case the ``sizes`` attribute is faked to a lower value and the browser already wants to select a lower candidate, (because the device has a low or metered bandwidth) the browser might choose an unfeasible image candidate instead.\n\nIn case the ``sizes`` attribute is faked to a higher value and the browser already wants to select a higher candidate, (because the user has zoomed into this particular image) the browser might be tricked to download a much heavier image candidate than the device actually needs.\n\nBut still this technique can be sometimes used to tell the browser **small** lies.\n"
  },
  {
    "path": "plugins/optimumx/ls.optimumx.js",
    "content": "(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\tif(!window.addEventListener){return;}\n\n\tvar config;\n\n\tvar regPicture = /^picture$/i;\n\tvar docElem = document.documentElement;\n\n\tvar parseWsrcset = (function(){\n\t\tvar candidates;\n\t\tvar reg = /(([^,\\s].[^\\s]+)\\s+(\\d+)(w|h)(\\s+(\\d+)(w|h))?)/g;\n\t\tvar addCandidate = function(match, candidate, url, descNumber1, descType1, fullDesc, descNumber2, descType2){\n\t\t\tcandidates.push({\n\t\t\t\tc: candidate,\n\t\t\t\tu: url,\n\t\t\t\tw: (descType2 == 'w' ? descNumber2 : descNumber1)  * 1\n\t\t\t});\n\t\t};\n\n\t\treturn function(input){\n\t\t\tcandidates = [];\n\t\t\tinput.replace(reg, addCandidate);\n\t\t\treturn candidates;\n\t\t};\n\t})();\n\n\tvar parseImg = (function(){\n\n\t\tvar ascendingSort = function ( a, b ) {\n\t\t\treturn a.w - b.w;\n\t\t};\n\n\t\tvar parseSets =  function (elem, dataName){\n\t\t\tvar lazyData = {srcset: elem.getAttribute(lazySizes.cfg.srcsetAttr)  || ''};\n\t\t\tvar cands = parseWsrcset(lazyData.srcset);\n\t\t\tObject.defineProperty(elem, dataName, {\n\t\t\t\tvalue: lazyData,\n\t\t\t\twritable: true\n\t\t\t});\n\n\t\t\tlazyData.cands = cands;\n\n\t\t\tlazyData.index = 0;\n\t\t\tlazyData.dirty = false;\n\t\t\tif(cands[0] && cands[0].w){\n\n\t\t\t\tcands.sort( ascendingSort );\n\t\t\t\tlazyData.cSrcset = [cands[ lazyData.index ].c];\n\t\t\t} else {\n\t\t\t\tlazyData.cSrcset = lazyData.srcset ? [lazyData.srcset] : [];\n\t\t\t\tlazyData.cands = [];\n\t\t\t}\n\n\t\t\treturn lazyData;\n\t\t};\n\n\t\treturn function parseImg(elem, dataName){\n\t\t\tvar sources, i, len, parent;\n\n\n\t\t\tif(!elem[dataName]){\n\t\t\t\tparent = elem.parentNode || {};\n\t\t\t\telem[dataName] = parseSets(elem, dataName);\n\t\t\t\telem[dataName].isImg = true;\n\t\t\t\tif(regPicture.test(parent.nodeName || '')){\n\t\t\t\t\telem[dataName].picture = true;\n\t\t\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\t\tparseSets(sources[i], dataName).isImg = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn elem[dataName];\n\t\t};\n\t})();\n\n\tvar constraintFns = {\n\t\t_lazyOptimumx: (function(){\n\t\t\tvar takeHighRes = function (lowerCandidate, higherCandidateResolution, optimumx){\n\t\t\t\tvar low, bonusFactor, substract;\n\t\t\t\tif(!lowerCandidate || !lowerCandidate.d){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tsubstract = optimumx > 0.7 ? 0.6 : 0.4;\n\n\t\t\t\tif(lowerCandidate.d >= optimumx){return false;}\n\n\t\t\t\tbonusFactor = Math.pow(lowerCandidate.d - substract, 1.6) || 0.1;\n\n\t\t\t\tif(bonusFactor < 0.1){\n\t\t\t\t\tbonusFactor = 0.1;\n\t\t\t\t} else if(bonusFactor > 3){\n\t\t\t\t\tbonusFactor = 3;\n\t\t\t\t}\n\n\t\t\t\tlow = lowerCandidate.d + ((higherCandidateResolution - optimumx) * bonusFactor);\n\n\t\t\t\treturn low < optimumx;\n\t\t\t};\n\n\t\t\treturn function (data, width, optimumx){\n\t\t\t\tvar i, can;\n\n\t\t\t\tfor(i = 0; i < data.cands.length; i++){\n\t\t\t\t\tcan = data.cands[i];\n\t\t\t\t\tcan.d = (can.w || 1) / width;\n\n\t\t\t\t\tif(data.index >= i){continue;}\n\n\t\t\t\t\tif(can.d <= optimumx || takeHighRes(data.cands[i - 1], can.d, optimumx)){\n\t\t\t\t\t\tdata.cSrcset.push(can.c);\n\t\t\t\t\t\tdata.index = i;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t})()\n\t};\n\n\tvar constrainSets = (function(){\n\n\t\tvar constrainSet = function(elem, displayWidth, optimumx, attr, dataName){\n\t\t\tvar curIndex;\n\t\t\tvar lazyData = elem[dataName];\n\n\t\t\tif(!lazyData){return;}\n\t\t\tcurIndex = lazyData.index;\n\n\t\t\tconstraintFns[dataName](lazyData, displayWidth, optimumx);\n\n\t\t\tif(!lazyData.dirty || curIndex != lazyData.index){\n\t\t\t\tlazyData.cSrcset.join(', ');\n\t\t\t\telem.setAttribute(attr, lazyData.cSrcset.join(', '));\n\t\t\t\tlazyData.dirty = true;\n\t\t\t}\n\t\t};\n\n\t\treturn function(image, displayWidth, optimumx, attr, dataName){\n\t\t\tvar sources, parent, len, i;\n\t\t\tvar lazyData = image[dataName];\n\n\t\t\tlazyData.width = displayWidth;\n\n\t\t\tif(lazyData.picture && (parent = image.parentNode)){\n\t\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tconstrainSet(sources[i], displayWidth, optimumx, attr, dataName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconstrainSet(image, displayWidth, optimumx, attr, dataName);\n\t\t};\n\t})();\n\n\tvar getOptimumX = function(element){\n\t\tvar optimumx = element.getAttribute('data-optimumx') || element.getAttribute('data-maxdpr');\n\n\t\tif(!optimumx && config.constrainPixelDensity){\n\t\t\toptimumx = 'auto';\n\t\t}\n\n\t\tif(optimumx){\n\t\t\tif(optimumx == 'auto'){\n\t\t\t\toptimumx = config.getOptimumX(element);\n\t\t\t} else {\n\t\t\t\toptimumx = parseFloat(optimumx, 10);\n\t\t\t}\n\t\t}\n\t\treturn optimumx;\n\t};\n\n\tvar extentLazySizes = function(){\n\t\tif(lazySizes && !lazySizes.getOptimumX){\n\t\t\tlazySizes.getX = getOptimumX;\n\t\t\tlazySizes.pWS = parseWsrcset;\n\t\t\tdocElem.removeEventListener('lazybeforeunveil', extentLazySizes);\n\t\t}\n\t};\n\n\tdocElem.addEventListener('lazybeforeunveil', extentLazySizes);\n\tsetTimeout(extentLazySizes);\n\n\tconfig = lazySizes && lazySizes.cfg;\n\n\tif(typeof config.getOptimumX != 'function'){\n\t\tconfig.getOptimumX = function(/*element*/){\n\t\t\tvar dpr = window.devicePixelRatio || 1;\n\t\t\tif(dpr > 2.6){\n\t\t\t\tdpr *= 0.6; // returns 1.8 for 3\n\t\t\t} else if(dpr > 1.9){\n\t\t\t\tdpr *= 0.8; // returns 1.6 for 2\n\t\t\t} else {\n\t\t\t\tdpr -= 0.01; // returns 0.99 for 1\n\t\t\t}\n\t\t\treturn Math.min(Math.round(dpr * 100) / 100, 2);\n\t\t};\n\t}\n\n\tif(!window.devicePixelRatio){return;}\n\n\taddEventListener('lazybeforesizes', function(e){\n\t\tif(e.detail.instance != lazySizes){return;}\n\n\t\tvar optimumx, lazyData, width, attr;\n\n\t\tvar elem = e.target;\n\t\tvar detail = e.detail;\n\t\tvar dataAttr = detail.dataAttr;\n\n\t\tif(e.defaultPrevented ||\n\t\t\t!(optimumx = getOptimumX(elem)) ||\n\t\t\toptimumx >= devicePixelRatio){return;}\n\n\t\tif(dataAttr && elem._lazyOptimumx && !detail.reloaded && (!config.unloadedClass || !lazySizes.hC(elem, config.unloadedClass))){\n\t\t\telem._lazyOptimumx = null;\n\t\t}\n\n\t\tlazyData = parseImg(elem, '_lazyOptimumx');\n\n\t\twidth = detail.width;\n\n\t\tif(width && (lazyData.width || 0) < width){\n\t\t\tattr = dataAttr ? lazySizes.cfg.srcsetAttr : 'srcset';\n\n\t\t\tlazySizes.rAF(function(){\n\t\t\t\tconstrainSets(elem, width, optimumx, attr, '_lazyOptimumx');\n\t\t\t});\n\t\t}\n\t});\n\n}));\n"
  },
  {
    "path": "plugins/parent-fit/README.md",
    "content": "# lazySizes parent fit extension\n\nThe parent fit plugin extends the ``data-sizes=\"auto\"`` feature to also calculate the right ``sizes`` for ``object-fit: contain|cover`` image elements as also **height** ( and width) constrained image elements in general.\n\n## Usage\n\n```js\n// never try to import *.min.js files \nimport lazySizes from 'lazysizes';\nimport 'lazysizes/plugins/parent-fit/ls.parent-fit';\n```\n\nFor this to work properly the physical aspect-ratio of the image candidates need to be calculable. To do so either a `data-aspectratio` attribute has to be provided on the `source`/`img` element(s) or through `width` and `height` content attributes or at least one of the image candidates inside the ``srcset`` attribute also need to include a **h** (height) descriptor. (MS Edge has problems to read image candidates using the h descriptor, which is fixed by the [respimg polyfill](../respimg))\n\n### object-fit: contain|cover usage\n\nSimply include this plugin, combine your width descriptors with height descriptors and use ``object-fit``. (To get object-fit support into IE9-11 use the [object-fit polyfill](../object-fit).)\n\n```html\n<!-- Usage of the data-aspectratio attribute: Divide width by height: 400/800 = data-aspectratio=\"0.5\" -->\n\n<img data-srcset=\"http://lorempixel.com/400/800/people/6/ 400w,\n\thttp://lorempixel.com/300/600/people/6/ 300w,\n\thttp://lorempixel.com/200/400/people/6/ 200w\"\n\tdata-aspectratio=\"0.5\"\n\t data-sizes=\"auto\"\n\t class=\"lazyload\"\n\t style=\"width: 400px; height: 400px; object-fit: contain;\" />\n\n<!-- Usage of the h descriptor -->\n\n<img data-srcset=\"http://lorempixel.com/400/800/people/6/ 400w 800h,\n\thttp://lorempixel.com/300/600/people/6/ 300w,\n\thttp://lorempixel.com/200/400/people/6/ 200w\"\n\t data-sizes=\"auto\"\n\t class=\"lazyload\"\n\t style=\"width: 400px; height: 400px; object-fit: contain;\" />\n\n<img data-srcset=\"http://lorempixel.com/800/400/people/9/ 800w 400h,\n\thttp://lorempixel.com/600/300/people/9/ 600w,\n\thttp://lorempixel.com/400/200/people/9/ 400w\"\n\t data-sizes=\"auto\"\n\t class=\"lazyload\"\n\t style=\"width: 400px; height: 400px; object-fit: cover;\" />\n\n\n```\n\n\n\n### [data-parent-fit=\"contain|cover|width\"] usage\n\nThis plugin also supports calculating height and width constrained images based on a parent element.\n\nTo do so include this plugin, combine your width descriptors with height descriptors and add the attribute ``data-parent-fit`` with either ``\"contain\"`` or ``\"cover\"`` as the keyword.\n\n```html\n<div style=\"width: 400px; height: 400px; display: flex; align-items: center; justify-content: center;\">\n\t<img data-srcset=\"http://lorempixel.com/400/800/people/6/ 400w 800h,\n\t\thttp://lorempixel.com/300/600/people/6/ 300w,\n\t\thttp://lorempixel.com/200/400/people/6/ 200w\"\n\t\t data-sizes=\"auto\"\n\t\t class=\"lazyload\"\n\t\t data-parent-fit=\"contain\"\n\t\t style=\"max-width: 100%; max-height: 100%;\" />\n</div>\n```\n\nIn case the *width* keyword is used, lazySizes simply takes the width of the parent container instead of the ``img`` element itself. In this case a **h** descriptor isn't necessary.\n\n### [data-parent-container=\"html|.my-image-container\"]\nNormally the next closest parent that is not a `picture` element is used as the parent (i.e.: `:not(picture)`). This can be changed using the `data-parent-container` option. It takes any simple selector. If you want to use the viewport as the parent simply add `html`.\n\nAs a special keyword the value `self` can be used to signalize, that image itself should be taken.\n\n### Controlling `data-parent-fit` and `data-parent-container` with CSS\nThese option can also be set via CSS by abusing the `font-family` property.\n\nThe `data-parent-fit` option is called here `parent-fit` and `data-parent-container` is called `parent-container`:\n\n```css\nimg.my-image {\n\tfont-family: parent-container: html; parent-fit: contain;\n}\n```\n\n**Note: This plugin should be also added, if you use the [bgset plugin](../bgset/) in combination with ``data-sizes=\"auto\"`` and ``background-size: cover|contain`` and it is also the base of the [object-fit polyfill plugin](../object-fit).**\n"
  },
  {
    "path": "plugins/parent-fit/ls.parent-fit.js",
    "content": "(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes) {\n\t'use strict';\n\n\tif(!window.addEventListener){return;}\n\n\tvar regDescriptors = /\\s+(\\d+)(w|h)\\s+(\\d+)(w|h)/;\n\tvar regCssFit = /parent-fit[\"']*\\s*:\\s*[\"']*(contain|cover|width)/;\n\tvar regCssObject = /parent-container[\"']*\\s*:\\s*[\"']*(.+?)(?=(\\s|$|,|'|\"|;))/;\n\tvar regPicture = /^picture$/i;\n\tvar cfg = lazySizes.cfg;\n\n\tvar getCSS = function (elem){\n\t\treturn (getComputedStyle(elem, null) || {});\n\t};\n\n\tvar parentFit = {\n\n\t\tgetParent: function(element, parentSel){\n\t\t\tvar parent = element;\n\t\t\tvar parentNode = element.parentNode;\n\n\t\t\tif((!parentSel || parentSel == 'prev') && parentNode && regPicture.test(parentNode.nodeName || '')){\n\t\t\t\tparentNode = parentNode.parentNode;\n\t\t\t}\n\n\t\t\tif(parentSel != 'self'){\n\t\t\t\tif(parentSel == 'prev'){\n\t\t\t\t\tparent = element.previousElementSibling;\n\t\t\t\t} else if(parentSel && (parentNode.closest || window.jQuery)){\n\t\t\t\t\tparent = (parentNode.closest ?\n\t\t\t\t\t\t\tparentNode.closest(parentSel) :\n\t\t\t\t\t\t\tjQuery(parentNode).closest(parentSel)[0]) ||\n\t\t\t\t\t\tparentNode\n\t\t\t\t\t;\n\t\t\t\t} else {\n\t\t\t\t\tparent = parentNode;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn parent;\n\t\t},\n\n\t\tgetFit: function(element){\n\t\t\tvar tmpMatch, parentObj;\n\t\t\tvar css = getCSS(element);\n\t\t\tvar content = css.content || css.fontFamily;\n\t\t\tvar obj = {\n\t\t\t\tfit: element._lazysizesParentFit || element.getAttribute('data-parent-fit')\n\t\t\t};\n\n\t\t\tif(!obj.fit && content && (tmpMatch = content.match(regCssFit))){\n\t\t\t\tobj.fit = tmpMatch[1];\n\t\t\t}\n\n\t\t\tif(obj.fit){\n\t\t\t\tparentObj = element._lazysizesParentContainer || element.getAttribute('data-parent-container');\n\n\t\t\t\tif(!parentObj && content && (tmpMatch = content.match(regCssObject))){\n\t\t\t\t\tparentObj = tmpMatch[1];\n\t\t\t\t}\n\n\t\t\t\tobj.parent = parentFit.getParent(element, parentObj);\n\n\n\t\t\t} else {\n\t\t\t\tobj.fit = css.objectFit;\n\t\t\t}\n\n\t\t\treturn obj;\n\t\t},\n\n\t\tgetImageRatio: function(element){\n\t\t\tvar i, srcset, media, ratio, match, width, height;\n\t\t\tvar parent = element.parentNode;\n\t\t\tvar elements = parent && regPicture.test(parent.nodeName || '') ?\n\t\t\t\t\tparent.querySelectorAll('source, img') :\n\t\t\t\t\t[element]\n\t\t\t\t;\n\n\t\t\tfor(i = 0; i < elements.length; i++){\n\t\t\t\telement = elements[i];\n\t\t\t\tsrcset = element.getAttribute(cfg.srcsetAttr) || element.getAttribute('srcset') || element.getAttribute('data-pfsrcset') || element.getAttribute('data-risrcset') || '';\n\t\t\t\tmedia = element._lsMedia || element.getAttribute('media');\n\t\t\t\tmedia = cfg.customMedia[element.getAttribute('data-media') || media] || media;\n\n\t\t\t\tif(srcset && (!media || (window.matchMedia && matchMedia(media) || {}).matches )){\n\t\t\t\t\tratio = parseFloat(element.getAttribute('data-aspectratio'));\n\n\t\t\t\t\tif (!ratio) {\n\t\t\t\t\t\tmatch = srcset.match(regDescriptors);\n\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\tif(match[2] == 'w'){\n\t\t\t\t\t\t\t\twidth = match[1];\n\t\t\t\t\t\t\t\theight = match[3];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidth = match[3];\n\t\t\t\t\t\t\t\theight = match[1];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twidth = element.getAttribute('width');\n\t\t\t\t\t\t\theight = element.getAttribute('height');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tratio = width / height;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ratio;\n\t\t},\n\n\t\tcalculateSize: function(element, width){\n\t\t\tvar displayRatio, height, imageRatio, retWidth;\n\t\t\tvar fitObj = this.getFit(element);\n\t\t\tvar fit = fitObj.fit;\n\t\t\tvar fitElem = fitObj.parent;\n\n\t\t\tif(fit != 'width' && ((fit != 'contain' && fit != 'cover') || !(imageRatio = this.getImageRatio(element)))){\n\t\t\t\treturn width;\n\t\t\t}\n\n\t\t\tif(fitElem){\n\t\t\t\twidth = fitElem.clientWidth;\n\t\t\t} else {\n\t\t\t\tfitElem = element;\n\t\t\t}\n\n\t\t\tretWidth = width;\n\n\t\t\tif(fit == 'width'){\n\t\t\t\tretWidth = width;\n\t\t\t} else {\n\t\t\t\theight = fitElem.clientHeight;\n\n\t\t\t\tif((displayRatio =  width / height) && ((fit == 'cover' && displayRatio < imageRatio) || (fit == 'contain' && displayRatio > imageRatio))){\n\t\t\t\t\tretWidth = width * (imageRatio / displayRatio);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn retWidth;\n\t\t}\n\t};\n\n\tlazySizes.parentFit = parentFit;\n\n\tdocument.addEventListener('lazybeforesizes', function(e){\n\t\tif(e.defaultPrevented || e.detail.instance != lazySizes){return;}\n\n\t\tvar element = e.target;\n\t\te.detail.width = parentFit.calculateSize(element, e.detail.width);\n\t});\n}));\n"
  },
  {
    "path": "plugins/print/README.md",
    "content": "# lazysizes print extension\n\nThis simple print plugin for lazysizes will automatically unveil all element as soon as a print is detected even if the given lazyload image isn't in the viewport. \n"
  },
  {
    "path": "plugins/print/ls.print.js",
    "content": "/*\nThis lazySizes extension adds better support for print.\nIn case the user starts to print lazysizes will load all images.\n*/\n(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\tvar config, elements, onprint, printMedia;\n\t// see also: http://tjvantoll.com/2012/06/15/detecting-print-requests-with-javascript/\n\tif(window.addEventListener){\n\t\tconfig = lazySizes && lazySizes.cfg;\n\t\telements = config.lazyClass || 'lazyload';\n\t\tonprint = function(){\n\t\t\tvar i, len;\n\t\t\tif(typeof elements == 'string'){\n\t\t\t\telements = document.getElementsByClassName(elements);\n\t\t\t}\n\n\t\t\tif(lazySizes){\n\t\t\t\tfor(i = 0, len = elements.length; i < len; i++){\n\t\t\t\t\tlazySizes.loader.unveil(elements[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\taddEventListener('beforeprint', onprint, false);\n\n\t\tif(!('onbeforeprint' in window) && window.matchMedia && (printMedia = matchMedia('print')) && printMedia.addListener){\n\t\t\tprintMedia.addListener(function(){\n\t\t\t\tif(printMedia.matches){\n\t\t\t\t\tonprint();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n}));\n"
  },
  {
    "path": "plugins/progressive/README.md",
    "content": "# lazysizes progressive extension\n\nThis plugin optimizes perceived performance by adding better support for rendering progressive JPGs/PNGs in conjunction with the LQIP pattern.\n\n## Demo\n- [Watch video](http://www.webpagetest.org/video/view.php?id=150207_0d904cee5186ebf124d4e3014aa5df39895618f0)\n- Or try yourself: [lazysizes + progressive plugin](http://codepen.io/jschroeter/full/NPwXNv) vs. [lazysizes](http://codepen.io/jschroeter/full/MYOrjB)\n\n## How it works\n\nBy default, [browsers don't render images progressively when switching from one image to another](http://w3facility.org/question/progressive-jpeg-isnt-progressive-when-changing-image-src-dynamically/) (e.g. changing the `src` or adding `srcset`).\nWhen lazysizes detects the image gets visible, this plugin will remove the `src` attribute and insert it as a background image until the image from `srcset` is completely loaded.\nSo when using the LQIP pattern, the low quality placeholder will stay visible and the high quality image will render progressively on top of it.\nThis looks especially nice for large images on slow connections.\n\n## Requirements\n- Use [LQIP pattern](https://github.com/aFarkas/lazysizes#lqip)\n- Make sure your JPGs/PNGs are saved with the progressive/interlaced option: [Online Progressive JPEG checker](http://highloadtools.com/progressivejpeg)\n\n## Browser support\nAll browsers with native `srcset` support. Successfully tested on\n- Chrome\n- Chrome for Android\n- Native Android Browser 4.4\n\nActually it works great in Firefox too, but currently Firefox shows an annoying broken image icon for a few seconds after removing the `src` attribute. To prevent that, the plugin is disabled for browsers without native `srcset` support. Hopefully this issue will be gone when Firefox gets native `srcset` support.\n"
  },
  {
    "path": "plugins/progressive/ls.progressive.js",
    "content": "/*\nThis lazysizes plugin optimizes perceived performance by adding better support for rendering progressive JPGs/PNGs in conjunction with the LQIP pattern.\n*/\n(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\tvar regImg, onLoad;\n\n\tif('srcset' in document.createElement('img')){\n\t\tregImg = /^img$/i;\n\n\t\tonLoad = function(e){\n\t\t\te.target.style.backgroundSize = '';\n\t\t\te.target.style.backgroundImage = '';\n\t\t\te.target.removeEventListener(e.type, onLoad);\n\t\t};\n\n\t\tdocument.addEventListener('lazybeforeunveil', function(e){\n\t\t\tif(e.detail.instance != lazySizes){return;}\n\n\t\t\tvar img = e.target;\n\t\t\tif(!regImg.test(img.nodeName)){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar src = img.getAttribute('src');\n\t\t\tif(src) {\n\t\t\t\timg.style.backgroundSize = '100% 100%';\n\t\t\t\timg.style.backgroundImage = 'url(' + src + ')';\n\t\t\t\timg.removeAttribute('src');\n\t\t\t\timg.addEventListener('load', onLoad);\n\t\t\t}\n\t\t}, false);\n\t}\n}));\n"
  },
  {
    "path": "plugins/respimg/README.md",
    "content": "# lazysizes respimg polyfill extension\n\nWhile [picturefill](https://github.com/scottjehl/picturefill) are full functional responsive images polyfills, the lazySizes respimg polyfill extension is only a partial polyfill, which supports only the most important subset of the native responsive images standard and only in conjunction with the lazySizes core script.\n\nAs a result it is an extreme fast and lightweight plugin.\n\n\n```js\n// never try to import *.min.js files \nimport lazySizes from 'lazysizes';\nimport 'lazysizes/plugins/respimg/ls.respimg';\n```\n\n## constrained Markup support\n\nThis plugin supports both art directed responsive images using the ``picture`` element as also resolution switching based on ``data-srcset`` using the width descriptor (and of course the combination of both).\n\n### What is *not* supported:\n\n- The use of explicit density descriptors (**x** descriptor) are not supported (This should not be a problem, because all use cases of the density descriptor can always also be substituted with a width descriptor).\n- If ``data-srcset`` with width descriptors (**w** descriptor)  are used either the ``data-sizes=\"auto\"`` feature has to be used or the ``sizes`` value has to consist of just one source size value with the CSS *px* unit.\n- If picture is used the ``img`` element should not have a ``srcset``/``data-srcset`` attribute, instead the last ``source`` element should/can be used without a ``media`` and ``type`` attribute.\n- The use of the ``source[type]`` attribute is not automatically supported, but can be manually added by overriding the ``lazySizesConfig.supportsType`` option callback function.\n- The use of the ``source[media]`` is supported for all browsers, which [do support ``matchMedia``](http://caniuse.com/#search=matchMedia). To add full support for IE9 and other legacy browsers a [``window.matchMedia`` polyfill](https://github.com/paulirish/matchMedia.js/) or ``Modernizr.mq`` (Modernizr Media Queries) can be used.\n\n\n### What is *fully* supported\n\nAside from above mentioned constraints everything else is fully supported. Here are some practical examples of fully supported responsive images:\n\n```html\n<script>\nwindow.lazySizesConfig = window.lazySizesConfig || {};\n//in case you want to use custom media query aliases in your markup, instead of full media queries\nwindow.lazySizesConfig.customMedia = {\n    '--small': '(max-width: 480px)',\n    '--medium': '(max-width: 700px)',\n    '--large': '(max-width: 1400px)'\n};\n</script>\n\n\n<!-- use of width descriptor + data-sizes=\"auto\" -->\n<img\n    data-sizes=\"auto\"\n    data-srcset=\"image1.jpg 300w,\n    image2.jpg 600w,\n    image3.jpg 900w\" class=\"lazyload\" />\n\n<!-- picture with one implicit density descriptor per srcset -->\n<picture>\n\t<!--[if IE 9]><audio><![endif]-->\n\t<source\n\t\tdata-srcset=\"http://placehold.it/500x600/11e87f/fff\"\n\t\tmedia=\"--small\" />\n\t<source\n\t\tdata-srcset=\"http://placehold.it/700x300\"\n\t\tmedia=\"--medium\" />\n\t<source\n\t\tdata-srcset=\"http://placehold.it/1400x600/e8117f/fff\"\n\t\tmedia=\"--large\" />\n\t<source\n    \t    data-srcset=\"http://placehold.it/1800x900/117fe8/fff\" />\n    <!--[if IE 9]></audio><![endif]-->\n    <img\n        src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n        class=\"lazyload\"\n        alt=\"image with artdirection\" />\n</picture>\n\n<!-- picture with explicit w descriptors and data-sizes=\"auto\" -->\n<picture>\n\t<!--[if IE 9]><audio><![endif]-->\n\t<source\n\t\tdata-srcset=\"http://placehold.it/500x600/11e87f/fff 500w,\n\t\t    http://placehold.it/750x900/11e87f/fff 750w\"\n\t\tmedia=\"--small\" />\n\t<source\n\t\tdata-srcset=\"http://placehold.it/700x300 700w,\n\t\t\thttp://placehold.it/1050x450 1050w\"\n\t\tmedia=\"--medium\" />\n\t<source\n\t\tdata-srcset=\"http://placehold.it/1400x600/e8117f/fff 1400w,\n\t\t\thttp://placehold.it/2100x900/e8117f/fff 2100w\"\n\t\tmedia=\"--large\" />\n\t<source\n\t    data-srcset=\"http://placehold.it/1800x900/117fe8/fff 1800w,\n\t    \thttp://placehold.it/2700x1350/117fe8/fff 2700w\" />\n\t<!--[if IE 9]></audio><![endif]-->\n\t<img\n\t\tsrc=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"\n\t\tclass=\"lazyload\"\n\t\tdata-sizes=\"auto\"\n\t\talt=\"image with artdirection\" />\n</picture>\n\n<!-- use of width descriptors + simple sizes value with px unit -->\n<img\n    data-srcset=\"image1.jpg 300w,\n    image3.jpg 600w\"\n    sizes=\"300px\"\n    class=\"lazyload\" />\n```\n\n### Tip: Using/Generating more complex dynamic ``sizes``\n\nAs explained above this partial polyfill only accepts one value for ``sizes`` using only the *px* length. Due to the fact, that also ``data-sizes=\"auto\"`` is supported the ``lazybeforesizes`` event can be used to dynamically change/add different ``sizes``:\n\n```js\ndocument.addEventListener('lazybeforesizes', function(e){\n\t//calculate the size as a number\n\te.detail.width =  yourCalculation(e.target) || e.detail.width;\n});\n```\n"
  },
  {
    "path": "plugins/respimg/ls.respimg.js",
    "content": "(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\tvar polyfill;\n\tvar lazySizesCfg = lazySizes.cfg;\n\tvar img = document.createElement('img');\n\tvar supportSrcset = ('sizes' in img) && ('srcset' in img);\n\tvar regHDesc = /\\s+\\d+h/g;\n\tvar fixEdgeHDescriptor = (function(){\n\t\tvar regDescriptors = /\\s+(\\d+)(w|h)\\s+(\\d+)(w|h)/;\n\t\tvar forEach = Array.prototype.forEach;\n\n\t\treturn function(){\n\t\t\tvar img = document.createElement('img');\n\t\t\tvar removeHDescriptors = function(source){\n\t\t\t\tvar ratio, match;\n\t\t\t\tvar srcset = source.getAttribute(lazySizesCfg.srcsetAttr);\n\t\t\t\tif(srcset){\n\t\t\t\t\tif((match = srcset.match(regDescriptors))){\n\t\t\t\t\t\tif(match[2] == 'w'){\n\t\t\t\t\t\t\tratio = match[1] / match[3];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tratio = match[3] / match[1];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(ratio){\n\t\t\t\t\t\t\tsource.setAttribute('data-aspectratio', ratio);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsource.setAttribute(lazySizesCfg.srcsetAttr, srcset.replace(regHDesc, ''));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tvar handler = function(e){\n\t\t\t\tif(e.detail.instance != lazySizes){return;}\n\t\t\t\tvar picture = e.target.parentNode;\n\n\t\t\t\tif(picture && picture.nodeName == 'PICTURE'){\n\t\t\t\t\tforEach.call(picture.getElementsByTagName('source'), removeHDescriptors);\n\t\t\t\t}\n\t\t\t\tremoveHDescriptors(e.target);\n\t\t\t};\n\n\t\t\tvar test = function(){\n\t\t\t\tif(!!img.currentSrc){\n\t\t\t\t\tdocument.removeEventListener('lazybeforeunveil', handler);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.addEventListener('lazybeforeunveil', handler);\n\n\t\t\timg.onload = test;\n\t\t\timg.onerror = test;\n\n\t\t\timg.srcset = 'data:,a 1w 1h';\n\n\t\t\tif(img.complete){\n\t\t\t\ttest();\n\t\t\t}\n\t\t};\n\t})();\n\n\tif(!lazySizesCfg.supportsType){\n\t\tlazySizesCfg.supportsType = function(type/*, elem*/){\n\t\t\treturn !type;\n\t\t};\n\t}\n\n\tif (window.HTMLPictureElement && supportSrcset) {\n\t\tif(!lazySizes.hasHDescriptorFix && document.msElementsFromPoint){\n\t\t\tlazySizes.hasHDescriptorFix = true;\n\t\t\tfixEdgeHDescriptor();\n\t\t}\n\t\treturn;\n\t}\n\n\tif(window.picturefill || lazySizesCfg.pf){return;}\n\n\tlazySizesCfg.pf = function(options){\n\t\tvar i, len;\n\t\tif(window.picturefill){return;}\n\t\tfor(i = 0, len = options.elements.length; i < len; i++){\n\t\t\tpolyfill(options.elements[i]);\n\t\t}\n\t};\n\n\t// partial polyfill\n\tpolyfill = (function(){\n\t\tvar ascendingSort = function( a, b ) {\n\t\t\treturn a.w - b.w;\n\t\t};\n\t\tvar regPxLength = /^\\s*\\d+\\.*\\d*px\\s*$/;\n\t\tvar reduceCandidate = function (srces) {\n\t\t\tvar lowerCandidate, bonusFactor;\n\t\t\tvar len = srces.length;\n\t\t\tvar candidate = srces[len -1];\n\t\t\tvar i = 0;\n\n\t\t\tfor(i; i < len;i++){\n\t\t\t\tcandidate = srces[i];\n\t\t\t\tcandidate.d = candidate.w / srces.w;\n\n\t\t\t\tif(candidate.d >= srces.d){\n\t\t\t\t\tif(!candidate.cached && (lowerCandidate = srces[i - 1]) &&\n\t\t\t\t\t\tlowerCandidate.d > srces.d - (0.13 * Math.pow(srces.d, 2.2))){\n\n\t\t\t\t\t\tbonusFactor = Math.pow(lowerCandidate.d - 0.6, 1.6);\n\n\t\t\t\t\t\tif(lowerCandidate.cached) {\n\t\t\t\t\t\t\tlowerCandidate.d += 0.15 * bonusFactor;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(lowerCandidate.d + ((candidate.d - srces.d) * bonusFactor) > srces.d){\n\t\t\t\t\t\t\tcandidate = lowerCandidate;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn candidate;\n\t\t};\n\n\t\tvar parseWsrcset = (function(){\n\t\t\tvar candidates;\n\t\t\tvar regWCandidates = /(([^,\\s].[^\\s]+)\\s+(\\d+)w)/g;\n\t\t\tvar regMultiple = /\\s/;\n\t\t\tvar addCandidate = function(match, candidate, url, wDescriptor){\n\t\t\t\tcandidates.push({\n\t\t\t\t\tc: candidate,\n\t\t\t\t\tu: url,\n\t\t\t\t\tw: wDescriptor * 1\n\t\t\t\t});\n\t\t\t};\n\n\t\t\treturn function(input){\n\t\t\t\tcandidates = [];\n\t\t\t\tinput = input.trim();\n\t\t\t\tinput\n\t\t\t\t\t.replace(regHDesc, '')\n\t\t\t\t\t.replace(regWCandidates, addCandidate)\n\t\t\t\t;\n\n\t\t\t\tif(!candidates.length && input && !regMultiple.test(input)){\n\t\t\t\t\tcandidates.push({\n\t\t\t\t\t\tc: input,\n\t\t\t\t\t\tu: input,\n\t\t\t\t\t\tw: 99\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn candidates;\n\t\t\t};\n\t\t})();\n\n\t\tvar runMatchMedia = function(){\n\t\t\tif(runMatchMedia.init){return;}\n\n\t\t\trunMatchMedia.init = true;\n\t\t\taddEventListener('resize', (function(){\n\t\t\t\tvar timer;\n\t\t\t\tvar matchMediaElems = document.getElementsByClassName('lazymatchmedia');\n\t\t\t\tvar run = function(){\n\t\t\t\t\tvar i, len;\n\t\t\t\t\tfor(i = 0, len = matchMediaElems.length; i < len; i++){\n\t\t\t\t\t\tpolyfill(matchMediaElems[i]);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\treturn function(){\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ttimer = setTimeout(run, 66);\n\t\t\t\t};\n\t\t\t})());\n\t\t};\n\n\t\tvar createSrcset = function(elem, isImage){\n\t\t\tvar parsedSet;\n\t\t\tvar srcSet = elem.getAttribute('srcset') || elem.getAttribute(lazySizesCfg.srcsetAttr);\n\n\t\t\tif(!srcSet && isImage){\n\t\t\t\tsrcSet = !elem._lazypolyfill ?\n\t\t\t\t\t(elem.getAttribute(lazySizesCfg.srcAttr) || elem.getAttribute('src')) :\n\t\t\t\t\telem._lazypolyfill._set\n\t\t\t\t;\n\t\t\t}\n\n\t\t\tif(!elem._lazypolyfill || elem._lazypolyfill._set != srcSet){\n\n\t\t\t\tparsedSet = parseWsrcset( srcSet || '' );\n\t\t\t\tif(isImage && elem.parentNode){\n\t\t\t\t\tparsedSet.isPicture = elem.parentNode.nodeName.toUpperCase() == 'PICTURE';\n\n\t\t\t\t\tif(parsedSet.isPicture){\n\t\t\t\t\t\tif(window.matchMedia){\n\t\t\t\t\t\t\tlazySizes.aC(elem, 'lazymatchmedia');\n\t\t\t\t\t\t\trunMatchMedia();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tparsedSet._set = srcSet;\n\t\t\t\tObject.defineProperty(elem, '_lazypolyfill', {\n\t\t\t\t\tvalue: parsedSet,\n\t\t\t\t\twritable: true\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tvar getX = function(elem){\n\t\t\tvar dpr = window.devicePixelRatio || 1;\n\t\t\tvar optimum = lazySizes.getX && lazySizes.getX(elem);\n\t\t\treturn Math.min(optimum || dpr, 2.5, dpr);\n\t\t};\n\n\t\tvar matchesMedia = function(media){\n\t\t\tif(window.matchMedia){\n\t\t\t\tmatchesMedia = function(media){\n\t\t\t\t\treturn !media || (matchMedia(media) || {}).matches;\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn !media;\n\t\t\t}\n\n\t\t\treturn matchesMedia(media);\n\t\t};\n\n\t\tvar getCandidate = function(elem){\n\t\t\tvar sources, i, len, media, source, srces, src, width;\n\n\t\t\tsource = elem;\n\t\t\tcreateSrcset(source, true);\n\t\t\tsrces = source._lazypolyfill;\n\n\t\t\tif(srces.isPicture){\n\t\t\t\tfor(i = 0, sources = elem.parentNode.getElementsByTagName('source'), len = sources.length; i < len; i++){\n\t\t\t\t\tif( lazySizesCfg.supportsType(sources[i].getAttribute('type'), elem) && matchesMedia( sources[i].getAttribute('media')) ){\n\t\t\t\t\t\tsource = sources[i];\n\t\t\t\t\t\tcreateSrcset(source);\n\t\t\t\t\t\tsrces = source._lazypolyfill;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(srces.length > 1){\n\t\t\t\twidth = source.getAttribute('sizes') || '';\n\t\t\t\twidth = regPxLength.test(width) && parseInt(width, 10) || lazySizes.gW(elem, elem.parentNode);\n\t\t\t\tsrces.d = getX(elem);\n\t\t\t\tif(!srces.src || !srces.w || srces.w < width){\n\t\t\t\t\tsrces.w = width;\n\t\t\t\t\tsrc = reduceCandidate(srces.sort(ascendingSort));\n\t\t\t\t\tsrces.src = src;\n\t\t\t\t} else {\n\t\t\t\t\tsrc = srces.src;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsrc = srces[0];\n\t\t\t}\n\n\t\t\treturn src;\n\t\t};\n\n\t\tvar p = function(elem){\n\t\t\tif(supportSrcset && elem.parentNode && elem.parentNode.nodeName.toUpperCase() != 'PICTURE'){return;}\n\t\t\tvar candidate = getCandidate(elem);\n\n\t\t\tif(candidate && candidate.u && elem._lazypolyfill.cur != candidate.u){\n\t\t\t\telem._lazypolyfill.cur = candidate.u;\n\t\t\t\tcandidate.cached = true;\n\t\t\t\telem.setAttribute(lazySizesCfg.srcAttr, candidate.u);\n\t\t\t\telem.setAttribute('src', candidate.u);\n\t\t\t}\n\t\t};\n\n\t\tp.parse = parseWsrcset;\n\n\t\treturn p;\n\t})();\n\n\tif(lazySizesCfg.loadedClass && lazySizesCfg.loadingClass){\n\t\t(function(){\n\t\t\tvar sels = [];\n\t\t\t['img[sizes$=\"px\"][srcset].', 'picture > img:not([srcset]).'].forEach(function(sel){\n\t\t\t\tsels.push(sel + lazySizesCfg.loadedClass);\n\t\t\t\tsels.push(sel + lazySizesCfg.loadingClass);\n\t\t\t});\n\t\t\tlazySizesCfg.pf({\n\t\t\t\telements: document.querySelectorAll(sels.join(', '))\n\t\t\t});\n\t\t})();\n\n\t}\n}));\n"
  },
  {
    "path": "plugins/rias/README.md",
    "content": "# lazySizes RIaS extension (Responsive image as a service / Responsive image on demand)\n\nThe RiaS plugin enables lazySizes to generate the best suitable image source based on an URL pattern. It works with pre-build images (i.e. grunt-responsive-images) as also with any third party (ReSrc, Pixtulate, mobify, WURFL's Image Tailor ...) or self hosted restful responsive image services (responsive image on demand).\n\nIn general the RIaS  plugin combines the simplicity of the famous Imager.js solution with the future power of native responsive images implementations and the webcomponent-like working of lazySizes' ``.lazyload`` elements (self-initialization, self-configuration and self-destroying).\n\nIn case the browser does support ``srcset`` the RIaS plugin will also produce a list of source candidates so that any current and future improvements (low bandwidth, metered bandwidth, user preferences, browser zoom etc.) to the native responsive image support is automatically exploited.\n\nThe RiaS plugin also allows art direction by combining placeholder URLs with a ``picture`` element.\n\n## Basic/quick usage\n\n* Add the RiaS plugin right before the lazySizes script or concat those scripts into your script bundle:\n\n```html\n<!-- include lazysizes + rias extension -->\n<script src=\"../plugins/rias/ls.rias.js\"></script>\n<script src=\"../lazysizes.js\"></script>\n```\n\n\n* Add the ``lazyload`` class and the ``data-sizes=\"auto\"`` attribute to your image and include the placeholder ``{width}`` at the point, where your image service expects the requested width of the image.\n\n```html\n<img\n\tdata-src=\"http://placehold.it/{width}\"\n\tdata-sizes=\"auto\"\n\tclass=\"lazyload\"\n\talt=\"\" />\n\n<img\n    data-src=\"http://wit.wurfl.io/w_{width}/http://wurfl.io/assets/sunsetbeach.jpg\"\n\tdata-sizes=\"auto\"\n\tclass=\"lazyload\"\n\talt=\"\" />\n```\n\n## [Demo](http://afarkas.github.io/lazysizes/rias/)\nA [demo with markup and code examples can be seen here](http://afarkas.github.io/lazysizes/rias/).\n\n## Configuration/Options\n\nThe RIaS plugin can be configured through the ``lazySizesConfig.rias`` option object, which should be configured before the lazySizes script.\n\n```js\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nwindow.lazySizesConfig.rias = window.lazySizesConfig.rias || {};\n\n// configure available widths to replace with the {width} placeholder\nwindow.lazySizesConfig.rias.widths = [320, 480, 640, 960];\nwindow.lazySizesConfig.rias.absUrl = true;\n```\n\nor element specific and declarative with corresponding ``data-*`` attributes:\n\n```html\n<img\n    data-widths=\"[160, 320]\"\n    data-absurl=\"false\"\n    data-src=\"http://placehold.it/{width}\"\n    data-sizes=\"auto\"\n    class=\"lazyload\"\n    alt=\"\" />\n```\n\nor element specific and functional using the ``lazyriasmodifyoptions`` event.\n\n```html\n<script>\ndocument.addEventListener('lazyriasmodifyoptions', function(event){\n    // event.detail referes the placeholders/options and event.target the corresponding element\n    event.detail.quality = (window.devicePixelRatio || 1) > 1.9 ? 50 : 80;\n});\n</script>\n<img\n    data-src=\"image-w{width}-q{quality}.jpg\"\n    data-sizes=\"auto\"\n    class=\"lazyload\"\n    alt=\"\" />\n```\n\nAll ``rias`` options can also be used as ``data-*`` attributes.\n\n### URL generation and {placeholder}s\n\nThe url is dynamically generated by replacing placeholder values, which are enclosed by curly brackets.\n\nAll RiAS options can also be used as a {placeholder} inside the url.\n\n### List of Options\n\n* ``lazySizesConfig.rias.srcAttr`` (default: ``\"data-src\"``): The attribute, which should be transformed to ``src``/``srcset``. (The extension will also automatically check the ``lazySizesConfig.srcsetAttr`` and ``lazySizesConfig.srcAttr``)\n* ``lazySizesConfig.rias.widths`` (``array of numbers``): The widths option reduces the calculated ``width`` to the allowed widths. The numeric width can also be simply mapped to a string (i.e.: small, medium, large) using the ``widthmap`` option. The default value is the following array: ``[180, 360, 540, 720, 900, 1080, 1296, 1512, 1728, 1944, 2160, 2376, 2592, 2808, 3024]``.\n* ``lazySizesConfig.rias.widthmap`` (``{}``): The widthmap option allows you to simply transform a numeric width to a string.\n    ```js\n    window.lazySizesConfig = window.lazySizesConfig || {};\n    window.lazySizesConfig.rias = window.lazySizesConfig.rias || {};\n\n    window.lazySizesConfig.rias.widths = [320, 640, 940];\n    window.lazySizesConfig.rias.widthmap = {\n        320: 'small',\n        640: 'medium',\n        940: 'large'\n   };\n    ```\n* ``lazySizesConfig.rias.modifyOptions`` (default: ``function`` noop ): A ``function`` that gets an data object passed with the options as the ``details`` and the corresponding ``img`` element as the ``target``. Can be used to modify existing options/placeholder values or to add new placeholder values. An event with the name ``lazyriasmodifyoptions`` is also fired at the element.\n    ```html\n    <script>\n    window.lazySizesConfig = window.lazySizesConfig || {};\n    window.lazySizesConfig.rias = window.lazySizesConfig.rias || {};\n    window.lazySizesConfig.rias.modifyOptions = function(data){\n        //create higher compressed images on HighDPI devices:\n        data.detail.quality = (window.devicePixelRatio || 1) > 1.9 ? 50 : 80;\n    };\n    </script>\n    <img\n        data-src=\"image-w{width}-q{quality}.jpg\"\n        data-sizes=\"auto\"\n        class=\"lazyload\"\n        alt=\"\" />\n    ```\n\n* ``lazySizesConfig.rias.absUrl`` (default: ``false``): Wether the value of the ``data-src`` attribute should be resolved to an absolute url. The value must not contain any placeholders in this case. Use in conjunction with ``prefix`` and/or ``postfix`` option.\n    ```html\n    <script>\n        window.lazySizesConfig = window.lazySizesConfig || {};\n        window.lazySizesConfig.rias = {\n            prefix: 'http://wit.wurfl.io/w_{width}/',\n            absUrl: true\n        };\n    </script>\n\n    <img\n        data-src=\"assets/sunsetbeach.jpg\"\n        data-sizes=\"auto\"\n        class=\"lazyload\"\n        alt=\"\" />\n    ```\n\n* ``lazySizesConfig.rias.prefix`` (default: ``\"\"``): A string, which is prepended to the generated src.\n    ```html\n    <script>\n    window.lazySizesConfig = window.lazySizesConfig || {};\n    window.lazySizesConfig.rias = {\n        prefix: 'http://placehold.it/'\n    };\n    </script>\n    <img\n        data-src=\"{width}\"\n        data-sizes=\"auto\"\n        class=\"lazyload\"\n        alt=\"\" />\n    ```\n* ``lazySizesConfig.rias.postfix`` (default: ``\"\"`` ): A string, which is appended to the generated src.\n\nWith lazySizes + RIaS extension you have a script to rule them all. You won't need to include a script provided by a third party image on demand service.\n\n### Dynamically calculating the height of image elements\n\nYou can provide a `apsectratio`  option which then will be used to dynamically replace `{height}` placeholders. \n\n```html\n<img\n    data-src=\"{width}x{height}}\"\n    data-aspectratio=\"2\"\n    data-sizes=\"auto\"\n    class=\"lazyload\"\n    alt=\"\" />\n```\n\nIn case your image has CSS defined width and height dimensions you can provide this dynamically:\n\n```js\ndocument.addEventListener('lazyriasmodifyoptions', function(e) {\n    e.detail.aspectratio = e.target.offsetWidth / e.target.offsetHeight;\n});\n```\n \n\n## Advanced Examples\n\n### Embedding via CDN and combohandler\n\nIn case you want to use a CDN you can use jsDelivr's combohandler service:\n\n```html\n<script src=\"http://cdn.jsdelivr.net/g/lazysizes(lazysizes.min.js+plugins/rias/ls.rias.min.js)\" async=\"\"></script>\n```\n\n### Using art direction\n\nIn case you want to use art direction simply also use placeholder urls inside of your ``source[data-srcset]`` or ``source[data-src]`` attributes.\n\n```html\n<picture>\n    <!--[if IE 9]><audio><![endif]-->\n    <source\n            data-srcset=\"http://placehold.it/{width}/1111ee/fff\"\n            media=\"(max-width: 500px)\" />\n    <source\n            data-srcset=\"http://placehold.it/{width}/e8117f/fff\"\n            media=\"(max-width: 1090px)\" />\n    <source\n            data-srcset=\"http://placehold.it/{width}/7D26CD/fff\"\n            media=\"(min-width: 1224px)\" />\n    <source\n            data-srcset=\"http://placehold.it/{width}\"\n             />\n    <!--[if IE 9]></audio><![endif]-->\n    <img\n        src=\"http://placehold.it/100\"\n        data-sizes=\"auto\"\n        class=\"lazyload\"\n        alt=\"\" />\n</picture>\n```\n\n### Using different ``widths`` options for different images\nOften you will have different image formats with different allowed available ``widths``. This can be configured in two ways:\n\n#### Descriptive way the ``data-widths`` attribute\n\n```html\n<img\n        data-srcset=\"http://placehold.it/{width}\"\n        data-widths=\"[320, 480, 640]\"\n        data-sizes=\"auto\"\n        class=\"lazyload\"\n        alt=\"\" />\n\n<img\n        data-srcset=\"http://placehold.it/{width}\"\n        data-widths=\"[640, 800, 960]\"\n        data-sizes=\"auto\"\n        class=\"lazyload\"\n        alt=\"\" />\n\n```\n\n#### Scripted way using the ``lazyriasmodifyoptions`` event\n\n\n```html\n<script>\ndocument.addEventListener('lazyriasmodifyoptions', (function(){\n    var formats = {\n        full: [640, 800, 960, 1280, 1600],\n        content: [320, 480, 640]\n    };\n    return function(e){\n       var format = e.target.getAttribute('data-format');\n       if(formats[format]){\n           e.detail.widths = formats[format];\n       }\n   };\n})());\n</script>\n\n<img\n    data-src=\"http://placehold.it/{width}\"\n    data-format=\"full\"\n    data-sizes=\"auto\"\n    class=\"lazyload\"\n    alt=\"\" />\n\n<img\n    data-src=\"http://placehold.it/{width}\"\n    data-format=\"content\"\n    data-sizes=\"auto\"\n    class=\"lazyload\"\n    alt=\"\" />\n```\n\n### Overriding existing placeholders or Extending new placeholders\n\nThe RIaS plugin is highly flexible in extending possible {placeholder} values. Each {placeholder} will be tried to be replaced by searching it in the ``lazySizesConfig.rias`` option object or by searching for a corresponding ``data-*`` attribute.\n\nAdditionally the ``modifyOptions`` callback or the equivalent ``lazyriasmodifyoptions`` event can be used to generate new or modify existing placeholders:\n\n**Using ``data-*`` to override an existing placeholder:**\n\n```html\n<img\n    data-widths=\"[160, 320]\"\n    data-src=\"http://placehold.it/{width}\"\n    data-sizes=\"auto\"\n    class=\"lazyload\" />\n```\n\n**Using ``data-*`` to define a new placeholder:**\n\n```html\n<img\n    data-custom=\"foo\"\n    data-src=\"http://placehold.it/{width}/{custom}\"\n    data-sizes=\"auto\"\n    class=\"lazyload\" />\n```\n\n**Using the ``lazySizesConfig.rias`` object to define a new placeholder:**\n\n```html\n<script>\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nwindow.lazySizesConfig.rias = {\n    custom: 'test',\n    dynCustom: function(elem, opts){\n        return 'computed-something';\n    }\n};\n</script>\n<img\n    data-src=\"http://placehold.it/{width}/{custom}/{dynCustom}\"\n    data-sizes=\"auto\"\n    class=\"lazyload\"\n    alt=\"\" />\n```\n\n**Using the ``lazyriasmodifyoptions`` event to define or change a placeholder object:**\n\n```html\n<script>\ndocument.addEventListener('lazyriasmodifyoptions', function(e){\n    // change available widths and widthmap for .special-widths elements\n    if($(e.target).is('.special-widths')){\n        // (Note: With version 1.1.0 the ``details`` property will be renamed to ``detail``.)\n        e.detail.widths = [320, 480, 600];\n        e.detail.widthmap = {\n              320: 'small',\n              480: 'medium',\n              600: 'large'\n         };\n    }\n\n    //add new custom property with value 'foo'\n    e.detail.custom = 'foo';\n\n    e.detail.quality = (window.devicePixelRatio || 1) > 1.9 ? 50 : 80;\n});\n</script>\n<img\n    data-src=\"image-w{width}-w{custom}-q{quality}.jpg\"\n    data-sizes=\"auto\"\n    class=\"lazyload special-widths\"\n    alt=\"\" />\n```\n\n### Tip: Constraining the pixel density for a generated ``srcset`` attribute.\n\nIn case you don't want to generate additional compressive images for high resolution displays you can combine the RIaS extension with the [optimumx extension](../optimumx) to constrain the maximum pixel density for the generated ``srcset`` list.\n\n```html\n<script src=\"http://cdn.jsdelivr.net/g/lazysizes(lazysizes.min.js+plugins/rias/ls.rias.min.js+plugins/optimumx/ls.optimumx.min.js)\" async=\"\"></script>\n\n\n<img\n    data-src=\"image-width-{width}.jpg\"\n    data-optimumx=\"1.6\"\n    data-sizes=\"auto\"\n    class=\"lazyload\" />\n```\n\n"
  },
  {
    "path": "plugins/rias/ls.rias.js",
    "content": "(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\n\tvar config, riasCfg;\n\tvar lazySizesCfg = lazySizes.cfg;\n\tvar replaceTypes = {string: 1, number: 1};\n\tvar regNumber = /^\\-*\\+*\\d+\\.*\\d*$/;\n\tvar regPicture = /^picture$/i;\n\tvar regWidth = /\\s*\\{\\s*width\\s*\\}\\s*/i;\n\tvar regHeight = /\\s*\\{\\s*height\\s*\\}\\s*/i;\n\tvar regPlaceholder = /\\s*\\{\\s*([a-z0-9]+)\\s*\\}\\s*/ig;\n\tvar regObj = /^\\[.*\\]|\\{.*\\}$/;\n\tvar regAllowedSizes = /^(?:auto|\\d+(px)?)$/;\n\tvar anchor = document.createElement('a');\n\tvar img = document.createElement('img');\n\tvar buggySizes = ('srcset' in img) && !('sizes' in img);\n\tvar supportPicture = !!window.HTMLPictureElement && !buggySizes;\n\n\t(function(){\n\t\tvar prop;\n\t\tvar noop = function(){};\n\t\tvar riasDefaults = {\n\t\t\tprefix: '',\n\t\t\tpostfix: '',\n\t\t\tsrcAttr: 'data-src',\n\t\t\tabsUrl: false,\n\t\t\tmodifyOptions: noop,\n\t\t\twidthmap: {},\n\t\t\tratio: false,\n\t\t\ttraditionalRatio: false,\n\t\t\taspectratio: false,\n\t\t};\n\n\t\tconfig = lazySizes && lazySizes.cfg;\n\n\t\tif(!config.supportsType){\n\t\t\tconfig.supportsType = function(type/*, elem*/){\n\t\t\t\treturn !type;\n\t\t\t};\n\t\t}\n\n\t\tif(!config.rias){\n\t\t\tconfig.rias = {};\n\t\t}\n\t\triasCfg = config.rias;\n\n\t\tif(!('widths' in riasCfg)){\n\t\t\triasCfg.widths = [];\n\t\t\t(function (widths){\n\t\t\t\tvar width;\n\t\t\t\tvar i = 0;\n\t\t\t\twhile(!width || width < 3000){\n\t\t\t\t\ti += 5;\n\t\t\t\t\tif(i > 30){\n\t\t\t\t\t\ti += 1;\n\t\t\t\t\t}\n\t\t\t\t\twidth = (36 * i);\n\t\t\t\t\twidths.push(width);\n\t\t\t\t}\n\t\t\t})(riasCfg.widths);\n\t\t}\n\n\t\tfor(prop in riasDefaults){\n\t\t\tif(!(prop in riasCfg)){\n\t\t\t\triasCfg[prop] = riasDefaults[prop];\n\t\t\t}\n\t\t}\n\t})();\n\n\tfunction getElementOptions(elem, src, options){\n\t\tvar attr, parent, setOption, prop, opts;\n\t\tvar elemStyles = window.getComputedStyle(elem);\n\n\t\tif (!options) {\n\t\t\tparent = elem.parentNode;\n\n\t\t\toptions = {\n\t\t\t\tisPicture: !!(parent && regPicture.test(parent.nodeName || ''))\n\t\t\t};\n\t\t} else {\n\t\t\topts = {};\n\n\t\t\tfor (prop in options) {\n\t\t\t\topts[prop] = options[prop];\n\t\t\t}\n\n\t\t\toptions = opts;\n\t\t}\n\n\t\tsetOption = function(attr, run){\n\t\t\tvar attrVal = elem.getAttribute('data-'+ attr);\n\n\t\t\tif (!attrVal) {\n\t\t\t\t// no data- attr, get value from the CSS\n\t\t\t\tvar styles = elemStyles.getPropertyValue('--ls-' + attr);\n\t\t\t\t// at least Safari 9 returns null rather than\n\t\t\t\t// an empty string for getPropertyValue causing\n\t\t\t\t// .trim() to fail\n\t\t\t\tif (styles) {\n\t\t\t\t\tattrVal = styles.trim();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (attrVal) {\n\t\t\t\tif(attrVal == 'true'){\n\t\t\t\t\tattrVal = true;\n\t\t\t\t} else if(attrVal == 'false'){\n\t\t\t\t\tattrVal = false;\n\t\t\t\t} else if(regNumber.test(attrVal)){\n\t\t\t\t\tattrVal = parseFloat(attrVal);\n\t\t\t\t} else if(typeof riasCfg[attr] == 'function'){\n\t\t\t\t\tattrVal = riasCfg[attr](elem, attrVal);\n\t\t\t\t} else if(regObj.test(attrVal)){\n\t\t\t\t\ttry {\n\t\t\t\t\t\tattrVal = JSON.parse(attrVal);\n\t\t\t\t\t} catch(e){}\n\t\t\t\t}\n\t\t\t\toptions[attr] = attrVal;\n\t\t\t} else if((attr in riasCfg) && typeof riasCfg[attr] != 'function' && !options[attr]){\n\t\t\t\toptions[attr] = riasCfg[attr];\n\t\t\t} else if(run && typeof riasCfg[attr] == 'function'){\n\t\t\t\toptions[attr] = riasCfg[attr](elem, attrVal);\n\t\t\t}\n\t\t};\n\n\t\tfor(attr in riasCfg){\n\t\t\tsetOption(attr);\n\t\t}\n\t\tsrc.replace(regPlaceholder, function(full, match){\n\t\t\tif(!(match in options)){\n\t\t\t\tsetOption(match, true);\n\t\t\t}\n\t\t});\n\n\t\treturn options;\n\t}\n\n\tfunction replaceUrlProps(url, options){\n\t\tvar candidates = [];\n\t\tvar replaceFn = function(full, match){\n\t\t\treturn (replaceTypes[typeof options[match]]) ? options[match] : full;\n\t\t};\n\t\tcandidates.srcset = [];\n\n\t\tif(options.absUrl){\n\t\t\tanchor.setAttribute('href', url);\n\t\t\turl = anchor.href;\n\t\t}\n\n\t\turl = ((options.prefix || '') + url + (options.postfix || '')).replace(regPlaceholder, replaceFn);\n\n\t\toptions.widths.forEach(function(width){\n\t\t\tvar widthAlias = options.widthmap[width] || width;\n\t\t\tvar ratio = options.aspectratio || options.ratio;\n\t\t\tvar traditionalRatio = !options.aspectratio && riasCfg.traditionalRatio;\n\t\t\tvar candidate = {\n\t\t\t\tu: url.replace(regWidth, widthAlias)\n\t\t\t\t\t\t.replace(regHeight, ratio ?\n\t\t\t\t\t\t\ttraditionalRatio ?\n\t\t\t\t\t\t\t\tMath.round(width * ratio) :\n\t\t\t\t\t\t\t\tMath.round(width / ratio)\n\t\t\t\t\t\t\t: ''),\n\t\t\t\tw: width\n\t\t\t};\n\n\t\t\tcandidates.push(candidate);\n\t\t\tcandidates.srcset.push( (candidate.c = candidate.u + ' ' + width + 'w') );\n\t\t});\n\t\treturn candidates;\n\t}\n\n\tfunction setSrc(src, opts, elem){\n\t\tvar elemW = 0;\n\t\tvar elemH = 0;\n\t\tvar sizeElement = elem;\n\n\t\tif(!src){return;}\n\n\t\tif (opts.ratio === 'container') {\n\t\t\t// calculate image or parent ratio\n\t\t\telemW = sizeElement.scrollWidth;\n\t\t\telemH = sizeElement.scrollHeight;\n\n\t\t\twhile ((!elemW || !elemH) && sizeElement !== document) {\n\t\t\t\tsizeElement = sizeElement.parentNode;\n\t\t\t\telemW = sizeElement.scrollWidth;\n\t\t\t\telemH = sizeElement.scrollHeight;\n\t\t\t}\n\t\t\tif (elemW && elemH) {\n\t\t\t\topts.ratio = opts.traditionalRatio ? elemH / elemW : elemW / elemH;\n\t\t\t}\n\t\t}\n\n\t\tsrc = replaceUrlProps(src, opts);\n\n\t\tsrc.isPicture = opts.isPicture;\n\n\t\tif(buggySizes && elem.nodeName.toUpperCase() == 'IMG'){\n\t\t\telem.removeAttribute(config.srcsetAttr);\n\t\t} else {\n\t\t\telem.setAttribute(config.srcsetAttr, src.srcset.join(', '));\n\t\t}\n\n\t\tObject.defineProperty(elem, '_lazyrias', {\n\t\t\tvalue: src,\n\t\t\twritable: true\n\t\t});\n\t}\n\n\tfunction createAttrObject(elem, src){\n\t\tvar opts = getElementOptions(elem, src);\n\n\t\triasCfg.modifyOptions.call(elem, {target: elem, details: opts, detail: opts});\n\n\t\tlazySizes.fire(elem, 'lazyriasmodifyoptions', opts);\n\t\treturn opts;\n\t}\n\n\tfunction getSrc(elem){\n\t\treturn elem.getAttribute( elem.getAttribute('data-srcattr') || riasCfg.srcAttr ) || elem.getAttribute(config.srcsetAttr) || elem.getAttribute(config.srcAttr) || elem.getAttribute('data-pfsrcset') || '';\n\t}\n\n\taddEventListener('lazybeforesizes', function(e){\n\t\tif(e.detail.instance != lazySizes){return;}\n\n\t\tvar elem, src, elemOpts, sourceOpts, parent, sources, i, len, sourceSrc, sizes, detail, hasPlaceholder, modified, emptyList;\n\t\telem = e.target;\n\n\t\tif(!e.detail.dataAttr || e.defaultPrevented || riasCfg.disabled || !((sizes = elem.getAttribute(config.sizesAttr) || elem.getAttribute('sizes')) && regAllowedSizes.test(sizes))){return;}\n\n\t\tsrc = getSrc(elem);\n\n\t\telemOpts = createAttrObject(elem, src);\n\n\t\thasPlaceholder = regWidth.test(elemOpts.prefix) || regWidth.test(elemOpts.postfix);\n\n\t\tif(elemOpts.isPicture && (parent = elem.parentNode)){\n\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\tif ( hasPlaceholder || regWidth.test(sourceSrc = getSrc(sources[i])) ){\n\t\t\t\t\tsourceOpts = getElementOptions(sources[i], sourceSrc, elemOpts);\n\t\t\t\t\tsetSrc(sourceSrc, sourceOpts, sources[i]);\n\t\t\t\t\tmodified = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( hasPlaceholder || regWidth.test(src) ){\n\t\t\tsetSrc(src, elemOpts, elem);\n\t\t\tmodified = true;\n\t\t} else if (modified) {\n\t\t\temptyList = [];\n\t\t\temptyList.srcset = [];\n\t\t\temptyList.isPicture = true;\n\t\t\tObject.defineProperty(elem, '_lazyrias', {\n\t\t\t\tvalue: emptyList,\n\t\t\t\twritable: true\n\t\t\t});\n\t\t}\n\n\t\tif(modified){\n\t\t\tif(supportPicture){\n\t\t\t\telem.removeAttribute(config.srcAttr);\n\t\t\t} else if(sizes != 'auto') {\n\t\t\t\tdetail = {\n\t\t\t\t\twidth: parseInt(sizes, 10)\n\t\t\t\t};\n\t\t\t\tpolyfill({\n\t\t\t\t\ttarget: elem,\n\t\t\t\t\tdetail: detail\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}, true);\n\t// partial polyfill\n\tvar polyfill = (function(){\n\t\tvar ascendingSort = function( a, b ) {\n\t\t\treturn a.w - b.w;\n\t\t};\n\n\t\tvar reduceCandidate = function (srces) {\n\t\t\tvar lowerCandidate, bonusFactor;\n\t\t\tvar len = srces.length;\n\t\t\tvar candidate = srces[len -1];\n\t\t\tvar i = 0;\n\n\t\t\tfor(i; i < len;i++){\n\t\t\t\tcandidate = srces[i];\n\t\t\t\tcandidate.d = candidate.w / srces.w;\n\t\t\t\tif(candidate.d >= srces.d){\n\t\t\t\t\tif(!candidate.cached && (lowerCandidate = srces[i - 1]) &&\n\t\t\t\t\t\tlowerCandidate.d > srces.d - (0.13 * Math.pow(srces.d, 2.2))){\n\n\t\t\t\t\t\tbonusFactor = Math.pow(lowerCandidate.d - 0.6, 1.6);\n\n\t\t\t\t\t\tif(lowerCandidate.cached) {\n\t\t\t\t\t\t\tlowerCandidate.d += 0.15 * bonusFactor;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(lowerCandidate.d + ((candidate.d - srces.d) * bonusFactor) > srces.d){\n\t\t\t\t\t\t\tcandidate = lowerCandidate;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn candidate;\n\t\t};\n\n\t\tvar getWSet = function(elem, testPicture){\n\t\t\tvar src;\n\t\t\tif(!elem._lazyrias && lazySizes.pWS && (src = lazySizes.pWS(elem.getAttribute(config.srcsetAttr || ''))).length){\n\t\t\t\tObject.defineProperty(elem, '_lazyrias', {\n\t\t\t\t\tvalue: src,\n\t\t\t\t\twritable: true\n\t\t\t\t});\n\t\t\t\tif(testPicture && elem.parentNode){\n\t\t\t\t\tsrc.isPicture = elem.parentNode.nodeName.toUpperCase() == 'PICTURE';\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn elem._lazyrias;\n\t\t};\n\n\t\tvar getX = function(elem){\n\t\t\tvar dpr = window.devicePixelRatio || 1;\n\t\t\tvar optimum = lazySizes.getX && lazySizes.getX(elem);\n\t\t\treturn Math.min(optimum || dpr, 2.4, dpr);\n\t\t};\n\n\t\tvar getCandidate = function(elem, width){\n\t\t\tvar sources, i, len, media, srces, src;\n\n\t\t\tsrces = elem._lazyrias;\n\n\t\t\tif(srces.isPicture && window.matchMedia){\n\t\t\t\tfor(i = 0, sources = elem.parentNode.getElementsByTagName('source'), len = sources.length; i < len; i++){\n\t\t\t\t\tif(getWSet(sources[i]) && !sources[i].getAttribute('type') && ( !(media = sources[i].getAttribute('media')) || ((matchMedia(media) || {}).matches))){\n\t\t\t\t\t\tsrces = sources[i]._lazyrias;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!srces.w || srces.w < width){\n\t\t\t\tsrces.w = width;\n\t\t\t\tsrces.d = getX(elem);\n\t\t\t\tsrc = reduceCandidate(srces.sort(ascendingSort));\n\t\t\t}\n\n\t\t\treturn src;\n\t\t};\n\n\t\tvar polyfill = function(e){\n\t\t\tif(e.detail.instance != lazySizes){return;}\n\n\t\t\tvar candidate;\n\t\t\tvar elem = e.target;\n\n\t\t\tif(!buggySizes && (window.respimage || window.picturefill || lazySizesCfg.pf)){\n\t\t\t\tdocument.removeEventListener('lazybeforesizes', polyfill);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(!('_lazyrias' in elem) && (!e.detail.dataAttr || !getWSet(elem, true))){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcandidate = getCandidate(elem, e.detail.width);\n\n\t\t\tif(candidate && candidate.u && elem._lazyrias.cur != candidate.u){\n\t\t\t\telem._lazyrias.cur = candidate.u;\n\t\t\t\tcandidate.cached = true;\n\t\t\t\tlazySizes.rAF(function(){\n\t\t\t\t\telem.setAttribute(config.srcAttr, candidate.u);\n\t\t\t\t\telem.setAttribute('src', candidate.u);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tif(!supportPicture){\n\t\t\taddEventListener('lazybeforesizes', polyfill);\n\t\t} else {\n\t\t\tpolyfill = function(){};\n\t\t}\n\n\t\treturn polyfill;\n\n\t})();\n\n}));\n"
  },
  {
    "path": "plugins/static-gecko-picture/ls.static-gecko-picture.js",
    "content": "/**\n * FF's first picture implementation is static and does not react to viewport changes, this tiny script fixes this.\n */\n(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\tvar match;\n\tvar ua = navigator.userAgent;\n\n\tif ( window.HTMLPictureElement && ((/ecko/).test(ua) && (match = ua.match(/rv\\:(\\d+)/)) && match[1] < 41) ) {\n\t\taddEventListener(\"resize\", (function() {\n\t\t\tvar timer;\n\n\t\t\tvar dummySrc = document.createElement(\"source\");\n\n\t\t\tvar fixRespimg = function(img) {\n\t\t\t\tvar source, sizes;\n\t\t\t\tvar picture = img.parentNode;\n\n\t\t\t\tif (picture.nodeName.toUpperCase() === \"PICTURE\") {\n\t\t\t\t\tsource = dummySrc.cloneNode();\n\n\t\t\t\t\tpicture.insertBefore(source, picture.firstElementChild);\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tpicture.removeChild(source);\n\t\t\t\t\t});\n\t\t\t\t} else if (!img._pfLastSize || img.offsetWidth > img._pfLastSize) {\n\t\t\t\t\timg._pfLastSize = img.offsetWidth;\n\t\t\t\t\tsizes = img.sizes;\n\t\t\t\t\timg.sizes += \",100vw\";\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\timg.sizes = sizes;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar findPictureImgs = function() {\n\t\t\t\tvar i;\n\t\t\t\tvar imgs = document.querySelectorAll(\"picture > img, img[srcset][sizes]\");\n\t\t\t\tfor (i = 0; i < imgs.length; i++) {\n\t\t\t\t\tfixRespimg(imgs[i]);\n\t\t\t\t}\n\t\t\t};\n\t\t\tvar onResize = function() {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\ttimer = setTimeout(findPictureImgs, 99);\n\t\t\t};\n\t\t\tvar mq = window.matchMedia && matchMedia(\"(orientation: landscape)\");\n\t\t\tvar init = function() {\n\t\t\t\tonResize();\n\n\t\t\t\tif (mq && mq.addListener) {\n\t\t\t\t\tmq.addListener(onResize);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdummySrc.srcset = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n\n\t\t\tif (/^[c|i]|d$/.test(document.readyState || \"\")) {\n\t\t\t\tinit();\n\t\t\t} else {\n\t\t\t\tdocument.addEventListener(\"DOMContentLoaded\", init);\n\t\t\t}\n\n\t\t\treturn onResize;\n\t\t})());\n\t}\n}));\n"
  },
  {
    "path": "plugins/twitter/ls.twitter.js",
    "content": "(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes) {\n\t/*\n\t @example\n\t <blockquote class=\"lazyload\" data-twitter=\"twitter-tweet\" data-lang=\"en\"><p lang=\"en\" dir=\"ltr\">Nothing Twitter is doing is working <a href=\"https://t.co/s0FppnacwK\">https://t.co/s0FppnacwK</a> <a href=\"https://t.co/GK9MRfQkYO\">pic.twitter.com/GK9MRfQkYO</a></p>&mdash; The Verge (@verge) <a href=\"https://twitter.com/verge/status/725096763972001794\">April 26, 2016</a></blockquote>\n\n\t <a class=\"lazyload\"\n\t data-twitter=\"twitter-timeline\"\n\t data-widget-id=\"600720083413962752\"\n\t href=\"https://twitter.com/TwitterDev\"\n\t width=\"300\"\n\t height=\"300\">\n\t Tweets by @TwitterDev\n\t </a>\n\t */\n\t'use strict';\n\tvar scriptadded;\n\n\tfunction loadExecuteTwitter(){\n\t\tif(window.twttr && twttr.widgets){\n\t\t\ttwttr.widgets.load();\n\t\t\treturn;\n\t\t}\n\n\t\tif(scriptadded){\n\t\t\treturn;\n\t\t}\n\n\t\tvar elem = document.createElement('script');\n\t\tvar insertElem = document.getElementsByTagName('script')[0];\n\n\t\telem.src = '//platform.twitter.com/widgets.js';\n\n\t\tscriptadded = true;\n\t\tinsertElem.parentNode.insertBefore(elem, insertElem);\n\t}\n\n\tdocument.addEventListener('lazybeforeunveil', function(e){\n\t\tif(e.detail.instance != lazySizes){return;}\n\n\t\tvar twttrWidget = e.target.getAttribute('data-twitter');\n\n\t\tif(twttrWidget){\n\t\t\tlazySizes.aC(e.target, twttrWidget);\n\t\t\tloadExecuteTwitter();\n\t\t}\n\t});\n\n}));\n"
  },
  {
    "path": "plugins/unload/README.md",
    "content": "# lazysizes unload\n\nUnloads ``img.lazyload`` (including ``picture``) elements if they consume a lot of memory and they are out of view. To improve memory consumption as also resize/orientationchange performance.\n\n## Usage\n\nSimply add the lazysizes unload extension to your site.\n\n## Options\n\n* ``lazySizesConfig.unloadClass`` (default: ``\"lazyunload\"``): Elements with this class will be unloaded even if they only consume less memory/pixels than defined in ``unloadPixelThreshold``.\n* ``lazySizesConfig.unloadedClass`` (default: ``\"lazyunloaded\"``): If an element was unloaded it becomes the class ``lazyunloaded``.\n* ``lazySizesConfig.unloadPixelThreshold`` (default: Number is dynamically calculated): If the amount of image pixels exceeds this threshold this image will be unloaded.\n* ``lazySizesConfig.autoUnload`` (default: ``true``): Whether unloading should happen automatically with all lazyload images. If set to false, only elements with the class ``lazyunload`` will be unloaded.\n* ``lazySizesConfig.emptySrc`` (default: transparent data uri): The src to be used as unload image.\n* ``lazySizesConfig.unloadHidden`` (default: ``true``): Whether hidden images (``display: none;``) also should be unloaded.\n\n**Note**: In case you dynamically change the ``data-src``/``data-srcset`` of an already unloaded element, you have to remove the ``lazyunloaded`` class.\n\n## Events\n\n* ``lazyafterunload``: This event will be fired on the unloaded lazyload elements. This event can be used to extend the unload functionality.\n```js\n//div ajax example which returns DOM string:\ndocument.addEventListener('lazybeforeunveil', function (e) {\n    var containerId = e.target.getAttribute('data-id');\n    \n    //load ajax content with containerId\n    //append content to e.target.innerHTML\n});\n\n//clean DOM nodes inside container that where previously loaded by ajax:\n//lazyafterunload gives possibility to take care of the cleanup in this case\ndocument.addEventListener('lazyafterunload', function (e) {\n    var container = e.target;\n    \n    while (container.firstElementChild) {\n        container.removeChild(container.firstElementChild);\n    }\n});\n```\n"
  },
  {
    "path": "plugins/unload/ls.unload.js",
    "content": "(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t'use strict';\n\tif(!document.addEventListener){return;}\n\tvar config, checkElements;\n\n\tvar lazySizesCfg = lazySizes.cfg;\n\tvar unloadElements = [];\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n\tvar unloader = {\n\t\tcheckElements: function(){\n\t\t\tvar i, len, box;\n\n\t\t\tvar expand = (lazySizes._defEx + 99) * 1.1;\n\t\t\tvar vTop = expand * -1;\n\t\t\tvar vLeft = vTop;\n\t\t\tvar vBottom = innerHeight + expand;\n\t\t\tvar vRight = innerWidth + expand;\n\n\t\t\tfor(i = 0, len = checkElements.length; i < len; i++){\n\t\t\t\tbox = checkElements[i].getBoundingClientRect();\n\n\t\t\t\tif((box.top > vBottom || box.bottom < vTop || box.left > vRight || box.right < vLeft) ||\n\t\t\t\t\t(config.unloadHidden && !box.top && !box.bottom && !box.left && !box.right)){\n\t\t\t\t\tunloadElements.push(checkElements[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\trequestAnimationFrame(unloader.unloadElements);\n\t\t},\n\t\tunload: function(element){\n\t\t\tvar sources, isResponsive, i, len;\n\t\t\tvar picture = element.parentNode;\n\t\t\tlazySizes.rC(element, config.loadedClass);\n\n\t\t\tif(element.getAttribute(config.srcsetAttr)){\n\t\t\t\telement.setAttribute('srcset', config.emptySrc);\n\t\t\t\tisResponsive = true;\n\t\t\t}\n\n\t\t\tif(picture && picture.nodeName.toUpperCase() == 'PICTURE'){\n\t\t\t\tsources = picture.getElementsByTagName('source');\n\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tsources[i].setAttribute('srcset', config.emptySrc);\n\t\t\t\t}\n\n\t\t\t\tisResponsive = true;\n\t\t\t}\n\n\t\t\tif(lazySizes.hC(element, config.autosizesClass)){\n\t\t\t\tlazySizes.rC(element, config.autosizesClass);\n\t\t\t\telement.setAttribute(config.sizesAttr, 'auto');\n\t\t\t}\n\n\t\t\tif(isResponsive || element.getAttribute(config.srcAttr)){\n\t\t\t\telement.src = config.emptySrc;\n\t\t\t}\n\n\t\t\tlazySizes.aC(element, config.unloadedClass);\n\t\t\tlazySizes.aC(element, config.lazyClass);\n\t\t\tlazySizes.fire(element, 'lazyafterunload');\n\t\t},\n\t\tunloadElements: function(elements){\n\t\t\telements = Array.isArray(elements) ? elements : unloadElements;\n\n\t\t\twhile(elements.length){\n\t\t\t\tunloader.unload(elements.shift());\n\t\t\t}\n\t\t},\n\t\t_reload: function(e) {\n\t\t\tif(lazySizes.hC(e.target, config.unloadedClass) && e.detail){\n\t\t\t\te.detail.reloaded = true;\n\t\t\t\tlazySizes.rC(e.target, config.unloadedClass);\n\t\t\t}\n\t\t}\n\t};\n\n\tfunction init(){\n\t\tif(!window.lazySizes || checkElements){return;}\n\t\tvar docElem = document.documentElement;\n\t\tvar throttleRun = (function(){\n\t\t\tvar running;\n\t\t\tvar run = function(){\n\t\t\t\tunloader.checkElements();\n\t\t\t\trunning = false;\n\t\t\t};\n\t\t\treturn function(){\n\t\t\t\tif(!running){\n\t\t\t\t\trunning = true;\n\t\t\t\t\tsetTimeout(run, 999);\n\t\t\t\t}\n\t\t\t};\n\t\t})();\n\n\t\tconfig = lazySizes.cfg;\n\t\tremoveEventListener('lazybeforeunveil', init);\n\n\t\tif(!('unloadClass' in config)){\n\t\t\tconfig.unloadClass = 'lazyunload';\n\t\t}\n\n\t\tif(!('unloadedClass' in config)){\n\t\t\tconfig.unloadedClass = 'lazyunloaded';\n\t\t}\n\n\t\tif(!('unloadHidden' in config)){\n\t\t\tconfig.unloadHidden = true;\n\t\t}\n\n\t\tif(!('emptySrc' in config)){\n\t\t\tconfig.emptySrc = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\t\t}\n\n\t\tif(!('autoUnload' in config)){\n\t\t\tconfig.autoUnload = true;\n\t\t}\n\n\t\tif(!('unloadPixelThreshold' in config)){\n\t\t\tconfig.unloadPixelThreshold = 60000;\n\t\t}\n\n\t\tif(config.autoUnload){\n\t\t\tdocElem.addEventListener('load',  function(e){\n\t\t\t\tif(e.target.naturalWidth * e.target.naturalHeight > config.unloadPixelThreshold && e.target.className &&\n\t\t\t\t\te.target.className.indexOf && e.target.className.indexOf(lazySizesCfg.loadingClass) != -1 &&\n\t\t\t\t\te.target.className.indexOf(lazySizesCfg.preloadClass) == -1){\n\t\t\t\t\tlazySizes.aC(e.target, lazySizesCfg.unloadClass);\n\t\t\t\t}\n\t\t\t}, true);\n\t\t}\n\n\t\tlazySizes.unloader = unloader;\n\n\t\tcheckElements = document.getElementsByClassName([config.unloadClass, config.loadedClass].join(' '));\n\n\t\tsetInterval(throttleRun, 9999);\n\t\taddEventListener('lazybeforeunveil', throttleRun);\n\t\taddEventListener('lazybeforeunveil', unloader._reload, true);\n\t}\n\n\taddEventListener('lazybeforeunveil', init);\n}));\n"
  },
  {
    "path": "plugins/unveilhooks/README.md",
    "content": "# lazysizes unveilhooks extension\n\nThe unveilhooks plugin extends lazySizes to also unveil / lazyload scripts/widgets, background images, styles and video/audio elements:\n\n```html\n<!-- Background image example: -->\n<div class=\"lazyload\" data-bg=\"bg-img.jpg\">\n\t<!-- content -->\n</div>\n\n<!-- Scripts/Widgets example: -->\n<div class=\"lazyload\" data-script=\"module-name.js\">\n\n</div>\n\n<!-- Styles -->\n<div class=\"lazyload\" data-link=\"my-style.css\">\n\n</div>\n\n<!-- Video example: -->\n<video class=\"lazyload\" data-poster=\"poster.jpg\" preload=\"none\">\n \t<!-- sources -->\n</video>\n\n<!-- require.js * example -->\n<div class=\"lazyload\" data-require=\"module-name\"></div>\n\n\n<!-- Styles & script combined -->\n<div class=\"lazyload\" data-script=\"my-script.js\" data-link=\"my-style.css\">\n\n</div>\n```\n\nNote: In case you want to lazyload a background image via a ``class`` you can do so by using the ``addClasses`` option:\n\n```html\n<style>\n\t.bg-stage.lazyloaded {\n\t\tbackground-image: url(lazyloaded-bg.jpg);\n\t}\n</style>\n\n<div class=\"bg-stage lazyload\">\n\t<!-- content -->\n</div>\n```\n\nFor support responsive background images see the [bgset extension](../bgset).\n\nFor more complex loading of styles and AMD modules please see the [include extension](../include).\n\nNote: To support the require example you need to the requireJs option:\n\n```js\nwindow.lazySizesConfig = window.lazySizesConfig || {};\nwindow.lazySizesConfig.requireJs = function(modules, cb){\n\twindow.require(modules, cb);\n};\n```\n \n\n"
  },
  {
    "path": "plugins/unveilhooks/ls.unveilhooks.js",
    "content": "/*\nThis plugin extends lazySizes to lazyLoad:\nbackground images, videos/posters and scripts\n\nBackground-Image:\nFor background images, use data-bg attribute:\n<div class=\"lazyload\" data-bg=\"bg-img.jpg\"></div>\n\n Video:\n For video/audio use data-poster and preload=\"none\":\n <video class=\"lazyload\" preload=\"none\" data-poster=\"poster.jpg\" src=\"src.mp4\">\n <!-- sources -->\n </video>\n\n For video that plays automatically if in view:\n <video\n\tclass=\"lazyload\"\n\tpreload=\"none\"\n\tmuted=\"\"\n\tdata-autoplay=\"\"\n\tdata-poster=\"poster.jpg\"\n\tsrc=\"src.mp4\">\n</video>\n\n Scripts:\n For scripts use data-script:\n <div class=\"lazyload\" data-script=\"module-name.js\"></div>\n\n\n Script modules using require:\n For modules using require use data-require:\n <div class=\"lazyload\" data-require=\"module-name\"></div>\n*/\n\n(function(window, factory) {\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(window, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\tvar bgLoad, regBgUrlEscape;\n\tvar uniqueUrls = {};\n\n\tif(document.addEventListener){\n\t\tregBgUrlEscape = /\\(|\\)|\\s|'/;\n\n\t\tbgLoad = function (url, cb){\n\t\t\tvar img = document.createElement('img');\n\t\t\timg.onload = function(){\n\t\t\t\timg.onload = null;\n\t\t\t\timg.onerror = null;\n\t\t\t\timg = null;\n\t\t\t\tcb();\n\t\t\t};\n\t\t\timg.onerror = img.onload;\n\n\t\t\timg.src = url;\n\n\t\t\tif(img && img.complete && img.onload){\n\t\t\t\timg.onload();\n\t\t\t}\n\t\t};\n\n\t\taddEventListener('lazybeforeunveil', function(e){\n\t\t\tif(e.detail.instance != lazySizes){return;}\n\n\t\t\tvar tmp, load, bg, poster;\n\t\t\tif(!e.defaultPrevented) {\n\n\t\t\t\tvar target = e.target;\n\n\t\t\t\tif(target.preload == 'none'){\n\t\t\t\t\ttarget.preload = target.getAttribute('data-preload') || 'auto';\n\t\t\t\t}\n\n\t\t\t\tif (target.getAttribute('data-autoplay') != null) {\n\t\t\t\t\tif (target.getAttribute('data-expand') && !target.autoplay) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\ttarget.play();\n\t\t\t\t\t\t} catch (er) {}\n\t\t\t\t\t} else {\n\t\t\t\t\t\trequestAnimationFrame(function () {\n\t\t\t\t\t\t\ttarget.setAttribute('data-expand', '-10');\n\t\t\t\t\t\t\tlazySizes.aC(target, lazySizes.cfg.lazyClass);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttmp = target.getAttribute('data-link');\n\t\t\t\tif(tmp){\n\t\t\t\t\taddStyleScript(tmp, true);\n\t\t\t\t}\n\n\t\t\t\t// handle data-script\n\t\t\t\ttmp = target.getAttribute('data-script');\n\t\t\t\tif(tmp){\n\t\t\t\t\te.detail.firesLoad = true;\n\t\t\t\t\tload = function(){\n\t\t\t\t\t\te.detail.firesLoad = false;\n\t\t\t\t\t\tlazySizes.fire(target, '_lazyloaded', {}, true, true);\n\t\t\t\t\t};\n\t\t\t\t\taddStyleScript(tmp, null, load);\n\t\t\t\t}\n\n\t\t\t\t// handle data-require\n\t\t\t\ttmp = target.getAttribute('data-require');\n\t\t\t\tif(tmp){\n\t\t\t\t\tif(lazySizes.cfg.requireJs){\n\t\t\t\t\t\tlazySizes.cfg.requireJs([tmp]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\taddStyleScript(tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// handle data-bg\n\t\t\t\tbg = target.getAttribute('data-bg');\n\t\t\t\tif (bg) {\n\t\t\t\t\te.detail.firesLoad = true;\n\t\t\t\t\tload = function(){\n\t\t\t\t\t\ttarget.style.backgroundImage = 'url(' + (regBgUrlEscape.test(bg) ? JSON.stringify(bg) : bg ) + ')';\n\t\t\t\t\t\te.detail.firesLoad = false;\n\t\t\t\t\t\tlazySizes.fire(target, '_lazyloaded', {}, true, true);\n\t\t\t\t\t};\n\n\t\t\t\t\tbgLoad(bg, load);\n\t\t\t\t}\n\n\t\t\t\t// handle data-poster\n\t\t\t\tposter = target.getAttribute('data-poster');\n\t\t\t\tif(poster){\n\t\t\t\t\te.detail.firesLoad = true;\n\t\t\t\t\tload = function(){\n\t\t\t\t\t\ttarget.poster = poster;\n\t\t\t\t\t\te.detail.firesLoad = false;\n\t\t\t\t\t\tlazySizes.fire(target, '_lazyloaded', {}, true, true);\n\t\t\t\t\t};\n\n\t\t\t\t\tbgLoad(poster, load);\n\n\t\t\t\t}\n\t\t\t}\n\t\t}, false);\n\n\t}\n\n\tfunction addStyleScript(src, style, cb){\n\t\tif(uniqueUrls[src]){\n\t\t\treturn;\n\t\t}\n\t\tvar elem = document.createElement(style ? 'link' : 'script');\n\t\tvar insertElem = document.getElementsByTagName('script')[0];\n\n\t\tif(style){\n\t\t\telem.rel = 'stylesheet';\n\t\t\telem.href = src;\n\t\t} else {\n\t\t\telem.onload = function(){\n\t\t\t\telem.onerror = null;\n\t\t\t\telem.onload = null;\n\t\t\t\tcb();\n\t\t\t};\n\t\t\telem.onerror = elem.onload;\n\n\t\t\telem.src = src;\n\t\t}\n\t\tuniqueUrls[src] = true;\n\t\tuniqueUrls[elem.src || elem.href] = true;\n\t\tinsertElem.parentNode.insertBefore(elem, insertElem);\n\t}\n}));\n"
  },
  {
    "path": "plugins/video-embed/README.md",
    "content": "TBD\n\n```html\n<div class=\"ratio-16-9 lazyload\" data-youtube=\"M7lc1UVf-VE\" data-ytparams=\"\">\n\t<button class=\"play-btn\">play</button>\n</div>\n\n<div class=\"ratio-16-9 lazyload\" data-vimeo=\"76979871\" data-vimeoparams=\"loop=1\">\n\t<button class=\"play-btn\">play</button>\n</div>\n```\n"
  },
  {
    "path": "plugins/video-embed/ls.video-embed.js",
    "content": "(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes) {\n\t/*jshint eqnull:true */\n\t'use strict';\n\tif(!document.getElementsByClassName){return;}\n\tvar protocol = location.protocol == 'https:' ?\n\t\t'https:' :\n\t\t'http:'\n\t;\n\tvar idIndex = Date.now();\n\tvar regId = /\\{\\{id}}/;\n\tvar regYtImg = /\\{\\{hqdefault}}/;\n\tvar regAmp = /^&/;\n\tvar regValidParam = /^[a-z0-9-_&=]+$/i;\n\tvar youtubeImg = protocol + '//img.youtube.com/vi/{{id}}/{{hqdefault}}.jpg';\n\tvar youtubeIframe = protocol + '//www.youtube.com/embed/{{id}}?autoplay=1';\n\tvar vimeoApi = protocol + '//vimeo.com/api/oembed.json?url=https%3A//vimeo.com/{{id}}';\n\tvar vimeoIframe = protocol + '//player.vimeo.com/video/{{id}}?autoplay=1';\n\n\tfunction getJSON(url, callback){\n\t\tvar id = 'vimeoCallback' + idIndex;\n\t\tvar script = document.createElement('script');\n\t\turl += '&callback='+id;\n\n\t\tidIndex++;\n\n\t\twindow[id] = function(data){\n\t\t\tscript.parentNode.removeChild(script);\n\t\t\tdelete window[id];\n\t\t\tcallback(data);\n\t\t};\n\n\t\tscript.src = url;\n\n\t\tdocument.head.appendChild(script);\n\t}\n\n\tfunction embedVimeoImg(id, elem){\n\t\tgetJSON(vimeoApi.replace(regId, id), function(data){\n\t\t\tif(data && data.thumbnail_url){\n\t\t\t\telem.style.backgroundImage = 'url('+ data.thumbnail_url +')';\n\t\t\t}\n\t\t});\n\t\telem.addEventListener('click', embedVimeoIframe);\n\t}\n\n\tfunction embedVimeoIframe(e){\n\t\tvar elem = e.currentTarget;\n\t\tvar id = elem.getAttribute('data-vimeo');\n\t\tvar vimeoParams = elem.getAttribute('data-vimeoparams') || '';\n\n\t\telem.removeEventListener('click', embedVimeoIframe);\n\n\t\tif (!id || !regValidParam.test(id) || (vimeoParams && !regValidParam.test(vimeoParams))) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(vimeoParams && !regAmp.test(vimeoParams)){\n\t\t\tvimeoParams = '&'+ vimeoParams;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\telem.innerHTML = '<iframe src=\"' + (vimeoIframe.replace(regId, id)) + vimeoParams +'\" ' +\n\t\t\t'frameborder=\"0\" allowfullscreen=\"\" width=\"640\" height=\"390\"></iframe>'\n\t\t;\n\n\t}\n\n\tfunction embedYoutubeImg(id, elem){\n\t\tvar ytImg = elem.getAttribute('data-thumb-size') || lazySizes.cfg.ytThumb || 'hqdefault';\n\n\t\telem.style.backgroundImage = 'url('+ youtubeImg.replace(regId, id).replace(regYtImg, ytImg) +')';\n\t\telem.addEventListener('click', embedYoutubeIframe);\n\t}\n\n\tfunction embedYoutubeIframe(e){\n\t\tvar elem = e.currentTarget;\n\t\tvar id = elem.getAttribute('data-youtube');\n\t\tvar youtubeParams = elem.getAttribute('data-ytparams') || '';\n\n\t\telem.removeEventListener('click', embedYoutubeIframe);\n\n\t\tif (!id || !regValidParam.test(id) || (youtubeParams && !regValidParam.test(youtubeParams))) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(youtubeParams && !regAmp.test(youtubeParams)){\n\t\t\tyoutubeParams = '&'+ youtubeParams;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\telem.innerHTML = '<iframe src=\"' + (youtubeIframe.replace(regId, id)) + youtubeParams +'\" ' +\n\t\t\t'frameborder=\"0\" allowfullscreen=\"\" width=\"640\" height=\"390\"></iframe>'\n\t\t;\n\t}\n\n\tdocument.addEventListener('lazybeforeunveil', function(e){\n\t\tif(e.detail.instance != lazySizes){return;}\n\n\t\tvar elem = e.target;\n\t\tvar youtube = elem.getAttribute('data-youtube');\n\t\tvar vimeo = elem.getAttribute('data-vimeo');\n\n\t\tif(youtube && elem){\n\t\t\tembedYoutubeImg(youtube, elem);\n\t\t}\n\t\tif(vimeo && elem){\n\t\t\tembedVimeoImg(vimeo, elem);\n\t\t}\n\t});\n}));\n"
  },
  {
    "path": "rias/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n\t<meta charset=\"UTF-8\">\n\t<title>lazysizes - the restful responsive image service extension/plugin </title>\n\n\t<link href=\"../assets/css/tidy.css\" rel=\"stylesheet\" />\n\t<style>\n\t\t.thumbnail img {\n\t\t\twidth: 100%;\n\t\t\theight: auto;\n\t\t}\n\t\t.intrinsic {\n\t\t\tposition: relative;\n\t\t\tpadding-bottom: 66.6%;\n\t\t\theight: 0;\n\t\t}\n\n\t\t.intrinsic-square {\n\t\t\tpadding-bottom: 100%;\n\t\t}\n\t\t.intrinsic img,\n\t\t.intrinsic iframe,\n\t\t.intrinsic .lazyload {\n\t\t\tposition:absolute;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tleft: 0;\n\t\t\ttop: 0;\n\t\t\tborder: none;\n\t\t\toverflow: hidden;\n\t\t}\n\t\tpre {\n\t\t\t-moz-tab-size: 2;\n\t\t\ttab-size: 2;\n\t\t}\n\n\t\t.tall img {\n\t\t\t--ls-aspectratio: 0.5;\n\t\t}\n\t\t.wide img {\n\t\t\t--ls-aspectratio: 2;\n\t\t}\n\t</style>\n\n\t<script>\n\n\t\twindow.lazySizesConfig = window.lazySizesConfig || {};\n\t\twindow.lazySizesConfig.rias = window.lazySizesConfig.rias || {};\n\t\twindow.lazySizesConfig.loadMode = 1;\n\t\twindow.lazySizesConfig.preloadAfterLoad = true;\n\t</script>\n\t<script src=\"../lazysizes.min.js\"></script>\n\t<script src=\"../plugins/optimumx/ls.optimumx.min.js\"></script>\n\n\t<script src=\"../plugins/rias/ls.rias.min.js\"></script>\n</head>\n<body>\n\n<div class=\"container\">\n\n\n\t<div class=\"jumbotron\">\n\t\t<h1>lazySizes - <abbr title=\"Responsive Image as Service\">RIaS</abbr> plugin</h1>\n\t\t<p>The <strong>Responsive Image as Service</strong> plugin enables lazySizes to generate the best suitable image source based on an URL pattern. It works with pre-build images (i.e. grunt-responsive-images) as also with any third party or self hosted REST like image API / image on demand service.</p>\n\t\t<p>For a short but <a href=\"https://github.com/aFarkas/lazysizes/blob/gh-pages/plugins/rias/\">full API description go to the readme.md</a>.</p>\n\t</div>\n\n\t<div id=\"examples\">\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic intrinsic-square\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t src=\"http://placehold.it/100\"\n\t\t\t\t\t\t\t data-src=\"http://placehold.it/{width}\"\n\t\t\t\t\t\t\t data-sizes=\"auto\"\n\t\t\t\t\t\t\t class=\"lazyload\"\n\t\t\t\t\t\t\t alt=\"\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t<h3>Basic RIaS implementation</h3>\n\t\t\t\t<p>Include the ls.rias plugin right after your lazysizes script, add the <code>lazyload</code> class as usual and the <code>data-sizes=\"auto\"</code> attribute.</p>\n\t\t\t\t<p>Inside of your <code>data-src</code> value include the <code>{width}</code> placeholder </p>\n<pre>\n&lt;script src=\"../lazysizes.js\"&gt;&lt;/script&gt;\n&lt;script src=\"../plugins/rias/ls.rias.js\"&gt;&lt;/script&gt;\n\n&lt;img\n\tsrc=\"http://placehold.it/100\"\n\tdata-src=\"http://placehold.it/{width}\"\n\tdata-sizes=\"auto\"\n\tclass=\"lazyload\"\n\talt=\"\" /&gt;\n</pre>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"tall\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t src=\"http://placehold.it/100x100\"\n\t\t\t\t\t\t\t data-src=\"http://placehold.it/{width}x{height}\"\n\t\t\t\t\t\t\t data-sizes=\"auto\"\n\t\t\t\t\t\t\t class=\"lazyload\"\n\t\t\t\t\t\t\t alt=\"\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"wide\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t src=\"http://placehold.it/200x100\"\n\t\t\t\t\t\t\t data-src=\"http://placehold.it/{width}x{height}\"\n\t\t\t\t\t\t\t data-sizes=\"auto\"\n\t\t\t\t\t\t\t class=\"lazyload\"\n\t\t\t\t\t\t\t alt=\"\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t<h3>Aspect ratio</h3>\n\t\t\t\t<p>In addition, you can set the ascpect ratio of the image from CSS. You only need to set the custom CSS variable <code>--ls-aspectratio</code> on the <code>img</code> and add a <code>{height}</code> placeholder </p>\n<pre>\n&lt;style&gt;\n\t\timg.rectangle {\n\t\t\t--ls-aspectratio: 2;\n\t\t}\n&lt;style/&gt;\n\n&lt;img\n\tsrc=\"http://placehold.it/200x100\"\n\tdata-src=\"http://placehold.it/{width}x{height}\"\n\tdata-sizes=\"auto\"\n\tclass=\"lazyload rectangle\"\n\talt=\"\" /&gt;\n</pre>\n\t\t\t    <p>Note that you can also set the aspect ratio via a <code>data-aspectratio</code> value on the <code>img</code> tag.</p>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t<h3><abbr title=\"Responsive Image as Service\">RIaS</abbr> and Art direction using the <code>picture</code> element</h3>\n\t\t\t\t<p>A responsive image service can be also combined with the art direction approach using the HTML5 <code>picture</code> element:</p>\n<pre>&lt;picture>\n&lt;!--[if IE 9]>&lt;audio&gt;&lt;![endif]--&gt;\n&lt;source\n\t\tdata-src=\"http://placehold.it/{width}/1111ee/fff\"\n\t\tmedia=\"(max-width: 500px)\" /&gt;\n\t&lt;source\n\t\t\tdata-src=\"http://placehold.it/{width}/e8117f/fff\"\n\t\t\tmedia=\"(max-width: 1090px)\" /&gt;\n\t&lt;source\n\t\t\tdata-src=\"http://placehold.it/{width}/7D26CD/fff\"\n\t\t\tmedia=\"(min-width: 1224px)\" /&gt;\n\n&lt;!--[if IE 9]&gt;&lt;/audio&gt;&lt;![endif]--&gt;\n&lt;img\n\t\tsrc=\"http://placehold.it/100\"\n\t\tdata-src=\"http://placehold.it/{width}\"\n\t\tdata-sizes=\"auto\"\n\t\tclass=\"lazyload\"\n\t\talt=\"\" /&gt;\n&lt;/picture&gt;\n</pre>\n\t\t\t</div>\n\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic intrinsic-square\">\n\t\t\t\t\t\t<picture>\n\t\t\t\t\t\t\t<!--[if IE 9]><audio><![endif]-->\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-src=\"http://placehold.it/{width}/1111ee/fff\"\n\t\t\t\t\t\t\t\t\tmedia=\"(max-width: 500px)\" />\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-src=\"http://placehold.it/{width}/e8117f/fff\"\n\t\t\t\t\t\t\t\t\tmedia=\"(max-width: 1090px)\" />\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-src=\"http://placehold.it/{width}/7D26CD/fff\"\n\t\t\t\t\t\t\t\t\tmedia=\"(min-width: 1224px)\" />\n\n\t\t\t\t\t\t\t<!--[if IE 9]></audio><![endif]-->\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc=\"http://placehold.it/100\"\n\t\t\t\t\t\t\t\tdata-src=\"http://placehold.it/{width}\"\n\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</picture>\n\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div class=\"intrinsic\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc=\"http://app.resrc.it/S=W300M/O=20,B/http://www.your-site.co/image.jpg\"\n\t\t\t\t\t\t\t\tdata-src=\"http://app.resrc.it/S=W{width}M/O={quality},B/http://www.your-site.co/image.jpg\"\n\t\t\t\t\t\t\t\tdata-optimumx=\"1.3\"\n\t\t\t\t\t\t\t\tdata-quality=\"75\"\n\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t<h3><code>optimumx</code></h3>\n\t\t\t\t<p>All options can be controlled globally through the <code>lazySizesConfig.rias</code> object or by using <code>data-*</code> attributes.</p>\n\t\t\t\t<p>The rias extension can also be combined with the <a href=\"https://github.com/aFarkas/lazysizes/blob/gh-pages/plugins/optimumx/\"><code>optimumx</code> extension</a>. The optimumx feature helps you to constrain the maximum pixel density for an image.</p>\n<pre>&lt;img\n\tdata-src=\"image?width={width}&amp;amp;quality={quality}\"\n\tdata-quality=\"75\"\n\tdata-optimumx=\"1.5\"\n\tclass=\"lazyload\"\n\talt=\"\" /&gt;\n</pre>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<picture>\n\t\t\t\t\t\t\t<!--[if IE 9]><audio><![endif]-->\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-src=\"http://app.resrc.it/C=W1050,H900/S=W{width}/http://www.your-site.co/image.jpg\"\n\t\t\t\t\t\t\t\t\tmedia=\"(max-width: 800px)\" />\n\t\t\t\t\t\t\t<source\n\t\t\t\t\t\t\t\t\tdata-src=\"http://app.resrc.it/C=W1350,H1100,X100,Y100/S=W{width}/http://www.your-site.co/image.jpg\"\n\t\t\t\t\t\t\t\t\tmedia=\"(max-width: 1200px)\" />\n\t\t\t\t\t\t\t<!--[if IE 9]></audio><![endif]-->\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tsrc=\"http://app.resrc.it/S=W100/http://www.your-site.co/image.jpg\"\n\t\t\t\t\t\t\t\t\tdata-src=\"http://app.resrc.it/S=W{width}/http://www.your-site.co/image.jpg\"\n\t\t\t\t\t\t\t\t\tdata-sizes=\"auto\"\n\t\t\t\t\t\t\t\t\tclass=\"lazyload\"\n\t\t\t\t\t\t\t\t\talt=\"\" />\n\t\t\t\t\t\t</picture>\n\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"caption\">\n\t\t\t\t\t\t<h3><abbr title=\"Responsive Image as Service\">RIaS</abbr> and Art direction using the <code>picture</code> element</h3>\n\t\t\t\t\t\t<p>A responsive image service can be also combined with the art direction approach using the HTML5 <code>picture</code> element.</p>\n\t\t\t\t\t\t<p>In this case, we simply use the cropping service</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t</div>\n\t\t</div>\n\n\t</div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "src/common.wrapper",
    "content": "(function(window, factory) {\n\tvar lazySizes = factory(window, window.document, Date);\n\twindow.lazySizes = lazySizes;\n\tif(typeof module == 'object' && module.exports){\n\t\tmodule.exports = lazySizes;\n\t}\n}(typeof window != 'undefined' ?\n      window : {}, {{ls}}));\n"
  },
  {
    "path": "src/lazysizes-core.js",
    "content": "\n/**\n * @typedef { import(\"./types/global\").LazySizesConfigPartial } LazySizesConfigPartial\n */\nfunction l(window, document, Date) { // Pass in the window Date function also for SSR because the Date class can be lost\n\t'use strict';\n\t/*jshint eqnull:true */\n\n\tvar lazysizes,\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tlazySizesCfg;\n\n\t(function(){\n\t\tvar prop;\n\n\t\tvar lazySizesDefaults = {\n\t\t\tlazyClass: 'lazyload',\n\t\t\tloadedClass: 'lazyloaded',\n\t\t\tloadingClass: 'lazyloading',\n\t\t\tpreloadClass: 'lazypreload',\n\t\t\terrorClass: 'lazyerror',\n\t\t\t//strictClass: 'lazystrict',\n\t\t\tautosizesClass: 'lazyautosizes',\n\t\t\tfastLoadedClass: 'ls-is-cached',\n\t\t\tiframeLoadMode: 0,\n\t\t\tsrcAttr: 'data-src',\n\t\t\tsrcsetAttr: 'data-srcset',\n\t\t\tsizesAttr: 'data-sizes',\n\t\t\t//preloadAfterLoad: false,\n\t\t\tminSize: 40,\n\t\t\tcustomMedia: {},\n\t\t\tinit: true,\n\t\t\texpFactor: 1.5,\n\t\t\thFac: 0.8,\n\t\t\tloadMode: 2,\n\t\t\tloadHidden: true,\n\t\t\tricTimeout: 0,\n\t\t\tthrottleDelay: 125,\n\t\t};\n\n\t\tlazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {};\n\n\t\tfor(prop in lazySizesDefaults){\n\t\t\tif(!(prop in lazySizesCfg)){\n\t\t\t\tlazySizesCfg[prop] = lazySizesDefaults[prop];\n\t\t\t}\n\t\t}\n\t})();\n\n\tif (!document || !document.getElementsByClassName) {\n\t\treturn {\n\t\t\tinit: function () {},\n\t\t\t/**\n\t\t\t * @type { LazySizesConfigPartial }\n\t\t\t */\n\t\t\tcfg: lazySizesCfg,\n\t\t\t/**\n\t\t\t * @type { true }\n\t\t\t */\n\t\t\tnoSupport: true,\n\t\t};\n\t}\n\n\tvar docElem = document.documentElement;\n\n\tvar supportPicture = window.HTMLPictureElement;\n\n\tvar _addEventListener = 'addEventListener';\n\n\tvar _getAttribute = 'getAttribute';\n\n\t/**\n\t * Update to bind to window because 'this' becomes null during SSR\n\t * builds.\n\t */\n\tvar addEventListener = window[_addEventListener].bind(window);\n\n\tvar setTimeout = window.setTimeout;\n\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n\n\tvar requestIdleCallback = window.requestIdleCallback;\n\n\tvar regPicture = /^picture$/i;\n\n\tvar loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];\n\n\tvar regClassCache = {};\n\n\tvar forEach = Array.prototype.forEach;\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar hasClass = function(ele, cls) {\n\t\tif(!regClassCache[cls]){\n\t\t\tregClassCache[cls] = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n\t\t}\n\t\treturn regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar addClass = function(ele, cls) {\n\t\tif (!hasClass(ele, cls)){\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);\n\t\t}\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar removeClass = function(ele, cls) {\n\t\tvar reg;\n\t\tif ((reg = hasClass(ele,cls))) {\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));\n\t\t}\n\t};\n\n\tvar addRemoveLoadEvents = function(dom, fn, add){\n\t\tvar action = add ? _addEventListener : 'removeEventListener';\n\t\tif(add){\n\t\t\taddRemoveLoadEvents(dom, fn);\n\t\t}\n\t\tloadEvents.forEach(function(evt){\n\t\t\tdom[action](evt, fn);\n\t\t});\n\t};\n\n\t/**\n\t * @param elem { Element }\n\t * @param name { string }\n\t * @param detail { any }\n\t * @param noBubbles { boolean }\n\t * @param noCancelable { boolean }\n\t * @returns { CustomEvent }\n\t */\n\tvar triggerEvent = function(elem, name, detail, noBubbles, noCancelable){\n\t\tvar event = document.createEvent('Event');\n\n\t\tif(!detail){\n\t\t\tdetail = {};\n\t\t}\n\n\t\tdetail.instance = lazysizes;\n\n\t\tevent.initEvent(name, !noBubbles, !noCancelable);\n\n\t\tevent.detail = detail;\n\n\t\telem.dispatchEvent(event);\n\t\treturn event;\n\t};\n\n\tvar updatePolyfill = function (el, full){\n\t\tvar polyfill;\n\t\tif( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){\n\t\t\tif(full && full.src && !el[_getAttribute]('srcset')){\n\t\t\t\tel.setAttribute('srcset', full.src);\n\t\t\t}\n\t\t\tpolyfill({reevaluate: true, elements: [el]});\n\t\t} else if(full && full.src){\n\t\t\tel.src = full.src;\n\t\t}\n\t};\n\n\tvar getCSS = function (elem, style){\n\t\treturn (getComputedStyle(elem, null) || {})[style];\n\t};\n\n\t/**\n\t *\n\t * @param elem { Element }\n\t * @param parent { Element }\n\t * @param [width] {number}\n\t * @returns {number}\n\t */\n\tvar getWidth = function(elem, parent, width){\n\t\twidth = width || elem.offsetWidth;\n\n\t\twhile(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){\n\t\t\twidth =  parent.offsetWidth;\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\treturn width;\n\t};\n\n\tvar rAF = (function(){\n\t\tvar running, waiting;\n\t\tvar firstFns = [];\n\t\tvar secondFns = [];\n\t\tvar fns = firstFns;\n\n\t\tvar run = function(){\n\t\t\tvar runFns = fns;\n\n\t\t\tfns = firstFns.length ? secondFns : firstFns;\n\n\t\t\trunning = true;\n\t\t\twaiting = false;\n\n\t\t\twhile(runFns.length){\n\t\t\t\trunFns.shift()();\n\t\t\t}\n\n\t\t\trunning = false;\n\t\t};\n\n\t\tvar rafBatch = function(fn, queue){\n\t\t\tif(running && !queue){\n\t\t\t\tfn.apply(this, arguments);\n\t\t\t} else {\n\t\t\t\tfns.push(fn);\n\n\t\t\t\tif(!waiting){\n\t\t\t\t\twaiting = true;\n\t\t\t\t\t(document.hidden ? setTimeout : requestAnimationFrame)(run);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\trafBatch._lsFlush = run;\n\n\t\treturn rafBatch;\n\t})();\n\n\tvar rAFIt = function(fn, simple){\n\t\treturn simple ?\n\t\t\tfunction() {\n\t\t\t\trAF(fn);\n\t\t\t} :\n\t\t\tfunction(){\n\t\t\t\tvar that = this;\n\t\t\t\tvar args = arguments;\n\t\t\t\trAF(function(){\n\t\t\t\t\tfn.apply(that, args);\n\t\t\t\t});\n\t\t\t}\n\t\t;\n\t};\n\n\tvar throttle = function(fn){\n\t\tvar running;\n\t\tvar lastTime = 0;\n\t\tvar gDelay = lazySizesCfg.throttleDelay;\n\t\tvar rICTimeout = lazySizesCfg.ricTimeout;\n\t\tvar run = function(){\n\t\t\trunning = false;\n\t\t\tlastTime = Date.now();\n\t\t\tfn();\n\t\t};\n\t\tvar idleCallback = requestIdleCallback && rICTimeout > 49 ?\n\t\t\tfunction(){\n\t\t\t\trequestIdleCallback(run, {timeout: rICTimeout});\n\n\t\t\t\tif(rICTimeout !== lazySizesCfg.ricTimeout){\n\t\t\t\t\trICTimeout = lazySizesCfg.ricTimeout;\n\t\t\t\t}\n\t\t\t} :\n\t\t\trAFIt(function(){\n\t\t\t\tsetTimeout(run);\n\t\t\t}, true)\n\t\t;\n\n\t\treturn function(isPriority){\n\t\t\tvar delay;\n\n\t\t\tif((isPriority = isPriority === true)){\n\t\t\t\trICTimeout = 33;\n\t\t\t}\n\n\t\t\tif(running){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trunning =  true;\n\n\t\t\tdelay = gDelay - (Date.now() - lastTime);\n\n\t\t\tif(delay < 0){\n\t\t\t\tdelay = 0;\n\t\t\t}\n\n\t\t\tif(isPriority || delay < 9){\n\t\t\t\tidleCallback();\n\t\t\t} else {\n\t\t\t\tsetTimeout(idleCallback, delay);\n\t\t\t}\n\t\t};\n\t};\n\n\t//based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html\n\tvar debounce = function(func) {\n\t\tvar timeout, timestamp;\n\t\tvar wait = 99;\n\t\tvar run = function(){\n\t\t\ttimeout = null;\n\t\t\tfunc();\n\t\t};\n\t\tvar later = function() {\n\t\t\tvar last = Date.now() - timestamp;\n\n\t\t\tif (last < wait) {\n\t\t\t\tsetTimeout(later, wait - last);\n\t\t\t} else {\n\t\t\t\t(requestIdleCallback || run)(run);\n\t\t\t}\n\t\t};\n\n\t\treturn function() {\n\t\t\ttimestamp = Date.now();\n\n\t\t\tif (!timeout) {\n\t\t\t\ttimeout = setTimeout(later, wait);\n\t\t\t}\n\t\t};\n\t};\n\n\tvar loader = (function(){\n\t\tvar preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;\n\n\t\tvar eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;\n\n\t\tvar regImg = /^img$/i;\n\t\tvar regIframe = /^iframe$/i;\n\n\t\tvar supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent));\n\n\t\tvar shrinkExpand = 0;\n\t\tvar currentExpand = 0;\n\n\t\tvar isLoading = 0;\n\t\tvar lowRuns = -1;\n\n\t\tvar resetPreloading = function(e){\n\t\t\tisLoading--;\n\t\t\tif(!e || isLoading < 0 || !e.target){\n\t\t\t\tisLoading = 0;\n\t\t\t}\n\t\t};\n\n\t\tvar isVisible = function (elem) {\n\t\t\tif (isBodyHidden == null) {\n\t\t\t\tisBodyHidden = getCSS(document.body, 'visibility') == 'hidden';\n\t\t\t}\n\n\t\t\treturn isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden');\n\t\t};\n\n\t\tvar isNestedVisible = function(elem, elemExpand){\n\t\t\tvar outerRect;\n\t\t\tvar parent = elem;\n\t\t\tvar visible = isVisible(elem);\n\n\t\t\teLtop -= elemExpand;\n\t\t\teLbottom += elemExpand;\n\t\t\teLleft -= elemExpand;\n\t\t\teLright += elemExpand;\n\n\t\t\twhile(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){\n\t\t\t\tvisible = ((getCSS(parent, 'opacity') || 1) > 0);\n\n\t\t\t\tif(visible && getCSS(parent, 'overflow') != 'visible'){\n\t\t\t\t\touterRect = parent.getBoundingClientRect();\n\t\t\t\t\tvisible = eLright > outerRect.left &&\n\t\t\t\t\t\teLleft < outerRect.right &&\n\t\t\t\t\t\teLbottom > outerRect.top - 1 &&\n\t\t\t\t\t\teLtop < outerRect.bottom + 1\n\t\t\t\t\t;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn visible;\n\t\t};\n\n\t\tvar checkElements = function() {\n\t\t\tvar eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal,\n\t\t\t\tbeforeExpandVal, defaultExpand, preloadExpand, hFac;\n\t\t\tvar lazyloadElems = lazysizes.elements;\n\n\t\t\tif((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){\n\n\t\t\t\ti = 0;\n\n\t\t\t\tlowRuns++;\n\n\t\t\t\tfor(; i < eLlen; i++){\n\n\t\t\t\t\tif(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}\n\n\t\t\t\t\tif(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;}\n\n\t\t\t\t\tif(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){\n\t\t\t\t\t\telemExpand = currentExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!defaultExpand) {\n\t\t\t\t\t\tdefaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ?\n\t\t\t\t\t\t\tdocElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 :\n\t\t\t\t\t\t\tlazySizesCfg.expand;\n\n\t\t\t\t\t\tlazysizes._defEx = defaultExpand;\n\n\t\t\t\t\t\tpreloadExpand = defaultExpand * lazySizesCfg.expFactor;\n\t\t\t\t\t\thFac = lazySizesCfg.hFac;\n\t\t\t\t\t\tisBodyHidden = null;\n\n\t\t\t\t\t\tif(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){\n\t\t\t\t\t\t\tcurrentExpand = preloadExpand;\n\t\t\t\t\t\t\tlowRuns = 0;\n\t\t\t\t\t\t} else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){\n\t\t\t\t\t\t\tcurrentExpand = defaultExpand;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentExpand = shrinkExpand;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(beforeExpandVal !== elemExpand){\n\t\t\t\t\t\teLvW = innerWidth + (elemExpand * hFac);\n\t\t\t\t\t\telvH = innerHeight + elemExpand;\n\t\t\t\t\t\telemNegativeExpand = elemExpand * -1;\n\t\t\t\t\t\tbeforeExpandVal = elemExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\trect = lazyloadElems[i].getBoundingClientRect();\n\n\t\t\t\t\tif ((eLbottom = rect.bottom) >= elemNegativeExpand &&\n\t\t\t\t\t\t(eLtop = rect.top) <= elvH &&\n\t\t\t\t\t\t(eLright = rect.right) >= elemNegativeExpand * hFac &&\n\t\t\t\t\t\t(eLleft = rect.left) <= eLvW &&\n\t\t\t\t\t\t(eLbottom || eLright || eLleft || eLtop) &&\n\t\t\t\t\t\t(lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) &&\n\t\t\t\t\t\t((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){\n\t\t\t\t\t\tunveilElement(lazyloadElems[i]);\n\t\t\t\t\t\tloadedSomething = true;\n\t\t\t\t\t\tif(isLoading > 9){break;}\n\t\t\t\t\t} else if(!loadedSomething && isCompleted && !autoLoadElem &&\n\t\t\t\t\t\tisLoading < 4 && lowRuns < 4 && loadMode > 2 &&\n\t\t\t\t\t\t(preloadElems[0] || lazySizesCfg.preloadAfterLoad) &&\n\t\t\t\t\t\t(preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){\n\t\t\t\t\t\tautoLoadElem = preloadElems[0] || lazyloadElems[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(autoLoadElem && !loadedSomething){\n\t\t\t\t\tunveilElement(autoLoadElem);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar throttledCheckElements = throttle(checkElements);\n\n\t\tvar switchLoadingClass = function(e){\n\t\t\tvar elem = e.target;\n\n\t\t\tif (elem._lazyCache) {\n\t\t\t\tdelete elem._lazyCache;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresetPreloading(e);\n\t\t\taddClass(elem, lazySizesCfg.loadedClass);\n\t\t\tremoveClass(elem, lazySizesCfg.loadingClass);\n\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass);\n\t\t\ttriggerEvent(elem, 'lazyloaded');\n\t\t};\n\t\tvar rafedSwitchLoadingClass = rAFIt(switchLoadingClass);\n\t\tvar rafSwitchLoadingClass = function(e){\n\t\t\trafedSwitchLoadingClass({target: e.target});\n\t\t};\n\n\t\tvar changeIframeSrc = function(elem, src){\n\t\t\tvar loadMode = elem.getAttribute('data-load-mode') || lazySizesCfg.iframeLoadMode;\n\n\t\t\t// loadMode can be also a string!\n\t\t\tif (loadMode == 0) {\n\t\t\t\telem.contentWindow.location.replace(src);\n\t\t\t} else if (loadMode == 1) {\n\t\t\t\telem.src = src;\n\t\t\t}\n\t\t};\n\n\t\tvar handleSources = function(source){\n\t\t\tvar customMedia;\n\n\t\t\tvar sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);\n\n\t\t\tif( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){\n\t\t\t\tsource.setAttribute('media', customMedia);\n\t\t\t}\n\n\t\t\tif(sourceSrcset){\n\t\t\t\tsource.setAttribute('srcset', sourceSrcset);\n\t\t\t}\n\t\t};\n\n\t\tvar lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){\n\t\t\tvar src, srcset, parent, isPicture, event, firesLoad;\n\n\t\t\tif(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){\n\n\t\t\t\tif(sizes){\n\t\t\t\t\tif(isAuto){\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.autosizesClass);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.setAttribute('sizes', sizes);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsrcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);\n\t\t\t\tsrc = elem[_getAttribute](lazySizesCfg.srcAttr);\n\n\t\t\t\tif(isImg) {\n\t\t\t\t\tparent = elem.parentNode;\n\t\t\t\t\tisPicture = parent && regPicture.test(parent.nodeName || '');\n\t\t\t\t}\n\n\t\t\t\tfiresLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));\n\n\t\t\t\tevent = {target: elem};\n\n\t\t\t\taddClass(elem, lazySizesCfg.loadingClass);\n\n\t\t\t\tif(firesLoad){\n\t\t\t\t\tclearTimeout(resetPreloadingTimer);\n\t\t\t\t\tresetPreloadingTimer = setTimeout(resetPreloading, 2500);\n\t\t\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass, true);\n\t\t\t\t}\n\n\t\t\t\tif(isPicture){\n\t\t\t\t\tforEach.call(parent.getElementsByTagName('source'), handleSources);\n\t\t\t\t}\n\n\t\t\t\tif(srcset){\n\t\t\t\t\telem.setAttribute('srcset', srcset);\n\t\t\t\t} else if(src && !isPicture){\n\t\t\t\t\tif(regIframe.test(elem.nodeName)){\n\t\t\t\t\t\tchangeIframeSrc(elem, src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.src = src;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(isImg && (srcset || isPicture)){\n\t\t\t\t\tupdatePolyfill(elem, {src: src});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(elem._lazyRace){\n\t\t\t\tdelete elem._lazyRace;\n\t\t\t}\n\t\t\tremoveClass(elem, lazySizesCfg.lazyClass);\n\n\t\t\trAF(function(){\n\t\t\t\t// Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015)\n\t\t\t\tvar isLoaded = elem.complete && elem.naturalWidth > 1;\n\n\t\t\t\tif( !firesLoad || isLoaded){\n\t\t\t\t\tif (isLoaded) {\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.fastLoadedClass);\n\t\t\t\t\t}\n\t\t\t\t\tswitchLoadingClass(event);\n\t\t\t\t\telem._lazyCache = true;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tif ('_lazyCache' in elem) {\n\t\t\t\t\t\t\tdelete elem._lazyCache;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 9);\n\t\t\t\t}\n\t\t\t\tif (elem.loading == 'lazy') {\n\t\t\t\t\tisLoading--;\n\t\t\t\t}\n\t\t\t}, true);\n\t\t});\n\n\t\t/**\n\t\t *\n\t\t * @param elem { Element }\n\t\t */\n\t\tvar unveilElement = function (elem){\n\t\t\tif (elem._lazyRace) {return;}\n\t\t\tvar detail;\n\n\t\t\tvar isImg = regImg.test(elem.nodeName);\n\n\t\t\t//allow using sizes=\"auto\", but don't use. it's invalid. Use data-sizes=\"auto\" or a valid value for sizes instead (i.e.: sizes=\"80vw\")\n\t\t\tvar sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes'));\n\t\t\tvar isAuto = sizes == 'auto';\n\n\t\t\tif( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;}\n\n\t\t\tdetail = triggerEvent(elem, 'lazyunveilread').detail;\n\n\t\t\tif(isAuto){\n\t\t\t\t autoSizer.updateElem(elem, true, elem.offsetWidth);\n\t\t\t}\n\n\t\t\telem._lazyRace = true;\n\t\t\tisLoading++;\n\n\t\t\tlazyUnveil(elem, detail, isAuto, sizes, isImg);\n\t\t};\n\n\t\tvar afterScroll = debounce(function(){\n\t\t\tlazySizesCfg.loadMode = 3;\n\t\t\tthrottledCheckElements();\n\t\t});\n\n\t\tvar altLoadmodeScrollListner = function(){\n\t\t\tif(lazySizesCfg.loadMode == 3){\n\t\t\t\tlazySizesCfg.loadMode = 2;\n\t\t\t}\n\t\t\tafterScroll();\n\t\t};\n\n\t\tvar onload = function(){\n\t\t\tif(isCompleted){return;}\n\t\t\tif(Date.now() - started < 999){\n\t\t\t\tsetTimeout(onload, 999);\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\tisCompleted = true;\n\n\t\t\tlazySizesCfg.loadMode = 3;\n\n\t\t\tthrottledCheckElements();\n\n\t\t\taddEventListener('scroll', altLoadmodeScrollListner, true);\n\t\t};\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tstarted = Date.now();\n\n\t\t\t\tlazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass);\n\t\t\t\tpreloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass);\n\n\t\t\t\taddEventListener('scroll', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('resize', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('pageshow', function (e) {\n\t\t\t\t\tif (e.persisted) {\n\t\t\t\t\t\tvar loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass);\n\n\t\t\t\t\t\tif (loadingElements.length && loadingElements.forEach) {\n\t\t\t\t\t\t\trequestAnimationFrame(function () {\n\t\t\t\t\t\t\t\tloadingElements.forEach( function (img) {\n\t\t\t\t\t\t\t\t\tif (img.complete) {\n\t\t\t\t\t\t\t\t\t\tunveilElement(img);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif(window.MutationObserver){\n\t\t\t\t\tnew MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );\n\t\t\t\t} else {\n\t\t\t\t\tdocElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);\n\t\t\t\t\tdocElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);\n\t\t\t\t\tsetInterval(throttledCheckElements, 999);\n\t\t\t\t}\n\n\t\t\t\taddEventListener('hashchange', throttledCheckElements, true);\n\n\t\t\t\t//, 'fullscreenchange'\n\t\t\t\t['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){\n\t\t\t\t\tdocument[_addEventListener](name, throttledCheckElements, true);\n\t\t\t\t});\n\n\t\t\t\tif((/d$|^c/.test(document.readyState))){\n\t\t\t\t\tonload();\n\t\t\t\t} else {\n\t\t\t\t\taddEventListener('load', onload);\n\t\t\t\t\tdocument[_addEventListener]('DOMContentLoaded', throttledCheckElements);\n\t\t\t\t\tsetTimeout(onload, 20000);\n\t\t\t\t}\n\n\t\t\t\tif(lazysizes.elements.length){\n\t\t\t\t\tcheckElements();\n\t\t\t\t\trAF._lsFlush();\n\t\t\t\t} else {\n\t\t\t\t\tthrottledCheckElements();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcheckElems: throttledCheckElements,\n\t\t\tunveil: unveilElement,\n\t\t\t_aLSL: altLoadmodeScrollListner,\n\t\t};\n\t})();\n\n\n\tvar autoSizer = (function(){\n\t\tvar autosizesElems;\n\n\t\tvar sizeElement = rAFIt(function(elem, parent, event, width){\n\t\t\tvar sources, i, len;\n\t\t\telem._lazysizesWidth = width;\n\t\t\twidth += 'px';\n\n\t\t\telem.setAttribute('sizes', width);\n\n\t\t\tif(regPicture.test(parent.nodeName || '')){\n\t\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tsources[i].setAttribute('sizes', width);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!event.detail.dataAttr){\n\t\t\t\tupdatePolyfill(elem, event.detail);\n\t\t\t}\n\t\t});\n\t\t/**\n\t\t *\n\t\t * @param elem {Element}\n\t\t * @param dataAttr\n\t\t * @param [width] { number }\n\t\t */\n\t\tvar getSizeElement = function (elem, dataAttr, width){\n\t\t\tvar event;\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif(parent){\n\t\t\t\twidth = getWidth(elem, parent, width);\n\t\t\t\tevent = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});\n\n\t\t\t\tif(!event.defaultPrevented){\n\t\t\t\t\twidth = event.detail.width;\n\n\t\t\t\t\tif(width && width !== elem._lazysizesWidth){\n\t\t\t\t\t\tsizeElement(elem, parent, event, width);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar updateElementsSizes = function(){\n\t\t\tvar i;\n\t\t\tvar len = autosizesElems.length;\n\t\t\tif(len){\n\t\t\t\ti = 0;\n\n\t\t\t\tfor(; i < len; i++){\n\t\t\t\t\tgetSizeElement(autosizesElems[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar debouncedUpdateElementsSizes = debounce(updateElementsSizes);\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tautosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass);\n\t\t\t\taddEventListener('resize', debouncedUpdateElementsSizes);\n\t\t\t},\n\t\t\tcheckElems: debouncedUpdateElementsSizes,\n\t\t\tupdateElem: getSizeElement\n\t\t};\n\t})();\n\n\tvar init = function(){\n\t\tif(!init.i && document.getElementsByClassName){\n\t\t\tinit.i = true;\n\t\t\tautoSizer._();\n\t\t\tloader._();\n\t\t}\n\t};\n\n\tsetTimeout(function(){\n\t\tif(lazySizesCfg.init){\n\t\t\tinit();\n\t\t}\n\t});\n\n\tlazysizes = {\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tcfg: lazySizesCfg,\n\t\tautoSizer: autoSizer,\n\t\tloader: loader,\n\t\tinit: init,\n\t\tuP: updatePolyfill,\n\t\taC: addClass,\n\t\trC: removeClass,\n\t\thC: hasClass,\n\t\tfire: triggerEvent,\n\t\tgW: getWidth,\n\t\trAF: rAF,\n\t};\n\n\treturn lazysizes;\n}\n"
  },
  {
    "path": "src/lazysizes-intersection.js",
    "content": "(function(window, factory) {\n\tif(typeof module == 'object' && module.exports){\n\t\tmodule.exports = lazySizes;\n\t} else {\n\t\twindow.lazySizes = factory(window, window.document, Date);\n\t}\n}(window, function l(window, document, Date) {\n\t'use strict';\n\n\t/*jshint eqnull:true */\n\tif(!window.IntersectionObserver || !document.getElementsByClassName || !window.MutationObserver){return;}\n\n\tvar lazysizes, lazySizesCfg;\n\n\tvar docElem = document.documentElement;\n\n\tvar supportPicture = window.HTMLPictureElement;\n\n\tvar _addEventListener = 'addEventListener';\n\n\tvar _getAttribute = 'getAttribute';\n\n\tvar addEventListener = window[_addEventListener].bind(window);\n\n\tvar setTimeout = window.setTimeout;\n\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n\n\tvar requestIdleCallback = window.requestIdleCallback || setTimeout;\n\n\tvar regPicture = /^picture$/i;\n\n\tvar loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];\n\n\tvar forEach = Array.prototype.forEach;\n\n\tvar hasClass = function(ele, cls) {\n\t\treturn ele.classList.contains(cls);\n\t};\n\n\tvar addClass = function(ele, cls) {\n\t\tele.classList.add(cls);\n\t};\n\n\tvar removeClass = function(ele, cls) {\n\t\tele.classList.remove(cls);\n\t};\n\n\tvar addRemoveLoadEvents = function(dom, fn, add){\n\t\tvar action = add ? _addEventListener : 'removeEventListener';\n\t\tif(add){\n\t\t\taddRemoveLoadEvents(dom, fn);\n\t\t}\n\t\tloadEvents.forEach(function(evt){\n\t\t\tdom[action](evt, fn);\n\t\t});\n\t};\n\n\tvar triggerEvent = function(elem, name, detail, noBubbles, noCancelable){\n\t\tvar event = document.createEvent('CustomEvent');\n\n\t\tif(!detail){\n\t\t\tdetail = {};\n\t\t}\n\n\t\tdetail.instance = lazysizes;\n\n\t\tevent.initCustomEvent(name, !noBubbles, !noCancelable, detail);\n\n\t\telem.dispatchEvent(event);\n\t\treturn event;\n\t};\n\n\tvar updatePolyfill = function (el, full){\n\t\tvar polyfill;\n\t\tif( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){\n\t\t\tpolyfill({reevaluate: true, elements: [el]});\n\t\t} else if(full && full.src){\n\t\t\tel.src = full.src;\n\t\t}\n\t};\n\n\tvar getWidth = function(elem, parent, width){\n\t\twidth = width || elem.offsetWidth;\n\n\t\twhile(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){\n\t\t\twidth =  parent.offsetWidth;\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\treturn width;\n\t};\n\n\tvar rAF = (function(){\n\t\tvar running, waiting;\n\t\tvar fns = [];\n\n\t\tvar run = function(){\n\t\t\tvar fn;\n\t\t\trunning = true;\n\t\t\twaiting = false;\n\t\t\twhile(fns.length){\n\t\t\t\tfn = fns.shift();\n\t\t\t\tfn[0].apply(fn[1], fn[2]);\n\t\t\t}\n\t\t\trunning = false;\n\t\t};\n\n\t\treturn function(fn){\n\t\t\tif(running){\n\t\t\t\tfn.apply(this, arguments);\n\t\t\t} else {\n\t\t\t\tfns.push([fn, this, arguments]);\n\n\t\t\t\tif(!waiting){\n\t\t\t\t\twaiting = true;\n\t\t\t\t\t(document.hidden ? setTimeout : requestAnimationFrame)(run);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t})();\n\n\tvar rAFIt = function(fn, simple){\n\t\treturn simple ?\n\t\t\tfunction() {\n\t\t\t\trAF(fn);\n\t\t\t} :\n\t\t\tfunction(){\n\t\t\t\tvar that = this;\n\t\t\t\tvar args = arguments;\n\t\t\t\trAF(function(){\n\t\t\t\t\tfn.apply(that, args);\n\t\t\t\t});\n\t\t\t}\n\t\t;\n\t};\n\n\t//based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html\n\tvar debounce = function(func) {\n\t\tvar timeout, timestamp;\n\t\tvar wait = 99;\n\t\tvar run = function(){\n\t\t\ttimeout = null;\n\t\t\tfunc();\n\t\t};\n\t\tvar later = function() {\n\t\t\tvar last = Date.now() - timestamp;\n\n\t\t\tif (last < wait) {\n\t\t\t\tsetTimeout(later, wait - last);\n\t\t\t} else {\n\t\t\t\t(requestIdleCallback || run)(run);\n\t\t\t}\n\t\t};\n\n\t\treturn function() {\n\t\t\ttimestamp = Date.now();\n\n\t\t\tif (!timeout) {\n\t\t\t\ttimeout = setTimeout(later, wait);\n\t\t\t}\n\t\t};\n\t};\n\n\n\tvar loader = (function(){\n\t\tvar inviewObserver, preloadObserver;\n\n\t\tvar lazyloadElems, isCompleted, resetPreloadingTimer, started;\n\n\t\tvar regImg = /^img$/i;\n\t\tvar regIframe = /^iframe$/i;\n\n\t\tvar supportScroll = ('onscroll' in window) && !(/glebot/.test(navigator.userAgent));\n\n\t\tvar isLoading = 0;\n\t\tvar isPreloadLoading = 0;\n\n\t\tvar resetPreloading = function(e){\n\t\t\tisLoading--;\n\n\t\t\tif(isPreloadLoading){\n\t\t\t\tisPreloadLoading--;\n\t\t\t}\n\n\t\t\tif(e && e.target){\n\t\t\t\taddRemoveLoadEvents(e.target, resetPreloading);\n\t\t\t}\n\n\t\t\tif(!e || isLoading < 0 || !e.target){\n\t\t\t\tisLoading = 0;\n\t\t\t\tisPreloadLoading = 0;\n\t\t\t}\n\n\t\t\tif(lazyQuedElements.length && (isLoading - isPreloadLoading) < 1 && isLoading < 3){\n\t\t\t\tsetTimeout(function(){\n\t\t\t\t\twhile(lazyQuedElements.length && (isLoading - isPreloadLoading) < 1 && isLoading < 4){\n\t\t\t\t\t\tlazyUnveilElement({target: lazyQuedElements.shift()});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tvar switchLoadingClass = function(e){\n\t\t\taddClass(e.target, lazySizesCfg.loadedClass);\n\t\t\tremoveClass(e.target, lazySizesCfg.loadingClass);\n\t\t\taddRemoveLoadEvents(e.target, rafSwitchLoadingClass);\n\t\t};\n\t\tvar rafedSwitchLoadingClass = rAFIt(switchLoadingClass);\n\t\tvar rafSwitchLoadingClass = function(e){\n\t\t\trafedSwitchLoadingClass({target: e.target});\n\t\t};\n\n\t\tvar changeIframeSrc = function(elem, src){\n\t\t\ttry {\n\t\t\t\telem.contentWindow.location.replace(src);\n\t\t\t} catch(e){\n\t\t\t\telem.src = src;\n\t\t\t}\n\t\t};\n\n\t\tvar handleSources = function(source){\n\t\t\tvar customMedia;\n\n\t\t\tvar sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);\n\n\t\t\tif( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){\n\t\t\t\tsource.setAttribute('media', customMedia);\n\t\t\t}\n\n\t\t\tif(sourceSrcset){\n\t\t\t\tsource.setAttribute('srcset', sourceSrcset);\n\t\t\t}\n\t\t};\n\n\t\tvar lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){\n\t\t\tvar src, srcset, parent, isPicture, event, firesLoad;\n\n\t\t\tif(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){\n\n\t\t\t\tif(sizes){\n\t\t\t\t\tif(isAuto){\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.autosizesClass);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.setAttribute('sizes', sizes);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsrcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);\n\t\t\t\tsrc = elem[_getAttribute](lazySizesCfg.srcAttr);\n\n\t\t\t\tif(isImg) {\n\t\t\t\t\tparent = elem.parentNode;\n\t\t\t\t\tisPicture = parent && regPicture.test(parent.nodeName || '');\n\t\t\t\t}\n\n\t\t\t\tfiresLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));\n\n\t\t\t\tevent = {target: elem};\n\n\t\t\t\tif(firesLoad){\n\t\t\t\t\taddRemoveLoadEvents(elem, resetPreloading, true);\n\t\t\t\t\tclearTimeout(resetPreloadingTimer);\n\t\t\t\t\tresetPreloadingTimer = setTimeout(resetPreloading, 2500);\n\n\t\t\t\t\taddClass(elem, lazySizesCfg.loadingClass);\n\t\t\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass, true);\n\t\t\t\t}\n\n\t\t\t\tif(isPicture){\n\t\t\t\t\tforEach.call(parent.getElementsByTagName('source'), handleSources);\n\t\t\t\t}\n\n\t\t\t\tif(srcset){\n\t\t\t\t\telem.setAttribute('srcset', srcset);\n\t\t\t\t} else if(src && !isPicture){\n\t\t\t\t\tif(regIframe.test(elem.nodeName)){\n\t\t\t\t\t\tchangeIframeSrc(elem, src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.src = src;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(srcset || isPicture){\n\t\t\t\t\tupdatePolyfill(elem, {src: src});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trAF(function(){\n\t\t\t\tif(elem._lazyRace){\n\t\t\t\t\tdelete elem._lazyRace;\n\t\t\t\t}\n\t\t\t\tremoveClass(elem, lazySizesCfg.lazyWaitClass);\n\n\t\t\t\tif( !firesLoad || elem.complete ){\n\t\t\t\t\tif(firesLoad){\n\t\t\t\t\t\tresetPreloading(event);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tisLoading--;\n\t\t\t\t\t}\n\t\t\t\t\tswitchLoadingClass(event);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tvar unveilElement = function (elem){\n\t\t\tvar detail, index;\n\t\t\tvar isImg = regImg.test(elem.nodeName);\n\n\t\t\t//allow using sizes=\"auto\", but don't use. it's invalid. Use data-sizes=\"auto\" or a valid value for sizes instead (i.e.: sizes=\"80vw\")\n\t\t\tvar sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes'));\n\t\t\tvar isAuto = sizes == 'auto';\n\n\t\t\tif( (isAuto || !isCompleted) && isImg && (elem.src || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass)){return;}\n\n\t\t\tdetail = triggerEvent(elem, 'lazyunveilread').detail;\n\n\t\t\tif(isAuto){\n\t\t\t\t autoSizer.updateElem(elem, true, elem.offsetWidth);\n\t\t\t}\n\n\t\t\tisLoading++;\n\n\t\t\tif((index = lazyQuedElements.indexOf(elem)) != -1){\n\t\t\t\tlazyQuedElements.splice(index, 1);\n\t\t\t}\n\n\t\t\tinviewObserver.unobserve(elem);\n\t\t\tpreloadObserver.unobserve(elem);\n\n\t\t\tlazyUnveil(elem, detail, isAuto, sizes, isImg);\n\t\t};\n\t\tvar unveilElements = function(change){\n\t\t\tvar i, len;\n\t\t\tfor(i = 0, len = change.length; i < len; i++){\n\t\t\t\tif (change[i].isIntersecting === false) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tunveilElement(change[i].target);\n\t\t\t}\n\t\t};\n\n\t\tvar lazyQuedElements = [];\n\n\t\tvar lazyUnveilElement = function(change){\n\t\t\tvar index, i, len, element;\n\n\t\t\tfor(i = 0, len = change.length; i < len; i++){\n\t\t\t\telement = change[i].target;\n\t\t\t\tif((isLoading - isPreloadLoading) < 1 && isLoading < 4){\n\t\t\t\t\tisPreloadLoading++;\n\t\t\t\t\tunveilElement(element);\n\t\t\t\t} else if((index = lazyQuedElements.indexOf(element)) == -1){\n\t\t\t\t\tlazyQuedElements.push(element);\n\t\t\t\t} else {\n\t\t\t\t\tlazyQuedElements.splice(index, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar removeLazyClassElements = [];\n\n\t\tvar removeLazyClass = rAFIt(function(){\n\t\t\tvar element;\n\n\t\t\twhile(removeLazyClassElements.length){\n\t\t\t\telement = removeLazyClassElements.shift();\n\t\t\t\taddClass(element, lazySizesCfg.lazyWaitClass);\n\t\t\t\tremoveClass(element, lazySizesCfg.lazyClass);\n\n\t\t\t\tif(element._lazyAdd){\n\t\t\t\t\tdelete element._lazyAdd;\n\t\t\t\t}\n\t\t\t}\n\t\t}, true);\n\n\t\tvar addElements = function(){\n\t\t\tvar i, len, runLazyRemove;\n\t\t\tfor(i = 0, len = lazyloadElems.length; i < len; i++){\n\t\t\t\tif(!lazyloadElems[i]._lazyAdd){\n\t\t\t\t\tlazyloadElems[i]._lazyAdd = true;\n\n\t\t\t\t\tinviewObserver.observe(lazyloadElems[i]);\n\t\t\t\t\tpreloadObserver.observe(lazyloadElems[i]);\n\n\t\t\t\t\tremoveLazyClassElements.push(lazyloadElems[i]);\n\t\t\t\t\trunLazyRemove = true;\n\n\t\t\t\t\tif(!supportScroll){\n\t\t\t\t\t\tunveilElement(lazyloadElems[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(runLazyRemove){\n\t\t\t\tremoveLazyClass();\n\t\t\t}\n\t\t};\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tstarted = Date.now();\n\n\t\t\t\tlazyloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass);\n\n\t\t\t\tinviewObserver = new IntersectionObserver(unveilElements);\n\t\t\t\tpreloadObserver = new IntersectionObserver(lazyUnveilElement, {\n\t\t\t\t\trootMargin: lazySizesCfg.expand + 'px ' + (lazySizesCfg.expand * lazySizesCfg.hFac) + 'px',\n\t\t\t\t});\n\n\t\t\t\tnew MutationObserver( addElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );\n\n\t\t\t\taddElements();\n\t\t\t},\n\t\t\tunveil: unveilElement\n\t\t};\n\t})();\n\n\n\tvar autoSizer = (function(){\n\t\tvar autosizesElems;\n\n\t\tvar sizeElement = rAFIt(function(elem, parent, event, width){\n\t\t\tvar sources, i, len;\n\t\t\telem._lazysizesWidth = width;\n\t\t\twidth += 'px';\n\n\t\t\telem.setAttribute('sizes', width);\n\n\t\t\tif(regPicture.test(parent.nodeName || '')){\n\t\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tsources[i].setAttribute('sizes', width);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!event.detail.dataAttr){\n\t\t\t\tupdatePolyfill(elem, event.detail);\n\t\t\t}\n\t\t});\n\t\tvar getSizeElement = function (elem, dataAttr, width){\n\t\t\tvar event;\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif(parent){\n\t\t\t\twidth = getWidth(elem, parent, width);\n\t\t\t\tevent = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});\n\n\t\t\t\tif(!event.defaultPrevented){\n\t\t\t\t\twidth = event.detail.width;\n\n\t\t\t\t\tif(width && width !== elem._lazysizesWidth){\n\t\t\t\t\t\tsizeElement(elem, parent, event, width);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar updateElementsSizes = function(){\n\t\t\tvar i;\n\t\t\tvar len = autosizesElems.length;\n\t\t\tif(len){\n\t\t\t\ti = 0;\n\n\t\t\t\tfor(; i < len; i++){\n\t\t\t\t\tgetSizeElement(autosizesElems[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar debouncedUpdateElementsSizes = debounce(updateElementsSizes);\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tautosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass);\n\t\t\t\taddEventListener('resize', debouncedUpdateElementsSizes);\n\t\t\t},\n\t\t\tcheckElems: debouncedUpdateElementsSizes,\n\t\t\tupdateElem: getSizeElement\n\t\t};\n\t})();\n\n\tvar init = function(){\n\t\tif(!init.i){\n\t\t\tinit.i = true;\n\t\t\tautoSizer._();\n\t\t\tloader._();\n\t\t}\n\t};\n\n\t(function(){\n\t\tvar prop;\n\n\t\tvar lazySizesDefaults = {\n\t\t\tlazyClass: 'lazyload',\n\t\t\tlazyWaitClass: 'lazyloadwait',\n\t\t\tloadedClass: 'lazyloaded',\n\t\t\tloadingClass: 'lazyloading',\n\t\t\tpreloadClass: 'lazypreload',\n\t\t\terrorClass: 'lazyerror',\n\t\t\t//strictClass: 'lazystrict',\n\t\t\tautosizesClass: 'lazyautosizes',\n\t\t\tsrcAttr: 'data-src',\n\t\t\tsrcsetAttr: 'data-srcset',\n\t\t\tsizesAttr: 'data-sizes',\n\t\t\tminSize: 40,\n\t\t\tcustomMedia: {},\n\t\t\tinit: true,\n\t\t\thFac: 0.8,\n\t\t\tloadMode: 2,\n\t\t\texpand: 400,\n\t\t};\n\n\t\tlazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {};\n\n\t\tfor(prop in lazySizesDefaults){\n\t\t\tif(!(prop in lazySizesCfg)){\n\t\t\t\tlazySizesCfg[prop] = lazySizesDefaults[prop];\n\t\t\t}\n\t\t}\n\n\t\tsetTimeout(function(){\n\t\t\tif(lazySizesCfg.init){\n\t\t\t\tinit();\n\t\t\t}\n\t\t});\n\t})();\n\n\tlazysizes = {\n\t\tcfg: lazySizesCfg,\n\t\tautoSizer: autoSizer,\n\t\tloader: loader,\n\t\tinit: init,\n\t\tuP: updatePolyfill,\n\t\taC: addClass,\n\t\trC: removeClass,\n\t\thC: hasClass,\n\t\tfire: triggerEvent,\n\t\tgW: getWidth,\n\t\trAF: rAF,\n\t};\n\n\treturn lazysizes;\n}));\n"
  },
  {
    "path": "src/umd.wrapper",
    "content": "(function(window, factory) {\n\tvar lazySizes = factory(window, window.document, Date);\n\tif(typeof module == 'object' && module.exports){\n\t\tmodule.exports = lazySizes;\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(lazySizes);\n\t} else {\n\t\twindow.lazySizes = lazySizes;\n\t}\n}(window, {{ls}}));\n"
  },
  {
    "path": "tests/functional-tests-plugins.js",
    "content": "function _optimumxReinit(addClass){\n\treturn function (assert){\n\n\t\tif(!window.devicePixelRatio){\n\t\t\tassert.ok(true);\n\t\t\treturn;\n\t\t}\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($){\n\t\t\tvar placeholderSrc, $image;\n\t\t\tvar unveiled = 0;\n\t\t\tvar initTest = function(){\n\t\t\t\tvar success = [\n\t\t\t\t\t{\n\t\t\t\t\t\tu: 'data:,img1-5000',\n\t\t\t\t\t\tw: 5000,\n\t\t\t\t\t\tc: 'data:,img1-5000 5000w'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tu: 'data:,img1-50000',\n\t\t\t\t\t\tw: 50000,\n\t\t\t\t\t\tc: 'data:,img1-50000 50000w'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tu: 'data:,img1-500000',\n\t\t\t\t\t\tw: 500000,\n\t\t\t\t\t\tc: 'data:,img1-500000 500000w'\n\t\t\t\t\t}\n\t\t\t\t];\n\t\t\t\tassert.propEqual(cleanUpDensity($image.prop('_lazyOptimumx').cands), success);\n\t\t\t\tassert.equal($image.prop('_lazyOptimumx').cSrcset.length, 1);\n\t\t\t\tassert.equal($image.prop('_lazyOptimumx').cSrcset[0], 'data:,img1-5000 5000w');\n\t\t\t\tassert.equal($image.attr('srcset'), 'data:,img1-5000 5000w');\n\t\t\t};\n\t\t\tvar reinitTest = function(){\n\t\t\t\tvar success = [\n\t\t\t\t\t{\n\t\t\t\t\t\tu: 'data:,img2-50',\n\t\t\t\t\t\tw: 50,\n\t\t\t\t\t\tc: 'data:,img2-50 50w'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tu: 'data:,img2-100',\n\t\t\t\t\t\tw: 100,\n\t\t\t\t\t\tc: 'data:,img2-100 100w'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tu: 'data:,img2-500000',\n\t\t\t\t\t\tw: 500000,\n\t\t\t\t\t\tc: 'data:,img2-500000 500000w'\n\t\t\t\t\t}\n\t\t\t\t];\n\t\t\t\tassert.propEqual(cleanUpDensity($image.prop('_lazyOptimumx').cands), success);\n\t\t\t\tassert.equal($image.prop('_lazyOptimumx').cSrcset.length, 2, '1');\n\t\t\t\tassert.equal($image.prop('_lazyOptimumx').cSrcset[0], 'data:,img2-50 50w', '2');\n\t\t\t\tassert.equal($image.prop('_lazyOptimumx').cSrcset[1], 'data:,img2-100 100w', '3');\n\t\t\t\tassert.equal($image.attr('srcset'), 'data:,img2-50 50w, data:,img2-100 100w', '4');\n\t\t\t};\n\t\t\tvar test = [\n\t\t\t\t['\\ndata:,img1-50000 50000w, \\ndata:,img1-5000 5000w, data:,img1-500000 500000w', initTest],\n\t\t\t\t['\\ndata:,img2-100 100w, \\ndata:,img2-500000 500000w, \\ndata:,img2-50 50w', reinitTest]\n\t\t\t];\n\t\t\tvar run = function(){\n\t\t\t\tif(test.length){\n\t\t\t\t\tplaceholderSrc = test.shift();\n\t\t\t\t\t$image\n\t\t\t\t\t\t.attr('data-srcset', placeholderSrc[0])\n\t\t\t\t\t\t.attr('data-optimumx', '0.6')\n\t\t\t\t\t;\n\n\n\t\t\t\t\tif(addClass){\n\t\t\t\t\t\t$image.addClass('lazyload');\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tassert.ok(unveiled == 2);\n\t\t\t\t\t\tdone();\n\t\t\t\t\t}, 130);\n\t\t\t\t}\n\t\t\t};\n\n\n\t\t\t$image = $('<img data-sizes=\"auto\" style=\"width: 90%;\" data-optimumx=\"0.6\" class=\"lazyload\" />')\n\t\t\t\t.appendTo('body')\n\t\t\t;\n\n\t\t\t$image.on('lazybeforeunveil', function(e){\n\t\t\t\tunveiled++;\n\t\t\t});\n\n\t\t\t$image.on('lazybeforeunveil', function(e){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tplaceholderSrc[1]();\n\t\t\t\t\tsetTimeout(run, 20);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\trun();\n\t\t});\n\t};\n}\n\n$.extend(window.lazyTests, {\n\tbgsetParentFit: ['lazyloads bgsetParentFit', function(assert){\n\t\tvar done = assert.async();\n\t\tvar $iframe = this.$iframe;\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar viewport;\n\t\t\tvar $div = $('<div />')\n\t\t\t\t.attr({\n\t\t\t\t\t'data-bgset': '\\ndata:,jo2 400w 800h, \\ndata:,jo3 800w 1600h, data:,jo4 1200w 2400h [(max-width: 300px)] | ' +\n\t\t\t\t\t'data:,jo5 800h 500w',\n\t\t\t\t\t'data-sizes': 'auto',\n\t\t\t\t\t'class': 'lazyload',\n\t\t\t\t\t'data-optimumx': '0.6'\n\t\t\t\t})\n\t\t\t\t.css({\n\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\twidth: 400,\n\t\t\t\t\theight: 400,\n\t\t\t\t\tbackgroundSize: 'contain'\n\t\t\t\t})\n\t\t\t\t.appendTo('body')\n\t\t\t;\n\t\t\tvar initialTest = function(){\n\t\t\t\tassert.equal($('source').eq(0).attr('sizes'), '200px');\n\t\t\t};\n\n\t\t\tvar endTest = function(){\n\t\t\t\tassert.equal($('source').eq(1).attr('sizes'), '250px');\n\t\t\t};\n\t\t\tvar viewportTests = [\n\t\t\t\t['300', initialTest],\n\t\t\t\t['500', endTest]\n\t\t\t];\n\n\t\t\tvar run = function(){\n\t\t\t\tif(viewportTests.length){\n\t\t\t\t\tviewport = viewportTests.shift();\n\t\t\t\t\t$iframe.css('width', viewport[0]);\n\t\t\t\t} else {\n\t\t\t\t\tdone();\n\t\t\t\t}\n\t\t\t};\n\t\t\trun();\n\n\t\t\t$div.on('lazybeforesizes', function(e){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tviewport[1]();\n\t\t\t\t\trun();\n\t\t\t\t});\n\t\t\t});\n\n\t\t});\n\t}],\n\toptimumxPictureResize: ['lazyloads constraints srcset on picture', function(assert){\n\t\tvar done = assert.async();\n\t\tvar $iframe = this.$iframe;\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar viewport;\n\t\t\tvar $picture = createPicture($, [\n\t\t\t\t{\n\t\t\t\t\t'data-srcset': '\\n\\ndata:,lazysource150 150w, \\ndata:,lazysource100 100w, \\ndata:,lazysource280 280w',\n\t\t\t\t\tmedia: '(min-width: 0.5em)'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t'data-srcset': '\\ndata:,lazyimg100 100w, \\n\\ndata:,lazyimg200 200w, \\n\\ndata:,lazyimg150 150w',\n\t\t\t\t\t'data-optimumx': '0.5',\n\t\t\t\t\t'data-sizes': 'auto',\n\t\t\t\t\t'class': 'lazyload'\n\t\t\t\t}\n\t\t\t]);\n\t\t\tvar $source = $picture.find('source');\n\t\t\tvar $image = $picture.find('img');\n\t\t\tvar initialTest = function(){\n\t\t\t\tvar haspolyfill = frameWindow.respimage || frameWindow.picturefill || (frameWindow.lazySizes.cfg.rias && frameWindow.lazySizes.pWS) || frameWindow.lazySizes.cfg.pf;\n\t\t\t\tvar nowSrc = window.HTMLPictureElement || !haspolyfill ?\n\t\t\t\t\t'' : 'data:,lazysource150';\n\n\t\t\t\tassert.equal($source.attr('srcset'), 'data:,lazysource100 100w, data:,lazysource150 150w');\n\n\t\t\t\tif(!window.bustedSrcset || !frameWindow.lazySizes.cfg.pf){\n\t\t\t\t\tassert.equal($image.attr('srcset') || $image.attr('data-risrcset') || $image.attr('data-pfsrcset'), 'data:,lazyimg100 100w, data:,lazyimg150 150w');\n\t\t\t\t}\n\t\t\t\tassert.equal($image.prop('src'), nowSrc, 'jo');\n\t\t\t};\n\n\t\t\tvar endTest = function(){\n\t\t\t\tvar haspolyfill = frameWindow.respimage || frameWindow.picturefill || (frameWindow.lazySizes.cfg.rias && frameWindow.lazySizes.pWS) || frameWindow.lazySizes.cfg.pf;\n\t\t\t\tvar nowSrc = window.HTMLPictureElement || !haspolyfill ?\n\t\t\t\t\t'' : 'data:,lazysource280';\n\t\t\t\tassert.equal($source.attr('srcset'), 'data:,lazysource100 100w, data:,lazysource150 150w, data:,lazysource280 280w');\n\t\t\t\tif(!window.bustedSrcset || !frameWindow.lazySizes.cfg.pf){\n\t\t\t\t\tassert.equal($image.attr('srcset') || $image.attr('data-risrcset') || $image.attr('data-pfsrcset'), 'data:,lazyimg100 100w, data:,lazyimg150 150w, data:,lazyimg200 200w');\n\t\t\t\t}\n\t\t\t\tassert.equal($image.prop('src'), nowSrc);\n\t\t\t};\n\t\t\tvar viewportTests = [\n\t\t\t\t['300', initialTest],\n\t\t\t\t['200', initialTest],\n\t\t\t\t['500', endTest]\n\t\t\t];\n\n\t\t\tvar run = function(){\n\t\t\t\tif(viewportTests.length){\n\t\t\t\t\tviewport = viewportTests.shift();\n\t\t\t\t\t$iframe.css('width', viewport[0]);\n\t\t\t\t} else {\n\t\t\t\t\tdone();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif(!window.devicePixelRatio){\n\t\t\t\tassert.ok(true);\n\t\t\t\tdone();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\trun();\n\n\t\t\t$picture.appendTo('body');\n\n\t\t\tassert.equal($source.attr('srcset'), null);\n\t\t\tassert.equal($image.attr('srcset'), null);\n\n\t\t\t$image.on('lazybeforesizes', function(e){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tassert.equal($source.attr('src'), null);\n\t\t\t\t\tassert.equal($source.attr('data-src'), null);\n\t\t\t\t\tviewport[1]();\n\t\t\t\t\trun();\n\t\t\t\t});\n\t\t\t});\n\n\t\t});\n\t}],\n\toptimumxRiasPictureResize: ['lazyloads constraints rias generated srcset on picture', function(assert){\n\t\tif(!supportsPicture){\n\t\t\tassert.ok(true);\n\t\t\treturn;\n\t\t}\n\t\tvar done = assert.async();\n\t\tvar $iframe = this.$iframe;\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar viewport;\n\t\t\tvar $picture = createPicture($, [\n\t\t\t\t{\n\t\t\t\t\t'data-srcset': 'data:,lazysource{width}',\n\t\t\t\t\tmedia: '(min-width: 0.5em)'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t'data-srcset': 'data:,lazyimg{width}',\n\t\t\t\t\t'data-optimumx': '0.5',\n\t\t\t\t\t'data-sizes': 'auto',\n\t\t\t\t\t'data-widths': '[100, 150, 280]',\n\t\t\t\t\t'class': 'lazyload'\n\t\t\t\t}\n\t\t\t]);\n\t\t\tvar $source = $picture.find('source');\n\t\t\tvar $image = $picture.find('img');\n\t\t\tvar initialTest = function(){\n\t\t\t\tvar nowSrc = window.HTMLPictureElement ?\n\t\t\t\t\t'' : 'data:,lazysource150';\n\t\t\t\tassert.equal($source.attr('srcset'), 'data:,lazysource100 100w, data:,lazysource150 150w');\n\t\t\t\tassert.equal($image.attr('srcset') || $image.attr('data-risrcset') || $image.attr('data-pfsrcset') || 'data:,lazyimg100 100w, data:,lazyimg150 150w', 'data:,lazyimg100 100w, data:,lazyimg150 150w');\n\t\t\t\tassert.equal($image.prop('src'), nowSrc);\n\t\t\t};\n\t\t\tvar endTest = function(){\n\t\t\t\tvar nowSrc = window.HTMLPictureElement ?\n\t\t\t\t\t'' : 'data:,lazysource280';\n\t\t\t\tassert.equal($source.attr('srcset'), 'data:,lazysource100 100w, data:,lazysource150 150w, data:,lazysource280 280w');\n\t\t\t\tassert.equal($image.attr('srcset') || $image.attr('data-risrcset') || $image.attr('data-pfsrcset') || 'data:,lazyimg100 100w, data:,lazyimg150 150w, data:,lazyimg280 280w', 'data:,lazyimg100 100w, data:,lazyimg150 150w, data:,lazyimg280 280w');\n\t\t\t\tassert.equal($image.prop('src'), nowSrc);\n\t\t\t};\n\t\t\tvar viewportTests = [\n\t\t\t\t['300', initialTest],\n\t\t\t\t['200', initialTest],\n\t\t\t\t['500', endTest]\n\t\t\t];\n\t\t\tvar run = function(){\n\t\t\t\tif(viewportTests.length){\n\t\t\t\t\tviewport = viewportTests.shift();\n\t\t\t\t\t$iframe.css('width', viewport[0]);\n\t\t\t\t} else {\n\t\t\t\t\tdone();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif(!window.devicePixelRatio){\n\t\t\t\tassert.ok(true);\n\t\t\t\tdone();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\trun();\n\n\t\t\t$picture.appendTo('body');\n\n\t\t\tassert.equal($source.attr('srcset'), null);\n\t\t\tassert.equal($image.attr('srcset'), null);\n\n\t\t\t$image.on('lazybeforesizes', function(e){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tassert.equal($source.attr('src'), null);\n\t\t\t\t\tassert.equal($source.attr('data-src'), null);\n\t\t\t\t\tviewport[1]();\n\t\t\t\t\trun();\n\t\t\t\t});\n\t\t\t});\n\n\t\t});\n\t}],\n\triasResize: ['lazysizes rias reacts on resize', function(assert){\n\t\tvar done = assert.async();\n\t\tvar $iframe = this.$iframe;\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar viewport, $image;\n\t\t\tvar initTest = function(){\n\t\t\t\tvar nowSrc = window.HTMLPictureElement ?\n\t\t\t\t\t'' : 'data:,img-small-yo';\n\t\t\t\tassert.equal($image.attr('srcset') || 'data:,img-1-yo 1w, data:,img-small-yo 500w, data:,img-large-yo 1200w', 'data:,img-1-yo 1w, data:,img-small-yo 500w, data:,img-large-yo 1200w');\n\t\t\t\tassert.equal($image.prop('src'), nowSrc);\n\t\t\t};\n\t\t\tvar largerTest = function(){\n\t\t\t\tvar nowSrc = window.HTMLPictureElement ?\n\t\t\t\t\t'' : 'data:,img-large-yo';\n\t\t\t\tassert.equal($image.attr('srcset') || 'data:,img-1-yo 1w, data:,img-small-yo 500w, data:,img-large-yo 1200w', 'data:,img-1-yo 1w, data:,img-small-yo 500w, data:,img-large-yo 1200w');\n\t\t\t\tassert.equal($image.prop('src'), nowSrc);\n\t\t\t};\n\t\t\tvar viewportTests = [\n\t\t\t\t['200', initTest],\n\t\t\t\t['250', initTest],\n\t\t\t\t['1200', largerTest],\n\t\t\t\t['800', largerTest]\n\t\t\t];\n\t\t\tvar run = function(){\n\t\t\t\tif(viewportTests.length){\n\t\t\t\t\tviewport = viewportTests.shift();\n\t\t\t\t\t$iframe.css('width', viewport[0]);\n\t\t\t\t} else {\n\t\t\t\t\tdone();\n\t\t\t\t}\n\t\t\t};\n\t\t\trun();\n\n\t\t\tframeWindow.document.addEventListener('lazyriasmodifyoptions', function(e){\n\t\t\t\t// change available widths and widthmap for .special-widths elements\n\t\t\t\te.detail.widthmap = {\n\t\t\t\t\t500: 'small',\n\t\t\t\t\t1200: 'large'\n\t\t\t\t};\n\n\t\t\t\t//add new custom property with value 'foo'\n\t\t\t\te.detail.foo = 'yo';\n\t\t\t});\n\n\t\t\t$image = $('<div style=\"width: 100%;\">' +\n\t\t\t'<img data-sizes=\"auto\" style=\"width: 90%;\" data-widths=\"[1, 500, 1200]\" data-src=\"data:,img-{width}-{foo}\" class=\"lazyload\" />' +\n\t\t\t'</div>')\n\t\t\t\t.appendTo('body')\n\t\t\t\t.find('img');\n\n\t\t\t$image.on('lazybeforesizes', function(e){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tviewport[1]();\n\t\t\t\t\trun();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}],\n\triasPictureResize: ['lazysizes rias reacts on resize and allows art direction', function(assert){\n\t\tvar done = assert.async();\n\t\tvar $iframe = this.$iframe;\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar viewport;\n\t\t\tvar initTest = function(){\n\t\t\t\tvar nowSrc = window.HTMLPictureElement ?\n\t\t\t\t\t'' : 'data:,lazysource900';\n\t\t\t\tassert.equal($image.attr('srcset') || 'data:,lazyimg900 900w, data:,lazyimg1500 1500w', 'data:,lazyimg900 900w, data:,lazyimg1500 1500w');\n\t\t\t\tassert.equal($source.attr('srcset'), 'data:,lazysource900 900w, data:,lazysource1500 1500w');\n\t\t\t\tassert.equal($image.prop('src'), nowSrc);\n\t\t\t};\n\t\t\tvar largerTest = function(){\n\t\t\t\tvar nowSrc = window.HTMLPictureElement ?\n\t\t\t\t\t'' : 'data:,lazyimg1500';\n\t\t\t\tassert.equal($image.attr('srcset') || 'data:,lazyimg900 900w, data:,lazyimg1500 1500w', 'data:,lazyimg900 900w, data:,lazyimg1500 1500w');\n\t\t\t\tassert.equal($source.attr('srcset'), 'data:,lazysource900 900w, data:,lazysource1500 1500w');\n\t\t\t\tassert.equal($image.prop('src'), nowSrc);\n\t\t\t};\n\t\t\tvar viewportTests = [\n\t\t\t\t['300', initTest],\n\t\t\t\t['400', initTest],\n\t\t\t\t['1500', largerTest],\n\t\t\t\t['1220', largerTest],\n\t\t\t\t['450', initTest]\n\t\t\t];\n\t\t\tvar run = function(){\n\t\t\t\tif(viewportTests.length){\n\t\t\t\t\tviewport = viewportTests.shift();\n\t\t\t\t\t$iframe.css('width', viewport[0]);\n\t\t\t\t} else {\n\t\t\t\t\tdone();\n\t\t\t\t}\n\t\t\t};\n\t\t\tvar $picture = createPicture($, [\n\t\t\t\t{\n\t\t\t\t\t'data-srcset': 'data:,lazysource{width}',\n\t\t\t\t\tmedia: '(max-width: 500px)'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t'data-srcset': 'data:,lazyimg{width}',\n\t\t\t\t\t'data-sizes': 'auto',\n\t\t\t\t\t'data-widths': '[900, 1500]',\n\t\t\t\t\t'class': 'lazyload'\n\t\t\t\t}\n\t\t\t]);\n\t\t\tvar $source = $picture.find('source');\n\t\t\tvar $image = $picture.find('img');\n\n\t\t\trun();\n\n\n\t\t\t$picture.appendTo('body');\n\n\t\t\t$image.on('lazybeforesizes', function(e){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tviewport[1]();\n\t\t\t\t\trun();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}],\n\triasReinit: ['lazysizes rias can be re-initialized', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar placeholderSrc, $image;\n\t\t\tvar initTest = function(){\n\t\t\t\tvar success = [\n\t\t\t\t\t{\n\t\t\t\t\t\tu: 'data:,img1-1',\n\t\t\t\t\t\tw: 1,\n\t\t\t\t\t\tc: 'data:,img1-1 1w'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tu: 'data:,img1-500',\n\t\t\t\t\t\tw: 500,\n\t\t\t\t\t\tc: 'data:,img1-500 500w'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tu: 'data:,img1-1200',\n\t\t\t\t\t\tw: 1200,\n\t\t\t\t\t\tc: 'data:,img1-1200 1200w'\n\t\t\t\t\t}\n\t\t\t\t];\n\t\t\t\tassert.propEqual(cleanUpDensity($image.prop('_lazyrias')), success);\n\t\t\t\tassert.equal($image.attr('srcset') || 'data:,img1-1 1w, data:,img1-500 500w, data:,img1-1200 1200w', 'data:,img1-1 1w, data:,img1-500 500w, data:,img1-1200 1200w');\n\t\t\t};\n\t\t\tvar reinitTest = function(){\n\t\t\t\tvar success = [\n\t\t\t\t\t{\n\t\t\t\t\t\tu: 'data:,img2-1',\n\t\t\t\t\t\tw: 1,\n\t\t\t\t\t\tc: 'data:,img2-1 1w'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tu: 'data:,img2-500',\n\t\t\t\t\t\tw: 500,\n\t\t\t\t\t\tc: 'data:,img2-500 500w'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tu: 'data:,img2-1200',\n\t\t\t\t\t\tw: 1200,\n\t\t\t\t\t\tc: 'data:,img2-1200 1200w'\n\t\t\t\t\t}\n\t\t\t\t];\n\t\t\t\tassert.propEqual(cleanUpDensity($image.prop('_lazyrias')), success);\n\t\t\t\tassert.equal($image.attr('srcset') || 'data:,img2-1 1w, data:,img2-500 500w, data:,img2-1200 1200w', 'data:,img2-1 1w, data:,img2-500 500w, data:,img2-1200 1200w');\n\t\t\t};\n\t\t\tvar test = [\n\t\t\t\t['data:,img1-{width}', initTest],\n\t\t\t\t['data:,img2-{width}', reinitTest]\n\t\t\t];\n\t\t\tvar run = function(){\n\t\t\t\tif(test.length){\n\t\t\t\t\tplaceholderSrc = test.shift();\n\n\t\t\t\t\tif(window.isTrident){\n\t\t\t\t\t\t$image.addClass('lazyerror');\n\t\t\t\t\t}\n\n\t\t\t\t\t$image\n\t\t\t\t\t\t.attr('data-src', placeholderSrc[0])\n\t\t\t\t\t\t.addClass('lazyload')\n\t\t\t\t\t;\n\t\t\t\t} else {\n\t\t\t\t\tdone();\n\t\t\t\t}\n\t\t\t};\n\t\t\t$image = $('<img data-sizes=\"auto\" style=\"width: 90%;\" data-widths=\"[1, 500, 1200]\" class=\"lazyload\" />');\n\n\t\t\t$image.on('lazybeforeunveil', function(e){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tplaceholderSrc[1]();\n\t\t\t\t\tsetTimeout(run, 17);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t$image.appendTo('body');\n\n\t\t\trun();\n\t\t});\n\t}],\n\toptimumxReinit: ['lazysizes optimumx can be re-initialized', _optimumxReinit(true)],\n\toptimumxAttrchangeReinit: ['lazysizes optimumx can be re-initialized', _optimumxReinit(false)],\n\triasAutoSizes: ['lazysizes rias works with autosizes simple sizes', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($){\n\t\t\tvar $image;\n\n\t\t\t$image = $('<img data-sizes=\"auto\" style=\"width: 100%;\" data-widths=\"[900]\" class=\"lazyload\" />')\n\t\t\t\t.attr('data-src', 'data:,image-{width}')\n\t\t\t\t.appendTo('body')\n\t\t\t;\n\n\t\t\t$image.on('lazybeforeunveil', function(e){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tassert.equal($image.prop('currentSrc') || $image.attr('src'), 'data:,image-900');\n\t\t\t\t\tdone();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}],\n\tnoscriptImg: ['noscript img', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar $noscript;\n\n\t\t\tvar errors = 0;\n\t\t\tvar onerror = function(){\n\t\t\t\terrors++;\n\t\t\t};\n\n\t\t\t$noscript = $('<div class=\"lazyload\" data-noscript=\"\"><noscript>' +\n\t\t\t\t'<img src=\"data:,img\" />' +\n\t\t\t\t'<img srcset=\"data:,img-w 300w\" />' +\n\t\t\t\t'</noscript></div>')\n\t\t\t\t.appendTo('body')\n\t\t\t;\n\n\t\t\tframeWindow.addEventListener('error', onerror);\n\n\t\t\t$noscript.on('lazybeforeunveil', function(e){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tassert.equal($noscript.find('img').attr('src'), 'data:,img');\n\t\t\t\t\tassert.equal(errors, 0);\n\t\t\t\t\tframeWindow.removeEventListener('error', onerror);\n\t\t\t\t\tdone();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}]\n});\n\n\nQUnit.module( \"optimumx\", {\n\tbeforeEach: createBeforeEach(\n\t\t{\n\t\t\tplugins: ['optimumx']\n\t\t}\n\t)\n});\nQUnit.test.apply(QUnit, lazyTests.simplePicture);\nQUnit.test.apply(QUnit, lazyTests.optimumxReinit);\n\nQUnit.module( \"optimumx + mini respimg polyfill\", {\n\tbeforeEach: createBeforeEach(\n\t\t{\n\t\t\tplugins: ['optimumx', 'respimg']\n\t\t}\n\t)\n});\nQUnit.test.apply(QUnit, lazyTests.optimumxPictureResize);\n\n\nQUnit.module( \"optimumx + respimage + respmutation\", {\n\tbeforeEach: createBeforeEach(\n\t\t{\n\t\t\tplugins: ['optimumx'],\n\t\t\tlibs: ['respimage', 'respmutation']\n\t\t}\n\t)\n});\nQUnit.test.apply(QUnit, lazyTests.optimumxPictureResize);\n\nQUnit.module( \"optimumx + rias\", {\n\tbeforeEach: createBeforeEach(\n\t\t{\n\t\t\tplugins: ['optimumx', 'rias']\n\t\t}\n\t)\n});\nQUnit.test.apply(QUnit, lazyTests.optimumxRiasPictureResize);\nQUnit.test.apply(QUnit, lazyTests.riasResize);\nQUnit.test.apply(QUnit, lazyTests.riasPictureResize);\nQUnit.test.apply(QUnit, lazyTests.simplePicture);\nQUnit.test.apply(QUnit, lazyTests.riasReinit);\nQUnit.test.apply(QUnit, lazyTests.riasAutoSizes);\n\nQUnit.module( \"optimumx + rias + respimage\", {\n\tbeforeEach: createBeforeEach(\n\t\t{\n\t\t\tplugins: ['optimumx', 'rias'],\n\t\t\tlibs: ['respimage']\n\t\t}\n\t)\n});\nQUnit.test.apply(QUnit, lazyTests.optimumxPictureResize);\nQUnit.test.apply(QUnit, lazyTests.riasResize);\nQUnit.test.apply(QUnit, lazyTests.riasPictureResize);\nQUnit.test.apply(QUnit, lazyTests.simpleAutoSizesPicture);\nQUnit.test.apply(QUnit, lazyTests.riasReinit);\nQUnit.test.apply(QUnit, lazyTests.riasAutoSizes);\n\nQUnit.module( \"rias\", {\n\tbeforeEach: createBeforeEach(\n\t\t{\n\t\t\tplugins: ['rias']\n\t\t}\n\t)\n});\nQUnit.test.apply(QUnit, lazyTests.riasResize);\nQUnit.test.apply(QUnit, lazyTests.riasPictureResize);\nQUnit.test.apply(QUnit, lazyTests.simplePicture);\nQUnit.test.apply(QUnit, lazyTests.riasReinit);\nQUnit.test.apply(QUnit, lazyTests.riasAutoSizes);\n\nQUnit.module( \"rias + respimage\", {\n\tbeforeEach: createBeforeEach(\n\t\t{\n\t\t\tplugins: ['optimumx', 'rias'],\n\t\t\tlibs: ['respimage']\n\t\t}\n\t)\n});\nQUnit.test.apply(QUnit, lazyTests.riasResize);\nQUnit.test.apply(QUnit, lazyTests.riasPictureResize);\nQUnit.test.apply(QUnit, lazyTests.riasReinit);\nQUnit.test.apply(QUnit, lazyTests.riasAutoSizes);\n\nQUnit.module( \"mini respimg polyfill\", {\n\tbeforeEach: createBeforeEach(\n\t\t{\n\t\t\tplugins: ['respimg']\n\t\t}\n\t)\n});\nQUnit.test.apply(QUnit, lazyTests.simplePicture);\nQUnit.test.apply(QUnit, lazyTests.simpleAutoSizesPicture);\nQUnit.test.apply(QUnit, lazyTests.simpleSrcset);\nQUnit.test.apply(QUnit, lazyTests.simpleSrcsetSrc);\n\nQUnit.module( \"noscript\", {\n\tbeforeEach: createBeforeEach(\n\t\t{\n\t\t\tplugins: ['noscript']\n\t\t}\n\t)\n});\nQUnit.test.apply(QUnit, lazyTests.noscriptImg);\n\nQUnit.module( \"attrchange + rias\", {\n\tbeforeEach: createBeforeEach(\n\t\t{\n\t\t\tplugins: ['attrchange', 'rias']\n\t\t}\n\t)\n});\nQUnit.test.apply(QUnit, lazyTests.riasResize);\nQUnit.test.apply(QUnit, lazyTests.riasPictureResize);\nQUnit.test.apply(QUnit, lazyTests.riasReinit);\n\nQUnit.module( \"attrchange + optimumx mix\", {\n\tbeforeEach: createBeforeEach(\n\t\t{\n\t\t\tplugins: ['attrchange', 'optimumx']\n\t\t}\n\t)\n});\n\nQUnit.test.apply(QUnit, lazyTests.optimumxReinit);\nQUnit.test.apply(QUnit, lazyTests.optimumxAttrchangeReinit);\n\nQUnit.module( \"parentFit + bgset + optimumx\", {\n\tbeforeEach: createBeforeEach(\n\t\t{\n\t\t\tplugins: ['optimumx', 'parentFit', 'bgset'],\n\t\t\tlibs: ['respimage']\n\t\t}\n\t)\n});\nQUnit.test.apply(QUnit, lazyTests.bgsetParentFit);\n\nQUnit.module( \"parentFit + bgset + respimg\", {\n\tbeforeEach: createBeforeEach(\n\t\t{\n\t\t\tplugins: ['parentFit', 'bgset', 'respimg']\n\t\t}\n\t)\n});\nQUnit.test.apply(QUnit, lazyTests.bgsetParentFit);\n\n\n\n\n"
  },
  {
    "path": "tests/functional-tests.js",
    "content": "window.lazyTests = {\n\tsimpleView: ['lazyloads simple image in view', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($){\n\t\t\tvar initialSrc = 'data:initial';\n\t\t\tvar lazySrc = 'data:,lazysrc';\n\t\t\tvar $topImage = $('<img />')\n\t\t\t\t\t.attr({\n\t\t\t\t\t\tsrc: initialSrc,\n\t\t\t\t\t\t'data-src': lazySrc,\n\t\t\t\t\t\t'class': 'lazyload'\n\t\t\t\t\t}).appendTo('body')\n\t\t\t\t;\n\n\t\t\tassert.equal($topImage.attr('src'), initialSrc);\n\n\t\t\t$topImage.on('lazybeforeunveil', function(){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tassert.equal($topImage.attr('src'), lazySrc);\n\t\t\t\t\tdone();\n\t\t\t\t}, 140);\n\t\t\t});\n\t\t});\n\t}],\n\tsimpleScrollView: ['lazyloads simple image after it scrolls near to view', function(assert){\n\t\tif(/mobi/i.test(navigator.userAgent)){\n\t\t\tassert.ok(true);\n\t\t\treturn;\n\t\t}\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar initialSrc = 'data:initial';\n\t\t\tvar lazySrc = 'data:,lazysrc';\n\t\t\tvar $topImage = $('<img />')\n\t\t\t\t\t.attr({\n\t\t\t\t\t\tsrc: initialSrc,\n\t\t\t\t\t\t'data-src': lazySrc,\n\t\t\t\t\t\t'class': 'lazyload'\n\t\t\t\t\t})\n\t\t\t\t\t.css({\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: 1999\n\t\t\t\t\t})\n\t\t\t\t\t.appendTo('body')\n\t\t\t\t;\n\n\t\t\tassert.equal($topImage.attr('src'), initialSrc);\n\n\t\t\tsetTimeout(function(){\n\t\t\t\tassert.equal($topImage.attr('src'), initialSrc);\n\t\t\t}, 70);\n\n\t\t\tsetTimeout(function(){\n\t\t\t\t$(frameWindow).scrollTop(1900);\n\t\t\t}, 70);\n\n\t\t\t$topImage.on('lazybeforeunveil', function(){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tassert.equal($topImage.attr('src'), lazySrc);\n\t\t\t\t\tdone();\n\t\t\t\t}, 140);\n\t\t\t});\n\t\t});\n\t}],\n\tsimpleAnimateView: ['lazyloads simple image after it animates near to view', function(assert){\n\t\tif(/mobi/i.test(navigator.userAgent)){\n\t\t\tassert.ok(true);\n\t\t\treturn;\n\t\t}\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar initialSrc = 'data:initial';\n\t\t\tvar lazySrc = 'data:,lazysrc';\n\t\t\tvar $topImage = $('<img />')\n\t\t\t\t\t.attr({\n\t\t\t\t\t\tsrc: initialSrc,\n\t\t\t\t\t\t'data-src': lazySrc,\n\t\t\t\t\t\t'class': 'lazyload'\n\t\t\t\t\t})\n\t\t\t\t\t.css({\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: 9999\n\t\t\t\t\t})\n\t\t\t\t\t.appendTo('body')\n\t\t\t\t;\n\n\t\t\tassert.equal($topImage.attr('src'), initialSrc);\n\n\t\t\tsetTimeout(function(){\n\t\t\t\tassert.equal($topImage.attr('src'), initialSrc);\n\t\t\t}, 70);\n\n\t\t\tsetTimeout(function(){\n\t\t\t\t$topImage.animate({top: 0}, {duration: 50});\n\t\t\t}, 70);\n\n\t\t\t$topImage.on('lazybeforeunveil', function(){\n\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tassert.equal($topImage.attr('src'), lazySrc);\n\t\t\t\t\tdone();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}],\n\tsimpleAutoSizes: ['takes width of image and adds it to the sizes attribute', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($){\n\t\t\tvar $topImage = $('<div style=\"width: 200px;\">' +\n\t\t\t'<img data-sizes=\"auto\" style=\"width: 50%;\" class=\"lazyload\" />' +\n\t\t\t'</div>')\n\t\t\t\t.appendTo('body')\n\t\t\t\t.find('img');\n\n\t\t\t$topImage.on('lazybeforeunveil', function(){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tassert.equal($topImage.attr('sizes'), '100px');\n\t\t\t\t\tdone();\n\t\t\t\t}, 140);\n\t\t\t});\n\t\t});\n\t}],\n\tautoSizesEvent: ['lazybeforesizes event allows modifying sizes attribute', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($){\n\t\t\tvar $topImage = $('<div style=\"width: 200px;\">' +\n\t\t\t'<img data-sizes=\"auto\" style=\"width: 50%;\" class=\"lazyload\" />' +\n\t\t\t'</div>')\n\t\t\t\t.appendTo('body')\n\t\t\t\t.find('img');\n\n\t\t\t$topImage.on('lazybeforesizes', function(e){\n\t\t\t\te.originalEvent.detail.width = 12;\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tassert.equal($topImage.attr('sizes'), '12px');\n\t\t\t\t\tdone();\n\t\t\t\t}, 140);\n\t\t\t});\n\t\t});\n\t}],\n\tautoSizesResize: ['lazysizes reacts on resize', function(assert){\n\t\tvar done = assert.async();\n\t\tvar $iframe = this.$iframe;\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar viewport;\n\t\t\tvar $topImage;\n\t\t\tvar respimgCalls = 0;\n\t\t\tvar repimgExpectedCalls = window.supportsPicture ? 0 : 3;\n\n\t\t\tvar viewportTests = [\n\t\t\t\t['300', 150],\n\t\t\t\t['400', 200],\n\t\t\t\t['200', 100],\n\t\t\t\t['400', 200]\n\t\t\t];\n\t\t\tvar run = function(){\n\t\t\t\tif(viewportTests.length){\n\t\t\t\t\tviewport = viewportTests.shift();\n\t\t\t\t\t$iframe.css('width', viewport[0]);\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\t$topImage.off('lazybeforesizes.test');\n\t\t\t\t\t\tassert.equal(respimgCalls, repimgExpectedCalls);\n\t\t\t\t\t\tdone();\n\t\t\t\t\t}, 99);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tframeWindow.picturefill = function(){\n\t\t\t\trespimgCalls++;\n\t\t\t};\n\n\t\t\trun();\n\n\t\t\tafterUnveil(function(){\n\t\t\t\t$topImage = $('<div style=\"width: 100%;\">' +\n\t\t\t\t'<img data-sizes=\"auto\" style=\"width: 50%;\" class=\"lazyload\" />' +\n\t\t\t\t'</div>')\n\t\t\t\t\t.appendTo('body')\n\t\t\t\t\t.find('img');\n\n\t\t\t\t$topImage.on('lazybeforesizes.test', function(e){\n\t\t\t\t\tconsole.log('viewport width: '+ $topImage.width())\n\t\t\t\t\tafterUnveil(function(){\n\t\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\t\tassert.equal($topImage.attr('sizes'), viewport[1]+'px');\n\t\t\t\t\t\t\trun();\n\t\t\t\t\t\t}, 99);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}],\n\tparentAutoSizes: ['takes width of parent of image and adds it to the sizes attribute2', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($){\n\t\t\tvar $topImage = $('<div style=\"width: 200px; min-width: 200px;\">' +\n\t\t\t'<img data-sizes=\"auto\" style=\"width: 1px; display: inline; margin: 5px;\" class=\"lazyload\" alt=\"\" />' +\n\t\t\t'</div>').find('img');\n\n\t\t\t$topImage.on('lazybeforeunveil', function(){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tassert.equal($topImage.attr('sizes'), '200px');\n\t\t\t\t\tdone();\n\t\t\t\t});\n\t\t\t});\n\t\t\t$topImage.parent().appendTo('body');\n\t\t});\n\t}],\n\tsimplePicture: ['lazyloads srcset on picture (simplePicture)', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar $picture = createPicture($, [\n\t\t\t\t{\n\t\t\t\t\t'data-srcset': 'data:,lazysource 200w'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t'data-srcset': 'data:,lazyimg 200w',\n\t\t\t\t\t'class': 'lazyload'\n\t\t\t\t}\n\t\t\t]);\n\t\t\tvar $source = $picture.find('source');\n\t\t\tvar $image = $picture.find('img');\n\n\t\t\t$picture.appendTo('body');\n\n\t\t\tassert.equal($source.attr('srcset'), null);\n\t\t\tassert.equal($image.attr('srcset'), null);\n\n\t\t\t$image.on('lazybeforeunveil', function(){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tvar hasPolyfill = frameWindow.respimage || frameWindow.picturefill || frameWindow.lazySizes.cfg.pf;\n\n\t\t\t\t\tassert.equal($source.attr('srcset'), 'data:,lazysource 200w');\n\t\t\t\t\tassert.equal($image.attr('srcset') || $image.attr('data-risrcset') || $image.attr('data-pfsrcset'), 'data:,lazyimg 200w');\n\t\t\t\t\tassert.equal($image.prop('src'), window.HTMLPictureElement || !hasPolyfill ?  '' : 'data:,lazysource');\n\t\t\t\t\tdone();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}],\n\tsimpleAutoSizesPicture: ['lazyloads srcset on picture (simpleAutoSizesPicture)', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar $picture = createPicture($, [\n\t\t\t\t{\n\t\t\t\t\t'data-srcset': 'data:,lazysource 200w'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t'data-srcset': 'data:,lazyimg 200w',\n\t\t\t\t\t'class': 'lazyload',\n\t\t\t\t\t'data-sizes': 'auto'\n\t\t\t\t}\n\t\t\t]);\n\t\t\tvar $source = $picture.find('source');\n\t\t\tvar $image = $picture.find('img');\n\n\t\t\t$picture.appendTo('body');\n\n\t\t\tassert.equal($source.attr('srcset'), null);\n\t\t\tassert.equal($image.attr('srcset'), null);\n\t\t\tassert.equal($image.attr('sizes'), null);\n\n\t\t\t$image.on('lazybeforeunveil', function(){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tvar haspolyfill = frameWindow.respimage || frameWindow.picturefill || (frameWindow.lazySizes.cfg.rias && frameWindow.lazySizes.pWS) || frameWindow.lazySizes.cfg.pf;\n\n\t\t\t\t\tassert.equal($source.attr('srcset'), 'data:,lazysource 200w');\n\t\t\t\t\tassert.equal($source.attr('sizes'), $image.attr('sizes'));\n\t\t\t\t\tassert.equal($image.attr('srcset') || $image.attr('data-risrcset') || $image.attr('data-pfsrcset'), 'data:,lazyimg 200w');\n\t\t\t\t\tassert.equal($image.prop('src'), window.HTMLPictureElement || !haspolyfill ?  '' : 'data:,lazysource');\n\t\t\t\t\tassert.equal($image.attr('sizes'), '300px');\n\t\t\t\t\tdone();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}],\n\tsimpleSrcset: ['lazyloads srcset', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar initialSrc = 'data:initial';\n\t\t\tvar lazySrcset = 'data:,lazysrcset 300w';\n\t\t\tvar $topImage = $('<img />')\n\t\t\t\t\t.attr({\n\t\t\t\t\t\tsrc: initialSrc,\n\t\t\t\t\t\t'data-srcset': lazySrcset,\n\t\t\t\t\t\t'class': 'lazyload',\n\t\t\t\t\t\tsizes: '100vw'\n\t\t\t\t\t}).appendTo('body')\n\t\t\t\t;\n\n\t\t\tassert.equal($topImage.attr('src'), initialSrc);\n\t\t\tassert.equal($topImage.attr('srcset'), null);\n\n\t\t\t$topImage.on('lazybeforeunveil', function(){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tvar haspolyfill = frameWindow.respimage || frameWindow.picturefill || (frameWindow.lazySizes.cfg.rias && frameWindow.lazySizes.pWS) || frameWindow.lazySizes.cfg.pf;\n\t\t\t\t\tvar nowSrc =  window.HTMLPictureElement || !haspolyfill ?\n\t\t\t\t\t\tinitialSrc :\n\t\t\t\t\t\t'data:,lazysrcset';\n\n\t\t\t\t\tassert.equal($topImage.attr('srcset') || $topImage.attr('data-risrcset') || $topImage.attr('data-pfsrcset'), lazySrcset);\n\t\t\t\t\tassert.equal($topImage.prop('src'), nowSrc);\n\t\t\t\t\tdone();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}],\n\tsimpleSrcsetSrc: ['lazyloads srcset or src (simpleSrcsetSrc)', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar initialSrc = 'data:,initial';\n\t\t\tvar lazySrcset = 'data:,lazysrcset 300w';\n\t\t\tvar lazySrc = 'data:,lazysrc';\n\t\t\tvar $topImage = $('<img />')\n\t\t\t\t\t.attr({\n\t\t\t\t\t\tsrc: initialSrc,\n\t\t\t\t\t\t'data-srcset': lazySrcset,\n\t\t\t\t\t\t'data-src': lazySrc,\n\t\t\t\t\t\t'class': 'lazyload',\n\t\t\t\t\t\tsizes: '100vw'\n\t\t\t\t\t}).appendTo('body')\n\t\t\t\t;\n\n\t\t\tassert.equal($topImage.prop('src'), initialSrc);\n\t\t\tassert.equal($topImage.attr('srcset'), null);\n\n\t\t\t$topImage.on('lazybeforeunveil', function(){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tvar nowSrc;\n\t\t\t\t\tvar haspolyfill = frameWindow.respimage || frameWindow.picturefill || (frameWindow.lazySizes.cfg.rias && frameWindow.lazySizes.pWS) || frameWindow.lazySizes.cfg.pf;\n\n\t\t\t\t\tif(window.supportsPicture){\n\t\t\t\t\t\tnowSrc = lazySrc;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnowSrc = haspolyfill ? 'data:,lazysrcset' : lazySrc;\n\t\t\t\t\t}\n\n\t\t\t\t\tassert.equal($topImage.attr('srcset') || $topImage.attr('data-risrcset') || $topImage.attr('data-pfsrcset'), lazySrcset);\n\t\t\t\t\tassert.equal($topImage.prop('src'), nowSrc);\n\t\t\t\t\tdone();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}],\n\textendedSrcsetSrc: ['lazyloads srcset or src (extendedSrcsetSrc)', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar initialSrc = 'data:,initial';\n\t\t\tvar lazySrcset = 'data:,lazysrcset 300w';\n\t\t\tvar lazySrc = 'data:,lazysrc';\n\t\t\tvar $topImage = $('<img />')\n\t\t\t\t\t.attr({\n\t\t\t\t\t\tsrc: initialSrc,\n\t\t\t\t\t\t'data-srcset': lazySrcset,\n\t\t\t\t\t\t'data-src': lazySrc,\n\t\t\t\t\t\t'class': 'lazyload',\n\t\t\t\t\t\tsizes: '100vw'\n\t\t\t\t\t}).appendTo('body')\n\t\t\t\t;\n\n\t\t\tframeWindow.picturefill = function(){\n\n\t\t\t};\n\n\t\t\tassert.equal($topImage.prop('src'), initialSrc);\n\t\t\tassert.equal($topImage.attr('srcset'), null);\n\n\t\t\t$topImage.on('lazybeforeunveil', function(){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tvar nowSrc;\n\t\t\t\t\tif(window.supportsPicture){\n\t\t\t\t\t\tnowSrc = lazySrc;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnowSrc = initialSrc;\n\t\t\t\t\t}\n\n\t\t\t\t\tassert.equal($topImage.attr('srcset') || $topImage.attr('data-risrcset') || $topImage.attr('data-pfsrcset'), lazySrcset);\n\t\t\t\t\tassert.equal($topImage.prop('src'), nowSrc);\n\t\t\t\t\tdone();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}],\n\textendedPictureSrcsetSrc: ['lazyloads picture srcset or src', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar initialSrc = 'data:,initial';\n\t\t\tvar lazySrcset = 'data:,lazysrcset 300w';\n\t\t\tvar lazySrc = 'data:,lazysrc';\n\t\t\tvar $picture = createPicture($, [\n\t\t\t\t{\n\t\t\t\t\t'data-srcset': 'data:,lazysource 200w'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tsrc: initialSrc,\n\t\t\t\t\t'data-srcset': lazySrcset,\n\t\t\t\t\t'data-src': lazySrc,\n\t\t\t\t\t'class': 'lazyload',\n\t\t\t\t\tsizes: '100vw'\n\t\t\t\t}\n\t\t\t]);\n\t\t\tvar $topImage = $picture.find('img');\n\n\t\t\tframeWindow.picturefill = function(){};\n\n\t\t\t$picture.appendTo('body');\n\t\t\tassert.equal($topImage.prop('src'), initialSrc);\n\t\t\tassert.equal($topImage.attr('srcset'), null);\n\n\t\t\t$topImage.on('lazybeforeunveil', function(){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tvar nowSrc;\n\t\t\t\t\tif(window.supportsPicture){\n\t\t\t\t\t\tnowSrc = lazySrc;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnowSrc = initialSrc;\n\t\t\t\t\t}\n\n\t\t\t\t\tassert.equal($topImage.attr('srcset') || $topImage.attr('data-risrcset') || $topImage.attr('data-pfsrcset'), lazySrcset);\n\t\t\t\t\tassert.equal($topImage.prop('src'), nowSrc);\n\t\t\t\t\tdone();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}],\n\textendedPictureSrc: ['lazyloads picture src', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($, frameWindow){\n\t\t\tvar initialSrc = 'data:,initial';\n\t\t\tvar lazySrc = 'data:,lazysrc';\n\t\t\tvar $picture = createPicture($, [\n\t\t\t\t{\n\t\t\t\t\t'data-srcset': 'data:,lazysource 200w'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tsrc: initialSrc,\n\t\t\t\t\t'data-src': lazySrc,\n\t\t\t\t\t'class': 'lazyload',\n\t\t\t\t\tsizes: '100vw'\n\t\t\t\t}\n\t\t\t]);\n\t\t\tvar $topImage = $picture.find('img');\n\n\t\t\tframeWindow.picturefill = function(){};\n\n\t\t\t$picture.appendTo('body');\n\t\t\tassert.equal($topImage.prop('src'), initialSrc);\n\n\t\t\t$topImage.on('lazybeforeunveil', function(){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tvar nowSrc;\n\t\t\t\t\tif(window.supportsPicture){\n\t\t\t\t\t\tnowSrc = lazySrc;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnowSrc = initialSrc;\n\t\t\t\t\t}\n\n\t\t\t\t\tassert.equal($topImage.prop('src'), nowSrc);\n\t\t\t\t\tdone();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}],\n\tnestedOverflow: ['lazyload detects nested overflow with [data-expand]', function(assert){\n\t\tvar done = assert.async();\n\n\t\tthis.promise.always(function($){\n\t\t\tvar initialSrc = 'data:,initial';\n\t\t\tvar lazySrc = 'data:,lazysrc';\n\t\t\tvar $topImage = $('<div style=\"position: relative; overflow: scroll; height: 40px;\">' +\n\t\t\t\t'<img /></div>')\n\t\t\t\t\t.appendTo('body')\n\t\t\t\t\t.find('img')\n\t\t\t\t\t.attr({\n\t\t\t\t\t\tsrc: initialSrc,\n\t\t\t\t\t\t'data-src': lazySrc,\n\t\t\t\t\t\t'class': 'lazyload',\n\t\t\t\t\t\t'data-expand': -1,\n\t\t\t\t\t\tstyle: 'position: relative; top: 100px;'\n\t\t\t\t\t})\n\t\t\t\t;\n\n\t\t\tassert.equal($topImage.prop('src'), initialSrc);\n\n\t\t\tsetTimeout(function(){\n\t\t\t\tassert.equal($topImage.prop('src'), initialSrc);\n\t\t\t\t$topImage.css({top: 50});\n\t\t\t}, 70);\n\t\t\tsetTimeout(function(){\n\t\t\t\tassert.equal($topImage.prop('src'), initialSrc);\n\t\t\t\t$topImage.css({top: 0});\n\t\t\t}, 140);\n\n\t\t\t$topImage.on('lazybeforeunveil', function(){\n\t\t\t\tafterUnveil(function(){\n\t\t\t\t\tassert.equal($topImage.prop('src'), lazySrc);\n\t\t\t\t\tdone();\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}]\n};\n\n\nQUnit.module( \"clean lazySizes\", {\n\tbeforeEach: createBeforeEach()\n});\nQUnit.test.apply(QUnit, lazyTests.simpleView);\nQUnit.test.apply(QUnit, lazyTests.simpleScrollView);\nQUnit.test.apply(QUnit, lazyTests.simpleAnimateView);\nQUnit.test.apply(QUnit, lazyTests.simpleAutoSizes);\nQUnit.test.apply(QUnit, lazyTests.parentAutoSizes);\nQUnit.test.apply(QUnit, lazyTests.simpleSrcset);\nQUnit.test.apply(QUnit, lazyTests.simpleSrcsetSrc);\nQUnit.test.apply(QUnit, lazyTests.extendedSrcsetSrc);\nQUnit.test.apply(QUnit, lazyTests.extendedPictureSrc);\nQUnit.test.apply(QUnit, lazyTests.extendedPictureSrcsetSrc);\nQUnit.test.apply(QUnit, lazyTests.nestedOverflow);\nQUnit.test.apply(QUnit, lazyTests.autoSizesEvent);\nQUnit.test.apply(QUnit, lazyTests.autoSizesResize);\nQUnit.test.apply(QUnit, lazyTests.simplePicture);\nQUnit.test.apply(QUnit, lazyTests.simpleAutoSizesPicture);\n\n\nQUnit.module( \"lazySizes with respimage\", {\n\tbeforeEach: createBeforeEach({libs: ['respimage']})\n});\nQUnit.test.apply(QUnit, lazyTests.simpleView);\nQUnit.test.apply(QUnit, lazyTests.simpleScrollView);\nQUnit.test.apply(QUnit, lazyTests.simpleSrcset);\nQUnit.test.apply(QUnit, lazyTests.simpleSrcsetSrc);\nQUnit.test.apply(QUnit, lazyTests.autoSizesResize);\nQUnit.test.apply(QUnit, lazyTests.simpleAutoSizesPicture);\n\n\nQUnit.module( \"lazySizes + options + respimage + respmutation\", {\n\tbeforeEach: createBeforeEach({libs: ['respimage', 'respmutation']})\n});\nQUnit.test.apply(QUnit, lazyTests.simpleView);\nQUnit.test.apply(QUnit, lazyTests.simpleScrollView);\nQUnit.test.apply(QUnit, lazyTests.simpleSrcset);\nQUnit.test.apply(QUnit, lazyTests.simpleSrcsetSrc);\nQUnit.test.apply(QUnit, lazyTests.autoSizesEvent);\nQUnit.test.apply(QUnit, lazyTests.autoSizesResize);\nQUnit.test.apply(QUnit, lazyTests.simplePicture);\nQUnit.test.apply(QUnit, lazyTests.simpleAutoSizesPicture);\n\n"
  },
  {
    "path": "tests/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title></title>\n    <link rel=\"stylesheet\" href=\"../node_modules/qunitjs/qunit/qunit.css\" />\n    <style>\n        #test-iframe {\n            position: absolute;\n            overflow: auto;\n            right: 0;\n            bottom: 0;\n            top: auto;\n            left: auto;\n            width: 300px;\n            height: 300px;\n            border: 2px solid #00498f;\n            opacity: 0.2;\n        }\n        #test-iframe:hover {\n            opacity: 1;\n        }\n\n        #qunit {\n            position: relative;\n        }\n        #qunit:hover {\n            z-index: 9;\n        }\n    </style>\n</head>\n<body>\n<div id=\"qunit\"></div>\n<div id=\"qunit-fixture\"></div>\n<iframe id=\"test-iframe\"></iframe>\n<script src=\"../node_modules/qunitjs/qunit/qunit.js\"></script>\n<script src=\"../node_modules/jquery/dist/jquery.js\"></script>\n<script src=\"test-helper.js\"></script>\n<script src=\"functional-tests.js\"></script>\n<script src=\"functional-tests-plugins.js\"></script>\n</body>\n</html>\n\n\n"
  },
  {
    "path": "tests/test-files/content-file.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title></title>\n\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n        }\n\n        img {\n            display: block;\n            width: 100%;\n            height: 200px;\n        }\n    </style>\n    <script>\n        function loadJS(u){var r=document.getElementsByTagName(\"script\")[0],s=document.createElement(\"script\");s.src=u;r.parentNode.insertBefore(s,r);}\n\n        if(!window.matchMedia){loadJS(\"matchMedia.js\");}\n\n    </script>\n    <script src=\"../../node_modules/jquery/dist/jquery.js\"></script>\n    <script src=\"../../node_modules/jquery-deparam/jquery-deparam.js\"></script>\n    <script>\n        var liblist = {\n            respimage: '../../node_modules/respimage/respimage.js',\n            picturefill: '../../node_modules/picturefill/dist/picturefill.js',\n            respmutation: '../../node_modules/respimage/plugins/mutation/ri.mutation.js',\n            respintrinsic: '../../node_modules/respimage/plugins/intrinsic-dimension/ri.intrinsic.js',\n        };\n        var pluginlist = {\n            optimumx: '../../plugins/optimumx/ls.optimumx.js',\n            rias: '../../plugins/rias/ls.rias.js',\n            noscript: '../../plugins/noscript/ls.noscript.js',\n            respimg: '../../plugins/respimg/ls.respimg.js',\n            attrchange: '../../plugins/attrchange/ls.attrchange.js',\n            bgset: '../../plugins/bgset/ls.bgset.js',\n            parentFit: '../../plugins/parent-fit/ls.parent-fit.js',\n        };\n        var params = deparam(location.search.replace(/^\\?/, ''));\n        window.lazySizesConfig = params.cfg || {};\n\n        if(params.libs){\n            params.libs.forEach(function(lib){\n                //for real tests, test once with respimage and once with picturefill\n                if(lib == 'respimage' && Math.random() > 0.4 && params.libs.indexOf('respmutation') == -1 && params.libs.indexOf('respintrinsic') == -1){\n                    lib = 'picturefill';\n                }\n                document.write('<script src=\"' + (liblist[lib] || lib) + '\"><\\/script>');\n            });\n        }\n\n\n    </script>\n\n    <script src=\"../../lazysizes.js\"></script>\n    <script>\n        if(params.plugins){\n            params.plugins.forEach(function(plugin){\n                document.write('<script src=\"' + (pluginlist[plugin] || plugin) + '\"><\\/script>');\n            });\n        }\n    </script>\n\n</head>\n<body>\n\n</body>\n</html>\n"
  },
  {
    "path": "tests/test-files/matchMedia.js",
    "content": "/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */\n\nwindow.matchMedia || (window.matchMedia = function() {\n    \"use strict\";\n\n    // For browsers that support matchMedium api such as IE 9 and webkit\n    var styleMedia = (window.styleMedia || window.media);\n\n    // For those that don't support matchMedium\n    if (!styleMedia) {\n        var style       = document.createElement('style'),\n            script      = document.getElementsByTagName('script')[0],\n            info        = null;\n\n        style.type  = 'text/css';\n        style.id    = 'matchmediajs-test';\n\n        script.parentNode.insertBefore(style, script);\n\n        // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers\n        info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle;\n\n        styleMedia = {\n            matchMedium: function(media) {\n                var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';\n\n                // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers\n                if (style.styleSheet) {\n                    style.styleSheet.cssText = text;\n                } else {\n                    style.textContent = text;\n                }\n\n                // Test if media query is true or false\n                return info.width === '1px';\n            }\n        };\n    }\n\n    return function(media) {\n        return {\n            matches: styleMedia.matchMedium(media || 'all'),\n            media: media || 'all'\n        };\n    };\n}());\n"
  },
  {
    "path": "tests/test-helper.js",
    "content": "(function(){\n\t'use strict';\n\tvar source = document.createElement('source');\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n\twindow.createBeforeEach = function(params){\n\t\tparams = $.param(params || {});\n\t\treturn function(){\n\t\t\tvar that = this;\n\t\t\tthis.promise = $.Deferred();\n\t\t\tthis.$iframe = $('#test-iframe');\n\n\n\t\t\tthis.$iframe.css({width: 300, height: 300});\n\n\t\t\tthis.$iframe.one('load', function(){\n\t\t\t\tthat.promise.resolveWith(that, [that.$iframe.prop('contentWindow').jQuery, that.$iframe.prop('contentWindow')]);\n\t\t\t});\n\n\t\t\tthis.$iframe.prop('src', 'test-files/content-file.html?'+params);\n\t\t};\n\t};\n\n\twindow.createPicture = function($, srces){\n\t\tvar $picture = $('<picture />');\n\t\t$.each(srces, function(i, attrs){\n\t\t\tvar $elem;\n\t\t\tif(i >= srces.length -1){\n\t\t\t\t$elem = 'img';\n\t\t\t} else {\n\t\t\t\t$elem = 'source';\n\t\t\t}\n\t\t\t$elem = $('<' + $elem + '/>');\n\t\t\t$picture.append($elem);\n\t\t\t$elem.attr(attrs);\n\t\t});\n\t\treturn $picture;\n\t};\n\twindow.cleanUpDensity = function(ar){\n\t\t(ar || []).forEach(function(obj){\n\t\t\tif(obj.d){\n\t\t\t\tdelete obj.d;\n\t\t\t}\n\t\t\tif(obj.cached){\n\t\t\t\tdelete obj.cached;\n\t\t\t}\n\t\t});\n\t\treturn ar;\n\t};\n\n\twindow.isTrident = /rident/.test(navigator.userAgent);\n\twindow.bustedSrcset = (('srcset' in document.createElement('img')) && !('sizes' in document.createElement('img')));\n\twindow.supportsPicture = !window.bustedSrcset && window.HTMLPictureElement;\n\twindow.afterUnveil = (function(){\n\t\treturn function(fn, delay){\n\t\t\tsetTimeout(function(){\n\t\t\t\trequestAnimationFrame(function(){\n\t\t\t\t\tsetTimeout(fn,0);\n\t\t\t\t});\n\t\t\t}, delay || 9);\n\t\t};\n\t})();\n})();\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n\t// Change this to match your project\n\t\"include\": [\"lazysizes.js\"],\n\t\"compilerOptions\": {\n\t\t// Tells TypeScript to read JS files, as\n\t\t// normally they are ignored as source files\n\t\t\"allowJs\": true,\n\t\t// Generate d.ts files\n\t\t\"declaration\": true,\n\t\t// This compiler run should\n\t\t// only output d.ts files\n\t\t\"emitDeclarationOnly\": true,\n\t}\n}\n"
  },
  {
    "path": "types/global.d.ts",
    "content": "import { LazySizesConfigPartial, LazySizesConfig } from './lazysizes-config';\n\nexport { LazySizesConfigPartial, LazySizesConfig };\n\nexport interface LazyUnveilReadEvent extends CustomEvent {\n\ttarget: Element;\n\ttype: 'lazyunveilread';\n\tdetail: {\n\t\tinstance: any; // lazySizes\n\t\t[key: string]: any;\n\t}\n}\n\nexport interface LazyBeforeUnveilEvent extends CustomEvent {\n\ttarget: Element;\n\ttype: 'lazybeforeunveil';\n\tpreventAble: true;\n\tdetail: {\n\t\tinstance: any; // lazySizes\n\t\t[key: string]: any;\n\t}\n}\n\nexport interface LazyBeforeSizesEvent extends CustomEvent {\n\ttype: 'lazybeforesizes';\n\tdetail: {\n\t\twidth: number;\n\t\tdataAttr: boolean;\n\t\tinstance: any; // lazySizes\n\t\t[key: string]: any;\n\t}\n}\n\ndeclare global {\n\tinterface Window {\n\t\tlazySizesConfig?: LazySizesConfigPartial;\n\t}\n\n\tinterface WindowEventMap {\n\t\tlazyunveilread: LazyUnveilReadEvent;\n\t\tlazybeforeunveil: LazyBeforeUnveilEvent;\n\t\tlazybeforesizes: LazyBeforeSizesEvent;\n\t}\n\n\tinterface DocumentEventMap {\n\t\tlazyunveilread: LazyUnveilReadEvent;\n\t\tlazybeforeunveil: LazyBeforeUnveilEvent;\n\t\tlazybeforesizes: LazyBeforeSizesEvent;\n\t}\n\n\tinterface ElementEventMap {\n\t\tlazyunveilread: LazyUnveilReadEvent;\n\t\tlazybeforeunveil: LazyBeforeUnveilEvent;\n\t\tlazybeforesizes: LazyBeforeSizesEvent;\n\t}\n}\n"
  },
  {
    "path": "types/lazysizes-config.d.ts",
    "content": "export interface LazySizesConfig {\n\tlazyClass: string;\n\tloadedClass: string;\n\tloadingClass: string;\n\tpreloadClass: string;\n\terrorClass: string;\n\t//strictClass: 'lazystrict';\n\tautosizesClass: string;\n\tfastLoadedClass: string;\n\tiframeLoadMode: 0 | 1;\n\tsrcAttr: string;\n\tsrcsetAttr: string;\n\tsizesAttr: string;\n\tpreloadAfterLoad: boolean;\n\tminSize: number;\n\tcustomMedia: Record<string, string>;\n\tinit: boolean;\n\t/**\n\t * Must be over 1.\n\t */\n\texpFactor: number;\n\thFac: number;\n\tloadMode: 0 | 1 | 2 | 3;\n\tloadHidden: boolean;\n\tricTimeout: number;\n\tthrottleDelay: number;\n\t[key: string]: any;\n}\n\nexport type LazySizesConfigPartial = Partial<LazySizesConfig>;\n"
  }
]