From 99f180e9d74ca77c58fa0b8ae95ff6419334fb61 Mon Sep 17 00:00:00 2001 From: moay Date: Fri, 11 Nov 2016 18:10:14 +0100 Subject: [PATCH 01/10] added Vimeo to afterglow --- dist/afterglow.min.js | 27 +- dist/afterglow.zip | Bin 89344 -> 93901 bytes gulpfile.js | 3 +- package.json | 2 +- sandbox/index.html | 11 +- src/js/afterglow/components/Config.js | 15 + src/js/afterglow/components/Player.js | 12 + src/js/afterglow/lib/Util.js | 9 + src/less/skins/afterglow-default.less | 6 + test/test.2.config.js | 9 + test/test.2.player.js | 80 +- test/test.3.util.js | 17 +- vendor/videojs/plugins/videojs-vimeo.js | 316 + vendor/videojs/plugins/vjs.vimeo.js | 1 - vendor/videojs/video-js.css | 171 +- vendor/videojs/video.js | 24246 ++++++++++++---------- 16 files changed, 14253 insertions(+), 10672 deletions(-) create mode 100644 vendor/videojs/plugins/videojs-vimeo.js delete mode 100755 vendor/videojs/plugins/vjs.vimeo.js mode change 100755 => 100644 vendor/videojs/video-js.css mode change 100755 => 100644 vendor/videojs/video.js diff --git a/dist/afterglow.min.js b/dist/afterglow.min.js index c0d24b2..de68dd0 100644 --- a/dist/afterglow.min.js +++ b/dist/afterglow.min.js @@ -1,21 +1,22 @@ /** * afterglow - An easy to integrate HTML5 video player with lightbox support. * @link http://afterglowplayer.com - * @version 0.3.6 + * @version 1.0.0a1 * @license MIT * * afterglow includes some scripts provided under different licenses by their authors. Please see the project sources via http://afterglowplayer.com in order to learn which projects are included and how you may use them. */ -function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}!function(t,e){var o=t.createElement("style");if(t.getElementsByTagName("head")[0].appendChild(o),o.styleSheet)o.styleSheet.disabled||(o.styleSheet.cssText=e);else try{o.innerHTML=e}catch(n){o.innerText=e}}(document,".video-js .vjs-big-play-button,.video-js .vjs-captions-button,.video-js .vjs-chapters-button,.video-js .vjs-control.vjs-close-button,.video-js .vjs-fullscreen-control,.video-js .vjs-mouse-display,.video-js .vjs-mute-control,.video-js .vjs-mute-control.vjs-vol-0,.video-js .vjs-mute-control.vjs-vol-1,.video-js .vjs-mute-control.vjs-vol-2,.video-js .vjs-play-control,.video-js .vjs-play-control.vjs-playing,.video-js .vjs-play-progress,.video-js .vjs-subtitles-button,.video-js .vjs-volume-level,.video-js .vjs-volume-menu-button,.video-js .vjs-volume-menu-button.vjs-vol-0,.video-js .vjs-volume-menu-button.vjs-vol-1,.video-js .vjs-volume-menu-button.vjs-vol-2,.video-js.vjs-fullscreen .vjs-fullscreen-control,.vjs-icon-audio-description,.vjs-icon-cancel,.vjs-icon-captions,.vjs-icon-chapters,.vjs-icon-circle,.vjs-icon-circle-inner-circle,.vjs-icon-circle-outline,.vjs-icon-cog,.vjs-icon-facebook,.vjs-icon-fullscreen-enter,.vjs-icon-fullscreen-exit,.vjs-icon-gplus,.vjs-icon-hd,.vjs-icon-linkedin,.vjs-icon-pause,.vjs-icon-pinterest,.vjs-icon-play,.vjs-icon-play-circle,.vjs-icon-replay,.vjs-icon-spinner,.vjs-icon-square,.vjs-icon-subtitles,.vjs-icon-tumblr,.vjs-icon-twitter,.vjs-icon-volume-high,.vjs-icon-volume-low,.vjs-icon-volume-mid,.vjs-icon-volume-mute{font-family:VideoJS;font-weight:400;font-style:normal}.video-js,.vjs-no-js{color:#fff;background-color:#000}.video-js .vjs-big-play-button:before,.video-js .vjs-control,.video-js .vjs-control:before,.vjs-menu li,.vjs-no-js{text-align:center}.video-js .vjs-big-play-button:before,.video-js .vjs-control:before,.video-js .vjs-modal-dialog,.vjs-modal-dialog .vjs-modal-dialog-content{position:absolute;top:0;left:0;width:100%;height:100%}@font-face{font-family:VideoJS;src:url(font/VideoJS.eot?#iefix) format(\"eot\")}@font-face{font-family:VideoJS;src:url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAA4wAAoAAAAAFfAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAD4AAABWUZFeBGNtYXAAAAE0AAAAOgAAAUriLxC2Z2x5ZgAAAXAAAAnnAAAO5OV/F/5oZWFkAAALWAAAACsAAAA2C4eUa2hoZWEAAAuEAAAAGAAAACQOogcfaG10eAAAC5wAAAAPAAAAeNIAAABsb2NhAAALrAAAAD4AAAA+MMgtQm1heHAAAAvsAAAAHwAAACABLwB5bmFtZQAADAwAAAElAAACCtXH9aBwb3N0AAANNAAAAPkAAAF5vawAenicY2BkZ2CcwMDKwMFSyPKMgYHhF4RmjmEIZzzHwMDEwMrMgBUEpLmmMDh8ZPwoyw7iLmSHCDOCCADu/Qo9AAB4nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZgYGD7K/v8PUvCREUTzM0DVAwEjG8OIBwCOWgbUAAB4nI1XfVBU1xV/574vlsUlj/14grDs48FuAgaR3X2LEnY3UZSgEkTwAySAgkIwI8bRfFDjTszYCWRMW9lNa4y2meokmq+2k5ia0dpkmknbkWgSSW3GyaaNf0RTx0wxX7A3Pe/tQmIgHXf3vXvvueeee+45v3POXQYY/PCD/CBDGAYkIE2sxg+OXSJmhmH1OaFX6MU5C5PDMCZi5Rg2i+ELGSthwM14NCbgYGSBIZfhFA1H6Zu0OS0NDkMVfg+npdFm+maCvigI0JBIQIMg0BdJGdTj9ylj7nr+b97+Hl8C1+H2xNAvjPqxjIgaKtItICkSnIISeo40QQls4xxjlzgHsnGGvi7BxQiMlSlkPMhfCh67rAUEUQ6CHxW2O7JARCkKnlUQ7UEIyAEQZe4MdDW9xr5OPFuKbubpRxcPDY8da4MOelDfAYJLW+sGKn/Vlmjfv5+NdB4oOfTazJn3tGxZtL9xFNZX7PPRUbjcRg/SMB2EL+gblXn7shbO/WUbF9u/H5XQ9eKO8iMMr9tY35qYoRi20wGuXV/CHaGDk2fdgHwCk5HUXQpCcgHfBV2NjV3jkq4PHTSUSBwuOQALvxPAps6fiftk6P6yJpcm5bB4dFkgoh195mbiSTnkL3jupq7jh4ZZdvjQRVB4PPx3SsVTu5D/6kd85RU66ttXAeuuXYN1E/Y2sMMzZkZiZNRZlRS/ynr9Xr8Cql2RVNbutXslYo7B9ngsFqcDbCQO22PxeIxcpgMxkh6PjUdwkvw6hvRpZeoCFKshDQzJVr++DWyLx+hAXJcGp3TJMV1ME45xCNvHLsWRrpOZSduOoG0zERuIIwuIkhNkBREglQKLiODD45FQE0BTiE214xE2wp8zOt9NjH3GRtDMk7Ehoq2tzCzGxdyMEQJuD0qGIrQ58ApoWQE3D2h1h6zwuB14wYFIDAA5CZ11jT+92gFZ7B7/p7+hV8jFxBl4aG03wLiVXtBbCylLfIJzkPUAvWAw0yvsVdKdBbC6nnruP/RFkHqWJLZ2Auxdtgy+6qTf7l1WswTJcJ6mGVxwXj92UtfU2WXUNX+qBUCxK6D4FR4f/cufG1sZbiSkMcwdMdoxBxTTEXIp4SCXMNhHoFjvTTFP4vkoPReNRmPRCTwa+3qY0DR7qn7Vjh612wRRTaI04HWCnZ+gIzvS/ZJP0+mynphCui4hzmG0id6+aLSv2BV3FQMYDTHrlGQ/SZ+q4ZdF8aLa5Ar8GW3tVNKEj13cF0buMaesx1i9CL/Uo1tM0h+74o9HjQ+UcPaxy8mH9ccwK8KpKA3rHdIUjTKpfIBxuokpxUGBIILm84ATvHh8tAIe2iZj8KvYwUOXawHMVNgxZvlwSa0z8Zkokkxn3ey2nYTsbMO3mPh8cji7zklsPLD9a9f2s2w/uSt/FgSytWzw5bmS3PielU1P56aGrlz6NzlnbT8h/Wtb+1OxIqxBbC9g7kINUbtAEDxsKWSCe46eltCPmaiUxy2IrODIB8EmixaQrU4IAQ6THg6BFpAdWsCquT16DkL9ccIC/FGeP5AuiDExe8bx+QtzWVsmHcm0kdzqecdn5IhRkTc/zfNPm3ns5sw4Pq86l9gyofh6jkTF5iFChjYbbzZQWFvYb8qZAWyGiV9ya+5bFgnzpuWt3FuX8KYMmsiYZepPseBgGhZcOMt0+4Q8fDOTftJjHIuhdaLsFXFM9AclTi9jbGRq8ZvIOykZei77kfo53eoppVPovbGiyV63p/p/dkWETTjmhjTIm8RP284b04bcNYlRsvO6Gp2JeaiIueVHsgJGF2aASlCQLuG8EsBomzb++/AXmwhaOoLhL7iQ4/uc449gWJ56/XWDARn74v/PL1bRBB4TBEyYrqezSkUPHaWjPWCm13ogAzJ66LVpbTEuXccDZlyXxBQ/IrzKOPS7gAkkIyZ0N6joE6M246aDsO1kgucTJ/EdFWA5pbAcTfoSP4hJeBCni7nEn5IclL4kpDgmMMuH8Kpk0+WrBUIeKCyWS0nPVz7NW86Hnl55GxR5KB3+9tszL+wVRulXNTUn6D8SJvIl3PzP46eZST/tQTllTDXTzmxCaTYna7eJAqcWuD1ulBXQsMz5fQEBCfowCF5FVDF/2yysB9OW5veVEtRAFOy41FoeJEiAOZhDiFstsKAwJ8Hijs72q1jWvWx+uKU5XFZDLx189OK8ojW1u0By5dtLHUN/rwkte68PnhnYVbt0bvWiub9w1+f4C0L3hIuXZ8+xlVSt0eb3tgQsmVZnem5R3U0uf/fmFdqiLTvY3nPnet5/v4f9pLB6QX2krnnFQ1tXtN+2ePlAaUNWcfiWwrncn4ca9ml3hFeHHm+u2bq4MhxUZs3bMH/3jgaPUtlVunFjg2/8yRzf3cHsssKZqlnOqyCWworWykW9lXnspk0ffrjpfCreIpjPWbwnFxt3PAkcQgkUuH1auUMf+txJQ0hK1k1zsNaqQdaLMxfoq9AGGxtJQ+fGw53cE/TY8pWhJruZHiMAcCexFS/eGDp6hntiXGE/gvI7163b29ExfiHxNsnqub/a6/QmPoAn4GpZ2c9cZRX5/57IWUNYuubiQBAddhuxAKe6PA5vuV5dkk0VXkMM3zk42W3Awrgka8LQgjZY+tQIffd5+vnHasnHL/cczldyS4r79i6su6Nu9oPQ8lbaid2Pt9/bXtTTynevq7bkPkITV47d+3NugOzo4M3y77Zxbnb2nhWrl0T/kO4u3H1ig33e1lD6JDYjiKkCHOioF0pZv6T6gxxipxLNhFc8xERA48vq5ZfXdL/QV6c8W3PfwjIsZyI3Csvo72e4FpTVwTv/UYNAKtY+8MB84vogZ1Xr5lW38iJdPZ74xunzO4Gk7BARIkytjlyCoPVoIb3IluMfAYRhEoAO2aGXKc2TNAJaSwdzQEeq7jC7TWYF2Y2jrEIXlyVEhunBs5t7K62a7Z6qB0923/+vPT2v7mwpqV/mTEsTiCB5zz735HOP9VbVWtKKZK08uDJ7vcQN02HogGegY5iNnKUHh12ti9/zzHvsauy+tx+e375j94LuA64MV/5MQbZVNT95/re7jlxZVaVuW5Nffsd9TXfOpXcv6m2Bn3x6FgXg/oz+P0h/ce8g2mTEWxVTzzQzrTruNCcRdbu6VY87gLVXc4uSjXfosak7XxWM4oyl+ockmzCFhJXaGwK8e6sCW2T3sLmPnh5qSZtx9JHFL6QBHGnsTjdtWQ8PFygWtQTIkrI84NILfQSC65FUMFsnOYFHEoSmUCD49a4rt3985PTsd8GzB/5KEnzmhhORgVOZPM+yb5KmpRu38jQqviH6826Lrdrxx6DZdFPo2fVbTiy9AUpDJ3SxGYvpK7u+Rhz8D4BCxssAeJxjYGRgYABi/vcdWfH8Nl8ZuNkZQODSliXbkWl2BrA4BwMTiAIAKDsJfgB4nGNgZGBgZwCChWASxGZkQAVyABOTANd4nGNnYGBgHwAMADNUANMAAAAAAAAOAFAAZgCyAMYA5gEeAUgBdAGcAfICLgKOAroDCgOOA7AD6gQ4BHwEuAToBQwFogXoBjYGbAbaB3IAAHicY2BkYGCQY8hlYGcAASYg5gJCBob/YD4DABa6AakAeJxdkE1qg0AYhl8Tk9AIoVDaVSmzahcF87PMARLIMoFAl0ZHY1BHdBJIT9AT9AQ9RQ9Qeqy+yteNMzDzfM+88w0K4BY/cNAMB6N2bUaPPBLukybCLvleeAAPj8JD+hfhMV7hC3u4wxs7OO4NzQSZcI/8Ltwnfwi75E/hAR7wJTyk/xYeY49fYQ/PztM+jbTZ7LY6OWdBJdX/pqs6NYWa+zMxa13oKrA6Uoerqi/JwtpYxZXJ1coUVmeZUWVlTjq0/tHacjmdxuL90OR8O0UEDYMNdtiSEpz5XQGqzlm30kzUdAYFFOb8R7NOZk0q2lwAyz1i7oAr1xoXvrOgtYhZx8wY5KRV269JZ5yGpmzPTjQhvY9je6vEElPOuJP3mWKnP5M3V+YAAAB4nG2P2XLCMAxFfYE4CWlZSveFP8hHOY4gHhw79VLav68hMNOH6kG60mg5YhM22pr9b1vGMMEUM2TgyFGgxBwVbnCLBZZYYY07bHCPBzziCc94wSve8I4PbGeDFj/VydVSOakpG0T0VH1ZHXuq+xhoftHaHq+yV+21o1P7brWLWnvpiExNJpBb/i18q8D9ZxSOcj8oY8iVPjZBBU2+kGIIypokuqTI+cx3qXMq7Z6PQIsx1DYGrQxtLul50YV50rVcCiNJc0enX4qdkNRYe8j2g46+SIMHapXJw1GFdIWH2DfalQknZeTDWsRW2bqlBK3ORIz9AqJUapQAAAA=) format(\"woff\"),url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAAKAIAAAwAgT1MvMlGRXgQAAAEoAAAAVmNtYXDiLxC2AAAB+AAAAUpnbHlm5X8X/gAAA4QAAA7kaGVhZAuHlGsAAADQAAAANmhoZWEOogcfAAAArAAAACRobXR40gAAAAAAAYAAAAB4bG9jYTDILUIAAANEAAAAPm1heHABLwB5AAABCAAAACBuYW1l1cf1oAAAEmgAAAIKcG9zdL2sAHoAABR0AAABeQABAAAHAAAAAKEHAAAAAAAHAAABAAAAAAAAAAAAAAAAAAAAHgABAAAAAQAAD+/W/l8PPPUACwcAAAAAANK0pLcAAAAA0rSktwAAAAAHAAcAAAAACAACAAAAAAAAAAEAAAAeAG0ABwAAAAAAAgAAAAoACgAAAP8AAAAAAAAAAQcAAZAABQAIBHEE5gAAAPoEcQTmAAADXABXAc4AAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA8QHxHQcAAAAAoQcAAAAAAAABAAAAAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAAAAAAAwAAAAMAAAAcAAEAAAAAAEQAAwABAAAAHAAEACgAAAAGAAQAAQACAADxHf//AAAAAPEB//8AAA8AAAEAAAAAAAAAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AUABmALIAxgDmAR4BSAF0AZwB8gIuAo4CugMKA44DsAPqBDgEfAS4BOgFDAWiBegGNgZsBtoHcgAAAAEAAAAABYsFiwACAAABEQECVQM2BYv76gILAAADAAAAAAZrBmsAAgAOABoAAAkCEwQAAxIABSQAEwIAASYAJzYANxYAFwYAAusBwP5Alf7D/loICAGmAT0BPQGmCAj+Wv7D/f6uBgYBUv39AVIGBv6uAjABUAFQAZsI/lr+w/7D/loICAGmAT0BPQGm+sgGAVL9/QFSBgb+rv39/q4AAAACAAAAAAVABYsAAwAHAAABIREpAREhEQHAASv+1QJVASsBdQQW++oEFgAAAAQAAAAABiAGIAAGABMAJAAnAAABLgEnFRc2NwYHFz4BNSYAJxUWEgEHASERIQERAQYHFT4BNxc3AQcXBNABZVW4A7sCJ3ElKAX+3+Wlzvu3XwFh/p8BKwF1AT5MXU6KO5lf/WCcnAOAZJ4rpbgYGGpbcUacVPQBYziaNP70Aetf/p/+QP6LAfb+wjsdmhJEMZhfBJacnAAAAQAAAAAEqwXWAAUAAAERIQERAQILASoBdv6KBGD+QP6LBKr+iwAAAAIAAAAABWYF1gAGAAwAAAEuAScRPgEBESEBEQEFZQFlVFRl/BEBKwF1/osDgGSeK/2mK54BRP5A/osEqv6LAAADAAAAAAYgBg8ABQAMABoAABMRIQERAQUuAScRPgEDFRYSFwYCBxU2ADcmAOABKwF1/osCxQFlVVVluqXOAwPOpeUBIQUF/t8EYP5A/osEqv6L4GSeK/2mK54C85o0/vS1tf70NJo4AWL19QFiAAAABAAAAAAFiwWLAAUACwARABcAAAEjESE1IwMzNTM1IQEjFSERIwMVMxUzEQILlgF24JaW4P6KA4DgAXaW4OCWAuv+ipYCCuCW/ICWAXYCoJbgAXYABAAAAAAFiwWLAAUACwARABcAAAEzFTMRIRMjFSERIwEzNTM1IRM1IxEhNQF14Jb+iuDgAXaWAcCW4P6KlpYBdgJV4AF2AcCWAXb76uCWAcDg/oqWAAAAAAIAAAAABdYF1gAPABMAAAEhDgEHER4BFyE+ATcRLgEDIREhBUD8gD9VAQFVPwOAP1UBAVU//IADgAXVAVU//IA/VQEBVT8DgD9V++wDgAAABgAAAAAGawZrAAcADAATABsAIAAoAAAJASYnDgEHASUuAScBBSEBNhI3JgUBBgIHFhchBR4BFwEzARYXPgE3AQK+AWROVIfwYQESA4416aH+7gLl/dABelxoAQH8E/7dXGgBAQ4CMP3kNemhARJ4/t1OVIfwYf7uA/ACaBIBAVhQ/id3pfY+/idL/XNkAQGTTU0B+GT+/5NNSEul9j4B2f4IEgEBWFAB2QAAAAUAAAAABmsF1gAPABMAFwAbAB8AAAEhDgEHER4BFyE+ATcRLgEBIRUhASE1IQUhNSE1ITUhBdX7VkBUAgJUQASqQFQCAlT7FgEq/tYC6v0WAuoBwP7WASr9FgLqBdUBVT/8gD9VAQFVPwOAP1X9rJX+1ZWVlZaVAAMAAAAABiAF1gAPACcAPwAAASEOAQcRHgEXIT4BNxEuAQEjNSMVMzUzFRQGByMuAScRPgE3Mx4BFQUjNSMVMzUzFQ4BByMuATURNDY3Mx4BFwWL++o/VAICVD8EFj9UAgJU/WtwlZVwKiDgICoBASog4CAqAgtwlZVwASog4CAqKiDgICoBBdUBVT/8gD9VAQFVPwOAP1X99yXgJUogKgEBKiABKiAqAQEqIEol4CVKICoBASogASogKgEBKiAAAAYAAAAABiAE9gADAAcACwAPABMAFwAAEzM1IxEzNSMRMzUjASE1IREhNSERFSE14JWVlZWVlQErBBX76wQV++sEFQM1lv5AlQHAlf5Alv5AlQJVlZUAAAABAAAAAAYgBmwALgAAASIGBwE2NCcBHgEzPgE3LgEnDgEHFBcBLgEjDgEHHgEXMjY3AQYHHgEXPgE3LgEFQCtKHv3sBwcCDx5OLF9/AgJ/X19/Agf98R5OLF9/AgJ/XyxOHgIUBQEDe1xcewMDewJPHxsBNxk2GQE0HSACf19ffwICf18bGf7NHCACf19ffwIgHP7KFxpcewICe1xdewAAAgAAAAAGWQZrAEMATwAAATY0Jzc+AScDLgEPASYvAS4BJyEOAQ8BBgcnJgYHAwYWHwEGFBcHDgEXEx4BPwEWHwEeARchPgE/ATY3FxY2NxM2JicFLgEnPgE3HgEXDgEFqwUFngoGB5YHGQ26OkQcAxQP/tYPFAIcRTm6DRoHlQcFC50FBZ0LBQeVBxoNujlFHAIUDwEqDxQCHEU5ug0aB5UHBQv9OG+UAgKUb2+UAgKUAzckSiR7CRoNAQMMCQVLLRzGDhEBAREOxhwtSwUJDP79DBsJeyRKJHsJGg3+/QwJBUstHMYOEQEBEQ7GHC1LBQkMAQMMGwlBApRvb5QCApRvb5QAAAAAAQAAAAAGawZrAAsAABMSAAUkABMCACUEAJUIAaYBPQE9AaYICP5a/sP+w/5aA4D+w/5aCAgBpgE9AT0BpggI/loAAAACAAAAAAZrBmsACwAXAAABBAADEgAFJAATAgABJgAnNgA3FgAXBgADgP7D/loICAGmAT0BPQGmCAj+Wv7D/f6uBgYBUv39AVIGBv6uBmsI/lr+w/7D/loICAGmAT0BPQGm+sgGAVL9/QFSBgb+rv39/q4AAAMAAAAABmsGawALABcAIwAAAQQAAxIABSQAEwIAASYAJzYANxYAFwYAAw4BBy4BJz4BNx4BA4D+w/5aCAgBpgE9AT0BpggI/lr+w/3+rgYGAVL9/QFSBgb+rh0Cf19ffwICf19ffwZrCP5a/sP+w/5aCAgBpgE9AT0BpvrIBgFS/f0BUgYG/q79/f6uAk9ffwICf19ffwICfwAAAAQAAAAABiAGIAAPABsAJQApAAABIQ4BBxEeARchPgE3ES4BASM1IxUjETMVMzU7ASEeARcRDgEHITczNSMFi/vqP1QCAlQ/BBY/VAICVP1rcJVwcJVwlgEqICoBASog/tZwlZUGIAJUP/vqP1QCAlQ/BBY/VPyClZUBwLu7ASog/tYgKgFw4AACAAAAAAZrBmsACwAXAAABBAADEgAFJAATAgATBwkBJwkBNwkBFwEDgP7D/loICAGmAT0BPQGmCAj+Wjhp/vT+9GkBC/71aQEMAQxp/vUGawj+Wv7D/sP+WggIAaYBPQE9Aab8EWkBC/71aQEMAQxp/vUBC2n+9AABAAAAAAXWBrYAFgAAAREJAREeARcOAQcuAScjFgAXNgA3JgADgP6LAXW+/QUF/b6+/QWVBgFR/v4BUQYG/q8FiwEq/ov+iwEqBP2/vv0FBf2+/v6vBgYBUf7+AVEAAAABAAAAAAU/BwAAFAAAAREjIgYdASEDIxEhESMRMzU0NjMyBT+dVjwBJSf+/s7//9Ctkwb0/vhISL3+2P0JAvcBKNq6zQAAAAAEAAAAAAaOBwAAMABFAGAAbAAAARQeAxUUBwYEIyImJyY1NDY3NiUuATU0NwYjIiY1NDY3PgEzIQcjHgEVFA4DJzI2NzY1NC4CIyIGBwYVFB4DEzI+AjU0LgEvASYvAiYjIg4DFRQeAgEzFSMVIzUjNTM1MwMfQFtaQDBI/uqfhOU5JVlKgwERIB8VLhaUy0g/TdNwAaKKg0pMMUVGMZImUBo1Ij9qQCpRGS8UKz1ZNjprWzcODxMeChwlThAgNWhvUzZGcX0Da9XVadTUaQPkJEVDUIBOWlN6c1NgPEdRii5SEipAKSQxBMGUUpo2QkBYP4xaSHNHO0A+IRs5ZjqGfVInITtlLmdnUjT8lxo0Xj4ZMCQYIwsXHTgCDiQ4XTtGazsdA2xs29ts2QADAAAAAAaABmwAAwAOACoAAAERIREBFgYrASImNDYyFgERIRE0JiMiBgcGFREhEhAvASEVIz4DMzIWAd3+tgFfAWdUAlJkZ6ZkBI/+t1FWP1UVC/63AgEBAUkCFCpHZz+r0ASP/CED3wEySWJik2Fh/N39yAISaXdFMx4z/dcBjwHwMDCQIDA4H+MAAAEAAAAABpQGAAAxAAABBgcWFRQCDgEEIyAnFjMyNy4BJxYzMjcuAT0BFhcuATU0NxYEFyY1NDYzMhc2NwYHNgaUQ18BTJvW/tKs/vHhIyvhsGmmHyEcKypwk0ROQk4seQFbxgi9hoxgbWAlaV0FaGJFDhyC/v3ut22RBIoCfWEFCxexdQQmAyyOU1hLlbMKJiSGvWYVOXM/CgAAAAEAAAAABYAHAAAiAAABFw4BBwYuAzURIzU+BDc+ATsBESEVIREUHgI3NgUwUBewWWitcE4hqEhyRDAUBQEHBPQBTf6yDSBDME4Bz+0jPgECOFx4eDoCINcaV11vVy0FB/5Y/P36HjQ1HgECAAEAAAAABoAGgABKAAABFAIEIyInNj8BHgEzMj4BNTQuASMiDgMVFBYXFj8BNjc2JyY1NDYzMhYVFAYjIiY3PgI1NCYjIgYVFBcDBhcmAjU0EiQgBBIGgM7+n9FvazsTNhRqPXm+aHfijmm2f1srUE0eCAgGAgYRM9Gpl6mJaz1KDgglFzYyPlYZYxEEzv7OAWEBogFhzgOA0f6fziBdR9MnOYnwlnLIfjpgfYZDaJ4gDCAfGAYXFD1al9mkg6ruVz0jdVkfMkJyVUkx/l5Ga1sBfOnRAWHOzv6fAAAHAAAAAAcABM8ADgAXACoAPQBQAFoAXQAAARE2HgIHDgEHBiYjJyY3FjY3NiYHERQFFjY3PgE3LgEnIwYfAR4BFw4BFxY2Nz4BNy4BJyMGHwEeARcUBhcWNjc+ATcuAScjBh8BHgEXDgEFMz8BFTMRIwYDJRUnAxyEzZRbCA2rgketCAEBqlRoCglxYwF+IiEOIysBAkswHQEECiQ0AgE+YyIhDiIsAQJLMB4BBQokNAE/YyIhDiIsAQJLMB4BBQokNAEBPvmD7kHhqs0s0gEnjgHJAv0FD2a9gIrADwUFAwPDAlVMZ3MF/pUHwgc1HTyWV325PgsJED+oY3G9TAc1HTyWV325PgsJED+oY3G9TAc1HTyWV325PgsJED+oY3G9UmQBZQMMR/61g/kBAAAAAAAQAMYAAQAAAAAAAQAHAAAAAQAAAAAAAgAHAAcAAQAAAAAAAwAHAA4AAQAAAAAABAAHABUAAQAAAAAABQALABwAAQAAAAAABgAHACcAAQAAAAAACgArAC4AAQAAAAAACwATAFkAAwABBAkAAQAOAGwAAwABBAkAAgAOAHoAAwABBAkAAwAOAIgAAwABBAkABAAOAJYAAwABBAkABQAWAKQAAwABBAkABgAOALoAAwABBAkACgBWAMgAAwABBAkACwAmAR5WaWRlb0pTUmVndWxhclZpZGVvSlNWaWRlb0pTVmVyc2lvbiAxLjBWaWRlb0pTR2VuZXJhdGVkIGJ5IHN2ZzJ0dGYgZnJvbSBGb250ZWxsbyBwcm9qZWN0Lmh0dHA6Ly9mb250ZWxsby5jb20AVgBpAGQAZQBvAEoAUwBSAGUAZwB1AGwAYQByAFYAaQBkAGUAbwBKAFMAVgBpAGQAZQBvAEoAUwBWAGUAcgBzAGkAbwBuACAAMQAuADAAVgBpAGQAZQBvAEoAUwBHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAACAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4EcGxheQtwbGF5LWNpcmNsZQVwYXVzZQt2b2x1bWUtbXV0ZQp2b2x1bWUtbG93CnZvbHVtZS1taWQLdm9sdW1lLWhpZ2gQZnVsbHNjcmVlbi1lbnRlcg9mdWxsc2NyZWVuLWV4aXQGc3F1YXJlB3NwaW5uZXIJc3VidGl0bGVzCGNhcHRpb25zCGNoYXB0ZXJzBXNoYXJlA2NvZwZjaXJjbGUOY2lyY2xlLW91dGxpbmUTY2lyY2xlLWlubmVyLWNpcmNsZQJoZAZjYW5jZWwGcmVwbGF5CGZhY2Vib29rBWdwbHVzCGxpbmtlZGluB3R3aXR0ZXIGdHVtYmxyCXBpbnRlcmVzdBFhdWRpby1kZXNjcmlwdGlvbgAAAAAA) format(\"truetype\");font-weight:400;font-style:normal}.video-js .vjs-big-play-button:before,.video-js .vjs-play-control:before,.vjs-icon-play:before{content:'\\f101'}.vjs-icon-play-circle:before{content:'\\f102'}.video-js .vjs-play-control.vjs-playing:before,.vjs-icon-pause:before{content:'\\f103'}.video-js .vjs-mute-control.vjs-vol-0:before,.video-js .vjs-volume-menu-button.vjs-vol-0:before,.vjs-icon-volume-mute:before{content:'\\f104'}.video-js .vjs-mute-control.vjs-vol-1:before,.video-js .vjs-volume-menu-button.vjs-vol-1:before,.vjs-icon-volume-low:before{content:'\\f105'}.video-js .vjs-mute-control.vjs-vol-2:before,.video-js .vjs-volume-menu-button.vjs-vol-2:before,.vjs-icon-volume-mid:before{content:'\\f106'}.video-js .vjs-mute-control:before,.video-js .vjs-volume-menu-button:before,.vjs-icon-volume-high:before{content:'\\f107'}.video-js .vjs-fullscreen-control:before,.vjs-icon-fullscreen-enter:before{content:'\\f108'}.video-js.vjs-fullscreen .vjs-fullscreen-control:before,.vjs-icon-fullscreen-exit:before{content:'\\f109'}.vjs-icon-square:before{content:'\\f10a'}.vjs-icon-spinner:before{content:'\\f10b'}.video-js .vjs-subtitles-button:before,.vjs-icon-subtitles:before{content:'\\f10c'}.video-js .vjs-captions-button:before,.vjs-icon-captions:before{content:'\\f10d'}.video-js .vjs-chapters-button:before,.vjs-icon-chapters:before{content:'\\f10e'}.vjs-icon-share{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-share:before{content:'\\f10f'}.vjs-icon-cog:before{content:'\\f110'}.video-js .vjs-mouse-display:before,.video-js .vjs-play-progress:before,.video-js .vjs-volume-level:before,.vjs-icon-circle:before{content:'\\f111'}.vjs-icon-circle-outline:before{content:'\\f112'}.vjs-icon-circle-inner-circle:before{content:'\\f113'}.vjs-icon-hd:before{content:'\\f114'}.video-js .vjs-control.vjs-close-button:before,.vjs-icon-cancel:before{content:'\\f115'}.vjs-icon-replay:before{content:'\\f116'}.vjs-icon-facebook:before{content:'\\f117'}.vjs-icon-gplus:before{content:'\\f118'}.vjs-icon-linkedin:before{content:'\\f119'}.vjs-icon-twitter:before{content:'\\f11a'}.vjs-icon-tumblr:before{content:'\\f11b'}.vjs-icon-pinterest:before{content:'\\f11c'}.vjs-icon-audio-description:before{content:'\\f11d'}.video-js{display:block;vertical-align:top;box-sizing:border-box;position:relative;padding:0;font-size:10px;line-height:1;font-weight:400;font-style:normal;font-family:Arial,Helvetica,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.video-js:-moz-full-screen{position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js .vjs-tech,.video-js.vjs-fill{width:100%;height:100%}.video-js *,.video-js :after,.video-js :before{box-sizing:inherit}.video-js ul{font-family:inherit;font-size:inherit;line-height:inherit;list-style-position:outside;margin:0}.video-js.vjs-16-9,.video-js.vjs-4-3,.video-js.vjs-fluid{width:100%;max-width:100%;height:0}.video-js.vjs-16-9{padding-top:56.25%}.video-js.vjs-4-3{padding-top:75%}.video-js .vjs-tech{position:absolute;top:0;left:0}body.vjs-full-window{padding:0;margin:0;height:100%;overflow-y:auto}.vjs-full-window .video-js.vjs-fullscreen{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0}.video-js.vjs-fullscreen{width:100%!important;height:100%!important;padding-top:0!important}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-hidden{display:none!important}.video-js .vjs-offscreen{height:1px;left:-9999px;position:absolute;top:0;width:1px}.vjs-lock-showing{display:block!important;opacity:1;visibility:visible}.vjs-no-js{padding:20px;font-size:18px;font-family:Arial,Helvetica,sans-serif;width:300px;height:150px;margin:0 auto}.vjs-no-js a,.vjs-no-js a:visited{color:#66A8CC}.video-js .vjs-big-play-button{font-size:3em;line-height:1.5em;height:1.5em;width:3em;display:block;position:absolute;top:10px;left:10px;padding:0;cursor:pointer;opacity:1;border:.06666em solid #fff;background-color:#2B333F;background-color:rgba(43,51,63,.7);-webkit-border-radius:.3em;-moz-border-radius:.3em;border-radius:.3em;-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-big-play-centered .vjs-big-play-button{top:50%;left:50%;margin-top:-.75em;margin-left:-1.5em}.video-js .vjs-big-play-button:focus,.video-js:hover .vjs-big-play-button{outline:0;border-color:#fff;background-color:#73859f;background-color:rgba(115,133,159,.5);-webkit-transition:all 0s;-moz-transition:all 0s;-o-transition:all 0s;transition:all 0s}.vjs-controls-disabled .vjs-big-play-button,.vjs-error .vjs-big-play-button,.vjs-has-started .vjs-big-play-button,.vjs-using-native-controls .vjs-big-play-button{display:none}.video-js button{background:0 0;border:none;color:inherit;display:inline-block;overflow:visible;font-size:inherit;line-height:inherit;text-transform:none;text-decoration:none;transition:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.video-js .vjs-control.vjs-close-button{cursor:pointer;height:3em;position:absolute;right:0;top:.5em;z-index:2}.vjs-menu-button{cursor:pointer}.vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;overflow:auto}.vjs-scrubbing .vjs-menu-button:hover .vjs-menu{display:none}.vjs-menu li{list-style:none;margin:0;padding:.2em 0;line-height:1.4em;font-size:1.2em;text-transform:lowercase}.vjs-menu li:focus,.vjs-menu li:hover{outline:0;background-color:#73859f;background-color:rgba(115,133,159,.5)}.vjs-menu li.vjs-selected,.vjs-menu li.vjs-selected:focus,.vjs-menu li.vjs-selected:hover{background-color:#fff;color:#2B333F}.vjs-menu li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em;font-weight:700;cursor:default}.vjs-menu-button-popup .vjs-menu{display:none;position:absolute;bottom:0;width:10em;left:-3em;height:0;margin-bottom:1.5em;border-top-color:rgba(43,51,63,.7)}.vjs-menu-button-popup .vjs-menu .vjs-menu-content{background-color:#2B333F;background-color:rgba(43,51,63,.7);position:absolute;width:100%;bottom:1.5em;max-height:15em}.vjs-menu-button-popup .vjs-menu.vjs-lock-showing,.vjs-workinghover .vjs-menu-button-popup:hover .vjs-menu{display:block}.video-js .vjs-menu-button-inline{-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s;overflow:hidden}.video-js .vjs-menu-button-inline:before{width:2.222222222em}.video-js .vjs-menu-button-inline.vjs-slider-active,.video-js .vjs-menu-button-inline:focus,.video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline{width:12em}.video-js .vjs-menu-button-inline.vjs-slider-active{-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.vjs-menu-button-inline .vjs-menu{opacity:0;height:100%;width:auto;position:absolute;left:4em;top:0;padding:0;margin:0;-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-menu-button-inline.vjs-slider-active .vjs-menu,.vjs-menu-button-inline:focus .vjs-menu,.vjs-menu-button-inline:hover .vjs-menu{display:block;opacity:1}.vjs-no-flex .vjs-menu-button-inline .vjs-menu{display:block;opacity:1;position:relative;width:auto}.vjs-no-flex .vjs-menu-button-inline.vjs-slider-active .vjs-menu,.vjs-no-flex .vjs-menu-button-inline:focus .vjs-menu,.vjs-no-flex .vjs-menu-button-inline:hover .vjs-menu{width:auto}.vjs-menu-button-inline .vjs-menu-content{width:auto;height:100%;margin:0;overflow:hidden}.video-js .vjs-control-bar{display:none;width:100%;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#2B333F;background-color:rgba(43,51,63,.7)}.vjs-has-started .vjs-control-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;visibility:visible;opacity:1;-webkit-transition:visibility .1s,opacity .1s;-moz-transition:visibility .1s,opacity .1s;-o-transition:visibility .1s,opacity .1s;transition:visibility .1s,opacity .1s}.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.vjs-controls-disabled .vjs-control-bar,.vjs-error .vjs-control-bar,.vjs-using-native-controls .vjs-control-bar{display:none!important}.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible}@media \\0screen{.vjs-user-inactive.vjs-playing .vjs-control-bar :before{content:\"\"}}.vjs-has-started.vjs-no-flex .vjs-control-bar{display:table}.video-js .vjs-control{outline:0;position:relative;margin:0;padding:0;height:100%;width:4em;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none}.video-js .vjs-control:before{font-size:1.8em;line-height:1.67}.video-js .vjs-control:focus,.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before{text-shadow:0 0 1em #fff}.video-js .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-no-flex .vjs-control{display:table-cell;vertical-align:middle}.video-js .vjs-custom-control-spacer{display:none}.video-js .vjs-progress-control{-webkit-box-flex:auto;-moz-box-flex:auto;-webkit-flex:auto;-ms-flex:auto;flex:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;min-width:4em}.vjs-live .vjs-progress-control{display:none}.video-js .vjs-progress-holder{-webkit-box-flex:auto;-moz-box-flex:auto;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s;height:.3em}.video-js .vjs-progress-control:hover .vjs-progress-holder{font-size:1.666666666666666666em}.video-js .vjs-progress-control:hover .vjs-mouse-display:after,.video-js .vjs-progress-control:hover .vjs-play-progress:after{display:block;font-size:.6em}.video-js .vjs-progress-holder .vjs-load-progress,.video-js .vjs-progress-holder .vjs-load-progress div,.video-js .vjs-progress-holder .vjs-play-progress{position:absolute;display:block;height:.3em;margin:0;padding:0;width:0;left:0;top:0}.video-js .vjs-mouse-display:before{display:none}.video-js .vjs-play-progress{background-color:#fff}.video-js .vjs-play-progress:before{position:absolute;top:-.333333333333333em;right:-.5em;font-size:.9em}.video-js .vjs-mouse-display:after,.video-js .vjs-play-progress:after{display:none;position:absolute;top:-3.4em;right:-1.5em;font-size:.9em;color:#000;content:attr(data-current-time);padding:6px 8px 8px;background-color:#fff;background-color:rgba(255,255,255,.8);-webkit-border-radius:.3em;-moz-border-radius:.3em;border-radius:.3em}.video-js .vjs-play-progress:after,.video-js .vjs-play-progress:before{z-index:1}.video-js .vjs-load-progress{background:#bfc7d3;background:rgba(115,133,159,.5)}.video-js .vjs-load-progress div{background:#fff;background:rgba(115,133,159,.75)}.video-js.vjs-no-flex .vjs-progress-control{width:auto}.video-js .vjs-progress-control .vjs-mouse-display{display:none;position:absolute;width:1px;height:100%;background-color:#000;z-index:1}.vjs-no-flex .vjs-progress-control .vjs-mouse-display{z-index:0}.video-js .vjs-progress-control:hover .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display,.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display:after{visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display,.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display:after{display:none}.video-js .vjs-progress-control .vjs-mouse-display:after{color:#fff;background-color:#000;background-color:rgba(0,0,0,.8)}.video-js .vjs-slider{outline:0;position:relative;cursor:pointer;padding:0;margin:0 .45em;background-color:#73859f;background-color:rgba(115,133,159,.5)}.video-js .vjs-slider:focus{text-shadow:0 0 1em #fff;-webkit-box-shadow:0 0 1em #fff;-moz-box-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.video-js .vjs-mute-control,.video-js .vjs-volume-menu-button{cursor:pointer;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none}.video-js .vjs-volume-control{width:5em;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.video-js .vjs-volume-bar{margin:1.35em .45em}.vjs-volume-bar.vjs-slider-horizontal{width:5em;height:.3em}.vjs-volume-bar.vjs-slider-vertical{width:.3em;height:5em;margin:1.35em auto}.video-js .vjs-volume-level{position:absolute;bottom:0;left:0;background-color:#fff}.video-js .vjs-volume-level:before{position:absolute;font-size:.9em}.vjs-slider-vertical .vjs-volume-level{width:.3em}.vjs-slider-vertical .vjs-volume-level:before{top:-.5em;left:-.3em}.vjs-slider-horizontal .vjs-volume-level{height:.3em}.vjs-slider-horizontal .vjs-volume-level:before{top:-.3em;right:-.5em}.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level{height:100%}.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level{width:100%}.vjs-menu-button-popup.vjs-volume-menu-button .vjs-menu{display:block;width:0;height:0;border-top-color:transparent}.vjs-menu-button-popup.vjs-volume-menu-button-vertical .vjs-menu{left:.5em;height:8em}.vjs-menu-button-popup.vjs-volume-menu-button-horizontal .vjs-menu{left:-2em}.vjs-menu-button-popup.vjs-volume-menu-button .vjs-menu-content{height:0;width:0;overflow-x:hidden;overflow-y:hidden}.vjs-volume-menu-button-vertical .vjs-lock-showing .vjs-menu-content,.vjs-volume-menu-button-vertical.vjs-slider-active .vjs-menu-content,.vjs-volume-menu-button-vertical:focus .vjs-menu-content,.vjs-volume-menu-button-vertical:hover .vjs-menu-content{height:8em;width:2.9em}.vjs-volume-menu-button-horizontal .vjs-lock-showing .vjs-menu-content,.vjs-volume-menu-button-horizontal .vjs-slider-active .vjs-menu-content,.vjs-volume-menu-button-horizontal:focus .vjs-menu-content,.vjs-volume-menu-button-horizontal:hover .vjs-menu-content{height:2.9em;width:8em}.vjs-volume-menu-button.vjs-menu-button-inline .vjs-menu-content{background-color:transparent!important}.vjs-poster{display:inline-block;vertical-align:middle;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;cursor:pointer;margin:0;padding:0;position:absolute;top:0;right:0;bottom:0;left:0;height:100%}.vjs-poster img{display:block;vertical-align:middle;margin:0 auto;max-height:100%;padding:0;width:100%}.vjs-has-started .vjs-poster{display:none}.vjs-audio.vjs-has-started .vjs-poster{display:block}.vjs-controls-disabled .vjs-poster,.vjs-using-native-controls .vjs-poster{display:none}.video-js .vjs-live-control{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-flex:auto;-moz-box-flex:auto;-webkit-flex:auto;-ms-flex:auto;flex:auto;font-size:1em;line-height:3em}.vjs-no-flex .vjs-live-control{display:table-cell;width:auto;text-align:left}.video-js .vjs-current-time,.video-js .vjs-duration,.vjs-live .vjs-time-control,.vjs-live .vjs-time-divider,.vjs-no-flex .vjs-current-time,.vjs-no-flex .vjs-duration{display:none}.video-js .vjs-time-control{-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none;font-size:1em;line-height:3em;min-width:2em;width:auto;padding-left:1em;padding-right:1em}.vjs-time-divider{display:none;line-height:3em}.video-js .vjs-play-control{cursor:pointer;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none}.vjs-text-track-display{position:absolute;bottom:3em;left:0;right:0;top:0;pointer-events:none}.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display{bottom:1em}.video-js .vjs-text-track{font-size:1.4em;text-align:center;margin-bottom:.1em;background-color:#000;background-color:rgba(0,0,0,.5)}.vjs-subtitles{color:#fff}.vjs-captions{color:#fc6}.vjs-tt-cue{display:block}video::-webkit-media-text-track-display{-moz-transform:translateY(-3em);-ms-transform:translateY(-3em);-o-transform:translateY(-3em);-webkit-transform:translateY(-3em);transform:translateY(-3em)}.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display{-moz-transform:translateY(-1.5em);-ms-transform:translateY(-1.5em);-o-transform:translateY(-1.5em);-webkit-transform:translateY(-1.5em);transform:translateY(-1.5em)}.video-js .vjs-fullscreen-control{cursor:pointer;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none}.vjs-playback-rate .vjs-playback-rate-value{font-size:1.5em;line-height:2;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center}.vjs-playback-rate .vjs-menu{width:4em;left:0}.vjs-error .vjs-error-display .vjs-modal-dialog-content{font-size:1.4em;text-align:center}.vjs-error .vjs-error-display:before{color:#fff;content:'X';font-family:Arial,Helvetica,sans-serif;font-size:4em;left:0;line-height:1;margin-top:-.5em;position:absolute;text-shadow:.05em .05em .1em #000;text-align:center;top:50%;vertical-align:middle;width:100%}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;margin:-25px 0 0 -25px;opacity:.85;text-align:left;border:6px solid rgba(43,51,63,.7);box-sizing:border-box;background-clip:padding-box;width:50px;height:50px;border-radius:25px}.vjs-seeking .vjs-loading-spinner,.vjs-waiting .vjs-loading-spinner{display:block}.vjs-loading-spinner:after,.vjs-loading-spinner:before{content:\"\";position:absolute;margin:-6px;box-sizing:inherit;width:inherit;height:inherit;border-radius:inherit;opacity:1;border:inherit;border-color:#fff transparent transparent}.vjs-seeking .vjs-loading-spinner:after,.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:before{-webkit-animation:vjs-spinner-spin 1.1s cubic-bezier(.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite;animation:vjs-spinner-spin 1.1s cubic-bezier(.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite}.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:before{border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:after{border-top-color:#fff;-webkit-animation-delay:.44s;animation-delay:.44s}@keyframes vjs-spinner-spin{100%{transform:rotate(360deg)}}@-webkit-keyframes vjs-spinner-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes vjs-spinner-fade{0%,100%,20%,60%{border-top-color:#73859f}35%{border-top-color:#fff}}@-webkit-keyframes vjs-spinner-fade{0%,100%,20%,60%{border-top-color:#73859f}35%{border-top-color:#fff}}.vjs-chapters-button .vjs-menu ul{width:24em}.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-custom-control-spacer{-webkit-box-flex:auto;-moz-box-flex:auto;-webkit-flex:auto;-ms-flex:auto;flex:auto}.video-js.vjs-layout-tiny:not(.vjs-fullscreen).vjs-no-flex .vjs-custom-control-spacer{width:auto}.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-chapters-button,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-current-time,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-duration,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-mute-control,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-playback-rate,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-remaining-time,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-subtitles-button,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-time-divider,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-volume-control,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-chapters-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-current-time,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-duration,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-mute-control,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-playback-rate,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-progress-control,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-remaining-time,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-subtitles-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-time-divider,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-control,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-menu-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-chapters-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-current-time,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-duration,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-mute-control,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-playback-rate,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-remaining-time,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-subtitles-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-time-divider,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-control,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-menu-button{display:none}.vjs-caption-settings{position:relative;top:1em;background-color:#2B333F;background-color:rgba(43,51,63,.75);color:#fff;margin:0 auto;padding:.5em;height:15em;font-size:12px;width:40em}.vjs-caption-settings .vjs-tracksettings{top:0;bottom:2em;left:0;right:0;position:absolute;overflow:auto}.vjs-caption-settings .vjs-tracksettings-colors,.vjs-caption-settings .vjs-tracksettings-font{float:left}.vjs-caption-settings .vjs-tracksettings-colors:after,.vjs-caption-settings .vjs-tracksettings-controls:after,.vjs-caption-settings .vjs-tracksettings-font:after{clear:both}.vjs-caption-settings .vjs-tracksettings-controls{position:absolute;bottom:1em;right:1em}.vjs-caption-settings .vjs-tracksetting{margin:5px;padding:3px;min-height:40px}.vjs-caption-settings .vjs-tracksetting label{display:block;width:100px;margin-bottom:5px}.vjs-caption-settings .vjs-tracksetting span{display:inline;margin-left:5px}.vjs-caption-settings .vjs-tracksetting>div{margin-bottom:5px;min-height:20px}.vjs-caption-settings .vjs-tracksetting>div:last-child{margin-bottom:0;padding-bottom:0;min-height:0}.vjs-caption-settings label>input{margin-right:10px}.vjs-caption-settings input[type=button]{width:40px;height:40px}.video-js .vjs-modal-dialog{background:rgba(0,0,0,.8);background:-webkit-linear-gradient(-90deg,rgba(0,0,0,.8),rgba(255,255,255,0));background:linear-gradient(180deg,rgba(0,0,0,.8),rgba(255,255,255,0))}.vjs-modal-dialog .vjs-modal-dialog-content{font-size:1.2em;line-height:1.5;padding:20px 24px;z-index:1}"), -function(t,e){var o=t.createElement("style");if(t.getElementsByTagName("head")[0].appendChild(o),o.styleSheet)o.styleSheet.disabled||(o.styleSheet.cssText=e);else try{o.innerHTML=e}catch(n){o.innerText=e}}(document,".vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar{background-color:#000;background-color:rgba(0,0,0,.7);bottom:0;height:51px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-progress-control{top:-5px;background-color:#000;background-color:rgba(0,0,0,.7)}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-progress-control:hover{top:-7px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-progress-control .vjs-progress-holder{margin:0}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-progress-control .vjs-progress-holder .vjs-load-progress,.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-progress-control .vjs-progress-holder .vjs-play-progress{border-radius:0;-moz-border-radius:0;-webkit-border-radius:0}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-current-time,.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-duration{margin-top:12px}@media (max-width:768px){.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar{height:42px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-progress-control{background-color:#000}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-current-time,.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-duration{margin-top:11px}}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-current-time{margin-left:20px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-duration{margin-right:20px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-volume-menu-button .vjs-menu,.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu{padding-top:22px}@media (max-width:512px){.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar{height:34px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-play-control:before{font-size:11px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-current-time,.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-duration{margin-top:9px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-current-time{margin-left:14px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-duration{margin-right:10px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-volume-menu-button .vjs-menu,.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu{padding-top:14pxpx}}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control:before{margin-top:5px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar{right:20px;top:16px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar .vjs-button{background-color:#000;background-color:rgba(0,0,0,.7);width:32px;height:32px;border-radius:50px;-moz-border-radius:50px;-webkit-border-radius:50px;margin-left:7px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar .vjs-button:before{margin-top:-1px;font-size:15px;line-height:16px}@media (max-width:768px){.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar{top:14px;right:16px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar .vjs-button{width:28px;height:28px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar .vjs-button:before{font-size:14px;line-height:15px;margin-top:-2px}}@media (max-width:512px){.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar .vjs-button{width:24px;height:24px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar .vjs-button:before{font-size:12px;line-height:13px;margin-top:0}}.vjs-afterglow-skin.afterglow-skin-dark.vjs-youtube.vjs-has-started.vjs-paused .vjs-control-bar{right:0;background-color:#000}"),function(t,e){var o=t.createElement("style");if(t.getElementsByTagName("head")[0].appendChild(o),o.styleSheet)o.styleSheet.disabled||(o.styleSheet.cssText=e);else try{o.innerHTML=e}catch(n){o.innerText=e}}(document,'@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,300);.vjs-afterglow-skin.vjs-has-started .vjs-control-bar,.vjs-afterglow-skin.vjs-has-started .vjs-top-control-bar{-webkit-transition:visibility .1s,opacity .1s;-moz-transition:visibility .1s,opacity .1s;-o-transition:visibility .1s,opacity .1s}@font-face{font-family:afterglow-icon;src:url(data:font/truetype;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SA4cAAAC8AAAAYGNtYXAAeLLHAAABHAAAAGRnYXNwAAAAEAAAAYAAAAAIZ2x5ZjvMn/0AAAGIAAAKMGhlYWQKacTfAAALuAAAADZoaGVhCtQG7wAAC/AAAAAkaG10eESZANEAAAwUAAAASGxvY2EUPhEmAAAMXAAAACZtYXhwABgAggAADIQAAAAgbmFtZc07FAkAAAykAAABknBvc3QAAwAAAAAOOAAAACAAAwROAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADmDwPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQASAAAAA4ACAACAAYAAQAg5gvmDeYP//3//wAAAAAAIOYA5g3mD//9//8AAf/jGgQaAxoCAAMAAQAAAAAAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAwAA/8AF4gPAABAAQABzAAATERQWMyEyNjURNCYjISIGFQUOARUUFjMyNjcVFAYHMAYjIiYnLgE1NDY3PgE3PgEzMhYxHgEPAS4BJy4BIyIGByEOARUUFjMyNjEVFAYHMAYjIiYnLgE1NDY3PgE3PgEzMhYxHgEHMAY3BzAmJy4BIyIGBwBHMgTwM0ZHMvsQM0YBihcYWlklWzUiGFM2TnYpKSoVFBQ6JiVZMzRjGBQJGxQoFBQoEytCFwJmFxdZWSWQIhhTNk52KSkpFBQUOiYmWDM0YxgVBwMDHjwUFCgTKkIYA0j88DJGRzEDEDJGRzHiH1k5dnYTEkEZLAYVLi8vhlc3YSkqPxYWFh8HLBdCCREHBwcgIB9ZOXZ2JUEZLAYVLi8vhlc3YSkqPxYWFh8HKhEHB0oaBwcHICAAAAACABr/2gPmA6YAEAAhAAATNzYyFwEWFA8BBiInASY0NyUXFhQHAQYiLwEmNDcBNjIXGisRLxEDUBAQLBAvEfywEREDoCwQEPywES8RKxERA1ARLxADeiwQEPywES8QLBAQA1ARLxAsLBAvEfywEBAsEC8RA1AQEAABAA3/7gJ6A5IADAAAFwYmNRE0NhcBFhQHAXctPT0tAgMtLf39EiAfNgM6Nh8g/n0gXiD+fQAAAAIAAP/zA48DlwAcAD0AABM0NjMwIjMyPgIxNhYVERQGJzAuAisBIiY9AQUHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQfAQA3KliWS3pYMAsODgs5XXg/OSo8ArhHEBAPKQ9ISA8pDxAQR0cQEA8pD0hIDykPEBBHAhwqPVZoVhMFE/xmEwUTV2dXPCquXEgPKQ8QEEdHEBAPKQ9ISA8pDxAQR0cQEA8pD0gAAQAA/8AEAAPAADAAABM0PgIzMh4CFRQOAiMqAScmNjcyFjMyPgI1NC4CIyIOAhUcARcOAScmNDUAUIu7amq7i1BQi7tqBw4HJQEpBgsGWp52RUV2nlpannZFAQFGBgEBwGq7i1BQi7tqaruLUAEGRgEBRXaeWlqedkVFdp5aBQkFJQklBw4HAAUAAP/zA6kDlwASACcAPQBTAHAAAAE0JjEmNDc2FhcwFhcUFhUuASMzMCIjFAYxBhQXFjY3MD4CJyoBMTM0JjEmND8BNjIXMB4CFxQWFSoBIzMwIiMUBjEGFB8BFjI3MD4CJyoBMSU0NjMwIjMyPgIxNhYVERQGJzAuAisBIiY9AQKpKQwMDBwLNwwFHyATFBEIKQwMCxsIFhoUAQwjny4ICAoIGgcSFxYEBRsfExUSCC4ICAoIGQgYHBYCECP8jzcqWJZLelgwCw4OCzldeD85KjwBwEVKFDATFAYTfEEMEgsEAUVPFDAUEwQPMEdSI1hrEzYTDxMTL0lZKgscDFhrEzYTFBMTP11rLFwqPVZoVhMFE/xmEwUTV2dXPCquAAEAAP/zAgUDlwAcAAATNDYzMCIzMj4CMTYWFREUBicwLgIrASImPQEANypYlkt6WDALDg4LOV14PzkqPAIcKj1WaFYTBRP8ZhMFE1dnVzwqrgAAAAMAAP/zAvsDlwASACcARAAAATQmMSY0NzYWFzAWFxQWFS4BIzMwIiMUBjEGFBcWNjcwPgInKgExJTQ2MzAiMzI+AjE2FhURFAYnMC4CKwEiJj0BAqkpDAwMHAs3DAUfIBMUEQgpDAwLGwgWGhQBDCP9QzcqWJZLelgwCw4OCzldeD85KjwBwEVKFDATFAYTfEEMEgsEAUVPFDAUEwQPMEdSI1wqPVZoVhMFE/xmEwUTV2dXPCquAAAEAC3/wQQTA6cACgAXACIALwAAARcWMj8BJwcGFBclDgEvASY2PwE2Fg8BARYUDwEnNz4BHwEFPgEfARYGDwEGJj8BAlAwDikOrHWsDg4BpAYwHdUdECjaJzEGH/38Dg6sdawOKQ4w/lwGMB3VHRAo2igwBh8CFDAODqx1rA4pDmcoDxzVHTAGHwYxJ9r+2Q4pDqx1rA4BDzBnKA8c1R0wBh8GMSfaAAAEAC//6APZA5IACgAXACIALwAANxcWMj8BJwcGFBclDgEvASY2PwE2Fg8BARYUDwEnNzYyHwEFPgEfARYGDwEGJj8BLywNJQ3Ka8oNDQGsBSwawxoPJMckLAUdAf4NDcpqyQ0lDSz+VAUtGsIaDiTHJCwFHBQsDQ3Ka8oNJQ2LJA8awxosBR0FLCTHAscNJA7JasoNDSyKJA4awhotBRwFLCTHAAIAEv/AAxoDwAAQACEAABMzMhYVERQGKwEiJjURNDYzITMyFhURFAYrASImNRE0NjNYah0qKh1qHSkpHQISah0pKR1qHSoqHQPAKR78jh4pKR4Dch4pKR78jh4pKR4Dch4pAAADAB7/3AcSA6QAMABOAF0AACUUBisBIiY1ETQmIyEiBhURFAYrASImNRE0NjsBMhYVERQWMyEyNjURNDY7ATIWFRElDgMrASImNRE0NjsBMh4CFx4DFRQOAgcDNC4CKwERMzI+AjUxAzchGFsXIiEX/vIYISEYWxciIRhbGCEhGAEOFyEhGFsXIgNTIlNicUDZGCEiF/c7aVxPICExIRARIjMiTSJFZ0VtWEpvSiUVFyIiGAEvFyIiF/7RGCIiFwNWFyIiF/72FyEhFwEKFyIiF/yqRh8wIBAiFwNWFyIQHy8fIEtXZDg7altOIAFpTnVOJ/2KKE93UAAAAAADAAD/wAXiA8AAEAAfAC4AABMRFBYzITI2NRE0JiMhIgYVATQ2MyEyFhUUBiMhIiY1JzQ2MyEyFhUUBiMhIiY1AEcyBPAzRkcy+xAzRgEtJBkDDhkkJBn88hkkeCMZBAAZIyMZ/AAZIwNI/PAyRkcxAxAyRkcx/WkZIyMZGSMjGbUZIyMZGSQkGQAAAAMAHv/cBmgDpAAdACsAfwAAJQ4DKwEiJjURNDY7ATIeAhceAxUUDgIHAzQuAisBETMyPgI1AQ4BIyImJzU0NhcwFhceATMyNjc+ATU0JicuAScuAScuAScuAScuATU0Njc+ATMyFhceATEHLgEnLgEjIgYHDgEVFBYXHgEXHgEXHgEXHgEVFAYHBeAiU2JyQNkYISIX9ztpXE8hIDIgEREiMyJNI0VnRW1YSnBKJfycL4RVTn88HxZFIiI/HCI0EhITCAgIGA8QPzAsQxcWJA0NDiwsLHlNJkkiI25DJ0EZGjIYHi0PEBAHBgYUDg5CM0VdGhkZLzBbHzAgECIXA1YXIhAfLx8gS1dkODtqW04gAWlOdU4n/YooT3dQ/mEkJRYdgBgVCBkJCAkMDQwmGQ0ZCwsUCgogFhQnExMrGRg6Ij5iJCQjCAkJKJsPFgYGBg0NDSMVDRcKChMJCSEYH0AfIE4uP2UlAAEAAAABAAAwsT5nXw889QALBAAAAAAA0hxAMQAAAADSHEAxAAD/wAcSA8AAAAAIAAIAAAAAAAAAAQAAA8D/wAAABxwAAAAABxIAAQAAAAAAAAAAAAAAAAAAABIEAAAAAAAAAAAAAAACAAAABeIAAAQAABoCtgANA80AAAQAAAADzQAAA80AAAPNAAAEMQAtBAAALwMsABIHHAAeBeIAAAZyAB4AAAAAAAoAFAAeAL4A+gEWAW4BsgJCAmwCyAMcA24DoAQeBGQFGAAAAAEAAAASAIAABQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAIAAAAAQAAAAAAAgAHAGkAAQAAAAAAAwAIADkAAQAAAAAABAAIAH4AAQAAAAAABQALABgAAQAAAAAABgAIAFEAAQAAAAAACgAaAJYAAwABBAkAAQAQAAgAAwABBAkAAgAOAHAAAwABBAkAAwAQAEEAAwABBAkABAAQAIYAAwABBAkABQAWACMAAwABBAkABgAQAFkAAwABBAkACgA0ALBjYy1pY29ucwBjAGMALQBpAGMAbwBuAHNWZXJzaW9uIDEuMABWAGUAcgBzAGkAbwBuACAAMQAuADBjYy1pY29ucwBjAGMALQBpAGMAbwBuAHNjYy1pY29ucwBjAGMALQBpAGMAbwBuAHNSZWd1bGFyAFIAZQBnAHUAbABhAHJjYy1pY29ucwBjAGMALQBpAGMAbwBuAHNGb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format(\'truetype\');font-weight:400;font-style:normal}.vjs-afterglow-skin{overflow:hidden;color:#fff}.vjs-afterglow-skin :focus,.vjs-afterglow-skin:focus{outline:0}.vjs-afterglow-skin video{background-color:#000}.vjs-afterglow-skin .vjs-slider{outline:0;position:relative;cursor:pointer;padding:0;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;margin:0 30px;background-color:#fff;background-color:rgba(255,255,255,.1)}@media (max-width:768px){.vjs-afterglow-skin .vjs-slider{margin:0 20px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-slider{margin:0 12px}}.vjs-afterglow-skin .vjs-slider:hover{margin:0 30px}@media (max-width:768px){.vjs-afterglow-skin .vjs-slider:hover{margin:0 20px}}.vjs-afterglow-skin .vjs-slider:focus{-webkit-box-shadow:0 0 2em #fff;-moz-box-shadow:0 0 2em #fff;box-shadow:0 0 2em #fff}.vjs-afterglow-skin .vjs-slider-handle{position:absolute;left:0;top:0;display:none}.vjs-afterglow-skin .vjs-play-progress:before{display:none!important;height:0;width:0;font-size:.9em}.vjs-afterglow-skin .vjs-progress-control .vjs-mouse-display,.vjs-afterglow-skin .vjs-progress-control:hover .vjs-mouse-display,.vjs-afterglow-skin .vjs-progress-control:hover .vjs-play-progress:after{display:none}.vjs-afterglow-skin .vjs-control-bar{display:none;position:absolute;bottom:16px;left:0;right:0;height:33px;font-family:\'Open Sans\';color:rgba(255,255,255,.9);background-color:#000;background-color:rgba(0,0,0,0)}@media (max-width:768px){.vjs-afterglow-skin .vjs-control-bar{bottom:7px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-slider:hover{margin:0 12px}.vjs-afterglow-skin .vjs-control-bar{bottom:0}}.vjs-afterglow-skin .vjs-control-bar .div{opacity:.9}.vjs-afterglow-skin .vjs-control-bar .div:hover{opacity:1}.vjs-afterglow-skin.vjs-has-started .vjs-control-bar{display:block;visibility:visible;opacity:1;transition:visibility .1s,opacity .1s}.vjs-afterglow-skin.vjs-has-started.vjs-ended .vjs-control-bar,.vjs-afterglow-skin.vjs-has-started.vjs-ended .vjs-top-control-bar{display:block;visibility:hidden;opacity:0}.vjs-afterglow-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{display:block;visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.vjs-afterglow-skin.vjs-controls-disabled .vjs-control-bar,.vjs-afterglow-skin.vjs-error .vjs-control-bar,.vjs-afterglow-skin.vjs-error .vjs-top-control-bar,.vjs-afterglow-skin.vjs-using-native-controls .vjs-control-bar{display:none}.vjs-afterglow-skin.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible}@media \\0screen{.vjs-afterglow-skin.vjs-user-inactive.vjs-playing .vjs-control-bar :before{content:""}}.vjs-afterglow-skin .vjs-control{outline:0;position:relative;float:left;text-align:center;margin:0;padding:0;height:40px;width:auto}.vjs-afterglow-skin .vjs-control.vjs-captions-button.vjs-control,.vjs-afterglow-skin .vjs-control.vjs-subtitles-button.vjs-control{width:40px}@media (max-width:768px){.vjs-afterglow-skin .vjs-control{height:30px}.vjs-afterglow-skin .vjs-control.vjs-captions-button.vjs-control,.vjs-afterglow-skin .vjs-control.vjs-subtitles-button.vjs-control{width:30px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-control.vjs-captions-button.vjs-control,.vjs-afterglow-skin .vjs-control.vjs-subtitles-button.vjs-control{width:20px}}.vjs-afterglow-skin .vjs-control:before{font-family:afterglow-icon;font-size:17px;line-height:18px;padding-top:10px;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;opacity:.9;text-shadow:0 0 0 rgba(255,255,255,0)}@media (max-width:768px){.vjs-afterglow-skin .vjs-control:before{font-size:13px;line-height:13px;padding-top:9px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-control:before{font-size:11px;line-height:11px;padding-top:6px}}.vjs-afterglow-skin .vjs-control:focus:before,.vjs-afterglow-skin .vjs-control:hover:before{text-shadow:0 0 5px rgba(255,255,255,.6);opacity:1}.vjs-afterglow-skin .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-afterglow-skin .vjs-play-control{width:50px;cursor:pointer;position:absolute;left:50%;margin-left:-25px}@media (max-width:512px){.vjs-afterglow-skin .vjs-play-control{position:relative;left:auto;margin-left:0;width:25px}}.vjs-afterglow-skin .vjs-play-control:before{content:"\\e602";margin-left:1px;font-size:22px}@media (max-width:768px){.vjs-afterglow-skin .vjs-play-control:before{font-size:20px;line-height:22px;top:-5px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-play-control:before{font-size:10px;line-height:10px;top:0}}.vjs-afterglow-skin.vjs-playing .vjs-play-control:before{content:"\\e60a"}.vjs-afterglow-skin .vjs-playback-rate .vjs-playback-rate-value{font-size:1.5em;line-height:2;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.5)}.vjs-afterglow-skin .vjs-playback-rate .vjs-playback-rate-value.vjs-menu-button .vjs-menu .vjs-menu-content{width:30px;left:15px;list-style:none}.vjs-afterglow-skin .vjs-mute-control,.vjs-afterglow-skin .vjs-volume-menu-button{cursor:pointer;float:right;width:auto;padding-left:32px;margin-left:10px}.vjs-afterglow-skin .vjs-mute-control:before,.vjs-afterglow-skin .vjs-volume-menu-button:before{content:"\\e605";cursor:pointer}.vjs-afterglow-skin .vjs-mute-control.vjs-vol-0:before,.vjs-afterglow-skin .vjs-volume-menu-button.vjs-vol-0:before{content:"\\e603"}.vjs-afterglow-skin .vjs-mute-control.vjs-vol-1:before,.vjs-afterglow-skin .vjs-volume-menu-button.vjs-vol-1:before{content:"\\e606"}.vjs-afterglow-skin .vjs-mute-control.vjs-vol-2:before,.vjs-afterglow-skin .vjs-volume-menu-button.vjs-vol-2:before{content:"\\e607"}@media (max-width:512px){.vjs-afterglow-skin .vjs-mute-control,.vjs-afterglow-skin .vjs-volume-menu-button{height:26px;padding-left:27px}}.vjs-afterglow-skin .vjs-volume-control{float:right}.vjs-afterglow-skin .vjs-volume-level{position:absolute;top:0;left:0;height:4px;width:100%;background-color:#fff;border-radius:4px}.vjs-afterglow-skin .vjs-volume-menu-button .vjs-menu,.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu{display:block;width:0;height:10px;border-top-color:transparent;position:relative;padding-left:0;top:0;padding-top:17px;padding-bottom:17px;left:0;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-afterglow-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content,.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu .vjs-menu-content{height:10px;width:0;float:right;left:0;box-shadow:none;background:0 0;position:relative;bottom:auto;overflow:hidden;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu{width:74px}@media (max-width:768px){.vjs-afterglow-skin .vjs-mute-control,.vjs-afterglow-skin .vjs-volume-menu-button{margin-left:0}.vjs-afterglow-skin .vjs-volume-menu-button .vjs-menu,.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu{left:0;padding-top:13px;padding-bottom:12px}.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu{padding-left:5px;padding-right:5px;width:50px}}@media (max-width:500px){.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu{display:none}.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu.vjs-lock-showing,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu.vjs-lock-showing{display:none!important}.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu .vjs-menu-content,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-menu-content{display:none}}.vjs-afterglow-skin .vjs-volume-bar .vjs-volume-handle:before,.vjs-afterglow-skin .vjs-volume-bar .vjs-volume-level:before,.vjs-afterglow-skin .vjs-volume-bar.vjs-slider-horizontal .vjs-volume-handle:before,.vjs-afterglow-skin .vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level:before{display:none}.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu .vjs-menu-content,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-menu-content{height:10px;width:61px;bottom:0;left:0;float:none;box-shadow:none;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}@media (max-width:768px){.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu .vjs-menu-content,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-menu-content{width:41px;left:-5px}.vjs-afterglow-skin .vjs-volume-bar,.vjs-afterglow-skin .vjs-volume-bar.vjs-slider-horizontal{width:0}}.vjs-afterglow-skin .vjs-volume-bar,.vjs-afterglow-skin .vjs-volume-bar.vjs-slider-horizontal{width:0;left:1px;height:5px;margin:0;background-color:rgba(255,255,255,.3);border-radius:5px;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-afterglow-skin .vjs-volume-bar .vjs-volume-handle,.vjs-afterglow-skin .vjs-volume-bar.vjs-slider-horizontal .vjs-volume-handle{width:0;height:0;left:100%}.vjs-afterglow-skin .vjs-volume-bar .vjs-volume-level,.vjs-afterglow-skin .vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level{height:4px;border-radius:4px}.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu .vjs-volume-bar.vjs-slider-horizontal,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-volume-bar.vjs-slider-horizontal{width:60px}@media (max-width:768px){.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu .vjs-volume-bar.vjs-slider-horizontal,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-volume-bar.vjs-slider-horizontal{width:40px}}.vjs-afterglow-skin .vjs-menu-button-popup .vjs-menu{position:relative;float:right}.vjs-afterglow-skin .vjs-progress-control{position:absolute;left:0;right:0;width:auto;height:5px;top:-9px;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;transition:all .3s}.vjs-afterglow-skin .vjs-progress-control:hover{top:-11px;height:9px;-webkit-transition:all 0s;-moz-transition:all 0s;-o-transition:all 0s;transition:all 0s}@media (max-width:768px){.vjs-afterglow-skin .vjs-progress-control:hover{top:-9px;height:7px}}.vjs-afterglow-skin:hover .vjs-progress-control{-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-afterglow-skin .vjs-progress-holder{height:100%}.vjs-afterglow-skin .vjs-progress-holder .vjs-load-progress,.vjs-afterglow-skin .vjs-progress-holder .vjs-play-progress{position:absolute;display:block;height:100%;margin:0;padding:0;width:0;left:0;top:0;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px}.vjs-afterglow-skin .vjs-progress-holder .vjs-load-progress div,.vjs-afterglow-skin.vjs-live .vjs-progress-control,.vjs-afterglow-skin.vjs-live .vjs-time-controls,.vjs-afterglow-skin.vjs-live .vjs-time-divider{display:none}.vjs-afterglow-skin .vjs-play-progress{background-color:#fff;box-shadow:0 0 5px rgba(255,255,255,.6);-moz-box-shadow:0 0 5px rgba(255,255,255,.6);-webkit-box-shadow:0 0 5px rgba(255,255,255,.6)}.vjs-afterglow-skin .vjs-load-progress{background:#646464;background:rgba(255,255,255,.2)}.vjs-afterglow-skin .vjs-load-progress div{background:#787878;background:rgba(255,255,255,.2)}.vjs-afterglow-skin .vjs-seek-handle{width:10px;height:100%}.vjs-afterglow-skin.vjs-live .vjs-live-display{display:block}.vjs-afterglow-skin .vjs-live-display{display:none;font-size:1em;line-height:3em}.vjs-afterglow-skin .vjs-time-controls{font-size:22px}.vjs-afterglow-skin .vjs-current-time,.vjs-afterglow-skin .vjs-duration{height:23px;position:relative;float:left;margin-top:7px;padding:0;font-weight:100;font-size:21px;line-height:22px;display:block;width:auto}@media (max-width:768px){.vjs-afterglow-skin .vjs-current-time,.vjs-afterglow-skin .vjs-duration{font-size:17px;line-height:17px}}.vjs-afterglow-skin.vjs-no-flex .vjs-current-time,.vjs-afterglow-skin.vjs-no-flex .vjs-duration{display:block}.vjs-afterglow-skin .vjs-current-time{margin-left:30px}@media (max-width:768px){.vjs-afterglow-skin .vjs-current-time{margin-left:20px}}.vjs-afterglow-skin .vjs-duration{float:right;text-align:right;margin-right:30px;padding-left:10px}@media (max-width:768px){.vjs-afterglow-skin .vjs-duration{margin-right:20px;padding-left:6px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-current-time,.vjs-afterglow-skin .vjs-duration{font-size:14px;line-height:14px;margin-top:5px}.vjs-afterglow-skin .vjs-current-time{margin-left:12px}.vjs-afterglow-skin .vjs-duration{margin-right:12px;padding-left:2px}}.vjs-afterglow-skin .vjs-remaining-time{display:none;float:right}.vjs-afterglow-skin .vjs-time-divider{float:left;line-height:3em}.vjs-afterglow-skin .vjs-top-control-bar{width:auto;height:auto;text-align:right;position:absolute;right:26px;top:13px;display:none;opacity:0}@media (max-width:768px){.vjs-afterglow-skin .vjs-top-control-bar{top:10px;right:18px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-top-control-bar{top:6px;right:10px}}.vjs-afterglow-skin .vjs-top-control-bar .vjs-control{width:20px;height:30px;text-align:right;line-height:13px;font-size:13px;cursor:pointer;opacity:.9;margin-left:20px}@media (max-width:768px){.vjs-afterglow-skin .vjs-top-control-bar .vjs-control{font-size:9px;line-height:9px;margin-left:5px}}.vjs-afterglow-skin .vjs-top-control-bar .vjs-control:hover{opacity:1}.vjs-afterglow-skin .vjs-top-control-bar .vjs-fullscreen-control:before{content:"\\e608"}.vjs-afterglow-skin .vjs-top-control-bar .vjs-lightbox-close-button:before{content:"\\e601"}.vjs-afterglow-skin.vjs-fullscreen .vjs-top-control-bar .vjs-fullscreen-control:before{content:"\\e609"}.vjs-afterglow-skin.vjs-has-started .vjs-top-control-bar{display:block;visibility:visible;opacity:1;transition:visibility .1s,opacity .1s}.vjs-afterglow-skin.vjs-has-started .vjs-top-control-bar .vjs-control{opacity:.9;-webkit-transition:visibility .1s,opacity .1s;-moz-transition:visibility .1s,opacity .1s;-o-transition:visibility .1s,opacity .1s;transition:visibility .1s,opacity .1s}.vjs-afterglow-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-top-control-bar{display:block;visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.vjs-afterglow-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-top-control-bar .vjs-control{opacity:.9}.vjs-afterglow-skin .vjs-big-play-button{display:block;z-index:2;position:absolute;width:80px;height:80px;text-align:center;vertical-align:middle;cursor:pointer;top:50%;left:50%;margin-left:-40px;margin-top:-40px;border:none;background:0 0;visibility:visible;opacity:1;-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-afterglow-skin.vjs-controls-disabled .vjs-big-play-button{display:none}.vjs-afterglow-skin.vjs-has-started .vjs-big-play-button{display:none;opacity:0}.vjs-afterglow-skin.vjs-has-started.vjs-ended .vjs-big-play-button{display:block;visibility:visible;opacity:1}.vjs-afterglow-skin.vjs-using-native-controls .vjs-big-play-button{display:block}.vjs-afterglow-skin .vjs-big-play-button:focus,.vjs-afterglow-skin:hover .vjs-big-play-button{outline:0;border:none;background:0 0;-webkit-transition:all 0s;-moz-transition:all 0s;-o-transition:all 0s;transition:all 0s}.vjs-afterglow-skin.vjs-seeking .vjs-big-play-button,.vjs-afterglow-skin.vjs-waiting .vjs-big-play-button{display:none;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}.vjs-afterglow-skin .vjs-big-play-button:before{content:"\\e602";font-family:afterglow-icon;line-height:80px;font-size:80px;text-shadow:0 0 5px #000;text-shadow:0 0 5px rgba(0,0,0,.6);text-align:center;position:absolute;left:0;width:100%;height:100%}@media (max-width:768px){.vjs-afterglow-skin .vjs-big-play-button:before{font-size:60px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-big-play-button:before{font-size:40px}}.vjs-afterglow-skin .vjs-error-display,.vjs-afterglow-skin.vjs-error .vjs-big-play-button{display:none}.vjs-afterglow-skin.vjs-error .vjs-error-display{display:block;position:absolute;left:0;top:0;width:100%;height:100%}.vjs-afterglow-skin .vjs-error .vjs-error-display:before{content:\'\'}.vjs-afterglow-skin .vjs-error-display div{position:absolute;bottom:40px;right:0;left:0;font-family:\'Open Sans\',Helvetica light,Helvetica,sans-serif;font-size:16px;text-align:center;padding:3px;background:#000;background:rgba(0,0,0,.5)}.vjs-afterglow-skin .vjs-error-display a,.vjs-afterglow-skin .vjs-error-display a:visited{color:#F4A460}.vjs-afterglow-skin .vjs-loading-spinner{position:absolute;top:50%;left:50%;width:32px;height:32px;margin-left:-16px;margin-top:-16px;clear:both;border:3px solid rgba(255,255,255,.1);border-top:3px rgba(255,255,255,.95) solid;border-radius:50%;-webkit-animation:spCircRot 1.6s infinite linear;animation:spCircRot 1.6s infinite linear}.vjs-afterglow-skin .vjs-loading-spinner:after,.vjs-afterglow-skin .vjs-loading-spinner:before{content:none;border:0}.vjs-afterglow-skin .vjs-seeking .vjs-loading-spinner,.vjs-afterglow-skin .vjs-waiting .vjs-loading-spinner{display:block;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}.vjs-afterglow-skin .vjs-error .vjs-loading-spinner{display:none;-webkit-animation:none;-moz-animation:none;-o-animation:none;animation:none}@-moz-keyframes spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.vjs-afterglow-skin .vjs-menu-button{float:right;cursor:pointer}.vjs-afterglow-skin .vjs-menu-button.vjs-menu-button-inline{width:auto}.vjs-afterglow-skin .vjs-menu-button.vjs-menu-button-inline:before{width:30px}.vjs-afterglow-skin .vjs-menu{display:none;position:relative;bottom:auto;left:-85px;width:0;height:0;margin-bottom:0}@media (max-width:768px){.vjs-afterglow-skin .vjs-menu{left:-75px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-menu{left:-70px}}.vjs-afterglow-skin .vjs-menu-button .vjs-menu .vjs-menu-content{display:block;padding:0 0 70px;margin:0;position:absolute;bottom:-50px;width:100px;max-height:none;overflow:auto;left:12px;font-family:\'Open Sans\',Helvetica Light,Helvetica,sans-serif;background:0 0}@media (max-width:768px){.vjs-afterglow-skin .vjs-menu-button .vjs-menu .vjs-menu-content{left:12px;bottom:-40px;padding-bottom:60px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-menu-button .vjs-menu .vjs-menu-content{left:11px;bottom:-30px;padding-bottom:50px}}.vjs-afterglow-skin .vjs-control-content .vjs-menu.vjs-lock-showing,.vjs-afterglow-skin .vjs-menu-button:hover .vjs-control-content .vjs-menu{display:block}.vjs-afterglow-skin.vjs-scrubbing .vjs-menu-button:hover .vjs-control-content .vjs-menu{display:none}.vjs-afterglow-skin .vjs-menu-button ul li{list-style:none;margin:0;padding:0 5px;line-height:16px;font-size:14px;text-align:center;text-transform:lowercase;opacity:.7;text-shadow:0 0 0 rgba(255,255,255,0)}.vjs-afterglow-skin .vjs-menu-button ul li.vjs-selected,.vjs-afterglow-skin .vjs-menu-button ul li.vjs-selected:focus,.vjs-afterglow-skin .vjs-menu-button ul li.vjs-selected:hover,.vjs-afterglow-skin .vjs-menu-button ul li:focus,.vjs-afterglow-skin .vjs-menu-button ul li:hover{text-shadow:0 0 5px rgba(255,255,255,.6);opacity:1;background:0 0;color:#fff}.vjs-afterglow-skin .vjs-menu-button ul li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em;font-weight:700;cursor:afterglow}.vjs-afterglow-skin .vjs-subtitles-button:before{content:"\\e60d"}.vjs-afterglow-skin .vjs-captions-button:before{content:"\\e600"}.vjs-afterglow-skin video::-webkit-media-text-track-container{bottom:40px;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;transition:all .3s}@media (max-width:768px){.vjs-afterglow-skin video::-webkit-media-text-track-container{bottom:20px}}.vjs-afterglow-skin video::-webkit-media-text-track-background{background-color:rgba(0,0,0,.5);border-radius:3px;padding:10px 14px}.vjs-afterglow-skin video::-webkit-media-text-track-display{color:#fff;font-family:Open Sans,Georgia;font-size:16px;padding:5px 10px 8px}@media (max-width:768px){.vjs-afterglow-skin video::-webkit-media-text-track-display{font-size:14px}}@media (max-width:512px){.vjs-afterglow-skin video::-webkit-media-text-track-container{bottom:10px}.vjs-afterglow-skin video::-webkit-media-text-track-display{font-size:11px}}.vjs-afterglow-skin.vjs-user-active video::-webkit-media-text-track-container{bottom:70px}@media (max-width:768px){.vjs-afterglow-skin.vjs-user-active video::-webkit-media-text-track-container{bottom:40px}}.vjs-afterglow-skin .vjs-chapters-button.vjs-menu-button .vjs-menu .vjs-menu-content{width:24em;left:-12em}.vjs-afterglow-skin.vjs-responsive,.vjs-afterglow-skin.vjs-responsive video{width:100%;height:auto}.vjs-afterglow-skin .vjs-captions-button:focus .vjs-control-content:before,.vjs-afterglow-skin .vjs-captions-button:hover .vjs-control-content:before{-webkit-box-shadow:0 0 1em #fff;-moz-box-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.vjs-afterglow-skin .vjs-tech:focus{outline:0}.vjs-afterglow-skin.vjs-responsive.vjs-has-started .vjs-tech{padding-top:0!important}.vjs-afterglow-skin.vjs-responsive.vjs-fullscreen video{height:100%}.vjs-afterglow-skin .vjs-ag-res-button{float:right;cursor:pointer;width:50px;font-family:afterglow-icon}@media (max-width:768px){.vjs-afterglow-skin .vjs-ag-res-button{width:30px;margin-left:-4px}}@media (max-width:512px){.vjs-afterglow-skin.vjs-user-active video::-webkit-media-text-track-container{bottom:30px}.vjs-afterglow-skin .vjs-ag-res-button{width:20px;margin-right:5px;margin-left:0}}.vjs-afterglow-skin .vjs-ag-res-button:before{font-family:afterglow-icon;content:"\\e60f"}.vjs-afterglow-skin .vjs-ag-res-button.vjs-ag-res-hd:before{content:"\\e60b";margin-left:.5px}.vjs-afterglow-skin.vjs-IE .vjs-ag-res-button{font-size:17px;line-height:18px;padding-top:10px}@media (max-width:768px){.vjs-afterglow-skin.vjs-IE .vjs-ag-res-button{font-size:9px;line-height:9px;margin-left:5px}}.vjs-afterglow-skin .vjs-poster{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";-moz-opacity:.8;-khtml-opacity:.8;opacity:.8;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-afterglow-skin:hover .vjs-poster{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";-moz-opacity:1;-khtml-opacity:1;opacity:1}.vjs-afterglow-skin.vjs-youtube>div:first-child{position:absolute!important;margin:0;height:100%;top:0;width:100%}.video-js,.vjs-caption-settings{position:relative;background-color:#000}.vjs-afterglow-skin.vjs-youtube iframe{display:block;visibility:hidden}.vjs-afterglow-skin.vjs-youtube.vjs-IE iframe{display:block;visibility:visible}.vjs-afterglow-skin.vjs-youtube .vjs-control-bar{right:80px;width:auto;-webkit-transition:all .1s;-moz-transition:all .1s;-o-transition:all .1s;transition:all .1s;-webkit-transition-delay:.4s;-moz-transition-delay:.4s;-o-transition-delay:.4s;transition-delay:.4s}.vjs-afterglow-skin.vjs-youtube.vjs-has-started .vjs-control-bar{right:0;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;transition:all .3s;-webkit-transition-delay:.4s;-moz-transition-delay:.4s;-o-transition-delay:.4s;transition-delay:.4s}.vjs-afterglow-skin.vjs-youtube.vjs-has-started.vjs-ended .vjs-control-bar,.vjs-afterglow-skin.vjs-youtube.vjs-has-started.vjs-paused .vjs-control-bar{right:80px;width:auto;-webkit-transition:all .1s;-moz-transition:all .1s;-o-transition:all .1s;transition:all .1s}.video-js.vjs-has-started .vjs-poster,.vjs-poster{-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s}.vjs-afterglow-skin.vjs-youtube.vjs-iOS .vjs-big-play-button,.vjs-afterglow-skin.vjs-youtube.vjs-iOS .vjs-poster,.vjs-afterglow-skin.vjs-youtube.vjs-using-native-controls .vjs-big-play-button,.vjs-afterglow-skin.vjs-youtube.vjs-using-native-controls .vjs-poster{display:none}.vjs-afterglow-skin.vjs-youtube.vjs-iOS iframe,.vjs-afterglow-skin.vjs-youtube.vjs-using-native-controls iframe{display:block;visibility:visible}.vjs-afterglow-skin.vjs-youtube.vjs-iOS .vjs-loading-spinner,.vjs-afterglow-skin.vjs-youtube.vjs-iOS .vjs-text-track-display,.vjs-afterglow-skin.vjs-youtube.vjs-using-native-controls .vjs-loading-spinner,.vjs-afterglow-skin.vjs-youtube.vjs-using-native-controls .vjs-text-track-display{display:none}.vjs-afterglow-skin.vjs-IE.vjs-youtube iframe,.vjs-afterglow-skin.vjs-has-started.vjs-youtube iframe{display:block;visibility:visible}.video-js{padding:0;font-size:22px;vertical-align:middle;font-weight:400;font-style:normal;font-family:Arial,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.video-js:-moz-full-screen{position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js .vjs-tech,.vjs-poster{top:0;width:100%;position:absolute;left:0}.video-js .vjs-tech{height:100%}body.vjs-full-window{padding:0;margin:0;height:100%;overflow-y:auto}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-poster{background-repeat:no-repeat;background-position:50% 50%;background-size:contain;cursor:pointer;margin:0;padding:0;right:0;bottom:0;transition:all .2s}.vjs-poster img{display:block;margin:0 auto;max-height:100%;padding:0}.video-js.vjs-has-started .vjs-poster{display:none;visibility:hidden;opacity:0;transition:all .2s}.video-js.vjs-has-started.vjs-ended .vjs-poster{display:block;visibility:visible;opacity:1;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.video-js.vjs-audio.vjs-has-started .vjs-poster{display:block}.video-js.vjs-controls-disabled .vjs-poster{display:none}.video-js.vjs-using-native-controls .vjs-poster{display:block}.video-js .vjs-text-track-display{position:absolute;bottom:50px;pointer-events:none}.vjs-caption-settings{top:1em;opacity:.75;color:#FFF;margin:0 auto;padding:.5em;height:15em;font-family:Arial,Helvetica,sans-serif;font-size:12px;width:40em}.vjs-caption-settings .vjs-tracksettings{top:0;bottom:2em;left:0;right:0;position:absolute;overflow:auto}.vjs-caption-settings .vjs-tracksettings-colors,.vjs-caption-settings .vjs-tracksettings-font{float:left}.vjs-caption-settings .vjs-tracksettings-colors:after,.vjs-caption-settings .vjs-tracksettings-controls:after,.vjs-caption-settings .vjs-tracksettings-font:after{clear:both}.vjs-caption-settings .vjs-tracksettings-controls{position:absolute;bottom:1em;right:1em}.vjs-caption-settings .vjs-tracksetting{margin:5px;padding:3px;min-height:40px}.vjs-caption-settings .vjs-tracksetting label{display:block;width:100px;margin-bottom:5px}.vjs-caption-settings .vjs-tracksetting span{display:inline;margin-left:5px}.vjs-caption-settings .vjs-tracksetting>div{margin-bottom:5px;min-height:20px}.vjs-caption-settings .vjs-tracksetting>div:last-child{margin-bottom:0;padding-bottom:0;min-height:0}.vjs-caption-settings label>input{margin-right:10px}.vjs-caption-settings input[type=button]{width:40px;height:40px}.vjs-hidden{display:none!important}.vjs-lock-showing{display:block!important;opacity:1;visibility:visible}.vjs-no-js{padding:2em;color:#ccc;background-color:#333;font-size:1.8em;font-family:Arial,sans-serif;text-align:center;width:30em;height:15em;margin:0 auto}.vjs-no-js a,.vjs-no-js a:visited{color:#F4A460}@-webkit-keyframes spCircRot{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(359deg)}}@keyframes spCircRot{from{transform:rotate(0)}to{transform:rotate(359deg)}}'), -function(t,e){var o=t.createElement("style");if(t.getElementsByTagName("head")[0].appendChild(o),o.styleSheet)o.styleSheet.disabled||(o.styleSheet.cssText=e);else try{o.innerHTML=e}catch(n){o.innerText=e}}(document,".vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar{background-color:#fff;background-color:rgba(255,255,255,.9);bottom:0;height:51px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar *{color:#000}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control{top:-5px;background-color:#fff;background-color:rgba(255,255,255,.9)}@media (max-width:768px){.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar{height:42px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control{background-color:#fff}}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control:hover{top:-7px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control .vjs-progress-holder{margin:0}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control .vjs-progress-holder .vjs-load-progress,.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control .vjs-progress-holder .vjs-play-progress{border-radius:0;-moz-border-radius:0;-webkit-border-radius:0}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control .vjs-progress-holder .vjs-load-progress{background-color:#777}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control .vjs-progress-holder .vjs-play-progress{background-color:#000;box-shadow:0 0 5px rgba(0,0,0,.6);-moz-box-shadow:0 0 5px rgba(0,0,0,.6);-webkit-box-shadow:0 0 5px rgba(0,0,0,.6)}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-current-time,.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-duration{margin-top:12px}@media (max-width:768px){.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-current-time,.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-duration{margin-top:11px}}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-current-time{margin-left:20px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-duration{margin-right:20px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-volume-menu-button .vjs-menu,.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu{padding-top:22px}@media (max-width:512px){.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar{height:34px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-play-control:before{font-size:11px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-current-time,.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-duration{margin-top:9px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-current-time{margin-left:14px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-duration{margin-right:10px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-volume-menu-button .vjs-menu,.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu{padding-top:14pxpx}}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-volume-bar{background-color:#555;background-color:rgba(0,0,0,.3)}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-volume-bar .vjs-volume-level{background-color:#000}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-menu ul.vjs-menu-content li{color:#fff;color:rgba(255,255,255,.8)}.vjs-afterglow-skin.afterglow-skin-light .vjs-control:before{margin-top:5px}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar{right:20px;top:16px}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar *{color:#000}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar .vjs-button{background-color:#fff;background-color:rgba(255,255,255,.9);width:32px;height:32px;border-radius:50px;-moz-border-radius:50px;-webkit-border-radius:50px;margin-left:7px}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar .vjs-button:before{margin-top:-1px;font-size:15px;line-height:16px}@media (max-width:768px){.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar{top:14px;right:16px}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar .vjs-button{width:28px;height:28px}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar .vjs-button:before{font-size:14px;line-height:15px;margin-top:-2px}}@media (max-width:512px){.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar .vjs-button{width:24px;height:24px}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar .vjs-button:before{font-size:12px;line-height:13px;margin-top:0}}.vjs-afterglow-skin.afterglow-skin-light.vjs-youtube.vjs-has-started.vjs-paused .vjs-control-bar{right:0;background-color:#fff}"),function(t,e){var o=t.createElement("style");if(t.getElementsByTagName("head")[0].appendChild(o),o.styleSheet)o.styleSheet.disabled||(o.styleSheet.cssText=e);else try{o.innerHTML=e}catch(n){o.innerText=e}}(document,".afterglow-lightbox-wrapper{width:100%;height:100%;position:fixed;top:0;left:0;z-index:999999}.afterglow-lightbox-wrapper .cover{width:100%;height:100%;position:absolute;top:0;left:0;background-color:#000;background-color:rgba(0,0,0,.85)}.afterglow-lightbox-wrapper .afterglow-lightbox{display:block!important;position:absolute;top:0;left:0}.afterglow-lightbox-wrapper .afterglow-lightbox .afterglow-lightboxplayer,.afterglow-lightbox-wrapper .afterglow-lightbox .afterglow-lightboxplayer video{display:block!important}.afterglow-lightbox-wrapper .afterglow-lightbox div.vjs-fullscreen{top:0!important;left:0!important}.afterglow-lightbox-wrapper .afterglow-lightbox .vjs-paused.vjs-ended .vjs-big-play-button{display:block}#afterglow-lightbox-videoel,.afterglow-lightbox-wrapper.hidden,.afterglow-lightboxplayer{display:none}"),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.videojs=t()}}(function(){var t;return function e(t,o,n){function i(s,a){if(!o[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(r)return r(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var c=o[s]={exports:{}};t[s][0].call(c.exports,function(e){var o=t[s][1][e];return i(o?o:e)},c,c.exports,e,t,o,n)}return o[s].exports}for(var r="function"==typeof require&&require,s=0;se?l(m,d):y=setTimeout(u,t)}function c(){l(j,y)}function p(){if(f=arguments,v=r(),g=this,m=j&&(y||!w),b===!1)var o=w&&!y;else{d||w||(A=v);var n=b-(v-A),i=n<=0||n>b;i?(d&&(d=clearTimeout(d)),A=v,h=t.apply(g,f)):d||(d=setTimeout(c,n))}return i&&y?y=clearTimeout(y):y||e===b||(y=setTimeout(u,e)),o&&(i=!0,h=t.apply(g,f)),!i||y||d||(f=g=void 0),h}var f,d,h,v,g,y,m,A=0,b=!1,j=!0;if("function"!=typeof t)throw new TypeError(s);if(e=e<0?0:+e||0,o===!0){var w=!0;j=!1}else i(o)&&(w=!!o.leading,b="maxWait"in o&&a(+o.maxWait||0,e),j="trailing"in o?!!o.trailing:j);return p.cancel=n,p}var i=t("../lang/isObject"),r=t("../date/now"),s="Expected a function",a=Math.max;e.exports=n},{"../date/now":4,"../lang/isObject":33}],6:[function(t,e,o){function n(t,e){if("function"!=typeof t)throw new TypeError(i);return e=r(void 0===e?t.length-1:+e||0,0),function(){for(var o=arguments,n=-1,i=r(o.length-e,0),s=Array(i);++n2?o[s-2]:void 0,l=s>2?o[2]:void 0,u=s>1?o[s-1]:void 0;for("function"==typeof a?(a=i(a,u,5),s-=2):(a="function"==typeof u?u:void 0,s-=a?1:0),l&&r(o[0],o[1],l)&&(a=s<3?void 0:a,s=1);++n-1&&t%1==0&&t-1&&t%1==0&&t<=i}var i=9007199254740991;e.exports=n},{}],26:[function(t,e,o){function n(t){return!!t&&"object"==typeof t}e.exports=n},{}],27:[function(t,e,o){function n(t){for(var e=u(t),o=e.length,n=o&&t.length,c=!!n&&a(n)&&(r(t)||i(t)||l(t)),f=-1,d=[];++f0,y=f.enumErrorProps&&(t===k||t instanceof Error),m=f.enumPrototypes&&a(t);++n2?arguments[2]:{},s=n(e);r&&(s=s.concat(Object.getOwnPropertySymbols(e))),i(s,function(n){c(t,n,e[n],o[n])})};p.supportsDescriptors=!!u,e.exports=p},{foreach:47,"object-keys":50}],47:[function(t,e,o){var n=Object.prototype.hasOwnProperty,i=Object.prototype.toString;e.exports=function(t,e,o){if("[object Function]"!==i.call(e))throw new TypeError("iterator must be a function");var r=t.length;if(r===+r)for(var s=0;s0&&!n.call(t,0))for(var h=0;h0)for(var v=0;v=0&&"[object Function]"===n.call(t.callee)),o}},{}],52:[function(t,e,o){"use strict";var n=t("./implementation"),i=function(){if(!Object.assign)return!1;for(var t="abcdefghijklmnopqrst",e=t.split(""),o={},n=0;n0&&(h=setTimeout(function(){d=!0,u.abort("timeout");var t=new Error("XMLHttpRequest timeout");t.code="ETIMEDOUT",n(t)},t.timeout)),u.setRequestHeader)for(p in m)m.hasOwnProperty(p)&&u.setRequestHeader(p,m[p]);else if(t.headers&&!i(t.headers))throw new Error("Headers cannot be set on an XDomainRequest object");return"responseType"in t&&(u.responseType=t.responseType),"beforeSend"in t&&"function"==typeof t.beforeSend&&t.beforeSend(u),u.send(y),u}function l(){}var u=t("global/window"),c=t("once"),p=t("is-function"),f=t("parse-headers"),d=t("xtend");e.exports=s,s.XMLHttpRequest=u.XMLHttpRequest||l,s.XDomainRequest="withCredentials"in new s.XMLHttpRequest?s.XMLHttpRequest:u.XDomainRequest,n(["get","put","post","patch","head","delete"],function(t){s["delete"===t?"del":t]=function(e,o,n){return o=r(e,o,n),o.method=t.toUpperCase(),a(o)}})},{"global/window":2,"is-function":57,once:58,"parse-headers":61,xtend:62}],57:[function(t,e,o){function n(t){var e=i.call(t);return"[object Function]"===e||"function"==typeof t&&"[object RegExp]"!==e||"undefined"!=typeof window&&(t===window.setTimeout||t===window.alert||t===window.confirm||t===window.prompt)}e.exports=n;var i=Object.prototype.toString},{}],58:[function(t,e,o){function n(t){var e=!1;return function(){if(!e)return e=!0,t.apply(this,arguments)}}e.exports=n,n.proto=n(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return n(this)},configurable:!0})})},{}],59:[function(t,e,o){function n(t,e,o){if(!a(e))throw new TypeError("iterator must be a function");arguments.length<3&&(o=this),"[object Array]"===l.call(t)?i(t,e,o):"string"==typeof t?r(t,e,o):s(t,e,o)}function i(t,e,o){for(var n=0,i=t.length;n=0;t--)this.children_[t].dispose&&this.children_[t].dispose();this.children_=null,this.childIndex_=null,this.childNameIndex_=null,this.off(),this.el_.parentNode&&this.el_.parentNode.removeChild(this.el_),u.removeElData(this.el_),this.el_=null},t.prototype.player=function(){return this.player_},t.prototype.options=function(t){return y["default"].warn("this.options() has been deprecated and will be moved to the constructor in 6.0"),t?(this.options_=k["default"](this.options_,t),this.options_):this.options_},t.prototype.el=function(){return this.el_},t.prototype.createEl=function(t,e,o){return u.createEl(t,e,o)},t.prototype.localize=function(t){var e=this.player_.language&&this.player_.language(),o=this.player_.languages&&this.player_.languages();if(!e||!o)return t;var n=o[e];if(n&&n[t])return n[t];var i=e.split("-")[0],r=o[i];return r&&r[t]?r[t]:t},t.prototype.contentEl=function(){return this.contentEl_||this.el_},t.prototype.id=function(){return this.id_},t.prototype.name=function(){return this.name_},t.prototype.children=function(){return this.children_},t.prototype.getChildById=function(t){return this.childIndex_[t]},t.prototype.getChild=function(t){return this.childNameIndex_[t]},t.prototype.addChild=function(e){var o=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],n=arguments.length<=2||void 0===arguments[2]?this.children_.length:arguments[2],i=void 0,r=void 0;if("string"==typeof e){r=e,o||(o={}),o===!0&&(y["default"].warn("Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`."),o={});var s=o.componentClass||A["default"](r);o.name=r;var a=t.getComponent(s);if(!a)throw new Error("Component "+s+" does not exist");if("function"!=typeof a)return null;i=new a(this.player_||this,o)}else i=e;if(this.children_.splice(n,0,i),"function"==typeof i.id&&(this.childIndex_[i.id()]=i),r=r||i.name&&i.name(),r&&(this.childNameIndex_[r]=i),"function"==typeof i.el&&i.el()){var l=this.contentEl().children,u=l[n]||null;this.contentEl().insertBefore(i.el(),u)}return i},t.prototype.removeChild=function(t){if("string"==typeof t&&(t=this.getChild(t)),t&&this.children_){for(var e=!1,o=this.children_.length-1;o>=0;o--)if(this.children_[o]===t){e=!0,this.children_.splice(o,1);break}if(e){this.childIndex_[t.id()]=null,this.childNameIndex_[t.name()]=null;var n=t.el();n&&n.parentNode===this.contentEl()&&this.contentEl().removeChild(t.el())}}},t.prototype.initChildren=function(){var e=this,o=this.options_.children;o&&!function(){var n=e.options_,i=function(t){var o=t.name,i=t.opts;if(void 0!==n[o]&&(i=n[o]),i!==!1){i===!0&&(i={}),i.playerOptions=e.options_.playerOptions;var r=e.addChild(o,i);r&&(e[o]=r)}},r=void 0,s=t.getComponent("Tech");r=Array.isArray(o)?o:Object.keys(o),r.concat(Object.keys(e.options_).filter(function(t){return!r.some(function(e){return"string"==typeof e?t===e:t===e.name})})).map(function(t){var n=void 0,i=void 0;return"string"==typeof t?(n=t,i=o[n]||e.options_[n]||{}):(n=t.name,i=t),{name:n,opts:i}}).filter(function(e){var o=t.getComponent(e.opts.componentClass||A["default"](e.name));return o&&!s.isTech(o)}).forEach(i)}()},t.prototype.buildCSSClass=function(){return""},t.prototype.on=function(t,e,o){var n=this;return"string"==typeof t||Array.isArray(t)?v.on(this.el_,t,p.bind(this,e)):!function(){var i=t,r=e,s=p.bind(n,o),a=function(){return n.off(i,r,s)};a.guid=s.guid,n.on("dispose",a);var l=function(){return n.off("dispose",a)};l.guid=s.guid,t.nodeName?(v.on(i,r,s),v.on(i,"dispose",l)):"function"==typeof t.on&&(i.on(r,s),i.on("dispose",l))}(),this},t.prototype.off=function(t,e,o){if(!t||"string"==typeof t||Array.isArray(t))v.off(this.el_,t,e);else{var n=t,i=e,r=p.bind(this,o);this.off("dispose",r),t.nodeName?(v.off(n,i,r),v.off(n,"dispose",r)):(n.off(i,r),n.off("dispose",r))}return this},t.prototype.one=function(t,e,o){var n=this,i=arguments;return"string"==typeof t||Array.isArray(t)?v.one(this.el_,t,p.bind(this,e)):!function(){var r=t,s=e,a=p.bind(n,o),l=function u(){n.off(r,s,u),a.apply(null,i)};l.guid=a.guid,n.on(r,s,l)}(),this},t.prototype.trigger=function(t,e){return v.trigger(this.el_,t,e),this},t.prototype.ready=function(t){var e=!(arguments.length<=1||void 0===arguments[1])&&arguments[1];return t&&(this.isReady_?e?t.call(this):this.setTimeout(t,1):(this.readyQueue_=this.readyQueue_||[],this.readyQueue_.push(t))),this},t.prototype.triggerReady=function(){this.isReady_=!0,this.setTimeout(function(){var t=this.readyQueue_;this.readyQueue_=[],t&&t.length>0&&t.forEach(function(t){t.call(this)},this),this.trigger("ready")},1)},t.prototype.$=function(t,e){return u.$(t,e||this.contentEl())},t.prototype.$$=function(t,e){return u.$$(t,e||this.contentEl())},t.prototype.hasClass=function(t){return u.hasElClass(this.el_,t)},t.prototype.addClass=function(t){return u.addElClass(this.el_,t),this},t.prototype.removeClass=function(t){return u.removeElClass(this.el_,t),this},t.prototype.toggleClass=function(t,e){return u.toggleElClass(this.el_,t,e),this},t.prototype.show=function(){return this.removeClass("vjs-hidden"),this},t.prototype.hide=function(){return this.addClass("vjs-hidden"),this},t.prototype.lockShowing=function(){return this.addClass("vjs-lock-showing"),this},t.prototype.unlockShowing=function(){return this.removeClass("vjs-lock-showing"),this},t.prototype.width=function(t,e){return this.dimension("width",t,e)},t.prototype.height=function(t,e){return this.dimension("height",t,e)},t.prototype.dimensions=function(t,e){return this.width(t,!0).height(e)},t.prototype.dimension=function(t,e,o){if(void 0!==e)return null!==e&&e===e||(e=0),(""+e).indexOf("%")!==-1||(""+e).indexOf("px")!==-1?this.el_.style[t]=e:"auto"===e?this.el_.style[t]="":this.el_.style[t]=e+"px",o||this.trigger("resize"),this;if(!this.el_)return 0;var n=this.el_.style[t],i=n.indexOf("px");return i!==-1?parseInt(n.slice(0,i),10):parseInt(this.el_["offset"+A["default"](t)],10)},t.prototype.emitTapEvents=function(){var t=0,e=null,o=10,n=200,i=void 0;this.on("touchstart",function(o){1===o.touches.length&&(e=j["default"]({},o.touches[0]),t=(new Date).getTime(),i=!0)}),this.on("touchmove",function(t){if(t.touches.length>1)i=!1;else if(e){var n=t.touches[0].pageX-e.pageX,r=t.touches[0].pageY-e.pageY,s=Math.sqrt(n*n+r*r);s>o&&(i=!1)}});var r=function(){i=!1};this.on("touchleave",r),this.on("touchcancel",r),this.on("touchend",function(o){if(e=null,i===!0){var r=(new Date).getTime()-t;r'+this.localize("Stream Type")+""+this.localize("LIVE")},{"aria-live":"off"}),e.appendChild(this.contentEl_),e},e.prototype.updateShowing=function(){this.player().duration()===1/0?this.show():this.hide()},e}(l["default"]);l["default"].registerComponent("LiveDisplay",p),o["default"]=p,e.exports=o["default"]},{"../component":67,"../utils/dom.js":132}],71:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("../button"),l=i(a),u=t("../component"),c=i(u),p=t("../utils/dom.js"),f=n(p),d=function(t){function e(o,n){r(this,e),t.call(this,o,n),this.on(o,"volumechange",this.update),o.tech_&&o.tech_.featuresVolumeControl===!1&&this.addClass("vjs-hidden"),this.on(o,"loadstart",function(){this.update(),o.tech_.featuresVolumeControl===!1?this.addClass("vjs-hidden"):this.removeClass("vjs-hidden")})}return s(e,t),e.prototype.buildCSSClass=function(){return"vjs-mute-control "+t.prototype.buildCSSClass.call(this)},e.prototype.handleClick=function(){this.player_.muted(!this.player_.muted())},e.prototype.update=function(){var t=this.player_.volume(),e=3;0===t||this.player_.muted()?e=0:t<.33?e=1:t<.67&&(e=2);var o=this.player_.muted()?"Unmute":"Mute";this.controlText()!==o&&this.controlText(o);for(var n=0;n<4;n++)f.removeElClass(this.el_,"vjs-vol-"+n);f.addElClass(this.el_,"vjs-vol-"+e)},e}(l["default"]);d.prototype.controlText_="Mute",c["default"].registerComponent("MuteToggle",d),o["default"]=d,e.exports=o["default"]},{"../button":64,"../component":67,"../utils/dom.js":132}],72:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var s=t("../button.js"),a=n(s),l=t("../component.js"),u=n(l),c=function(t){function e(o,n){i(this,e),t.call(this,o,n),this.on(o,"play",this.handlePlay),this.on(o,"pause",this.handlePause)}return r(e,t),e.prototype.buildCSSClass=function(){return"vjs-play-control "+t.prototype.buildCSSClass.call(this)},e.prototype.handleClick=function(){this.player_.paused()?this.player_.play():this.player_.pause()},e.prototype.handlePlay=function(){this.removeClass("vjs-paused"),this.addClass("vjs-playing"),this.controlText("Pause")},e.prototype.handlePause=function(){this.removeClass("vjs-playing"),this.addClass("vjs-paused"),this.controlText("Play")},e}(a["default"]);c.prototype.controlText_="Play",u["default"].registerComponent("PlayToggle",c),o["default"]=c,e.exports=o["default"]},{"../button.js":64,"../component.js":67}],73:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("../../menu/menu-button.js"),l=i(a),u=t("../../menu/menu.js"),c=i(u),p=t("./playback-rate-menu-item.js"),f=i(p),d=t("../../component.js"),h=i(d),v=t("../../utils/dom.js"),g=n(v),y=function(t){function e(o,n){r(this,e),t.call(this,o,n),this.updateVisibility(),this.updateLabel(),this.on(o,"loadstart",this.updateVisibility),this.on(o,"ratechange",this.updateLabel)}return s(e,t),e.prototype.createEl=function(){var e=t.prototype.createEl.call(this);return this.labelEl_=g.createEl("div",{className:"vjs-playback-rate-value",innerHTML:1}),e.appendChild(this.labelEl_),e},e.prototype.buildCSSClass=function(){return"vjs-playback-rate "+t.prototype.buildCSSClass.call(this)},e.prototype.createMenu=function(){var t=new c["default"](this.player()),e=this.playbackRates();if(e)for(var o=e.length-1;o>=0;o--)t.addChild(new f["default"](this.player(),{rate:e[o]+"x"}));return t},e.prototype.updateARIAAttributes=function(){this.el().setAttribute("aria-valuenow",this.player().playbackRate())},e.prototype.handleClick=function(){for(var t=this.player().playbackRate(),e=this.playbackRates(),o=e[0],n=0;nt){o=e[n];break}this.player().playbackRate(o)},e.prototype.playbackRates=function(){return this.options_.playbackRates||this.options_.playerOptions&&this.options_.playerOptions.playbackRates},e.prototype.playbackRateSupported=function(){return this.player().tech_&&this.player().tech_.featuresPlaybackRate&&this.playbackRates()&&this.playbackRates().length>0},e.prototype.updateVisibility=function(){this.playbackRateSupported()?this.removeClass("vjs-hidden"):this.addClass("vjs-hidden")},e.prototype.updateLabel=function(){this.playbackRateSupported()&&(this.labelEl_.innerHTML=this.player().playbackRate()+"x")},e}(l["default"]);y.prototype.controlText_="Playback Rate",h["default"].registerComponent("PlaybackRateMenuButton",y),o["default"]=y,e.exports=o["default"]},{"../../component.js":67,"../../menu/menu-button.js":104,"../../menu/menu.js":106,"../../utils/dom.js":132,"./playback-rate-menu-item.js":74}],74:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var s=t("../../menu/menu-item.js"),a=n(s),l=t("../../component.js"),u=n(l),c=function(t){function e(o,n){i(this,e);var r=n.rate,s=parseFloat(r,10);n.label=r,n.selected=1===s,t.call(this,o,n),this.label=r,this.rate=s,this.on(o,"ratechange",this.update)}return r(e,t),e.prototype.handleClick=function(){t.prototype.handleClick.call(this),this.player().playbackRate(this.rate)},e.prototype.update=function(){this.selected(this.player().playbackRate()===this.rate)},e}(a["default"]);c.prototype.contentElType="button",u["default"].registerComponent("PlaybackRateMenuItem",c),o["default"]=c,e.exports=o["default"]},{"../../component.js":67,"../../menu/menu-item.js":105}],75:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("../../component.js"),l=i(a),u=t("../../utils/dom.js"),c=n(u),p=function(t){function e(o,n){r(this,e),t.call(this,o,n),this.on(o,"progress",this.update)}return s(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-load-progress",innerHTML:''+this.localize("Loaded")+": 0%"})},e.prototype.update=function(){var t=this.player_.buffered(),e=this.player_.duration(),o=this.player_.bufferedEnd(),n=this.el_.children,i=function(t,e){var o=t/e||0;return 100*(o>=1?1:o)+"%"};this.el_.style.width=i(o,e);for(var r=0;rt.length;r--)this.el_.removeChild(n[r-1])},e}(l["default"]);l["default"].registerComponent("LoadProgressBar",p),o["default"]=p,e.exports=o["default"]},{"../../component.js":67,"../../utils/dom.js":132}],76:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("../../component.js"),l=i(a),u=t("../../utils/dom.js"),c=n(u),p=t("../../utils/fn.js"),f=n(p),d=t("../../utils/format-time.js"),h=i(d),v=t("lodash-compat/function/throttle"),g=i(v),y=function(t){function e(o,n){var i=this;r(this,e),t.call(this,o,n),this.update(0,0),o.on("ready",function(){i.on(o.controlBar.progressControl.el(),"mousemove",g["default"](f.bind(i,i.handleMouseMove),25))})}return s(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-mouse-display"})},e.prototype.handleMouseMove=function(t){var e=this.player_.duration(),o=this.calculateDistance(t)*e,n=t.pageX-c.findElPosition(this.el().parentNode).left; -this.update(o,n)},e.prototype.update=function(t,e){var o=h["default"](t,this.player_.duration());this.el().style.left=e+"px",this.el().setAttribute("data-current-time",o)},e.prototype.calculateDistance=function(t){return c.getPointerPosition(this.el().parentNode,t).x},e}(l["default"]);l["default"].registerComponent("MouseTimeDisplay",y),o["default"]=y,e.exports=o["default"]},{"../../component.js":67,"../../utils/dom.js":132,"../../utils/fn.js":134,"../../utils/format-time.js":135,"lodash-compat/function/throttle":7}],77:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("../../component.js"),l=i(a),u=t("../../utils/fn.js"),c=n(u),p=t("../../utils/format-time.js"),f=i(p),d=function(t){function e(o,n){r(this,e),t.call(this,o,n),this.updateDataAttr(),this.on(o,"timeupdate",this.updateDataAttr),o.ready(c.bind(this,this.updateDataAttr))}return s(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-play-progress vjs-slider-bar",innerHTML:''+this.localize("Progress")+": 0%"})},e.prototype.updateDataAttr=function(){var t=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime();this.el_.setAttribute("data-current-time",f["default"](t,this.player_.duration()))},e}(l["default"]);l["default"].registerComponent("PlayProgressBar",d),o["default"]=d,e.exports=o["default"]},{"../../component.js":67,"../../utils/fn.js":134,"../../utils/format-time.js":135}],78:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var s=t("../../component.js"),a=n(s),l=t("./seek-bar.js"),u=(n(l),t("./mouse-time-display.js")),c=(n(u),function(t){function e(){i(this,e),t.apply(this,arguments)}return r(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-progress-control vjs-control"})},e}(a["default"]));c.prototype.options_={children:["seekBar"]},a["default"].registerComponent("ProgressControl",c),o["default"]=c,e.exports=o["default"]},{"../../component.js":67,"./mouse-time-display.js":76,"./seek-bar.js":79}],79:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("../../slider/slider.js"),l=i(a),u=t("../../component.js"),c=i(u),p=t("./load-progress-bar.js"),f=(i(p),t("./play-progress-bar.js")),d=(i(f),t("../../utils/fn.js")),h=n(d),v=t("../../utils/format-time.js"),g=i(v),y=t("object.assign"),m=(i(y),function(t){function e(o,n){r(this,e),t.call(this,o,n),this.on(o,"timeupdate",this.updateARIAAttributes),o.ready(h.bind(this,this.updateARIAAttributes))}return s(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-progress-holder"},{"aria-label":"video progress bar"})},e.prototype.updateARIAAttributes=function(){var t=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime();this.el_.setAttribute("aria-valuenow",(100*this.getPercent()).toFixed(2)),this.el_.setAttribute("aria-valuetext",g["default"](t,this.player_.duration()))},e.prototype.getPercent=function(){var t=this.player_.currentTime()/this.player_.duration();return t>=1?1:t},e.prototype.handleMouseDown=function(e){t.prototype.handleMouseDown.call(this,e),this.player_.scrubbing(!0),this.videoWasPlaying=!this.player_.paused(),this.player_.pause()},e.prototype.handleMouseMove=function(t){var e=this.calculateDistance(t)*this.player_.duration();e===this.player_.duration()&&(e-=.1),this.player_.currentTime(e)},e.prototype.handleMouseUp=function(e){t.prototype.handleMouseUp.call(this,e),this.player_.scrubbing(!1),this.videoWasPlaying&&this.player_.play()},e.prototype.stepForward=function(){this.player_.currentTime(this.player_.currentTime()+5)},e.prototype.stepBack=function(){this.player_.currentTime(this.player_.currentTime()-5)},e}(l["default"]));m.prototype.options_={children:["loadProgressBar","mouseTimeDisplay","playProgressBar"],barName:"playProgressBar"},m.prototype.playerEvent="timeupdate",c["default"].registerComponent("SeekBar",m),o["default"]=m,e.exports=o["default"]},{"../../component.js":67,"../../slider/slider.js":114,"../../utils/fn.js":134,"../../utils/format-time.js":135,"./load-progress-bar.js":75,"./play-progress-bar.js":77,"object.assign":45}],80:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var s=t("./spacer.js"),a=n(s),l=t("../../component.js"),u=n(l),c=function(t){function e(){i(this,e),t.apply(this,arguments)}return r(e,t),e.prototype.buildCSSClass=function(){return"vjs-custom-control-spacer "+t.prototype.buildCSSClass.call(this)},e.prototype.createEl=function(){var e=t.prototype.createEl.call(this,{className:this.buildCSSClass()});return e.innerHTML=" ",e},e}(a["default"]);u["default"].registerComponent("CustomControlSpacer",c),o["default"]=c,e.exports=o["default"]},{"../../component.js":67,"./spacer.js":81}],81:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var s=t("../../component.js"),a=n(s),l=function(t){function e(){i(this,e),t.apply(this,arguments)}return r(e,t),e.prototype.buildCSSClass=function(){return"vjs-spacer "+t.prototype.buildCSSClass.call(this)},e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:this.buildCSSClass()})},e}(a["default"]);a["default"].registerComponent("Spacer",l),o["default"]=l,e.exports=o["default"]},{"../../component.js":67}],82:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var s=t("./text-track-menu-item.js"),a=n(s),l=t("../../component.js"),u=n(l),c=function(t){function e(o,n){i(this,e),n.track={kind:n.kind,player:o,label:n.kind+" settings",selectable:!1,"default":!1,mode:"disabled"},n.selectable=!1,t.call(this,o,n),this.addClass("vjs-texttrack-settings"),this.controlText(", opens "+n.kind+" settings dialog")}return r(e,t),e.prototype.handleClick=function(){this.player().getChild("textTrackSettings").show(),this.player().getChild("textTrackSettings").el_.focus()},e}(a["default"]);u["default"].registerComponent("CaptionSettingsMenuItem",c),o["default"]=c,e.exports=o["default"]},{"../../component.js":67,"./text-track-menu-item.js":89}],83:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var s=t("./text-track-button.js"),a=n(s),l=t("../../component.js"),u=n(l),c=t("./caption-settings-menu-item.js"),p=n(c),f=function(t){function e(o,n,r){i(this,e),t.call(this,o,n,r),this.el_.setAttribute("aria-label","Captions Menu")}return r(e,t),e.prototype.buildCSSClass=function(){return"vjs-captions-button "+t.prototype.buildCSSClass.call(this)},e.prototype.update=function(){var e=2;t.prototype.update.call(this),this.player().tech_&&this.player().tech_.featuresNativeTextTracks&&(e=1),this.items&&this.items.length>e?this.show():this.hide()},e.prototype.createItems=function(){var e=[];return this.player().tech_&&this.player().tech_.featuresNativeTextTracks||e.push(new p["default"](this.player_,{kind:this.kind_})),t.prototype.createItems.call(this,e)},e}(a["default"]);f.prototype.kind_="captions",f.prototype.controlText_="Captions",u["default"].registerComponent("CaptionsButton",f),o["default"]=f,e.exports=o["default"]},{"../../component.js":67,"./caption-settings-menu-item.js":82,"./text-track-button.js":88}],84:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("./text-track-button.js"),l=i(a),u=t("../../component.js"),c=i(u),p=t("./text-track-menu-item.js"),f=i(p),d=t("./chapters-track-menu-item.js"),h=i(d),v=t("../../menu/menu.js"),g=i(v),y=t("../../utils/dom.js"),m=n(y),A=t("../../utils/fn.js"),b=(n(A),t("../../utils/to-title-case.js")),j=i(b),w=t("global/window"),k=(i(w),function(t){function e(o,n,i){r(this,e),t.call(this,o,n,i),this.el_.setAttribute("aria-label","Chapters Menu")}return s(e,t),e.prototype.buildCSSClass=function(){return"vjs-chapters-button "+t.prototype.buildCSSClass.call(this)},e.prototype.createItems=function(){var t=[],e=this.player_.textTracks();if(!e)return t;for(var o=0;o0){for(var c=o.cues,p=void 0,i=0,f=c.length;i0&&this.show(),a},e}(l["default"]));k.prototype.kind_="chapters",k.prototype.controlText_="Chapters",c["default"].registerComponent("ChaptersButton",k),o["default"]=k,e.exports=o["default"]},{"../../component.js":67,"../../menu/menu.js":106,"../../utils/dom.js":132,"../../utils/fn.js":134,"../../utils/to-title-case.js":141,"./chapters-track-menu-item.js":85,"./text-track-button.js":88,"./text-track-menu-item.js":89,"global/window":2}],85:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("../../menu/menu-item.js"),l=i(a),u=t("../../component.js"),c=i(u),p=t("../../utils/fn.js"),f=n(p),d=function(t){function e(o,n){r(this,e);var i=n.track,s=n.cue,a=o.currentTime();n.label=s.text,n.selected=s.startTime<=a&&aCurrent Time 0:00'},{"aria-live":"off"}),e.appendChild(this.contentEl_),e},e.prototype.updateContent=function(){var t=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime(),e=this.localize("Current Time"),o=f["default"](t,this.player_.duration());o!==this.formattedTime_&&(this.formattedTime_=o,this.contentEl_.innerHTML=''+e+" "+o)},e}(l["default"]);l["default"].registerComponent("CurrentTimeDisplay",d),o["default"]=d,e.exports=o["default"]},{"../../component.js":67,"../../utils/dom.js":132,"../../utils/format-time.js":135}],91:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("../../component.js"),l=i(a),u=t("../../utils/dom.js"),c=n(u),p=t("../../utils/format-time.js"),f=i(p),d=function(t){function e(o,n){r(this,e),t.call(this,o,n),this.on(o,"timeupdate",this.updateContent),this.on(o,"loadedmetadata",this.updateContent)}return s(e,t),e.prototype.createEl=function(){var e=t.prototype.createEl.call(this,"div",{className:"vjs-duration vjs-time-control vjs-control"});return this.contentEl_=c.createEl("div",{className:"vjs-duration-display",innerHTML:''+this.localize("Duration Time")+" 0:00"},{"aria-live":"off"}),e.appendChild(this.contentEl_),e},e.prototype.updateContent=function(){var t=this.player_.duration();if(t&&this.duration_!==t){this.duration_=t;var e=this.localize("Duration Time"),o=f["default"](t);this.contentEl_.innerHTML=''+e+" "+o}},e}(l["default"]);l["default"].registerComponent("DurationDisplay",d),o["default"]=d,e.exports=o["default"]},{"../../component.js":67,"../../utils/dom.js":132,"../../utils/format-time.js":135}],92:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("../../component.js"),l=i(a),u=t("../../utils/dom.js"),c=n(u),p=t("../../utils/format-time.js"),f=i(p),d=function(t){function e(o,n){r(this,e),t.call(this,o,n),this.on(o,"timeupdate",this.updateContent)}return s(e,t),e.prototype.createEl=function(){var e=t.prototype.createEl.call(this,"div",{className:"vjs-remaining-time vjs-time-control vjs-control"});return this.contentEl_=c.createEl("div",{className:"vjs-remaining-time-display",innerHTML:''+this.localize("Remaining Time")+" -0:00"},{"aria-live":"off"}),e.appendChild(this.contentEl_),e},e.prototype.updateContent=function(){if(this.player_.duration()){var t=this.localize("Remaining Time"),e=f["default"](this.player_.remainingTime());e!==this.formattedTime_&&(this.formattedTime_=e,this.contentEl_.innerHTML=''+t+" -"+e)}},e}(l["default"]);l["default"].registerComponent("RemainingTimeDisplay",d),o["default"]=d,e.exports=o["default"]},{"../../component.js":67,"../../utils/dom.js":132,"../../utils/format-time.js":135}],93:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var s=t("../../component.js"),a=n(s),l=function(t){function e(){i(this,e),t.apply(this,arguments)}return r(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-time-control vjs-time-divider",innerHTML:"
/
"})},e}(a["default"]);a["default"].registerComponent("TimeDivider",l),o["default"]=l,e.exports=o["default"]},{"../../component.js":67}],94:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("../../slider/slider.js"),l=i(a),u=t("../../component.js"),c=i(u),p=t("../../utils/fn.js"),f=n(p),d=t("./volume-level.js"),h=(i(d),function(t){function e(o,n){r(this,e),t.call(this,o,n),this.on(o,"volumechange",this.updateARIAAttributes),o.ready(f.bind(this,this.updateARIAAttributes))}return s(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-volume-bar vjs-slider-bar"},{"aria-label":"volume level"})},e.prototype.handleMouseMove=function(t){this.checkMuted(),this.player_.volume(this.calculateDistance(t))},e.prototype.checkMuted=function(){this.player_.muted()&&this.player_.muted(!1)},e.prototype.getPercent=function(){return this.player_.muted()?0:this.player_.volume()},e.prototype.stepForward=function(){this.checkMuted(),this.player_.volume(this.player_.volume()+.1)},e.prototype.stepBack=function(){this.checkMuted(),this.player_.volume(this.player_.volume()-.1)},e.prototype.updateARIAAttributes=function(){var t=(100*this.player_.volume()).toFixed(2);this.el_.setAttribute("aria-valuenow",t),this.el_.setAttribute("aria-valuetext",t+"%")},e}(l["default"]));h.prototype.options_={children:["volumeLevel"],barName:"volumeLevel"},h.prototype.playerEvent="volumechange",c["default"].registerComponent("VolumeBar",h),o["default"]=h,e.exports=o["default"]},{"../../component.js":67,"../../slider/slider.js":114,"../../utils/fn.js":134,"./volume-level.js":96}],95:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var s=t("../../component.js"),a=n(s),l=t("./volume-bar.js"),u=(n(l),function(t){function e(o,n){i(this,e),t.call(this,o,n),o.tech_&&o.tech_.featuresVolumeControl===!1&&this.addClass("vjs-hidden"),this.on(o,"loadstart",function(){o.tech_.featuresVolumeControl===!1?this.addClass("vjs-hidden"):this.removeClass("vjs-hidden")})}return r(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-volume-control vjs-control"})},e}(a["default"]));u.prototype.options_={children:["volumeBar"]},a["default"].registerComponent("VolumeControl",u),o["default"]=u,e.exports=o["default"]},{"../../component.js":67,"./volume-bar.js":94}],96:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var s=t("../../component.js"),a=n(s),l=function(t){function e(){i(this,e),t.apply(this,arguments)}return r(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-volume-level",innerHTML:''})},e}(a["default"]);a["default"].registerComponent("VolumeLevel",l),o["default"]=l,e.exports=o["default"]},{"../../component.js":67}],97:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("../utils/fn.js"),l=i(a),u=t("../component.js"),c=n(u),p=t("../popup/popup.js"),f=n(p),d=t("../popup/popup-button.js"),h=n(d),v=t("./mute-toggle.js"),g=n(v),y=t("./volume-control/volume-bar.js"),m=n(y),A=t("global/document"),b=n(A),j=function(t){function e(o){function n(){o.tech_&&o.tech_.featuresVolumeControl===!1?this.addClass("vjs-hidden"):this.removeClass("vjs-hidden"); -}var i=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];r(this,e),void 0===i.inline&&(i.inline=!0),void 0===i.vertical&&(i.inline?i.vertical=!1:i.vertical=!0),i.volumeBar=i.volumeBar||{},i.volumeBar.vertical=!!i.vertical,t.call(this,o,i),this.on(o,"volumechange",this.volumeUpdate),this.on(o,"loadstart",this.volumeUpdate),n.call(this),this.on(o,"loadstart",n),this.on(this.volumeBar,["slideractive","focus"],function(){this.addClass("vjs-slider-active")}),this.on(this.volumeBar,["sliderinactive","blur"],function(){this.removeClass("vjs-slider-active")}),this.on(this.volumeBar,["focus"],function(){this.addClass("vjs-lock-showing")}),this.on(this.volumeBar,["blur"],function(){this.removeClass("vjs-lock-showing")})}return s(e,t),e.prototype.buildCSSClass=function(){var e="";return e=this.options_.vertical?"vjs-volume-menu-button-vertical":"vjs-volume-menu-button-horizontal","vjs-volume-menu-button "+t.prototype.buildCSSClass.call(this)+" "+e},e.prototype.createPopup=function(){var t=new f["default"](this.player_,{contentElType:"div"}),e=new m["default"](this.player_,this.options_.volumeBar);return t.addChild(e),this.menuContent=t,this.volumeBar=e,this.attachVolumeBarEvents(),t},e.prototype.handleClick=function(){g["default"].prototype.handleClick.call(this),t.prototype.handleClick.call(this)},e.prototype.attachVolumeBarEvents=function(){this.menuContent.on(["mousedown","touchdown"],l.bind(this,this.handleMouseDown))},e.prototype.handleMouseDown=function(t){this.on(["mousemove","touchmove"],l.bind(this.volumeBar,this.volumeBar.handleMouseMove)),this.on(b["default"],["mouseup","touchend"],this.handleMouseUp)},e.prototype.handleMouseUp=function(t){this.off(["mousemove","touchmove"],l.bind(this.volumeBar,this.volumeBar.handleMouseMove))},e}(h["default"]);j.prototype.volumeUpdate=g["default"].prototype.update,j.prototype.controlText_="Mute",c["default"].registerComponent("VolumeMenuButton",j),o["default"]=j,e.exports=o["default"]},{"../component.js":67,"../popup/popup-button.js":110,"../popup/popup.js":111,"../utils/fn.js":134,"./mute-toggle.js":71,"./volume-control/volume-bar.js":94,"global/document":1}],98:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("./component"),l=i(a),u=t("./modal-dialog"),c=i(u),p=t("./utils/dom"),f=(n(p),t("./utils/merge-options")),d=i(f),h=function(t){function e(o,n){r(this,e),t.call(this,o,n),this.on(o,"error",this.open)}return s(e,t),e.prototype.buildCSSClass=function(){return"vjs-error-display "+t.prototype.buildCSSClass.call(this)},e.prototype.content=function(){var t=this.player().error();return t?this.localize(t.message):""},e}(c["default"]);h.prototype.options_=d["default"](c["default"].prototype.options_,{fillAlways:!0,temporary:!1,uncloseable:!0}),l["default"].registerComponent("ErrorDisplay",h),o["default"]=h,e.exports=o["default"]},{"./component":67,"./modal-dialog":107,"./utils/dom":132,"./utils/merge-options":138}],99:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}o.__esModule=!0;var i=t("./utils/events.js"),r=n(i),s=function(){};s.prototype.allowedEvents_={},s.prototype.on=function(t,e){var o=this.addEventListener;this.addEventListener=Function.prototype,r.on(this,t,e),this.addEventListener=o},s.prototype.addEventListener=s.prototype.on,s.prototype.off=function(t,e){r.off(this,t,e)},s.prototype.removeEventListener=s.prototype.off,s.prototype.one=function(t,e){r.one(this,t,e)},s.prototype.trigger=function(t){var e=t.type||t;"string"==typeof t&&(t={type:e}),t=r.fixEvent(t),this.allowedEvents_[e]&&this["on"+e]&&this["on"+e](t),r.trigger(this,t)},s.prototype.dispatchEvent=s.prototype.trigger,o["default"]=s,e.exports=o["default"]},{"./utils/events.js":133}],100:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0;var i=t("./utils/log"),r=n(i),s=function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.super_=e)},a=function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],o=function(){t.apply(this,arguments)},n={};"object"==typeof e?("function"==typeof e.init&&(r["default"].warn("Constructor logic via init() is deprecated; please use constructor() instead."),e.constructor=e.init),e.constructor!==Object.prototype.constructor&&(o=e.constructor),n=e):"function"==typeof e&&(o=e),s(o,t);for(var i in n)n.hasOwnProperty(i)&&(o.prototype[i]=n[i]);return o};o["default"]=a,e.exports=o["default"]},{"./utils/log":137}],101:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0;for(var i=t("global/document"),r=n(i),s={},a=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],l=a[0],u=void 0,c=0;c1&&this.show()},e.prototype.createMenu=function(){var t=new f["default"](this.player_);if(this.options_.title){var e=h.createEl("li",{className:"vjs-menu-title",innerHTML:m["default"](this.options_.title),tabIndex:-1});t.children_.unshift(e),h.insertElFirst(e,t.contentEl())}if(this.items=this.createItems(),this.items)for(var o=0;o0&&(t<0?t=0:t>=e.length&&(t=e.length-1),this.focusedChild_=t,e[t].el_.focus())},e}(l["default"]);l["default"].registerComponent("Menu",v),o["default"]=v,e.exports=o["default"]},{"../component.js":67,"../utils/dom.js":132,"../utils/events.js":133,"../utils/fn.js":134}],107:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("global/document"),l=i(a),u=t("./utils/dom"),c=n(u),p=t("./utils/fn"),f=n(p),d=t("./utils/log"),h=(i(d),t("./component")),v=i(h),g=t("./close-button"),y=(i(g),"vjs-modal-dialog"),m=27,A=function(t){function e(o,n){r(this,e),t.call(this,o,n),this.opened_=this.hasBeenOpened_=this.hasBeenFilled_=!1,this.closeable(!this.options_.uncloseable),this.content(this.options_.content),this.contentEl_=c.createEl("div",{className:y+"-content"},{role:"document"}),this.descEl_=c.createEl("p",{className:y+"-description vjs-offscreen",id:this.el().getAttribute("aria-describedby")}),c.textContent(this.descEl_,this.description()),this.el_.appendChild(this.descEl_),this.el_.appendChild(this.contentEl_)}return s(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:this.buildCSSClass(),tabIndex:-1},{"aria-describedby":this.id()+"_description","aria-hidden":"true","aria-label":this.label(),role:"dialog"})},e.prototype.buildCSSClass=function(){return y+" vjs-hidden "+t.prototype.buildCSSClass.call(this)},e.prototype.handleKeyPress=function(t){t.which===m&&this.closeable()&&this.close()},e.prototype.label=function(){return this.options_.label||this.localize("Modal Window")},e.prototype.description=function(){var t=this.options_.description||this.localize("This is a modal window.");return this.closeable()&&(t+=" "+this.localize("This modal can be closed by pressing the Escape key or activating the close button.")),t},e.prototype.open=function(){if(!this.opened_){var t=this.player();this.trigger("beforemodalopen"),this.opened_=!0,(this.options_.fillAlways||!this.hasBeenOpened_&&!this.hasBeenFilled_)&&this.fill(),this.wasPlaying_=!t.paused(),this.wasPlaying_&&t.pause(),this.closeable()&&this.on(l["default"],"keydown",f.bind(this,this.handleKeyPress)),t.controls(!1),this.show(),this.el().setAttribute("aria-hidden","false"),this.trigger("modalopen"),this.hasBeenOpened_=!0}return this},e.prototype.opened=function(t){return"boolean"==typeof t&&this[t?"open":"close"](),this.opened_},e.prototype.close=function(){if(this.opened_){var t=this.player();this.trigger("beforemodalclose"),this.opened_=!1,this.wasPlaying_&&t.play(),this.closeable()&&this.off(l["default"],"keydown",f.bind(this,this.handleKeyPress)),t.controls(!0),this.hide(),this.el().setAttribute("aria-hidden","true"),this.trigger("modalclose"),this.options_.temporary&&this.dispose()}return this},e.prototype.closeable=function o(t){if("boolean"==typeof t){var o=this.closeable_=!!t,e=this.getChild("closeButton");if(o&&!e){var n=this.contentEl_;this.contentEl_=this.el_,e=this.addChild("closeButton"),this.contentEl_=n,this.on(e,"close",this.close)}!o&&e&&(this.off(e,"close",this.close),this.removeChild(e),e.dispose())}return this.closeable_},e.prototype.fill=function(){return this.fillWith(this.content())},e.prototype.fillWith=function(t){var e=this.contentEl(),o=e.parentNode,n=e.nextSibling;return this.trigger("beforemodalfill"),this.hasBeenFilled_=!0,o.removeChild(e),this.empty(),c.insertContent(e,t),this.trigger("modalfill"),n?o.insertBefore(e,n):o.appendChild(e),this},e.prototype.empty=function(){return this.trigger("beforemodalempty"),c.emptyEl(this.contentEl()),this.trigger("modalempty"),this},e.prototype.content=function(t){return"undefined"!=typeof t&&(this.content_=t),this.content_},e}(v["default"]);A.prototype.options_={temporary:!0},v["default"].registerComponent("ModalDialog",A),o["default"]=A,e.exports=o["default"]},{"./close-button":66,"./component":67,"./utils/dom":132,"./utils/fn":134,"./utils/log":137,"global/document":1}],108:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("./component.js"),l=i(a),u=t("global/document"),c=i(u),p=t("global/window"),f=i(p),d=t("./utils/events.js"),h=n(d),v=t("./utils/dom.js"),g=n(v),y=t("./utils/fn.js"),m=n(y),A=t("./utils/guid.js"),b=n(A),j=t("./utils/browser.js"),w=n(j),k=t("./utils/log.js"),_=i(k),x=t("./utils/to-title-case.js"),T=i(x),E=t("./utils/time-ranges.js"),C=t("./utils/buffer.js"),S=t("./utils/stylesheet.js"),O=n(S),B=t("./fullscreen-api.js"),P=i(B),M=t("./media-error.js"),I=i(M),F=t("safe-json-parse/tuple"),D=i(F),R=t("object.assign"),N=i(R),L=t("./utils/merge-options.js"),z=i(L),Q=t("./tracks/text-track-list-converter.js"),H=i(Q),Y=t("./tech/loader.js"),V=(i(Y),t("./poster-image.js")),U=(i(V),t("./tracks/text-track-display.js")),G=(i(U),t("./loading-spinner.js")),W=(i(G),t("./big-play-button.js")),J=(i(W),t("./control-bar/control-bar.js")),X=(i(J),t("./error-display.js")),Z=(i(X),t("./tracks/text-track-settings.js")),q=(i(Z),t("./modal-dialog")),K=i(q),$=t("./tech/tech.js"),tt=i($),et=t("./tech/html5.js"),ot=(i(et),function(t){function e(o,n,i){var s=this;if(r(this,e),o.id=o.id||"vjs_video_"+b.newGUID(),n=N["default"](e.getTagSettings(o),n),n.initChildren=!1,n.createEl=!1,n.reportTouchActivity=!1,t.call(this,null,n,i),!this.options_||!this.options_.techOrder||!this.options_.techOrder.length)throw new Error("No techOrder specified. Did you overwrite videojs.options instead of just changing the properties you want to override?");this.tag=o,this.tagAttributes=o&&g.getElAttributes(o),this.language(this.options_.language),n.languages?!function(){var t={};Object.getOwnPropertyNames(n.languages).forEach(function(e){t[e.toLowerCase()]=n.languages[e]}),s.languages_=t}():this.languages_=e.prototype.options_.languages,this.cache_={},this.poster_=n.poster||"",this.controls_=!!n.controls,o.controls=!1,this.scrubbing_=!1,this.el_=this.createEl();var a=z["default"](this.options_);n.plugins&&!function(){var t=n.plugins;Object.getOwnPropertyNames(t).forEach(function(e){"function"==typeof this[e]?this[e](t[e]):_["default"].error("Unable to find plugin:",e)},s)}(),this.options_.playerOptions=a,this.initChildren(),this.isAudio("audio"===o.nodeName.toLowerCase()),this.controls()?this.addClass("vjs-controls-enabled"):this.addClass("vjs-controls-disabled"),this.isAudio()&&this.addClass("vjs-audio"),this.flexNotSupported_()&&this.addClass("vjs-no-flex"),w.IS_IOS||this.addClass("vjs-workinghover"),e.players[this.id_]=this,this.userActive(!0),this.reportUserActivity(),this.listenForUserActivity_(),this.on("fullscreenchange",this.handleFullscreenChange_),this.on("stageclick",this.handleStageClick_)}return s(e,t),e.prototype.dispose=function(){this.trigger("dispose"),this.off("dispose"),this.styleEl_&&this.styleEl_.parentNode&&this.styleEl_.parentNode.removeChild(this.styleEl_),e.players[this.id_]=null,this.tag&&this.tag.player&&(this.tag.player=null),this.el_&&this.el_.player&&(this.el_.player=null),this.tech_&&this.tech_.dispose(),t.prototype.dispose.call(this)},e.prototype.createEl=function(){var e=this.el_=t.prototype.createEl.call(this,"div"),o=this.tag;o.removeAttribute("width"),o.removeAttribute("height");var n=g.getElAttributes(o);Object.getOwnPropertyNames(n).forEach(function(t){"class"===t?e.className=n[t]:e.setAttribute(t,n[t])}),o.playerId=o.id,o.id+="_html5_api",o.className="vjs-tech",o.player=e.player=this,this.addClass("vjs-paused"),this.styleEl_=O.createStyleElement("vjs-styles-dimensions");var i=g.$(".vjs-styles-defaults"),r=g.$("head");return r.insertBefore(this.styleEl_,i?i.nextSibling:r.firstChild),this.width(this.options_.width),this.height(this.options_.height),this.fluid(this.options_.fluid),this.aspectRatio(this.options_.aspectRatio),o.initNetworkState_=o.networkState,o.parentNode&&o.parentNode.insertBefore(e,o),g.insertElFirst(o,e),this.children_.unshift(o),this.el_=e,e},e.prototype.width=function(t){return this.dimension("width",t)},e.prototype.height=function(t){return this.dimension("height",t)},e.prototype.dimension=function(t,e){var o=t+"_";if(void 0===e)return this[o]||0;if(""===e)this[o]=void 0;else{var n=parseFloat(e);if(isNaN(n))return _["default"].error('Improper value "'+e+'" supplied for for '+t),this;this[o]=n}return this.updateStyleEl_(),this},e.prototype.fluid=function(t){return void 0===t?!!this.fluid_:(this.fluid_=!!t,void(t?this.addClass("vjs-fluid"):this.removeClass("vjs-fluid")))},e.prototype.aspectRatio=function(t){if(void 0===t)return this.aspectRatio_;if(!/^\d+\:\d+$/.test(t))throw new Error("Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.");this.aspectRatio_=t,this.fluid(!0),this.updateStyleEl_()},e.prototype.updateStyleEl_=function(){var t=void 0,e=void 0,o=void 0,n=void 0;o=void 0!==this.aspectRatio_&&"auto"!==this.aspectRatio_?this.aspectRatio_:this.videoWidth()?this.videoWidth()+":"+this.videoHeight():"16:9";var i=o.split(":"),r=i[1]/i[0];t=void 0!==this.width_?this.width_:void 0!==this.height_?this.height_/r:this.videoWidth()||300,e=void 0!==this.height_?this.height_:t*r,n=/^[^a-zA-Z]/.test(this.id())?"dimensions-"+this.id():this.id()+"-dimensions",this.addClass(n),O.setTextContent(this.styleEl_,"\n ."+n+" {\n width: "+t+"px;\n height: "+e+"px;\n }\n\n ."+n+".vjs-fluid {\n padding-top: "+100*r+"%;\n }\n ")},e.prototype.loadTech_=function(t,e){this.tech_&&this.unloadTech_(),"Html5"!==t&&this.tag&&(tt["default"].getTech("Html5").disposeMediaElement(this.tag),this.tag.player=null,this.tag=null),this.techName_=t,this.isReady_=!1;var o=N["default"]({nativeControlsForTouch:this.options_.nativeControlsForTouch,source:e,playerId:this.id(),techId:this.id()+"_"+t+"_api",textTracks:this.textTracks_,autoplay:this.options_.autoplay,preload:this.options_.preload,loop:this.options_.loop,muted:this.options_.muted,poster:this.poster(),language:this.language(),"vtt.js":this.options_["vtt.js"]},this.options_[t.toLowerCase()]);this.tag&&(o.tag=this.tag),e&&(this.currentType_=e.type,e.src===this.cache_.src&&this.cache_.currentTime>0&&(o.startTime=this.cache_.currentTime),this.cache_.src=e.src);var n=tt["default"].getTech(t);n||(n=l["default"].getComponent(t)),this.tech_=new n(o),this.tech_.ready(m.bind(this,this.handleTechReady_),!0),H["default"].jsonToTextTracks(this.textTracksJson_||[],this.tech_),this.on(this.tech_,"loadstart",this.handleTechLoadStart_),this.on(this.tech_,"waiting",this.handleTechWaiting_),this.on(this.tech_,"canplay",this.handleTechCanPlay_),this.on(this.tech_,"canplaythrough",this.handleTechCanPlayThrough_),this.on(this.tech_,"playing",this.handleTechPlaying_),this.on(this.tech_,"ended",this.handleTechEnded_),this.on(this.tech_,"seeking",this.handleTechSeeking_),this.on(this.tech_,"seeked",this.handleTechSeeked_),this.on(this.tech_,"play",this.handleTechPlay_),this.on(this.tech_,"firstplay",this.handleTechFirstPlay_),this.on(this.tech_,"pause",this.handleTechPause_),this.on(this.tech_,"progress",this.handleTechProgress_),this.on(this.tech_,"durationchange",this.handleTechDurationChange_),this.on(this.tech_,"fullscreenchange",this.handleTechFullscreenChange_),this.on(this.tech_,"error",this.handleTechError_),this.on(this.tech_,"suspend",this.handleTechSuspend_),this.on(this.tech_,"abort",this.handleTechAbort_),this.on(this.tech_,"emptied",this.handleTechEmptied_),this.on(this.tech_,"stalled",this.handleTechStalled_),this.on(this.tech_,"loadedmetadata",this.handleTechLoadedMetaData_),this.on(this.tech_,"loadeddata",this.handleTechLoadedData_),this.on(this.tech_,"timeupdate",this.handleTechTimeUpdate_),this.on(this.tech_,"ratechange",this.handleTechRateChange_),this.on(this.tech_,"volumechange",this.handleTechVolumeChange_),this.on(this.tech_,"texttrackchange",this.handleTechTextTrackChange_),this.on(this.tech_,"loadedmetadata",this.updateStyleEl_),this.on(this.tech_,"posterchange",this.handleTechPosterChange_),this.usingNativeControls(this.techGet_("controls")),this.controls()&&!this.usingNativeControls()&&this.addTechControlsListeners_(),this.tech_.el().parentNode===this.el()||"Html5"===t&&this.tag||g.insertElFirst(this.tech_.el(),this.el()),this.tag&&(this.tag.player=null,this.tag=null)},e.prototype.unloadTech_=function(){this.textTracks_=this.textTracks(),this.textTracksJson_=H["default"].textTracksToJson(this.tech_),this.isReady_=!1,this.tech_.dispose(),this.tech_=!1},e.prototype.tech=function(t){if(t&&t.IWillNotUseThisInPlugins)return this.tech_;var e="\n Please make sure that you are not using this inside of a plugin.\n To disable this alert and error, please pass in an object with\n `IWillNotUseThisInPlugins` to the `tech` method. See\n https://github.com/videojs/video.js/issues/2617 for more info.\n ";throw f["default"].alert(e),new Error(e)},e.prototype.addTechControlsListeners_=function(){this.removeTechControlsListeners_(),this.on(this.tech_,"mousedown",this.handleTechClick_),this.on(this.tech_,"touchstart",this.handleTechTouchStart_),this.on(this.tech_,"touchmove",this.handleTechTouchMove_),this.on(this.tech_,"touchend",this.handleTechTouchEnd_),this.on(this.tech_,"tap",this.handleTechTap_)},e.prototype.removeTechControlsListeners_=function(){this.off(this.tech_,"tap",this.handleTechTap_),this.off(this.tech_,"touchstart",this.handleTechTouchStart_),this.off(this.tech_,"touchmove",this.handleTechTouchMove_),this.off(this.tech_,"touchend",this.handleTechTouchEnd_),this.off(this.tech_,"mousedown",this.handleTechClick_)},e.prototype.handleTechReady_=function(){this.triggerReady(),this.cache_.volume&&this.techCall_("setVolume",this.cache_.volume),this.handleTechPosterChange_(),this.handleTechDurationChange_(),this.src()&&this.tag&&this.options_.autoplay&&this.paused()&&(delete this.tag.poster,this.play())},e.prototype.handleTechLoadStart_=function(){this.removeClass("vjs-ended"),this.error(null),this.paused()?(this.hasStarted(!1),this.trigger("loadstart")):(this.trigger("loadstart"),this.trigger("firstplay"))},e.prototype.hasStarted=function(t){return void 0!==t?(this.hasStarted_!==t&&(this.hasStarted_=t,t?(this.addClass("vjs-has-started"),this.trigger("firstplay")):this.removeClass("vjs-has-started")),this):!!this.hasStarted_},e.prototype.handleTechPlay_=function(){this.removeClass("vjs-ended"),this.removeClass("vjs-paused"),this.addClass("vjs-playing"),this.hasStarted(!0),this.trigger("play")},e.prototype.handleTechWaiting_=function(){var t=this;this.addClass("vjs-waiting"),this.trigger("waiting"),this.one("timeupdate",function(){return t.removeClass("vjs-waiting")})},e.prototype.handleTechCanPlay_=function(){this.removeClass("vjs-waiting"),this.trigger("canplay")},e.prototype.handleTechCanPlayThrough_=function(){this.removeClass("vjs-waiting"),this.trigger("canplaythrough")},e.prototype.handleTechPlaying_=function(){this.removeClass("vjs-waiting"),this.trigger("playing")},e.prototype.handleTechSeeking_=function(){this.addClass("vjs-seeking"),this.trigger("seeking")},e.prototype.handleTechSeeked_=function(){this.removeClass("vjs-seeking"),this.trigger("seeked")},e.prototype.handleTechFirstPlay_=function(){this.options_.starttime&&this.currentTime(this.options_.starttime),this.addClass("vjs-has-started"),this.trigger("firstplay")},e.prototype.handleTechPause_=function(){this.removeClass("vjs-playing"),this.addClass("vjs-paused"),this.trigger("pause")},e.prototype.handleTechProgress_=function(){this.trigger("progress")},e.prototype.handleTechEnded_=function(){this.addClass("vjs-ended"),this.options_.loop?(this.currentTime(0),this.play()):this.paused()||this.pause(),this.trigger("ended")},e.prototype.handleTechDurationChange_=function(){this.duration(this.techGet_("duration"))},e.prototype.handleTechClick_=function(t){ -0===t.button&&this.controls()&&(this.paused()?this.play():this.pause())},e.prototype.handleTechTap_=function(){this.userActive(!this.userActive())},e.prototype.handleTechTouchStart_=function(){this.userWasActive=this.userActive()},e.prototype.handleTechTouchMove_=function(){this.userWasActive&&this.reportUserActivity()},e.prototype.handleTechTouchEnd_=function(t){t.preventDefault()},e.prototype.handleFullscreenChange_=function(){this.isFullscreen()?this.addClass("vjs-fullscreen"):this.removeClass("vjs-fullscreen")},e.prototype.handleStageClick_=function(){this.reportUserActivity()},e.prototype.handleTechFullscreenChange_=function(t,e){e&&this.isFullscreen(e.isFullscreen),this.trigger("fullscreenchange")},e.prototype.handleTechError_=function(){var t=this.tech_.error();this.error(t&&t.code)},e.prototype.handleTechSuspend_=function(){this.trigger("suspend")},e.prototype.handleTechAbort_=function(){this.trigger("abort")},e.prototype.handleTechEmptied_=function(){this.trigger("emptied")},e.prototype.handleTechStalled_=function(){this.trigger("stalled")},e.prototype.handleTechLoadedMetaData_=function(){this.trigger("loadedmetadata")},e.prototype.handleTechLoadedData_=function(){this.trigger("loadeddata")},e.prototype.handleTechTimeUpdate_=function(){this.trigger("timeupdate")},e.prototype.handleTechRateChange_=function(){this.trigger("ratechange")},e.prototype.handleTechVolumeChange_=function(){this.trigger("volumechange")},e.prototype.handleTechTextTrackChange_=function(){this.trigger("texttrackchange")},e.prototype.getCache=function(){return this.cache_},e.prototype.techCall_=function(t,e){if(this.tech_&&!this.tech_.isReady_)this.tech_.ready(function(){this[t](e)},!0);else try{this.tech_[t](e)}catch(o){throw _["default"](o),o}},e.prototype.techGet_=function(t){if(this.tech_&&this.tech_.isReady_)try{return this.tech_[t]()}catch(e){throw void 0===this.tech_[t]?_["default"]("Video.js: "+t+" method not defined for "+this.techName_+" playback technology.",e):"TypeError"===e.name?(_["default"]("Video.js: "+t+" unavailable on "+this.techName_+" playback technology element.",e),this.tech_.isReady_=!1):_["default"](e),e}},e.prototype.play=function(){return this.techCall_("play"),this},e.prototype.pause=function(){return this.techCall_("pause"),this},e.prototype.paused=function(){return this.techGet_("paused")!==!1},e.prototype.scrubbing=function(t){return void 0!==t?(this.scrubbing_=!!t,t?this.addClass("vjs-scrubbing"):this.removeClass("vjs-scrubbing"),this):this.scrubbing_},e.prototype.currentTime=function(t){return void 0!==t?(this.techCall_("setCurrentTime",t),this):this.cache_.currentTime=this.techGet_("currentTime")||0},e.prototype.duration=function(t){return void 0===t?this.cache_.duration||0:(t=parseFloat(t)||0,t<0&&(t=1/0),t!==this.cache_.duration&&(this.cache_.duration=t,t===1/0?this.addClass("vjs-live"):this.removeClass("vjs-live"),this.trigger("durationchange")),this)},e.prototype.remainingTime=function(){return this.duration()-this.currentTime()},e.prototype.buffered=function o(){var o=this.techGet_("buffered");return o&&o.length||(o=E.createTimeRange(0,0)),o},e.prototype.bufferedPercent=function(){return C.bufferedPercent(this.buffered(),this.duration())},e.prototype.bufferedEnd=function(){var t=this.buffered(),e=this.duration(),o=t.end(t.length-1);return o>e&&(o=e),o},e.prototype.volume=function(t){var e=void 0;return void 0!==t?(e=Math.max(0,Math.min(1,parseFloat(t))),this.cache_.volume=e,this.techCall_("setVolume",e),this):(e=parseFloat(this.techGet_("volume")),isNaN(e)?1:e)},e.prototype.muted=function(t){return void 0!==t?(this.techCall_("setMuted",t),this):this.techGet_("muted")||!1},e.prototype.supportsFullScreen=function(){return this.techGet_("supportsFullScreen")||!1},e.prototype.isFullscreen=function(t){return void 0!==t?(this.isFullscreen_=!!t,this):!!this.isFullscreen_},e.prototype.requestFullscreen=function(){var t=P["default"];return this.isFullscreen(!0),t.requestFullscreen?(h.on(c["default"],t.fullscreenchange,m.bind(this,function e(o){this.isFullscreen(c["default"][t.fullscreenElement]),this.isFullscreen()===!1&&h.off(c["default"],t.fullscreenchange,e),this.trigger("fullscreenchange")})),this.el_[t.requestFullscreen]()):this.tech_.supportsFullScreen()?this.techCall_("enterFullScreen"):(this.enterFullWindow(),this.trigger("fullscreenchange")),this},e.prototype.exitFullscreen=function(){var t=P["default"];return this.isFullscreen(!1),t.requestFullscreen?c["default"][t.exitFullscreen]():this.tech_.supportsFullScreen()?this.techCall_("exitFullScreen"):(this.exitFullWindow(),this.trigger("fullscreenchange")),this},e.prototype.enterFullWindow=function(){this.isFullWindow=!0,this.docOrigOverflow=c["default"].documentElement.style.overflow,h.on(c["default"],"keydown",m.bind(this,this.fullWindowOnEscKey)),c["default"].documentElement.style.overflow="hidden",g.addElClass(c["default"].body,"vjs-full-window"),this.trigger("enterFullWindow")},e.prototype.fullWindowOnEscKey=function(t){27===t.keyCode&&(this.isFullscreen()===!0?this.exitFullscreen():this.exitFullWindow())},e.prototype.exitFullWindow=function(){this.isFullWindow=!1,h.off(c["default"],"keydown",this.fullWindowOnEscKey),c["default"].documentElement.style.overflow=this.docOrigOverflow,g.removeElClass(c["default"].body,"vjs-full-window"),this.trigger("exitFullWindow")},e.prototype.canPlayType=function(t){for(var e=void 0,o=0,n=this.options_.techOrder;o0&&(a=this.setTimeout(function(){this.userActivity_||this.userActive(!1)},t))}},250)},e.prototype.playbackRate=function(t){return void 0!==t?(this.techCall_("setPlaybackRate",t),this):this.tech_&&this.tech_.featuresPlaybackRate?this.techGet_("playbackRate"):1},e.prototype.isAudio=function(t){return void 0!==t?(this.isAudio_=!!t,this):!!this.isAudio_},e.prototype.networkState=function(){return this.techGet_("networkState")},e.prototype.readyState=function(){return this.techGet_("readyState")},e.prototype.textTracks=function(){return this.tech_&&this.tech_.textTracks()},e.prototype.remoteTextTracks=function(){return this.tech_&&this.tech_.remoteTextTracks()},e.prototype.remoteTextTrackEls=function(){return this.tech_&&this.tech_.remoteTextTrackEls()},e.prototype.addTextTrack=function(t,e,o){return this.tech_&&this.tech_.addTextTrack(t,e,o)},e.prototype.addRemoteTextTrack=function(t){return this.tech_&&this.tech_.addRemoteTextTrack(t)},e.prototype.removeRemoteTextTrack=function(t){this.tech_&&this.tech_.removeRemoteTextTrack(t)},e.prototype.videoWidth=function(){return this.tech_&&this.tech_.videoWidth&&this.tech_.videoWidth()||0},e.prototype.videoHeight=function(){return this.tech_&&this.tech_.videoHeight&&this.tech_.videoHeight()||0},e.prototype.language=function(t){return void 0===t?this.language_:(this.language_=(""+t).toLowerCase(),this)},e.prototype.languages=function(){return z["default"](e.prototype.options_.languages,this.languages_)},e.prototype.toJSON=function(){var t=z["default"](this.options_),e=t.tracks;t.tracks=[];for(var o=0;o1&&this.show()},e.prototype.createPopup=function(){},e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:this.buildCSSClass()})},e.prototype.buildCSSClass=function(){var e="vjs-menu-button";return e+=this.options_.inline===!0?"-inline":"-popup","vjs-menu-button "+e+" "+t.prototype.buildCSSClass.call(this)},e}(l["default"]));c["default"].registerComponent("PopupButton",v),o["default"]=v,e.exports=o["default"]},{"../clickable-component.js":65,"../component.js":67,"../utils/dom.js":132,"../utils/fn.js":134,"../utils/to-title-case.js":141,"./popup.js":111}],111:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("../component.js"),l=i(a),u=t("../utils/dom.js"),c=n(u),p=t("../utils/fn.js"),f=n(p),d=t("../utils/events.js"),h=n(d),v=function(t){function e(){r(this,e),t.apply(this,arguments)}return s(e,t),e.prototype.addItem=function(t){this.addChild(t),t.on("click",f.bind(this,function(){this.unlockShowing()}))},e.prototype.createEl=function(){var e=this.options_.contentElType||"ul";this.contentEl_=c.createEl(e,{className:"vjs-menu-content"});var o=t.prototype.createEl.call(this,"div",{append:this.contentEl_,className:"vjs-menu"});return o.appendChild(this.contentEl_),h.on(o,"click",function(t){t.preventDefault(),t.stopImmediatePropagation()}),o},e}(l["default"]);l["default"].registerComponent("Popup",v),o["default"]=v,e.exports=o["default"]},{"../component.js":67,"../utils/dom.js":132,"../utils/events.js":133,"../utils/fn.js":134}],112:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("./clickable-component.js"),l=i(a),u=t("./component.js"),c=i(u),p=t("./utils/fn.js"),f=n(p),d=t("./utils/dom.js"),h=n(d),v=t("./utils/browser.js"),g=n(v),y=function(t){function e(o,n){r(this,e),t.call(this,o,n),this.update(),o.on("posterchange",f.bind(this,this.update))}return s(e,t),e.prototype.dispose=function(){this.player().off("posterchange",this.update),t.prototype.dispose.call(this)},e.prototype.createEl=function(){var t=h.createEl("div",{className:"vjs-poster",tabIndex:-1});return g.BACKGROUND_SIZE_SUPPORTED||(this.fallbackImg_=h.createEl("img"),t.appendChild(this.fallbackImg_)),t},e.prototype.update=function(){var t=this.player().poster();this.setSrc(t),t?this.show():this.hide()},e.prototype.setSrc=function(t){if(this.fallbackImg_)this.fallbackImg_.src=t;else{var e="";t&&(e='url("'+t+'")'),this.el_.style.backgroundImage=e}},e.prototype.handleClick=function(){this.player_.paused()?this.player_.play():this.player_.pause()},e}(l["default"]);c["default"].registerComponent("PosterImage",y),o["default"]=y,e.exports=o["default"]},{"./clickable-component.js":65,"./component.js":67,"./utils/browser.js":129,"./utils/dom.js":132,"./utils/fn.js":134}],113:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}o.__esModule=!0;var r=t("./utils/events.js"),s=i(r),a=t("global/document"),l=n(a),u=t("global/window"),c=n(u),p=!1,f=void 0,d=function(){var t=l["default"].getElementsByTagName("video"),e=l["default"].getElementsByTagName("audio"),o=[];if(t&&t.length>0)for(var n=0,i=t.length;n0)for(var n=0,i=e.length;n0)for(var n=0,i=o.length;no.start(0)?e:o.start(0),e=e=10},c["default"].withSourceHandlers(x),x.nativeSourceHandler={},x.nativeSourceHandler.canPlayType=function(t){return t in x.formats?"maybe":""},x.nativeSourceHandler.canHandleSource=function(t){function e(t){var e=h.getFileExtension(t);return e?"video/"+e:""}var o;return o=t.type?t.type.replace(/;.*/,"").toLowerCase():e(t.src),x.nativeSourceHandler.canPlayType(o)},x.nativeSourceHandler.handleSource=function(t,e){e.setSrc(t.src)},x.nativeSourceHandler.dispose=function(){},x.registerSourceHandler(x.nativeSourceHandler),x.formats={"video/flv":"FLV","video/x-flv":"FLV","video/mp4":"MP4","video/m4v":"MP4"},x.onReady=function(t){var e=f.getEl(t),o=e&&e.tech;o&&o.el()&&x.checkReady(o)},x.checkReady=function(t){t.el()&&(t.el().vjs_getProperty?t.triggerReady():this.setTimeout(function(){x.checkReady(t)},50))},x.onEvent=function(t,e){var o=f.getEl(t).tech;o.trigger(e)},x.onError=function(t,e){var o=f.getEl(t).tech;return"srcnotfound"===e?o.error(4):void o.error("FLASH: "+e)},x.version=function(){var t="0,0,0";try{t=new j["default"].ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version").replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}catch(e){try{_.mimeTypes["application/x-shockwave-flash"].enabledPlugin&&(t=(_.plugins["Shockwave Flash 2.0"]||_.plugins["Shockwave Flash"]).description.replace(/\D+/g,",").match(/^,?(.+),?$/)[1])}catch(o){}}return t.split(",")},x.embed=function(t,e,o,n){var i=x.getEmbedCode(t,e,o,n),r=f.createEl("div",{innerHTML:i}).childNodes[0];return r},x.getEmbedCode=function(t,e,o,n){var i=''}),n=k["default"]({data:t,width:"100%",height:"100%"},n),Object.getOwnPropertyNames(n).forEach(function(t){ -a+=t+'="'+n[t]+'" '}),""+i+a+">"+s+""},y["default"](x),A["default"].registerComponent("Flash",x),c["default"].registerTech("Flash",x),o["default"]=x,e.exports=o["default"]},{"../component":67,"../utils/dom.js":132,"../utils/time-ranges.js":140,"../utils/url.js":142,"./flash-rtmp":115,"./tech":119,"global/window":2,"object.assign":45}],117:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("./tech.js"),l=i(a),u=t("../component"),c=i(u),p=t("../utils/dom.js"),f=n(p),d=t("../utils/url.js"),h=n(d),v=t("../utils/fn.js"),g=n(v),y=t("../utils/log.js"),m=i(y),A=t("../utils/browser.js"),b=n(A),j=t("global/document"),w=i(j),k=t("global/window"),_=i(k),x=t("object.assign"),T=i(x),E=t("../utils/merge-options.js"),C=i(E),S=function(t){function e(o,n){r(this,e),t.call(this,o,n);var i=o.source;if(i&&(this.el_.currentSrc!==i.src||o.tag&&3===o.tag.initNetworkState_)?this.setSource(i):this.handleLateInit_(this.el_),this.el_.hasChildNodes()){for(var s=this.el_.childNodes,a=s.length,l=[];a--;){var u=s[a],c=u.nodeName.toLowerCase();"track"===c&&(this.featuresNativeTextTracks?(this.remoteTextTrackEls().addTrackElement_(u),this.remoteTextTracks().addTrack_(u.track)):l.push(u))}for(var p=0;p=0;s--){var a=r[s],l={};"undefined"!=typeof this.options_[a]&&(l[a]=this.options_[a]),f.setElAttributes(t,l)}return t},e.prototype.handleLateInit_=function(t){var e=this;if(0!==t.networkState&&3!==t.networkState){if(0===t.readyState){var o=function(){var t=!1,o=function(){t=!0};e.on("loadstart",o);var n=function(){t||this.trigger("loadstart")};return e.on("loadedmetadata",n),e.ready(function(){this.off("loadstart",o),this.off("loadedmetadata",n),t||this.trigger("loadstart")}),{v:void 0}}();if("object"==typeof o)return o.v}var n=["loadstart"];n.push("loadedmetadata"),t.readyState>=2&&n.push("loadeddata"),t.readyState>=3&&n.push("canplay"),t.readyState>=4&&n.push("canplaythrough"),this.ready(function(){n.forEach(function(t){this.trigger(t)},this)})}},e.prototype.proxyNativeTextTracks_=function(){var t=this.el().textTracks;if(t){for(var e=0;e0&&(t="number"!=typeof S.TEST_VID.textTracks[0].mode),t&&b.IS_FIREFOX&&(t=!1),!t||"onremovetrack"in S.TEST_VID.textTracks||(t=!1),t},S.Events=["loadstart","suspend","abort","error","emptied","stalled","loadedmetadata","loadeddata","canplay","canplaythrough","playing","waiting","seeking","seeked","ended","durationchange","timeupdate","progress","play","pause","ratechange","volumechange"],S.prototype.featuresVolumeControl=S.canControlVolume(),S.prototype.featuresPlaybackRate=S.canControlPlaybackRate(),S.prototype.movingMediaElementInDOM=!b.IS_IOS,S.prototype.featuresFullscreenResize=!0,S.prototype.featuresProgressEvents=!0,S.prototype.featuresNativeTextTracks=S.supportsNativeTextTracks();var B=void 0,P=/^application\/(?:x-|vnd\.apple\.)mpegurl/i,M=/^video\/mp4/i;S.patchCanPlayType=function(){b.ANDROID_VERSION>=4&&(B||(B=S.TEST_VID.constructor.prototype.canPlayType),S.TEST_VID.constructor.prototype.canPlayType=function(t){return t&&P.test(t)?"maybe":B.call(this,t)}),b.IS_OLD_ANDROID&&(B||(B=S.TEST_VID.constructor.prototype.canPlayType),S.TEST_VID.constructor.prototype.canPlayType=function(t){return t&&M.test(t)?"maybe":B.call(this,t)})},S.unpatchCanPlayType=function(){var t=S.TEST_VID.constructor.prototype.canPlayType;return S.TEST_VID.constructor.prototype.canPlayType=B,B=null,t},S.patchCanPlayType(),S.disposeMediaElement=function(t){if(t){for(t.parentNode&&t.parentNode.removeChild(t);t.hasChildNodes();)t.removeChild(t.firstChild);t.removeAttribute("src"),"function"==typeof t.load&&!function(){try{t.load()}catch(e){}}()}},S.resetMediaElement=function(t){if(t){for(var e=t.querySelectorAll("source"),o=e.length;o--;)t.removeChild(e[o]);t.removeAttribute("src"),"function"==typeof t.load&&!function(){try{t.load()}catch(e){}}()}},c["default"].registerComponent("Html5",S),l["default"].registerTech("Html5",S),o["default"]=S,e.exports=o["default"]},{"../component":67,"../utils/browser.js":129,"../utils/dom.js":132,"../utils/fn.js":134,"../utils/log.js":137,"../utils/merge-options.js":138,"../utils/url.js":142,"./tech.js":119,"global/document":1,"global/window":2,"object.assign":45}],118:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var s=t("../component.js"),a=n(s),l=t("./tech.js"),u=n(l),c=t("global/window"),p=(n(c),t("../utils/to-title-case.js")),f=n(p),d=function(t){function e(o,n,r){if(i(this,e),t.call(this,o,n,r),n.playerOptions.sources&&0!==n.playerOptions.sources.length)o.src(n.playerOptions.sources);else for(var s=0,l=n.playerOptions.techOrder;s select").selectedIndex=0,this.$(".vjs-bg-color > select").selectedIndex=0,this.$(".window-color > select").selectedIndex=0,this.$(".vjs-text-opacity > select").selectedIndex=0,this.$(".vjs-bg-opacity > select").selectedIndex=0,this.$(".vjs-window-opacity > select").selectedIndex=0,this.$(".vjs-edge-style select").selectedIndex=0,this.$(".vjs-font-family select").selectedIndex=0,this.$(".vjs-font-percent select").selectedIndex=2,this.updateDisplay()})),d.on(this.$(".vjs-fg-color > select"),"change",v.bind(this,this.updateDisplay)),d.on(this.$(".vjs-bg-color > select"),"change",v.bind(this,this.updateDisplay)),d.on(this.$(".window-color > select"),"change",v.bind(this,this.updateDisplay)),d.on(this.$(".vjs-text-opacity > select"),"change",v.bind(this,this.updateDisplay)),d.on(this.$(".vjs-bg-opacity > select"),"change",v.bind(this,this.updateDisplay)),d.on(this.$(".vjs-window-opacity > select"),"change",v.bind(this,this.updateDisplay)),d.on(this.$(".vjs-font-percent select"),"change",v.bind(this,this.updateDisplay)),d.on(this.$(".vjs-edge-style select"),"change",v.bind(this,this.updateDisplay)),d.on(this.$(".vjs-font-family select"),"change",v.bind(this,this.updateDisplay)),this.options_.persistTextTrackSettings&&this.restoreSettings()}return s(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-caption-settings vjs-modal-overlay",innerHTML:u()})},e.prototype.getValues=function(){var t=a(this.$(".vjs-edge-style select")),e=a(this.$(".vjs-font-family select")),o=a(this.$(".vjs-fg-color > select")),n=a(this.$(".vjs-text-opacity > select")),i=a(this.$(".vjs-bg-color > select")),r=a(this.$(".vjs-bg-opacity > select")),s=a(this.$(".window-color > select")),l=a(this.$(".vjs-window-opacity > select")),u=j["default"].parseFloat(a(this.$(".vjs-font-percent > select"))),c={backgroundOpacity:r,textOpacity:n,windowOpacity:l,edgeStyle:t,fontFamily:e,color:o,backgroundColor:i,windowColor:s,fontPercent:u};for(var p in c)(""===c[p]||"none"===c[p]||"fontPercent"===p&&1===c[p])&&delete c[p];return c},e.prototype.setValues=function(t){l(this.$(".vjs-edge-style select"),t.edgeStyle),l(this.$(".vjs-font-family select"),t.fontFamily),l(this.$(".vjs-fg-color > select"),t.color),l(this.$(".vjs-text-opacity > select"),t.textOpacity),l(this.$(".vjs-bg-color > select"),t.backgroundColor),l(this.$(".vjs-bg-opacity > select"),t.backgroundOpacity),l(this.$(".window-color > select"),t.windowColor),l(this.$(".vjs-window-opacity > select"),t.windowOpacity);var e=t.fontPercent;e&&(e=e.toFixed(2)),l(this.$(".vjs-font-percent > select"),e)},e.prototype.restoreSettings=function(){var t=void 0,e=void 0;try{var o=A["default"](j["default"].localStorage.getItem("vjs-text-track-settings"));t=o[0],e=o[1],t&&y["default"].error(t)}catch(n){y["default"].warn(n)}e&&this.setValues(e)},e.prototype.saveSettings=function(){if(this.options_.persistTextTrackSettings){var t=this.getValues();try{Object.getOwnPropertyNames(t).length>0?j["default"].localStorage.setItem("vjs-text-track-settings",JSON.stringify(t)):j["default"].localStorage.removeItem("vjs-text-track-settings")}catch(e){y["default"].warn(e)}}},e.prototype.updateDisplay=function(){var t=this.player_.getChild("textTrackDisplay");t&&t.updateDisplay()},e}(p["default"]);p["default"].registerComponent("TextTrackSettings",w),o["default"]=w,e.exports=o["default"]},{"../component":67,"../utils/events.js":133,"../utils/fn.js":134,"../utils/log.js":137,"global/window":2,"safe-json-parse/tuple":54}],128:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t("./text-track-cue-list"),l=i(a),u=t("../utils/fn.js"),c=n(u),p=t("../utils/guid.js"),f=n(p),d=t("../utils/browser.js"),h=n(d),v=t("./text-track-enums"),g=n(v),y=t("../utils/log.js"),m=i(y),A=t("../event-target"),b=i(A),j=t("global/document"),w=i(j),k=t("global/window"),_=i(k),x=t("../utils/url.js"),T=t("xhr"),E=i(T),C=function(t,e){var o=new _["default"].WebVTT.Parser(_["default"],_["default"].vttjs,_["default"].WebVTT.StringDecoder());o.oncue=function(t){e.addCue(t)},o.onparsingerror=function(t){m["default"].error(t)},o.onflush=function(){e.trigger({type:"loadeddata",target:e})},o.parse(t),o.flush()},S=function(t,e){var o={uri:t},n=x.isCrossOrigin(t);n&&(o.cors=n),E["default"](o,c.bind(this,function(t,o,n){return t?m["default"].error(t,o):(e.loaded_=!0,void("function"!=typeof _["default"].WebVTT?e.tech_&&!function(){var t=function(){return C(n,e)};e.tech_.on("vttjsloaded",t),e.tech_.on("vttjserror",function(){m["default"].error("vttjs failed to load, stopping trying to process "+e.src),e.tech_.off("vttjsloaded",t)})}():C(n,e)))}))},O=function(t){function e(){var o=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];if(r(this,e),t.call(this),!o.tech)throw new Error("A tech was not provided.");var n=this;if(h.IS_IE8){n=w["default"].createElement("custom");for(var i in e.prototype)"constructor"!==i&&(n[i]=e.prototype[i])}n.tech_=o.tech;var s=g.TextTrackMode[o.mode]||"disabled",a=g.TextTrackKind[o.kind]||"subtitles",u=o.label||"",p=o.language||o.srclang||"",d=o.id||"vjs_text_track_"+f.newGUID();"metadata"!==a&&"chapters"!==a||(s="hidden"),n.cues_=[],n.activeCues_=[];var v=new l["default"](n.cues_),y=new l["default"](n.activeCues_),m=!1,A=c.bind(n,function(){this.activeCues,m&&(this.trigger("cuechange"),m=!1)});if("disabled"!==s&&n.tech_.on("timeupdate",A),Object.defineProperty(n,"kind",{get:function(){return a},set:function(){}}),Object.defineProperty(n,"label",{get:function(){return u},set:function(){}}),Object.defineProperty(n,"language",{get:function(){return p},set:function(){}}),Object.defineProperty(n,"id",{get:function(){return d},set:function(){}}),Object.defineProperty(n,"mode",{get:function(){return s},set:function(t){g.TextTrackMode[t]&&(s=t,"showing"===s&&this.tech_.on("timeupdate",A),this.trigger("modechange"))}}),Object.defineProperty(n,"cues",{get:function(){return this.loaded_?v:null},set:function(){}}),Object.defineProperty(n,"activeCues",{get:function(){if(!this.loaded_)return null;if(0===this.cues.length)return y;for(var t=this.tech_.currentTime(),e=[],o=0,n=this.cues.length;o=t?e.push(i):i.startTime===i.endTime&&i.startTime<=t&&i.startTime+.5>=t&&e.push(i)}if(m=!1,e.length!==this.activeCues_.length)m=!0;else for(var o=0;oe&&(n=e),r+=n-o;return r/e}o.__esModule=!0,o.bufferedPercent=n;var i=t("./time-ranges.js")},{"./time-ranges.js":140}],131:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0;var i=t("./log.js"),r=n(i),s={get:function(t,e){return t[e]},set:function(t,e,o){return t[e]=o,!0}};o["default"]=function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];if("function"==typeof Proxy){var o=function(){var o={};return Object.keys(e).forEach(function(t){s.hasOwnProperty(t)&&(o[t]=function(){return r["default"].warn(e[t]),s[t].apply(this,arguments)})}),{v:new Proxy(t,o)}}();if("object"==typeof o)return o.v}return t},e.exports=o["default"]},{"./log.js":137}],132:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){return t.raw=e,t}function s(t){return"string"==typeof t&&/\S/.test(t)}function a(t){if(/\s/.test(t))throw new Error("class has illegal whitespace characters")}function l(t){return new RegExp("(^|\\s)"+t+"($|\\s)")}function u(t){return function(e,o){return s(e)?(s(o)&&(o=F["default"].querySelector(o)),(E(o)?o:F["default"])[t](e)):F["default"][t](null)}}function c(t){return 0===t.indexOf("#")&&(t=t.slice(1)),F["default"].getElementById(t)}function p(){var t=arguments.length<=0||void 0===arguments[0]?"div":arguments[0],e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],o=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],n=F["default"].createElement(t);return Object.getOwnPropertyNames(e).forEach(function(t){var o=e[t];t.indexOf("aria-")!==-1||"role"===t||"type"===t?(Q["default"].warn(Y["default"](M,t,o)),n.setAttribute(t,o)):n[t]=o}),Object.getOwnPropertyNames(o).forEach(function(t){o[t];n.setAttribute(t,o[t])}),n}function f(t,e){"undefined"==typeof t.textContent?t.innerText=e:t.textContent=e}function d(t,e){e.firstChild?e.insertBefore(t,e.firstChild):e.appendChild(t)}function h(t){var e=t[U];return e||(e=t[U]=L.newGUID()),V[e]||(V[e]={}),V[e]}function v(t){var e=t[U];return!!e&&!!Object.getOwnPropertyNames(V[e]).length}function g(t){var e=t[U];if(e){delete V[e];try{delete t[U]}catch(o){t.removeAttribute?t.removeAttribute(U):t[U]=null}}}function y(t,e){return t.classList?t.classList.contains(e):(a(e),l(e).test(t.className))}function m(t,e){return t.classList?t.classList.add(e):y(t,e)||(t.className=(t.className+" "+e).trim()),t}function A(t,e){return t.classList?t.classList.remove(e):(a(e),t.className=t.className.split(/\s+/).filter(function(t){return t!==e}).join(" ")),t}function b(t,e,o){var n=y(t,e);if("function"==typeof o&&(o=o(t,e)),"boolean"!=typeof o&&(o=!n),o!==n)return o?m(t,e):A(t,e),t}function j(t,e){Object.getOwnPropertyNames(e).forEach(function(o){var n=e[o];null===n||"undefined"==typeof n||n===!1?t.removeAttribute(o):t.setAttribute(o,n===!0?"":n)})}function w(t){var e,o,n,i,r;if(e={},o=",autoplay,controls,loop,muted,default,",t&&t.attributes&&t.attributes.length>0){n=t.attributes;for(var s=n.length-1;s>=0;s--)i=n[s].name,r=n[s].value,"boolean"!=typeof t[i]&&o.indexOf(","+i+",")===-1||(r=null!==r),e[i]=r}return e}function k(){F["default"].body.focus(),F["default"].onselectstart=function(){return!1}}function _(){F["default"].onselectstart=function(){return!0}}function x(t){var e=void 0;if(t.getBoundingClientRect&&t.parentNode&&(e=t.getBoundingClientRect()),!e)return{left:0,top:0};var o=F["default"].documentElement,n=F["default"].body,i=o.clientLeft||n.clientLeft||0,r=R["default"].pageXOffset||n.scrollLeft,s=e.left+r-i,a=o.clientTop||n.clientTop||0,l=R["default"].pageYOffset||n.scrollTop,u=e.top+l-a;return{left:Math.round(s),top:Math.round(u)}}function T(t,e){var o={},n=x(t),i=t.offsetWidth,r=t.offsetHeight,s=n.top,a=n.left,l=e.pageY,u=e.pageX;return e.changedTouches&&(u=e.changedTouches[0].pageX,l=e.changedTouches[0].pageY),o.y=Math.max(0,Math.min(1,(s-l+r)/r)),o.x=Math.max(0,Math.min(1,(u-a)/i)),o}function E(t){return!!t&&"object"==typeof t&&1===t.nodeType}function C(t){return!!t&&"object"==typeof t&&3===t.nodeType}function S(t){for(;t.firstChild;)t.removeChild(t.firstChild);return t}function O(t){return"function"==typeof t&&(t=t()),(Array.isArray(t)?t:[t]).map(function(t){return"function"==typeof t&&(t=t()),E(t)||C(t)?t:"string"==typeof t&&/\S/.test(t)?F["default"].createTextNode(t):void 0}).filter(function(t){return t})}function B(t,e){return O(e).forEach(function(e){return t.appendChild(e)}),t}function P(t,e){return B(S(t),e)}o.__esModule=!0,o.getEl=c,o.createEl=p,o.textContent=f,o.insertElFirst=d,o.getElData=h,o.hasElData=v,o.removeElData=g,o.hasElClass=y,o.addElClass=m,o.removeElClass=A,o.toggleElClass=b,o.setElAttributes=j,o.getElAttributes=w,o.blockTextSelection=k,o.unblockTextSelection=_,o.findElPosition=x,o.getPointerPosition=T,o.isEl=E,o.isTextNode=C,o.emptyEl=S,o.normalizeContent=O,o.appendContent=B,o.insertContent=P;var M=r(["Setting attributes in the second argument of createEl()\n has been deprecated. Use the third argument instead.\n createEl(type, properties, attributes). Attempting to set "," to ","."],["Setting attributes in the second argument of createEl()\n has been deprecated. Use the third argument instead.\n createEl(type, properties, attributes). Attempting to set "," to ","."]),I=t("global/document"),F=i(I),D=t("global/window"),R=i(D),N=t("./guid.js"),L=n(N),z=t("./log.js"),Q=i(z),H=t("tsml"),Y=i(H),V={},U="vdata"+(new Date).getTime(),G=u("querySelector");o.$=G;var W=u("querySelectorAll");o.$$=W},{"./guid.js":136,"./log.js":137,"global/document":1,"global/window":2,tsml:55}],133:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t,e,o){if(Array.isArray(e))return p(r,t,e,o);var n=d.getElData(t);n.handlers||(n.handlers={}),n.handlers[e]||(n.handlers[e]=[]),o.guid||(o.guid=v.newGUID()),n.handlers[e].push(o),n.dispatcher||(n.disabled=!1,n.dispatcher=function(e,o){if(!n.disabled){e=u(e);var i=n.handlers[e.type];if(i)for(var r=i.slice(0),s=0,a=r.length;s0||s>0?i+":":"",n=((i||r>=10)&&n<10?"0"+n:n)+":",o=o<10?"0"+o:o,i+n+o}()}o.__esModule=!0,o["default"]=n,e.exports=o["default"]},{}],136:[function(t,e,o){"use strict";function n(){return i++}o.__esModule=!0,o.newGUID=n;var i=1},{}],137:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){var o=Array.prototype.slice.call(e),n=function(){},i=s["default"].console||{log:n,warn:n,error:n};t?o.unshift(t.toUpperCase()+":"):t="log",a.history.push(o),o.unshift("VIDEOJS:"),i[t].apply?i[t].apply(i,o):i[t](o.join(" "))}o.__esModule=!0;var r=t("global/window"),s=n(r),a=function(){i(null,arguments)};a.history=[],a.error=function(){i("error",arguments)},a.warn=function(){i("warn",arguments)},o["default"]=a,e.exports=o["default"]},{"global/window":2}],138:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t){return!!t&&"object"==typeof t&&"[object Object]"===t.toString()&&t.constructor===Object}function r(){var t=Array.prototype.slice.call(arguments);return t.unshift({}),t.push(l),a["default"].apply(null,t),t[0]}o.__esModule=!0,o["default"]=r;var s=t("lodash-compat/object/merge"),a=n(s),l=function(t,e){return i(e)?i(t)?void 0:r(e):e};e.exports=o["default"]},{"lodash-compat/object/merge":40}],139:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0;var i=t("global/document"),r=n(i),s=function(t){var e=r["default"].createElement("style");return e.className=t,e};o.createStyleElement=s;var a=function(t,e){t.styleSheet?t.styleSheet.cssText=e:t.textContent=e};o.setTextContent=a},{"global/document":1}],140:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){return Array.isArray(t)?r(t):void 0===t||void 0===e?r():r([[t,e]])}function r(t){return void 0===t||0===t.length?{length:0,start:function(){throw new Error("This TimeRanges object is empty")},end:function(){throw new Error("This TimeRanges object is empty")}}:{length:t.length,start:s.bind(null,"start",0,t),end:s.bind(null,"end",1,t)}}function s(t,e,o,n){return void 0===n&&(u["default"].warn("DEPRECATED: Function '"+t+"' on 'TimeRanges' called without an index argument."),n=0),a(t,n,o.length-1),o[n][e]}function a(t,e,o){if(e<0||e>o)throw new Error("Failed to execute '"+t+"' on 'TimeRanges': The index provided ("+e+") is greater than or equal to the maximum bound ("+o+").")}o.__esModule=!0,o.createTimeRanges=i;var l=t("./log.js"),u=n(l);o.createTimeRange=i},{"./log.js":137}],141:[function(t,e,o){"use strict";function n(t){return t.charAt(0).toUpperCase()+t.slice(1)}o.__esModule=!0,o["default"]=n,e.exports=o["default"]},{}],142:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0;var i=t("global/document"),r=n(i),s=t("global/window"),a=n(s),l=function(t){var e=["protocol","hostname","port","pathname","search","hash","host"],o=r["default"].createElement("a");o.href=t;var n=""===o.host&&"file:"!==o.protocol,i=void 0;n&&(i=r["default"].createElement("div"),i.innerHTML='',o=i.firstChild,i.setAttribute("style","display:none; position:absolute;"),r["default"].body.appendChild(i));for(var s={},a=0;ax',t=e.firstChild.href}return t};o.getAbsoluteURL=u;var c=function(t){if("string"==typeof t){var e=/^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/i,o=e.exec(t);if(o)return o.pop().toLowerCase()}return""};o.getFileExtension=c;var p=function(t){var e=a["default"].location,o=l(t),n=":"===o.protocol?e.protocol:o.protocol,i=n+o.host!==e.protocol+e.host;return i};o.isCrossOrigin=p},{"global/document":1,"global/window":2}],143:[function(e,o,n){"use strict";function i(t){if(t&&t.__esModule)return t; -var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}n.__esModule=!0;var s=e("global/document"),a=r(s),l=e("./setup"),u=i(l),c=e("./utils/stylesheet.js"),p=i(c),f=e("./component"),d=r(f),h=e("./event-target"),v=r(h),g=e("./utils/events.js"),y=i(g),m=e("./player"),A=r(m),b=e("./plugins.js"),j=r(b),w=e("../../src/js/utils/merge-options.js"),k=r(w),_=e("./utils/fn.js"),x=i(_),T=e("./tracks/text-track.js"),E=r(T),C=e("object.assign"),S=(r(C),e("./utils/time-ranges.js")),O=e("./utils/format-time.js"),B=r(O),P=e("./utils/log.js"),M=r(P),I=e("./utils/dom.js"),F=i(I),D=e("./utils/browser.js"),R=i(D),N=e("./utils/url.js"),L=i(N),z=e("./extend.js"),Q=r(z),H=e("lodash-compat/object/merge"),Y=r(H),V=e("./utils/create-deprecation-proxy.js"),U=r(V),G=e("xhr"),W=r(G),J=e("./tech/tech.js"),X=r(J),Z=e("./tech/html5.js"),q=(r(Z),e("./tech/flash.js"));r(q);"undefined"==typeof HTMLVideoElement&&(a["default"].createElement("video"),a["default"].createElement("audio"),a["default"].createElement("track"));var K=function et(t,e,o){var n=void 0;if("string"==typeof t){if(0===t.indexOf("#")&&(t=t.slice(1)),et.getPlayers()[t])return e&&M["default"].warn('Player "'+t+'" is already initialised. Options will not be applied.'),o&&et.getPlayers()[t].ready(o),et.getPlayers()[t];n=F.getEl(t)}else n=t;if(!n||!n.nodeName)throw new TypeError("The element or ID supplied is not valid. (videojs)");return n.player||A["default"].players[n.playerId]||new A["default"](n,e,o)},$=F.$(".vjs-styles-defaults");if(!$){$=p.createStyleElement("vjs-styles-defaults");var tt=F.$("head");tt.insertBefore($,tt.firstChild),p.setTextContent($,"\n .video-js {\n width: 300px;\n height: 150px;\n }\n\n .vjs-fluid {\n padding-top: 56.25%\n }\n ")}u.autoSetupTimeout(1,K),K.VERSION="5.8.8",K.options=A["default"].prototype.options_,K.getPlayers=function(){return A["default"].players},K.players=U["default"](A["default"].players,{get:"Access to videojs.players is deprecated; use videojs.getPlayers instead",set:"Modification of videojs.players is deprecated"}),K.getComponent=d["default"].getComponent,K.registerComponent=function(t,e){X["default"].isTech(e)&&M["default"].warn("The "+t+" tech was registered as a component. It should instead be registered using videojs.registerTech(name, tech)"),d["default"].registerComponent.call(d["default"],t,e)},K.getTech=X["default"].getTech,K.registerTech=X["default"].registerTech,K.browser=R,K.TOUCH_ENABLED=R.TOUCH_ENABLED,K.extend=Q["default"],K.mergeOptions=k["default"],K.bind=x.bind,K.plugin=j["default"],K.addLanguage=function(t,e){var o;return t=(""+t).toLowerCase(),Y["default"](K.options.languages,(o={},o[t]=e,o))[t]},K.log=M["default"],K.createTimeRange=K.createTimeRanges=S.createTimeRanges,K.formatTime=B["default"],K.parseUrl=L.parseUrl,K.isCrossOrigin=L.isCrossOrigin,K.EventTarget=v["default"],K.on=y.on,K.one=y.one,K.off=y.off,K.trigger=y.trigger,K.xhr=W["default"],K.TextTrack=E["default"],K.isEl=F.isEl,K.isTextNode=F.isTextNode,K.createEl=F.createEl,K.hasClass=F.hasElClass,K.addClass=F.addElClass,K.removeClass=F.removeElClass,K.toggleClass=F.toggleElClass,K.setAttributes=F.setElAttributes,K.getAttributes=F.getElAttributes,K.emptyEl=F.emptyEl,K.appendContent=F.appendContent,K.insertContent=F.insertContent,"function"==typeof t&&t.amd?t("videojs",[],function(){return K}):"object"==typeof n&&"object"==typeof o&&(o.exports=K),n["default"]=K,o.exports=n["default"]},{"../../src/js/utils/merge-options.js":138,"./component":67,"./event-target":99,"./extend.js":100,"./player":108,"./plugins.js":109,"./setup":113,"./tech/flash.js":116,"./tech/html5.js":117,"./tech/tech.js":119,"./tracks/text-track.js":128,"./utils/browser.js":129,"./utils/create-deprecation-proxy.js":131,"./utils/dom.js":132,"./utils/events.js":133,"./utils/fn.js":134,"./utils/format-time.js":135,"./utils/log.js":137,"./utils/stylesheet.js":139,"./utils/time-ranges.js":140,"./utils/url.js":142,"global/document":1,"lodash-compat/object/merge":40,"object.assign":45,xhr:56}]},{},[143])(143)}),function(t){var e=t.vttjs={},o=e.VTTCue,n=e.VTTRegion,i=t.VTTCue,r=t.VTTRegion;e.shim=function(){e.VTTCue=o,e.VTTRegion=n},e.restore=function(){e.VTTCue=i,e.VTTRegion=r}}(this),function(t,e){function o(t){if("string"!=typeof t)return!1;var e=a[t.toLowerCase()];return!!e&&t.toLowerCase()}function n(t){if("string"!=typeof t)return!1;var e=l[t.toLowerCase()];return!!e&&t.toLowerCase()}function i(t){for(var e=1;e100)throw new Error("Position must be between 0 and 100.");b=t,this.hasBeenReset=!0}})),Object.defineProperty(a,"positionAlign",i({},u,{get:function(){return j},set:function(t){var e=n(t);if(!e)throw new SyntaxError("An invalid or illegal string was specified.");j=e,this.hasBeenReset=!0}})),Object.defineProperty(a,"size",i({},u,{get:function(){return w},set:function(t){if(t<0||t>100)throw new Error("Size must be between 0 and 100.");w=t,this.hasBeenReset=!0}})),Object.defineProperty(a,"align",i({},u,{get:function(){return k},set:function(t){var e=n(t);if(!e)throw new SyntaxError("An invalid or illegal string was specified.");k=e,this.hasBeenReset=!0}})),a.displayState=void 0,l)return a}var s="auto",a={"":!0,lr:!0,rl:!0},l={start:!0,middle:!0,end:!0,left:!0,right:!0};r.prototype.getCueAsHTML=function(){return WebVTT.convertCueToDOMTree(window,this.text)},t.VTTCue=t.VTTCue||r,e.VTTCue=r}(this,this.vttjs||{}),function(t,e){function o(t){if("string"!=typeof t)return!1;var e=r[t.toLowerCase()];return!!e&&t.toLowerCase()}function n(t){return"number"==typeof t&&t>=0&&t<=100}function i(){var t=100,e=3,i=0,r=100,s=0,a=100,l="";Object.defineProperties(this,{width:{enumerable:!0,get:function(){return t},set:function(e){if(!n(e))throw new Error("Width must be between 0 and 100.");t=e}},lines:{enumerable:!0,get:function(){return e},set:function(t){if("number"!=typeof t)throw new TypeError("Lines must be set to a number.");e=t}},regionAnchorY:{enumerable:!0,get:function(){return r},set:function(t){if(!n(t))throw new Error("RegionAnchorX must be between 0 and 100.");r=t}},regionAnchorX:{enumerable:!0,get:function(){return i},set:function(t){if(!n(t))throw new Error("RegionAnchorY must be between 0 and 100.");i=t}},viewportAnchorY:{enumerable:!0,get:function(){return a},set:function(t){if(!n(t))throw new Error("ViewportAnchorY must be between 0 and 100.");a=t}},viewportAnchorX:{enumerable:!0,get:function(){return s},set:function(t){if(!n(t))throw new Error("ViewportAnchorX must be between 0 and 100.");s=t}},scroll:{enumerable:!0,get:function(){return l},set:function(t){var e=o(t);if(e===!1)throw new SyntaxError("An invalid or illegal string was specified.");l=e}}})}var r={"":!0,up:!0};t.VTTRegion=t.VTTRegion||i,e.VTTRegion=i}(this,this.vttjs||{}),function(t){function e(t,e){this.name="ParsingError",this.code=t.code,this.message=e||t.message}function o(t){function e(t,e,o,n){return 3600*(0|t)+60*(0|e)+(0|o)+(0|n)/1e3}var o=t.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);return o?o[3]?e(o[1],o[2],o[3].replace(":",""),o[4]):o[1]>59?e(o[1],o[2],0,o[4]):e(0,o[1],o[2],o[4]):null}function n(){this.values=h(null)}function i(t,e,o,n){var i=n?t.split(n):[t];for(var r in i)if("string"==typeof i[r]){var s=i[r].split(o);if(2===s.length){var a=s[0],l=s[1];e(a,l)}}}function r(t,r,s){function a(){var n=o(t);if(null===n)throw new e(e.Errors.BadTimeStamp,"Malformed timestamp: "+c);return t=t.replace(/^[^\sa-zA-Z-]+/,""),n}function l(t,e){var o=new n;i(t,function(t,e){switch(t){case"region":for(var n=s.length-1;n>=0;n--)if(s[n].id===e){o.set(t,s[n].region);break}break;case"vertical":o.alt(t,e,["rl","lr"]);break;case"line":var i=e.split(","),r=i[0];o.integer(t,r),o.percent(t,r)?o.set("snapToLines",!1):null,o.alt(t,r,["auto"]),2===i.length&&o.alt("lineAlign",i[1],["start","middle","end"]);break;case"position":i=e.split(","),o.percent(t,i[0]),2===i.length&&o.alt("positionAlign",i[1],["start","middle","end"]);break;case"size":o.percent(t,e);break;case"align":o.alt(t,e,["start","middle","end","left","right"])}},/:/,/\s/),e.region=o.get("region",null),e.vertical=o.get("vertical",""),e.line=o.get("line","auto"),e.lineAlign=o.get("lineAlign","start"),e.snapToLines=o.get("snapToLines",!0),e.size=o.get("size",100),e.align=o.get("align","middle"),e.position=o.get("position",{start:0,left:0,middle:50,end:100,right:100},e.align),e.positionAlign=o.get("positionAlign",{start:"start",left:"start",middle:"middle",end:"end",right:"end"},e.align)}function u(){t=t.replace(/^\s+/,"")}var c=t;if(u(),r.startTime=a(),u(),"-->"!==t.substr(0,3))throw new e(e.Errors.BadTimeStamp,"Malformed time stamp (time stamps must be separated by '-->'): "+c);t=t.substr(3),u(),r.endTime=a(),u(),l(t,r)}function s(t,e){function n(){function t(t){return e=e.substr(t.length),t}if(!e)return null;var o=e.match(/^([^<]*)(<[^>]+>?)?/);return t(o[1]?o[1]:o[2])}function i(t){return v[t]}function r(t){for(;h=t.match(/&(amp|lt|gt|lrm|rlm|nbsp);/);)t=t.replace(h[0],i);return t}function s(t,e){return!m[e.localName]||m[e.localName]===t.localName}function a(e,o){var n=g[e];if(!n)return null;var i=t.document.createElement(n);i.localName=n;var r=y[e];return r&&o&&(i[r]=o.trim()),i}for(var l,u=t.document.createElement("div"),c=u,p=[];null!==(l=n());)if("<"!==l[0])c.appendChild(t.document.createTextNode(r(l)));else{if("/"===l[1]){p.length&&p[p.length-1]===l.substr(2).replace(">","")&&(p.pop(),c=c.parentNode);continue}var f,d=o(l.substr(1,l.length-2));if(d){f=t.document.createProcessingInstruction("timestamp",d),c.appendChild(f);continue}var h=l.match(/^<([^.\s\/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/);if(!h)continue;if(f=a(h[1],h[3]),!f)continue;if(!s(c,f))continue;h[2]&&(f.className=h[2].substr(1).replace("."," ")),p.push(h[1]),c.appendChild(f),c=f}return u}function a(t){function e(t,e){for(var o=e.childNodes.length-1;o>=0;o--)t.push(e.childNodes[o])}function o(t){if(!t||!t.length)return null;var n=t.pop(),i=n.textContent||n.innerText;if(i){var r=i.match(/^.*(\n|\r)/);return r?(t.length=0,r[0]):i}return"ruby"===n.tagName?o(t):n.childNodes?(e(t,n),o(t)):void 0}var n,i=[],r="";if(!t||!t.childNodes)return"ltr";for(e(i,t);r=o(i);)for(var s=0;s=0&&t.line<=100))return t.line;if(!t.track||!t.track.textTrackList||!t.track.textTrackList.mediaElement)return-1;for(var e=t.track,o=e.textTrackList,n=0,i=0;il&&(i=new p(t),s=l),t=new p(r)}return i||r}var r=new p(e),s=e.cue,a=l(s),u=[];if(s.snapToLines){var c;switch(s.vertical){case"":u=["+y","-y"],c="height";break;case"rl":u=["+x","-x"],c="width";break;case"lr":u=["-x","+x"],c="width"}var f=r.lineHeight,d=f*Math.round(a),h=o[c]+f,v=u[0];Math.abs(d)>h&&(d=d<0?-1:1,d*=Math.ceil(h/f)*f),a<0&&(d+=""===s.vertical?o.height:o.width,u=u.reverse()),r.move(v,d)}else{var g=r.lineHeight/o.height*100;switch(s.lineAlign){case"middle":a-=g/2;break;case"end":a-=g}switch(s.vertical){case"":e.applyStyles({top:e.formatStyle(a,"%")});break;case"rl":e.applyStyles({left:e.formatStyle(a,"%")});break;case"lr":e.applyStyles({right:e.formatStyle(a,"%")})}u=["+y","-x","+x","-y"],r=new p(e)}var y=i(r,u);e.move(y.toCSSCompatValues(o))}function d(){}var h=Object.create||function(){function t(){}return function(e){if(1!==arguments.length)throw new Error("Object.create shim only accepts one parameter.");return t.prototype=e,new t}}();e.prototype=h(Error.prototype),e.prototype.constructor=e,e.Errors={BadSignature:{code:0,message:"Malformed WebVTT signature."},BadTimeStamp:{code:1,message:"Malformed time stamp."}},n.prototype={set:function(t,e){this.get(t)||""===e||(this.values[t]=e)},get:function(t,e,o){return o?this.has(t)?this.values[t]:e[o]:this.has(t)?this.values[t]:e},has:function(t){return t in this.values},alt:function(t,e,o){for(var n=0;n=0&&e<=100))&&(this.set(t,e),!0)}};var v={"&":"&","<":"<",">":">","‎":"‎","‏":"‏"," ":" "},g={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",v:"span",lang:"span"},y={v:"title",lang:"lang"},m={rt:"ruby"},A=[1470,1472,1475,1478,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1520,1521,1522,1523,1524,1544,1547,1549,1563,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1645,1646,1647,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1765,1766,1774,1775,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1807,1808,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1969,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2e3,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2036,2037,2042,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2074,2084,2088,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2142,2208,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,8207,64285,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64434,64435,64436,64437,64438,64439,64440,64441,64442,64443,64444,64445,64446,64447,64448,64449,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64606,64607,64608,64609,64610,64611,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65018,65019,65020,65136,65137,65138,65139,65140,65142,65143,65144,65145,65146,65147,65148,65149,65150,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,67584,67585,67586,67587,67588,67589,67592,67594,67595,67596,67597,67598,67599,67600,67601,67602,67603,67604,67605,67606,67607,67608,67609,67610,67611,67612,67613,67614,67615,67616,67617,67618,67619,67620,67621,67622,67623,67624,67625,67626,67627,67628,67629,67630,67631,67632,67633,67634,67635,67636,67637,67639,67640,67644,67647,67648,67649,67650,67651,67652,67653,67654,67655,67656,67657,67658,67659,67660,67661,67662,67663,67664,67665,67666,67667,67668,67669,67671,67672,67673,67674,67675,67676,67677,67678,67679,67840,67841,67842,67843,67844,67845,67846,67847,67848,67849,67850,67851,67852,67853,67854,67855,67856,67857,67858,67859,67860,67861,67862,67863,67864,67865,67866,67867,67872,67873,67874,67875,67876,67877,67878,67879,67880,67881,67882,67883,67884,67885,67886,67887,67888,67889,67890,67891,67892,67893,67894,67895,67896,67897,67903,67968,67969,67970,67971,67972,67973,67974,67975,67976,67977,67978,67979,67980,67981,67982,67983,67984,67985,67986,67987,67988,67989,67990,67991,67992,67993,67994,67995,67996,67997,67998,67999,68e3,68001,68002,68003,68004,68005,68006,68007,68008,68009,68010,68011,68012,68013,68014,68015,68016,68017,68018,68019,68020,68021,68022,68023,68030,68031,68096,68112,68113,68114,68115,68117,68118,68119,68121,68122,68123,68124,68125,68126,68127,68128,68129,68130,68131,68132,68133,68134,68135,68136,68137,68138,68139,68140,68141,68142,68143,68144,68145,68146,68147,68160,68161,68162,68163,68164,68165,68166,68167,68176,68177,68178,68179,68180,68181,68182,68183,68184,68192,68193,68194,68195,68196,68197,68198,68199,68200,68201,68202,68203,68204,68205,68206,68207,68208,68209,68210,68211,68212,68213,68214,68215,68216,68217,68218,68219,68220,68221,68222,68223,68352,68353,68354,68355,68356,68357,68358,68359,68360,68361,68362,68363,68364,68365,68366,68367,68368,68369,68370,68371,68372,68373,68374,68375,68376,68377,68378,68379,68380,68381,68382,68383,68384,68385,68386,68387,68388,68389,68390,68391,68392,68393,68394,68395,68396,68397,68398,68399,68400,68401,68402,68403,68404,68405,68416,68417,68418,68419,68420,68421,68422,68423,68424,68425,68426,68427,68428,68429,68430,68431,68432,68433,68434,68435,68436,68437,68440,68441,68442,68443,68444,68445,68446,68447,68448,68449,68450,68451,68452,68453,68454,68455,68456,68457,68458,68459,68460,68461,68462,68463,68464,68465,68466,68472,68473,68474,68475,68476,68477,68478,68479,68608,68609,68610,68611,68612,68613,68614,68615,68616,68617,68618,68619,68620,68621,68622,68623,68624,68625,68626,68627,68628,68629,68630,68631,68632,68633,68634,68635,68636,68637,68638,68639,68640,68641,68642,68643,68644,68645,68646,68647,68648,68649,68650,68651,68652,68653,68654,68655,68656,68657,68658,68659,68660,68661,68662,68663,68664,68665,68666,68667,68668,68669,68670,68671,68672,68673,68674,68675,68676,68677,68678,68679,68680,126464,126465,126466,126467,126469,126470,126471,126472,126473,126474,126475,126476,126477,126478,126479,126480,126481,126482,126483,126484,126485,126486,126487,126488,126489,126490,126491,126492,126493,126494,126495,126497,126498,126500,126503,126505,126506,126507,126508,126509,126510,126511,126512,126513,126514,126516,126517,126518,126519,126521,126523,126530,126535,126537,126539,126541,126542,126543,126545,126546,126548,126551,126553,126555,126557,126559,126561,126562,126564,126567,126568,126569,126570,126572,126573,126574,126575,126576,126577,126578,126580,126581,126582,126583,126585,126586,126587,126588,126590,126592,126593,126594,126595,126596,126597,126598,126599,126600,126601,126603,126604,126605,126606,126607,126608,126609,126610,126611,126612,126613,126614,126615,126616,126617,126618,126619,126625,126626,126627,126629,126630,126631,126632,126633,126635,126636,126637,126638,126639,126640,126641,126642,126643,126644,126645,126646,126647,126648,126649,126650,126651,1114109];u.prototype.applyStyles=function(t,e){e=e||this.div;for(var o in t)t.hasOwnProperty(o)&&(e.style[o]=t[o])},u.prototype.formatStyle=function(t,e){return 0===t?0:t+e},c.prototype=h(u.prototype),c.prototype.constructor=c,p.prototype.move=function(t,e){switch(e=void 0!==e?e:this.lineHeight,t){case"+x":this.left+=e,this.right+=e;break;case"-x":this.left-=e,this.right-=e;break;case"+y":this.top+=e,this.bottom+=e;break;case"-y":this.top-=e,this.bottom-=e}},p.prototype.overlaps=function(t){return this.leftt.left&&this.topt.top},p.prototype.overlapsAny=function(t){for(var e=0;e=t.top&&this.bottom<=t.bottom&&this.left>=t.left&&this.right<=t.right},p.prototype.overlapsOppositeAxis=function(t,e){switch(e){case"+x":return this.leftt.right;case"+y":return this.topt.bottom}},p.prototype.intersectPercentage=function(t){var e=Math.max(0,Math.min(this.right,t.right)-Math.max(this.left,t.left)),o=Math.max(0,Math.min(this.bottom,t.bottom)-Math.max(this.top,t.top)),n=e*o;return n/(this.height*this.width)},p.prototype.toCSSCompatValues=function(t){return{top:this.top-t.top,bottom:t.bottom-this.bottom,left:this.left-t.left,right:t.right-this.right,height:this.height,width:this.width}},p.getSimpleBoxPosition=function(t){var e=t.div?t.div.offsetHeight:t.tagName?t.offsetHeight:0,o=t.div?t.div.offsetWidth:t.tagName?t.offsetWidth:0,n=t.div?t.div.offsetTop:t.tagName?t.offsetTop:0;t=t.div?t.div.getBoundingClientRect():t.tagName?t.getBoundingClientRect():t;var i={left:t.left,right:t.right,top:t.top||n,height:t.height||e,bottom:t.bottom||n+(t.height||e),width:t.width||o};return i},d.StringDecoder=function(){return{decode:function(t){if(!t)return"";if("string"!=typeof t)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(t))}}},d.convertCueToDOMTree=function(t,e){return t&&e?s(t,e):null};var b=.05,j="sans-serif",w="1.5%";d.processCues=function(t,e,o){function n(t){for(var e=0;e")===-1){l.cue.id=u;continue}case"CUE":try{r(u,l.cue,l.regionList)}catch(f){l.reportOrThrowError(f),l.cue=null,l.state="BADCUE";continue}l.state="CUETEXT";continue;case"CUETEXT":var d=u.indexOf("-->")!==-1;if(!u||d&&(p=!0)){l.oncue&&l.oncue(l.cue),l.cue=null,l.state="ID";continue}l.cue.text&&(l.cue.text+="\n"),l.cue.text+=u;continue;case"BADCUE":u||(l.state="ID");continue}}}catch(f){l.reportOrThrowError(f),"CUETEXT"===l.state&&l.cue&&l.oncue&&l.oncue(l.cue),l.cue=null,l.state="INITIAL"===l.state?"BADWEBVTT":"BADCUE"}return this},flush:function(){var t=this;try{if(t.buffer+=t.decoder.decode(),(t.cue||"HEADER"===t.state)&&(t.buffer+="\n\n",t.parse()),"INITIAL"===t.state)throw new e(e.Errors.BadSignature)}catch(o){t.reportOrThrowError(o)}return t.onflush&&t.onflush(),this}},t.WebVTT=d}(this,this.vttjs||{}),function(t,e){"function"==typeof define&&define.amd?define([],e.bind(this,t,t.videojs)):"undefined"!=typeof module&&module.exports?module.exports=e(t,t.videojs):e(t,t.videojs)}(window,function(t,e){"use strict";t.videojs_hotkeys={version:"0.2.13"};var o=function(o){function n(t){return 32===t.which}function i(t){return 37===t.which}function r(t){return 39===t.which}function s(t){return 38===t.which}function a(t){return 40===t.which}function l(t){return 77===t.which}function u(t){return 70===t.which}var c=this,p=c.el(),f=document,d={volumeStep:.1,seekStep:5,enableMute:!0,enableVolumeScroll:!0,enableFullscreen:!0,enableNumbers:!0,enableJogStyle:!1,alwaysCaptureHotkeys:!1,playPauseKey:n,rewindKey:i,forwardKey:r,volumeUpKey:s,volumeDownKey:a,muteKey:l,fullscreenKey:u,customKeys:{}},h=1,v=2,g=3,y=4,m=5,A=6,b=7,j=e.mergeOptions||e.util.mergeOptions;o=j(d,o||{});var w=o.volumeStep,k=o.seekStep,_=o.enableMute,x=o.enableVolumeScroll,T=o.enableFullscreen,E=o.enableNumbers,C=o.enableJogStyle,S=o.alwaysCaptureHotkeys;p.hasAttribute("tabIndex")||p.setAttribute("tabIndex","-1"),S&&c.one("play",function(){p.focus()}),c.on("userinactive",function(){var t=function(){clearTimeout(e)},e=setTimeout(function(){c.off("useractive",t),f.activeElement.parentElement==p.querySelector(".vjs-control-bar")&&p.focus()},10);c.one("useractive",t)}),c.on("play",function(){var t=p.querySelector(".iframeblocker");t&&""===t.style.display&&(t.style.display="block",t.style.bottom="39px")});var O=function(t){var e,n=t.which,i=t.preventDefault;if(c.controls()){var r=f.activeElement;if(S||r==p||r==p.querySelector(".vjs-tech")||r==p.querySelector(".vjs-control-bar")||r==p.querySelector(".iframeblocker"))switch(M(t,c)){case h:i(),S&&t.stopPropagation(),c.paused()?c.play():c.pause();break;case v:i(),e=c.currentTime()-k,c.currentTime()<=k&&(e=0),c.currentTime(e);break;case g:i(),c.currentTime(c.currentTime()+k);break;case m:i(),C?(e=c.currentTime()-1,c.currentTime()<=1&&(e=0),c.currentTime(e)):c.volume(c.volume()-w);break;case y:i(),C?c.currentTime(c.currentTime()+1):c.volume(c.volume()+w);break;case A:_&&c.muted(!c.muted());break;case b:T&&(c.isFullscreen()?c.exitFullscreen():c.requestFullscreen());break;default:if((n>47&&n<59||n>95&&n<106)&&E){var s=48;n>95&&(s=96);var a=n-s;i(),c.currentTime(c.duration()*a*.1)}for(var l in o.customKeys){var u=o.customKeys[l];u&&u.key&&u.handler&&u.key(t)&&(i(),u.handler(c,o))}}}},B=function(t){if(c.controls()){var e=t.relatedTarget||t.toElement||f.activeElement;e!=p&&e!=p.querySelector(".vjs-tech")&&e!=p.querySelector(".iframeblocker")||T&&(c.isFullscreen()?c.exitFullscreen():c.requestFullscreen())}},P=function(e){if(c.controls()){var o=e.relatedTarget||e.toElement||f.activeElement;if((S||o==p||o==p.querySelector(".vjs-tech")||o==p.querySelector(".iframeblocker")||o==p.querySelector(".vjs-control-bar"))&&x){e=t.event||e;var n=Math.max(-1,Math.min(1,e.wheelDelta||-e.detail));e.preventDefault(),1==n?c.volume(c.volume()+w):n==-1&&c.volume(c.volume()-w)}}},M=function(t,e){return o.playPauseKey(t,e)?h:o.rewindKey(t,e)?v:o.forwardKey(t,e)?g:o.volumeUpKey(t,e)?y:o.volumeDownKey(t,e)?m:o.muteKey(t,e)?A:o.fullscreenKey(t,e)?b:void 0};return c.on("keydown",O),c.on("dblclick",B),c.on("mousewheel",P),c.on("DOMMouseScroll",P),this};e.plugin("hotkeys",o)}),function(t,e){"function"==typeof define&&define.amd?define(["video.js"],function(o){return t.Youtube=e(o)}):"object"==typeof module&&module.exports?module.exports=t.Youtube=e(require("video.js")):t.Youtube=e(t.videojs)}(this,function(t){"use strict";function e(){if(!i.apiLoaded){var t=document.createElement("script");t.src="https://www.youtube.com/iframe_api";var e=document.getElementsByTagName("script")[0];e.parentNode.insertBefore(t,e),i.apiLoaded=!0}}function o(){var t=".vjs-youtube .vjs-iframe-blocker { display: none; }.vjs-youtube.vjs-user-inactive .vjs-iframe-blocker { display: block; }.vjs-youtube .vjs-poster { background-size: cover; }.vjs-youtube-mobile .vjs-big-play-button { display: none; }",e=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",o.styleSheet?o.styleSheet.cssText=t:o.appendChild(document.createTextNode(t)),e.appendChild(o)}var n=t.getComponent("Tech"),i=t.extend(n,{apiLoaded:!1,constructor:function(t,e){n.call(this,t,e),this.setPoster(t.poster),this.setSrc(this.options_.source,!0),setTimeout(function(){this.el_.parentNode.className+=" vjs-youtube",i.isApiReady?(this.setSrc(this.options_.source,!0),this.initYTPlayer()):i.apiReadyQueue.push(this)}.bind(this))},dispose:function(){this.el_.parentNode.className=this.el_.parentNode.className.replace(" vjs-youtube","").replace(" vjs-youtube-mobile","")},createEl:function(){e(),o();var t=document.createElement("div");t.setAttribute("id",this.options_.techId),t.setAttribute("style","width:100%;height:100%;top:0;left:0;position:absolute");var n=document.createElement("div");if(n.appendChild(t),!r&&!this.options_.ytControls){var i=document.createElement("div");i.setAttribute("class","vjs-iframe-blocker"),i.setAttribute("style","position:absolute;top:0;left:0;width:100%;height:100%"),i.onclick=function(){this.pause()}.bind(this),n.appendChild(i)}return n},initYTPlayer:function(){var t={controls:0,modestbranding:1,rel:0,showinfo:0,loop:this.options_.loop?1:0};"undefined"!=typeof this.options_.autohide&&(t.autohide=this.options_.autohide),"undefined"!=typeof this.options_.cc_load_policy&&(t.cc_load_policy=this.options_.cc_load_policy),"undefined"!=typeof this.options_.ytControls&&(t.controls=this.options_.ytControls),"undefined"!=typeof this.options_.disablekb&&(t.disablekb=this.options_.disablekb),"undefined"!=typeof this.options_.end&&(t.end=this.options_.end),"undefined"!=typeof this.options_.color&&(t.color=this.options_.color),t.controls?"undefined"!=typeof this.options_.fs&&(t.fs=this.options_.fs):t.fs=0,"undefined"!=typeof this.options_.end&&(t.end=this.options_.end),"undefined"!=typeof this.options_.hl?t.hl=this.options_.hl:"undefined"!=typeof this.options_.language&&(t.hl=this.options_.language.substr(0,2)),"undefined"!=typeof this.options_.iv_load_policy&&(t.iv_load_policy=this.options_.iv_load_policy),"undefined"!=typeof this.options_.list?t.list=this.options_.list:this.url&&"undefined"!=typeof this.url.listId&&(t.list=this.url.listId),"undefined"!=typeof this.options_.listType&&(t.listType=this.options_.listType),"undefined"!=typeof this.options_.modestbranding&&(t.modestbranding=this.options_.modestbranding),"undefined"!=typeof this.options_.playlist&&(t.playlist=this.options_.playlist),"undefined"!=typeof this.options_.playsinline&&(t.playsinline=this.options_.playsinline),"undefined"!=typeof this.options_.rel&&(t.rel=this.options_.rel),"undefined"!=typeof this.options_.showinfo&&(t.showinfo=this.options_.showinfo),"undefined"!=typeof this.options_.start&&(t.start=this.options_.start),"undefined"!=typeof this.options_.theme&&(t.theme=this.options_.theme),this.activeVideoId=this.url?this.url.videoId:null,this.activeList=t.list,this.ytPlayer=new YT.Player(this.options_.techId,{videoId:this.activeVideoId,playerVars:t,events:{onReady:this.onPlayerReady.bind(this),onPlaybackQualityChange:this.onPlayerPlaybackQualityChange.bind(this),onStateChange:this.onPlayerStateChange.bind(this),onError:this.onPlayerError.bind(this)}})},onPlayerReady:function(){this.playerReady_=!0,this.triggerReady(),this.playOnReady&&this.play()},onPlayerPlaybackQualityChange:function(){},onPlayerStateChange:function(t){var e=t.data;if(e!==this.lastState&&!this.errorNumber){switch(e){case-1:this.trigger("loadedmetadata"),this.trigger("durationchange");break;case YT.PlayerState.ENDED:this.trigger("ended");break;case YT.PlayerState.PLAYING:this.trigger("timeupdate"),this.trigger("durationchange"),this.trigger("playing"),this.trigger("play"),this.isSeeking&&this.onSeeked();break;case YT.PlayerState.PAUSED:this.trigger("canplay"),this.isSeeking?this.onSeeked():this.trigger("pause");break;case YT.PlayerState.BUFFERING:this.player_.trigger("timeupdate"),this.player_.trigger("waiting")}this.lastState=e}},onPlayerError:function(t){this.errorNumber=t.data,this.trigger("error"),this.ytPlayer.stopVideo(),this.ytPlayer.destroy(),this.ytPlayer=null},error:function(){switch(this.errorNumber){case 5:return{code:"Error while trying to play the video"};case 2:case 100:case 150:return{code:"Unable to find the video"};case 101:return{code:"Playback on other Websites has been disabled by the video owner."}}return{code:"YouTube unknown error ("+this.errorNumber+")"}},src:function(t){return t&&(this.setSrc({src:t}),this.options_.autoplay&&!r&&this.play()),this.source},poster:function(){return this.poster_},setPoster:function(t){this.poster_=t},setSrc:function(t){t&&t.src&&(delete this.errorNumber,this.source=t,this.url=i.parseUrl(t.src),this.options_.poster||this.url.videoId&&(this.poster_="https://img.youtube.com/vi/"+this.url.videoId+"/0.jpg",this.checkHighResPoster()),this.options_.autoplay&&!r&&(this.isReady_?this.play():this.playOnReady=!0))},play:function(){this.url&&this.url.videoId&&(this.wasPausedBeforeSeek=!1,this.isReady_?(this.url.listId&&(this.activeList===this.url.listId?this.ytPlayer.playVideo():(this.ytPlayer.loadPlaylist(this.url.listId),this.activeList=this.url.listId)),this.activeVideoId===this.url.videoId?this.ytPlayer.playVideo():(this.ytPlayer.loadVideoById(this.url.videoId),this.activeVideoId=this.url.videoId)):(this.trigger("waiting"),this.playOnReady=!0))},pause:function(){this.ytPlayer&&this.ytPlayer.pauseVideo()},paused:function(){return!this.ytPlayer||this.lastState!==YT.PlayerState.PLAYING&&this.lastState!==YT.PlayerState.BUFFERING},currentTime:function(){return this.ytPlayer?this.ytPlayer.getCurrentTime():0},setCurrentTime:function(t){this.lastState===YT.PlayerState.PAUSED&&(this.timeBeforeSeek=this.currentTime()),this.isSeeking||(this.wasPausedBeforeSeek=this.paused()),this.ytPlayer.seekTo(t,!0),this.trigger("timeupdate"),this.trigger("seeking"),this.isSeeking=!0,this.lastState===YT.PlayerState.PAUSED&&this.timeBeforeSeek!==t&&(clearInterval(this.checkSeekedInPauseInterval),this.checkSeekedInPauseInterval=setInterval(function(){this.lastState===YT.PlayerState.PAUSED&&this.isSeeking?this.currentTime()!==this.timeBeforeSeek&&(this.trigger("timeupdate"),this.onSeeked()):clearInterval(this.checkSeekedInPauseInterval)}.bind(this),250))},onSeeked:function(){clearInterval(this.checkSeekedInPauseInterval),this.isSeeking=!1,this.wasPausedBeforeSeek&&this.pause(),this.trigger("seeked")},playbackRate:function(){return this.ytPlayer?this.ytPlayer.getPlaybackRate():1},setPlaybackRate:function(t){this.ytPlayer&&(this.ytPlayer.setPlaybackRate(t),this.trigger("ratechange"))},duration:function(){return this.ytPlayer?this.ytPlayer.getDuration():0},currentSrc:function(){return this.source},ended:function(){return!!this.ytPlayer&&this.lastState===YT.PlayerState.ENDED},volume:function(){return this.ytPlayer?this.ytPlayer.getVolume()/100:1},setVolume:function(t){this.ytPlayer&&(this.ytPlayer.setVolume(100*t),this.setTimeout(function(){this.trigger("volumechange")},50))},muted:function(){return!!this.ytPlayer&&this.ytPlayer.isMuted()},setMuted:function(t){this.ytPlayer&&(this.muted(!0),t?this.ytPlayer.mute():this.ytPlayer.unMute(),this.setTimeout(function(){this.trigger("volumechange")},50))},buffered:function(){if(!this.ytPlayer||!this.ytPlayer.getVideoLoadedFraction)return{length:0,start:function(){throw new Error("This TimeRanges object is empty")},end:function(){throw new Error("This TimeRanges object is empty")}};var t=this.ytPlayer.getVideoLoadedFraction()*this.ytPlayer.getDuration();return{length:this.ytPlayer.getDuration(),start:function(){return 0},end:function(){return t}}},load:function(){},reset:function(){},supportsFullScreen:function(){return!0},checkHighResPoster:function(){var t="https://img.youtube.com/vi/"+this.url.videoId+"/maxresdefault.jpg";try{var e=new Image;e.onload=function(){if("naturalHeight"in e){if(e.naturalHeight<=90||e.naturalWidth<=120)return}else if(e.height<=90||e.width<=120)return;this.poster_=t,this.trigger("posterchange")}.bind(this),e.onerror=function(){},e.src=t}catch(o){}}});i.isSupported=function(){return!0},i.canPlaySource=function(t){return"video/youtube"===t.type};var r=/(iPad|iPhone|iPod|Android)/g.test(navigator.userAgent);i.parseUrl=function(t){var e={videoId:null},o=/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/,n=t.match(o);n&&11===n[2].length&&(e.videoId=n[2]);var i=/[?&]list=([^#\&\?]+)/;return n=t.match(i),n&&n[1]&&(e.listId=n[1]),e},i.apiReadyQueue=[],window.onYouTubeIframeAPIReady=function(){i.isApiReady=!0;for(var t=0;t=0;o--)e[o].src==t&&("hd"!==e[o]["data-quality"]?this.currentRes="sd":this.currentRes="hd")}},{key:"setResolutionsNeededFromPlayer",value:function(){if(this.resolutionsNeeded=!1,"object"==typeof this.typeAndTech){var t=this.typeAndTech.type;if(void 0!==this.sourcesByType[t]&&this.sourcesByType[t].length>1)for(var e=this.sourcesByType[t].length-1;e>=0;e--)if(void 0!==this.sourcesByType[t][e]["data-quality"]||this.sourcesByType[t][e]["data-quality"]!=this.currentRes)return void(this.resolutionsNeeded=!0)}}},{key:"removeSources",value:function(){var t=this.player_.el_.getElementsByTagName("video")[0];if("Html5"===this.player_.techName_&&t)for(var e=t.getElementsByTagName("source"),o=0;o=0;i--){var r=t[i].src;if(void 0!==r&&""!==r){if(r.search(/^\/\//)!=-1)r=o+r;else{if(r.search(/:\/\//)!=-1)continue;r=r.search(/^\//)!=-1?n+r:e+r}t[i].src=r}}return t}},{key:"getSourceForResolutionChange",value:function(){for(var t=this.typeAndTech.type,e=this.sourcesByType[t],o=e.length-1;o>=0;o--)if("hd"==this.currentRes){if(void 0==e[o]["data-quality"]||"hd"!==e[o]["data-quality"])return e[o]}else if("hd"==e[o]["data-quality"])return e[o];return e[0]}},{key:"switchResolution",value:function(){var t=this.getSourceForResolutionChange();this.switchSource(t)}},{key:"stopStream",value:function(){switch(this.player_.techName_){case"Flash":this.player_.tech_.el_.vjs_stop()}}},{key:"selectSource",value:function(t){this.removeSources();var e=this.sourcesByType,o=this.selectTypeAndTech(t);return!!o&&(this.options_.sourceResolutions=e[o.type],this.selectResolution(this.options_.sourceResolutions))}},{key:"selectTypeAndTech",value:function(t){for(var e,o,n=0,i=this.player_.options_.techOrder;nr?r:n;return t[s]}},{key:"switchSource",value:function(t){if(this.player_.cache_.src===t.src)return this.player_.trigger("resolutionchange"),this.player_;var e=this.player_.currentTime(),o=this.player_.paused();this.player_.pause(),this.stopStream(),"Html5"===this.player_.techName_?this.player_.src(t.src):this.player_.loadTech(this.player_.techName_,{src:t.src});var n=this;this.player_.ready(function(){this.player_.one("loadeddata",videojs.bind(this.player_,function(){this.player_.currentTime(e)})),this.player_.trigger("resolutionchange"),o||(this.player_.load(),this.player_.play()),localStorage.setItem("videojs_preferred_res",parseInt(t.index,10)),n.setCurrentResFromPlayer(),n.updateButton()})}},{key:"updateButton",value:function(){var t=this.prepareButtonElement(this.el_);this.resolutionsNeeded?t.removeClass("vjs-hidden"):t.addClass("vjs-hidden"),"hd"==this.currentRes?t.addClass("vjs-ag-res-hd"):t.removeClass("vjs-ag-res-hd"),this.el_.blur()}},{key:"prepareButtonElement",value:function(t){return"function"!=typeof t.addClass&&(t.addClass=function(t){if(this.classList)this.classList.add(t);else if(-1==this.className.indexOf(t)){var e=this.className.split(" ");e.push(t),this.className=e.join(" ")}return this}),"function"!=typeof t.removeClass&&(t.removeClass=function(t){if(this.classList)this.classList.remove(t);else{var e=this.className.split(" ");e.splice(e.indexOf(t),1),this.className=e.join(" ")}return this}),t}}]),e}(VjsButtonResBBase);videojs.reduce=function(t,e,o,n){if(t&&0!==t.length){for(var i=0,r=t.length;i=0;e--)if(this.players[e].id===t)return this.players[e].getPlayer();for(var e=this.lightboxtriggers.length-1;e>=0;e--)if(this.lightboxtriggers[e].playerid===t)return this.lightboxtriggers[e].getPlayer();return!1}},{key:"destroyPlayer",value:function(t){for(var e=this.players.length-1;e>=0;e--)if(this.players[e].id===t)return this.players[e].destroy(),this.players.splice(e,1),!0;for(var e=this.lightboxtriggers.length-1;e>=0;e--)if(this.lightboxtriggers[e].playerid===t)return this.closeLightbox(),!0;return!1}},{key:"closeLightbox",value:function(){for(var t=this.lightboxtriggers.length-1;t>=0;t--)this.lightboxtriggers[t].closeLightbox();this.consolidatePlayers()}},{key:"consolidatePlayers",value:function(){for(var t=this.players.length-1;t>=0;t--)void 0===this.players[t]||this.players[t].alive||(delete this.players[t],this.players=this.players.filter(function(){return!0}))}},{key:"configureVideoJS",value:function(){window.HELP_IMPROVE_VIDEOJS=!1}}]),t}();o["default"]=d,e.exports=o["default"]},{"./components/Lightbox":3,"./components/LightboxTrigger":4,"./components/Player":5,"./lib/DOMElement":6}],2:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(o,"__esModule",{value:!0});var r=function(){function t(t,e){for(var o=0;o=8&&t.ie().actualVersion<=11?this.options.youtube={ytControls:2,color:"white"}:this.options.youtube={iv_load_policy:3}}},{key:"getSkinClass",value:function(){var t="vjs-afterglow-skin";"afterglow"!==this.skin&&(t+=" afterglow-skin-"+this.skin);var e=new a["default"];return 9==e.ie().actualVersion&&(t+=" ie9-is-bad"),t}}]),t}();o["default"]=l,e.exports=o["default"]},{"../lib/Util":7}],3:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(o,"__esModule",{value:!0});var s=function(){function t(t,e){for(var o=0;ot?("undefined"!=typeof e&&e<.9*o.width?o.playerwidth=e:o.playerwidth=.9*o.width,o.playerheight=o.playerwidth*t):("undefined"!=typeof e&&e<.92*o.height/t?o.playerheight=e*t:o.playerheight=.92*o.height,o.playerwidth=o.playerheight/t),o.playeroffsettop=(o.height-o.playerheight)/2,o.playeroffsetleft=(o.width-o.playerwidth)/2,o}},{key:"close",value:function(){this.player.destroy(!0),this.node.parentNode.removeChild(this.node),this.emit("close"); -}},{key:"getPlayer",value:function(){if(void 0!==this.player)return this.player.getPlayer()}}]),e}(d["default"]);o["default"]=g,e.exports=o["default"]},{"../../../../vendor/Emitter/Emitter":9,"../lib/DOMElement":6,"../lib/Util":7,"./Player":5}],4:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(o,"__esModule",{value:!0});var s=function(){function t(t,e){for(var o=0;o=8&&o<=11&&this.videoelement.addClass("vjs-IE")}},{key:"applyParameters",value:function(){if("false"==this.videoelement.getAttribute("data-overscale")&&this.videoelement.setAttribute("data-maxwidth",this.videoelement.getAttribute("width")),"fit"===this.videoelement.getAttribute("data-autoresize")||this.videoelement.hasClass("responsive")){this.videoelement.addClass("vjs-responsive");var t=this.calculateRatio();this.videoelement.node.style.paddingTop=100*t+"%",this.videoelement.removeAttribute("height"),this.videoelement.removeAttribute("width"),this.videoelement.setAttribute("data-ratio",t)}}},{key:"applyYoutubeClasses",value:function(){this.videoelement.addClass("vjs-youtube"),document.querySelector("video").controls&&this.videoelement.addClass("vjs-using-native-controls"),/iPad|iPhone|iPod|iOS/.test(navigator.platform)&&this.videoelement.addClass("vjs-iOS");var t=this.util.ie().actualVersion;t>=8&&t<=11&&this.videoelement.addClass("vjs-using-native-controls")}},{key:"calculateRatio",value:function(){if(this.videoelement.getAttribute("data-ratio"))var t=this.videoelement.getAttribute("data-ratio");else{if(!this.videoelement.getAttribute("height")||!this.videoelement.getAttribute("width"))return console.error("Please provide witdh and height for your video element."),0;var t=this.videoelement.getAttribute("height")/this.videoelement.getAttribute("width")}return parseFloat(t)}},{key:"getSkinName",value:function(){return this.videoelement.getAttribute("data-skin")?this.videoelement.getAttribute("data-skin"):"afterglow"}},{key:"destroy",value:function(){this.videojs.paused()||this.videojs.pause(),this.videojs.isFullscreen()&&this.videojs.exitFullscreen(),this.videojs.dispose(),this.alive=!1}},{key:"getPlayer",value:function(){return this.videojs}}]),t}();o["default"]=c,e.exports=o["default"]},{"../lib/Util":7,"./Config":2}],6:[function(t,e,o){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(o,"__esModule",{value:!0});var i=function(){function t(t,e){for(var o=0;o0&&!/x64|x32/gi.test(window.navigator.userAgent)&&(t={isTheBrowser:!0,actualVersion:"11"}),t}},{key:"isMobile",value:function(){var t=function(){return navigator.userAgent.match(/Android/i)},e=function(){return navigator.userAgent.match(/BlackBerry/i)},o=function(){return navigator.userAgent.match(/iPhone|iPad|iPod/i)},n=function(){return navigator.userAgent.match(/Opera Mini/i)},i=function(){return navigator.userAgent.match(/IEMobile/i)};return!!(t()||e()||o()||n()||i())}},{key:"merge_objects",value:function(t,e){var o={};for(var n in t)o[n]=t[n];for(var n in e)o[n]=e[n];return o}},{key:"addEventListener",value:function(t,e,o){null!=t&&"undefined"!=typeof t&&(t.addEventListener?t.addEventListener(e,o,!1):t.attachEvent?t.attachEvent("on"+e,o):t["on"+e]=o)}}]),t}();o["default"]=r,e.exports=o["default"]},{}],8:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}var i=t("./afterglow/Afterglow"),r=n(i);document.addEventListener("DOMContentLoaded",function(){window.afterglow=new r["default"],window.afterglow.init()})},{"./afterglow/Afterglow":1}],9:[function(t,e,o){"use strict";function n(t){if(t)return i(t)}function i(t){for(var e in n.prototype)t[e]=n.prototype[e];return t}e.exports=n,n.prototype.on=n.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+t]=this._callbacks["$"+t]||[]).push(e),this},n.prototype.once=function(t,e){function o(){this.off(t,o),e.apply(this,arguments)}return o.fn=e,this.on(t,o),this},n.prototype.off=n.prototype.removeListener=n.prototype.removeAllListeners=n.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var o=this._callbacks["$"+t];if(!o)return this;if(1==arguments.length)return delete this._callbacks["$"+t],this;for(var n,i=0;idiv{margin-bottom:5px;min-height:20px}.vjs-caption-settings .vjs-tracksetting>div:last-child{margin-bottom:0;padding-bottom:0;min-height:0}.vjs-caption-settings label>input{margin-right:10px}.vjs-caption-settings fieldset{margin-top:1em;margin-left:.5em}.vjs-caption-settings fieldset .vjs-label{position:absolute;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.vjs-caption-settings input[type=button]{width:40px;height:40px}.video-js .vjs-modal-dialog{background:rgba(0,0,0,.8);background:-webkit-linear-gradient(-90deg,rgba(0,0,0,.8),rgba(255,255,255,0));background:linear-gradient(180deg,rgba(0,0,0,.8),rgba(255,255,255,0))}.vjs-modal-dialog .vjs-modal-dialog-content{font-size:1.2em;line-height:1.5;padding:20px 24px;z-index:1}@media print{.video-js>:not(.vjs-tech):not(.vjs-poster){visibility:hidden}}@media \\0screen{.vjs-user-inactive.vjs-playing .vjs-control-bar :before{content:""}.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:hidden}}'), +function(t,e){var o=t.createElement("style");if(t.getElementsByTagName("head")[0].appendChild(o),o.styleSheet)o.styleSheet.disabled||(o.styleSheet.cssText=e);else try{o.innerHTML=e}catch(n){o.innerText=e}}(document,".vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar{background-color:#000;background-color:rgba(0,0,0,.7);bottom:0;height:51px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-progress-control{top:-5px;background-color:#000;background-color:rgba(0,0,0,.7)}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-progress-control:hover{top:-7px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-progress-control .vjs-progress-holder{margin:0}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-progress-control .vjs-progress-holder .vjs-load-progress,.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-progress-control .vjs-progress-holder .vjs-play-progress{border-radius:0;-moz-border-radius:0;-webkit-border-radius:0}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-current-time,.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-duration{margin-top:12px}@media (max-width:768px){.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar{height:42px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-progress-control{background-color:#000}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-current-time,.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-duration{margin-top:11px}}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-current-time{margin-left:20px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-duration{margin-right:20px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-volume-menu-button .vjs-menu,.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu{padding-top:22px}@media (max-width:512px){.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar{height:34px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-play-control:before{font-size:11px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-current-time,.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-duration{margin-top:9px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-current-time{margin-left:14px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-duration{margin-right:10px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-volume-menu-button .vjs-menu,.vjs-afterglow-skin.afterglow-skin-dark .vjs-control-bar .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu{padding-top:14pxpx}}.vjs-afterglow-skin.afterglow-skin-dark .vjs-control:before{margin-top:5px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar{right:20px;top:16px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar .vjs-button{background-color:#000;background-color:rgba(0,0,0,.7);width:32px;height:32px;border-radius:50px;-moz-border-radius:50px;-webkit-border-radius:50px;margin-left:7px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar .vjs-button:before{margin-top:-1px;font-size:15px;line-height:16px}@media (max-width:768px){.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar{top:14px;right:16px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar .vjs-button{width:28px;height:28px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar .vjs-button:before{font-size:14px;line-height:15px;margin-top:-2px}}@media (max-width:512px){.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar .vjs-button{width:24px;height:24px}.vjs-afterglow-skin.afterglow-skin-dark .vjs-top-control-bar .vjs-button:before{font-size:12px;line-height:13px;margin-top:0}}.vjs-afterglow-skin.afterglow-skin-dark.vjs-youtube.vjs-has-started.vjs-paused .vjs-control-bar{right:0;background-color:#000}"),function(t,e){var o=t.createElement("style");if(t.getElementsByTagName("head")[0].appendChild(o),o.styleSheet)o.styleSheet.disabled||(o.styleSheet.cssText=e);else try{o.innerHTML=e}catch(n){o.innerText=e}}(document,'@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,300);.vjs-afterglow-skin.vjs-has-started .vjs-control-bar,.vjs-afterglow-skin.vjs-has-started .vjs-top-control-bar{-webkit-transition:visibility .1s,opacity .1s;-moz-transition:visibility .1s,opacity .1s;-o-transition:visibility .1s,opacity .1s}@font-face{font-family:afterglow-icon;src:url(data:font/truetype;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SA4cAAAC8AAAAYGNtYXAAeLLHAAABHAAAAGRnYXNwAAAAEAAAAYAAAAAIZ2x5ZjvMn/0AAAGIAAAKMGhlYWQKacTfAAALuAAAADZoaGVhCtQG7wAAC/AAAAAkaG10eESZANEAAAwUAAAASGxvY2EUPhEmAAAMXAAAACZtYXhwABgAggAADIQAAAAgbmFtZc07FAkAAAykAAABknBvc3QAAwAAAAAOOAAAACAAAwROAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADmDwPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQASAAAAA4ACAACAAYAAQAg5gvmDeYP//3//wAAAAAAIOYA5g3mD//9//8AAf/jGgQaAxoCAAMAAQAAAAAAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAwAA/8AF4gPAABAAQABzAAATERQWMyEyNjURNCYjISIGFQUOARUUFjMyNjcVFAYHMAYjIiYnLgE1NDY3PgE3PgEzMhYxHgEPAS4BJy4BIyIGByEOARUUFjMyNjEVFAYHMAYjIiYnLgE1NDY3PgE3PgEzMhYxHgEHMAY3BzAmJy4BIyIGBwBHMgTwM0ZHMvsQM0YBihcYWlklWzUiGFM2TnYpKSoVFBQ6JiVZMzRjGBQJGxQoFBQoEytCFwJmFxdZWSWQIhhTNk52KSkpFBQUOiYmWDM0YxgVBwMDHjwUFCgTKkIYA0j88DJGRzEDEDJGRzHiH1k5dnYTEkEZLAYVLi8vhlc3YSkqPxYWFh8HLBdCCREHBwcgIB9ZOXZ2JUEZLAYVLi8vhlc3YSkqPxYWFh8HKhEHB0oaBwcHICAAAAACABr/2gPmA6YAEAAhAAATNzYyFwEWFA8BBiInASY0NyUXFhQHAQYiLwEmNDcBNjIXGisRLxEDUBAQLBAvEfywEREDoCwQEPywES8RKxERA1ARLxADeiwQEPywES8QLBAQA1ARLxAsLBAvEfywEBAsEC8RA1AQEAABAA3/7gJ6A5IADAAAFwYmNRE0NhcBFhQHAXctPT0tAgMtLf39EiAfNgM6Nh8g/n0gXiD+fQAAAAIAAP/zA48DlwAcAD0AABM0NjMwIjMyPgIxNhYVERQGJzAuAisBIiY9AQUHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQfAQA3KliWS3pYMAsODgs5XXg/OSo8ArhHEBAPKQ9ISA8pDxAQR0cQEA8pD0hIDykPEBBHAhwqPVZoVhMFE/xmEwUTV2dXPCquXEgPKQ8QEEdHEBAPKQ9ISA8pDxAQR0cQEA8pD0gAAQAA/8AEAAPAADAAABM0PgIzMh4CFRQOAiMqAScmNjcyFjMyPgI1NC4CIyIOAhUcARcOAScmNDUAUIu7amq7i1BQi7tqBw4HJQEpBgsGWp52RUV2nlpannZFAQFGBgEBwGq7i1BQi7tqaruLUAEGRgEBRXaeWlqedkVFdp5aBQkFJQklBw4HAAUAAP/zA6kDlwASACcAPQBTAHAAAAE0JjEmNDc2FhcwFhcUFhUuASMzMCIjFAYxBhQXFjY3MD4CJyoBMTM0JjEmND8BNjIXMB4CFxQWFSoBIzMwIiMUBjEGFB8BFjI3MD4CJyoBMSU0NjMwIjMyPgIxNhYVERQGJzAuAisBIiY9AQKpKQwMDBwLNwwFHyATFBEIKQwMCxsIFhoUAQwjny4ICAoIGgcSFxYEBRsfExUSCC4ICAoIGQgYHBYCECP8jzcqWJZLelgwCw4OCzldeD85KjwBwEVKFDATFAYTfEEMEgsEAUVPFDAUEwQPMEdSI1hrEzYTDxMTL0lZKgscDFhrEzYTFBMTP11rLFwqPVZoVhMFE/xmEwUTV2dXPCquAAEAAP/zAgUDlwAcAAATNDYzMCIzMj4CMTYWFREUBicwLgIrASImPQEANypYlkt6WDALDg4LOV14PzkqPAIcKj1WaFYTBRP8ZhMFE1dnVzwqrgAAAAMAAP/zAvsDlwASACcARAAAATQmMSY0NzYWFzAWFxQWFS4BIzMwIiMUBjEGFBcWNjcwPgInKgExJTQ2MzAiMzI+AjE2FhURFAYnMC4CKwEiJj0BAqkpDAwMHAs3DAUfIBMUEQgpDAwLGwgWGhQBDCP9QzcqWJZLelgwCw4OCzldeD85KjwBwEVKFDATFAYTfEEMEgsEAUVPFDAUEwQPMEdSI1wqPVZoVhMFE/xmEwUTV2dXPCquAAAEAC3/wQQTA6cACgAXACIALwAAARcWMj8BJwcGFBclDgEvASY2PwE2Fg8BARYUDwEnNz4BHwEFPgEfARYGDwEGJj8BAlAwDikOrHWsDg4BpAYwHdUdECjaJzEGH/38Dg6sdawOKQ4w/lwGMB3VHRAo2igwBh8CFDAODqx1rA4pDmcoDxzVHTAGHwYxJ9r+2Q4pDqx1rA4BDzBnKA8c1R0wBh8GMSfaAAAEAC//6APZA5IACgAXACIALwAANxcWMj8BJwcGFBclDgEvASY2PwE2Fg8BARYUDwEnNzYyHwEFPgEfARYGDwEGJj8BLywNJQ3Ka8oNDQGsBSwawxoPJMckLAUdAf4NDcpqyQ0lDSz+VAUtGsIaDiTHJCwFHBQsDQ3Ka8oNJQ2LJA8awxosBR0FLCTHAscNJA7JasoNDSyKJA4awhotBRwFLCTHAAIAEv/AAxoDwAAQACEAABMzMhYVERQGKwEiJjURNDYzITMyFhURFAYrASImNRE0NjNYah0qKh1qHSkpHQISah0pKR1qHSoqHQPAKR78jh4pKR4Dch4pKR78jh4pKR4Dch4pAAADAB7/3AcSA6QAMABOAF0AACUUBisBIiY1ETQmIyEiBhURFAYrASImNRE0NjsBMhYVERQWMyEyNjURNDY7ATIWFRElDgMrASImNRE0NjsBMh4CFx4DFRQOAgcDNC4CKwERMzI+AjUxAzchGFsXIiEX/vIYISEYWxciIRhbGCEhGAEOFyEhGFsXIgNTIlNicUDZGCEiF/c7aVxPICExIRARIjMiTSJFZ0VtWEpvSiUVFyIiGAEvFyIiF/7RGCIiFwNWFyIiF/72FyEhFwEKFyIiF/yqRh8wIBAiFwNWFyIQHy8fIEtXZDg7altOIAFpTnVOJ/2KKE93UAAAAAADAAD/wAXiA8AAEAAfAC4AABMRFBYzITI2NRE0JiMhIgYVATQ2MyEyFhUUBiMhIiY1JzQ2MyEyFhUUBiMhIiY1AEcyBPAzRkcy+xAzRgEtJBkDDhkkJBn88hkkeCMZBAAZIyMZ/AAZIwNI/PAyRkcxAxAyRkcx/WkZIyMZGSMjGbUZIyMZGSQkGQAAAAMAHv/cBmgDpAAdACsAfwAAJQ4DKwEiJjURNDY7ATIeAhceAxUUDgIHAzQuAisBETMyPgI1AQ4BIyImJzU0NhcwFhceATMyNjc+ATU0JicuAScuAScuAScuAScuATU0Njc+ATMyFhceATEHLgEnLgEjIgYHDgEVFBYXHgEXHgEXHgEXHgEVFAYHBeAiU2JyQNkYISIX9ztpXE8hIDIgEREiMyJNI0VnRW1YSnBKJfycL4RVTn88HxZFIiI/HCI0EhITCAgIGA8QPzAsQxcWJA0NDiwsLHlNJkkiI25DJ0EZGjIYHi0PEBAHBgYUDg5CM0VdGhkZLzBbHzAgECIXA1YXIhAfLx8gS1dkODtqW04gAWlOdU4n/YooT3dQ/mEkJRYdgBgVCBkJCAkMDQwmGQ0ZCwsUCgogFhQnExMrGRg6Ij5iJCQjCAkJKJsPFgYGBg0NDSMVDRcKChMJCSEYH0AfIE4uP2UlAAEAAAABAAAwsT5nXw889QALBAAAAAAA0hxAMQAAAADSHEAxAAD/wAcSA8AAAAAIAAIAAAAAAAAAAQAAA8D/wAAABxwAAAAABxIAAQAAAAAAAAAAAAAAAAAAABIEAAAAAAAAAAAAAAACAAAABeIAAAQAABoCtgANA80AAAQAAAADzQAAA80AAAPNAAAEMQAtBAAALwMsABIHHAAeBeIAAAZyAB4AAAAAAAoAFAAeAL4A+gEWAW4BsgJCAmwCyAMcA24DoAQeBGQFGAAAAAEAAAASAIAABQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAIAAAAAQAAAAAAAgAHAGkAAQAAAAAAAwAIADkAAQAAAAAABAAIAH4AAQAAAAAABQALABgAAQAAAAAABgAIAFEAAQAAAAAACgAaAJYAAwABBAkAAQAQAAgAAwABBAkAAgAOAHAAAwABBAkAAwAQAEEAAwABBAkABAAQAIYAAwABBAkABQAWACMAAwABBAkABgAQAFkAAwABBAkACgA0ALBjYy1pY29ucwBjAGMALQBpAGMAbwBuAHNWZXJzaW9uIDEuMABWAGUAcgBzAGkAbwBuACAAMQAuADBjYy1pY29ucwBjAGMALQBpAGMAbwBuAHNjYy1pY29ucwBjAGMALQBpAGMAbwBuAHNSZWd1bGFyAFIAZQBnAHUAbABhAHJjYy1pY29ucwBjAGMALQBpAGMAbwBuAHNGb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format(\'truetype\');font-weight:400;font-style:normal}.vjs-afterglow-skin{overflow:hidden;color:#fff}.vjs-afterglow-skin :focus,.vjs-afterglow-skin:focus{outline:0}.vjs-afterglow-skin video{background-color:#000}.vjs-afterglow-skin .vjs-slider{outline:0;position:relative;cursor:pointer;padding:0;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;margin:0 30px;background-color:#fff;background-color:rgba(255,255,255,.1)}@media (max-width:768px){.vjs-afterglow-skin .vjs-slider{margin:0 20px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-slider{margin:0 12px}}.vjs-afterglow-skin .vjs-slider:hover{margin:0 30px}@media (max-width:768px){.vjs-afterglow-skin .vjs-slider:hover{margin:0 20px}}.vjs-afterglow-skin .vjs-slider:focus{-webkit-box-shadow:0 0 2em #fff;-moz-box-shadow:0 0 2em #fff;box-shadow:0 0 2em #fff}.vjs-afterglow-skin .vjs-slider-handle{position:absolute;left:0;top:0;display:none}.vjs-afterglow-skin .vjs-play-progress:before{display:none!important;height:0;width:0;font-size:.9em}.vjs-afterglow-skin .vjs-progress-control .vjs-mouse-display,.vjs-afterglow-skin .vjs-progress-control:hover .vjs-mouse-display,.vjs-afterglow-skin .vjs-progress-control:hover .vjs-play-progress:after{display:none}.vjs-afterglow-skin .vjs-control-bar{display:none;position:absolute;bottom:16px;left:0;right:0;height:33px;font-family:\'Open Sans\';color:rgba(255,255,255,.9);background-color:#000;background-color:rgba(0,0,0,0)}@media (max-width:768px){.vjs-afterglow-skin .vjs-control-bar{bottom:7px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-slider:hover{margin:0 12px}.vjs-afterglow-skin .vjs-control-bar{bottom:0}}.vjs-afterglow-skin .vjs-control-bar .div{opacity:.9}.vjs-afterglow-skin .vjs-control-bar .div:hover{opacity:1}.vjs-afterglow-skin.vjs-has-started .vjs-control-bar{display:block;visibility:visible;opacity:1;transition:visibility .1s,opacity .1s}.vjs-afterglow-skin.vjs-has-started.vjs-ended .vjs-control-bar,.vjs-afterglow-skin.vjs-has-started.vjs-ended .vjs-top-control-bar{display:block;visibility:hidden;opacity:0}.vjs-afterglow-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{display:block;visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.vjs-afterglow-skin.vjs-controls-disabled .vjs-control-bar,.vjs-afterglow-skin.vjs-error .vjs-control-bar,.vjs-afterglow-skin.vjs-error .vjs-top-control-bar,.vjs-afterglow-skin.vjs-using-native-controls .vjs-control-bar{display:none}.vjs-afterglow-skin.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible}@media \\0screen{.vjs-afterglow-skin.vjs-user-inactive.vjs-playing .vjs-control-bar :before{content:""}}.vjs-afterglow-skin .vjs-control{outline:0;position:relative;float:left;text-align:center;margin:0;padding:0;height:40px;width:auto}.vjs-afterglow-skin .vjs-control.vjs-captions-button.vjs-control,.vjs-afterglow-skin .vjs-control.vjs-subtitles-button.vjs-control{width:40px}@media (max-width:768px){.vjs-afterglow-skin .vjs-control{height:30px}.vjs-afterglow-skin .vjs-control.vjs-captions-button.vjs-control,.vjs-afterglow-skin .vjs-control.vjs-subtitles-button.vjs-control{width:30px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-control.vjs-captions-button.vjs-control,.vjs-afterglow-skin .vjs-control.vjs-subtitles-button.vjs-control{width:20px}}.vjs-afterglow-skin .vjs-control:before{font-family:afterglow-icon;font-size:17px;line-height:18px;padding-top:10px;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;opacity:.9;text-shadow:0 0 0 rgba(255,255,255,0)}@media (max-width:768px){.vjs-afterglow-skin .vjs-control:before{font-size:13px;line-height:13px;padding-top:9px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-control:before{font-size:11px;line-height:11px;padding-top:6px}}.vjs-afterglow-skin .vjs-control:focus:before,.vjs-afterglow-skin .vjs-control:hover:before{text-shadow:0 0 5px rgba(255,255,255,.6);opacity:1}.vjs-afterglow-skin .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-afterglow-skin .vjs-play-control{width:50px;cursor:pointer;position:absolute;left:50%;margin-left:-25px}@media (max-width:512px){.vjs-afterglow-skin .vjs-play-control{position:relative;left:auto;margin-left:0;width:25px}}.vjs-afterglow-skin .vjs-play-control:before{content:"\\e602";margin-left:1px;font-size:22px}@media (max-width:768px){.vjs-afterglow-skin .vjs-play-control:before{font-size:20px;line-height:22px;top:-5px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-play-control:before{font-size:10px;line-height:10px;top:0}}.vjs-afterglow-skin.vjs-playing .vjs-play-control:before{content:"\\e60a"}.vjs-afterglow-skin .vjs-playback-rate .vjs-playback-rate-value{font-size:1.5em;line-height:2;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.5)}.vjs-afterglow-skin .vjs-playback-rate .vjs-playback-rate-value.vjs-menu-button .vjs-menu .vjs-menu-content{width:30px;left:15px;list-style:none}.vjs-afterglow-skin .vjs-mute-control,.vjs-afterglow-skin .vjs-volume-menu-button{cursor:pointer;float:right;width:auto;padding-left:32px;margin-left:10px}.vjs-afterglow-skin .vjs-mute-control:before,.vjs-afterglow-skin .vjs-volume-menu-button:before{content:"\\e605";cursor:pointer}.vjs-afterglow-skin .vjs-mute-control.vjs-vol-0:before,.vjs-afterglow-skin .vjs-volume-menu-button.vjs-vol-0:before{content:"\\e603"}.vjs-afterglow-skin .vjs-mute-control.vjs-vol-1:before,.vjs-afterglow-skin .vjs-volume-menu-button.vjs-vol-1:before{content:"\\e606"}.vjs-afterglow-skin .vjs-mute-control.vjs-vol-2:before,.vjs-afterglow-skin .vjs-volume-menu-button.vjs-vol-2:before{content:"\\e607"}@media (max-width:512px){.vjs-afterglow-skin .vjs-mute-control,.vjs-afterglow-skin .vjs-volume-menu-button{height:26px;padding-left:27px}}.vjs-afterglow-skin .vjs-volume-control{float:right}.vjs-afterglow-skin .vjs-volume-level{position:absolute;top:0;left:0;height:4px;width:100%;background-color:#fff;border-radius:4px}.vjs-afterglow-skin .vjs-volume-menu-button .vjs-menu,.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu{display:block;width:0;height:10px;border-top-color:transparent;position:relative;padding-left:0;top:0;padding-top:17px;padding-bottom:17px;left:0;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-afterglow-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content,.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu .vjs-menu-content{height:10px;width:0;float:right;left:0;box-shadow:none;background:0 0;position:relative;bottom:auto;overflow:hidden;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu{width:74px}@media (max-width:768px){.vjs-afterglow-skin .vjs-mute-control,.vjs-afterglow-skin .vjs-volume-menu-button{margin-left:0}.vjs-afterglow-skin .vjs-volume-menu-button .vjs-menu,.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu{left:0;padding-top:13px;padding-bottom:12px}.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu{padding-left:5px;padding-right:5px;width:50px}}@media (max-width:500px){.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu{display:none}.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu.vjs-lock-showing,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu.vjs-lock-showing{display:none!important}.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu .vjs-menu-content,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-menu-content{display:none}}.vjs-afterglow-skin .vjs-volume-bar .vjs-volume-handle:before,.vjs-afterglow-skin .vjs-volume-bar .vjs-volume-level:before,.vjs-afterglow-skin .vjs-volume-bar.vjs-slider-horizontal .vjs-volume-handle:before,.vjs-afterglow-skin .vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level:before{display:none}.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu .vjs-menu-content,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-menu-content{height:10px;width:61px;bottom:0;left:0;float:none;box-shadow:none;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}@media (max-width:768px){.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu .vjs-menu-content,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-menu-content{width:41px;left:-5px}.vjs-afterglow-skin .vjs-volume-bar,.vjs-afterglow-skin .vjs-volume-bar.vjs-slider-horizontal{width:0}}.vjs-afterglow-skin .vjs-volume-bar,.vjs-afterglow-skin .vjs-volume-bar.vjs-slider-horizontal{width:0;left:1px;height:5px;margin:0;background-color:rgba(255,255,255,.3);border-radius:5px;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-afterglow-skin .vjs-volume-bar .vjs-volume-handle,.vjs-afterglow-skin .vjs-volume-bar.vjs-slider-horizontal .vjs-volume-handle{width:0;height:0;left:100%}.vjs-afterglow-skin .vjs-volume-bar .vjs-volume-level,.vjs-afterglow-skin .vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level{height:4px;border-radius:4px}.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu .vjs-volume-bar.vjs-slider-horizontal,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-volume-bar.vjs-slider-horizontal{width:60px}@media (max-width:768px){.vjs-afterglow-skin .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu .vjs-volume-bar.vjs-slider-horizontal,.vjs-afterglow-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-volume-bar.vjs-slider-horizontal{width:40px}}.vjs-afterglow-skin .vjs-menu-button-popup .vjs-menu{position:relative;float:right}.vjs-afterglow-skin .vjs-progress-control{position:absolute;left:0;right:0;width:auto;height:5px;top:-9px;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;transition:all .3s}.vjs-afterglow-skin .vjs-progress-control:hover{top:-11px;height:9px;-webkit-transition:all 0s;-moz-transition:all 0s;-o-transition:all 0s;transition:all 0s}@media (max-width:768px){.vjs-afterglow-skin .vjs-progress-control:hover{top:-9px;height:7px}}.vjs-afterglow-skin:hover .vjs-progress-control{-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-afterglow-skin .vjs-progress-holder{height:100%}.vjs-afterglow-skin .vjs-progress-holder .vjs-load-progress,.vjs-afterglow-skin .vjs-progress-holder .vjs-play-progress{position:absolute;display:block;height:100%;margin:0;padding:0;width:0;left:0;top:0;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px}.vjs-afterglow-skin .vjs-progress-holder .vjs-load-progress div,.vjs-afterglow-skin.vjs-live .vjs-progress-control,.vjs-afterglow-skin.vjs-live .vjs-time-controls,.vjs-afterglow-skin.vjs-live .vjs-time-divider{display:none}.vjs-afterglow-skin .vjs-play-progress{background-color:#fff;box-shadow:0 0 5px rgba(255,255,255,.6);-moz-box-shadow:0 0 5px rgba(255,255,255,.6);-webkit-box-shadow:0 0 5px rgba(255,255,255,.6)}.vjs-afterglow-skin .vjs-load-progress{background:#646464;background:rgba(255,255,255,.2)}.vjs-afterglow-skin .vjs-load-progress div{background:#787878;background:rgba(255,255,255,.2)}.vjs-afterglow-skin .vjs-seek-handle{width:10px;height:100%}.vjs-afterglow-skin.vjs-live .vjs-live-display{display:block}.vjs-afterglow-skin .vjs-live-display{display:none;font-size:1em;line-height:3em}.vjs-afterglow-skin .vjs-time-controls{font-size:22px}.vjs-afterglow-skin .vjs-current-time,.vjs-afterglow-skin .vjs-duration{height:23px;position:relative;float:left;margin-top:7px;padding:0;font-weight:100;font-size:21px;line-height:22px;display:block;width:auto}@media (max-width:768px){.vjs-afterglow-skin .vjs-current-time,.vjs-afterglow-skin .vjs-duration{font-size:17px;line-height:17px}}.vjs-afterglow-skin.vjs-no-flex .vjs-current-time,.vjs-afterglow-skin.vjs-no-flex .vjs-duration{display:block}.vjs-afterglow-skin .vjs-current-time{margin-left:30px}@media (max-width:768px){.vjs-afterglow-skin .vjs-current-time{margin-left:20px}}.vjs-afterglow-skin .vjs-duration{float:right;text-align:right;margin-right:30px;padding-left:10px}@media (max-width:768px){.vjs-afterglow-skin .vjs-duration{margin-right:20px;padding-left:6px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-current-time,.vjs-afterglow-skin .vjs-duration{font-size:14px;line-height:14px;margin-top:5px}.vjs-afterglow-skin .vjs-current-time{margin-left:12px}.vjs-afterglow-skin .vjs-duration{margin-right:12px;padding-left:2px}}.vjs-afterglow-skin .vjs-remaining-time{display:none;float:right}.vjs-afterglow-skin .vjs-time-divider{float:left;line-height:3em}.vjs-afterglow-skin .vjs-top-control-bar{width:auto;height:auto;text-align:right;position:absolute;right:26px;top:13px;display:none;opacity:0}@media (max-width:768px){.vjs-afterglow-skin .vjs-top-control-bar{top:10px;right:18px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-top-control-bar{top:6px;right:10px}}.vjs-afterglow-skin .vjs-top-control-bar .vjs-control{width:20px;height:30px;text-align:right;line-height:13px;font-size:13px;cursor:pointer;opacity:.9;margin-left:20px}@media (max-width:768px){.vjs-afterglow-skin .vjs-top-control-bar .vjs-control{font-size:9px;line-height:9px;margin-left:5px}}.vjs-afterglow-skin .vjs-top-control-bar .vjs-control:hover{opacity:1}.vjs-afterglow-skin .vjs-top-control-bar .vjs-fullscreen-control:before{content:"\\e608"}.vjs-afterglow-skin .vjs-top-control-bar .vjs-lightbox-close-button:before{content:"\\e601"}.vjs-afterglow-skin.vjs-fullscreen .vjs-top-control-bar .vjs-fullscreen-control:before{content:"\\e609"}.vjs-afterglow-skin.vjs-has-started .vjs-top-control-bar{display:block;visibility:visible;opacity:1;transition:visibility .1s,opacity .1s}.vjs-afterglow-skin.vjs-has-started .vjs-top-control-bar .vjs-control{opacity:.9;-webkit-transition:visibility .1s,opacity .1s;-moz-transition:visibility .1s,opacity .1s;-o-transition:visibility .1s,opacity .1s;transition:visibility .1s,opacity .1s}.vjs-afterglow-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-top-control-bar{display:block;visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.vjs-afterglow-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-top-control-bar .vjs-control{opacity:.9}.vjs-afterglow-skin .vjs-big-play-button{display:block;z-index:2;position:absolute;width:80px;height:80px;text-align:center;vertical-align:middle;cursor:pointer;top:50%;left:50%;margin-left:-40px;margin-top:-40px;border:none;background:0 0;visibility:visible;opacity:1;-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-afterglow-skin.vjs-controls-disabled .vjs-big-play-button{display:none}.vjs-afterglow-skin.vjs-has-started .vjs-big-play-button{display:none;opacity:0}.vjs-afterglow-skin.vjs-has-started.vjs-ended .vjs-big-play-button{display:block;visibility:visible;opacity:1}.vjs-afterglow-skin.vjs-using-native-controls .vjs-big-play-button{display:block}.vjs-afterglow-skin .vjs-big-play-button:focus,.vjs-afterglow-skin:hover .vjs-big-play-button{outline:0;border:none;background:0 0;-webkit-transition:all 0s;-moz-transition:all 0s;-o-transition:all 0s;transition:all 0s}.vjs-afterglow-skin.vjs-seeking .vjs-big-play-button,.vjs-afterglow-skin.vjs-waiting .vjs-big-play-button{display:none;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}.vjs-afterglow-skin .vjs-big-play-button:before{content:"\\e602";font-family:afterglow-icon;line-height:80px;font-size:80px;text-shadow:0 0 5px #000;text-shadow:0 0 5px rgba(0,0,0,.6);text-align:center;position:absolute;left:0;width:100%;height:100%}@media (max-width:768px){.vjs-afterglow-skin .vjs-big-play-button:before{font-size:60px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-big-play-button:before{font-size:40px}}.vjs-afterglow-skin .vjs-error-display,.vjs-afterglow-skin.vjs-error .vjs-big-play-button{display:none}.vjs-afterglow-skin.vjs-error .vjs-error-display{display:block;position:absolute;left:0;top:0;width:100%;height:100%}.vjs-afterglow-skin .vjs-error .vjs-error-display:before{content:\'\'}.vjs-afterglow-skin .vjs-error-display div{position:absolute;bottom:40px;right:0;left:0;font-family:\'Open Sans\',Helvetica light,Helvetica,sans-serif;font-size:16px;text-align:center;padding:3px;background:#000;background:rgba(0,0,0,.5)}.vjs-afterglow-skin .vjs-error-display a,.vjs-afterglow-skin .vjs-error-display a:visited{color:#F4A460}.vjs-afterglow-skin .vjs-loading-spinner{position:absolute;top:50%;left:50%;width:32px;height:32px;margin-left:-16px;margin-top:-16px;clear:both;border:3px solid rgba(255,255,255,.1);border-top:3px rgba(255,255,255,.95) solid;border-radius:50%;-webkit-animation:spCircRot 1.6s infinite linear;animation:spCircRot 1.6s infinite linear}.vjs-afterglow-skin .vjs-loading-spinner:after,.vjs-afterglow-skin .vjs-loading-spinner:before{content:none;border:0}.vjs-afterglow-skin .vjs-seeking .vjs-loading-spinner,.vjs-afterglow-skin .vjs-waiting .vjs-loading-spinner{display:block;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}.vjs-afterglow-skin .vjs-error .vjs-loading-spinner{display:none;-webkit-animation:none;-moz-animation:none;-o-animation:none;animation:none}@-moz-keyframes spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.vjs-afterglow-skin .vjs-menu-button{float:right;cursor:pointer}.vjs-afterglow-skin .vjs-menu-button.vjs-menu-button-inline{width:auto}.vjs-afterglow-skin .vjs-menu-button.vjs-menu-button-inline:before{width:30px}.vjs-afterglow-skin .vjs-menu{display:none;position:relative;bottom:auto;left:-85px;width:0;height:0;margin-bottom:0}@media (max-width:768px){.vjs-afterglow-skin .vjs-menu{left:-75px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-menu{left:-70px}}.vjs-afterglow-skin .vjs-menu-button .vjs-menu .vjs-menu-content{display:block;padding:0 0 70px;margin:0;position:absolute;bottom:-50px;width:100px;max-height:none;overflow:auto;left:12px;font-family:\'Open Sans\',Helvetica Light,Helvetica,sans-serif;background:0 0}@media (max-width:768px){.vjs-afterglow-skin .vjs-menu-button .vjs-menu .vjs-menu-content{left:12px;bottom:-40px;padding-bottom:60px}}@media (max-width:512px){.vjs-afterglow-skin .vjs-menu-button .vjs-menu .vjs-menu-content{left:11px;bottom:-30px;padding-bottom:50px}}.vjs-afterglow-skin .vjs-control-content .vjs-menu.vjs-lock-showing,.vjs-afterglow-skin .vjs-menu-button:hover .vjs-control-content .vjs-menu{display:block}.vjs-afterglow-skin.vjs-scrubbing .vjs-menu-button:hover .vjs-control-content .vjs-menu{display:none}.vjs-afterglow-skin .vjs-menu-button ul li{list-style:none;margin:0;padding:0 5px;line-height:16px;font-size:14px;text-align:center;text-transform:lowercase;opacity:.7;text-shadow:0 0 0 rgba(255,255,255,0)}.vjs-afterglow-skin .vjs-menu-button ul li.vjs-selected,.vjs-afterglow-skin .vjs-menu-button ul li.vjs-selected:focus,.vjs-afterglow-skin .vjs-menu-button ul li.vjs-selected:hover,.vjs-afterglow-skin .vjs-menu-button ul li:focus,.vjs-afterglow-skin .vjs-menu-button ul li:hover{text-shadow:0 0 5px rgba(255,255,255,.6);opacity:1;background:0 0;color:#fff}.vjs-afterglow-skin .vjs-menu-button ul li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em;font-weight:700;cursor:afterglow}.vjs-afterglow-skin .vjs-subtitles-button:before{content:"\\e60d"}.vjs-afterglow-skin .vjs-captions-button:before{content:"\\e600"}.vjs-afterglow-skin video::-webkit-media-text-track-container{bottom:40px;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;transition:all .3s}@media (max-width:768px){.vjs-afterglow-skin video::-webkit-media-text-track-container{bottom:20px}}.vjs-afterglow-skin video::-webkit-media-text-track-background{background-color:rgba(0,0,0,.5);border-radius:3px;padding:10px 14px}.vjs-afterglow-skin video::-webkit-media-text-track-display{color:#fff;font-family:Open Sans,Georgia;font-size:16px;padding:5px 10px 8px}@media (max-width:768px){.vjs-afterglow-skin video::-webkit-media-text-track-display{font-size:14px}}@media (max-width:512px){.vjs-afterglow-skin video::-webkit-media-text-track-container{bottom:10px}.vjs-afterglow-skin video::-webkit-media-text-track-display{font-size:11px}}.vjs-afterglow-skin.vjs-user-active video::-webkit-media-text-track-container{bottom:70px}@media (max-width:768px){.vjs-afterglow-skin.vjs-user-active video::-webkit-media-text-track-container{bottom:40px}}.vjs-afterglow-skin .vjs-chapters-button.vjs-menu-button .vjs-menu .vjs-menu-content{width:24em;left:-12em}.vjs-afterglow-skin.vjs-responsive,.vjs-afterglow-skin.vjs-responsive video{width:100%;height:auto}.vjs-afterglow-skin .vjs-captions-button:focus .vjs-control-content:before,.vjs-afterglow-skin .vjs-captions-button:hover .vjs-control-content:before{-webkit-box-shadow:0 0 1em #fff;-moz-box-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.vjs-afterglow-skin .vjs-tech:focus{outline:0}.vjs-afterglow-skin.vjs-responsive.vjs-has-started .vjs-tech{padding-top:0!important}.vjs-afterglow-skin.vjs-responsive.vjs-fullscreen video{height:100%}.vjs-afterglow-skin .vjs-ag-res-button{float:right;cursor:pointer;width:50px;font-family:afterglow-icon}@media (max-width:768px){.vjs-afterglow-skin .vjs-ag-res-button{width:30px;margin-left:-4px}}@media (max-width:512px){.vjs-afterglow-skin.vjs-user-active video::-webkit-media-text-track-container{bottom:30px}.vjs-afterglow-skin .vjs-ag-res-button{width:20px;margin-right:5px;margin-left:0}}.vjs-afterglow-skin .vjs-ag-res-button:before{font-family:afterglow-icon;content:"\\e60f"}.vjs-afterglow-skin .vjs-ag-res-button.vjs-ag-res-hd:before{content:"\\e60b";margin-left:.5px}.vjs-afterglow-skin.vjs-IE .vjs-ag-res-button{font-size:17px;line-height:18px;padding-top:10px}@media (max-width:768px){.vjs-afterglow-skin.vjs-IE .vjs-ag-res-button{font-size:9px;line-height:9px;margin-left:5px}}.vjs-afterglow-skin .vjs-poster{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";-moz-opacity:.8;-khtml-opacity:.8;opacity:.8;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-afterglow-skin:hover .vjs-poster{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";-moz-opacity:1;-khtml-opacity:1;opacity:1}.vjs-afterglow-skin.vjs-youtube>div:first-child{position:absolute!important;margin:0;height:100%;top:0;width:100%}.video-js,.vjs-caption-settings{position:relative;background-color:#000}.vjs-afterglow-skin.vjs-youtube iframe{display:block;visibility:hidden}.vjs-afterglow-skin.vjs-youtube.vjs-IE iframe{display:block;visibility:visible}.vjs-afterglow-skin.vjs-youtube .vjs-control-bar{right:80px;width:auto;-webkit-transition:all .1s;-moz-transition:all .1s;-o-transition:all .1s;transition:all .1s;-webkit-transition-delay:.4s;-moz-transition-delay:.4s;-o-transition-delay:.4s;transition-delay:.4s}.vjs-afterglow-skin.vjs-youtube.vjs-has-started .vjs-control-bar{right:0;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;transition:all .3s;-webkit-transition-delay:.4s;-moz-transition-delay:.4s;-o-transition-delay:.4s;transition-delay:.4s}.vjs-afterglow-skin.vjs-youtube.vjs-has-started.vjs-ended .vjs-control-bar,.vjs-afterglow-skin.vjs-youtube.vjs-has-started.vjs-paused .vjs-control-bar{right:80px;width:auto;-webkit-transition:all .1s;-moz-transition:all .1s;-o-transition:all .1s;transition:all .1s}.video-js.vjs-has-started .vjs-poster,.vjs-poster{-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s}.vjs-afterglow-skin.vjs-youtube.vjs-iOS .vjs-big-play-button,.vjs-afterglow-skin.vjs-youtube.vjs-iOS .vjs-poster,.vjs-afterglow-skin.vjs-youtube.vjs-using-native-controls .vjs-big-play-button,.vjs-afterglow-skin.vjs-youtube.vjs-using-native-controls .vjs-poster{display:none}.vjs-afterglow-skin.vjs-youtube.vjs-iOS iframe,.vjs-afterglow-skin.vjs-youtube.vjs-using-native-controls iframe{display:block;visibility:visible}.vjs-afterglow-skin.vjs-vimeo .vjs-top-control-bar,.vjs-afterglow-skin.vjs-youtube.vjs-iOS .vjs-loading-spinner,.vjs-afterglow-skin.vjs-youtube.vjs-iOS .vjs-text-track-display,.vjs-afterglow-skin.vjs-youtube.vjs-using-native-controls .vjs-loading-spinner,.vjs-afterglow-skin.vjs-youtube.vjs-using-native-controls .vjs-text-track-display{display:none}.vjs-afterglow-skin.vjs-IE.vjs-youtube iframe,.vjs-afterglow-skin.vjs-has-started.vjs-youtube iframe{display:block;visibility:visible}.video-js{padding:0;font-size:22px;vertical-align:middle;font-weight:400;font-style:normal;font-family:Arial,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.video-js:-moz-full-screen{position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js .vjs-tech,.vjs-poster{top:0;width:100%;position:absolute;left:0}.video-js .vjs-tech{height:100%}body.vjs-full-window{padding:0;margin:0;height:100%;overflow-y:auto}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-poster{background-repeat:no-repeat;background-position:50% 50%;background-size:contain;cursor:pointer;margin:0;padding:0;right:0;bottom:0;transition:all .2s}.vjs-poster img{display:block;margin:0 auto;max-height:100%;padding:0}.video-js.vjs-has-started .vjs-poster{display:none;visibility:hidden;opacity:0;transition:all .2s}.video-js.vjs-has-started.vjs-ended .vjs-poster{display:block;visibility:visible;opacity:1;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.video-js.vjs-audio.vjs-has-started .vjs-poster{display:block}.video-js.vjs-controls-disabled .vjs-poster{display:none}.video-js.vjs-using-native-controls .vjs-poster{display:block}.video-js .vjs-text-track-display{position:absolute;bottom:50px;pointer-events:none}.vjs-caption-settings{top:1em;opacity:.75;color:#FFF;margin:0 auto;padding:.5em;height:15em;font-family:Arial,Helvetica,sans-serif;font-size:12px;width:40em}.vjs-caption-settings .vjs-tracksettings{top:0;bottom:2em;left:0;right:0;position:absolute;overflow:auto}.vjs-caption-settings .vjs-tracksettings-colors,.vjs-caption-settings .vjs-tracksettings-font{float:left}.vjs-caption-settings .vjs-tracksettings-colors:after,.vjs-caption-settings .vjs-tracksettings-controls:after,.vjs-caption-settings .vjs-tracksettings-font:after{clear:both}.vjs-caption-settings .vjs-tracksettings-controls{position:absolute;bottom:1em;right:1em}.vjs-caption-settings .vjs-tracksetting{margin:5px;padding:3px;min-height:40px}.vjs-caption-settings .vjs-tracksetting label{display:block;width:100px;margin-bottom:5px}.vjs-caption-settings .vjs-tracksetting span{display:inline;margin-left:5px}.vjs-caption-settings .vjs-tracksetting>div{margin-bottom:5px;min-height:20px}.vjs-caption-settings .vjs-tracksetting>div:last-child{margin-bottom:0;padding-bottom:0;min-height:0}.vjs-caption-settings label>input{margin-right:10px}.vjs-caption-settings input[type=button]{width:40px;height:40px}.vjs-hidden{display:none!important}.vjs-lock-showing{display:block!important;opacity:1;visibility:visible}.vjs-no-js{padding:2em;color:#ccc;background-color:#333;font-size:1.8em;font-family:Arial,sans-serif;text-align:center;width:30em;height:15em;margin:0 auto}.vjs-no-js a,.vjs-no-js a:visited{color:#F4A460}@-webkit-keyframes spCircRot{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(359deg)}}@keyframes spCircRot{from{transform:rotate(0)}to{transform:rotate(359deg)}}'), +function(t,e){var o=t.createElement("style");if(t.getElementsByTagName("head")[0].appendChild(o),o.styleSheet)o.styleSheet.disabled||(o.styleSheet.cssText=e);else try{o.innerHTML=e}catch(n){o.innerText=e}}(document,".vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar{background-color:#fff;background-color:rgba(255,255,255,.9);bottom:0;height:51px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar *{color:#000}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control{top:-5px;background-color:#fff;background-color:rgba(255,255,255,.9)}@media (max-width:768px){.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar{height:42px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control{background-color:#fff}}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control:hover{top:-7px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control .vjs-progress-holder{margin:0}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control .vjs-progress-holder .vjs-load-progress,.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control .vjs-progress-holder .vjs-play-progress{border-radius:0;-moz-border-radius:0;-webkit-border-radius:0}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control .vjs-progress-holder .vjs-load-progress{background-color:#777}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-progress-control .vjs-progress-holder .vjs-play-progress{background-color:#000;box-shadow:0 0 5px rgba(0,0,0,.6);-moz-box-shadow:0 0 5px rgba(0,0,0,.6);-webkit-box-shadow:0 0 5px rgba(0,0,0,.6)}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-current-time,.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-duration{margin-top:12px}@media (max-width:768px){.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-current-time,.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-duration{margin-top:11px}}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-current-time{margin-left:20px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-duration{margin-right:20px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-volume-menu-button .vjs-menu,.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu{padding-top:22px}@media (max-width:512px){.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar{height:34px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-play-control:before{font-size:11px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-current-time,.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-duration{margin-top:9px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-current-time{margin-left:14px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-duration{margin-right:10px}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-volume-menu-button .vjs-menu,.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-volume-menu-button.vjs-volume-menu-button-horizontal .vjs-menu{padding-top:14pxpx}}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-volume-bar{background-color:#555;background-color:rgba(0,0,0,.3)}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-volume-bar .vjs-volume-level{background-color:#000}.vjs-afterglow-skin.afterglow-skin-light .vjs-control-bar .vjs-menu ul.vjs-menu-content li{color:#fff;color:rgba(255,255,255,.8)}.vjs-afterglow-skin.afterglow-skin-light .vjs-control:before{margin-top:5px}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar{right:20px;top:16px}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar *{color:#000}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar .vjs-button{background-color:#fff;background-color:rgba(255,255,255,.9);width:32px;height:32px;border-radius:50px;-moz-border-radius:50px;-webkit-border-radius:50px;margin-left:7px}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar .vjs-button:before{margin-top:-1px;font-size:15px;line-height:16px}@media (max-width:768px){.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar{top:14px;right:16px}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar .vjs-button{width:28px;height:28px}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar .vjs-button:before{font-size:14px;line-height:15px;margin-top:-2px}}@media (max-width:512px){.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar .vjs-button{width:24px;height:24px}.vjs-afterglow-skin.afterglow-skin-light .vjs-top-control-bar .vjs-button:before{font-size:12px;line-height:13px;margin-top:0}}.vjs-afterglow-skin.afterglow-skin-light.vjs-youtube.vjs-has-started.vjs-paused .vjs-control-bar{right:0;background-color:#fff}"),function(t,e){var o=t.createElement("style");if(t.getElementsByTagName("head")[0].appendChild(o),o.styleSheet)o.styleSheet.disabled||(o.styleSheet.cssText=e);else try{o.innerHTML=e}catch(n){o.innerText=e}}(document,".afterglow-lightbox-wrapper{width:100%;height:100%;position:fixed;top:0;left:0;z-index:999999}.afterglow-lightbox-wrapper .cover{width:100%;height:100%;position:absolute;top:0;left:0;background-color:#000;background-color:rgba(0,0,0,.85)}.afterglow-lightbox-wrapper .afterglow-lightbox{display:block!important;position:absolute;top:0;left:0}.afterglow-lightbox-wrapper .afterglow-lightbox .afterglow-lightboxplayer,.afterglow-lightbox-wrapper .afterglow-lightbox .afterglow-lightboxplayer video{display:block!important}.afterglow-lightbox-wrapper .afterglow-lightbox div.vjs-fullscreen{top:0!important;left:0!important}.afterglow-lightbox-wrapper .afterglow-lightbox .vjs-paused.vjs-ended .vjs-big-play-button{display:block}#afterglow-lightbox-videoel,.afterglow-lightbox-wrapper.hidden,.afterglow-lightboxplayer{display:none}"),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.videojs=t()}}(function(){var t;return function e(t,o,n){function r(s,a){if(!o[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(i)return i(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var c=o[s]={exports:{}};t[s][0].call(c.exports,function(e){var o=t[s][1][e];return r(o?o:e)},c,c.exports,e,t,o,n)}return o[s].exports}for(var i="function"==typeof require&&require,s=0;s0&&void 0!==arguments[0]?arguments[0]:"button",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};e=(0,h["default"])({className:this.buildCSSClass()},e),"button"!==t&&(f["default"].warn("Creating a Button with an HTML element of "+t+" is deprecated; use ClickableComponent instead."),e=(0,h["default"])({tabIndex:0},e),o=(0,h["default"])({role:"button"},o)),o=(0,h["default"])({type:"button","aria-live":"polite"},o);var n=c["default"].prototype.createEl.call(this,t,e,o);return this.createControlTextEl(n),n},e.prototype.addChild=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=this.constructor.name;return f["default"].warn("Adding an actionable (user controllable) child to a Button ("+o+") is not supported; use a ClickableComponent instead."),c["default"].prototype.addChild.call(this,t,e)},e.prototype.enable=function(){t.prototype.enable.call(this),this.el_.removeAttribute("disabled")},e.prototype.disable=function(){t.prototype.disable.call(this),this.el_.setAttribute("disabled","disabled")},e.prototype.handleKeyPress=function(e){32!==e.which&&13!==e.which&&t.prototype.handleKeyPress.call(this,e)},e}(l["default"]);c["default"].registerComponent("Button",v),o["default"]=v},{139:139,3:3,5:5,87:87}],3:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(5),u=r(l),c=t(82),p=n(c),f=t(83),d=n(f),h=t(84),v=n(h),y=t(87),g=r(y),A=t(95),b=r(A),m=t(139),j=r(m),w=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return r.emitTapEvents(),r.enable(),r}return a(e,t),e.prototype.createEl=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"div",o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};o=(0,j["default"])({className:this.buildCSSClass(),tabIndex:0},o),"button"===e&&g["default"].error("Creating a ClickableComponent with an HTML element of "+e+" is not supported; use a Button instead."),n=(0,j["default"])({role:"button","aria-live":"polite"},n),this.tabIndex_=o.tabIndex;var r=t.prototype.createEl.call(this,e,o,n);return this.createControlTextEl(r),r},e.prototype.createControlTextEl=function(t){return this.controlTextEl_=p.createEl("span",{className:"vjs-control-text"}),t&&t.appendChild(this.controlTextEl_),this.controlText(this.controlText_,t),this.controlTextEl_},e.prototype.controlText=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.el();if(!t)return this.controlText_||"Need Text";var o=this.localize(t);return this.controlText_=t,this.controlTextEl_.innerHTML=o,e.setAttribute("title",o),this},e.prototype.buildCSSClass=function(){return"vjs-control vjs-button "+t.prototype.buildCSSClass.call(this)},e.prototype.enable=function(){return this.removeClass("vjs-disabled"),this.el_.setAttribute("aria-disabled","false"),"undefined"!=typeof this.tabIndex_&&this.el_.setAttribute("tabIndex",this.tabIndex_),this.on("tap",this.handleClick),this.on("click",this.handleClick),this.on("focus",this.handleFocus),this.on("blur",this.handleBlur),this},e.prototype.disable=function(){return this.addClass("vjs-disabled"),this.el_.setAttribute("aria-disabled","true"),"undefined"!=typeof this.tabIndex_&&this.el_.removeAttribute("tabIndex"),this.off("tap",this.handleClick),this.off("click",this.handleClick),this.off("focus",this.handleFocus),this.off("blur",this.handleBlur),this},e.prototype.handleClick=function(){},e.prototype.handleFocus=function(){d.on(b["default"],"keydown",v.bind(this,this.handleKeyPress))},e.prototype.handleKeyPress=function(e){32===e.which||13===e.which?(e.preventDefault(),this.handleClick(e)):t.prototype.handleKeyPress&&t.prototype.handleKeyPress.call(this,e)},e.prototype.handleBlur=function(){d.off(b["default"],"keydown",v.bind(this,this.handleKeyPress))},e}(u["default"]);u["default"].registerComponent("ClickableComponent",w),o["default"]=w},{139:139,5:5,82:82,83:83,84:84,87:87,95:95}],4:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t(2),l=n(a),u=t(5),c=n(u),p=function(t){function e(o,n){r(this,e);var s=i(this,t.call(this,o,n));return s.controlText(n&&n.controlText||s.localize("Close")),s}return s(e,t),e.prototype.buildCSSClass=function(){return"vjs-close-button "+t.prototype.buildCSSClass.call(this)},e.prototype.handleClick=function(){this.trigger({type:"close",bubbles:!1})},e}(l["default"]);c["default"].registerComponent("CloseButton",p),o["default"]=p},{2:2,5:5}],5:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}o.__esModule=!0;var s=t(96),a=r(s),l=t(82),u=n(l),c=t(84),p=n(c),f=t(86),d=n(f),h=t(83),v=n(h),y=t(87),g=r(y),A=t(92),b=r(A),m=t(88),j=r(m),w=function(){function t(e,o,n){if(i(this,t),!e&&this.play?this.player_=e=this:this.player_=e,this.options_=(0,j["default"])({},this.options_),o=this.options_=(0,j["default"])(this.options_,o),this.id_=o.id||o.el&&o.el.id,!this.id_){var r=e&&e.id&&e.id()||"no_player";this.id_=r+"_component_"+d.newGUID()}this.name_=o.name||null,o.el?this.el_=o.el:o.createEl!==!1&&(this.el_=this.createEl()),this.children_=[],this.childIndex_={},this.childNameIndex_={},o.initChildren!==!1&&this.initChildren(),this.ready(n),o.reportTouchActivity!==!1&&this.enableTouchActivity()}return t.prototype.dispose=function(){if(this.trigger({type:"dispose",bubbles:!1}),this.children_)for(var t=this.children_.length-1;t>=0;t--)this.children_[t].dispose&&this.children_[t].dispose();this.children_=null,this.childIndex_=null,this.childNameIndex_=null,this.off(),this.el_.parentNode&&this.el_.parentNode.removeChild(this.el_),u.removeElData(this.el_),this.el_=null},t.prototype.player=function(){return this.player_},t.prototype.options=function(t){return g["default"].warn("this.options() has been deprecated and will be moved to the constructor in 6.0"),t?(this.options_=(0,j["default"])(this.options_,t),this.options_):this.options_},t.prototype.el=function(){return this.el_},t.prototype.createEl=function(t,e,o){return u.createEl(t,e,o)},t.prototype.localize=function(t){var e=this.player_.language&&this.player_.language(),o=this.player_.languages&&this.player_.languages();if(!e||!o)return t;var n=o[e];if(n&&n[t])return n[t];var r=e.split("-")[0],i=o[r];return i&&i[t]?i[t]:t},t.prototype.contentEl=function(){return this.contentEl_||this.el_},t.prototype.id=function(){return this.id_},t.prototype.name=function(){return this.name_},t.prototype.children=function(){return this.children_},t.prototype.getChildById=function(t){return this.childIndex_[t]},t.prototype.getChild=function(t){if(t)return t=(0,b["default"])(t),this.childNameIndex_[t]},t.prototype.addChild=function(e){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.children_.length,r=void 0,i=void 0;if("string"==typeof e){i=(0,b["default"])(e),o||(o={}),o===!0&&(g["default"].warn("Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`."),o={});var s=o.componentClass||i;o.name=i;var a=t.getComponent(s);if(!a)throw new Error("Component "+s+" does not exist");if("function"!=typeof a)return null;r=new a(this.player_||this,o)}else r=e;if(this.children_.splice(n,0,r),"function"==typeof r.id&&(this.childIndex_[r.id()]=r),i=i||r.name&&r.name(),i&&(this.childNameIndex_[i]=r),"function"==typeof r.el&&r.el()){var l=this.contentEl().children,u=l[n]||null;this.contentEl().insertBefore(r.el(),u)}return r},t.prototype.removeChild=function(t){if("string"==typeof t&&(t=this.getChild(t)),t&&this.children_){for(var e=!1,o=this.children_.length-1;o>=0;o--)if(this.children_[o]===t){e=!0,this.children_.splice(o,1);break}if(e){this.childIndex_[t.id()]=null,this.childNameIndex_[t.name()]=null;var n=t.el();n&&n.parentNode===this.contentEl()&&this.contentEl().removeChild(t.el())}}},t.prototype.initChildren=function(){var e=this,o=this.options_.children;o&&!function(){var n=e.options_,r=function(t){var o=t.name,r=t.opts;if(void 0!==n[o]&&(r=n[o]),r!==!1){r===!0&&(r={}),r.playerOptions=e.options_.playerOptions;var i=e.addChild(o,r);i&&(e[o]=i)}},i=void 0,s=t.getComponent("Tech");i=Array.isArray(o)?o:Object.keys(o),i.concat(Object.keys(e.options_).filter(function(t){return!i.some(function(e){return"string"==typeof e?t===e:t===e.name})})).map(function(t){var n=void 0,r=void 0;return"string"==typeof t?(n=t,r=o[n]||e.options_[n]||{}):(n=t.name,r=t),{name:n,opts:r}}).filter(function(e){var o=t.getComponent(e.opts.componentClass||(0,b["default"])(e.name));return o&&!s.isTech(o)}).forEach(r)}()},t.prototype.buildCSSClass=function(){return""},t.prototype.on=function(t,e,o){var n=this;return"string"==typeof t||Array.isArray(t)?v.on(this.el_,t,p.bind(this,e)):!function(){var r=t,i=e,s=p.bind(n,o),a=function(){return n.off(r,i,s)};a.guid=s.guid,n.on("dispose",a);var l=function(){return n.off("dispose",a)};l.guid=s.guid,t.nodeName?(v.on(r,i,s),v.on(r,"dispose",l)):"function"==typeof t.on&&(r.on(i,s),r.on("dispose",l))}(),this},t.prototype.off=function(t,e,o){if(!t||"string"==typeof t||Array.isArray(t))v.off(this.el_,t,e);else{var n=t,r=e,i=p.bind(this,o);this.off("dispose",i),t.nodeName?(v.off(n,r,i),v.off(n,"dispose",i)):(n.off(r,i),n.off("dispose",i))}return this},t.prototype.one=function(t,e,o){var n=this,r=arguments;return"string"==typeof t||Array.isArray(t)?v.one(this.el_,t,p.bind(this,e)):!function(){var i=t,s=e,a=p.bind(n,o),l=function u(){n.off(i,s,u),a.apply(null,r)};l.guid=a.guid,n.on(i,s,l)}(),this},t.prototype.trigger=function(t,e){return v.trigger(this.el_,t,e),this},t.prototype.ready=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return t&&(this.isReady_?e?t.call(this):this.setTimeout(t,1):(this.readyQueue_=this.readyQueue_||[],this.readyQueue_.push(t))),this},t.prototype.triggerReady=function(){this.isReady_=!0,this.setTimeout(function(){var t=this.readyQueue_;this.readyQueue_=[],t&&t.length>0&&t.forEach(function(t){t.call(this)},this),this.trigger("ready")},1)},t.prototype.$=function(t,e){return u.$(t,e||this.contentEl())},t.prototype.$$=function(t,e){return u.$$(t,e||this.contentEl())},t.prototype.hasClass=function(t){return u.hasElClass(this.el_,t)},t.prototype.addClass=function(t){return u.addElClass(this.el_,t),this},t.prototype.removeClass=function(t){return u.removeElClass(this.el_,t),this},t.prototype.toggleClass=function(t,e){return u.toggleElClass(this.el_,t,e),this},t.prototype.show=function(){return this.removeClass("vjs-hidden"),this},t.prototype.hide=function(){return this.addClass("vjs-hidden"),this},t.prototype.lockShowing=function(){return this.addClass("vjs-lock-showing"),this},t.prototype.unlockShowing=function(){return this.removeClass("vjs-lock-showing"),this},t.prototype.getAttribute=function(t){return u.getAttribute(this.el_,t)},t.prototype.setAttribute=function(t,e){return u.setAttribute(this.el_,t,e),this},t.prototype.removeAttribute=function(t){return u.removeAttribute(this.el_,t),this},t.prototype.width=function(t,e){return this.dimension("width",t,e)},t.prototype.height=function(t,e){return this.dimension("height",t,e)},t.prototype.dimensions=function(t,e){return this.width(t,!0).height(e)},t.prototype.dimension=function(t,e,o){if(void 0!==e)return null!==e&&e===e||(e=0),(""+e).indexOf("%")!==-1||(""+e).indexOf("px")!==-1?this.el_.style[t]=e:"auto"===e?this.el_.style[t]="":this.el_.style[t]=e+"px",o||this.trigger("resize"),this;if(!this.el_)return 0;var n=this.el_.style[t],r=n.indexOf("px");return r!==-1?parseInt(n.slice(0,r),10):parseInt(this.el_["offset"+(0,b["default"])(t)],10)},t.prototype.currentDimension=function(t){var e=0;if("width"!==t&&"height"!==t)throw new Error("currentDimension only accepts width or height value");if("function"==typeof a["default"].getComputedStyle){var o=a["default"].getComputedStyle(this.el_);e=o.getPropertyValue(t)||o[t]}if(e=parseFloat(e),0===e){var n="offset"+(0,b["default"])(t);e=this.el_[n]}return e},t.prototype.currentDimensions=function(){return{width:this.currentDimension("width"),height:this.currentDimension("height")}},t.prototype.currentWidth=function(){return this.currentDimension("width")},t.prototype.currentHeight=function(){return this.currentDimension("height")},t.prototype.emitTapEvents=function(){var t=0,e=null,o=10,n=200,r=void 0;this.on("touchstart",function(o){1===o.touches.length&&(e={pageX:o.touches[0].pageX,pageY:o.touches[0].pageY},t=(new Date).getTime(),r=!0)}),this.on("touchmove",function(t){if(t.touches.length>1)r=!1;else if(e){var n=t.touches[0].pageX-e.pageX,i=t.touches[0].pageY-e.pageY,s=Math.sqrt(n*n+i*i);s>o&&(r=!1)}});var i=function(){r=!1};this.on("touchleave",i),this.on("touchcancel",i),this.on("touchend",function(o){if(e=null,r===!0){var i=(new Date).getTime()-t;i1&&void 0!==arguments[1]?arguments[1]:{};r(this,e),n.tracks=o.audioTracks&&o.audioTracks();var s=i(this,t.call(this,o,n));return s.el_.setAttribute("aria-label","Audio Menu"),s}return s(e,t),e.prototype.buildCSSClass=function(){return"vjs-audio-button "+t.prototype.buildCSSClass.call(this)},e.prototype.createItems=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=this.player_.audioTracks&&this.player_.audioTracks();if(!e)return t;for(var o=0;o'+this.localize("Stream Type")+""+this.localize("LIVE")},{"aria-live":"off"}),e.appendChild(this.contentEl_),e},e.prototype.updateShowing=function(){this.player().duration()===1/0?this.show():this.hide()},e}(u["default"]);u["default"].registerComponent("LiveDisplay",f),o["default"]=f},{5:5,82:82}],11:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(2),u=r(l),c=t(5),p=r(c),f=t(82),d=n(f),h=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return r.on(o,"volumechange",r.update),o.tech_&&o.tech_.featuresVolumeControl===!1&&r.addClass("vjs-hidden"),r.on(o,"loadstart",function(){this.update(),o.tech_.featuresVolumeControl===!1?this.addClass("vjs-hidden"):this.removeClass("vjs-hidden")}),r}return a(e,t),e.prototype.buildCSSClass=function(){return"vjs-mute-control "+t.prototype.buildCSSClass.call(this)},e.prototype.handleClick=function(){this.player_.muted(!this.player_.muted())},e.prototype.update=function(){var t=this.player_.volume(),e=3;0===t||this.player_.muted()?e=0:t<.33?e=1:t<.67&&(e=2);var o=this.player_.muted()?"Unmute":"Mute";this.controlText()!==o&&this.controlText(o);for(var n=0;n<4;n++)d.removeElClass(this.el_,"vjs-vol-"+n);d.addElClass(this.el_,"vjs-vol-"+e)},e}(u["default"]);h.prototype.controlText_="Mute",p["default"].registerComponent("MuteToggle",h),o["default"]=h},{2:2,5:5,82:82}],12:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t(2),l=n(a),u=t(5),c=n(u),p=function(t){function e(o,n){r(this,e);var s=i(this,t.call(this,o,n));return s.on(o,"play",s.handlePlay),s.on(o,"pause",s.handlePause),s}return s(e,t),e.prototype.buildCSSClass=function(){return"vjs-play-control "+t.prototype.buildCSSClass.call(this)},e.prototype.handleClick=function(){this.player_.paused()?this.player_.play():this.player_.pause()},e.prototype.handlePlay=function(){this.removeClass("vjs-paused"),this.addClass("vjs-playing"),this.controlText("Pause")},e.prototype.handlePause=function(){this.removeClass("vjs-playing"),this.addClass("vjs-paused"),this.controlText("Play")},e}(l["default"]);p.prototype.controlText_="Play",c["default"].registerComponent("PlayToggle",p),o["default"]=p},{2:2,5:5}],13:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(47),u=r(l),c=t(49),p=r(c),f=t(14),d=r(f),h=t(5),v=r(h),y=t(82),g=n(y),A=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return r.updateVisibility(),r.updateLabel(),r.on(o,"loadstart",r.updateVisibility),r.on(o,"ratechange",r.updateLabel),r}return a(e,t),e.prototype.createEl=function(){var e=t.prototype.createEl.call(this);return this.labelEl_=g.createEl("div",{className:"vjs-playback-rate-value",innerHTML:1}),e.appendChild(this.labelEl_),e},e.prototype.buildCSSClass=function(){return"vjs-playback-rate "+t.prototype.buildCSSClass.call(this)},e.prototype.createMenu=function(){var t=new p["default"](this.player()),e=this.playbackRates();if(e)for(var o=e.length-1;o>=0;o--)t.addChild(new d["default"](this.player(),{rate:e[o]+"x"}));return t},e.prototype.updateARIAAttributes=function(){this.el().setAttribute("aria-valuenow",this.player().playbackRate())},e.prototype.handleClick=function(){for(var t=this.player().playbackRate(),e=this.playbackRates(),o=e[0],n=0;nt){o=e[n];break}this.player().playbackRate(o)},e.prototype.playbackRates=function(){return this.options_.playbackRates||this.options_.playerOptions&&this.options_.playerOptions.playbackRates},e.prototype.playbackRateSupported=function(){return this.player().tech_&&this.player().tech_.featuresPlaybackRate&&this.playbackRates()&&this.playbackRates().length>0},e.prototype.updateVisibility=function(){this.playbackRateSupported()?this.removeClass("vjs-hidden"):this.addClass("vjs-hidden")},e.prototype.updateLabel=function(){this.playbackRateSupported()&&(this.labelEl_.innerHTML=this.player().playbackRate()+"x")},e}(u["default"]);A.prototype.controlText_="Playback Rate",v["default"].registerComponent("PlaybackRateMenuButton",A),o["default"]=A},{14:14,47:47,49:49,5:5,82:82}],14:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t(48),l=n(a),u=t(5),c=n(u),p=function(t){function e(o,n){r(this,e);var s=n.rate,a=parseFloat(s,10);n.label=s,n.selected=1===a;var l=i(this,t.call(this,o,n));return l.label=s,l.rate=a,l.on(o,"ratechange",l.update),l}return s(e,t),e.prototype.handleClick=function(){t.prototype.handleClick.call(this),this.player().playbackRate(this.rate)},e.prototype.update=function(){this.selected(this.player().playbackRate()===this.rate)},e}(l["default"]);p.prototype.contentElType="button",c["default"].registerComponent("PlaybackRateMenuItem",p),o["default"]=p},{48:48,5:5}],15:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(5),u=r(l),c=t(82),p=n(c),f=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return r.partEls_=[],r.on(o,"progress",r.update),r}return a(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-load-progress",innerHTML:''+this.localize("Loaded")+": 0%"})},e.prototype.update=function(){var t=this.player_.buffered(),e=this.player_.duration(),o=this.player_.bufferedEnd(),n=this.partEls_,r=function(t,e){var o=t/e||0;return 100*(o>=1?1:o)+"%"};this.el_.style.width=r(o,e);for(var i=0;it.length;u--)this.el_.removeChild(n[u-1]);n.length=t.length},e}(u["default"]);u["default"].registerComponent("LoadProgressBar",f),o["default"]=f},{5:5,82:82}],16:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(5),u=r(l),c=t(82),p=n(c),f=t(84),d=n(f),h=t(85),v=r(h),y=t(101),g=r(y),A=t(81),b=r(A),m=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return n.playerOptions&&n.playerOptions.controlBar&&n.playerOptions.controlBar.progressControl&&n.playerOptions.controlBar.progressControl.keepTooltipsInside&&(r.keepTooltipsInside=n.playerOptions.controlBar.progressControl.keepTooltipsInside),r.keepTooltipsInside&&(r.tooltip=p.createEl("div",{className:"vjs-time-tooltip"}),r.el().appendChild(r.tooltip),r.addClass("vjs-keep-tooltips-inside")),r.update(0,0),o.on("ready",function(){r.on(o.controlBar.progressControl.el(),"mousemove",(0,g["default"])(d.bind(r,r.handleMouseMove),25))}),r}return a(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-mouse-display"})},e.prototype.handleMouseMove=function(t){var e=this.player_.duration(),o=this.calculateDistance(t)*e,n=t.pageX-p.findElPosition(this.el().parentNode).left;this.update(o,n)},e.prototype.update=function(t,e){var o=(0,v["default"])(t,this.player_.duration());if(this.el().style.left=e+"px",this.el().setAttribute("data-current-time",o),this.keepTooltipsInside){var n=this.clampPosition_(e),r=e-n+1,i=parseFloat((0,b["default"])(this.tooltip,"width")),s=i/2;this.tooltip.innerHTML=o,this.tooltip.style.right="-"+(s-r)+"px"}},e.prototype.calculateDistance=function(t){return p.getPointerPosition(this.el().parentNode,t).x},e.prototype.clampPosition_=function(t){if(!this.keepTooltipsInside)return t;var e=parseFloat((0,b["default"])(this.player().el(),"width")),o=parseFloat((0,b["default"])(this.tooltip,"width")),n=o/2,r=t;return te-n&&(r=Math.floor(e-n)),r},e}(u["default"]);u["default"].registerComponent("MouseTimeDisplay",m),o["default"]=m},{101:101,5:5,81:81,82:82,84:84,85:85}],17:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(5),u=r(l),c=t(84),p=n(c),f=t(85),d=r(f),h=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return r.updateDataAttr(),r.on(o,"timeupdate",r.updateDataAttr),o.ready(p.bind(r,r.updateDataAttr)),n.playerOptions&&n.playerOptions.controlBar&&n.playerOptions.controlBar.progressControl&&n.playerOptions.controlBar.progressControl.keepTooltipsInside&&(r.keepTooltipsInside=n.playerOptions.controlBar.progressControl.keepTooltipsInside),r.keepTooltipsInside&&r.addClass("vjs-keep-tooltips-inside"),r}return a(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-play-progress vjs-slider-bar",innerHTML:''+this.localize("Progress")+": 0%"})},e.prototype.updateDataAttr=function(){var t=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime();this.el_.setAttribute("data-current-time",(0,d["default"])(t,this.player_.duration()))},e}(u["default"]);u["default"].registerComponent("PlayProgressBar",h),o["default"]=h},{5:5,84:84,85:85}],18:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t(5),l=n(a);t(19),t(16);var u=function(t){function e(){return r(this,e),i(this,t.apply(this,arguments))}return s(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-progress-control vjs-control"})},e}(l["default"]);u.prototype.options_={children:["seekBar"]},l["default"].registerComponent("ProgressControl",u),o["default"]=u},{16:16,19:19,5:5}],19:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(57),u=r(l),c=t(5),p=r(c),f=t(84),d=n(f),h=t(85),v=r(h),y=t(81),g=r(y);t(15),t(17),t(20);var A=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return r.on(o,"timeupdate",r.updateProgress),r.on(o,"ended",r.updateProgress),o.ready(d.bind(r,r.updateProgress)),n.playerOptions&&n.playerOptions.controlBar&&n.playerOptions.controlBar.progressControl&&n.playerOptions.controlBar.progressControl.keepTooltipsInside&&(r.keepTooltipsInside=n.playerOptions.controlBar.progressControl.keepTooltipsInside),r.keepTooltipsInside&&(r.tooltipProgressBar=r.addChild("TooltipProgressBar")),r}return a(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-progress-holder"},{"aria-label":"progress bar"})},e.prototype.updateProgress=function(){if(this.updateAriaAttributes(this.el_),this.keepTooltipsInside){this.updateAriaAttributes(this.tooltipProgressBar.el_),this.tooltipProgressBar.el_.style.width=this.bar.el_.style.width;var t=parseFloat((0,g["default"])(this.player().el(),"width")),e=parseFloat((0,g["default"])(this.tooltipProgressBar.tooltip,"width")),o=this.tooltipProgressBar.el().style;o.maxWidth=Math.floor(t-e/2)+"px",o.minWidth=Math.ceil(e/2)+"px",o.right="-"+e/2+"px"}},e.prototype.updateAriaAttributes=function(t){var e=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime();t.setAttribute("aria-valuenow",(100*this.getPercent()).toFixed(2)),t.setAttribute("aria-valuetext",(0,v["default"])(e,this.player_.duration()))},e.prototype.getPercent=function(){var t=this.player_.currentTime()/this.player_.duration();return t>=1?1:t},e.prototype.handleMouseDown=function(e){t.prototype.handleMouseDown.call(this,e),this.player_.scrubbing(!0),this.videoWasPlaying=!this.player_.paused(),this.player_.pause()},e.prototype.handleMouseMove=function(t){var e=this.calculateDistance(t)*this.player_.duration();e===this.player_.duration()&&(e-=.1),this.player_.currentTime(e)},e.prototype.handleMouseUp=function(e){t.prototype.handleMouseUp.call(this,e),this.player_.scrubbing(!1),this.videoWasPlaying&&this.player_.play()},e.prototype.stepForward=function(){this.player_.currentTime(this.player_.currentTime()+5)},e.prototype.stepBack=function(){this.player_.currentTime(this.player_.currentTime()-5)},e}(u["default"]);A.prototype.options_={children:["loadProgressBar","mouseTimeDisplay","playProgressBar"],barName:"playProgressBar"},A.prototype.playerEvent="timeupdate",p["default"].registerComponent("SeekBar",A),o["default"]=A},{15:15,17:17,20:20,5:5,57:57,81:81,84:84,85:85}],20:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(5),u=r(l),c=t(84),p=n(c),f=t(85),d=r(f),h=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return r.updateDataAttr(),r.on(o,"timeupdate",r.updateDataAttr),o.ready(p.bind(r,r.updateDataAttr)),r}return a(e,t),e.prototype.createEl=function(){var e=t.prototype.createEl.call(this,"div",{className:"vjs-tooltip-progress-bar vjs-slider-bar",innerHTML:'
\n '+this.localize("Progress")+": 0%"});return this.tooltip=e.querySelector(".vjs-time-tooltip"),e},e.prototype.updateDataAttr=function(){var t=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime(),e=(0,d["default"])(t,this.player_.duration());this.el_.setAttribute("data-current-time",e),this.tooltip.innerHTML=e},e}(u["default"]);u["default"].registerComponent("TooltipProgressBar",h),o["default"]=h},{5:5,84:84,85:85}],21:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t(22),l=n(a),u=t(5),c=n(u),p=function(t){function e(){return r(this,e),i(this,t.apply(this,arguments))}return s(e,t),e.prototype.buildCSSClass=function(){return"vjs-custom-control-spacer "+t.prototype.buildCSSClass.call(this)},e.prototype.createEl=function(){var e=t.prototype.createEl.call(this,{className:this.buildCSSClass()});return e.innerHTML=" ",e},e}(l["default"]);c["default"].registerComponent("CustomControlSpacer",p),o["default"]=p},{22:22,5:5}],22:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t(5),l=n(a),u=function(t){function e(){return r(this,e),i(this,t.apply(this,arguments))}return s(e,t),e.prototype.buildCSSClass=function(){return"vjs-spacer "+t.prototype.buildCSSClass.call(this)},e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:this.buildCSSClass()})},e}(l["default"]);l["default"].registerComponent("Spacer",u),o["default"]=u},{5:5}],23:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t(31),l=n(a),u=t(5),c=n(u),p=function(t){function e(o,n){r(this,e),n.track={player:o,kind:n.kind,label:n.kind+" settings",selectable:!1,"default":!1,mode:"disabled"},n.selectable=!1;var s=i(this,t.call(this,o,n));return s.addClass("vjs-texttrack-settings"),s.controlText(", opens "+n.kind+" settings dialog"),s}return s(e,t),e.prototype.handleClick=function(){this.player().getChild("textTrackSettings").show(),this.player().getChild("textTrackSettings").el_.focus()},e}(l["default"]);c["default"].registerComponent("CaptionSettingsMenuItem",p),o["default"]=p},{31:31,5:5}],24:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t(30),l=n(a),u=t(5),c=n(u),p=t(23),f=n(p),d=function(t){function e(o,n,s){r(this,e);var a=i(this,t.call(this,o,n,s));return a.el_.setAttribute("aria-label","Captions Menu"),a}return s(e,t),e.prototype.buildCSSClass=function(){return"vjs-captions-button "+t.prototype.buildCSSClass.call(this)},e.prototype.update=function(){var e=2;t.prototype.update.call(this),this.player().tech_&&this.player().tech_.featuresNativeTextTracks&&(e=1),this.items&&this.items.length>e?this.show():this.hide()},e.prototype.createItems=function(){var e=[];return this.player().tech_&&this.player().tech_.featuresNativeTextTracks||e.push(new f["default"](this.player_,{kind:this.kind_})),t.prototype.createItems.call(this,e)},e}(l["default"]);d.prototype.kind_="captions",d.prototype.controlText_="Captions",c["default"].registerComponent("CaptionsButton",d),o["default"]=d},{23:23,30:30,5:5}],25:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(30),u=r(l),c=t(5),p=r(c),f=t(31),d=r(f),h=t(26),v=r(h),y=t(49),g=r(y),A=t(82),b=n(A),m=t(92),j=r(m),w=function(t){function e(o,n,r){i(this,e);var a=s(this,t.call(this,o,n,r));return a.el_.setAttribute("aria-label","Chapters Menu"),a}return a(e,t),e.prototype.buildCSSClass=function(){return"vjs-chapters-button "+t.prototype.buildCSSClass.call(this)},e.prototype.createItems=function(){var t=[],e=this.player_.textTracks();if(!e)return t;for(var o=0;o=0;r--){var i=e[r];if(i.kind===this.kind_){o=i;break}}var s=this.menu;if(void 0===s){s=new g["default"](this.player_);var a=b.createEl("li",{className:"vjs-menu-title",innerHTML:(0,j["default"])(this.kind_),tabIndex:-1});s.children_.unshift(a),b.insertElFirst(a,s.contentEl())}else n.forEach(function(t){return s.removeChild(t)}),n=[];if(o&&(null===o.cues||void 0===o.cues)){o.mode="hidden";var l=this.player_.remoteTextTrackEls().getTrackElementByTrack_(o);l&&l.addEventListener("load",function(e){return t.update()})}if(o&&o.cues&&o.cues.length>0)for(var u=o.cues,c=0,p=u.length;c0&&this.show(),this.items=n,s},e}(u["default"]);w.prototype.kind_="chapters",w.prototype.controlText_="Chapters",p["default"].registerComponent("ChaptersButton",w),o["default"]=w},{26:26,30:30,31:31,49:49,5:5,82:82,92:92}],26:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(48),u=r(l),c=t(5),p=r(c),f=t(84),d=n(f),h=function(t){function e(o,n){i(this,e);var r=n.track,a=n.cue,l=o.currentTime();n.label=a.text,n.selected=a.startTime<=l&&l1&&void 0!==arguments[1]?arguments[1]:{};return r(this,e),n.tracks=o.textTracks(),i(this,t.call(this,o,n))}return s(e,t),e.prototype.createItems=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];t.push(new h["default"](this.player_,{kind:this.kind_}));var e=this.player_.textTracks();if(!e)return t;for(var o=0;oCurrent Time 0:00'},{"aria-live":"off"}),e.appendChild(this.contentEl_),e},e.prototype.updateContent=function(){var t=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime(),e=this.localize("Current Time"),o=(0,d["default"])(t,this.player_.duration());o!==this.formattedTime_&&(this.formattedTime_=o,this.contentEl_.innerHTML=''+e+" "+o)},e}(u["default"]);u["default"].registerComponent("CurrentTimeDisplay",h),o["default"]=h},{5:5,82:82,85:85}],33:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(5),u=r(l),c=t(82),p=n(c),f=t(85),d=r(f),h=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return r.on(o,"durationchange",r.updateContent),r.on(o,"timeupdate",r.updateContent),r.on(o,"loadedmetadata",r.updateContent),r}return a(e,t),e.prototype.createEl=function(){var e=t.prototype.createEl.call(this,"div",{className:"vjs-duration vjs-time-control vjs-control"});return this.contentEl_=p.createEl("div",{className:"vjs-duration-display",innerHTML:''+this.localize("Duration Time")+" 0:00"},{"aria-live":"off"}),e.appendChild(this.contentEl_),e},e.prototype.updateContent=function(){var t=this.player_.duration();if(t&&this.duration_!==t){this.duration_=t;var e=this.localize("Duration Time"),o=(0,d["default"])(t);this.contentEl_.innerHTML=''+e+" "+o}},e}(u["default"]);u["default"].registerComponent("DurationDisplay",h),o["default"]=h},{5:5,82:82,85:85}],34:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(5),u=r(l),c=t(82),p=n(c),f=t(85),d=r(f),h=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return r.on(o,"timeupdate",r.updateContent),r.on(o,"durationchange",r.updateContent),r}return a(e,t),e.prototype.createEl=function(){var e=t.prototype.createEl.call(this,"div",{className:"vjs-remaining-time vjs-time-control vjs-control"});return this.contentEl_=p.createEl("div",{className:"vjs-remaining-time-display",innerHTML:''+this.localize("Remaining Time")+" -0:00"},{"aria-live":"off"}),e.appendChild(this.contentEl_),e},e.prototype.updateContent=function(){if(this.player_.duration()){var t=this.localize("Remaining Time"),e=(0,d["default"])(this.player_.remainingTime());e!==this.formattedTime_&&(this.formattedTime_=e,this.contentEl_.innerHTML=''+t+" -"+e)}},e}(u["default"]);u["default"].registerComponent("RemainingTimeDisplay",h),o["default"]=h},{5:5,82:82,85:85}],35:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t(5),l=n(a),u=function(t){function e(){return r(this,e),i(this,t.apply(this,arguments))}return s(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-time-control vjs-time-divider",innerHTML:"
/
"})},e}(l["default"]);l["default"].registerComponent("TimeDivider",u),o["default"]=u},{5:5}],36:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(47),u=r(l),c=t(5),p=r(c),f=t(84),d=n(f),h=function(t){function e(o,n){i(this,e);var r=n.tracks,a=s(this,t.call(this,o,n));if(a.items.length<=1&&a.hide(),!r)return s(a);var l=d.bind(a,a.update);return r.addEventListener("removetrack",l),r.addEventListener("addtrack",l),a.player_.on("dispose",function(){r.removeEventListener("removetrack",l),r.removeEventListener("addtrack",l)}),a}return a(e,t),e}(u["default"]);p["default"].registerComponent("TrackButton",h),o["default"]=h},{47:47,5:5,84:84}],37:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(57),u=r(l),c=t(5),p=r(c),f=t(84),d=n(f);t(39);var h=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return r.on(o,"volumechange",r.updateARIAAttributes),o.ready(d.bind(r,r.updateARIAAttributes)),r}return a(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-volume-bar vjs-slider-bar"},{"aria-label":"volume level"})},e.prototype.handleMouseMove=function(t){this.checkMuted(),this.player_.volume(this.calculateDistance(t))},e.prototype.checkMuted=function(){this.player_.muted()&&this.player_.muted(!1)},e.prototype.getPercent=function(){return this.player_.muted()?0:this.player_.volume()},e.prototype.stepForward=function(){this.checkMuted(),this.player_.volume(this.player_.volume()+.1)},e.prototype.stepBack=function(){this.checkMuted(),this.player_.volume(this.player_.volume()-.1)},e.prototype.updateARIAAttributes=function(){var t=(100*this.player_.volume()).toFixed(2);this.el_.setAttribute("aria-valuenow",t),this.el_.setAttribute("aria-valuetext",t+"%")},e}(u["default"]);h.prototype.options_={children:["volumeLevel"],barName:"volumeLevel"},h.prototype.playerEvent="volumechange",p["default"].registerComponent("VolumeBar",h),o["default"]=h},{39:39,5:5,57:57,84:84}],38:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t(5),l=n(a);t(37);var u=function(t){function e(o,n){r(this,e);var s=i(this,t.call(this,o,n));return o.tech_&&o.tech_.featuresVolumeControl===!1&&s.addClass("vjs-hidden"),s.on(o,"loadstart",function(){o.tech_.featuresVolumeControl===!1?this.addClass("vjs-hidden"):this.removeClass("vjs-hidden")}),s}return s(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-volume-control vjs-control"})},e}(l["default"]);u.prototype.options_={children:["volumeBar"]},l["default"].registerComponent("VolumeControl",u),o["default"]=u},{37:37,5:5}],39:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t(5),l=n(a),u=function(t){function e(){return r(this,e),i(this,t.apply(this,arguments))}return s(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:"vjs-volume-level",innerHTML:''})},e}(l["default"]);l["default"].registerComponent("VolumeLevel",u),o["default"]=u},{5:5}],40:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(84),u=r(l),c=t(5),p=n(c),f=t(54),d=n(f),h=t(53),v=n(h),y=t(11),g=n(y),A=t(37),b=n(A),m=function(t){function e(o){function n(){o.tech_&&o.tech_.featuresVolumeControl===!1?this.addClass("vjs-hidden"):this.removeClass("vjs-hidden")}var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};i(this,e),void 0===r.inline&&(r.inline=!0),void 0===r.vertical&&(r.inline?r.vertical=!1:r.vertical=!0),r.volumeBar=r.volumeBar||{},r.volumeBar.vertical=!!r.vertical;var a=s(this,t.call(this,o,r));return a.on(o,"volumechange",a.volumeUpdate),a.on(o,"loadstart",a.volumeUpdate),n.call(a),a.on(o,"loadstart",n),a.on(a.volumeBar,["slideractive","focus"],function(){this.addClass("vjs-slider-active")}),a.on(a.volumeBar,["sliderinactive","blur"],function(){this.removeClass("vjs-slider-active")}),a.on(a.volumeBar,["focus"],function(){this.addClass("vjs-lock-showing")}),a.on(a.volumeBar,["blur"],function(){this.removeClass("vjs-lock-showing")}),a}return a(e,t),e.prototype.buildCSSClass=function(){var e="";return e=this.options_.vertical?"vjs-volume-menu-button-vertical":"vjs-volume-menu-button-horizontal","vjs-volume-menu-button "+t.prototype.buildCSSClass.call(this)+" "+e},e.prototype.createPopup=function(){var t=new d["default"](this.player_,{contentElType:"div"}),e=new b["default"](this.player_,this.options_.volumeBar);return t.addChild(e),this.menuContent=t,this.volumeBar=e,this.attachVolumeBarEvents(),t},e.prototype.handleClick=function(){g["default"].prototype.handleClick.call(this),t.prototype.handleClick.call(this)},e.prototype.attachVolumeBarEvents=function(){this.menuContent.on(["mousedown","touchdown"],u.bind(this,this.handleMouseDown))},e.prototype.handleMouseDown=function(t){this.on(["mousemove","touchmove"],u.bind(this.volumeBar,this.volumeBar.handleMouseMove)),this.on(this.el_.ownerDocument,["mouseup","touchend"],this.handleMouseUp)},e.prototype.handleMouseUp=function(t){this.off(["mousemove","touchmove"],u.bind(this.volumeBar,this.volumeBar.handleMouseMove))},e}(v["default"]);m.prototype.volumeUpdate=g["default"].prototype.update,m.prototype.controlText_="Mute",p["default"].registerComponent("VolumeMenuButton",m),o["default"]=m},{11:11,37:37,5:5,53:53,54:54,84:84}],41:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t(5),l=n(a),u=t(50),c=n(u),p=t(88),f=n(p),d=function(t){function e(o,n){r(this,e);var s=i(this,t.call(this,o,n));return s.on(o,"error",s.open),s}return s(e,t),e.prototype.buildCSSClass=function(){return"vjs-error-display "+t.prototype.buildCSSClass.call(this)},e.prototype.content=function(){var t=this.player().error();return t?this.localize(t.message):""},e}(c["default"]);d.prototype.options_=(0,f["default"])(c["default"].prototype.options_,{fillAlways:!0,temporary:!1,uncloseable:!0}),l["default"].registerComponent("ErrorDisplay",d),o["default"]=d},{5:5,50:50,88:88}],42:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}o.__esModule=!0;var r=t(83),i=n(r),s=function(){};s.prototype.allowedEvents_={},s.prototype.on=function(t,e){var o=this.addEventListener;this.addEventListener=function(){},i.on(this,t,e),this.addEventListener=o},s.prototype.addEventListener=s.prototype.on,s.prototype.off=function(t,e){i.off(this,t,e)},s.prototype.removeEventListener=s.prototype.off,s.prototype.one=function(t,e){var o=this.addEventListener;this.addEventListener=function(){},i.one(this,t,e),this.addEventListener=o},s.prototype.trigger=function(t){var e=t.type||t;"string"==typeof t&&(t={type:e}),t=i.fixEvent(t),this.allowedEvents_[e]&&this["on"+e]&&this["on"+e](t),i.trigger(this,t)},s.prototype.dispatchEvent=s.prototype.trigger,o["default"]=s},{83:83}],43:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=t(87),s=n(i),a=function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+("undefined"==typeof e?"undefined":r(e)));t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.super_=e)},l=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=function(){t.apply(this,arguments)},n={};"object"===("undefined"==typeof e?"undefined":r(e))?("function"==typeof e.init&&(s["default"].warn("Constructor logic via init() is deprecated; please use constructor() instead."),e.constructor=e.init),e.constructor!==Object.prototype.constructor&&(o=e.constructor),n=e):"function"==typeof e&&(o=e),a(o,t);for(var i in n)n.hasOwnProperty(i)&&(o.prototype[i]=n[i]);return o};o["default"]=l},{87:87}],44:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0;for(var r=t(95),i=n(r),s={},a=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],l=a[0],u=void 0,c=0;c1&&void 0!==arguments[1]?arguments[1]:{};i(this,e);var r=s(this,t.call(this,o,n));return r.update(),r.enabled_=!0,r.el_.setAttribute("aria-haspopup","true"),r.el_.setAttribute("role","menuitem"),r.on("keydown",r.handleSubmenuKeyPress),r}return a(e,t),e.prototype.update=function(){var t=this.createMenu();this.menu&&this.removeChild(this.menu),this.menu=t,this.addChild(t),this.buttonPressed_=!1,this.el_.setAttribute("aria-expanded","false"),this.items&&0===this.items.length?this.hide():this.items&&this.items.length>1&&this.show()},e.prototype.createMenu=function(){var t=new d["default"](this.player_);if(this.options_.title){var e=v.createEl("li",{className:"vjs-menu-title",innerHTML:(0,b["default"])(this.options_.title),tabIndex:-1});t.children_.unshift(e),v.insertElFirst(e,t.contentEl())}if(this.items=this.createItems(),this.items)for(var o=0;o0&&void 0!==arguments[0]?arguments[0]:0,e=this.children().slice(),o=e.length&&e[0].className&&/vjs-menu-title/.test(e[0].className);o&&e.shift(),e.length>0&&(t<0?t=0:t>=e.length&&(t=e.length-1),this.focusedChild_=t,e[t].el_.focus())},e}(u["default"]);u["default"].registerComponent("Menu",y),o["default"]=y},{5:5,82:82,83:83,84:84}],50:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(82),u=r(l),c=t(84),p=r(c),f=t(5),d=n(f),h="vjs-modal-dialog",v=27,y=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return r.opened_=r.hasBeenOpened_=r.hasBeenFilled_=!1,r.closeable(!r.options_.uncloseable),r.content(r.options_.content),r.contentEl_=u.createEl("div",{className:h+"-content"},{role:"document"}),r.descEl_=u.createEl("p",{className:h+"-description vjs-offscreen",id:r.el().getAttribute("aria-describedby")}),u.textContent(r.descEl_,r.description()),r.el_.appendChild(r.descEl_),r.el_.appendChild(r.contentEl_),r}return a(e,t),e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:this.buildCSSClass(),tabIndex:-1},{"aria-describedby":this.id()+"_description","aria-hidden":"true","aria-label":this.label(),role:"dialog"})},e.prototype.buildCSSClass=function(){return h+" vjs-hidden "+t.prototype.buildCSSClass.call(this)},e.prototype.handleKeyPress=function(t){t.which===v&&this.closeable()&&this.close()},e.prototype.label=function(){return this.options_.label||this.localize("Modal Window")},e.prototype.description=function(){var t=this.options_.description||this.localize("This is a modal window.");return this.closeable()&&(t+=" "+this.localize("This modal can be closed by pressing the Escape key or activating the close button.")),t},e.prototype.open=function(){if(!this.opened_){var t=this.player();this.trigger("beforemodalopen"),this.opened_=!0,(this.options_.fillAlways||!this.hasBeenOpened_&&!this.hasBeenFilled_)&&this.fill(),this.wasPlaying_=!t.paused(),this.wasPlaying_&&t.pause(),this.closeable()&&this.on(this.el_.ownerDocument,"keydown",p.bind(this,this.handleKeyPress)),t.controls(!1),this.show(),this.el().setAttribute("aria-hidden","false"),this.trigger("modalopen"),this.hasBeenOpened_=!0}return this},e.prototype.opened=function(t){return"boolean"==typeof t&&this[t?"open":"close"](),this.opened_},e.prototype.close=function(){if(this.opened_){var t=this.player();this.trigger("beforemodalclose"),this.opened_=!1,this.wasPlaying_&&t.play(),this.closeable()&&this.off(this.el_.ownerDocument,"keydown",p.bind(this,this.handleKeyPress)),t.controls(!0),this.hide(),this.el().setAttribute("aria-hidden","true"),this.trigger("modalclose"),this.options_.temporary&&this.dispose()}return this},e.prototype.closeable=function o(t){if("boolean"==typeof t){var o=this.closeable_=!!t,e=this.getChild("closeButton");if(o&&!e){var n=this.contentEl_;this.contentEl_=this.el_,e=this.addChild("closeButton",{controlText:"Close Modal Dialog"}),this.contentEl_=n,this.on(e,"close",this.close)}!o&&e&&(this.off(e,"close",this.close),this.removeChild(e),e.dispose())}return this.closeable_},e.prototype.fill=function(){return this.fillWith(this.content())},e.prototype.fillWith=function(t){var e=this.contentEl(),o=e.parentNode,n=e.nextSibling;return this.trigger("beforemodalfill"),this.hasBeenFilled_=!0,o.removeChild(e),this.empty(),u.insertContent(e,t),this.trigger("modalfill"),n?o.insertBefore(e,n):o.appendChild(e),this},e.prototype.empty=function(){return this.trigger("beforemodalempty"),u.emptyEl(this.contentEl()),this.trigger("modalempty"),this},e.prototype.content=function(t){return"undefined"!=typeof t&&(this.content_=t),this.content_},e}(d["default"]);y.prototype.options_={temporary:!0},d["default"].registerComponent("ModalDialog",y),o["default"]=y},{5:5,82:82,84:84}],51:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(5),u=r(l),c=t(95),p=r(c),f=t(96),d=r(f),h=t(83),v=n(h),y=t(82),g=n(y),A=t(84),b=n(A),m=t(86),j=n(m),w=t(79),_=n(w),k=t(87),x=r(k),T=t(92),E=r(T),C=t(91),S=t(80),O=t(90),B=n(O),P=t(44),M=r(P),I=t(46),R=r(I),D=t(148),N=r(D),F=t(139),L=r(F),z=t(88),Q=r(z),H=t(70),V=r(H),Y=t(50),U=r(Y),G=t(63),W=r(G),X=t(64),J=r(X),K=t(77),Z=r(K);t(62),t(60),t(55),t(69),t(45),t(1),t(4),t(8),t(41),t(72),t(61);var q=["progress","abort","suspend","emptied","stalled","loadedmetadata","loadeddata","timeupdate","ratechange","volumechange","texttrackchange"],$=function(t){function e(o,n,r){if(i(this,e),o.id=o.id||"vjs_video_"+j.newGUID(),n=(0,L["default"])(e.getTagSettings(o),n),n.initChildren=!1,n.createEl=!1,n.reportTouchActivity=!1,!n.language)if("function"==typeof o.closest){var a=o.closest("[lang]");a&&(n.language=a.getAttribute("lang"))}else for(var l=o;l&&1===l.nodeType;){if(g.getElAttributes(l).hasOwnProperty("lang")){n.language=l.getAttribute("lang");break}l=l.parentNode}var u=s(this,t.call(this,null,n,r));if(!u.options_||!u.options_.techOrder||!u.options_.techOrder.length)throw new Error("No techOrder specified. Did you overwrite videojs.options instead of just changing the properties you want to override?");u.tag=o,u.tagAttributes=o&&g.getElAttributes(o),u.language(u.options_.language),n.languages?!function(){var t={};Object.getOwnPropertyNames(n.languages).forEach(function(e){t[e.toLowerCase()]=n.languages[e]}),u.languages_=t}():u.languages_=e.prototype.options_.languages,u.cache_={},u.poster_=n.poster||"",u.controls_=!!n.controls,o.controls=!1,u.scrubbing_=!1,u.el_=u.createEl();var c=(0,Q["default"])(u.options_);return n.plugins&&!function(){var t=n.plugins;Object.getOwnPropertyNames(t).forEach(function(e){"function"==typeof this[e]?this[e](t[e]):x["default"].error("Unable to find plugin:",e)},u)}(),u.options_.playerOptions=c,u.initChildren(),u.isAudio("audio"===o.nodeName.toLowerCase()),u.controls()?u.addClass("vjs-controls-enabled"):u.addClass("vjs-controls-disabled"),u.el_.setAttribute("role","region"),u.isAudio()?u.el_.setAttribute("aria-label","audio player"):u.el_.setAttribute("aria-label","video player"),u.isAudio()&&u.addClass("vjs-audio"),u.flexNotSupported_()&&u.addClass("vjs-no-flex"),_.IS_IOS||u.addClass("vjs-workinghover"),e.players[u.id_]=u,u.userActive(!0),u.reportUserActivity(),u.listenForUserActivity_(),u.on("fullscreenchange",u.handleFullscreenChange_),u.on("stageclick",u.handleStageClick_),u}return a(e,t),e.prototype.dispose=function(){this.trigger("dispose"),this.off("dispose"),this.styleEl_&&this.styleEl_.parentNode&&this.styleEl_.parentNode.removeChild(this.styleEl_),e.players[this.id_]=null,this.tag&&this.tag.player&&(this.tag.player=null),this.el_&&this.el_.player&&(this.el_.player=null),this.tech_&&this.tech_.dispose(),t.prototype.dispose.call(this)},e.prototype.createEl=function(){var e=this.el_=t.prototype.createEl.call(this,"div"),o=this.tag;o.removeAttribute("width"),o.removeAttribute("height");var n=g.getElAttributes(o);if(Object.getOwnPropertyNames(n).forEach(function(t){"class"===t?e.className=n[t]:e.setAttribute(t,n[t])}),o.playerId=o.id,o.id+="_html5_api",o.className="vjs-tech",o.player=e.player=this,this.addClass("vjs-paused"),d["default"].VIDEOJS_NO_DYNAMIC_STYLE!==!0){this.styleEl_=B.createStyleElement("vjs-styles-dimensions");var r=g.$(".vjs-styles-defaults"),i=g.$("head");i.insertBefore(this.styleEl_,r?r.nextSibling:i.firstChild)}this.width(this.options_.width),this.height(this.options_.height),this.fluid(this.options_.fluid),this.aspectRatio(this.options_.aspectRatio);for(var s=o.getElementsByTagName("a"),a=0;a=0&&(o.width=t),e>=0&&(o.height=e)))}var n=void 0,r=void 0,i=void 0,s=void 0;i=void 0!==this.aspectRatio_&&"auto"!==this.aspectRatio_?this.aspectRatio_:this.videoWidth()>0?this.videoWidth()+":"+this.videoHeight():"16:9";var a=i.split(":"),l=a[1]/a[0];n=void 0!==this.width_?this.width_:void 0!==this.height_?this.height_/l:this.videoWidth()||300,r=void 0!==this.height_?this.height_:n*l,s=/^[^a-zA-Z]/.test(this.id())?"dimensions-"+this.id():this.id()+"-dimensions",this.addClass(s),B.setTextContent(this.styleEl_,"\n ."+s+" {\n width: "+n+"px;\n height: "+r+"px;\n }\n\n ."+s+".vjs-fluid {\n padding-top: "+100*l+"%;\n }\n ")},e.prototype.loadTech_=function(t,e){var o=this;this.tech_&&this.unloadTech_(),"Html5"!==t&&this.tag&&(W["default"].getTech("Html5").disposeMediaElement(this.tag),this.tag.player=null,this.tag=null),this.techName_=t,this.isReady_=!1;var n=(0,L["default"])({source:e,nativeControlsForTouch:this.options_.nativeControlsForTouch,playerId:this.id(),techId:this.id()+"_"+t+"_api",videoTracks:this.videoTracks_,textTracks:this.textTracks_,audioTracks:this.audioTracks_,autoplay:this.options_.autoplay,preload:this.options_.preload,loop:this.options_.loop,muted:this.options_.muted,poster:this.poster(),language:this.language(),"vtt.js":this.options_["vtt.js"]},this.options_[t.toLowerCase()]);this.tag&&(n.tag=this.tag),e&&(this.currentType_=e.type,e.src===this.cache_.src&&this.cache_.currentTime>0&&(n.startTime=this.cache_.currentTime),this.cache_.sources=null,this.cache_.source=e,this.cache_.src=e.src);var r=W["default"].getTech(t);r||(r=u["default"].getComponent(t)),this.tech_=new r(n),this.tech_.ready(b.bind(this,this.handleTechReady_),!0),V["default"].jsonToTextTracks(this.textTracksJson_||[],this.tech_),q.forEach(function(t){o.on(o.tech_,t,o["handleTech"+(0,E["default"])(t)+"_"])}),this.on(this.tech_,"loadstart",this.handleTechLoadStart_),this.on(this.tech_,"waiting",this.handleTechWaiting_),this.on(this.tech_,"canplay",this.handleTechCanPlay_),this.on(this.tech_,"canplaythrough",this.handleTechCanPlayThrough_),this.on(this.tech_,"playing",this.handleTechPlaying_),this.on(this.tech_,"ended",this.handleTechEnded_),this.on(this.tech_,"seeking",this.handleTechSeeking_),this.on(this.tech_,"seeked",this.handleTechSeeked_),this.on(this.tech_,"play",this.handleTechPlay_),this.on(this.tech_,"firstplay",this.handleTechFirstPlay_),this.on(this.tech_,"pause",this.handleTechPause_),this.on(this.tech_,"durationchange",this.handleTechDurationChange_),this.on(this.tech_,"fullscreenchange",this.handleTechFullscreenChange_),this.on(this.tech_,"error",this.handleTechError_),this.on(this.tech_,"loadedmetadata",this.updateStyleEl_),this.on(this.tech_,"posterchange",this.handleTechPosterChange_),this.on(this.tech_,"textdata",this.handleTechTextData_),this.usingNativeControls(this.techGet_("controls")),this.controls()&&!this.usingNativeControls()&&this.addTechControlsListeners_(),this.tech_.el().parentNode===this.el()||"Html5"===t&&this.tag||g.insertElFirst(this.tech_.el(),this.el()),this.tag&&(this.tag.player=null,this.tag=null)},e.prototype.unloadTech_=function(){this.videoTracks_=this.videoTracks(),this.textTracks_=this.textTracks(),this.audioTracks_=this.audioTracks(),this.textTracksJson_=V["default"].textTracksToJson(this.tech_),this.isReady_=!1,this.tech_.dispose(),this.tech_=!1},e.prototype.tech=function(t){if(t&&t.IWillNotUseThisInPlugins)return this.tech_;var e="\n Please make sure that you are not using this inside of a plugin.\n To disable this alert and error, please pass in an object with\n `IWillNotUseThisInPlugins` to the `tech` method. See\n https://github.com/videojs/video.js/issues/2617 for more info.\n ";throw d["default"].alert(e),new Error(e)},e.prototype.addTechControlsListeners_=function(){this.removeTechControlsListeners_(),this.on(this.tech_,"mousedown",this.handleTechClick_),this.on(this.tech_,"touchstart",this.handleTechTouchStart_),this.on(this.tech_,"touchmove",this.handleTechTouchMove_),this.on(this.tech_,"touchend",this.handleTechTouchEnd_),this.on(this.tech_,"tap",this.handleTechTap_)},e.prototype.removeTechControlsListeners_=function(){this.off(this.tech_,"tap",this.handleTechTap_),this.off(this.tech_,"touchstart",this.handleTechTouchStart_),this.off(this.tech_,"touchmove",this.handleTechTouchMove_),this.off(this.tech_,"touchend",this.handleTechTouchEnd_),this.off(this.tech_,"mousedown",this.handleTechClick_)},e.prototype.handleTechReady_=function(){if(this.triggerReady(),this.cache_.volume&&this.techCall_("setVolume",this.cache_.volume),this.handleTechPosterChange_(),this.handleTechDurationChange_(),(this.src()||this.currentSrc())&&this.tag&&this.options_.autoplay&&this.paused()){try{delete this.tag.poster}catch(t){(0,x["default"])("deleting tag.poster throws in some browsers",t)}this.play()}},e.prototype.handleTechLoadStart_=function(){this.removeClass("vjs-ended"),this.error(null),this.paused()?(this.hasStarted(!1),this.trigger("loadstart")):(this.trigger("loadstart"),this.trigger("firstplay"))},e.prototype.hasStarted=function(t){return void 0!==t?(this.hasStarted_!==t&&(this.hasStarted_=t,t?(this.addClass("vjs-has-started"),this.trigger("firstplay")):this.removeClass("vjs-has-started")),this):!!this.hasStarted_},e.prototype.handleTechPlay_=function(){this.removeClass("vjs-ended"),this.removeClass("vjs-paused"),this.addClass("vjs-playing"),this.hasStarted(!0),this.trigger("play")},e.prototype.handleTechWaiting_=function(){var t=this;this.addClass("vjs-waiting"),this.trigger("waiting"),this.one("timeupdate",function(){return t.removeClass("vjs-waiting")})},e.prototype.handleTechCanPlay_=function(){this.removeClass("vjs-waiting"),this.trigger("canplay")},e.prototype.handleTechCanPlayThrough_=function(){this.removeClass("vjs-waiting"),this.trigger("canplaythrough")},e.prototype.handleTechPlaying_=function(){this.removeClass("vjs-waiting"),this.trigger("playing")},e.prototype.handleTechSeeking_=function(){this.addClass("vjs-seeking"),this.trigger("seeking")},e.prototype.handleTechSeeked_=function(){this.removeClass("vjs-seeking"),this.trigger("seeked")},e.prototype.handleTechFirstPlay_=function(){this.options_.starttime&&this.currentTime(this.options_.starttime),this.addClass("vjs-has-started"),this.trigger("firstplay")},e.prototype.handleTechPause_=function(){this.removeClass("vjs-playing"),this.addClass("vjs-paused"),this.trigger("pause")},e.prototype.handleTechEnded_=function(){this.addClass("vjs-ended"),this.options_.loop?(this.currentTime(0),this.play()):this.paused()||this.pause(),this.trigger("ended")},e.prototype.handleTechDurationChange_=function(){this.duration(this.techGet_("duration"))},e.prototype.handleTechClick_=function(t){0===t.button&&this.controls()&&(this.paused()?this.play():this.pause())},e.prototype.handleTechTap_=function(){this.userActive(!this.userActive())},e.prototype.handleTechTouchStart_=function(){this.userWasActive=this.userActive()},e.prototype.handleTechTouchMove_=function(){this.userWasActive&&this.reportUserActivity()},e.prototype.handleTechTouchEnd_=function(t){t.preventDefault()},e.prototype.handleFullscreenChange_=function(){this.isFullscreen()?this.addClass("vjs-fullscreen"):this.removeClass("vjs-fullscreen")},e.prototype.handleStageClick_=function(){this.reportUserActivity()},e.prototype.handleTechFullscreenChange_=function(t,e){e&&this.isFullscreen(e.isFullscreen),this.trigger("fullscreenchange")},e.prototype.handleTechError_=function(){var t=this.tech_.error();this.error(t)},e.prototype.handleTechTextData_=function(){var t=null;arguments.length>1&&(t=arguments[1]),this.trigger("textdata",t)},e.prototype.getCache=function(){return this.cache_},e.prototype.techCall_=function(t,e){if(this.tech_&&!this.tech_.isReady_)this.tech_.ready(function(){this[t](e)},!0);else try{this.tech_&&this.tech_[t](e)}catch(o){throw(0,x["default"])(o),o}},e.prototype.techGet_=function(t){if(this.tech_&&this.tech_.isReady_)try{return this.tech_[t]()}catch(e){throw void 0===this.tech_[t]?(0,x["default"])("Video.js: "+t+" method not defined for "+this.techName_+" playback technology.",e):"TypeError"===e.name?((0,x["default"])("Video.js: "+t+" unavailable on "+this.techName_+" playback technology element.",e),this.tech_.isReady_=!1):(0,x["default"])(e),e}},e.prototype.play=function(){return this.src()||this.currentSrc()?this.techCall_("play"):this.tech_.one("loadstart",function(){this.play()}),this},e.prototype.pause=function(){return this.techCall_("pause"),this},e.prototype.paused=function(){return this.techGet_("paused")!==!1},e.prototype.scrubbing=function(t){return void 0!==t?(this.scrubbing_=!!t,t?this.addClass("vjs-scrubbing"):this.removeClass("vjs-scrubbing"),this):this.scrubbing_},e.prototype.currentTime=function(t){return void 0!==t?(this.techCall_("setCurrentTime",t),this):(this.cache_.currentTime=this.techGet_("currentTime")||0,this.cache_.currentTime)},e.prototype.duration=function(t){return void 0===t?this.cache_.duration||0:(t=parseFloat(t)||0,t<0&&(t=1/0),t!==this.cache_.duration&&(this.cache_.duration=t,t===1/0?this.addClass("vjs-live"):this.removeClass("vjs-live"),this.trigger("durationchange")),this)},e.prototype.remainingTime=function(){return this.duration()-this.currentTime()},e.prototype.buffered=function o(){var o=this.techGet_("buffered");return o&&o.length||(o=(0,C.createTimeRange)(0,0)),o},e.prototype.bufferedPercent=function(){return(0,S.bufferedPercent)(this.buffered(),this.duration())},e.prototype.bufferedEnd=function(){var t=this.buffered(),e=this.duration(),o=t.end(t.length-1);return o>e&&(o=e),o},e.prototype.volume=function(t){var e=void 0;return void 0!==t?(e=Math.max(0,Math.min(1,parseFloat(t))),this.cache_.volume=e,this.techCall_("setVolume",e),this):(e=parseFloat(this.techGet_("volume")),isNaN(e)?1:e)},e.prototype.muted=function(t){return void 0!==t?(this.techCall_("setMuted",t),this):this.techGet_("muted")||!1},e.prototype.supportsFullScreen=function(){return this.techGet_("supportsFullScreen")||!1},e.prototype.isFullscreen=function(t){return void 0!==t?(this.isFullscreen_=!!t,this):!!this.isFullscreen_},e.prototype.requestFullscreen=function(){var t=M["default"];return this.isFullscreen(!0),t.requestFullscreen?(v.on(p["default"],t.fullscreenchange,b.bind(this,function e(o){this.isFullscreen(p["default"][t.fullscreenElement]),this.isFullscreen()===!1&&v.off(p["default"],t.fullscreenchange,e),this.trigger("fullscreenchange")})),this.el_[t.requestFullscreen]()):this.tech_.supportsFullScreen()?this.techCall_("enterFullScreen"):(this.enterFullWindow(),this.trigger("fullscreenchange")),this},e.prototype.exitFullscreen=function(){var t=M["default"];return this.isFullscreen(!1),t.requestFullscreen?p["default"][t.exitFullscreen]():this.tech_.supportsFullScreen()?this.techCall_("exitFullScreen"):(this.exitFullWindow(),this.trigger("fullscreenchange")),this},e.prototype.enterFullWindow=function(){this.isFullWindow=!0,this.docOrigOverflow=p["default"].documentElement.style.overflow,v.on(p["default"],"keydown",b.bind(this,this.fullWindowOnEscKey)),p["default"].documentElement.style.overflow="hidden",g.addElClass(p["default"].body,"vjs-full-window"),this.trigger("enterFullWindow")},e.prototype.fullWindowOnEscKey=function(t){27===t.keyCode&&(this.isFullscreen()===!0?this.exitFullscreen():this.exitFullWindow())},e.prototype.exitFullWindow=function(){this.isFullWindow=!1,v.off(p["default"],"keydown",this.fullWindowOnEscKey),p["default"].documentElement.style.overflow=this.docOrigOverflow,g.removeElClass(p["default"].body,"vjs-full-window"),this.trigger("exitFullWindow")},e.prototype.canPlayType=function(t){for(var e=void 0,o=0,n=this.options_.techOrder;o0&&(a=this.setTimeout(function(){this.userActivity_||this.userActive(!1)},t))}},250)},e.prototype.playbackRate=function(t){return void 0!==t?(this.techCall_("setPlaybackRate",t),this):this.tech_&&this.tech_.featuresPlaybackRate?this.techGet_("playbackRate"):1},e.prototype.isAudio=function(t){return void 0!==t?(this.isAudio_=!!t,this):!!this.isAudio_},e.prototype.videoTracks=function(){return this.tech_?this.tech_.videoTracks():(this.videoTracks_=this.videoTracks_||new Z["default"],this.videoTracks_)},e.prototype.audioTracks=function(){return this.tech_?this.tech_.audioTracks():(this.audioTracks_=this.audioTracks_||new J["default"],this.audioTracks_)},e.prototype.textTracks=function(){if(this.tech_)return this.tech_.textTracks()},e.prototype.remoteTextTracks=function(){if(this.tech_)return this.tech_.remoteTextTracks()},e.prototype.remoteTextTrackEls=function(){if(this.tech_)return this.tech_.remoteTextTrackEls()},e.prototype.addTextTrack=function(t,e,o){if(this.tech_)return this.tech_.addTextTrack(t,e,o)},e.prototype.addRemoteTextTrack=function(t,e){if(this.tech_)return this.tech_.addRemoteTextTrack(t,e)},e.prototype.removeRemoteTextTrack=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.track,o=void 0===e?arguments[0]:e;if(this.tech_)return this.tech_.removeRemoteTextTrack(o)},e.prototype.videoWidth=function(){return this.tech_&&this.tech_.videoWidth&&this.tech_.videoWidth()||0},e.prototype.videoHeight=function(){return this.tech_&&this.tech_.videoHeight&&this.tech_.videoHeight()||0},e.prototype.language=function(t){return void 0===t?this.language_:(this.language_=String(t).toLowerCase(),this)},e.prototype.languages=function(){return(0,Q["default"])(e.prototype.options_.languages,this.languages_)},e.prototype.toJSON=function(){var t=(0,Q["default"])(this.options_),e=t.tracks;t.tracks=[];for(var o=0;o1&&void 0!==arguments[1]?arguments[1]:{};r(this,e);var s=i(this,t.call(this,o,n));return s.update(),s}return s(e,t),e.prototype.update=function(){var t=this.createPopup();this.popup&&this.removeChild(this.popup),this.popup=t,this.addChild(t),this.items&&0===this.items.length?this.hide():this.items&&this.items.length>1&&this.show()},e.prototype.createPopup=function(){},e.prototype.createEl=function(){return t.prototype.createEl.call(this,"div",{className:this.buildCSSClass()})},e.prototype.buildCSSClass=function(){var e="vjs-menu-button";return e+=this.options_.inline===!0?"-inline":"-popup","vjs-menu-button "+e+" "+t.prototype.buildCSSClass.call(this)},e}(l["default"]);c["default"].registerComponent("PopupButton",p),o["default"]=p},{3:3,5:5}],54:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(5),u=r(l),c=t(82),p=n(c),f=t(84),d=n(f),h=t(83),v=n(h),y=function(t){function e(){return i(this,e),s(this,t.apply(this,arguments))}return a(e,t),e.prototype.addItem=function(t){this.addChild(t),t.on("click",d.bind(this,function(){this.unlockShowing()}))},e.prototype.createEl=function(){var e=this.options_.contentElType||"ul";this.contentEl_=p.createEl(e,{className:"vjs-menu-content"});var o=t.prototype.createEl.call(this,"div",{append:this.contentEl_,className:"vjs-menu"});return o.appendChild(this.contentEl_),v.on(o,"click",function(t){t.preventDefault(),t.stopImmediatePropagation()}),o},e}(u["default"]);u["default"].registerComponent("Popup",y),o["default"]=y},{5:5,82:82,83:83,84:84}],55:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(3),u=r(l),c=t(5),p=r(c),f=t(84),d=n(f),h=t(82),v=n(h),y=t(79),g=n(y),A=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return r.update(),o.on("posterchange",d.bind(r,r.update)),r}return a(e,t),e.prototype.dispose=function(){this.player().off("posterchange",this.update),t.prototype.dispose.call(this)},e.prototype.createEl=function(){var t=v.createEl("div",{className:"vjs-poster",tabIndex:-1});return g.BACKGROUND_SIZE_SUPPORTED||(this.fallbackImg_=v.createEl("img"),t.appendChild(this.fallbackImg_)),t},e.prototype.update=function(){var t=this.player().poster();this.setSrc(t),t?this.show():this.hide()},e.prototype.setSrc=function(t){if(this.fallbackImg_)this.fallbackImg_.src=t;else{var e="";t&&(e='url("'+t+'")'),this.el_.style.backgroundImage=e}},e.prototype.handleClick=function(){this.player_.paused()?this.player_.play():this.player_.pause()},e}(u["default"]);p["default"].registerComponent("PosterImage",A),o["default"]=A},{3:3,5:5,79:79,82:82,84:84}],56:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t,e){e&&(d=e),setTimeout(h,t)}o.__esModule=!0,o.hasLoaded=o.autoSetupTimeout=o.autoSetup=void 0;var s=t(83),a=r(s),l=t(95),u=n(l),c=t(96),p=n(c),f=!1,d=void 0,h=function(){var t=u["default"].getElementsByTagName("video"),e=u["default"].getElementsByTagName("audio"),o=[];if(t&&t.length>0)for(var n=0,r=t.length;n0)for(var s=0,a=e.length;s0)for(var l=0,c=o.length;l1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return o.className=o.className+" vjs-slider",o=(0,d["default"])({tabIndex:0},o),n=(0,d["default"])({role:"slider","aria-valuenow":0,"aria-valuemin":0,"aria-valuemax":100,tabIndex:0},n),t.prototype.createEl.call(this,e,o,n)},e.prototype.handleMouseDown=function(t){var e=this.bar.el_.ownerDocument;t.preventDefault(),p.blockTextSelection(),this.addClass("vjs-sliding"),this.trigger("slideractive"),this.on(e,"mousemove",this.handleMouseMove),this.on(e,"mouseup",this.handleMouseUp),this.on(e,"touchmove",this.handleMouseMove),this.on(e,"touchend",this.handleMouseUp),this.handleMouseMove(t)},e.prototype.handleMouseMove=function(){},e.prototype.handleMouseUp=function(){var t=this.bar.el_.ownerDocument;p.unblockTextSelection(),this.removeClass("vjs-sliding"),this.trigger("sliderinactive"),this.off(t,"mousemove",this.handleMouseMove),this.off(t,"mouseup",this.handleMouseUp),this.off(t,"touchmove",this.handleMouseMove),this.off(t,"touchend",this.handleMouseUp),this.update()},e.prototype.update=function(){if(this.el_){var t=this.getPercent(),e=this.bar;if(e){("number"!=typeof t||t!==t||t<0||t===1/0)&&(t=0);var o=(100*t).toFixed(2)+"%";this.vertical()?e.el().style.height=o:e.el().style.width=o}}},e.prototype.calculateDistance=function(t){var e=p.getPointerPosition(this.el_,t);return this.vertical()?e.y:e.x},e.prototype.handleFocus=function(){this.on(this.bar.el_.ownerDocument,"keydown",this.handleKeyPress)},e.prototype.handleKeyPress=function(t){37===t.which||40===t.which?(t.preventDefault(),this.stepBack()):38!==t.which&&39!==t.which||(t.preventDefault(),this.stepForward())},e.prototype.handleBlur=function(){this.off(this.bar.el_.ownerDocument,"keydown",this.handleKeyPress)},e.prototype.handleClick=function(t){t.stopImmediatePropagation(),t.preventDefault()},e.prototype.vertical=function(t){return void 0===t?this.vertical_||!1:(this.vertical_=!!t,this.vertical_?this.addClass("vjs-slider-vertical"):this.addClass("vjs-slider-horizontal"),this)},e}(u["default"]);u["default"].registerComponent("Slider",h),o["default"]=h},{139:139,5:5,82:82}],58:[function(t,e,o){"use strict";function n(t,e){var o=function(){var n=(new Date).getTime();return n-o.lastCheckTime_>=e&&(o.lastCheckTime_=n,o.cache_=t()),o.cache_};return o.lastCheckTime_=-(1/0),o}o.__esModule=!0,o["default"]=n},{}],59:[function(t,e,o){"use strict";function n(t){return t.streamingFormats={"rtmp/mp4":"MP4","rtmp/flv":"FLV"},t.streamFromParts=function(t,e){return t+"&"+e},t.streamToParts=function(t){var e={connection:"",stream:""};if(!t)return e;var o=t.search(/&(?!\w+=)/),n=void 0;return o!==-1?n=o+1:(o=n=t.lastIndexOf("/")+1,0===o&&(o=n=t.length)),e.connection=t.substring(0,o),e.stream=t.substring(n,t.length),e},t.isStreamingType=function(e){return e in t.streamingFormats},t.RTMP_RE=/^rtmp[set]?:\/\//i,t.isStreamingSrc=function(e){return t.RTMP_RE.test(e)},t.rtmpSourceHandler={},t.rtmpSourceHandler.canPlayType=function(e){return t.isStreamingType(e)?"maybe":""},t.rtmpSourceHandler.canHandleSource=function(e,o){var n=t.rtmpSourceHandler.canPlayType(e.type);return n?n:t.isStreamingSrc(e.src)?"maybe":""},t.rtmpSourceHandler.handleSource=function(e,o,n){var r=t.streamToParts(e.src);o.setRtmpConnection(r.connection),o.setRtmpStream(r.stream)},t.registerSourceHandler(t.rtmpSourceHandler),t}o.__esModule=!0,o["default"]=n},{}],60:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function l(t){var e=t.charAt(0).toUpperCase()+t.slice(1);S["set"+e]=function(e){return this.el_.vjs_setProperty(t,e)}}function u(t){S[t]=function(){return this.el_.vjs_getProperty(t)}}o.__esModule=!0;for(var c=t(63),p=r(c),f=t(82),d=n(f),h=t(93),v=n(h),y=t(91),g=t(59),A=r(g),b=t(58),m=r(b),j=t(5),w=r(j),_=t(96),k=r(_),x=t(139),T=r(x),E=k["default"].navigator,C=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));o.source&&r.ready(function(){this.setSource(o.source)},!0),o.startTime&&r.ready(function(){this.load(),this.play(),this.currentTime(o.startTime)},!0),k["default"].videojs=k["default"].videojs||{},k["default"].videojs.Flash=k["default"].videojs.Flash||{},k["default"].videojs.Flash.onReady=e.onReady,k["default"].videojs.Flash.onEvent=e.onEvent,k["default"].videojs.Flash.onError=e.onError,r.on("seeked",function(){this.lastSeekTarget_=void 0});var a=(0,m["default"])(function(){return r.el_.vjs_getProperty("currentTime")},100);return r.currentTime=function(t){return r.seeking()?r.lastSeekTarget_||0:a()},r.buffered=(0,m["default"])(function(){var t=r.el_.vjs_getProperty("buffered");return 0===t.length?(0,y.createTimeRange)():(0,y.createTimeRange)(t[0][0],t[0][1])},100),r}return a(e,t),e.prototype.createEl=function(){var t=this.options_;if(!t.swf){var o="5.1.0";t.swf="//vjs.zencdn.net/swf/"+o+"/video-js.swf"}var n=t.techId,r=(0,T["default"])({readyFunction:"videojs.Flash.onReady",eventProxyFunction:"videojs.Flash.onEvent",errorEventProxyFunction:"videojs.Flash.onError",autoplay:t.autoplay,preload:t.preload,loop:t.loop,muted:t.muted},t.flashVars),i=(0,T["default"])({wmode:"opaque",bgcolor:"#000000"},t.params),s=(0,T["default"])({id:n,name:n,"class":"vjs-tech"},t.attributes);return this.el_=e.embed(t.swf,r,i,s),this.el_.tech=this,this.el_},e.prototype.play=function(){this.ended()&&this.setCurrentTime(0),this.el_.vjs_play()},e.prototype.pause=function(){this.el_.vjs_pause()},e.prototype.src=function(t){return void 0===t?this.currentSrc():this.setSrc(t)},e.prototype.setSrc=function(t){var e=this;t=v.getAbsoluteURL(t),this.el_.vjs_src(t),this.autoplay()&&this.setTimeout(function(){return e.play()},0)},e.prototype.seeking=function(){return void 0!==this.lastSeekTarget_},e.prototype.setCurrentTime=function(e){var o=this.seekable();o.length&&(e=e>o.start(0)?e:o.start(0),e=e=0?o:1/0},e.prototype.load=function(){this.el_.vjs_load()},e.prototype.poster=function(){this.el_.vjs_getProperty("poster")},e.prototype.setPoster=function(){},e.prototype.seekable=function(){var t=this.duration();return 0===t?(0,y.createTimeRange)():(0,y.createTimeRange)(0,t)},e.prototype.supportsFullScreen=function(){return!1},e.prototype.enterFullScreen=function(){return!1},e}(p["default"]),S=C.prototype,O="rtmpConnection,rtmpStream,preload,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted".split(","),B="networkState,readyState,initialTime,startOffsetTime,paused,ended,videoWidth,videoHeight".split(","),P=0;P=10},p["default"].withSourceHandlers(C),C.nativeSourceHandler={},C.nativeSourceHandler.canPlayType=function(t){return t in C.formats?"maybe":""},C.nativeSourceHandler.canHandleSource=function(t,e){function o(t){var e=v.getFileExtension(t);return e?"video/"+e:""}var n=void 0;return n=t.type?t.type.replace(/;.*/,"").toLowerCase():o(t.src),C.nativeSourceHandler.canPlayType(n)},C.nativeSourceHandler.handleSource=function(t,e,o){e.setSrc(t.src)},C.nativeSourceHandler.dispose=function(){},C.registerSourceHandler(C.nativeSourceHandler),C.formats={"video/flv":"FLV","video/x-flv":"FLV","video/mp4":"MP4","video/m4v":"MP4"},C.onReady=function(t){var e=d.getEl(t),o=e&&e.tech;o&&o.el()&&C.checkReady(o)},C.checkReady=function(t){t.el()&&(t.el().vjs_getProperty?t.triggerReady():this.setTimeout(function(){C.checkReady(t)},50))},C.onEvent=function(t,e){var o=d.getEl(t).tech,n=Array.prototype.slice.call(arguments,2);o.setTimeout(function(){o.trigger(e,n)},1)},C.onError=function(t,e){var o=d.getEl(t).tech;return"srcnotfound"===e?o.error(4):void o.error("FLASH: "+e)},C.version=function(){var t="0,0,0";try{t=new k["default"].ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version").replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}catch(e){try{E.mimeTypes["application/x-shockwave-flash"].enabledPlugin&&(t=(E.plugins["Shockwave Flash 2.0"]||E.plugins["Shockwave Flash"]).description.replace(/\D+/g,",").match(/^,?(.+),?$/)[1])}catch(o){}}return t.split(",")},C.embed=function(t,e,o,n){var r=C.getEmbedCode(t,e,o,n),i=d.createEl("div",{innerHTML:r}).childNodes[0];return i},C.getEmbedCode=function(t,e,o,n){var r=''}),n=(0,T["default"])({data:t,width:"100%",height:"100%"},n),Object.getOwnPropertyNames(n).forEach(function(t){a+=t+'="'+n[t]+'" '}),""+r+a+">"+s+""},(0,A["default"])(C),w["default"].registerComponent("Flash",C),p["default"].registerTech("Flash",C),o["default"]=C},{139:139,5:5,58:58,59:59,63:63,82:82,91:91,93:93,96:96}],61:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){return t.raw=e,t}function s(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c=i(["Text Tracks are being loaded from another origin but the crossorigin attribute isn't used.\n This may prevent text tracks from loading."],["Text Tracks are being loaded from another origin but the crossorigin attribute isn't used.\n This may prevent text tracks from loading."]),p=t(63),f=r(p),d=t(5),h=r(d),v=t(82),y=n(v),g=t(93),A=n(g),b=t(84),m=n(b),j=t(87),w=r(j),_=t(149),k=r(_),x=t(79),T=n(x),E=t(95),C=r(E),S=t(96),O=r(S),B=t(139),P=r(B),M=t(88),I=r(M),R=t(92),D=r(R),N=function(t){function e(o,n){s(this,e);var r=a(this,t.call(this,o,n)),i=o.source,l=!1;if(i&&(r.el_.currentSrc!==i.src||o.tag&&3===o.tag.initNetworkState_)?r.setSource(i):r.handleLateInit_(r.el_),r.el_.hasChildNodes()){for(var u=r.el_.childNodes,p=u.length,f=[];p--;){var d=u[p],h=d.nodeName.toLowerCase();"track"===h&&(r.featuresNativeTextTracks?(r.remoteTextTrackEls().addTrackElement_(d),r.remoteTextTracks().addTrack_(d.track),l||r.el_.hasAttribute("crossorigin")||!A.isCrossOrigin(d.src)||(l=!0)):f.push(d))}for(var v=0;v=0;s--){var a=i[s],l={};"undefined"!=typeof this.options_[a]&&(l[a]=this.options_[a]),y.setElAttributes(t,l)}return t},e.prototype.handleLateInit_=function(t){var e=this;if(0!==t.networkState&&3!==t.networkState){if(0===t.readyState){var o=function(){var t=!1,o=function(){t=!0};e.on("loadstart",o);var n=function(){t||this.trigger("loadstart")};return e.on("loadedmetadata",n),e.ready(function(){this.off("loadstart",o),this.off("loadedmetadata",n),t||this.trigger("loadstart")}),{v:void 0}}();if("object"===("undefined"==typeof o?"undefined":u(o)))return o.v}var n=["loadstart"];n.push("loadedmetadata"),t.readyState>=2&&n.push("loadeddata"),t.readyState>=3&&n.push("canplay"),t.readyState>=4&&n.push("canplaythrough"),this.ready(function(){n.forEach(function(t){this.trigger(t)},this)})}},e.prototype.proxyNativeTextTracks_=function(){var t=this.el().textTracks;if(t){for(var e=0;e0&&(t.el_.duration===1/0&&t.trigger("durationchange"),t.off(t.player_,"timeupdate",o))};return t.on(t.player_,"timeupdate",e),{v:NaN}}();if("object"===("undefined"==typeof e?"undefined":u(e)))return e.v}return this.el_.duration||NaN},e.prototype.width=function(){return this.el_.offsetWidth},e.prototype.height=function(){return this.el_.offsetHeight},e.prototype.proxyWebkitFullscreen_=function(){var t=this;if("webkitDisplayingFullscreen"in this.el_){var e=function(){this.trigger("fullscreenchange",{isFullscreen:!1})},o=function(){this.one("webkitendfullscreen",e),this.trigger("fullscreenchange",{isFullscreen:!0})};this.on("webkitbeginfullscreen",o),this.on("dispose",function(){t.off("webkitbeginfullscreen",o),t.off("webkitendfullscreen",e)})}},e.prototype.supportsFullScreen=function(){if("function"==typeof this.el_.webkitEnterFullScreen){var t=O["default"].navigator&&O["default"].navigator.userAgent||"";if(/Android/.test(t)||!/Chrome|Mac OS X 10.5/.test(t))return!0}return!1},e.prototype.enterFullScreen=function(){var t=this.el_;t.paused&&t.networkState<=t.HAVE_METADATA?(this.el_.play(),this.setTimeout(function(){t.pause(),t.webkitEnterFullScreen()},0)):t.webkitEnterFullScreen()},e.prototype.exitFullScreen=function(){this.el_.webkitExitFullScreen()},e.prototype.src=function(t){return void 0===t?this.el_.src:void this.setSrc(t)},e.prototype.reset=function(){e.resetMediaElement(this.el_)},e.prototype.currentSrc=function(){return this.currentSource_?this.currentSource_.src:this.el_.currentSrc},e.prototype.setControls=function(t){this.el_.controls=!!t},e.prototype.addTextTrack=function(e,o,n){return this.featuresNativeTextTracks?this.el_.addTextTrack(e,o,n):t.prototype.addTextTrack.call(this,e,o,n)},e.prototype.createRemoteTextTrack=function(e){if(!this.featuresNativeTextTracks)return t.prototype.createRemoteTextTrack.call(this,e);var o=C["default"].createElement("track");return e.kind&&(o.kind=e.kind),e.label&&(o.label=e.label),(e.language||e.srclang)&&(o.srclang=e.language||e.srclang),e["default"]&&(o["default"]=e["default"]),e.id&&(o.id=e.id),e.src&&(o.src=e.src),o},e.prototype.addRemoteTextTrack=function(e,o){var n=t.prototype.addRemoteTextTrack.call(this,e,o);return this.el().appendChild(n),n},e.prototype.removeRemoteTextTrack=function(e){t.prototype.removeRemoteTextTrack.call(this,e);for(var o=this.$$("track"),n=o.length;n--;)e!==o[n]&&e!==o[n].track||this.el().removeChild(o[n])},e}(f["default"]);N.TEST_VID=C["default"].createElement("video");var F=C["default"].createElement("track");F.kind="captions",F.srclang="en",F.label="English",N.TEST_VID.appendChild(F),N.isSupported=function(){try{N.TEST_VID.volume=.5}catch(t){return!1}return!!N.TEST_VID.canPlayType},N.canControlVolume=function(){try{var t=N.TEST_VID.volume;return N.TEST_VID.volume=t/2+.1,t!==N.TEST_VID.volume}catch(e){return!1}},N.canControlPlaybackRate=function(){if(T.IS_ANDROID&&T.IS_CHROME)return!1;try{var t=N.TEST_VID.playbackRate;return N.TEST_VID.playbackRate=t/2+.1,t!==N.TEST_VID.playbackRate}catch(e){return!1}},N.supportsNativeTextTracks=function(){var t=void 0;return t=!!N.TEST_VID.textTracks,t&&N.TEST_VID.textTracks.length>0&&(t="number"!=typeof N.TEST_VID.textTracks[0].mode),t&&T.IS_FIREFOX&&(t=!1),!t||"onremovetrack"in N.TEST_VID.textTracks||(t=!1),t},N.supportsNativeVideoTracks=function(){var t=!!N.TEST_VID.videoTracks;return t},N.supportsNativeAudioTracks=function(){var t=!!N.TEST_VID.audioTracks;return t},N.Events=["loadstart","suspend","abort","error","emptied","stalled","loadedmetadata","loadeddata","canplay","canplaythrough","playing","waiting","seeking","seeked","ended","durationchange","timeupdate","progress","play","pause","ratechange","volumechange"],N.prototype.featuresVolumeControl=N.canControlVolume(),N.prototype.featuresPlaybackRate=N.canControlPlaybackRate(),N.prototype.movingMediaElementInDOM=!T.IS_IOS,N.prototype.featuresFullscreenResize=!0,N.prototype.featuresProgressEvents=!0,N.prototype.featuresTimeupdateEvents=!0,N.prototype.featuresNativeTextTracks=N.supportsNativeTextTracks(),N.prototype.featuresNativeVideoTracks=N.supportsNativeVideoTracks(),N.prototype.featuresNativeAudioTracks=N.supportsNativeAudioTracks();var L=void 0,z=/^application\/(?:x-|vnd\.apple\.)mpegurl/i,Q=/^video\/mp4/i;N.patchCanPlayType=function(){T.ANDROID_VERSION>=4&&!T.IS_FIREFOX&&(L||(L=N.TEST_VID.constructor.prototype.canPlayType),N.TEST_VID.constructor.prototype.canPlayType=function(t){return t&&z.test(t)?"maybe":L.call(this,t)}),T.IS_OLD_ANDROID&&(L||(L=N.TEST_VID.constructor.prototype.canPlayType),N.TEST_VID.constructor.prototype.canPlayType=function(t){return t&&Q.test(t)?"maybe":L.call(this,t)})},N.unpatchCanPlayType=function(){var t=N.TEST_VID.constructor.prototype.canPlayType;return N.TEST_VID.constructor.prototype.canPlayType=L,L=null,t},N.patchCanPlayType(),N.disposeMediaElement=function(t){if(t){for(t.parentNode&&t.parentNode.removeChild(t);t.hasChildNodes();)t.removeChild(t.firstChild);t.removeAttribute("src"),"function"==typeof t.load&&!function(){try{t.load()}catch(e){}}()}},N.resetMediaElement=function(t){if(t){for(var e=t.querySelectorAll("source"),o=e.length;o--;)t.removeChild(e[o]);t.removeAttribute("src"),"function"==typeof t.load&&!function(){try{t.load()}catch(e){}}()}},["paused","currentTime","buffered","volume","muted","poster","preload","autoplay","controls","loop","error","seeking","seekable","ended","defaultMuted","playbackRate","played","networkState","readyState","videoWidth","videoHeight"].forEach(function(t){N.prototype[t]=function(){return this.el_[t]}}),["volume","muted","src","poster","preload","autoplay","loop","playbackRate"].forEach(function(t){N.prototype["set"+(0,D["default"])(t)]=function(e){this.el_[t]=e}}),["pause","load"].forEach(function(t){N.prototype[t]=function(){return this.el_[t]()}}),f["default"].withSourceHandlers(N),N.nativeSourceHandler={},N.nativeSourceHandler.canPlayType=function(t){try{return N.TEST_VID.canPlayType(t)}catch(e){return""}},N.nativeSourceHandler.canHandleSource=function(t,e){if(t.type)return N.nativeSourceHandler.canPlayType(t.type);if(t.src){var o=A.getFileExtension(t.src);return N.nativeSourceHandler.canPlayType("video/"+o)}return""},N.nativeSourceHandler.handleSource=function(t,e,o){e.setSrc(t.src)},N.nativeSourceHandler.dispose=function(){},N.registerSourceHandler(N.nativeSourceHandler),h["default"].registerComponent("Html5",N),f["default"].registerTech("Html5",N),o["default"]=N},{139:139,149:149,5:5,63:63,79:79,82:82,84:84,87:87,88:88,92:92,93:93,95:95,96:96}],62:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); +return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var a=t(5),l=n(a),u=t(63),c=n(u),p=t(92),f=n(p),d=function(t){function e(o,n,s){r(this,e);var a=i(this,t.call(this,o,n,s));if(n.playerOptions.sources&&0!==n.playerOptions.sources.length)o.src(n.playerOptions.sources);else for(var u=0,p=n.playerOptions.techOrder;u4&&void 0!==arguments[4]?arguments[4]:{},i=t.textTracks();r.kind=e,o&&(r.label=o),n&&(r.language=n),r.tech=t;var s=new A["default"](r);return i.addTrack_(s),s}o.__esModule=!0;var u=t(5),c=r(u),p=t(67),f=r(p),d=t(66),h=r(d),v=t(88),y=r(v),g=t(73),A=r(g),b=t(71),m=r(b),j=t(77),w=r(j),_=t(64),k=r(_),x=t(84),T=n(x),E=t(87),C=r(E),S=t(91),O=t(80),B=t(46),P=r(B),M=t(96),I=r(M),R=t(95),D=r(R),N=function(t){function e(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){};i(this,e),o.reportTouchActivity=!1;var r=s(this,t.call(this,null,o,n));return r.hasStarted_=!1,r.on("playing",function(){this.hasStarted_=!0}),r.on("loadstart",function(){this.hasStarted_=!1}),r.textTracks_=o.textTracks,r.videoTracks_=o.videoTracks,r.audioTracks_=o.audioTracks,r.featuresProgressEvents||r.manualProgressOn(),r.featuresTimeupdateEvents||r.manualTimeUpdatesOn(),o.nativeCaptions!==!1&&o.nativeTextTracks!==!1||(r.featuresNativeTextTracks=!1),r.featuresNativeTextTracks||r.emulateTextTracks(),r.autoRemoteTextTracks_=new m["default"],r.initTextTrackListeners(),r.initTrackListeners(),r.emitTapEvents(),r}return a(e,t),e.prototype.manualProgressOn=function(){this.on("durationchange",this.onDurationChange),this.manualProgress=!0,this.one("ready",this.trackProgress)},e.prototype.manualProgressOff=function(){this.manualProgress=!1,this.stopTrackingProgress(),this.off("durationchange",this.onDurationChange)},e.prototype.trackProgress=function(){this.stopTrackingProgress(),this.progressInterval=this.setInterval(T.bind(this,function(){var t=this.bufferedPercent();this.bufferedPercent_!==t&&this.trigger("progress"),this.bufferedPercent_=t,1===t&&this.stopTrackingProgress()}),500)},e.prototype.onDurationChange=function(){this.duration_=this.duration()},e.prototype.buffered=function(){return(0,S.createTimeRange)(0,0)},e.prototype.bufferedPercent=function(){return(0,O.bufferedPercent)(this.buffered(),this.duration_)},e.prototype.stopTrackingProgress=function(){this.clearInterval(this.progressInterval)},e.prototype.manualTimeUpdatesOn=function(){this.manualTimeUpdates=!0,this.on("play",this.trackCurrentTime),this.on("pause",this.stopTrackingCurrentTime)},e.prototype.manualTimeUpdatesOff=function(){this.manualTimeUpdates=!1,this.stopTrackingCurrentTime(),this.off("play",this.trackCurrentTime),this.off("pause",this.stopTrackingCurrentTime)},e.prototype.trackCurrentTime=function(){this.currentTimeInterval&&this.stopTrackingCurrentTime(),this.currentTimeInterval=this.setInterval(function(){this.trigger({type:"timeupdate",target:this,manuallyTriggered:!0})},250)},e.prototype.stopTrackingCurrentTime=function(){this.clearInterval(this.currentTimeInterval),this.trigger({type:"timeupdate",target:this,manuallyTriggered:!0})},e.prototype.dispose=function(){this.clearTracks(["audio","video","text"]),this.manualProgress&&this.manualProgressOff(),this.manualTimeUpdates&&this.manualTimeUpdatesOff(),t.prototype.dispose.call(this)},e.prototype.clearTracks=function(t){var e=this;t=[].concat(t),t.forEach(function(t){for(var o=e[t+"Tracks"]()||[],n=o.length;n--;){var r=o[n];"text"===t&&e.removeRemoteTextTrack(r),o.removeTrack_(r)}})},e.prototype.cleanupAutoTextTracks=function(){for(var t=this.autoRemoteTextTracks_||[],e=t.length;e--;){var o=t[e];this.removeRemoteTextTrack(o)}},e.prototype.reset=function(){},e.prototype.error=function(t){return void 0!==t&&(this.error_=new P["default"](t),this.trigger("error")),this.error_},e.prototype.played=function(){return this.hasStarted_?(0,S.createTimeRange)(0,0):(0,S.createTimeRange)()},e.prototype.setCurrentTime=function(){this.manualTimeUpdates&&this.trigger({type:"timeupdate",target:this,manuallyTriggered:!0})},e.prototype.initTextTrackListeners=function(){var t=T.bind(this,function(){this.trigger("texttrackchange")}),e=this.textTracks();e&&(e.addEventListener("removetrack",t),e.addEventListener("addtrack",t),this.on("dispose",T.bind(this,function(){e.removeEventListener("removetrack",t),e.removeEventListener("addtrack",t)})))},e.prototype.initTrackListeners=function(){var t=this,e=["video","audio"];e.forEach(function(e){var o=function(){t.trigger(e+"trackchange")},n=t[e+"Tracks"]();n.addEventListener("removetrack",o),n.addEventListener("addtrack",o),t.on("dispose",function(){n.removeEventListener("removetrack",o),n.removeEventListener("addtrack",o)})})},e.prototype.addWebVttScript_=function(){var t=this;I["default"].WebVTT||null===this.el().parentNode||void 0===this.el().parentNode||!function(){var e=D["default"].createElement("script");e.src=t.options_["vtt.js"]||"https://cdn.rawgit.com/gkatsev/vtt.js/vjs-v0.12.1/dist/vtt.min.js",e.onload=function(){t.trigger("vttjsloaded")},e.onerror=function(){t.trigger("vttjserror")},t.on("dispose",function(){e.onload=null,e.onerror=null}),I["default"].WebVTT=!0,t.el().parentNode.appendChild(e)}()},e.prototype.emulateTextTracks=function(){var t=this,e=this.textTracks();if(e){this.remoteTextTracks().on("addtrack",function(e){t.textTracks().addTrack_(e.track)}),this.remoteTextTracks().on("removetrack",function(e){t.textTracks().removeTrack_(e.track)}),this.on("ready",this.addWebVttScript_);var o=function(){return t.trigger("texttrackchange")},n=function(){o();for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:{},e=arguments[1],o=this.createRemoteTextTrack(t);return e!==!0&&e!==!1&&(C["default"].warn('Calling addRemoteTextTrack without explicitly setting the "manualCleanup" parameter to `true` is deprecated and default to `false` in future version of video.js'),e=!0),this.remoteTextTrackEls().addTrackElement_(o),this.remoteTextTracks().addTrack_(o.track),e!==!0&&this.autoRemoteTextTracks_.addTrack_(o.track),o},e.prototype.removeRemoteTextTrack=function(t){var e=this.remoteTextTrackEls().getTrackElementByTrack_(t);this.remoteTextTrackEls().removeTrackElement_(e),this.remoteTextTracks().removeTrack_(t),this.autoRemoteTextTracks_.removeTrack_(t)},e.prototype.setPoster=function(){},e.prototype.canPlayType=function(){return""},e.isTech=function(t){return t.prototype instanceof e||t instanceof e||t===e},e.registerTech=function(t,o){if(e.techs_||(e.techs_={}),!e.isTech(o))throw new Error("Tech "+t+" must be a Tech");return e.techs_[t]=o,o},e.getTech=function(t){return e.techs_&&e.techs_[t]?e.techs_[t]:I["default"]&&I["default"].videojs&&I["default"].videojs[t]?(C["default"].warn("The "+t+" tech was added to the videojs object when it should be registered using videojs.registerTech(name, tech)"),I["default"].videojs[t]):void 0},e}(c["default"]);N.prototype.textTracks_,N.prototype.audioTracks_,N.prototype.videoTracks_,N.prototype.featuresVolumeControl=!0,N.prototype.featuresFullscreenResize=!1,N.prototype.featuresPlaybackRate=!1,N.prototype.featuresProgressEvents=!1,N.prototype.featuresTimeupdateEvents=!1,N.prototype.featuresNativeTextTracks=!1,N.withSourceHandlers=function(t){t.registerSourceHandler=function(e,o){var n=t.sourceHandlers;n||(n=t.sourceHandlers=[]),void 0===o&&(o=n.length),n.splice(o,0,e)},t.canPlayType=function(e){for(var o=t.sourceHandlers||[],n=void 0,r=0;r0&&void 0!==arguments[0]?arguments[0]:[];i(this,e);for(var a=void 0,l=r.length-1;l>=0;l--)if(r[l].enabled){h(r,r[l]);break}if(p.IS_IE8){a=d["default"].createElement("custom");for(var c in u["default"].prototype)"constructor"!==c&&(a[c]=u["default"].prototype[c]);for(var f in e.prototype)"constructor"!==f&&(a[f]=e.prototype[f])}return a=o=s(this,t.call(this,r,a)),a.changing_=!1,n=a,s(o,n)}return a(e,t),e.prototype.addTrack_=function(e){var o=this;e.enabled&&h(this,e),t.prototype.addTrack_.call(this,e),e.addEventListener&&e.addEventListener("enabledchange",function(){o.changing_||(o.changing_=!0,h(o,e),o.changing_=!1,o.trigger("change"))})},e.prototype.addTrack=function(t){this.addTrack_(t)},e.prototype.removeTrack=function(e){t.prototype.removeTrack_.call(this,e)},e}(u["default"]);o["default"]=v},{75:75,79:79,95:95}],65:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(74),u=t(76),c=r(u),p=t(88),f=r(p),d=t(79),h=n(d),v=function(t){function e(){var o,n,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};i(this,e);var a=(0,f["default"])(r,{kind:l.AudioTrackKind[r.kind]||""}),u=o=s(this,t.call(this,a)),c=!1;if(h.IS_IE8)for(var p in e.prototype)"constructor"!==p&&(u[p]=e.prototype[p]);return Object.defineProperty(u,"enabled",{get:function(){return c},set:function(t){"boolean"==typeof t&&t!==c&&(c=t,this.trigger("enabledchange"))}}),a.enabled&&(u.enabled=a.enabled),u.loaded_=!0,n=u,s(o,n)}return a(e,t),e}(c["default"]);o["default"]=v},{74:74,76:76,79:79,88:88}],66:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}o.__esModule=!0;var s=t(79),a=r(s),l=t(95),u=n(l),c=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];i(this,t);var o=this;if(a.IS_IE8){o=u["default"].createElement("custom");for(var n in t.prototype)"constructor"!==n&&(o[n]=t.prototype[n])}o.trackElements_=[],Object.defineProperty(o,"length",{get:function(){return this.trackElements_.length}});for(var r=0,s=e.length;r0&&void 0!==arguments[0]?arguments[0]:{};i(this,e);var n=s(this,t.call(this)),r=void 0,a=n;if(u.IS_IE8){a=p["default"].createElement("custom");for(var l in e.prototype)"constructor"!==l&&(a[l]=e.prototype[l])}var c=new v["default"](o);if(a.kind=c.kind,a.src=c.src,a.srclang=c.language,a.label=c.label,a["default"]=c["default"],Object.defineProperty(a,"readyState",{get:function(){return r}}),Object.defineProperty(a,"track",{get:function(){return c}}),r=y,c.addEventListener("loadeddata",function(){r=A,a.trigger({type:"load",target:a})}),u.IS_IE8){var f;return f=a,s(n,f)}return n}return a(e,t),e}(d["default"]);m.prototype.allowedEvents_={load:"load"},m.NONE=y,m.LOADING=g,m.LOADED=A,m.ERROR=b,o["default"]=m},{42:42,73:73,79:79,95:95}],68:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}o.__esModule=!0;var s=t(79),a=r(s),l=t(95),u=n(l),c=function(){function t(e){i(this,t);var o=this;if(a.IS_IE8){o=u["default"].createElement("custom");for(var n in t.prototype)"constructor"!==n&&(o[n]=t.prototype[n])}if(t.prototype.setCues_.call(o,e),Object.defineProperty(o,"length",{get:function(){return this.length_}}),a.IS_IE8)return o}return t.prototype.setCues_=function(t){var e=this.length||0,o=0,n=t.length;this.cues_=t,this.length_=t.length;var r=function(t){""+t in this||Object.defineProperty(this,""+t,{get:function(){return this.cues_[t]}})};if(e0&&void 0!==arguments[0]?arguments[0]:[];i(this,e);var a=void 0;if(d.IS_IE8){a=v["default"].createElement("custom");for(var l in u["default"].prototype)"constructor"!==l&&(a[l]=u["default"].prototype[l]);for(var c in e.prototype)"constructor"!==c&&(a[c]=e.prototype[c])}return a=o=s(this,t.call(this,r,a)),n=a,s(o,n)}return a(e,t),e.prototype.addTrack_=function(e){t.prototype.addTrack_.call(this,e),e.addEventListener("modechange",p.bind(this,function(){this.trigger("change")}))},e.prototype.removeTrack_=function(t){for(var e=void 0,o=0,n=this.length;o select",id:"captions-background-color-%s",label:"Color",options:[_,S,C,T,k,O,E,x]},backgroundOpacity:{selector:".vjs-bg-opacity > select",id:"captions-background-opacity-%s",label:"Transparency",options:[B,P,M]},color:{selector:".vjs-fg-color > select",id:"captions-foreground-color-%s",label:"Color",options:[S,_,C,T,k,O,E,x]},edgeStyle:{selector:".vjs-edge-style > select",id:"%s",label:"Text Edge Style",options:[["none","None"],["raised","Raised"],["depressed","Depressed"],["uniform","Uniform"],["dropshadow","Dropshadow"]]},fontFamily:{selector:".vjs-font-family > select",id:"captions-font-family-%s",label:"Font Family",options:[["proportionalSansSerif","Proportional Sans-Serif"],["monospaceSansSerif","Monospace Sans-Serif"],["proportionalSerif","Proportional Serif"],["monospaceSerif","Monospace Serif"],["casual","Casual"],["script","Script"],["small-caps","Small Caps"]]},fontPercent:{selector:".vjs-font-percent > select",id:"captions-font-size-%s",label:"Font Size",options:[["0.50","50%"],["0.75","75%"],["1.00","100%"],["1.25","125%"],["1.50","150%"],["1.75","175%"],["2.00","200%"],["3.00","300%"],["4.00","400%"]],"default":2,parser:function(t){return"1.00"===t?null:Number(t)}},textOpacity:{selector:".vjs-text-opacity > select",id:"captions-foreground-opacity-%s",label:"Transparency",options:[B,P]},windowColor:{selector:".vjs-window-color > select",id:"captions-window-color-%s",label:"Color"},windowOpacity:{selector:".vjs-window-opacity > select",id:"captions-window-opacity-%s",label:"Transparency",options:[M,P,B]}};I.windowColor.options=I.backgroundColor.options;var R=function(t){function e(o,n){i(this,e);var r=s(this,t.call(this,o,n));return r.setDefaults(),r.hide(),r.updateDisplay=g.bind(r,r.updateDisplay),void 0===n.persistTextTrackSettings&&(r.options_.persistTextTrackSettings=r.options_.playerOptions.persistTextTrackSettings),r.on(r.$(".vjs-done-button"),"click",function(){r.saveSettings(),r.hide()}),r.on(r.$(".vjs-default-button"),"click",function(){r.setDefaults(),r.updateDisplay()}),b.each(I,function(t){r.on(r.$(t.selector),"change",r.updateDisplay)}),r.options_.persistTextTrackSettings&&r.restoreSettings(),r}return a(e,t),e.prototype.createElSelect_=function(t){var e=this,o=I[t],n=o.id.replace("%s",this.id_);return[(0,v.createEl)("label",{className:"vjs-label",textContent:o.label},{"for":n}),(0,v.createEl)("select",{id:n},void 0,o.options.map(function(t){return(0,v.createEl)("option",{textContent:e.localize(t[1]),value:t[0]})}))]},e.prototype.createElFgColor_=function(){var t=(0,v.createEl)("legend",{textContent:this.localize("Text")}),e=this.createElSelect_("color"),o=(0,v.createEl)("span",{className:"vjs-text-opacity vjs-opacity"},void 0,this.createElSelect_("textOpacity"));return(0,v.createEl)("fieldset",{className:"vjs-fg-color vjs-tracksetting"},void 0,[t].concat(e,o))},e.prototype.createElBgColor_=function(){var t=(0,v.createEl)("legend",{textContent:this.localize("Background")}),e=this.createElSelect_("backgroundColor"),o=(0,v.createEl)("span",{className:"vjs-bg-opacity vjs-opacity"},void 0,this.createElSelect_("backgroundOpacity"));return(0,v.createEl)("fieldset",{className:"vjs-bg-color vjs-tracksetting"},void 0,[t].concat(e,o))},e.prototype.createElWinColor_=function(){var t=(0,v.createEl)("legend",{textContent:this.localize("Window")}),e=this.createElSelect_("windowColor"),o=(0,v.createEl)("span",{className:"vjs-window-opacity vjs-opacity"},void 0,this.createElSelect_("windowOpacity"));return(0,v.createEl)("fieldset",{className:"vjs-window-color vjs-tracksetting"},void 0,[t].concat(e,o))},e.prototype.createElColors_=function(){return(0,v.createEl)("div",{className:"vjs-tracksettings-colors"},void 0,[this.createElFgColor_(),this.createElBgColor_(),this.createElWinColor_()]); +},e.prototype.createElFont_=function(){var t=(0,v.createEl)("div",{className:"vjs-font-percent vjs-tracksetting"},void 0,this.createElSelect_("fontPercent")),e=(0,v.createEl)("div",{className:"vjs-edge-style vjs-tracksetting"},void 0,this.createElSelect_("edgeStyle")),o=(0,v.createEl)("div",{className:"vjs-font-family vjs-tracksetting"},void 0,this.createElSelect_("fontFamily"));return(0,v.createEl)("div",{className:"vjs-tracksettings-font"},void 0,[t,e,o])},e.prototype.createElControls_=function(){var t=(0,v.createEl)("button",{className:"vjs-default-button",textContent:this.localize("Defaults")}),e=(0,v.createEl)("button",{className:"vjs-done-button",textContent:"Done"});return(0,v.createEl)("div",{className:"vjs-tracksettings-controls"},void 0,[t,e])},e.prototype.createEl=function(){var t=(0,v.createEl)("div",{className:"vjs-tracksettings"},void 0,[this.createElColors_(),this.createElFont_(),this.createElControls_()]),e=(0,v.createEl)("div",{className:"vjs-control-text",id:"TTsettingsDialogLabel-"+this.id_,textContent:"Caption Settings Dialog"},{"aria-level":"1",role:"heading"}),o=(0,v.createEl)("div",{className:"vjs-control-text",id:"TTsettingsDialogDescription-"+this.id_,textContent:"Beginning of dialog window. Escape will cancel and close the window."}),n=(0,v.createEl)("div",void 0,{role:"document"},[e,o,t]);return(0,v.createEl)("div",{className:"vjs-caption-settings vjs-modal-overlay",tabIndex:-1},{role:"dialog","aria-labelledby":e.id,"aria-describedby":o.id},n)},e.prototype.getValues=function(){var t=this;return b.reduce(I,function(e,o,n){var r=u(t.$(o.selector),o.parser);return void 0!==r&&(e[n]=r),e},{})},e.prototype.setValues=function(t){var e=this;b.each(I,function(o,n){c(e.$(o.selector),t[n],o.parser)})},e.prototype.setDefaults=function(){var t=this;b.each(I,function(e){var o=e.hasOwnProperty("default")?e["default"]:0;t.$(e.selector).selectedIndex=o})},e.prototype.restoreSettings=function(){var t=void 0;try{t=JSON.parse(f["default"].localStorage.getItem(w))}catch(e){j["default"].warn(e)}t&&this.setValues(t)},e.prototype.saveSettings=function(){if(this.options_.persistTextTrackSettings){var t=this.getValues();try{Object.keys(t).length?f["default"].localStorage.setItem(w,JSON.stringify(t)):f["default"].localStorage.removeItem(w)}catch(e){j["default"].warn(e)}}},e.prototype.updateDisplay=function(){var t=this.player_.getChild("textTrackDisplay");t&&t.updateDisplay()},e}(h["default"]);h["default"].registerComponent("TextTrackSettings",R),o["default"]=R},{5:5,82:82,84:84,87:87,89:89,96:96}],73:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(68),u=r(l),c=t(84),p=n(c),f=t(74),d=t(87),h=r(d),v=t(96),y=r(v),g=t(76),A=r(g),b=t(93),m=t(150),j=r(m),w=t(88),_=r(w),k=t(79),x=n(k),T=function(t,e){var o=new y["default"].WebVTT.Parser(y["default"],y["default"].vttjs,y["default"].WebVTT.StringDecoder()),n=[];o.oncue=function(t){e.addCue(t)},o.onparsingerror=function(t){n.push(t)},o.onflush=function(){e.trigger({type:"loadeddata",target:e})},o.parse(t),n.length>0&&(y["default"].console&&y["default"].console.groupCollapsed&&y["default"].console.groupCollapsed("Text Track parsing errors for "+e.src),n.forEach(function(t){return h["default"].error(t)}),y["default"].console&&y["default"].console.groupEnd&&y["default"].console.groupEnd()),o.flush()},E=function(t,e){var o={uri:t},n=(0,b.isCrossOrigin)(t);n&&(o.cors=n),(0,j["default"])(o,p.bind(this,function(t,o,n){return t?h["default"].error(t,o):(e.loaded_=!0,void("function"!=typeof y["default"].WebVTT?e.tech_&&!function(){var t=function(){return T(n,e)};e.tech_.on("vttjsloaded",t),e.tech_.on("vttjserror",function(){h["default"].error("vttjs failed to load, stopping trying to process "+e.src),e.tech_.off("vttjsloaded",t)})}():T(n,e)))}))},C=function(t){function e(){var o,n,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(i(this,e),!r.tech)throw new Error("A tech was not provided.");var a=(0,_["default"])(r,{kind:f.TextTrackKind[r.kind]||"subtitles",language:r.language||r.srclang||""}),l=f.TextTrackMode[a.mode]||"disabled",c=a["default"];"metadata"!==a.kind&&"chapters"!==a.kind||(l="hidden");var d=o=s(this,t.call(this,a));if(d.tech_=a.tech,x.IS_IE8)for(var h in e.prototype)"constructor"!==h&&(d[h]=e.prototype[h]);d.cues_=[],d.activeCues_=[];var v=new u["default"](d.cues_),y=new u["default"](d.activeCues_),g=!1,A=p.bind(d,function(){this.activeCues,g&&(this.trigger("cuechange"),g=!1)});return"disabled"!==l&&d.tech_.on("timeupdate",A),Object.defineProperty(d,"default",{get:function(){return c},set:function(){}}),Object.defineProperty(d,"mode",{get:function(){return l},set:function(t){f.TextTrackMode[t]&&(l=t,"showing"===l&&this.tech_.on("timeupdate",A),this.trigger("modechange"))}}),Object.defineProperty(d,"cues",{get:function(){return this.loaded_?v:null},set:function(){}}),Object.defineProperty(d,"activeCues",{get:function(){if(!this.loaded_)return null;if(0===this.cues.length)return y;for(var t=this.tech_.currentTime(),e=[],o=0,n=this.cues.length;o=t?e.push(r):r.startTime===r.endTime&&r.startTime<=t&&r.startTime+.5>=t&&e.push(r)}if(g=!1,e.length!==this.activeCues_.length)g=!0;else for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:[],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;i(this,e);var a=s(this,t.call(this));if(!r&&(r=a,p.IS_IE8)){r=d["default"].createElement("custom");for(var l in e.prototype)"constructor"!==l&&(r[l]=e.prototype[l])}r.tracks_=[],Object.defineProperty(r,"length",{get:function(){return this.tracks_.length}});for(var u=0;u0&&void 0!==arguments[0]?arguments[0]:{};i(this,e);var r=s(this,t.call(this)),a=r;if(u.IS_IE8){a=p["default"].createElement("custom");for(var l in e.prototype)"constructor"!==l&&(a[l]=e.prototype[l])}var c={id:n.id||"vjs_track_"+d.newGUID(),kind:n.kind||"",label:n.label||"",language:n.language||""},f=function(t){Object.defineProperty(a,t,{get:function(){return c[t]},set:function(){}})};for(var h in c)f(h);return o=a,s(r,o)}return a(e,t),e}(v["default"]);o["default"]=y},{42:42,79:79,86:86,95:95}],77:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(75),u=r(l),c=t(79),p=n(c),f=t(95),d=r(f),h=function(t,e){for(var o=0;o0&&void 0!==arguments[0]?arguments[0]:[];i(this,e);for(var a=void 0,l=r.length-1;l>=0;l--)if(r[l].selected){h(r,r[l]);break}if(p.IS_IE8){a=d["default"].createElement("custom");for(var c in u["default"].prototype)"constructor"!==c&&(a[c]=u["default"].prototype[c]);for(var f in e.prototype)"constructor"!==f&&(a[f]=e.prototype[f])}return a=o=s(this,t.call(this,r,a)),a.changing_=!1,Object.defineProperty(a,"selectedIndex",{get:function(){for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:{};i(this,e);var a=(0,f["default"])(r,{kind:l.VideoTrackKind[r.kind]||""}),u=o=s(this,t.call(this,a)),c=!1;if(h.IS_IE8)for(var p in e.prototype)"constructor"!==p&&(u[p]=e.prototype[p]);return Object.defineProperty(u,"selected",{get:function(){return c},set:function(t){"boolean"==typeof t&&t!==c&&(c=t,this.trigger("selectedchange"))}}),a.selected&&(u.selected=a.selected),n=u,s(o,n)}return a(e,t),e}(c["default"]);o["default"]=v},{74:74,76:76,79:79,88:88}],79:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0,o.BACKGROUND_SIZE_SUPPORTED=o.TOUCH_ENABLED=o.IE_VERSION=o.IS_IE8=o.IS_CHROME=o.IS_EDGE=o.IS_FIREFOX=o.IS_NATIVE_ANDROID=o.IS_OLD_ANDROID=o.ANDROID_VERSION=o.IS_ANDROID=o.IOS_VERSION=o.IS_IOS=o.IS_IPOD=o.IS_IPHONE=o.IS_IPAD=void 0;var r=t(95),i=n(r),s=t(96),a=n(s),l=a["default"].navigator&&a["default"].navigator.userAgent||"",u=/AppleWebKit\/([\d.]+)/i.exec(l),c=u?parseFloat(u.pop()):null,p=o.IS_IPAD=/iPad/i.test(l),f=o.IS_IPHONE=/iPhone/i.test(l)&&!p,d=o.IS_IPOD=/iPod/i.test(l),h=(o.IS_IOS=f||p||d,o.IOS_VERSION=function(){var t=l.match(/OS (\d+)_/i);return t&&t[1]?t[1]:null}(),o.IS_ANDROID=/Android/i.test(l)),v=o.ANDROID_VERSION=function(){var t=l.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i);if(!t)return null;var e=t[1]&&parseFloat(t[1]),o=t[2]&&parseFloat(t[2]);return e&&o?parseFloat(t[1]+"."+t[2]):e?e:null}(),y=(o.IS_OLD_ANDROID=h&&/webkit/i.test(l)&&v<2.3,o.IS_NATIVE_ANDROID=h&&v<5&&c<537,o.IS_FIREFOX=/Firefox/i.test(l),o.IS_EDGE=/Edge/i.test(l));o.IS_CHROME=!y&&/Chrome/i.test(l),o.IS_IE8=/MSIE\s8\.0/.test(l),o.IE_VERSION=function(t){return t&&parseFloat(t[1])}(/MSIE\s(\d+)\.\d/.exec(l)),o.TOUCH_ENABLED=!!("ontouchstart"in a["default"]||a["default"].DocumentTouch&&i["default"]instanceof a["default"].DocumentTouch),o.BACKGROUND_SIZE_SUPPORTED="backgroundSize"in i["default"].createElement("video").style},{95:95,96:96}],80:[function(t,e,o){"use strict";function n(t,e){var o=0,n=void 0,i=void 0;if(!e)return 0;t&&t.length||(t=(0,r.createTimeRange)(0,0));for(var s=0;se&&(i=e),o+=i-n;return o/e}o.__esModule=!0,o.bufferedPercent=n;var r=t(91)},{91:91}],81:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!t||!e)return"";if("function"==typeof s["default"].getComputedStyle){var o=s["default"].getComputedStyle(t);return o?o[e]:""}return t.currentStyle[e]||""}o.__esModule=!0,o["default"]=r;var i=t(96),s=n(i)},{96:96}],82:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){return t.raw=e,t}function s(t){return"string"==typeof t&&/\S/.test(t)}function a(t){if(/\s/.test(t))throw new Error("class has illegal whitespace characters")}function l(t){return new RegExp("(^|\\s)"+t+"($|\\s)")}function u(t){return!!t&&"object"===("undefined"==typeof t?"undefined":D(t))&&1===t.nodeType}function c(t){return function(e,o){if(!s(e))return L["default"][t](null);s(o)&&(o=L["default"].querySelector(o));var n=u(o)?o:L["default"];return n[t]&&n[t](e)}}function p(t){return 0===t.indexOf("#")&&(t=t.slice(1)),L["default"].getElementById(t)}function f(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"div",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments[3],r=L["default"].createElement(t);return Object.getOwnPropertyNames(e).forEach(function(t){var o=e[t];t.indexOf("aria-")!==-1||"role"===t||"type"===t?(U["default"].warn((0,W["default"])(N,t,o)),r.setAttribute(t,o)):"textContent"===t?d(r,o):r[t]=o}),Object.getOwnPropertyNames(o).forEach(function(t){r.setAttribute(t,o[t])}),n&&I(r,n),r}function d(t,e){return"undefined"==typeof t.textContent?t.innerText=e:t.textContent=e,t}function h(t,e){e.firstChild?e.insertBefore(t,e.firstChild):e.appendChild(t)}function v(t){var e=t[J];return e||(e=t[J]=V.newGUID()),X[e]||(X[e]={}),X[e]}function y(t){var e=t[J];return!!e&&!!Object.getOwnPropertyNames(X[e]).length}function g(t){var e=t[J];if(e){delete X[e];try{delete t[J]}catch(o){t.removeAttribute?t.removeAttribute(J):t[J]=null}}}function A(t,e){return a(e),t.classList?t.classList.contains(e):l(e).test(t.className)}function b(t,e){return t.classList?t.classList.add(e):A(t,e)||(t.className=(t.className+" "+e).trim()),t}function m(t,e){return t.classList?t.classList.remove(e):(a(e),t.className=t.className.split(/\s+/).filter(function(t){return t!==e}).join(" ")),t}function j(t,e,o){var n=A(t,e);if("function"==typeof o&&(o=o(t,e)),"boolean"!=typeof o&&(o=!n),o!==n)return o?b(t,e):m(t,e),t}function w(t,e){Object.getOwnPropertyNames(e).forEach(function(o){var n=e[o];null===n||"undefined"==typeof n||n===!1?t.removeAttribute(o):t.setAttribute(o,n===!0?"":n)})}function _(t){var e={},o=",autoplay,controls,loop,muted,default,";if(t&&t.attributes&&t.attributes.length>0)for(var n=t.attributes,r=n.length-1;r>=0;r--){var i=n[r].name,s=n[r].value;"boolean"!=typeof t[i]&&o.indexOf(","+i+",")===-1||(s=null!==s),e[i]=s}return e}function k(t,e){return t.getAttribute(e)}function x(t,e,o){t.setAttribute(e,o)}function T(t,e){t.removeAttribute(e)}function E(){L["default"].body.focus(),L["default"].onselectstart=function(){return!1}}function C(){L["default"].onselectstart=function(){return!0}}function S(t){var e=void 0;if(t.getBoundingClientRect&&t.parentNode&&(e=t.getBoundingClientRect()),!e)return{left:0,top:0};var o=L["default"].documentElement,n=L["default"].body,r=o.clientLeft||n.clientLeft||0,i=Q["default"].pageXOffset||n.scrollLeft,s=e.left+i-r,a=o.clientTop||n.clientTop||0,l=Q["default"].pageYOffset||n.scrollTop,u=e.top+l-a;return{left:Math.round(s),top:Math.round(u)}}function O(t,e){var o={},n=S(t),r=t.offsetWidth,i=t.offsetHeight,s=n.top,a=n.left,l=e.pageY,u=e.pageX;return e.changedTouches&&(u=e.changedTouches[0].pageX,l=e.changedTouches[0].pageY),o.y=Math.max(0,Math.min(1,(s-l+i)/i)),o.x=Math.max(0,Math.min(1,(u-a)/r)),o}function B(t){return!!t&&"object"===("undefined"==typeof t?"undefined":D(t))&&3===t.nodeType}function P(t){for(;t.firstChild;)t.removeChild(t.firstChild);return t}function M(t){return"function"==typeof t&&(t=t()),(Array.isArray(t)?t:[t]).map(function(t){return"function"==typeof t&&(t=t()),u(t)||B(t)?t:"string"==typeof t&&/\S/.test(t)?L["default"].createTextNode(t):void 0}).filter(function(t){return t})}function I(t,e){return M(e).forEach(function(e){return t.appendChild(e)}),t}function R(t,e){return I(P(t),e)}o.__esModule=!0,o.$$=o.$=void 0;var D="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},N=i(["Setting attributes in the second argument of createEl()\n has been deprecated. Use the third argument instead.\n createEl(type, properties, attributes). Attempting to set "," to ","."],["Setting attributes in the second argument of createEl()\n has been deprecated. Use the third argument instead.\n createEl(type, properties, attributes). Attempting to set "," to ","."]);o.isEl=u,o.getEl=p,o.createEl=f,o.textContent=d,o.insertElFirst=h,o.getElData=v,o.hasElData=y,o.removeElData=g,o.hasElClass=A,o.addElClass=b,o.removeElClass=m,o.toggleElClass=j,o.setElAttributes=w,o.getElAttributes=_,o.getAttribute=k,o.setAttribute=x,o.removeAttribute=T,o.blockTextSelection=E,o.unblockTextSelection=C,o.findElPosition=S,o.getPointerPosition=O,o.isTextNode=B,o.emptyEl=P,o.normalizeContent=M,o.appendContent=I,o.insertContent=R;var F=t(95),L=r(F),z=t(96),Q=r(z),H=t(86),V=n(H),Y=t(87),U=r(Y),G=t(149),W=r(G),X={},J="vdata"+(new Date).getTime();o.$=c("querySelector"),o.$$=c("querySelectorAll")},{149:149,86:86,87:87,95:95,96:96}],83:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t,e){var o=d.getElData(t);0===o.handlers[e].length&&(delete o.handlers[e],t.removeEventListener?t.removeEventListener(e,o.dispatcher,!1):t.detachEvent&&t.detachEvent("on"+e,o.dispatcher)),Object.getOwnPropertyNames(o.handlers).length<=0&&(delete o.handlers,delete o.dispatcher,delete o.disabled),0===Object.getOwnPropertyNames(o).length&&d.removeElData(t)}function s(t,e,o,n){o.forEach(function(o){t(e,o,n)})}function a(t){function e(){return!0}function o(){return!1}return t&&t.isPropagationStopped||!function(){var n=t||b["default"].event;t={};for(var r in n)"layerX"!==r&&"layerY"!==r&&"keyLocation"!==r&&"webkitMovementX"!==r&&"webkitMovementY"!==r&&("returnValue"===r&&n.preventDefault||(t[r]=n[r]));if(t.target||(t.target=t.srcElement||j["default"]),t.relatedTarget||(t.relatedTarget=t.fromElement===t.target?t.toElement:t.fromElement),t.preventDefault=function(){n.preventDefault&&n.preventDefault(),t.returnValue=!1,n.returnValue=!1,t.defaultPrevented=!0},t.defaultPrevented=!1,t.stopPropagation=function(){n.stopPropagation&&n.stopPropagation(),t.cancelBubble=!0,n.cancelBubble=!0,t.isPropagationStopped=e},t.isPropagationStopped=o,t.stopImmediatePropagation=function(){n.stopImmediatePropagation&&n.stopImmediatePropagation(),t.isImmediatePropagationStopped=e,t.stopPropagation()},t.isImmediatePropagationStopped=o,null!==t.clientX&&void 0!==t.clientX){var i=j["default"].documentElement,s=j["default"].body;t.pageX=t.clientX+(i&&i.scrollLeft||s&&s.scrollLeft||0)-(i&&i.clientLeft||s&&s.clientLeft||0),t.pageY=t.clientY+(i&&i.scrollTop||s&&s.scrollTop||0)-(i&&i.clientTop||s&&s.clientTop||0)}t.which=t.charCode||t.keyCode,null!==t.button&&void 0!==t.button&&(t.button=1&t.button?0:4&t.button?1:2&t.button?2:0)}(),t}function l(t,e,o){if(Array.isArray(e))return s(l,t,e,o);var n=d.getElData(t);n.handlers||(n.handlers={}),n.handlers[e]||(n.handlers[e]=[]),o.guid||(o.guid=v.newGUID()),n.handlers[e].push(o),n.dispatcher||(n.disabled=!1,n.dispatcher=function(e,o){if(!n.disabled){e=a(e);var r=n.handlers[e.type];if(r)for(var i=r.slice(0),s=0,l=i.length;s1&&void 0!==arguments[1]?arguments[1]:t;t=t<0?0:t;var o=Math.floor(t%60),n=Math.floor(t/60%60),r=Math.floor(t/3600),i=Math.floor(e/60%60),s=Math.floor(e/3600);return(isNaN(t)||t===1/0)&&(r=n=o="-"),r=r>0||s>0?r+":":"",n=((r||i>=10)&&n<10?"0"+n:n)+":",o=o<10?"0"+o:o,r+n+o}o.__esModule=!0,o["default"]=n},{}],86:[function(t,e,o){"use strict";function n(){return r++}o.__esModule=!0,o.newGUID=n;var r=1},{}],87:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0,o.logByType=void 0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=t(96),s=n(i),a=t(79),l=void 0,u=o.logByType=function(t,e){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:!!a.IE_VERSION&&a.IE_VERSION<11;"log"!==t&&e.unshift(t.toUpperCase()+":"),l.history.push(e),e.unshift("VIDEOJS:");var n=s["default"].console&&s["default"].console[t];n&&(o&&(e=e.map(function(t){if(t&&"object"===("undefined"==typeof t?"undefined":r(t))||Array.isArray(t))try{return JSON.stringify(t)}catch(e){return String(t)}return String(t)}).join(" ")),n.apply?n[Array.isArray(e)?"apply":"call"](s["default"].console,e):n(e))};l=function(){for(var t=arguments.length,e=Array(t),o=0;o2&&void 0!==arguments[2]?arguments[2]:0;return Object.keys(t).reduce(function(o,n){return e(o,t[n],n)},o)}o.__esModule=!0,o.each=n,o.reduce=r},{}],90:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0,o.setTextContent=o.createStyleElement=void 0;var r=t(95),i=n(r);o.createStyleElement=function(t){var e=i["default"].createElement("style");return e.className=t,e},o.setTextContent=function(t,e){t.styleSheet?t.styleSheet.cssText=e:t.textContent=e}},{95:95}],91:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e,o){if(e<0||e>o)throw new Error("Failed to execute '"+t+"' on 'TimeRanges': The index provided ("+e+") is greater than or equal to the maximum bound ("+o+").")}function i(t,e,o,n){return void 0===n&&(u["default"].warn("DEPRECATED: Function '"+t+"' on 'TimeRanges' called without an index argument."),n=0),r(t,n,o.length-1),o[n][e]}function s(t){return void 0===t||0===t.length?{length:0,start:function(){throw new Error("This TimeRanges object is empty")},end:function(){throw new Error("This TimeRanges object is empty")}}:{length:t.length,start:i.bind(null,"start",0,t),end:i.bind(null,"end",1,t)}}function a(t,e){return Array.isArray(t)?s(t):void 0===t||void 0===e?s():s([[t,e]])}o.__esModule=!0,o.createTimeRange=void 0,o.createTimeRanges=a;var l=t(87),u=n(l);o.createTimeRange=a},{87:87}],92:[function(t,e,o){"use strict";function n(t){return"string"!=typeof t?t:t.charAt(0).toUpperCase()+t.slice(1)}o.__esModule=!0,o["default"]=n},{}],93:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0,o.isCrossOrigin=o.getFileExtension=o.getAbsoluteURL=o.parseUrl=void 0;var r=t(95),i=n(r),s=t(96),a=n(s),l=o.parseUrl=function(t){var e=["protocol","hostname","port","pathname","search","hash","host"],o=i["default"].createElement("a");o.href=t;var n=""===o.host&&"file:"!==o.protocol,r=void 0;n&&(r=i["default"].createElement("div"),r.innerHTML='',o=r.firstChild,r.setAttribute("style","display:none; position:absolute;"),i["default"].body.appendChild(r));for(var s={},a=0;ax',t=e.firstChild.href}return t},o.getFileExtension=function(t){if("string"==typeof t){var e=/^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/i,o=e.exec(t);if(o)return o.pop().toLowerCase()}return""},o.isCrossOrigin=function(t){var e=a["default"].location,o=l(t),n=":"===o.protocol?e.protocol:o.protocol,r=n+o.host!==e.protocol+e.host;return r}},{95:95,96:96}],94:[function(e,o,n){"use strict";function r(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function s(t,e,o){var n=void 0;if(e=e||{},"string"==typeof t){if(0===t.indexOf("#")&&(t=t.slice(1)),s.getPlayers()[t])return e&&z["default"].warn('Player "'+t+'" is already initialised. Options will not be applied.'),o&&s.getPlayers()[t].ready(o),s.getPlayers()[t];n=H.getEl(t)}else n=t;if(!n||!n.nodeName)throw new TypeError("The element or ID supplied is not valid. (videojs)");if(n.player||_["default"].players[n.playerId])return n.player||_["default"].players[n.playerId];s.hooks("beforesetup").forEach(function(t){var o=t(n,(0,E["default"])(e));return!o||"object"!==("undefined"==typeof o?"undefined":a(o))||Array.isArray(o)?void s.log.error("please return an object in beforesetup hooks"):void(e=(0,E["default"])(e,o))});var r=new _["default"](n,e,o);return s.hooks("setup").forEach(function(t){ +return t(r)}),r}n.__esModule=!0;var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l=e(96),u=i(l),c=e(95),p=i(c),f=e(56),d=r(f),h=e(90),v=r(h),y=e(5),g=i(y),A=e(42),b=i(A),m=e(83),j=r(m),w=e(51),_=i(w),k=e(52),x=i(k),T=e(88),E=i(T),C=e(84),S=r(C),O=e(73),B=i(O),P=e(65),M=i(P),I=e(78),R=i(I),D=e(91),N=e(85),F=i(N),L=e(87),z=i(L),Q=e(82),H=r(Q),V=e(79),Y=r(V),U=e(93),G=r(U),W=e(81),X=i(W),J=e(43),K=i(J),Z=e(134),q=i(Z),$=e(150),tt=i($),et=e(63),ot=i(et);if("undefined"==typeof HTMLVideoElement&&u["default"].document&&u["default"].document.createElement&&(p["default"].createElement("video"),p["default"].createElement("audio"),p["default"].createElement("track")),s.hooks_={},s.hooks=function(t,e){return s.hooks_[t]=s.hooks_[t]||[],e&&(s.hooks_[t]=s.hooks_[t].concat(e)),s.hooks_[t]},s.hook=function(t,e){s.hooks(t,e)},s.removeHook=function(t,e){var o=s.hooks(t).indexOf(e);return!(o<=-1)&&(s.hooks_[t]=s.hooks_[t].slice(),s.hooks_[t].splice(o,1),!0)},u["default"].VIDEOJS_NO_DYNAMIC_STYLE!==!0){var nt=H.$(".vjs-styles-defaults");if(!nt){nt=v.createStyleElement("vjs-styles-defaults");var rt=H.$("head");rt&&rt.insertBefore(nt,rt.firstChild),v.setTextContent(nt,"\n .video-js {\n width: 300px;\n height: 150px;\n }\n\n .vjs-fluid {\n padding-top: 56.25%\n }\n ")}}d.autoSetupTimeout(1,s),s.VERSION="5.13.1",s.options=_["default"].prototype.options_,s.getPlayers=function(){return _["default"].players},s.players=_["default"].players,s.getComponent=g["default"].getComponent,s.registerComponent=function(t,e){ot["default"].isTech(e)&&z["default"].warn("The "+t+" tech was registered as a component. It should instead be registered using videojs.registerTech(name, tech)"),g["default"].registerComponent.call(g["default"],t,e)},s.getTech=ot["default"].getTech,s.registerTech=ot["default"].registerTech,s.browser=Y,s.TOUCH_ENABLED=Y.TOUCH_ENABLED,s.extend=K["default"],s.mergeOptions=E["default"],s.bind=S.bind,s.plugin=x["default"],s.addLanguage=function(t,e){var o;return t=(""+t).toLowerCase(),(0,q["default"])(s.options.languages,(o={},o[t]=e,o))[t]},s.log=z["default"],s.createTimeRange=s.createTimeRanges=D.createTimeRanges,s.formatTime=F["default"],s.parseUrl=G.parseUrl,s.isCrossOrigin=G.isCrossOrigin,s.EventTarget=b["default"],s.on=j.on,s.one=j.one,s.off=j.off,s.trigger=j.trigger,s.xhr=tt["default"],s.TextTrack=B["default"],s.AudioTrack=M["default"],s.VideoTrack=R["default"],s.isEl=H.isEl,s.isTextNode=H.isTextNode,s.createEl=H.createEl,s.hasClass=H.hasElClass,s.addClass=H.addElClass,s.removeClass=H.removeElClass,s.toggleClass=H.toggleElClass,s.setAttributes=H.setElAttributes,s.getAttributes=H.getElAttributes,s.emptyEl=H.emptyEl,s.appendContent=H.appendContent,s.insertContent=H.insertContent,s.computedStyle=X["default"],"function"==typeof t&&t.amd?t("videojs",[],function(){return s}):"object"===("undefined"==typeof n?"undefined":a(n))&&"object"===("undefined"==typeof o?"undefined":a(o))&&(o.exports=s),n["default"]=s},{134:134,150:150,42:42,43:43,5:5,51:51,52:52,56:56,63:63,65:65,73:73,78:78,79:79,81:81,82:82,83:83,84:84,85:85,87:87,88:88,90:90,91:91,93:93,95:95,96:96}],95:[function(t,e,o){(function(o){var n="undefined"!=typeof o?o:"undefined"!=typeof window?window:{},r=t(97);if("undefined"!=typeof document)e.exports=document;else{var i=n["__GLOBAL_DOCUMENT_CACHE@4"];i||(i=n["__GLOBAL_DOCUMENT_CACHE@4"]=r),e.exports=i}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{97:97}],96:[function(t,e,o){(function(t){"undefined"!=typeof window?e.exports=window:"undefined"!=typeof t?e.exports=t:"undefined"!=typeof self?e.exports=self:e.exports={}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],97:[function(t,e,o){},{}],98:[function(t,e,o){var n=t(114),r=n(Date,"now"),i=r||function(){return(new Date).getTime()};e.exports=i},{114:114}],99:[function(t,e,o){function n(t,e,o){function n(){g&&clearTimeout(g),d&&clearTimeout(d),b=0,d=g=A=void 0}function l(e,o){o&&clearTimeout(o),d=g=A=void 0,e&&(b=i(),h=t.apply(y,f),g||d||(f=y=void 0))}function u(){var t=e-(i()-v);t<=0||t>e?l(A,d):g=setTimeout(u,t)}function c(){l(j,g)}function p(){if(f=arguments,v=i(),y=this,A=j&&(g||!w),m===!1)var o=w&&!g;else{d||w||(b=v);var n=m-(v-b),r=n<=0||n>m;r?(d&&(d=clearTimeout(d)),b=v,h=t.apply(y,f)):d||(d=setTimeout(c,n))}return r&&g?g=clearTimeout(g):g||e===m||(g=setTimeout(u,e)),o&&(r=!0,h=t.apply(y,f)),!r||g||d||(f=y=void 0),h}var f,d,h,v,y,g,A,b=0,m=!1,j=!0;if("function"!=typeof t)throw new TypeError(s);if(e=e<0?0:+e||0,o===!0){var w=!0;j=!1}else r(o)&&(w=!!o.leading,m="maxWait"in o&&a(+o.maxWait||0,e),j="trailing"in o?!!o.trailing:j);return p.cancel=n,p}var r=t(127),i=t(98),s="Expected a function",a=Math.max;e.exports=n},{127:127,98:98}],100:[function(t,e,o){function n(t,e){if("function"!=typeof t)throw new TypeError(r);return e=i(void 0===e?t.length-1:+e||0,0),function(){for(var o=arguments,n=-1,r=i(o.length-e,0),s=Array(r);++n2?o[s-2]:void 0,l=s>2?o[2]:void 0,u=s>1?o[s-1]:void 0;for("function"==typeof a?(a=r(a,u,5),s-=2):(a="function"==typeof u?u:void 0,s-=a?1:0),l&&i(o[0],o[1],l)&&(a=s<3?void 0:a,s=1);++n-1&&t%1==0&&t-1&&t%1==0&&t<=r}var r=9007199254740991;e.exports=n},{}],120:[function(t,e,o){function n(t){return!!t&&"object"==typeof t}e.exports=n},{}],121:[function(t,e,o){function n(t){for(var e=u(t),o=e.length,n=o&&t.length,c=!!n&&a(n)&&(i(t)||r(t)||l(t)),f=-1,d=[];++f0,g=f.enumErrorProps&&(t===_||t instanceof Error),A=f.enumPrototypes&&a(t);++n2?arguments[2]:{},s=n(e);i&&(s=s.concat(Object.getOwnPropertySymbols(e))),r(s,function(n){c(t,n,e[n],o[n])})};p.supportsDescriptors=!!u,e.exports=p},{141:141,144:144}],141:[function(t,e,o){var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString;e.exports=function(t,e,o){if("[object Function]"!==r.call(e))throw new TypeError("iterator must be a function");var i=t.length;if(i===+i)for(var s=0;s0&&!n.call(t,0))for(var d=0;d0)for(var v=0;v=0&&"[object Function]"===n.call(t.callee)),o}},{}],146:[function(t,e,o){"use strict";var n=t(138),r=function(){if(!Object.assign)return!1;for(var t="abcdefghijklmnopqrst",e=t.split(""),o={},n=0;n0&&(h=setTimeout(function(){d=!0,u.abort("timeout");var t=new Error("XMLHttpRequest timeout");t.code="ETIMEDOUT",n(t)},t.timeout)),u.setRequestHeader)for(p in A)A.hasOwnProperty(p)&&u.setRequestHeader(p,A[p]);else if(t.headers&&!r(t.headers))throw new Error("Headers cannot be set on an XDomainRequest object");return"responseType"in t&&(u.responseType=t.responseType),"beforeSend"in t&&"function"==typeof t.beforeSend&&t.beforeSend(u),u.send(g),u}function l(){}var u=t(96),c=t(152),p=t(151),f=t(155),d=t(156);e.exports=s,s.XMLHttpRequest=u.XMLHttpRequest||l,s.XDomainRequest="withCredentials"in new s.XMLHttpRequest?s.XMLHttpRequest:u.XDomainRequest,n(["get","put","post","patch","head","delete"],function(t){s["delete"===t?"del":t]=function(e,o,n){return o=i(e,o,n),o.method=t.toUpperCase(),a(o)}})},{151:151,152:152,155:155,156:156,96:96}],151:[function(t,e,o){function n(t){var e=r.call(t);return"[object Function]"===e||"function"==typeof t&&"[object RegExp]"!==e||"undefined"!=typeof window&&(t===window.setTimeout||t===window.alert||t===window.confirm||t===window.prompt)}e.exports=n;var r=Object.prototype.toString},{}],152:[function(t,e,o){function n(t){var e=!1;return function(){if(!e)return e=!0,t.apply(this,arguments)}}e.exports=n,n.proto=n(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return n(this)},configurable:!0})})},{}],153:[function(t,e,o){function n(t,e,o){if(!a(e))throw new TypeError("iterator must be a function");arguments.length<3&&(o=this),"[object Array]"===l.call(t)?r(t,e,o):"string"==typeof t?i(t,e,o):s(t,e,o)}function r(t,e,o){for(var n=0,r=t.length;n100)throw new Error("Position must be between 0 and 100.");m=t,this.hasBeenReset=!0}})),Object.defineProperty(a,"positionAlign",r({},u,{get:function(){return j},set:function(t){var e=n(t);if(!e)throw new SyntaxError("An invalid or illegal string was specified.");j=e,this.hasBeenReset=!0}})),Object.defineProperty(a,"size",r({},u,{get:function(){return w},set:function(t){if(t<0||t>100)throw new Error("Size must be between 0 and 100.");w=t,this.hasBeenReset=!0}})),Object.defineProperty(a,"align",r({},u,{get:function(){return _},set:function(t){var e=n(t);if(!e)throw new SyntaxError("An invalid or illegal string was specified.");_=e,this.hasBeenReset=!0}})),a.displayState=void 0,l)return a}var s="auto",a={"":!0,lr:!0,rl:!0},l={start:!0,middle:!0,end:!0,left:!0,right:!0};i.prototype.getCueAsHTML=function(){return WebVTT.convertCueToDOMTree(window,this.text)},t.VTTCue=t.VTTCue||i,e.VTTCue=i}(this,this.vttjs||{}),function(t,e){function o(t){if("string"!=typeof t)return!1;var e=i[t.toLowerCase()];return!!e&&t.toLowerCase()}function n(t){return"number"==typeof t&&t>=0&&t<=100}function r(){var t=100,e=3,r=0,i=100,s=0,a=100,l="";Object.defineProperties(this,{width:{enumerable:!0,get:function(){return t},set:function(e){if(!n(e))throw new Error("Width must be between 0 and 100.");t=e}},lines:{enumerable:!0,get:function(){return e},set:function(t){if("number"!=typeof t)throw new TypeError("Lines must be set to a number.");e=t}},regionAnchorY:{enumerable:!0,get:function(){return i},set:function(t){if(!n(t))throw new Error("RegionAnchorX must be between 0 and 100.");i=t}},regionAnchorX:{enumerable:!0,get:function(){return r},set:function(t){if(!n(t))throw new Error("RegionAnchorY must be between 0 and 100.");r=t}},viewportAnchorY:{enumerable:!0,get:function(){return a},set:function(t){if(!n(t))throw new Error("ViewportAnchorY must be between 0 and 100.");a=t}},viewportAnchorX:{enumerable:!0,get:function(){return s},set:function(t){if(!n(t))throw new Error("ViewportAnchorX must be between 0 and 100.");s=t}},scroll:{enumerable:!0,get:function(){return l},set:function(t){var e=o(t);if(e===!1)throw new SyntaxError("An invalid or illegal string was specified.");l=e}}})}var i={"":!0,up:!0};t.VTTRegion=t.VTTRegion||r,e.VTTRegion=r}(this,this.vttjs||{}),function(t){function e(t,e){this.name="ParsingError",this.code=t.code,this.message=e||t.message}function o(t){function e(t,e,o,n){return 3600*(0|t)+60*(0|e)+(0|o)+(0|n)/1e3}var o=t.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);return o?o[3]?e(o[1],o[2],o[3].replace(":",""),o[4]):o[1]>59?e(o[1],o[2],0,o[4]):e(0,o[1],o[2],o[4]):null}function n(){this.values=h(null)}function r(t,e,o,n){var r=n?t.split(n):[t];for(var i in r)if("string"==typeof r[i]){var s=r[i].split(o);if(2===s.length){var a=s[0],l=s[1];e(a,l)}}}function i(t,i,s){function a(){var n=o(t);if(null===n)throw new e(e.Errors.BadTimeStamp,"Malformed timestamp: "+c);return t=t.replace(/^[^\sa-zA-Z-]+/,""),n}function l(t,e){var o=new n;r(t,function(t,e){switch(t){case"region":for(var n=s.length-1;n>=0;n--)if(s[n].id===e){o.set(t,s[n].region);break}break;case"vertical":o.alt(t,e,["rl","lr"]);break;case"line":var r=e.split(","),i=r[0];o.integer(t,i),o.percent(t,i)?o.set("snapToLines",!1):null,o.alt(t,i,["auto"]),2===r.length&&o.alt("lineAlign",r[1],["start","middle","end"]);break;case"position":r=e.split(","),o.percent(t,r[0]),2===r.length&&o.alt("positionAlign",r[1],["start","middle","end"]);break;case"size":o.percent(t,e);break;case"align":o.alt(t,e,["start","middle","end","left","right"])}},/:/,/\s/),e.region=o.get("region",null),e.vertical=o.get("vertical",""),e.line=o.get("line","auto"), +e.lineAlign=o.get("lineAlign","start"),e.snapToLines=o.get("snapToLines",!0),e.size=o.get("size",100),e.align=o.get("align","middle"),e.position=o.get("position",{start:0,left:0,middle:50,end:100,right:100},e.align),e.positionAlign=o.get("positionAlign",{start:"start",left:"start",middle:"middle",end:"end",right:"end"},e.align)}function u(){t=t.replace(/^\s+/,"")}var c=t;if(u(),i.startTime=a(),u(),"-->"!==t.substr(0,3))throw new e(e.Errors.BadTimeStamp,"Malformed time stamp (time stamps must be separated by '-->'): "+c);t=t.substr(3),u(),i.endTime=a(),u(),l(t,i)}function s(t,e){function n(){function t(t){return e=e.substr(t.length),t}if(!e)return null;var o=e.match(/^([^<]*)(<[^>]+>?)?/);return t(o[1]?o[1]:o[2])}function r(t){return v[t]}function i(t){for(;h=t.match(/&(amp|lt|gt|lrm|rlm|nbsp);/);)t=t.replace(h[0],r);return t}function s(t,e){return!A[e.localName]||A[e.localName]===t.localName}function a(e,o){var n=y[e];if(!n)return null;var r=t.document.createElement(n);r.localName=n;var i=g[e];return i&&o&&(r[i]=o.trim()),r}for(var l,u=t.document.createElement("div"),c=u,p=[];null!==(l=n());)if("<"!==l[0])c.appendChild(t.document.createTextNode(i(l)));else{if("/"===l[1]){p.length&&p[p.length-1]===l.substr(2).replace(">","")&&(p.pop(),c=c.parentNode);continue}var f,d=o(l.substr(1,l.length-2));if(d){f=t.document.createProcessingInstruction("timestamp",d),c.appendChild(f);continue}var h=l.match(/^<([^.\s\/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/);if(!h)continue;if(f=a(h[1],h[3]),!f)continue;if(!s(c,f))continue;h[2]&&(f.className=h[2].substr(1).replace("."," ")),p.push(h[1]),c.appendChild(f),c=f}return u}function a(t){function e(t,e){for(var o=e.childNodes.length-1;o>=0;o--)t.push(e.childNodes[o])}function o(t){if(!t||!t.length)return null;var n=t.pop(),r=n.textContent||n.innerText;if(r){var i=r.match(/^.*(\n|\r)/);return i?(t.length=0,i[0]):r}return"ruby"===n.tagName?o(t):n.childNodes?(e(t,n),o(t)):void 0}var n,r=[],i="";if(!t||!t.childNodes)return"ltr";for(e(r,t);i=o(r);)for(var s=0;s=0&&t.line<=100))return t.line;if(!t.track||!t.track.textTrackList||!t.track.textTrackList.mediaElement)return-1;for(var e=t.track,o=e.textTrackList,n=0,r=0;rl&&(r=new p(t),s=l),t=new p(i)}return r||i}var i=new p(e),s=e.cue,a=l(s),u=[];if(s.snapToLines){var c;switch(s.vertical){case"":u=["+y","-y"],c="height";break;case"rl":u=["+x","-x"],c="width";break;case"lr":u=["-x","+x"],c="width"}var f=i.lineHeight,d=f*Math.round(a),h=o[c]+f,v=u[0];Math.abs(d)>h&&(d=d<0?-1:1,d*=Math.ceil(h/f)*f),a<0&&(d+=""===s.vertical?o.height:o.width,u=u.reverse()),i.move(v,d)}else{var y=i.lineHeight/o.height*100;switch(s.lineAlign){case"middle":a-=y/2;break;case"end":a-=y}switch(s.vertical){case"":e.applyStyles({top:e.formatStyle(a,"%")});break;case"rl":e.applyStyles({left:e.formatStyle(a,"%")});break;case"lr":e.applyStyles({right:e.formatStyle(a,"%")})}u=["+y","-x","+x","-y"],i=new p(e)}var g=r(i,u);e.move(g.toCSSCompatValues(o))}function d(){}var h=Object.create||function(){function t(){}return function(e){if(1!==arguments.length)throw new Error("Object.create shim only accepts one parameter.");return t.prototype=e,new t}}();e.prototype=h(Error.prototype),e.prototype.constructor=e,e.Errors={BadSignature:{code:0,message:"Malformed WebVTT signature."},BadTimeStamp:{code:1,message:"Malformed time stamp."}},n.prototype={set:function(t,e){this.get(t)||""===e||(this.values[t]=e)},get:function(t,e,o){return o?this.has(t)?this.values[t]:e[o]:this.has(t)?this.values[t]:e},has:function(t){return t in this.values},alt:function(t,e,o){for(var n=0;n=0&&e<=100))&&(this.set(t,e),!0)}};var v={"&":"&","<":"<",">":">","‎":"‎","‏":"‏"," ":" "},y={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",v:"span",lang:"span"},g={v:"title",lang:"lang"},A={rt:"ruby"},b=[1470,1472,1475,1478,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1520,1521,1522,1523,1524,1544,1547,1549,1563,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1645,1646,1647,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1765,1766,1774,1775,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1807,1808,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1969,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2e3,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2036,2037,2042,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2074,2084,2088,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2142,2208,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,8207,64285,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64434,64435,64436,64437,64438,64439,64440,64441,64442,64443,64444,64445,64446,64447,64448,64449,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64606,64607,64608,64609,64610,64611,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65018,65019,65020,65136,65137,65138,65139,65140,65142,65143,65144,65145,65146,65147,65148,65149,65150,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,67584,67585,67586,67587,67588,67589,67592,67594,67595,67596,67597,67598,67599,67600,67601,67602,67603,67604,67605,67606,67607,67608,67609,67610,67611,67612,67613,67614,67615,67616,67617,67618,67619,67620,67621,67622,67623,67624,67625,67626,67627,67628,67629,67630,67631,67632,67633,67634,67635,67636,67637,67639,67640,67644,67647,67648,67649,67650,67651,67652,67653,67654,67655,67656,67657,67658,67659,67660,67661,67662,67663,67664,67665,67666,67667,67668,67669,67671,67672,67673,67674,67675,67676,67677,67678,67679,67840,67841,67842,67843,67844,67845,67846,67847,67848,67849,67850,67851,67852,67853,67854,67855,67856,67857,67858,67859,67860,67861,67862,67863,67864,67865,67866,67867,67872,67873,67874,67875,67876,67877,67878,67879,67880,67881,67882,67883,67884,67885,67886,67887,67888,67889,67890,67891,67892,67893,67894,67895,67896,67897,67903,67968,67969,67970,67971,67972,67973,67974,67975,67976,67977,67978,67979,67980,67981,67982,67983,67984,67985,67986,67987,67988,67989,67990,67991,67992,67993,67994,67995,67996,67997,67998,67999,68e3,68001,68002,68003,68004,68005,68006,68007,68008,68009,68010,68011,68012,68013,68014,68015,68016,68017,68018,68019,68020,68021,68022,68023,68030,68031,68096,68112,68113,68114,68115,68117,68118,68119,68121,68122,68123,68124,68125,68126,68127,68128,68129,68130,68131,68132,68133,68134,68135,68136,68137,68138,68139,68140,68141,68142,68143,68144,68145,68146,68147,68160,68161,68162,68163,68164,68165,68166,68167,68176,68177,68178,68179,68180,68181,68182,68183,68184,68192,68193,68194,68195,68196,68197,68198,68199,68200,68201,68202,68203,68204,68205,68206,68207,68208,68209,68210,68211,68212,68213,68214,68215,68216,68217,68218,68219,68220,68221,68222,68223,68352,68353,68354,68355,68356,68357,68358,68359,68360,68361,68362,68363,68364,68365,68366,68367,68368,68369,68370,68371,68372,68373,68374,68375,68376,68377,68378,68379,68380,68381,68382,68383,68384,68385,68386,68387,68388,68389,68390,68391,68392,68393,68394,68395,68396,68397,68398,68399,68400,68401,68402,68403,68404,68405,68416,68417,68418,68419,68420,68421,68422,68423,68424,68425,68426,68427,68428,68429,68430,68431,68432,68433,68434,68435,68436,68437,68440,68441,68442,68443,68444,68445,68446,68447,68448,68449,68450,68451,68452,68453,68454,68455,68456,68457,68458,68459,68460,68461,68462,68463,68464,68465,68466,68472,68473,68474,68475,68476,68477,68478,68479,68608,68609,68610,68611,68612,68613,68614,68615,68616,68617,68618,68619,68620,68621,68622,68623,68624,68625,68626,68627,68628,68629,68630,68631,68632,68633,68634,68635,68636,68637,68638,68639,68640,68641,68642,68643,68644,68645,68646,68647,68648,68649,68650,68651,68652,68653,68654,68655,68656,68657,68658,68659,68660,68661,68662,68663,68664,68665,68666,68667,68668,68669,68670,68671,68672,68673,68674,68675,68676,68677,68678,68679,68680,126464,126465,126466,126467,126469,126470,126471,126472,126473,126474,126475,126476,126477,126478,126479,126480,126481,126482,126483,126484,126485,126486,126487,126488,126489,126490,126491,126492,126493,126494,126495,126497,126498,126500,126503,126505,126506,126507,126508,126509,126510,126511,126512,126513,126514,126516,126517,126518,126519,126521,126523,126530,126535,126537,126539,126541,126542,126543,126545,126546,126548,126551,126553,126555,126557,126559,126561,126562,126564,126567,126568,126569,126570,126572,126573,126574,126575,126576,126577,126578,126580,126581,126582,126583,126585,126586,126587,126588,126590,126592,126593,126594,126595,126596,126597,126598,126599,126600,126601,126603,126604,126605,126606,126607,126608,126609,126610,126611,126612,126613,126614,126615,126616,126617,126618,126619,126625,126626,126627,126629,126630,126631,126632,126633,126635,126636,126637,126638,126639,126640,126641,126642,126643,126644,126645,126646,126647,126648,126649,126650,126651,1114109];u.prototype.applyStyles=function(t,e){e=e||this.div;for(var o in t)t.hasOwnProperty(o)&&(e.style[o]=t[o])},u.prototype.formatStyle=function(t,e){return 0===t?0:t+e},c.prototype=h(u.prototype),c.prototype.constructor=c,p.prototype.move=function(t,e){switch(e=void 0!==e?e:this.lineHeight,t){case"+x":this.left+=e,this.right+=e;break;case"-x":this.left-=e,this.right-=e;break;case"+y":this.top+=e,this.bottom+=e;break;case"-y":this.top-=e,this.bottom-=e}},p.prototype.overlaps=function(t){return this.leftt.left&&this.topt.top},p.prototype.overlapsAny=function(t){for(var e=0;e=t.top&&this.bottom<=t.bottom&&this.left>=t.left&&this.right<=t.right},p.prototype.overlapsOppositeAxis=function(t,e){switch(e){case"+x":return this.leftt.right;case"+y":return this.topt.bottom}},p.prototype.intersectPercentage=function(t){var e=Math.max(0,Math.min(this.right,t.right)-Math.max(this.left,t.left)),o=Math.max(0,Math.min(this.bottom,t.bottom)-Math.max(this.top,t.top)),n=e*o;return n/(this.height*this.width)},p.prototype.toCSSCompatValues=function(t){return{top:this.top-t.top,bottom:t.bottom-this.bottom,left:this.left-t.left,right:t.right-this.right,height:this.height,width:this.width}},p.getSimpleBoxPosition=function(t){var e=t.div?t.div.offsetHeight:t.tagName?t.offsetHeight:0,o=t.div?t.div.offsetWidth:t.tagName?t.offsetWidth:0,n=t.div?t.div.offsetTop:t.tagName?t.offsetTop:0;t=t.div?t.div.getBoundingClientRect():t.tagName?t.getBoundingClientRect():t;var r={left:t.left,right:t.right,top:t.top||n,height:t.height||e,bottom:t.bottom||n+(t.height||e),width:t.width||o};return r},d.StringDecoder=function(){return{decode:function(t){if(!t)return"";if("string"!=typeof t)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(t))}}},d.convertCueToDOMTree=function(t,e){return t&&e?s(t,e):null};var m=.05,j="sans-serif",w="1.5%";d.processCues=function(t,e,o){function n(t){for(var e=0;e")===-1){l.cue.id=u;continue}case"CUE":try{i(u,l.cue,l.regionList)}catch(f){l.reportOrThrowError(f),l.cue=null,l.state="BADCUE";continue}l.state="CUETEXT";continue;case"CUETEXT":var d=u.indexOf("-->")!==-1;if(!u||d&&(p=!0)){l.oncue&&l.oncue(l.cue),l.cue=null,l.state="ID";continue}l.cue.text&&(l.cue.text+="\n"),l.cue.text+=u;continue;case"BADCUE":u||(l.state="ID");continue}}}catch(f){l.reportOrThrowError(f),"CUETEXT"===l.state&&l.cue&&l.oncue&&l.oncue(l.cue),l.cue=null,l.state="INITIAL"===l.state?"BADWEBVTT":"BADCUE"}return this},flush:function(){var t=this;try{if(t.buffer+=t.decoder.decode(),(t.cue||"HEADER"===t.state)&&(t.buffer+="\n\n",t.parse()),"INITIAL"===t.state)throw new e(e.Errors.BadSignature)}catch(o){t.reportOrThrowError(o)}return t.onflush&&t.onflush(),this}},t.WebVTT=d}(this,this.vttjs||{}),function(t,e){"function"==typeof define&&define.amd?define([],e.bind(this,t,t.videojs)):"undefined"!=typeof module&&module.exports?module.exports=e(t,t.videojs):e(t,t.videojs)}(window,function(t,e){"use strict";t.videojs_hotkeys={version:"0.2.13"};var o=function(o){function n(t){return 32===t.which}function r(t){return 37===t.which}function i(t){return 39===t.which}function s(t){return 38===t.which}function a(t){return 40===t.which}function l(t){return 77===t.which}function u(t){return 70===t.which}var c=this,p=c.el(),f=document,d={volumeStep:.1,seekStep:5,enableMute:!0,enableVolumeScroll:!0,enableFullscreen:!0,enableNumbers:!0,enableJogStyle:!1,alwaysCaptureHotkeys:!1,playPauseKey:n,rewindKey:r,forwardKey:i,volumeUpKey:s,volumeDownKey:a,muteKey:l,fullscreenKey:u,customKeys:{}},h=1,v=2,y=3,g=4,A=5,b=6,m=7,j=e.mergeOptions||e.util.mergeOptions;o=j(d,o||{});var w=o.volumeStep,_=o.seekStep,k=o.enableMute,x=o.enableVolumeScroll,T=o.enableFullscreen,E=o.enableNumbers,C=o.enableJogStyle,S=o.alwaysCaptureHotkeys;p.hasAttribute("tabIndex")||p.setAttribute("tabIndex","-1"),S&&c.one("play",function(){p.focus()}),c.on("userinactive",function(){var t=function(){clearTimeout(e)},e=setTimeout(function(){c.off("useractive",t),f.activeElement.parentElement==p.querySelector(".vjs-control-bar")&&p.focus()},10);c.one("useractive",t)}),c.on("play",function(){var t=p.querySelector(".iframeblocker");t&&""===t.style.display&&(t.style.display="block",t.style.bottom="39px")});var O=function(t){var e,n=t.which,r=t.preventDefault;if(c.controls()){var i=f.activeElement;if(S||i==p||i==p.querySelector(".vjs-tech")||i==p.querySelector(".vjs-control-bar")||i==p.querySelector(".iframeblocker"))switch(M(t,c)){case h:r(),S&&t.stopPropagation(),c.paused()?c.play():c.pause();break;case v:r(),e=c.currentTime()-_,c.currentTime()<=_&&(e=0),c.currentTime(e);break;case y:r(),c.currentTime(c.currentTime()+_);break;case A:r(),C?(e=c.currentTime()-1,c.currentTime()<=1&&(e=0),c.currentTime(e)):c.volume(c.volume()-w);break;case g:r(),C?c.currentTime(c.currentTime()+1):c.volume(c.volume()+w);break;case b:k&&c.muted(!c.muted());break;case m:T&&(c.isFullscreen()?c.exitFullscreen():c.requestFullscreen());break;default:if((n>47&&n<59||n>95&&n<106)&&E){var s=48;n>95&&(s=96);var a=n-s;r(),c.currentTime(c.duration()*a*.1)}for(var l in o.customKeys){var u=o.customKeys[l];u&&u.key&&u.handler&&u.key(t)&&(r(),u.handler(c,o))}}}},B=function(t){if(c.controls()){var e=t.relatedTarget||t.toElement||f.activeElement;e!=p&&e!=p.querySelector(".vjs-tech")&&e!=p.querySelector(".iframeblocker")||T&&(c.isFullscreen()?c.exitFullscreen():c.requestFullscreen())}},P=function(e){if(c.controls()){var o=e.relatedTarget||e.toElement||f.activeElement;if((S||o==p||o==p.querySelector(".vjs-tech")||o==p.querySelector(".iframeblocker")||o==p.querySelector(".vjs-control-bar"))&&x){e=t.event||e;var n=Math.max(-1,Math.min(1,e.wheelDelta||-e.detail));e.preventDefault(),1==n?c.volume(c.volume()+w):n==-1&&c.volume(c.volume()-w)}}},M=function(t,e){return o.playPauseKey(t,e)?h:o.rewindKey(t,e)?v:o.forwardKey(t,e)?y:o.volumeUpKey(t,e)?g:o.volumeDownKey(t,e)?A:o.muteKey(t,e)?b:o.fullscreenKey(t,e)?m:void 0};return c.on("keydown",O),c.on("dblclick",B),c.on("mousewheel",P),c.on("DOMMouseScroll",P),this};e.plugin("hotkeys",o)}),function(t,e){"function"==typeof define&&define.amd?define(["video.js"],function(o){return t.Youtube=e(o)}):"object"==typeof module&&module.exports?module.exports=t.Youtube=e(require("video.js")):t.Youtube=e(t.videojs)}(this,function(t){"use strict";function e(){if(!r.apiLoaded){var t=document.createElement("script");t.src="https://www.youtube.com/iframe_api";var e=document.getElementsByTagName("script")[0];e.parentNode.insertBefore(t,e),r.apiLoaded=!0}}function o(){var t=".vjs-youtube .vjs-iframe-blocker { display: none; }.vjs-youtube.vjs-user-inactive .vjs-iframe-blocker { display: block; }.vjs-youtube .vjs-poster { background-size: cover; }.vjs-youtube-mobile .vjs-big-play-button { display: none; }",e=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",o.styleSheet?o.styleSheet.cssText=t:o.appendChild(document.createTextNode(t)),e.appendChild(o)}var n=t.getComponent("Tech"),r=t.extend(n,{apiLoaded:!1,constructor:function(t,e){n.call(this,t,e),this.setPoster(t.poster),this.setSrc(this.options_.source,!0),setTimeout(function(){this.el_.parentNode.className+=" vjs-youtube",r.isApiReady?(this.setSrc(this.options_.source,!0),this.initYTPlayer()):r.apiReadyQueue.push(this)}.bind(this))},dispose:function(){this.el_.parentNode.className=this.el_.parentNode.className.replace(" vjs-youtube","").replace(" vjs-youtube-mobile","")},createEl:function(){e(),o();var t=document.createElement("div");t.setAttribute("id",this.options_.techId),t.setAttribute("style","width:100%;height:100%;top:0;left:0;position:absolute");var n=document.createElement("div");if(n.appendChild(t),!i&&!this.options_.ytControls){var r=document.createElement("div");r.setAttribute("class","vjs-iframe-blocker"),r.setAttribute("style","position:absolute;top:0;left:0;width:100%;height:100%"),r.onclick=function(){this.pause()}.bind(this),n.appendChild(r)}return n},initYTPlayer:function(){var t={controls:0,modestbranding:1,rel:0,showinfo:0,loop:this.options_.loop?1:0};"undefined"!=typeof this.options_.autohide&&(t.autohide=this.options_.autohide),"undefined"!=typeof this.options_.cc_load_policy&&(t.cc_load_policy=this.options_.cc_load_policy),"undefined"!=typeof this.options_.ytControls&&(t.controls=this.options_.ytControls),"undefined"!=typeof this.options_.disablekb&&(t.disablekb=this.options_.disablekb),"undefined"!=typeof this.options_.end&&(t.end=this.options_.end),"undefined"!=typeof this.options_.color&&(t.color=this.options_.color),t.controls?"undefined"!=typeof this.options_.fs&&(t.fs=this.options_.fs):t.fs=0,"undefined"!=typeof this.options_.end&&(t.end=this.options_.end),"undefined"!=typeof this.options_.hl?t.hl=this.options_.hl:"undefined"!=typeof this.options_.language&&(t.hl=this.options_.language.substr(0,2)),"undefined"!=typeof this.options_.iv_load_policy&&(t.iv_load_policy=this.options_.iv_load_policy),"undefined"!=typeof this.options_.list?t.list=this.options_.list:this.url&&"undefined"!=typeof this.url.listId&&(t.list=this.url.listId),"undefined"!=typeof this.options_.listType&&(t.listType=this.options_.listType),"undefined"!=typeof this.options_.modestbranding&&(t.modestbranding=this.options_.modestbranding),"undefined"!=typeof this.options_.playlist&&(t.playlist=this.options_.playlist),"undefined"!=typeof this.options_.playsinline&&(t.playsinline=this.options_.playsinline),"undefined"!=typeof this.options_.rel&&(t.rel=this.options_.rel),"undefined"!=typeof this.options_.showinfo&&(t.showinfo=this.options_.showinfo),"undefined"!=typeof this.options_.start&&(t.start=this.options_.start),"undefined"!=typeof this.options_.theme&&(t.theme=this.options_.theme),this.activeVideoId=this.url?this.url.videoId:null,this.activeList=t.list,this.ytPlayer=new YT.Player(this.options_.techId,{videoId:this.activeVideoId,playerVars:t,events:{onReady:this.onPlayerReady.bind(this),onPlaybackQualityChange:this.onPlayerPlaybackQualityChange.bind(this),onStateChange:this.onPlayerStateChange.bind(this),onError:this.onPlayerError.bind(this)}})},onPlayerReady:function(){this.playerReady_=!0,this.triggerReady(),this.playOnReady&&this.play()},onPlayerPlaybackQualityChange:function(){},onPlayerStateChange:function(t){var e=t.data;if(e!==this.lastState&&!this.errorNumber){switch(e){case-1:this.trigger("loadedmetadata"),this.trigger("durationchange");break;case YT.PlayerState.ENDED:this.trigger("ended");break;case YT.PlayerState.PLAYING:this.trigger("timeupdate"),this.trigger("durationchange"),this.trigger("playing"),this.trigger("play"),this.isSeeking&&this.onSeeked();break;case YT.PlayerState.PAUSED:this.trigger("canplay"),this.isSeeking?this.onSeeked():this.trigger("pause");break;case YT.PlayerState.BUFFERING:this.player_.trigger("timeupdate"),this.player_.trigger("waiting")}this.lastState=e}},onPlayerError:function(t){this.errorNumber=t.data,this.trigger("error"),this.ytPlayer.stopVideo(),this.ytPlayer.destroy(),this.ytPlayer=null},error:function(){switch(this.errorNumber){case 5:return{code:"Error while trying to play the video"};case 2:case 100:case 150:return{code:"Unable to find the video"};case 101:return{code:"Playback on other Websites has been disabled by the video owner."}}return{code:"YouTube unknown error ("+this.errorNumber+")"}},src:function(t){return t&&(this.setSrc({src:t}),this.options_.autoplay&&!i&&this.play()),this.source},poster:function(){return this.poster_},setPoster:function(t){this.poster_=t},setSrc:function(t){t&&t.src&&(delete this.errorNumber,this.source=t,this.url=r.parseUrl(t.src),this.options_.poster||this.url.videoId&&(this.poster_="https://img.youtube.com/vi/"+this.url.videoId+"/0.jpg",this.checkHighResPoster()),this.options_.autoplay&&!i&&(this.isReady_?this.play():this.playOnReady=!0))},play:function(){this.url&&this.url.videoId&&(this.wasPausedBeforeSeek=!1,this.isReady_?(this.url.listId&&(this.activeList===this.url.listId?this.ytPlayer.playVideo():(this.ytPlayer.loadPlaylist(this.url.listId),this.activeList=this.url.listId)), +this.activeVideoId===this.url.videoId?this.ytPlayer.playVideo():(this.ytPlayer.loadVideoById(this.url.videoId),this.activeVideoId=this.url.videoId)):(this.trigger("waiting"),this.playOnReady=!0))},pause:function(){this.ytPlayer&&this.ytPlayer.pauseVideo()},paused:function(){return!this.ytPlayer||this.lastState!==YT.PlayerState.PLAYING&&this.lastState!==YT.PlayerState.BUFFERING},currentTime:function(){return this.ytPlayer?this.ytPlayer.getCurrentTime():0},setCurrentTime:function(t){this.lastState===YT.PlayerState.PAUSED&&(this.timeBeforeSeek=this.currentTime()),this.isSeeking||(this.wasPausedBeforeSeek=this.paused()),this.ytPlayer.seekTo(t,!0),this.trigger("timeupdate"),this.trigger("seeking"),this.isSeeking=!0,this.lastState===YT.PlayerState.PAUSED&&this.timeBeforeSeek!==t&&(clearInterval(this.checkSeekedInPauseInterval),this.checkSeekedInPauseInterval=setInterval(function(){this.lastState===YT.PlayerState.PAUSED&&this.isSeeking?this.currentTime()!==this.timeBeforeSeek&&(this.trigger("timeupdate"),this.onSeeked()):clearInterval(this.checkSeekedInPauseInterval)}.bind(this),250))},onSeeked:function(){clearInterval(this.checkSeekedInPauseInterval),this.isSeeking=!1,this.wasPausedBeforeSeek&&this.pause(),this.trigger("seeked")},playbackRate:function(){return this.ytPlayer?this.ytPlayer.getPlaybackRate():1},setPlaybackRate:function(t){this.ytPlayer&&(this.ytPlayer.setPlaybackRate(t),this.trigger("ratechange"))},duration:function(){return this.ytPlayer?this.ytPlayer.getDuration():0},currentSrc:function(){return this.source},ended:function(){return!!this.ytPlayer&&this.lastState===YT.PlayerState.ENDED},volume:function(){return this.ytPlayer?this.ytPlayer.getVolume()/100:1},setVolume:function(t){this.ytPlayer&&(this.ytPlayer.setVolume(100*t),this.setTimeout(function(){this.trigger("volumechange")},50))},muted:function(){return!!this.ytPlayer&&this.ytPlayer.isMuted()},setMuted:function(t){this.ytPlayer&&(this.muted(!0),t?this.ytPlayer.mute():this.ytPlayer.unMute(),this.setTimeout(function(){this.trigger("volumechange")},50))},buffered:function(){if(!this.ytPlayer||!this.ytPlayer.getVideoLoadedFraction)return{length:0,start:function(){throw new Error("This TimeRanges object is empty")},end:function(){throw new Error("This TimeRanges object is empty")}};var t=this.ytPlayer.getVideoLoadedFraction()*this.ytPlayer.getDuration();return{length:this.ytPlayer.getDuration(),start:function(){return 0},end:function(){return t}}},load:function(){},reset:function(){},supportsFullScreen:function(){return!0},checkHighResPoster:function(){var t="https://img.youtube.com/vi/"+this.url.videoId+"/maxresdefault.jpg";try{var e=new Image;e.onload=function(){if("naturalHeight"in e){if(e.naturalHeight<=90||e.naturalWidth<=120)return}else if(e.height<=90||e.width<=120)return;this.poster_=t,this.trigger("posterchange")}.bind(this),e.onerror=function(){},e.src=t}catch(o){}}});r.isSupported=function(){return!0},r.canPlaySource=function(t){return"video/youtube"===t.type};var i=/(iPad|iPhone|iPod|Android)/g.test(navigator.userAgent);r.parseUrl=function(t){var e={videoId:null},o=/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/,n=t.match(o);n&&11===n[2].length&&(e.videoId=n[2]);var r=/[?&]list=([^#\&\?]+)/;return n=t.match(r),n&&n[1]&&(e.listId=n[1]),e},r.apiReadyQueue=[],window.onYouTubeIframeAPIReady=function(){r.isApiReady=!0;for(var t=0;t=0;o--)e[o].src==t&&("hd"!==e[o]["data-quality"]?this.currentRes="sd":this.currentRes="hd")}},{key:"setResolutionsNeededFromPlayer",value:function(){if(this.resolutionsNeeded=!1,"object"==typeof this.typeAndTech){var t=this.typeAndTech.type;if(void 0!==this.sourcesByType[t]&&this.sourcesByType[t].length>1)for(var e=this.sourcesByType[t].length-1;e>=0;e--)if(void 0!==this.sourcesByType[t][e]["data-quality"]||this.sourcesByType[t][e]["data-quality"]!=this.currentRes)return void(this.resolutionsNeeded=!0)}}},{key:"removeSources",value:function(){var t=this.player_.el_.getElementsByTagName("video")[0];if("Html5"===this.player_.techName_&&t)for(var e=t.getElementsByTagName("source"),o=0;o=0;r--){var i=t[r].src;if(void 0!==i&&""!==i){if(i.search(/^\/\//)!=-1)i=o+i;else{if(i.search(/:\/\//)!=-1)continue;i=i.search(/^\//)!=-1?n+i:e+i}t[r].src=i}}return t}},{key:"getSourceForResolutionChange",value:function(){for(var t=this.typeAndTech.type,e=this.sourcesByType[t],o=e.length-1;o>=0;o--)if("hd"==this.currentRes){if(void 0==e[o]["data-quality"]||"hd"!==e[o]["data-quality"])return e[o]}else if("hd"==e[o]["data-quality"])return e[o];return e[0]}},{key:"switchResolution",value:function(){var t=this.getSourceForResolutionChange();this.switchSource(t)}},{key:"stopStream",value:function(){switch(this.player_.techName_){case"Flash":this.player_.tech_.el_.vjs_stop()}}},{key:"selectSource",value:function(t){this.removeSources();var e=this.sourcesByType,o=this.selectTypeAndTech(t);return!!o&&(this.options_.sourceResolutions=e[o.type],this.selectResolution(this.options_.sourceResolutions))}},{key:"selectTypeAndTech",value:function(t){for(var e,o,n=0,r=this.player_.options_.techOrder;ni?i:n;return t[s]}},{key:"switchSource",value:function(t){if(this.player_.cache_.src===t.src)return this.player_.trigger("resolutionchange"),this.player_;var e=this.player_.currentTime(),o=this.player_.paused();this.player_.pause(),this.stopStream(),"Html5"===this.player_.techName_?this.player_.src(t.src):this.player_.loadTech(this.player_.techName_,{src:t.src});var n=this;this.player_.ready(function(){this.player_.one("loadeddata",videojs.bind(this.player_,function(){this.player_.currentTime(e)})),this.player_.trigger("resolutionchange"),o||(this.player_.load(),this.player_.play()),localStorage.setItem("videojs_preferred_res",parseInt(t.index,10)),n.setCurrentResFromPlayer(),n.updateButton()})}},{key:"updateButton",value:function(){var t=this.prepareButtonElement(this.el_);this.resolutionsNeeded?t.removeClass("vjs-hidden"):t.addClass("vjs-hidden"),"hd"==this.currentRes?t.addClass("vjs-ag-res-hd"):t.removeClass("vjs-ag-res-hd"),this.el_.blur()}},{key:"prepareButtonElement",value:function(t){return"function"!=typeof t.addClass&&(t.addClass=function(t){if(this.classList)this.classList.add(t);else if(-1==this.className.indexOf(t)){var e=this.className.split(" ");e.push(t),this.className=e.join(" ")}return this}),"function"!=typeof t.removeClass&&(t.removeClass=function(t){if(this.classList)this.classList.remove(t);else{var e=this.className.split(" ");e.splice(e.indexOf(t),1),this.className=e.join(" ")}return this}),t}}]),e}(VjsButtonResBBase);videojs.reduce=function(t,e,o,n){if(t&&0!==t.length){for(var r=0,i=t.length;r=0;e--)if(this.players[e].id===t)return this.players[e].getPlayer();for(var e=this.lightboxtriggers.length-1;e>=0;e--)if(this.lightboxtriggers[e].playerid===t)return this.lightboxtriggers[e].getPlayer();return!1}},{key:"destroyPlayer",value:function(t){for(var e=this.players.length-1;e>=0;e--)if(this.players[e].id===t)return this.players[e].destroy(),this.players.splice(e,1),!0;for(var e=this.lightboxtriggers.length-1;e>=0;e--)if(this.lightboxtriggers[e].playerid===t)return this.closeLightbox(),!0;return!1}},{key:"closeLightbox",value:function(){for(var t=this.lightboxtriggers.length-1;t>=0;t--)this.lightboxtriggers[t].closeLightbox();this.consolidatePlayers()}},{key:"consolidatePlayers",value:function(){for(var t=this.players.length-1;t>=0;t--)void 0===this.players[t]||this.players[t].alive||(delete this.players[t],this.players=this.players.filter(function(){return!0}))}},{key:"configureVideoJS",value:function(){window.HELP_IMPROVE_VIDEOJS=!1}}]),t}();o["default"]=d,e.exports=o["default"]},{"./components/Lightbox":3,"./components/LightboxTrigger":4,"./components/Player":5,"./lib/DOMElement":6}],2:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(o,"__esModule",{value:!0});var i=function(){function t(t,e){for(var o=0;o=8&&t.ie().actualVersion<=11?this.options.youtube={ytControls:2,color:"white"}:this.options.youtube={iv_load_policy:3}}},{key:"setVimeoOptions",value:function(){this.options.techOrder=["vimeo"],this.options.sources=[{type:"video/vimeo",src:"https://vimeo.com/"+this.getPlayerAttributeFromVideoElement("vimeo-id")}]}},{key:"getSkinClass",value:function(){var t="vjs-afterglow-skin";"afterglow"!==this.skin&&(t+=" afterglow-skin-"+this.skin);var e=new a["default"];return 9==e.ie().actualVersion&&(t+=" ie9-is-bad"),t}}]),t}();o["default"]=l,e.exports=o["default"]},{"../lib/Util":7}],3:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(o,"__esModule",{value:!0});var s=function(){function t(t,e){for(var o=0;ot?("undefined"!=typeof e&&e<.9*o.width?o.playerwidth=e:o.playerwidth=.9*o.width,o.playerheight=o.playerwidth*t):("undefined"!=typeof e&&e<.92*o.height/t?o.playerheight=e*t:o.playerheight=.92*o.height,o.playerwidth=o.playerheight/t),o.playeroffsettop=(o.height-o.playerheight)/2,o.playeroffsetleft=(o.width-o.playerwidth)/2,o}},{key:"close",value:function(){this.player.destroy(!0),this.node.parentNode.removeChild(this.node),this.emit("close")}},{key:"getPlayer",value:function(){if(void 0!==this.player)return this.player.getPlayer()}}]),e}(d["default"]);o["default"]=y,e.exports=o["default"]},{"../../../../vendor/Emitter/Emitter":9,"../lib/DOMElement":6,"../lib/Util":7,"./Player":5}],4:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(o,"__esModule",{value:!0});var s=function(){function t(t,e){for(var o=0;o=8&&o<=11&&this.videoelement.addClass("vjs-IE")}},{key:"applyParameters",value:function(){if("false"==this.videoelement.getAttribute("data-overscale")&&this.videoelement.setAttribute("data-maxwidth",this.videoelement.getAttribute("width")),"fit"===this.videoelement.getAttribute("data-autoresize")||this.videoelement.hasClass("responsive")){this.videoelement.addClass("vjs-responsive");var t=this.calculateRatio();this.videoelement.node.style.paddingTop=100*t+"%",this.videoelement.removeAttribute("height"),this.videoelement.removeAttribute("width"),this.videoelement.setAttribute("data-ratio",t)}}},{key:"applyYoutubeClasses",value:function(){this.videoelement.addClass("vjs-youtube"),document.querySelector("video").controls&&this.videoelement.addClass("vjs-using-native-controls"),/iPad|iPhone|iPod|iOS/.test(navigator.platform)&&this.videoelement.addClass("vjs-iOS");var t=this.util.ie().actualVersion;t>=8&&t<=11&&this.videoelement.addClass("vjs-using-native-controls")}},{key:"applyVimeoClasses",value:function(){this.videoelement.addClass("vjs-vimeo")}},{key:"calculateRatio",value:function(){if(this.videoelement.getAttribute("data-ratio"))var t=this.videoelement.getAttribute("data-ratio");else{if(!this.videoelement.getAttribute("height")||!this.videoelement.getAttribute("width"))return console.error("Please provide witdh and height for your video element."),0;var t=this.videoelement.getAttribute("height")/this.videoelement.getAttribute("width")}return parseFloat(t)}},{key:"getSkinName",value:function(){return this.videoelement.getAttribute("data-skin")?this.videoelement.getAttribute("data-skin"):"afterglow"}},{key:"destroy",value:function(){this.videojs.paused()||this.videojs.pause(),this.videojs.isFullscreen()&&this.videojs.exitFullscreen(),this.videojs.dispose(),this.alive=!1}},{key:"getPlayer",value:function(){return this.videojs}}]),t}();o["default"]=c,e.exports=o["default"]},{"../lib/Util":7,"./Config":2}],6:[function(t,e,o){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(o,"__esModule",{value:!0});var r=function(){function t(t,e){for(var o=0;o0&&!/x64|x32/gi.test(window.navigator.userAgent)&&(t={isTheBrowser:!0,actualVersion:"11"}),t}},{key:"isMobile",value:function(){var t=function(){return navigator.userAgent.match(/Android/i); +},e=function(){return navigator.userAgent.match(/BlackBerry/i)},o=function(){return navigator.userAgent.match(/iPhone|iPad|iPod/i)},n=function(){return navigator.userAgent.match(/Opera Mini/i)},r=function(){return navigator.userAgent.match(/IEMobile/i)};return!!(t()||e()||o()||n()||r())}},{key:"merge_objects",value:function(t,e){var o={};for(var n in t)o[n]=t[n];for(var n in e)o[n]=e[n];return o}},{key:"addEventListener",value:function(t,e,o){null!=t&&"undefined"!=typeof t&&(t.addEventListener?t.addEventListener(e,o,!1):t.attachEvent?t.attachEvent("on"+e,o):t["on"+e]=o)}}]),t}();o["default"]=i,e.exports=o["default"]},{}],8:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}var r=t("./afterglow/Afterglow"),i=n(r);document.addEventListener("DOMContentLoaded",function(){window.afterglow=new i["default"],window.afterglow.init()})},{"./afterglow/Afterglow":1}],9:[function(t,e,o){"use strict";function n(t){if(t)return r(t)}function r(t){for(var e in n.prototype)t[e]=n.prototype[e];return t}e.exports=n,n.prototype.on=n.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+t]=this._callbacks["$"+t]||[]).push(e),this},n.prototype.once=function(t,e){function o(){this.off(t,o),e.apply(this,arguments)}return o.fn=e,this.on(t,o),this},n.prototype.off=n.prototype.removeListener=n.prototype.removeAllListeners=n.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var o=this._callbacks["$"+t];if(!o)return this;if(1==arguments.length)return delete this._callbacks["$"+t],this;for(var n,r=0;rY01yBG0AXfyWpZb1Z+9+jX>KlR zbL@R-m!is+==c5=d8=2yTh&%3pg2{n(|v;(6%`c~`}DdC0RcrY0Y$B@|NbIyLPgWc zs&j|;+H?vmK-~atzp8owwn?z<{xqkfg`~82N&PmsrP zGayoiGntry=|xX_SmDzcHpMob;7MCXwjYEqPi+@A5P~pGl!8D^O+A8emw^rotQ_qQ z@(_#S_8WisG}ksy%P^^QjtGVQ%fC#P zo*p4G{8e|gFr+otrEOE6eT+VvpT0ShkAM0YL11B|dAjLOp3G05B0GTaJTrdkZ5AdQ z1b*=G1Fd|_gGjO8tSj&fFwm;puvEf9giTgf&|hlcf5vhPKK@9uuPerVpv2d!*k zUhmX2f&2$EnWlGudYNPHLtFO@>57_jmAH(|n*~#8NyN%`pYexs5fA0cU*<{(egm6y z+A+fMtjv6nnJpx+mxI1oml=la}{Or*hmT+nu~u#JiI> zMZybqxWgVW-hrVV|6hjFOqWX2k!p6&B6fV4j@om5I?4%j*Sv~&P9*eZs=th&>w1>p zTdB}Q)6KE(&(cw+hC)#{gBwX}CrYJQ3wN2u);3ZBb_V7}ws4V9Bpvg*gbr*v;=sG9xM(>ayXjI991Wbee$PBM93WiBLXY}7a_$%z zkx+oYO&|+F;?Es-^QDj2uGamU#Kk5We|#Zvd>2j>_ZQC(=9>Hc$e}x^9{LF_oeOQ; zzfLBTuVYQ0S%D7+4$u2o9LK-k*T-MR=EP6PlciX1M4t*FjRd6$4o=cIMbKhAYj7y# zebEyp`Y9xCq|SXqbD=uc+yhIeW3KZg;2<{N7Jld;iTk3BL)a&g`8DzvU+}N4If>v` z>==>#g~0KD`)coc1O5K~mwlh<*}WGA`j=(kene^5KJvx%qyPL@$DBCpPfrunhtS%? zIOtqG2+hzU?F%&daO|fcl(8L?_^`8~jtHO&^4l_+JXc`Xhh~ZVY~WSCV*v^zpCSo> zpZwzH763B1^P$?xrm{i5s^}kvL~#RU#F^Bf8L2}Q$>QkW76b*9z>z3AKgzF*BNR^3 z{U!XTt#GS#2^jupz|CN|kzhcF=-)gewim;^4bxZ{TuCUBPtxU2IZ0|lg?MT->o&=PqpNvpHp)52yR#tR}ReD!0bli(Gfs<9Qoc4d~e=aewjsIs!8q+W~UC9S(G zYigm>bX!KJ-F$837q6Z9vZr-NQKwX^i4A2m!*LBGo%wVzcTAls;Dr`8R4l31YA+`% zBUi1ix7%%@;5947;)WCiq0CMKej=`8q2qw&io-&oOo&x#D}>wmVvq~?mfRYyhipl; zMY8Qny~=jhBXx#bP6$Z%U{n)}y5&l^Q17pBNmDq+61j<0o!4qKpPP;A9#NaUQmwwm zwPs7Zu>hUd%4CT*J-v!;jnzc0w%5Y}*){~6E;Vy)+ML>cu;!-VwKKK2&af*sSv^MGt^bgt%!UZYsuioNFUlrTMVr`6gW|+1OLMi2t%ePy7M6*kVl8K`Kxsm2 zB#h=f(X4Vn9OUN{TzVbQqTyqe&WPCXlXYEj4Myk1F$c;b-O8mpsAO>!HtLzZRM%$bsFZ>!zckRO``+s=3JLX+S6YN)VQ3o=~L;n3Wo; z*V}MD#;KcLiRU-Xb-uRFhlW4~fPnGBh8}9%rnRUTwo1{H8q@=#M~HK_M5|4HZgqR( zVxH0BTBkIf4B0uOkn2s4oi8jwXo=m(Ur(l8-k6QUdOpri$A%>HWN3jfVp~m1>8Nzf z3pQ)pq3-yy25g(2lqKDnu(FQ3rQCcyt$Je4ns*IH#z*6M*&2CbtIT&LcF30$2K0S> z4f+*cXNPp%A~ZbT(R)!0nu886f(;8zammASBPG9SQH5NuTo%TJ)OfW$vM%&JnVQzT zSFqTY_nEXmI+6{~vcIPr5hYPJ#-d5v=GBuoPuUVGqvb)((K{Z%J<>jzX z6STD0OzRzg=<#i#w{*02BWxOa-WUT;ZUEnJ&xWjBC~&?Zxa4p_m%=tJYWO5lL|f>p z!+v*JbR;&%h{JF^suc;!bPU?krn=^kg{e~Y`dh#2<&E~M&aJxsy1T7ytxg@R$?`zz ztXqLNEes}j&i0J8UF$imS(klXYe8XL=+vdEt(HiCO@R{Wm`bOyq9=XVWhgab zZ1r->pjK@26El{B`MlUE=5S#?*@*2;mnpZ@Sq~qqJ7!z6D?aONrtVs7m&wTP`<hSapGxmu$z^%buIr1c=DHJZ+{ zKGgz`Ty8c!V>oSXN4?O_6U*2&lvT}Fw_0w?Hb7&tEG&pd1uM*gXfwirg%>Neg1r_j zdo|`q9&QMuO-XX*SebGIlXMq?LFoC)rvKXMJ1wGE;PSpW@Q1WmA2-Mmu1kcY$zF9X z7VFD?zPn{tgJF%4n$Zk27m^|S3}cH1w8oekv`b)PRyW~#!{(MP7U(_353E&xRGaEc z4JQk2Z-lky2J@O?9DOriJ3W6wm$se~`Z!~Q zbqIwmH{)_fp|onutx;t@E9wTn%FknUTAUS_d39cB*fm1ycbfB(5cI|kO9lR5$k>d5 zEy*^&Dbl^%nwOxzMfoc;R%i|*C}+@gr(#uVc;%_t)fZN7un|i0iBig&edg6I+hH(Y ztqF6xz*N^@^9_4Co;i#Myh_AxFlkT_haE|+8OzmcRaneLy}sn4T#b$_gJ=0V(7BSL z>HSz#$9>2@F_u%8O{z=kYm8O|-P=s`T-;%#s27y;bE!*Bd)UUq_v_D?UGkOsVm4aU z4YMz{>da;UosCAHC}9gimfGWXrRmtQvJJ@c*zkr?98C>+_4>MK;X-cFT8VCE(!=3qP5^D7md9J6F$edY1`}e+Py*9Z>e*;RNa!>24>9)<6Ns``&zkBSgxFQCBO1Gef&Cb^=ib-M_Rtn z=x?X!t3GYdgW9sJ6H8;T@m6)Ngsnod zTy?vHYOZLFW?s&yPfXWs@=V)xx2DoqhS4?$@Ns)(TXET)tym@YuqN5tl$Ek)^C7$7 zX06F4H(N&ImQB>;wcTfG%eg-w2-}-MOS|>#634mrq?ZdcVqFcnVrjN6s!L|uhhB=T z0u_{}$WIDb%`aN2KI z`wgN}ZWbrBN6ZGrr5|C0?c^9|lq+hHSL;;S+#*DJ%_hn}sqe1>AImZ8mXb)c27Nv*SL`imiSf?GMITCYpR@vBg5NVp?+`}0McZZpgBs7J!#-gsLm z<5iaGZGs*%-K;B;JhT*n@LuQT-oUfS-j*dD5`^_|Mv1-Qq`RR>*r`Qn?bR5k-W8c{ z4TSv4AT~M7Y%+_ynFG0^Q4vhXS$aWl)+_a12MsaIVRFYG1l3B2zfLR5<+icx=JRT_ zoLGgx=xKsS%*j$XvG}?$jBttf8d^s%ytr8?M=L=e)ct(Fo~m#Jt^&rf3Oc(Dd)s_r?UK+r0HV<7EcNDW;O40SkW?)793TRY z6vbY=8y}8%${NKqZ4W?q&5vd>7;XU7Qb5y2=^h+ETEYfMfYBe;nDecnPeH85V60IEQFs-0 z<6o7h)HJj|7#V1cR!Hy()nJ%hirtmCe^pZWEbJY0GRUQm#^o@j6MVnBD{u zRchwPiq>vZjpb}JrW-5QG~sA{TB$KPdtyudvP~D3WV{Z`trpqb%H5GJVwFY|dz08H z7g@{(opN03ZD!b7HC3`YQDv;XjilUk+#8h}a6B@A7#Twhc4eulLb2FNYmF%Q^#GI< z-wa+ItQJQLbv+u^2;Eoub91B&`fhLfier(W>C?HfUN)+Dt5a#=3d^Wc(}$Y3VTDveG)V+35D)e(I*v&8G+xcOGmcW{us9d<B zP0k4FIiu0tX#GjqugN`kW)BxkVN@Ir?G6?w6S=>v4_j5Dwg^eR(dw2kv8Xl*L)$kx zov=R`nPk%&wd{e{1p{ksOFkQvAd`(8lOqe#tUPK_hDrDNU{Ph4xguH1ukB5D;ZCUH zP>AKmP?`6tb)l4-wLQ5!QkNpTZEhwZ!88=2uaMorsMMGZc_CzoQGG1Mzn!M+(0tp6 zPoFa<QwD9VzY&+ZX&FJ%qKHw$&4AwL?`8`r8*#7LZ1*QCmSKqVqNE}TZ135Q&WOD zd&$(CB_}hE$s8Q0v%Ri=vd!nXi6LC7A8OOZKEy8 z2Y9=5I{E+bN%BnqkAs9x=#x;v2Q>O_S58@FSbhYNl7UDGEL%*{eO8xyb41J`poTz4 zGoK>NBW0m}{3!g08^LB&WC0HUc6j-+en>vHdxw*LpvOOG7=4oVGW&!*{uGN49AVf$jh23VxfeVGlwP+_^% z>Xo7r#ko^PK(#0*;r||>Wl&4XlT>Z344YG(r`CE7^c2+AK4*&*6|*+mWhqu>VVVNd z^kFk*1upJE6#D%oXqACutZQA1!y?RG=;d-mR48>)nt*Od88VyeaYW0RE=NO*u)JE# zSbW#4mj)zH*{_2F$9r542Lp+mPkXs45P~6AnqV^~=fpxD3&pZ9^1B^|SBG(T;3Wv} znnKk>j<68dKq24Z2>XFx31 zj_}vYfVCmtSbD!{fkMrKoOXa8qB{Hi(fHNfS`xE;9lEejIcid#P&{+0FPFk&)zX^n zG9HbGxhm7upzt`=i9)Fff9#A6mXIErfp_OHZn zJ*h9PA^nOfWi07|yM(l}T7U#x9{#pms}W%S>i}4R<*qiswYWTZr3WbeUVYM9*+N?M z_VrNvdV3Iuj@VO>!!yAAz)I?|1d!Cb&<0?r(tQ(928x4q<)GxCbh2HlyE_@!_vdhc z`jd$vKcn_RwLq<*?&#=t+hPkWlX)fz0*W*ao0R68qn6 zLZLuk!C)NLpR7VaCNi^Y-#mnR0+|*lWic2d4C)9GnVr{S63L2-`WwiK4SH&~xluVF zt2DJ%hoYrjJE% zm@*m+TzO~L6aBTr&jSqdi&&enSb^<8zkb6a{nUYdK#5yr3VE7<{HIWsK0U}`b1T6% zC|oMN1$`=%POv>Wzf0FS2V1?i37H12j6wa0CGBYwfnFQ*b=tQ`8oa_jc@a7?eFFy;kdE+Aq3W^R&*egvo2&wgg7$DUhIUM$Vra|c zTJoFj!@S_6N}zrlg@8uFz&engRC6kO0McASyu5+-1M&Y_9wJ*JCcj~SY{fj}bAI=G zmk)A7(6!6eGSCHJRm`5Vo=jqqo)A^^EnpKi6;}y+Hc4{;%48wZhj3s63L)KFSH`fP zM@@T1H7VQzUUf1oRA}_guf5#16CdM5YMa~Gx(3U_bO>XJY=O9wXLknWnPLE&@KL@= z>xDLwUx+6Yv-1XWFSn~D zu-5tj+S6XsQ9TOTSJZw)2Sgh!BnpCK|RZ)Pwh68fH$y;Whij@Y|vsW(URhO^szJXMz zvHr}AXBs233oB3JHDU7xvq@!IVj`%Z*X!o_WH7s*h6TiYw#QTFD?b>J`MOe z@^#uWKc~SoH&~S!a;&DnihBG6Qr4t*j`6_Kx$@_+XJS_n8~e`Uy|YdGHN%1|$h zXr>3$wkl|@RhSNCg=BuvM;it2@XeT`{+vTmiJ|?Yk&D5;;YUhH{~$g?y2}Le?e@d? zD)tK9rnCAr$g5m+Fhj~hf^h`w<30aCI=jA@=4XuJuJQvpT3{>rpiiOSs^vlA zm$Mz{KP0q7b`04m5%DeJ-_4G9otPt5D;)ZR`5gLoW!Q(4at`!a)Q2nRcR|})YCu01 z>V#f(RW4U4d01Vo%DEs$ye;G~i|eHHIoC$>6jZXKs3UGfUVwHSY$P;>NbEp{LC! zKD#1VQlA5Gj6q9I&C%!0#NMjNXM*+VJj7!k2kpv+6-1;jJ5V4t`UdLKJWN{xM?&_8 zhw&y@OPjVO5>1+<8i~FZ=MY8<`r5EA5&51|t_y7;@;Q4FBjD6{FavS7U4He*p4;m7 zM_pfnV+Szdy5zu>BC(AZdeG}}9KTubF&x*K^4*#Xv}RYtv>A9+I00-f};9M#TH*> zdNz~f9_4a%tvRcK0h5ykGke?FMxgDm*8jsPgv;FwQLiQU?x?51bcH^ZE=%{=>W}Vtp&P%qM z#5HMkDq5;Q*$U(ZQHFH2Aq{h2D{VMSFt9+ShB4>$L9ILD&G`s)+gM<9`qOHkgFGL_ z(5IB4s<-9WPF}}etAL$iu??yfN}9Qjx@g+!WNTo$MYD6a(CJC0gcXKBtxy#P#4{Si zEee~SSV>dR+)FZl25m5BD^L$WokB}iZ4G&Jn&{4fv=s{tB)c7TxaX$1nd2SchQYPP7) zN+B0oxFv6?7SORsgt7yswr&bm2{_D&3++nE!3ZmCd z@R8|6Hn%Fa^X)`57l1>0LY^QQD02gD4bysRq3IlHJAm;!+1)~Xdoq$iB%ebNtHT5XPghq>{eB@DN$U_?E>i+7m-&T*9odAK)p*@BG2~Po!61Ma0X$u zYms8Dqvxe*alj9x4keXyTZ^-SCQ_MjORA9P<-B8x zAhv|H#dB-9I#^6b3$gWDcJ-=Q=#PYLjn>_MO_~(V&O91};dX(`oV^XpIWIoWEka+r z*G>kCF_a$$k{wVQ;P6C$HldG7CF4I8wjI)Cts=cPhvOxM>Zpl6OMK*w#0zmUhHAk- zDtszl3MFD@-1R~X*OAZ{*ISs(l-7SDVhf=RGGS$v! z$AezEXyu9&sRhkOQ>1DnNp0i?v@zBBN~P;DsBn}lF>ze$_jqGVO-g;LA_~n8UU6Nc zy6lk+x&yFRzPVm0@sGv#YcnuV7>1qXBDG!I*{{8S=>R^mpkIRKXQ8!8#(>*oUg6+h z^`Sl6CgW9EOl&E+Dsgb2gAH?V{0Z%7ty(rA{dp`JTFCdIFqj@F0_G24-aBkM?e$Y zhp>v$y;Il+km$=(ID|e8HQLQ{%e4d>iwaL+G_OgOPGMvRXz>)5QFw3)D}b};*(t1| z^i+8t^erY;J_I#Li~ii5jRw`aLe$(*p&vr&A83P)JH{8iQ`*SYz2;(^CoQQ<#>aTv zaL4ohMjdwC5luN}m)aV0ePalnxyX+;<2-J4=GCRa_roz?v2>xf(&qiCK^J|PCvG{F z)##MIRP)sca4OJbY6f@(jAN<}I0;QDyJ$+;kRg3|7U&i=0Q?M$0E&mMjz#sd%Joq> zK?HhCEl|F(1vMzcf`$bxY)1Z0jNp-ABvTtykCDKa5hpl6n4#}25L7UV!3GF2N}r?o zq>+X4L-;a;&#DOC5~Yt4e4!H_!+5lcWKk=?`zU^j(i;}k;yXAoV0_Ss0Zh*{E2iN=+RT`kPP>R#=^1+ol}FW1cHE2F(T3p5aLDL(9?Mj^rpm&aa8_K#9h~ zK0cBcr!ZeF(B5b@7W&bsOGMg0ZW!}wXbcFqF|Ze-yd{r3$O{70vh%(>b_jRubzI%5 z&W*u3gx=(4H0UoIgFdMZWnM3E1mstjDl}tlP+X3NVofjf9fNoAG2h?PeACv24&>V+ z`t7Sj3Lgz?TWW}YLk}_ET#e$gd3U4c*ASN~Vesq4c&_wLaqbfF`l-D& ze*{KTbx@p+1~CuuP3S@MBU{b)opHVzPy-`|ZH09sSdly8-6d7%6trOn;vw<|q=PzN zZ|EVlNZL8?Zw-pGjRC}YL(E3V1Dd-rY|m^|6b+gkdaTF{~bQbi(ryn`W^CRbB z(kJ)Mj^G>*NbO_4?T@;A`SAPi69Okbe9t^bm7P2P;S#%BCk8WcK{Z z(e`^s0WQeZerv5aW*o=$B@bYI5PR$q;ZUFWJ-6Dc^HM86{GWW z*)^B1YQ8>nc@6gRyka)&N(%Oa=R5CLwRWQHnyP7G+nqhk&ZwPb+#OrY&N;p!%;oXh zYg~^xvO(%sATJJLUqd`($OdR!13W*vodIy4Ase81MjjiI@!h8;&!A-2Hc8i}`&MQy z0>74x^qKH`YWr}I`n~`q=cO|!bz5B%XUhHj*l%`$d`5xvDdOx>g>)%9TXzuGTJ_ce z{VeuE=c2RW7SomQj{Ih4ETuCZ4mW3KEvK_4=a;kdRnqwmN13y;o{9ec0C9HCGuhvr zJ02LefXxPFra*l=%8u*nv#%>Nh#XyW z_os&=fAMwfub)F_oA?{aJw?wj=IikgZ(zDwY_np+ z>&VN96J5R}P>{uW-kF^1W6SBxdtB1_Pv@Bb>%?k|=}L0GzHT7I7))uV@)bf=!;!hKghABhE3VF-bL zooj&w#C%PY56_aM3)o38k#@(^bfmAo>B}JWgM-+^C+l2kr^s?Zi}<>7LTBu_D3JVg_l?{M&VftvNI$34bp-}@^%iiHbilcY0tbeA zI&n?{?MeHb4kYzOkVgAEFiIs*q3Jh9+}}<}6wLX#$#^Nkn6tnhMfmI7dS#PxXM_;R zlV2wZ+4tPSPwaY%cso1ymEuJKn=HVuIoO%kl_wWR=l4TdmZ)tylZxMhnPlo zk0t62s+5GX#Y9CS{zydf`K65dX&%CWt$eD;Z4dvyo|gEKRS;3cA-P| zxFb2eRz`aRm?))0j~$F={`<+z$%K2Aer}DfOb|?r{a^;WJtaW5ihsGtbIAlZU9pR? zLx$^d?DCVzfYxw19>aWBNIi;&>wG(Tn!DaRR(QbSB@fj$eql#QNb;1iLwPQ_3*u@9 zx)z?-cT`KMs07)x68b5Xb5`AsPRXdmG(O)<$-wG7eTU*TVn{=t8L#WwlWs{Su&ytY zx}@0>icUhaG;uGCI3o2me>~w&iAhV33ClQs?NXgH3LIT5mWvyVk|B3T5A@(*BIFXA zR5*DS2dtj=xp$t%-n2l8y=B$k#4bZ_e#VKoZeD6wa)vt^vK$?_#Pr@r^vccr{I(+5 z!MG{8iDI~#vr84<8HjIxpigr-Qh6Jj!$5gQ*ZfQV@VRzht_$xZ5W0(yYjy*Tt9#R~ zE4=V}ZstqKd@)jmUiZW`*EdPK=Z<$GpVc!bBYG9-UqxMnubFUHbBcEkZut4Yb=M4J zMlvKI5oV;_cO$0^L-dC`&5scC)X2|wIpKkPcLnY=lKK7!i@XgcW47HZk4+ zkWHDl3SE-v66<@!IBM$@>!msJ+R4dQFnibWd8`HJhAO4E@7S#UT*|?BOgWf8VMV@Y zj~=p6Jq=pdUoYbj?N5>OFo{TKOfpI<{53i65Ft}LrBF#>a-Rej8E+BbJlg|#?v7hijl3GOUZvd`iQW>E%PF{I zUE^na&1X8L`D>>X zM(vp#4X@u~m$a93+3K_kC|!Mi4EFh6jmzc9w^2LW#__|&BWG^HalG$F&f>v^!z|C` zM39$z&EJvlX+NaajGGtvzg^2W{EvHPKn5%U2D7ZQ9+8cvTWB*`p(w? z-?eM!qAz!`Gt*og&<>%oM{CPFUbrvJY0_lRh}|u6utnJmOwTWc^ADuV&R>5{CSp=N zQ_UELKOh!wv;G--r}*|@%y#q0&*lofY;tR&ENM(3nJ3-jPauph8u0aWx&7C}#u6=x zg5+{0XubmUTvme6rz2mK7VD?V?k{89lDTA)3|jKV;^)KPOXU|Wq22H52YMizW6!$a zxE_94*_mvoS5*FWJkiTWAw`H=GsU;zAzg6>^PI970Ly8J*Urq9$vhiD-)?^90?=VD zIAO4BM;JO^TJ$AhyfgOuep^>vG5TBfC`07lnms=HdS`BV=35V6)4l!{DYH;Hl)uuL z58KsSQ?J(}q=&Kk{40R$mGre{`ezyi-z3Akdix$--v#gyL-;6^&({eVV*b|SCpWY@ z{u%uT_4(Dl>STuS?r`~H!8K!1>4hw2&W`=ydRzu#yTR+t5$V~`CNupoTF6Sg5r6MA zz}v?FF4w33_&J0<4(Ilw_=iki{F4kyZ%_!?uRYHaF9k@U9piq#$djHqxBbA`Lc(fk zx}J~pZk9dFJ?u-qq?SHUTXhbYWZC!h7WoWE_;SMfAtyUy+kFP;EC2brRT(Ir+WBCK zLv+KAg&gEZ)lyHD@upK z;c?CVYJEL1#0w1#A%3jR3tA+VC;gY+K3KWA41NphC4EkCpYuNoEMslyNQeVvjvI8> zM+fP&W%uagK0<-?O8#}tpWgzKW|GSlyN7{XuG&3b@N&Ds1;HxEU7-1sPI#dE-bs{8 zFz=Sv9Hdm~Ba{=^9m8XRCa(M=7@3aqkHvY?;{!SZ;z+9Lb zI*GCWl}z(ko>gGB6F!Mv&>dw=3}GDqc1&=MxsGQonGO z`Pzd^e6yt0nOlXuV@0~k(5@+MVOfsg{no_$KQakt%?_MuBoo4JV zM-;|#x5M`HvCh;e@H7g!PBRmr=7la!8uaC;1LvmUXjw!!O@t+Tag$%J7Mbctw7KGw;`Ox#e=D&?Btsng4ArUmbRG4) z(%j|w9*^SXrtOI@vUn{5sCmzf_8sF2&&}5L)Kj9hSS^xSoBEJgrpGR-J>zL}~ju zuGB%q-BKwJzpHgGCr>jYpd!$RZ`fk4T+3kCjP6ND~Z%@;s^X@tG z-Epr3m0hOf`-ylV!Y6$>cJ$}5xpmCo<4fuDOMbV=@Z@+C$Adon=XAM=W|+HjNP@NC znCt7`sGbKX|1d?5NBb{k(@x&Uqdoj~$7R>@^{SVi4HJpe3rU7wvm(F$WoB+Bfi^e8 zr%OVAL(1&i$(lq|e>v3l7Km$ueg!HU1nRbL_`iKdP(J73UkO6H zZuxFa>3gA=m57M{7OKCjo}G_*e&^50$fAoK_Cppj?Jw`TS=;zaG$8Ykjfg&8crKsr z?MwXiBjF!JE^C09g=p5sg>(hsTyx!f%|E}N>GS)5ocGT=fn<)?e*{9ty)^FxbebM` zN9pXP%pZYp=2E^7L}1P}sE^TI67Qzx<#k|Br|Gw!BJaga$~z#Ouf}G>cth^rZpK@R z;}OYu3&taY^QHoOOK#o(@UYmt1?R5RyixdVp?L$q12Xd#go{li?*j6O+`R$fQtaLZ zHjGCE@nI`_z(~hkojm zX7SV4)cERrx$t<;Mfz@}()s-s`Qv3yBz{n@_QtBpzt-j`h5Yy$5HPP@%?WTydG&dH!fs|ABVeUm=>NCc0bgN1%OiwJ?HK({YUp zz{gz*r-)QN_>D@EPWcbVTP&jkygk$0Mr`7kt^q^eQuElv#YJAHJ!v@?Uej~AC@6fv(4m= zP#33lP74p;E>Bh*_cf=_TpT7ocGG{)7Mj9^4$a5sDw=`%d|vSL)u|W!(;2i&C`9E^ zDBrK}e{d-!e|;g}*YpK~Pk9p3>~!?uFUbnt(;{#npd4h{rxgpH0{nShxRM^a8PlJ{s$q zbJSTMk}In|eERB4K1MH=8SN87YSYuKrZzV}ey~l=`0(k!@c({6SCV-KjTFL1|I=sx zB`MvtO*8tG4!j(8>ip0Dd_0TS!?0(rqul$VskDuTzWza3emq@OTrO3h>HPL?5kA<#{I8e6Ows!X zCo)n+zYxW5X|L+!E&ei`g9|tG-GJ}yWdBJz-+nvgp^fU@khzFTaG@7%}M#} zX2ME832+yAbr126xR(1{!}F&BUh@0g&?h^LG8}_le5P-Zx*UDS%|GnM-Dzt^-z2vc zr4&c;@{NtsFLMSid-cF+hv}zZ+N=Bh36)d-px?iok}1lOmy|1>dNQFjGAX~vraaJc zGS%`QR){~=^897X3+FAzAJ!yEHZ-@s9GjU#>*P(kj0*;j=V~%N!4IE4|35mS{_|gU zN2Z>Zf&0;pqDA-x!%)|RFP86HuBk1Y@J09M7_99-cb63X)`E!Vx|$cFH*-E0aQxHP ztp2&6{}s_Q?Nw%>OUeJc-_!X0FZ)ZI^z( z&P5{~FLPi9gB$b@HS?&IUXTy(skd55c?7=G0wb6K6iwSo0&6l8(9Fe< zeg9_j1^y8G=5|IM%bz}os)d%kkArwYG&s^~ClF-xZY}^lwj&Ru4ZCShmED{5U6JQx zr3E^Q!c8R@ulG5i3KD>6j_U2+gx|fZ4ga>1t*!<1R&5u(%S}?~&2nnPrpmLAlt<|W zh|&BABc=q&>ctX15~NiqOSnoowyqA`nLF4j4$n#Xo~JJAUBAy!a;fI@N7A-4_nNa}zTTZJV7k(B)cJsckk?k9iX}#v#tKJUz4}a4 z0Y0r%m>S>NvJ9Ji3ywg{iiW55*cm%&0JYz6Dl6O73u<@v+Fq*z&aMaz%An~ED^Rg+ ziBxse8jkWc<#ztM4fEo@2J;Idz3(?F!17jm4oWKOQ5*GBbE|H+m>qDSLQ#(Bfv$=- zH_DK+WdX>l(}>x5lhLW>R2=e7*lDa;MxlV*pumcqY+|;vJ?nex`Of}Zi3uXz{*yw1d3uJBwVb{n;jN!+B%isGt{GY508K) zMU6?J$~s`uw4_qgu2`6dTSJG*P2@dax3MiCD~yZY>1Lpwq9nXIm0}U{PTLaKOK_03CSrI5(9&%F=L+`&!Q$63LD-@&=UfZY+6SH2;5mBBAY)zr=I)iRu zp-LcZF;-X{4lS(J^(!E-1=zNBU9O5=WML>`gvp6reBvs)`I0LGRqowU|ESgL-~W`Ywt7-Y$t3VlAUt&O2wp5li3Ajh5TSq%y*Q2 z-g6h4=Z!cZb3A3SRLr09Yr(Ri0G98-_|8x>2kxtB%=(R1Fq{+kP@-zND4J&d5)@3uy0T0y2=AQQD4+$D8y9UXvQ%oY(S5rSP{k1 z>rmuuUjcGF^)@6FGhgH_z00jtNPuv{u9YrL@8e}l6)2Tv>2_th)n5m-QNwhtn2yO7 zy>$(fsTAwen2Onconv4fK?sB?g**Qdll?$Eg035?@m9AAUwfD2;A znY9985W;?-7C?;!Lorx-s@1kEFJOfVW0gWfi(7S>j4?OnC92RDI>666R!rFy8n&aw zysn7=kPBw6`^|%)kC47j zx39T=w0-I(t9^}4+^orkx>oUymetN|1QOh~967Oxu_cbV=s*9S_( zhoZ(fJ)uTJ8KvZq*_W@$`9=*?Q2CJR;9P_5LAKDFHBhc;A%x%E)N6p$V%v|XPP|Kp z_JdtPcWLc2iN{7G>m(tcBGC^!K7)P@lo_!nZT38v$VpuuO}q-w zClF+@3&V?g2ZjAtL2iS3r(BuZB#a{&J^4NlCw?PU#tK01f|3j+h-v{2+A&&za+&BR zf`#%UZdix9sz0RmxSo74MlFM$h~ygfhjft_=}VGH?1iN>&7CZDb~2`{!B)3NrC+jMk=8NoD%!}PM&U$;e?U5g#ifx6b| zb!*%R??(f6vFbWXpWBEIgt0>399Hh|H2jX6gMB!UU_&3Jz6)<&J9Z@&DR9Um3!BPB zWTWATvC5howM4)zdS1U(!}9eyTP-L@Kb(PX^w2?WF!G22O`?A7a1`oCF^}j`b0k}| z)ILCZ2GS1pEu=S$gY>R#uj2r#Z>Todc4qn}2Pp+@UsR)J3}eq`HOi}0;I~OjBk0_W z#Emq<(0AMvu{PMiGHbBjePe@JlFoOfDL+>BzvUS(@ARjz!gOkGF_19~K!;!g8M7vn zOo|s#|C+$oO|VuJ#u5dvl@mM0_I7q3$cYa;uWc3NQz6@Gf?nc_=Ri+^ZP%flz4+@P z8;Q~ppQHS&0DW!bZ%-ke1Ss3kPgaM}*G~T>zBy$AN6FVVa&rcGMjTeR(PGF}paUdY z&~J34O|2>7eXlbh)UHR>Ym<%MAUpjYB%81vaiSw)0xjaKE%s<&i9D#t?JWpps9$OT zZ!%6CHUzg>o6Q_CUu0@HJL0FJDmXawuYf>VP|sLJTEhDVZ_h@JEj1RP)njRK2ncm3 z+F;UHSFA2!%vwzJI>1Q_4BVEXkRGP`ey?E2*qoi!I;vq&R-dM3H5$w$MvmvajF0Fz zRA|e$pl|B2Ybk(^Pf45>of<7qVZK_u7PdJ{g?; zin||Qp|MsR_KMyxu2iZrXdDJ)xV;8a!Us%OU?ImOd<^wMz0q?_T`ufuX zb@J3cc~6W}IRWsqQ#gj{%qdJE;t8knu)YSGZ#af6n9i}sFtl?TsHq4JMS%p4oFI1y zTM!=soWe0oXW3&o86u0P^02-EprupTg6Z7s7>4!XkQ1irhFGZi>QaxXDc~j0kfGU! z-{Y8C0--q=4QpF%P+f`)yM(r40C)xH799D)wkLVe?0^jYTINkyZ>4uf1A`dz+y-zW z7|E0e1O&GeEOj^ptIH=QAjoq{LlhOHk@RC%3DO=?}R#Q|GV3832fJrw+ijp z>c%y$`Fq#6=5Ji%nm=9RdbjFlTk{Mz>-NjD$Fwsp`N{y9d3SyGqdH%&ZXnFMZ8Niy zhi*82u<*_MtltMB<3{(a`_VF>-h8d=_HO*r;d$xnSGo#^mD>Gc#qWPc3pr0{A?No$ zf4wET)lcu(nTWqf-p}@H?wV8n8HvA?I^xF8v75DLuRCUJpFrF1j~9|uA1`!xxApvm zydPXfyS(4;-UDYp@VwZ4ERwM48Sh-yyDWaWz<0Arm-nuDK9?>(q?Kl?==-z@TuXW4Ex^pAg^E&EVFX0v|goWPqp<*t)>I;M8>%DJp3-;(1e zm#LwXQ^sMX_j6jtUZ+CVUZ-?Zt3SmC z*;{$fYa}jeEIrhr7f&U=k^AnWiRdP`Ye%#6>GG-IdoI-9;bFy_gPV)zB@nM(4$HF# zQm6avp7*!77k_Zucm@{N>OX)FCYwvUMed6=RcKFNsh{IOm8(R~v%=_C^)IQwrgMXCkGtYEp`pj(B z1+?#P%x>_VwaxwX>v%x)WI=bW+3!LQPqTpcM%fp)VBE;{_H#DrC&O;t!<=mLK9iQa zPDmQHH+AndhS{7}{BWV39;^RQ$20y8Os)!F;8eK7{h3G*KZ693jYR23k;wlH68UT- z${*gLzTVBk2klTw`2@QoVCB13;o@PXt2+zsl)3e0&zUwlj6hDO>9gOt+f8z&r>$@7 zRe#^{nO|};=I*OAMCuaR%!g+(hI3~fb-dI(?Jk#7-FcW9ET3iu|G>9?-$(mvo&HDl zMuzoB_r!7DIi<@FZ%Ccy(vvyZ)IA8$;mqi!J>e50aOrmbgY>}Ll)HT2<%i7AMcKWb zE|c$a3E!>b&Ya$VFx{}{tux^*WC-uwsq4Rczn&?i)SW*2bC1PE`ugll_Z(fdbEohB z?k#+5z2;Y-nfyq<4D~a3Uje(Z@bF2cj+tAK?=gqcUo_O6Yc0TILU6xM2nfFNH zBzXV5yB|jA0hnh``~B^>`48{u&%zT2 zkMjA(3GGWheLpYntGu@&`zx#YdYs8R-29W;3-ic^m%^vZqui-|Hh&MNFI(yTQib*H zVrX-q;_)evAJwYAQuTdHjVOO=!1!Kqd<*5D7tsfqyY#-rv;PMvLEc}=x_U`9?eX4N zV|`-^(z6vyD*67&4`blBw?M9hFkJp;8K&Dy49(QVMre%Dr2|h?LU2gCL%b zAD)FCeuW+W9?N*@*VTk~FLJGw5r@$aJ9FE3KNdIR)7<}ZlZsyNc!o>?3?H^@@Ku(_~7=- zj19;c+eB}!&t~m4y`4FG*Vvqk|c*f@L-aA3xUCdwXAQ8K5NU zjmK->DslCm?HinQ^NzH4Zil~reL zy>sKvyE*6T!YK0m+N8UK^4quH-IeJZ7u)5pmJjcC=lOFF7b@xzKl;oLrc}e@8tr1k z@wJ+w@EN0&Ab-hRM zYigI}H65?Ez+G&SyVzQh+Ol`0HGZ0^=PfuPQoWF`>c!TL`}?NuRr1Kb|2t5w-|@}f zN>I78pCJ>li`t3&HQn_?^X?`RA`|undcU9z)!X&Fc}>{g<6y)C9F}6{zxzdIzxYJR zTkod7_n5~&?MaKDBhW3rxh>XX$J&kfE?x`TQTXsILe^%$o$9QlG6Wk36T zp|Ec}YUYm_P9soo3-6Ju5-7xhk5wU!RyqN++|&-<1lyF>i@F$<_&QpXX5bx`zadz z5=II|ySus7*6`XGC*F*YHF%ONVTtG#ps|oTk{V2)zx(?H}d~mjrsi>?w+b2PnFoGm6P&AHHdnDZ%FMsxO={*- ztVvWtjRLNUj;r99A%?2r+uP(*T$Op-v%tVcvAtc3`Vlm0!;)09+J2%l`1xxYj0M(T&1dzHJE6V zKSjw+gt)gw3H9om6i@)5OCDdSjMTOjf2;AAr6nz9 z^jjXQUvu&Pdn?>Ni1We6tOP*1JssFiD>(ORs!;{!DQ?^cu2;j1v8D^eB_=bPZ0=jb zf95IB!NG490V;r}X@(6Lo+ayZVQHC}qJK{QKU(W^ba#=5*HO{J4(~g^zpqFibhhK? zSs9j*+wmp{I~#I0w)Te6r3d&(jL_1qN^Du1ZYrR(p4l4CrnG6vtD38~)!0yTD~+3~ z>L9Cf>$#0@3{?wNAAyCFRK%7~X+~UU#SnRFYYo0gtcvdp%I;Pwz>0d15m@puI^j}> zdVS}SmVas!bL)dl)s8br6!AO-wB?TKQmNUA%lcNO%_xG9ei6hiV*=F}w|yzMpNn?* zshM`r*`r79$2?0^jaW>1Q+-e2iH{|57aN75F1o&98O7FI2JfQLsv8c?=TYQtP-tpw zdNwD`@a-TUpPx(I`RHC|m`^IJJx&1C-5Zvd7DbPiElf<`c-v|)J*^-yj3deiVNr=G z+BSEQdRVh&5bf*o76tDNiqkmkxUa z9eV@Rji4{X_)^fgE>;IX4K@Q#`ntLl80xMbk<}&=Nh9KSmiG&(P%E#VGI^(vj>g`rJA12zAK2AkJNQQyca1 z9x>d;Fqlj>4cp4zS{5JW&Z3XYPw#Su=xuNXkR!^A25NpPts|m(A(Ui-kDgsWf+por zF#-q$lW3IiRYkaO)4H&2hSMkm3{sqBB}ry`oiUnfrfvkVZBS0^PV=hSZSbnuo#|B* zV~o$^CDvG2`dNQlhQ_pLi=F9qe6~iFCwjJdbBRa8OKfL0ORE@rP7&EZg1yiOpm_bz zUl$jSllSC{JDq2?4ZEidyRwqiO_k?taSmTwI&E<=g*ee#R#UEqc0%P`_x{sv3f759 zZw{>oX^JwW%@Nq*KzUZbPt)`PJ{}V9*RSDT#R>fM9n>j~hyJU-zPS!Bqhmq1w%^8s zJS(z`vi%|%U4`y@Mn?y`9nWDfM{+W|{q@gR<#nQ_sF~l_;y|;0c=~(+&X^PKn)B_> z@%YR`J^qNkR4?Kj*v;G@C_aWIH>$ZgGTw`zM}z_Ezi=*!V;Eq`N)$#H76YL9 zgNQ35Z^cvqIZG2}Rx{$1&uUG0t(-L~4Ru!WF?V%`kd24XqJ$&U>xZygKZIDY*7o`^ z!bw^5I@FxZo^DH=YgMPZ-W5-G-;lxjH7*4GUeNpR}N6X-`dh0+R@X+8B3F&wphx_faSu`NfSn4BW%Ujm&VbTB602+ z_RG4uNV2E-P@?`MJWZ3^I?je3Ogh8pYYx5sZ_6gB!?wDbZyvT$yFs7Wjuh33^J7$_ z+eVPw_$B!aie}~#W~y(4>cOd zoTc^Flhop7M~FDh!STuCytVPl`_vP1((0zw*F}4UpSvT*9X9Zlw(>YP#mH^Zj#S;Q z`D(F4v}ipXCXa4Ysn0DkSZ-e29NPx=gj=Z1zpo1bRUrlidSqoq$U=v%;8j#I^tOTV_64D(ENcxUyDNB2}Aai)g)zlRIaw*f3Qn5v9TsO9pH2Gv`u?jBb!y}!t_ z>!~VyWj2ojUt`k^O*S|6gGc`3Vw?`}jJPFESBp~3f%Gf z@r7HqFQbxY6ff_N!^?Lt7T39o!lC1xbWYphXaw}e0iJU=^GMdFwU4f%sPxp2w!qU5 z53ZIzD2ij)t|0RIQBp*$GQYde+LV3z)A8G%f@m@b%fXeKdLo$>pG@3gHW=f`h+|`I z^iO80S(lhRIzk_Y`4ab6I2vk*d@$coT7S5oAqJhV8Ai&O4tIpF|Hp?U+*>TJ$DHdg zpiqMm{gdWwovQuu`w88sZjpAr{w$1C?z%_-uJ6)YCEJ+l^XMD(Yxv{QR8KlK$3~q7 zuSWm2#j+g4ot>TUIGR~5ji@C{gV&+Ts%xqPCYW-a;^D zdX%51(L3Me9_)SHA?lugzQPJO_y_vGa|>`0zXGVLJeXSW+t$|B)abkIjVB|cX>NJv zk7B+^k5q4QoXFqO9wCWU1==QZe)o}67GPku->fNZnSMM87EgLSQG-fH*Oxz+5gbIVldTbv7-GG)ttuj>)(x;ERCuSGan9eQn6uD70kQq=9` zs)oDO7UA!&znIgU(kW_Bj6f$Fb!W)pY&U`6B)j4fOzI!d229{oiCt>#g>HN=#;TVh?oI zz`ahx?z`xYVcK}=d5yyD>7!e;8(SK7i_b`3t0k_m-Y}tsM?8#g=pCw_{qGH(dcGD< z=tH@%^yj<|nI`|w(h;3L#ztr!M4LT**ov?<)E|^Jpy1uZop-YHU!pB=XpwHZK~KF2Bv#o@l>nk+rhA%Ko;)>!HVfx+kZk zWK}72iuzGt>y_zx?6W_H890ME;-JiBd; z0b&hdRo}jU_35X>vv=>0&tAX(^zM~I#uIFB5a8H@d%l(a{bbU|IUukfgh}EK#4c9{ zr@|#zuzPwEor>kk-E2SeBX2?mq^cPawssR<3cD1U6Tqx4HW$ycUZe;*{o;ArPNMX( zyy_QgYhLcAxae{S6ZgLBpQyNxWZu04SF%-3{lk?I zE430mJc!#buL&%5wGCA&EJjofv5-Twm0ev;0l=;Vfa9&JafCxdFoPmpZ0>qol&vT( zuORt6YGLhGmMhCcTDW}9n&<%zcYBm)Wkw%}-_t2@vc`q(qbif21qCmej0_f>^BneVC^vD>#wmdR`udzo)feNM-AS6#K96}1mJQA~CB@$=J z9s2-6l+sFtCof&$!Zn21REyI-9|IkCaCCHlCo)h#Agkh7u$D8?T3{~k50ZHBS*?#_ zXfynCM*jkgCDFu9PUMY(3p-L8;&d$%duM_30o_LZi~!mp1Eo$ok1k`>bUMfYL#LE} zeHmY3@t16PWCT>HQX?2m$bHZ6ku85~a!Ptjz_0`izXias(FhnycXtPrI0ictra6rOoRj2oH;<1xJ zkAfE9$=g8A+eQwD_6_A|J9Lzpr3k>Yzdchl!hdB-QavIAp>H?U+;6;YkOFji3Su?G(0M zvH53f!HRi~8d&j>r;B@>*1ju2p8$_Pfqnw&r-a(FnT$93vSl_Bx!g z+YL)BmPKD;PhY!;4pT$ZwcM%!kI+Slk~2WM*V#?46{9(a0F7d+eA z2Y^aj2c)qtMtS@>y8D3GB2bx=jUM8d_U%CLO{r$&EpP z+yDUrAlirj$cDdxgb3N)@ppHC9NAci96<@4PKpQ)vFx)u0FVp{F)Ukpg0srt1hq}Cfy~`@LDpKbJW7Vjh#Yv_3o03Y!ub)&3m!#5H zAe9nE9F2qAO^`+c;;4s2QtA$nMuN``B$8710!bwJ+(a5Fb+0^f$0?~xsC(y;7x1|U zO`XH%3y)k2!s-|JzV^s%6JbSVLa~4wbWnLv2-2#8DOj$OQM9A$xI7L=ht#yf^+?VE zF#Z&jS2#cAWkG*)QeMOO#<7u3b7Rl+31k-~IeuA$>>?^{lT{R009R#o^-_h=5eFO< z1!lpm&D2=Ls4**&=D1uz%&BE28jaOJJf$25ifNq%nf%QUQ#qZMis;drNlWE;uq0E!sY*CR`_d?}Q~TB$R<5SFUO%&NSv zM<{Yq#ig=YKr0Q)a|Q_ET?F_8Kb$@nlwzSIgH4P76~RdQO_c$&T4txbk7Y1XomQeA z>KwcaSaY(lfJf+HR?nS?C7K#hh__kPr8-AOLb5wdd#%X2CK`}l7ljbK2$Ld$;x^&F zeudzu*_#w49OKUMF~F#y$cX1EqAewVfZtO~P~T5liPxB-lsHeuxmMsMB-pmkLQkuU zid6qoRuoYB!V6mC1>~BF30_>xSVb%_V;Ql?jCI5!b1!6rn9^2=cA^#<;+~x=kexW6 zqq|{ti?n|GJWhuk*;m65EQPlS&k{&3<>8^bQGM;Z*aWq~e8q;~dbNdvCXilg>S__b zr&bUb)mRW%{3oo)#2ss#)p!PHRY%(nxiz?~TZPM_99GZY?UCILe|LlIZu+~MjOQYI zTmBvjf;X3f;H4n=*UsHM>V=3hB)P_r6hS6gEgrcz95#7r2fYB4UpePkdTZ zBM&}`=9u>S1o!yz5)L>QVbZ=Fay~wXZ7X0;Cy$Zw(5cV&(zLY{?R-t(XS*J#yRoN}ZgfL)J7Y1zW!hnsb!hoJ84A|YZ$pVy{SGtT7!-70eWeYx`9S@P!jE4^o84z}>tN1T`k``MbU|uCx5GPpkI3LB$^wqF@!;wOdWwn5JGD0BgS2c{zNHz`@DV^0^(-M2 zu)r=}Qioo~^d&?n13iN?x$E72`D4)Om+R}EUf`rW6=UI3uw}Vk-&k+Dg|!toQk6BY za*%vfn3Pe7HY)G3VWjXGRifY>E2%+*qJl9`KTKYQWvFDx1A`sH{wqt)PHhuA#qXeA zh2I;SVC1s?E~H*HMp`kts(R9E0m^FK#sKMnj=}NM*C8NmS_&D0Kz+O2L6&OYUFdcT z>4*dmzV@llElQe}B1(*+b-5$QX}s3Bx|u9PuP%rOi!?@46-mPMavWZ&FjGx-CA2eh ziiR2m7uNvDS;=&ing$svt|3wdatDsO$j0AX^cJ;?Q4#~Y}ru`F=*@L*r_c-T}I0IpsXfofA>3V4md@k`t|HgU=IYL^j%i!blq z44Wl|6)=Ehu{WSqMxZBm2G94oe!e{`IH|Q=e;Jl)ivI@LwiO1GJYZGf9I+pG`W&PP z(@RAG7uKY{4)~6b%JhJ{@D>2Z=>T@Lz@Rsr%lj9Td9xSjfiCd=2a10Fp(`7-TLS5| zimPl4l>kCz5tqT0L)sL-!Tz++G2d8kddQI zo%M>+ayko6!vV?{gQL{`!$aI>WI_-NE{L8SNro5fPKOFLDJV%fO{xal8fFob;74D8 zlxIc`7KSvGS07MDKc_0T9Hnr8!tN--HLB+fkfAS-b+yX~D+ZC9k`Bo|V$)`&bd+1W zCpo38P6MbF2l2xL(?3{UWq$$c#ab=p7R0oYwJRj*aw@PE`p7!maXmS7Aeobs^pufh z{aP{DLf|4^QX3eTHA%*jrpfhts9dbI@MSun<${q`J>gHaMH$eP%rNTy? z#>tSz$$-YG?GAE1(6M)q>;tjyTt+awBOtQR6R00?PEvzte5V@894Nu|jFsV-reqHX zl&`KR8yt_Z)?(ty>TBc=+t10wz!VC_T7Ma2Cs*eZgtM7B@LpAqR4AF8*PYi zjs%~kpj?4hLBhlo78Rwga=6BV zkBwn1Bs3+32`QZ8XmEwsK6rtks~s2gubX-Mna`Q#&(U3hwoEauIzU2KO|Qn~wV4BS zw~qK$;&ze2o~xLLi#ckreZNG>u227^t2pr{p4Yw(N3OZfshE~P8~uhxfk=cS2E{UZ ziK{WwPgrgr^W~m-H^p2`TTt3|QG?iZY(;yk6?(`@j{O)HZ--O7M=7Htu5GO zfGY@%_FXy~)+OP;tEvf1$AUHBKBss`u{f=m>w|-86IVR2XnSyRQQHJ6pMH3lXX(8g zIyGhOBgHI;9qtI$THTS1bENv3#Gbhbke!koGsK5l8t;bK9FLeQ99L?vmN}=pCtzVh?Bg0CW`*GNa9ls60kT-s2KR--T09 ziFy8O9E~F`Z&DH-9)yHRNo>6PCclHe*w||Gk)IhIbU0MDr0V?Cog#S=d`@ zf|8oT#k2!w9iF90YQ1hB9IZG6FqGoEtLxCB4p%1EP6su6pRW;C*4BzF)NuA`OLPp7 zywdS_w{BxQHX=mgj!0$mSE#}u@?ZdY+$iXH#C4pt2-#g=H}J#m0~fK%(NS;TXvSjUhrGPhH&EW09* zJQIDfnt4U~RPME50f2kz`k>3e7ls1Gi>) zgi9xdhSLgF&kg-3$S_+xwf>Af!!#crG89pw7$KnR`5K*iqZF@$2SZSb(-yWL$z26T zPSByz^rg1&OWa!p!>&egu>~ICek>YF@xAdT*53c30~A9b+|;GDsXrNTWma2qVEW63 zs$E^TQtOb2NpP~D+aYPt>nKb%V=C}52jB3h9~P&weFu=zg$>NwG&d47D#{~*`%!oq z{neLwXhTnv2>$!GddA;i)Pakq{8d;2e7R&KAnJevS?GyJJ~=>yacNGusqI@Fh*UMI%3PT?pxqP8Lm z)yzXwf628y)-rjO6y1qW{!aXgsJ^tSM*aZP1)wHw}78AhgEMMW~N& zGF)^Lq6~E2mr@nV{8BQpWZCP^T2_r(N(1ou-vC-ln;MeS#-{bmhp&;=ax9T`ETy9I zDhGqaVr~7z9zAXWl{3-2g0fJ<62?4#u{E>|+_s3-2$yd!ctQj(96 z^>wbSq@u+ckc`?l6?$taC(&t;v9(YotlIPCf}JAIulKNTCiv=_uC8h;%pKy`Q?W7I zYvb`%#BF7iCq`7>8V)Pf2Hu8v5~L4^aj85riq(fIG{}vpVbQ^(QtYZT4@j4W@p?Xk zm$<~ymlB|nwzv@z{`V7NnUw5}*K=X_Y|0#jzIBSR^0KlrX<;?~{^^KI$6jktO3(f> zxUW6sG$d+@>)P$i>?Zt^e%h!6tM`DCPfd40Xrcrugw^kj?=}O)f#qMo?cblts@9z4$yJWBD@Ab&uw!gPMIVIam zRqv&$_isVfdt-Zw(+}0>N0a8ap!6TD@Y1imgQRU17YJA#8t&|vexaVI^6Ad6U*2Gj zM1uo4#Cd^@w%)>CI8RqBrz3odVmUiLZ_4P}!aY9H()Q$(7}{>yx;Etq1-43gP3nH5 zs>Ab0xI)X;*5vd3Np_020^cU^zNsE8G_@9TPdC|52@51C4!ZK}Wzmu!Hu`O1yGRE< z+i}wiIZ2^WKQ!R|5a9jBw!g7WO?q~GbeXWT)T>{*Oju%?r@2hn+|_(0Y$1xtrIo~{ zVkI%n$jJ11z)=PX0~1N4Z3^duoc%=&H=&^mhv8HDIi<#fX`6weXc!282tz*RSsoP< z)_0JTu&&Tl21CaGCM4lTLu_aV@No&_59#9{%7}hKD3zjAXh8F*SR>JSSf%w)y!AEJ zozOS*WQt1%s}WPBe=`*=)U7&cJDN!+Kqmp!QotDL^GsljRA3CIInENu13(wMOX7b? z{QufPa>!sXqy77(+wFM-*a7zM2K{%7{=13)c02UnUHo^CCexprEV+yS_Gt0m4*i#w z>Cvj&v4xtIgpKU?mJ1DI{*Qg&lU8iK60!k zp5wZ4&slIU)M5P-2Z8M|)wlq*gvCNZpd)Bh@e+yh+*i!CHo8)vUnmL6(PtTtj8o;0 zcmy-+q{F%!MUe}uKthjtZ?0B{yEVHg#I zJZ7_$iN*Mw`V6U3c=**SA*_++PUSS6FV5+NBs0J^ANWh$q_F|6$7rzM@w*+;?fTs= z>Gu3?k90Tu?gr`Z`rTd9>-xPe>23PGP14))dt0QpBE` z*z`9x$;Otyu|+m^{f%9++3`0!6cKFu+hot*15~iLLVRG~gN6Yl|Ipy&wp>&pHg%pyIPYEU4D)KE?~zPb$N5VIYPJ zn51;Og{Wb%2rNs~utW_@)KEhWy=hYV-Xo>-v+)Gu3z+D`LhIQCRkph>s)TOzQ6*h!9qDcFM?uFgpSL$Q;8z!aZSPQJ z=blh#vet4wrT7!D-CO+AuQ60;K9MQb?jk+&`uc0dCVi$DHrZ4;JYw;>vzFq^w9SZ1 zDHGW+-&G^`L zX3f#F-n!AXHY~ko-1EhQ!_5|EeNdipW{9ztQCOC|$`VyPRi$W0V^%izG;XC!b&7J~ zd36gNujbP6Y7ZT+rp)o`*JWiGE&Ov_#OHBBU2#fI<|ouda;=<5y)Z=oJ(UpG z&F4H-w^qE3b0w*$0>MFKaTQip&ZV%EVPhxc9%tqwR9iwN-vo)Vy&|#dtc2dm@LgXRlCP9&Qsbm^>&&EbR+`)O!pNFbL6rROQIB4d{7!z zN-8UDPnGKBw!>9{CM(@pn}{Gk8|5JW6cLJT02JoU+qZDZBjAe?&}Q1f#9L-#*k4Sg z4Y7U;8*s?Y97Li`ljem%Fup)#l}*39Nj7)<%^kA2=Wp)mJpD4D#FD4~)e~wV*Zuwq zOnur$WQbnJD(@Brx&o2P-i4~qjZPCnPAtxn2PCqAgmw~yOat4Xz7i>tPNs+fnmF`X zn$xC5z6O~XD8;^KiC!(*&<(&&s9cL?XEDU|p%Bk_AVbW}!xO9Ejww>xxMQhEji7BA z%3{eMFTw7=N6lk#mKWeL0EU9P1QblGP(N1R@fPJ)pQ5gfy!CoDi1{@yXm(xy;wNYi z&$m>)@LQeV3oVSvW8TBg#}|0(hB`NdIh9I<8GJz0IZUw{_rWEWpP2qJ`D@uTxQoJ* zZ>!ts{J{lAw7cK+Gnmcq9qw91dh+7V+H%;%sCpWU(SO!+;q9>>3qu}sfJ|i=Zj6p- z%QiYBh$+55iBJ2YUHiQd!J3z!I}9G20Te zEf{}$QxCbNOMbhZt`>7^x2we5`kH7lHHAb*f)FDB*qD~rHtcv7Dck-WMWf>^OUigu zyh)1~;~lxVB{_IfqbRCw=&EE%vlS)LoN1kxcBs34Dy>uzhHMRUb+HllE^4C(ChQ;M z1q#~3?T`*?^`KEL^ERyN{xF(l+MKD_-nq^IQZvtE(4gwY$8)*4Zw_5D=I$*PehY;? z(%bT8DgAtH@`nypDxRA3i7`Tpv&zN&hKS7v+^KXPuIHWRK5~m)V*+0^JUg95soW8QUvj{USG}B zLUd~xYt0GMaf8d6E!=`YlDuwrnZY+AO2%P;I6;h6(NV2PpU0{m-?n;&v=90qvx)i1n z)OAZyE%+AN0~lWtk&vP*fVhWcRuUCajKv7WaG|4$3NeaMe|!Je3DWt<#_vj~QGGx$ zBWiV2Bxuvm{0ux57KvT{IkAMHug`a$TS+9x53k z&}-dan}zxUEIyo*=6j6E5x!Sw0v(%nweF0Zm*rdRuO6}0oW4*$E#2+kvRf7b zIvWf(ALEXth@#JU_vdgo^1*bnV)Z$)?RU3HchB$ciTBOL9D^)r^d*hH1Z8y^eP>>m zf;B1dt`q_z7^JSNy3BP|hXKQ{trgr%#0wBok@``JFO8N0g32G7RK6^-r1CYfvqH%Q zd8Kpf9M`g`u=snD{Q_-WWeIxlsx0=YcVb_@pSO??u#@Rx__h!sTpt)(tn`7a5JJrY z%o&yI>#DS8&(z*-X}R-yMxTc%(WG^k^9%Y+8KI@BWps7f9~W<1XCmar{j7Z*eqjNK z6zN~N9zE-MJgQdvI!=`mRBWhbSF%}1wMk}eTQEyZ|26rs>1yIGY7x-tC>oCP0TM%= z2kZ7a{t^w{9tNjuY=SbZq$a$NrZRHM+EjhcU{JL=J!@!PN_m-1MA`UK@+!MkLLfvo zg+5tMcZb@rODi3oMZ-D#C8TQG=xakaxfaHJq@HRw+?)BXV|~48S{@lQyq<^j;(E~T z8bec;-BedpM)+wo&uV@e&9|0a`&t@a&Y20MJ|rONN3XN|Hq15M`^G6XAF;J9OVcmI zDTbQ!wY$DGOC{aP$0Vk53VXoR{XLEhfyXHU@XYX(nKdD5mu#fe3vr+kHnVKkk2rf} zS9#y^yIc5%(cK}vj^AS*6}NW$tsU{^p$T4kONU@fPHM?XEnhp#*N*S#H;hw@6-^Hi zbgCpDT2Tf0n(E7s&!0i|kAF{F{D0p_?ynhn3N4+e{m*ff-yKoo0lXyb+V~pWgnjoX z145&d&HEIvzym|1b2EyTMf8aG1PiA*=aWKjF@I*uCxzvc!oSO9%fdcezUqs@Jci=T ztGNW71@&wG1cUKM;0^_AFe!-Io$FN)IZ{B5vzne4qrO8T%R|O2+p7bcD|f47lAhla zu1R`JPf<&-^P2!WTME?qwZNIL3|Jm1VYb5;3j~?QI2 zU3Q;lgf7BU2KS7=@H6rmxKBTA;~zrbZTQEU(}IDPz~&T=7Ur-^s$&ix*VzzQ$YEU2 zC{@lxTCd}Gu+p8|nVqiHhKwN{>be{SdbQJ>ppjNKiqZmhx;Et25YBdXIU^|MY&Uek z${|`_kT0tEei#MwnqyF;x^tbTC6isoaU!w`Fv4f-FXclNe5{XO*csTy(j(1<%_M%<;l2cN${?zKm5 zr{THWe6tE0-mIYH0(g#xM6BVtNBa5~Ar`+`boqLicu9IcJ{CMHIb zd07RBH$uYCblRzVo}4zNhXR4C%5Il1byGe@7D`T9DWTnv-TPjN}& z`uxx{Wz5}DPPlIr%)EwyVindOQ~~;`px#9U0IeQo~B0(6!3|s34$&rO4WYF}l~3Yr_&eSj#rD$AQB= zLJFv%?kRRqR`khXQZNRRe?=(MdwEB{&M?eFvbvgB!fvCUjN%U0>#li>{9G+zX0$iE=$I%E^{SVOPR z5V?7&%sP~}B$dPAWSz=j)8icg#cp}TytPnS9OyXYwwcP3WoD`T92ikzZw)Hz7OAXl zzqie)EXI2qE-%Sm&)-8II=!V2oh9|Pq`sc&J$-jx>xo5lez=g7gzyW%7fC2QR8@gOSP6T@$Apf*dRXv{^lIT>T`LC74%81No)ghNkmNil}< z+({iQ$`pF-tGM>GsC~kas>$=h9QRoA7jQO*dk{_0ie`#2mA6oJ3-CNYFU1zvR8Z%I z`xFIN;#QjijCB9W)L;?dJ6B% ztE($D@Ww%RNJ0*BSuGwnyl*4)1=I(i9#U6e=pQS?AWur`iHQ5wR2O&wcRE*JACJDc z9P&hlCwg`2z@EanNr8!|xY2(4Jg2b`BrBRKtmul)YC8oB-0A>N6;oCU*;6M_9gSA4)w(+g=ibmrD_kW?xf&dt_McryI$G{WEiumNBp3#5xhQyQUgS3qH% z`pzDs)bRe|LQ23E&}dl91H}@2Ey35XPov?xt1ujm&#AEetLZQlqQOUyOwF-6ILRa% z2XN3xFCA5dWX199{>f=ydEUKRL_4T&ac1!yo}i~_F!3j7O?kItJV-A}s7WeKfX^EPeBR(I*skB( z_H#UlG5nHQg6u^JRw=N8$V3Ajk!h+Cm(a3mk=lU5TSgcW)cj zrr?UB))ahhq1sgLUZU32<6id+L9KYy%h}(D2mFyAhl^`FwuX?6<`PkHRi6(9jc z6h1kpeDcCCexXfBd{w>g*@VR5bRqG$QAixlDI^w{6GIU~V=Uh`P*$u@dpvQEw96A_)iTT|<3tn8$l|%FH&{wTNlcfcTGw+K zI4ZBi>M7Om60`&AD#e;;XFukeN#e}QOY&n$ek>Ta>f5>5Y4)jez;rsl ztGgW4-AYUPm$AEV)=XEV0_xf9a8ha~G7QoJ?(`2>{T6Dzw7A!tj^FA0P&w+1Zz9Kc z@Vx_%jTWiO7;b~l9KQJ9(`Am~B}kp6gKr*-xYWtSi!(s)>#zjWh0UCa!0URd2vJlm zisI#B)@J;$7D+Eg02s2zIQBoNRzf8GJR6IdxG!(e!3AiP= zmOB2M3rX@q35^AO9hD*a5Bv9GQ!%q|hDk*SkHMlfw{)+>Xc@+-pgQ7K=ey%p#my}T z+f*ltr=B5#!&0SXsnYU)#69BIj*wG>_8dTCfCtT= zwuAn(xgYFj95^s1+V=Qwvz#6>sKC2v_I$Xpv_f7|#Y-slR4e4UW4Jv+PXRzzGl2}7 z7i!+No(J94)sQ>bA}hHkVO=Q9(-fOCZZ2HW*>z0 z$r4x*Q(W-kI7*J+6cGS_ifRT7OKa;vkwWs<9B8g3lO16##ocguhEZ;AsU}=)`i(`MopCZrU0W zjt%c8dXSY!Z));HGp^R6yy@3{7IpA5E!`OLW@FFa*i)ms2?}9pSiO|6{OYl=CSgH5 zyW??< zvNz5U0{8S+&z?*-)c!^|-Tp>k5e1FsgO@Ze=7h`=9BC_O7aalnv#}#gdX^^GOF;MA z0(8GoQ8EV$jDBC>X^#t&e|VG_`DcZunj%Kt{N^^&zgj8EQXsN~P+v(Pf-(13+`t`=;m9jR_N!EwlCOSsQ1~pVra<}q@Nhp-^OQ;})yFjNa+(u% zn*b{0t$$*&c@owMU$aQcdI+tBQ=S@Dqb4T~lN5ymjE&(ChlV54t@JE=%*9K*7L~p? zwH&9i?ek=uTbiyNk-1u*Z=gwraih2eT0=|o4y)eQV_e}g4COcyp)h3=L9ffBv#;WM z>KL8*R9P1V9KWf=RhGy9f?FD*lNWoLIX$ziIZ!aNxvT$>jmD$82x*2de5odbfZwO& z4T4fy?Yyy?u|Q($DmAIfeYo&8i&GWqMBM13y2e~*CoIcwa3$qBR4RlXC`y||wB{sN zb#_08zucKc^iHi~tBD7dSu#u8Yn0m#sd2JXX5+yX{e4QtOjgaH5Y|-0ysw~$DVsI2 z>r&vVH@qaGH~L%aO}S|LrzvRm_{L!$LTm^c@TB5D2c-Xu)X!mQN-Md}C z+a;2lCtDl-)&|+y^tU#pAaipWzB^JXDmnb_17a>bV1-u zUS6s#m6eeK7I=6l`wpI5>VAVm`VuwSgM0h}`~y7&ar+|vBK(~2p0&ep5}mR)_!9@P z(wg~&wPGNrh#8Oa^KuW5g1NY{Ae=-DU4V)DvDM(_uOOF;&kxY-OVtqN7kQ9-G zAR1w-=Uu9O*K&R$>eUFQRjAnUHq28XnXC0`CD~;>Xx+pirE!6%1S>TVVM~#3}+e0tkRQi z6Jx}ssh1ka6HYx=sQNvLPlFWxsh*=JeGTX&2y}M*-5mrv-y}q~33Mv&P0Wj#MAC3} z!r(#CBmxcJQpE`E!O3Ha88w#UVYDkT8V9p}E2l=wI{&rLW%pE^f+c2~)_HAyU;<7mlnYRWONV*t<~o#JbRgGF%SyghvN z=Ed3J$B$ zfL`8a`R5j$5ug=(fl^B23lsu|R++Uf!Z>M-!n|C+4e#0x+3=m?TC=TN#D=`r;W)yI zfG4v&A5$@53zih%@ik(F^N9ARbVqv^3Ja~fYz&0}?G%7bhCq)X>Huswg4Ut`O|}0) zHcnUpKs(GQ5~&bT)ekgv14+=km^n@hdNszw90ed>rF0qr<3zU9ZXq8Kd44y->4xdB zbsNE&(K=V*4QuLibXVXq3?o{w6~o{sl6y#iGD@DSM@kS$2@py7iJEhg0KJr`=hBj` z(^5G;5N+)F@E?NOrN!G)!D~tBJvEHw6oa?TJ;iwrbFHK3ccE&SqTjXGL;bFNmVVb$ zqjxNBQ71ypBdTLu#$B>&ygIR-!dj9cQ3q&uf&d*#m)V{RYktJ1dewWv0>LSKc2e{NCPnbeb5{0M{bg5`h)%1tPDMe^Zy~b6H z9#O3jSI~On_ic5#IjWjun~MNyT9AR>4lHKWzP*YER}T++)yKYT>7HMBbL@L7vKm9D z5kA+wVz&*hguk(?_OjVgy0P>kcuBnzTf24jI59~r;DK#53`nmb!QKw~@)8r;t3JfY z=3W)qNLe4fJ}RYd?Ys$0D428;3v?>XftnYekC?KlJKdC4!44dCR;^Gi+1ePj87@4^ zuG0QEebhKLEQZDHnGTskH7Jsrf0qKi{yx~Y0pO^B4J)r;=!>)x_cBUf?x<@sHtLSID4rx_wdA_T1 zi%;lILr+?NEh>p$Jd9%%M#-ii$>n|o@dkftSIt$jjP2#lq1 zMzcAClRr)zGjM_GSUa*yqIh96S2HR%BWQ<% z!qP8A;*~otCXi5>^9_T=pV9`p+p6)K4ZgmZv=c6`kd@O`w7Wxfs_V&XUEU?*Z_7FS zem%ak_353_)UOsFyCcGH3E8UawF@{tDDp>@PSzN}WGLL0M|gGhnJ(LX)-EHIy=tYr zeuluDNoo4ri=>(QTeCUfHK^ws4lk(IQH7x3C9f>7}+!=(@o$gv4 z)z+oe+}6?`#*$iEQcF+uhtbo?rA_U@bW5R@7>dk>VX_X$DakG!Af0+UU!8D5<35z( zA%Rr9gk$sGOn4n9LUx$9rRAEtl2??8V$p^VnH(d#d5v~aa*7A%kB_qe@h|JlDyw%M4bShWlY}u1 zZG0f-#(U@E;61pWc<)u|6j|7wsZucC$1d(yXK$C%S-wyWy`W)sgqq6!S@o z1zK+qmFp6thX-A#U>e~4kNz-;+kjDIxY6_ z0i&ont3bG9#Lrpbv!(FKYWvIBAz{DgoJT+*M0BWFONg5U$OG_i$nz?r-G>L(n+_CL zSG80Q8O5={+JZ8_4T}#jD3~qu0|%5U6IwFqI~-<;y!vTtb|g`;w>U(N1)>y_Cgz0f-h;?ZmqON^U;rEm+<@UQ@aZfv9{aKiV`Sw&5`s!P1 z%vETm2s3sOk&%T$aJ}YDmXnwJ(8@TiZ`o$e`dC(lRbD9tn}*?)Dc)p9fIkvaB^_Y4 zRwAJzX2=F=k`l50qFpK4(b{F6ezR76jf`kExNK;2D1!6sR=7#-d}(Y*W@TQS%N5KGtSl~&Kc%Wh(>Df zvSEZ4knI!}?kGM_;AUv3#&*N7D+7>7>a#=r)oY8vw(xpX;#C`SEhs^tMbdG%ezJKV z>3+s5yrlg@`PB1u@e=RCcoWC|npV^{DO$n70n%TGiEA#Kb)2G_V*6{n{h{;=Yjn3qJqlkw4+UpzWXG^G_c68+V-a2|oYkkw3!c zHca_1@cBoN{1rc;=l_Jyzk1})SQlpT-|+co^d7$rbAW%5wsN<&=D{Y*kpg-g2KWzLXkfR`Fz{Y>=B)h!82$E- zpWeK3(Zhk;AwOw46*PRwad>$YmB{NAF4c!1DfOvvz(wpxHK&z0gMQ@^niUc`hmV(d__+SPwp_2%B zoK|Iyl=YL<)ou_3Njn942H{PgF4HB}KTN6^ByihIw+*7vd!^sR+Ap^fPawM@o+d18 zfklEx4ewIwb`=5oSYl{kTE{A}KDc_H52L&xnZGkA@RY;ScUemoYQaGr#20Wx+d%LR z(GINzBv_8%Eo#v-@rz^-giDPU?8+|)f9c5+9RG+dOw6p=TDM_ZqA3`*mP0%H4*LBs z!^>LWn3gxsE9>&T& z3t$s_PP(&eTMTn+F(|Ce^3t96x> z4-6m~!?qT{Zq-dGMCP=$E$u66x!jcNk52dbUl$hr)bqcnq$l(D=6s@Br_?wT*ya`+ zh3`;h>#;YX9D-b9#_YdmpTU4K4;6S~+(hwWJd877neh+WG-nhD;0*MA_mo|5z5TJF ziY2nvxxTD}hoGSdSI8YQcA@D>9*J%G8eWYOyKPXqVggvg=Fws^r(>8=o?dQQUhQjj z)tmrZBP?{0L|@)z<&m%wJ+l>0vvn*770%jkj?Uh^KYDmD%b-Cj9M>y^57b2u8%c2j z0~wy324m<9Sc9A*i--z9#vF-!63H>=3=`^h>~)r_IcMxhq^`xE%$N&XOkW{qq6%Q^ z%ZO_kh{8vhMz#E~*c3TFXW?tQfRX_eAtr_V<>I22R+M)MTwI~*FFq9n(wtMb_7a8E zb>_l;SZa!J*a*W*-Yop$B?W(3rO*nMCLphY$4#$MrKmNy&-UtfCGs$p*DRZ=UX@&VCJk&T3^DjLBxC`UK<7A=-9wmE z?njlnL6Dx5r+%bg>XKk8)o0<0{f5zXl)_sJoU^O)I@vl4N3nxgLpH{uJ;Me#vSuJo zM^H&6^;^pX-LM>*bl~SVuMXe;=h4}__h+yE_U^^oHwR}&$AA0ja0Sh#gi$rkH|25|WU~D;)98dD;G*>$KG}tZyhmVwQUagb9iXb*YcmHOcpLRbJ(z zKf%0Uc)^=6IWKOv@oYfTgxHGixlw>63Vn`bEL>Go4-c3oJQgC!RenT0B%_p)Q+W*o z>WG~yx=_W-J0QMs{{Wgh=;)!-51&ixy>M-fU4kTFc6%5l>yo->OxP|aL=RGx7$`!@ zj%D}*slSCN^d0jg0HCl0x&<(%@{Pwxfllg|DT)Ky?$WSo%%n5Px)Een0h=HqhMRY~ zI~HMCi;J-NVG=i)nCeDs^X6%Q-}hPzvWVT&=9+WnARLgv9V#&vQa#z}!$Sx29VcM& z51Po`QuUE#;UaHX&mwva+#;HVVvQJX@;d+`qCE@U^uwELMwqv#9HZs@uokWT;7~UY zNsKNivYh_+!x}%peKCMk6F@VblwaC2*Cx26r`)!Xa^~g!%1U)f&bYcc`=E~ir7chg z&2Nm;!E;&c4C_!$m-W>((*~<9r+i zO}27uv)wwb+;9|E)V;@f)S~CrXNQi^O3|0_dIUspciZ2?r`_7%gc&!3LGsbaTo7B# zO_6K7r_BZD0|w_Ahfw$TBjGByCS|{U3y>vILv^+aygvW%Z9rIJ^BR?buVsDZK;mfWrb0*PK`jxBG$mck}S zY4pEPl;r)`*{`LoIX-{Cr>TEp$jS2^JRuIZK#JQ1oIAj=KEnGTJn5c3L)Ulx)EKR0 zkMshzU3iw%hx+ia(W%yHT5Ui5Ljue9?0-)FCtUy6i}n9L759lzr*L`qor)k>=d;BO zRa-@+84R+e@W@NVamR{sk4_ahe@|QVe{E;2SaVwU;=9GKV9Qxc*PPLpewD$7k2$%P zGx>X}x7L;*N^N%p!$SvTWj4Y#Fr00&=KNl52LG74A}A<4#>3p`(z#zd{Nq&CLUZvy zAu&kLU`6P|asP{Y%~8S!Bk3Z+R9t+-2-PUE z;52ki-gsYR<9rbL5lKU21bI-W0+>B2OEiFhy$}(Eadl=04n|EtEWL)fni9(NG#{gM zwNQ>XOE@DadQ~&4?=wPKWi?Ytz+BjJ7>qG&kxWK;gxh6g^Hh>#a9;E*Od>Q+w2?v6 z2ooi7dwu#FrYBlx6#u!qJ;L5y__$U0>j&Gz4Tqxq=?4lx}}@Oe&9W z%*`oETTw(tpIm^c$p^wa2$PCoicrX638Et0b*f^WwrRj9{0~T6!w$OTCfgK(#4pJW~6)T_ptjVHd?Ch|_;o zd-|ow(&Ow{o_r(X9sHtijzp)Loj;OG9~2 zb}mx4>O+g@WlRPgCLUqVnZ4$17~|tYt=?Z)dPA*2n6d~8My-P|Mb(|@wUBrlUtTp; zK4#esZH$;^P_44i7_!%jm?^(e=MYmHY7|lQ+1AeyOP^B9($Nu3o-!lrbQ;Q2KH6G| za(7c|Qi(#nD@<*uF&tB>Sqk%vs;_vql;~N&sPt$WCVsF-_*sSP#E*FOt^ z-mp*<|l4J;s1W`mK90D_?-VO!yfrcBZ%;OBRmDLbVp(+YYU3oT3FFAfg?ekR?-VgMAU#0YSqLk8;jK8L` zzks)&#YHiWif6s;?ha+|uQQlroL*#n9%%lFA_a{Hr&B@IwMx)n`WtGzUbUmjgelYS zq5(#f$bBZNO)MS7AZhMW-mjR6#zCR!oERMqU;jmirIbBZcz$*!Hufr%GW*1 z^aPJnsc*|o?3mMKGi@5G;NtA&PJK(?f*&;dG1AdXqNYD*v!km`S~g-Ds?|Bj+3VXh zQo)O%0DPwq+ZvyB}}^QA}kBu_+B7lJLVbz%B4VqC4+zD%FiKHkWgGnm!`p7*8> zD&Dn@&IKf=cNPzwkX2Q}C%2)b^?uC>J{q@^GR(7=!nno_ulvSEQx?6kYbLRnvB?_X z(WICAZf)HJKw%h4xEtkIgd_}7iET07qpRRljgQhw5vw!UN|(%XXXjsvDbt}ZLt=Tg zNk!Uc4cM5XvF3|U#as&gwHsyZFqE3?21g+V5%EDNnjUJo{W{0;GZ%v3^Jlr{ za1ja>@o*D2DiY!Ez4GM{O3Lsnn3!fsc8L*MFchP-7ov(Z?G!5PyR*9ECaeJ;LDRex_%Ba&qrp|(Y1u)oRFEJrKL6|sz4_&I#mg+WF0@J z?yiFFGbGzq^fz2lS-$=1$;eDYhfvkFVF{22jeEs14RCKf4GBKFCbkRX6t+{}I797E zP=elijXbS6G`T=C%j&qdGFLNnuXarot=w{Cs3^(M*~5dIp#sDKSCGZNKH@w)NbGnu zhjpT{4^ckQ?1jZlpxTjH$`h{AS*jqQtLZjO4#=$rM6Wc(PifT{YGbt{eA2GGp2?a2 zC0Z?Y5QB-kSXT#%q9b3yP^*Gmr z)CwFxtKuy!+q|nrgxLBae5)W>%>#i(^HL#Iy}5mtx|CGi)k86p1SaPe_n$0aQN1U% ztrN8^t~n)WRGrU26-tb9MCItSh7-*}vx~zXC8(!UoA{~Zs~Nda-+2p_0i%y{^=xo- zCDWOUqZ(IUAD-3of)@Ap(Hq^hZ?v&3dS|EZBNl_VV6FvEe%ey#3);Y=@=OtpW0(!z zLpSelqWmI(bS(yh@T|rUA=7?rXS^(_--60fO-(E5LiYVWJuC))j_zO*3-lI9D+A3m zL2KbW8{QGgO0VB?-&r+rkG4)Gt6CqZ5p{(MXkelTNmJ!LDjiJChx;Norcy`UMXb1N5t+ks%{kks&dhL?_7 zEBCYKsT!#2p6TV)6w^|4*#Yl8ljgp9t4!bpceJ1PkCXg3xPG;KM1QF z$Fao}IAYq2c7HxXLEd68ejScnZ6Rq&9l@WJq(K$(;bEE<|pPs>VY zLi?JiCIyzps#b6yqHk(3HNl|2%24G%>2l_5IicrV99VWXux_Qso0@98e0)OpI-|*zoNz&Vg>0b+NZ-Hv0DIvfzG;1g5KCI^l3hr)BHxEPxAq{35*)FaW&CR<;(|e zdo)c$SFh%g7kM7up+z+Qh0!q#z@~{x9%qo&7%>~AHuvz4Urqo?sLpsqG#=hHZyCVJ zuqirqQmV=WHpj2!!ln~CCXX-^8X;da738_}5`VhpQVb7N%rAmanCXxA;ohsm3@U2CAmiRi##-%An=0Nct!+rak zgopT^8s#Qc%=vj#ZTc2&JnM6{8;eQG9HK%jW|b78`+tk*qGc>kUH9CM!vN}e#4tJG zL!dp`9jWgRCHQ6aC(t-LV;Hu}GiZspsfad9QXsp=d0@DNQINqry~ zQ&S%e3WFt(qi}^%g1Wur%ohW7q2cW)mX|G-^ zUp~)^;hF`g4!SdSm?jS-9QMrGJt-lpod2lGXq88xvRPr@v+6>MY_`Jt4bi@A?rJRJ z`MTp9Qx%C9F!HU#;#} zBo=)9C#XOt%M;hDu0%=Sm{o1pS8<`xmTHo4Ca*p3@%E{UPAx3C_2i1~Y+kY4gZHlv zg$+1swvD78jY0jfRspds_xz(2K3#J>hp4HXY*f=~@*ZUoY7cCt0!uy8)>!q_gl@!* z8zB^o=DY~v*|Dm4R-J#Dq#S#*|Awu`V(W2Ao!dutz(R}Y1(ZV_7ON@pnNiP=l=h=+fFkN%W zDqlQPFO3GEsyYqH$n$h8{rt)BpEg%VtWs0Dr7P)Tc@ENElokHPtcL!(l!%3q-G`l5=g6QD^Z-I<%QKI;Sd;LM^`$=Pju2_^i z%?XveXs_M4tK}1sezD9%jFrcM7FSkhc`I}eaqr(*D#pmR70(Z9V-Lu4J zLX3J5mf<=O1VCTWx3)`s`w%bbB~hK!QO9D;O&$_RJmx{FJY>Jqw*(gHenOpGqG%iF z$(%mut*%;_L7*3F?vpa03@0$Ax*vD+!C2x*=}Mu01&lQ+P7hFC%nu{YAW6_6;~*4= zDS1BbC*nX2g773cC8J=_;6J(VurzsnGuq zaX1Zudd*#N{hn#M4#G<;_evU9fiGMK+j{mm}fgrD$x%ir80o7?{8Ho=fY zTOEI^L$=`O7TNCj+a0pq^|!lZyXSBB$o7W6y+O7&{q0S%z2|T5k)4je(;+)Of2T)w zcKn?kva{#!?2%o6m+W@@-A+B8GTGhscelyzj=#G@cA?-d+3Waw9kSQ;_qt@S=kN8% z-j=_&MfSG+y=@GQ)cY3kmu(?ratxW$MU;}dxu>g-AT_OShjwC(}*b+JL~Mr@tt+L>JBj*f?LR*bLNbL zJaH3^N*v6>uh^|1sYV8p9RZBr@HY@~B9z};#_wCk?^|M^uNl7&L-LIP1@ZWO7?N)Y zpSJjY4G2me<|??Gj4Bq6M#&xfkVvVDENh8f1JM2rKi6(5G&vyidA z(I2t&fGx{#8ET|iqprv7Z89R(aJnB0!k&BITvH|y@S^(eJ7MONrfgs)SH+OcjJT~8 zOM}pVYYF|A(0>X2p9cLmH0ZAfZ#98`PYd3P@mOW>)+S~J*ogaBV>fbJj7g2%$SZb( zdH^?E4RZjW6H(6dNdAcMXG~b>dMw_V#ho#4{i{R)D}$Q~AJpi5=Iu%-n}+9a(qZ() zU+-4%`?CG=#lfHd`0@RxcdyQl-u(CB+0myDAKrgFK757xtT@~Y7!pc4-&|jwX}!hQ z)PY1D1E@7nZN?UdrGcH3izl>CrRoOifKzQwg`4sfHq5jT(-poI2Qb>`YAMVzqzXp_ z91q}NY7O_pIEPvPuvV`9;CMe&cE{ZG5L>v+QQS#oy@BZfg^3cWGo*$yb7t|9MN?I8 zS!zkwCN3Y%M2U(#`h|fQUsQ~ckpJnS&9}d`0PI(bQDf<9${nKVfugQ+h3e}DBm@`( z9n)6;3{;1j?nn4|#_Om_LQ9EBO&B#C0=O(thQmT%j{zWxNZ8v7B@IA+C|)tI>UYXC z1+#=#qwmoenR1@OB0y$_Pq1R2go=RNh%~^cI3lB;KF|B<+M1Vf8@5M^5U%2RV;{D( zgqp;Vm_O9{o^4ERQTbYu%n&x5pk?gy5wLajX1Zb6V8HTM|>{1L|mN zs6ATWOFp18LFJg#QUn8Z`;KUY#nYx2D$Q;kzoVvH$EleTesTP6r$f|^Qk~tgNTDKn zZfzv9JUvYo%5aV;9S%jJ{1x{L(zghhM(uMH)S*V<5w&XOCIxlN0Gzwkl`>ru-C%%v zEKpU~8COz`9o@s$%Z^9&lAlIeIeS0@dz;n>2704L^#&KEGQasrN^88yUz&AOM(uIh zya#npg;Te|wA`Sv8Rp&zrSSBvU=ece?a>0r$% zVeQ?!BEG0Z*5$(kH6MaM&pYrB^G8ViGY1_ZDRwbLBUKxH9e)8vwCAlkzvnV&i6XrH zh{Y^od@m0mn)zBP3pAQd3?>-r55@^h@m0)dDa)OvB=(0aMq3SFR%4dS*MO9|x}-L$ zI~cnVyjkl}H60SMhW;GgeL!NydUHgkHm42ded+cp9$Y;mZ|ehjEfOCvQ%ftzIB5`dybKc2$5bVaimHP&6~O*N~_PSnY#FnOHo-lIfMaNdB} z05awBHH|!71ouu}UXPw#k2W3OdHZ1#^$RiKBDsNt*FXL2Oo*uVI?t{@04-~(kBQdT zoK&Z{W@)K$4fJWs(4Fr%gcXNhlowu+o`53xW>-XEKDct9t-AXwf4^M|yk|(P z>7JP~fClT`{WQqd;EZQMic%L?V@h`cgW^1MytOXDYmreeq^T6kcplSI=VQVS$LGw` z4-kYI=CUzrIVq9#37vLa9EtVS-C$IU6t!a8K49&S$8SHJeLM`F{SWTI39whE`~Kgb z{r%aqSZ`Ys<|^wiT4>W~%BVhEwy`PZTI5d@2<7Nd#FA|H)}}UYOb#8MI@jUdIqI=E zjcu}@rgIa;yVi`cxGY#~bpiKN-&_orMQoipoU5j>5UGuC99`aWKSO5sBQ$s*&j`BL zk{@`#c?mW!$Yl+&P2j*y8;)xkBEApIbN#nFODWV+3bm9%%_oJDOP46Ta(i$U<}XUO zg9QGk(MVXXtU;4Ns6{9NKRQ99U%+XnR*)#3ynygIW5Zy6�wg)$160J({A4FWR_N z+wkg|+~QiI%xrr@e?{(TugH5F+AH#27hjP}cWV!yk#qObBj@yc~tJom^iOel8? zU%zv_B#?6IRS95#ZjJ9+h=Zdn-ts8=2 z5gxp`w(2X6Jtyjp?~vkC8sbfBbLMe916v|Bdb4G;U!z%#wGPXgQ4@GH>X0pn#INav zsc4TDW_wED@?-yocB)~CX+5SjI!?2pRuxBAsX7ft2^|k zp+PL^=(ZCL{pjEBDWCO%f>=!)B4pN#nr;`j7lPSww%Xlx$LZ6=z4p>a~wJ3{Bn>bfZ3e?*P;KTWalW%!|MWVZ0hynp`Q{AQ3HP*N{Kj3Ed`gA z)()kKqb}KjQwVo6x;~FEt^#Zc$w@3dfZ!RWPAC~bbY)L^g2) zg!{~?VPo_fQZHkQ57?$iB#O5~U)Ot?soheE!~3WcgpbtcMV7#_e){;6v}us2n=8{$ zX$C(y>Y7;mkVuceVogjxBODM}Fn;B?!vaTZGdr+BJk89yEer)+M4Z9}r5gp&j~s`= zM(#&`^+6!-c}7EYWL1a`TEs{rR#+dI@@GBLqKzWbz&bJ1z4U1+T3@Ex*G%7)nk&t- zeM?%Ky69~px-^%UGlJ;QfG+@FrAbVsx8O?G;P1kBePyexeO7S>t0*Z!XFv11&rE*^ zhTm1KO-9sA_uOby(T2e_heQOEPwfQzcYFdC{{5Jz@uJ~8JBbz-`oHey*c zRG4VWCLTEo4iui|eLw|dl^}rRlIs`fMwm^jj(;>GX^E={!$T*a*|IBNP*m%JTfARqqDq(*mpYj%pzJ2~u6n#sJzC3vgMGjOa@0RO) zfU@X`R}P73$HBL{8faN>26}sRI;QguU9_(Wl%)_dffB?$MGE_@Zb1 z_8*=R$1%K~_?gSSYR_B|bfnQx$}ULba;QimYT8j#8y1aWENT~(S)0H)Tu3oCTd7KH zO?b+e^?I5r?dB<)H#`LgA^5C1O)+G;fJiT70hM+j-PNZGc=+JAx_Z#2K?a!T?2Jyo zN-$o3SPhr`FhMfzsOE*+pF)smy&|aG>UbWT3gZIxqsVYlH5ulJJPnu&d*#q`yqsMm`y@&pl|DVc!Vv35+ive8Ny(H_qVFfT{^ZQ-96jyJn8-gOGoE^ zsZ;kFe7cQpVn$<_uW+cokISD>%LDN)=NsNAq|4*?;pN8GrH>G^c}?LmxBl*T-R6ep zcfZ;4fXvgPXhM&Un%6L!cGsIOs7m7hFo1PaG$i;N=|U~(T59iFgfsXp z_95kcz#cfxM!pekINv!N#fI~Ii!JbX&wglTtS>fSJ^84A-5;FU|w&|vc#Ub)ol=@Ub2*4}+) z$jzRR*eqpYGiJVY2w#tot-yqAC-8cT>uU^PO1=8wa*HU-IpL&u~ZiWvrbF=0Vp0Ktzg*VlJYhXx;; z2>jk@Y=?6cy(sZq;st_Sd;?#PA@@0}9u?8Cm8v&F86I%Tg)f>*!bv#g%mi4xUcWQh z-0U!fZWvB`lRhlsaG^s&>0a=PMkt&!v&aIc^({5-si?qsgiY0i5Di-9BUi-}(yWWHcN zi+7k*zKB7F9)B!N9Sn!nc9fF`zP>K^lxnZxJGu`251wf$P)2 z?r)gk_X}XR+?7)PTm+ye?EXMFnt6bvH@8e>80L*kkHCOFV=~aD|d?T z0Bb2WH`xM5VbUx5fPmi5JB|$Es~PL)J?KS!gz)eaR?|J}WQ@H9KFljv=^_OJ6!DUo zi7s3N47ir2q`{gfc!7~YiM|Sq)DjKYJ8|_I%)~a-v+@HZ1@J1rC(R2~P4VzLE+b^c zQFNGifl^!zfM`ZswtANK!t?KM06Wq=_Yurm(DHhsx+OJ3 zs47B5u5p$isJ5bbMcT_5x1+5nzaBj;7?QTNHSc0CHEv-gtEUb`C--hm8VmmIANb!J+YNt$+7!-)S9Xyp8*7ff2595GqbWEVZE;66xomX zOVRt zrhsJ(y`xzMtE^Q*NwoD1^Bbm_i}-aYijjVm{9tZv*GZrrMc zg6Q>ZhHV&YbGt0;5Sh-Bz7Z)FRRGV@Ktif0Q$(`dk2Pv^@&4dZJ9xMVw7rw1DCmY^ zSYB6ZmCHAh#RL$)PYP96u-3-YlhrDq;Et>haXM7BFonp+HPM>u0R&m47x871>eXi2 z^=FHl!?xYB(t3tkpKA!qa+N$oXcZdBJ+3or}@n?oSZg(X|!9-J(+=@1eoYYs}h<3nW$BiSs)0| z>4oP&D7-%S>FE6J(b>VvgR_IKTLI$!5`~{qIK6{KvQ8b-N=A9u!q3KdKC@F)A5L|J zjErBX+)a)G^8q6fmMM4VF?`T_!;|cMi$7XlSk+j+9c@9JRYCD}ZLI>t>~ZwCs*2v% zh4Kp7h!Itf)ew{mnp)v&hH*p|M#d9T@@4&!Y6z>U)w?2GZ!BZaFtlIkAT&QE>5xqD z@gZdINav2Di+Id!^WiDvDW31DNN=+l?OA+ffx7rhXwTy78V{IXSAd8Ot>L(tuwEtD zr-XV0)rdwyW?4*roF5qY&@h@_R>WM~sv!xI1DcakjI8#ku!u2pSG_d1xuz;S9d+TG zZ{#8pn^xfYD9noiW6c1=UtbqbjIiL$2I{>o*}@#mx5UWsE%B~-c654n{?qZx2ebNK zJ!sdxV!O;4M2zv|_^;%iq3}?z_-=EK(#vsz+Ci!>#>Bt!;L8FnXvC?tVoU)%Z0>Q4 zy43X5`NNu)T~p$nLmTkQp%V+^Rc(mfSGDHEwyF1{+}hq~wkZI2?W4l^We?3h=sNKg z^k5;LE-vGC$J$?Av)>BxGdIM z$<(s^8hcac6Z(=J=vTRZzQYL#c)E>}QUz{PPgK8%?p7iEO#00Mn0kqtS-f8SK@<-? zvP8(4=VjPA~00oQ1UChooKX73k0=S;Fm~k{0o!Ls+MN*tKCV@OTwYH>4nfGy# z{FD4#SbM~$gs<^}TxW6?m*=Y;-NmPR!3@>Uz>@Q^v<`jWFF6w~yPMt!x5obrxBjl_ zDu38=yTRwp*-bk9Kyg3f4^8iS5?@a9@mAvhH{_;c_yJ8Gwi37&CkWgQZFVo-{aKR( z-}9f2-k% z9X)yTQr#i{Tb=#ym7PV%HBFbTM(vtg*%`~-w|W3?{5K)7{|J~?J4AcfB2KM2lV>bi zT{4UGt|q57f{&qap`!TJ@k%pKbCl!-^V8}{W~`<>RiKfkZ{=+w_=b&J!E;LP_(5Ip z$SI@Cy+%_m7@zPR@{ehp-!YGkS$+WPD#G28S&)psj2Nvss+iQL|IpF&*tLQ8jbU}G zoEC^XM2crcTvkJXt4VbQ`KrXa;x@I$E0x!sZmP&GHF1mZS4v+T-jwTr5Z_R|aFay4 zK8OZym-}0Ruc%?%tIq^3#H#t=lVA*Jb%&TQ8H=)t>0L(aB8E-y#Da3Pvo*^l4h1zS>j=3F2iJ#s|+1^ev%;&Rn8?- z2NvT@<`3+_RZ9cTOsFBC^{BnvqD3bU~tP&P0`1=LyVS{5DEeJ0QISH(#Tx58{m{wfp9|O9=sx9~^ zTw4;ma#0OlhlTZ!I{Pj3QQJqGItnj!3ZTomnpLwmokt{lID)h}`7Xc~0af=KLIgGlV^K_qr507XK6%{1k$ zoJ*4Yj4Xv1KR+WyYkFmJp^yT2Ft=MgS`{vkZfNZ0^5`U*4i2_*uv{QrR7Bf`a z-8byi(2PyDQ`=i@r?xO|NXxoxEq&Qqi{genEar%g8+TOvT(rr-dxG?>$sI&e-l0+4 zLT{DCHmL-d0XT7rJm`3Mjyh`0u0^tmt73H{cWds|?O>LcXwTUeRO)A$E?~%Y9z1^2 zUg4w0P(P;#Z1PnzuQ55WXvTIOrPF9E(oa%Xx5lZmVpReB@*{m=Wu*BD7o@GB-oLU+ zQLI?{0Jr^OlOK{*EdETkch?kX!C>&_?p%gp7D6$Sgt+mDNF?>dEmn zBu5iA3+{4nj@22p#b&6<4)}+cJXx3}G1Cg8LS%<41*Dw$VdVNo&~K5gq5@Fq)M!-e zRkfA22)B?;XhLAei;u3ZO#ZNun7uK2TI)1HDLdldInALRYSSPiLP^=J@W6WsiqU&C=iAt9kddck&_o(K3LF^5+-!@*&Zf zsXzSwTV!Wxy+Zin)b0e=$gS-|qky@I-A9@isy;9F@!IR7q-zi{Ge0YXTqz;Nrrr8% z*6Y{wkT_9+>O~zkF$_pA(02kv-_J~YfgG9a^`WHG$pK&;cKs32M}F;C(G%)!tOCl$ zvb$M`c00NqLA94zRb#iNURhBJt+;KoII%_j5|S)nR)#z2wujQOuDlSLF-pzn z9ptqvb1RdsFcMk-lU4DW8PJVgMbrpXsq>|3DF8|UjnEAS{aT(1*s^Pp>P;Hlu38Ff z@>8uzJx_(ku^t<}MV&8KO6XDa{r_b5RigmJEd+(B=3iKts8u$P&M2-yAQob}jXp8MQv!#YOYTlpGu z929d-u4|Z6kPoJB4*?%W7l8HtH&6p9gZYm?qjqajj_(?Po}*4Rc?5JAHhsuQD5pV= zX=5Ou8)eq`zhyp+|1U1(FrMTw(1Ea+5iBlmpYn{NaeyYt)3s5&xZ^FBUT1M3 z?NXJaj~9>LbP%8gSg8-WlJ(IsD6E=inkpGuV-+a$x9aPviVPw2Y*tp^(G~fe$P}gP zq{AHsb(m9l1Z(m!ya(iCP4ohtn^@q|;0k548x9lXUc`;4fr+}U8>+Rbs z6t|ZRz-*@DAr4r~D-@X)c=Sc6Cquam-BJ70gy&SyVbwuT_@6;7j)9@Y@y>dUpBvix z`o(X2(2!(YMFDIz>%&SDob$&`D{?^6bL9>sXYNGO zFze-gGa{{YlaO{4ghBNM)CXTS0m{RPwJW*kN&;O;o{Q0T64n(U0DDQls{Tqf%ML*X zi9{f^sODv92wqFqUEOpv?WWdtDP%LdYkIl{xQuCJ<**p{6B0lcwfC4a7MCb98#8z= z18n5Y)9JcCesK&%H-fQA{a*0(5S1J!$;qT@fA} zjQtg6hNd@P{mK@w(Bw;|nW%?{^vLRy%t*u33NxmE99$g|e z>zi^(v5yhyk89l-qQO7W_BT5yX3+|3#Yg+t*p$rY{$Pa)En&Q9H?S%r>DprM zLm4uS%Dpp@MO9(V5Mg&e*xhI52fM-kuD`z@?C<;gPlEj?{*!j_r0qZ137+iuPo4x% zp7>8&!PAz_EP(~_FbxuRzbf^9RqFk!)cfVO5@Xa@-9syh+#RDzEDNPD2~!dB9JNe` z@RdTIn>JtykYPgB_D4^>`zRbPk(>=+H)Yq3 zYI}enWU7}?Xsx4d57@#XIlKde_FGVXi&cs5~foiivTUJICQ8Ygar%OA^B5U*uw z@LG&Z_XaNACwsw@J#OhomnL49dta~1uh-?*>+&~Vm%GfU@X5YmLV`vjnh6QsqE~Q> zk_pKlchTvl72HIzX6Bds_b7r3#!cn%_k>5r`jNVu+^IxYWGYNjlj)(*m63+i1@~c<6AEwLnW@hUQM;yb=xzobl~QHuH{+zG(0n0$ z2!KygP#7 zTsPmG9K1Y!_kDQDpO0Qbx38N=@86%i4=+p!#WhMOwu9YmA%!rnsHb1As6Qt*j$Qln zpwr~jtYYyL7o2TJjK$xCT(dmqj6{6^PAuAAq^!v5o6RH&D|P0Xlog9|dYLz^vM^lU zAiUvPZSc?@vzdLMv{IOH={Tun<}{GDeEdA6?Vg3P#HDlH_fj2;hjG8SJ031Tf|)M~ zg|=7lbZ(DG8Zj9KOv=%*JfOpfp63-mM)3pD+-G0eu3ypIuW0U+xy;z;~Ss0@zb{T(++;xQJ>-s$8%JpQ*l6<@7JQd8^=KRh8cI9 zDWiqVtykHAc@~<$O~&zWbois;-{`{U2EG#h?fmEV_O=5^xbvTb!N37b{Qf#ivtkkr z0IQOZj$cG+aT@2zC~)v`v%qIa=1J^L=0BCWzjY4MVKj~#Z{eHcH=H-qK{AXQhp^Ha zY7jPLp>MVFyzF5%%@f#Y@8VlCC#)8F@PYY?#;5kK8Ci^O4x(Zjjj8(UWYEC!jkl-J z!0|QIUiytul$KF(_pQ&&4%wYY7>g%_2 zpneumKE#@rc!uP#Te##br&1}b`WG59gWU*`=j`%w9P{v49!eZBZ`ICCFTwPQ^%5)s zrp%(hD+saV!m;@L_^h15E? zu(wCdzKh#5M#A&4hib8n@b_QZI~1bTrmZj5ADb z0O_SG{#|q(i_plQ%T3xJn?p7vpzQ9QC{LozG4#&~oNP2g%W_PKN`xVhhK5Ow%@0Iw znHY;2v`+4GTi^9{OCr{ex_pRSyZU#($8G8A@v)3EVz>RZ?o%0SQ6C3t{aNr?`q9vM z-ML0d&NVc%)|{KQR<4Y&cF#=#7TL#zCJaIpcnix`n(^DIsx_m&k>$^ zqnwBJpvlfUug%8vb5yB-PYIJNIU9D?1V<40Sbuxc?H;L>583# zMNX4{0!mv=38TLnHEuYQ&p>MMTs)90MQKo}Wj3iMU1TL(&a_vYIjithbe)XhV9B1z z&WkUuL+Jb_;`3}))mPgp;@6)L?x)Ztt!S_yFRLj$=;^P0j5tjybrXZ}Y{(p}8uT2D z^Q+nMFDlCK7u*vyQ)U-R>rYxM*g-bJGPQ8>dJf*!7_R~a4D`!n5Ac{^dXm0~(&1Yk zZ%g(S30Y(^U^EUu1b8qG9OH00h&2yAW^~M6);Cy2Fk^te!My?$JpQb&ALMy-XZY5e zaD+&vCt%J;{A37E$q;#jif@G|zlGUpL_y5L zg*}Wdoon!D>m((4U`dXZ$w2KYqBILiDLm;=P|A3&d9>w@)vE1`l5rUemZwR_SbCf_ zVMoNDk+tH%`PppGJ?yEQqBp0cqP{J=w#af2W9--nFpmwcv&Kgy)}Q@atCRhM`T!Sk zDK?Wp1;mKvCMWe?eLKtkR%B_A`yb)wOtbI_5}*3QGMon~oaB2vWbLm!*RMR+uRPb^ z)iMNmnVM<=%ItL3=AOpd{1=&a=w=-hu0qopxOueBzys|wr24=D`;2kFV)wC37eN|( z=(-4l2ij-+27`<*GPrOFVG!KF$wQnaDj$i9Eg&AQWoJ>VW1>1CqT{dV&22Qovz96E zsU`PTu44Sbkxwp*eDb&uPG9fE zulM5r!}nrU7Kw~5iu8;KEX9C!QlJKjVJQzrMVP33QgCTVPd;%k74h&Gk@kL*#;M$( zq1uS5Y@qpDi{(KRj6zYP#wCP&NHU04Q(iw*fs{4g07mm+DjXU0g` z#%rJ92$z5q++mCqczuRJQd0K-W2CTnCm*5EHO5G(GW@w8vcmDtfwpCQH0Q+_p>E&* z#FAc7(i9^yf2NdIm~wa*rI2#QQn1+fD7J#6BTRZl#ohvCoR$$J9&O3+@XZ;WTiXI3*XCo5c8ReAi%K93*)iA?n&xTD$mVlQ=|`mh}O_9&H>!#s<})wbWzh-*?{OPv7qeCMWDH_JC=M zG3h%m#h8Tx>ZK1OQGBcV6vC&?5q(=ci!zHofv+IB!D=-IXBG5A zpMKENNrJ!0zF_C;Y6y7tL}E2}O;4a!yQSiKr7{!KENkP&r=62qW(pL6J zp}hr&`Jz9ccaC*Aj=0go{cb>7TnG++5TXWmzZV%JeczB zOGXst)eoAJxwJV!m!O66$S(w;6!=XkjV#C&=8F_d7M0)uzw+icE?cl6fa}eRX;~r? z?>hq^2tS#6?#&{)iA8yB!1H=tY*toPSD8Lza;VyiW{h0ZW0S8d+7j3r%JHOE=;|D^ z&aIli_4OPhQb1M40GF^31owo6Vqc_H3^eX>uVg_!k|Bn91Kcfk=_Vz@HyKK&YdyE+ z-^hABSI97``XD?Rp$GaOLXey>g9=m&0f6BIDU7;Wn>c^>Z~)V}FBl0DO-7!09kx|# zVYwauUT;2bjx#tU0Le)Q5%x8sPI|3Avb4RvT|ws6B^^_+6*>g@mh1C%G!AfB1B3DE1>JyN0@d$&_FGUQ_;alK!4^ z{xjWhOXpj=1RpWimCN}N^KD%EUozJQ=J8wSo5o$7*EQ{`{jn?7X)PD5M}^)4eF6lm zlF`5_hpd_|cY^Enz0Q9u0DxI)i*xdz&Kp?w;(4^MqK3|+*Uk80O=@)EV;hvjCN@{! zrHe<%X}2#KASd1y?$HPA39Lrn5y)-oFWigd3$S>=f^xK|)_4VN@|S=HfjDvC@Zc6S zB+sbcd5P5e{5Q9kc7<*MO1eds~pLnRD>5j1CK zqEj!EXq;WXL3C`>*$_CMIoCY!Y(t=$4OU1~>y2*!#S4(L2JJwrS8+6?ZU5lYv$~Hj zm8R>$p1z1LlQczl=-H?-q+$&Q!JCbv0?4=+UdQ9c0ObZ_3VbjaXGKi@eR)RgbZYN3 zU%q=b$YC}hnI_Cb4;5|7{-d@dCn_b+lz_%{HjKub*-f0Yh?CI;adv~v_FOj0CZFq1 z6Cyp1hZlEFfFApJGE)n_VCjg<&r!ly6?-v_)di8OI4yA@l!`Q}#t0`q1;XYVH`9ol zjH#=skls=zOd6ADe3>)dqpB#bsQ1YXU|6THs3!wAuJi#_rd3BQ?FfjpVD$BdVx>`I z%D`O7b@95oz$<8VaAsoFs|ve5t9GkG($%}h#pGn!6#nh>GM^>_rJw0#GP*;#PO!KblLYfQSurJ61@niQ0iYQxg%fkis*)iL7X_YG z_5liouMDB^)kD=6Po>!9eMNuqz0hCW4xVnCE_t5?PoF7`#+|Q1<*!2JuR`VDrfjwU zbg8n{E|a>V1XUBeqD=M#0V%#JIxp)lVA;lNXq&Up8qBwzdNKy~uV3A7=s5>vhlo+}C zW$FQjW>qsQP2KdaZPXYz#f^1`jfer+;FM*9@&Hcf>+98+sb!r5(>QZeRMzP5LS#Ox zM=fOx^~yIEqEr_XSVqCJHbzl0W&xhCM!$if(I*tNEx)6mtidh4)Haa~Vi=K1Z{`@M zG+^EKm~!6XAMB=de0ClR7fj5I$+b$yqlg|y_=4j5~Ha&HH;_&_ad^G#JYw_!TpjBLfxZN$GPTa7N`uwTt&h4Ik*Bk z4e(i&IGefS(78&6!#L%G8ZLCa%2Zlu6`?r(`k$*VSg%%Tm|npF8}_bD4bv;Yh=$zJ zORw(_HB&-NpnlyD+}BkNU0ww59LqPY4!n-m(6<;ry~CP@sLJeLiijLaYg9&8Wfdt) z548eJ6L+YcDm_B@!6J`4LnY^asBc;CezBLWp)jIZP}jKbr?$GgO0=s148VvzI~FRb zi$-Ton5LJ@JlQVnEiT{+XG08Nc5ea}+v+iMp;oot2BEQ912UQxw1PWbhOHhbdsmU? zuIgHV&C5WAmB;wIxRo_UTdf|Owk>@}mD^mI9z73B6pwPVqwm5J?g2t7axc)bk*ze( zg!!xG<@-i+?>kJAwVDiGvcAsU1A`-QxWtp51h|0)d*>!Q;BfBW z10@l_KlF>Y|J1j5v98DM*$JNQC|1F$h&@&6C~N*CBSGT59^OZ25XWMj1&;QDu4TC9 zjMTYt{Oc%50|);)evw?lGyZinZy`EjP~(L3-84( z9cUO6LwW*%{P_H~3*@yYZ1=u~srbrH`pQoFjqD_J{QKyrPIkKQ%T4uc6l2?3wyl?K z_XCC$u5`S`Xrwh14M9`BjL(FgY9AG#=|N6|bDPuPTo{%ucA=j?!iB!ocm5QRo2iOa zJ0&-mD!NeGn<|i$g*o6_5&Fh_lu=*>-7@;pah#3#K`uVyhm5cnqlZt^Dz9R=u1G@m z*}%{$c6ueZ(}O_?BfYQ2hJTc?;ngxMQlOArKUFMK1D3;BZUxDez z1&8^QLfo%Z;8!sHC-UI(2gddl+G&68;J%`lU!(ihqWdn4B4g+s)+tyem}zy&=Q`0* zYE)CH&AkN7>;ctNE%JrmE84JV_74g-EUNz+Z@3n3_{rmf=X|}wzh2>Auke4Tc*CaX z?oS5o7BaPt1_=w+BS&rW_ke0_fO?%>56dOtoo|LN%c>G8=se4(Xh4~MVc zpS(R{&qpu6=TEPW-ygj?`Gvi_J2*T3>FE66-OKkU$1hph$(xs20)H}_(DI+0R$4zf zSE0_x=Ajh61{-i)0?mq z`2l(?B6@!sZXHY}gA5Tj-Sa%6h>tI(D6HJZ&Pv)Rx$r?aL( zIc{E)?Zno}X~X?6-0;q~5~ZF3dkp14rH}*7(Jj8dSX&3_Fo&5}oj|BpU*W~=@(Nhv zZa4VQq$jVdJ^vN^#O_#KQ;7>npmXc%+I%x-0DyJ&wyPhuH8f*=J?mCVZ8%Mb;uU#8 z+>Pak@A$OpoA_#ded{*9_>`3T`rJION_8&hF0YAJ z<3sbqa7*lUtj~lUYiq8PrDZl9T(O8da8Kw5Yc?~E*-LJHcZLPl*AwlVhN~?u;w=Si znxQ^<{DHnCOUOyoaLpW#`6&mOP3W`Kn0dO&UAPXXmEJW9fH*~*Xbw`>Bu?F8hD0I~ zpi4%nIqw^)uD!=w%7es~7TBi%BCk;FfC4By3_C(|j$kec$!9k`eur355+aea5hk0d zWEXD5mV4r2IzsGq$W67wQ~_0FDBM452hZ9#ACL3w`~~70iCWKQa=IL+V-EvT=nIQ> zTiNww3b!^HfQ!Xgnh90W#LRTFUfd4=J(9k;xrXB@4@5?|Q*H9}TR-nGML~A^6ma__ zG<{+_{Xg#jR8DOk-G+ch8Dy1obHywI4a{!q!zl-7rDqU2G)-F{3i-9J*Ukt!7=0rF z0_!pwH*V3^2qECeq+VtEoRpnq)ZOLL=ZWjMf1iE$P{%-|RmIlU z&_g9B-@-6-9e_xL`3|*#b+y#sCH8)Oy^Rv#W||FSB+3jYl(J8{K`%Qn1;*9kU*BkJ z*DL$9LA(xNvAEP(sDEz$V;bjor`*mJ0|N1o2UB?NW`UkpY>kw(rtvSCTFMSiv<{L! zvD7PY{uAQ{0hj}5MI!k&TqAEP2b05Ol&>3$Jdzm17t&44iaY*NZJ7JHZ;8LXZ7sX4 zm))kanoJF2ALi!to7YiUrIlb>v?Gfq=(x_yf(F2ln{vlnL$wZoUucL<4&>k& z_aJj7=l)o;p@pmGXM?bO=Od^&H-gif*&yCK(z5D{V)usr9joGnB?TDo%!RV0<&d(iN*W)?%7;Vv%D90=$kLm?V-9YBjnO(e^HQ!=x0d4m%?oIJ zgkNhQMt7(+I3;zjpQ2FMcW?N4{C_b2DatuL!^eZXVO>zVI;PkF#vzUn92Yb5Q6LE=p)mBpNBqH+eZ}j-vJNa0R4FN|vLPEZ^J|@!ry2 zj+}_=7|}<3W{#=rYg6`;K86{Upx$>j5)7-$bogLD7a?c#0zrTVDPf^>%j7hCs_bAR z?w@|9KFjF5<_u$+%5}!7t1pdS)e+q2#w~b}4ewxA45sJ|(fE?3j1@;jPTlx(t*rr* z!)mpw3b(Yvr)oPWijAh@1=5m$j~pHO6djVy0togt=0)y{b@+?$Tr5CQAZ#1+o-&15>1Z8 zDUM%Dnd&&?iDAEt*b^=chLlAGPiXMxWLRDismtD9Q&2QKEZ8z~{Af_n<(T!8Iz_V} z?^`DJi-*Kcz~k#;9y1XTM^=hzvVZ#(SrK<3jpaJ}3^)^e1hCxp-C}dRk$77PaZElh z$~E1LysaGbs7ZM7dyo-33&@Bcgw86Ui3)A$c;d)%v_(g0By&*J@>V0)>i0^?kbT_! zJg8Pu&@Yq%8W9n>1#Uo>SBCV}Z1#fHvWiUXS`ckS`0&ia=YSpa`O=$Kzc7vsNcq-! zk?D|B#{y$ST(#+YZ`5_{;-dIRO>GbaUA{)b2Dd?g4p$YVE zj;!sjZIpca<`$RJIH^mTBeYD&fMCPP^fmFU_zzvtw?H=NzY7z$=Ws7L4RuE{b@#YY z#8CgRAt)$x4kjoj*ZYt*D*qvkPoh-v`VJUsJZv_8vwH|uS23&6O^`zu3000&>;P%Bw_-T@p?|;vMAxAnXj>h2>_9qeU;RJOl zq{ltfq|gW|lt?g&>1g~4p-Olq3cifWD7=9;7$ASUqY&!|iFm@L_ z&PsR$$Ri{vj(8N;+i?{{RR*oKu;6f)iH=m=(T&S6r7nnByPdInDBG z^3o_K`YlckgE~CrSWdl2c~3Cp6_=O233K^ zz9<+0Z+!K|&2K1Ib*-t0?Nj_|B>v;vUuz@9HH=HR1t}v=mGp#7yEoY&;;KTF#AKasVM6d)`Nf_rDsUavd2$R$;q2GfQ`q*@9qzFaSu8-&5?RY^ z2g@e&{6x$b_Q>M1asp^JGaM4pP95XrcczLNDNuTpXV<(qVZf|f*v@6flLI3YQ%KbN zsZ)y8G1N!pvTn)2qb6ZmO(3lo%>4r^i>kV?L?q!l{13ftXt*LiF$8dHgB(z!4=kg73GJ3V$5db#uFdalrb;P#*B$1 zS3HL8b@AA31-t5{9c-(Y?VyFOuXI9atVLEcDMcmDD%`Qpa&g&I<-SYhod5tqy%5hl z)o(iEGji2?s5R2OoT5RH%O1iTods`XXLhg|rm8E4>J+yPJNxRRrtT}`bSg6%eIh%U z%i8s(nusbe3sFzGpUJuKtc9XwWXdE`72rA0Tx;?2V*qFvsth0>Kj{^HfqD@CjxqD6 z-u-3W3mWogU?$rXJ;sVvlr`1tZaoR6Ag!YgKzHbo!3oO(7S{H{4X;aQZSLa5Hz1&rq>B7nv}+ijw|a&X$tqg*z;OimErS0RQ@!V~#y|9q}a2CTiDc$G+uTm?ZTw)f9k* zdM$0CV`}N1A!dI7$efrUQzL4;dv2t4M#!h}Mk$)IwV#v8si(L{j!6 zyj~;S$UP=6rWzmV1_{Y~^y{Os;8NDX4*ycEEf!Y_dqCx`R7{=cdNrsbNz+)Yhp`wk z3>aICZnoi^qoYZD4cL#LqyHWnGmh|aPJ9>{`-R#ONNbeOTX5@_T%tkT?a??xH=uvn zZ=njcp0u^!qSV|>-Pv!oP=!rPj78SMOr@;CVSiG*i{24i7}5RqR?8!IBx#t1&ZdLS zXTp^XtIs|g*riNYmugqi}$#Cd){t$91Ie%7BbI;)3mrsMyTgdWt^@8j=^u<9hY~!)hcWvWG z)ds}%0QMU3W0bXJb?E_>5hL=s)vok{sBML;-#%ln=MTTN`ytRagD_akrhAE;hwQ~fAdw-s;HBS zzVN_6swMNIK&gg{FO9!X1I zFn$-BhIOpjt9rC?xXfmxVDaTNbrPk`hry9*T{Mx0k{O$vUd6Jo@QZz1UY5~q&MJXB;$N!i{W2_ei+t<bWw@G=GP0L1<@{x!`27Liy0*M*u z2c8I_)`!7-(!Qaus~I?`P9lq!t`i7M-tEuVDObW_;c8l0hpx$13$-%^lBLSmGm z#^{^>H&rnYM3+P#dCwB&Tb^zVhnao(EwYP+HjR%IeYA~n4{8?bd^&0>LWR=LVUr}E zWBBI5joG7^e|;Nxs#sA;=YrJ_MHoq-kL(2o^E>qlA|$Pmk$|V~aV9*bL5tGe?4l3~ zx$Xz0+wv;7y)u$`5Y74Q50Qe`=hX-w5|YBgD}Vw=p8-app8%G0Z~+)J0E8dkzX^FL zmml--V{CP`Qgyi8bLdVVz*X)$S6NY_sw_NCGTea9Br30XN)bo-;0kj^#TC!&po{ut zpgnSM16<|tC@eYIL4W24284CFk`|J{X!9V`H)2YY zoY8sBa`&0e|0W``Z|(c_oss)zc5{m0(j zK)<2aE}4#hL<3MJT4VtvXEQxS5>G68;`8xP&e_9DbPy(Hp9AeI6J!5Zc>M{LSYry! z_&vP-h&rs0xs6J!iTktX{|yHUU;hhU|K|Ds1Fysn`UkxKkLQ1b?-tk)+mT?@YBHV6Cw;ghc=i^eK#iL*}14v>YRf3NEqx%&r^ z-BZDtBp7tF=OGa5OS;DHKBHeoL?Da@WO7ou+~xe;$@$A)-yOU?K0H4?`}NJy8tEml zOSyzA>KoT-V&HH><%>;TLBVd5wG=~Ymf?+sTje_TVgxC9%^1cVIaC-Bt2E7()6&lk z>mL86!mq+Cj<6nR(stVXSTydHLBTB=VFityR%`OPqmr-47At7L5z*4;A5v8r^n5g) z!kwYjHi?F4HMfa&VU4~0=JwuSw6gevjEG?q?K4jiz$0m%O-r}!7q~LQwT-jaZ0|JN zjxPgRhvv;H(K8Y6+Q1$x@_5_DjC+nhhPLmlP8sYuG&HL8FSK_np`j~VI4kwSXbM2$ zFdMQ(hzqf?R1`;1J>V|n&Tt@_X*Q0_Msbx*$3tN*f=HK^e@X#RIf^6uN$rzyDmCI^ zgutbtt{LX5=kdk4MdJXdBQ(dzQ+>0|N+$giy$%9*yvMH1eh6K6vL(koNg156jZ5Nrt`(Uzi_M z$guFO`9(QK4Bwky$f)Tx{m`4Vym_s?$Qh=*;t?;1s9@$suQhWewmC$)vRjfDm-uAZ zFyRD{1(Wz{*faTs!41Oi73(H;yo?-|wH(5f=(Tvlz8cm;ug!Oy6T_D1wfT-SqdQj$ zf6=GcZrNEjqw8T;U@adD#|K=Y4v34n7pxNArWJxECE@LghZn9se0-0snNf~(%YJ6dF|=R+3y3} z+naXzd;jq{h>X)T*HwH`FQp-e%j#px>Zdm`)PhFDCX0xCLPyCsl z+?DYv`4kb{wzZ>?KRhCr+!M#}7juf5mjM|wOe zxb>t?7S`wUfo5>+W*VFFW6Cs_?W2NyvQ(d0?F37OQ<`M z)4Xk)4%W=Hztu|oPn?%B+t2czHuO|er8B0|M+IE~rTb)Y$GXAkXqQi4USEx#ewCLi z0etl5^eo9X{(=>?H72U(E4nt;_{2DGcpZOJK@vCKhy9@Z8tl5G{Qy>fHD~;M4)Gvr z+q#$?wWi{nOeIEMjYR9PG|VMHwyxnXZkS+AWxLw}D={ath>EfDOUgVuzMGQc&tlQz zjBSf$az#)^BP;_uc`=Oe&>5c}fD{zJmb05BSr@00{20*`JzHIq;Vh(mK{{}poH>GU z6EnDa-7*DLcDUedBzxl^PJ6*=F$cJOq0T~o1k8aPiL#OlLu}= zvt+3?XCx2w4^#c`-1%HGjz^ouJX%&%ex!j6E9`ciCKNM80Au}0xmc$@X@UmIxQ{*x?yNy4)>cmGX~Qofl(hKKV-({ z_F$_YJ0`?avAfooWlW+Ep&G1@qqEoWcc}nvn>0RBvsUv{G@{Gzn2sePx>Z9T_b?|m z>Dnzo#HVFEbID7h1o5GyQ3|@>q?;Rj5 zG*ik+Lwpd^yMr$mn-Q6av^o^#o|lxwsqEf^<%ftH!oHv65gyn2!#BFRU@@qf-~C-2 z7w36)pi2%eH;Rz$*x$I9zU7j(fo*HYe$#EVUTk%(O)|S{V^bgy!ON!Tep( zWi+>=PD_VeHFpuFd`jWj^HhMTnoakh(RXvrs)u$vZjJZrh5^R0Cyf6U#v%{9F_bFB z($Z)r%&3gAuPu-;*U+&~b4Sb4%84#ws@Qn}7BF`9e&|>>NZ`49x{Lz|^wWs-L>j=q zrRT1+qSseFaBLD#-`Yo8=n{I3n}x1J;rR^kRk7Jw`w8av4u_&b=bfK651Il@vnD-o zSU@ZA`!8d)tD_#kJfF`Ha@4KvPCXePa$JX!{1SHvPkmsR9NS~zCj^v7nr8naj_BZ8 zNZN27|LSMa1reT z)|7X&!Cl6@O%}Tg#`@CEhsNBZwfewS${M1|Kc*cD10_QeDtdyD9ySTYdt~AL;#8|6 zSkU+!dO^A8^Y#Xsh!POuhku+d{s4Hbj^XPX5kH|M3ZgaUQ0liz$~1xm5+M8q4-Q#4+g;Xv`>$mxzF;R$1L7jrcFVP$1uG00$>uM+laS`Xf?D3 zCdc8%L*)GE$KZ_dvrW&{37`Nwpie$e0$^SW0@KW-W81)#qXw@9<8fJ*8f$n3N+$3# zc$bavnjlZTN{+lT?Mg8~LF#ON4U)Rozz>-MQ&8RnDSgb?C2hd-)a z2vT#zPQ06)YY7OuZIsghbL~P(ln#>S57#TA zB7$lW?i6w;9A>|l!e*Fz+^tY0Ys0XJFIRg}@rnB}KW^#4J>Ak?z9looTJrsPLuRLyE#&0avnOJJz;`;Rc*t$#Ymh@%cPET3uMqD5Tk8wf=C&U+# zx3G6lBNZuNhJzgsAPkgTE7+eZ(xAw&p;3{#AoKmM5ceZtN6gdQmJvW1@DqYFYVf`L zth1AdZX!`E*nhP3!KYDViroYTQZQe$4A$k{8yrU zI}k!`!{iCA9MR{GD#il%Z3;B5Dc1IONP0Bmp}@8rn_Tf>Zg{sC6*9vewB5vZf*_1_ zcpJc*4t^?=etb}o_biBhYjF6kQb-cKC;u=EV@u5I0~5GGKV<&bM}|z@HEq|sZY$cf zxdcV2-JKn!1k~oW8S>CH>y#=<`4ze~EbT;>)InB%@>=r(Umt>9`H>St8d;+r_OhtM z;6f{tDwuw@9RiUb;QA)f!p(kKcs&SFrk-3yU9qaFze*zw=CQOemk_9n9MWCP8yfm3 zS2Q^U1Jl;^4mNCUiGV?9*w-SI^YPVahQktkuP7@dW{=~WX*>!?IKkWro60r;Ms>9+zDkvZ%P@IuhmXO@CJO-n3mlK&=f%Bzqe-nX5|2z z`0F5;Thnjvb-6GXt*wxXDA@%rs;tcpA#9k=+nL#=2t4bT_Oa*l^^{dC4I!)bdDiLP;p-!6>%lq|?|JlU!A6OWF;(M<0<8m+ckEPK=6LtFP z6l5{l>=#KO^M3o1a$S0BNz}3L0mkePCjPD_nI(8|7(AXomQqa6T2JVt2Qd16A=)lL z4yg(Np(lqhU8Pi!;+(BF3^wpET7O12_he_@HG22^>aGly%d&hE&!I1!qxsv`4IJH+a- z;mv%+Y?_dNNS8sK@<&043W|Sr)0iq1_U99Vh0<)IL66n zg^YzFvWHf*ZH|O%P%=45iB;B=2Y6;oy`wnd9#kmaA9hK-ioS7svN0tzI+6CRZFj8V z)h;7RM(DOBc6}4|Bs;=kq1zOJphDg^U|FHCu@z_z-+ynp_<$^Re=6 z$MlNuvt@wi==lio^CiN2@_GvXlkGg8^&AO(rKsb_m*#dh{b%ZKHsELKb~gMc`ffJm zyS=~n<@FTtC);r_mPO{g%wYJn;m%0$9vla((QkZ3iSe?ghBm=%KvfBIm7#2Bs^>aT z+7@wqe9K$NbORNS>?b0Zcr z{R}g7^;TVOtCX8xxs*Sc{ItDskXGjq&dWfSUJsrw$oy!jk{!;pVvRaKWJ1Kp z1_-5U+mG2DBG#u_vXv7|<{ZFh&~pjE-vW5O&{lvW18(rCDoz6`9!hO4tD1p44U4T@ zDrloOD^v@+A3jlH9Jhip&b|w^?45%He{OlB&+&D-@*}j(d?ww|yQ=3&#|HY5gP#$! z14^Fn!M_yJWS1)o=HQLJNk9og88`=hUC5xR;|*y3o>%rnLk5o&s0YL2CPS=qHcG%+ z7Ov75=<uJCOM|rn;{R*mmA9 zYGTwURPTyHJ5hLIam2wcz}UM|wjs&=_}b7n z1z_~9C$8hVLh3`AS#jY5BE08gpq^6D2}m?R+^!yq zou-4Y*4&DcQ6SW*`zb)T8C7_xol@PG75w&snGxk`4|bnJ#o?vHLe!*reQ=?5;y>Bq z1A_=dyyd{$0!mDTj8@3B1^vu71**h?vjAcS9+wXV$(xzTbcGJluc`8N9XAHrwXqC$ zjtT}5r-v;%=Rc~eLn$QN#JDTbn^Oz0B6?H^r)rl43nG@P#8C#oWqt;Qvc_qz%gK{XT5Uz*kMtPhIm8>kAC=7f0`_EyCxo5{8HzG}Eu2K|Bo>Ft~)=C*Nuc({1P?p*`?N( zg$fX?IfrN1N&q6Q$vi?T2CIzO&|=Rodq+PtN!UPb3kX!}k7OqFd2rlG@}5k6li^&7 zA2;>6TsLXlH`qdYAb6mn{&rO}q z1gLtLZTZr0s%-LBHX7a-x%T7|9^REW+D3KHD5QV5c4yoe zcoi>s|IGkRJFhBLZ243&3s#8(@rncs=q1X`f%{ZBas&Qd{z&yOHq|vCwF*G1OU`JW zqkk_!_dM!*;hOjJQJiDG)?0L#XtLe%ROWYh}{#4^ItS%KC57U>eA zv8AM!hTnS8wc=iz+%FvPP#sO;B|beo4S2^}a)uCp-y-UK+cSA`V zh?+Eju5{?l$i}jkIFLo8QNSekjtMsByUy5=P)3}94Ad$yB~5dbywLC3c&bLE+G-w- z&kjGD9`*E{`D4^BgYB+WOM=8?ZovQH5&LnjSr!O}l!_7H4)P`b5{AG`X?}{bKpV{J zdu@Iao@vy;JX+mx;M>Juih=z?*bOTu5~=$;KMu7GNFV-6sRn9pd|lY(H!BSu?>3ZA z^tA!Xcc7j}?Pe}iUg_LBm91D8BQeGyNF`93!tGLdou_AF+7*FmQJ^*p!kYy5YULuA zELpf%)i}-K7ma6P*ebkRVGD^ryExHg{Qgvk4<8}LOhGG`G=@;@D6UxQ`cP95$AsiU z`3e9E)iW3{lBN%}gs3nmc4B;fy@S@(G(Jd?fT8u>S@>Z6BIUpX+Km-Lt?*?AS%74_ z5=B4dRUezrVmJ z^?`DFun@+AVuiVmF4aUX-DUAdXGMLy>y7c_n#z0DJ))23W0Gd2?BGZvjl>ROC7mj$ z@)H~C8=OJ^&2*TyUF^x$C4Kbz5P2q=WgTALO@N*P4CDF*{e%(yw9Rs?Lm-n+-w|P# zQ#>F4gNGCm(#il-iZzo}YEDv?(1A&&3Nra4Ny zzardzaF22aLF8HXcfOIe93;R?oakkx7JBTH*OXhSpkBxrGo5vUvHmszL(F-V_S z4B~&l8KA_bKJMv9IP#%u!5nKu>d%$}pPsU4QYEYLLx}xNG`}M_gdt7&ydyjbar}Q4LmZ zjY3WbJ^>xJw_kW2x4Q*E^%UxnVBEkxJG?wpq`qIjj%GSrrHR@rMa46J_+1vSv0LO{ zL1l&)RF15S+k&)#rzWk9za)GoV=9Syw7}26pof5O3ti?1%yS<9tw!r=a3ji-zA?^3 z^%iv5&D9JXde+%Skuu}QVM9(p4V$ojlSw z(CD1A#Z%5?*~?1^H(fFsL28kBw1#3mrk^Kfdy2A6qnJ_VDppS5^@_VA*cQ6Qw4)l@z09vTXM)n8u?l>4rNmf(Ean`J8%t zkyu{0i_TWma|>ttu{!m(mNUS^%xRrHiI_=b%0T6poe1xqt(6TOJV0H0085EP{oLuoZ98B-3l z4|SbFg0*k5=3En9_rdo9n;)|8$PeV$TER0Eu>ljK`IYm{5l8_>z^)&|TIlHF6s0ypUkT+GCslQDHlXU@4`J~1@!7mik3qg6lR15QxE2+ZdyeId9UX1c74$f$j)^&NpxzOF|>AfACg>y?uQCi z*k8bm=77xGrMX19-@`E+u1eg1(*I(osjAhpIm%}lW2KD&Wt|x6iTuvd=3&!=G&{Vq z;_{v~^_ZTFRzMaae<`@r9m$E4>o)<{G&5f)kY1IPMterY2g{?=GnreG-3yb3kQmMv zKal5CV=i=;oV?@F_!+7ZTVBSkaSG_t-U=_)kJ9=B=4IWy~6ElgU>+j|55VXog zEQM{1Eo{`^3L<)^SgA~&HLUX@)Z7Th@kE0i6OWy?6)lvM=L`$Nv{WqbIvoM#?*cTm zo#Wb_t$BkcKi?FXvT!49C>X=iTqaK8p|?-6CdGAX}|Li3X(sDW*K5C12A=pg8X9r1*}IGotQ17Xjh z_6c`FeU>cRx+z2J_qGa07YON3^yyN&az*L&Xn>TA{JOm+5n36qfQh&`4=Uv=;5>I3#)l1eKQTvC(g(<3FOy0}Fbrmi}X+>H9 z?Y(`nTw)Qlhc^KW?K@=%i9KXy^1D>8Fg}MkA(*}$&JoRK_0x&WS_uCl371)|xSmBl zrwOWe$dkw1HLKYR0q4zvwI-2P&u3lTgkzprO<~p!<6es(7~%hDIwU zKpOZuie+>za6ERqm%@A0y*618G?WKWF1)u%I-DV5ENOwR2z_pOcD01vaKr>pLiIMi zvx+8}LdypuGicJuvHS!*@2jG~K8{@E(0zFE2<7o- zK=j(CrXwUGVnUSrx%ZBIGvTA4zLgJIFB#adXzj|$T0hiHw%??|ex&U&1hPV%B*^bo z3sBU~wUA;FH$Ex9njxSp&7eZQlnRdBVc$E6?^5|NAuocpZo|7*QSSDFI$Cs5PT%wD zUMJbujZP?p`wiRof_ifP;cfrn&%?t+9EcV?ZKIOHSYC7rHElgw9P_PG9&|vX zmyU;R6k8c7=djpkd1y@2<^rN2szWGD=E1U=pR(${JOUN|JXFB%tp)Oc5L#W7A^NVC z8?RUS0N&V5GNW71icL^517-D6sofQI)fw-dtIB{7Y*%~pYB#(3$F`F%c(gY9UDGwt z>tbJ**Nlh|rhY9zfRA@Q(>CtJgI%ILR~*%eW+S_8rXzfxZ%L_Mj$4B*-7i{H6MUoZ zIcYqf416stzFuFDJZ`y{fMaKGkCA1#v&qQT>!?qPa;A zN>NB2P)I~kXsms}qD6O0PemS1nXc$4IsMp+mVe5HBQ)`imW|79iYhSz_Vo}G0)yEb zX^aH}fXoVj(Y;Fnvx)~(w(-2@T_TRz32jxKdUoY)+<{&kfP5)8xF}fP9EJxu1H(dS za+P7U*D;FfQtrK;(AzKnQ9in-q0XQ3@PvVrm2+T;cu$HLx-nw3q8k>!Q4AB~6ct8G zf>Az&+3wv7mM@sur*a1_87Q66Tokbn4ZeX=$L@P8J%qt&Zc6nuxbYD)6vF+L46aj8 z{hdi^Z{O}fxLviLR=$&Vad*o^M$=;^3rSF`_s z`o3(&Ob{R<=jY?=Yq+t_{VN~k^^Hyg5N_AGBFUGgE4LLc*ISY7*==gqM_y_)&ab_r zuTpd#9p*i`co8y^l8he?bSUkqzbBEx*$9vWpQ8LJ3=L|rCWZuvuwj1rTujB*7gn9P+u|D<$ zZ_{8etreSuMc`TvmlUW&Ks4)&?HTH*YSBlPd1QDYlCbYeQV%P<9n8e#?_li&1-0(7}uvhn?9)R ztB=QZd*H{lkLmt|%$BA<`dSWko6=pFZToiUAKY&#cxn~W+s_4dOKTVIfX1&@SE;cb z16}ae@?{`%qL^FT(6ws9zCt%&4NsqImV4@H$6p^vFm2HqVWum2qCg3G&39#1MMd&r zD)LNPOE)8N)T_pcRBl8Rp=*!ocOdpUJKSTQ32#LHSHQe}NJbovlPwIMZHwY$@!f;b z9XtS-nB9ZV8QO-6QcuNg%m)*&=Z#&i&LQcI=D{DR8;uNW;eF@BSv><=B)%ETP%dGU zSZMTx*~HQNW!axIWJ;?r>mN%Og7>c%=b*KXM&Z9NewuJP(`7o%;?UQeb7k8UR^7*j zOKiC_r0%TtDawo|KeMjiI!Tve(hOD_y8q94{LW+nReA zZ#7qDdPjF9WehstdQ3gfxSCGgPAHJOXBWgeZzo;Bx4xueMIIV)tIbS1TbDqSQw>u( z_=bqKbnTWirjWhf3yVW-%zP(lB+YeIdW0NLQP|42GW@nzQQ7i?inC)>29k0w>k1FCfUuMtN?}9XnZFPqr;f zf7sHn4PcBK71Xttm6eJUYoMzni2+Pjfn_XH8i9VJJA8D_`Ia|f_R;ksp_sDjH^868 z6;?rA=l?wPfQ%8`&DUIzBQnHMbAy+$YWauJqGHGrX7Z)2QkO+Vm=U_wa0a%+Y|? z&+$XJ<9x2>43kWBvsU*wyX-@A`#kWzHkDGiEFLBFrBkof;TKKhEx-3re%GtL+r7Y+y6O_P? z)&8tUXqQXT2Tq^Gao5O6OmxoyA=xrG z99fSG*0pwz?rkpCTYZJj`v^Tr3QLuROiK?Z!UDM&y?&P}=lqyQ=F9WO1@J){s&(j=rOPisg!|g&{LsEsk^*J}+93T(Xh=A<(Vz zDHGJ)47^$e8Q?JuF12FWW0?S0Uw6L6T zz%OY|%@IC1`w)D~ABbNTXY$_dk@drkARR zc~q-oTF2NyB(sI9dOV$omcTl;ZhWA}qD@*u77l8wTo(^Eu;&1`N?xl zeon*PWAbIunwi_o^`~pW?{)^`)B4J~5xcCQ>VM8OIYmX}4POAKBq+1V%b>I{eD^-rp8_&u1S zUFSofrSkc4OmD0;k>}F-%MZKJSCk5R2tiF=LHNO%fHDx}_ zxXN_GEkhsQhlpa4a=w37ReHo@saD#nz0_0Ye0f19=vil*%X=>`^lUn)XjW<1yQ0!+9V#(D^`G_wb8#NJ99|jzV+@#dsk>W6M$K!7QTTi}EsM zAP!97@w45%8w#zV*S8E6%MJ(5n`>yI9Nri$4=`)z{Ql1)TFAk|+UdSGLr$lH#;0*Uy`2 zj>q?fX$@EIb5a3Ip&PxNV7||~NbdCUsqrmH_C0fCSwm2Zdv*{R0x5AJ-w*KJoG+B0yd6Kcu!7==l;rK9%C(U60YE9RA!J4WZ_P&lo)yXWKZ3si zJuA{bhHZ%Kb3~-v9U4xd!d|YqKC@cT|k61z?WM2X>p`T%BNV-~B z{sds4DQNzo^#5c4Nh0ay0U&~=kaY_Jl0eeQ`Go$>(j@_408D}CmfX%l_m$`XspNz6 zl-(u(0epwpmI3evdPeNd?soh^002rO2-l3SwJi?f%P~6ufCMc2lb0UgucBM2#)ndu z9srcH??UwoR6_&5i_K^B6&7zA6<4~Bvd zJdxK0VmZs_;=cr0Blt-->?88h0%5m*6+R9;4m}PKY-ljSvWlh(tn5AC47d<3lIOn* zkena9@IC|pLI7a^NPuKu9zIlp32^oJzX_*>b0Xp3e3^kPK~{el!VeS33g(3H!GGVx zf4!gS$@FFW|7!5#Dc<^8L*x;K#9b>1^;iKu9Phzz({~g06ZR4g3T)%w0Dvyfg9qEd zy867e0%6VrDiYo7u_+Wc4=1!-0g=K9-kz6Xqb1Id$Iw_h3^#eH4M^p})I&;8_?^4m?ZI)tGvGQ-Rr_0%$SJIA)^18t|rs zv%&?DqL{JF1eSuUA@zST1`8s^Fyom?EG1V{>gi1l{%TN){(~k)`L9i){wI-XXeuB* z1D-Kh|F};IIvfMAzA^9k&yc^EqM{P}KSMHNh9N@#BfJ$5d-3m*68#H$xlKd!s%6ym z$%&GBed+}jMFj%^zsrQjG(-LmL4Fg10Q*lx2tqX3&HrQI66?<*(w9M~Aq`!Q7d#gu zcqD>%j|=$^Z9z?;ex-jZ2KtpGHUEDJh+T0w6~AVL{zSY=5L@C9N!XqZcTV%k8aIY7kURUgYYWK_YQxX670YoKK?Yf=14Y4Uq=f3^#u|K}v zbM{dTid!TlevkY)!Gi$Fs_N$FGuAcwE&7dEX^bL%3BSBh0T3?1Gem#+u9@%(R`Bww#AxsfxNeZMy(_>I9#Y^tqJRV>Ec761_ zzYHlZ$qtt6$>$#fXcnvhS`;&e8PAe;)u$fN^j{uI7k_&?QNts{$pQW=0t$#Lfp#hI z{>cES1Tg{ks{`&?@!dY>wQ<5@<$%k8|1k*)as=dO57^VLl!4~i|2DHAZxRhJ$~>+&RMp_ct2270wu#r~tP| zo&go0M3G}C@R04#8APZ+x5ZWgO~DJWW1M*ZD*kRF^)EB4NOT_K_mmrh!RWsU)OU^J zuGA{s&bSlNLc-K2L-x26qW8FKiM%d4qlu}25@N|nxb15iwsr}atGK?l{eP8id;)eZ z$yl4j!OkN)TK}b-jiEIiPG;Pfz_=xbeu)e65EJMuz}NYIg>BGYK(9TEMr#_8%s424 zu}2(v6F2B0_TROkuj9a6#DLoi0JUcUXia^R8M`Ggwu%30GXZ_iTd8m05Mc5D3-JC2 zzsG@)ylbqYHc=v~*gr`!8j6?F#Zg2Q;493=ked!CD4G#Lr^W?Iih+vA_rxmN5Fumz zkL34B%%Td?2ult{OWFQT{#v~4Z43t}RQ*6a$yWXP@ezM5a-6a}@0-p0_47WOTE2?1_R!amR`Xnc{g0Vh$9cBr>9tQnt_N$JwG^{jVa& zxQOxSwlY{=udk%jJZbH?r?^s^OZ%RGfo~xcV-GJW^YjYLcR%#gaa{HY&dg8tTfyW? zv(M5KViV8G5oD?sAci|8sFD^MVVauSso;1yNK(&>N-)gMM$|JBQcwK59252V56{$Q) zVre4av6p9mVLzPVSyt)2sC~3lc`({ys)Ad^F&;hm>O{LWF}h;BH9UImxOoJM`qrmU z+VLP`hB={fNpcqtojxvObKLgRG=t23eWf7Mp8Y|9we!KL?rs4yNhH$g{6!uIL)Q9o z#ZQan(2DxditBJPF;s0o*(mOHT#iAC^e+xg=3t9s!;qu8=hm7Z7rjaTIJed3hhlcl zuWUtSnR9ruJFza#1M<>G&g_XQ=5=oHtBb%h=QT|z?Kr2fzWd_#Da)-(#H%HSS<*;m zWhvzI67B;f%G-F`e3Ig$Iopa(!yZI;Z59PD`ZC+;U#b5*IQWk80jx3=P?(f0}m~>^_vzpWc&MBl$ul+ zY3o`)io_RIPYYNmi-{-p$SDq#-pB06L#}?%ssRrxe3rrYIpY=tw`!1=wAaWOlYQQPv0*mbg>Q_HkcZ9+@<{R!* z-d9#P#JjXhTZ}FJVP> zEb+8|Ucat94RRdaoZc%Q?4&N0oNz1R+}EXhQAK&s&9fk+2&T|fMtfA`ZqrI7^}q=HFK{& zs4KsM7WIiUuD4E&dQ6xYF%Pupc*@dMW&T(!YEaTWK%&>NXJ`=&7)>|i@U^4qO{dYXfNoQaZ2zz^tVa`TalpzW`WTTES&5em?dFzt!(0kweb5N z>RnnRW9Y3BW;?A6=8d4IqsL*T)wFo#q#a5v?Mat1iqX0bt&fUUA!PXnj8>?Q$wGm6 zkY-B{eb~FSD>yg0wx#H^=)veSgren>ZUtQ9>>HYVcus}o#^!u>pt-43oy6S+v-FdF zzbC*`j^hb~$w)5`m)Sjc6Wc}GWMi#g1YB&s6QO1oTLkBHYUiaeQe$DKrh7t^~LA4lJ+BkTD z_!5`NOeE=2$^rvAnbW22baK%lY`5Pkn2!RqgHuB{Bj^s~tRqZb!IQ z!`W7;N>8ms#%_nrET>JSEouKNBSMEpeR2DMrZ6H^b z^0qDr-4kir0jemh{is+&f_SAC)m|c${M$Ml-jT%0VIyp|Ou~K!cNocK@wkTulzne5 z^KyBx#%%}tIyZToDNTq}=j5jjVIU46&tQzgy@)S+(LAWcEPoZatLl&x7qoKihGk9D zf2*bCFz`&yeluDiD=k^Wj*-3db8k^zY&J_T4%A2uUNEZ&#mxz5O?4B{Sk)+MSbr^I zSO{(5-fBq8<-pPfls2-+R$zR~sI20b@ex}qJx)?=Vs1UJD+o&s%WUUeW#zOTGZ(wO zqW{T}$S+r4!%%ezulUp8;Fv|^Yh@;Fi~4eB+KOs$4qU5c#*VVGvtHj_Yw^99i8VZ#M+4R;3w9pRR}A++OB;hxY-H6didW(3m4>3Vn&+jX4QTsP#I~sbf@V`88ELbIW<`!-(G~pgU+NpUy zC%;DszwG39@}zpEYEtV+(#(K;s!70Z(J#3Lm%V&SxG`l=ZUB>YZ$arm7wC{ceSeUr zxsyqD(MW4beo1EAB>fDe`1P4ae!uLu<9To<0s94I*QQ)?=&}C96Ak=j#(6z8nEPdc z^)j@#+=T}9rP2&1hH7%MCSjw>lwaROQLA>bM~3^gn)=GNhF0?^M81P8@*y)l0xj{e zH7_xs_+|cbYPawu>s7gY+C{;G(fLX{N}E*k`9_abR%P$x0CDl6mb*GpGupg|9KW}O z7LYTp!!KkFb=R@ci9x$*ZJk~GDICblnswz+k=&sWm~RBW`2bhsf7mj77>{_dW>HvD_Xxl-%*vD2}RfHK!Iv zoF29G_I_rE>Yt*2b9rM3=sc`+v!h{bXr?w*T)v`y;262cFe<%saO{$l{hmZ)^AMHR zv5F5Egl-@={i(A-YY;7nrf{m9$(QH(1g~SgMBP$fUE44>u}Pd^GZCJAa$?Ao54;th zRnk&g*6_}V7V`Vb+UnN;`-g>*ZfsTtFasvxJZn3?wm+X%{&uGv*SnZXS-r+lpHT2L zFzu}b)tA&HN!p!ivH&Xmg#+w-c9?zU<+R6Hv%*-#lq9jz#^#6_pa+0<=H(@6*UiDm zGomNpg)=68!x~g$Wr{YJFyWs}8Ky9k0vFq9HCjRM4!94gK;93BqFM5<<4dm+BS+)f z);5=q#R8{OF>F|GfqW4bcBMJoI}yv(PDlFp9C7#Au_Ps0A>RU>y55h1Ta5xp;IUPe z^hL#dB*cixcT=*)rX!iW{X^qV#?WhLZysgphr|wQ;siqMS+%Hm)uxaUm(Dh<1~KDS zb+mELEY8b^wnP?Z?as9_Vc^WpG)=ZG7!#5Fg~!LzqE^}W44K0@wN^SE#WVk8K20E9 z0d~^nmsga+yQ2xHrloXUaoAUeb&hMjJmCbON%-*f`tLjr#=ugzk+e-sH|_bRRw2{B z?O0g6Q_mGax0H}2Srp;8n=z0juS)Uoa$0jTv}C<>Q0Fo9DzY%+OB@x$EOlz&bB}9| z6b~42X2+NW7u3fN20Leix-yDR&W+e9Nmy9gO2K8q#hA~`njEdJ%C={4qmRHZEUj3F z)?uY8Dr|v8tXGpYZnMhB=#RHOeh4JYB;OZJ-KSbCkbGR2{eD0+lX=}!dzm4Vd%a_L zSUHw|?W0F2))28k2MzR;&;-y*7)xUxdk<+gll->O*^4_i7zhA|95W@;2e= z^msdj?(AY=E_XK00{)y-HWB}kCHKO$u>aY+5;>$Mc(wG$dB5#0z;5#)d{$I>=mc$3 z$a*1yw5Y0&;v!hedEH^UxK?Pjr1nx@s4i?ElV-P+shlQFu)DiX=l>O4Bct4W>0Rlvs8)Tkr<>I$m9A&*Uo2Bp z&Dtcle17#ougF#j!{KP^+%(b4=1RLNo~H_x`q~5EDK78FtSuAh;_DV`3be%+U7}sn z(zmX+tfTa;xl-arTemI=|Atz(YgN_Sy=z0jWTaP~Z%OmA-PVKgF<&3?XF%1|af7{R#)#Cx&#PL^mo zTG4#3T3>PCzVuWumYK%z?&_|IZMv(Zpsl~QZl_JXP)*^lxm;WJKClC)rmCn_{Lb9J zE-`>fptIMi;pTB(dF1zr9_yX)9mUeYjTZQ$3V6RbF?)gZgzZyrnXeWnDeq@$pKvgG zI{W0}w!9EzXY6e`0>*l4wtRM({ipwOa1$%cBb)u~?PcD69Re9kd=+ys!B zK)G=9=Z(z+))+a5H`fZl>-N@bs|~{EF1)%I$BPMf=nVV5(hAjQePhUJj;qXayK$;y zDn1?bhf1etvoO}<;_|lhY^v{6u`lEHI9>n#^iEDb%~Wsn=`vT0(lhn?r}16!ACf}_ z8J)U$8E*vE1JYC-1FS*69W%-DZM-4YLy}aIXJYDiycY5xPU7YhQ$_VxlW+Kjrfutg zaDR%Ynq#L;UY#zXL7n14=Kl}sbv`>#BlK+C{Mu>`ZvcBTKU+=CG+5V?u%Xq)hM@b9 z0%f1qAY1=5zAOGia+qby;-KJ9v&`y~ZoR9;YU)YZjbZO^p^TYpfXAG-jb>bc}T*lV`hTt zcf1zzkOXX>uC1HqW!xU;LFwT#8)GU}e>GFWw}&KCoT~wt$?&gnOQ^k*hx3DHS*$PA2o#gby0&Hpr;y-pQ8dKYjPzs~=0oXe55R zi$QBqzD#(xn3^TkQNlwtwN_DsSrb79aSe7dg3a1?HC!rTztL%iV8mMFSIzI-aB=IW z^-@&(xYp22UPb0?h`txYY(4*S4ns$=fb_SDd<*Pn4zRkPUY!0}4aZAlb%pcKy zJ+Ys-qKO1lhdy0TpugX*6WEr$1(T7AzQBDRI7qYHI-e}Jj?;9$WprNN?^~w0m4BJz zDw5mVT6(|as}HdDtmePXRg5iGf2-r|G?}sEb#dj#a&gjnpN4aF1dIXKh*#JR!L?b5 zUJb;&(&@Ua1%poA384RyZegr75lTK?E_mBz>H;;d$T{G9C><~!6o-rj!i z*UK|wEjT$(Pk#GnHO>7oT^dtR_ik2qOoyRImjj3MRf{)63b$k3av)wCqNwn0s@j*y zk|z48ws)d48b9j$^_)8`s&PZD7&o=#gL>me$xO2!cIrVGUfvnavYAtNU4Lmr==y)x zq7*sBF%|x{@-XQ6)$3`ena-U$SQ*JCy57^SX#-YtkiwemY@v(*tKuWJDZineuD85L zH6nxWvXfW3LHj^!4+(CLSPnh6zO$OSsp;DSG(-TCtGn(y+-I|Y(Uzd?A*vB-z3?1- zEi^IsIgr*Z(9Nwm9NSBd+8TrwnOVBh$5eKF^ob@PkKS5+jlw~Kmud3r~mse64fIZH>W8e~wJaUEA4x5iIq`qa6X zsYw{Wr@dOhlX0?-Ek))dkDEUk_k(={F@4;VbmujKFU^>v`V6UQy5RS+O}K*_D!@6? zxW@aG+bN1_Yrm2jmi^S=rKOTi*Uy4O7>nM?gqDH#dY-jDvD7<8_Ut+>_m#rrd20^# z?RBzulj%+N?p&2j{p8b|XY=VI&!*kIvpcSIuBLGv$9sS7J?^j!z2o%b z-pyzAfAw+i;}`Xts@dXH{eD5^KOTG@-+bKuJnnW5|NQqKw?7^nJ?{1%?{UlOg<;QV zzP;V=tE$WogQN2NrxKgVmf!6m>%GH+?IYUH%M^FId!;vrGFcpS-rk-c_K%p9p3#iw zJj|Hh`iaQK|mvS!xmcVS7v*p5xV0ICI(hJisu=4EI%()P@b^&y* zYL-`rrE}c(tXI(Cg=aMHrE@iIEMR3ByDw@`==*c5@1166D;=)1aF3UaqGc-?b>_V< zi>xqVUEf?KtGQ4*{wY*4zol3HynDNTQLVnc+HQ_hLv6>oAlA zY9HL*pewT~JHqkGPsf>R;!7WF@F(My@nWO~o}YhRe*gSAcQ3t|<;!$zHmNms_~;mF z9`QYT-Q)Z#BkQkq7e3YAH6E${#GMc?ROw$}RMPu=QZ21cdo@zmVUy?V9MYDdZf(O* zUQTVW>4N(Z^{fNsdw~y5gko~J9&DlaDVv|C3bacFDy2cX%}ISZyjDmZddI75Hig$1 zy}yG}TpxtF?PF#*wadKh4l(W;tNt{ruz0DuJ&F}ARG>(*J`uzFi{_aM_!%is0p!ZzA$mVDN z8+AGu=sSP24rFq+t2A!gTX;JUE`1}9M)|vCUxVVe6hUjwixhhcwbHtD=9`s7mOrE^ zXHfZt)pe}Xl17wr;e;~OX?7f2#F9QLY!1evsWMtmy4lU^6st0|cJ^zLOe}32(|9U3 zHzH(I8lAEHhr||8@M>qpiW>Q?W2m+?Ysbr)B&8tg%-$pt!z(?VRRDNqb_q6Rq+g$3 zaSu(^=TBD+ru)tAOJfhNmpK1`Cr0zv&CTIaSMOiNt_oG|+gg3CZA-;fQxmALVx9_Y-(WHOs3i*VtQ5jblak<2ekEPDSo$AT9N=eht^!3`UBzV+ln_vU$+t})uIv^*f@qj7`%c8Eis z8yUIJb2nN*+TqvcmeztT?6Yp)s;`%^c_acO?>`q8v&gfHY31$#B@aaZq`2)ebkjKt z7R`fW#5IknsQD{P=_l1zY`sHxc9}<{)VQtq4NUFREINOYX{ekLf6)r-Q3*K)7e&pu+qe)^SLkjsQi2XsOkk9 z1Mc1J>@J3?VYx+faQfRKzkE-RLM?f?TVB>$qj9wJozjucz2RCM-RzYb_6b>ZoE}7v zX}TzDnOZAVE?K|mJ5$>b!b{q9`iqcle zvLD05X}s?*HgqUp<=e$HU5w^Wtk<&9T)TKoH}sQLpW;jo$P@T2YVa6^xuNz}K6YH1h8oV1$bdy9$hUslnZ3>wMK6T9MY*=(enacngcE1#3e$$9!oYffXmFQ~R*skvFM z8i?!r3Qa_}Nt9W*tK7C}*g(6XV6^_VRDH|dKz+GyI6kO-h61T8RqqS1mQg9L>sZyB zz(9Cw4vr98h08A z*bQtokS^~Asb3EH~IP=>t{frRmbZ*hW=~+R1Oj95sWX(Esy8w zc^=a4rzsCNroCTt90ymCYJR{JzuPM2Fw`7$DBr)WdYaJI@B!t=%L$x-Rn_+U-%y>x zG27P7VyY{t&D$H6M%XG*o$YN-v#dAJa#UWZai|&zMvEueXrTr}sFd0aq>_M+>n}<# z(z(Lg!%W2+O>*95Yuz7a<3G&Cf0^011mFgXarvj}ML*=1=8)y{$>M*pq4=AO!}e(L zM!WFV!wXg>)hrcHEc@4G2Q}meKfJ=BrlGNb zp1@k62FKx{S2-H_ke{8+Qt#-Yy-qD(uP$QrF22))m}cp?{9F1O<&Scu0qeg~{-v?q z;#|bI^Vr@tf6$xfWP96!eoFxzTUhCE*?!B+H;sR1uhNUje4ZEj{Dbx(vh|PN&T_~5 zM;w^v&ZbolhZV-&o3}52`u^3YAKrfW^xfN^et7BmE93AFWglM~-y`sKH$olMyju(R z#JVN%o6{22?;~RW=&&f~>x)i)kPqS3`^2v(?dW1ri!5#6Z8g<;0KZhfwLe-uncJRw z3194;IhbDErqH?W4-cEYVY@4o#zBmt_vur*d_z_q6vJ!JY)n!!`P-VWM?byO1v;It zs~Xhh1b%K!w%A0rChA|=<*PBgeVE97uPTvhUb+Fp%dy$T^Ph0AQ}gkT*V{X>t$4X- z%;30%V6FxVf3_CGt~skXt8r)E!6xAiQ9kHd4SbTHsN_~%|57J6%Z~S6zI|i$WH`s1 zcP_jBbb}D+_L?1bZQ8TM4kEtWrF=7wLcnd=&iIGPJQjJMtG;`v2WqNP)+C1Crf^S)? zs$JPqlVa;CkQ)Q{wq!hI)M7GXXql~=Cp2nJY^w-)%&rLwkymGhyR&lpMHM*^3~gac|V5qunPlI_1x(L$5X%Zc;^PFd^e2U z!-0SIkUb3jR>fc#`Rn8NFupzVgFh6-|Gz7WTJS#=+00cC+u4!Y5qq*Yjn1IX!@w@k&y639nI!O`5vl zMCHHBo-nlm<&x(3&@3_eW)=CU9#QGCJPBhLxpnDFzi(Lia5eajX9!e!IM`ku+BC`8 z!|o4H&r&o~(x+d(p}M-CpFvfSckfw|d;P;O!LM zg9pbPJ}l|`lT=BiF817ZvT^z9y0VmA&uN)+*7aU$$D*D}REOcsSkcOF_7LfM<1+vkJF3&?9d>)$va}Q}t*5xMd;krFC zdrsFn%%Yd2oi4m4tR}Oc^#v$T#}ewydVp#_{exPaOeW*&%G=;D@adXw=zTfQ3I&;A zJ4M}z+;C9qLEX;vK9RVr{|vf^FbOcddRAOH zsz6}!Sk~5h4qCtJt9l_Omg3VV#fRTF3HeXCG&}iYUG`hoWsUj1wCb`Zy|g{Zyktc?j^!0$!I(|86{@W9Lz@3Y(gBoY^K9iknA=?%w;PPyWDbeRUdw z-W%H5sC zcuj&fV?k?R!>4&U_w?7Mp}H0T6ZK@hHrEE_@%3Cl_)sQr&o3V z@5ptYPt#iIwDrdkA#4zD=qA6@g~JIG&F)yRn^WnSpc%&LGu>lwqJpN`jB}iwp%>M& zBoj;ZNvc1BLx^+(%Ufo#V76ZN=^m`*f;A!SKeVwX1OhAr4IfN$Zyj%2YKbj7WO`#e zN0$vvhqRqUhKqx8FvdMk>-)n?D}UGMfOkYWoF8p(-yPn|rk@_wO#0dMUK)E{ncZTV z{X4fYqjFs3!!E;guKH$k52mN%G&pMs?U6!ue0ndiJ^I)#yt{Hzjc0Y~)pmvi0$T@F zz>9oJ-L*=nWq$`I0F7?TmcH#wTm1}Jd!xQ?Spd2h-?VS&dmOye$!wW=cjeKR0@%4! zBRkw~xqCb(vy&BWwz2?xuPV1x{bRL_`J1x2n0(cDl6Sji%j^R(>z1c)`s2G+w$lV~@h(VQG@ zn46{kR_3{9>iV=e=(PFPL2ve?mpnGn4sutv<8)YmuOj++4L9RjyvId%cvo)0xH~uO##L7nZWzq2?lzd+H~kzY ze#WZ(ioddr zt+w&v4m;SLZfi;lNjW;z)l~Q~aPPtUd)|82yx6Xx8~?po&#|c+{k3Kr*=Tz)TUr&& zJNy3SU1lI1@lFfhdd7F!s4lH#cAae5Zac7(I`1?qjX~{m&y;3>=GC}GdDzt5Ra)*` zy|-$%egMh->9IS|IHLMcbB44 z$)f*wD%l_V3cv9H$_tjOdFrILK2;8$8@C%ab_c5Nb9ITc_UoGi8MM)c-)2zXXwg3} zkB+P#sxY)>O9Pz;m5$9+rPeyo+Gtek6z!4^wkPw#=K6qi=hB3!)#UPWc4bBZjz*O~ zG6uby!0~QDQ)yMk2W$&GsM0V|%jAb{IuF_($YdC^Oyq87c(rwf`mh7t!n&x?BCrNnai{sE|_u-ox&^y;D?@aoxJT8eTi~gps?panJwBvhyt-AWECNFj> z)@Gs8o4LHMZP>JKemBb}XiRs-H=2j`vOhOBU{z-OhC#n_!?)%IuiRMwS1{xk_ZadE zYsk;>dv9EOUG9Ara998Pbvd4wAZlp_zh9l>=UrSR-=e;?XnkJI&5*&QyW^?Tt@|%f zl6W;ydXB5o6&tci%k_v_c+HzddBSQ`LEE&?wf#+SX(hL}b8KESt#cC_eqHXqe&tw< z8XZczYEoYu_=Yusw!*aN%B6X~g(>w6>?(j(smBj2k)w-u%}J6P$@yey_@iQ7s$NI+ z-DuVKang>DR1qgX^TzO!d80ibmh=KWMhS#=Kvb8#V)c-(*_5_|G`4-87e1Ri4*psTi`ysm*dx%~5S{yV;4@R%JmgU1S}!d^29b z^kl5mN{X&^D_6xvw}36}IB3J-HJtKpERgNn>lt_33bWaVSG^n$cjQ&4+vv^9R>gAQ zufSLgtrOL_z}?;cleSt^<*n^RY~L|ZHHX5fzH#4~m(Dq#Ea;%K%C5Po=wNeDCqJAY zsh;Ce-vC0#Dhf5tU_{ejHa~Yf)dlQm;%ZZ-%h%QXuU|0@mRbee^0fpz^>ffMO zxdd*h8qcvAZ#;+K90>5(TNzYG)UgG)v{h`<2_ilZ?ZQgEm=y-dN z|LNr96IPmZ!vFN?SG}#_(`Pfa-}P+494A`dl^V zWx5!qe$6^C%y0d)+>qCD)nKWHcpnyOYBDeOL~q~gKHcBmezf;B4sX5=g1xg$8!|R0 zgU$2JqF~!Ytt?)@@7=m5FYLDbjUD&;B&w|n=4u0TvEp9V9sQlE^|ui}pG{7Fd#>j0 zSBf5YDt;4nY4@QGD4#No`M0IH(<^ND<)pr!A*0HJz+2M~r8B`9Nu8t=BJF zH^>dmc3q=I%cVN&>Z=FEy7r1phsB}(`)Hj1zJXc(E!LyW<|(X&mPV4jXVtoa8fNC$ zg;bh2*SO%leESCLJNQOV<+UXp)27R`*-2&Y+G8_@-Q?5NPK4S@HS8;PB;UjiOccA- zaM-Oa#5?}EfH8NU7`(iVoe%1@)Y)z;Y0dq)>+y8%lB}_8TyFuc3it`i5iSNdZl0?5 zo15!fzti}5=>3BlFOQmW&F99|Oqf$NirH`Ucv4PW7y7!4x#}$zM`}bEkJV^Aha|Aw_Byxb zi-q6sj*b`ULj=i#?FqGWICe>ndH3=taXWu!; zwLUxF*_pHBcQKfDH&

VrJ8{?;ccaZc+7&loI&;9eJ5+;mhKv5L2yNcIvz??NAKlRb5KhK1^@s60096206qW!0C{c!0002|?T0l0 literal 89344 zcmV(}K+wNXO9KQH000OG0EvEUNx7iLQhrKlR zbL_qQyP~?1F#P-c73=go=iS|7uLUCBx}W{d33pUfR8*Wj&pe0-D2fUS+SC90m*5Q% zFTJ|=Idk4`+&Md(Pi{L9838Scx%(YD6wC9r+##j#DxAG+a-w_YsVmH&pI{mrrG(-+J47hf>! z1bScWO?PKeo{h2cYGzvbQvhf=yR_ly@w?4ajMyzIH|tVf3T;<+>9#nV^z!uMVl zD;ME3dRfm$5T%hl9vdrT?!O#hc`rlQ5X-PvFWTC-+?DtC(sW?+APB=iZxD!yq5BZ- zdZohx8(X`BI>h6}U7@-lc_5(G{3Wn#-8zEtUbK~QM0WI|%||a5#D43pUuN3&W$i_k z&JdZffBBd3danD32>+!!n&;7)^dT_M*XFw6j$e#VpL}Zt z;mwWUrL$ca>}ut%K7OFJ`P}tibXfjHdx>DZXz>4+V+9{ReLvS_&n;tR``)RR52tK@ z`Q3+5QBD8n|IF8p^OxU$H`1$YuNROAMz~lRUeu4XwdcPWkSAdB(0DhKJ|c?8`U|9fg`M4K=E+kgF6 zgvEdT7o@}Y|Lv~-?XLgru0N~0{&H-}o^l&)_2T}1#F=%B8I($G(Z`>>xdlw~aT;~;kDp&TYTtqTgM9mx6 z#NV9~?75km4|1c4MqKixw;uYo?-;kJ4zYrL{puJS;|hVpJID&_`=w(!Zjp0Zp+i!+{Z`_W09I)TUkYyn8XSTEb(nV}mX@8B<0s~DKzK}S+e~u*Wm$|!|Y0mc( zNA97{(NCzF9H^B3bvzz_9cud2T)EKFe?6q)IR5>0j0>=OcQD9TMLR*Z=o_ zwT-bIetH?BKJ-8S@c}0O0qvnD;f*w3`vSEzoUUmIX>89XF6?e7C05XC_Tu*XSR> zNAKl^YwBZ-&*BDp%m*m7iT*L_BErQR5_Jo~Tb=L&8A&pId6u;d0X=S_N(5At22?Ge z^1~VD4`90)fD%~;y`lZSP}Znmn5(1q)ay}A2vsh>(E?!1ZCxd(>42d1Kw_$a#I?80 zs${By#gVPqWX6hv-A;h-*g#rICZ({8+H58_YqPdMGYy&s%o>wjNK%TN z^L10@shP=x0X0>5RsdAVnowg(<(W29r|*&Mxp6$jnP6GcTrnP5;?}^_TDd+^W9Mp48MIAy+6ln6 z4a}(+h^1j`%rTRWw^Qj}OX`)Kx<+n^nc+@n%M3Bi+ZsMvOlQ;iaN0B5?Ou-GYFd4a zw>lvng#9AOH4O~XUNnXNIJfCMiqY4nUuHAq&Qz?hUH>La7uJGBM@O7Y$nZRI1x>) z>WjWePup`*Y#T0#%d+EEP&^(Ld1Mj9zK42Ky5wNmS4Jia=| zy3TAe-sCg&5kqU(xz(k}W;4vSy>4fnXRyL_RLZxMLc#a@z*w*QYCX$hD&a}eZZI9# zgL-S=wA$EqzAE=uC3@))t!^Evg1+adZjma_O^;jZ%n-^1f@p?@80rgC3a3_~IZ;Nz zbQ2V;O=~eQT$-zT79;N}-Bl*T^tQDyV}X7}=NGw7Me1fHmduBAeIwMoUTd{z4BDf0 z!{zZE+ggiauokCQeM+@h(~+w+yTLGIo|9Re>ewuiB}0}77NuRoFV`nRj&J#lG%d20 zyCnP_z2n2tR$}GKn!%U6xRUcFuyA`an_~zoYZZ3En#z)a%83jBd3un|PCA(~VRC~a zRm2v>jMXhoxR7#4jmL9A&F=PnYDjOL+E}dYrcDKGdLY2J8?QU6j^LZZe7;&Yu@*NK zmc2@CK!9~P^383gunrtsW=Sb@SS>Il*CNN5 zz8>>gZvcC9D(S&U8o41Ab~hij6XsoQKB_13J}qC0_>$t_i! zX%(0AVs~N{vP95obuhu2rGw|vGyRdBnKm|q}8-MSe5u*&hOT%>?E7hIefU5G{XzCcA2hWiktN%+{zS5 zw=7KLjG{NSa9f%QWnB-drRt&zaw}mZDw9riF&3$C?M@e=!c(GHo0Uk=*$7t22ckjP zgGs5nQ3IvX*8)N6*3EFRae}sn?@EKIJDrB}oUtY5YR4N&johqhmGp^S+)W*?S!2pt zc}#djfUVm;#+mJ{-`fRH(X?|-+i;X@Ghfj7m9s0u4_GGjs=YRCkOjl>>E=wcm2gXls|F)dC3a?qn!Hj-5y*v(U=}ED0Y*KKUamXY z0yC|_W{Wh&@kTQb);7b2MrjykWPjJ|dNVY3QSQUbI@%j*jid_2w)$_wrsq zHkYM>Q#QBm*eXn>9WHNkv^7zO!`(pcaT|45S`I*O%iG=ZR?FmvoH^eu);&MRt^1{_ zD$P7w9T{lj&xVA=G&ExujG{JN#ZU=b1Fmc&}M34oI@fz8wxz;-sj2&@3kY5ae-Wj{?CTUd+ik{oW zISV^QcWUHx!I(2iS__bUr+B8fq7>1n(%W7epEtX^V!c-?2y-W&=fhUMO64+T-`mwP zLASMb`t^=7FEFKcWg|Md=B^3ZXwdFJo!oJp4%6@KW+AP0)VWqPDqyMi)=YNoP<`2x zcKNZ)QuNpjXfDrn84e@1TaPL?dijmfW&IZ58e1~UxkiPxL1SPsHs|?X6$F)%U{Aav zvCK|-n_ie%SCxF98!)vnTPioIC3n)xu5oIcANe&wsbi~P>Klbpb8gMm?$F1Fo1VQM zmV<0&OwxEQXNl|npp*%nZrjI=Va_*YZ`K{mjaj~xQ}Fc|8_&4W(ynzjYHr?~8-5p3?u39Phj?Z!D>@I0?NSUU5@a!dCDch%cYp>@=sd$5Pb>&Exo`J*7Be?uF?w71y&l>!1x6!l9fGP+XoCD^-OZ1tQ@q=sN>Xk& zC5c`R1S@l@m1?p%8K@aw7RTdJKC_t%nl~3}n6B@f(Y8&lie$Iu{a2a^C2;}dMgL-VABS<&IwuD z%;k)%!xSovIlVhc5=3LZ@Jcp}h!eb&JzWA=?6EX|v1^#{E$Zle-1I)XO!; z!9?^1TQNs_8@EUpB)8~vgU$w1)HY$>vgV9cA4QTDq#ZFJ<2$h(u zSh4SHyR5aIQ(oRLRttny92AxmUM6x_X4C8to8l~3EW6mO!+IT?rt-U8F_#w_&2o3x z?fKQ}po*8)Or^NdH;5uKb@o58W2U$zH+Sgr_MtsqkZKleJ5k>8U`O>S%Upg_#P299UuEaJnPoLvX16hDN}262U!5&l z>s)CfFE_SOC=rF)YP1T&0s}3Grb~>w!;ZZz17*Qfa_x{;H;ZaexU8RmQ7~&Hemsz*FWR zplPcIUjhxtTw>PWoWa}07bwQOqryFfL()*OUVJ}nthjoSP#KaqjGRAEbQl}Do@L5$#PT( z2DDW(Z&ql^9bzg&GJw(wK%1iWj;3sOY2rY&oKk062BO<#v~GL0(=44U6`K-h)kMkV zfP)VNHA@L2sv>sE0RAtRTXI=8mfOtMH|o-k*^Q-4sTANMU+fi7aDnjg%^fnChAm<3wJpwih+ zu~0QsvOHF0thw{0%w*UZ6l-ds(SsO``q*OW73ykF%j~33gUY$O0tLl2R!bYJ1pYz| z2mMM`ca`qU7%082)0r%B%oj9$G8={KS{ZM&N)23L8C9x}e7nsqc5nv8FL%x?hfjCP z2&f#_7?xVadSfufmxKeS%e$;ybipbcy8X?nVfv~y2up#QueQ2Gpo8I&bEsTsNbF{rsP368#!2fsh-kEJ^pAL3?9x&5|WFRMHfz zpjhtKv`wL8N%e+MnDPaDX698(B8bJRJj`x*Nn#a==$KoMH$y7u4(D`@8Vpob#fw9M zZc@9QP3vVcfPhOP*&Ol)!%eX6cGPV*wCRG!J9t;f4ut-CnF%d-4Cx~*Guv*4$hz5P zak%Q$dh^Y~X2W`AK@BlGTUwTw@*r$C^hwE8OLn(88Bml$WTw0*ZWr!!z3hk?J|~{lP+Wt4bYES*(2ydT8NB6}%D}a{xrgs~yZ1QhM|%8^dyYO)nsj)^#mX$*l_i2wH^qV} z)&N@ajy{7GHS^GTYXAyKi7CwnkUv5=e%dl%0}N+2qQgEArH)um%%ADS(r~z!NcNl?kxx@)^(M zLAO@MWUft_!^{en$ClAr{y|=JQM(XdN3uz5u?x^*Emnq)?M)^tSGu6>Q6pLIWil?y zMfBKjY*04fMa2J<1S$Zay$GsivU9Gb6ZJq9xE)E=QCmZ$$C^+Ew%L{_!%2n=-*w=- zP|rd6)2Hfy8gzRkD0*}y$2wKe&*U;aXSZ4B`T=KQixO20xGd=8rM^(Tlg zl6X)dR|~Xs%`b+!qUqhHOsP9tt2c`{F#IvLz%p{PPy^#(CYX4mnN?w>fib(OIrxghS_59cRY6OI39uVW3`daG%&6x(JI ze{chtbGls1!6-JuA9Fp%=6=@8Y~?KF1anK~}UL*(|`Z#+aZFe>dnJSZ^}+LZ#_7-NQuq+*fJ0GKBBdd-d(O4x~j(I@H7N z>utfmkhSVEmnAF1jJ@9111I-Uz0N|VMrNf;0**jwpg$}YV7)+R;2dq)+gEq!&r#H$ zO~lWzJ`0KkfrYYz+p-zZ(OZzW88|*HN?}SSQ|o$W1Xl4}(bQKH}0jj)v_>FaC zmg;s&49c6y1PmHF)ZX^swP3J9ss(m>2T&fu011l5`(!oa17I8us$U=$5ilaVn zQa~nYshOMBjTxK^R7lLv?#qsgYk&b-qeR#qOUCR`ZZTFf@Vkcf>r)`}osNQ28NQRj z^7VR~T|4CoNfBdGgyWm)aeyMC@uckOIrC2RAy9 z7rRp^;>?O7gZ5J9WEwb~B4@Ho%vb5c28X=lLfKh_v%^)HGiys~q(GWuiT>%ASCxJy zJAjjvf!00fbtJ#`_|ZCOq9NR78&Dp#1e5KHk$i$<8uE3$4S9N}?6{W9Q(Ngc4s%in z+aN3F_i!2+z3(WkI-~C2Lq3Lb6YBzz?lL8oo0OyWU_C!@2Hl`)Gp0zp6qGe4NrNRY z_vy#yQoE`fK zjMMo)Wyw z;zAqH<7|064n+7}8uH^}U7$~CrqC=_xo`o?iZp~VG7!%k#&b`GmXyt30X zkWUzhXA_R;4Kgn(Tf|=_IF9vs#Z(0ls68QIdDvC~wzJPderX0QN;5!9w_rOl2rI{h zDp3z5qGIbDq7Q06q5~|$Edzy{n=Vh~Re_g@LSqUI?oe*R@zLafsJA+^0@HE@N7gwy zk8{)juTiqmr9!v9o;aKUM1=|1B@@cDz$*E*iEC6|5h!_6Ztxk%t5s!4?7zWIpSJB* z5l*A(K$aw0?$&Cp9nV-S1#N~#Xa#;dP%2EbSY{}%Vr*O0ir`gvGnc{Sph790FGy+w z>PDy^i@ZQ*Audx1!Quml0*lsWn1^G0|Gj4yIW8|fqz~IrzD(ga>=}gx6*y_rRA}q4 zW%w=9&Af(rO=t_{HK=on2iQuzr!|@j`9<>8`O~g6A@p@5A4VQ$sfpP$nJu?bi4fs zpIl}I&8Ca`Ej-5m=zFk=)AIt(W+hT4*T%*;r9e2?vRFp#2h(_Y_#Ir?i%q2ODl%9^ z_9l{<;fddKEF34GjpUCqVLOprEkgN&-nWn}5IZ`OOPq~umdz~E2Qo%c>R!G!vn##Q z4bYzhb;MEjVg3NhR0Y;uQJTqe%`FYzQ9*58+~-xHoa6%XIsWKS!IY}NzdHPbI{7w# zOsoaA>14|Ml%la>R+FKykVBZJz&<|k52SMs_RpE0hb6Xmm7k)Cd8T}lr~Mwag8h%= zP>Zd=KSV2}$B>?yAihQXTZwoV+L`?x9E;E%92VeruM7LIg>6Vmkx?I(pxp&^s|)Qj z_)RqlY_owfV@zbQO<@!9_PCeUkflA0>X8i) zDzMX3R@{oS%2v%HeOtE`qQ!nV*y4hq$E!)nwS$hGh zZ8@YQUQre=Ihvt(OfOKUc4M|4Yi9ImNWqgwxgWgC1PGveM45pBp89&SQpgrBCu|f{g zor0pC=IDhm*kx8YXg4vMWpV+#ZTBknlz?-?dak?$Vq5EvIB0L}u#rwp0^}-2%OV3v zAtRkwiCV~L?In!Hv8nf9-_lT~Acvwk2YIxPWM`=EqzN25aO^@`d(Tgy%5r-i+ey}b zZd*4sMb4I}PG!@>{Hlj-1WVj*ERUbfge|LAw~Jtkw;J-4^bDCBhNfM%+|V5MfTMMB zPU9;aV{K_{lUw@)(V|3`9`{&|4vi4bwP#?vZ75l*<_x83#cuPPp4x5nC5*mUkBH{% z$fAR?2g=bvU4xy{f_$2x7-)ZVJTw>W!oEoV~1{VA!#r!E!K6do6T;zTPP2(yoxn*1z{p*;kcqt__%@wh7(3d0mNx*(WwxB>k`2*>a<0eS1sc^m|bLjWcMi$|0 z4Mg)m_=oI6r1KH~ZYBO;KPr%BJxE_P$BJ|TWkr1v*^Sb!L`C!IKxHZ|We&nEyBoBI zG$2;y)bMG*QcI`h(xwxt0hbYNwjpjk3QWB~kXe?tWgL#rjJg#q#uhywS85Ukc~Ewz zb--db(y8WV#uTT5we)ZghwYe{0+jnW#}HcC6jy+O_ACgR3~;*AASZFyLJCtqFp&`-x_^RUK#e2&)1 z$kQ{0`V~%5PtP*4*MjpiDo>xw!|}TU^tn8=D>?wV?FPuUn4cn7I!AHDm4(653uubtp zB99Mxp*P&Z+1jkU9Q5jVZD!#k0TgQ6^6dORKN%7@=t5Hy@G=<4)CO${DFM|6yn>c+ zvxq*bOl<+D0!^l-D18_}xx-0m<$CD7Zc;nIPf@-#vg{-otdT}b$uC6kOv(X*i0Z+k zdQne63(}AgM@V2~QggtFUM_-4=6PwI6~y>4fB=2AhkRR)BvU9vH1&PviSZ&%7;R83Mi*#3HCY5!Fe>)6|4xL zkwBYl4afn-$osh|3-vjGRty`k3TP=%ud{vB7&t%HK+A)~VMkEzusR=FhU^DJp3B#I z^@TpGdjq)}sQvD4Ap69S2(!bU;t%^>d>}8*&wM#Y&j*{K(DeuHtgrRt+GtkxM!l?4 z>sgBdVakJf*Bc5@a?QHV(9Sx;dCSqw@(l8&2et2Z(Ce;iy)LQsWnRy5S+!qrs9ZhJ zdU?o)Vnxq&?Gf+bL%zGC`MRYGtp(&S^xIYY6b^ZHNA=O~iUWxHW)KV}TE8+G@=8M` zoUKZP5SMax#D|OFOzE7{ob?cnfpdE+?f?uXYA-(-^a38@8_|R22bM~7?IBTKQN2+B z+Y0MOuzY90J8LS}%4z);#6#pqkPhlB+|qq&5w&yH-Ho8-G3r5_x7q2SkLch8usxgM zVc#;g59_bi20Fp`$A?cpa-ii$PKCtJt6dyKIUN%^q<%Xb`1tbMAAgLqc=osNsi%q3 za}&QMvAcCnE(Hg4x+xuO?h0)BVZa-0zjqMs8jskCqjYS@=dj8CI5ydv*f?&Gj!gbJ zWQZR}hPX`{dz6k$;Vv>yqj0lgbc!s!=HgY&*GCPn!6r}brNb`8U_W`P@qSgI?WfmN zjt{o|3B2@-+C|3w;l1>n!z;oh51n4)ddiUwQojP3I9q%T@t7eU;OH9Q#-3(34Kp&ACC{;A3)J5;S@^U7T4Je;eL7e zHN60lQXqboHoa6XUdl?B9ocKCdh5)28hfGB!Rc`G@yhoHU(+)d;u()eeABZQ<5{Cq zyy^K$@qEVvz3EvmhW_CgZFSB9hc_Qv?S&_*Ma={Owio$)1$ zFT$^gD_@UiOCOKjukjHNR<`DR77S-&AiO?%8WdKZv9iZsA&}wJ_Fv&xT)`yA(0vGD zZhVE~bC;ItT_+|J&UE<_K|#X*buay|&(X#+A8?81KOe09i#9T)66Q;ESy4RUzzebdJX}o@gRpik1nwb2tVfS2@lHLbd55li zJrN5^B@Y7sI@4Ar971?PBWDY*fN{s;1J*|bk=Q})el5e#A||d9 zy?1EkBHY)CWFWK{Tu6WOQZmMx>n=3i_P0=$ZEVjT+75b%emV!__tyd(d!Il;FeVdA z$H&JqZjW9LM-Yxp%cF-QKfRn8C#v*C`y79W(DIGZ@!Et!0hDO^!9?`i8P}XKyAB)R_0LqNajB0v!4r4x)eX1w8ufEt+bI1je$4Rj!5#Sq^D&)K=D_w&koIXoR>G! z+e1l9chgd@lfGYe&HiEuW0c-wk#vI+C8BITl8}f$q7nJ}Rz&@DNZF5ysOuiBM~q#4 z9lQDFi-p8Ydi_V+6F(B^?lm37Tq$2pc@gyzH2gkibGgsiJX8$%Pq#>nr&AbDBQSnN zU;IGcgQe=d9`Ad)bt4l@G|)|4civkX9JRi-^6x@fdq`5wBa`V=eL7L&vM<(Ghqq_y zK`C&g``)VAQ}d{mk6`S1G?MqD^Q18ja_dPAAKi2k(Go3z?Q4tDMuzULqT>gL#52A3 z*4LpI(FI)E3R(RzTP>NGcz$+z@hu@k4!EOndM%6&`Y#enksLefOyc|LnwNCA=l3t? zoX5*n5;E{w|DOnd7Ti#Et%pOH?9ib#FUA20Yzq*&s!q#}M&k0WEOtsVc0MWMaD zSTAlcN(%R%%)q0ShmeajL+-5Kk667Pa_{y1LBPXtb4#~A#4csr{ERBUZeDC|aDh9T zH=N9bk;&?Qt_-MCQbF5!$|E#|Uqd_P`zQL_V!&&Z_Jx z(Y;DaJYO^6zUCP39F5`2+2g($NR6b7fM_ry>As)lq$r|4-E@71nCC`*zRL+up7!03e+*j|wHpl*IZTF;3Dt#(Hs%yf$*u1NZ z|I1s}`+UfYeqW8%ds*ElGd`8;ieT5PI;V}0lWiL(XN(AkWvjECyHA4{BKIkf$at&$ zm)V}kb9eF>Yva|#@#@{3>ENwVaws^;p+2aurJ*clG}ifQM>S5h>9ny;4`vs_fXq6?d33u)qmrXKbTez}A8j4#N2e!svlbt&p@kz*a{`zx<+xyui1 z+1^lojaEQnT~|(-|31MvcevxmVpD`yE?R3mpps3&WS_STB(ZFp#eUBJAgUJAfs9OAWlzET1gGtIlwD1{jx@z}{wxUlI`Z;1aI zC-5Vz(@;5g{`UeHXwKnfZ?KaDehC z8o~|vhkr)@LCJUJVj8VS-JM1yHrZ0PFy6>~>RQYX?*618wx878oT*%xys7VxR%F`C z8|n8PqaS-jC-)@({JG@;hfArO|5K*5|0I)@8x%r|3J0FezU3f=_Kf>Ikte=RYq=|X z2MMdi>3TT>xLNi%Cq0yWi*2->-7}7uq-n{xw{VK}ms}ow%Cb!HKu!UDWi(#5Dh0)J zJD)6ZT8N13*!*cr@(RSc8&ayh>W(K0UDlkinV;#@+jty2G@oFpn|~q>aiq-2 zCo??RK4&k@({{!)6o~H|U)TKk5s)~OB=?7&29n$(dcI(Cb2~w>(#i9WILm}5y6>Gt zNrHJVUCwZRm@=`V4`>rnau8DQLK!G zp&?KB!>{T8WZb1=W4EY0~5qOZ{Mfx!K9Ws&iE!b_mB1k9&Qh%<8nE{kCpm`yO-Ct zT4aSqtxmPq;;%1lw%D6n1%CZ<@NJ*0lg)53sY@keY_}n{8y@ovL%e&v<#1lbO3ocd z>%ITv=fq+<%6l1eG4XC>BS5Q^?f*n|$=Amk@A6Q*`s=m%pPxe9?Tpwq191|mdykjH zk%PS}`Pr53buUA*$Bv9s=yDC|y5DaefBw5n;t;Y2FG8pyj|)XN?fl%)JjO3vS&?v! zkbH#(05$fF0{d`G7ztS%HR#Jp21a|`X+$`$W<@@p(Jx2y4fP{(n*0=X?Y-CT z-M8^&we&2vUp?Kwzo4nn(*3>09y8o(?(zNI1|Krrdzs|K>$BW{uVITwhB)>Wic{m| zI_WivpnWku@=0gln>NwiD4o}1>?TGrXD{+3I`+9^{wdMVBO4r-9aCb8J{;@!A)oz0 zV&2z>6RQ2+o;@6OM&jI}#9`BmV=(#Dg8=cx#5X)z2HO7{EdU~El;ZAvIBt_}ZYIr0 zw9kT6)8V-PGuve;XL;a!H@^rY--_thX-)pEluz0n$I~Eae{6qV>e_2M{a9~Y@*T{^xkPu{JXH z<rs!+S{*`Wq5w-_H7Y<@!*ye9RT_kzs!N{{3&q+8%+p*85kW(m|kZ`-cDZGlKG& zfPV!D?YiarO{VX;eA-Jy{70z%vU>KW=;eJVXI+d=+8<^%WZbOYceA#2*J$20M_R)F zm@sfY-E(03^%LeFL@sR}nuchaKR~BlUz2;xuUGw>UKrZ{|oj_8j^*;h3Hu--? z>GUnhAAxXTFuo7O%9v?TjG}7*-c5$&4M*>Tl2{da2ZYN#)N~k+2In)}`3S}{%=u7A zJmSp<0PeHqgTjwF^8tV-81oT?gfqpvfIP$84?sM}+Yf*|X6*+6egS7+?_{Kd34e_Q ze*(-i!{iAt4@b&l821OuYIzdz z1NG6`;HfPa_XrW!tI*f8?361Ho~UTw?89OHXY!-AeS`IA{&DZ+hboHCxt=Sv-;Mjx zatO_%_nrf%pI;y;tsg;lU+wLkf$YhBCHs889zCJ*u}gV!=-`e$Kdz>c_;F?DF}N2; z8yZfk^GOyz-(Pgx3dsKeWH@`6C$_gQ?zZ^>SpOIKJYQiFZ!_@&ZAQ?(IGX1}g=9OU z1mM&D_cZW&o-fw^5#FI|ZzC4v{tt93@$Y*H^`FOe-`L9Cp)(WS|L2w7 zZ%Nnhlgnt_Df~Ev+%KfOnrJZ$s?d+GWi*%nd|B}GmFqqJ=>l33O1AVYlmZXsZ|ZcmEA438-#a$Cx41KSVdN zeE9U$9)I-TOv69C@ThG^Gwa&S`1rvxw9$u8|AGJK8@lgiKB5uVd~`p3cHg4XZObtH zPw|Jhqocro|M$m>blvkhM(F=;eEMoQp7G+Zw%^>hXgx#dNVVUM@4Dve*2np$WAZ-x z_wOG^uD(W?ef|(pED}s6@^ zx~aeS=gX%a4tWB_UyRM+@|g&y;xBJ&BK2^rEOzVSpI+H{g))B7>+e);;#Aee+B}|i zhzGxM=;voib?tNUZcr!xjMy#~GTV;lu|J-#!7LU^i}2I8cMsvCRv>=;7)%{{|HFxl zMA0uq@mt(JIhz!}4ChtCR(UtzdoHs-N$1=5)j#F&8^2+AfFl5M}ubsjcn;j>@V zDEuVAed5(6mp@`!92v-gME6cZ4kS8chAi~Y{uPbYf9fl*JZ>6 zM?QI(df}HD1Ib=Ja@uhv;g|O6Vc)ZK?jQ8~ms2uEIWkGP{JAG1N+Xr>i*(8pEhl3w z|6zgnV=X6=Eze!H9DiDpMA^_X>3X>LDokG86U6~axi{eyA1&WscwaCKb&dCCx~}OM+QRnUba#fq+Wvj-@Ai8GBA#h$a}Nba_?*M>PhZpe zCqe%!qNnPs)I!OT{|~=@?EBvi{(t&q@RxIAP^^ou-b(+12#c-;oPF8?I37RGZCq|(Q&Ebsm z2RdHlP*g&&MgLIKIknMqQS?FdX*7;;>Vj4Sh0vo=(Z!VBMJ*`NGr5Msvr>fs?0`H? zja`=>+YSY9WM)jz1Xu|LO>CZmkR~!7Vx}FU*CM?3(HWy>Axe)5Mj;y8Q6>_hOh<&4 zftfcqGsaMx7?#7ZeY=3zP(j|z%@_Zj*%)aD1oS&YsiN*h!;eIBh6+6K?W2eaffZmJ!#8s>l39FMN@5yJSQs+ z&{C8r;_XC75myCiA9ZzJGudO*pUSh(lt=G#5Tn@% zMnDOY*$E_kAV?cemT;A_EnV$7Q>V96Y@U;d&Rkto+isVmVZc2r^RWh+TZuV^^GnNm0-Nbf)EHO?1#}@8jB?{6AuWVJD3D|kX7EzutY)!7}*u8dcp-RAO zFs7I9_f4$Pc1vJo39xO=s$3S^ptN8@Ah&QGwh{iuEs@zyn=A!ItQ9Pq-GSS+B#yE*i5ny`FHX4%mlSY|Yy;rL@waQld8u${1dkpD@VYsn2@OH0t!XK=i2 zxqaJ@5y%_BQuHWdJ9^J3KoQqPZMH1hSxUBx{*nqvp(3*j%Jlf&B2ToGE-`l&+I&9X zfXwlf$x;D-&abW3H3hJI3#PaFn$dHX#%S8*MvJ^g$y2T(PaOmk0A=4lg(>QvHi}Y< zfOsH>ThQSsRzzuZ=!u-=DnJe< z^DPO7nJe<9-sVCT62Kd?q0*-5L%M9L0;SR{-7HOZ`m$FU)C|WA=zwg{J7;7trF?Y~ zPyySmaty2ksGTv(O04OzK9^Zo!VhSsZ+z9LDlqhhTErckQ&Ww zc2(nU^HwC!5&cbNKR%EgKvA%15kvgg7kUh+ zF(z4SbhBi02W1Wr_39+s(>S$5wVI^?sxv#9cXz>Z6=^|fU*E<%^>+&;cjTFbpOJ|^iy}z}uz%)NlMO2!nUHpnt9N1sOjyVxN(<6zE45!8?#k7P@U zssuV}pTn5!2FhKc8Nl|KB?`1u1<4u|Sz8EL4(hWpOygl1UxDR-0|LgLHdaE|2Tre}; zWx`!o=m1^_)UZ-sWe6Fj@846*j+$3NNzb-$RF;?8V{P9)3@d=<0Lklk`|9Dd?NhgD z?W=8rdPUAvwUS$BWZt9Nffj^rvm)u!8c;@HOhWOnSZ-z9VcNS)7brgOi5g>fgbEGE zC?$K$p?pOqY86mIZK(V5E5Po}GtpHLBEZ3)6!TvqeAM6I2OQFj| z78{MUlN3dXNAh9MXV9*JV@B*q+XD|q<0R5ole(%|__Atcmjbj21X*mu=S8)Jp53J& zH$k;kEKMvDrjd*ueP2FDb|Y29azJl`f(%Cx)c_pSW3&RtWh9%jEF3@LmbIy?`aSA^ z>)8fl)FSAJXk5eokP>;3yd;@OUzj>m-;br%evBz0*y$F}d417l``AWQ#Wt(0Q}frvX;qQcbXHP4#UCQVQxmzd}tJ#+ptm)Vx%J-v%uWpm8%0x6%MZ-$7l(nqUjd zgdp61W4&qgo^MMNeyALN%Tr$7%THm0>D0_*AY+UG?SV05%!*7hFa0G-Gd&w!2s+pa@BoA~P>9f{r}K1cak z0ovNg-kv}@32&I6KD}M4 z%5-XrM4qYO?0}z$s$k>Lz5)VeLOEmRX$kL+cxyVS?WmyuwH`~0eUMfAq6Nmauw=Hg zqiKWjmpz;`LC& z1sqHVH4{p3^`@MQ|tzL~!H?x#P15@e#oJ zIe_n3_VgT0k;QX)SYHp&()rnh@44ye8P_R2VYdxSQfR{i`hH4*v4+Clq zgnAD}me+dawaBn*s4IGaSAcH9nJ;X6ln1R2$k4839>RL`zCGxTvO}KR0!{=2nVJJZ z0YgApK&U(_%MXb>F7hJ>MYC7?EoVSew$Y|4uuOdj%hgPZ2Yd+(O$tXi4+6>oJc;Vr z0-lA!4?Uw!rfeWg(RbwlzaEu~+8Xg4bCY8dpL10E-%e5Oe|s*f{nbk2x8xn)$-{4# z*IK5-!6Lq1U3HdrtzT*-Pu-IGWZ|24;=T{WqwA<| zx9VmPn%j=mg=6f}>)H|enT5MFK8p@kKexD8oK3A@9<2--!tAX{5AK@DgMle zPma3m4bQQgwWseprnpZaAMMjs2j%Ar9m5e`27da%ZM5X|V)x?q{6N&4`&dNJ#(eb7 zZM|gifywy$+v+n8AbB9~qLt@U zBJWo)Cojqy?s)&0Hs#)F-TuAtd|nSArFS>r}d?``+ zYx0(M{3Ye+&igqn#n&m9=Ia!1YWb(wAl;Ssvc_zp#==t_nuyi)AotyW*8?v*`Pb{sKL zozJ!KN-_QMhf%4<}C?`!^j!{>oJe6qgm(Utgy zYvPr9e@sQ~!~H(^pK^QOh0KI~{c`+EyZ`e2joDAW)7;$8zfQ*`&l+^!nu8beMYQ?b z2qi8wxRL8|+>E`I70tSDUIQCBd0&i{yGBSHwTH6z8pCu>%YR6Sr|0TF*71tJ1Cy)5 z37m3wxIYz%?9U*PO-G{eqeu`xg9MR|MDfEr#Mir7_$VC;F`Hn21gv;hDg%FT3>#lq-c+LPn_1BW3v1htmeFy9<9N~ZUuk_XG%96 z2p=hdq}lmDqz4{TE*VJThtyAcAon8qE|c)xGVa3Y{U0V94!m_ScylR(_wLg5KfGTr z1XApJmczNn{33oaZ>o8YE?l|O_y6z~KDS@y&fwg`Zp(kKo#1Q-Yar2+v_1DU~kc}*=%kVsV zeZJS*2|fO2s^TBla{m-WKdi!Mj~3`FdK(I^O&f^M!fF z;U)Jed6YZmXY-FR`qG8oFBMqd5>uNa6;DA1epIUdO40W%HlzHh3FCW*<0F)ReuzHF z+=cgTp8Y>a3G)6{)>X*HxW#*8kM+S4$kok5H$ALY7miTT95N<~qNVQg9g&i|AyRUw zA|-b%QgU}h%Dr2|vN54~2SGd?KRgXR{0ck#J(~3%*5xzOx7NKbJi3zI_z#in$&1vk zLJ&St=;bg&cyJ-wowAp=nqBkrDH-pzd zQ6wI@F8wCDl>BL-;+}NBOmRR?aTC3{Kbz)jdOLHvFn-EMkom?nBW3ha1{d6p7yD79H>WgbT|ybbVz zO}`~JcW;(@bOYEv*XgRP<5om2?&^`|!W6q1CbrIfbQTUyl=L8W=A#l<;WQs`(#<>4-suj1|Hi@Fc$^6rTbGY*P45#fE?bLs zgD*pHz7OZyHyK`nFTB%n=iQuhbzu~Fd2Q0&N%`&D@9vK28yDLVSKEhoyYuqq{)C8n z#*V(wgE7(YyhKYl9ABH+$ym927Q41@R_6`W)9U?2gU-InKhArpSDxYLE6+;r4*@^e6}bqK{>-_* zcge(CQP~p`>%jr_8@+MAZ7H>0h3fw8kKdl8P_(Le^SCy7p39wG72F#~w9gUdUm`>O zQN;P^EO-j<#zJSsmpd=dbboo)o&U16+U+HbM8-(PKo#}vunx_UfGpf`&r8N$eYa%k`lk zE!-Ej_cA_B&3J&gXR;^8!@;j+e;Dijg7~d4;kWC)7hF6c4*qEsU`+7bYT*qHzfZnw z%RbFbrd&RL|65e*9AG?(e~zM`pG=>4=yUwj_kC>i)VH~O`DTpu6Wm)-)lZ;rhFw2H zchdm7cVMQxJA=E1braBSC^tJb?t>g(w|@HYO~Tb8?vJn!DtH;6{M}%V!#Q>k`7X2@ zcafwzzVD@M>Ffd=a}P>HAAFBb_{oR*wfN4He{m2``-9x|j!T#*$L%R-TNdM2D&4-s zxlQC+q9jNNQ zB~D(ZIC{LKg^Br^*xR~s^zoBmK{}=3u!vh7OI@r@Anu-0d}t zr%Fe?^#i4UxVob+)DIujPp+suxJ2(xW24mQ@`-N`JAS=b96J8CLjww%dUg#sT>^!_ zyycETrVp+HML6*}=;RZ+cZ}G?6&dM^6{9;_FNs?^(gEP<0HSLIznp^FMxyccNF69@ z5D?8qc4K^o`Dc0w{*aRRVf1hN1v~!Z#XP1SQZ9NE?wCw7~nYIbX) zYIfH~)hy%TWRobd#=?@H)w^YAOnYsy)9lA*YgDW6;2xb-`EcRskyGP7;ihsv;}m#prpykUzQ#M;t%i*W;UqP481Oh$G_c z)2@506O&#aTLG!T7}6F9YH#5ZfzV=vBhsrt*sTH~ z7Ob?rKZh22)Sii-EAiuYa{(JjZS${#OlgHk^_Z0Q{ z8XEjehz4Qs2*3js~GqzRtq+2~q`r@+~#AYtEBb+{Vi#&5#*uerKGMc`7-l`Cx#3bTKK>6pk%!uj2J_9<`*7JkSxglG%j;`a-|W!n}Uk zR~Je2v>AQV?{}NbvaRE+>A_?gjJ`H7(*LqDk2-8?-1z!o8?|eUgY6Vft++XPG`g)t z$+dUPk7z_~0+RdjCB9OxoP>(FLuBuGrd+f=;&(mYe*3KfejMCL5Lyn0kNB;NhBDWg zupJ84?_r1QE6u^N$>Y4W@rv_w$d#V*q*d2NyHek{BP#0E2#L1xI5)*(ZQG7iL#@qf zQ6Sp39uAW|RU>WTwizt*6|R4%2KI!xn{B?Y{4EzH#2mS=Y> zt?@az*@bGL@@R{ei+Ln1U8$8#MWeJ~Td3T)sfZu^eMjJ7E<|Ppaf;*s>orcC=PQJZ39;GtRSF zqdi`kZDNgA+jLEn^-X>4`M(=4(jmf#Tl%qga~b8WEG*l=yg|w1X*`3)avj2fJ6dpdHQUz;7HOoV%IlXKhmZWD>`vr~YVjI=x)F zTKcdk-otizk}i#HT;KfAd`!uZB@MoVcmSlWFnQ${l6H1&+*jY@&_+ zllom&)gQNhZV%t=;^&t~4XSy@V6&mL{&2HKr@2`(l$9}~=kUP&w|`&o*>;a~Y`Fd$ z3)OhU-)YX)soHO{@6e4JJbCg9j%HnaBI1@(6GBM3Xf;MAQi`pKNhC_%bph6fX4#@GGv)@7#kPG` zTBDs?4ze0b<};5vH~8$^x4dnX@w>HMlWdPguHLiPJloS?L$MV}eNbakw-t_Q zezNCo{LU|O4xWA9A?jg#KEn#v1pE2#IR&_gp8-|LaHJOc_UO^0#;0`K5AIBinqus3 z{v`P}JrX0t#Z-J3&IQv%wT7)@=bzqk${Y=>4}#UumKmf(iT6cd;_+Quyo)ep4G_ZY zneHMk*0{==zN+@nn~&;4Z$2`u^R|~l8m4U7?|uFGxvtI8_h+#>w``4_V(!kl8GNEZ8WYg5ZR&HbS=_wDK1c5^?pJ=Cepz2@aVTlb{g?d@MI z0q2Rb!14V5Se=<%MiGk*HVOLB(fwf~J_AkWs~ z4t*#GmVDhby3*?ZvvfqJj}INx528)4K5Rwk8tNCy8dC6X;LJPO`G^}S`6s7l6=D^rlDmi^7x;NB!{(NUl8l=M7z6F zkM%c&Mt3>{8|OSNXKC2#B243})-eWzaGj$lO|!BEGaa#=X?^YN6?@LtfX~ZGo?W#T zfU!ofs&C%D`tiHtv+v)&Kl}FWkKey?{KX2}8-_Uc@P=(=aI;$Va1My%~B3w8&m@qjN^;%5CUh`p6R^kvQ1r)#%jrLaq$xdO`SVsrT>>*W_=r&l~r+tWC` zC?~yQZ_i8I6c=3#VddU*gHx6E`I&bkcQ~WNPpzPa!(R`AH!D8@z;W>QlanP%LTz<< z2~VCFo+M#E57SfU?Cg)P5S|OsG(^&ordFID#gnBX~;rkLh|R$ud`CH zG7qXNLo*&$Gbq#o*tOdS#4;z1rU$^WeNQZc0JSG!>b?Tr&Ue!63V!EdvRo>djh+w} zF$fm(kllNq0Eg$TdMen!9@@JAITwcZs5&%(6m2Qq&Gqgsu@k}0fYEiYJ%3~*jXeKF z*zrfQCJd{3&fo4?q2t=Lu0Q3 z7-tM)Jcqi*I>gWo?24O&I~}txe+Qtiy7K;n5T3C=@+bbKf8k&IGqUyPun7JKXsD;L z5%Q3Gl%yf}zK0}A1Pg+8<1l{S>34#?c)9HO87^pt?&=jb2(5NkltTfaf$>7>P6kAT z*gQke4oIgzMM>!-K%I7XBX=)rvm|UV_F!O6nMVo8d>5op9~&95C2w&uRbd6o@?WNC?o>!cv17KF-y>!qkt`ZayVb~bvq16f4a7qP<17MKM zt}QbI{zjBItSylNcLT-9K1OUr@m|;K;Y@JkWN>lMi|F7|!3agb6orM)4+Lp40!EWU zgngUyx^0FXe6k77rAPu!VswjB#CbDZ)s0CQb>JGgH> zv5#f7yKZL_Aj(i>0~`?ratc!9h{m#Sav&Mo8Y9$ar#a3x9|#uT(!GT%mn_WzRZG2u z1Nm*1GiJt9b~7QnX%q{(PqAeSe`zkH5Ku5b*MRL@^vPk3%ESjBUb8I(n|yn zp7}~cLAQ&evha51a{E9Aso)4`$KwKDNyz;qi~z&I`77YhayfL7*j|Q{K1H~}91^75 zbqO?D;@SkT7B+i{)x!jL4`n2O0SMI_6M}pSKPfkW-*Pe@K*wxMQZR{#nCDMJ5RKf( zhn9U@(17t=!%*P=X>SPKO;HGuX^^rrSuW9}6L1eOJhTkt^zkzaA^_Y7GFM2BZf&hW;g-h5)oc+vcKQ+knug83_{>r8F(T%5KI-0AcJzV7X&-{ z*WtWB2Zr$yk(dHkGYMDMy%{pgz|BVPB|Q+A05A*q^nhC}+zYP{6a@by@DZF2f+;Bh zqr?I^<_s}sN{imCf*Eq${5e6`RSEeO({(o=GYe^g16G-s6|Q4@(+>`WWpCKFjoo%4-awc*09lH z7==_%DSQgBLC^&QrcS^m7C5)XH;4V~wAeo!aQro8X)%0cMKG3dZ>S0Y3o|%%e*stAa6d zLn^)ibuMAbLljm7FIQUXE}58)5QQbEcd87=NuT-k8%xfi)<`1g2FT-$$yt;^Ek(YKzL?{j@q&C z&RXf9i-OPLTA6@LJ{0at4nn1__4oQ2gF~CrgKH@3$qrXAKEPvoXpt1GTZv-=+=}3y zApfi`@37w&Ve2l72i<4BS~xf)3uTcp=td|=3~#gP_PIA@c2eflt#;3G zJa(^b0Yjd$)2-q~QQSsL+PsV1U8f*l1YU4U(&x%GXNogfE0;)Y96IS@b{^*v;gri| z(k|hU!r1zI7%9$=1y0NZ5b3|!?*bC}eK!m{@b`JlHs#>&KacjlI)J@+*6BRyK6`ff z=;4!xooCOwmLYDyj#9Cy0MPUJ`Y|mjzsMvS5HbF=Pj!Deo_lt*y+AG;O4BH$uzihC z*CZgk3=#B8DX^@>o+%)wGj0+yqIE%)>s!x@=^6_wCr{fB4#_RchAdKbPhp>oT?3Rs zC$_<6t>K3ReD6R%mFs4Up5kyVmF6fr4j1s#&xCHmPs0p`&wmZWot+fbxhaxBka0mM zNXRDdq;J{uUYO055GSt1%5DL9^iir!Fb$I}#xb!-aBV zYuQmwxOR8>9s;{rsMoi{#_L;i>EvNtzo?sXWjf%&_;Q^{D#u8y+PADBShyN6;tN-0 z-Hgkw2Wzy!Rql~6kNr7iYZiRmUQm#U5W3Ny2a(759#5YSAG;k+{*)D^a%s^FM-j3~ zd`;SW{i7@e24yiUv;5})Fi+F!+AKoezf6=+HVmic0i1_F#23e(=C1R1XOGQx=(Y2B zK8=R4dvN;m&wu}_{fE82>z)2QxLGX+2N%Bc^Uq)HI!Y!;9)~wb)kgg?Kxjr(W8Ckg2TgR`1JLi2p%B9e6WVorAQ$btVmB`R20Lw zc)3(1@7SxdEDzQ&tgI($?nM}oF$c39Jn{ueqYTQgT0HlP&m!GYrihKpP_c|oO`cLTiG zO40vk3h$J8HDrd}o4ig{uGyw9tvgoHnqxIJ=`x%efqH03Ks+0v55FQbD%@ zyjy~{#tHbw@&KcT5V$GxZ%B$npld?d^{c9&Z@L_}K;COe&W56ejXv(|oSeSoQySDw z=ynvIEj^*~6~aH2NiVZ(8b?Uf6nI0^D*|mIh1|hI(%ec9$1?RzG>3$dO!%Hia*#H$ z!1JX{qZl93E|fisvCy?;6K68*r#SjZdwpTd^yOkaCS9K^qsGWZ4-WZCd@ynzKjb-A zGUs(#KIO?DwdC$&o_?mK%ML!t^dA$Yo%cri(KMRz+X%=$*0W_lM|y_r=p?*Z^-fOD z2jR)-2mH9gkB|6qh995s<2`;HSpG(tcY#STDo38y>7}xV%kO+y`sLT;QVE!ZF6?bkG|T-pMVc=ufYiV`(!Jhp=!9Zc`x{t~nNlC0#B%J!x;F zb6U&>CL$`tOfLR%c?S46!94&R%q+yvOe6lL1Gsfe)}P>aWFQK>HHNYum&;OR(MSOg z@b1{yFVtO?9=9@^pp{v==Qv`R=hUoXw!7uI=1|LKCX-Iw!`K<93>*D7c@H7#T3g68OP03ezVcPViIz zLqI0lzX*;w5%%APN2e!)F4w!f+u$%+U#ts)q%-CH#9AHy2NGuP9F zs%cz7I-@EpGO@8DmlamzqRNU~TUn8rh4Xk};XKYQoW}<{0QmxjWV$SxB-2HG(~=AV}!3O{|H%uBjhuxZPeAcz#7;1ao$)B%f6_T zSow*2rFn)4)hZ&GBQ)t@NA3u1zS))F5uVTNv>b#i6YUVueyf498%9f(b3zrxP5jHP zbk(YEV7&!aqaya_n3w)F6cB_jN4P{A=GaRq#?QUp)S$K?coMKod_f6;LdZly5CLNwM3+~K zeTArEF`ev%I|poV2UIbbVi~4U37t>QPMD$%#*{4$UCttOBYs#qe%JGN&`<+w>USL2 z0A%bjb_RZ-1NIIie{xoC7j5JvpiG(1(59MC%ca{xi>}OB6mbjn1#muk0>CK}->;ZE zDm!d9emc3Hoo7>3nI^Irr~#j;;8ZZ*?aaWTx3 zIqoyFK3`LebVZzL+vKe75RGI`4m=&v4sjI{xA`1=R)~64NDm&N>)S(%o_B*&LXkhO zxQ{kX1m9ciJZ#>LySwzN0#PQrG6rshZIR=-p15oR^qbH%7MB9}%Qw(H!I;R8S_^Nq zlh%{ZJ&AURV!-BT;*=4Pud+2;6lLo?ZbfM;<8~0_;Q5I^q-MA19u^Yu2Tx!Yc6-@# zVHBwNL69C%G!vPp*#H^m)J=eY-`#CQF4*?C`3xk;op*Y}=VRIH(3^zg)8POu>V0w@ z=g#3T87eJ2*9*_FFi48P+le~vC31QrVMcJdq8D1q<^~TR_y*tv4}saSfTl$OYzIvW zVEb%WlUM*KuoJU64gV2o7g`7NY6Au6pNTJ*%5AIl6_Cng435E0!8G_kT$9@lp7 zEhU4NZ-G=>aN&6cM_Zw=oVxX-$yuAO4u@X6KlmI zAn=CG$8Zp$OPKQz`b~ZGj`Gp6)?0b2-n`8Oi9(Vn;3Iby%F&p^(O@7MJbYq3=@u0& z1@HeXQEZ<}(?D zLoDP=^hGLo)Q}c08&T*=Ie!tMK2O$(27W|DQ_AYr>Wv-CRXXC_7BQ0OI?QHs zz*hirEeBTAB&`JzgR0V##0iB>w_;s?aX}3dQ;k1ojO+~C2H29qx)teOEDwAJNQv#7 zbi?g>I)1@uP|&HWq!ga8qN{H<@8xTxW0C{*Wb5 z#z!Ls@216y&??&0#Q=M)6|iAbq;O)t>1vJDMFsIy5p9*SzM@ek0ba(wS`xWG=~&5t zxY;n=B;*Qs)xh|2nbr_xv_pSnQF&M>>>Usg92xsj5=N4$S~d!Iq=hwEA1jyYNlvsX6-d>R3SXeii zP>`?lDCempbP0Z;p&DOPWyGtOO4T$Ls$N09E~t?M_I3$B)AZf3j@F%cRDM_6616X(_N7|;(x`pu8H~aOWfaE7g;{t3J153>K`g%2b}r~B zBGL18IKtJN!2o8@7jghI57=PiN-bQR&IW4x_*-^Ceu?lQtKOuI0*`T=l;!8lf7N;J z5c*O}DkOBdbR4b#LiOPxna_@ZH>Flj`EHS3S~0mi?dKeX0%WXcbQQJcM5q2Fak-qV z6jpb_?Kc%o{v%YdKeFhpH=#C-%&a(C0`@cY#!T4spg*RFhCzZMnD=U^{E|8u+YyDd zijxIfeFc!w)xv&~`54>OJ{zO#FuMQ9qT{uTx)y0ZF`$Yo?ILn*U_s2G6P*tM*Ii7K z48X`hdHqs7VsFo42Ti$4s zKmm!D?}ddBMR(95O;wj!1`p>;fCG83?)Xy~rv;QQbcJUb)|JD!afd5U6{*=cQIx)R zD%jh(#=R;}yMxurt_atU0Bx4VPgbVgMVE!QKGOU(H!WkbiGcUF6Yr&-!CT21H|DGB-@pR|8w&8`!;YhMNEpY ztxCL`G)x#ZKTZ8?P`&whw5ex#DXpJ>PJhn(KNo*MgJwsy2e#g!0(`?6>Dcs_849<1 zc#(ig%RN$rPej=R|YOiDwn^dM@CDN( zTFDKGL{K-V*9U|e`&Bbk5@_gVkte8~@`4lyZ0z&jK1GP=1RTP~%bp6}lM;}MruY~= zMHY<6#Q3imK=vV0X4ukbbbW&FjiFbOQXvzkf%$5~GGOsy4yYpTm!bR-IQVQEk_DND ztkdqU{+rk*DM?Uixs<>E`sO>&KPL=psll^?c(@o?u5=L9Lbic8Ts1Euoh!jZojn(N zcYaJirrA~6g3kX`mh&Ite=g#J*?~By*8)TjtFtJMFpg*kR<-n}p1Rc(8IQP$yEzgh z6#$)oef7ict}qK#v+0o1)3sUlLCan=*B(&DJ1HA{+uNVvTy90HF@ z)@;gFhy@2wmP1*uj$AM6BEbkhO#pJp(k}pl7DOJ+fsx~z+Q*?4?Z3XtW>J#z$}CY^ z3p%bjyVzN@p+^LbJRyzcQ~v@I>3ATWegOde$0b2QMMwWHxMp2IPiwO_DrF8>Ow&m8aV2?;(R zbv>Vq2BW|LW$4ZtgS%Bl?_pjd^zk2&4082`)OT+-kvO)K(EcBN z4!k;52}|uK04aU0;3Q5*tcLBzsVz(4ZpmNnf-V?*yM}LS6jlHo8ubD;i$=mdpn4B( zz?jjPeZ*)n!AR@EERxtO5_-1J)`^%bqGd~o16BFa!Z&dToO3;4xt#hY)(IU05*=nE zWVY5f6M)?4O#uv@I)M98bGIO$Swa3F9Y%d0zKDQ4>@+Un7;C0;#VJoGK?CrI6O;pa z0NJIOaIeZ)il0gJS7twAc=w|S=s!}A4DITWjn^HTHH)1}a=;(&43Yn{^R+Q{2dLoyZdoMOaprTx-ir4Gzz>UfX@l(y`b zqg4gIPY<3?t>r9oSxP#`udNDRs2{BjM#)2NM7O-~Gi9IW4`8n|a<>II%TTdk zfItp;{e*QNRHcSKXZHgx323qmn}-Nw*+Ds&3qTmfG6f-sd;I#TeruQxfMqK^i&(R! zLD>cmH~@!RZ>p#?MP;pZV_}S=fn9qhh*$lDRmbx+w={@m45WfFgx5q0vWdxm2N8J* z|Gr{!G6w39AdgX4#-&ZgXf$y^Dnohl;?0^0q&rf90`}vku%oadGsO;MUl@W|tTw6; zTD!)=Xro3ENmZ}3-J2EjQ-LqSwTc)PG6mbusqtzD_fH|_qHlq*4Or->lHQoP9dxyA z<8{@QAR&d4pY3%$uV<4t;?rc%$B(cGfGoimkNl*X>cR_1-YI_i#Q;ruh;BzLUGV6c zk82t{Mni?i&Gx7g_?ew%rx#Z>BrzN)(|QB#&b5P+c?mx&DGklY;xT(tVBUZXRL%iT zVx8K}eh84KIy;MtH{@N8ei_`L#w%J(OJD|829lx>;g*KmwiU^;M?Y}3fM17GV9;Ap zp`+U0891xXB3Ej$V|!;O3w-DX)(u4nY>r^|7}zXG1_Y0_TUoC3?zeDs&YrNV?I{b) zSDYHFyZSYzuQ??!QdSyPKZ>W!rrq!fOSx=VEfiovNi#36dA?Y89Mi8%D#on zkeJ;;vj-zT&>QF!4g_=eIY6Tj5WLcoW@2!Usb^g1D%vN)049_ph*8I)1Rhr&N@!pvVsDY58tW`{-a(btU+_^K$6qLQ05e}C1#kvOe2HA=WpaVVU((_ELtuTC8sSj6 zBT_S16g#mA!DC`CsI7hQm=LRVcDnkZMPW`quzDzFf}EMxAsilY3z$)&y#|lS_y-um zfyV`xdR=wuFjhkuyDdV=zW_op_?CNgaz}K+!h8+!3}Sct2Kty{@J|tvT4WL_J3;xJ zdIgd&r^Nxe#wuvdaR|J_959N^9#e#c(l+FcwY+I|!7?Y%@CY4OrD!i-Hu5h*H^DH; z!h)7v@nFsC5Th>pvqoH(uf=sm71!~X3ab}X6RwwbPDvgd7>iM zt0+(52;)Kl-w6kY;?x#uLQuPek1DoedYRaQ0|X~&&uJw^YZSvF9K!OBdM!kZM;sOf znkKj-jz(>A!>bP(wRw##0&B|G%kEZhJg#(a#5e!V$^a< zoF`gC9Br%2l+7rAF$BS; zng1Z{$0)2aAi!dzg2gZy5a2KfgK=%=KW317jW3#284&**@?PKrUAN;ue1hZSSyH}_ z=Er0zE=xp9@iLk_^p_$xDftBJG?o~{GzzW6x0s@oIG-+Zt-wo2xD8`uqjvR-(I~kz zxFQ>4voWR}w3wEM=ggF)x{Coln2oDiAeGv&!@1BzKBd{>i`M zx>0#SC1bgCzK`Qk>pfY9tra$`sg`_l9tlldBN8aQbzE?*(avX$iOWfMJ< ztq?(oYN0XW#hG%JNF1$Eb_F0fA?_-SnUy$`GoRk);BNbF%C5rY7w52bMSyXEE%ycMZUV@}?{W`Nxdh-h02cd}d%64e$f)*2nRa0KaFsk(hWIE> zmPI_ofE_~~*pB60ERqq;9fd@9J*g8sFCl+I-q*GWmqJCYWR}@}nUtt4ii(&PdjZ8} zC{S9Y%ny)v?)g`06Eh6OwV%y#iP$hcLa{5)KhtP8-6g zh1Byq(9@XQNP9gCKWY-kO3(GU4%1#-%R)hlBqXD=FoVzKGHb`^%m<(F)8FB_l&MTY zg8P#Z{dCdCEX~g7IGvtoD%o?+#OXY9_C{?0zd!!?`jzXgNFmgzVvqQj8TMkAbSdH~ zX2sJW6S4>iK8~0CJYNxpKvMBI0!9uskJB^s43{ZHZafS5N|7{_XJk6eJx$6ZR-N@m zr=z5EhLD)!y2N@fj}ceB&lbbU3)u0?q`X#Z$3z{hWxLWoK|vm)q?iL*wD{wjNSKw> z(XcUnPg+^%8RD_-UinSf>6QEYo?hUz9PqKQDcG`HuV<_`*}}?-8>z~g%N%5Kxkd&A zGwPlEeKz9#>xr=7v+Ocf1kD(w%LPk6p1z98NXZZYLmb9^EyNLlT8rzJdiL}x?A+L7 z&+F>VfO^ziuLbl0c&|8B?qOO$ds|lt;9y|NaQx(c0JyZ4!c!r+dED**rs4AKCMUb} z473nvKlORV)4FAdr$*7L9!mGdS;$k#jPtbWod2nbcpj&yE&BY;|F@n zm4?m&eGY4vSQI#8JYr?dlTlq=K(=~OM5uLz3DPwN#}07q*!Th0t6jttC%(LXJ*rnM zNko88uUZ>ut}O9IrGYP^_t;LKX~nFXiqlV+BN>2;^eD3gBD~3g#*0_j0kknf9X^0u zMJlg>9wm5$sAiL1Dh_qE=05;)#Q)H*eA_Kf#ahKATR%0o8sgF>{e@sz68#h^#JCbL z!{+VD*b#pE$%A~Q$!Dluv^!mKBVT1llRt7Op7}Dxx5QSV_ z01$KUVXzOQ3dVL4OhZy3%V=~={KD|E0?HNg5o-*F3JXnwxu+!lVnW{tx=A?xN(eej z*ui?sxF^}6p26aSN#qWDl+dtjM1aoGzMErGj1i<`3g>-{mfSraREPzIrVrJsAu=%j zfDz=4q|0%6?Qt?Kf#37h(wYpI4O->sx?aOAA)uB^+6OOI-1^Nn>SpaWSnlrmYVxQfvog=M&0Zy=a$?^A z(&7k?CW#N_I;5z>ENHbAiw(!bhDK;vTPvba4Lp#R$QU4br{l41-P(3+#96TGu`2q~ zh-NYM)vU1U#?bL;q(>0ax*b0a4?7CaPx%~F z9pjBbQARmHjc5XPvy1Pmwn=VWi0E>#dmoG|AyJ6DG*X5xsyXoOCl7giq&+S=kOD~Y z%LCCZo+d~0J|%%K^iIF&dI>ti^S~IfV2PBDLHxal|GFR3zZh8F%={b6{2OpKB-n59 z&m1=759wb1hurHG-(*CJ1fg=Z;_;)^D-y_A8LKvpqf5pgYUx9~5uI8xFcgKh$T%Ik zM^upI?3Zl~_sd@X99ikC#&}48GFp{-G^B$DF4Y?%+a(Ycl!eZK|77=1KNfM$YjZ$T z*hx{`Ut1ZVb0b&;=7KjzqCb&fNS6_Yr1qIAAI^(NE&ans2x{!56?L_1+c7tm!ewdQ zzN~JyF^GmvF$L#kU|em*{E`ng$139n0l1+CiIB~so8h-GC67? zir}@Pp`=&Z)OZkWY+BDHe+f~w!V|U!*0GfGI!+D-nU2c(@jbfT0xB?3zk;Gr%@QUo zf4eob4BWPea)g_%qB5MuWvp1kXc1zR&;~;1Qk-EBH}yABsc9+X{R28-Rez&hjo4a7 zu|aR9Zzcrl>VOEQuGJ+v{(dOzso0q9`r`d0W+v9kodp`609Pq4KUo|6j)B}rB&Bk1 z!PgP0EHDlluVFDaB8o8CnTO^o_VIcwa2l>-Ov2`9D;Oi61eDb>DbX9N2L#x9-RqOf z6Fyc}R#f&|SdCq%@V9Y7s_;ccAN@-)xTX!RNz@E*wR4u$M5pN~@nsB~KfMRfS3}7w zchw}S4O=|E8X{~%g7-|ZXIe_RiAQ4ai3Ty=1c^f-PCjhO%Jq6@R&z3Gta@e`lbtmh zlYJ)JRBo>XsgG+cR%?xiAp5CbZ=Mu%@#*(!_$RBit0jQZy|wFqp|xuzFokaPN`gdC zB?Gt5bBTc-$whX6yCxI|!$qEx_=cE@#0=^(-|->VT3Bn1V6wQ#MvXbv7+Pzv_7O4W zthDCTu9pURKLQMwUf9N^IlQCajgddW{1MCNff9M!l>}Dl5-Uwur7=KL0k9FL>M|04 z`IPy~w+}9}=|Ya#_{l0;^_N-3KtCGqxn@ z^*>_$D^|alN5eQ*p|mKonQ%*@*{tFjR{W^PQc|qCb(3y8QLH!5wz=e4O#3X3UBnNs z*0Jh5${l}{#VdM(@HrIni=0yog~$%N%;)Ead7eQE9zmHej;`J;-9c9A zgzO(S#(?4nSUr7c45USZ09ILqfuTr{rVb86T;YRgad;ogiYD_1uev<+zmPs!qMM%aR9ooZnlJqw<7s|D)`Q}FDtTHK_1!85W9Ye`4&?2%tfF@k5r z6T%YN@tzs{uVe;m-9DJKS1nBsb*Kb zyBwMAc>F?{SI=oc;WaIM4;V#jWvkF@O3k&Q*S6pMZS_ z*+Y*-AsiR9s1fyTjyT6JqAvtrKgS>w^azC2@DksAy+^u|ZnGyPbTlInj*oRdN2WCW z#xaY1_xdl#4vC(wM&QWCV~0FSZ4FmJ=Yj!lwbj+Op@yKiUYl>Bi%*_*4?6Vf8_f`0 zW`=}D7Vd2v^S@JtsJVf==Nn2QOboH;JrQ}YdwuO5dEX=NUmtl3M}7ly*M`fiAaxO} z>MlqfFRr=L#DcNWFBD&DIYU2M@})h71z*4>{)Nd6m2lFV%?!K$8rlVyLCms z4c+w{dJCG(##T)vXcP9HXfwVvV~?GTn3<5CW=4sjt5&tp(W=r-cG0NeK@W{m#ciA3 zc0Ud~LHWG>-~oK=;kQyfKjdL|$DrmrwQ zB+n3x>&y|!2Eb(YoxK#QTJ0Z|GS(Q5qgrW%4BlTC;}J`731nnYvC$?HNLBo3CTi>6 z&Aiuw{HGI+&#wj9C=d+A*py$RtRKN#7yw-_5iN>XFM=s|)uRvv@s~!lWbBB;^i&c> zKB$&-tzF=XRC=gTAlelthdS}XPNbc$u3{mJ>DW8QtPOhBTQ|DahNbt6TfcoU{q?$> zcgnTR7t!Ku_w>cRAaE}T{2GD){7-JU%&THkFi^{Jt&SQ^-*Q8il(CQ%5*gT*v}Mo= zHGn=XU`QJmVM-(1-d%F4ifK^qnF=sp^rscC`*~zoOLHl#GflZ$(Gxobd9xDrVpbS2<=~B`B<@)mv~D z!z7kyG>k3o@TGL1#!kkyo%lC6vj8#cp7Y6BNjKioCMv!7;q{9bCC~vlaB)!~o(P6` zu0;`->fXp+rP-BZSf8sis|aT`9EcIusHUx&wew-QFm{XaY(2_NxT>e=;2Sue8GXB+ zMh0l;#f*KbbynxAq&dEe(oCeZd&M*1&z`BbQ$L^+9>};k+!4%?DK0FDLaXpjX;>+# zth7B<_$%6gOQI($$61*OXFO}w6+wfh!!`hd@iy(7yPb0UV#X7$0Zcq)Hp%+Bkt-xm zKVt)qKiPmiwAsvD8?54WGplH~V5ud$LAUd;lFu?8`!>?Z&21a#Z}8+H@}t|m>U1x| z|L5_1g^lNvT$&-y-&LY#PG)HvArd1#pfBLJz*3cNj?R9)lpgvp_fweB6eb2(75(yx z8vczJr|1e*j>QHHSd$K*PCU04QMi*P3M_`VR!z#hyXe&2CVa<(-tcDENyFp@4v#=6 zBIs`-5UUvPH2}ueqVY!fP9Uak2Mz9@+`sa2FDd_av1U|@533^bmoR)_3QlHBYDaAw zij{Yuo?or!x0c=HHFV7zKE2cgI4aC z`qd|X!ua|(Snv%L^!&p|UbAJ!=ccG+kiwMDBzea8)`fYlk~rvoxR}CFUM2LvL(MQcg6bsb4c_uO~ZKNEVA` zQ>PV$PNRL*1;wd6q*Pf2TkNSJy8FM&NbrHi)c}xaf4T*&BipFCYJEOEl1&{{!2-L;4ewfh_MW($Hd&dn4(J_b;G^0z{q8Vtwct?5NkxoVwf+^&xvD!ZiRzk zV4~q9#<1Vgk5{+KQ8HXlk^9z>s_|x&@iwv*>hd(%YD+7@wd7_Cs)7{bKBUHfJ60}g zv9cajqln{=h%hW6H7LK_5JKaNxLba9ENOU!8-78ym;|bFU&bU*LJ;7h;W6L975|+X zSm3iL_-pnictQgCsCybbd4>pKJGbh47V@5j{FPWp%EGWeb!?=8(R9l=O>r(!+ciCaO=8$t(l9}pRHouu2~vwb_X@B3u8Na1yj~)(q3g(O8maqcGEA) zY0pgiHT$*GVOaz)eu{`m7kanqepB4U->;_H&H2~r{jA!(y5$jX=2Y{L!!Z=QU zX0VU5TML#IN*i>$rgXWDF0+R622URObrd&v^28n!^67RVIqn76|2&?My@0L+#k;$~ z+?NjoWDP8K2MhdLgvL;KEP@`j?p#lX!iW{yUuQQxFXlamcpGf}F1jrW-sh2X)yQmJ zL=4-7d$>mo|EY+fQM2`{9skdK-ft;d*^j;DV6RhN@v}TN&hm8Yvy4ag-l_fm=$heo zzpP2TpSDRi;myY+9R+C{|M-*%4>F%98CdF`(}GErApR7NPff)6Vo7*|AG2&kpR&i? z5wQ2%mL7lOtFLx_jqc5Z3qa>D`n36C`>kvqrv-pPWsI#+5>2xU=QhUnn%TQ}(bmC1 zy~jbFh%vDsQ2sVmP=hhffDdwQ7-uajL4&OF_CB*+d@bY!Pf<($bUPRFdkpp8fT0=! za5SJN(h7?hEDpJe?dBngD?e^PW`5ofvqQWHRiibeN>ra8s-lI*sS#ytB;x3CkZ;B8 z*zL>X@K6OJR;u0$XakSW@1rugjNfxSRglO=T1@WewquW^b#^C^)dN%-w-g-T`na5ep)1x=5YYNV}D1SWTUHB2D8_hd2^^ zh@*kjCJooF_`v2yq?WCgL27RqchGo5;0}5PE0HSkJ!ZqMU9j{lWXFzz(`4|DPA`*T zC^GIwm4=9>dQ@29S73yEAQlo7tS+nvP%r{xLAp{NHQyvIi5^^|X-edI?2Nq>$^Fj= z?Z>r9!j7Md$RxewdEQH;j~Kq}g-cRY=ZC>J3Kn@|#f~aw;yLJvhivg>aPKA}0aPyP z7J>S4Ps5oKS7w@6yczHyk|UtndVZ)hOULH}zIu&M$_D%0mDh`ezuj4TkrtC=Tq55( zYXjm3+H*YpHpvS}@+1AFYnVz#u{FNtI$XpBzR89%apNSk?(O9@`E`Z?A{V>6^r36KDEkh1hZG+o#rq}2Jw<&SkOvZ7@iEfT@xLN~hlG_O zn*iWL1`W9T<8UZsS-Sy*<@o>#YgI)W0cQ5r#qHb((HCgi% zT{9gEo<3^g4A*E5st?^ED|zo^f6q$()>+Bg&?MXOl1)C48yUIvsM{jb*7^l}0|e?v z1VyXXRy>4BL5R8<$E2VR+*s~;813#x&kOY8#@{t6S*jUMnBH}P!A%ki(SaNu2f(tpHz06>!`Qmv5;DR;k&5qoPO`o&VK{ix!qmV7rtFO;cr)dp6ey^Da_54UQIFD zm{cqpheKQ|7N5vM>+r*g`F`tXM-7!LitSuG@8!ySx$;++D{p^Gu`aq!15c*iOdJ4{ zv|nF#qtH6_E?GSpb*EO3UQz5l5BUp9^lBNeA1KzZ6Ek}@@s!2}BeQaRpa-@xkRl6c zqr|8`=s%j_V;%}VPWWp)>pHU*Q~O(atF``QHJ1~@DpRajXStM`be?y&u_D$QCT^FCS#tqP%T9o59n^8}Q2a-p%(k z@!yOlehFQx<=R`Nf-G;84GE&WOGr5;pKygODrz+}DfP7E?{bM>(u+lO5igg{kLkxW zy8^tU>Ti{E0Ywziz96D~qY}69qut$|3IVA^pHr06W2NDEZwptwR2wg>pMdlTvTThqJWP@$h~VmkQgY1=uQVs~VRP zUv+g4zpJn1uhuEliC#_M@&pKW@?1n-O{Cr_#k*dibjkoH3S*^^p!Or>aDxbda1tp64ZVZWx8L%Ktb1fclzx9LH2uk{%=9gKU?V7FB0*t zF-XV}wd?r>UuRdNv5_cDBz)0ley&~Z7#pvb?J%lDAr=T0HgU#Z71C3~%r_Q9@i<<$5nu1cBJLodknA>L z`Hti&h~N#MJ2GFrg_1Qi-?RJo>hEdWJ#G7CXq)-AWIUS1WrU$Ye`Qk0QR){XgS>;= zkibeL*jIeClw3%(jD*qo#R;PlXo;am%;l+PNTHZeCDOuD)$G>JtU?IA-sdA=t6LB- zKEB@!_1eyd|DJl?Q?GmK_1l-s@^}^{DTo?hRyNbS`7EUA2i|0bHtqic#EIYQS|lZv zaMceNB(qv?sJ2)xD#dxdcq`#6zLW4(Dl6&i#oleG*AMChelsNOKFGs=JDK>kB1nDi z=(!af&Cn{w^VD8|aGpaVd*|VR9qZ=@m}ZTDzBVotJ1pmw##e^Q{JD(m+_R_vbp3M|L!a&ZQJr{b6w2v8e_CyF=jYho^#k1L~F-z>^%AZgkz;~Oo3p-mTj(NJwr;~DM72)#^Gce)z|^R7ml5zY2H zfo=R-1a;nQEzI`!+UC$}qdVWOgZ)Yen?-|{@z~84)tKxX26r!;?c|l%?Ik`{YmG}i zSr?a@j_*4H$x66sHF@Q$t!Sa9^<%%zX5cTRGzm97F^K!*7YjFCL4(1w$H*vb=U08t zzW?VD<4vD7l7vEk+-Nf&yb2Y~c<8Ro2-iiA3k!c7hT#r3?AC)mviKO4O9|pXtJ#;W z@1Wn%K1KEH&FE_O>X(#I*cNR5^wMH8Jhr;mxL;-$7gOO5*=OKyQ_o4Qx zO!=koJ)3Y?cVK{ezgtlY@Tz}V*Xm!^9rSNjf%;oILinP5(oWK8k|MzHuOYrxr4+b? zW1YY$Q;PIuD$FWSe|69WL9jca@_o6yS*dwSr5)LV!NDf$^guM}N9t=>!=zdYrj?jA zm0F4lN@)NF?w>kT9*l+<@z(Jj5;7W8GTlBHn zpr;weduPV|jqPnZM6<=)M4O~^%5el)p*M`2_ZHC9SD6FF!Ec`zaDuuLlPpjE1!p(H zXaV*z8#?*#IZ!aRMTC5ZXs)W~Srcwj+>IiI3J5=hIG&M z=Y7QK2$Ic7{5aq24L>pd@%Xb(fUw~cjSc^xj7Y`eVGZ<9WvZ`M(?eyT!gf=AB03;( zhvN?hi~pgS#kcAd?fgy9?RLy;mfrPEj*F`r4JIgf()HKzJ|Oqo{FzYlxR20rFM0gd zB@cO|OtIr&mW`t6K7U`vh#D?TZs?23sd!PDX2A3=;(bON>4VDTJ>|(~u$GH)A01A8 z*EwKp(VcD**~NO?53uN#GxKsSpbx`6F-9D=lm8q&624UJUpWN63U zys&>WPNvfr)2ryZAVDNz*!n!muMrAi=+mr-Ip6^>tU>1FI0<8}t?q{upcBv7E3g)H zJ0wxU7_;fJ0vF_AJfvs;&aoeC=QB|cT1*%%Dr@H;O@k1pf%B?Ys9f4~nq9@zr5)Ag zD__mcRKCgA{j5z#_?|U2{Fc>MFkQ|i7{3%x4Oi-A`baAI`Y`oTkH^NabHXi&F7>7@ zj`^X{oUtfzwfQuzYaU?g;sTmfu^G3!#RAJ^*>e!`i2pVt93>iPhBx>th*9nf^Y%FT z#NFiCnrVA?8V~3l(y0SPZqNLMwQ@cfHdbS#nlpZAnS*|Ai^g+n0wbKg2XOYfoiFlC z@7hyA2~+hv{I{_Ozysi@390uZ3sBx(!-bwOigZ_VE8(YzE_qA}0q}8O*#enLqDNpn z1(m{FMR^K*pj?j@>~1n_T_#Zr%e!7HDO#f#_GJhwIqJ3M(>MYULoid85zE1kI2yIl zth%jag|ufQ6+oea&6R8zXBKKH9?TYLv}IIcOmq<$Q4)3_2-NusPGO6yng`NyRE!O}C$IX3&J$=_N=QOOZw zp*fZjnHde^I?)Gkgo4x5mO)*bWsW((+L~L9Z^^yo7mun|ZoK~*y8Grc|0KVS)ym4gwhIE~91zFH5X zhpEj>+pPQ>noyjIL11V%IP03!N(R@_gcshD<7ml%XUatp;t_^)LL~6y7vZV%=J?g? z7iY&m{BU;k(&E^#4%p zf0!+%v;ZJl8gIdus8{v_O8N!T!8EJ{6)pI+yQ(? z@7667d7X5R4{SE=R>Hehog(&d`Cw~nJn`Jid%t%H0)nlGw1;Nc9goy-aCg>F| z8Cg6!3jw;D)&~wD%n7Br9pg3c4v(9u23x0m4h^&(sHH0&B~}rRCL6C^Ru%{Uot=jaNVAI;k)~0=K*B`g?jr^vd#* z(CEZK2J0%#swBnw=4&NLysgk@5kD9>DmQ@SUD2)Vsl=vHu$Jakdxm`#vlI*gxAvWV z`pXHNeRlfIhS2_rSV3)nTUqxK9Yq;%u!#9dwkRF{Lb1=W8TkP8pzYZSH9b>N8Je!) zYFQ68J%x*u&`)X#!jGetWE(ffT3V#w!zZwCarQ-ROMC=_&4B9nN)Qs>u3OQ*L+e;HYr{CGyL?ljeWBj8LqT5sdfC z>K-q%D8J^AH$-vamX4g1y^{|js;?s&FCoeY3M$q5n=$3Yul+px#N84$;NrJZvc^6& zq1ueqLEdt%a*b9-lMF-QGYxwsjejAb7Ia1vPCE=~bLK;PcT$fQz+Z=`7|hCjzFk*TJO zAzjeNXS4^;O{{Hj%BxDyoB9xy8UfLKaF$DFF?GzKyJ}>~*sdF4g`JgxSXtD=T59Xi zXN!t!LBN!QT!1C*{yP3|p)cx~yI&}A7zh>Fgt82P{uMjP6|7(o>&vnD_h z)xW`MC+b-lBU3p)!~(OLyw_C^8$MaIHdxW^JKJyWjHKS_5yX!61|om-fvfynuU!EA z#N_pD{!$@eaVXjrFuc2apsO1X+GUI?L9LY6%Mkrj1tQ`YraJB5%%6Aqus%WgjnWCM z2mhh3g1~Qp%}>jLDnH-my$A9Dv43fBL6^61E^3mEbvszA&`kKE?IIA|^F{Z3(J#&y zRjoF4Um(@pN8^bE#8;vhswUbzZlP(4guGGWPVnB2W}yoTSC!*69#p&VnDSe9N1BC) zPa5v;HgYEdQj3Z|#y%A<<2Ze5N&7aLPE`e=aFlU(bQVVOq0!k7*UIWtSd_-d+1GoH zMWFP`ZY#8TvMsYDTTbfte!BTlbZ9s5sv+EM z>C*TUfdlv;=7}s)CDpLtcj$<1F@^YzFP_*`VVher+Ql6%imWUlW8Q%Cn6Y~Uc_=(J z#ni~t=RhqxQ&lD{m%6^md4m|B^%Hy2RBu;V=bGDU(YR8y(#3oDiFQO$i=dkpeT}f~ z7_sivxw_?ENG{?mEzw4XQHlhG)Ec$UuUnMlq!+{@>9`n1b7Gi8s11gh04AMfk~%Hs z)r|PkxDrJaW(1<&QE{8q5s`{j+-t}=kAa1V$xyMDV_-+1Mh5zlUWCi#js=BJ$B6v$E|RM zMvh+lb7X`}v&A@ro@Cz{N7Ewa3nvz~vZMx$0lKb0Rdr(xeJ68SJ>c|V`{RI5I#!OU{3%r!gw^N%q6QJi2`r&+!PgAGxGX-wwBsre~uxm8K zc4)9G12+g>vqK_pYl}hmXErbK^bDD?4(GgLVU4YWE$bugXRN|Y(m#|>y+GGDu`cxG zApO;?sBKcD0*VQ=>haVym(4m(Ud?h|Oz(P$3m3qLjT68%Qtm4`ps{KI);h$V5q-j? zrcZcbjW(+I$9Go#)dqsBbsc^8XhL~}*VLnW8FPtXEa zP~d~-e>AiuH1iAw{n7J3shJit=J!zSljk36#qjNy9Gw~21dp^KEXHF#f)h2PD6gk+ zF^OZg;BR4gC!YV3mXR)*`_Vk1CEh{jFFpSaH{TwiDHOso&3+BpZ#@57%r2sFy#Jxd z(tV(oMSM^$=2PUQUO|~}J^u%rb;tLR_k-turw&q!{6V|<7Zm%>^Z%C?EAfSUSOXx! z`{eun6!0|aO)xwipZK4k&i{J;-&mb^I5{9*DlGdisCN1r(^diV0rmEiS#&`c-SdCM z{J*gLYL6_E3@iLcEc_!YZ1}RVB0ph~Ke8g{$;CcaS3`Ar{{LW+pM(O9#@juQa`iha z`d2LaKdh)0+lCeRKP>Rq+Tp{oMe(y>rT>Yg|Bsc{b#R{lXIRL8dj40+LgEKq#X(Gn%%O6Upj zL@3=T$|K^9h6DC>tss|?6_H^$d7A^Y)#tD~5`|DOBJq9J5`|jDJRTBRz$PsL)0Cgb|^??r#7qP+q3f>9LcKw%wFLsz&; zT@PQrJC24ESG5f;Pvdr(eV1JUw-%uwF$k49r||%2nH(eVedUT9BP)rqg+rA2jKRdm z*h#n@Dl`+!0pbz+hAxkqwNHUkTq=G6K=ZFcau#pDYmN}A={+*kjBfs`)(ybx!62p! z*zW=a!m7&x&um)g(!RWwFc?G|5fA$8uM0ac@Padyf2N_ZoF9oRKJjM+a^0e%2pk%2 z$6L9kv`zI8Z|To4V*Uoo*%dwr#f!x#$w0ctKQJ^v6e);kI29clbOWry^=uJ^dG3D9 zVh1n)sVN2cmKD=S!&Mx5H9ACo8#;|YeV>&l+{f{(rc#>iV^QQI+OJQ}UcWtIx=g(o zI#mMnOzCIva#in*uUGPOw`nl_wPO{m65YQfO|bB&^c6S*~WDi7iWA zOK1*7X=6rSI8!PDTYeEUBL}6*2__TM!AAW*(->6D3x&MN3J6`!cw9*%+|coq8^!aV zim+dwQ+0jfh3p$Z2nWZhtXcTRN^)^lrjQEqnuOKB3lqJDOi^pF$lCI|)UasLU|DK? z%)4f@9)hJdxNSil3ZGw(YdjR~+*L9vCywV^vLkdmFQ;9JRTj|%7BO$!WUg(?=cIOOOW(TpmXpFwv2&?ainjr@b zPv>YB9Ak+e3aLeA8@*F4iUuuya#sK@_ov2i$Yc9AvP35dpsiQ3#z5u|@)i;(Iucygdu2@b&8%ag-6+-FP-~pw67L-R{pZo%&jEaV#Z0+MuPR;`tE{aqZL&ok zwr;oH%diZ^goJxIk6Q#Z0}5Y0sT6;TW+3Xfx{rfrZ7xNqgX3<%^mq%l!`vp@+kQN^ zdf&@}G{yW&#=oQ-9C-@2+f#?My9-=nnK`z+ekFzOB$2j$B1n!gkZQ`F6R`VXlKLl# z?7YCiWpNlz&e|ZPCxE&Gf`pUP?%*If?F@RQF;=q5Y$Wu1pckMUz)G+m2YGd%%jJWP zT&1SkLHUOq7VqHir+<(3|Mg=3{{|e0C>H~4bl;J5W}nR#GgNB`l@u8i4y5q6NL=5W z#w3EuI6tQ?@?YE8OZS}C4gcL@aEF@EJ!k%@Co|~q1L`cRH%|U}ZBOu(DkmrsO}-F$6LBJw;s<>A6$MXb9<8ZTZqf)P1@;z80dfG* zjs!aGwHNY>Y>^M+Aoe-eB%#E|fv5>ccW`4V7ln$d_e5tEuwnDxXFi@-+bPWP-?`26XOSPs>dGcVT%etqf zp|y}I7!ouRw@+@fxLzI7uz+~4fJzIZ><6wjAM$7jR7rs;+)Rfi@QQFkiT!TYCXcq@ z@35vEXLLl1A?b-T8Y{`38;_?=84KI^iATK-5vn@p|I-_ zXRbe~J)su*efC~}jcb6>|3LoPa(OyXx-*_=A!*g;aAfBgW9$TTYHD6Z3926}^?su1 zHMNFON@HyswT_|`tt*;qA*o+nOzJAXr`a`a%&GB4r7}0_u-A&IPqb0z7*lI%6mk5~ z*3St|Z>VMI=!7IU%*Z;On({=Tu~s5%e?v_owN<;q)VdmZc7b<*)k-X*rru~lcr%-_ z1#7=z*%ft*HqR!N4ViAe+D6-ZB}Tup_n2C@i;Ds+5vtor(`#yx;AWLNFEF)kWHUgp zHn^neb)zez>C^^fG`#^s#G_eUM!>H|Rx}Zh-az&%$Zl+-p?*VMyb7eea-}ZfZ~Ep- zOz?Tr!R^ z)cDKg($ruW%}KjC$xPPhBn`gO48>t#iv>?Cn7GhLkn__Bbg0pEnfX4$Y-J8Y1233a zb-fhTr{p(wy86g5)fBsl#mVcRlIisO47KC$q55l}q~sPwlf+4z%uq&%Fz;yS@>%o| zh3p(d6M`U(S8uR)#HwS#?1K|>a|c2jUff0OhNR8gd7rh|T>~u|O<^NR=tF{leI6ry zj&>_a3OOx$%?=_{IpMARqi!Pqz?&JoAN&W-;vX$IOOtHWZUJfKbth#xFM@-E3utd~ z4p2QiU^kESFYsFjNl`4~;^6Rc_X$x7%rcl{l8!Sr5A^dyMT8nPt4*eYCTUVVVTQn| zJrorHql%X16J#I(<;gOWWui9_cFcw1jh!hZl1~#?C|~-rR>jA>nrhmJC#iT`OFheI zUab<%&y00$TD@unDfTAE+CF@H@vRonR(Zn}v{l_`35|+t;l$=sAtjW$TPl((jHIcA zMaimicXI^H2hf%xE-6uUEXBP>0_Ik-4K`8u;^sp^jN~;{MaE|7+>jp##VDS}W!#eV zf^<(CrH0_ODxRnZY`dpW&(b%S*v)>7bP_&K<+^PyXq8EeMob^C zs*JyWed|WbwFm3E;F^Ft_rx_0wH*r2pIi4NAfm1dt~jW4VMYj|dIz(8k>1okp2)Q` zXzBssy{-ePU8oXTj(f?OMWEvfJ*lB{Yf4(r*M{h$b~}kmWBpPX$GGW^TW&N_qSSZI z6(jXFA3~{8+Xz)mt$`E`due*&zFS#*j+Gdh3p7&1%yl%cHZfY(P2Erp8eJJP*94hD zC{MT0D4l81DAn(1zz=GV%3(|qP+gtGDpL;BDb{w0++bx2sx6Y4(9o1*5v?u$6cx0M zu+nB@lZ10@Zc&6iuG&jAHjS*M;aY1(L$TGb=;11(OOz*X>{e}3*;judtrW4wAC)Fq zmXp8vQZ!75T%Gad)g~2dKPxE9RAttme4>`DaT{iu5cYJZ!d?;;0KQpKPaT-*vK}jO zrDtsuRFhfX0M&oi&x|QG>l@(e(E3R*4QIn7m~OO@k5}}Z^(`41yEP4N)L3&viWaoK zA%&l-7v`i&w7wxlrCQsNrX8(sO4G2`PtVYkHq6n`xEf93^&AS7b$)JTHZbQeOl`*O8JN(g5Wu>slB!H9;9F&aQ%_ZfcE%<^D!e zziQ{dgYvyiO5tT{skKsqiSI_^h6%6aRW}->u5vn(wH@wz%sQ-^3WUbODOnD%!X3jB zk@2Z(jPTUHcok?Xa7)$3u*CNL@;M1g7IqJiE8o$LA$VnBM4>06!UZ~nsuQ?4zu?6Jj@S@WEH$yvE z>XWowx>u&`A8-;`5WQMcM7r70zzn_4AEd#o9nwI zcb)d%k zEky4I6FnlHC{<)d&n4qZbdcc?WA3+S2kMPBvg=#UzY&GnviMuAy$w`gA1GsWm#xqy zYVO34-F;x(49yvx#WGPm3DAi^*Z$(6BM#ZU?0Kp_Z*@Zr``@eLPKwb@{Jh3EHX;5n zIq+C{gMDlQ@SGFTG>07$uA)R28;7|%8^TubSSl+bD%-qk(3`{gdM`nj8k`P>z!R}` z+O3n1$$XBX>)7+33<0&sI|f7=CH5;=v;8%9&2${w8xAML^1Cj!lEo8#7R_CC1wE2d zCF`d^wQCHHm&+zw3U$U4&Qu2czlHOOjU1|tNyCh2W*D68bXM3`x)RB z?S_0L_h3YmIb5XdZi2bq!DJHL!DJkNsd-{`7yX3Z%^9UtMsS9j#y$P?(>ZMbx`!iS z35#8XjRN2ou7G{pr(oXNHx9)>UW#AOIB~MQfv7t7b5N4q74#xBn_NCih=w?2W+u<0 zgGRrUOJn14n_N$rZYdF4(a1vz@bFmjEl^Zp;TtR#FEwX`Lx zwW2YB23n-LWc&qf`GLSJ?cmxf+JL+wHiRzQGEz$E3x;Mb;$8TT;!l;2nA9fa5t@2V z*|DRcpl+2OR;c^wgKW0%LFpH+ZQLF=i)vYIgQF+EDFI*$mfm@^!l!GF z>v(#qWT^DClFUKFOi}Iv1+T{$4XYlQ)FoU(Ty9riM6%(2dSL}9S*)R~*;9@sHq*UA z!PR+Tk}J)tCFi!fvC9F^@+qAqX*0R_{R-+uvGpisxBH=et>hwR0d1a!6P2Z=eBsNw z!I81G=CQVg$%3f_hS**2^^jejMKP>OjoQ*=OP`9}HhPt3X3I_y+XYt4>JRKm&N)h= z+%loL1z|+m5c1BSq1XV8Eb;meczolNcUFKe`(&;sZW1SY>oVVQgHaev-avGF6O4Gl zQOCJ7OO3tF4uX`LVaO}1mnI7b|CgQYKVt zxz=N)+hP!`efqY%!r0D^KrIbFenFi@$VX~E9DRA+ zhoe&M%-_rGl4y5v9eu|bycn(vM zTraB{X%3m5_#pvQm2UZz@&&UDKd#Cu-(uOjUw4R=bxq$eHV!lMO>60v;V5<)&$hWE z+~Pb={&sxyuDr=Fa77C>oQ7~ay{jJllhfTSZh+t1O`eCPi?rBBc!1s5ted?zOB-~_ zN2p3o=WjOel^n9ceo;Y9-VOcm;o%;DDg;FeDTj1#gQLm!hDs@c=iy$n;3?cf?9j@^ zsBRQy#`uW&;)TQKh^4~xR&9|p%Zrj}AO32DTcnfIIk7rrZhA^qn*!%YE# ze5%nWjzD-$Ob33j(Ws4yLt>WEKzQJuU*l0j~{*W@cKF(iY4ks*6-+|Cpc2s^|8uFG49K>^Bru=H*lWvZzwbq9652&U20iTLsx z3MDjvpTqOtqV%;r^E&xgRnBx_22VyUgO=&Xf)T&xHNYVR6oLXJ>B6W$mPio&?v_`K zjUvMXEeHzH@Af=fEQtONrwBTP>~w zi(4KLf>O7=aySl3?s>)F5|p^(Jr;bU-`d==7b?dDp|Tx&Sv?#EmC`~nY0+FLV@J!# zVyyIATTLT&lNLp~Du{F`hIF2$qRUWf*NFEd6Sc;bBBfAvFV8lky-=Rk{6YYkeygqZ zp%jFMvRk%DQ(hquPoMg1hIr|>07gK$zX|2`$T0nmh@8Fiq)1guMuV~i9g0MV60u#2 z@FWvIu1Bse;bH!8qR;khK|4uL{cyf(Oz-K!*`0rirb!RIZ8g8f<@y?z>rWn+3&HB5 z0pAL&F9^}qC?cdM)`upxTRuua_>B z+-s?T7#ug(cG~8~>)m@ipv1p1Z1>Xfv!$yx4mnQ~PlaX7R=%~8YNp-{wj*2SCC zch(u}j#sQm_@Z7u9(UT)9?=%e)`rh!6YBM|wRG*7<37uc zx}{wwYPg)>E`)E9{GzKDaYMik#42d!%;H&&Q*{q>dda%w)U?E*NxSK~E9{GR3k7)# z&rDWP{UhRItC+a3Wp4cuf>CoX`*ZEHwv~BO71Dj`!wAp|?7`wkv~m_g$!A8x8Fx(1cK!my(rchT7PNEvCxYjh{!m@!Fc3hzsiU zBtB*PVcuISfWr#lPyuVMUP{185%^vVLqfnDWey>&C&qQGdw*4Lxx44IK>jw@4J{{f z)~fj4lfo^orl#O(Y6?@@VrY(*~!HD(B@*GSPy zoR4N^h^7~mpyihXa5JBlmq;@Gp6N|Ag$7KKna>JpY}z4~G^5;t^F*1&&s6lj{IbTg z-Sli)fj0}lo4FeZEu6FVyyn!{6W=Ie6{^I)GJ+;%=Z)qZdT??6l=bzr6= zu5m`EO+k4u%p48Uj==1=dtY~G*FC2>ov{k(!vov2(Vyo{`Vsym*_*oGR3hp+BF?h1 z_v`4Ej=-Dln)4Sa{LVHQcRv(yzr=}K#sN?IMyiM|p3Do!Z-O7pM%2YukzkW7D#iou zTN1&5h>ppT$dx#t_1f@tX0+;#+Hh-iUXGopblxvbC)2Z(0R29^dk^NxI&D;@(TgqN zM(gucG`M{kl!u&XSZg9KV2Bg6sCTdMg>k>gv|cidNgg3SK9Z&%tC^;jSK= zZ5ah6(tR=x3bK^Ume78IU^6N-?IYxXE@QNy%AUdHjx=1z(sC2+EXnHRmY1D%RYo~h zwHCTcCego$0YS0M1mdZ8A;)sF{evz;YzMZI8XTY4I$tExp|PbcotS~k*Bp&~>fbw) z^m@E;J#IUF=k5D8@e!PGF}k6I*FXH^%smD6dXikf575PelAEl3%~^HU!o2*)q*yvL zL?BKu7F$i7)%CN^^Mi~{>rD%YrebTdPPrG3C*?j)_&|K zYeY|pA4B#LOjG7==(yo*IPO}@0|_SVtToPrBd#mVHe{Rd!P&WRnpAIs^$KN|jGWlZ z;63hkG(A@MHQl%5ND6C_Z5#mo;p5x)XCDszjbAVVCv;dk-S2)hq7_nKvlx0(04rHCv-NqCEK0a>6I5c2fwh+b#QkM^%bYGPVrdu1 zfLuh3#?&nhgp|K<`Zd>>xO$D@C87IOi1Ss5^QREvWT*=?A7_ohRWLb7>rHT|KaR)B z?rM#yBrYU`;P>MROsQ!TIkm1q>b8h>^)t~7;SDZjFM`=uVMBla5lYq-HkzuAOT7-a ztn004Uf$Nio}hS3Tar6jm2zg2k>#ScLWLf;wfsG{)LO?v;o#~vs$aU^bx{^ZSqGGL z?Rw|7D~ew!@7(o1+XP*|QQl|QJM(|FTA6vbUn&7hr14y)ZfXh2(a5~?)m3rfKM&B5 zS$)i7l-VoL{ql+XJ=4h`+}dk($=Z#+%HXrUEs>2mZ5fT%7#Ayy$a(~ljxOvJ&kxnp z;=(Kfu2U{0Il0OeCfu7LF?zq5axdWQwfuJ9 zu_D*;_?$x1`*uN5Mko~pst%VaF9Ovo4|BBcsYg$`!0V^VSDptSaP*2l9y_+D7yb*j zfams4!DI>-C1&?NU&9HbL+7r4&O*mKzZ@hZTF#ySZ1O+M-i(7ua6N_Di3uAG`!oZg zxWF1?G}RrU!oX`6AcM>z)jW&Snn+|5UZ00UF<@ToMVZqPteEVKGS}~*q{V?)L@8JT zW**hdKpm zPjzs@;8L?5SsztPz#&kT2h<){F z33%xn?uNWv3B!xxD2;*T&-ra>KACFaPF%J>h$&k0v z*U>0EyiLP+DoSROf_=e+ZP1|*-{hSs69-8j;``zc9KekNI#6uvHoo2P9H-#;rXSX& z-|t5eQHO&hdnvmdNvIKJ90Y%+ss@YND~j4BMb;|NgNsapD-e`RY(1HByIxMy1-&w* zeIrxQ2z53o%WN-%G8!0~#Amq!7{XoF0K?tU>gsKS;}Hmt-vWVoLgA7@K-9%Uac#wT z8s5YE3)m#%t60}NP1hA&5ho{ej09_wcSiOi<2OPDTX2S24J!j!(1^!L%APzpZsL9- z9o@8P-3M2u-f27zj=w|XMDZ;-$IDxf)AZDTWj3d z+GeBaoIX5Mmq1{TVK^O3B0g(Ap$}S|&-pyR7Rgq23M z_mCw$a(0CA-N&~-^rN|}c`BmST&-afd{M8l^25)b3jt1z<$#Z%y!MP5gsT<&1kk`% z3+n2s6y(uIHHj_MQRuAiVqG~52t&qJu;!<0j!zVOlAf+PtHJen*WnN&=JE47xrrcg z!?LQuRVXgVcq>^+0utU}A7KuQhgoA18UYBvAkc;a$gzOi!5f@a0`X8lJ1 z)ICE3V%Y$E-f`BVwP4NJbJnJ7&hrg1vU~KEJH1)7nIAlIBPr&CcUuUYq)KwI5v`DM zqj0seoTXshv1qmpnvYNUk+U&Pl9p$n`x@uX%7YN^YY=6D+_PC;UneIVsvPHx8#Hf$Gxb2h||`WT|`J{J?ee|lRHv=z;UF{g(5`FkqE~^oM3Rd zy1E4|0X#Nvu6(DRInPw!qwM}7QdU&L`x=#bLojE#>Q^qgDmpUEV#ZB#L4)SdFz}Vi zDG|@f>29#TzAM;)nLj-VPKj=2mF^5P=Y#{*XXSNRL;=YC*lNKniY{o`b*y+}Gn6xs zsjakLmI?`Hh_2fo35$^#@#LznV>%I!pO4gucuXhatn<2SlF`YS__c*CS3Og%=L!+* zFN;Qr)^e^j?_fB5yaFm@hyK9*c)S8pPTgYR_MzBC#KQ3E=Z%j?Kfe6#?C{;eiysbO z;m{Quu^e6}laEkbWY;1O59f_H$7gTee|PlmP`-=-(uowT+Crv6N*;S zMLO8__)>4coA}kyTMpyvf^Evxbp|8avamRTT6Xy&ii#tF7E0PR(ib6hA1gDHinVX> zk)NaGG4$4J{HSz5pZg;_E8I z={)Vfr8MS8g@iqq`erhjBEb{eXQZYuyxR@=DjXP;W-*B(F1@In71<3`Uf#_jOXf9& z!|N~&aDLu^zwkd&E4>MW=R_=h9$K#Kj}$$inS5ppbL9iIdRDi%?7y4 zZf1j9ek-%u-xnHJF|o~UzKkw4fcL1mpCf^2Qx5m=QeSUK=jS|&PX)kKzd9Frg-w*V_eEcl3Pptvy*0t~?}!=;pZUBfbOxXjzCz_Y(ZWnw7z`r^ z6?dplx!pFTPrkvdpjzRu`_R1XR%`m1RiROY0=gtR#QMH*5DzD`g>DFSc?AAm*?37i z(slUoHW<{7j%z>HTFpi$E0Bl0e)7$`sY|dc-Hl7{_Amp;ylS(zaK(-y=9egX9$rRq z?t8ne$ETGImgc6vT6t*~W<7MyY+kigaca{6d8@c62it2*&M+ z3TJu+#o1e_!DG|jDMe0}N%rICAFZd9*Z7!@QE4~h5|8Q?>8O*HrbRw6EF!S%D9?(jKzi1X76)~i*mI~uFZa}#b3)LpNLb1|c~sX`I4En52^0IpPsKG+MQQW& zoycP{`=vFe@WOC`^5*-=<7}+S@{t8)jdblHLd3_?quIWaS>1rs0j=*tVPvW zGvo^)bZ@xiH{WE`hlp*N&ox{)geyLKTU%XKPXgakw8$f@U$~)!%_{!5@$vBZ{4#URcjmvSn!X(5Twz~o80 z(UEe9jA5tqj(k|rifdY-h3HKd?b~BCqeA=Eno+5Ji$+Tlwl@Z+hD?wmbr7BTg3nYc z;L+ zLrs@_aZ#kBj`}5f+bs{K68UUwt~FX5w7ir#H$GFTOABl9E4`k^HsI93?M^MkpZi(2`b`}La-hp&%*<~mkdu7^ub zCy8~LcNE(zgQ+6Jr06jV&8NnliRVmb(=odSa)R@OQ$k@9=!Dm_gu%elp|Yb#VjNxb59i04SD5IubkqEtL7J18$R<#hPuK!25tQ%PhT=;8@)M0{tMTtXE~ z){8$7qQKKffcr)XBM45uo)QA`eN*kRGI*aLM!!4_>aG>cAloW>F2Gh@Nv{aShNENa zmvTAOhj1GGi+w0qTO?5;$GD!yRK~e`(tr-23x}RN^@M>F~qxo1=Gpw^n~a z^!q}e!Erq7aB{ILKw(ncJ#w5rF`-~*Vwm@HWpKV z7B517X|;W{F_tCx@eaK3UieUz6su9OK|Eb7+7%@$RdI`{D{4R_tEp`m!Ju$$SU@x;oa+?a+x%cm+j8XQ)YdgU_tBCQ=P`UJnc*MexY-`c@BCJ}j)C z!!P#VR~etqx}uqG*Pj-!_N)EMSNoO!QMc=56BZc&8&SDs0PIk(X=Rg^%Ay=!yWo<2 zkxfYEp53T7kHO7GFOhEaVh`zEW&WZpXLQS#vgM3!`BLr3>&!H)$s&DAvzSIHGP-FR zQ{0U*a~P{J&JpDjU-+VG52|*BzU=La)fIZBA9Y>CRu%ph%Jx`wS-qMKnxpg%%DejJ z$fuy(wLYy|#}LPa!!s@^v|sAE(4?peVE{ChMoU2xcp*?LQ-jeoNfSe;rQb!E;svE- zAH=g@q_U1OAKMD(VWD^@kLkuRv8lHwwuG6P%I7p{f#Wth5S^DVC6p z0nR4Ey_UE^xMqLQ+O3O>5*$ZqmZ%g@r>e){HRT3l(anYSB}JT-T_96~iqbEc@k%Be zHa=#B5d7rIQ+mgEnNYPGFpBP zXYUEk%TBXdKuHl}C9EhspB0@6Ev+H?o5iP4u^EL9S!y{e;m^Q?8mO$fMKv)CN=khl zjKW}&ji`0tt@LfII29DGmC>eBU5c6WiKM9rYm2XxLYGEYFa21{Dkq=OG|T+c-O%Y% zaEYdKu_w2^SX+6Z@;oSgx0+X7gg%2i6BQvF`PFpw(vJnIEAM|U4Z@o*^gJH5?L zk=iR7xePs8I#AF${lZo*VX9~|R^TWM+3Be$HdNR1B}D=yLoDwAavVz=N8Q+!G?Fy{ zOnR?B%_Oj-?zvEfuBf{z)@}2IrrWhi4IxxQYiVD9<3p7$Fi4A<#Ny`6RZIbcJw*jg zv6xFT-LN*M66W<^KYa}JF8T_Z>ZRdO_YL+d7+UU1olT8h2zK=K57{RUTmS& zk+zsiI&{2>cB*@ZM?d(O-7X@77qz&HT&P|1-iiqkaYZ)}ZTvkv|LNn$hX))xe9b&8 zzcYDwSSc+dM+?+lgrgz{#=fk+om*8pHz~`MP9Gket27-?`x_f@k2?uIUq*BWO0G99 ze+$xSc(Wl&!iVnqO|#M3Y_v8A=_#jQM|^1Y!26W6!E^GUqQ6eX9kg)CNPKTmhqhQ; z&eFMzGNzoPnBph_TkrPH?|YsV3u8yC$8sAMTmMhR)|^m0A`IAt3DlSKHtTu%{HA>q1ZN= z9-lxtc*y{Au`X%xG+Rs{`ll6KH_$4bfXh02Rg+NvXtCUxRkyCX0i}Wqn{imJ_FgV& zZwfL*V=f+R42mwJge!%;BG^eTgp>lv44?+>IGDpt!hg;p+COUNv$Xa(5cYBO5hx94 z{zu=-YizE4d9~Zz6Qi+Td-o7w^G?RDzR*Jb4znJb9;E*Wz0lHv{ri`qb~xvqJHM#b zNnH@Sa2JW0ls)?QL{}@S6+{`fsW7;LV13OIQuy<*7Suj+9EM!iTGWPk4~d`!c@1Uj zmnyCNS2Enb_S}DIXj2<|lXM4fPena-L+SN%Frmf#<5ehofN${ZB^su=oF+7H!kPrH zN#}l_ufn(%r8U}SW}_iGtnf-8vnlO73c}P3fYUpVKjAusEj4eTtDFXub$nk~caAfj z3GXX?5|+imZL2uAU63WWPrV5{_}5u6sVnaxI#VPSe-ZXlz6#BEpEk-!`l6S&y`Yy% z!`nti920H5n7ZC{ZuHZx*S6C1Y=z3YWi4wtL))#YOhNz5UaBY&t}15{=Tf<{c5=Z5 zt5xUKFci@uBN-L##x#q|$^OZy>t%y4V{By+vSRkKiEtlY(-Xm|s$x#%XYb-C9v)6k zb+!EFZuC6Ud5?&n!~Lh9oJ6N)7%64DTZ?z|^$#~=&=jgdz`w5{y6Uyo7-TC-Wo9|Y z$%2SkmPXf&5LuQla%?rRshv2=PEFGsbx!GQVso~UZ-n5GEoxAqbiuVC+>U{{GbPkA z60vyNlUZHzu5QWnvgO3>hgvZ$ea>W-&6rYPfG@`~hc&TihwlT{lHNCV2I&a+T~ZTW zszI?moYdHRFtjvyXOMC+S*DSRO62jtY@2b9pw17K#ZA$nG|g3^7fdw!iJ^917lmx6 zl}Eldw+XH)=AOE~c${)nMGG@o|L(Eaj?7kgFDlgUikc)S{W9}o&u}jax_ViKhN{Vn zr>g1|u88}s=9ahk^1a{MY%MM#ZosKr)3aZqQ&!KOm4S9W+tqfzwblG%GzP5>W|z?v zgs#nI^N&^w{L?Dv{2{tFi}da+ZbSn=%5?9_nhTi*o;Lrp=BHm`7J71OnuSi3g13q- zbtPPn1#C@l*mLg_Q`2yCl@{ zqV~Ia`CM26x16!frm^#{)ZCM+j?$(UOQzy28Lq@{X6__y-QP`~$GeGO!*D>gl%&Zc z1qk*6l2?10;*bC`MIZhDt~ z%e(V8y=#BVJNVsT5zCdk2koNAC`))d!6qjt*YEdG}ZUQa&HPqShTW4nKT2`ru!i zr?T_Xa{!up`ls_E;vk?`?9k@Vn4|I!5B84oNTJ}ue)5-3 z(o^avPm1t)%o8HnFb@K9Ka(N!qowac=nL_2Vo}RQ$*YM-Dy6&3e z8Cjdi+O%eEA!{qo3fCOh$v-+$)GzF!r|I1&q_eD_NZaTbw$ZlTXNeFwG~Z_YqeA4= z*?g#wxgMqAwY1S3qR2(L$oVWylUNqILZP8)@Ohy!Z)k73f_ag3=eq;wC4&|WcQi{Q z=RY?$Hy!Vs9tMMf42BWa{mhv30=KL@lM8lx=lIStPolh+TdZxik*q6y{647*c7k)NN5=~)oq)`n< z$M&WfMT}++g6S+6arM{Hpa%Hb+hh8`n`^2)^=cPEoCedoXP(fMqmpPnD<8Z}Ce!GK zxMp03&=a*~dQGdvAQ(@d(pj&TxAocF`@G0fH(C%>h%&vTXgqXNjPjBumzSeZ`uBAe zL{V3*3@5I8bvWS^|HiIWNh@K(cj0HS{o#j49irvlXRo562|@l2cS3W@UOye=Ya4x+0xavRqxY zB%*diX#^u$H?;3gPO~^xg=QFpQQ`JF$F!+^n;Qj4c-&;V3nDM58(L6|u8f&TWlW7! z5x0dYCn@Sin)yYiBFmyLZ3F|h!XsQ6en_kxJ`Pj3a+-qO{Rs>KEU^-w^$41~@pHYl z%#9z*>4n@}%f{hl_eq1NL+8V&T@mEU3t5b@3F|LlkR~DlL1rW=vKWPV{l*{}C5UY? z)f~f!yDX%I77JcLwN|~$68rSYitlJ}UIEH=`_sy?dZ;cw) zobfF&oU)V*^uWQW^3*gL7n9BtVyCZ}R-C!0@O5wQq=5o|m5w3P30Ara9aF)BJ=go?80?!>_j2fRPx;)4H*I}Lh_kRHV^f_V5= zHZr3u9FZZuK$JIXDjYvf227E|*&xid^a>umPm)tZ(nIu3tR-#x{gefDtE&f-NpNSF z)s7`I$^|^V3!>J0KIcFm74BZuvlqrgnI@k+EOvdN*XtqRT_YMoD42_zFyA!X36U)MEFwVcvd@`8S~DwD_HiXq2)~TSlYK z9U?TL^7jTJ6?bbHuA3(+P(-Yuz3*m)TI$s`N8qqG~xVrLO4Q?uzV{8h`QE z9_U@QkLn{2^??1RPqQqH0o>woC zJo~y|WvE|esDBC>>LNXZf}TLZJ(B5AsGwqCxmnZI49fDw%<<8`PotnhP0p@Spzi4| zvU|GNuo!#vo-TS!kpRKD5f#@^B#4Mji=`B4fwElu1Z6p^mfRFEQ*#}D_`QpDYcpsx z7~RiQ2C4;88FEua>8#!wTNH7#i&No=bvOG5^cRi!!g^f%F zvY>3L#=}^B|mRK(wLpwEh)3o6Vq0kZ$#N zTrKOwp>1dF@|62+vJ*F7pjq;mH`~QWA?7!>zw#Sj`HepXzoFmRs?9>Ia@r|{t&_r` zykyxA{Zbn3=l#sn1n4ODJ8_adWk7GRjB|t_?swr1S6J{W217PRXm~VfjmoQ2%a(St zlYLaITe0{6WIV1|wNkSYexlLlEW1Q__Iw!K2x9Za^$4%jQl{?geTr-R&%$EsELYY_ zm&;#VibAy_unxq4e4N)o#rb~kbutNsEcW>ZClvujcMGYME)Z1{_;H-Q_4W1V8zS+s z!vFdD^=oJE?^jV8E)4>4_1=pS^>F#G0OUhBT>cxc3E;1|ReVCTUZYvFnpU1jEv4cu zXYXhn{Br@4OCZfg$Jsj$ucP%xAgi#j0W|0{Z-b`ZUhVnH`g+ZndF$&7=I8nEo}VwW zyOOW-^XvSqS>`9v*iy4|(foY!4E>@xx?q;li6fp0r%O+&z}Z_4@=K@r`J>ZZ+(`W1 zY5sSvl?2DK2U3>ootPrnxbRwW(e#XYl7n!G(-GZgCf~@sz(l78lu%tRV{+ zd4k2wxNQ-!lSFx#2+^J9U#h6JSbUp?b-S}<@m7P@f|@!!?X{ZAey7#gr0=vgm;VsD z(OSA6E$&Ba>5gooBYT@mw||SvZ!KNE&E?xwTx+pr9!j!qj*^Id%5P)-mC2S zOGi~3tA%6Aqkq9VBfo1c5o#x2JfOfa%kP%Mm8slKTdjJpal&$yl$5%iz4uzuQ>rQ} zs~c^CcJ`MxEU(aP+!N~*dg{bq@ZaTNq;J=~WB$7&Os=rBcZ}!SOM3oYYm=nT(nc%Z zjORxLWbD#L7pMu1BppPGk)^IuMwZkAk+Kk$)}tJd7bgQqH1$~~>ao(Hac!cUz##6yeUO!fHWi&<8i6sAz63JUtYef~GsSV@1st5z%R{H_`;1poV6SeOq_sBpRUTdE`w-<>8C zZ8=?_lJf7iQj+?)>)8<=iPy<67_BEa;e^$rqc{#H-+g@hLw{CxEy@wX8m4SG6g)aa z2yYNPj(F&l7K@cRs8HZ0hDl^+q;( zA&=cme=Vc)da<)QORo1+S!q7H9T^6nnw2ACMJm8hvZm>TePjwvb)h)2*W9nh)bue- zd4D@Tde?x$R(u&<+)=e|zq&f1!}bX7^C0eJoQCe)YE`*Ni9cL)|-Ihwlb9KM9we=)_ujM%I_7io#(`LoIr^R#ss+jjxG4H?M z5I}d2JeY+lzVOq{0WN3Juxtxpw-(4e4i;Mg#7sF1a;%3zF37YB!H)};4Cj=qq92z{ z5%lQCMOoJw<^7fiI2K=>O-3rbF(uz#O&o+cj_Mx~)Yvq461ykJ?aX4}{vIpDq^@Uq zMmY{z<=H@wd1H7L4w51Kr3=RwG+G9~7iyMI?6m_+5`mQiljb04_EXN41Ld**PNovxY0xephv;cf^(CG1_8cxx|=Ss8i`TXBz z;RDS2qV3WJ;iYM;dm>zX;H;Nh83%eP81Pal*xRC%W>7qXg9}`{QL;meZjyNxeRxQe zzfsN`QeHHqM`8-ku&SQ%s(R+ET{H-pfBo^zE8=K#n_}u!u)3Pt9pnAsp+5DM;WI*? z2;Y2g^`ZIUKmzylhL=0tUZXBSuzFkav^ubm)Ao1Z%Sj!Vgy5RvkL%n#N7?mcVd_Lh zu+@!32nm5;;omjZW||)D@}SB?V(dw)=SpX(-qg&f_PiQrrqdOb&7NABvcImVZ~V0S zqUvrApH`Ew^RB3CTBwVbl;Q+QVfsBK)>C(klLalU8bOmHG}AEGUD#Ss=pzm=#YVAz z(-+}wo`Q>(*DQRaFN^Bicw3mLMUH^&)(M>ojoLFwZMBR&wb_De?@j$ zTOCy2ufeZ|BRV$aA&p?U5$YBjC17RS$AOKNc^|4W1OMqOTIk(nZcOXNTw2YnG{6h+ zKCNpoy5|?~xGw(2bcT<0hU4mK=9e!E{GAc=8RNbv@^cA8K!n6H4FnTBhTK&^-%{|+Qg!4KYgOk>2CSsyz_AK0>>dt;T{BZo{=$(JV z)m{>I;^BmN`(mRG-o5&8^yZa+$>qv&Ll8vX1X+n_M}5ElsliX~zV`g>Mx@1qtEVhC zUR~8Nj|7(m%A3WEP0GMFvtKB_<}{o&&hDo~Y#1^zaH7Yu7g?|GxHs4Sgmqqm3tuUzW0zw!3?&EcnM?^C0>QJ|c| zp8uIk{pPQ%)SVoaQWDWSD8@r4)DveU#QTFFGTO(FPJZqA8tBiRQqKp(J$)SF(@ zEjn#Tb*Bv+ybr^IWefJF#9Z;?9%O*APsioSnjfzxS&Yz)u(((fMp}2bZ)(P)Gy_e#-aQ?2=&a7IW?9*ME_g~u#P-cQmSkZ78aG)WfCV0r@<9c!!bJ77 z7#RN>UW;T(E0f?eB3BwW8=0qbaT}Opp1!j2=~yoAY0=o8FtG7yn&p;7XyQ(VdS8o1 zqwq2q)jq@EOQ3PEmqSC>zY))_Zuy>r z>8{>#aR8C}etlYJq$mDsoo4?z3nzESe5nm1eb@EshxBJZ>FdQ@B44=d%K45 zfz}p2T4yIi=RX~MKE;~LCyEw*%V-L%JXvJ7H$wyE<6O~ac{wO+AsM1j@As@co=ph5 zX$9Ua0B^!^@9XOQHgyZ@lkMueV!4uT-4JtELpB^4uPT~&_&IB&bF&y*^^5*CL z`u{4eUjNXghi^ShRF20SrUxm_kMmg?^6Vvkj-#mOVi{YL6MK`fmhP4-#lnfWNcpgf z%Qaf9Vj=VyYO|A%;|Qxt2;4`{V+2#ZP5rQMZ}Pxv@I6WMy509YN)pgQY$s@R7G)|B&{~qLUQc#M*`{-9Fk}D5khOpSz7;lPIoJ+sr1N zt36v>yolaaa6uxFdcs9q&pA(M+6UTIo5){@T`xhbql~rK7YOc)?(1LwRUqVv%Tm@_ z?C`rF6Br@T+GCl>lpIs;O3OlM2`<)+Wr7X^DBRq4oPG>mDr@QIjOIn`1#iM+PjihH zZpVY?VQ9yA%523OCCS*krb>sNT=G1}W7Z;2pPQO*nd%X4yYvk0kfEa3ueWxmdpL5e zue*^SpG+YMxemc-iV&(2RZo1WZUJZAxF4J3zPvJI z{6_nwvEQ60!#f(M!3-7@Motn7l{P*Il{ws%mNvo9iq$>_+|+Svck){>aO*|G3`6keqLrbk2FZ_Z`VFr&fhh$?s9;a#RbtR%1#G}^Nq4HlI}&iHd&9nAglFbGR`aI zm!>x=*ZGfPomAADv9jWLZL}Wj>V1A2q*o0--s1p^{%a{SokRO*C%?c_!=7P39CA*8rNmP%k6)ltSwBz{alaZUET ze?a1Y=W}1KgIhY%i$_{0TV8#-K3bc&8xxLxa$8kuwjQ_}5z6F9ILw#dl@+44(y=QQ zD#2+ZCi;UiQx5xb3D~U)*kdK8CtfY*GIm|H^hqv5=Rk7vwyc&T?bK4<1X96eV`50( z!_k!g5)>Vkz-6%q;qp$jxH91E;o+sI<+0P!zJ=QbcZTUq*?qAB%olEp`s)6|*qD#3 zyNr7h+u2Mtad!w!wbqtDER@x$(;uDEKpr_0hV(cXbcX{C@l7T!Ny~e2dLk0LM zNCW?h-sli0-)=Ze4@O!hT&nDsZ1;HQu|H+?daV@~DF^sG$F5N+=eQHY=dw+5>i?>m zprw6=q-vB5e#0<`10Ny7|BaGou_faSYDKgS9gf~7(}L zAJj1WFX=VB9;bJdbxhB3GPw>$(Z524yCd{g43tcHkzrG%yysQ?tv{)sI8ryYmT$bm z11dD^X?v_1O;8cDdhIAl+B|7oG;jmHraT;=6=~Xn*s)FD(42F$z zE!h`X^AJihV2h$~>S-->8#NjPph0R1(OA`JKgT2eX&_q8|E3*ty*Kttq}P5_f8%hVKd!%Xy?+(tmj8>2|I78hLvlL39#PUiDCs*oUtx3m(RXfG z^=7ROfeKAIS~%ciRovbG)t}WJLjvMJg#L~HSEjnZm$DB=BT?cT|L;QBR=6*;Dljj; z-9xkcoeqoYo)!-Bf4gwC=r4WR+_mT^qm*sx6Hke4$H)Yi0X}{V zy~S`?clq{Xf^&!*u8>90uGeB?alNaeVsHT^-_ZLOchRBIZEvN86C5oXv{7?Gd7x6S zb$0G+0=Y%abBVEGzK=rSdT%8Gb{neN{|GTnbz;(DO%QKTqz-SuJi~l9cWyc{5hY_^ zVPq2{eqK};$8|wf*(e5dHVmF;0~hds1gC=Z5TXnZtE&^Ge-W&&!@;y{$J|iR8DVN_ z-Hz&z$rd7d<{|_Wk^3eF`}cD`3*@J-hX*ekS27NL#3#kLY zD>4*@W7lD$sGp^Vuz352diyQB`ym+wQoo#&ghIhvVxiIPpY6%2g1RHx&DLm;kw+la zu^1ldx&(qnh+UwY>~~5Eo9u5m>X2Ihc_GBgIK_Ey4LH zDXOIvH%(-6-zemAlx)47x-_QPhjOp#qFGtz#RgVLNJ|7ulVWa7Mq#MQYeQ}}sE~;k z6_V;gSv?+vqZd5uF$3dLik+~0gzmQIB(iC?9kSd;TPf98TOPN1;r5Fg$Z}ujkAfwh zWXYuD=x4Q<9V`-XP0efwxL{2Mxl3NtT7AM>O(wc}c$luPPK|`7yDm!U!Z0pnNXM8E zA-TzF|A$dK%e%D7h5XB`J1?Wl$lQ6__hDWmrp&Fk(HJ8 zW@TmOi=Vh3i=}Ss){kp1zstH(x-1^kF59WhF^+d@f$C=VBUeYMN7_&bm*nL#f1(+R zfo7=~)5z!=n+)?oqII`^r!mOlUK`*Ye`IuydM4|6CE8H|v5}VSxV9AoBT|gXE zdOR<2kXuXeVDd`iGW1i~2B0F6L~7oF;~r^C^$0NHF|}UelKCl*xk&npV?NuB`}=D; zf1yT>&T2}1lbTZvf2#>+(Ap)Xp#HvQR*zameAjA7adLF;V*B1uLE5i9c1)tCUN^2S zW|IP@`P*~Xlt8(YkLFL+&47)k$9$qMApL$TKM+jse2jg#&i8%rr@Vbc8fia>oK1cG zUN5dK$tMDf3@stF=2NLSJX8IwcId)>5q%ev&?g)}hxTm#ako^7O9oj1*yH#6!-buh zt*AGAKZywoUhi@dy3T%1>f4usT17Y;J@x6rdIQPqsfx9k5dB1+u{z;hA8aN_rz!y3 z{DcB9AyD6hU+hFF1JIDrsK;%pNyA01K+iwfR|#49CPPKzF}aJPboP*R)gt<+%zu%E z4_REz6YGf|nF5L(l8q5|lKpBq3el3_BgB-*SjP;iKq}oEzhbZ>?QE`~l%W_DkhbDe}^<>Y-rrJZq3BxBReG zbRbo+3`e<*VZu?g9X>4&K*yT@l#DGQ6GY;^@R#)4GsQlk-sdd3L=g&yY@3Jqz3gwO z^VIcj+c$EzHSP9K@#@)(1EMZEWD1KFdr?;!*_jatMH{zM%-#L+UpNZKM39?0Us~@M ztlW#*)0PwBr|Ed66=jC42Xm?E8}Y-+8ZzgwdplRU0dWVzSI>AM1={m50C8d?w5Kp1#}a;CgU*EL3$UEpX|B&Komx9d5V` zN(uJrUf9QL5!cnDPW$|FCvGz}>#kfObpp2&6_i!NWU!$_%EENB@g;eJ%tG=;x+FH- zSY1lt=NS()a)2)}QSW-Zp@^T56+Um^sL3^tg6h}4Mb2YRgyp>ENBp!$jgXYh)9HFK_ZV=rn2F;Z~HJj1n}VC`EE?y z)UCIl+SC=kW6mp?^X@(TqoN%%i>*Bn7Ey4qQ@oHIx%LKbGBL3lZ*=8*ctQ(;k=Pz zq7#H>8^=$nTNW;`_dhXgTDc6`Ituvo=Q70|M3!0sg>=;o^c(R=3BCLC*ciz|2UbSA zFVU;nU90_>(u-W@UTT5cbF$a`_y-Nw=qWXY-k5r z{Bv^cSq%D?5n4H!W?uCQ$^R_F)eUvhuN}9KF##p4QF&7D*GpLVHey)Wz2C@}udlvR zcdk2MobBbI-G1Hhx)XNY@8YPVUX|djqF!}pg@AJOFN*%2vl!>pCo1=1S5#5H`^9X? zljuA(ZpoQ6gVPFEB9*vmE7ilh0ApBtELEoF{Fv!#apbY%5Pjf;w3Dw%G8F<#)L#`p zz_Tjws4ny+N$MY|T~uqwlUZKImIQr+#qSZ+M_BtoIDp<~66nKotqaXG0n*aI7rKkNecOmBt2O}$p1a(2WK=6UK_?2+Uy$Wr#8I?@C zBbXsNF$F?`Q4^PX?wUK1{N4nV0Z*G(hQ$0K#JBGkokAElQqD3GkKO(|IEsNIUWHf9 zX(c6b@sCd+T{F_s&scmfzgy|z_wbJlxzAHK?>GT?*ve-S z>!?I_JxMn@Bd5m<~OzcVGC^plV~}7w6O5jS__4YGnn@P7i~F-@@;2aL0!EL(iI&w z4mYM+@MHZap`%{FaEj06JESbA;+&hT^BxCfO6AEE06?<%&U;u-pIF`&2&6x(3k~rT zISO(&DSNTkBMJ*s=2^AOOvv5${MdZO*?!ek_uy!MIjXfOmj-3!=xtV6GNb^q3OB(hGCyL4FATFZ%KZw=`e|A8_a=*VHOe9vGHcLoP# zl&T7gLd70O{iDchQ8x!?T*}Up5@3p$XXt42Na2DhW0~8u@r>2XdUo}mA|*1Yv`z)0 z{+5wVf4sGn;rY!Xv=7g=hnwm?lJc3fBVvd`1xTcL@~g!Mm&h!cJZZ+hID4J;1Mc3U z)%sbdQ@(SV&~w8sPR^Avo-*$%EoI2rqUk*t0wE$|=Qcyml;i_nGh+o?)Tq|5>v9?Z z#l>xk4)cR2`kLB2-OaI)Nf*hDN=?Pdmv@)$y~#)*%r91Mbe@-n7$JSzWcl|ZRNde? z+mpbfXbFk?m;Z~@i-!nRgRRv#tdtuVJFDl}~4N zjqfP41RR-i5*2=zP6+;Ci0p2y!mpGc?Ml)nWx6QWs~+G|&{)1phi#IQ(qx%ha8D?V zLhmWgcBcu-*H=g1{nOkKz3JttHp_#oZVyG8Yjz~*0a@Htt&iGDqkWe^gbloI1QvD6 z(lyXtt7~Hf+m|2yETeu^y~rxVOLt2FH6_2dr-sf428-A8{n-xHt;Xe@j}yK^cltg7 z1L=m0!KrWXo}!fn2PxdoYuA+dncgFIco}?gH&)hzA?x>6-62aJd35TZvUP?RW{hJTGIyqP2JcMEtKi%HygfF>p&_DrM63}$fy?>a3 z-VoP<@wAOYP9Y z1Sg2_#I&4xl)r}CJ!ETQ{<*WsovYk<;Ng+)qaaSd%nG(B5Go4GCMoq1F@{e0QED7v zVQ-6;PdGcoA>&~FRu79k*e8<4`<{EKpXXM7p?uJ&P5THM!z85_L7ti5Y&MK5uGoQvOF-ZG-8nTJ^w*K&^UNQ~TL!Z`H5U>@Rrm8E1 zYP!rHVL4Q!)k#JOttLM_;d)B|30zwc>9p~-#wuN1ge*{xKaA|yZ~@40A-#g_NcR;3 zwP8YyFC3vKd*Mhsz;ofWKzMuUs}kY)Va$lQU6f}wa7ucR$3vcG@coFk*P|MG(EIJG z_t`p}4wq?vfXi~T#4cesGX9(^IlPT|L=^P1V-G)O!o+WD zL!b=e=P#MWfeHl=XT3ocqRJ1Q(WE&;>=6KRf1*KH0b*W~s;Et`^Z;GWbzgC`oBFm| zv2ZSs;^5%m(4-7#5_{@W;w(j6+{>e{ptzoW=XB`(k9v(hn3o>hbHdpp9@*T<3rcFq z^mYO7@JR(51bkh}uD_e9tzeWp|vv(krXsH_y#OlD$Ssz6FqYsDf#R-=)K zjYeY)1?V2TaE75G$!_+}G!8chYCKqXwdEuF4lCn*{^W9@xSGN+;hH)05w*>rHyKYq z%@%T|=h3v@3CyKlqD7lwi{v$6syi|~QqrL6UO)v_kd3If7SrHL+7=Ijr#17o0=)H| z^H8iN0;!0W%Jr`HJzqPv(%T+7pWCLi#;%$UFM|&2x!6}YHsDrnn!$_qa1j}B=u|q` zV3{P>imdPgA2~RMZwkl#`%F3z^J{_y`n-g6R0X{|{#;5+3K`8fpNs*XE}w(aIqkTT zBV9}2Z-;8Efx0^|u%led<4x821(;gLF>e_Z!;-)1P8AYnRV4q~b&}Zg9u6hhRKUu~ zuB?1P5u$|i#FPwvsP18+w`~9MoG<-8{IG1l2}bxsR=}1n>t~I&{UTTkpkI~g_J`f= zSdnSWI?;5o^$hNx@*>oJK_)&pM ziP9mS^pm4YgxC)=hj;|%s9YEY1V9JV0Np+!V6g{Fo-??2Hc*7piOD6=(#Lz_M;Wb~ zB*EUYB=NZcwwb^unPfF;B+~kUHg!8IJ0;pC&6|P_IlFlS`s1^Bhl~Q+U*abFP&6BS z9SusD(7U=PaCO!92x>d5uUNR)3~f|Vhk>yu&}S+8fkzYvrSwWKEyW=H7%V>W38eV| zde92E&g!)IH~4E|daK2yeusRlEyy{9V~2allY+QF`6k*iB4~ktu z{)|i|e?{qh_Jl%K;!%~q#%SfuH1)ELwJyY5qs@oEOR-2ir=nBbaC=R56~D#laQ?RJ z@o7?s=+_udP(?Bxp&J;SeC6#Qjl*Jlrd9nVF2}o<0J$F z3aMA~(pQF(FE_V%Jho@;-;S2VT5etx-NZNqI{>RUV3Tjt@d zRe|&eSNNpQ@RcrAgI7X$3GU{_;rw!TNyC$`s+wJhg*Hfj{t4X|zn^utxEGSP)vlG6%&%MiDT`T0NUzsszKipKN zD9l_59|9$JpbbU)<%9>_5pd(4(^+Tt>E&h)Tsqk|V|Xm?KXR`R%DAd0Xs1F)v9b!Y zSW?e81rMg>!Lx2okhC7j?XTuYyH+kj08fgD>W1ewP;NewREpqe|pV4DA7c$ zCzyI}Yc{*Cq6~F?7fL5L(NVgboO(c37nxQZsIxIj*c|zD-0x;gCs`=DP{=P2T+`@W z1&CZh!usxr)!Yy@+_RhVw4jz(Ky{g%2lT+3hIgRgu>3IBB8953y;zoqW}45$ZOT$3 z^T$k`72aWZJd#W_p0!!j`Y};Hvv0ArpvmKtSJ+NmiC{^5=ig_+(G5K3OTIszD+WVl zT;UE9<)EacLXYg8D`lK0gX1;rg-`l*FFDIaaNjSGFy?CaQ+IUjM9iAABR|9rP4@x# z^_(QHG{IX7ps<-UK#IIBmDf`835_c~yWmgwky1>oE_!6E?+_#PyKA6MegO?cQw5D` z@P{(_`hb;b(_seu6h>`=ofIma#X5Hpc11#5K-4{WT1E_Wgn$-Ze&j!Hz~Yv+Q@SDg z^~`C8m?I2F9||2c(b|exRU!7Oq8{F*X`Q0M-vj!)bDY+70Ow_L|CX!R+KEGp`pdKh zHYBhvRZH@7>9{3|spnTBL_9wk02$2WJzFcqW5%De*}byk!6O{0;a>&p+aKTc=i|Kg z4|bBZ>_+>?psTSTK~XjWqIP#d;D|TW+>gXkNtW)jp_|jmjCdS7v3R+rS0kPe11tkx zkWo$8r`oPGh~tj6ue*8Gq^C}7xKfdS7Z*8>o*r4Vfka}~vH7WN3o#K%%q-dVw}8%3 z0%o^)DeX7hIRj_Q2LZ zO8=|;KH~<2;JLf&s915(vOgSB112x@-Wh8?^6}Hx1Q~2~jx?J=Bx?lM1SZi8y*?y# z&d#?e$=JB3@(J84vjVT1s4?>0(N<<Y+A1ub~!#~>MEA*|5odr`PE2iXxb_VpEsB$~1 zn#d{3Ym(*6Z~AC~rEWBgTzDxBz7`f9LtQdGnx#UzWmyp3Of+d&S`>yz^eUTm( zM3CBdv9XWz7{A}>`$-R>Ejf>h2Vz`WuHk~#N~w^$>(k}XhM4AM5xBddK2E$2*>O?i zscm>^ufez8A(OCDwkx*M!;^cN)H<=5q_%Tz7T`n6stv}Ycn4$F!qmHD66LZ)1zYjq zwPhg_w9Cu`iDGXz%wkw?0yBRGKuf~FV_NTLlAvPk}NpvKh0NT6*NWQ*N6*%WP-9mR@RQ0$aufU~*I zB?`R#N$J3z4qVYV--SShZp=2pKVEEarZ)>cPr)^z^s5Dc(-X*k@$xvJ+UqEN7NZ*h z`22W`(h@OuoqBX5%#LeYnEsrKtT9T@T$tWg#b1Bh<2m?qph-<31OO~GRsv-n(PL+O^L*u&R_FJ@Ql;3+=MW!4D#{Zm5~LhW9XILz-x1 zwv$RJIfd7}n{yvTxiTjHT4r;)CR(x*-8@Oyo>c*73o$Qkj}fU^ETEK{Qss%3+8z1N z(SkohqVm(U3IT8nKe7mEy@gq{KokkFXwB#v{}Fq|FhZh291?LfBb5s2CUnq2#3HAf zl@=~um%)JE<0izD`)WC^Ul(eynJYQ9%J=wc7aS6CzhzJ4JlJ`<>XqLAj5XW_X52(# zB8QucakZ9#`t!3%72P8);v2TX%G&~_XP7Z`fb5pb>W7U)#E+;xtWDCSQ)N3-AW7YMadU+1u6J)#J0&^3;a<|ihjd?qHBld6 z8$C?=h3jU&4a7=r-Sv7L8dRXT15#l^g4+gik{4#?_l3R+cBt6n19j&w+AWJ_3+gL# z-$;HHk545L>juZtO1@Iwtg-Itr%8&)HyYc|GA2`H5pvwDy_-LHPi&5Mkw;%oU(dWZ zEEpqAUr^RDg}V=5FI}O#G$-53&V_pbOVkdV_U(6__LnYoos4;XC+F#~zEnat_}RgH zpTa1?2#FqN2eGV+R-NmmTn#}h@)Eu9R2iPB@Nv?Xi#gn3>x|=kbtI6 zF%-0;Z_dBSrpR>`yO}#0x6KRuJpWRT;?loIFAnl$whg$VBft!(AR4?TAAsWq4SuT+ z0Ad@T9-8PmP^cz;4HS`+Z$C}UGU)$(xyusM3`1lE9JTgOA z3*M5i9&iQ>WY`_6uOo72bI``R3DB2*Ymm=UKf940at%Gua@zrmZ39fI$#?EQ!3)45 z?(KT;^hcjLT$@#3DR(|&xZ`ucIBuO@aRgu90CaNZE9d09ft6_oM!o_V_#Z>P4Zxa9ACyQ1h^;#W++loGRH))qEE^*G@i23&i^?Q)LRFsZyLo_ zOYx>X?<}!+aXg>w8e{Qtzr*wWC4Ec)b3sE;@zwqnmO=VS@LB%3u)G6TvxLqEgTbNSOurvHxLow_PY+u&A+tZ6lMh}8#a->mO#;k+Z3>@*E@ zrMn&`s$ytut$`Fea#(p86E((9Vc@}<{v5T>>aS?T zXq>3F46A3qjh`xp)^=nv{s>{cb% zEeq3G!x_EO7L2KpWe(#r=1jS=&2Ou{$&$aC4OH>1{sE# zF$y)XVkDlFPB<(WwVE+%Hl$RpN+??vma)t!ru|>jBJC4|n}-P2cOgx#{cBvimbf=8 z(JpEKL%NS}a|hw-I>gzfpOb4B2loax+9g<|{r@q2^ksgvwzW2xQ0IN6y>ne(i9Clk zLINnh)7oMwy*fd%VbHWOboLrcyt*iisu?i8L|0KcLGQykqz;GOH~k?Q1hEZsQsQ+^IJr$Pt0xr z`Cp_+vmJrd{*$laN5qHZ0{nsO)AjAUqK4qFT(o)dq zdvNmIJM=8l=ZI^JJtSAo;Wd6O%%czoyI17r_~-m4WYSQcwr8%vBM2TskDp5rb{Y8J zAv7$sm(3H)`fKxtE8%`*%)dY^tMDeetNwoE-+>-BiBK(d>^^|~=HUB3hgfh^oua6Uc zHqH+d@P8n}k7FR9Rv#Z4{A{TI#b^Quq~_x@PK$p8HT(i(*Xfh~-@^b}{2eIKXCTB* zpMSe$w0Aq8MS2d;~yKK|V}`{}RFimI&~j!pCrc zioZ>!he>7EV2>c80n;qtRh@PbN}=wn%Q}_@G4}s^gg%nrv5(%|0dEt z_rHzESRUb5^b`I3=zjsUXZ7o?V&!bDP&=a0STd2^@7~1`xx}uCc1X!mh8X!xA;f_} zs@s24T_KLO_21Ie{2e*1O+^29>YrZyKO*`qG4u;!kOzc7X8?hAZw#&Oa1!1A@Bdfm zh$Onf-{^b95jTi~E)e?d0rXnE=(M{3RSl@s3qY&ulSJ438-1G?`Wg|;1p>G|;4fXJ zg#Z2Phvvcth%4n2jI_N2@}D92f3P)v&?5GR2VDOoXczsTLIU|;0kQD9M9?XSK@t!G zg#j{zy2J5w2I4>15P_lsdIF`t^6%JbrhkX!A&O zbY>T%PjjAJ#(fAqlztl^pJ@X_n!fY*sfI&8IiVDy?Vk{+@aF2|xPA@vITk&$UdrfB zHew`ZJu_j6iI5TudS=2xqyG7bdOZeViNTN&bo!5C#9v{Py~Vc~_|xePYAPPQ$2v`Z9h?MjZugsL|bwYWMVj{s6Tg~y|%MX*t?WXa5lpPo{tl_!V75HC<$qmY90e9 zcvW?1n$!YK6hjl8FHve576M6LSB7IY$Ly)J8l-nSkfe76IIoS?6r`i+CM>E4=~3Q4 zNSS)99(lmI-RDiF(rE{B03XJ<)vK=x*PrAr-^iajkK={BjKlXCMHUz`;@`YRJ^Lf< z-^`-U@+EQi3w5RMSI91gBD=bFkQ82HOHV`DfeP?$qOEPhN?Rt2=4iDV4r&haydLvy z`mE-92q@+aEK!VCTG;vSkB6T_o!`Tr^JhjYOM*Q6irU*rc*Q8WbG*Fb+&%{2x#*1t zQ`?Sklhgo7!D(UirL>79)dNa}eEi{S!KT`!fY-@9oP8a(^I%AvbOTw^BrS?dcAFt4`Et9GuC9r`lq7DZKvl(0jGno@9&4x z54kkm3+Ki<7$RYz^WcbBp=l@A&hpaaIlCYEjFgD8#1C+n$Iolj?Ufj{6O|=`@_;)b zKZS%zLyR6&%AN?@OF)H~W-!>cg#?)9S6?VSF3ztEvaS@i>S9BM*)WlTkD5`Ip7!9X z&NoCVEY#fd3s>#LCagmM*V^+bq>?i1>hWNUgJZiS;NpGm%`wNp=UzU!(ju$KUcIN; zLp}+PqfMM-hm()O!(@E>dkjVaBy;oN1?Ngu1hht&%su9L-n5^aM+x@&-4c_^VWJI zD!E?;eGl8AJO%n=77#QiC;MDi$LYyV@Eu{})NozJhM3oavF{&oYcRmvdp3?Tbgq^R zzhd1xr$y~|>Q9EN_4NEp4Lw4+(JOCi~chR?=Q);$rdBZDrC? zG;`u&sXgzqOy_6@b=$&SWkJd%3lZ@%<9IXZbAEFJ#w&&3GA(uJUf;~?e$CxobqfTkfq#dgZ;wpd z?6xG|K_us^TS3)G*@NpTH*uwU8@ozQQiIpPPzy?x9e1Whn};mfoz(B8zR^u}P;lH_ zmgFct8=B;VRHqjf9*XtY7Wp?0{t}k~Y&>TUE`s>IEXG>R1ZX1o=1f(JrQ$XFGy*|} zu{PVIKBos$U#wh0aYb^$=MAyRnVjR)li$}51*ZVicZr#r^Si7I`_X-&2*Gu&s0Y6q zh$+8;jHu`2LI1|@aEY{&+&DOT3o_0$4} z?t7uYED@XQWiq%+N#0w?ccvO^#g7f*mPw1qn-Jey*lkr=qVvTHhENb_NzKCS+?|}q zx=w26L;IMM12>~ZxHUl{8(~8?#yXY>LUbDGBhKJBBF@sKY6!hZ@r<&zDe`!P3hC@^ zrRjktj_#W%ZnP#QENp(q{y{McTS1fY0!$gUk%)2ye}sN?d>)JV87KK*t0(V;!Q*G9 zl^+IiV#5LDF7v#l%_E;|nsMtE#63V%W@`>9*D7 z`o*xEEY5vevWWXhN^Je{0X$e_S!TAiHclpu_f+^v-EQNK6fjjfuBL&$Ev5R9U9tRv zVDskOcznd$3EeB?ibXF3YDu|zdcaxIC^F4qw96-lRx@xk^cq z+sPpJ&a+_zxonQhKYpGy{bl1B(_ z&ZF3H7oq5V4ZzYQHZyDq7YQzu+6%(S`zWUd;pp{YAZuEBxrQl0HlVXtyn>q)7w5L) zWYng$aQIB#5OZWY%~+wyF=vROC5en?uisgh-h(Zo3n*&{Jx5+DQG`?4Bmh*9q7?Fb zbPk68O=8jKl3EE7Q=45JL3;f$l`2g&2v>?&7Fn_{WzB_I{C8%q{g3oM??#n-^;vFg z?4h4HmW~I)eIF?vrUREW-g_jHpLGTG0nkZfr+*X;4-3znrdnRtDT50j@!db~U6N)EDI3vcBU zCv@sjd{apVnnru(r{L^+hVwwx9S!s&r&)(fQyXVKR*X7wj|@2ota%4#vm9G$6InZM zf$7YBdSsD50eDlnt?p5e%^w(}!%3&vin@3SpI6_sm~wxOTJk0tc%E&%)xq38j5BRh zH|J~ZaEr$SO_mXpsX~-(Cs(!pdH5@BSR-V(77HHGq?0qPSCo~^1&%51Qe~#jTso1Y zIFDz7w3!7?aZl#oK&nRdV!puLta&`SrM z+ixLawdlCVnPr`rbJB(Y0>q}vMaBEa^ zm+SX~)O^u{KfCfix_TabL^4?pLxdvKF6Ibmnynk$UscBzsGWIo<0Wc3cJzdw@m(5L z-|%`z<48}yL4Y~Tls8?P(9SjTxOjyM@;l(PqSW_YyjDwDbH4|9F;*lj_8wPIdyIbk zB&{l?Z7qG6IAcO>I6`}8~!5AAp4<%Ht++p?gPq;QCBAx_A6Q^XEgAzz}ck<9gb83#t*>> z9!N&fCV*tt3f<&Bhfe6M0+cp2Pe`L5IlMXH;LoUTVNojkZam*(RFRrIl69H>f?UP`4SZ!L5z-jP9R7qL88HCQ>BJ#e5WRD1c-#}jCCd}e<+YQz}7oZlr z*;9W|8Iyb8CPz6AQ+R)#4KQbYlV~?6Rm~-GDIn^g4?jM(V@QuMjdVA{-8d{oLZ8I< zFvsn5xqD^i_AZK4v2Mr|*b8^RRQE-F0cJk<{B=R%gUXNAk`-K;sq;{ol^|H#JT3=G z+p2&Gx3#L3_}zGOFHs=QjB8BIaKUnQmI|pk4Bo&wDZ@oP#y%QAJ;4M`|6P*@-H?zl zzkD@G&H#H0g(weu+!(p2p6v3lqpwdoiwDPJr?FVo(|vgE^j8Ab@f(_DsF~W??%`Bt z`w{g@txgzQD!Z~Ic0`eQD@CRuWP-;P|1lHVlfK&<$ht>nO)Ed=a}V|E5~Jsl*N~w2 zRtg0{Wmla;-L^I2*<++hYY9A8X?(Bi<*lo4y`jsKXBflA8pa<=5#p&&OE31!%M@c>=ey9EUjT?TwgHWptS+Q%ImDfwW~31_oM zl%mUM;D^-56gkMNQ>(Cw*7AIxnys~FeRbNL!}rzdT$GLM<}iN>omL-hlLTx}$_K%~uHmGqW-u4l_DGD|3ar3PnRXu;-dh z%XC^d>F{PY3totiIE`VoKW;4ZJ~sb?d5;W7e)VYkwY3SW7KGbfb{ zQDd3*460ldbF5DTx-Mf;K#3o8DxN_)!=*ZNrIz(h!wLsAI##6OKS$wH4|LE=ovzdl z9zky>zN7IQVCkabNfl{SaMbWXjB%PUncEm$SqwGL%_vP=kAtAK@$t_kUjWw}@q61gB6yC$^-=GxWs_w?(u(rlz@?Ha``X$>+ z^TEO_F?hFI->uv*af&dtIbc!S)>cdQfNH9Jvz+%@M77-Q~?XAeIqEjCf&;?lS+ljMURzZ5+vqhPjQT+pW0l z(`>%`At!jNLzC?7j@@AmXfp6B>mzm{yL2%hIBGq!FE@<;9;1IBQ*a=5I%e)5nb}OZ zqKUUErd3agtg3pD@AwD}uyzrx|Bb00I0l&t-dj>Far)ReW9}vcZ6m_Qp5No@PDi_W zL&6FbWaGbQnOgev=~Z;}n2REj{jhE{;4{ix>G9Z5qXRpW*)4{A`d_uA~?MM zDJz@?400pJ4msc%`6*ZH(1)B!sw^8b474=Q4aArGS%nU0BX%bVPxhTI(u48!z-(Fj%znHkVQO`rX_Glo2A;MG4nd+j%KNtr4KWO8$n!MleZ& zmoL~}?lsUA#QCt~86?y(r%9oyH(+e>ZcmelB*27PeeN@kaED;jBj zt7pNj1sGseG)0rcNsL;w`4+oeHr3d9GJr+OZ zO)_Q{0{{isfBuSeD3ne0GQ1=I?jUfIvsAiWM2iH*dTcMjWV(GaRlu(dX*IzZgCi}a z%&60pFA&7Q*0IUcT_pKoDh-keI#(n6G;(OwJVwks%iko^$I5bHVOhg&o(V76z>Tx3 zF|!2u>P|^kO|mIg=1{|2lC1jYJ}S56F@lq4OIP-2jCy+Qj&>;5y{Y)sCvOI%B?b;bgx;CbXe0Ln55-YkR8z z6m>DR+;xCBL`aMRq$4}v3ujeX+SVECW`2$?H&S5^yil3Av3J z7Mc+h`!yJ+%m-~Eq09$9TZN% zsh_~i=AC_OSDdH1PVUMcIZhNVpMgSDZv|P;g*^4E(MuBLom+j(3-kq*hnZ??i_$8W(oS!8& z%GP=u7pLZb3S@|RYJgrx;7L5syV5Cfpl2F`Z-$ea+6m$cy%I#F@rrS75W>*&T!wnE zY6VFz#CvMqOl?cb#%F$nnbn^aq0$zLvy^6mlIlgk1p%Xj zZPuhJE>W)N?oV6H^;X1FW&ZZ8zN%*S;zZ|;*xD>kEUEIizjokAJ=l|dyLQ`1m{bZk z4?(uM!sK31%f$UW>e)kGwXsS0uzS9i{m_25dmbZw$RIbg&F|!uJ@RJ%NalI3eWSN* zn*6+z?mGXpbNg)eyncqqEo*Xfd7azXkP>k;bX(+ZI^soHacFR{f>p)K%(%?#^RW88 zZjQHV0^6vSI_(jTM~uBXFP7_VmjFlviCDWEGI{3OgE# z)Ys`}=eFm`QT@&N<9G}FVjBR5GWXb6-z@va(>T^Ka$pfJ_i&-vMsjQ{v7>jfP!5um zsr!|gN5}S)I3%3S2-$>%P~PJG_MC;rvGawDHt|@V4)7OpX)@eOlFh2tB5moxT3MuZ zx|*5#BxsE;EZH`1wU)Sm9jf${6jhR%NHm!w+(Z3?^`7rJ-j1 zS9Q$*Bo@)O{8O!BxAbcvS_Y>GIh4pgjCUxDkZiy^9!>^edq|sZ<=Rv8DsTmZl-MX? z44T3@>17e4$xl|OB4TSv!Yz%G7r-m9%kf@@UIzrD6A8&1SJ6Ir*xA4+y?oTnEUygj zr*n+-q)h2s*F-bChA@A)A{n=S=YB`pyD8Ce=?{3Gf-}r01?_Hx-4?SCd$ok+2~vHt zhSav$7Qi&1A=?lb0m~_EvZhj)7maS1*ald$Eqk|ZA~G=Nhb1sKw7nC_LOxFAY&pby z&W!oEI`_bNEt?i}X<=mMpbbvGf!CkVRneiiC7$z!*!|l~N}naHBO}MdDDg1nWS%w! z$=wfvwoF8f^)g&W5U9(ga&;GhR&@E6I;1cLFsUYz^k|>kEZ#P0Ta%XPBH|35j~3M_ z8^sR$KMKH(aT;j{=gz+PC4y037qugOp(~#f`YoG<46w;J1nQn#i-64Q+_ zT2O1JIh^k&{`|bVs)NQ<@G>{RL8{OH(|?)f6Qp4@RwFcykk>n(O`Ter>o%jvGDVzd zX=d=)AjpA&HH0p`*c7{YUon&7^i^Dq0pYSKThlw%=>WYzB7NbY${bD{z`I-~nmZJ> zpbF|!v?^9DPWbt94y9otp2@4G0LEQjOFM`gsO9&`AB+B=4F_j@Wa*?$Tm-prS+Jz7 zzb0pzVD{^$MQMo`IMZfQbO%^GaJAnl4594k!KMr40d!Gs`{#@_jz?c1~sr@>ASfdXUw>& zzYYcvxL@f6J=1hyf7-b$dkNAD7@2mmp2hhNOV8QQE)S#E%~J+wXGuL7by!$8GFgfm zD=AQ|`yK**vScOLXJmx4z_~j938E}qggg|YlZPg)nDBQO$u`$Bf`c<>%SaKrpG;kD z&XgQ^d%ViK`vawfy8duyvEfr{*urmT^K2Qr)gd656U3nrowRB(@9Wg5$S^B8T~@GT zTGd|-RhoNX1FtpLOx_?KnXskLsMctb>yTWfK^8glGLyGHES=zbTFxX$s#Pjb)XvaT z_4D!z6uCYj^CblBiG%u`W#0mZeH+c7cuMPiW4R4PE;Pjf$Q4 z3ia@va_Q@60#wbFQZZ7ie6P~ZrCnNyt`=snpVvnTiYGOzj5G`NP|>D7B7TcJ4{dfw zgq%%c%_G_Dz^LqTN>MwaYzco5j5lX5Q+j55lO2&zgWi%F{ z--T_NoX?H+9Uq4_-0bwv_U&U85H$|ZdbNQxB?Sf%AvP)D5CrwJFP(Lz9sZSXwVzVK>Wa-Is3B{!}Uh>jq$^ralr!=3{JesypZ(3vy& zx%7oaV0VSp6)QT+-8+R>5$0Uq#>i6EABBfs`5N_97=XH6`ma`SxT$0&LKtv8(%Jf| zmmq9P(R(q2S%aCDALw$>-^V`P zBg$5JHY4>dszQ~}q9$dkNQ1Kc%k#@$6AUwa7o}WEXEH5__e0V~A2n*wV)+J)F%*6V z>oyj7qDPSCYbjyMsr!Bli>77-%VRIyu$~lbU;Nl{izs69W7QOpGJ0>Yje(8mJ z470T%&=GuH^}weSjpxo_2UBEcp#E8wuh#J9Wg-uQvPEio@dTzQ$J&eMf8k=M^zl}3 za5yxxcz&qO;B*VYR4o+Yq?W?$Ijb~_v^8y!lkkcp?^&y%nB+rM+@c-cadDIJ<>8Ar zuZ^5cu`#EuyLLEQK?H=o2E+E$o;i6C;kVh!*LoDaSlTIH81B7pJI&CB4I_)TAtX5RAm?!1g^O^-Hqg%>vKsp1+sT9NfEVC9oes!xp99` z?K@XzcIKV)l}u{+rWXVE1^I*N%~EfGSp%3l#kP1m4lqfOnTnzQ!z{j7dG_=>^q7@08~AY-4gy&(>b> z4SQAIl`S3>8+U=+6m)OP7^jRHOh$NXt5teJrIy;LuCA_{luG7G8ftG!>^8$*DPx94 zpSS$)7@o>ePgAl{KuPO#d=~%816T1q3f=2>JU1rG%Qx)BY12+Stn1~q){wUGMac@C(pKi~!&O?cO5E1nDPwS%W1{AT-Iq+y z^gdCjw}Q|8gi0XAaTc>v&F#0b+i3g36~kMB&Y;Sp!|C?qr7q4KSl_-plcQP^A7S~5 zb|HPxAnC2lv>M@$TH9k>QMPHekp51t3XUeP|?I%RLWqBj?*ippH< zxnN(p2X$YXyY8njuQ{7@FE}`8pbF)8^h=w<>@#x`w4QjDU(e`rMdLJXUaU6B+a!Dn z@U>bCjIo|0NYTn;(kKn77#EXlUd=olFzC$l^JTwjnvu1&a0kqv$(tst4K1~1u9`zq zm04^|sAiGGR06GOgvgb{ws7z2ab;wb~T=U@@5d z#FvMzv%>706f(v_t5WyHWEB zIl%tt3K4a(PDFL&ik?uSW^)ml=5SPCj$$4tJ<+iki9xitbw8J*j0w-fL*7>RmbS-VOPy#az{RD~wW9U?XYL zg)**GN?eKV+*BaYb1cd{-@z39Y!eP~-61r11Zhdy|7dHYUGzV^Z6%tyz1K z!eTwF>oa%i&5$h7d_AlSdTpRt^1o^RUFXd`rPr-efQPg1@-wbC|j3Pm1QQfnaqi$iRw0d@Cz4H$r zeW9rB<#7N!s~U(n1oDgg)_Mrh0DLSPSWA$F!NhJ(lonlE;mU@s4;*dQ7p#vX&-P4a z+;U89>-@Uc7}gy!++ftISp(U-O@S{_9yK)fePSvnU@o)@c<55}_{&B78icYwO z!$!Kh8bDCZ(4;LlzO2Obwt8DwQ{lK5Xzapk?8>ssp_&ZTm^8ZNmX=?A`}UnHY*`ds z=A$ou{Bx>xnvXKCb!`4{NJu*TYlMk!wJG9)PG+|3jdvza=2zcA^+bFK2>CQMt7$IB z*Th9x!_cV|Pg4AdA|hlfhP*)oq`~HWkM?P;7TOfy_?eYW5z0XOAib@#Z0zH*p_k;d zf zAm2Il;(0!T>{=Go;NU|*(vUn>*P3?3>S2>lL6p6)w#LikEI{)S5``9+G zIIR?vJuZ5cM{b7DZ;+qzuxQ)&7HnzDy_u>c_B9& z@iurR5bj*U;~vngN>$Ywn+i) zC1Hae+l#}By)7)&<6g8p4^RFuzWrf*`@{J5hw<%qGroBqqn`O~vk`4;tK6zX1i!PD z&GS82V+mUuxy9N@?E2&js&tg!y$SA5xc9AkwOd6x{*&I(F{Nt>*0YYRw7zJsP6hMU zQFyn`5X1@B+W6`fueDO$8QW|<+q~I&VAQ(cYHZCx&Dv)MLqPR%*utK-bR8?L^XA5` znU>cKMDCGUuOmvNm}a=Mkxn1@B6!ud*7Bth)2yo5i|tIU>f>gw(!v*QoL+D812p`` ztHm65x3y};oZG_QbEQ4E?Ko(<^^~W<$f17Y-ayL4fex-nR^H&qlTt_`6l0|=e zBH16VbzgY~<2l+@J$T{mP}#+ErN>>xK~AyH#T^|tulvX0)k-UVlSzH0P5;K8o~WNI z(0R2}1LEh{*j}nrH3sUfMjlf%n?B^Biz|!$1!?W(gznYg?r!o$uL4+&%8*=m^>#q9 zXA2lh%QkNB8HYl2T3i15SZ>~~fWKsrTwo$B@bDTpk}__OHuJ&>vL3^LXA71s<3_IU z?{3{^xbdgFU!K$re#RHi%*zKHx1BEqS5KAVVbrK5`x?731#L4aVVnGRk`HJitV^$@ z1`ZNG)%Q1*M)!(2zKkMQ3*u(|!hZ)de6hg{Ul=odPTw2Tn#*1{*{@yM?bmrawIFJM z@NXBz@OYoDL2nSf8YH&Bi;|-;>G~_R+Wzr-MTwUKC8N0FSh1p-%c0o~|i&WzJ6KdgnRAHR8bSPf9G7;2$r?rkGd{fbm}pUSHyW5I5f z+fBw5&9Co4{J=z68M1N9ow~Nufo(VUOcc9En{pXMnwvVdn8;dMTYskD)3_Mj>z3~2oVMpI zTGi8mYv-urC*d+h^SI@5i(lztq*8)vdGkfR%s!6`_qCsOG**1FEK$p~ovpOm+Ti^< zU*UE;+}iCnEOn4xSLvMbSLmGoL)6Fd|3>w3mCmfXJoU9fT3*x4R5>nnLBoAl$E(^Y zEtNJJ(`myq9e|3R-mL^tv`qxFGBvRUavrDSAZT7C{_DyH8Q$(!+-_>j>TpqhJGPG* z<>y-&ILdUzjKJ?Ou(S*g)a0Vk-S0eU>P6XJ&*!gsZ@!!kh0}cb`Tj`c*4Go1QDq@u;H#!KsQusRT%<`DOKSD^M(8k29C#cjTY0J38+-OnkF9P_!!$ z05w-y>3HI}WN)t!17@qm0JYSMKbHEx>80LT=^Iw}iurQgxWr6&ybP zr{VB|+*Y{Yf4caUxBD+XYPEUipB^6uZAE&!iA8P%Kx3Xx&&D*_)BExK{Y~~vO}}|I z>t&&*dH3>Vm|0h~hFj>Y*buy*DOF-x9EyXZp#9C!?(U<*&+*B_=i~0-^_YzWtBWDG z@@iAa9l&c#(CGwA_e_FuSYOF#>q<{k7j)EnedpfcnC_&2a@vIsN}5z2Lb3Kr;jOpjNScM#qh4P z3%&Z@o_71XkGrK zc?;pwl`c<Dq*OxX&muYHMucL+|`KsX{wXR(*UTtrC+6ml5 z7<0X+DEwFIJWxNagtaWGH4Ue3D9ovwr8Z>gYKiuOL>ame?L6jFT+;l;aTwa zYIQrWrqz!tclMA5P-$i*uCTM}=k{#=)fFP8h8gcavLs+7&N5Ks!Ig~{g3|KFDzC1* zpHP#K2nz6Z3nUS@1(YCBQ!suPgIRlZ zXC@XitCX}2s8~It{ECza_}!Yi^nKyBIqHq>))Gt|_h_BT^LGFL0#Hi<0v-bt000OG z0EvEUNx7iLQhr + @@ -32,7 +33,7 @@

This is just a sandbox for development.

Youtube video

- +

Local video, single source, with poster

@@ -64,6 +65,10 @@

Local video with poster and resolution test light skin

+ +

Vimeo video

+ +

Local video with poster opened in lightbox

@@ -77,6 +82,10 @@

Local video with poster opened in lightbox

Youtube opened in lightbox

Open the lightbox + +

Vimeo opened in lightbox

+ Open the lightbox + diff --git a/src/js/afterglow/components/Config.js b/src/js/afterglow/components/Config.js index abd5016..7b0377e 100644 --- a/src/js/afterglow/components/Config.js +++ b/src/js/afterglow/components/Config.js @@ -38,6 +38,10 @@ class Config { if(util.isYoutubePlayer(this.videoelement)){ this.setYoutubeOptions(); } + // Initialize vimeo if the current player is a vimeo player + if(util.isVimeoPlayer(this.videoelement)){ + this.setVimeoOptions(); + } } } @@ -136,6 +140,17 @@ class Config { } } + /** + * Sets options needed for vimeo to work and replaces the sources with the correct vimeo source + */ + setVimeoOptions(){ + this.options.techOrder = ["vimeo"]; + this.options.sources = [{ + "type": "video/vimeo", + "src": "https://vimeo.com/"+this.getPlayerAttributeFromVideoElement('vimeo-id') + }]; + } + /** * Returns the CSS class for the video element * @return {string} diff --git a/src/js/afterglow/components/Player.js b/src/js/afterglow/components/Player.js index c63e06b..5a74e77 100644 --- a/src/js/afterglow/components/Player.js +++ b/src/js/afterglow/components/Player.js @@ -46,6 +46,10 @@ class Player { if(this.util.isYoutubePlayer(this.videoelement)){ this.applyYoutubeClasses(); } + + else if(this.util.isVimeoPlayer(this.videoelement)){ + this.applyVimeoClasses(); + } } /** @@ -161,6 +165,14 @@ class Player { } } + /** + * Applies all needed classes to the videoelement in order to provide proper vimeo playback + * @return {void} + */ + applyVimeoClasses(){ + this.videoelement.addClass("vjs-vimeo"); + } + /** * Calculates the players ratio based on the given value or on width/height * @return {float} diff --git a/src/js/afterglow/lib/Util.js b/src/js/afterglow/lib/Util.js index 0589f47..756a41d 100644 --- a/src/js/afterglow/lib/Util.js +++ b/src/js/afterglow/lib/Util.js @@ -26,6 +26,15 @@ class Util { return uri; }; + /** + * Checks wether or not the given video element is a vimeo player + * @param {DOMElement object || DOM node} videoelement + * @return {Boolean} + */ + isVimeoPlayer(videoelement){ + return videoelement.hasAttribute("data-vimeo-id"); + } + /** * Checks wether or not the given video element should trigger the dailymotion tech * @param {DOMElement object || DOM node} videoelement diff --git a/src/less/skins/afterglow-default.less b/src/less/skins/afterglow-default.less index a851405..bed02b6 100644 --- a/src/less/skins/afterglow-default.less +++ b/src/less/skins/afterglow-default.less @@ -1365,6 +1365,12 @@ } } + &.vjs-vimeo{ + .vjs-top-control-bar{ + display:none; + } + } + &.vjs-has-started, &.vjs-IE{ &.vjs-youtube{ iframe{ diff --git a/test/test.2.config.js b/test/test.2.config.js index 5067553..66323ac 100644 --- a/test/test.2.config.js +++ b/test/test.2.config.js @@ -69,12 +69,14 @@ describe("Afterglow Config", () => { beforeEach(() => { sinon.stub(Config.prototype, 'setDefaultOptions', () => {}); sinon.stub(Config.prototype, 'setYoutubeOptions', () => {}); + sinon.stub(Config.prototype, 'setVimeoOptions', () => {}); sinon.stub(Config.prototype, 'setSkinControls', () => {}); }); afterEach(() => { Config.prototype.setDefaultOptions.restore(); Config.prototype.setYoutubeOptions.restore(); + Config.prototype.setVimeoOptions.restore(); Config.prototype.setSkinControls.restore(); }); @@ -117,6 +119,13 @@ describe("Afterglow Config", () => { sinon.assert.calledOnce(a_config.setYoutubeOptions); Util.prototype.isYoutubePlayer.restore(); }); + + it('should set the vimeo options if needed', () => { + sinon.stub(Util.prototype, 'isVimeoPlayer', () => { return true; }); + a_config = new Config(videoelement); + sinon.assert.calledOnce(a_config.setVimeoOptions); + Util.prototype.isVimeoPlayer.restore(); + }); }); describe('Option defaults', () => { diff --git a/test/test.2.player.js b/test/test.2.player.js index b8f0583..2983ba3 100644 --- a/test/test.2.player.js +++ b/test/test.2.player.js @@ -257,7 +257,7 @@ describe("Afterglow Player", () => { }); }); - describe('prepareVideoElement no youtube', () => { + describe('prepareVideoElement regular', () => { var videoelement; beforeEach(() => { @@ -266,6 +266,8 @@ describe("Afterglow Player", () => { sinon.stub(Player.prototype, 'applyParameters'); sinon.stub(Player.prototype, 'applyYoutubeClasses'); sinon.stub(Util.prototype, 'isYoutubePlayer', () => { return false }); + sinon.stub(Player.prototype, 'applyVimeoClasses'); + sinon.stub(Util.prototype, 'isVimeoPlayer', () => { return false }); player = new Player(); player.util = new Util; }); @@ -276,6 +278,8 @@ describe("Afterglow Player", () => { Player.prototype.applyParameters.restore(); Player.prototype.applyYoutubeClasses.restore(); Util.prototype.isYoutubePlayer.restore(); + Player.prototype.applyVimeoClasses.restore(); + Util.prototype.isVimeoPlayer.restore(); }); it('should call applyDefaultClasses() once', () => { @@ -303,6 +307,8 @@ describe("Afterglow Player", () => { sinon.stub(Player.prototype, 'applyParameters'); sinon.stub(Player.prototype, 'applyYoutubeClasses'); sinon.stub(Util.prototype, 'isYoutubePlayer', () => { return true }); + sinon.stub(Player.prototype, 'applyVimeoClasses'); + sinon.stub(Util.prototype, 'isVimeoPlayer', () => { return false }); player = new Player(); player.util = new Util; }); @@ -313,12 +319,50 @@ describe("Afterglow Player", () => { Player.prototype.applyParameters.restore(); Player.prototype.applyYoutubeClasses.restore(); Util.prototype.isYoutubePlayer.restore(); + Player.prototype.applyVimeoClasses.restore(); + Util.prototype.isVimeoPlayer.restore(); }); it('should call applyYoutubeClasses() once', () => { player.prepareVideoElement(); expect(Player.prototype.applyYoutubeClasses).to.have.been.calledOnce; }); + + it('should not call applyVimeoClasses() once', () => { + player.prepareVideoElement(); + expect(Player.prototype.applyVimeoClasses).to.not.have.been.called; + }); + }); + + describe('prepareVideoElement vimeo', () => { + var videoelement; + + beforeEach(() => { + sinon.stub(Player.prototype, 'setup'); + sinon.stub(Player.prototype, 'applyDefaultClasses'); + sinon.stub(Player.prototype, 'applyParameters'); + sinon.stub(Player.prototype, 'applyYoutubeClasses'); + sinon.stub(Util.prototype, 'isYoutubePlayer', () => { return false }); + sinon.stub(Player.prototype, 'applyVimeoClasses'); + sinon.stub(Util.prototype, 'isVimeoPlayer', () => { return true }); + player = new Player(); + player.util = new Util; + }); + + afterEach(() => { + Player.prototype.setup.restore(); + Player.prototype.applyDefaultClasses.restore(); + Player.prototype.applyParameters.restore(); + Player.prototype.applyYoutubeClasses.restore(); + Util.prototype.isYoutubePlayer.restore(); + Player.prototype.applyVimeoClasses.restore(); + Util.prototype.isVimeoPlayer.restore(); + }); + + it('should call applyVimeoClasses() once', () => { + player.prepareVideoElement(); + expect(Player.prototype.applyVimeoClasses).to.have.been.calledOnce; + }); }); describe('applyDefaultClasses noIE', () => { @@ -646,6 +690,40 @@ describe("Afterglow Player", () => { }); }); + describe('applyVimeoClasses()', () => { + var videoelement; + + beforeEach(() => { + sinon.stub(Player.prototype, 'setup'); + + player = new Player(); + player.util = new Util; + + player.videoelement = { + addClass : () => {} + }; + + // Prevent iIOS Tests by default + navigator.__defineGetter__('platform', function(){ + return 'none' // customized user agent + }); + + sinon.spy(player.videoelement, 'addClass'); + }); + + afterEach(() => { + Player.prototype.setup.restore(); + + player.videoelement.addClass; + }); + + it('should add the vimeo class properly', () => { + player.applyVimeoClasses(); + expect(player.videoelement.addClass).to.have.been.calledOnce; + expect(player.videoelement.addClass).to.have.been.calledWith('vjs-vimeo'); + }); + }); + describe('calculateRatio()', () => { var videoelement; diff --git a/test/test.3.util.js b/test/test.3.util.js index ee88e90..957d9ed 100644 --- a/test/test.3.util.js +++ b/test/test.3.util.js @@ -11,7 +11,7 @@ chai.should(); var assert = chai.assert; var expect = chai.expect; -describe("DOMElement", () => { +describe("Util", () => { // Initiate the DOM jsdom(); @@ -52,6 +52,21 @@ describe("DOMElement", () => { }); }); + describe('isVimeoPlayer()', () => { + it('should properly check if the videoelement is a Vimeo player or not', () => { + var videoelement = { + hasAttribute: () => { + return 'somevalue' + } + } + sinon.spy(videoelement, 'hasAttribute'); + var res = util.isVimeoPlayer(videoelement); + expect(videoelement.hasAttribute).to.have.been.calledOnce; + expect(videoelement.hasAttribute).to.have.been.calledWith('data-vimeo-id'); + expect(res).to.equal('somevalue'); + }); + }); + describe('isMobile()', () => { afterEach(() => { // Prevention for the other tests diff --git a/vendor/videojs/plugins/videojs-vimeo.js b/vendor/videojs/plugins/videojs-vimeo.js new file mode 100644 index 0000000..c7cc8d9 --- /dev/null +++ b/vendor/videojs/plugins/videojs-vimeo.js @@ -0,0 +1,316 @@ +/** + * videojs-vimeo + * @version 0.0.1 + * @copyright 2016 Jimmy Bourassa + * @license MIT + */ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.videojsVimeo = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o=n.length)break;i=n[o++]}else{if(o=n.next(),o.done)break;i=o.value}var a=i,u=e.getAttribute("data-vimeo-"+a);(u||""===u)&&(t[a]=""===u?1:u)}return t}function l(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return new Promise(function(n,r){if(!s(e))throw new TypeError("“"+e+"” is not a vimeo.com url.");var o="https://vimeo.com/api/oembed.json?url="+encodeURIComponent(e);for(var i in t)t.hasOwnProperty(i)&&(o+="&"+i+"="+encodeURIComponent(t[i]));var a="XDomainRequest"in window?new XDomainRequest:new XMLHttpRequest;a.open("GET",o,!0),a.onload=function(){if(404===a.status)return void r(new Error("“"+e+"” was not found."));if(403===a.status)return void r(new Error("“"+e+"” is not embeddable."));try{var t=JSON.parse(a.responseText);n(t)}catch(e){r(e)}},a.onerror=function(){var e=a.status?" ("+a.status+")":"";r(new Error("There was an error fetching the embed code from Vimeo"+e+"."))},a.send()})}function h(e,t){var n=e.html;if(!t)throw new TypeError("An element must be provided");if(null!==t.getAttribute("data-vimeo-initialized"))return t.querySelector("iframe");var r=document.createElement("div");return r.innerHTML=n,t.appendChild(r.firstChild),t.setAttribute("data-vimeo-initialized","true"),t.querySelector("iframe")}function d(){var e=arguments.length<=0||void 0===arguments[0]?document:arguments[0],t=[].slice.call(e.querySelectorAll("[data-vimeo-id], [data-vimeo-url]")),n=function(e){"console"in window&&console.error&&console.error("There was an error creating an embed: "+e)},r=function(){if(i){if(a>=o.length)return"break";u=o[a++]}else{if(a=o.next(),a.done)return"break";u=a.value}var e=u;try{if(null!==e.getAttribute("data-vimeo-defer"))return"continue";var t=f(e),r=c(t);l(r,t).then(function(t){return h(t,e)}).catch(n)}catch(e){n(e)}};e:for(var o=t,i=Array.isArray(o),a=0,o=i?o:o[Symbol.iterator]();;){var u,s=r();switch(s){case"break":break e;case"continue":continue}}}function p(e){return"string"==typeof e&&(e=JSON.parse(e)),e}function v(e,t,n){if(e.element.contentWindow.postMessage){var r={method:t};void 0!==n&&(r.value=n);var o=parseFloat(navigator.userAgent.toLowerCase().replace(/^.*msie (\d+).*$/,"$1"));o>=8&&o<10&&(r=JSON.stringify(r)),e.element.contentWindow.postMessage(r,e.origin)}}function y(e,t){t=p(t);var o=[],i=void 0;if(t.event){if("error"===t.event)for(var a=n(e,t.data.method),u=a,s=Array.isArray(u),c=0,u=s?u:u[Symbol.iterator]();;){var f;if(s){if(c>=u.length)break;f=u[c++]}else{if(c=u.next(),c.done)break;f=c.value}var l=f,h=new Error(t.data.message);h.name=t.data.name,l.reject(h),r(e,t.data.method,l)}o=n(e,"event:"+t.event),i=t.data}else t.method&&(o=n(e,t.method),i=t.value,r(e,t.method));for(var d=o,v=Array.isArray(d),y=0,d=v?d:d[Symbol.iterator]();;){var m;if(v){if(y>=d.length)break;m=d[y++]}else{if(y=d.next(),y.done)break;m=y.value}var g=m;try{if("function"==typeof g){g.call(e,i);continue}g.resolve(i)}catch(e){}}}var m="undefined"!=typeof Array.prototype.indexOf,g="undefined"!=typeof window.postMessage;if(!m||!g)throw new Error("Sorry, the Vimeo Player API is not available in this browser.");var w="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},b=(e(function(e,t){!function(e){function t(e,t){function r(e){return this&&this.constructor===r?(this._keys=[],this._values=[],this._itp=[],this.objectOnly=t,void(e&&n.call(this,e))):new r(e)}return t||w(e,"size",{get:y}),e.constructor=r,r.prototype=e,r}function n(e){this.add?e.forEach(this.add,this):e.forEach(function(e){this.set(e[0],e[1])},this)}function r(e){return this.has(e)&&(this._keys.splice(g,1),this._values.splice(g,1),this._itp.forEach(function(e){g0&&e(n,s))}catch(e){i.call(new u(s),e)}}}function i(t){var r=this;r.triggered||(r.triggered=!0,r.def&&(r=r.def),r.msg=t,r.state=2,r.chain.length>0&&e(n,r))}function a(e,t,n,r){for(var o=0;o1&&window.console&&console.warn&&console.warn("A jQuery object with multiple elements was passed, using the first element."),e=e[0]),"string"==typeof e&&(e=document.getElementById(e)),!a(e))throw new TypeError("You must pass either a valid element or a valid id.");if("IFRAME"!==e.nodeName){var r=e.querySelector("iframe");r&&(e=r)}if("IFRAME"===e.nodeName&&!s(e.getAttribute("src")||""))throw new Error("The player element passed isn’t a Vimeo embed.");if(x.has(e))return x.get(e);this.element=e,this.origin="*";var i=new E(function(r,i){var a=function(e){if(s(e.origin)&&t.element.contentWindow===e.source){"*"===t.origin&&(t.origin=e.origin);var n=p(e.data),o="event"in n&&"ready"===n.event,i="method"in n&&"ping"===n.method;return o||i?(t.element.setAttribute("data-ready","true"),void r()):void y(t,n)}};if(window.addEventListener?window.addEventListener("message",a,!1):window.attachEvent&&window.attachEvent("onmessage",a),"IFRAME"!==t.element.nodeName){var u=f(e,n),d=c(u);l(d,u).then(function(n){var r=h(n,e);return t.element=r,o(e,r),n}).catch(function(e){return i(e)})}});return j.set(this,i),x.set(this.element,this),"IFRAME"===this.element.nodeName&&v(this,"ping"),this}return Player.prototype.then=function(e){var t=arguments.length<=1||void 0===arguments[1]?function(){}:arguments[1];return this.ready().then(e,t)},Player.prototype.callMethod=function(e){var n=this,r=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return new E(function(o,i){return n.ready().then(function(){t(n,e,{resolve:o,reject:i}),v(n,e,r)})})},Player.prototype.get=function(e){var n=this;return new E(function(r,o){return e=i(e,"get"),n.ready().then(function(){t(n,e,{resolve:r,reject:o}),v(n,e)})})},Player.prototype.set=function(e,n){var r=this;return E.resolve(n).then(function(n){if(e=i(e,"set"),void 0===n||null===n)throw new TypeError("There must be a value to set.");return r.ready().then(function(){return new E(function(o,i){t(r,e,{resolve:o,reject:i}),v(r,e,n)})})})},Player.prototype.on=function(e,r){if(!e)throw new TypeError("You must pass an event name.");if(!r)throw new TypeError("You must pass a callback function.");if("function"!=typeof r)throw new TypeError("The callback must be a function.");var o=n(this,"event:"+e);0===o.length&&this.callMethod("addEventListener",e).catch(function(){}),t(this,"event:"+e,r)},Player.prototype.off=function(e,t){if(!e)throw new TypeError("You must pass an event name.");if(t&&"function"!=typeof t)throw new TypeError("The callback must be a function.");var n=r(this,"event:"+e,t);n&&this.callMethod("removeEventListener",e).catch(function(e){})},Player.prototype.loadVideo=function(e){return this.callMethod("loadVideo",e)},Player.prototype.ready=function(){var e=j.get(this);return E.resolve(e)},Player.prototype.enableTextTrack=function(e,t){if(!e)throw new TypeError("You must pass a language.");return this.callMethod("enableTextTrack",{language:e,kind:t})},Player.prototype.disableTextTrack=function(){return this.callMethod("disableTextTrack")},Player.prototype.pause=function(){return this.callMethod("pause")},Player.prototype.play=function(){return this.callMethod("play")},Player.prototype.unload=function(){return this.callMethod("unload")},Player.prototype.getAutopause=function(){return this.get("autopause")},Player.prototype.setAutopause=function(e){return this.set("autopause",e)},Player.prototype.getColor=function(){return this.get("color")},Player.prototype.setColor=function(e){return this.set("color",e)},Player.prototype.getCurrentTime=function(){return this.get("currentTime")},Player.prototype.setCurrentTime=function(e){return this.set("currentTime",e)},Player.prototype.getDuration=function(){return this.get("duration")},Player.prototype.getEnded=function(){return this.get("ended")},Player.prototype.getLoop=function(){return this.get("loop")},Player.prototype.setLoop=function(e){return this.set("loop",e)},Player.prototype.getPaused=function(){return this.get("paused")},Player.prototype.getTextTracks=function(){return this.get("textTracks")},Player.prototype.getVideoEmbedCode=function(){return this.get("videoEmbedCode")},Player.prototype.getVideoId=function(){return this.get("videoId")},Player.prototype.getVideoTitle=function(){return this.get("videoTitle")},Player.prototype.getVideoWidth=function(){return this.get("videoWidth")},Player.prototype.getVideoHeight=function(){return this.get("videoHeight")},Player.prototype.getVideoUrl=function(){return this.get("videoUrl")},Player.prototype.getVolume=function(){return this.get("volume")},Player.prototype.setVolume=function(e){return this.set("volume",e)},Player}();return d(),Player}); +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],2:[function(require,module,exports){ +(function (global){ +'use strict'; + +exports.__esModule = true; + +var _video = (typeof window !== "undefined" ? window['videojs'] : typeof global !== "undefined" ? global['videojs'] : null); + +var _video2 = _interopRequireDefault(_video); + +var _player = require('@vimeo/player'); + +var _player2 = _interopRequireDefault(_player); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Component = _video2.default.getComponent('Component'); +var Tech = _video2.default.getComponent('Tech'); +var cssInjected = false; + +/** + * Vimeo - Wrapper for Video Player API + * + * @param {Object=} options Object of option names and values + * @param {Function=} ready Ready callback function + * @extends Tech + * @class Vimeo + */ + +var Vimeo = function (_Tech) { + _inherits(Vimeo, _Tech); + + function Vimeo(options, ready) { + _classCallCheck(this, Vimeo); + + var _this = _possibleConstructorReturn(this, _Tech.call(this, options, ready)); + + injectCss(); + _this.setPoster(options.poster); + _this.initVimeoPlayer(); + return _this; + } + + Vimeo.prototype.initVimeoPlayer = function initVimeoPlayer() { + var _this2 = this; + + var vimeoOptions = { + url: this.options_.source.src, + byline: false, + portrait: false, + title: false + }; + + if (this.options_.autoplay) { + vimeoOptions.autoplay = true; + } + if (this.options_.height) { + vimeoOptions.height = this.options_.height; + } + if (this.options_.width) { + vimeoOptions.width = this.options_.width; + } + if (this.options_.maxheight) { + vimeoOptions.maxheight = this.options_.maxheight; + } + if (this.options_.maxwidth) { + vimeoOptions.maxwidth = this.options_.maxwidth; + } + if (this.options_.loop) { + vimeoOptions.loop = this.options_.loop; + } + + this._player = new _player2.default(this.el(), vimeoOptions); + this.initVimeoState(); + + ['play', 'pause', 'ended', 'timeupdate', 'progress', 'seeked'].forEach(function (e) { + _this2._player.on(e, function (progress) { + if (_this2._vimeoState.progress.duration != progress.duration) { + _this2.trigger('durationchange'); + } + _this2._vimeoState.progress = progress; + _this2.trigger(e); + }); + }); + + this._player.on('pause', function () { + return _this2._vimeoState.playing = false; + }); + this._player.on('play', function () { + _this2._vimeoState.playing = true; + _this2._vimeoState.ended = false; + }); + this._player.on('ended', function () { + _this2._vimeoState.playing = false; + _this2._vimeoState.ended = true; + }); + this._player.on('volumechange', function (v) { + return _this2._vimeoState.volume = v; + }); + this._player.on('error', function (e) { + return _this2.trigger('error', e); + }); + + this.triggerReady(); + }; + + Vimeo.prototype.initVimeoState = function initVimeoState() { + var state = this._vimeoState = { + ended: false, + playing: false, + volume: 0, + progress: { + seconds: 0, + percent: 0, + duration: 0 + } + }; + + this._player.getCurrentTime().then(function (time) { + return state.progress.seconds = time; + }); + this._player.getDuration().then(function (time) { + return state.progress.duration = time; + }); + this._player.getPaused().then(function (paused) { + return state.playing = !paused; + }); + this._player.getVolume().then(function (volume) { + return state.volume = volume; + }); + }; + + Vimeo.prototype.createEl = function createEl() { + var div = _video2.default.createEl('div', { + id: this.options_.techId + }); + + div.style.cssText = 'width:100%;height:100%;top:0;left:0;position:absolute'; + div.className = 'vjs-vimeo'; + + return div; + }; + + Vimeo.prototype.controls = function controls() { + return true; + }; + + Vimeo.prototype.supportsFullScreen = function supportsFullScreen() { + return true; + }; + + Vimeo.prototype.src = function src() { + // @note: Not sure why this is needed but videojs requires it + return this.options_.source; + }; + + Vimeo.prototype.currentSrc = function currentSrc() { + return this.options_.source.src; + }; + + // @note setSrc is used in other usecases (YouTube, Html) it doesn't seem required here + // setSrc() {} + + Vimeo.prototype.currentTime = function currentTime() { + return this._vimeoState.progress.seconds; + }; + + Vimeo.prototype.setCurrentTime = function setCurrentTime(time) { + this._player.setCurrentTime(time); + }; + + Vimeo.prototype.volume = function volume() { + return this._vimeoState.volume; + }; + + Vimeo.prototype.setVolume = function setVolume(v) { + return this._player.setVolume(volume); + }; + + Vimeo.prototype.duration = function duration() { + return this._vimeoState.progress.duration; + }; + + Vimeo.prototype.buffered = function buffered() { + var progress = this._vimeoState.progress; + return _video2.default.createTimeRange(0, progress.percent * progress.duration); + }; + + Vimeo.prototype.paused = function paused() { + return !this._vimeoState.playing; + }; + + Vimeo.prototype.pause = function pause() { + this._player.pause(); + }; + + Vimeo.prototype.play = function play() { + this._player.play(); + }; + + Vimeo.prototype.muted = function muted() { + return this._vimeoState.volume === 0; + }; + + Vimeo.prototype.ended = function ended() { + return this._vimeoState.ended; + }; + + // Vimeo does has a mute API and native controls aren't being used, + // so setMuted doesn't really make sense and shouldn't be called. + // setMuted(mute) {} + + + return Vimeo; +}(Tech); + +Vimeo.prototype.featuresTimeupdateEvents = true; + +Vimeo.isSupported = function () { + return true; +}; + +// Add Source Handler pattern functions to this tech +Tech.withSourceHandlers(Vimeo); + +Vimeo.nativeSourceHandler = {}; + +/** + * Check if Vimeo can play the given videotype + * @param {String} type The mimetype to check + * @return {String} 'maybe', or '' (empty string) + */ +Vimeo.nativeSourceHandler.canPlayType = function (source) { + if (source === 'video/vimeo') { + return 'maybe'; + } + + return ''; +}; + +/* + * Check Vimeo can handle the source natively + * + * @param {Object} source The source object + * @return {String} 'maybe', or '' (empty string) + * @note: Copied over from YouTube — not sure this is relevant + */ +Vimeo.nativeSourceHandler.canHandleSource = function (source) { + if (source.type) { + return Vimeo.nativeSourceHandler.canPlayType(source.type); + } else if (source.src) { + return Vimeo.nativeSourceHandler.canPlayType(source.src); + } + + return ''; +}; + +// @note: Copied over from YouTube — not sure this is relevant +Vimeo.nativeSourceHandler.handleSource = function (source, tech) { + tech.src(source.src); +}; + +// @note: Copied over from YouTube — not sure this is relevant +Vimeo.nativeSourceHandler.dispose = function () {}; + +Vimeo.registerSourceHandler(Vimeo.nativeSourceHandler); + +// Since the iframe can't be touched using Vimeo's way of embedding, +// let's add a new styling rule to have the same style as `vjs-tech` +function injectCss() { + if (cssInjected) { + return; + } + cssInjected = true; + var css = '\n .vjs-vimeo iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n '; + var head = document.head || document.getElementsByTagName('head')[0]; + + var style = document.createElement('style'); + style.type = 'text/css'; + + if (style.styleSheet) { + style.styleSheet.cssText = css; + } else { + style.appendChild(document.createTextNode(css)); + } + + head.appendChild(style); +} + +Component.registerComponent('Vimeo', Vimeo); +Tech.registerTech('Vimeo', Vimeo); + +// Include the version number. +Vimeo.VERSION = '0.0.1'; + +exports.default = Vimeo; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"@vimeo/player":1}]},{},[2])(2) +}); \ No newline at end of file diff --git a/vendor/videojs/plugins/vjs.vimeo.js b/vendor/videojs/plugins/vjs.vimeo.js deleted file mode 100755 index 08093a0..0000000 --- a/vendor/videojs/plugins/vjs.vimeo.js +++ /dev/null @@ -1 +0,0 @@ -var VimeoState={UNSTARTED:-1,ENDED:0,PLAYING:1,PAUSED:2,BUFFERING:3};videojs.Vimeo=videojs.MediaTechController.extends({init:function(e,o,t){if(videojs.MediaTechController.call(this,e,o,t),"undefined"!=typeof o.source)for(var i in o.source)e.options()[i]=o.source[i];this.player_=e,this.player_el_=document.getElementById(this.player_.id()),this.player_.controls(!1),this.id_=this.player_.id()+"_vimeo_api",this.el_=videojs.Component.prototype.createEl("iframe",{id:this.id_,className:"vjs-tech",scrolling:"no",marginWidth:0,marginHeight:0,frameBorder:0,webkitAllowFullScreen:"true",mozallowfullscreen:"true",allowFullScreen:"true"}),this.player_el_.insertBefore(this.el_,this.player_el_.firstChild);var n="file:"===document.location.protocol?"http:":document.location.protocol;this.baseUrl=n+"//player.vimeo.com/video/",this.vimeo={},this.vimeoInfo={};var r=this;this.el_.onload=function(){r.onLoad()},this.startMuted=e.options().muted,this.src(e.options().src)}}),videojs.Vimeo.prototype.dispose=function(){this.vimeo.removeEvent("ready"),this.vimeo.api("unload"),delete this.vimeo,this.el_.parentNode.removeChild(this.el_),videojs.MediaTechController.prototype.dispose.call(this)},videojs.Vimeo.prototype.src=function(e){this.isReady_=!1;var o=/^.*(vimeo\.com\/)((channels\/[A-z]+\/)|(groups\/[A-z]+\/videos\/))?([0-9]+)/,t=e.match(o);t&&(this.videoId=t[5]);var i={api:1,byline:0,portrait:0,show_title:0,show_byline:0,show_portait:0,fullscreen:1,player_id:this.id_,autoplay:this.player_.options().autoplay?1:0,loop:this.player_.options().loop?1:0,color:this.player_.options().color||""};"#"===i.color.substring(0,1)&&(i.color=i.color.substring(1)),this.el_.src=this.baseUrl+this.videoId+"?"+videojs.Vimeo.makeQueryString(i)},videojs.Vimeo.prototype.load=function(){},videojs.Vimeo.prototype.play=function(){this.vimeo.api("play")},videojs.Vimeo.prototype.pause=function(){this.vimeo.api("pause")},videojs.Vimeo.prototype.paused=function(){return this.vimeoInfo.state!==VimeoState.PLAYING&&this.vimeoInfo.state!==VimeoState.BUFFERING},videojs.Vimeo.prototype.currentTime=function(){return this.vimeoInfo.time||0},videojs.Vimeo.prototype.setCurrentTime=function(e){this.vimeo.api("seekTo",e),this.player_.trigger("timeupdate")},videojs.Vimeo.prototype.duration=function(){return this.vimeoInfo.duration||0},videojs.Vimeo.prototype.buffered=function(){return videojs.createTimeRange(0,this.vimeoInfo.buffered*this.vimeoInfo.duration||0)},videojs.Vimeo.prototype.volume=function(){return this.vimeoInfo.muted?this.vimeoInfo.muteVolume:this.vimeoInfo.volume},videojs.Vimeo.prototype.setVolume=function(e){this.vimeo.api("setvolume",e),this.vimeoInfo.volume=e,this.player_.trigger("volumechange")},videojs.Vimeo.prototype.currentSrc=function(){return this.el_.src},videojs.Vimeo.prototype.muted=function(){return this.vimeoInfo.muted||!1},videojs.Vimeo.prototype.setMuted=function(e){e?(this.vimeoInfo.muteVolume=this.vimeoInfo.volume,this.setVolume(0)):this.setVolume(this.vimeoInfo.muteVolume),this.vimeoInfo.muted=e,this.player_.trigger("volumechange")},videojs.Vimeo.prototype.onReady=function(){this.isReady_=!0,this.triggerReady(),this.player_.trigger("loadedmetadata"),this.startMuted&&(this.setMuted(!0),this.startMuted=!1)},videojs.Vimeo.prototype.onLoad=function(){this.vimeo&&this.vimeo.api&&(this.vimeo.api("unload"),delete this.vimeo),this.vimeo=$f(this.el_),this.vimeoInfo={state:VimeoState.UNSTARTED,volume:1,muted:!1,muteVolume:1,time:0,duration:0,buffered:0,url:this.baseUrl+this.videoId,error:null};var e=this;this.vimeo.addEvent("ready",function(){e.onReady(),e.vimeo.addEvent("loadProgress",function(o){e.onLoadProgress(o)}),e.vimeo.addEvent("playProgress",function(o){e.onPlayProgress(o)}),e.vimeo.addEvent("play",function(){e.onPlay()}),e.vimeo.addEvent("pause",function(){e.onPause()}),e.vimeo.addEvent("finish",function(){e.onFinish()}),e.vimeo.addEvent("seek",function(o){e.onSeek(o)})})},videojs.Vimeo.prototype.onLoadProgress=function(e){var o=!this.vimeoInfo.duration;this.vimeoInfo.duration=e.duration,this.vimeoInfo.buffered=e.percent,this.player_.trigger("progress"),o&&this.player_.trigger("durationchange")},videojs.Vimeo.prototype.onPlayProgress=function(e){this.vimeoInfo.time=e.seconds,this.player_.trigger("timeupdate")},videojs.Vimeo.prototype.onPlay=function(){this.vimeoInfo.state=VimeoState.PLAYING,this.player_.trigger("play")},videojs.Vimeo.prototype.onPause=function(){this.vimeoInfo.state=VimeoState.PAUSED,this.player_.trigger("pause")},videojs.Vimeo.prototype.onFinish=function(){this.vimeoInfo.state=VimeoState.ENDED,this.player_.trigger("ended")},videojs.Vimeo.prototype.onSeek=function(e){this.vimeoInfo.time=e.seconds,this.player_.trigger("timeupdate"),this.player_.trigger("seeked")},videojs.Vimeo.prototype.onError=function(e){this.player_.error=e,this.player_.trigger("error")},videojs.Vimeo.isSupported=function(){return!0},videojs.Vimeo.prototype.supportsFullScreen=function(){return!1},videojs.Vimeo.canPlaySource=function(e){return"video/vimeo"==e.type},videojs.Vimeo.makeQueryString=function(e){var o=[];for(var t in e)e.hasOwnProperty(t)&&o.push(encodeURIComponent(t)+"="+encodeURIComponent(e[t]));return o.join("&")};var Froogaloop=function(){function e(o){return new e.fn.init(o)}function o(e,o,t){if(!t.contentWindow.postMessage)return!1;var i=JSON.stringify({method:e,value:o});t.contentWindow.postMessage(i,l)}function t(e){var o,t;try{o=JSON.parse(e.data),t=o.event||o.method}catch(i){}if("ready"!=t||u||(u=!0),!/^https?:\/\/player.vimeo.com/.test(e.origin))return!1;"*"===l&&(l=e.origin);var r=o.value,s=o.data,a=""===a?null:o.player_id,d=n(t,a),m=[];return d?(void 0!==r&&m.push(r),s&&m.push(s),a&&m.push(a),m.length>0?d.apply(null,m):d.call()):!1}function i(e,o,t){t?(a[t]||(a[t]={}),a[t][e]=o):a[e]=o}function n(e,o){return o&&a[o]?a[o][e]:a[e]}function r(e,o){if(o&&a[o]){if(!a[o][e])return!1;a[o][e]=null}else{if(!a[e])return!1;a[e]=null}return!0}function s(e){return!!(e&&e.constructor&&e.call&&e.apply)}var a={},u=!1,l=(Array.prototype.slice,"*");return e.fn=e.prototype={element:null,init:function(e){return"string"==typeof e&&(e=document.getElementById(e)),this.element=e,this},api:function(e,t){if(!this.element||!e)return!1;var n=this,r=n.element,a=""!==r.id?r.id:null,u=s(t)?null:t,l=s(t)?t:null;return l&&i(e,l,a),o(e,u,r),n},addEvent:function(e,t){if(!this.element)return!1;var n=this,r=n.element,s=""!==r.id?r.id:null;return i(e,t,s),"ready"!=e?o("addEventListener",e,r):"ready"==e&&u&&t.call(null,s),n},removeEvent:function(e){if(!this.element)return!1;var t=this,i=t.element,n=""!==i.id?i.id:null,s=r(e,n);"ready"!=e&&s&&o("removeEventListener",e,i)}},e.fn.init.prototype=e.fn,window.addEventListener?window.addEventListener("message",t,!1):window.attachEvent("onmessage",t),window.Froogaloop=window.$f=e}(); diff --git a/vendor/videojs/video-js.css b/vendor/videojs/video-js.css old mode 100755 new mode 100644 index 916dd35..c0001c1 --- a/vendor/videojs/video-js.css +++ b/vendor/videojs/video-js.css @@ -14,7 +14,7 @@ @font-face { font-family: VideoJS; - src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAA4wAAoAAAAAFfAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAD4AAABWUZFeBGNtYXAAAAE0AAAAOgAAAUriLxC2Z2x5ZgAAAXAAAAnnAAAO5OV/F/5oZWFkAAALWAAAACsAAAA2C4eUa2hoZWEAAAuEAAAAGAAAACQOogcfaG10eAAAC5wAAAAPAAAAeNIAAABsb2NhAAALrAAAAD4AAAA+MMgtQm1heHAAAAvsAAAAHwAAACABLwB5bmFtZQAADAwAAAElAAACCtXH9aBwb3N0AAANNAAAAPkAAAF5vawAenicY2BkZ2CcwMDKwMFSyPKMgYHhF4RmjmEIZzzHwMDEwMrMgBUEpLmmMDh8ZPwoyw7iLmSHCDOCCADu/Qo9AAB4nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZgYGD7K/v8PUvCREUTzM0DVAwEjG8OIBwCOWgbUAAB4nI1XfVBU1xV/574vlsUlj/14grDs48FuAgaR3X2LEnY3UZSgEkTwAySAgkIwI8bRfFDjTszYCWRMW9lNa4y2meokmq+2k5ia0dpkmknbkWgSSW3GyaaNf0RTx0wxX7A3Pe/tQmIgHXf3vXvvueeee+45v3POXQYY/PCD/CBDGAYkIE2sxg+OXSJmhmH1OaFX6MU5C5PDMCZi5Rg2i+ELGSthwM14NCbgYGSBIZfhFA1H6Zu0OS0NDkMVfg+npdFm+maCvigI0JBIQIMg0BdJGdTj9ylj7nr+b97+Hl8C1+H2xNAvjPqxjIgaKtItICkSnIISeo40QQls4xxjlzgHsnGGvi7BxQiMlSlkPMhfCh67rAUEUQ6CHxW2O7JARCkKnlUQ7UEIyAEQZe4MdDW9xr5OPFuKbubpRxcPDY8da4MOelDfAYJLW+sGKn/Vlmjfv5+NdB4oOfTazJn3tGxZtL9xFNZX7PPRUbjcRg/SMB2EL+gblXn7shbO/WUbF9u/H5XQ9eKO8iMMr9tY35qYoRi20wGuXV/CHaGDk2fdgHwCk5HUXQpCcgHfBV2NjV3jkq4PHTSUSBwuOQALvxPAps6fiftk6P6yJpcm5bB4dFkgoh195mbiSTnkL3jupq7jh4ZZdvjQRVB4PPx3SsVTu5D/6kd85RU66ttXAeuuXYN1E/Y2sMMzZkZiZNRZlRS/ynr9Xr8Cql2RVNbutXslYo7B9ngsFqcDbCQO22PxeIxcpgMxkh6PjUdwkvw6hvRpZeoCFKshDQzJVr++DWyLx+hAXJcGp3TJMV1ME45xCNvHLsWRrpOZSduOoG0zERuIIwuIkhNkBREglQKLiODD45FQE0BTiE214xE2wp8zOt9NjH3GRtDMk7Ehoq2tzCzGxdyMEQJuD0qGIrQ58ApoWQE3D2h1h6zwuB14wYFIDAA5CZ11jT+92gFZ7B7/p7+hV8jFxBl4aG03wLiVXtBbCylLfIJzkPUAvWAw0yvsVdKdBbC6nnruP/RFkHqWJLZ2Auxdtgy+6qTf7l1WswTJcJ6mGVxwXj92UtfU2WXUNX+qBUCxK6D4FR4f/cufG1sZbiSkMcwdMdoxBxTTEXIp4SCXMNhHoFjvTTFP4vkoPReNRmPRCTwa+3qY0DR7qn7Vjh612wRRTaI04HWCnZ+gIzvS/ZJP0+mynphCui4hzmG0id6+aLSv2BV3FQMYDTHrlGQ/SZ+q4ZdF8aLa5Ar8GW3tVNKEj13cF0buMaesx1i9CL/Uo1tM0h+74o9HjQ+UcPaxy8mH9ccwK8KpKA3rHdIUjTKpfIBxuokpxUGBIILm84ATvHh8tAIe2iZj8KvYwUOXawHMVNgxZvlwSa0z8Zkokkxn3ey2nYTsbMO3mPh8cji7zklsPLD9a9f2s2w/uSt/FgSytWzw5bmS3PielU1P56aGrlz6NzlnbT8h/Wtb+1OxIqxBbC9g7kINUbtAEDxsKWSCe46eltCPmaiUxy2IrODIB8EmixaQrU4IAQ6THg6BFpAdWsCquT16DkL9ccIC/FGeP5AuiDExe8bx+QtzWVsmHcm0kdzqecdn5IhRkTc/zfNPm3ns5sw4Pq86l9gyofh6jkTF5iFChjYbbzZQWFvYb8qZAWyGiV9ya+5bFgnzpuWt3FuX8KYMmsiYZepPseBgGhZcOMt0+4Q8fDOTftJjHIuhdaLsFXFM9AclTi9jbGRq8ZvIOykZei77kfo53eoppVPovbGiyV63p/p/dkWETTjmhjTIm8RP284b04bcNYlRsvO6Gp2JeaiIueVHsgJGF2aASlCQLuG8EsBomzb++/AXmwhaOoLhL7iQ4/uc449gWJ56/XWDARn74v/PL1bRBB4TBEyYrqezSkUPHaWjPWCm13ogAzJ66LVpbTEuXccDZlyXxBQ/IrzKOPS7gAkkIyZ0N6joE6M246aDsO1kgucTJ/EdFWA5pbAcTfoSP4hJeBCni7nEn5IclL4kpDgmMMuH8Kpk0+WrBUIeKCyWS0nPVz7NW86Hnl55GxR5KB3+9tszL+wVRulXNTUn6D8SJvIl3PzP46eZST/tQTllTDXTzmxCaTYna7eJAqcWuD1ulBXQsMz5fQEBCfowCF5FVDF/2yysB9OW5veVEtRAFOy41FoeJEiAOZhDiFstsKAwJ8Hijs72q1jWvWx+uKU5XFZDLx189OK8ojW1u0By5dtLHUN/rwkte68PnhnYVbt0bvWiub9w1+f4C0L3hIuXZ8+xlVSt0eb3tgQsmVZnem5R3U0uf/fmFdqiLTvY3nPnet5/v4f9pLB6QX2krnnFQ1tXtN+2ePlAaUNWcfiWwrncn4ca9ml3hFeHHm+u2bq4MhxUZs3bMH/3jgaPUtlVunFjg2/8yRzf3cHsssKZqlnOqyCWworWykW9lXnspk0ffrjpfCreIpjPWbwnFxt3PAkcQgkUuH1auUMf+txJQ0hK1k1zsNaqQdaLMxfoq9AGGxtJQ+fGw53cE/TY8pWhJruZHiMAcCexFS/eGDp6hntiXGE/gvI7163b29ExfiHxNsnqub/a6/QmPoAn4GpZ2c9cZRX5/57IWUNYuubiQBAddhuxAKe6PA5vuV5dkk0VXkMM3zk42W3Awrgka8LQgjZY+tQIffd5+vnHasnHL/cczldyS4r79i6su6Nu9oPQ8lbaid2Pt9/bXtTTynevq7bkPkITV47d+3NugOzo4M3y77Zxbnb2nhWrl0T/kO4u3H1ig33e1lD6JDYjiKkCHOioF0pZv6T6gxxipxLNhFc8xERA48vq5ZfXdL/QV6c8W3PfwjIsZyI3Csvo72e4FpTVwTv/UYNAKtY+8MB84vogZ1Xr5lW38iJdPZ74xunzO4Gk7BARIkytjlyCoPVoIb3IluMfAYRhEoAO2aGXKc2TNAJaSwdzQEeq7jC7TWYF2Y2jrEIXlyVEhunBs5t7K62a7Z6qB0923/+vPT2v7mwpqV/mTEsTiCB5zz735HOP9VbVWtKKZK08uDJ7vcQN02HogGegY5iNnKUHh12ti9/zzHvsauy+tx+e375j94LuA64MV/5MQbZVNT95/re7jlxZVaVuW5Nffsd9TXfOpXcv6m2Bn3x6FgXg/oz+P0h/ce8g2mTEWxVTzzQzrTruNCcRdbu6VY87gLVXc4uSjXfosak7XxWM4oyl+ockmzCFhJXaGwK8e6sCW2T3sLmPnh5qSZtx9JHFL6QBHGnsTjdtWQ8PFygWtQTIkrI84NILfQSC65FUMFsnOYFHEoSmUCD49a4rt3985PTsd8GzB/5KEnzmhhORgVOZPM+yb5KmpRu38jQqviH6826Lrdrxx6DZdFPo2fVbTiy9AUpDJ3SxGYvpK7u+Rhz8D4BCxssAeJxjYGRgYABi/vcdWfH8Nl8ZuNkZQODSliXbkWl2BrA4BwMTiAIAKDsJfgB4nGNgZGBgZwCChWASxGZkQAVyABOTANd4nGNnYGBgHwAMADNUANMAAAAAAAAOAFAAZgCyAMYA5gEeAUgBdAGcAfICLgKOAroDCgOOA7AD6gQ4BHwEuAToBQwFogXoBjYGbAbaB3IAAHicY2BkYGCQY8hlYGcAASYg5gJCBob/YD4DABa6AakAeJxdkE1qg0AYhl8Tk9AIoVDaVSmzahcF87PMARLIMoFAl0ZHY1BHdBJIT9AT9AQ9RQ9Qeqy+yteNMzDzfM+88w0K4BY/cNAMB6N2bUaPPBLukybCLvleeAAPj8JD+hfhMV7hC3u4wxs7OO4NzQSZcI/8Ltwnfwi75E/hAR7wJTyk/xYeY49fYQ/PztM+jbTZ7LY6OWdBJdX/pqs6NYWa+zMxa13oKrA6Uoerqi/JwtpYxZXJ1coUVmeZUWVlTjq0/tHacjmdxuL90OR8O0UEDYMNdtiSEpz5XQGqzlm30kzUdAYFFOb8R7NOZk0q2lwAyz1i7oAr1xoXvrOgtYhZx8wY5KRV269JZ5yGpmzPTjQhvY9je6vEElPOuJP3mWKnP5M3V+YAAAB4nG2P2XLCMAxFfYE4CWlZSveFP8hHOY4gHhw79VLav68hMNOH6kG60mg5YhM22pr9b1vGMMEUM2TgyFGgxBwVbnCLBZZYYY07bHCPBzziCc94wSve8I4PbGeDFj/VydVSOakpG0T0VH1ZHXuq+xhoftHaHq+yV+21o1P7brWLWnvpiExNJpBb/i18q8D9ZxSOcj8oY8iVPjZBBU2+kGIIypokuqTI+cx3qXMq7Z6PQIsx1DYGrQxtLul50YV50rVcCiNJc0enX4qdkNRYe8j2g46+SIMHapXJw1GFdIWH2DfalQknZeTDWsRW2bqlBK3ORIz9AqJUapQAAAA=) format("woff"), url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAAKAIAAAwAgT1MvMlGRXgQAAAEoAAAAVmNtYXDiLxC2AAAB+AAAAUpnbHlm5X8X/gAAA4QAAA7kaGVhZAuHlGsAAADQAAAANmhoZWEOogcfAAAArAAAACRobXR40gAAAAAAAYAAAAB4bG9jYTDILUIAAANEAAAAPm1heHABLwB5AAABCAAAACBuYW1l1cf1oAAAEmgAAAIKcG9zdL2sAHoAABR0AAABeQABAAAHAAAAAKEHAAAAAAAHAAABAAAAAAAAAAAAAAAAAAAAHgABAAAAAQAAD+/W/l8PPPUACwcAAAAAANK0pLcAAAAA0rSktwAAAAAHAAcAAAAACAACAAAAAAAAAAEAAAAeAG0ABwAAAAAAAgAAAAoACgAAAP8AAAAAAAAAAQcAAZAABQAIBHEE5gAAAPoEcQTmAAADXABXAc4AAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA8QHxHQcAAAAAoQcAAAAAAAABAAAAAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAAAAAAAwAAAAMAAAAcAAEAAAAAAEQAAwABAAAAHAAEACgAAAAGAAQAAQACAADxHf//AAAAAPEB//8AAA8AAAEAAAAAAAAAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AUABmALIAxgDmAR4BSAF0AZwB8gIuAo4CugMKA44DsAPqBDgEfAS4BOgFDAWiBegGNgZsBtoHcgAAAAEAAAAABYsFiwACAAABEQECVQM2BYv76gILAAADAAAAAAZrBmsAAgAOABoAAAkCEwQAAxIABSQAEwIAASYAJzYANxYAFwYAAusBwP5Alf7D/loICAGmAT0BPQGmCAj+Wv7D/f6uBgYBUv39AVIGBv6uAjABUAFQAZsI/lr+w/7D/loICAGmAT0BPQGm+sgGAVL9/QFSBgb+rv39/q4AAAACAAAAAAVABYsAAwAHAAABIREpAREhEQHAASv+1QJVASsBdQQW++oEFgAAAAQAAAAABiAGIAAGABMAJAAnAAABLgEnFRc2NwYHFz4BNSYAJxUWEgEHASERIQERAQYHFT4BNxc3AQcXBNABZVW4A7sCJ3ElKAX+3+Wlzvu3XwFh/p8BKwF1AT5MXU6KO5lf/WCcnAOAZJ4rpbgYGGpbcUacVPQBYziaNP70Aetf/p/+QP6LAfb+wjsdmhJEMZhfBJacnAAAAQAAAAAEqwXWAAUAAAERIQERAQILASoBdv6KBGD+QP6LBKr+iwAAAAIAAAAABWYF1gAGAAwAAAEuAScRPgEBESEBEQEFZQFlVFRl/BEBKwF1/osDgGSeK/2mK54BRP5A/osEqv6LAAADAAAAAAYgBg8ABQAMABoAABMRIQERAQUuAScRPgEDFRYSFwYCBxU2ADcmAOABKwF1/osCxQFlVVVluqXOAwPOpeUBIQUF/t8EYP5A/osEqv6L4GSeK/2mK54C85o0/vS1tf70NJo4AWL19QFiAAAABAAAAAAFiwWLAAUACwARABcAAAEjESE1IwMzNTM1IQEjFSERIwMVMxUzEQILlgF24JaW4P6KA4DgAXaW4OCWAuv+ipYCCuCW/ICWAXYCoJbgAXYABAAAAAAFiwWLAAUACwARABcAAAEzFTMRIRMjFSERIwEzNTM1IRM1IxEhNQF14Jb+iuDgAXaWAcCW4P6KlpYBdgJV4AF2AcCWAXb76uCWAcDg/oqWAAAAAAIAAAAABdYF1gAPABMAAAEhDgEHER4BFyE+ATcRLgEDIREhBUD8gD9VAQFVPwOAP1UBAVU//IADgAXVAVU//IA/VQEBVT8DgD9V++wDgAAABgAAAAAGawZrAAcADAATABsAIAAoAAAJASYnDgEHASUuAScBBSEBNhI3JgUBBgIHFhchBR4BFwEzARYXPgE3AQK+AWROVIfwYQESA4416aH+7gLl/dABelxoAQH8E/7dXGgBAQ4CMP3kNemhARJ4/t1OVIfwYf7uA/ACaBIBAVhQ/id3pfY+/idL/XNkAQGTTU0B+GT+/5NNSEul9j4B2f4IEgEBWFAB2QAAAAUAAAAABmsF1gAPABMAFwAbAB8AAAEhDgEHER4BFyE+ATcRLgEBIRUhASE1IQUhNSE1ITUhBdX7VkBUAgJUQASqQFQCAlT7FgEq/tYC6v0WAuoBwP7WASr9FgLqBdUBVT/8gD9VAQFVPwOAP1X9rJX+1ZWVlZaVAAMAAAAABiAF1gAPACcAPwAAASEOAQcRHgEXIT4BNxEuAQEjNSMVMzUzFRQGByMuAScRPgE3Mx4BFQUjNSMVMzUzFQ4BByMuATURNDY3Mx4BFwWL++o/VAICVD8EFj9UAgJU/WtwlZVwKiDgICoBASog4CAqAgtwlZVwASog4CAqKiDgICoBBdUBVT/8gD9VAQFVPwOAP1X99yXgJUogKgEBKiABKiAqAQEqIEol4CVKICoBASogASogKgEBKiAAAAYAAAAABiAE9gADAAcACwAPABMAFwAAEzM1IxEzNSMRMzUjASE1IREhNSERFSE14JWVlZWVlQErBBX76wQV++sEFQM1lv5AlQHAlf5Alv5AlQJVlZUAAAABAAAAAAYgBmwALgAAASIGBwE2NCcBHgEzPgE3LgEnDgEHFBcBLgEjDgEHHgEXMjY3AQYHHgEXPgE3LgEFQCtKHv3sBwcCDx5OLF9/AgJ/X19/Agf98R5OLF9/AgJ/XyxOHgIUBQEDe1xcewMDewJPHxsBNxk2GQE0HSACf19ffwICf18bGf7NHCACf19ffwIgHP7KFxpcewICe1xdewAAAgAAAAAGWQZrAEMATwAAATY0Jzc+AScDLgEPASYvAS4BJyEOAQ8BBgcnJgYHAwYWHwEGFBcHDgEXEx4BPwEWHwEeARchPgE/ATY3FxY2NxM2JicFLgEnPgE3HgEXDgEFqwUFngoGB5YHGQ26OkQcAxQP/tYPFAIcRTm6DRoHlQcFC50FBZ0LBQeVBxoNujlFHAIUDwEqDxQCHEU5ug0aB5UHBQv9OG+UAgKUb2+UAgKUAzckSiR7CRoNAQMMCQVLLRzGDhEBAREOxhwtSwUJDP79DBsJeyRKJHsJGg3+/QwJBUstHMYOEQEBEQ7GHC1LBQkMAQMMGwlBApRvb5QCApRvb5QAAAAAAQAAAAAGawZrAAsAABMSAAUkABMCACUEAJUIAaYBPQE9AaYICP5a/sP+w/5aA4D+w/5aCAgBpgE9AT0BpggI/loAAAACAAAAAAZrBmsACwAXAAABBAADEgAFJAATAgABJgAnNgA3FgAXBgADgP7D/loICAGmAT0BPQGmCAj+Wv7D/f6uBgYBUv39AVIGBv6uBmsI/lr+w/7D/loICAGmAT0BPQGm+sgGAVL9/QFSBgb+rv39/q4AAAMAAAAABmsGawALABcAIwAAAQQAAxIABSQAEwIAASYAJzYANxYAFwYAAw4BBy4BJz4BNx4BA4D+w/5aCAgBpgE9AT0BpggI/lr+w/3+rgYGAVL9/QFSBgb+rh0Cf19ffwICf19ffwZrCP5a/sP+w/5aCAgBpgE9AT0BpvrIBgFS/f0BUgYG/q79/f6uAk9ffwICf19ffwICfwAAAAQAAAAABiAGIAAPABsAJQApAAABIQ4BBxEeARchPgE3ES4BASM1IxUjETMVMzU7ASEeARcRDgEHITczNSMFi/vqP1QCAlQ/BBY/VAICVP1rcJVwcJVwlgEqICoBASog/tZwlZUGIAJUP/vqP1QCAlQ/BBY/VPyClZUBwLu7ASog/tYgKgFw4AACAAAAAAZrBmsACwAXAAABBAADEgAFJAATAgATBwkBJwkBNwkBFwEDgP7D/loICAGmAT0BPQGmCAj+Wjhp/vT+9GkBC/71aQEMAQxp/vUGawj+Wv7D/sP+WggIAaYBPQE9Aab8EWkBC/71aQEMAQxp/vUBC2n+9AABAAAAAAXWBrYAFgAAAREJAREeARcOAQcuAScjFgAXNgA3JgADgP6LAXW+/QUF/b6+/QWVBgFR/v4BUQYG/q8FiwEq/ov+iwEqBP2/vv0FBf2+/v6vBgYBUf7+AVEAAAABAAAAAAU/BwAAFAAAAREjIgYdASEDIxEhESMRMzU0NjMyBT+dVjwBJSf+/s7//9Ctkwb0/vhISL3+2P0JAvcBKNq6zQAAAAAEAAAAAAaOBwAAMABFAGAAbAAAARQeAxUUBwYEIyImJyY1NDY3NiUuATU0NwYjIiY1NDY3PgEzIQcjHgEVFA4DJzI2NzY1NC4CIyIGBwYVFB4DEzI+AjU0LgEvASYvAiYjIg4DFRQeAgEzFSMVIzUjNTM1MwMfQFtaQDBI/uqfhOU5JVlKgwERIB8VLhaUy0g/TdNwAaKKg0pMMUVGMZImUBo1Ij9qQCpRGS8UKz1ZNjprWzcODxMeChwlThAgNWhvUzZGcX0Da9XVadTUaQPkJEVDUIBOWlN6c1NgPEdRii5SEipAKSQxBMGUUpo2QkBYP4xaSHNHO0A+IRs5ZjqGfVInITtlLmdnUjT8lxo0Xj4ZMCQYIwsXHTgCDiQ4XTtGazsdA2xs29ts2QADAAAAAAaABmwAAwAOACoAAAERIREBFgYrASImNDYyFgERIRE0JiMiBgcGFREhEhAvASEVIz4DMzIWAd3+tgFfAWdUAlJkZ6ZkBI/+t1FWP1UVC/63AgEBAUkCFCpHZz+r0ASP/CED3wEySWJik2Fh/N39yAISaXdFMx4z/dcBjwHwMDCQIDA4H+MAAAEAAAAABpQGAAAxAAABBgcWFRQCDgEEIyAnFjMyNy4BJxYzMjcuAT0BFhcuATU0NxYEFyY1NDYzMhc2NwYHNgaUQ18BTJvW/tKs/vHhIyvhsGmmHyEcKypwk0ROQk4seQFbxgi9hoxgbWAlaV0FaGJFDhyC/v3ut22RBIoCfWEFCxexdQQmAyyOU1hLlbMKJiSGvWYVOXM/CgAAAAEAAAAABYAHAAAiAAABFw4BBwYuAzURIzU+BDc+ATsBESEVIREUHgI3NgUwUBewWWitcE4hqEhyRDAUBQEHBPQBTf6yDSBDME4Bz+0jPgECOFx4eDoCINcaV11vVy0FB/5Y/P36HjQ1HgECAAEAAAAABoAGgABKAAABFAIEIyInNj8BHgEzMj4BNTQuASMiDgMVFBYXFj8BNjc2JyY1NDYzMhYVFAYjIiY3PgI1NCYjIgYVFBcDBhcmAjU0EiQgBBIGgM7+n9FvazsTNhRqPXm+aHfijmm2f1srUE0eCAgGAgYRM9Gpl6mJaz1KDgglFzYyPlYZYxEEzv7OAWEBogFhzgOA0f6fziBdR9MnOYnwlnLIfjpgfYZDaJ4gDCAfGAYXFD1al9mkg6ruVz0jdVkfMkJyVUkx/l5Ga1sBfOnRAWHOzv6fAAAHAAAAAAcABM8ADgAXACoAPQBQAFoAXQAAARE2HgIHDgEHBiYjJyY3FjY3NiYHERQFFjY3PgE3LgEnIwYfAR4BFw4BFxY2Nz4BNy4BJyMGHwEeARcUBhcWNjc+ATcuAScjBh8BHgEXDgEFMz8BFTMRIwYDJRUnAxyEzZRbCA2rgketCAEBqlRoCglxYwF+IiEOIysBAkswHQEECiQ0AgE+YyIhDiIsAQJLMB4BBQokNAE/YyIhDiIsAQJLMB4BBQokNAEBPvmD7kHhqs0s0gEnjgHJAv0FD2a9gIrADwUFAwPDAlVMZ3MF/pUHwgc1HTyWV325PgsJED+oY3G9TAc1HTyWV325PgsJED+oY3G9TAc1HTyWV325PgsJED+oY3G9UmQBZQMMR/61g/kBAAAAAAAQAMYAAQAAAAAAAQAHAAAAAQAAAAAAAgAHAAcAAQAAAAAAAwAHAA4AAQAAAAAABAAHABUAAQAAAAAABQALABwAAQAAAAAABgAHACcAAQAAAAAACgArAC4AAQAAAAAACwATAFkAAwABBAkAAQAOAGwAAwABBAkAAgAOAHoAAwABBAkAAwAOAIgAAwABBAkABAAOAJYAAwABBAkABQAWAKQAAwABBAkABgAOALoAAwABBAkACgBWAMgAAwABBAkACwAmAR5WaWRlb0pTUmVndWxhclZpZGVvSlNWaWRlb0pTVmVyc2lvbiAxLjBWaWRlb0pTR2VuZXJhdGVkIGJ5IHN2ZzJ0dGYgZnJvbSBGb250ZWxsbyBwcm9qZWN0Lmh0dHA6Ly9mb250ZWxsby5jb20AVgBpAGQAZQBvAEoAUwBSAGUAZwB1AGwAYQByAFYAaQBkAGUAbwBKAFMAVgBpAGQAZQBvAEoAUwBWAGUAcgBzAGkAbwBuACAAMQAuADAAVgBpAGQAZQBvAEoAUwBHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAACAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4EcGxheQtwbGF5LWNpcmNsZQVwYXVzZQt2b2x1bWUtbXV0ZQp2b2x1bWUtbG93CnZvbHVtZS1taWQLdm9sdW1lLWhpZ2gQZnVsbHNjcmVlbi1lbnRlcg9mdWxsc2NyZWVuLWV4aXQGc3F1YXJlB3NwaW5uZXIJc3VidGl0bGVzCGNhcHRpb25zCGNoYXB0ZXJzBXNoYXJlA2NvZwZjaXJjbGUOY2lyY2xlLW91dGxpbmUTY2lyY2xlLWlubmVyLWNpcmNsZQJoZAZjYW5jZWwGcmVwbGF5CGZhY2Vib29rBWdwbHVzCGxpbmtlZGluB3R3aXR0ZXIGdHVtYmxyCXBpbnRlcmVzdBFhdWRpby1kZXNjcmlwdGlvbgAAAAAA) format("truetype"); + src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAA54AAoAAAAAFmgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAD4AAABWUZFeBWNtYXAAAAE0AAAAOgAAAUriMBC2Z2x5ZgAAAXAAAAouAAAPUFvx6AdoZWFkAAALoAAAACsAAAA2DIPpX2hoZWEAAAvMAAAAGAAAACQOogcgaG10eAAAC+QAAAAPAAAAfNkAAABsb2NhAAAL9AAAAEAAAABAMMg06m1heHAAAAw0AAAAHwAAACABMAB5bmFtZQAADFQAAAElAAACCtXH9aBwb3N0AAANfAAAAPwAAAGBZkSN43icY2BkZ2CcwMDKwMFSyPKMgYHhF4RmjmEIZzzHwMDEwMrMgBUEpLmmMDh8ZPwoxw7iLmSHCDOCCADvEAo+AAB4nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZgYGD7K/f8PUvCREUTzM0DVAwEjG8OIBwCPdwbVAAB4nI1Xe1CU1xX/zv1eLItLln0JwrIfC7sJGET2hRJ2N1GUoBJE8AESQEEhmBHjaB7UuBMTO4GMaSu7aY3RNlOdRPNqO2pqRmuTaSZtR6JJILUZk00a/4imjpmiecB303O/XUgMJOPufvd+99xzzz33nN855y4HHH7EfrGfIxwHRiANvF/sH71I9BzHszmpW+rGOQOXxXE6YhI4PoMT8zkT4cDFuf1cwMrZJI5cglM0HKVv0MaUFDgIFfg9mJJCG+kbKn1JkqBOVaFOkuhLpARq8fu0Nnc9/zdvfY9PxXW4PdH0C6N+PCejhorxFjAqRjgFRXSINEARbBGsoxcFK7IJmr4OycFJnInL59zIXwxui80fkGRbEHyosMWaATJKUfCskmwJQsAWANkmnIGOhlf514h7U8HNIv3owoHB0WMt0Eb3sx0guLi5pq/8Ny1q6969fKR9X9GBV6dPv6dp04K99SOwtmyPl47ApRa6n4ZpP1yjr5fn7MmYP/vXLUJs715UguklHBaHOZHZmG1N9FAIW2mf0MqWCIdo/8RZ1yGfxKUldDcGIbFA7ICO+vqOMSPTh/ZrSqgHi/bB/O8E8Mnzp+M+acxfpsTShBwej26TiGxBn7m4eEIO+Rueu6Hj+IFBnh88cAEUEQ//nVLx5C7kf+yIR47QEe+eMlhz9SqsGbe3hh2R03NGzoY6O42Kz8l7fB6fAk6LYnTyFo/FYyT6GGyNx2Jx2sdH4rA1Fo/HyCXaFyOp8dhYBCfJb2NIn1ImE6CYNGmgSTb52DawJR6jfXEmDU4xyTEmpgHHOIStoxfjSGdkbsK2w2jbdMQG4sgAstEONgURYCwGHhEhhscioQaAhhCf7McifEQc0l6+mxj9nI+gmSdiQ0Zbm7gZnIO7GSMEXG6UDAVocxAV8GcEXCKg1a02RcTtwANWRGIAyElor6n/+ZU2yOB3+T77Hb1MLqhn4KHVnQBjJnqe9QZSon6Kc5DxAD2vMdPL/BXSmQGwspa67z9wLUjdi9TN7QC7lyyBr9rpt7uXVC1CMpyjKRoXnGPHTuiaPLsNdc2dbAFQLAooPkXEh33FodHl4XpC6sPCIa0ftUIhHSYXVSu5iME+DIXsbZJ51BeidCgajcai43jU9nVzoSn2dPqcFvSoxSzJzgRKAx47WMRxOrIj3Wf0+hndxhJTiOkSEqxar3b3RKM9hY64oxBA64ieURLvCfpkDb8siBdUJ1bgT+urJ5PGfewQrmm5R5+0HmfyIPySD7OYkT0WxRePah8oEiyjlxIP74thVoRTURpmL6QhGuWS+QDjdANXjIM8SQa/1w128ODx0Qp4aLMNg9+JL3joUn8AMxW+aLNiuKjarn4uyyTdXjOzZTsh21uwldUvJoYza+zELALfu3p1L8/3krtyZ0Ag058J3hxHghvbGZn0dHZy6Mim/7Blre4lpHd1c28yVqRViO153F2oIWoXCIKbL4Z0cM1iaQn9mI5KuV2SzEvWXJDMNtkANpMdQoDDhIdD4A/YrP6Aye9ysxyE+uOEAcTDorgvVZJjcua043PnZ/PmdDqcbibZlXOOT8uSo7Kof0YUn9GL+Jo17ficymxiTofC6znUso0DhAxs1Fo+kF+d36vLmgZ8mk5cdGv2mwYj5k3Dm9m3LhJ1aVRNm6HrTbLgYAoWXDhDd/u4PGy5CT+xGMdiaBovewUCF/1BiWNljI9MLn7jeScpg+WyH6mfU62eVDql7hsrmvx1ezp/YldE2LhjbkiDnAn8tGy/MW3IXRMYJduvq9HpmIcKuFt+JCtgdGEGKAcF6UacVwIYbVPGfw/+YuNBS4cx/CUHcnyfc+wRDMtTr72mMSBjT/yn/GKSdeDWQUCH6Xoqq5R10RE60gV6erUL0iCti16d0hZjxut4QI/rEpgSh6WjnJXdBXRg1GKCucGJPtFqM27aD1tOqqKonsQ2KsFSSmEpmvRlsR+TcD9OFwrqXxIclL4sJTnGMSuG8KpkZvKdeVIOKDyWSyPLV16/p1QMPbP8NihwUzr47bdnXtwtjdCvqqpO0H+pOvIl3Pzv46e5CT/tQjklXCXXym1AaWY7bzHLkuDMc7ldKCvgxzLn8wYkJLBhEDyK7MT8bTbwbkxbfp+3mKAGsmTBpabSIEECzMIcQlzOPAMKsxMs7uhsnxPLuofPDTc1hkuq6MX9j16YU7CqegcYHbmWYuvAP6tCS97tgWf7dlQvnl25YPavXLVZvrzQPeHCpZmzzEUVq/xzu5sChnSTPTW7oOYmh69z4zL/gk3b+O6hoa733uviP82vnFcbqWlc9tDmZa23LVzaV1yXURi+JX+28NeBuj3+O8IrQ080Vm1eWB4OKjPmrJu7c1udWynvKF6/vs479lSW9+5gZkn+dKfellNGDPllzeULustz+A0bPvhgw7lkvEUwn/N4Ty7U7nhGsEpFkOfy+kutbOh1JQxhVDJumoW11hnkPThznh6FFlhfT+ra1x9sF56kx5YuDzVY9PQYAYA7iblw4frQ4TPCk2MK/xGU3rlmze62trHz6lsko+v+So/do74PT8KVkpJfOErKcv8znrMGsHTNxoEkWy1mYgDB6XBbPaWsuiS6CryGaL6zCjaXBgvtkuyXBua1wOKnh+k7L9AvPnYWffxK18FcJbuosGf3/Jo7amY+CE1vppzY+UTrva0FXc1i55pKQ/YjVL187N5fCn1kW5uot/1hi+DiZ+5atnJR9E+prvydJ9ZZ5mwOpU5gM4KYysMBQ71UzPuMTl9QQOyUo5nwioeYCPjFklrbK6s6X+ypUZ6rum9+CZYzWRiBJfSP0xzzSmrg7f86g0DKVj/wwFzieD9rRfPGFbeKMl05pn5j9/rsQJJ2iEgRrpohlyBo3f4QK7Kl+EcAYZgAoNVmZWXK704YAa3FwBxgSGUOs5htvGRz4Sgj3yFkSJFBuv/sxu5yk998T8WDJzvv/2RX19HtTUW1S+wpKRKRjJ6zzz/1/OPdFdWGlAKbvzS4PHOtURikg9AGz0LbIB85S/cPOpoXvuue8/iV2H1vPTy3ddvOeZ37HGmO3OmSzVzR+NS53+84dHlFhXPLqtzSO+5ruHM2vXtBdxP87LOzKAD359j/INYIbyPabIi3Cq6Wa+SaGe78diIzu7qcblcAa6/fJRvNopXFJnO+U9KKM5bqH5LM0iQSVmpPCPDu7ZT4Aoubz3709EBTyrTDjyx8MQXgUH1nqm7TWng4TzE4i4AsKskBITXfSyC4Fkl5MxnJDiKSIDSJAsGvd1y+/eNDp2e+A+5d8HeiiunrTkT6TqWLIs+/QRoWr98s0qj8uuzLuS22Ytufg3rdTaHn1m46sfgGKHXt0MGnLaRHdnwN37tvHcWKo2V6lnPxL4UvUQcRdOzmZSQs8X5CH5OxXMXpkATuDz8Et0SH4uyCRR+TjmBDP1GvsVrWEGVzEj33YVQ9jAtIKpqsl/s/0xrocwAAeJxjYGRgYADig3cEzsTz23xl4GZnAIHLRucNkWl2BrA4BwMTiAIAF4IITwB4nGNgZGBgZwCChWASxGZkQAXyABOUANh4nGNnYGBgHyAMADa8ANoAAAAAAAAOAFAAZgCyAMYA5gEeAUgBdAGcAfICLgKOAroDCgOOA7AD6gQ4BHwEuAToBQwFogXoBjYGbAbaB3IHqHicY2BkYGCQZ8hlYGcAASYg5gJCBob/YD4DABbVAaoAeJxdkE1qg0AYhl8Tk9AIoVDaVSmzahcF87PMARLIMoFAl0ZHY1BHdBJIT9AT9AQ9RQ9Qeqy+yteNMzDzfM+88w0K4BY/cNAMB6N2bUaPPBLukybCLvleeAAPj8JD+hfhMV7hC3u4wxs7OO4NzQSZcI/8Ltwnfwi75E/hAR7wJTyk/xYeY49fYQ/PztM+jbTZ7LY6OWdBJdX/pqs6NYWa+zMxa13oKrA6Uoerqi/JwtpYxZXJ1coUVmeZUWVlTjq0/tHacjmdxuL90OR8O0UEDYMNdtiSEpz5XQGqzlm30kzUdAYFFOb8R7NOZk0q2lwAyz1i7oAr1xoXvrOgtYhZx8wY5KRV269JZ5yGpmzPTjQhvY9je6vEElPOuJP3mWKnP5M3V+YAAAB4nG2P2XLCMAxFfYFspGUp3Te+IB9lHJF4cOzUS2n/voaEGR6qB+lKo+WITdhga/a/bRnDBFPMkCBFhhwF5ihxg1sssMQKa9xhg3s84BFPeMYLXvGGd3zgE9tZr/hveXKVkFYoSnoeHJXfRoWOqi54mo9ameNFdrK+dLSyaVf7oJQTlkhXpD3Z5XXhR/rUfQVuKXO91Jps4cLOS6/I5YL3XhodRRsVWZe4NnZOhWnSAWgxhMoEr6SmzZieF43Mk7ZOBdeCVGrp9Eu+54J2xhySplfB5XHwQLXUmT9KH6+kPnQ7ZYuIEzNyfs1DLU1VU4SWZ6LkXGHsD1ZKbMw=) format("woff"), url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAAKAIAAAwAgT1MvMlGRXgUAAAEoAAAAVmNtYXDiMBC2AAAB/AAAAUpnbHlmW/HoBwAAA4gAAA9QaGVhZAyD6V8AAADQAAAANmhoZWEOogcgAAAArAAAACRobXR42QAAAAAAAYAAAAB8bG9jYTDINOoAAANIAAAAQG1heHABMAB5AAABCAAAACBuYW1l1cf1oAAAEtgAAAIKcG9zdGZEjeMAABTkAAABgQABAAAHAAAAAKEHAAAAAAAHAAABAAAAAAAAAAAAAAAAAAAAHwABAAAAAQAAwdxheF8PPPUACwcAAAAAANMyzzEAAAAA0zLPMQAAAAAHAAcAAAAACAACAAAAAAAAAAEAAAAfAG0ABwAAAAAAAgAAAAoACgAAAP8AAAAAAAAAAQcAAZAABQAIBHEE5gAAAPoEcQTmAAADXABXAc4AAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA8QHxHgcAAAAAoQcAAAAAAAABAAAAAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAAAAAMAAAADAAAAHAABAAAAAABEAAMAAQAAABwABAAoAAAABgAEAAEAAgAA8R7//wAAAADxAf//AAAPAAABAAAAAAAAAAABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAFAAZgCyAMYA5gEeAUgBdAGcAfICLgKOAroDCgOOA7AD6gQ4BHwEuAToBQwFogXoBjYGbAbaB3IHqAABAAAAAAWLBYsAAgAAAREBAlUDNgWL++oCCwAAAwAAAAAGawZrAAIADgAaAAAJAhMEAAMSAAUkABMCAAEmACc2ADcWABcGAALrAcD+QJX+w/5aCAgBpgE9AT0BpggI/lr+w/3+rgYGAVL9/QFSBgb+rgIwAVABUAGbCP5a/sP+w/5aCAgBpgE9AT0BpvrIBgFS/f0BUgYG/q79/f6uAAAAAgAAAAAFQAWLAAMABwAAASERKQERIREBwAEr/tUCVQErAXUEFvvqBBYAAAAEAAAAAAYgBiAABgATACQAJwAAAS4BJxUXNjcGBxc+ATUmACcVFhIBBwEhESEBEQEGBxU+ATcXNwEHFwTQAWVVuAO7AidxJSgF/t/lpc77t18BYf6fASsBdQE+TF1OijuZX/1gnJwDgGSeK6W4GBhqW3FGnFT0AWM4mjT+9AHrX/6f/kD+iwH2/sI7HZoSRDGYXwSWnJwAAAEAAAAABKsF1gAFAAABESEBEQECCwEqAXb+igRg/kD+iwSq/osAAAACAAAAAAVmBdYABgAMAAABLgEnET4BAREhAREBBWUBZVRUZfwRASsBdf6LA4Bkniv9piueAUT+QP6LBKr+iwAAAwAAAAAGIAYPAAUADAAaAAATESEBEQEFLgEnET4BAxUWEhcGAgcVNgA3JgDgASsBdf6LAsUBZVVVZbqlzgMDzqXlASEFBf7fBGD+QP6LBKr+i+Bkniv9piueAvOaNP70tbX+9DSaOAFi9fUBYgAAAAQAAAAABYsFiwAFAAsAEQAXAAABIxEhNSMDMzUzNSEBIxUhESMDFTMVMxECC5YBduCWluD+igOA4AF2luDglgLr/oqWAgrglvyAlgF2AqCW4AF2AAQAAAAABYsFiwAFAAsAEQAXAAABMxUzESETIxUhESMBMzUzNSETNSMRITUBdeCW/org4AF2lgHAluD+ipaWAXYCVeABdgHAlgF2++rglgHA4P6KlgAAAAACAAAAAAXWBdYADwATAAABIQ4BBxEeARchPgE3ES4BAyERIQVA/IA/VQEBVT8DgD9VAQFVP/yAA4AF1QFVP/yAP1UBAVU/A4A/VfvsA4AAAAYAAAAABmsGawAHAAwAEwAbACAAKAAACQEmJw4BBwElLgEnAQUhATYSNyYFAQYCBxYXIQUeARcBMwEWFz4BNwECvgFkTlSH8GEBEgOONemh/u4C5f3QAXpcaAEB/BP+3VxoAQEOAjD95DXpoQESeP7dTlSH8GH+7gPwAmgSAQFYUP4nd6X2Pv4nS/1zZAEBk01NAfhk/v+TTUhLpfY+Adn+CBIBAVhQAdkAAAAFAAAAAAZrBdYADwATABcAGwAfAAABIQ4BBxEeARchPgE3ES4BASEVIQEhNSEFITUhNSE1IQXV+1ZAVAICVEAEqkBUAgJU+xYBKv7WAur9FgLqAcD+1gEq/RYC6gXVAVU//IA/VQEBVT8DgD9V/ayV/tWVlZWWlQADAAAAAAYgBdYADwAnAD8AAAEhDgEHER4BFyE+ATcRLgEBIzUjFTM1MxUUBgcjLgEnET4BNzMeARUFIzUjFTM1MxUOAQcjLgE1ETQ2NzMeARcFi/vqP1QCAlQ/BBY/VAICVP1rcJWVcCog4CAqAQEqIOAgKgILcJWVcAEqIOAgKiog4CAqAQXVAVU//IA/VQEBVT8DgD9V/fcl4CVKICoBASogASogKgEBKiBKJeAlSiAqAQEqIAEqICoBASogAAAGAAAAAAYgBPYAAwAHAAsADwATABcAABMzNSMRMzUjETM1IwEhNSERITUhERUhNeCVlZWVlZUBKwQV++sEFfvrBBUDNZb+QJUBwJX+QJb+QJUCVZWVAAAAAQAAAAAGIAZsAC4AAAEiBgcBNjQnAR4BMz4BNy4BJw4BBxQXAS4BIw4BBx4BFzI2NwEGBx4BFz4BNy4BBUArSh797AcHAg8eTixffwICf19ffwIH/fEeTixffwICf18sTh4CFAUBA3tcXHsDA3sCTx8bATcZNhkBNB0gAn9fX38CAn9fGxn+zRwgAn9fX38CIBz+yhcaXHsCAntcXXsAAAIAAAAABlkGawBDAE8AAAE2NCc3PgEnAy4BDwEmLwEuASchDgEPAQYHJyYGBwMGFh8BBhQXBw4BFxMeAT8BFh8BHgEXIT4BPwE2NxcWNjcTNiYnBS4BJz4BNx4BFw4BBasFBZ4KBgeWBxkNujpEHAMUD/7WDxQCHEU5ug0aB5UHBQudBQWdCwUHlQcaDbo5RRwCFA8BKg8UAhxFOboNGgeVBwUL/ThvlAIClG9vlAIClAM3JEokewkaDQEDDAkFSy0cxg4RAQERDsYcLUsFCQz+/QwbCXskSiR7CRoN/v0MCQVLLRzGDhEBAREOxhwtSwUJDAEDDBsJQQKUb2+UAgKUb2+UAAAAAAEAAAAABmsGawALAAATEgAFJAATAgAlBACVCAGmAT0BPQGmCAj+Wv7D/sP+WgOA/sP+WggIAaYBPQE9AaYICP5aAAAAAgAAAAAGawZrAAsAFwAAAQQAAxIABSQAEwIAASYAJzYANxYAFwYAA4D+w/5aCAgBpgE9AT0BpggI/lr+w/3+rgYGAVL9/QFSBgb+rgZrCP5a/sP+w/5aCAgBpgE9AT0BpvrIBgFS/f0BUgYG/q79/f6uAAADAAAAAAZrBmsACwAXACMAAAEEAAMSAAUkABMCAAEmACc2ADcWABcGAAMOAQcuASc+ATceAQOA/sP+WggIAaYBPQE9AaYICP5a/sP9/q4GBgFS/f0BUgYG/q4dAn9fX38CAn9fX38Gawj+Wv7D/sP+WggIAaYBPQE9Aab6yAYBUv39AVIGBv6u/f3+rgJPX38CAn9fX38CAn8AAAAEAAAAAAYgBiAADwAbACUAKQAAASEOAQcRHgEXIT4BNxEuAQEjNSMVIxEzFTM1OwEhHgEXEQ4BByE3MzUjBYv76j9UAgJUPwQWP1QCAlT9a3CVcHCVcJYBKiAqAQEqIP7WcJWVBiACVD/76j9UAgJUPwQWP1T8gpWVAcC7uwEqIP7WICoBcOAAAgAAAAAGawZrAAsAFwAAAQQAAxIABSQAEwIAEwcJAScJATcJARcBA4D+w/5aCAgBpgE9AT0BpggI/lo4af70/vRpAQv+9WkBDAEMaf71BmsI/lr+w/7D/loICAGmAT0BPQGm/BFpAQv+9WkBDAEMaf71AQtp/vQAAQAAAAAF1ga2ABYAAAERCQERHgEXDgEHLgEnIxYAFzYANyYAA4D+iwF1vv0FBf2+vv0FlQYBUf7+AVEGBv6vBYsBKv6L/osBKgT9v779BQX9vv7+rwYGAVH+/gFRAAAAAQAAAAAFPwcAABQAAAERIyIGHQEhAyMRIREjETM1NDYzMgU/nVY8ASUn/v7O///QrZMG9P74SEi9/tj9CQL3ASjaus0AAAAABAAAAAAGjgcAADAARQBgAGwAAAEUHgMVFAcGBCMiJicmNTQ2NzYlLgE1NDcGIyImNTQ2Nz4BMyEHIx4BFRQOAycyNjc2NTQuAiMiBgcGFRQeAxMyPgI1NC4BLwEmLwImIyIOAxUUHgIBMxUjFSM1IzUzNTMDH0BbWkAwSP7qn4TlOSVZSoMBESAfFS4WlMtIP03TcAGiioNKTDFFRjGSJlAaNSI/akAqURkvFCs9WTY6a1s3Dg8THgocJU4QIDVob1M2RnF9A2vV1WnU1GkD5CRFQ1CATlpTenNTYDxHUYouUhIqQCkkMQTBlFKaNkJAWD+MWkhzRztAPiEbOWY6hn1SJyE7ZS5nZ1I0/JcaNF4+GTAkGCMLFx04Ag4kOF07Rms7HQNsbNvbbNkAAwAAAAAGgAZsAAMADgAqAAABESERARYGKwEiJjQ2MhYBESERNCYjIgYHBhURIRIQLwEhFSM+AzMyFgHd/rYBXwFnVAJSZGemZASP/rdRVj9VFQv+twIBAQFJAhQqR2c/q9AEj/whA98BMkliYpNhYfzd/cgCEml3RTMeM/3XAY8B8DAwkCAwOB/jAAABAAAAAAaUBgAAMQAAAQYHFhUUAg4BBCMgJxYzMjcuAScWMzI3LgE9ARYXLgE1NDcWBBcmNTQ2MzIXNjcGBzYGlENfAUyb1v7SrP7x4SMr4bBpph8hHCsqcJNETkJOLHkBW8YIvYaMYG1gJWldBWhiRQ4cgv797rdtkQSKAn1hBQsXsXUEJgMsjlNYS5WzCiYkhr1mFTlzPwoAAAABAAAAAAWABwAAIgAAARcOAQcGLgM1ESM1PgQ3PgE7AREhFSERFB4CNzYFMFAXsFlorXBOIahIckQwFAUBBwT0AU3+sg0gQzBOAc/tIz4BAjhceHg6AiDXGlddb1ctBQf+WPz9+h40NR4BAgABAAAAAAaABoAASgAAARQCBCMiJzY/AR4BMzI+ATU0LgEjIg4DFRQWFxY/ATY3NicmNTQ2MzIWFRQGIyImNz4CNTQmIyIGFRQXAwYXJgI1NBIkIAQSBoDO/p/Rb2s7EzYUaj15vmh34o5ptn9bK1BNHggIBgIGETPRqZepiWs9Sg4IJRc2Mj5WGWMRBM7+zgFhAaIBYc4DgNH+n84gXUfTJzmJ8JZyyH46YH2GQ2ieIAwgHxgGFxQ9WpfZpIOq7lc9I3VZHzJCclVJMf5eRmtbAXzp0QFhzs7+nwAABwAAAAAHAATPAA4AFwAqAD0AUABaAF0AAAERNh4CBw4BBwYmIycmNxY2NzYmBxEUBRY2Nz4BNy4BJyMGHwEeARcOARcWNjc+ATcuAScjBh8BHgEXFAYXFjY3PgE3LgEnIwYfAR4BFw4BBTM/ARUzESMGAyUVJwMchM2UWwgNq4JHrQgBAapUaAoJcWMBfiIhDiMrAQJLMB0BBAokNAIBPmMiIQ4iLAECSzAeAQUKJDQBP2MiIQ4iLAECSzAeAQUKJDQBAT75g+5B4arNLNIBJ44ByQL9BQ9mvYCKwA8FBQMDwwJVTGdzBf6VB8IHNR08lld9uT4LCRA/qGNxvUwHNR08lld9uT4LCRA/qGNxvUwHNR08lld9uT4LCRA/qGNxvVJkAWUDDEf+tYP5AQAAAAEAAAAABiAGtgAbAAABBAADER4BFzMRITU2ADcWABcVIREzPgE3EQIAA4D+4v6FBwJ/X+D+1QYBJ97eAScG/tXgX38CB/6FBrUH/oX+4v32X38CAlWV3gEnBgb+2d6V/asCf18CCgEeAXsAAAAAEADGAAEAAAAAAAEABwAAAAEAAAAAAAIABwAHAAEAAAAAAAMABwAOAAEAAAAAAAQABwAVAAEAAAAAAAUACwAcAAEAAAAAAAYABwAnAAEAAAAAAAoAKwAuAAEAAAAAAAsAEwBZAAMAAQQJAAEADgBsAAMAAQQJAAIADgB6AAMAAQQJAAMADgCIAAMAAQQJAAQADgCWAAMAAQQJAAUAFgCkAAMAAQQJAAYADgC6AAMAAQQJAAoAVgDIAAMAAQQJAAsAJgEeVmlkZW9KU1JlZ3VsYXJWaWRlb0pTVmlkZW9KU1ZlcnNpb24gMS4wVmlkZW9KU0dlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAFYAaQBkAGUAbwBKAFMAUgBlAGcAdQBsAGEAcgBWAGkAZABlAG8ASgBTAFYAaQBkAGUAbwBKAFMAVgBlAHIAcwBpAG8AbgAgADEALgAwAFYAaQBkAGUAbwBKAFMARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAgAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAABAgEDAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8EcGxheQtwbGF5LWNpcmNsZQVwYXVzZQt2b2x1bWUtbXV0ZQp2b2x1bWUtbG93CnZvbHVtZS1taWQLdm9sdW1lLWhpZ2gQZnVsbHNjcmVlbi1lbnRlcg9mdWxsc2NyZWVuLWV4aXQGc3F1YXJlB3NwaW5uZXIJc3VidGl0bGVzCGNhcHRpb25zCGNoYXB0ZXJzBXNoYXJlA2NvZwZjaXJjbGUOY2lyY2xlLW91dGxpbmUTY2lyY2xlLWlubmVyLWNpcmNsZQJoZAZjYW5jZWwGcmVwbGF5CGZhY2Vib29rBWdwbHVzCGxpbmtlZGluB3R3aXR0ZXIGdHVtYmxyCXBpbnRlcmVzdBFhdWRpby1kZXNjcmlwdGlvbgVhdWRpbwAAAAAA) format("truetype"); font-weight: normal; font-style: normal; } @@ -23,21 +23,21 @@ font-weight: normal; font-style: normal; } .vjs-icon-play:before, .video-js .vjs-big-play-button:before, .video-js .vjs-play-control:before { - content: '\f101'; } + content: "\f101"; } .vjs-icon-play-circle { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-play-circle:before { - content: '\f102'; } + content: "\f102"; } .vjs-icon-pause, .video-js .vjs-play-control.vjs-playing { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-pause:before, .video-js .vjs-play-control.vjs-playing:before { - content: '\f103'; } + content: "\f103"; } .vjs-icon-volume-mute, .video-js .vjs-mute-control.vjs-vol-0, .video-js .vjs-volume-menu-button.vjs-vol-0 { @@ -46,7 +46,7 @@ font-style: normal; } .vjs-icon-volume-mute:before, .video-js .vjs-mute-control.vjs-vol-0:before, .video-js .vjs-volume-menu-button.vjs-vol-0:before { - content: '\f104'; } + content: "\f104"; } .vjs-icon-volume-low, .video-js .vjs-mute-control.vjs-vol-1, .video-js .vjs-volume-menu-button.vjs-vol-1 { @@ -55,7 +55,7 @@ font-style: normal; } .vjs-icon-volume-low:before, .video-js .vjs-mute-control.vjs-vol-1:before, .video-js .vjs-volume-menu-button.vjs-vol-1:before { - content: '\f105'; } + content: "\f105"; } .vjs-icon-volume-mid, .video-js .vjs-mute-control.vjs-vol-2, .video-js .vjs-volume-menu-button.vjs-vol-2 { @@ -64,7 +64,7 @@ font-style: normal; } .vjs-icon-volume-mid:before, .video-js .vjs-mute-control.vjs-vol-2:before, .video-js .vjs-volume-menu-button.vjs-vol-2:before { - content: '\f106'; } + content: "\f106"; } .vjs-icon-volume-high, .video-js .vjs-mute-control, .video-js .vjs-volume-menu-button { @@ -73,161 +73,168 @@ font-style: normal; } .vjs-icon-volume-high:before, .video-js .vjs-mute-control:before, .video-js .vjs-volume-menu-button:before { - content: '\f107'; } + content: "\f107"; } .vjs-icon-fullscreen-enter, .video-js .vjs-fullscreen-control { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-fullscreen-enter:before, .video-js .vjs-fullscreen-control:before { - content: '\f108'; } + content: "\f108"; } .vjs-icon-fullscreen-exit, .video-js.vjs-fullscreen .vjs-fullscreen-control { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-fullscreen-exit:before, .video-js.vjs-fullscreen .vjs-fullscreen-control:before { - content: '\f109'; } + content: "\f109"; } .vjs-icon-square { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-square:before { - content: '\f10a'; } + content: "\f10a"; } .vjs-icon-spinner { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-spinner:before { - content: '\f10b'; } + content: "\f10b"; } .vjs-icon-subtitles, .video-js .vjs-subtitles-button { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-subtitles:before, .video-js .vjs-subtitles-button:before { - content: '\f10c'; } + content: "\f10c"; } .vjs-icon-captions, .video-js .vjs-captions-button { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-captions:before, .video-js .vjs-captions-button:before { - content: '\f10d'; } + content: "\f10d"; } .vjs-icon-chapters, .video-js .vjs-chapters-button { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-chapters:before, .video-js .vjs-chapters-button:before { - content: '\f10e'; } + content: "\f10e"; } .vjs-icon-share { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-share:before { - content: '\f10f'; } + content: "\f10f"; } .vjs-icon-cog { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-cog:before { - content: '\f110'; } + content: "\f110"; } .vjs-icon-circle, .video-js .vjs-mouse-display, .video-js .vjs-play-progress, .video-js .vjs-volume-level { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-circle:before, .video-js .vjs-mouse-display:before, .video-js .vjs-play-progress:before, .video-js .vjs-volume-level:before { - content: '\f111'; } + content: "\f111"; } .vjs-icon-circle-outline { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-circle-outline:before { - content: '\f112'; } + content: "\f112"; } .vjs-icon-circle-inner-circle { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-circle-inner-circle:before { - content: '\f113'; } + content: "\f113"; } .vjs-icon-hd { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-hd:before { - content: '\f114'; } + content: "\f114"; } .vjs-icon-cancel, .video-js .vjs-control.vjs-close-button { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-cancel:before, .video-js .vjs-control.vjs-close-button:before { - content: '\f115'; } + content: "\f115"; } .vjs-icon-replay { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-replay:before { - content: '\f116'; } + content: "\f116"; } .vjs-icon-facebook { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-facebook:before { - content: '\f117'; } + content: "\f117"; } .vjs-icon-gplus { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-gplus:before { - content: '\f118'; } + content: "\f118"; } .vjs-icon-linkedin { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-linkedin:before { - content: '\f119'; } + content: "\f119"; } .vjs-icon-twitter { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-twitter:before { - content: '\f11a'; } + content: "\f11a"; } .vjs-icon-tumblr { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-tumblr:before { - content: '\f11b'; } + content: "\f11b"; } .vjs-icon-pinterest { font-family: VideoJS; font-weight: normal; font-style: normal; } .vjs-icon-pinterest:before { - content: '\f11c'; } + content: "\f11c"; } -.vjs-icon-audio-description { +.vjs-icon-audio-description, .video-js .vjs-descriptions-button { font-family: VideoJS; font-weight: normal; font-style: normal; } - .vjs-icon-audio-description:before { - content: '\f11d'; } + .vjs-icon-audio-description:before, .video-js .vjs-descriptions-button:before { + content: "\f11d"; } + +.vjs-icon-audio, .video-js .vjs-audio-button { + font-family: VideoJS; + font-weight: normal; + font-style: normal; } + .vjs-icon-audio:before, .video-js .vjs-audio-button:before { + content: "\f11e"; } .video-js { display: block; @@ -317,6 +324,10 @@ body.vjs-full-window { .vjs-hidden { display: none !important; } +.vjs-disabled { + opacity: 0.5; + cursor: default; } + .video-js .vjs-offscreen { height: 1px; left: -9999px; @@ -416,11 +427,18 @@ body.vjs-full-window { .vjs-menu-button { cursor: pointer; } +.vjs-menu-button.vjs-disabled { + cursor: default; } + +.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu { + display: none; } + .vjs-menu .vjs-menu-content { display: block; padding: 0; margin: 0; - overflow: auto; } + overflow: auto; + font-family: Arial, Helvetica, sans-serif; } .vjs-scrubbing .vjs-menu-button:hover .vjs-menu { display: none; } @@ -561,7 +579,7 @@ body.vjs-full-window { transition: visibility 0.1s, opacity 0.1s; } .vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar { - visibility: hidden; + visibility: visible; opacity: 0; -webkit-transition: visibility 1s, opacity 1s; -moz-transition: visibility 1s, opacity 1s; @@ -577,10 +595,6 @@ body.vjs-full-window { opacity: 1; visibility: visible; } -@media \0screen { - .vjs-user-inactive.vjs-playing .vjs-control-bar :before { - content: ""; } } - .vjs-has-started.vjs-no-flex .vjs-control-bar { display: table; } @@ -660,13 +674,16 @@ body.vjs-full-window { /* If we let the font size grow as much as everything else, the current time tooltip ends up ginormous. If you'd like to enable the current time tooltip all the time, this should be disabled to avoid a weird hitch when you roll off the hover. */ +.video-js .vjs-progress-control:hover .vjs-time-tooltip, .video-js .vjs-progress-control:hover .vjs-mouse-display:after, .video-js .vjs-progress-control:hover .vjs-play-progress:after { - display: block; + font-family: Arial, Helvetica, sans-serif; + visibility: visible; font-size: 0.6em; } .video-js .vjs-progress-holder .vjs-play-progress, .video-js .vjs-progress-holder .vjs-load-progress, +.video-js .vjs-progress-holder .vjs-tooltip-progress-bar, .video-js .vjs-progress-holder .vjs-load-progress div { position: absolute; display: block; @@ -688,12 +705,14 @@ body.vjs-full-window { right: -0.5em; font-size: 0.9em; } +.video-js .vjs-time-tooltip, .video-js .vjs-mouse-display:after, .video-js .vjs-play-progress:after { - display: none; + visibility: hidden; + pointer-events: none; position: absolute; top: -3.4em; - right: -1.5em; + right: -1.9em; font-size: 0.9em; color: #000; content: attr(data-current-time); @@ -704,10 +723,14 @@ body.vjs-full-window { -moz-border-radius: 0.3em; border-radius: 0.3em; } +.video-js .vjs-time-tooltip, .video-js .vjs-play-progress:before, .video-js .vjs-play-progress:after { z-index: 1; } +.video-js .vjs-progress-control .vjs-keep-tooltips-inside:after { + display: none; } + .video-js .vjs-load-progress { background: #bfc7d3; background: rgba(115, 133, 159, 0.5); } @@ -719,6 +742,16 @@ body.vjs-full-window { .video-js.vjs-no-flex .vjs-progress-control { width: auto; } +.video-js .vjs-time-tooltip { + display: inline-block; + height: 2.4em; + position: relative; + float: right; + right: -1.9em; } + +.vjs-tooltip-progress-bar { + visibility: hidden; } + .video-js .vjs-progress-control .vjs-mouse-display { display: none; position: absolute; @@ -746,6 +779,7 @@ body.vjs-full-window { .video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display:after { display: none; } +.vjs-mouse-display .vjs-time-tooltip, .video-js .vjs-progress-control .vjs-mouse-display:after { color: #fff; background-color: #000; @@ -872,6 +906,7 @@ body.vjs-full-window { background-repeat: no-repeat; background-position: 50% 50%; background-size: contain; + background-color: #000000; cursor: pointer; margin: 0; padding: 0; @@ -1143,19 +1178,22 @@ video::-webkit-media-text-track-display { .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-current-time, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-time-divider, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-duration, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-remaining-time, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-playback-rate, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-progress-control, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-mute-control, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-control, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-menu-button, -.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-chapters-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-captions-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-subtitles-button { +.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-chapters-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-descriptions-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-captions-button, +.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-subtitles-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-audio-button { display: none; } .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-current-time, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-time-divider, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-duration, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-remaining-time, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-playback-rate, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-mute-control, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-control, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-menu-button, -.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-chapters-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-captions-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-subtitles-button { +.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-chapters-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-descriptions-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-captions-button, +.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-subtitles-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-audio-button { display: none; } .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-current-time, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-time-divider, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-duration, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-remaining-time, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-playback-rate, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-mute-control, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-volume-control, -.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-chapters-button, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-captions-button, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-subtitles-button { +.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-chapters-button, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-descriptions-button, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-captions-button, +.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-subtitles-button .vjs-audio-button { display: none; } .vjs-caption-settings { @@ -1166,13 +1204,13 @@ video::-webkit-media-text-track-display { color: #fff; margin: 0 auto; padding: 0.5em; - height: 15em; + height: 16em; font-size: 12px; width: 40em; } .vjs-caption-settings .vjs-tracksettings { top: 0; - bottom: 2em; + bottom: 1em; left: 0; right: 0; position: absolute; @@ -1195,16 +1233,20 @@ video::-webkit-media-text-track-display { .vjs-caption-settings .vjs-tracksetting { margin: 5px; padding: 3px; - min-height: 40px; } + min-height: 40px; + border: none; } -.vjs-caption-settings .vjs-tracksetting label { +.vjs-caption-settings .vjs-tracksetting label, +.vjs-caption-settings .vjs-tracksetting legend { display: block; width: 100px; margin-bottom: 5px; } .vjs-caption-settings .vjs-tracksetting span { display: inline; - margin-left: 5px; } + margin-left: 5px; + vertical-align: top; + float: right; } .vjs-caption-settings .vjs-tracksetting > div { margin-bottom: 5px; @@ -1218,6 +1260,21 @@ video::-webkit-media-text-track-display { .vjs-caption-settings label > input { margin-right: 10px; } +.vjs-caption-settings fieldset { + margin-top: 1em; + margin-left: .5em; } + +.vjs-caption-settings fieldset .vjs-label { + position: absolute; + clip: rect(1px 1px 1px 1px); + /* for Internet Explorer */ + clip: rect(1px, 1px, 1px, 1px); + padding: 0; + border: 0; + height: 1px; + width: 1px; + overflow: hidden; } + .vjs-caption-settings input[type="button"] { width: 40px; height: 40px; } @@ -1232,3 +1289,19 @@ video::-webkit-media-text-track-display { line-height: 1.5; padding: 20px 24px; z-index: 1; } + +@media print { + .video-js > *:not(.vjs-tech):not(.vjs-poster) { + visibility: hidden; } } + +@media \0screen { + .vjs-user-inactive.vjs-playing .vjs-control-bar :before { + content: ""; + } +} + +@media \0screen { + .vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar { + visibility: hidden; + } +} diff --git a/vendor/videojs/video.js b/vendor/videojs/video.js old mode 100755 new mode 100644 index 5489d28..3ea2b1c --- a/vendor/videojs/video.js +++ b/vendor/videojs/video.js @@ -1,6 +1,6 @@ /** * @license - * Video.js 5.8.8 + * Video.js 5.13.1 * Copyright Brightcove, Inc. * Available under Apache License Version 2.0 * @@ -11,4870 +11,3672 @@ */ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.videojs = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o logs the number of milliseconds it took for the deferred function to be invoked + * @param {Object} player Main Player + * @param {Object=} options Object of option names and values + * @extends Button + * @class BigPlayButton */ -var now = nativeNow || function() { - return new Date().getTime(); -}; +var BigPlayButton = function (_Button) { + _inherits(BigPlayButton, _Button); -module.exports = now; + function BigPlayButton() { + _classCallCheck(this, BigPlayButton); -},{"../internal/getNative":20}],5:[function(_dereq_,module,exports){ -var isObject = _dereq_('../lang/isObject'), - now = _dereq_('../date/now'); + return _possibleConstructorReturn(this, _Button.apply(this, arguments)); + } -/** Used as the `TypeError` message for "Functions" methods. */ -var FUNC_ERROR_TEXT = 'Expected a function'; + /** + * Allow sub components to stack CSS class names + * + * @return {String} The constructed class name + * @method buildCSSClass + */ + BigPlayButton.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-big-play-button'; + }; -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; + /** + * Handles click for play + * + * @method handleClick + */ -/** - * Creates a debounced function that delays invoking `func` until after `wait` - * milliseconds have elapsed since the last time the debounced function was - * invoked. The debounced function comes with a `cancel` method to cancel - * delayed invocations. Provide an options object to indicate that `func` - * should be invoked on the leading and/or trailing edge of the `wait` timeout. - * Subsequent calls to the debounced function return the result of the last - * `func` invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked - * on the trailing edge of the timeout only if the the debounced function is - * invoked more than once during the `wait` timeout. - * - * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation) - * for details over the differences between `_.debounce` and `_.throttle`. - * - * @static - * @memberOf _ - * @category Function - * @param {Function} func The function to debounce. - * @param {number} [wait=0] The number of milliseconds to delay. - * @param {Object} [options] The options object. - * @param {boolean} [options.leading=false] Specify invoking on the leading - * edge of the timeout. - * @param {number} [options.maxWait] The maximum time `func` is allowed to be - * delayed before it's invoked. - * @param {boolean} [options.trailing=true] Specify invoking on the trailing - * edge of the timeout. - * @returns {Function} Returns the new debounced function. - * @example - * - * // avoid costly calculations while the window size is in flux - * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); - * - * // invoke `sendMail` when the click event is fired, debouncing subsequent calls - * jQuery('#postbox').on('click', _.debounce(sendMail, 300, { - * 'leading': true, - * 'trailing': false - * })); - * - * // ensure `batchLog` is invoked once after 1 second of debounced calls - * var source = new EventSource('/stream'); - * jQuery(source).on('message', _.debounce(batchLog, 250, { - * 'maxWait': 1000 - * })); - * - * // cancel a debounced call - * var todoChanges = _.debounce(batchLog, 1000); - * Object.observe(models.todo, todoChanges); - * - * Object.observe(models, function(changes) { - * if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) { - * todoChanges.cancel(); - * } - * }, ['delete']); - * - * // ...at some point `models.todo` is changed - * models.todo.completed = true; - * - * // ...before 1 second has passed `models.todo` is deleted - * // which cancels the debounced `todoChanges` call - * delete models.todo; - */ -function debounce(func, wait, options) { - var args, - maxTimeoutId, - result, - stamp, - thisArg, - timeoutId, - trailingCall, - lastCalled = 0, - maxWait = false, - trailing = true; - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - wait = wait < 0 ? 0 : (+wait || 0); - if (options === true) { - var leading = true; - trailing = false; - } else if (isObject(options)) { - leading = !!options.leading; - maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait); - trailing = 'trailing' in options ? !!options.trailing : trailing; - } + BigPlayButton.prototype.handleClick = function handleClick() { + this.player_.play(); + }; - function cancel() { - if (timeoutId) { - clearTimeout(timeoutId); - } - if (maxTimeoutId) { - clearTimeout(maxTimeoutId); - } - lastCalled = 0; - maxTimeoutId = timeoutId = trailingCall = undefined; - } + return BigPlayButton; +}(_button2['default']); - function complete(isCalled, id) { - if (id) { - clearTimeout(id); - } - maxTimeoutId = timeoutId = trailingCall = undefined; - if (isCalled) { - lastCalled = now(); - result = func.apply(thisArg, args); - if (!timeoutId && !maxTimeoutId) { - args = thisArg = undefined; - } - } - } +BigPlayButton.prototype.controlText_ = 'Play Video'; - function delayed() { - var remaining = wait - (now() - stamp); - if (remaining <= 0 || remaining > wait) { - complete(trailingCall, maxTimeoutId); - } else { - timeoutId = setTimeout(delayed, remaining); - } - } +_component2['default'].registerComponent('BigPlayButton', BigPlayButton); +exports['default'] = BigPlayButton; - function maxDelayed() { - complete(trailing, timeoutId); - } +},{"2":2,"5":5}],2:[function(_dereq_,module,exports){ +'use strict'; - function debounced() { - args = arguments; - stamp = now(); - thisArg = this; - trailingCall = trailing && (timeoutId || !leading); +exports.__esModule = true; - if (maxWait === false) { - var leadingCall = leading && !timeoutId; - } else { - if (!maxTimeoutId && !leading) { - lastCalled = stamp; - } - var remaining = maxWait - (stamp - lastCalled), - isCalled = remaining <= 0 || remaining > maxWait; +var _clickableComponent = _dereq_(3); - if (isCalled) { - if (maxTimeoutId) { - maxTimeoutId = clearTimeout(maxTimeoutId); - } - lastCalled = stamp; - result = func.apply(thisArg, args); - } - else if (!maxTimeoutId) { - maxTimeoutId = setTimeout(maxDelayed, remaining); - } - } - if (isCalled && timeoutId) { - timeoutId = clearTimeout(timeoutId); - } - else if (!timeoutId && wait !== maxWait) { - timeoutId = setTimeout(delayed, wait); - } - if (leadingCall) { - isCalled = true; - result = func.apply(thisArg, args); - } - if (isCalled && !timeoutId && !maxTimeoutId) { - args = thisArg = undefined; - } - return result; - } - debounced.cancel = cancel; - return debounced; -} +var _clickableComponent2 = _interopRequireDefault(_clickableComponent); -module.exports = debounce; +var _component = _dereq_(5); -},{"../date/now":4,"../lang/isObject":33}],6:[function(_dereq_,module,exports){ -/** Used as the `TypeError` message for "Functions" methods. */ -var FUNC_ERROR_TEXT = 'Expected a function'; +var _component2 = _interopRequireDefault(_component); -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; +var _log = _dereq_(87); -/** - * Creates a function that invokes `func` with the `this` binding of the - * created function and arguments from `start` and beyond provided as an array. - * - * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters). - * - * @static - * @memberOf _ - * @category Function - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @returns {Function} Returns the new function. - * @example - * - * var say = _.restParam(function(what, names) { - * return what + ' ' + _.initial(names).join(', ') + - * (_.size(names) > 1 ? ', & ' : '') + _.last(names); - * }); - * - * say('hello', 'fred', 'barney', 'pebbles'); - * // => 'hello fred, barney, & pebbles' - */ -function restParam(func, start) { - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0); - return function() { - var args = arguments, - index = -1, - length = nativeMax(args.length - start, 0), - rest = Array(length); +var _log2 = _interopRequireDefault(_log); - while (++index < length) { - rest[index] = args[start + index]; - } - switch (start) { - case 0: return func.call(this, rest); - case 1: return func.call(this, args[0], rest); - case 2: return func.call(this, args[0], args[1], rest); - } - var otherArgs = Array(start + 1); - index = -1; - while (++index < start) { - otherArgs[index] = args[index]; - } - otherArgs[start] = rest; - return func.apply(this, otherArgs); - }; -} +var _object = _dereq_(139); -module.exports = restParam; +var _object2 = _interopRequireDefault(_object); -},{}],7:[function(_dereq_,module,exports){ -var debounce = _dereq_('./debounce'), - isObject = _dereq_('../lang/isObject'); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -/** Used as the `TypeError` message for "Functions" methods. */ -var FUNC_ERROR_TEXT = 'Expected a function'; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -/** - * Creates a throttled function that only invokes `func` at most once per - * every `wait` milliseconds. The throttled function comes with a `cancel` - * method to cancel delayed invocations. Provide an options object to indicate - * that `func` should be invoked on the leading and/or trailing edge of the - * `wait` timeout. Subsequent calls to the throttled function return the - * result of the last `func` call. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked - * on the trailing edge of the timeout only if the the throttled function is - * invoked more than once during the `wait` timeout. - * - * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation) - * for details over the differences between `_.throttle` and `_.debounce`. - * - * @static - * @memberOf _ - * @category Function - * @param {Function} func The function to throttle. - * @param {number} [wait=0] The number of milliseconds to throttle invocations to. - * @param {Object} [options] The options object. - * @param {boolean} [options.leading=true] Specify invoking on the leading - * edge of the timeout. - * @param {boolean} [options.trailing=true] Specify invoking on the trailing - * edge of the timeout. - * @returns {Function} Returns the new throttled function. - * @example - * - * // avoid excessively updating the position while scrolling - * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); - * - * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes - * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, { - * 'trailing': false - * })); - * - * // cancel a trailing throttled call - * jQuery(window).on('popstate', throttled.cancel); - */ -function throttle(func, wait, options) { - var leading = true, - trailing = true; +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - if (options === false) { - leading = false; - } else if (isObject(options)) { - leading = 'leading' in options ? !!options.leading : leading; - trailing = 'trailing' in options ? !!options.trailing : trailing; - } - return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing }); -} +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file button.js + */ -module.exports = throttle; -},{"../lang/isObject":33,"./debounce":5}],8:[function(_dereq_,module,exports){ /** - * Copies the values of `source` to `array`. + * Base class for all buttons * - * @private - * @param {Array} source The array to copy values from. - * @param {Array} [array=[]] The array to copy values to. - * @returns {Array} Returns `array`. + * @param {Object} player Main Player + * @param {Object=} options Object of option names and values + * @extends ClickableComponent + * @class Button */ -function arrayCopy(source, array) { - var index = -1, - length = source.length; +var Button = function (_ClickableComponent) { + _inherits(Button, _ClickableComponent); - array || (array = Array(length)); - while (++index < length) { - array[index] = source[index]; + function Button() { + _classCallCheck(this, Button); + + return _possibleConstructorReturn(this, _ClickableComponent.apply(this, arguments)); } - return array; -} -module.exports = arrayCopy; + /** + * Create the component's DOM element + * + * @param {String=} type Element's node type. e.g. 'div' + * @param {Object=} props An object of properties that should be set on the element + * @param {Object=} attributes An object of attributes that should be set on the element + * @return {Element} + * @method createEl + */ + Button.prototype.createEl = function createEl() { + var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'button'; + var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; -},{}],9:[function(_dereq_,module,exports){ -/** - * A specialized version of `_.forEach` for arrays without support for callback - * shorthands and `this` binding. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns `array`. - */ -function arrayEach(array, iteratee) { - var index = -1, - length = array.length; + props = (0, _object2['default'])({ + className: this.buildCSSClass() + }, props); - while (++index < length) { - if (iteratee(array[index], index, array) === false) { - break; + if (tag !== 'button') { + _log2['default'].warn('Creating a Button with an HTML element of ' + tag + ' is deprecated; use ClickableComponent instead.'); + + // Add properties for clickable element which is not a native HTML button + props = (0, _object2['default'])({ + tabIndex: 0 + }, props); + + // Add ARIA attributes for clickable element which is not a native HTML button + attributes = (0, _object2['default'])({ + role: 'button' + }, attributes); } - } - return array; -} -module.exports = arrayEach; + // Add attributes for button element + attributes = (0, _object2['default'])({ -},{}],10:[function(_dereq_,module,exports){ -/** - * Copies properties of `source` to `object`. - * - * @private - * @param {Object} source The object to copy properties from. - * @param {Array} props The property names to copy. - * @param {Object} [object={}] The object to copy properties to. - * @returns {Object} Returns `object`. - */ -function baseCopy(source, props, object) { - object || (object = {}); + // Necessary since the default button type is "submit" + 'type': 'button', - var index = -1, - length = props.length; + // let the screen reader user know that the text of the button may change + 'aria-live': 'polite' + }, attributes); - while (++index < length) { - var key = props[index]; - object[key] = source[key]; - } - return object; -} + var el = _component2['default'].prototype.createEl.call(this, tag, props, attributes); -module.exports = baseCopy; + this.createControlTextEl(el); -},{}],11:[function(_dereq_,module,exports){ -var createBaseFor = _dereq_('./createBaseFor'); + return el; + }; -/** - * The base implementation of `baseForIn` and `baseForOwn` which iterates - * over `object` properties returned by `keysFunc` invoking `iteratee` for - * each property. Iteratee functions may exit iteration early by explicitly - * returning `false`. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {Function} keysFunc The function to get the keys of `object`. - * @returns {Object} Returns `object`. - */ -var baseFor = createBaseFor(); + /** + * Adds a child component inside this button + * + * @param {String|Component} child The class name or instance of a child to add + * @param {Object=} options Options, including options to be passed to children of the child. + * @return {Component} The child component (created by this process if a string was used) + * @deprecated + * @method addChild + */ -module.exports = baseFor; -},{"./createBaseFor":18}],12:[function(_dereq_,module,exports){ -var baseFor = _dereq_('./baseFor'), - keysIn = _dereq_('../object/keysIn'); + Button.prototype.addChild = function addChild(child) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; -/** - * The base implementation of `_.forIn` without support for callback - * shorthands and `this` binding. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Object} Returns `object`. - */ -function baseForIn(object, iteratee) { - return baseFor(object, iteratee, keysIn); -} + var className = this.constructor.name; -module.exports = baseForIn; + _log2['default'].warn('Adding an actionable (user controllable) child to a Button (' + className + ') is not supported; use a ClickableComponent instead.'); -},{"../object/keysIn":39,"./baseFor":11}],13:[function(_dereq_,module,exports){ -var arrayEach = _dereq_('./arrayEach'), - baseMergeDeep = _dereq_('./baseMergeDeep'), - isArray = _dereq_('../lang/isArray'), - isArrayLike = _dereq_('./isArrayLike'), - isObject = _dereq_('../lang/isObject'), - isObjectLike = _dereq_('./isObjectLike'), - isTypedArray = _dereq_('../lang/isTypedArray'), - keys = _dereq_('../object/keys'); + // Avoid the error message generated by ClickableComponent's addChild method + return _component2['default'].prototype.addChild.call(this, child, options); + }; -/** - * The base implementation of `_.merge` without support for argument juggling, - * multiple sources, and `this` binding `customizer` functions. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @param {Function} [customizer] The function to customize merged values. - * @param {Array} [stackA=[]] Tracks traversed source objects. - * @param {Array} [stackB=[]] Associates values with source counterparts. - * @returns {Object} Returns `object`. - */ -function baseMerge(object, source, customizer, stackA, stackB) { - if (!isObject(object)) { - return object; - } - var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)), - props = isSrcArr ? undefined : keys(source); + /** + * Enable the button element + * + * @return {Component} + * @method enable + */ - arrayEach(props || source, function(srcValue, key) { - if (props) { - key = srcValue; - srcValue = source[key]; - } - if (isObjectLike(srcValue)) { - stackA || (stackA = []); - stackB || (stackB = []); - baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB); - } - else { - var value = object[key], - result = customizer ? customizer(value, srcValue, key, object, source) : undefined, - isCommon = result === undefined; - if (isCommon) { - result = srcValue; - } - if ((result !== undefined || (isSrcArr && !(key in object))) && - (isCommon || (result === result ? (result !== value) : (value === value)))) { - object[key] = result; - } - } - }); - return object; -} + Button.prototype.enable = function enable() { + _ClickableComponent.prototype.enable.call(this); + this.el_.removeAttribute('disabled'); + }; -module.exports = baseMerge; + /** + * Disable the button element + * + * @return {Component} + * @method disable + */ -},{"../lang/isArray":30,"../lang/isObject":33,"../lang/isTypedArray":36,"../object/keys":38,"./arrayEach":9,"./baseMergeDeep":14,"./isArrayLike":21,"./isObjectLike":26}],14:[function(_dereq_,module,exports){ -var arrayCopy = _dereq_('./arrayCopy'), - isArguments = _dereq_('../lang/isArguments'), - isArray = _dereq_('../lang/isArray'), - isArrayLike = _dereq_('./isArrayLike'), - isPlainObject = _dereq_('../lang/isPlainObject'), - isTypedArray = _dereq_('../lang/isTypedArray'), - toPlainObject = _dereq_('../lang/toPlainObject'); -/** - * A specialized version of `baseMerge` for arrays and objects which performs - * deep merges and tracks traversed objects enabling objects with circular - * references to be merged. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @param {string} key The key of the value to merge. - * @param {Function} mergeFunc The function to merge values. - * @param {Function} [customizer] The function to customize merged values. - * @param {Array} [stackA=[]] Tracks traversed source objects. - * @param {Array} [stackB=[]] Associates values with source counterparts. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ -function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) { - var length = stackA.length, - srcValue = source[key]; + Button.prototype.disable = function disable() { + _ClickableComponent.prototype.disable.call(this); + this.el_.setAttribute('disabled', 'disabled'); + }; - while (length--) { - if (stackA[length] == srcValue) { - object[key] = stackB[length]; + /** + * Handle KeyPress (document level) - Extend with specific functionality for button + * + * @method handleKeyPress + */ + + + Button.prototype.handleKeyPress = function handleKeyPress(event) { + + // Ignore Space (32) or Enter (13) key operation, which is handled by the browser for a button. + if (event.which === 32 || event.which === 13) { return; } - } - var value = object[key], - result = customizer ? customizer(value, srcValue, key, object, source) : undefined, - isCommon = result === undefined; - if (isCommon) { - result = srcValue; - if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) { - result = isArray(value) - ? value - : (isArrayLike(value) ? arrayCopy(value) : []); - } - else if (isPlainObject(srcValue) || isArguments(srcValue)) { - result = isArguments(value) - ? toPlainObject(value) - : (isPlainObject(value) ? value : {}); - } - else { - isCommon = false; - } - } - // Add the source value to the stack of traversed objects and associate - // it with its merged value. - stackA.push(srcValue); - stackB.push(result); + // Pass keypress handling up for unsupported keys + _ClickableComponent.prototype.handleKeyPress.call(this, event); + }; - if (isCommon) { - // Recursively merge objects and arrays (susceptible to call stack limits). - object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB); - } else if (result === result ? (result !== value) : (value === value)) { - object[key] = result; - } -} + return Button; +}(_clickableComponent2['default']); -module.exports = baseMergeDeep; +_component2['default'].registerComponent('Button', Button); +exports['default'] = Button; -},{"../lang/isArguments":29,"../lang/isArray":30,"../lang/isPlainObject":34,"../lang/isTypedArray":36,"../lang/toPlainObject":37,"./arrayCopy":8,"./isArrayLike":21}],15:[function(_dereq_,module,exports){ -var toObject = _dereq_('./toObject'); +},{"139":139,"3":3,"5":5,"87":87}],3:[function(_dereq_,module,exports){ +'use strict'; -/** - * The base implementation of `_.property` without support for deep paths. - * - * @private - * @param {string} key The key of the property to get. - * @returns {Function} Returns the new function. - */ -function baseProperty(key) { - return function(object) { - return object == null ? undefined : toObject(object)[key]; - }; -} +exports.__esModule = true; -module.exports = baseProperty; +var _component = _dereq_(5); -},{"./toObject":28}],16:[function(_dereq_,module,exports){ -var identity = _dereq_('../utility/identity'); +var _component2 = _interopRequireDefault(_component); -/** - * A specialized version of `baseCallback` which only supports `this` binding - * and specifying the number of arguments to provide to `func`. - * - * @private - * @param {Function} func The function to bind. - * @param {*} thisArg The `this` binding of `func`. - * @param {number} [argCount] The number of arguments to provide to `func`. - * @returns {Function} Returns the callback. - */ -function bindCallback(func, thisArg, argCount) { - if (typeof func != 'function') { - return identity; - } - if (thisArg === undefined) { - return func; - } - switch (argCount) { - case 1: return function(value) { - return func.call(thisArg, value); - }; - case 3: return function(value, index, collection) { - return func.call(thisArg, value, index, collection); - }; - case 4: return function(accumulator, value, index, collection) { - return func.call(thisArg, accumulator, value, index, collection); - }; - case 5: return function(value, other, key, object, source) { - return func.call(thisArg, value, other, key, object, source); - }; - } - return function() { - return func.apply(thisArg, arguments); - }; -} +var _dom = _dereq_(82); -module.exports = bindCallback; +var Dom = _interopRequireWildcard(_dom); -},{"../utility/identity":42}],17:[function(_dereq_,module,exports){ -var bindCallback = _dereq_('./bindCallback'), - isIterateeCall = _dereq_('./isIterateeCall'), - restParam = _dereq_('../function/restParam'); +var _events = _dereq_(83); -/** - * Creates a `_.assign`, `_.defaults`, or `_.merge` function. - * - * @private - * @param {Function} assigner The function to assign values. - * @returns {Function} Returns the new assigner function. - */ -function createAssigner(assigner) { - return restParam(function(object, sources) { - var index = -1, - length = object == null ? 0 : sources.length, - customizer = length > 2 ? sources[length - 2] : undefined, - guard = length > 2 ? sources[2] : undefined, - thisArg = length > 1 ? sources[length - 1] : undefined; +var Events = _interopRequireWildcard(_events); - if (typeof customizer == 'function') { - customizer = bindCallback(customizer, thisArg, 5); - length -= 2; - } else { - customizer = typeof thisArg == 'function' ? thisArg : undefined; - length -= (customizer ? 1 : 0); - } - if (guard && isIterateeCall(sources[0], sources[1], guard)) { - customizer = length < 3 ? undefined : customizer; - length = 1; - } - while (++index < length) { - var source = sources[index]; - if (source) { - assigner(object, source, customizer); - } - } - return object; - }); -} +var _fn = _dereq_(84); -module.exports = createAssigner; +var Fn = _interopRequireWildcard(_fn); -},{"../function/restParam":6,"./bindCallback":16,"./isIterateeCall":24}],18:[function(_dereq_,module,exports){ -var toObject = _dereq_('./toObject'); +var _log = _dereq_(87); -/** - * Creates a base function for `_.forIn` or `_.forInRight`. - * - * @private - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new base function. - */ -function createBaseFor(fromRight) { - return function(object, iteratee, keysFunc) { - var iterable = toObject(object), - props = keysFunc(object), - length = props.length, - index = fromRight ? length : -1; +var _log2 = _interopRequireDefault(_log); - while ((fromRight ? index-- : ++index < length)) { - var key = props[index]; - if (iteratee(iterable[key], key, iterable) === false) { - break; - } - } - return object; - }; -} +var _document = _dereq_(95); -module.exports = createBaseFor; +var _document2 = _interopRequireDefault(_document); -},{"./toObject":28}],19:[function(_dereq_,module,exports){ -var baseProperty = _dereq_('./baseProperty'); +var _object = _dereq_(139); -/** - * Gets the "length" property value of `object`. - * - * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) - * that affects Safari on at least iOS 8.1-8.3 ARM64. - * - * @private - * @param {Object} object The object to query. - * @returns {*} Returns the "length" value. - */ -var getLength = baseProperty('length'); +var _object2 = _interopRequireDefault(_object); -module.exports = getLength; +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -},{"./baseProperty":15}],20:[function(_dereq_,module,exports){ -var isNative = _dereq_('../lang/isNative'); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -/** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ -function getNative(object, key) { - var value = object == null ? undefined : object[key]; - return isNative(value) ? value : undefined; -} +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -module.exports = getNative; +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file button.js + */ -},{"../lang/isNative":32}],21:[function(_dereq_,module,exports){ -var getLength = _dereq_('./getLength'), - isLength = _dereq_('./isLength'); /** - * Checks if `value` is array-like. + * Clickable Component which is clickable or keyboard actionable, but is not a native HTML button * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @param {Object} player Main Player + * @param {Object=} options Object of option names and values + * @extends Component + * @class ClickableComponent */ -function isArrayLike(value) { - return value != null && isLength(getLength(value)); -} +var ClickableComponent = function (_Component) { + _inherits(ClickableComponent, _Component); -module.exports = isArrayLike; + function ClickableComponent(player, options) { + _classCallCheck(this, ClickableComponent); -},{"./getLength":19,"./isLength":25}],22:[function(_dereq_,module,exports){ -/** - * Checks if `value` is a host object in IE < 9. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a host object, else `false`. - */ -var isHostObject = (function() { - try { - Object({ 'toString': 0 } + ''); - } catch(e) { - return function() { return false; }; + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options)); + + _this.emitTapEvents(); + + _this.enable(); + return _this; } - return function(value) { - // IE < 9 presents many host objects as `Object` objects that can coerce - // to strings despite having improperly defined `toString` methods. - return typeof value.toString != 'function' && typeof (value + '') == 'string'; - }; -}()); -module.exports = isHostObject; + /** + * Create the component's DOM element + * + * @param {String=} type Element's node type. e.g. 'div' + * @param {Object=} props An object of properties that should be set on the element + * @param {Object=} attributes An object of attributes that should be set on the element + * @return {Element} + * @method createEl + */ -},{}],23:[function(_dereq_,module,exports){ -/** Used to detect unsigned integer values. */ -var reIsUint = /^\d+$/; -/** - * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) - * of an array-like value. - */ -var MAX_SAFE_INTEGER = 9007199254740991; + ClickableComponent.prototype.createEl = function createEl() { + var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'div'; + var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; -/** - * Checks if `value` is a valid array-like index. - * - * @private - * @param {*} value The value to check. - * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. - * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. - */ -function isIndex(value, length) { - value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; - length = length == null ? MAX_SAFE_INTEGER : length; - return value > -1 && value % 1 == 0 && value < length; -} + props = (0, _object2['default'])({ + className: this.buildCSSClass(), + tabIndex: 0 + }, props); -module.exports = isIndex; + if (tag === 'button') { + _log2['default'].error('Creating a ClickableComponent with an HTML element of ' + tag + ' is not supported; use a Button instead.'); + } -},{}],24:[function(_dereq_,module,exports){ -var isArrayLike = _dereq_('./isArrayLike'), - isIndex = _dereq_('./isIndex'), - isObject = _dereq_('../lang/isObject'); + // Add ARIA attributes for clickable element which is not a native HTML button + attributes = (0, _object2['default'])({ + 'role': 'button', -/** - * Checks if the provided arguments are from an iteratee call. - * - * @private - * @param {*} value The potential iteratee value argument. - * @param {*} index The potential iteratee index or key argument. - * @param {*} object The potential iteratee object argument. - * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. - */ -function isIterateeCall(value, index, object) { - if (!isObject(object)) { - return false; - } - var type = typeof index; - if (type == 'number' - ? (isArrayLike(object) && isIndex(index, object.length)) - : (type == 'string' && index in object)) { - var other = object[index]; - return value === value ? (value === other) : (other !== other); - } - return false; -} + // let the screen reader user know that the text of the element may change + 'aria-live': 'polite' + }, attributes); -module.exports = isIterateeCall; + this.tabIndex_ = props.tabIndex; -},{"../lang/isObject":33,"./isArrayLike":21,"./isIndex":23}],25:[function(_dereq_,module,exports){ -/** - * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) - * of an array-like value. - */ -var MAX_SAFE_INTEGER = 9007199254740991; + var el = _Component.prototype.createEl.call(this, tag, props, attributes); -/** - * Checks if `value` is a valid array-like length. - * - * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. - */ -function isLength(value) { - return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; -} + this.createControlTextEl(el); -module.exports = isLength; + return el; + }; -},{}],26:[function(_dereq_,module,exports){ -/** - * Checks if `value` is object-like. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - */ -function isObjectLike(value) { - return !!value && typeof value == 'object'; -} + /** + * create control text + * + * @param {Element} el Parent element for the control text + * @return {Element} + * @method controlText + */ -module.exports = isObjectLike; -},{}],27:[function(_dereq_,module,exports){ -var isArguments = _dereq_('../lang/isArguments'), - isArray = _dereq_('../lang/isArray'), - isIndex = _dereq_('./isIndex'), - isLength = _dereq_('./isLength'), - isString = _dereq_('../lang/isString'), - keysIn = _dereq_('../object/keysIn'); + ClickableComponent.prototype.createControlTextEl = function createControlTextEl(el) { + this.controlTextEl_ = Dom.createEl('span', { + className: 'vjs-control-text' + }); -/** Used for native method references. */ -var objectProto = Object.prototype; + if (el) { + el.appendChild(this.controlTextEl_); + } -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; + this.controlText(this.controlText_, el); -/** - * A fallback implementation of `Object.keys` which creates an array of the - * own enumerable property names of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ -function shimKeys(object) { - var props = keysIn(object), - propsLength = props.length, - length = propsLength && object.length; + return this.controlTextEl_; + }; - var allowIndexes = !!length && isLength(length) && - (isArray(object) || isArguments(object) || isString(object)); + /** + * Controls text - both request and localize + * + * @param {String} text Text for element + * @param {Element=} el Element to set the title on + * @return {String} + * @method controlText + */ - var index = -1, - result = []; - while (++index < propsLength) { - var key = props[index]; - if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { - result.push(key); + ClickableComponent.prototype.controlText = function controlText(text) { + var el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.el(); + + if (!text) { + return this.controlText_ || 'Need Text'; } - } - return result; -} -module.exports = shimKeys; + var localizedText = this.localize(text); -},{"../lang/isArguments":29,"../lang/isArray":30,"../lang/isString":35,"../object/keysIn":39,"./isIndex":23,"./isLength":25}],28:[function(_dereq_,module,exports){ -var isObject = _dereq_('../lang/isObject'), - isString = _dereq_('../lang/isString'), - support = _dereq_('../support'); + this.controlText_ = text; + this.controlTextEl_.innerHTML = localizedText; + el.setAttribute('title', localizedText); -/** - * Converts `value` to an object if it's not one. - * - * @private - * @param {*} value The value to process. - * @returns {Object} Returns the object. - */ -function toObject(value) { - if (support.unindexedChars && isString(value)) { - var index = -1, - length = value.length, - result = Object(value); + return this; + }; - while (++index < length) { - result[index] = value.charAt(index); - } - return result; - } - return isObject(value) ? value : Object(value); -} + /** + * Allows sub components to stack CSS class names + * + * @return {String} + * @method buildCSSClass + */ -module.exports = toObject; -},{"../lang/isObject":33,"../lang/isString":35,"../support":41}],29:[function(_dereq_,module,exports){ -var isArrayLike = _dereq_('../internal/isArrayLike'), - isObjectLike = _dereq_('../internal/isObjectLike'); + ClickableComponent.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-control vjs-button ' + _Component.prototype.buildCSSClass.call(this); + }; -/** Used for native method references. */ -var objectProto = Object.prototype; + /** + * Enable the component element + * + * @return {Component} + * @method enable + */ -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; -/** Native method references. */ -var propertyIsEnumerable = objectProto.propertyIsEnumerable; + ClickableComponent.prototype.enable = function enable() { + this.removeClass('vjs-disabled'); + this.el_.setAttribute('aria-disabled', 'false'); + if (typeof this.tabIndex_ !== 'undefined') { + this.el_.setAttribute('tabIndex', this.tabIndex_); + } + this.on('tap', this.handleClick); + this.on('click', this.handleClick); + this.on('focus', this.handleFocus); + this.on('blur', this.handleBlur); + return this; + }; -/** - * Checks if `value` is classified as an `arguments` object. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isArguments(function() { return arguments; }()); - * // => true - * - * _.isArguments([1, 2, 3]); - * // => false - */ -function isArguments(value) { - return isObjectLike(value) && isArrayLike(value) && - hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); -} + /** + * Disable the component element + * + * @return {Component} + * @method disable + */ -module.exports = isArguments; -},{"../internal/isArrayLike":21,"../internal/isObjectLike":26}],30:[function(_dereq_,module,exports){ -var getNative = _dereq_('../internal/getNative'), - isLength = _dereq_('../internal/isLength'), - isObjectLike = _dereq_('../internal/isObjectLike'); + ClickableComponent.prototype.disable = function disable() { + this.addClass('vjs-disabled'); + this.el_.setAttribute('aria-disabled', 'true'); + if (typeof this.tabIndex_ !== 'undefined') { + this.el_.removeAttribute('tabIndex'); + } + this.off('tap', this.handleClick); + this.off('click', this.handleClick); + this.off('focus', this.handleFocus); + this.off('blur', this.handleBlur); + return this; + }; -/** `Object#toString` result references. */ -var arrayTag = '[object Array]'; + /** + * Handle Click - Override with specific functionality for component + * + * @method handleClick + */ -/** Used for native method references. */ -var objectProto = Object.prototype; -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; + ClickableComponent.prototype.handleClick = function handleClick() {}; -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeIsArray = getNative(Array, 'isArray'); + /** + * Handle Focus - Add keyboard functionality to element + * + * @method handleFocus + */ -/** - * Checks if `value` is classified as an `Array` object. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isArray([1, 2, 3]); - * // => true - * - * _.isArray(function() { return arguments; }()); - * // => false - */ -var isArray = nativeIsArray || function(value) { - return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; -}; -module.exports = isArray; + ClickableComponent.prototype.handleFocus = function handleFocus() { + Events.on(_document2['default'], 'keydown', Fn.bind(this, this.handleKeyPress)); + }; -},{"../internal/getNative":20,"../internal/isLength":25,"../internal/isObjectLike":26}],31:[function(_dereq_,module,exports){ -var isObject = _dereq_('./isObject'); + /** + * Handle KeyPress (document level) - Trigger click when Space or Enter key is pressed + * + * @method handleKeyPress + */ -/** `Object#toString` result references. */ -var funcTag = '[object Function]'; -/** Used for native method references. */ -var objectProto = Object.prototype; + ClickableComponent.prototype.handleKeyPress = function handleKeyPress(event) { -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; + // Support Space (32) or Enter (13) key operation to fire a click event + if (event.which === 32 || event.which === 13) { + event.preventDefault(); + this.handleClick(event); + } else if (_Component.prototype.handleKeyPress) { -/** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ -function isFunction(value) { - // The use of `Object#toString` avoids issues with the `typeof` operator - // in older versions of Chrome and Safari which return 'function' for regexes - // and Safari 8 which returns 'object' for typed array constructors. - return isObject(value) && objToString.call(value) == funcTag; -} + // Pass keypress handling up for unsupported keys + _Component.prototype.handleKeyPress.call(this, event); + } + }; -module.exports = isFunction; + /** + * Handle Blur - Remove keyboard triggers + * + * @method handleBlur + */ -},{"./isObject":33}],32:[function(_dereq_,module,exports){ -var isFunction = _dereq_('./isFunction'), - isHostObject = _dereq_('../internal/isHostObject'), - isObjectLike = _dereq_('../internal/isObjectLike'); -/** Used to detect host constructors (Safari > 5). */ -var reIsHostCtor = /^\[object .+?Constructor\]$/; + ClickableComponent.prototype.handleBlur = function handleBlur() { + Events.off(_document2['default'], 'keydown', Fn.bind(this, this.handleKeyPress)); + }; -/** Used for native method references. */ -var objectProto = Object.prototype; + return ClickableComponent; +}(_component2['default']); -/** Used to resolve the decompiled source of functions. */ -var fnToString = Function.prototype.toString; +_component2['default'].registerComponent('ClickableComponent', ClickableComponent); +exports['default'] = ClickableComponent; -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; +},{"139":139,"5":5,"82":82,"83":83,"84":84,"87":87,"95":95}],4:[function(_dereq_,module,exports){ +'use strict'; -/** Used to detect if a method is native. */ -var reIsNative = RegExp('^' + - fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' -); +exports.__esModule = true; + +var _button = _dereq_(2); + +var _button2 = _interopRequireDefault(_button); + +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** - * Checks if `value` is a native function. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, else `false`. - * @example - * - * _.isNative(Array.prototype.push); - * // => true + * The `CloseButton` component is a button which fires a "close" event + * when it is activated. * - * _.isNative(_); - * // => false + * @extends Button + * @class CloseButton */ -function isNative(value) { - if (value == null) { - return false; - } - if (isFunction(value)) { - return reIsNative.test(fnToString.call(value)); +var CloseButton = function (_Button) { + _inherits(CloseButton, _Button); + + function CloseButton(player, options) { + _classCallCheck(this, CloseButton); + + var _this = _possibleConstructorReturn(this, _Button.call(this, player, options)); + + _this.controlText(options && options.controlText || _this.localize('Close')); + return _this; } - return isObjectLike(value) && (isHostObject(value) ? reIsNative : reIsHostCtor).test(value); -} -module.exports = isNative; + CloseButton.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-close-button ' + _Button.prototype.buildCSSClass.call(this); + }; -},{"../internal/isHostObject":22,"../internal/isObjectLike":26,"./isFunction":31}],33:[function(_dereq_,module,exports){ -/** - * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. - * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(1); - * // => false - */ -function isObject(value) { - // Avoid a V8 JIT bug in Chrome 19-20. - // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); -} + CloseButton.prototype.handleClick = function handleClick() { + this.trigger({ type: 'close', bubbles: false }); + }; -module.exports = isObject; + return CloseButton; +}(_button2['default']); -},{}],34:[function(_dereq_,module,exports){ -var baseForIn = _dereq_('../internal/baseForIn'), - isArguments = _dereq_('./isArguments'), - isHostObject = _dereq_('../internal/isHostObject'), - isObjectLike = _dereq_('../internal/isObjectLike'), - support = _dereq_('../support'); +_component2['default'].registerComponent('CloseButton', CloseButton); +exports['default'] = CloseButton; -/** `Object#toString` result references. */ -var objectTag = '[object Object]'; +},{"2":2,"5":5}],5:[function(_dereq_,module,exports){ +'use strict'; -/** Used for native method references. */ -var objectProto = Object.prototype; +exports.__esModule = true; -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; +var _window = _dereq_(96); -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; +var _window2 = _interopRequireDefault(_window); -/** - * Checks if `value` is a plain object, that is, an object created by the - * `Object` constructor or one with a `[[Prototype]]` of `null`. - * - * **Note:** This method assumes objects created by the `Object` constructor - * have no inherited enumerable properties. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. - * @example - * - * function Foo() { - * this.a = 1; - * } - * - * _.isPlainObject(new Foo); - * // => false - * - * _.isPlainObject([1, 2, 3]); - * // => false - * - * _.isPlainObject({ 'x': 0, 'y': 0 }); - * // => true - * - * _.isPlainObject(Object.create(null)); - * // => true - */ -function isPlainObject(value) { - var Ctor; +var _dom = _dereq_(82); - // Exit early for non `Object` objects. - if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isHostObject(value) && !isArguments(value)) || - (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) { - return false; - } - // IE < 9 iterates inherited properties before own properties. If the first - // iterated property is an object's own property then there are no inherited - // enumerable properties. - var result; - if (support.ownLast) { - baseForIn(value, function(subValue, key, object) { - result = hasOwnProperty.call(object, key); - return false; - }); - return result !== false; - } - // In most environments an object's own properties are iterated before - // its inherited properties. If the last iterated property is an object's - // own property then there are no inherited enumerable properties. - baseForIn(value, function(subValue, key) { - result = key; - }); - return result === undefined || hasOwnProperty.call(value, result); -} +var Dom = _interopRequireWildcard(_dom); -module.exports = isPlainObject; +var _fn = _dereq_(84); -},{"../internal/baseForIn":12,"../internal/isHostObject":22,"../internal/isObjectLike":26,"../support":41,"./isArguments":29}],35:[function(_dereq_,module,exports){ -var isObjectLike = _dereq_('../internal/isObjectLike'); +var Fn = _interopRequireWildcard(_fn); -/** `Object#toString` result references. */ -var stringTag = '[object String]'; +var _guid = _dereq_(86); -/** Used for native method references. */ -var objectProto = Object.prototype; +var Guid = _interopRequireWildcard(_guid); -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; +var _events = _dereq_(83); -/** - * Checks if `value` is classified as a `String` primitive or object. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isString('abc'); - * // => true - * - * _.isString(1); - * // => false - */ -function isString(value) { - return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag); -} +var Events = _interopRequireWildcard(_events); -module.exports = isString; +var _log = _dereq_(87); -},{"../internal/isObjectLike":26}],36:[function(_dereq_,module,exports){ -var isLength = _dereq_('../internal/isLength'), - isObjectLike = _dereq_('../internal/isObjectLike'); +var _log2 = _interopRequireDefault(_log); -/** `Object#toString` result references. */ -var argsTag = '[object Arguments]', - arrayTag = '[object Array]', - boolTag = '[object Boolean]', - dateTag = '[object Date]', - errorTag = '[object Error]', - funcTag = '[object Function]', - mapTag = '[object Map]', - numberTag = '[object Number]', - objectTag = '[object Object]', - regexpTag = '[object RegExp]', - setTag = '[object Set]', - stringTag = '[object String]', - weakMapTag = '[object WeakMap]'; +var _toTitleCase = _dereq_(92); -var arrayBufferTag = '[object ArrayBuffer]', - float32Tag = '[object Float32Array]', - float64Tag = '[object Float64Array]', - int8Tag = '[object Int8Array]', - int16Tag = '[object Int16Array]', - int32Tag = '[object Int32Array]', - uint8Tag = '[object Uint8Array]', - uint8ClampedTag = '[object Uint8ClampedArray]', - uint16Tag = '[object Uint16Array]', - uint32Tag = '[object Uint32Array]'; +var _toTitleCase2 = _interopRequireDefault(_toTitleCase); -/** Used to identify `toStringTag` values of typed arrays. */ -var typedArrayTags = {}; -typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = -typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = -typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = -typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = -typedArrayTags[uint32Tag] = true; -typedArrayTags[argsTag] = typedArrayTags[arrayTag] = -typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = -typedArrayTags[dateTag] = typedArrayTags[errorTag] = -typedArrayTags[funcTag] = typedArrayTags[mapTag] = -typedArrayTags[numberTag] = typedArrayTags[objectTag] = -typedArrayTags[regexpTag] = typedArrayTags[setTag] = -typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; +var _mergeOptions = _dereq_(88); -/** Used for native method references. */ -var objectProto = Object.prototype; +var _mergeOptions2 = _interopRequireDefault(_mergeOptions); -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -/** - * Checks if `value` is classified as a typed array. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. - * @example - * - * _.isTypedArray(new Uint8Array); - * // => true - * - * _.isTypedArray([]); - * // => false - */ -function isTypedArray(value) { - return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)]; -} +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -module.exports = isTypedArray; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** + * @file component.js + * + * Player Component - Base class for all UI objects + */ -},{"../internal/isLength":25,"../internal/isObjectLike":26}],37:[function(_dereq_,module,exports){ -var baseCopy = _dereq_('../internal/baseCopy'), - keysIn = _dereq_('../object/keysIn'); /** - * Converts `value` to a plain object flattening inherited enumerable - * properties of `value` to own properties of the plain object. - * - * @static - * @memberOf _ - * @category Lang - * @param {*} value The value to convert. - * @returns {Object} Returns the converted plain object. - * @example - * - * function Foo() { - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.assign({ 'a': 1 }, new Foo); - * // => { 'a': 1, 'b': 2 } + * Base UI Component class + * Components are embeddable UI objects that are represented by both a + * javascript object and an element in the DOM. They can be children of other + * components, and can have many children themselves. + * ```js + * // adding a button to the player + * var button = player.addChild('button'); + * button.el(); // -> button element + * ``` + * ```html + *
+ *
Button
+ *
+ * ``` + * Components are also event targets. + * ```js + * button.on('click', function() { + * console.log('Button Clicked!'); + * }); + * button.trigger('customevent'); + * ``` * - * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); - * // => { 'a': 1, 'b': 2, 'c': 3 } + * @param {Object} player Main Player + * @param {Object=} options Object of option names and values + * @param {Function=} ready Ready callback function + * @class Component */ -function toPlainObject(value) { - return baseCopy(value, keysIn(value)); -} - -module.exports = toPlainObject; +var Component = function () { + function Component(player, options, ready) { + _classCallCheck(this, Component); -},{"../internal/baseCopy":10,"../object/keysIn":39}],38:[function(_dereq_,module,exports){ -var getNative = _dereq_('../internal/getNative'), - isArrayLike = _dereq_('../internal/isArrayLike'), - isObject = _dereq_('../lang/isObject'), - shimKeys = _dereq_('../internal/shimKeys'), - support = _dereq_('../support'); + // The component might be the player itself and we can't pass `this` to super + if (!player && this.play) { + this.player_ = player = this; // eslint-disable-line + } else { + this.player_ = player; + } -/* Native method references for those with the same name as other `lodash` methods. */ -var nativeKeys = getNative(Object, 'keys'); + // Make a copy of prototype.options_ to protect against overriding defaults + this.options_ = (0, _mergeOptions2['default'])({}, this.options_); -/** - * Creates an array of the own enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. See the - * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) - * for more details. - * - * @static - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keys(new Foo); - * // => ['a', 'b'] (iteration order is not guaranteed) - * - * _.keys('hi'); - * // => ['0', '1'] - */ -var keys = !nativeKeys ? shimKeys : function(object) { - var Ctor = object == null ? undefined : object.constructor; - if ((typeof Ctor == 'function' && Ctor.prototype === object) || - (typeof object == 'function' ? support.enumPrototypes : isArrayLike(object))) { - return shimKeys(object); - } - return isObject(object) ? nativeKeys(object) : []; -}; + // Updated options with supplied options + options = this.options_ = (0, _mergeOptions2['default'])(this.options_, options); -module.exports = keys; + // Get ID from options or options element if one is supplied + this.id_ = options.id || options.el && options.el.id; -},{"../internal/getNative":20,"../internal/isArrayLike":21,"../internal/shimKeys":27,"../lang/isObject":33,"../support":41}],39:[function(_dereq_,module,exports){ -var arrayEach = _dereq_('../internal/arrayEach'), - isArguments = _dereq_('../lang/isArguments'), - isArray = _dereq_('../lang/isArray'), - isFunction = _dereq_('../lang/isFunction'), - isIndex = _dereq_('../internal/isIndex'), - isLength = _dereq_('../internal/isLength'), - isObject = _dereq_('../lang/isObject'), - isString = _dereq_('../lang/isString'), - support = _dereq_('../support'); + // If there was no ID from the options, generate one + if (!this.id_) { + // Don't require the player ID function in the case of mock players + var id = player && player.id && player.id() || 'no_player'; -/** `Object#toString` result references. */ -var arrayTag = '[object Array]', - boolTag = '[object Boolean]', - dateTag = '[object Date]', - errorTag = '[object Error]', - funcTag = '[object Function]', - numberTag = '[object Number]', - objectTag = '[object Object]', - regexpTag = '[object RegExp]', - stringTag = '[object String]'; + this.id_ = id + '_component_' + Guid.newGUID(); + } -/** Used to fix the JScript `[[DontEnum]]` bug. */ -var shadowProps = [ - 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', - 'toLocaleString', 'toString', 'valueOf' -]; + this.name_ = options.name || null; -/** Used for native method references. */ -var errorProto = Error.prototype, - objectProto = Object.prototype, - stringProto = String.prototype; + // Create element if one wasn't provided in options + if (options.el) { + this.el_ = options.el; + } else if (options.createEl !== false) { + this.el_ = this.createEl(); + } -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; + this.children_ = []; + this.childIndex_ = {}; + this.childNameIndex_ = {}; -/** - * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objToString = objectProto.toString; + // Add any child components in options + if (options.initChildren !== false) { + this.initChildren(); + } -/** Used to avoid iterating over non-enumerable properties in IE < 9. */ -var nonEnumProps = {}; -nonEnumProps[arrayTag] = nonEnumProps[dateTag] = nonEnumProps[numberTag] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true }; -nonEnumProps[boolTag] = nonEnumProps[stringTag] = { 'constructor': true, 'toString': true, 'valueOf': true }; -nonEnumProps[errorTag] = nonEnumProps[funcTag] = nonEnumProps[regexpTag] = { 'constructor': true, 'toString': true }; -nonEnumProps[objectTag] = { 'constructor': true }; + this.ready(ready); + // Don't want to trigger ready here or it will before init is actually + // finished for all children that run this constructor -arrayEach(shadowProps, function(key) { - for (var tag in nonEnumProps) { - if (hasOwnProperty.call(nonEnumProps, tag)) { - var props = nonEnumProps[tag]; - props[key] = hasOwnProperty.call(props, key); + if (options.reportTouchActivity !== false) { + this.enableTouchActivity(); } } -}); -/** - * Creates an array of the own and inherited enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keysIn(new Foo); - * // => ['a', 'b', 'c'] (iteration order is not guaranteed) - */ -function keysIn(object) { - if (object == null) { - return []; - } - if (!isObject(object)) { - object = Object(object); - } - var length = object.length; - - length = (length && isLength(length) && - (isArray(object) || isArguments(object) || isString(object)) && length) || 0; + /** + * Dispose of the component and all child components + * + * @method dispose + */ - var Ctor = object.constructor, - index = -1, - proto = (isFunction(Ctor) && Ctor.prototype) || objectProto, - isProto = proto === object, - result = Array(length), - skipIndexes = length > 0, - skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error), - skipProto = support.enumPrototypes && isFunction(object); - while (++index < length) { - result[index] = (index + ''); - } - // lodash skips the `constructor` property when it infers it's iterating - // over a `prototype` object because IE < 9 can't set the `[[Enumerable]]` - // attribute of an existing property and the `constructor` property of a - // prototype defaults to non-enumerable. - for (var key in object) { - if (!(skipProto && key == 'prototype') && - !(skipErrorProps && (key == 'message' || key == 'name')) && - !(skipIndexes && isIndex(key, length)) && - !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { - result.push(key); - } - } - if (support.nonEnumShadows && object !== objectProto) { - var tag = object === stringProto ? stringTag : (object === errorProto ? errorTag : objToString.call(object)), - nonEnums = nonEnumProps[tag] || nonEnumProps[objectTag]; + Component.prototype.dispose = function dispose() { + this.trigger({ type: 'dispose', bubbles: false }); - if (tag == objectTag) { - proto = objectProto; - } - length = shadowProps.length; - while (length--) { - key = shadowProps[length]; - var nonEnum = nonEnums[key]; - if (!(isProto && nonEnum) && - (nonEnum ? hasOwnProperty.call(object, key) : object[key] !== proto[key])) { - result.push(key); + // Dispose all children. + if (this.children_) { + for (var i = this.children_.length - 1; i >= 0; i--) { + if (this.children_[i].dispose) { + this.children_[i].dispose(); + } } } - } - return result; -} - -module.exports = keysIn; - -},{"../internal/arrayEach":9,"../internal/isIndex":23,"../internal/isLength":25,"../lang/isArguments":29,"../lang/isArray":30,"../lang/isFunction":31,"../lang/isObject":33,"../lang/isString":35,"../support":41}],40:[function(_dereq_,module,exports){ -var baseMerge = _dereq_('../internal/baseMerge'), - createAssigner = _dereq_('../internal/createAssigner'); - -/** - * Recursively merges own enumerable properties of the source object(s), that - * don't resolve to `undefined` into the destination object. Subsequent sources - * overwrite property assignments of previous sources. If `customizer` is - * provided it's invoked to produce the merged values of the destination and - * source properties. If `customizer` returns `undefined` merging is handled - * by the method instead. The `customizer` is bound to `thisArg` and invoked - * with five arguments: (objectValue, sourceValue, key, object, source). - * - * @static - * @memberOf _ - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @param {Function} [customizer] The function to customize assigned values. - * @param {*} [thisArg] The `this` binding of `customizer`. - * @returns {Object} Returns `object`. - * @example - * - * var users = { - * 'data': [{ 'user': 'barney' }, { 'user': 'fred' }] - * }; - * - * var ages = { - * 'data': [{ 'age': 36 }, { 'age': 40 }] - * }; - * - * _.merge(users, ages); - * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] } - * - * // using a customizer callback - * var object = { - * 'fruits': ['apple'], - * 'vegetables': ['beet'] - * }; - * - * var other = { - * 'fruits': ['banana'], - * 'vegetables': ['carrot'] - * }; - * - * _.merge(object, other, function(a, b) { - * if (_.isArray(a)) { - * return a.concat(b); - * } - * }); - * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] } - */ -var merge = createAssigner(baseMerge); - -module.exports = merge; - -},{"../internal/baseMerge":13,"../internal/createAssigner":17}],41:[function(_dereq_,module,exports){ -/** Used for native method references. */ -var arrayProto = Array.prototype, - errorProto = Error.prototype, - objectProto = Object.prototype; -/** Native method references. */ -var propertyIsEnumerable = objectProto.propertyIsEnumerable, - splice = arrayProto.splice; + // Delete child references + this.children_ = null; + this.childIndex_ = null; + this.childNameIndex_ = null; -/** - * An object environment feature flags. - * - * @static - * @memberOf _ - * @type Object - */ -var support = {}; + // Remove all event listeners. + this.off(); -(function(x) { - var Ctor = function() { this.x = x; }, - object = { '0': x, 'length': x }, - props = []; + // Remove element from DOM + if (this.el_.parentNode) { + this.el_.parentNode.removeChild(this.el_); + } - Ctor.prototype = { 'valueOf': x, 'y': x }; - for (var key in new Ctor) { props.push(key); } + Dom.removeElData(this.el_); + this.el_ = null; + }; /** - * Detect if `name` or `message` properties of `Error.prototype` are - * enumerable by default (IE < 9, Safari < 5.1). + * Return the component's player * - * @memberOf _.support - * @type boolean + * @return {Player} + * @method player */ - support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || - propertyIsEnumerable.call(errorProto, 'name'); + + + Component.prototype.player = function player() { + return this.player_; + }; /** - * Detect if `prototype` properties are enumerable by default. + * Deep merge of options objects + * Whenever a property is an object on both options objects + * the two properties will be merged using mergeOptions. * - * Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1 - * (if the prototype or a property on the prototype has been set) - * incorrectly set the `[[Enumerable]]` value of a function's `prototype` - * property to `true`. + * ```js + * Parent.prototype.options_ = { + * optionSet: { + * 'childOne': { 'foo': 'bar', 'asdf': 'fdsa' }, + * 'childTwo': {}, + * 'childThree': {} + * } + * } + * newOptions = { + * optionSet: { + * 'childOne': { 'foo': 'baz', 'abc': '123' } + * 'childTwo': null, + * 'childFour': {} + * } + * } * - * @memberOf _.support - * @type boolean + * this.options(newOptions); + * ``` + * RESULT + * ```js + * { + * optionSet: { + * 'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' }, + * 'childTwo': null, // Disabled. Won't be initialized. + * 'childThree': {}, + * 'childFour': {} + * } + * } + * ``` + * + * @param {Object} obj Object of new option values + * @return {Object} A NEW object of this.options_ and obj merged + * @method options */ - support.enumPrototypes = propertyIsEnumerable.call(Ctor, 'prototype'); + + + Component.prototype.options = function options(obj) { + _log2['default'].warn('this.options() has been deprecated and will be moved to the constructor in 6.0'); + + if (!obj) { + return this.options_; + } + + this.options_ = (0, _mergeOptions2['default'])(this.options_, obj); + return this.options_; + }; /** - * Detect if properties shadowing those on `Object.prototype` are non-enumerable. - * - * In IE < 9 an object's own properties, shadowing non-enumerable ones, - * are made non-enumerable as well (a.k.a the JScript `[[DontEnum]]` bug). + * Get the component's DOM element + * ```js + * var domEl = myComponent.el(); + * ``` * - * @memberOf _.support - * @type boolean + * @return {Element} + * @method el */ - support.nonEnumShadows = !/valueOf/.test(props); + + + Component.prototype.el = function el() { + return this.el_; + }; /** - * Detect if own properties are iterated after inherited properties (IE < 9). + * Create the component's DOM element * - * @memberOf _.support - * @type boolean + * @param {String=} tagName Element's node type. e.g. 'div' + * @param {Object=} properties An object of properties that should be set + * @param {Object=} attributes An object of attributes that should be set + * @return {Element} + * @method createEl */ - support.ownLast = props[0] != 'x'; + + + Component.prototype.createEl = function createEl(tagName, properties, attributes) { + return Dom.createEl(tagName, properties, attributes); + }; + + Component.prototype.localize = function localize(string) { + var code = this.player_.language && this.player_.language(); + var languages = this.player_.languages && this.player_.languages(); + + if (!code || !languages) { + return string; + } + + var language = languages[code]; + + if (language && language[string]) { + return language[string]; + } + + var primaryCode = code.split('-')[0]; + var primaryLang = languages[primaryCode]; + + if (primaryLang && primaryLang[string]) { + return primaryLang[string]; + } + + return string; + }; /** - * Detect if `Array#shift` and `Array#splice` augment array-like objects - * correctly. - * - * Firefox < 10, compatibility modes of IE 8, and IE < 9 have buggy Array - * `shift()` and `splice()` functions that fail to remove the last element, - * `value[0]`, of array-like objects even though the "length" property is - * set to `0`. The `shift()` method is buggy in compatibility modes of IE 8, - * while `splice()` is buggy regardless of mode in IE < 9. + * Return the component's DOM element where children are inserted. + * Will either be the same as el() or a new element defined in createEl(). * - * @memberOf _.support - * @type boolean + * @return {Element} + * @method contentEl */ - support.spliceObjects = (splice.call(object, 0, 1), !object[0]); + + + Component.prototype.contentEl = function contentEl() { + return this.contentEl_ || this.el_; + }; /** - * Detect lack of support for accessing string characters by index. - * - * IE < 8 can't access characters by index. IE 8 can only access characters - * by index on string literals, not string objects. + * Get the component's ID + * ```js + * var id = myComponent.id(); + * ``` * - * @memberOf _.support - * @type boolean + * @return {String} + * @method id */ - support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx'; -}(1, 0)); -module.exports = support; -},{}],42:[function(_dereq_,module,exports){ -/** - * This method returns the first argument provided to it. - * - * @static - * @memberOf _ - * @category Utility - * @param {*} value Any value. - * @returns {*} Returns `value`. - * @example - * - * var object = { 'user': 'fred' }; - * - * _.identity(object) === object; - * // => true - */ -function identity(value) { - return value; -} + Component.prototype.id = function id() { + return this.id_; + }; -module.exports = identity; + /** + * Get the component's name. The name is often used to reference the component. + * ```js + * var name = myComponent.name(); + * ``` + * + * @return {String} + * @method name + */ -},{}],43:[function(_dereq_,module,exports){ -'use strict'; -var keys = _dereq_('object-keys'); + Component.prototype.name = function name() { + return this.name_; + }; -module.exports = function hasSymbols() { - if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; } - if (typeof Symbol.iterator === 'symbol') { return true; } + /** + * Get an array of all child components + * ```js + * var kids = myComponent.children(); + * ``` + * + * @return {Array} The children + * @method children + */ - var obj = {}; - var sym = Symbol('test'); - if (typeof sym === 'string') { return false; } - // temp disabled per https://github.com/ljharb/object.assign/issues/17 - // if (sym instanceof Symbol) { return false; } - // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 - // if (!(Object(sym) instanceof Symbol)) { return false; } + Component.prototype.children = function children() { + return this.children_; + }; - var symVal = 42; - obj[sym] = symVal; - for (sym in obj) { return false; } - if (keys(obj).length !== 0) { return false; } - if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; } + /** + * Returns a child component with the provided ID + * + * @return {Component} + * @method getChildById + */ - if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; } - var syms = Object.getOwnPropertySymbols(obj); - if (syms.length !== 1 || syms[0] !== sym) { return false; } + Component.prototype.getChildById = function getChildById(id) { + return this.childIndex_[id]; + }; - if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } + /** + * Returns a child component with the provided name + * + * @return {Component} + * @method getChild + */ - if (typeof Object.getOwnPropertyDescriptor === 'function') { - var descriptor = Object.getOwnPropertyDescriptor(obj, sym); - if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } - } - return true; -}; + Component.prototype.getChild = function getChild(name) { + if (!name) { + return; + } -},{"object-keys":50}],44:[function(_dereq_,module,exports){ -'use strict'; + name = (0, _toTitleCase2['default'])(name); -// modified from https://github.com/es-shims/es6-shim -var keys = _dereq_('object-keys'); -var bind = _dereq_('function-bind'); -var canBeObject = function (obj) { - return typeof obj !== 'undefined' && obj !== null; -}; -var hasSymbols = _dereq_('./hasSymbols')(); -var toObject = Object; -var push = bind.call(Function.call, Array.prototype.push); -var propIsEnumerable = bind.call(Function.call, Object.prototype.propertyIsEnumerable); + return this.childNameIndex_[name]; + }; -module.exports = function assign(target, source1) { - if (!canBeObject(target)) { throw new TypeError('target must be an object'); } - var objTarget = toObject(target); - var s, source, i, props, syms, value, key; - for (s = 1; s < arguments.length; ++s) { - source = toObject(arguments[s]); - props = keys(source); - if (hasSymbols && Object.getOwnPropertySymbols) { - syms = Object.getOwnPropertySymbols(source); - for (i = 0; i < syms.length; ++i) { - key = syms[i]; - if (propIsEnumerable(source, key)) { - push(props, key); - } - } - } - for (i = 0; i < props.length; ++i) { - key = props[i]; - value = source[key]; - if (propIsEnumerable(source, key)) { - objTarget[key] = value; - } - } - } - return objTarget; -}; + /** + * Adds a child component inside this component + * ```js + * myComponent.el(); + * // ->
+ * myComponent.children(); + * // [empty array] + * + * var myButton = myComponent.addChild('MyButton'); + * // ->
myButton
+ * // -> myButton === myComponent.children()[0]; + * ``` + * Pass in options for child constructors and options for children of the child + * ```js + * var myButton = myComponent.addChild('MyButton', { + * text: 'Press Me', + * buttonChildExample: { + * buttonChildOption: true + * } + * }); + * ``` + * + * @param {String|Component} child The class name or instance of a child to add + * @param {Object=} options Options, including options to be passed to children of the child. + * @param {Number} index into our children array to attempt to add the child + * @return {Component} The child component (created by this process if a string was used) + * @method addChild + */ -},{"./hasSymbols":43,"function-bind":49,"object-keys":50}],45:[function(_dereq_,module,exports){ -'use strict'; -var defineProperties = _dereq_('define-properties'); + Component.prototype.addChild = function addChild(child) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.children_.length; -var implementation = _dereq_('./implementation'); -var getPolyfill = _dereq_('./polyfill'); -var shim = _dereq_('./shim'); + var component = void 0; + var componentName = void 0; -defineProperties(implementation, { - implementation: implementation, - getPolyfill: getPolyfill, - shim: shim -}); + // If child is a string, create component with options + if (typeof child === 'string') { + componentName = (0, _toTitleCase2['default'])(child); -module.exports = implementation; + // Options can also be specified as a boolean, so convert to an empty object if false. + if (!options) { + options = {}; + } -},{"./implementation":44,"./polyfill":52,"./shim":53,"define-properties":46}],46:[function(_dereq_,module,exports){ -'use strict'; + // Same as above, but true is deprecated so show a warning. + if (options === true) { + _log2['default'].warn('Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`.'); + options = {}; + } -var keys = _dereq_('object-keys'); -var foreach = _dereq_('foreach'); -var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol'; + var componentClassName = options.componentClass || componentName; -var toStr = Object.prototype.toString; + // Set name through options + options.name = componentName; -var isFunction = function (fn) { - return typeof fn === 'function' && toStr.call(fn) === '[object Function]'; -}; + // Create a new object & element for this controls set + // If there's no .player_, this is a player + var ComponentClass = Component.getComponent(componentClassName); -var arePropertyDescriptorsSupported = function () { - var obj = {}; - try { - Object.defineProperty(obj, 'x', { enumerable: false, value: obj }); - /* eslint-disable no-unused-vars, no-restricted-syntax */ - for (var _ in obj) { return false; } - /* eslint-enable no-unused-vars, no-restricted-syntax */ - return obj.x === obj; - } catch (e) { /* this is IE 8. */ - return false; - } -}; -var supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported(); + if (!ComponentClass) { + throw new Error('Component ' + componentClassName + ' does not exist'); + } -var defineProperty = function (object, name, value, predicate) { - if (name in object && (!isFunction(predicate) || !predicate())) { - return; - } - if (supportsDescriptors) { - Object.defineProperty(object, name, { - configurable: true, - enumerable: false, - value: value, - writable: true - }); - } else { - object[name] = value; - } -}; + // data stored directly on the videojs object may be + // misidentified as a component to retain + // backwards-compatibility with 4.x. check to make sure the + // component class can be instantiated. + if (typeof ComponentClass !== 'function') { + return null; + } -var defineProperties = function (object, map) { - var predicates = arguments.length > 2 ? arguments[2] : {}; - var props = keys(map); - if (hasSymbols) { - props = props.concat(Object.getOwnPropertySymbols(map)); - } - foreach(props, function (name) { - defineProperty(object, name, map[name], predicates[name]); - }); -}; + component = new ComponentClass(this.player_ || this, options); -defineProperties.supportsDescriptors = !!supportsDescriptors; + // child is a component instance + } else { + component = child; + } -module.exports = defineProperties; + this.children_.splice(index, 0, component); -},{"foreach":47,"object-keys":50}],47:[function(_dereq_,module,exports){ + if (typeof component.id === 'function') { + this.childIndex_[component.id()] = component; + } -var hasOwn = Object.prototype.hasOwnProperty; -var toString = Object.prototype.toString; + // If a name wasn't used to create the component, check if we can use the + // name function of the component + componentName = componentName || component.name && component.name(); -module.exports = function forEach (obj, fn, ctx) { - if (toString.call(fn) !== '[object Function]') { - throw new TypeError('iterator must be a function'); + if (componentName) { + this.childNameIndex_[componentName] = component; } - var l = obj.length; - if (l === +l) { - for (var i = 0; i < l; i++) { - fn.call(ctx, obj[i], i, obj); - } - } else { - for (var k in obj) { - if (hasOwn.call(obj, k)) { - fn.call(ctx, obj[k], k, obj); - } - } - } -}; + // Add the UI object's element to the container div (box) + // Having an element is not required + if (typeof component.el === 'function' && component.el()) { + var childNodes = this.contentEl().children; + var refNode = childNodes[index] || null; -},{}],48:[function(_dereq_,module,exports){ -var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; -var slice = Array.prototype.slice; -var toStr = Object.prototype.toString; -var funcType = '[object Function]'; - -module.exports = function bind(that) { - var target = this; - if (typeof target !== 'function' || toStr.call(target) !== funcType) { - throw new TypeError(ERROR_MESSAGE + target); + this.contentEl().insertBefore(component.el(), refNode); } - var args = slice.call(arguments, 1); - var bound; - var binder = function () { - if (this instanceof bound) { - var result = target.apply( - this, - args.concat(slice.call(arguments)) - ); - if (Object(result) === result) { - return result; - } - return this; - } else { - return target.apply( - that, - args.concat(slice.call(arguments)) - ); - } - }; + // Return so it can stored on parent object if desired. + return component; + }; - var boundLength = Math.max(0, target.length - args.length); - var boundArgs = []; - for (var i = 0; i < boundLength; i++) { - boundArgs.push('$' + i); - } + /** + * Remove a child component from this component's list of children, and the + * child component's element from this component's element + * + * @param {Component} component Component to remove + * @method removeChild + */ - bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder); - if (target.prototype) { - var Empty = function Empty() {}; - Empty.prototype = target.prototype; - bound.prototype = new Empty(); - Empty.prototype = null; + Component.prototype.removeChild = function removeChild(component) { + if (typeof component === 'string') { + component = this.getChild(component); } - return bound; -}; - -},{}],49:[function(_dereq_,module,exports){ -var implementation = _dereq_('./implementation'); - -module.exports = Function.prototype.bind || implementation; + if (!component || !this.children_) { + return; + } -},{"./implementation":48}],50:[function(_dereq_,module,exports){ -'use strict'; + var childFound = false; -// modified from https://github.com/es-shims/es5-shim -var has = Object.prototype.hasOwnProperty; -var toStr = Object.prototype.toString; -var slice = Array.prototype.slice; -var isArgs = _dereq_('./isArguments'); -var hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'); -var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype'); -var dontEnums = [ - 'toString', - 'toLocaleString', - 'valueOf', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'constructor' -]; -var equalsConstructorPrototype = function (o) { - var ctor = o.constructor; - return ctor && ctor.prototype === o; -}; -var blacklistedKeys = { - $console: true, - $frame: true, - $frameElement: true, - $frames: true, - $parent: true, - $self: true, - $webkitIndexedDB: true, - $webkitStorageInfo: true, - $window: true -}; -var hasAutomationEqualityBug = (function () { - /* global window */ - if (typeof window === 'undefined') { return false; } - for (var k in window) { - try { - if (!blacklistedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') { - try { - equalsConstructorPrototype(window[k]); - } catch (e) { - return true; - } + for (var i = this.children_.length - 1; i >= 0; i--) { + if (this.children_[i] === component) { + childFound = true; + this.children_.splice(i, 1); + break; } - } catch (e) { - return true; } - } - return false; -}()); -var equalsConstructorPrototypeIfNotBuggy = function (o) { - /* global window */ - if (typeof window === 'undefined' || !hasAutomationEqualityBug) { - return equalsConstructorPrototype(o); - } - try { - return equalsConstructorPrototype(o); - } catch (e) { - return false; - } -}; - -var keysShim = function keys(object) { - var isObject = object !== null && typeof object === 'object'; - var isFunction = toStr.call(object) === '[object Function]'; - var isArguments = isArgs(object); - var isString = isObject && toStr.call(object) === '[object String]'; - var theKeys = []; - - if (!isObject && !isFunction && !isArguments) { - throw new TypeError('Object.keys called on a non-object'); - } - var skipProto = hasProtoEnumBug && isFunction; - if (isString && object.length > 0 && !has.call(object, 0)) { - for (var i = 0; i < object.length; ++i) { - theKeys.push(String(i)); + if (!childFound) { + return; } - } - if (isArguments && object.length > 0) { - for (var j = 0; j < object.length; ++j) { - theKeys.push(String(j)); - } - } else { - for (var name in object) { - if (!(skipProto && name === 'prototype') && has.call(object, name)) { - theKeys.push(String(name)); - } - } - } + this.childIndex_[component.id()] = null; + this.childNameIndex_[component.name()] = null; - if (hasDontEnumBug) { - var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); + var compEl = component.el(); - for (var k = 0; k < dontEnums.length; ++k) { - if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) { - theKeys.push(dontEnums[k]); - } + if (compEl && compEl.parentNode === this.contentEl()) { + this.contentEl().removeChild(component.el()); } - } - return theKeys; -}; + }; -keysShim.shim = function shimObjectKeys() { - if (Object.keys) { - var keysWorksWithArguments = (function () { - // Safari 5.0 bug - return (Object.keys(arguments) || '').length === 2; - }(1, 2)); - if (!keysWorksWithArguments) { - var originalKeys = Object.keys; - Object.keys = function keys(object) { - if (isArgs(object)) { - return originalKeys(slice.call(object)); - } else { - return originalKeys(object); - } - }; - } - } else { - Object.keys = keysShim; - } - return Object.keys || keysShim; -}; + /** + * Add and initialize default child components from options + * ```js + * // when an instance of MyComponent is created, all children in options + * // will be added to the instance by their name strings and options + * MyComponent.prototype.options_ = { + * children: [ + * 'myChildComponent' + * ], + * myChildComponent: { + * myChildOption: true + * } + * }; + * + * // Or when creating the component + * var myComp = new MyComponent(player, { + * children: [ + * 'myChildComponent' + * ], + * myChildComponent: { + * myChildOption: true + * } + * }); + * ``` + * The children option can also be an array of + * child options objects (that also include a 'name' key). + * This can be used if you have two child components of the + * same type that need different options. + * ```js + * var myComp = new MyComponent(player, { + * children: [ + * 'button', + * { + * name: 'button', + * someOtherOption: true + * }, + * { + * name: 'button', + * someOtherOption: false + * } + * ] + * }); + * ``` + * + * @method initChildren + */ -module.exports = keysShim; -},{"./isArguments":51}],51:[function(_dereq_,module,exports){ -'use strict'; + Component.prototype.initChildren = function initChildren() { + var _this = this; -var toStr = Object.prototype.toString; + var children = this.options_.children; -module.exports = function isArguments(value) { - var str = toStr.call(value); - var isArgs = str === '[object Arguments]'; - if (!isArgs) { - isArgs = str !== '[object Array]' && - value !== null && - typeof value === 'object' && - typeof value.length === 'number' && - value.length >= 0 && - toStr.call(value.callee) === '[object Function]'; - } - return isArgs; -}; + if (children) { + (function () { + // `this` is `parent` + var parentOptions = _this.options_; -},{}],52:[function(_dereq_,module,exports){ -'use strict'; + var handleAdd = function handleAdd(child) { + var name = child.name; + var opts = child.opts; -var implementation = _dereq_('./implementation'); + // Allow options for children to be set at the parent options + // e.g. videojs(id, { controlBar: false }); + // instead of videojs(id, { children: { controlBar: false }); + if (parentOptions[name] !== undefined) { + opts = parentOptions[name]; + } -var lacksProperEnumerationOrder = function () { - if (!Object.assign) { - return false; - } - // v8, specifically in node 4.x, has a bug with incorrect property enumeration order - // note: this does not detect the bug unless there's 20 characters - var str = 'abcdefghijklmnopqrst'; - var letters = str.split(''); - var map = {}; - for (var i = 0; i < letters.length; ++i) { - map[letters[i]] = letters[i]; - } - var obj = Object.assign({}, map); - var actual = ''; - for (var k in obj) { - actual += k; - } - return str !== actual; -}; + // Allow for disabling default components + // e.g. options['children']['posterImage'] = false + if (opts === false) { + return; + } -var assignHasPendingExceptions = function () { - if (!Object.assign || !Object.preventExtensions) { - return false; - } - // Firefox 37 still has "pending exception" logic in its Object.assign implementation, - // which is 72% slower than our shim, and Firefox 40's native implementation. - var thrower = Object.preventExtensions({ 1: 2 }); - try { - Object.assign(thrower, 'xy'); - } catch (e) { - return thrower[1] === 'y'; - } -}; + // Allow options to be passed as a simple boolean if no configuration + // is necessary. + if (opts === true) { + opts = {}; + } -module.exports = function getPolyfill() { - if (!Object.assign) { - return implementation; - } - if (lacksProperEnumerationOrder()) { - return implementation; - } - if (assignHasPendingExceptions()) { - return implementation; - } - return Object.assign; -}; + // We also want to pass the original player options to each component as well so they don't need to + // reach back into the player for options later. + opts.playerOptions = _this.options_.playerOptions; -},{"./implementation":44}],53:[function(_dereq_,module,exports){ -'use strict'; + // Create and add the child component. + // Add a direct reference to the child by name on the parent instance. + // If two of the same component are used, different names should be supplied + // for each + var newChild = _this.addChild(name, opts); -var define = _dereq_('define-properties'); -var getPolyfill = _dereq_('./polyfill'); + if (newChild) { + _this[name] = newChild; + } + }; -module.exports = function shimAssign() { - var polyfill = getPolyfill(); - define( - Object, - { assign: polyfill }, - { assign: function () { return Object.assign !== polyfill; } } - ); - return polyfill; -}; + // Allow for an array of children details to passed in the options + var workingChildren = void 0; + var Tech = Component.getComponent('Tech'); -},{"./polyfill":52,"define-properties":46}],54:[function(_dereq_,module,exports){ -module.exports = SafeParseTuple + if (Array.isArray(children)) { + workingChildren = children; + } else { + workingChildren = Object.keys(children); + } -function SafeParseTuple(obj, reviver) { - var json - var error = null - - try { - json = JSON.parse(obj, reviver) - } catch (err) { - error = err - } - - return [error, json] -} + workingChildren + // children that are in this.options_ but also in workingChildren would + // give us extra children we do not want. So, we want to filter them out. + .concat(Object.keys(_this.options_).filter(function (child) { + return !workingChildren.some(function (wchild) { + if (typeof wchild === 'string') { + return child === wchild; + } + return child === wchild.name; + }); + })).map(function (child) { + var name = void 0; + var opts = void 0; -},{}],55:[function(_dereq_,module,exports){ -function clean (s) { - return s.replace(/\n\r?\s*/g, '') -} + if (typeof child === 'string') { + name = child; + opts = children[name] || _this.options_[name] || {}; + } else { + name = child.name; + opts = child; + } + return { name: name, opts: opts }; + }).filter(function (child) { + // we have to make sure that child.name isn't in the techOrder since + // techs are registerd as Components but can't aren't compatible + // See https://github.com/videojs/video.js/issues/2772 + var c = Component.getComponent(child.opts.componentClass || (0, _toTitleCase2['default'])(child.name)); -module.exports = function tsml (sa) { - var s = '' - , i = 0 + return c && !Tech.isTech(c); + }).forEach(handleAdd); + })(); + } + }; - for (; i < arguments.length; i++) - s += clean(sa[i]) + (arguments[i + 1] || '') + /** + * Allows sub components to stack CSS class names + * + * @return {String} The constructed class name + * @method buildCSSClass + */ - return s -} -},{}],56:[function(_dereq_,module,exports){ -"use strict"; -var window = _dereq_("global/window") -var once = _dereq_("once") -var isFunction = _dereq_("is-function") -var parseHeaders = _dereq_("parse-headers") -var xtend = _dereq_("xtend") -module.exports = createXHR -createXHR.XMLHttpRequest = window.XMLHttpRequest || noop -createXHR.XDomainRequest = "withCredentials" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest + Component.prototype.buildCSSClass = function buildCSSClass() { + // Child classes can include a function that does: + // return 'CLASS NAME' + this._super(); + return ''; + }; -forEachArray(["get", "put", "post", "patch", "head", "delete"], function(method) { - createXHR[method === "delete" ? "del" : method] = function(uri, options, callback) { - options = initParams(uri, options, callback) - options.method = method.toUpperCase() - return _createXHR(options) - } -}) + /** + * Add an event listener to this component's element + * ```js + * var myFunc = function() { + * var myComponent = this; + * // Do something when the event is fired + * }; + * + * myComponent.on('eventType', myFunc); + * ``` + * The context of myFunc will be myComponent unless previously bound. + * Alternatively, you can add a listener to another element or component. + * ```js + * myComponent.on(otherElement, 'eventName', myFunc); + * myComponent.on(otherComponent, 'eventName', myFunc); + * ``` + * The benefit of using this over `VjsEvents.on(otherElement, 'eventName', myFunc)` + * and `otherComponent.on('eventName', myFunc)` is that this way the listeners + * will be automatically cleaned up when either component is disposed. + * It will also bind myComponent as the context of myFunc. + * **NOTE**: When using this on elements in the page other than window + * and document (both permanent), if you remove the element from the DOM + * you need to call `myComponent.trigger(el, 'dispose')` on it to clean up + * references to it and allow the browser to garbage collect it. + * + * @param {String|Component} first The event type or other component + * @param {Function|String} second The event handler or event type + * @param {Function} third The event handler + * @return {Component} + * @method on + */ -function forEachArray(array, iterator) { - for (var i = 0; i < array.length; i++) { - iterator(array[i]) - } -} -function isEmpty(obj){ - for(var i in obj){ - if(obj.hasOwnProperty(i)) return false - } - return true -} + Component.prototype.on = function on(first, second, third) { + var _this2 = this; -function initParams(uri, options, callback) { - var params = uri + if (typeof first === 'string' || Array.isArray(first)) { + Events.on(this.el_, first, Fn.bind(this, second)); - if (isFunction(options)) { - callback = options - if (typeof uri === "string") { - params = {uri:uri} - } + // Targeting another component or element } else { - params = xtend(options, {uri: uri}) - } + (function () { + var target = first; + var type = second; + var fn = Fn.bind(_this2, third); - params.callback = callback - return params -} + // When this component is disposed, remove the listener from the other component + var removeOnDispose = function removeOnDispose() { + return _this2.off(target, type, fn); + }; -function createXHR(uri, options, callback) { - options = initParams(uri, options, callback) - return _createXHR(options) -} + // Use the same function ID so we can remove it later it using the ID + // of the original listener + removeOnDispose.guid = fn.guid; + _this2.on('dispose', removeOnDispose); -function _createXHR(options) { - var callback = options.callback - if(typeof callback === "undefined"){ - throw new Error("callback argument missing") - } - callback = once(callback) + // If the other component is disposed first we need to clean the reference + // to the other component in this component's removeOnDispose listener + // Otherwise we create a memory leak. + var cleanRemover = function cleanRemover() { + return _this2.off('dispose', removeOnDispose); + }; - function readystatechange() { - if (xhr.readyState === 4) { - loadFunc() + // Add the same function ID so we can easily remove it later + cleanRemover.guid = fn.guid; + + // Check if this is a DOM node + if (first.nodeName) { + // Add the listener to the other element + Events.on(target, type, fn); + Events.on(target, 'dispose', cleanRemover); + + // Should be a component + // Not using `instanceof Component` because it makes mock players difficult + } else if (typeof first.on === 'function') { + // Add the listener to the other component + target.on(type, fn); + target.on('dispose', cleanRemover); } + })(); } - function getBody() { - // Chrome with requestType=blob throws errors arround when even testing access to responseText - var body = undefined + return this; + }; - if (xhr.response) { - body = xhr.response - } else if (xhr.responseType === "text" || !xhr.responseType) { - body = xhr.responseText || xhr.responseXML - } + /** + * Remove an event listener from this component's element + * ```js + * myComponent.off('eventType', myFunc); + * ``` + * If myFunc is excluded, ALL listeners for the event type will be removed. + * If eventType is excluded, ALL listeners will be removed from the component. + * Alternatively you can use `off` to remove listeners that were added to other + * elements or components using `myComponent.on(otherComponent...`. + * In this case both the event type and listener function are REQUIRED. + * ```js + * myComponent.off(otherElement, 'eventType', myFunc); + * myComponent.off(otherComponent, 'eventType', myFunc); + * ``` + * + * @param {String=|Component} first The event type or other component + * @param {Function=|String} second The listener function or event type + * @param {Function=} third The listener for other component + * @return {Component} + * @method off + */ - if (isJson) { - try { - body = JSON.parse(body) - } catch (e) {} - } - return body - } + Component.prototype.off = function off(first, second, third) { + if (!first || typeof first === 'string' || Array.isArray(first)) { + Events.off(this.el_, first, second); + } else { + var target = first; + var type = second; + // Ensure there's at least a guid, even if the function hasn't been used + var fn = Fn.bind(this, third); - var failureResponse = { - body: undefined, - headers: {}, - statusCode: 0, - method: method, - url: uri, - rawRequest: xhr - } + // Remove the dispose listener on this component, + // which was given the same guid as the event listener + this.off('dispose', fn); - function errorFunc(evt) { - clearTimeout(timeoutTimer) - if(!(evt instanceof Error)){ - evt = new Error("" + (evt || "Unknown XMLHttpRequest Error") ) - } - evt.statusCode = 0 - callback(evt, failureResponse) + if (first.nodeName) { + // Remove the listener + Events.off(target, type, fn); + // Remove the listener for cleaning the dispose listener + Events.off(target, 'dispose', fn); + } else { + target.off(type, fn); + target.off('dispose', fn); + } } - // will load the data & process the response in a special response object - function loadFunc() { - if (aborted) return - var status - clearTimeout(timeoutTimer) - if(options.useXDR && xhr.status===undefined) { - //IE8 CORS GET successful response doesn't have a status field, but body is fine - status = 200 - } else { - status = (xhr.status === 1223 ? 204 : xhr.status) - } - var response = failureResponse - var err = null - - if (status !== 0){ - response = { - body: getBody(), - statusCode: status, - method: method, - headers: {}, - url: uri, - rawRequest: xhr - } - if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE - response.headers = parseHeaders(xhr.getAllResponseHeaders()) - } - } else { - err = new Error("Internal XMLHttpRequest Error") - } - callback(err, response, response.body) - - } + return this; + }; - var xhr = options.xhr || null - - if (!xhr) { - if (options.cors || options.useXDR) { - xhr = new createXHR.XDomainRequest() - }else{ - xhr = new createXHR.XMLHttpRequest() - } - } + /** + * Add an event listener to be triggered only once and then removed + * ```js + * myComponent.one('eventName', myFunc); + * ``` + * Alternatively you can add a listener to another element or component + * that will be triggered only once. + * ```js + * myComponent.one(otherElement, 'eventName', myFunc); + * myComponent.one(otherComponent, 'eventName', myFunc); + * ``` + * + * @param {String|Component} first The event type or other component + * @param {Function|String} second The listener function or event type + * @param {Function=} third The listener function for other component + * @return {Component} + * @method one + */ - var key - var aborted - var uri = xhr.url = options.uri || options.url - var method = xhr.method = options.method || "GET" - var body = options.body || options.data || null - var headers = xhr.headers = options.headers || {} - var sync = !!options.sync - var isJson = false - var timeoutTimer - if ("json" in options) { - isJson = true - headers["accept"] || headers["Accept"] || (headers["Accept"] = "application/json") //Don't override existing accept header declared by user - if (method !== "GET" && method !== "HEAD") { - headers["content-type"] || headers["Content-Type"] || (headers["Content-Type"] = "application/json") //Don't override existing accept header declared by user - body = JSON.stringify(options.json) - } - } + Component.prototype.one = function one(first, second, third) { + var _this3 = this, + _arguments = arguments; - xhr.onreadystatechange = readystatechange - xhr.onload = loadFunc - xhr.onerror = errorFunc - // IE9 must have onprogress be set to a unique function. - xhr.onprogress = function () { - // IE must die - } - xhr.ontimeout = errorFunc - xhr.open(method, uri, !sync, options.username, options.password) - //has to be after open - if(!sync) { - xhr.withCredentials = !!options.withCredentials - } - // Cannot set timeout with sync request - // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly - // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent - if (!sync && options.timeout > 0 ) { - timeoutTimer = setTimeout(function(){ - aborted=true//IE9 may still call readystatechange - xhr.abort("timeout") - var e = new Error("XMLHttpRequest timeout") - e.code = "ETIMEDOUT" - errorFunc(e) - }, options.timeout ) - } + if (typeof first === 'string' || Array.isArray(first)) { + Events.one(this.el_, first, Fn.bind(this, second)); + } else { + (function () { + var target = first; + var type = second; + var fn = Fn.bind(_this3, third); - if (xhr.setRequestHeader) { - for(key in headers){ - if(headers.hasOwnProperty(key)){ - xhr.setRequestHeader(key, headers[key]) - } - } - } else if (options.headers && !isEmpty(options.headers)) { - throw new Error("Headers cannot be set on an XDomainRequest object") - } + var newFunc = function newFunc() { + _this3.off(target, type, newFunc); + fn.apply(null, _arguments); + }; - if ("responseType" in options) { - xhr.responseType = options.responseType - } + // Keep the same function ID so we can remove it later + newFunc.guid = fn.guid; - if ("beforeSend" in options && - typeof options.beforeSend === "function" - ) { - options.beforeSend(xhr) + _this3.on(target, type, newFunc); + })(); } - xhr.send(body) + return this; + }; - return xhr + /** + * Trigger an event on an element + * ```js + * myComponent.trigger('eventName'); + * myComponent.trigger({'type':'eventName'}); + * myComponent.trigger('eventName', {data: 'some data'}); + * myComponent.trigger({'type':'eventName'}, {data: 'some data'}); + * ``` + * + * @param {Event|Object|String} event A string (the type) or an event object with a type attribute + * @param {Object} [hash] data hash to pass along with the event + * @return {Component} self + * @method trigger + */ -} + Component.prototype.trigger = function trigger(event, hash) { + Events.trigger(this.el_, event, hash); + return this; + }; -function noop() {} + /** + * Bind a listener to the component's ready state. + * Different from event listeners in that if the ready event has already happened + * it will trigger the function immediately. + * + * @param {Function} fn Ready listener + * @param {Boolean} sync Exec the listener synchronously if component is ready + * @return {Component} + * @method ready + */ -},{"global/window":2,"is-function":57,"once":58,"parse-headers":61,"xtend":62}],57:[function(_dereq_,module,exports){ -module.exports = isFunction -var toString = Object.prototype.toString + Component.prototype.ready = function ready(fn) { + var sync = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; -function isFunction (fn) { - var string = toString.call(fn) - return string === '[object Function]' || - (typeof fn === 'function' && string !== '[object RegExp]') || - (typeof window !== 'undefined' && - // IE8 and below - (fn === window.setTimeout || - fn === window.alert || - fn === window.confirm || - fn === window.prompt)) -}; + if (fn) { + if (this.isReady_) { + if (sync) { + fn.call(this); + } else { + // Call the function asynchronously by default for consistency + this.setTimeout(fn, 1); + } + } else { + this.readyQueue_ = this.readyQueue_ || []; + this.readyQueue_.push(fn); + } + } + return this; + }; -},{}],58:[function(_dereq_,module,exports){ -module.exports = once + /** + * Trigger the ready listeners + * + * @return {Component} + * @method triggerReady + */ -once.proto = once(function () { - Object.defineProperty(Function.prototype, 'once', { - value: function () { - return once(this) - }, - configurable: true - }) -}) -function once (fn) { - var called = false - return function () { - if (called) return - called = true - return fn.apply(this, arguments) - } -} + Component.prototype.triggerReady = function triggerReady() { + this.isReady_ = true; -},{}],59:[function(_dereq_,module,exports){ -var isFunction = _dereq_('is-function') + // Ensure ready is triggerd asynchronously + this.setTimeout(function () { + var readyQueue = this.readyQueue_; -module.exports = forEach + // Reset Ready Queue + this.readyQueue_ = []; -var toString = Object.prototype.toString -var hasOwnProperty = Object.prototype.hasOwnProperty + if (readyQueue && readyQueue.length > 0) { + readyQueue.forEach(function (fn) { + fn.call(this); + }, this); + } -function forEach(list, iterator, context) { - if (!isFunction(iterator)) { - throw new TypeError('iterator must be a function') - } + // Allow for using event listeners also + this.trigger('ready'); + }, 1); + }; - if (arguments.length < 3) { - context = this - } - - if (toString.call(list) === '[object Array]') - forEachArray(list, iterator, context) - else if (typeof list === 'string') - forEachString(list, iterator, context) - else - forEachObject(list, iterator, context) -} + /** + * Finds a single DOM element matching `selector` within the component's + * `contentEl` or another custom context. + * + * @method $ + * @param {String} selector + * A valid CSS selector, which will be passed to `querySelector`. + * + * @param {Element|String} [context=document] + * A DOM element within which to query. Can also be a selector + * string in which case the first matching element will be used + * as context. If missing (or no element matches selector), falls + * back to `document`. + * + * @return {Element|null} + */ -function forEachArray(array, iterator, context) { - for (var i = 0, len = array.length; i < len; i++) { - if (hasOwnProperty.call(array, i)) { - iterator.call(context, array[i], i, array) - } - } -} -function forEachString(string, iterator, context) { - for (var i = 0, len = string.length; i < len; i++) { - // no such thing as a sparse string. - iterator.call(context, string.charAt(i), i, string) - } -} + Component.prototype.$ = function $(selector, context) { + return Dom.$(selector, context || this.contentEl()); + }; -function forEachObject(object, iterator, context) { - for (var k in object) { - if (hasOwnProperty.call(object, k)) { - iterator.call(context, object[k], k, object) - } - } -} + /** + * Finds a all DOM elements matching `selector` within the component's + * `contentEl` or another custom context. + * + * @method $$ + * @param {String} selector + * A valid CSS selector, which will be passed to `querySelectorAll`. + * + * @param {Element|String} [context=document] + * A DOM element within which to query. Can also be a selector + * string in which case the first matching element will be used + * as context. If missing (or no element matches selector), falls + * back to `document`. + * + * @return {NodeList} + */ -},{"is-function":57}],60:[function(_dereq_,module,exports){ -exports = module.exports = trim; + Component.prototype.$$ = function $$(selector, context) { + return Dom.$$(selector, context || this.contentEl()); + }; -function trim(str){ - return str.replace(/^\s*|\s*$/g, ''); -} + /** + * Check if a component's element has a CSS class name + * + * @param {String} classToCheck Classname to check + * @return {Component} + * @method hasClass + */ -exports.left = function(str){ - return str.replace(/^\s*/, ''); -}; -exports.right = function(str){ - return str.replace(/\s*$/, ''); -}; + Component.prototype.hasClass = function hasClass(classToCheck) { + return Dom.hasElClass(this.el_, classToCheck); + }; -},{}],61:[function(_dereq_,module,exports){ -var trim = _dereq_('trim') - , forEach = _dereq_('for-each') - , isArray = function(arg) { - return Object.prototype.toString.call(arg) === '[object Array]'; - } + /** + * Add a CSS class name to the component's element + * + * @param {String} classToAdd Classname to add + * @return {Component} + * @method addClass + */ -module.exports = function (headers) { - if (!headers) - return {} - var result = {} + Component.prototype.addClass = function addClass(classToAdd) { + Dom.addElClass(this.el_, classToAdd); + return this; + }; - forEach( - trim(headers).split('\n') - , function (row) { - var index = row.indexOf(':') - , key = trim(row.slice(0, index)).toLowerCase() - , value = trim(row.slice(index + 1)) + /** + * Remove a CSS class name from the component's element + * + * @param {String} classToRemove Classname to remove + * @return {Component} + * @method removeClass + */ - if (typeof(result[key]) === 'undefined') { - result[key] = value - } else if (isArray(result[key])) { - result[key].push(value) - } else { - result[key] = [ result[key], value ] - } - } - ) - return result -} -},{"for-each":59,"trim":60}],62:[function(_dereq_,module,exports){ -module.exports = extend + Component.prototype.removeClass = function removeClass(classToRemove) { + Dom.removeElClass(this.el_, classToRemove); + return this; + }; -var hasOwnProperty = Object.prototype.hasOwnProperty; + /** + * Add or remove a CSS class name from the component's element + * + * @param {String} classToToggle + * @param {Boolean|Function} [predicate] + * Can be a function that returns a Boolean. If `true`, the class + * will be added; if `false`, the class will be removed. If not + * given, the class will be added if not present and vice versa. + * + * @return {Component} + * @method toggleClass + */ -function extend() { - var target = {} - for (var i = 0; i < arguments.length; i++) { - var source = arguments[i] + Component.prototype.toggleClass = function toggleClass(classToToggle, predicate) { + Dom.toggleElClass(this.el_, classToToggle, predicate); + return this; + }; - for (var key in source) { - if (hasOwnProperty.call(source, key)) { - target[key] = source[key] - } - } - } + /** + * Show the component element if hidden + * + * @return {Component} + * @method show + */ - return target -} -},{}],63:[function(_dereq_,module,exports){ -/** - * @file big-play-button.js - */ -'use strict'; + Component.prototype.show = function show() { + this.removeClass('vjs-hidden'); + return this; + }; -exports.__esModule = true; + /** + * Hide the component element if currently showing + * + * @return {Component} + * @method hide + */ -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + Component.prototype.hide = function hide() { + this.addClass('vjs-hidden'); + return this; + }; -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + /** + * Lock an item in its visible state + * To be used with fadeIn/fadeOut. + * + * @return {Component} + * @private + * @method lockShowing + */ -var _buttonJs = _dereq_('./button.js'); -var _buttonJs2 = _interopRequireDefault(_buttonJs); + Component.prototype.lockShowing = function lockShowing() { + this.addClass('vjs-lock-showing'); + return this; + }; -var _componentJs = _dereq_('./component.js'); + /** + * Unlock an item to be hidden + * To be used with fadeIn/fadeOut. + * + * @return {Component} + * @private + * @method unlockShowing + */ -var _componentJs2 = _interopRequireDefault(_componentJs); -/** - * Initial play button. Shows before the video has played. The hiding of the - * big play button is done via CSS and player states. - * - * @param {Object} player Main Player - * @param {Object=} options Object of option names and values - * @extends Button - * @class BigPlayButton - */ + Component.prototype.unlockShowing = function unlockShowing() { + this.removeClass('vjs-lock-showing'); + return this; + }; -var BigPlayButton = (function (_Button) { - _inherits(BigPlayButton, _Button); + /** + * Get the value of an attribute on the component's element + * + * @param {String} attribute Attribute to get + * @return {String} + * @method getAttribute + */ - function BigPlayButton(player, options) { - _classCallCheck(this, BigPlayButton); - _Button.call(this, player, options); - } + Component.prototype.getAttribute = function getAttribute(attribute) { + return Dom.getAttribute(this.el_, attribute); + }; /** - * Allow sub components to stack CSS class names + * Set the value of an attribute on the component's element * - * @return {String} The constructed class name - * @method buildCSSClass + * @param {String} attribute Attribute to set + * @param {String} value Value to set the attribute to + * @return {Component} + * @method setAttribute */ - BigPlayButton.prototype.buildCSSClass = function buildCSSClass() { - return 'vjs-big-play-button'; + + Component.prototype.setAttribute = function setAttribute(attribute, value) { + Dom.setAttribute(this.el_, attribute, value); + return this; }; /** - * Handles click for play + * Remove an attribute from the component's element * - * @method handleClick + * @param {String} attribute Attribute to remove + * @return {Component} + * @method removeAttribute */ - BigPlayButton.prototype.handleClick = function handleClick() { - this.player_.play(); - }; - return BigPlayButton; -})(_buttonJs2['default']); + Component.prototype.removeAttribute = function removeAttribute(attribute) { + Dom.removeAttribute(this.el_, attribute); + return this; + }; -BigPlayButton.prototype.controlText_ = 'Play Video'; + /** + * Set or get the width of the component (CSS values) + * Setting the video tag dimension values only works with values in pixels. + * Percent values will not work. + * Some percents can be used, but width()/height() will return the number + %, + * not the actual computed width/height. + * + * @param {Number|String=} num Optional width number + * @param {Boolean} skipListeners Skip the 'resize' event trigger + * @return {Component} This component, when setting the width + * @return {Number|String} The width, when getting + * @method width + */ -_componentJs2['default'].registerComponent('BigPlayButton', BigPlayButton); -exports['default'] = BigPlayButton; -module.exports = exports['default']; -},{"./button.js":64,"./component.js":67}],64:[function(_dereq_,module,exports){ -/** - * @file button.js - */ -'use strict'; + Component.prototype.width = function width(num, skipListeners) { + return this.dimension('width', num, skipListeners); + }; -exports.__esModule = true; + /** + * Get or set the height of the component (CSS values) + * Setting the video tag dimension values only works with values in pixels. + * Percent values will not work. + * Some percents can be used, but width()/height() will return the number + %, + * not the actual computed width/height. + * + * @param {Number|String=} num New component height + * @param {Boolean=} skipListeners Skip the resize event trigger + * @return {Component} This component, when setting the height + * @return {Number|String} The height, when getting + * @method height + */ -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + Component.prototype.height = function height(num, skipListeners) { + return this.dimension('height', num, skipListeners); + }; -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + /** + * Set both width and height at the same time + * + * @param {Number|String} width Width of player + * @param {Number|String} height Height of player + * @return {Component} The component + * @method dimensions + */ -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var _clickableComponentJs = _dereq_('./clickable-component.js'); + Component.prototype.dimensions = function dimensions(width, height) { + // Skip resize listeners on width for optimization + return this.width(width, true).height(height); + }; -var _clickableComponentJs2 = _interopRequireDefault(_clickableComponentJs); - -var _component = _dereq_('./component'); - -var _component2 = _interopRequireDefault(_component); + /** + * Get or set width or height + * This is the shared code for the width() and height() methods. + * All for an integer, integer + 'px' or integer + '%'; + * Known issue: Hidden elements officially have a width of 0. We're defaulting + * to the style.width value and falling back to computedStyle which has the + * hidden element issue. Info, but probably not an efficient fix: + * http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/ + * + * @param {String} widthOrHeight 'width' or 'height' + * @param {Number|String=} num New dimension + * @param {Boolean=} skipListeners Skip resize event trigger + * @return {Component} The component if a dimension was set + * @return {Number|String} The dimension if nothing was set + * @private + * @method dimension + */ -var _utilsEventsJs = _dereq_('./utils/events.js'); -var Events = _interopRequireWildcard(_utilsEventsJs); + Component.prototype.dimension = function dimension(widthOrHeight, num, skipListeners) { + if (num !== undefined) { + // Set to zero if null or literally NaN (NaN !== NaN) + if (num === null || num !== num) { + num = 0; + } -var _utilsFnJs = _dereq_('./utils/fn.js'); + // Check if using css width/height (% or px) and adjust + if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) { + this.el_.style[widthOrHeight] = num; + } else if (num === 'auto') { + this.el_.style[widthOrHeight] = ''; + } else { + this.el_.style[widthOrHeight] = num + 'px'; + } -var Fn = _interopRequireWildcard(_utilsFnJs); + // skipListeners allows us to avoid triggering the resize event when setting both width and height + if (!skipListeners) { + this.trigger('resize'); + } -var _utilsLogJs = _dereq_('./utils/log.js'); + // Return component + return this; + } -var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs); + // Not setting a value, so getting it + // Make sure element exists + if (!this.el_) { + return 0; + } -var _globalDocument = _dereq_('global/document'); + // Get dimension value from style + var val = this.el_.style[widthOrHeight]; + var pxIndex = val.indexOf('px'); -var _globalDocument2 = _interopRequireDefault(_globalDocument); + if (pxIndex !== -1) { + // Return the pixel value with no 'px' + return parseInt(val.slice(0, pxIndex), 10); + } -var _objectAssign = _dereq_('object.assign'); + // No px so using % or no style was set, so falling back to offsetWidth/height + // If component has display:none, offset will return 0 + // TODO: handle display:none and no dimension style using px + return parseInt(this.el_['offset' + (0, _toTitleCase2['default'])(widthOrHeight)], 10); + }; -var _objectAssign2 = _interopRequireDefault(_objectAssign); + /** + * Get width or height of computed style + * @param {String} widthOrHeight 'width' or 'height' + * @return {Number|Boolean} The bolean false if nothing was set + * @method currentDimension + */ -/** - * Base class for all buttons - * - * @param {Object} player Main Player - * @param {Object=} options Object of option names and values - * @extends ClickableComponent - * @class Button - */ -var Button = (function (_ClickableComponent) { - _inherits(Button, _ClickableComponent); + Component.prototype.currentDimension = function currentDimension(widthOrHeight) { + var computedWidthOrHeight = 0; - function Button(player, options) { - _classCallCheck(this, Button); + if (widthOrHeight !== 'width' && widthOrHeight !== 'height') { + throw new Error('currentDimension only accepts width or height value'); + } - _ClickableComponent.call(this, player, options); - } + if (typeof _window2['default'].getComputedStyle === 'function') { + var computedStyle = _window2['default'].getComputedStyle(this.el_); - /** - * Create the component's DOM element - * - * @param {String=} type Element's node type. e.g. 'div' - * @param {Object=} props An object of properties that should be set on the element - * @param {Object=} attributes An object of attributes that should be set on the element - * @return {Element} - * @method createEl - */ + computedWidthOrHeight = computedStyle.getPropertyValue(widthOrHeight) || computedStyle[widthOrHeight]; + } - Button.prototype.createEl = function createEl() { - var tag = arguments.length <= 0 || arguments[0] === undefined ? 'button' : arguments[0]; - var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + // remove 'px' from variable and parse as integer + computedWidthOrHeight = parseFloat(computedWidthOrHeight); - props = _objectAssign2['default']({ - className: this.buildCSSClass() - }, props); + // if the computed value is still 0, it's possible that the browser is lying + // and we want to check the offset values. + // This code also runs on IE8 and wherever getComputedStyle doesn't exist. + if (computedWidthOrHeight === 0) { + var rule = 'offset' + (0, _toTitleCase2['default'])(widthOrHeight); - if (tag !== 'button') { - _utilsLogJs2['default'].warn('Creating a Button with an HTML element of ' + tag + ' is deprecated; use ClickableComponent instead.'); + computedWidthOrHeight = this.el_[rule]; } - // Add attributes for button element - attributes = _objectAssign2['default']({ - type: 'button', // Necessary since the default button type is "submit" - 'aria-live': 'polite' // let the screen reader user know that the text of the button may change - }, attributes); + return computedWidthOrHeight; + }; - var el = _component2['default'].prototype.createEl.call(this, tag, props, attributes); + /** + * Get an object which contains width and height values of computed style + * @return {Object} The dimensions of element + * @method currentDimensions + */ - this.createControlTextEl(el); - return el; + Component.prototype.currentDimensions = function currentDimensions() { + return { + width: this.currentDimension('width'), + height: this.currentDimension('height') + }; }; /** - * Adds a child component inside this button - * - * @param {String|Component} child The class name or instance of a child to add - * @param {Object=} options Options, including options to be passed to children of the child. - * @return {Component} The child component (created by this process if a string was used) - * @deprecated - * @method addChild + * Get width of computed style + * @return {Integer} + * @method currentWidth */ - Button.prototype.addChild = function addChild(child) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - var className = this.constructor.name; - _utilsLogJs2['default'].warn('Adding an actionable (user controllable) child to a Button (' + className + ') is not supported; use a ClickableComponent instead.'); + Component.prototype.currentWidth = function currentWidth() { + return this.currentDimension('width'); + }; - // Avoid the error message generated by ClickableComponent's addChild method - return _component2['default'].prototype.addChild.call(this, child, options); + /** + * Get height of computed style + * @return {Integer} + * @method currentHeight + */ + + + Component.prototype.currentHeight = function currentHeight() { + return this.currentDimension('height'); }; /** - * Handle KeyPress (document level) - Extend with specific functionality for button + * Emit 'tap' events when touch events are supported + * This is used to support toggling the controls through a tap on the video. + * We're requiring them to be enabled because otherwise every component would + * have this extra overhead unnecessarily, on mobile devices where extra + * overhead is especially bad. * - * @method handleKeyPress + * @private + * @method emitTapEvents */ - Button.prototype.handleKeyPress = function handleKeyPress(event) { - // Ignore Space (32) or Enter (13) key operation, which is handled by the browser for a button. - if (event.which === 32 || event.which === 13) {} else { - _ClickableComponent.prototype.handleKeyPress.call(this, event); // Pass keypress handling up for unsupported keys - } - }; - return Button; -})(_clickableComponentJs2['default']); + Component.prototype.emitTapEvents = function emitTapEvents() { + // Track the start time so we can determine how long the touch lasted + var touchStart = 0; + var firstTouch = null; -_component2['default'].registerComponent('Button', Button); -exports['default'] = Button; -module.exports = exports['default']; + // Maximum movement allowed during a touch event to still be considered a tap + // Other popular libs use anywhere from 2 (hammer.js) to 15, so 10 seems like a nice, round number. + var tapMovementThreshold = 10; -},{"./clickable-component.js":65,"./component":67,"./utils/events.js":133,"./utils/fn.js":134,"./utils/log.js":137,"global/document":1,"object.assign":45}],65:[function(_dereq_,module,exports){ -/** - * @file button.js - */ -'use strict'; + // The maximum length a touch can be while still being considered a tap + var touchTimeThreshold = 200; -exports.__esModule = true; + var couldBeTap = void 0; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + this.on('touchstart', function (event) { + // If more than one finger, don't consider treating this as a click + if (event.touches.length === 1) { + // Copy pageX/pageY from the object + firstTouch = { + pageX: event.touches[0].pageX, + pageY: event.touches[0].pageY + }; + // Record start time so we can detect a tap vs. "touch and hold" + touchStart = new Date().getTime(); + // Reset couldBeTap tracking + couldBeTap = true; + } + }); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + this.on('touchmove', function (event) { + // If more than one finger, don't consider treating this as a click + if (event.touches.length > 1) { + couldBeTap = false; + } else if (firstTouch) { + // Some devices will throw touchmoves for all but the slightest of taps. + // So, if we moved only a small distance, this could still be a tap + var xdiff = event.touches[0].pageX - firstTouch.pageX; + var ydiff = event.touches[0].pageY - firstTouch.pageY; + var touchDistance = Math.sqrt(xdiff * xdiff + ydiff * ydiff); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + if (touchDistance > tapMovementThreshold) { + couldBeTap = false; + } + } + }); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + var noTap = function noTap() { + couldBeTap = false; + }; -var _component = _dereq_('./component'); + // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s + this.on('touchleave', noTap); + this.on('touchcancel', noTap); -var _component2 = _interopRequireDefault(_component); + // When the touch ends, measure how long it took and trigger the appropriate + // event + this.on('touchend', function (event) { + firstTouch = null; + // Proceed only if the touchmove/leave/cancel event didn't happen + if (couldBeTap === true) { + // Measure how long the touch lasted + var touchTime = new Date().getTime() - touchStart; -var _utilsDomJs = _dereq_('./utils/dom.js'); + // Make sure the touch was less than the threshold to be considered a tap + if (touchTime < touchTimeThreshold) { + // Don't let browser turn this into a click + event.preventDefault(); + this.trigger('tap'); + // It may be good to copy the touchend event object and change the + // type to tap, if the other event properties aren't exact after + // Events.fixEvent runs (e.g. event.target) + } + } + }); + }; -var Dom = _interopRequireWildcard(_utilsDomJs); + /** + * Report user touch activity when touch events occur + * User activity is used to determine when controls should show/hide. It's + * relatively simple when it comes to mouse events, because any mouse event + * should show the controls. So we capture mouse events that bubble up to the + * player and report activity when that happens. + * With touch events it isn't as easy. We can't rely on touch events at the + * player level, because a tap (touchstart + touchend) on the video itself on + * mobile devices is meant to turn controls off (and on). User activity is + * checked asynchronously, so what could happen is a tap event on the video + * turns the controls off, then the touchend event bubbles up to the player, + * which if it reported user activity, would turn the controls right back on. + * (We also don't want to completely block touch events from bubbling up) + * Also a touchmove, touch+hold, and anything other than a tap is not supposed + * to turn the controls back on on a mobile device. + * Here we're setting the default component behavior to report user activity + * whenever touch events happen, and this can be turned off by components that + * want touch events to act differently. + * + * @method enableTouchActivity + */ -var _utilsEventsJs = _dereq_('./utils/events.js'); -var Events = _interopRequireWildcard(_utilsEventsJs); + Component.prototype.enableTouchActivity = function enableTouchActivity() { + // Don't continue if the root player doesn't support reporting user activity + if (!this.player() || !this.player().reportUserActivity) { + return; + } -var _utilsFnJs = _dereq_('./utils/fn.js'); + // listener for reporting that the user is active + var report = Fn.bind(this.player(), this.player().reportUserActivity); -var Fn = _interopRequireWildcard(_utilsFnJs); + var touchHolding = void 0; -var _utilsLogJs = _dereq_('./utils/log.js'); + this.on('touchstart', function () { + report(); + // For as long as the they are touching the device or have their mouse down, + // we consider them active even if they're not moving their finger or mouse. + // So we want to continue to update that they are active + this.clearInterval(touchHolding); + // report at the same interval as activityCheck + touchHolding = this.setInterval(report, 250); + }); -var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs); + var touchEnd = function touchEnd(event) { + report(); + // stop the interval that maintains activity if the touch is holding + this.clearInterval(touchHolding); + }; -var _globalDocument = _dereq_('global/document'); + this.on('touchmove', report); + this.on('touchend', touchEnd); + this.on('touchcancel', touchEnd); + }; -var _globalDocument2 = _interopRequireDefault(_globalDocument); + /** + * Creates timeout and sets up disposal automatically. + * + * @param {Function} fn The function to run after the timeout. + * @param {Number} timeout Number of ms to delay before executing specified function. + * @return {Number} Returns the timeout ID + * @method setTimeout + */ -var _objectAssign = _dereq_('object.assign'); -var _objectAssign2 = _interopRequireDefault(_objectAssign); + Component.prototype.setTimeout = function setTimeout(fn, timeout) { + fn = Fn.bind(this, fn); -/** - * Clickable Component which is clickable or keyboard actionable, but is not a native HTML button - * - * @param {Object} player Main Player - * @param {Object=} options Object of option names and values - * @extends Component - * @class ClickableComponent - */ - -var ClickableComponent = (function (_Component) { - _inherits(ClickableComponent, _Component); + // window.setTimeout would be preferable here, but due to some bizarre issue with Sinon and/or Phantomjs, we can't. + var timeoutId = _window2['default'].setTimeout(fn, timeout); - function ClickableComponent(player, options) { - _classCallCheck(this, ClickableComponent); + var disposeFn = function disposeFn() { + this.clearTimeout(timeoutId); + }; - _Component.call(this, player, options); + disposeFn.guid = 'vjs-timeout-' + timeoutId; - this.emitTapEvents(); + this.on('dispose', disposeFn); - this.on('tap', this.handleClick); - this.on('click', this.handleClick); - this.on('focus', this.handleFocus); - this.on('blur', this.handleBlur); - } + return timeoutId; + }; /** - * Create the component's DOM element + * Clears a timeout and removes the associated dispose listener * - * @param {String=} type Element's node type. e.g. 'div' - * @param {Object=} props An object of properties that should be set on the element - * @param {Object=} attributes An object of attributes that should be set on the element - * @return {Element} - * @method createEl + * @param {Number} timeoutId The id of the timeout to clear + * @return {Number} Returns the timeout ID + * @method clearTimeout */ - ClickableComponent.prototype.createEl = function createEl() { - var tag = arguments.length <= 0 || arguments[0] === undefined ? 'div' : arguments[0]; - var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; - - props = _objectAssign2['default']({ - className: this.buildCSSClass(), - tabIndex: 0 - }, props); - if (tag === 'button') { - _utilsLogJs2['default'].error('Creating a ClickableComponent with an HTML element of ' + tag + ' is not supported; use a Button instead.'); - } + Component.prototype.clearTimeout = function clearTimeout(timeoutId) { + _window2['default'].clearTimeout(timeoutId); - // Add ARIA attributes for clickable element which is not a native HTML button - attributes = _objectAssign2['default']({ - role: 'button', - 'aria-live': 'polite' // let the screen reader user know that the text of the element may change - }, attributes); + var disposeFn = function disposeFn() {}; - var el = _Component.prototype.createEl.call(this, tag, props, attributes); + disposeFn.guid = 'vjs-timeout-' + timeoutId; - this.createControlTextEl(el); + this.off('dispose', disposeFn); - return el; + return timeoutId; }; /** - * create control text + * Creates an interval and sets up disposal automatically. * - * @param {Element} el Parent element for the control text - * @return {Element} - * @method controlText + * @param {Function} fn The function to run every N seconds. + * @param {Number} interval Number of ms to delay before executing specified function. + * @return {Number} Returns the interval ID + * @method setInterval */ - ClickableComponent.prototype.createControlTextEl = function createControlTextEl(el) { - this.controlTextEl_ = Dom.createEl('span', { - className: 'vjs-control-text' - }); - if (el) { - el.appendChild(this.controlTextEl_); - } + Component.prototype.setInterval = function setInterval(fn, interval) { + fn = Fn.bind(this, fn); - this.controlText(this.controlText_); + var intervalId = _window2['default'].setInterval(fn, interval); - return this.controlTextEl_; + var disposeFn = function disposeFn() { + this.clearInterval(intervalId); + }; + + disposeFn.guid = 'vjs-interval-' + intervalId; + + this.on('dispose', disposeFn); + + return intervalId; }; /** - * Controls text - both request and localize + * Clears an interval and removes the associated dispose listener * - * @param {String} text Text for element - * @return {String} - * @method controlText + * @param {Number} intervalId The id of the interval to clear + * @return {Number} Returns the interval ID + * @method clearInterval */ - ClickableComponent.prototype.controlText = function controlText(text) { - if (!text) return this.controlText_ || 'Need Text'; - this.controlText_ = text; - this.controlTextEl_.innerHTML = this.localize(this.controlText_); + Component.prototype.clearInterval = function clearInterval(intervalId) { + _window2['default'].clearInterval(intervalId); - return this; - }; + var disposeFn = function disposeFn() {}; - /** - * Allows sub components to stack CSS class names - * - * @return {String} - * @method buildCSSClass - */ + disposeFn.guid = 'vjs-interval-' + intervalId; - ClickableComponent.prototype.buildCSSClass = function buildCSSClass() { - return 'vjs-control vjs-button ' + _Component.prototype.buildCSSClass.call(this); + this.off('dispose', disposeFn); + + return intervalId; }; /** - * Adds a child component inside this clickable-component + * Registers a component * - * @param {String|Component} child The class name or instance of a child to add - * @param {Object=} options Options, including options to be passed to children of the child. - * @return {Component} The child component (created by this process if a string was used) - * @method addChild + * @param {String} name Name of the component to register + * @param {Object} comp The component to register + * @static + * @method registerComponent */ - ClickableComponent.prototype.addChild = function addChild(child) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - // TODO: Fix adding an actionable child to a ClickableComponent; currently - // it will cause issues with assistive technology (e.g. screen readers) - // which support ARIA, since an element with role="button" cannot have - // actionable child elements. + Component.registerComponent = function registerComponent(name, comp) { + if (!name) { + return; + } + + name = (0, _toTitleCase2['default'])(name); + + if (!Component.components_) { + Component.components_ = {}; + } - //let className = this.constructor.name; - //log.warn(`Adding a child to a ClickableComponent (${className}) can cause issues with assistive technology which supports ARIA, since an element with role="button" cannot have actionable child elements.`); + Component.components_[name] = comp; - return _Component.prototype.addChild.call(this, child, options); + return comp; }; /** - * Handle Click - Override with specific functionality for component + * Gets a component by name * - * @method handleClick + * @param {String} name Name of the component to get + * @return {Component} + * @static + * @method getComponent */ - ClickableComponent.prototype.handleClick = function handleClick() {}; - /** - * Handle Focus - Add keyboard functionality to element - * - * @method handleFocus - */ + Component.getComponent = function getComponent(name) { + if (!name) { + return; + } - ClickableComponent.prototype.handleFocus = function handleFocus() { - Events.on(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress)); - }; + name = (0, _toTitleCase2['default'])(name); - /** - * Handle KeyPress (document level) - Trigger click when Space or Enter key is pressed - * - * @method handleKeyPress - */ + if (Component.components_ && Component.components_[name]) { + return Component.components_[name]; + } - ClickableComponent.prototype.handleKeyPress = function handleKeyPress(event) { - // Support Space (32) or Enter (13) key operation to fire a click event - if (event.which === 32 || event.which === 13) { - event.preventDefault(); - this.handleClick(event); - } else if (_Component.prototype.handleKeyPress) { - _Component.prototype.handleKeyPress.call(this, event); // Pass keypress handling up for unsupported keys + if (_window2['default'] && _window2['default'].videojs && _window2['default'].videojs[name]) { + _log2['default'].warn('The ' + name + ' component was added to the videojs object when it should be registered using videojs.registerComponent(name, component)'); + + return _window2['default'].videojs[name]; } }; /** - * Handle Blur - Remove keyboard triggers + * Sets up the constructor using the supplied init method + * or uses the init of the parent object * - * @method handleBlur + * @param {Object} props An object of properties + * @static + * @deprecated + * @method extend */ - ClickableComponent.prototype.handleBlur = function handleBlur() { - Events.off(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress)); - }; - return ClickableComponent; -})(_component2['default']); + Component.extend = function extend(props) { + props = props || {}; -_component2['default'].registerComponent('ClickableComponent', ClickableComponent); -exports['default'] = ClickableComponent; -module.exports = exports['default']; + _log2['default'].warn('Component.extend({}) has been deprecated, use videojs.extend(Component, {}) instead'); -},{"./component":67,"./utils/dom.js":132,"./utils/events.js":133,"./utils/fn.js":134,"./utils/log.js":137,"global/document":1,"object.assign":45}],66:[function(_dereq_,module,exports){ -'use strict'; + // Set up the constructor using the supplied init method + // or using the init of the parent object + // Make sure to check the unobfuscated version for external libs + var init = props.init || props.init || this.prototype.init || this.prototype.init || function () {}; + // In Resig's simple class inheritance (previously used) the constructor + // is a function that calls `this.init.apply(arguments)` + // However that would prevent us from using `ParentObject.call(this);` + // in a Child constructor because the `this` in `this.init` + // would still refer to the Child and cause an infinite loop. + // We would instead have to do + // `ParentObject.prototype.init.apply(this, arguments);` + // Bleh. We're not creating a _super() function, so it's good to keep + // the parent constructor reference simple. + var subObj = function subObj() { + init.apply(this, arguments); + }; -exports.__esModule = true; + // Inherit from this object's prototype + subObj.prototype = Object.create(this.prototype); + // Reset the constructor property for subObj otherwise + // instances of subObj would have the constructor of the parent Object + subObj.prototype.constructor = subObj; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + // Make the class extendable + subObj.extend = Component.extend; -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + // Extend subObj's prototype with functions and other properties from props + for (var name in props) { + if (props.hasOwnProperty(name)) { + subObj.prototype[name] = props[name]; + } + } -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + return subObj; + }; -var _button = _dereq_('./button'); + return Component; +}(); -var _button2 = _interopRequireDefault(_button); +Component.registerComponent('Component', Component); +exports['default'] = Component; -var _component = _dereq_('./component'); +},{"82":82,"83":83,"84":84,"86":86,"87":87,"88":88,"92":92,"96":96}],6:[function(_dereq_,module,exports){ +'use strict'; -var _component2 = _interopRequireDefault(_component); +exports.__esModule = true; -/** - * The `CloseButton` component is a button which fires a "close" event - * when it is activated. - * - * @extends Button - * @class CloseButton - */ +var _trackButton = _dereq_(36); -var CloseButton = (function (_Button) { - _inherits(CloseButton, _Button); +var _trackButton2 = _interopRequireDefault(_trackButton); - function CloseButton(player, options) { - _classCallCheck(this, CloseButton); +var _component = _dereq_(5); - _Button.call(this, player, options); - this.controlText(options && options.controlText || this.localize('Close')); - } +var _component2 = _interopRequireDefault(_component); - CloseButton.prototype.buildCSSClass = function buildCSSClass() { - return 'vjs-close-button ' + _Button.prototype.buildCSSClass.call(this); - }; +var _audioTrackMenuItem = _dereq_(7); - CloseButton.prototype.handleClick = function handleClick() { - this.trigger({ type: 'close', bubbles: false }); - }; +var _audioTrackMenuItem2 = _interopRequireDefault(_audioTrackMenuItem); - return CloseButton; -})(_button2['default']); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file audio-track-button.js + */ -_component2['default'].registerComponent('CloseButton', CloseButton); -exports['default'] = CloseButton; -module.exports = exports['default']; -},{"./button":64,"./component":67}],67:[function(_dereq_,module,exports){ /** - * @file component.js + * The base class for buttons that toggle specific text track types (e.g. subtitles) * - * Player Component - Base class for all UI objects + * @param {Player|Object} player + * @param {Object=} options + * @extends TrackButton + * @class AudioTrackButton */ +var AudioTrackButton = function (_TrackButton) { + _inherits(AudioTrackButton, _TrackButton); -'use strict'; - -exports.__esModule = true; + function AudioTrackButton(player) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + _classCallCheck(this, AudioTrackButton); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + options.tracks = player.audioTracks && player.audioTracks(); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + var _this = _possibleConstructorReturn(this, _TrackButton.call(this, player, options)); -var _globalWindow = _dereq_('global/window'); + _this.el_.setAttribute('aria-label', 'Audio Menu'); + return _this; + } -var _globalWindow2 = _interopRequireDefault(_globalWindow); + /** + * Allow sub components to stack CSS class names + * + * @return {String} The constructed class name + * @method buildCSSClass + */ -var _utilsDomJs = _dereq_('./utils/dom.js'); -var Dom = _interopRequireWildcard(_utilsDomJs); + AudioTrackButton.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-audio-button ' + _TrackButton.prototype.buildCSSClass.call(this); + }; -var _utilsFnJs = _dereq_('./utils/fn.js'); + /** + * Create a menu item for each audio track + * + * @return {Array} Array of menu items + * @method createItems + */ -var Fn = _interopRequireWildcard(_utilsFnJs); -var _utilsGuidJs = _dereq_('./utils/guid.js'); + AudioTrackButton.prototype.createItems = function createItems() { + var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; -var Guid = _interopRequireWildcard(_utilsGuidJs); + var tracks = this.player_.audioTracks && this.player_.audioTracks(); -var _utilsEventsJs = _dereq_('./utils/events.js'); + if (!tracks) { + return items; + } -var Events = _interopRequireWildcard(_utilsEventsJs); + for (var i = 0; i < tracks.length; i++) { + var track = tracks[i]; -var _utilsLogJs = _dereq_('./utils/log.js'); + items.push(new _audioTrackMenuItem2['default'](this.player_, { + track: track, + // MenuItem is selectable + selectable: true + })); + } -var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs); + return items; + }; -var _utilsToTitleCaseJs = _dereq_('./utils/to-title-case.js'); + return AudioTrackButton; +}(_trackButton2['default']); -var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs); +AudioTrackButton.prototype.controlText_ = 'Audio Track'; +_component2['default'].registerComponent('AudioTrackButton', AudioTrackButton); +exports['default'] = AudioTrackButton; -var _objectAssign = _dereq_('object.assign'); +},{"36":36,"5":5,"7":7}],7:[function(_dereq_,module,exports){ +'use strict'; -var _objectAssign2 = _interopRequireDefault(_objectAssign); +exports.__esModule = true; -var _utilsMergeOptionsJs = _dereq_('./utils/merge-options.js'); +var _menuItem = _dereq_(48); -var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs); +var _menuItem2 = _interopRequireDefault(_menuItem); -/** - * Base UI Component class - * Components are embeddable UI objects that are represented by both a - * javascript object and an element in the DOM. They can be children of other - * components, and can have many children themselves. - * ```js - * // adding a button to the player - * var button = player.addChild('button'); - * button.el(); // -> button element - * ``` - * ```html - *
- *
Button
- *
- * ``` - * Components are also event targets. - * ```js - * button.on('click', function(){ - * console.log('Button Clicked!'); - * }); - * button.trigger('customevent'); - * ``` - * - * @param {Object} player Main Player - * @param {Object=} options Object of option names and values - * @param {Function=} ready Ready callback function - * @class Component - */ +var _component = _dereq_(5); -var Component = (function () { - function Component(player, options, ready) { - _classCallCheck(this, Component); +var _component2 = _interopRequireDefault(_component); - // The component might be the player itself and we can't pass `this` to super - if (!player && this.play) { - this.player_ = player = this; // eslint-disable-line - } else { - this.player_ = player; - } +var _fn = _dereq_(84); - // Make a copy of prototype.options_ to protect against overriding defaults - this.options_ = _utilsMergeOptionsJs2['default']({}, this.options_); +var Fn = _interopRequireWildcard(_fn); - // Updated options with supplied options - options = this.options_ = _utilsMergeOptionsJs2['default'](this.options_, options); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - // Get ID from options or options element if one is supplied - this.id_ = options.id || options.el && options.el.id; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - // If there was no ID from the options, generate one - if (!this.id_) { - // Don't require the player ID function in the case of mock players - var id = player && player.id && player.id() || 'no_player'; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - this.id_ = id + '_component_' + Guid.newGUID(); - } +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - this.name_ = options.name || null; +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file audio-track-menu-item.js + */ - // Create element if one wasn't provided in options - if (options.el) { - this.el_ = options.el; - } else if (options.createEl !== false) { - this.el_ = this.createEl(); - } - this.children_ = []; - this.childIndex_ = {}; - this.childNameIndex_ = {}; +/** + * The audio track menu item + * + * @param {Player|Object} player + * @param {Object=} options + * @extends MenuItem + * @class AudioTrackMenuItem + */ +var AudioTrackMenuItem = function (_MenuItem) { + _inherits(AudioTrackMenuItem, _MenuItem); - // Add any child components in options - if (options.initChildren !== false) { - this.initChildren(); - } + function AudioTrackMenuItem(player, options) { + _classCallCheck(this, AudioTrackMenuItem); - this.ready(ready); - // Don't want to trigger ready here or it will before init is actually - // finished for all children that run this constructor + var track = options.track; + var tracks = player.audioTracks(); - if (options.reportTouchActivity !== false) { - this.enableTouchActivity(); + // Modify options for parent MenuItem class's init. + options.label = track.label || track.language || 'Unknown'; + options.selected = track.enabled; + + var _this = _possibleConstructorReturn(this, _MenuItem.call(this, player, options)); + + _this.track = track; + + if (tracks) { + (function () { + var changeHandler = Fn.bind(_this, _this.handleTracksChange); + + tracks.addEventListener('change', changeHandler); + _this.on('dispose', function () { + tracks.removeEventListener('change', changeHandler); + }); + })(); } + return _this; } /** - * Dispose of the component and all child components + * Handle click on audio track * - * @method dispose + * @method handleClick */ - Component.prototype.dispose = function dispose() { - this.trigger({ type: 'dispose', bubbles: false }); - - // Dispose all children. - if (this.children_) { - for (var i = this.children_.length - 1; i >= 0; i--) { - if (this.children_[i].dispose) { - this.children_[i].dispose(); - } - } - } - // Delete child references - this.children_ = null; - this.childIndex_ = null; - this.childNameIndex_ = null; + AudioTrackMenuItem.prototype.handleClick = function handleClick(event) { + var tracks = this.player_.audioTracks(); - // Remove all event listeners. - this.off(); + _MenuItem.prototype.handleClick.call(this, event); - // Remove element from DOM - if (this.el_.parentNode) { - this.el_.parentNode.removeChild(this.el_); + if (!tracks) { + return; } - Dom.removeElData(this.el_); - this.el_ = null; + for (var i = 0; i < tracks.length; i++) { + var track = tracks[i]; + + track.enabled = track === this.track; + } }; /** - * Return the component's player + * Handle audio track change * - * @return {Player} - * @method player + * @method handleTracksChange */ - Component.prototype.player = function player() { - return this.player_; + + AudioTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) { + this.selected(this.track.enabled); }; - /** - * Deep merge of options objects - * Whenever a property is an object on both options objects - * the two properties will be merged using mergeOptions. - * - * ```js - * Parent.prototype.options_ = { - * optionSet: { - * 'childOne': { 'foo': 'bar', 'asdf': 'fdsa' }, - * 'childTwo': {}, - * 'childThree': {} - * } - * } - * newOptions = { - * optionSet: { - * 'childOne': { 'foo': 'baz', 'abc': '123' } - * 'childTwo': null, - * 'childFour': {} - * } - * } - * - * this.options(newOptions); - * ``` - * RESULT - * ```js - * { - * optionSet: { - * 'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' }, - * 'childTwo': null, // Disabled. Won't be initialized. - * 'childThree': {}, - * 'childFour': {} - * } - * } - * ``` - * - * @param {Object} obj Object of new option values - * @return {Object} A NEW object of this.options_ and obj merged - * @method options - */ + return AudioTrackMenuItem; +}(_menuItem2['default']); - Component.prototype.options = function options(obj) { - _utilsLogJs2['default'].warn('this.options() has been deprecated and will be moved to the constructor in 6.0'); +_component2['default'].registerComponent('AudioTrackMenuItem', AudioTrackMenuItem); +exports['default'] = AudioTrackMenuItem; - if (!obj) { - return this.options_; - } +},{"48":48,"5":5,"84":84}],8:[function(_dereq_,module,exports){ +'use strict'; - this.options_ = _utilsMergeOptionsJs2['default'](this.options_, obj); - return this.options_; - }; +exports.__esModule = true; - /** - * Get the component's DOM element - * ```js - * var domEl = myComponent.el(); - * ``` - * - * @return {Element} - * @method el - */ +var _component = _dereq_(5); - Component.prototype.el = function el() { - return this.el_; - }; +var _component2 = _interopRequireDefault(_component); - /** - * Create the component's DOM element - * - * @param {String=} tagName Element's node type. e.g. 'div' - * @param {Object=} properties An object of properties that should be set - * @param {Object=} attributes An object of attributes that should be set - * @return {Element} - * @method createEl - */ +_dereq_(12); - Component.prototype.createEl = function createEl(tagName, properties, attributes) { - return Dom.createEl(tagName, properties, attributes); - }; +_dereq_(32); - Component.prototype.localize = function localize(string) { - var code = this.player_.language && this.player_.language(); - var languages = this.player_.languages && this.player_.languages(); +_dereq_(33); - if (!code || !languages) { - return string; - } +_dereq_(35); - var language = languages[code]; +_dereq_(34); - if (language && language[string]) { - return language[string]; - } +_dereq_(10); - var primaryCode = code.split('-')[0]; - var primaryLang = languages[primaryCode]; +_dereq_(18); - if (primaryLang && primaryLang[string]) { - return primaryLang[string]; - } +_dereq_(9); - return string; - }; +_dereq_(38); - /** - * Return the component's DOM element where children are inserted. - * Will either be the same as el() or a new element defined in createEl(). - * - * @return {Element} - * @method contentEl - */ +_dereq_(40); - Component.prototype.contentEl = function contentEl() { - return this.contentEl_ || this.el_; - }; +_dereq_(11); - /** - * Get the component's ID - * ```js - * var id = myComponent.id(); - * ``` - * - * @return {String} - * @method id - */ +_dereq_(25); - Component.prototype.id = function id() { - return this.id_; - }; +_dereq_(27); - /** - * Get the component's name. The name is often used to reference the component. - * ```js - * var name = myComponent.name(); - * ``` - * - * @return {String} - * @method name - */ +_dereq_(29); - Component.prototype.name = function name() { - return this.name_; - }; +_dereq_(24); - /** - * Get an array of all child components - * ```js - * var kids = myComponent.children(); - * ``` +_dereq_(6); + +_dereq_(13); + +_dereq_(21); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file control-bar.js + */ + + +// Required children + + +/** + * Container of main controls + * + * @extends Component + * @class ControlBar + */ +var ControlBar = function (_Component) { + _inherits(ControlBar, _Component); + + function ControlBar() { + _classCallCheck(this, ControlBar); + + return _possibleConstructorReturn(this, _Component.apply(this, arguments)); + } + + /** + * Create the component's DOM element * - * @return {Array} The children - * @method children + * @return {Element} + * @method createEl */ - - Component.prototype.children = function children() { - return this.children_; + ControlBar.prototype.createEl = function createEl() { + return _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-control-bar', + dir: 'ltr' + }, { + // The control bar is a group, so it can contain menuitems + role: 'group' + }); }; + return ControlBar; +}(_component2['default']); + +ControlBar.prototype.options_ = { + children: ['playToggle', 'volumeMenuButton', 'currentTimeDisplay', 'timeDivider', 'durationDisplay', 'progressControl', 'liveDisplay', 'remainingTimeDisplay', 'customControlSpacer', 'playbackRateMenuButton', 'chaptersButton', 'descriptionsButton', 'subtitlesButton', 'captionsButton', 'audioTrackButton', 'fullscreenToggle'] +}; + +_component2['default'].registerComponent('ControlBar', ControlBar); +exports['default'] = ControlBar; + +},{"10":10,"11":11,"12":12,"13":13,"18":18,"21":21,"24":24,"25":25,"27":27,"29":29,"32":32,"33":33,"34":34,"35":35,"38":38,"40":40,"5":5,"6":6,"9":9}],9:[function(_dereq_,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _button = _dereq_(2); + +var _button2 = _interopRequireDefault(_button); + +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file fullscreen-toggle.js + */ + + +/** + * Toggle fullscreen video + * + * @extends Button + * @class FullscreenToggle + */ +var FullscreenToggle = function (_Button) { + _inherits(FullscreenToggle, _Button); + + function FullscreenToggle(player, options) { + _classCallCheck(this, FullscreenToggle); + + var _this = _possibleConstructorReturn(this, _Button.call(this, player, options)); + + _this.on(player, 'fullscreenchange', _this.handleFullscreenChange); + return _this; + } + /** - * Returns a child component with the provided ID + * Allow sub components to stack CSS class names * - * @return {Component} - * @method getChildById + * @return {String} The constructed class name + * @method buildCSSClass */ - Component.prototype.getChildById = function getChildById(id) { - return this.childIndex_[id]; - }; + FullscreenToggle.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-fullscreen-control ' + _Button.prototype.buildCSSClass.call(this); + }; /** - * Returns a child component with the provided name + * Handles Fullscreenchange on the component and change control text accordingly * - * @return {Component} - * @method getChild + * @method handleFullscreenChange */ - Component.prototype.getChild = function getChild(name) { - return this.childNameIndex_[name]; - }; + FullscreenToggle.prototype.handleFullscreenChange = function handleFullscreenChange() { + if (this.player_.isFullscreen()) { + this.controlText('Non-Fullscreen'); + } else { + this.controlText('Fullscreen'); + } + }; /** - * Adds a child component inside this component - * ```js - * myComponent.el(); - * // ->
- * myComponent.children(); - * // [empty array] - * - * var myButton = myComponent.addChild('MyButton'); - * // ->
myButton
- * // -> myButton === myComponent.children()[0]; - * ``` - * Pass in options for child constructors and options for children of the child - * ```js - * var myButton = myComponent.addChild('MyButton', { - * text: 'Press Me', - * buttonChildExample: { - * buttonChildOption: true - * } - * }); - * ``` + * Handles click for full screen * - * @param {String|Component} child The class name or instance of a child to add - * @param {Object=} options Options, including options to be passed to children of the child. - * @param {Number} index into our children array to attempt to add the child - * @return {Component} The child component (created by this process if a string was used) - * @method addChild + * @method handleClick */ - Component.prototype.addChild = function addChild(child) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - var index = arguments.length <= 2 || arguments[2] === undefined ? this.children_.length : arguments[2]; - var component = undefined; - var componentName = undefined; + FullscreenToggle.prototype.handleClick = function handleClick() { + if (!this.player_.isFullscreen()) { + this.player_.requestFullscreen(); + } else { + this.player_.exitFullscreen(); + } + }; - // If child is a string, create nt with options - if (typeof child === 'string') { - componentName = child; + return FullscreenToggle; +}(_button2['default']); - // Options can also be specified as a boolean, so convert to an empty object if false. - if (!options) { - options = {}; - } +FullscreenToggle.prototype.controlText_ = 'Fullscreen'; - // Same as above, but true is deprecated so show a warning. - if (options === true) { - _utilsLogJs2['default'].warn('Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`.'); - options = {}; - } +_component2['default'].registerComponent('FullscreenToggle', FullscreenToggle); +exports['default'] = FullscreenToggle; - // If no componentClass in options, assume componentClass is the name lowercased - // (e.g. playButton) - var componentClassName = options.componentClass || _utilsToTitleCaseJs2['default'](componentName); +},{"2":2,"5":5}],10:[function(_dereq_,module,exports){ +'use strict'; - // Set name through options - options.name = componentName; +exports.__esModule = true; - // Create a new object & element for this controls set - // If there's no .player_, this is a player - var ComponentClass = Component.getComponent(componentClassName); +var _component = _dereq_(5); - if (!ComponentClass) { - throw new Error('Component ' + componentClassName + ' does not exist'); - } +var _component2 = _interopRequireDefault(_component); - // data stored directly on the videojs object may be - // misidentified as a component to retain - // backwards-compatibility with 4.x. check to make sure the - // component class can be instantiated. - if (typeof ComponentClass !== 'function') { - return null; - } +var _dom = _dereq_(82); - component = new ComponentClass(this.player_ || this, options); +var Dom = _interopRequireWildcard(_dom); - // child is a component instance - } else { - component = child; - } +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - this.children_.splice(index, 0, component); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - if (typeof component.id === 'function') { - this.childIndex_[component.id()] = component; - } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - // If a name wasn't used to create the component, check if we can use the - // name function of the component - componentName = componentName || component.name && component.name(); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - if (componentName) { - this.childNameIndex_[componentName] = component; - } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file live-display.js + */ - // Add the UI object's element to the container div (box) - // Having an element is not required - if (typeof component.el === 'function' && component.el()) { - var childNodes = this.contentEl().children; - var refNode = childNodes[index] || null; - this.contentEl().insertBefore(component.el(), refNode); - } - // Return so it can stored on parent object if desired. - return component; - }; +/** + * Displays the live indicator + * TODO - Future make it click to snap to live + * + * @extends Component + * @class LiveDisplay + */ +var LiveDisplay = function (_Component) { + _inherits(LiveDisplay, _Component); + + function LiveDisplay(player, options) { + _classCallCheck(this, LiveDisplay); + + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options)); + + _this.updateShowing(); + _this.on(_this.player(), 'durationchange', _this.updateShowing); + return _this; + } /** - * Remove a child component from this component's list of children, and the - * child component's element from this component's element + * Create the component's DOM element * - * @param {Component} component Component to remove - * @method removeChild + * @return {Element} + * @method createEl */ - Component.prototype.removeChild = function removeChild(component) { - if (typeof component === 'string') { - component = this.getChild(component); - } - if (!component || !this.children_) { - return; - } + LiveDisplay.prototype.createEl = function createEl() { + var el = _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-live-control vjs-control' + }); - var childFound = false; + this.contentEl_ = Dom.createEl('div', { + className: 'vjs-live-display', + innerHTML: '' + this.localize('Stream Type') + '' + this.localize('LIVE') + }, { + 'aria-live': 'off' + }); - for (var i = this.children_.length - 1; i >= 0; i--) { - if (this.children_[i] === component) { - childFound = true; - this.children_.splice(i, 1); - break; - } - } + el.appendChild(this.contentEl_); + return el; + }; - if (!childFound) { - return; + LiveDisplay.prototype.updateShowing = function updateShowing() { + if (this.player().duration() === Infinity) { + this.show(); + } else { + this.hide(); } + }; - this.childIndex_[component.id()] = null; - this.childNameIndex_[component.name()] = null; + return LiveDisplay; +}(_component2['default']); - var compEl = component.el(); +_component2['default'].registerComponent('LiveDisplay', LiveDisplay); +exports['default'] = LiveDisplay; - if (compEl && compEl.parentNode === this.contentEl()) { - this.contentEl().removeChild(component.el()); - } - }; +},{"5":5,"82":82}],11:[function(_dereq_,module,exports){ +'use strict'; - /** - * Add and initialize default child components from options - * ```js - * // when an instance of MyComponent is created, all children in options - * // will be added to the instance by their name strings and options - * MyComponent.prototype.options_ = { - * children: [ - * 'myChildComponent' - * ], - * myChildComponent: { - * myChildOption: true - * } - * }; - * - * // Or when creating the component - * var myComp = new MyComponent(player, { - * children: [ - * 'myChildComponent' - * ], - * myChildComponent: { - * myChildOption: true - * } - * }); - * ``` - * The children option can also be an array of - * child options objects (that also include a 'name' key). - * This can be used if you have two child components of the - * same type that need different options. - * ```js - * var myComp = new MyComponent(player, { - * children: [ - * 'button', - * { - * name: 'button', - * someOtherOption: true - * }, - * { - * name: 'button', - * someOtherOption: false - * } - * ] - * }); - * ``` - * - * @method initChildren - */ +exports.__esModule = true; - Component.prototype.initChildren = function initChildren() { - var _this = this; +var _button = _dereq_(2); - var children = this.options_.children; +var _button2 = _interopRequireDefault(_button); - if (children) { - (function () { - // `this` is `parent` - var parentOptions = _this.options_; +var _component = _dereq_(5); - var handleAdd = function handleAdd(child) { - var name = child.name; - var opts = child.opts; +var _component2 = _interopRequireDefault(_component); - // Allow options for children to be set at the parent options - // e.g. videojs(id, { controlBar: false }); - // instead of videojs(id, { children: { controlBar: false }); - if (parentOptions[name] !== undefined) { - opts = parentOptions[name]; - } +var _dom = _dereq_(82); - // Allow for disabling default components - // e.g. options['children']['posterImage'] = false - if (opts === false) { - return; - } +var Dom = _interopRequireWildcard(_dom); - // Allow options to be passed as a simple boolean if no configuration - // is necessary. - if (opts === true) { - opts = {}; - } +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - // We also want to pass the original player options to each component as well so they don't need to - // reach back into the player for options later. - opts.playerOptions = _this.options_.playerOptions; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - // Create and add the child component. - // Add a direct reference to the child by name on the parent instance. - // If two of the same component are used, different names should be supplied - // for each - var newChild = _this.addChild(name, opts); - if (newChild) { - _this[name] = newChild; - } - }; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - // Allow for an array of children details to passed in the options - var workingChildren = undefined; - var Tech = Component.getComponent('Tech'); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - if (Array.isArray(children)) { - workingChildren = children; - } else { - workingChildren = Object.keys(children); - } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file mute-toggle.js + */ - workingChildren - // children that are in this.options_ but also in workingChildren would - // give us extra children we do not want. So, we want to filter them out. - .concat(Object.keys(_this.options_).filter(function (child) { - return !workingChildren.some(function (wchild) { - if (typeof wchild === 'string') { - return child === wchild; - } else { - return child === wchild.name; - } - }); - })).map(function (child) { - var name = undefined, - opts = undefined; - if (typeof child === 'string') { - name = child; - opts = children[name] || _this.options_[name] || {}; - } else { - name = child.name; - opts = child; - } +/** + * A button component for muting the audio + * + * @param {Player|Object} player + * @param {Object=} options + * @extends Button + * @class MuteToggle + */ +var MuteToggle = function (_Button) { + _inherits(MuteToggle, _Button); - return { name: name, opts: opts }; - }).filter(function (child) { - // we have to make sure that child.name isn't in the techOrder since - // techs are registerd as Components but can't aren't compatible - // See https://github.com/videojs/video.js/issues/2772 - var c = Component.getComponent(child.opts.componentClass || _utilsToTitleCaseJs2['default'](child.name)); - return c && !Tech.isTech(c); - }).forEach(handleAdd); - })(); + function MuteToggle(player, options) { + _classCallCheck(this, MuteToggle); + + var _this = _possibleConstructorReturn(this, _Button.call(this, player, options)); + + _this.on(player, 'volumechange', _this.update); + + // hide mute toggle if the current tech doesn't support volume control + if (player.tech_ && player.tech_.featuresVolumeControl === false) { + _this.addClass('vjs-hidden'); } - }; + + _this.on(player, 'loadstart', function () { + // We need to update the button to account for a default muted state. + this.update(); + + if (player.tech_.featuresVolumeControl === false) { + this.addClass('vjs-hidden'); + } else { + this.removeClass('vjs-hidden'); + } + }); + return _this; + } /** - * Allows sub components to stack CSS class names + * Allow sub components to stack CSS class names * * @return {String} The constructed class name * @method buildCSSClass */ - Component.prototype.buildCSSClass = function buildCSSClass() { - // Child classes can include a function that does: - // return 'CLASS NAME' + this._super(); - return ''; + + MuteToggle.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-mute-control ' + _Button.prototype.buildCSSClass.call(this); }; /** - * Add an event listener to this component's element - * ```js - * var myFunc = function(){ - * var myComponent = this; - * // Do something when the event is fired - * }; - * - * myComponent.on('eventType', myFunc); - * ``` - * The context of myFunc will be myComponent unless previously bound. - * Alternatively, you can add a listener to another element or component. - * ```js - * myComponent.on(otherElement, 'eventName', myFunc); - * myComponent.on(otherComponent, 'eventName', myFunc); - * ``` - * The benefit of using this over `VjsEvents.on(otherElement, 'eventName', myFunc)` - * and `otherComponent.on('eventName', myFunc)` is that this way the listeners - * will be automatically cleaned up when either component is disposed. - * It will also bind myComponent as the context of myFunc. - * **NOTE**: When using this on elements in the page other than window - * and document (both permanent), if you remove the element from the DOM - * you need to call `myComponent.trigger(el, 'dispose')` on it to clean up - * references to it and allow the browser to garbage collect it. + * Handle click on mute * - * @param {String|Component} first The event type or other component - * @param {Function|String} second The event handler or event type - * @param {Function} third The event handler - * @return {Component} - * @method on + * @method handleClick */ - Component.prototype.on = function on(first, second, third) { - var _this2 = this; - - if (typeof first === 'string' || Array.isArray(first)) { - Events.on(this.el_, first, Fn.bind(this, second)); - - // Targeting another component or element - } else { - (function () { - var target = first; - var type = second; - var fn = Fn.bind(_this2, third); - - // When this component is disposed, remove the listener from the other component - var removeOnDispose = function removeOnDispose() { - return _this2.off(target, type, fn); - }; - - // Use the same function ID so we can remove it later it using the ID - // of the original listener - removeOnDispose.guid = fn.guid; - _this2.on('dispose', removeOnDispose); - // If the other component is disposed first we need to clean the reference - // to the other component in this component's removeOnDispose listener - // Otherwise we create a memory leak. - var cleanRemover = function cleanRemover() { - return _this2.off('dispose', removeOnDispose); - }; - - // Add the same function ID so we can easily remove it later - cleanRemover.guid = fn.guid; - - // Check if this is a DOM node - if (first.nodeName) { - // Add the listener to the other element - Events.on(target, type, fn); - Events.on(target, 'dispose', cleanRemover); - - // Should be a component - // Not using `instanceof Component` because it makes mock players difficult - } else if (typeof first.on === 'function') { - // Add the listener to the other component - target.on(type, fn); - target.on('dispose', cleanRemover); - } - })(); - } - - return this; + MuteToggle.prototype.handleClick = function handleClick() { + this.player_.muted(this.player_.muted() ? false : true); }; /** - * Remove an event listener from this component's element - * ```js - * myComponent.off('eventType', myFunc); - * ``` - * If myFunc is excluded, ALL listeners for the event type will be removed. - * If eventType is excluded, ALL listeners will be removed from the component. - * Alternatively you can use `off` to remove listeners that were added to other - * elements or components using `myComponent.on(otherComponent...`. - * In this case both the event type and listener function are REQUIRED. - * ```js - * myComponent.off(otherElement, 'eventType', myFunc); - * myComponent.off(otherComponent, 'eventType', myFunc); - * ``` + * Update volume * - * @param {String=|Component} first The event type or other component - * @param {Function=|String} second The listener function or event type - * @param {Function=} third The listener for other component - * @return {Component} - * @method off + * @method update */ - Component.prototype.off = function off(first, second, third) { - if (!first || typeof first === 'string' || Array.isArray(first)) { - Events.off(this.el_, first, second); - } else { - var target = first; - var type = second; - // Ensure there's at least a guid, even if the function hasn't been used - var fn = Fn.bind(this, third); - // Remove the dispose listener on this component, - // which was given the same guid as the event listener - this.off('dispose', fn); + MuteToggle.prototype.update = function update() { + var vol = this.player_.volume(); + var level = 3; - if (first.nodeName) { - // Remove the listener - Events.off(target, type, fn); - // Remove the listener for cleaning the dispose listener - Events.off(target, 'dispose', fn); - } else { - target.off(type, fn); - target.off('dispose', fn); - } + if (vol === 0 || this.player_.muted()) { + level = 0; + } else if (vol < 0.33) { + level = 1; + } else if (vol < 0.67) { + level = 2; } - return this; + // Don't rewrite the button text if the actual text doesn't change. + // This causes unnecessary and confusing information for screen reader users. + // This check is needed because this function gets called every time the volume level is changed. + var toMute = this.player_.muted() ? 'Unmute' : 'Mute'; + + if (this.controlText() !== toMute) { + this.controlText(toMute); + } + + // TODO improve muted icon classes + for (var i = 0; i < 4; i++) { + Dom.removeElClass(this.el_, 'vjs-vol-' + i); + } + Dom.addElClass(this.el_, 'vjs-vol-' + level); }; - /** - * Add an event listener to be triggered only once and then removed - * ```js - * myComponent.one('eventName', myFunc); - * ``` - * Alternatively you can add a listener to another element or component - * that will be triggered only once. - * ```js - * myComponent.one(otherElement, 'eventName', myFunc); - * myComponent.one(otherComponent, 'eventName', myFunc); - * ``` - * - * @param {String|Component} first The event type or other component - * @param {Function|String} second The listener function or event type - * @param {Function=} third The listener function for other component - * @return {Component} - * @method one - */ + return MuteToggle; +}(_button2['default']); - Component.prototype.one = function one(first, second, third) { - var _this3 = this, - _arguments = arguments; +MuteToggle.prototype.controlText_ = 'Mute'; - if (typeof first === 'string' || Array.isArray(first)) { - Events.one(this.el_, first, Fn.bind(this, second)); - } else { - (function () { - var target = first; - var type = second; - var fn = Fn.bind(_this3, third); +_component2['default'].registerComponent('MuteToggle', MuteToggle); +exports['default'] = MuteToggle; - var newFunc = function newFunc() { - _this3.off(target, type, newFunc); - fn.apply(null, _arguments); - }; +},{"2":2,"5":5,"82":82}],12:[function(_dereq_,module,exports){ +'use strict'; - // Keep the same function ID so we can remove it later - newFunc.guid = fn.guid; +exports.__esModule = true; - _this3.on(target, type, newFunc); - })(); - } +var _button = _dereq_(2); - return this; - }; +var _button2 = _interopRequireDefault(_button); - /** - * Trigger an event on an element - * ```js - * myComponent.trigger('eventName'); - * myComponent.trigger({'type':'eventName'}); - * myComponent.trigger('eventName', {data: 'some data'}); - * myComponent.trigger({'type':'eventName'}, {data: 'some data'}); - * ``` - * - * @param {Event|Object|String} event A string (the type) or an event object with a type attribute - * @param {Object} [hash] data hash to pass along with the event - * @return {Component} self - * @method trigger - */ +var _component = _dereq_(5); - Component.prototype.trigger = function trigger(event, hash) { - Events.trigger(this.el_, event, hash); - return this; - }; +var _component2 = _interopRequireDefault(_component); - /** - * Bind a listener to the component's ready state. - * Different from event listeners in that if the ready event has already happened - * it will trigger the function immediately. - * - * @param {Function} fn Ready listener - * @param {Boolean} sync Exec the listener synchronously if component is ready - * @return {Component} - * @method ready - */ +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - Component.prototype.ready = function ready(fn) { - var sync = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - if (fn) { - if (this.isReady_) { - if (sync) { - fn.call(this); - } else { - // Call the function asynchronously by default for consistency - this.setTimeout(fn, 1); - } - } else { - this.readyQueue_ = this.readyQueue_ || []; - this.readyQueue_.push(fn); - } - } - return this; - }; +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - /** - * Trigger the ready listeners - * - * @return {Component} - * @method triggerReady - */ +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file play-toggle.js + */ - Component.prototype.triggerReady = function triggerReady() { - this.isReady_ = true; - // Ensure ready is triggerd asynchronously - this.setTimeout(function () { - var readyQueue = this.readyQueue_; +/** + * Button to toggle between play and pause + * + * @param {Player|Object} player + * @param {Object=} options + * @extends Button + * @class PlayToggle + */ +var PlayToggle = function (_Button) { + _inherits(PlayToggle, _Button); - // Reset Ready Queue - this.readyQueue_ = []; + function PlayToggle(player, options) { + _classCallCheck(this, PlayToggle); - if (readyQueue && readyQueue.length > 0) { - readyQueue.forEach(function (fn) { - fn.call(this); - }, this); - } + var _this = _possibleConstructorReturn(this, _Button.call(this, player, options)); - // Allow for using event listeners also - this.trigger('ready'); - }, 1); - }; + _this.on(player, 'play', _this.handlePlay); + _this.on(player, 'pause', _this.handlePause); + return _this; + } /** - * Finds a single DOM element matching `selector` within the component's - * `contentEl` or another custom context. - * - * @method $ - * @param {String} selector - * A valid CSS selector, which will be passed to `querySelector`. - * - * @param {Element|String} [context=document] - * A DOM element within which to query. Can also be a selector - * string in which case the first matching element will be used - * as context. If missing (or no element matches selector), falls - * back to `document`. + * Allow sub components to stack CSS class names * - * @return {Element|null} + * @return {String} The constructed class name + * @method buildCSSClass */ - Component.prototype.$ = function $(selector, context) { - return Dom.$(selector, context || this.contentEl()); + + PlayToggle.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-play-control ' + _Button.prototype.buildCSSClass.call(this); }; /** - * Finds a all DOM elements matching `selector` within the component's - * `contentEl` or another custom context. - * - * @method $$ - * @param {String} selector - * A valid CSS selector, which will be passed to `querySelectorAll`. - * - * @param {Element|String} [context=document] - * A DOM element within which to query. Can also be a selector - * string in which case the first matching element will be used - * as context. If missing (or no element matches selector), falls - * back to `document`. + * Handle click to toggle between play and pause * - * @return {NodeList} + * @method handleClick */ - Component.prototype.$$ = function $$(selector, context) { - return Dom.$$(selector, context || this.contentEl()); + + PlayToggle.prototype.handleClick = function handleClick() { + if (this.player_.paused()) { + this.player_.play(); + } else { + this.player_.pause(); + } }; /** - * Check if a component's element has a CSS class name + * Add the vjs-playing class to the element so it can change appearance * - * @param {String} classToCheck Classname to check - * @return {Component} - * @method hasClass + * @method handlePlay */ - Component.prototype.hasClass = function hasClass(classToCheck) { - return Dom.hasElClass(this.el_, classToCheck); + + PlayToggle.prototype.handlePlay = function handlePlay() { + this.removeClass('vjs-paused'); + this.addClass('vjs-playing'); + // change the button text to "Pause" + this.controlText('Pause'); }; /** - * Add a CSS class name to the component's element + * Add the vjs-paused class to the element so it can change appearance * - * @param {String} classToAdd Classname to add - * @return {Component} - * @method addClass + * @method handlePause */ - Component.prototype.addClass = function addClass(classToAdd) { - Dom.addElClass(this.el_, classToAdd); - return this; + + PlayToggle.prototype.handlePause = function handlePause() { + this.removeClass('vjs-playing'); + this.addClass('vjs-paused'); + // change the button text to "Play" + this.controlText('Play'); }; - /** - * Remove a CSS class name from the component's element - * - * @param {String} classToRemove Classname to remove - * @return {Component} - * @method removeClass - */ + return PlayToggle; +}(_button2['default']); - Component.prototype.removeClass = function removeClass(classToRemove) { - Dom.removeElClass(this.el_, classToRemove); - return this; - }; +PlayToggle.prototype.controlText_ = 'Play'; - /** - * Add or remove a CSS class name from the component's element - * - * @param {String} classToToggle - * @param {Boolean|Function} [predicate] - * Can be a function that returns a Boolean. If `true`, the class - * will be added; if `false`, the class will be removed. If not - * given, the class will be added if not present and vice versa. - * - * @return {Component} - * @method toggleClass - */ +_component2['default'].registerComponent('PlayToggle', PlayToggle); +exports['default'] = PlayToggle; - Component.prototype.toggleClass = function toggleClass(classToToggle, predicate) { - Dom.toggleElClass(this.el_, classToToggle, predicate); - return this; - }; +},{"2":2,"5":5}],13:[function(_dereq_,module,exports){ +'use strict'; - /** - * Show the component element if hidden - * - * @return {Component} - * @method show - */ +exports.__esModule = true; - Component.prototype.show = function show() { - this.removeClass('vjs-hidden'); - return this; - }; +var _menuButton = _dereq_(47); - /** - * Hide the component element if currently showing - * - * @return {Component} - * @method hide - */ +var _menuButton2 = _interopRequireDefault(_menuButton); - Component.prototype.hide = function hide() { - this.addClass('vjs-hidden'); - return this; - }; +var _menu = _dereq_(49); + +var _menu2 = _interopRequireDefault(_menu); + +var _playbackRateMenuItem = _dereq_(14); + +var _playbackRateMenuItem2 = _interopRequireDefault(_playbackRateMenuItem); + +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); + +var _dom = _dereq_(82); + +var Dom = _interopRequireWildcard(_dom); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file playback-rate-menu-button.js + */ + + +/** + * The component for controlling the playback rate + * + * @param {Player|Object} player + * @param {Object=} options + * @extends MenuButton + * @class PlaybackRateMenuButton + */ +var PlaybackRateMenuButton = function (_MenuButton) { + _inherits(PlaybackRateMenuButton, _MenuButton); + + function PlaybackRateMenuButton(player, options) { + _classCallCheck(this, PlaybackRateMenuButton); + + var _this = _possibleConstructorReturn(this, _MenuButton.call(this, player, options)); + + _this.updateVisibility(); + _this.updateLabel(); + + _this.on(player, 'loadstart', _this.updateVisibility); + _this.on(player, 'ratechange', _this.updateLabel); + return _this; + } /** - * Lock an item in its visible state - * To be used with fadeIn/fadeOut. + * Create the component's DOM element * - * @return {Component} - * @private - * @method lockShowing + * @return {Element} + * @method createEl */ - Component.prototype.lockShowing = function lockShowing() { - this.addClass('vjs-lock-showing'); - return this; + + PlaybackRateMenuButton.prototype.createEl = function createEl() { + var el = _MenuButton.prototype.createEl.call(this); + + this.labelEl_ = Dom.createEl('div', { + className: 'vjs-playback-rate-value', + innerHTML: 1.0 + }); + + el.appendChild(this.labelEl_); + + return el; }; /** - * Unlock an item to be hidden - * To be used with fadeIn/fadeOut. + * Allow sub components to stack CSS class names * - * @return {Component} - * @private - * @method unlockShowing + * @return {String} The constructed class name + * @method buildCSSClass */ - Component.prototype.unlockShowing = function unlockShowing() { - this.removeClass('vjs-lock-showing'); - return this; + + PlaybackRateMenuButton.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-playback-rate ' + _MenuButton.prototype.buildCSSClass.call(this); }; /** - * Set or get the width of the component (CSS values) - * Setting the video tag dimension values only works with values in pixels. - * Percent values will not work. - * Some percents can be used, but width()/height() will return the number + %, - * not the actual computed width/height. + * Create the playback rate menu * - * @param {Number|String=} num Optional width number - * @param {Boolean} skipListeners Skip the 'resize' event trigger - * @return {Component} This component, when setting the width - * @return {Number|String} The width, when getting - * @method width + * @return {Menu} Menu object populated with items + * @method createMenu */ - Component.prototype.width = function width(num, skipListeners) { - return this.dimension('width', num, skipListeners); + + PlaybackRateMenuButton.prototype.createMenu = function createMenu() { + var menu = new _menu2['default'](this.player()); + var rates = this.playbackRates(); + + if (rates) { + for (var i = rates.length - 1; i >= 0; i--) { + menu.addChild(new _playbackRateMenuItem2['default'](this.player(), { rate: rates[i] + 'x' })); + } + } + + return menu; }; /** - * Get or set the height of the component (CSS values) - * Setting the video tag dimension values only works with values in pixels. - * Percent values will not work. - * Some percents can be used, but width()/height() will return the number + %, - * not the actual computed width/height. + * Updates ARIA accessibility attributes * - * @param {Number|String=} num New component height - * @param {Boolean=} skipListeners Skip the resize event trigger - * @return {Component} This component, when setting the height - * @return {Number|String} The height, when getting - * @method height + * @method updateARIAAttributes */ - Component.prototype.height = function height(num, skipListeners) { - return this.dimension('height', num, skipListeners); + + PlaybackRateMenuButton.prototype.updateARIAAttributes = function updateARIAAttributes() { + // Current playback rate + this.el().setAttribute('aria-valuenow', this.player().playbackRate()); }; /** - * Set both width and height at the same time + * Handle menu item click * - * @param {Number|String} width Width of player - * @param {Number|String} height Height of player - * @return {Component} The component - * @method dimensions + * @method handleClick */ - Component.prototype.dimensions = function dimensions(width, height) { - // Skip resize listeners on width for optimization - return this.width(width, true).height(height); + + PlaybackRateMenuButton.prototype.handleClick = function handleClick() { + // select next rate option + var currentRate = this.player().playbackRate(); + var rates = this.playbackRates(); + + // this will select first one if the last one currently selected + var newRate = rates[0]; + + for (var i = 0; i < rates.length; i++) { + if (rates[i] > currentRate) { + newRate = rates[i]; + break; + } + } + this.player().playbackRate(newRate); }; /** - * Get or set width or height - * This is the shared code for the width() and height() methods. - * All for an integer, integer + 'px' or integer + '%'; - * Known issue: Hidden elements officially have a width of 0. We're defaulting - * to the style.width value and falling back to computedStyle which has the - * hidden element issue. Info, but probably not an efficient fix: - * http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/ + * Get possible playback rates * - * @param {String} widthOrHeight 'width' or 'height' - * @param {Number|String=} num New dimension - * @param {Boolean=} skipListeners Skip resize event trigger - * @return {Component} The component if a dimension was set - * @return {Number|String} The dimension if nothing was set - * @private - * @method dimension + * @return {Array} Possible playback rates + * @method playbackRates */ - Component.prototype.dimension = function dimension(widthOrHeight, num, skipListeners) { - if (num !== undefined) { - // Set to zero if null or literally NaN (NaN !== NaN) - if (num === null || num !== num) { - num = 0; - } - // Check if using css width/height (% or px) and adjust - if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) { - this.el_.style[widthOrHeight] = num; - } else if (num === 'auto') { - this.el_.style[widthOrHeight] = ''; - } else { - this.el_.style[widthOrHeight] = num + 'px'; - } + PlaybackRateMenuButton.prototype.playbackRates = function playbackRates() { + return this.options_.playbackRates || this.options_.playerOptions && this.options_.playerOptions.playbackRates; + }; - // skipListeners allows us to avoid triggering the resize event when setting both width and height - if (!skipListeners) { - this.trigger('resize'); - } + /** + * Get whether playback rates is supported by the tech + * and an array of playback rates exists + * + * @return {Boolean} Whether changing playback rate is supported + * @method playbackRateSupported + */ - // Return component - return this; - } - // Not setting a value, so getting it - // Make sure element exists - if (!this.el_) { - return 0; - } + PlaybackRateMenuButton.prototype.playbackRateSupported = function playbackRateSupported() { + return this.player().tech_ && this.player().tech_.featuresPlaybackRate && this.playbackRates() && this.playbackRates().length > 0; + }; - // Get dimension value from style - var val = this.el_.style[widthOrHeight]; - var pxIndex = val.indexOf('px'); + /** + * Hide playback rate controls when they're no playback rate options to select + * + * @method updateVisibility + */ - if (pxIndex !== -1) { - // Return the pixel value with no 'px' - return parseInt(val.slice(0, pxIndex), 10); - } - // No px so using % or no style was set, so falling back to offsetWidth/height - // If component has display:none, offset will return 0 - // TODO: handle display:none and no dimension style using px - return parseInt(this.el_['offset' + _utilsToTitleCaseJs2['default'](widthOrHeight)], 10); + PlaybackRateMenuButton.prototype.updateVisibility = function updateVisibility() { + if (this.playbackRateSupported()) { + this.removeClass('vjs-hidden'); + } else { + this.addClass('vjs-hidden'); + } }; /** - * Emit 'tap' events when touch events are supported - * This is used to support toggling the controls through a tap on the video. - * We're requiring them to be enabled because otherwise every component would - * have this extra overhead unnecessarily, on mobile devices where extra - * overhead is especially bad. + * Update button label when rate changed * - * @private - * @method emitTapEvents + * @method updateLabel */ - Component.prototype.emitTapEvents = function emitTapEvents() { - // Track the start time so we can determine how long the touch lasted - var touchStart = 0; - var firstTouch = null; - // Maximum movement allowed during a touch event to still be considered a tap - // Other popular libs use anywhere from 2 (hammer.js) to 15, so 10 seems like a nice, round number. - var tapMovementThreshold = 10; + PlaybackRateMenuButton.prototype.updateLabel = function updateLabel() { + if (this.playbackRateSupported()) { + this.labelEl_.innerHTML = this.player().playbackRate() + 'x'; + } + }; - // The maximum length a touch can be while still being considered a tap - var touchTimeThreshold = 200; + return PlaybackRateMenuButton; +}(_menuButton2['default']); - var couldBeTap = undefined; +PlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate'; - this.on('touchstart', function (event) { - // If more than one finger, don't consider treating this as a click - if (event.touches.length === 1) { - // Copy the touches object to prevent modifying the original - firstTouch = _objectAssign2['default']({}, event.touches[0]); - // Record start time so we can detect a tap vs. "touch and hold" - touchStart = new Date().getTime(); - // Reset couldBeTap tracking - couldBeTap = true; - } - }); +_component2['default'].registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton); +exports['default'] = PlaybackRateMenuButton; - this.on('touchmove', function (event) { - // If more than one finger, don't consider treating this as a click - if (event.touches.length > 1) { - couldBeTap = false; - } else if (firstTouch) { - // Some devices will throw touchmoves for all but the slightest of taps. - // So, if we moved only a small distance, this could still be a tap - var xdiff = event.touches[0].pageX - firstTouch.pageX; - var ydiff = event.touches[0].pageY - firstTouch.pageY; - var touchDistance = Math.sqrt(xdiff * xdiff + ydiff * ydiff); +},{"14":14,"47":47,"49":49,"5":5,"82":82}],14:[function(_dereq_,module,exports){ +'use strict'; - if (touchDistance > tapMovementThreshold) { - couldBeTap = false; - } - } - }); +exports.__esModule = true; - var noTap = function noTap() { - couldBeTap = false; - }; +var _menuItem = _dereq_(48); - // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s - this.on('touchleave', noTap); - this.on('touchcancel', noTap); +var _menuItem2 = _interopRequireDefault(_menuItem); - // When the touch ends, measure how long it took and trigger the appropriate - // event - this.on('touchend', function (event) { - firstTouch = null; - // Proceed only if the touchmove/leave/cancel event didn't happen - if (couldBeTap === true) { - // Measure how long the touch lasted - var touchTime = new Date().getTime() - touchStart; +var _component = _dereq_(5); - // Make sure the touch was less than the threshold to be considered a tap - if (touchTime < touchTimeThreshold) { - // Don't let browser turn this into a click - event.preventDefault(); - this.trigger('tap'); - // It may be good to copy the touchend event object and change the - // type to tap, if the other event properties aren't exact after - // Events.fixEvent runs (e.g. event.target) - } - } - }); - }; +var _component2 = _interopRequireDefault(_component); - /** - * Report user touch activity when touch events occur - * User activity is used to determine when controls should show/hide. It's - * relatively simple when it comes to mouse events, because any mouse event - * should show the controls. So we capture mouse events that bubble up to the - * player and report activity when that happens. - * With touch events it isn't as easy. We can't rely on touch events at the - * player level, because a tap (touchstart + touchend) on the video itself on - * mobile devices is meant to turn controls off (and on). User activity is - * checked asynchronously, so what could happen is a tap event on the video - * turns the controls off, then the touchend event bubbles up to the player, - * which if it reported user activity, would turn the controls right back on. - * (We also don't want to completely block touch events from bubbling up) - * Also a touchmove, touch+hold, and anything other than a tap is not supposed - * to turn the controls back on on a mobile device. - * Here we're setting the default component behavior to report user activity - * whenever touch events happen, and this can be turned off by components that - * want touch events to act differently. - * - * @method enableTouchActivity - */ +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - Component.prototype.enableTouchActivity = function enableTouchActivity() { - // Don't continue if the root player doesn't support reporting user activity - if (!this.player() || !this.player().reportUserActivity) { - return; - } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - // listener for reporting that the user is active - var report = Fn.bind(this.player(), this.player().reportUserActivity); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - var touchHolding = undefined; +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file playback-rate-menu-item.js + */ - this.on('touchstart', function () { - report(); - // For as long as the they are touching the device or have their mouse down, - // we consider them active even if they're not moving their finger or mouse. - // So we want to continue to update that they are active - this.clearInterval(touchHolding); - // report at the same interval as activityCheck - touchHolding = this.setInterval(report, 250); - }); - var touchEnd = function touchEnd(event) { - report(); - // stop the interval that maintains activity if the touch is holding - this.clearInterval(touchHolding); - }; +/** + * The specific menu item type for selecting a playback rate + * + * @param {Player|Object} player + * @param {Object=} options + * @extends MenuItem + * @class PlaybackRateMenuItem + */ +var PlaybackRateMenuItem = function (_MenuItem) { + _inherits(PlaybackRateMenuItem, _MenuItem); - this.on('touchmove', report); - this.on('touchend', touchEnd); - this.on('touchcancel', touchEnd); - }; + function PlaybackRateMenuItem(player, options) { + _classCallCheck(this, PlaybackRateMenuItem); - /** - * Creates timeout and sets up disposal automatically. - * - * @param {Function} fn The function to run after the timeout. - * @param {Number} timeout Number of ms to delay before executing specified function. - * @return {Number} Returns the timeout ID - * @method setTimeout - */ + var label = options.rate; + var rate = parseFloat(label, 10); - Component.prototype.setTimeout = function setTimeout(fn, timeout) { - fn = Fn.bind(this, fn); + // Modify options for parent MenuItem class's init. + options.label = label; + options.selected = rate === 1; - // window.setTimeout would be preferable here, but due to some bizarre issue with Sinon and/or Phantomjs, we can't. - var timeoutId = _globalWindow2['default'].setTimeout(fn, timeout); + var _this = _possibleConstructorReturn(this, _MenuItem.call(this, player, options)); - var disposeFn = function disposeFn() { - this.clearTimeout(timeoutId); - }; + _this.label = label; + _this.rate = rate; - disposeFn.guid = 'vjs-timeout-' + timeoutId; + _this.on(player, 'ratechange', _this.update); + return _this; + } - this.on('dispose', disposeFn); + /** + * Handle click on menu item + * + * @method handleClick + */ - return timeoutId; + + PlaybackRateMenuItem.prototype.handleClick = function handleClick() { + _MenuItem.prototype.handleClick.call(this); + this.player().playbackRate(this.rate); }; /** - * Clears a timeout and removes the associated dispose listener + * Update playback rate with selected rate * - * @param {Number} timeoutId The id of the timeout to clear - * @return {Number} Returns the timeout ID - * @method clearTimeout + * @method update */ - Component.prototype.clearTimeout = function clearTimeout(timeoutId) { - _globalWindow2['default'].clearTimeout(timeoutId); - var disposeFn = function disposeFn() {}; + PlaybackRateMenuItem.prototype.update = function update() { + this.selected(this.player().playbackRate() === this.rate); + }; - disposeFn.guid = 'vjs-timeout-' + timeoutId; + return PlaybackRateMenuItem; +}(_menuItem2['default']); - this.off('dispose', disposeFn); +PlaybackRateMenuItem.prototype.contentElType = 'button'; - return timeoutId; - }; +_component2['default'].registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem); +exports['default'] = PlaybackRateMenuItem; - /** - * Creates an interval and sets up disposal automatically. - * - * @param {Function} fn The function to run every N seconds. - * @param {Number} interval Number of ms to delay before executing specified function. - * @return {Number} Returns the interval ID - * @method setInterval - */ +},{"48":48,"5":5}],15:[function(_dereq_,module,exports){ +'use strict'; - Component.prototype.setInterval = function setInterval(fn, interval) { - fn = Fn.bind(this, fn); +exports.__esModule = true; - var intervalId = _globalWindow2['default'].setInterval(fn, interval); +var _component = _dereq_(5); - var disposeFn = function disposeFn() { - this.clearInterval(intervalId); - }; +var _component2 = _interopRequireDefault(_component); - disposeFn.guid = 'vjs-interval-' + intervalId; +var _dom = _dereq_(82); - this.on('dispose', disposeFn); +var Dom = _interopRequireWildcard(_dom); - return intervalId; - }; +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - /** - * Clears an interval and removes the associated dispose listener - * - * @param {Number} intervalId The id of the interval to clear - * @return {Number} Returns the interval ID - * @method clearInterval - */ +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - Component.prototype.clearInterval = function clearInterval(intervalId) { - _globalWindow2['default'].clearInterval(intervalId); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var disposeFn = function disposeFn() {}; +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - disposeFn.guid = 'vjs-interval-' + intervalId; +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file load-progress-bar.js + */ - this.off('dispose', disposeFn); - return intervalId; - }; +/** + * Shows load progress + * + * @param {Player|Object} player + * @param {Object=} options + * @extends Component + * @class LoadProgressBar + */ +var LoadProgressBar = function (_Component) { + _inherits(LoadProgressBar, _Component); - /** - * Registers a component - * - * @param {String} name Name of the component to register - * @param {Object} comp The component to register - * @static - * @method registerComponent - */ + function LoadProgressBar(player, options) { + _classCallCheck(this, LoadProgressBar); - Component.registerComponent = function registerComponent(name, comp) { - if (!Component.components_) { - Component.components_ = {}; - } + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options)); - Component.components_[name] = comp; - return comp; - }; + _this.partEls_ = []; + _this.on(player, 'progress', _this.update); + return _this; + } /** - * Gets a component by name + * Create the component's DOM element * - * @param {String} name Name of the component to get - * @return {Component} - * @static - * @method getComponent + * @return {Element} + * @method createEl */ - Component.getComponent = function getComponent(name) { - if (Component.components_ && Component.components_[name]) { - return Component.components_[name]; - } - if (_globalWindow2['default'] && _globalWindow2['default'].videojs && _globalWindow2['default'].videojs[name]) { - _utilsLogJs2['default'].warn('The ' + name + ' component was added to the videojs object when it should be registered using videojs.registerComponent(name, component)'); - return _globalWindow2['default'].videojs[name]; - } + LoadProgressBar.prototype.createEl = function createEl() { + return _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-load-progress', + innerHTML: '' + this.localize('Loaded') + ': 0%' + }); }; /** - * Sets up the constructor using the supplied init method - * or uses the init of the parent object + * Update progress bar * - * @param {Object} props An object of properties - * @static - * @deprecated - * @method extend + * @method update */ - Component.extend = function extend(props) { - props = props || {}; - _utilsLogJs2['default'].warn('Component.extend({}) has been deprecated, use videojs.extend(Component, {}) instead'); + LoadProgressBar.prototype.update = function update() { + var buffered = this.player_.buffered(); + var duration = this.player_.duration(); + var bufferedEnd = this.player_.bufferedEnd(); + var children = this.partEls_; - // Set up the constructor using the supplied init method - // or using the init of the parent object - // Make sure to check the unobfuscated version for external libs - var init = props.init || props.init || this.prototype.init || this.prototype.init || function () {}; - // In Resig's simple class inheritance (previously used) the constructor - // is a function that calls `this.init.apply(arguments)` - // However that would prevent us from using `ParentObject.call(this);` - // in a Child constructor because the `this` in `this.init` - // would still refer to the Child and cause an infinite loop. - // We would instead have to do - // `ParentObject.prototype.init.apply(this, arguments);` - // Bleh. We're not creating a _super() function, so it's good to keep - // the parent constructor reference simple. - var subObj = function subObj() { - init.apply(this, arguments); - }; + // get the percent width of a time compared to the total end + var percentify = function percentify(time, end) { + // no NaN + var percent = time / end || 0; - // Inherit from this object's prototype - subObj.prototype = Object.create(this.prototype); - // Reset the constructor property for subObj otherwise - // instances of subObj would have the constructor of the parent Object - subObj.prototype.constructor = subObj; + return (percent >= 1 ? 1 : percent) * 100 + '%'; + }; - // Make the class extendable - subObj.extend = Component.extend; + // update the width of the progress bar + this.el_.style.width = percentify(bufferedEnd, duration); - // Extend subObj's prototype with functions and other properties from props - for (var _name in props) { - if (props.hasOwnProperty(_name)) { - subObj.prototype[_name] = props[_name]; + // add child elements to represent the individual buffered time ranges + for (var i = 0; i < buffered.length; i++) { + var start = buffered.start(i); + var end = buffered.end(i); + var part = children[i]; + + if (!part) { + part = this.el_.appendChild(Dom.createEl()); + children[i] = part; } + + // set the percent based on the width of the progress bar (bufferedEnd) + part.style.left = percentify(start, bufferedEnd); + part.style.width = percentify(end - start, bufferedEnd); } - return subObj; + // remove unused buffered range elements + for (var _i = children.length; _i > buffered.length; _i--) { + this.el_.removeChild(children[_i - 1]); + } + children.length = buffered.length; }; - return Component; -})(); + return LoadProgressBar; +}(_component2['default']); -Component.registerComponent('Component', Component); -exports['default'] = Component; -module.exports = exports['default']; +_component2['default'].registerComponent('LoadProgressBar', LoadProgressBar); +exports['default'] = LoadProgressBar; -},{"./utils/dom.js":132,"./utils/events.js":133,"./utils/fn.js":134,"./utils/guid.js":136,"./utils/log.js":137,"./utils/merge-options.js":138,"./utils/to-title-case.js":141,"global/window":2,"object.assign":45}],68:[function(_dereq_,module,exports){ -/** - * @file control-bar.js - */ +},{"5":5,"82":82}],16:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _dom = _dereq_(82); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var Dom = _interopRequireWildcard(_dom); -var _componentJs = _dereq_('../component.js'); +var _fn = _dereq_(84); -var _componentJs2 = _interopRequireDefault(_componentJs); +var Fn = _interopRequireWildcard(_fn); -// Required children +var _formatTime = _dereq_(85); -var _playToggleJs = _dereq_('./play-toggle.js'); +var _formatTime2 = _interopRequireDefault(_formatTime); -var _playToggleJs2 = _interopRequireDefault(_playToggleJs); +var _throttle = _dereq_(101); -var _timeControlsCurrentTimeDisplayJs = _dereq_('./time-controls/current-time-display.js'); +var _throttle2 = _interopRequireDefault(_throttle); -var _timeControlsCurrentTimeDisplayJs2 = _interopRequireDefault(_timeControlsCurrentTimeDisplayJs); +var _computedStyle = _dereq_(81); -var _timeControlsDurationDisplayJs = _dereq_('./time-controls/duration-display.js'); +var _computedStyle2 = _interopRequireDefault(_computedStyle); -var _timeControlsDurationDisplayJs2 = _interopRequireDefault(_timeControlsDurationDisplayJs); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var _timeControlsTimeDividerJs = _dereq_('./time-controls/time-divider.js'); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _timeControlsTimeDividerJs2 = _interopRequireDefault(_timeControlsTimeDividerJs); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _timeControlsRemainingTimeDisplayJs = _dereq_('./time-controls/remaining-time-display.js'); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _timeControlsRemainingTimeDisplayJs2 = _interopRequireDefault(_timeControlsRemainingTimeDisplayJs); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file mouse-time-display.js + */ -var _liveDisplayJs = _dereq_('./live-display.js'); -var _liveDisplayJs2 = _interopRequireDefault(_liveDisplayJs); +/** + * The Mouse Time Display component shows the time you will seek to + * when hovering over the progress bar + * + * @param {Player|Object} player + * @param {Object=} options + * @extends Component + * @class MouseTimeDisplay + */ +var MouseTimeDisplay = function (_Component) { + _inherits(MouseTimeDisplay, _Component); -var _progressControlProgressControlJs = _dereq_('./progress-control/progress-control.js'); + function MouseTimeDisplay(player, options) { + _classCallCheck(this, MouseTimeDisplay); -var _progressControlProgressControlJs2 = _interopRequireDefault(_progressControlProgressControlJs); + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options)); -var _fullscreenToggleJs = _dereq_('./fullscreen-toggle.js'); + if (options.playerOptions && options.playerOptions.controlBar && options.playerOptions.controlBar.progressControl && options.playerOptions.controlBar.progressControl.keepTooltipsInside) { + _this.keepTooltipsInside = options.playerOptions.controlBar.progressControl.keepTooltipsInside; + } -var _fullscreenToggleJs2 = _interopRequireDefault(_fullscreenToggleJs); + if (_this.keepTooltipsInside) { + _this.tooltip = Dom.createEl('div', { className: 'vjs-time-tooltip' }); + _this.el().appendChild(_this.tooltip); + _this.addClass('vjs-keep-tooltips-inside'); + } -var _volumeControlVolumeControlJs = _dereq_('./volume-control/volume-control.js'); + _this.update(0, 0); -var _volumeControlVolumeControlJs2 = _interopRequireDefault(_volumeControlVolumeControlJs); + player.on('ready', function () { + _this.on(player.controlBar.progressControl.el(), 'mousemove', (0, _throttle2['default'])(Fn.bind(_this, _this.handleMouseMove), 25)); + }); + return _this; + } -var _volumeMenuButtonJs = _dereq_('./volume-menu-button.js'); + /** + * Create the component's DOM element + * + * @return {Element} + * @method createEl + */ -var _volumeMenuButtonJs2 = _interopRequireDefault(_volumeMenuButtonJs); -var _muteToggleJs = _dereq_('./mute-toggle.js'); + MouseTimeDisplay.prototype.createEl = function createEl() { + return _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-mouse-display' + }); + }; -var _muteToggleJs2 = _interopRequireDefault(_muteToggleJs); + MouseTimeDisplay.prototype.handleMouseMove = function handleMouseMove(event) { + var duration = this.player_.duration(); + var newTime = this.calculateDistance(event) * duration; + var position = event.pageX - Dom.findElPosition(this.el().parentNode).left; -var _textTrackControlsChaptersButtonJs = _dereq_('./text-track-controls/chapters-button.js'); + this.update(newTime, position); + }; -var _textTrackControlsChaptersButtonJs2 = _interopRequireDefault(_textTrackControlsChaptersButtonJs); + MouseTimeDisplay.prototype.update = function update(newTime, position) { + var time = (0, _formatTime2['default'])(newTime, this.player_.duration()); -var _textTrackControlsSubtitlesButtonJs = _dereq_('./text-track-controls/subtitles-button.js'); + this.el().style.left = position + 'px'; + this.el().setAttribute('data-current-time', time); -var _textTrackControlsSubtitlesButtonJs2 = _interopRequireDefault(_textTrackControlsSubtitlesButtonJs); + if (this.keepTooltipsInside) { + var clampedPosition = this.clampPosition_(position); + var difference = position - clampedPosition + 1; + var tooltipWidth = parseFloat((0, _computedStyle2['default'])(this.tooltip, 'width')); + var tooltipWidthHalf = tooltipWidth / 2; -var _textTrackControlsCaptionsButtonJs = _dereq_('./text-track-controls/captions-button.js'); + this.tooltip.innerHTML = time; + this.tooltip.style.right = '-' + (tooltipWidthHalf - difference) + 'px'; + } + }; -var _textTrackControlsCaptionsButtonJs2 = _interopRequireDefault(_textTrackControlsCaptionsButtonJs); + MouseTimeDisplay.prototype.calculateDistance = function calculateDistance(event) { + return Dom.getPointerPosition(this.el().parentNode, event).x; + }; -var _playbackRateMenuPlaybackRateMenuButtonJs = _dereq_('./playback-rate-menu/playback-rate-menu-button.js'); + /** + * This takes in a horizontal position for the bar and returns a clamped position. + * Clamped position means that it will keep the position greater than half the width + * of the tooltip and smaller than the player width minus half the width o the tooltip. + * It will only clamp the position if `keepTooltipsInside` option is set. + * + * @param {Number} position the position the bar wants to be + * @return {Number} newPosition the (potentially) clamped position + * @method clampPosition_ + */ -var _playbackRateMenuPlaybackRateMenuButtonJs2 = _interopRequireDefault(_playbackRateMenuPlaybackRateMenuButtonJs); -var _spacerControlsCustomControlSpacerJs = _dereq_('./spacer-controls/custom-control-spacer.js'); + MouseTimeDisplay.prototype.clampPosition_ = function clampPosition_(position) { + if (!this.keepTooltipsInside) { + return position; + } -var _spacerControlsCustomControlSpacerJs2 = _interopRequireDefault(_spacerControlsCustomControlSpacerJs); + var playerWidth = parseFloat((0, _computedStyle2['default'])(this.player().el(), 'width')); + var tooltipWidth = parseFloat((0, _computedStyle2['default'])(this.tooltip, 'width')); + var tooltipWidthHalf = tooltipWidth / 2; + var actualPosition = position; -/** - * Container of main controls - * - * @extends Component - * @class ControlBar - */ + if (position < tooltipWidthHalf) { + actualPosition = Math.ceil(tooltipWidthHalf); + } else if (position > playerWidth - tooltipWidthHalf) { + actualPosition = Math.floor(playerWidth - tooltipWidthHalf); + } -var ControlBar = (function (_Component) { - _inherits(ControlBar, _Component); + return actualPosition; + }; - function ControlBar() { - _classCallCheck(this, ControlBar); + return MouseTimeDisplay; +}(_component2['default']); - _Component.apply(this, arguments); - } +_component2['default'].registerComponent('MouseTimeDisplay', MouseTimeDisplay); +exports['default'] = MouseTimeDisplay; - /** - * Create the component's DOM element - * - * @return {Element} - * @method createEl - */ +},{"101":101,"5":5,"81":81,"82":82,"84":84,"85":85}],17:[function(_dereq_,module,exports){ +'use strict'; - ControlBar.prototype.createEl = function createEl() { - return _Component.prototype.createEl.call(this, 'div', { - className: 'vjs-control-bar', - dir: 'ltr' - }, { - 'role': 'group' // The control bar is a group, so it can contain menuitems - }); - }; +exports.__esModule = true; - return ControlBar; -})(_componentJs2['default']); +var _component = _dereq_(5); -ControlBar.prototype.options_ = { - loadEvent: 'play', - children: ['playToggle', 'volumeMenuButton', 'currentTimeDisplay', 'timeDivider', 'durationDisplay', 'progressControl', 'liveDisplay', 'remainingTimeDisplay', 'customControlSpacer', 'playbackRateMenuButton', 'chaptersButton', 'subtitlesButton', 'captionsButton', 'fullscreenToggle'] -}; +var _component2 = _interopRequireDefault(_component); -_componentJs2['default'].registerComponent('ControlBar', ControlBar); -exports['default'] = ControlBar; -module.exports = exports['default']; +var _fn = _dereq_(84); -},{"../component.js":67,"./fullscreen-toggle.js":69,"./live-display.js":70,"./mute-toggle.js":71,"./play-toggle.js":72,"./playback-rate-menu/playback-rate-menu-button.js":73,"./progress-control/progress-control.js":78,"./spacer-controls/custom-control-spacer.js":80,"./text-track-controls/captions-button.js":83,"./text-track-controls/chapters-button.js":84,"./text-track-controls/subtitles-button.js":87,"./time-controls/current-time-display.js":90,"./time-controls/duration-display.js":91,"./time-controls/remaining-time-display.js":92,"./time-controls/time-divider.js":93,"./volume-control/volume-control.js":95,"./volume-menu-button.js":97}],69:[function(_dereq_,module,exports){ -/** - * @file fullscreen-toggle.js - */ -'use strict'; +var Fn = _interopRequireWildcard(_fn); -exports.__esModule = true; +var _formatTime = _dereq_(85); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _formatTime2 = _interopRequireDefault(_formatTime); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _buttonJs = _dereq_('../button.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _buttonJs2 = _interopRequireDefault(_buttonJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _componentJs = _dereq_('../component.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file play-progress-bar.js + */ -var _componentJs2 = _interopRequireDefault(_componentJs); /** - * Toggle fullscreen video + * Shows play progress * - * @extends Button - * @class FullscreenToggle + * @param {Player|Object} player + * @param {Object=} options + * @extends Component + * @class PlayProgressBar */ +var PlayProgressBar = function (_Component) { + _inherits(PlayProgressBar, _Component); -var FullscreenToggle = (function (_Button) { - _inherits(FullscreenToggle, _Button); + function PlayProgressBar(player, options) { + _classCallCheck(this, PlayProgressBar); - function FullscreenToggle() { - _classCallCheck(this, FullscreenToggle); + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options)); + + _this.updateDataAttr(); + _this.on(player, 'timeupdate', _this.updateDataAttr); + player.ready(Fn.bind(_this, _this.updateDataAttr)); + + if (options.playerOptions && options.playerOptions.controlBar && options.playerOptions.controlBar.progressControl && options.playerOptions.controlBar.progressControl.keepTooltipsInside) { + _this.keepTooltipsInside = options.playerOptions.controlBar.progressControl.keepTooltipsInside; + } - _Button.apply(this, arguments); + if (_this.keepTooltipsInside) { + _this.addClass('vjs-keep-tooltips-inside'); + } + return _this; } /** - * Allow sub components to stack CSS class names + * Create the component's DOM element * - * @return {String} The constructed class name - * @method buildCSSClass + * @return {Element} + * @method createEl */ - FullscreenToggle.prototype.buildCSSClass = function buildCSSClass() { - return 'vjs-fullscreen-control ' + _Button.prototype.buildCSSClass.call(this); + + PlayProgressBar.prototype.createEl = function createEl() { + return _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-play-progress vjs-slider-bar', + innerHTML: '' + this.localize('Progress') + ': 0%' + }); }; - /** - * Handles click for full screen - * - * @method handleClick - */ + PlayProgressBar.prototype.updateDataAttr = function updateDataAttr() { + var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime(); - FullscreenToggle.prototype.handleClick = function handleClick() { - if (!this.player_.isFullscreen()) { - this.player_.requestFullscreen(); - this.controlText('Non-Fullscreen'); - } else { - this.player_.exitFullscreen(); - this.controlText('Fullscreen'); - } + this.el_.setAttribute('data-current-time', (0, _formatTime2['default'])(time, this.player_.duration())); }; - return FullscreenToggle; -})(_buttonJs2['default']); - -FullscreenToggle.prototype.controlText_ = 'Fullscreen'; + return PlayProgressBar; +}(_component2['default']); -_componentJs2['default'].registerComponent('FullscreenToggle', FullscreenToggle); -exports['default'] = FullscreenToggle; -module.exports = exports['default']; +_component2['default'].registerComponent('PlayProgressBar', PlayProgressBar); +exports['default'] = PlayProgressBar; -},{"../button.js":64,"../component.js":67}],70:[function(_dereq_,module,exports){ -/** - * @file live-display.js - */ +},{"5":5,"84":84,"85":85}],18:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _component = _dereq_(5); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _component2 = _interopRequireDefault(_component); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +_dereq_(19); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +_dereq_(16); -var _component = _dereq_('../component'); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _component2 = _interopRequireDefault(_component); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _utilsDomJs = _dereq_('../utils/dom.js'); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file progress-control.js + */ -var Dom = _interopRequireWildcard(_utilsDomJs); /** - * Displays the live indicator - * TODO - Future make it click to snap to live + * The Progress Control component contains the seek bar, load progress, + * and play progress * + * @param {Player|Object} player + * @param {Object=} options * @extends Component - * @class LiveDisplay + * @class ProgressControl */ +var ProgressControl = function (_Component) { + _inherits(ProgressControl, _Component); -var LiveDisplay = (function (_Component) { - _inherits(LiveDisplay, _Component); - - function LiveDisplay(player, options) { - _classCallCheck(this, LiveDisplay); - - _Component.call(this, player, options); + function ProgressControl() { + _classCallCheck(this, ProgressControl); - this.updateShowing(); - this.on(this.player(), 'durationchange', this.updateShowing); + return _possibleConstructorReturn(this, _Component.apply(this, arguments)); } /** @@ -4883,323 +3685,298 @@ var LiveDisplay = (function (_Component) { * @return {Element} * @method createEl */ - - LiveDisplay.prototype.createEl = function createEl() { - var el = _Component.prototype.createEl.call(this, 'div', { - className: 'vjs-live-control vjs-control' - }); - - this.contentEl_ = Dom.createEl('div', { - className: 'vjs-live-display', - innerHTML: '' + this.localize('Stream Type') + '' + this.localize('LIVE') - }, { - 'aria-live': 'off' + ProgressControl.prototype.createEl = function createEl() { + return _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-progress-control vjs-control' }); - - el.appendChild(this.contentEl_); - return el; }; - LiveDisplay.prototype.updateShowing = function updateShowing() { - if (this.player().duration() === Infinity) { - this.show(); - } else { - this.hide(); - } - }; + return ProgressControl; +}(_component2['default']); - return LiveDisplay; -})(_component2['default']); +ProgressControl.prototype.options_ = { + children: ['seekBar'] +}; -_component2['default'].registerComponent('LiveDisplay', LiveDisplay); -exports['default'] = LiveDisplay; -module.exports = exports['default']; +_component2['default'].registerComponent('ProgressControl', ProgressControl); +exports['default'] = ProgressControl; -},{"../component":67,"../utils/dom.js":132}],71:[function(_dereq_,module,exports){ -/** - * @file mute-toggle.js - */ +},{"16":16,"19":19,"5":5}],19:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _slider = _dereq_(57); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _slider2 = _interopRequireDefault(_slider); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _component = _dereq_(5); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _component2 = _interopRequireDefault(_component); -var _button = _dereq_('../button'); +var _fn = _dereq_(84); -var _button2 = _interopRequireDefault(_button); +var Fn = _interopRequireWildcard(_fn); -var _component = _dereq_('../component'); +var _formatTime = _dereq_(85); -var _component2 = _interopRequireDefault(_component); +var _formatTime2 = _interopRequireDefault(_formatTime); -var _utilsDomJs = _dereq_('../utils/dom.js'); +var _computedStyle = _dereq_(81); -var Dom = _interopRequireWildcard(_utilsDomJs); +var _computedStyle2 = _interopRequireDefault(_computedStyle); -/** - * A button component for muting the audio - * - * @param {Player|Object} player - * @param {Object=} options - * @extends Button - * @class MuteToggle - */ +_dereq_(15); -var MuteToggle = (function (_Button) { - _inherits(MuteToggle, _Button); +_dereq_(17); - function MuteToggle(player, options) { - _classCallCheck(this, MuteToggle); +_dereq_(20); - _Button.call(this, player, options); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - this.on(player, 'volumechange', this.update); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - // hide mute toggle if the current tech doesn't support volume control - if (player.tech_ && player.tech_['featuresVolumeControl'] === false) { - this.addClass('vjs-hidden'); - } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - this.on(player, 'loadstart', function () { - this.update(); // We need to update the button to account for a default muted state. +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - if (player.tech_['featuresVolumeControl'] === false) { - this.addClass('vjs-hidden'); - } else { - this.removeClass('vjs-hidden'); - } - }); - } +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file seek-bar.js + */ - /** - * Allow sub components to stack CSS class names - * - * @return {String} The constructed class name - * @method buildCSSClass - */ - MuteToggle.prototype.buildCSSClass = function buildCSSClass() { - return 'vjs-mute-control ' + _Button.prototype.buildCSSClass.call(this); - }; +/** + * Seek Bar and holder for the progress bars + * + * @param {Player|Object} player + * @param {Object=} options + * @extends Slider + * @class SeekBar + */ +var SeekBar = function (_Slider) { + _inherits(SeekBar, _Slider); + + function SeekBar(player, options) { + _classCallCheck(this, SeekBar); + + var _this = _possibleConstructorReturn(this, _Slider.call(this, player, options)); + + _this.on(player, 'timeupdate', _this.updateProgress); + _this.on(player, 'ended', _this.updateProgress); + player.ready(Fn.bind(_this, _this.updateProgress)); + + if (options.playerOptions && options.playerOptions.controlBar && options.playerOptions.controlBar.progressControl && options.playerOptions.controlBar.progressControl.keepTooltipsInside) { + _this.keepTooltipsInside = options.playerOptions.controlBar.progressControl.keepTooltipsInside; + } + + if (_this.keepTooltipsInside) { + _this.tooltipProgressBar = _this.addChild('TooltipProgressBar'); + } + return _this; + } /** - * Handle click on mute + * Create the component's DOM element * - * @method handleClick + * @return {Element} + * @method createEl */ - MuteToggle.prototype.handleClick = function handleClick() { - this.player_.muted(this.player_.muted() ? false : true); + + SeekBar.prototype.createEl = function createEl() { + return _Slider.prototype.createEl.call(this, 'div', { + className: 'vjs-progress-holder' + }, { + 'aria-label': 'progress bar' + }); }; /** - * Update volume + * Update ARIA accessibility attributes * - * @method update + * @method updateARIAAttributes */ - MuteToggle.prototype.update = function update() { - var vol = this.player_.volume(), - level = 3; - if (vol === 0 || this.player_.muted()) { - level = 0; - } else if (vol < 0.33) { - level = 1; - } else if (vol < 0.67) { - level = 2; - } + SeekBar.prototype.updateProgress = function updateProgress() { + this.updateAriaAttributes(this.el_); - // Don't rewrite the button text if the actual text doesn't change. - // This causes unnecessary and confusing information for screen reader users. - // This check is needed because this function gets called every time the volume level is changed. - var toMute = this.player_.muted() ? 'Unmute' : 'Mute'; - if (this.controlText() !== toMute) { - this.controlText(toMute); - } + if (this.keepTooltipsInside) { + this.updateAriaAttributes(this.tooltipProgressBar.el_); + this.tooltipProgressBar.el_.style.width = this.bar.el_.style.width; - /* TODO improve muted icon classes */ - for (var i = 0; i < 4; i++) { - Dom.removeElClass(this.el_, 'vjs-vol-' + i); + var playerWidth = parseFloat((0, _computedStyle2['default'])(this.player().el(), 'width')); + var tooltipWidth = parseFloat((0, _computedStyle2['default'])(this.tooltipProgressBar.tooltip, 'width')); + var tooltipStyle = this.tooltipProgressBar.el().style; + + tooltipStyle.maxWidth = Math.floor(playerWidth - tooltipWidth / 2) + 'px'; + tooltipStyle.minWidth = Math.ceil(tooltipWidth / 2) + 'px'; + tooltipStyle.right = '-' + tooltipWidth / 2 + 'px'; } - Dom.addElClass(this.el_, 'vjs-vol-' + level); }; - return MuteToggle; -})(_button2['default']); - -MuteToggle.prototype.controlText_ = 'Mute'; + SeekBar.prototype.updateAriaAttributes = function updateAriaAttributes(el) { + // Allows for smooth scrubbing, when player can't keep up. + var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime(); -_component2['default'].registerComponent('MuteToggle', MuteToggle); -exports['default'] = MuteToggle; -module.exports = exports['default']; + // machine readable value of progress bar (percentage complete) + el.setAttribute('aria-valuenow', (this.getPercent() * 100).toFixed(2)); + // human readable value of progress bar (time complete) + el.setAttribute('aria-valuetext', (0, _formatTime2['default'])(time, this.player_.duration())); + }; -},{"../button":64,"../component":67,"../utils/dom.js":132}],72:[function(_dereq_,module,exports){ -/** - * @file play-toggle.js - */ -'use strict'; + /** + * Get percentage of video played + * + * @return {Number} Percentage played + * @method getPercent + */ -exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + SeekBar.prototype.getPercent = function getPercent() { + var percent = this.player_.currentTime() / this.player_.duration(); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + return percent >= 1 ? 1 : percent; + }; -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + /** + * Handle mouse down on seek bar + * + * @method handleMouseDown + */ -var _buttonJs = _dereq_('../button.js'); -var _buttonJs2 = _interopRequireDefault(_buttonJs); + SeekBar.prototype.handleMouseDown = function handleMouseDown(event) { + _Slider.prototype.handleMouseDown.call(this, event); -var _componentJs = _dereq_('../component.js'); + this.player_.scrubbing(true); -var _componentJs2 = _interopRequireDefault(_componentJs); + this.videoWasPlaying = !this.player_.paused(); + this.player_.pause(); + }; -/** - * Button to toggle between play and pause - * - * @param {Player|Object} player - * @param {Object=} options - * @extends Button - * @class PlayToggle - */ + /** + * Handle mouse move on seek bar + * + * @method handleMouseMove + */ -var PlayToggle = (function (_Button) { - _inherits(PlayToggle, _Button); - function PlayToggle(player, options) { - _classCallCheck(this, PlayToggle); + SeekBar.prototype.handleMouseMove = function handleMouseMove(event) { + var newTime = this.calculateDistance(event) * this.player_.duration(); - _Button.call(this, player, options); + // Don't let video end while scrubbing. + if (newTime === this.player_.duration()) { + newTime = newTime - 0.1; + } - this.on(player, 'play', this.handlePlay); - this.on(player, 'pause', this.handlePause); - } + // Set new time (tell player to seek to new time) + this.player_.currentTime(newTime); + }; /** - * Allow sub components to stack CSS class names + * Handle mouse up on seek bar * - * @return {String} The constructed class name - * @method buildCSSClass + * @method handleMouseUp */ - PlayToggle.prototype.buildCSSClass = function buildCSSClass() { - return 'vjs-play-control ' + _Button.prototype.buildCSSClass.call(this); - }; - /** - * Handle click to toggle between play and pause - * - * @method handleClick - */ + SeekBar.prototype.handleMouseUp = function handleMouseUp(event) { + _Slider.prototype.handleMouseUp.call(this, event); - PlayToggle.prototype.handleClick = function handleClick() { - if (this.player_.paused()) { + this.player_.scrubbing(false); + if (this.videoWasPlaying) { this.player_.play(); - } else { - this.player_.pause(); } }; /** - * Add the vjs-playing class to the element so it can change appearance + * Move more quickly fast forward for keyboard-only users * - * @method handlePlay + * @method stepForward */ - PlayToggle.prototype.handlePlay = function handlePlay() { - this.removeClass('vjs-paused'); - this.addClass('vjs-playing'); - this.controlText('Pause'); // change the button text to "Pause" + + SeekBar.prototype.stepForward = function stepForward() { + // more quickly fast forward for keyboard-only users + this.player_.currentTime(this.player_.currentTime() + 5); }; /** - * Add the vjs-paused class to the element so it can change appearance + * Move more quickly rewind for keyboard-only users * - * @method handlePause + * @method stepBack */ - PlayToggle.prototype.handlePause = function handlePause() { - this.removeClass('vjs-playing'); - this.addClass('vjs-paused'); - this.controlText('Play'); // change the button text to "Play" + + SeekBar.prototype.stepBack = function stepBack() { + // more quickly rewind for keyboard-only users + this.player_.currentTime(this.player_.currentTime() - 5); }; - return PlayToggle; -})(_buttonJs2['default']); + return SeekBar; +}(_slider2['default']); -PlayToggle.prototype.controlText_ = 'Play'; +SeekBar.prototype.options_ = { + children: ['loadProgressBar', 'mouseTimeDisplay', 'playProgressBar'], + barName: 'playProgressBar' +}; -_componentJs2['default'].registerComponent('PlayToggle', PlayToggle); -exports['default'] = PlayToggle; -module.exports = exports['default']; +SeekBar.prototype.playerEvent = 'timeupdate'; -},{"../button.js":64,"../component.js":67}],73:[function(_dereq_,module,exports){ -/** - * @file playback-rate-menu-button.js - */ +_component2['default'].registerComponent('SeekBar', SeekBar); +exports['default'] = SeekBar; + +},{"15":15,"17":17,"20":20,"5":5,"57":57,"81":81,"84":84,"85":85}],20:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _component = _dereq_(5); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _component2 = _interopRequireDefault(_component); -var _menuMenuButtonJs = _dereq_('../../menu/menu-button.js'); +var _fn = _dereq_(84); -var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs); +var Fn = _interopRequireWildcard(_fn); -var _menuMenuJs = _dereq_('../../menu/menu.js'); +var _formatTime = _dereq_(85); -var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs); +var _formatTime2 = _interopRequireDefault(_formatTime); -var _playbackRateMenuItemJs = _dereq_('./playback-rate-menu-item.js'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var _playbackRateMenuItemJs2 = _interopRequireDefault(_playbackRateMenuItemJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _componentJs = _dereq_('../../component.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _componentJs2 = _interopRequireDefault(_componentJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _utilsDomJs = _dereq_('../../utils/dom.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file play-progress-bar.js + */ -var Dom = _interopRequireWildcard(_utilsDomJs); /** - * The component for controlling the playback rate + * Shows play progress * * @param {Player|Object} player * @param {Object=} options - * @extends MenuButton - * @class PlaybackRateMenuButton + * @extends Component + * @class PlayProgressBar */ +var TooltipProgressBar = function (_Component) { + _inherits(TooltipProgressBar, _Component); -var PlaybackRateMenuButton = (function (_MenuButton) { - _inherits(PlaybackRateMenuButton, _MenuButton); - - function PlaybackRateMenuButton(player, options) { - _classCallCheck(this, PlaybackRateMenuButton); + function TooltipProgressBar(player, options) { + _classCallCheck(this, TooltipProgressBar); - _MenuButton.call(this, player, options); + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options)); - this.updateVisibility(); - this.updateLabel(); - - this.on(player, 'loadstart', this.updateVisibility); - this.on(player, 'ratechange', this.updateLabel); + _this.updateDataAttr(); + _this.on(player, 'timeupdate', _this.updateDataAttr); + player.ready(Fn.bind(_this, _this.updateDataAttr)); + return _this; } /** @@ -5209,189 +3986,228 @@ var PlaybackRateMenuButton = (function (_MenuButton) { * @method createEl */ - PlaybackRateMenuButton.prototype.createEl = function createEl() { - var el = _MenuButton.prototype.createEl.call(this); - this.labelEl_ = Dom.createEl('div', { - className: 'vjs-playback-rate-value', - innerHTML: 1.0 + TooltipProgressBar.prototype.createEl = function createEl() { + var el = _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-tooltip-progress-bar vjs-slider-bar', + innerHTML: '
\n ' + this.localize('Progress') + ': 0%' }); - el.appendChild(this.labelEl_); + this.tooltip = el.querySelector('.vjs-time-tooltip'); return el; }; + TooltipProgressBar.prototype.updateDataAttr = function updateDataAttr() { + var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime(); + var formattedTime = (0, _formatTime2['default'])(time, this.player_.duration()); + + this.el_.setAttribute('data-current-time', formattedTime); + this.tooltip.innerHTML = formattedTime; + }; + + return TooltipProgressBar; +}(_component2['default']); + +_component2['default'].registerComponent('TooltipProgressBar', TooltipProgressBar); +exports['default'] = TooltipProgressBar; + +},{"5":5,"84":84,"85":85}],21:[function(_dereq_,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _spacer = _dereq_(22); + +var _spacer2 = _interopRequireDefault(_spacer); + +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file custom-control-spacer.js + */ + + +/** + * Spacer specifically meant to be used as an insertion point for new plugins, etc. + * + * @extends Spacer + * @class CustomControlSpacer + */ +var CustomControlSpacer = function (_Spacer) { + _inherits(CustomControlSpacer, _Spacer); + + function CustomControlSpacer() { + _classCallCheck(this, CustomControlSpacer); + + return _possibleConstructorReturn(this, _Spacer.apply(this, arguments)); + } + /** * Allow sub components to stack CSS class names * * @return {String} The constructed class name * @method buildCSSClass */ - - PlaybackRateMenuButton.prototype.buildCSSClass = function buildCSSClass() { - return 'vjs-playback-rate ' + _MenuButton.prototype.buildCSSClass.call(this); + CustomControlSpacer.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-custom-control-spacer ' + _Spacer.prototype.buildCSSClass.call(this); }; /** - * Create the playback rate menu + * Create the component's DOM element * - * @return {Menu} Menu object populated with items - * @method createMenu + * @return {Element} + * @method createEl */ - PlaybackRateMenuButton.prototype.createMenu = function createMenu() { - var menu = new _menuMenuJs2['default'](this.player()); - var rates = this.playbackRates(); - if (rates) { - for (var i = rates.length - 1; i >= 0; i--) { - menu.addChild(new _playbackRateMenuItemJs2['default'](this.player(), { 'rate': rates[i] + 'x' })); - } - } + CustomControlSpacer.prototype.createEl = function createEl() { + var el = _Spacer.prototype.createEl.call(this, { + className: this.buildCSSClass() + }); - return menu; + // No-flex/table-cell mode requires there be some content + // in the cell to fill the remaining space of the table. + el.innerHTML = ' '; + return el; }; - /** - * Updates ARIA accessibility attributes - * - * @method updateARIAAttributes - */ + return CustomControlSpacer; +}(_spacer2['default']); - PlaybackRateMenuButton.prototype.updateARIAAttributes = function updateARIAAttributes() { - // Current playback rate - this.el().setAttribute('aria-valuenow', this.player().playbackRate()); - }; +_component2['default'].registerComponent('CustomControlSpacer', CustomControlSpacer); +exports['default'] = CustomControlSpacer; - /** - * Handle menu item click - * - * @method handleClick - */ +},{"22":22,"5":5}],22:[function(_dereq_,module,exports){ +'use strict'; - PlaybackRateMenuButton.prototype.handleClick = function handleClick() { - // select next rate option - var currentRate = this.player().playbackRate(); - var rates = this.playbackRates(); +exports.__esModule = true; - // this will select first one if the last one currently selected - var newRate = rates[0]; - for (var i = 0; i < rates.length; i++) { - if (rates[i] > currentRate) { - newRate = rates[i]; - break; - } - } - this.player().playbackRate(newRate); - }; +var _component = _dereq_(5); - /** - * Get possible playback rates - * - * @return {Array} Possible playback rates - * @method playbackRates - */ +var _component2 = _interopRequireDefault(_component); - PlaybackRateMenuButton.prototype.playbackRates = function playbackRates() { - return this.options_['playbackRates'] || this.options_.playerOptions && this.options_.playerOptions['playbackRates']; - }; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - /** - * Get supported playback rates - * - * @return {Array} Supported playback rates - * @method playbackRateSupported - */ +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file spacer.js + */ - PlaybackRateMenuButton.prototype.playbackRateSupported = function playbackRateSupported() { - return this.player().tech_ && this.player().tech_['featuresPlaybackRate'] && this.playbackRates() && this.playbackRates().length > 0; - }; + +/** + * Just an empty spacer element that can be used as an append point for plugins, etc. + * Also can be used to create space between elements when necessary. + * + * @extends Component + * @class Spacer + */ +var Spacer = function (_Component) { + _inherits(Spacer, _Component); + + function Spacer() { + _classCallCheck(this, Spacer); + + return _possibleConstructorReturn(this, _Component.apply(this, arguments)); + } /** - * Hide playback rate controls when they're no playback rate options to select + * Allow sub components to stack CSS class names * - * @method updateVisibility + * @return {String} The constructed class name + * @method buildCSSClass */ - - PlaybackRateMenuButton.prototype.updateVisibility = function updateVisibility() { - if (this.playbackRateSupported()) { - this.removeClass('vjs-hidden'); - } else { - this.addClass('vjs-hidden'); - } + Spacer.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-spacer ' + _Component.prototype.buildCSSClass.call(this); }; /** - * Update button label when rate changed + * Create the component's DOM element * - * @method updateLabel + * @return {Element} + * @method createEl */ - PlaybackRateMenuButton.prototype.updateLabel = function updateLabel() { - if (this.playbackRateSupported()) { - this.labelEl_.innerHTML = this.player().playbackRate() + 'x'; - } + + Spacer.prototype.createEl = function createEl() { + return _Component.prototype.createEl.call(this, 'div', { + className: this.buildCSSClass() + }); }; - return PlaybackRateMenuButton; -})(_menuMenuButtonJs2['default']); + return Spacer; +}(_component2['default']); -PlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate'; +_component2['default'].registerComponent('Spacer', Spacer); -_componentJs2['default'].registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton); -exports['default'] = PlaybackRateMenuButton; -module.exports = exports['default']; +exports['default'] = Spacer; -},{"../../component.js":67,"../../menu/menu-button.js":104,"../../menu/menu.js":106,"../../utils/dom.js":132,"./playback-rate-menu-item.js":74}],74:[function(_dereq_,module,exports){ -/** - * @file playback-rate-menu-item.js - */ +},{"5":5}],23:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _textTrackMenuItem = _dereq_(31); + +var _textTrackMenuItem2 = _interopRequireDefault(_textTrackMenuItem); + +var _component = _dereq_(5); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _component2 = _interopRequireDefault(_component); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _menuMenuItemJs = _dereq_('../../menu/menu-item.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _componentJs = _dereq_('../../component.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file caption-settings-menu-item.js + */ -var _componentJs2 = _interopRequireDefault(_componentJs); /** - * The specific menu item type for selecting a playback rate + * The menu item for caption track settings menu * * @param {Player|Object} player * @param {Object=} options - * @extends MenuItem - * @class PlaybackRateMenuItem + * @extends TextTrackMenuItem + * @class CaptionSettingsMenuItem */ +var CaptionSettingsMenuItem = function (_TextTrackMenuItem) { + _inherits(CaptionSettingsMenuItem, _TextTrackMenuItem); -var PlaybackRateMenuItem = (function (_MenuItem) { - _inherits(PlaybackRateMenuItem, _MenuItem); - - function PlaybackRateMenuItem(player, options) { - _classCallCheck(this, PlaybackRateMenuItem); + function CaptionSettingsMenuItem(player, options) { + _classCallCheck(this, CaptionSettingsMenuItem); - var label = options['rate']; - var rate = parseFloat(label, 10); + options.track = { + player: player, + kind: options.kind, + label: options.kind + ' settings', + selectable: false, + 'default': false, + mode: 'disabled' + }; - // Modify options for parent MenuItem class's init. - options['label'] = label; - options['selected'] = rate === 1; - _MenuItem.call(this, player, options); + // CaptionSettingsMenuItem has no concept of 'selected' + options.selectable = false; - this.label = label; - this.rate = rate; + var _this = _possibleConstructorReturn(this, _TextTrackMenuItem.call(this, player, options)); - this.on(player, 'ratechange', this.update); + _this.addClass('vjs-texttrack-settings'); + _this.controlText(', opens ' + options.kind + ' settings dialog'); + return _this; } /** @@ -5400,675 +4216,672 @@ var PlaybackRateMenuItem = (function (_MenuItem) { * @method handleClick */ - PlaybackRateMenuItem.prototype.handleClick = function handleClick() { - _MenuItem.prototype.handleClick.call(this); - this.player().playbackRate(this.rate); - }; - - /** - * Update playback rate with selected rate - * - * @method update - */ - PlaybackRateMenuItem.prototype.update = function update() { - this.selected(this.player().playbackRate() === this.rate); + CaptionSettingsMenuItem.prototype.handleClick = function handleClick() { + this.player().getChild('textTrackSettings').show(); + this.player().getChild('textTrackSettings').el_.focus(); }; - return PlaybackRateMenuItem; -})(_menuMenuItemJs2['default']); - -PlaybackRateMenuItem.prototype.contentElType = 'button'; + return CaptionSettingsMenuItem; +}(_textTrackMenuItem2['default']); -_componentJs2['default'].registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem); -exports['default'] = PlaybackRateMenuItem; -module.exports = exports['default']; +_component2['default'].registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem); +exports['default'] = CaptionSettingsMenuItem; -},{"../../component.js":67,"../../menu/menu-item.js":105}],75:[function(_dereq_,module,exports){ -/** - * @file load-progress-bar.js - */ +},{"31":31,"5":5}],24:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _textTrackButton = _dereq_(30); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _textTrackButton2 = _interopRequireDefault(_textTrackButton); + +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); + +var _captionSettingsMenuItem = _dereq_(23); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _captionSettingsMenuItem2 = _interopRequireDefault(_captionSettingsMenuItem); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _componentJs = _dereq_('../../component.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _componentJs2 = _interopRequireDefault(_componentJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _utilsDomJs = _dereq_('../../utils/dom.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file captions-button.js + */ -var Dom = _interopRequireWildcard(_utilsDomJs); /** - * Shows load progress + * The button component for toggling and selecting captions * - * @param {Player|Object} player - * @param {Object=} options - * @extends Component - * @class LoadProgressBar + * @param {Object} player Player object + * @param {Object=} options Object of option names and values + * @param {Function=} ready Ready callback function + * @extends TextTrackButton + * @class CaptionsButton */ +var CaptionsButton = function (_TextTrackButton) { + _inherits(CaptionsButton, _TextTrackButton); -var LoadProgressBar = (function (_Component) { - _inherits(LoadProgressBar, _Component); + function CaptionsButton(player, options, ready) { + _classCallCheck(this, CaptionsButton); - function LoadProgressBar(player, options) { - _classCallCheck(this, LoadProgressBar); + var _this = _possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready)); - _Component.call(this, player, options); - this.on(player, 'progress', this.update); + _this.el_.setAttribute('aria-label', 'Captions Menu'); + return _this; } /** - * Create the component's DOM element + * Allow sub components to stack CSS class names * - * @return {Element} - * @method createEl + * @return {String} The constructed class name + * @method buildCSSClass */ - LoadProgressBar.prototype.createEl = function createEl() { - return _Component.prototype.createEl.call(this, 'div', { - className: 'vjs-load-progress', - innerHTML: '' + this.localize('Loaded') + ': 0%' - }); + + CaptionsButton.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-captions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this); }; /** - * Update progress bar + * Update caption menu items * * @method update */ - LoadProgressBar.prototype.update = function update() { - var buffered = this.player_.buffered(); - var duration = this.player_.duration(); - var bufferedEnd = this.player_.bufferedEnd(); - var children = this.el_.children; - - // get the percent width of a time compared to the total end - var percentify = function percentify(time, end) { - var percent = time / end || 0; // no NaN - return (percent >= 1 ? 1 : percent) * 100 + '%'; - }; - - // update the width of the progress bar - this.el_.style.width = percentify(bufferedEnd, duration); - // add child elements to represent the individual buffered time ranges - for (var i = 0; i < buffered.length; i++) { - var start = buffered.start(i); - var end = buffered.end(i); - var part = children[i]; + CaptionsButton.prototype.update = function update() { + var threshold = 2; - if (!part) { - part = this.el_.appendChild(Dom.createEl()); - } + _TextTrackButton.prototype.update.call(this); - // set the percent based on the width of the progress bar (bufferedEnd) - part.style.left = percentify(start, bufferedEnd); - part.style.width = percentify(end - start, bufferedEnd); + // if native, then threshold is 1 because no settings button + if (this.player().tech_ && this.player().tech_.featuresNativeTextTracks) { + threshold = 1; } - // remove unused buffered range elements - for (var i = children.length; i > buffered.length; i--) { - this.el_.removeChild(children[i - 1]); + if (this.items && this.items.length > threshold) { + this.show(); + } else { + this.hide(); } }; - return LoadProgressBar; -})(_componentJs2['default']); + /** + * Create caption menu items + * + * @return {Array} Array of menu items + * @method createItems + */ -_componentJs2['default'].registerComponent('LoadProgressBar', LoadProgressBar); -exports['default'] = LoadProgressBar; -module.exports = exports['default']; -},{"../../component.js":67,"../../utils/dom.js":132}],76:[function(_dereq_,module,exports){ -/** - * @file mouse-time-display.js - */ -'use strict'; + CaptionsButton.prototype.createItems = function createItems() { + var items = []; -exports.__esModule = true; + if (!(this.player().tech_ && this.player().tech_.featuresNativeTextTracks)) { + items.push(new _captionSettingsMenuItem2['default'](this.player_, { kind: this.kind_ })); + } -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + return _TextTrackButton.prototype.createItems.call(this, items); + }; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + return CaptionsButton; +}(_textTrackButton2['default']); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +CaptionsButton.prototype.kind_ = 'captions'; +CaptionsButton.prototype.controlText_ = 'Captions'; -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +_component2['default'].registerComponent('CaptionsButton', CaptionsButton); +exports['default'] = CaptionsButton; -var _componentJs = _dereq_('../../component.js'); +},{"23":23,"30":30,"5":5}],25:[function(_dereq_,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _textTrackButton = _dereq_(30); + +var _textTrackButton2 = _interopRequireDefault(_textTrackButton); + +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); -var _componentJs2 = _interopRequireDefault(_componentJs); +var _textTrackMenuItem = _dereq_(31); -var _utilsDomJs = _dereq_('../../utils/dom.js'); +var _textTrackMenuItem2 = _interopRequireDefault(_textTrackMenuItem); -var Dom = _interopRequireWildcard(_utilsDomJs); +var _chaptersTrackMenuItem = _dereq_(26); -var _utilsFnJs = _dereq_('../../utils/fn.js'); +var _chaptersTrackMenuItem2 = _interopRequireDefault(_chaptersTrackMenuItem); + +var _menu = _dereq_(49); + +var _menu2 = _interopRequireDefault(_menu); + +var _dom = _dereq_(82); + +var Dom = _interopRequireWildcard(_dom); + +var _toTitleCase = _dereq_(92); + +var _toTitleCase2 = _interopRequireDefault(_toTitleCase); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var Fn = _interopRequireWildcard(_utilsFnJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _lodashCompatFunctionThrottle = _dereq_('lodash-compat/function/throttle'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file chapters-button.js + */ -var _lodashCompatFunctionThrottle2 = _interopRequireDefault(_lodashCompatFunctionThrottle); /** - * The Mouse Time Display component shows the time you will seek to - * when hovering over the progress bar + * The button component for toggling and selecting chapters + * Chapters act much differently than other text tracks + * Cues are navigation vs. other tracks of alternative languages * - * @param {Player|Object} player - * @param {Object=} options - * @extends Component - * @class MouseTimeDisplay + * @param {Object} player Player object + * @param {Object=} options Object of option names and values + * @param {Function=} ready Ready callback function + * @extends TextTrackButton + * @class ChaptersButton */ +var ChaptersButton = function (_TextTrackButton) { + _inherits(ChaptersButton, _TextTrackButton); -var MouseTimeDisplay = (function (_Component) { - _inherits(MouseTimeDisplay, _Component); + function ChaptersButton(player, options, ready) { + _classCallCheck(this, ChaptersButton); - function MouseTimeDisplay(player, options) { - var _this = this; + var _this = _possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready)); - _classCallCheck(this, MouseTimeDisplay); + _this.el_.setAttribute('aria-label', 'Chapters Menu'); + return _this; + } - _Component.call(this, player, options); + /** + * Allow sub components to stack CSS class names + * + * @return {String} The constructed class name + * @method buildCSSClass + */ - this.update(0, 0); - player.on('ready', function () { - _this.on(player.controlBar.progressControl.el(), 'mousemove', _lodashCompatFunctionThrottle2['default'](Fn.bind(_this, _this.handleMouseMove), 25)); - }); - } + ChaptersButton.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-chapters-button ' + _TextTrackButton.prototype.buildCSSClass.call(this); + }; /** - * Create the component's DOM element + * Create a menu item for each text track * - * @return {Element} - * @method createEl + * @return {Array} Array of menu items + * @method createItems */ - MouseTimeDisplay.prototype.createEl = function createEl() { - return _Component.prototype.createEl.call(this, 'div', { - className: 'vjs-mouse-display' - }); - }; - MouseTimeDisplay.prototype.handleMouseMove = function handleMouseMove(event) { - var duration = this.player_.duration(); - var newTime = this.calculateDistance(event) * duration; - var position = event.pageX - Dom.findElPosition(this.el().parentNode).left; + ChaptersButton.prototype.createItems = function createItems() { + var items = []; + var tracks = this.player_.textTracks(); - this.update(newTime, position); - }; + if (!tracks) { + return items; + } - MouseTimeDisplay.prototype.update = function update(newTime, position) { - var time = _utilsFormatTimeJs2['default'](newTime, this.player_.duration()); + for (var i = 0; i < tracks.length; i++) { + var track = tracks[i]; - this.el().style.left = position + 'px'; - this.el().setAttribute('data-current-time', time); - }; + if (track.kind === this.kind_) { + items.push(new _textTrackMenuItem2['default'](this.player_, { track: track })); + } + } - MouseTimeDisplay.prototype.calculateDistance = function calculateDistance(event) { - return Dom.getPointerPosition(this.el().parentNode, event).x; + return items; }; - return MouseTimeDisplay; -})(_componentJs2['default']); + /** + * Create menu from chapter buttons + * + * @return {Menu} Menu of chapter buttons + * @method createMenu + */ -_componentJs2['default'].registerComponent('MouseTimeDisplay', MouseTimeDisplay); -exports['default'] = MouseTimeDisplay; -module.exports = exports['default']; -},{"../../component.js":67,"../../utils/dom.js":132,"../../utils/fn.js":134,"../../utils/format-time.js":135,"lodash-compat/function/throttle":7}],77:[function(_dereq_,module,exports){ -/** - * @file play-progress-bar.js - */ -'use strict'; + ChaptersButton.prototype.createMenu = function createMenu() { + var _this2 = this; -exports.__esModule = true; + var tracks = this.player_.textTracks() || []; + var chaptersTrack = void 0; + var items = this.items || []; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + for (var i = tracks.length - 1; i >= 0; i--) { -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + // We will always choose the last track as our chaptersTrack + var track = tracks[i]; -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + if (track.kind === this.kind_) { + chaptersTrack = track; -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + break; + } + } -var _componentJs = _dereq_('../../component.js'); + var menu = this.menu; -var _componentJs2 = _interopRequireDefault(_componentJs); + if (menu === undefined) { + menu = new _menu2['default'](this.player_); -var _utilsFnJs = _dereq_('../../utils/fn.js'); + var title = Dom.createEl('li', { + className: 'vjs-menu-title', + innerHTML: (0, _toTitleCase2['default'])(this.kind_), + tabIndex: -1 + }); -var Fn = _interopRequireWildcard(_utilsFnJs); + menu.children_.unshift(title); + Dom.insertElFirst(title, menu.contentEl()); + } else { + // We will empty out the menu children each time because we want a + // fresh new menu child list each time + items.forEach(function (item) { + return menu.removeChild(item); + }); + // Empty out the ChaptersButton menu items because we no longer need them + items = []; + } -var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js'); + if (chaptersTrack && (chaptersTrack.cues === null || chaptersTrack.cues === undefined)) { + chaptersTrack.mode = 'hidden'; -var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs); + var remoteTextTrackEl = this.player_.remoteTextTrackEls().getTrackElementByTrack_(chaptersTrack); -/** - * Shows play progress - * - * @param {Player|Object} player - * @param {Object=} options - * @extends Component - * @class PlayProgressBar - */ + if (remoteTextTrackEl) { + remoteTextTrackEl.addEventListener('load', function (event) { + return _this2.update(); + }); + } + } -var PlayProgressBar = (function (_Component) { - _inherits(PlayProgressBar, _Component); + if (chaptersTrack && chaptersTrack.cues && chaptersTrack.cues.length > 0) { + var cues = chaptersTrack.cues; - function PlayProgressBar(player, options) { - _classCallCheck(this, PlayProgressBar); + for (var _i = 0, l = cues.length; _i < l; _i++) { + var cue = cues[_i]; - _Component.call(this, player, options); - this.updateDataAttr(); - this.on(player, 'timeupdate', this.updateDataAttr); - player.ready(Fn.bind(this, this.updateDataAttr)); - } + var mi = new _chaptersTrackMenuItem2['default'](this.player_, { + cue: cue, + track: chaptersTrack + }); - /** - * Create the component's DOM element - * - * @return {Element} - * @method createEl - */ + items.push(mi); - PlayProgressBar.prototype.createEl = function createEl() { - return _Component.prototype.createEl.call(this, 'div', { - className: 'vjs-play-progress vjs-slider-bar', - innerHTML: '' + this.localize('Progress') + ': 0%' - }); - }; + menu.addChild(mi); + } + } - PlayProgressBar.prototype.updateDataAttr = function updateDataAttr() { - var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime(); - this.el_.setAttribute('data-current-time', _utilsFormatTimeJs2['default'](time, this.player_.duration())); + if (items.length > 0) { + this.show(); + } + // Assigning the value of items back to this.items for next iteration + this.items = items; + return menu; }; - return PlayProgressBar; -})(_componentJs2['default']); + return ChaptersButton; +}(_textTrackButton2['default']); -_componentJs2['default'].registerComponent('PlayProgressBar', PlayProgressBar); -exports['default'] = PlayProgressBar; -module.exports = exports['default']; +ChaptersButton.prototype.kind_ = 'chapters'; +ChaptersButton.prototype.controlText_ = 'Chapters'; -},{"../../component.js":67,"../../utils/fn.js":134,"../../utils/format-time.js":135}],78:[function(_dereq_,module,exports){ -/** - * @file progress-control.js - */ +_component2['default'].registerComponent('ChaptersButton', ChaptersButton); +exports['default'] = ChaptersButton; + +},{"26":26,"30":30,"31":31,"49":49,"5":5,"82":82,"92":92}],26:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _menuItem = _dereq_(48); + +var _menuItem2 = _interopRequireDefault(_menuItem); + +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _fn = _dereq_(84); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var Fn = _interopRequireWildcard(_fn); -var _componentJs = _dereq_('../../component.js'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var _componentJs2 = _interopRequireDefault(_componentJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _seekBarJs = _dereq_('./seek-bar.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _seekBarJs2 = _interopRequireDefault(_seekBarJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _mouseTimeDisplayJs = _dereq_('./mouse-time-display.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file chapters-track-menu-item.js + */ -var _mouseTimeDisplayJs2 = _interopRequireDefault(_mouseTimeDisplayJs); /** - * The Progress Control component contains the seek bar, load progress, - * and play progress + * The chapter track menu item * * @param {Player|Object} player * @param {Object=} options - * @extends Component - * @class ProgressControl + * @extends MenuItem + * @class ChaptersTrackMenuItem */ +var ChaptersTrackMenuItem = function (_MenuItem) { + _inherits(ChaptersTrackMenuItem, _MenuItem); -var ProgressControl = (function (_Component) { - _inherits(ProgressControl, _Component); + function ChaptersTrackMenuItem(player, options) { + _classCallCheck(this, ChaptersTrackMenuItem); - function ProgressControl() { - _classCallCheck(this, ProgressControl); + var track = options.track; + var cue = options.cue; + var currentTime = player.currentTime(); + + // Modify options for parent MenuItem class's init. + options.label = cue.text; + options.selected = cue.startTime <= currentTime && currentTime < cue.endTime; + + var _this = _possibleConstructorReturn(this, _MenuItem.call(this, player, options)); - _Component.apply(this, arguments); + _this.track = track; + _this.cue = cue; + track.addEventListener('cuechange', Fn.bind(_this, _this.update)); + return _this; } /** - * Create the component's DOM element + * Handle click on menu item * - * @return {Element} - * @method createEl + * @method handleClick */ - ProgressControl.prototype.createEl = function createEl() { - return _Component.prototype.createEl.call(this, 'div', { - className: 'vjs-progress-control vjs-control' - }); - }; - - return ProgressControl; -})(_componentJs2['default']); - -ProgressControl.prototype.options_ = { - children: ['seekBar'] -}; -_componentJs2['default'].registerComponent('ProgressControl', ProgressControl); -exports['default'] = ProgressControl; -module.exports = exports['default']; + ChaptersTrackMenuItem.prototype.handleClick = function handleClick() { + _MenuItem.prototype.handleClick.call(this); + this.player_.currentTime(this.cue.startTime); + this.update(this.cue.startTime); + }; -},{"../../component.js":67,"./mouse-time-display.js":76,"./seek-bar.js":79}],79:[function(_dereq_,module,exports){ -/** - * @file seek-bar.js - */ -'use strict'; + /** + * Update chapter menu item + * + * @method update + */ -exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + ChaptersTrackMenuItem.prototype.update = function update() { + var cue = this.cue; + var currentTime = this.player_.currentTime(); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + // vjs.log(currentTime, cue.startTime); + this.selected(cue.startTime <= currentTime && currentTime < cue.endTime); + }; -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + return ChaptersTrackMenuItem; +}(_menuItem2['default']); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +_component2['default'].registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem); +exports['default'] = ChaptersTrackMenuItem; -var _sliderSliderJs = _dereq_('../../slider/slider.js'); +},{"48":48,"5":5,"84":84}],27:[function(_dereq_,module,exports){ +'use strict'; -var _sliderSliderJs2 = _interopRequireDefault(_sliderSliderJs); +exports.__esModule = true; -var _componentJs = _dereq_('../../component.js'); +var _textTrackButton = _dereq_(30); -var _componentJs2 = _interopRequireDefault(_componentJs); +var _textTrackButton2 = _interopRequireDefault(_textTrackButton); -var _loadProgressBarJs = _dereq_('./load-progress-bar.js'); +var _component = _dereq_(5); -var _loadProgressBarJs2 = _interopRequireDefault(_loadProgressBarJs); +var _component2 = _interopRequireDefault(_component); -var _playProgressBarJs = _dereq_('./play-progress-bar.js'); +var _fn = _dereq_(84); -var _playProgressBarJs2 = _interopRequireDefault(_playProgressBarJs); +var Fn = _interopRequireWildcard(_fn); -var _utilsFnJs = _dereq_('../../utils/fn.js'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var Fn = _interopRequireWildcard(_utilsFnJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _objectAssign = _dereq_('object.assign'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file descriptions-button.js + */ -var _objectAssign2 = _interopRequireDefault(_objectAssign); /** - * Seek Bar and holder for the progress bars + * The button component for toggling and selecting descriptions * - * @param {Player|Object} player - * @param {Object=} options - * @extends Slider - * @class SeekBar + * @param {Object} player Player object + * @param {Object=} options Object of option names and values + * @param {Function=} ready Ready callback function + * @extends TextTrackButton + * @class DescriptionsButton */ +var DescriptionsButton = function (_TextTrackButton) { + _inherits(DescriptionsButton, _TextTrackButton); -var SeekBar = (function (_Slider) { - _inherits(SeekBar, _Slider); + function DescriptionsButton(player, options, ready) { + _classCallCheck(this, DescriptionsButton); - function SeekBar(player, options) { - _classCallCheck(this, SeekBar); + var _this = _possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready)); - _Slider.call(this, player, options); - this.on(player, 'timeupdate', this.updateARIAAttributes); - player.ready(Fn.bind(this, this.updateARIAAttributes)); - } + _this.el_.setAttribute('aria-label', 'Descriptions Menu'); - /** - * Create the component's DOM element - * - * @return {Element} - * @method createEl - */ - - SeekBar.prototype.createEl = function createEl() { - return _Slider.prototype.createEl.call(this, 'div', { - className: 'vjs-progress-holder' - }, { - 'aria-label': 'video progress bar' - }); - }; - - /** - * Update ARIA accessibility attributes - * - * @method updateARIAAttributes - */ - - SeekBar.prototype.updateARIAAttributes = function updateARIAAttributes() { - // Allows for smooth scrubbing, when player can't keep up. - var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime(); - this.el_.setAttribute('aria-valuenow', (this.getPercent() * 100).toFixed(2)); // machine readable value of progress bar (percentage complete) - this.el_.setAttribute('aria-valuetext', _utilsFormatTimeJs2['default'](time, this.player_.duration())); // human readable value of progress bar (time complete) - }; + var tracks = player.textTracks(); - /** - * Get percentage of video played - * - * @return {Number} Percentage played - * @method getPercent - */ + if (tracks) { + (function () { + var changeHandler = Fn.bind(_this, _this.handleTracksChange); - SeekBar.prototype.getPercent = function getPercent() { - var percent = this.player_.currentTime() / this.player_.duration(); - return percent >= 1 ? 1 : percent; - }; + tracks.addEventListener('change', changeHandler); + _this.on('dispose', function () { + tracks.removeEventListener('change', changeHandler); + }); + })(); + } + return _this; + } /** - * Handle mouse down on seek bar + * Handle text track change * - * @method handleMouseDown + * @method handleTracksChange */ - SeekBar.prototype.handleMouseDown = function handleMouseDown(event) { - _Slider.prototype.handleMouseDown.call(this, event); - - this.player_.scrubbing(true); - - this.videoWasPlaying = !this.player_.paused(); - this.player_.pause(); - }; - /** - * Handle mouse move on seek bar - * - * @method handleMouseMove - */ + DescriptionsButton.prototype.handleTracksChange = function handleTracksChange(event) { + var tracks = this.player().textTracks(); + var disabled = false; - SeekBar.prototype.handleMouseMove = function handleMouseMove(event) { - var newTime = this.calculateDistance(event) * this.player_.duration(); + // Check whether a track of a different kind is showing + for (var i = 0, l = tracks.length; i < l; i++) { + var track = tracks[i]; - // Don't let video end while scrubbing. - if (newTime === this.player_.duration()) { - newTime = newTime - 0.1; + if (track.kind !== this.kind_ && track.mode === 'showing') { + disabled = true; + break; + } } - // Set new time (tell player to seek to new time) - this.player_.currentTime(newTime); - }; - - /** - * Handle mouse up on seek bar - * - * @method handleMouseUp - */ - - SeekBar.prototype.handleMouseUp = function handleMouseUp(event) { - _Slider.prototype.handleMouseUp.call(this, event); - - this.player_.scrubbing(false); - if (this.videoWasPlaying) { - this.player_.play(); + // If another track is showing, disable this menu button + if (disabled) { + this.disable(); + } else { + this.enable(); } }; /** - * Move more quickly fast forward for keyboard-only users + * Allow sub components to stack CSS class names * - * @method stepForward + * @return {String} The constructed class name + * @method buildCSSClass */ - SeekBar.prototype.stepForward = function stepForward() { - this.player_.currentTime(this.player_.currentTime() + 5); // more quickly fast forward for keyboard-only users - }; - - /** - * Move more quickly rewind for keyboard-only users - * - * @method stepBack - */ - SeekBar.prototype.stepBack = function stepBack() { - this.player_.currentTime(this.player_.currentTime() - 5); // more quickly rewind for keyboard-only users + DescriptionsButton.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-descriptions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this); }; - return SeekBar; -})(_sliderSliderJs2['default']); - -SeekBar.prototype.options_ = { - children: ['loadProgressBar', 'mouseTimeDisplay', 'playProgressBar'], - 'barName': 'playProgressBar' -}; + return DescriptionsButton; +}(_textTrackButton2['default']); -SeekBar.prototype.playerEvent = 'timeupdate'; +DescriptionsButton.prototype.kind_ = 'descriptions'; +DescriptionsButton.prototype.controlText_ = 'Descriptions'; -_componentJs2['default'].registerComponent('SeekBar', SeekBar); -exports['default'] = SeekBar; -module.exports = exports['default']; +_component2['default'].registerComponent('DescriptionsButton', DescriptionsButton); +exports['default'] = DescriptionsButton; -},{"../../component.js":67,"../../slider/slider.js":114,"../../utils/fn.js":134,"../../utils/format-time.js":135,"./load-progress-bar.js":75,"./play-progress-bar.js":77,"object.assign":45}],80:[function(_dereq_,module,exports){ -/** - * @file custom-control-spacer.js - */ +},{"30":30,"5":5,"84":84}],28:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _textTrackMenuItem = _dereq_(31); + +var _textTrackMenuItem2 = _interopRequireDefault(_textTrackMenuItem); + +var _component = _dereq_(5); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _component2 = _interopRequireDefault(_component); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _spacerJs = _dereq_('./spacer.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _spacerJs2 = _interopRequireDefault(_spacerJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _componentJs = _dereq_('../../component.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file off-text-track-menu-item.js + */ -var _componentJs2 = _interopRequireDefault(_componentJs); /** - * Spacer specifically meant to be used as an insertion point for new plugins, etc. + * A special menu item for turning of a specific type of text track * - * @extends Spacer - * @class CustomControlSpacer + * @param {Player|Object} player + * @param {Object=} options + * @extends TextTrackMenuItem + * @class OffTextTrackMenuItem */ +var OffTextTrackMenuItem = function (_TextTrackMenuItem) { + _inherits(OffTextTrackMenuItem, _TextTrackMenuItem); -var CustomControlSpacer = (function (_Spacer) { - _inherits(CustomControlSpacer, _Spacer); + function OffTextTrackMenuItem(player, options) { + _classCallCheck(this, OffTextTrackMenuItem); - function CustomControlSpacer() { - _classCallCheck(this, CustomControlSpacer); + // Create pseudo track info + // Requires options['kind'] + options.track = { + player: player, + kind: options.kind, + label: options.kind + ' off', + 'default': false, + mode: 'disabled' + }; + + // MenuItem is selectable + options.selectable = true; + + var _this = _possibleConstructorReturn(this, _TextTrackMenuItem.call(this, player, options)); - _Spacer.apply(this, arguments); + _this.selected(true); + return _this; } /** - * Allow sub components to stack CSS class names + * Handle text track change * - * @return {String} The constructed class name - * @method buildCSSClass + * @param {Object} event Event object + * @method handleTracksChange */ - CustomControlSpacer.prototype.buildCSSClass = function buildCSSClass() { - return 'vjs-custom-control-spacer ' + _Spacer.prototype.buildCSSClass.call(this); - }; - /** - * Create the component's DOM element - * - * @return {Element} - * @method createEl - */ + OffTextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) { + var tracks = this.player().textTracks(); + var selected = true; - CustomControlSpacer.prototype.createEl = function createEl() { - var el = _Spacer.prototype.createEl.call(this, { - className: this.buildCSSClass() - }); + for (var i = 0, l = tracks.length; i < l; i++) { + var track = tracks[i]; - // No-flex/table-cell mode requires there be some content - // in the cell to fill the remaining space of the table. - el.innerHTML = ' '; - return el; + if (track.kind === this.track.kind && track.mode === 'showing') { + selected = false; + break; + } + } + + this.selected(selected); }; - return CustomControlSpacer; -})(_spacerJs2['default']); + return OffTextTrackMenuItem; +}(_textTrackMenuItem2['default']); -_componentJs2['default'].registerComponent('CustomControlSpacer', CustomControlSpacer); -exports['default'] = CustomControlSpacer; -module.exports = exports['default']; +_component2['default'].registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem); +exports['default'] = OffTextTrackMenuItem; -},{"../../component.js":67,"./spacer.js":81}],81:[function(_dereq_,module,exports){ -/** - * @file spacer.js - */ +},{"31":31,"5":5}],29:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; +var _textTrackButton = _dereq_(30); + +var _textTrackButton2 = _interopRequireDefault(_textTrackButton); + +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _componentJs = _dereq_('../../component.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file subtitles-button.js + */ -var _componentJs2 = _interopRequireDefault(_componentJs); /** - * Just an empty spacer element that can be used as an append point for plugins, etc. - * Also can be used to create space between elements when necessary. + * The button component for toggling and selecting subtitles * - * @extends Component - * @class Spacer + * @param {Object} player Player object + * @param {Object=} options Object of option names and values + * @param {Function=} ready Ready callback function + * @extends TextTrackButton + * @class SubtitlesButton */ +var SubtitlesButton = function (_TextTrackButton) { + _inherits(SubtitlesButton, _TextTrackButton); -var Spacer = (function (_Component) { - _inherits(Spacer, _Component); + function SubtitlesButton(player, options, ready) { + _classCallCheck(this, SubtitlesButton); - function Spacer() { - _classCallCheck(this, Spacer); + var _this = _possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready)); - _Component.apply(this, arguments); + _this.el_.setAttribute('aria-label', 'Subtitles Menu'); + return _this; } /** @@ -6078,678 +4891,673 @@ var Spacer = (function (_Component) { * @method buildCSSClass */ - Spacer.prototype.buildCSSClass = function buildCSSClass() { - return 'vjs-spacer ' + _Component.prototype.buildCSSClass.call(this); - }; - - /** - * Create the component's DOM element - * - * @return {Element} - * @method createEl - */ - Spacer.prototype.createEl = function createEl() { - return _Component.prototype.createEl.call(this, 'div', { - className: this.buildCSSClass() - }); + SubtitlesButton.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-subtitles-button ' + _TextTrackButton.prototype.buildCSSClass.call(this); }; - return Spacer; -})(_componentJs2['default']); + return SubtitlesButton; +}(_textTrackButton2['default']); -_componentJs2['default'].registerComponent('Spacer', Spacer); +SubtitlesButton.prototype.kind_ = 'subtitles'; +SubtitlesButton.prototype.controlText_ = 'Subtitles'; -exports['default'] = Spacer; -module.exports = exports['default']; +_component2['default'].registerComponent('SubtitlesButton', SubtitlesButton); +exports['default'] = SubtitlesButton; -},{"../../component.js":67}],82:[function(_dereq_,module,exports){ -/** - * @file caption-settings-menu-item.js - */ +},{"30":30,"5":5}],30:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _trackButton = _dereq_(36); + +var _trackButton2 = _interopRequireDefault(_trackButton); + +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); + +var _textTrackMenuItem = _dereq_(31); + +var _textTrackMenuItem2 = _interopRequireDefault(_textTrackMenuItem); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _offTextTrackMenuItem = _dereq_(28); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _offTextTrackMenuItem2 = _interopRequireDefault(_offTextTrackMenuItem); -var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js'); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _componentJs = _dereq_('../../component.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file text-track-button.js + */ -var _componentJs2 = _interopRequireDefault(_componentJs); /** - * The menu item for caption track settings menu + * The base class for buttons that toggle specific text track types (e.g. subtitles) * * @param {Player|Object} player * @param {Object=} options - * @extends TextTrackMenuItem - * @class CaptionSettingsMenuItem + * @extends MenuButton + * @class TextTrackButton */ +var TextTrackButton = function (_TrackButton) { + _inherits(TextTrackButton, _TrackButton); -var CaptionSettingsMenuItem = (function (_TextTrackMenuItem) { - _inherits(CaptionSettingsMenuItem, _TextTrackMenuItem); - - function CaptionSettingsMenuItem(player, options) { - _classCallCheck(this, CaptionSettingsMenuItem); + function TextTrackButton(player) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - options['track'] = { - 'kind': options['kind'], - 'player': player, - 'label': options['kind'] + ' settings', - 'selectable': false, - 'default': false, - mode: 'disabled' - }; + _classCallCheck(this, TextTrackButton); - // CaptionSettingsMenuItem has no concept of 'selected' - options['selectable'] = false; + options.tracks = player.textTracks(); - _TextTrackMenuItem.call(this, player, options); - this.addClass('vjs-texttrack-settings'); - this.controlText(', opens ' + options['kind'] + ' settings dialog'); + return _possibleConstructorReturn(this, _TrackButton.call(this, player, options)); } /** - * Handle click on menu item + * Create a menu item for each text track * - * @method handleClick + * @return {Array} Array of menu items + * @method createItems */ - CaptionSettingsMenuItem.prototype.handleClick = function handleClick() { - this.player().getChild('textTrackSettings').show(); - this.player().getChild('textTrackSettings').el_.focus(); - }; - return CaptionSettingsMenuItem; -})(_textTrackMenuItemJs2['default']); + TextTrackButton.prototype.createItems = function createItems() { + var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; -_componentJs2['default'].registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem); -exports['default'] = CaptionSettingsMenuItem; -module.exports = exports['default']; + // Add an OFF menu item to turn all tracks off + items.push(new _offTextTrackMenuItem2['default'](this.player_, { kind: this.kind_ })); -},{"../../component.js":67,"./text-track-menu-item.js":89}],83:[function(_dereq_,module,exports){ -/** - * @file captions-button.js - */ + var tracks = this.player_.textTracks(); + + if (!tracks) { + return items; + } + + for (var i = 0; i < tracks.length; i++) { + var track = tracks[i]; + + // only add tracks that are of the appropriate kind and have a label + if (track.kind === this.kind_) { + items.push(new _textTrackMenuItem2['default'](this.player_, { + track: track, + // MenuItem is selectable + selectable: true + })); + } + } + + return items; + }; + + return TextTrackButton; +}(_trackButton2['default']); + +_component2['default'].registerComponent('TextTrackButton', TextTrackButton); +exports['default'] = TextTrackButton; + +},{"28":28,"31":31,"36":36,"5":5}],31:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _menuItem = _dereq_(48); + +var _menuItem2 = _interopRequireDefault(_menuItem); + +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); + +var _fn = _dereq_(84); + +var Fn = _interopRequireWildcard(_fn); + +var _window = _dereq_(96); + +var _window2 = _interopRequireDefault(_window); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _document = _dereq_(95); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _document2 = _interopRequireDefault(_document); -var _textTrackButtonJs = _dereq_('./text-track-button.js'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _componentJs = _dereq_('../../component.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _componentJs2 = _interopRequireDefault(_componentJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _captionSettingsMenuItemJs = _dereq_('./caption-settings-menu-item.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file text-track-menu-item.js + */ -var _captionSettingsMenuItemJs2 = _interopRequireDefault(_captionSettingsMenuItemJs); /** - * The button component for toggling and selecting captions + * The specific menu item type for selecting a language within a text track kind * - * @param {Object} player Player object - * @param {Object=} options Object of option names and values - * @param {Function=} ready Ready callback function - * @extends TextTrackButton - * @class CaptionsButton + * @param {Player|Object} player + * @param {Object=} options + * @extends MenuItem + * @class TextTrackMenuItem */ +var TextTrackMenuItem = function (_MenuItem) { + _inherits(TextTrackMenuItem, _MenuItem); -var CaptionsButton = (function (_TextTrackButton) { - _inherits(CaptionsButton, _TextTrackButton); + function TextTrackMenuItem(player, options) { + _classCallCheck(this, TextTrackMenuItem); - function CaptionsButton(player, options, ready) { - _classCallCheck(this, CaptionsButton); + var track = options.track; + var tracks = player.textTracks(); + + // Modify options for parent MenuItem class's init. + options.label = track.label || track.language || 'Unknown'; + options.selected = track['default'] || track.mode === 'showing'; + + var _this = _possibleConstructorReturn(this, _MenuItem.call(this, player, options)); + + _this.track = track; + + if (tracks) { + (function () { + var changeHandler = Fn.bind(_this, _this.handleTracksChange); + + tracks.addEventListener('change', changeHandler); + _this.on('dispose', function () { + tracks.removeEventListener('change', changeHandler); + }); + })(); + } + + // iOS7 doesn't dispatch change events to TextTrackLists when an + // associated track's mode changes. Without something like + // Object.observe() (also not present on iOS7), it's not + // possible to detect changes to the mode attribute and polyfill + // the change event. As a poor substitute, we manually dispatch + // change events whenever the controls modify the mode. + if (tracks && tracks.onchange === undefined) { + (function () { + var event = void 0; + + _this.on(['tap', 'click'], function () { + if (_typeof(_window2['default'].Event) !== 'object') { + // Android 2.3 throws an Illegal Constructor error for window.Event + try { + event = new _window2['default'].Event('change'); + } catch (err) { + // continue regardless of error + } + } + + if (!event) { + event = _document2['default'].createEvent('Event'); + event.initEvent('change', true, true); + } - _TextTrackButton.call(this, player, options, ready); - this.el_.setAttribute('aria-label', 'Captions Menu'); + tracks.dispatchEvent(event); + }); + })(); + } + return _this; } /** - * Allow sub components to stack CSS class names + * Handle click on text track * - * @return {String} The constructed class name - * @method buildCSSClass + * @method handleClick */ - CaptionsButton.prototype.buildCSSClass = function buildCSSClass() { - return 'vjs-captions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this); - }; - /** - * Update caption menu items - * - * @method update - */ + TextTrackMenuItem.prototype.handleClick = function handleClick(event) { + var kind = this.track.kind; + var tracks = this.player_.textTracks(); - CaptionsButton.prototype.update = function update() { - var threshold = 2; - _TextTrackButton.prototype.update.call(this); + _MenuItem.prototype.handleClick.call(this, event); - // if native, then threshold is 1 because no settings button - if (this.player().tech_ && this.player().tech_['featuresNativeTextTracks']) { - threshold = 1; + if (!tracks) { + return; } - if (this.items && this.items.length > threshold) { - this.show(); - } else { - this.hide(); + for (var i = 0; i < tracks.length; i++) { + var track = tracks[i]; + + if (track.kind !== kind) { + continue; + } + + if (track === this.track) { + track.mode = 'showing'; + } else { + track.mode = 'disabled'; + } } }; /** - * Create caption menu items + * Handle text track change * - * @return {Array} Array of menu items - * @method createItems + * @method handleTracksChange */ - CaptionsButton.prototype.createItems = function createItems() { - var items = []; - - if (!(this.player().tech_ && this.player().tech_['featuresNativeTextTracks'])) { - items.push(new _captionSettingsMenuItemJs2['default'](this.player_, { 'kind': this.kind_ })); - } - return _TextTrackButton.prototype.createItems.call(this, items); + TextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) { + this.selected(this.track.mode === 'showing'); }; - return CaptionsButton; -})(_textTrackButtonJs2['default']); - -CaptionsButton.prototype.kind_ = 'captions'; -CaptionsButton.prototype.controlText_ = 'Captions'; + return TextTrackMenuItem; +}(_menuItem2['default']); -_componentJs2['default'].registerComponent('CaptionsButton', CaptionsButton); -exports['default'] = CaptionsButton; -module.exports = exports['default']; +_component2['default'].registerComponent('TextTrackMenuItem', TextTrackMenuItem); +exports['default'] = TextTrackMenuItem; -},{"../../component.js":67,"./caption-settings-menu-item.js":82,"./text-track-button.js":88}],84:[function(_dereq_,module,exports){ -/** - * @file chapters-button.js - */ +},{"48":48,"5":5,"84":84,"95":95,"96":96}],32:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _textTrackButtonJs = _dereq_('./text-track-button.js'); +var _component = _dereq_(5); -var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs); - -var _componentJs = _dereq_('../../component.js'); - -var _componentJs2 = _interopRequireDefault(_componentJs); - -var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js'); - -var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs); - -var _chaptersTrackMenuItemJs = _dereq_('./chapters-track-menu-item.js'); - -var _chaptersTrackMenuItemJs2 = _interopRequireDefault(_chaptersTrackMenuItemJs); +var _component2 = _interopRequireDefault(_component); -var _menuMenuJs = _dereq_('../../menu/menu.js'); +var _dom = _dereq_(82); -var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs); +var Dom = _interopRequireWildcard(_dom); -var _utilsDomJs = _dereq_('../../utils/dom.js'); +var _formatTime = _dereq_(85); -var Dom = _interopRequireWildcard(_utilsDomJs); +var _formatTime2 = _interopRequireDefault(_formatTime); -var _utilsFnJs = _dereq_('../../utils/fn.js'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var Fn = _interopRequireWildcard(_utilsFnJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _utilsToTitleCaseJs = _dereq_('../../utils/to-title-case.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _globalWindow = _dereq_('global/window'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file current-time-display.js + */ -var _globalWindow2 = _interopRequireDefault(_globalWindow); /** - * The button component for toggling and selecting chapters - * Chapters act much differently than other text tracks - * Cues are navigation vs. other tracks of alternative languages + * Displays the current time * - * @param {Object} player Player object - * @param {Object=} options Object of option names and values - * @param {Function=} ready Ready callback function - * @extends TextTrackButton - * @class ChaptersButton + * @param {Player|Object} player + * @param {Object=} options + * @extends Component + * @class CurrentTimeDisplay */ +var CurrentTimeDisplay = function (_Component) { + _inherits(CurrentTimeDisplay, _Component); -var ChaptersButton = (function (_TextTrackButton) { - _inherits(ChaptersButton, _TextTrackButton); + function CurrentTimeDisplay(player, options) { + _classCallCheck(this, CurrentTimeDisplay); - function ChaptersButton(player, options, ready) { - _classCallCheck(this, ChaptersButton); + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options)); - _TextTrackButton.call(this, player, options, ready); - this.el_.setAttribute('aria-label', 'Chapters Menu'); + _this.on(player, 'timeupdate', _this.updateContent); + return _this; } /** - * Allow sub components to stack CSS class names + * Create the component's DOM element * - * @return {String} The constructed class name - * @method buildCSSClass + * @return {Element} + * @method createEl */ - ChaptersButton.prototype.buildCSSClass = function buildCSSClass() { - return 'vjs-chapters-button ' + _TextTrackButton.prototype.buildCSSClass.call(this); + + CurrentTimeDisplay.prototype.createEl = function createEl() { + var el = _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-current-time vjs-time-control vjs-control' + }); + + this.contentEl_ = Dom.createEl('div', { + className: 'vjs-current-time-display', + // label the current time for screen reader users + innerHTML: 'Current Time ' + '0:00' + }, { + // tell screen readers not to automatically read the time as it changes + 'aria-live': 'off' + }); + + el.appendChild(this.contentEl_); + return el; }; /** - * Create a menu item for each text track + * Update current time display * - * @return {Array} Array of menu items - * @method createItems + * @method updateContent */ - ChaptersButton.prototype.createItems = function createItems() { - var items = []; - var tracks = this.player_.textTracks(); + CurrentTimeDisplay.prototype.updateContent = function updateContent() { + // Allows for smooth scrubbing, when player can't keep up. + var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime(); + var localizedText = this.localize('Current Time'); + var formattedTime = (0, _formatTime2['default'])(time, this.player_.duration()); - if (!tracks) { - return items; + if (formattedTime !== this.formattedTime_) { + this.formattedTime_ = formattedTime; + this.contentEl_.innerHTML = '' + localizedText + ' ' + formattedTime; } + }; - for (var i = 0; i < tracks.length; i++) { - var track = tracks[i]; - if (track['kind'] === this.kind_) { - items.push(new _textTrackMenuItemJs2['default'](this.player_, { - 'track': track - })); - } - } + return CurrentTimeDisplay; +}(_component2['default']); - return items; - }; +_component2['default'].registerComponent('CurrentTimeDisplay', CurrentTimeDisplay); +exports['default'] = CurrentTimeDisplay; - /** - * Create menu from chapter buttons - * - * @return {Menu} Menu of chapter buttons - * @method createMenu - */ +},{"5":5,"82":82,"85":85}],33:[function(_dereq_,module,exports){ +'use strict'; - ChaptersButton.prototype.createMenu = function createMenu() { - var _this = this; +exports.__esModule = true; - var tracks = this.player_.textTracks() || []; - var chaptersTrack = undefined; - var items = this.items = []; +var _component = _dereq_(5); - for (var i = 0, _length = tracks.length; i < _length; i++) { - var track = tracks[i]; +var _component2 = _interopRequireDefault(_component); - if (track['kind'] === this.kind_) { - chaptersTrack = track; +var _dom = _dereq_(82); - break; - } - } +var Dom = _interopRequireWildcard(_dom); - var menu = this.menu; - if (menu === undefined) { - menu = new _menuMenuJs2['default'](this.player_); - var title = Dom.createEl('li', { - className: 'vjs-menu-title', - innerHTML: _utilsToTitleCaseJs2['default'](this.kind_), - tabIndex: -1 - }); - menu.children_.unshift(title); - Dom.insertElFirst(title, menu.contentEl()); - } - - if (chaptersTrack && chaptersTrack.cues == null) { - chaptersTrack['mode'] = 'hidden'; - - var remoteTextTrackEl = this.player_.remoteTextTrackEls().getTrackElementByTrack_(chaptersTrack); - - if (remoteTextTrackEl) { - remoteTextTrackEl.addEventListener('load', function (event) { - return _this.update(); - }); - } - } - - if (chaptersTrack && chaptersTrack.cues && chaptersTrack.cues.length > 0) { - var cues = chaptersTrack['cues'], - cue = undefined; - - for (var i = 0, l = cues.length; i < l; i++) { - cue = cues[i]; - - var mi = new _chaptersTrackMenuItemJs2['default'](this.player_, { - 'track': chaptersTrack, - 'cue': cue - }); - - items.push(mi); - - menu.addChild(mi); - } - - this.addChild(menu); - } - - if (this.items.length > 0) { - this.show(); - } - - return menu; - }; - - return ChaptersButton; -})(_textTrackButtonJs2['default']); +var _formatTime = _dereq_(85); -ChaptersButton.prototype.kind_ = 'chapters'; -ChaptersButton.prototype.controlText_ = 'Chapters'; - -_componentJs2['default'].registerComponent('ChaptersButton', ChaptersButton); -exports['default'] = ChaptersButton; -module.exports = exports['default']; - -},{"../../component.js":67,"../../menu/menu.js":106,"../../utils/dom.js":132,"../../utils/fn.js":134,"../../utils/to-title-case.js":141,"./chapters-track-menu-item.js":85,"./text-track-button.js":88,"./text-track-menu-item.js":89,"global/window":2}],85:[function(_dereq_,module,exports){ -/** - * @file chapters-track-menu-item.js - */ -'use strict'; - -exports.__esModule = true; +var _formatTime2 = _interopRequireDefault(_formatTime); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _menuMenuItemJs = _dereq_('../../menu/menu-item.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _componentJs = _dereq_('../../component.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file duration-display.js + */ -var _componentJs2 = _interopRequireDefault(_componentJs); - -var _utilsFnJs = _dereq_('../../utils/fn.js'); - -var Fn = _interopRequireWildcard(_utilsFnJs); /** - * The chapter track menu item + * Displays the duration * * @param {Player|Object} player * @param {Object=} options - * @extends MenuItem - * @class ChaptersTrackMenuItem + * @extends Component + * @class DurationDisplay */ +var DurationDisplay = function (_Component) { + _inherits(DurationDisplay, _Component); -var ChaptersTrackMenuItem = (function (_MenuItem) { - _inherits(ChaptersTrackMenuItem, _MenuItem); - - function ChaptersTrackMenuItem(player, options) { - _classCallCheck(this, ChaptersTrackMenuItem); + function DurationDisplay(player, options) { + _classCallCheck(this, DurationDisplay); - var track = options['track']; - var cue = options['cue']; - var currentTime = player.currentTime(); + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options)); - // Modify options for parent MenuItem class's init. - options['label'] = cue.text; - options['selected'] = cue['startTime'] <= currentTime && currentTime < cue['endTime']; - _MenuItem.call(this, player, options); + _this.on(player, 'durationchange', _this.updateContent); - this.track = track; - this.cue = cue; - track.addEventListener('cuechange', Fn.bind(this, this.update)); + // Also listen for timeupdate and loadedmetadata because removing those + // listeners could have broken dependent applications/libraries. These + // can likely be removed for 6.0. + _this.on(player, 'timeupdate', _this.updateContent); + _this.on(player, 'loadedmetadata', _this.updateContent); + return _this; } /** - * Handle click on menu item + * Create the component's DOM element * - * @method handleClick + * @return {Element} + * @method createEl */ - ChaptersTrackMenuItem.prototype.handleClick = function handleClick() { - _MenuItem.prototype.handleClick.call(this); - this.player_.currentTime(this.cue.startTime); - this.update(this.cue.startTime); + + DurationDisplay.prototype.createEl = function createEl() { + var el = _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-duration vjs-time-control vjs-control' + }); + + this.contentEl_ = Dom.createEl('div', { + className: 'vjs-duration-display', + // label the duration time for screen reader users + innerHTML: '' + this.localize('Duration Time') + ' 0:00' + }, { + // tell screen readers not to automatically read the time as it changes + 'aria-live': 'off' + }); + + el.appendChild(this.contentEl_); + return el; }; /** - * Update chapter menu item + * Update duration time display * - * @method update + * @method updateContent */ - ChaptersTrackMenuItem.prototype.update = function update() { - var cue = this.cue; - var currentTime = this.player_.currentTime(); - // vjs.log(currentTime, cue.startTime); - this.selected(cue['startTime'] <= currentTime && currentTime < cue['endTime']); + DurationDisplay.prototype.updateContent = function updateContent() { + var duration = this.player_.duration(); + + if (duration && this.duration_ !== duration) { + this.duration_ = duration; + var localizedText = this.localize('Duration Time'); + var formattedTime = (0, _formatTime2['default'])(duration); + + // label the duration time for screen reader users + this.contentEl_.innerHTML = '' + localizedText + ' ' + formattedTime; + } }; - return ChaptersTrackMenuItem; -})(_menuMenuItemJs2['default']); + return DurationDisplay; +}(_component2['default']); -_componentJs2['default'].registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem); -exports['default'] = ChaptersTrackMenuItem; -module.exports = exports['default']; +_component2['default'].registerComponent('DurationDisplay', DurationDisplay); +exports['default'] = DurationDisplay; -},{"../../component.js":67,"../../menu/menu-item.js":105,"../../utils/fn.js":134}],86:[function(_dereq_,module,exports){ -/** - * @file off-text-track-menu-item.js - */ +},{"5":5,"82":82,"85":85}],34:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); + +var _dom = _dereq_(82); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var Dom = _interopRequireWildcard(_dom); + +var _formatTime = _dereq_(85); + +var _formatTime2 = _interopRequireDefault(_formatTime); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _componentJs = _dereq_('../../component.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file remaining-time-display.js + */ -var _componentJs2 = _interopRequireDefault(_componentJs); /** - * A special menu item for turning of a specific type of text track + * Displays the time left in the video * * @param {Player|Object} player * @param {Object=} options - * @extends TextTrackMenuItem - * @class OffTextTrackMenuItem + * @extends Component + * @class RemainingTimeDisplay */ +var RemainingTimeDisplay = function (_Component) { + _inherits(RemainingTimeDisplay, _Component); -var OffTextTrackMenuItem = (function (_TextTrackMenuItem) { - _inherits(OffTextTrackMenuItem, _TextTrackMenuItem); + function RemainingTimeDisplay(player, options) { + _classCallCheck(this, RemainingTimeDisplay); - function OffTextTrackMenuItem(player, options) { - _classCallCheck(this, OffTextTrackMenuItem); + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options)); - // Create pseudo track info - // Requires options['kind'] - options['track'] = { - 'kind': options['kind'], - 'player': player, - 'label': options['kind'] + ' off', - 'default': false, - 'mode': 'disabled' - }; + _this.on(player, 'timeupdate', _this.updateContent); + _this.on(player, 'durationchange', _this.updateContent); + return _this; + } - // MenuItem is selectable - options['selectable'] = true; + /** + * Create the component's DOM element + * + * @return {Element} + * @method createEl + */ - _TextTrackMenuItem.call(this, player, options); - this.selected(true); - } + + RemainingTimeDisplay.prototype.createEl = function createEl() { + var el = _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-remaining-time vjs-time-control vjs-control' + }); + + this.contentEl_ = Dom.createEl('div', { + className: 'vjs-remaining-time-display', + // label the remaining time for screen reader users + innerHTML: '' + this.localize('Remaining Time') + ' -0:00' + }, { + // tell screen readers not to automatically read the time as it changes + 'aria-live': 'off' + }); + + el.appendChild(this.contentEl_); + return el; + }; /** - * Handle text track change + * Update remaining time display * - * @param {Object} event Event object - * @method handleTracksChange + * @method updateContent */ - OffTextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) { - var tracks = this.player().textTracks(); - var selected = true; - for (var i = 0, l = tracks.length; i < l; i++) { - var track = tracks[i]; - if (track['kind'] === this.track['kind'] && track['mode'] === 'showing') { - selected = false; - break; + RemainingTimeDisplay.prototype.updateContent = function updateContent() { + if (this.player_.duration()) { + var localizedText = this.localize('Remaining Time'); + var formattedTime = (0, _formatTime2['default'])(this.player_.remainingTime()); + + if (formattedTime !== this.formattedTime_) { + this.formattedTime_ = formattedTime; + this.contentEl_.innerHTML = '' + localizedText + ' -' + formattedTime; } } - this.selected(selected); + // Allows for smooth scrubbing, when player can't keep up. + // var time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime(); + // this.contentEl_.innerHTML = vjs.formatTime(time, this.player_.duration()); }; - return OffTextTrackMenuItem; -})(_textTrackMenuItemJs2['default']); + return RemainingTimeDisplay; +}(_component2['default']); -_componentJs2['default'].registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem); -exports['default'] = OffTextTrackMenuItem; -module.exports = exports['default']; +_component2['default'].registerComponent('RemainingTimeDisplay', RemainingTimeDisplay); +exports['default'] = RemainingTimeDisplay; -},{"../../component.js":67,"./text-track-menu-item.js":89}],87:[function(_dereq_,module,exports){ -/** - * @file subtitles-button.js - */ +},{"5":5,"82":82,"85":85}],35:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _component = _dereq_(5); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _component2 = _interopRequireDefault(_component); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _textTrackButtonJs = _dereq_('./text-track-button.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _componentJs = _dereq_('../../component.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file time-divider.js + */ -var _componentJs2 = _interopRequireDefault(_componentJs); /** - * The button component for toggling and selecting subtitles + * The separator between the current time and duration. + * Can be hidden if it's not needed in the design. * - * @param {Object} player Player object - * @param {Object=} options Object of option names and values - * @param {Function=} ready Ready callback function - * @extends TextTrackButton - * @class SubtitlesButton + * @param {Player|Object} player + * @param {Object=} options + * @extends Component + * @class TimeDivider */ +var TimeDivider = function (_Component) { + _inherits(TimeDivider, _Component); -var SubtitlesButton = (function (_TextTrackButton) { - _inherits(SubtitlesButton, _TextTrackButton); - - function SubtitlesButton(player, options, ready) { - _classCallCheck(this, SubtitlesButton); + function TimeDivider() { + _classCallCheck(this, TimeDivider); - _TextTrackButton.call(this, player, options, ready); - this.el_.setAttribute('aria-label', 'Subtitles Menu'); + return _possibleConstructorReturn(this, _Component.apply(this, arguments)); } /** - * Allow sub components to stack CSS class names + * Create the component's DOM element * - * @return {String} The constructed class name - * @method buildCSSClass + * @return {Element} + * @method createEl */ - - SubtitlesButton.prototype.buildCSSClass = function buildCSSClass() { - return 'vjs-subtitles-button ' + _TextTrackButton.prototype.buildCSSClass.call(this); + TimeDivider.prototype.createEl = function createEl() { + return _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-time-control vjs-time-divider', + innerHTML: '
/
' + }); }; - return SubtitlesButton; -})(_textTrackButtonJs2['default']); - -SubtitlesButton.prototype.kind_ = 'subtitles'; -SubtitlesButton.prototype.controlText_ = 'Subtitles'; + return TimeDivider; +}(_component2['default']); -_componentJs2['default'].registerComponent('SubtitlesButton', SubtitlesButton); -exports['default'] = SubtitlesButton; -module.exports = exports['default']; +_component2['default'].registerComponent('TimeDivider', TimeDivider); +exports['default'] = TimeDivider; -},{"../../component.js":67,"./text-track-button.js":88}],88:[function(_dereq_,module,exports){ -/** - * @file text-track-button.js - */ +},{"5":5}],36:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _menuButton = _dereq_(47); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _menuButton2 = _interopRequireDefault(_menuButton); -var _menuMenuButtonJs = _dereq_('../../menu/menu-button.js'); +var _component = _dereq_(5); -var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs); +var _component2 = _interopRequireDefault(_component); -var _componentJs = _dereq_('../../component.js'); +var _fn = _dereq_(84); -var _componentJs2 = _interopRequireDefault(_componentJs); +var Fn = _interopRequireWildcard(_fn); -var _utilsFnJs = _dereq_('../../utils/fn.js'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var Fn = _interopRequireWildcard(_utilsFnJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _offTextTrackMenuItemJs = _dereq_('./off-text-track-menu-item.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file track-button.js + */ -var _offTextTrackMenuItemJs2 = _interopRequireDefault(_offTextTrackMenuItemJs); /** * The base class for buttons that toggle specific text track types (e.g. subtitles) @@ -6757,270 +5565,254 @@ var _offTextTrackMenuItemJs2 = _interopRequireDefault(_offTextTrackMenuItemJs); * @param {Player|Object} player * @param {Object=} options * @extends MenuButton - * @class TextTrackButton + * @class TrackButton */ +var TrackButton = function (_MenuButton) { + _inherits(TrackButton, _MenuButton); -var TextTrackButton = (function (_MenuButton) { - _inherits(TextTrackButton, _MenuButton); - - function TextTrackButton(player, options) { - _classCallCheck(this, TextTrackButton); + function TrackButton(player, options) { + _classCallCheck(this, TrackButton); - _MenuButton.call(this, player, options); + var tracks = options.tracks; - var tracks = this.player_.textTracks(); + var _this = _possibleConstructorReturn(this, _MenuButton.call(this, player, options)); - if (this.items.length <= 1) { - this.hide(); + if (_this.items.length <= 1) { + _this.hide(); } if (!tracks) { - return; + return _possibleConstructorReturn(_this); } - var updateHandler = Fn.bind(this, this.update); + var updateHandler = Fn.bind(_this, _this.update); + tracks.addEventListener('removetrack', updateHandler); tracks.addEventListener('addtrack', updateHandler); - this.player_.on('dispose', function () { + _this.player_.on('dispose', function () { tracks.removeEventListener('removetrack', updateHandler); tracks.removeEventListener('addtrack', updateHandler); }); + return _this; } - // Create a menu item for each text track + return TrackButton; +}(_menuButton2['default']); - TextTrackButton.prototype.createItems = function createItems() { - var items = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; +_component2['default'].registerComponent('TrackButton', TrackButton); +exports['default'] = TrackButton; - // Add an OFF menu item to turn all tracks off - items.push(new _offTextTrackMenuItemJs2['default'](this.player_, { 'kind': this.kind_ })); - - var tracks = this.player_.textTracks(); +},{"47":47,"5":5,"84":84}],37:[function(_dereq_,module,exports){ +'use strict'; - if (!tracks) { - return items; - } +exports.__esModule = true; - for (var i = 0; i < tracks.length; i++) { - var track = tracks[i]; +var _slider = _dereq_(57); - // only add tracks that are of the appropriate kind and have a label - if (track['kind'] === this.kind_) { - items.push(new _textTrackMenuItemJs2['default'](this.player_, { - // MenuItem is selectable - 'selectable': true, - 'track': track - })); - } - } +var _slider2 = _interopRequireDefault(_slider); - return items; - }; +var _component = _dereq_(5); - return TextTrackButton; -})(_menuMenuButtonJs2['default']); +var _component2 = _interopRequireDefault(_component); -_componentJs2['default'].registerComponent('TextTrackButton', TextTrackButton); -exports['default'] = TextTrackButton; -module.exports = exports['default']; +var _fn = _dereq_(84); -},{"../../component.js":67,"../../menu/menu-button.js":104,"../../utils/fn.js":134,"./off-text-track-menu-item.js":86,"./text-track-menu-item.js":89}],89:[function(_dereq_,module,exports){ -/** - * @file text-track-menu-item.js - */ -'use strict'; +var Fn = _interopRequireWildcard(_fn); -exports.__esModule = true; +_dereq_(39); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _menuMenuItemJs = _dereq_('../../menu/menu-item.js'); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file volume-bar.js + */ -var _componentJs = _dereq_('../../component.js'); -var _componentJs2 = _interopRequireDefault(_componentJs); - -var _utilsFnJs = _dereq_('../../utils/fn.js'); - -var Fn = _interopRequireWildcard(_utilsFnJs); - -var _globalWindow = _dereq_('global/window'); - -var _globalWindow2 = _interopRequireDefault(_globalWindow); - -var _globalDocument = _dereq_('global/document'); +// Required children -var _globalDocument2 = _interopRequireDefault(_globalDocument); /** - * The specific menu item type for selecting a language within a text track kind + * The bar that contains the volume level and can be clicked on to adjust the level * * @param {Player|Object} player * @param {Object=} options - * @extends MenuItem - * @class TextTrackMenuItem + * @extends Slider + * @class VolumeBar */ +var VolumeBar = function (_Slider) { + _inherits(VolumeBar, _Slider); -var TextTrackMenuItem = (function (_MenuItem) { - _inherits(TextTrackMenuItem, _MenuItem); + function VolumeBar(player, options) { + _classCallCheck(this, VolumeBar); - function TextTrackMenuItem(player, options) { - var _this = this; + var _this = _possibleConstructorReturn(this, _Slider.call(this, player, options)); - _classCallCheck(this, TextTrackMenuItem); + _this.on(player, 'volumechange', _this.updateARIAAttributes); + player.ready(Fn.bind(_this, _this.updateARIAAttributes)); + return _this; + } - var track = options['track']; - var tracks = player.textTracks(); + /** + * Create the component's DOM element + * + * @return {Element} + * @method createEl + */ - // Modify options for parent MenuItem class's init. - options['label'] = track['label'] || track['language'] || 'Unknown'; - options['selected'] = track['default'] || track['mode'] === 'showing'; - _MenuItem.call(this, player, options); + VolumeBar.prototype.createEl = function createEl() { + return _Slider.prototype.createEl.call(this, 'div', { + className: 'vjs-volume-bar vjs-slider-bar' + }, { + 'aria-label': 'volume level' + }); + }; + + /** + * Handle mouse move on volume bar + * + * @method handleMouseMove + */ - this.track = track; - if (tracks) { - (function () { - var changeHandler = Fn.bind(_this, _this.handleTracksChange); + VolumeBar.prototype.handleMouseMove = function handleMouseMove(event) { + this.checkMuted(); + this.player_.volume(this.calculateDistance(event)); + }; - tracks.addEventListener('change', changeHandler); - _this.on('dispose', function () { - tracks.removeEventListener('change', changeHandler); - }); - })(); + VolumeBar.prototype.checkMuted = function checkMuted() { + if (this.player_.muted()) { + this.player_.muted(false); } + }; - // iOS7 doesn't dispatch change events to TextTrackLists when an - // associated track's mode changes. Without something like - // Object.observe() (also not present on iOS7), it's not - // possible to detect changes to the mode attribute and polyfill - // the change event. As a poor substitute, we manually dispatch - // change events whenever the controls modify the mode. - if (tracks && tracks.onchange === undefined) { - (function () { - var event = undefined; - - _this.on(['tap', 'click'], function () { - if (typeof _globalWindow2['default'].Event !== 'object') { - // Android 2.3 throws an Illegal Constructor error for window.Event - try { - event = new _globalWindow2['default'].Event('change'); - } catch (err) {} - } + /** + * Get percent of volume level + * + * @retun {Number} Volume level percent + * @method getPercent + */ - if (!event) { - event = _globalDocument2['default'].createEvent('Event'); - event.initEvent('change', true, true); - } - tracks.dispatchEvent(event); - }); - })(); + VolumeBar.prototype.getPercent = function getPercent() { + if (this.player_.muted()) { + return 0; } - } + return this.player_.volume(); + }; /** - * Handle click on text track + * Increase volume level for keyboard users * - * @method handleClick + * @method stepForward */ - TextTrackMenuItem.prototype.handleClick = function handleClick(event) { - var kind = this.track['kind']; - var tracks = this.player_.textTracks(); - - _MenuItem.prototype.handleClick.call(this, event); - if (!tracks) return; + VolumeBar.prototype.stepForward = function stepForward() { + this.checkMuted(); + this.player_.volume(this.player_.volume() + 0.1); + }; - for (var i = 0; i < tracks.length; i++) { - var track = tracks[i]; + /** + * Decrease volume level for keyboard users + * + * @method stepBack + */ - if (track['kind'] !== kind) { - continue; - } - if (track === this.track) { - track['mode'] = 'showing'; - } else { - track['mode'] = 'disabled'; - } - } + VolumeBar.prototype.stepBack = function stepBack() { + this.checkMuted(); + this.player_.volume(this.player_.volume() - 0.1); }; /** - * Handle text track change + * Update ARIA accessibility attributes * - * @method handleTracksChange + * @method updateARIAAttributes */ - TextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) { - this.selected(this.track['mode'] === 'showing'); + + VolumeBar.prototype.updateARIAAttributes = function updateARIAAttributes() { + // Current value of volume bar as a percentage + var volume = (this.player_.volume() * 100).toFixed(2); + + this.el_.setAttribute('aria-valuenow', volume); + this.el_.setAttribute('aria-valuetext', volume + '%'); }; - return TextTrackMenuItem; -})(_menuMenuItemJs2['default']); + return VolumeBar; +}(_slider2['default']); -_componentJs2['default'].registerComponent('TextTrackMenuItem', TextTrackMenuItem); -exports['default'] = TextTrackMenuItem; -module.exports = exports['default']; +VolumeBar.prototype.options_ = { + children: ['volumeLevel'], + barName: 'volumeLevel' +}; -},{"../../component.js":67,"../../menu/menu-item.js":105,"../../utils/fn.js":134,"global/document":1,"global/window":2}],90:[function(_dereq_,module,exports){ -/** - * @file current-time-display.js - */ +VolumeBar.prototype.playerEvent = 'volumechange'; + +_component2['default'].registerComponent('VolumeBar', VolumeBar); +exports['default'] = VolumeBar; + +},{"39":39,"5":5,"57":57,"84":84}],38:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _component = _dereq_(5); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _component2 = _interopRequireDefault(_component); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +_dereq_(37); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _componentJs = _dereq_('../../component.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _componentJs2 = _interopRequireDefault(_componentJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _utilsDomJs = _dereq_('../../utils/dom.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file volume-control.js + */ -var Dom = _interopRequireWildcard(_utilsDomJs); -var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js'); +// Required children -var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs); /** - * Displays the current time + * The component for controlling the volume level * * @param {Player|Object} player * @param {Object=} options * @extends Component - * @class CurrentTimeDisplay + * @class VolumeControl */ +var VolumeControl = function (_Component) { + _inherits(VolumeControl, _Component); -var CurrentTimeDisplay = (function (_Component) { - _inherits(CurrentTimeDisplay, _Component); - - function CurrentTimeDisplay(player, options) { - _classCallCheck(this, CurrentTimeDisplay); + function VolumeControl(player, options) { + _classCallCheck(this, VolumeControl); - _Component.call(this, player, options); + // hide volume controls when they're not supported by the current tech + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options)); - this.on(player, 'timeupdate', this.updateContent); + if (player.tech_ && player.tech_.featuresVolumeControl === false) { + _this.addClass('vjs-hidden'); + } + _this.on(player, 'loadstart', function () { + if (player.tech_.featuresVolumeControl === false) { + this.addClass('vjs-hidden'); + } else { + this.removeClass('vjs-hidden'); + } + }); + return _this; } /** @@ -7030,100 +5822,58 @@ var CurrentTimeDisplay = (function (_Component) { * @method createEl */ - CurrentTimeDisplay.prototype.createEl = function createEl() { - var el = _Component.prototype.createEl.call(this, 'div', { - className: 'vjs-current-time vjs-time-control vjs-control' - }); - this.contentEl_ = Dom.createEl('div', { - className: 'vjs-current-time-display', - // label the current time for screen reader users - innerHTML: 'Current Time ' + '0:00' - }, { - // tell screen readers not to automatically read the time as it changes - 'aria-live': 'off' + VolumeControl.prototype.createEl = function createEl() { + return _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-volume-control vjs-control' }); - - el.appendChild(this.contentEl_); - return el; }; - /** - * Update current time display - * - * @method updateContent - */ - - CurrentTimeDisplay.prototype.updateContent = function updateContent() { - // Allows for smooth scrubbing, when player can't keep up. - var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime(); - var localizedText = this.localize('Current Time'); - var formattedTime = _utilsFormatTimeJs2['default'](time, this.player_.duration()); - if (formattedTime !== this.formattedTime_) { - this.formattedTime_ = formattedTime; - this.contentEl_.innerHTML = '' + localizedText + ' ' + formattedTime; - } - }; + return VolumeControl; +}(_component2['default']); - return CurrentTimeDisplay; -})(_componentJs2['default']); +VolumeControl.prototype.options_ = { + children: ['volumeBar'] +}; -_componentJs2['default'].registerComponent('CurrentTimeDisplay', CurrentTimeDisplay); -exports['default'] = CurrentTimeDisplay; -module.exports = exports['default']; +_component2['default'].registerComponent('VolumeControl', VolumeControl); +exports['default'] = VolumeControl; -},{"../../component.js":67,"../../utils/dom.js":132,"../../utils/format-time.js":135}],91:[function(_dereq_,module,exports){ -/** - * @file duration-display.js - */ +},{"37":37,"5":5}],39:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _component = _dereq_(5); -var _componentJs = _dereq_('../../component.js'); +var _component2 = _interopRequireDefault(_component); -var _componentJs2 = _interopRequireDefault(_componentJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _utilsDomJs = _dereq_('../../utils/dom.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var Dom = _interopRequireWildcard(_utilsDomJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file volume-level.js + */ -var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs); /** - * Displays the duration + * Shows volume level * * @param {Player|Object} player * @param {Object=} options * @extends Component - * @class DurationDisplay + * @class VolumeLevel */ +var VolumeLevel = function (_Component) { + _inherits(VolumeLevel, _Component); -var DurationDisplay = (function (_Component) { - _inherits(DurationDisplay, _Component); - - function DurationDisplay(player, options) { - _classCallCheck(this, DurationDisplay); - - _Component.call(this, player, options); + function VolumeLevel() { + _classCallCheck(this, VolumeLevel); - // this might need to be changed to 'durationchange' instead of 'timeupdate' eventually, - // however the durationchange event fires before this.player_.duration() is set, - // so the value cannot be written out using this method. - // Once the order of durationchange and this.player_.duration() being set is figured out, - // this can be updated. - this.on(player, 'timeupdate', this.updateContent); - this.on(player, 'loadedmetadata', this.updateContent); + return _possibleConstructorReturn(this, _Component.apply(this, arguments)); } /** @@ -7132,1768 +5882,1377 @@ var DurationDisplay = (function (_Component) { * @return {Element} * @method createEl */ - - DurationDisplay.prototype.createEl = function createEl() { - var el = _Component.prototype.createEl.call(this, 'div', { - className: 'vjs-duration vjs-time-control vjs-control' + VolumeLevel.prototype.createEl = function createEl() { + return _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-volume-level', + innerHTML: '' }); + }; - this.contentEl_ = Dom.createEl('div', { - className: 'vjs-duration-display', - // label the duration time for screen reader users - innerHTML: '' + this.localize('Duration Time') + ' 0:00' - }, { - // tell screen readers not to automatically read the time as it changes - 'aria-live': 'off' - }); + return VolumeLevel; +}(_component2['default']); - el.appendChild(this.contentEl_); - return el; - }; +_component2['default'].registerComponent('VolumeLevel', VolumeLevel); +exports['default'] = VolumeLevel; - /** - * Update duration time display - * - * @method updateContent - */ +},{"5":5}],40:[function(_dereq_,module,exports){ +'use strict'; - DurationDisplay.prototype.updateContent = function updateContent() { - var duration = this.player_.duration(); - if (duration && this.duration_ !== duration) { - this.duration_ = duration; - var localizedText = this.localize('Duration Time'); - var formattedTime = _utilsFormatTimeJs2['default'](duration); - this.contentEl_.innerHTML = '' + localizedText + ' ' + formattedTime; // label the duration time for screen reader users - } - }; +exports.__esModule = true; - return DurationDisplay; -})(_componentJs2['default']); +var _fn = _dereq_(84); -_componentJs2['default'].registerComponent('DurationDisplay', DurationDisplay); -exports['default'] = DurationDisplay; -module.exports = exports['default']; +var Fn = _interopRequireWildcard(_fn); -},{"../../component.js":67,"../../utils/dom.js":132,"../../utils/format-time.js":135}],92:[function(_dereq_,module,exports){ -/** - * @file remaining-time-display.js - */ -'use strict'; +var _component = _dereq_(5); -exports.__esModule = true; +var _component2 = _interopRequireDefault(_component); -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _popup = _dereq_(54); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _popup2 = _interopRequireDefault(_popup); + +var _popupButton = _dereq_(53); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _popupButton2 = _interopRequireDefault(_popupButton); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _muteToggle = _dereq_(11); -var _componentJs = _dereq_('../../component.js'); +var _muteToggle2 = _interopRequireDefault(_muteToggle); + +var _volumeBar = _dereq_(37); + +var _volumeBar2 = _interopRequireDefault(_volumeBar); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _componentJs2 = _interopRequireDefault(_componentJs); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var _utilsDomJs = _dereq_('../../utils/dom.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var Dom = _interopRequireWildcard(_utilsDomJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file volume-menu-button.js + */ -var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs); /** - * Displays the time left in the video + * Button for volume popup * * @param {Player|Object} player * @param {Object=} options - * @extends Component - * @class RemainingTimeDisplay + * @extends PopupButton + * @class VolumeMenuButton */ +var VolumeMenuButton = function (_PopupButton) { + _inherits(VolumeMenuButton, _PopupButton); -var RemainingTimeDisplay = (function (_Component) { - _inherits(RemainingTimeDisplay, _Component); + function VolumeMenuButton(player) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - function RemainingTimeDisplay(player, options) { - _classCallCheck(this, RemainingTimeDisplay); + _classCallCheck(this, VolumeMenuButton); - _Component.call(this, player, options); + // Default to inline + if (options.inline === undefined) { + options.inline = true; + } - this.on(player, 'timeupdate', this.updateContent); - } + // If the vertical option isn't passed at all, default to true. + if (options.vertical === undefined) { + // If an inline volumeMenuButton is used, we should default to using + // a horizontal slider for obvious reasons. + if (options.inline) { + options.vertical = false; + } else { + options.vertical = true; + } + } - /** - * Create the component's DOM element - * - * @return {Element} - * @method createEl - */ + // The vertical option needs to be set on the volumeBar as well, + // since that will need to be passed along to the VolumeBar constructor + options.volumeBar = options.volumeBar || {}; + options.volumeBar.vertical = !!options.vertical; - RemainingTimeDisplay.prototype.createEl = function createEl() { - var el = _Component.prototype.createEl.call(this, 'div', { - className: 'vjs-remaining-time vjs-time-control vjs-control' + // Same listeners as MuteToggle + var _this = _possibleConstructorReturn(this, _PopupButton.call(this, player, options)); + + _this.on(player, 'volumechange', _this.volumeUpdate); + _this.on(player, 'loadstart', _this.volumeUpdate); + + // hide mute toggle if the current tech doesn't support volume control + function updateVisibility() { + if (player.tech_ && player.tech_.featuresVolumeControl === false) { + this.addClass('vjs-hidden'); + } else { + this.removeClass('vjs-hidden'); + } + } + + updateVisibility.call(_this); + _this.on(player, 'loadstart', updateVisibility); + + _this.on(_this.volumeBar, ['slideractive', 'focus'], function () { + this.addClass('vjs-slider-active'); }); - this.contentEl_ = Dom.createEl('div', { - className: 'vjs-remaining-time-display', - // label the remaining time for screen reader users - innerHTML: '' + this.localize('Remaining Time') + ' -0:00' - }, { - // tell screen readers not to automatically read the time as it changes - 'aria-live': 'off' + _this.on(_this.volumeBar, ['sliderinactive', 'blur'], function () { + this.removeClass('vjs-slider-active'); }); - el.appendChild(this.contentEl_); - return el; - }; + _this.on(_this.volumeBar, ['focus'], function () { + this.addClass('vjs-lock-showing'); + }); + + _this.on(_this.volumeBar, ['blur'], function () { + this.removeClass('vjs-lock-showing'); + }); + return _this; + } /** - * Update remaining time display + * Allow sub components to stack CSS class names * - * @method updateContent + * @return {String} The constructed class name + * @method buildCSSClass */ - RemainingTimeDisplay.prototype.updateContent = function updateContent() { - if (this.player_.duration()) { - var localizedText = this.localize('Remaining Time'); - var formattedTime = _utilsFormatTimeJs2['default'](this.player_.remainingTime()); - if (formattedTime !== this.formattedTime_) { - this.formattedTime_ = formattedTime; - this.contentEl_.innerHTML = '' + localizedText + ' -' + formattedTime; - } + + VolumeMenuButton.prototype.buildCSSClass = function buildCSSClass() { + var orientationClass = ''; + + if (this.options_.vertical) { + orientationClass = 'vjs-volume-menu-button-vertical'; + } else { + orientationClass = 'vjs-volume-menu-button-horizontal'; } - // Allows for smooth scrubbing, when player can't keep up. - // var time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime(); - // this.contentEl_.innerHTML = vjs.formatTime(time, this.player_.duration()); + return 'vjs-volume-menu-button ' + _PopupButton.prototype.buildCSSClass.call(this) + ' ' + orientationClass; }; - return RemainingTimeDisplay; -})(_componentJs2['default']); - -_componentJs2['default'].registerComponent('RemainingTimeDisplay', RemainingTimeDisplay); -exports['default'] = RemainingTimeDisplay; -module.exports = exports['default']; + /** + * Allow sub components to stack CSS class names + * + * @return {Popup} The volume popup button + * @method createPopup + */ -},{"../../component.js":67,"../../utils/dom.js":132,"../../utils/format-time.js":135}],93:[function(_dereq_,module,exports){ -/** - * @file time-divider.js - */ -'use strict'; -exports.__esModule = true; + VolumeMenuButton.prototype.createPopup = function createPopup() { + var popup = new _popup2['default'](this.player_, { + contentElType: 'div' + }); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + var vb = new _volumeBar2['default'](this.player_, this.options_.volumeBar); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + popup.addChild(vb); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + this.menuContent = popup; + this.volumeBar = vb; -var _componentJs = _dereq_('../../component.js'); + this.attachVolumeBarEvents(); -var _componentJs2 = _interopRequireDefault(_componentJs); + return popup; + }; -/** - * The separator between the current time and duration. - * Can be hidden if it's not needed in the design. - * - * @param {Player|Object} player - * @param {Object=} options - * @extends Component - * @class TimeDivider - */ + /** + * Handle click on volume popup and calls super + * + * @method handleClick + */ -var TimeDivider = (function (_Component) { - _inherits(TimeDivider, _Component); - function TimeDivider() { - _classCallCheck(this, TimeDivider); + VolumeMenuButton.prototype.handleClick = function handleClick() { + _muteToggle2['default'].prototype.handleClick.call(this); + _PopupButton.prototype.handleClick.call(this); + }; - _Component.apply(this, arguments); - } + VolumeMenuButton.prototype.attachVolumeBarEvents = function attachVolumeBarEvents() { + this.menuContent.on(['mousedown', 'touchdown'], Fn.bind(this, this.handleMouseDown)); + }; - /** - * Create the component's DOM element - * - * @return {Element} - * @method createEl - */ + VolumeMenuButton.prototype.handleMouseDown = function handleMouseDown(event) { + this.on(['mousemove', 'touchmove'], Fn.bind(this.volumeBar, this.volumeBar.handleMouseMove)); + this.on(this.el_.ownerDocument, ['mouseup', 'touchend'], this.handleMouseUp); + }; - TimeDivider.prototype.createEl = function createEl() { - return _Component.prototype.createEl.call(this, 'div', { - className: 'vjs-time-control vjs-time-divider', - innerHTML: '
/
' - }); + VolumeMenuButton.prototype.handleMouseUp = function handleMouseUp(event) { + this.off(['mousemove', 'touchmove'], Fn.bind(this.volumeBar, this.volumeBar.handleMouseMove)); }; - return TimeDivider; -})(_componentJs2['default']); + return VolumeMenuButton; +}(_popupButton2['default']); -_componentJs2['default'].registerComponent('TimeDivider', TimeDivider); -exports['default'] = TimeDivider; -module.exports = exports['default']; +VolumeMenuButton.prototype.volumeUpdate = _muteToggle2['default'].prototype.update; +VolumeMenuButton.prototype.controlText_ = 'Mute'; -},{"../../component.js":67}],94:[function(_dereq_,module,exports){ -/** - * @file volume-bar.js - */ +_component2['default'].registerComponent('VolumeMenuButton', VolumeMenuButton); +exports['default'] = VolumeMenuButton; + +},{"11":11,"37":37,"5":5,"53":53,"54":54,"84":84}],41:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _component = _dereq_(5); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _component2 = _interopRequireDefault(_component); -var _sliderSliderJs = _dereq_('../../slider/slider.js'); +var _modalDialog = _dereq_(50); -var _sliderSliderJs2 = _interopRequireDefault(_sliderSliderJs); +var _modalDialog2 = _interopRequireDefault(_modalDialog); -var _componentJs = _dereq_('../../component.js'); +var _mergeOptions = _dereq_(88); -var _componentJs2 = _interopRequireDefault(_componentJs); +var _mergeOptions2 = _interopRequireDefault(_mergeOptions); -var _utilsFnJs = _dereq_('../../utils/fn.js'); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var Fn = _interopRequireWildcard(_utilsFnJs); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -// Required children +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _volumeLevelJs = _dereq_('./volume-level.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file error-display.js + */ -var _volumeLevelJs2 = _interopRequireDefault(_volumeLevelJs); /** - * The bar that contains the volume level and can be clicked on to adjust the level + * Display that an error has occurred making the video unplayable. * - * @param {Player|Object} player - * @param {Object=} options - * @extends Slider - * @class VolumeBar + * @extends ModalDialog + * @class ErrorDisplay */ +var ErrorDisplay = function (_ModalDialog) { + _inherits(ErrorDisplay, _ModalDialog); -var VolumeBar = (function (_Slider) { - _inherits(VolumeBar, _Slider); + /** + * Constructor for error display modal. + * + * @param {Player} player + * @param {Object} [options] + */ + function ErrorDisplay(player, options) { + _classCallCheck(this, ErrorDisplay); - function VolumeBar(player, options) { - _classCallCheck(this, VolumeBar); + var _this = _possibleConstructorReturn(this, _ModalDialog.call(this, player, options)); - _Slider.call(this, player, options); - this.on(player, 'volumechange', this.updateARIAAttributes); - player.ready(Fn.bind(this, this.updateARIAAttributes)); + _this.on(player, 'error', _this.open); + return _this; } /** - * Create the component's DOM element + * Include the old class for backward-compatibility. * - * @return {Element} - * @method createEl + * This can be removed in 6.0. + * + * @method buildCSSClass + * @deprecated + * @return {String} */ - VolumeBar.prototype.createEl = function createEl() { - return _Slider.prototype.createEl.call(this, 'div', { - className: 'vjs-volume-bar vjs-slider-bar' - }, { - 'aria-label': 'volume level' - }); + + ErrorDisplay.prototype.buildCSSClass = function buildCSSClass() { + return 'vjs-error-display ' + _ModalDialog.prototype.buildCSSClass.call(this); }; /** - * Handle mouse move on volume bar + * Generates the modal content based on the player error. * - * @method handleMouseMove + * @return {String|Null} */ - VolumeBar.prototype.handleMouseMove = function handleMouseMove(event) { - this.checkMuted(); - this.player_.volume(this.calculateDistance(event)); - }; - - VolumeBar.prototype.checkMuted = function checkMuted() { - if (this.player_.muted()) { - this.player_.muted(false); - } - }; - - /** - * Get percent of volume level - * - * @retun {Number} Volume level percent - * @method getPercent - */ - - VolumeBar.prototype.getPercent = function getPercent() { - if (this.player_.muted()) { - return 0; - } else { - return this.player_.volume(); - } - }; - - /** - * Increase volume level for keyboard users - * - * @method stepForward - */ - - VolumeBar.prototype.stepForward = function stepForward() { - this.checkMuted(); - this.player_.volume(this.player_.volume() + 0.1); - }; - - /** - * Decrease volume level for keyboard users - * - * @method stepBack - */ - VolumeBar.prototype.stepBack = function stepBack() { - this.checkMuted(); - this.player_.volume(this.player_.volume() - 0.1); - }; - - /** - * Update ARIA accessibility attributes - * - * @method updateARIAAttributes - */ + ErrorDisplay.prototype.content = function content() { + var error = this.player().error(); - VolumeBar.prototype.updateARIAAttributes = function updateARIAAttributes() { - // Current value of volume bar as a percentage - var volume = (this.player_.volume() * 100).toFixed(2); - this.el_.setAttribute('aria-valuenow', volume); - this.el_.setAttribute('aria-valuetext', volume + '%'); + return error ? this.localize(error.message) : ''; }; - return VolumeBar; -})(_sliderSliderJs2['default']); - -VolumeBar.prototype.options_ = { - children: ['volumeLevel'], - 'barName': 'volumeLevel' -}; + return ErrorDisplay; +}(_modalDialog2['default']); -VolumeBar.prototype.playerEvent = 'volumechange'; +ErrorDisplay.prototype.options_ = (0, _mergeOptions2['default'])(_modalDialog2['default'].prototype.options_, { + fillAlways: true, + temporary: false, + uncloseable: true +}); -_componentJs2['default'].registerComponent('VolumeBar', VolumeBar); -exports['default'] = VolumeBar; -module.exports = exports['default']; +_component2['default'].registerComponent('ErrorDisplay', ErrorDisplay); +exports['default'] = ErrorDisplay; -},{"../../component.js":67,"../../slider/slider.js":114,"../../utils/fn.js":134,"./volume-level.js":96}],95:[function(_dereq_,module,exports){ -/** - * @file volume-control.js - */ +},{"5":5,"50":50,"88":88}],42:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _events = _dereq_(83); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var Events = _interopRequireWildcard(_events); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var _componentJs = _dereq_('../../component.js'); +var EventTarget = function EventTarget() {}; /** + * @file event-target.js + */ -var _componentJs2 = _interopRequireDefault(_componentJs); -// Required children +EventTarget.prototype.allowedEvents_ = {}; -var _volumeBarJs = _dereq_('./volume-bar.js'); +EventTarget.prototype.on = function (type, fn) { + // Remove the addEventListener alias before calling Events.on + // so we don't get into an infinite type loop + var ael = this.addEventListener; -var _volumeBarJs2 = _interopRequireDefault(_volumeBarJs); + this.addEventListener = function () {}; + Events.on(this, type, fn); + this.addEventListener = ael; +}; -/** - * The component for controlling the volume level - * - * @param {Player|Object} player - * @param {Object=} options - * @extends Component - * @class VolumeControl - */ +EventTarget.prototype.addEventListener = EventTarget.prototype.on; -var VolumeControl = (function (_Component) { - _inherits(VolumeControl, _Component); +EventTarget.prototype.off = function (type, fn) { + Events.off(this, type, fn); +}; - function VolumeControl(player, options) { - _classCallCheck(this, VolumeControl); +EventTarget.prototype.removeEventListener = EventTarget.prototype.off; - _Component.call(this, player, options); +EventTarget.prototype.one = function (type, fn) { + // Remove the addEventListener alias before calling Events.on + // so we don't get into an infinite type loop + var ael = this.addEventListener; - // hide volume controls when they're not supported by the current tech - if (player.tech_ && player.tech_['featuresVolumeControl'] === false) { - this.addClass('vjs-hidden'); - } - this.on(player, 'loadstart', function () { - if (player.tech_['featuresVolumeControl'] === false) { - this.addClass('vjs-hidden'); - } else { - this.removeClass('vjs-hidden'); - } - }); - } + this.addEventListener = function () {}; + Events.one(this, type, fn); + this.addEventListener = ael; +}; - /** - * Create the component's DOM element - * - * @return {Element} - * @method createEl - */ +EventTarget.prototype.trigger = function (event) { + var type = event.type || event; - VolumeControl.prototype.createEl = function createEl() { - return _Component.prototype.createEl.call(this, 'div', { - className: 'vjs-volume-control vjs-control' - }); - }; + if (typeof event === 'string') { + event = { type: type }; + } + event = Events.fixEvent(event); - return VolumeControl; -})(_componentJs2['default']); + if (this.allowedEvents_[type] && this['on' + type]) { + this['on' + type](event); + } -VolumeControl.prototype.options_ = { - children: ['volumeBar'] + Events.trigger(this, event); }; -_componentJs2['default'].registerComponent('VolumeControl', VolumeControl); -exports['default'] = VolumeControl; -module.exports = exports['default']; +// The standard DOM EventTarget.dispatchEvent() is aliased to trigger() +EventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger; -},{"../../component.js":67,"./volume-bar.js":94}],96:[function(_dereq_,module,exports){ -/** - * @file volume-level.js - */ +exports['default'] = EventTarget; + +},{"83":83}],43:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _log = _dereq_(87); -var _componentJs = _dereq_('../../component.js'); +var _log2 = _interopRequireDefault(_log); -var _componentJs2 = _interopRequireDefault(_componentJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -/** - * Shows volume level +/* + * @file extend.js * - * @param {Player|Object} player - * @param {Object=} options - * @extends Component - * @class VolumeLevel + * A combination of node inherits and babel's inherits (after transpile). + * Both work the same but node adds `super_` to the subClass + * and Bable adds the superClass as __proto__. Both seem useful. */ - -var VolumeLevel = (function (_Component) { - _inherits(VolumeLevel, _Component); - - function VolumeLevel() { - _classCallCheck(this, VolumeLevel); - - _Component.apply(this, arguments); +var _inherits = function _inherits(subClass, superClass) { + if (typeof superClass !== 'function' && superClass !== null) { + throw new TypeError('Super expression must either be null or a function, not ' + (typeof superClass === 'undefined' ? 'undefined' : _typeof(superClass))); } - /** - * Create the component's DOM element - * - * @return {Element} - * @method createEl - */ - - VolumeLevel.prototype.createEl = function createEl() { - return _Component.prototype.createEl.call(this, 'div', { - className: 'vjs-volume-level', - innerHTML: '' - }); - }; - - return VolumeLevel; -})(_componentJs2['default']); + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); -_componentJs2['default'].registerComponent('VolumeLevel', VolumeLevel); -exports['default'] = VolumeLevel; -module.exports = exports['default']; + if (superClass) { + // node + subClass.super_ = superClass; + } +}; -},{"../../component.js":67}],97:[function(_dereq_,module,exports){ -/** - * @file volume-menu-button.js +/* + * Function for subclassing using the same inheritance that + * videojs uses internally + * ```js + * var Button = videojs.getComponent('Button'); + * ``` + * ```js + * var MyButton = videojs.extend(Button, { + * constructor: function(player, options) { + * Button.call(this, player, options); + * }, + * onClick: function() { + * // doSomething + * } + * }); + * ``` */ -'use strict'; - -exports.__esModule = true; - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var extendFn = function extendFn(superClass) { + var subClassMethods = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + var subClass = function subClass() { + superClass.apply(this, arguments); + }; -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + var methods = {}; -var _utilsFnJs = _dereq_('../utils/fn.js'); + if ((typeof subClassMethods === 'undefined' ? 'undefined' : _typeof(subClassMethods)) === 'object') { + if (typeof subClassMethods.init === 'function') { + _log2['default'].warn('Constructor logic via init() is deprecated; please use constructor() instead.'); + subClassMethods.constructor = subClassMethods.init; + } + if (subClassMethods.constructor !== Object.prototype.constructor) { + subClass = subClassMethods.constructor; + } + methods = subClassMethods; + } else if (typeof subClassMethods === 'function') { + subClass = subClassMethods; + } -var Fn = _interopRequireWildcard(_utilsFnJs); + _inherits(subClass, superClass); -var _componentJs = _dereq_('../component.js'); + // Extend subObj's prototype with functions and other properties from props + for (var name in methods) { + if (methods.hasOwnProperty(name)) { + subClass.prototype[name] = methods[name]; + } + } -var _componentJs2 = _interopRequireDefault(_componentJs); + return subClass; +}; -var _popupPopupJs = _dereq_('../popup/popup.js'); +exports['default'] = extendFn; -var _popupPopupJs2 = _interopRequireDefault(_popupPopupJs); +},{"87":87}],44:[function(_dereq_,module,exports){ +'use strict'; -var _popupPopupButtonJs = _dereq_('../popup/popup-button.js'); +exports.__esModule = true; -var _popupPopupButtonJs2 = _interopRequireDefault(_popupPopupButtonJs); +var _document = _dereq_(95); -var _muteToggleJs = _dereq_('./mute-toggle.js'); +var _document2 = _interopRequireDefault(_document); -var _muteToggleJs2 = _interopRequireDefault(_muteToggleJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _volumeControlVolumeBarJs = _dereq_('./volume-control/volume-bar.js'); - -var _volumeControlVolumeBarJs2 = _interopRequireDefault(_volumeControlVolumeBarJs); - -var _globalDocument = _dereq_('global/document'); - -var _globalDocument2 = _interopRequireDefault(_globalDocument); +/* + * Store the browser-specific methods for the fullscreen API + * @type {Object|undefined} + * @private + */ +var FullscreenApi = {}; +// browser API methods +// map approach from Screenful.js - https://github.com/sindresorhus/screenfull.js /** - * Button for volume popup - * - * @param {Player|Object} player - * @param {Object=} options - * @extends PopupButton - * @class VolumeMenuButton + * @file fullscreen-api.js */ +var apiMap = [ +// Spec: https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html +['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'], +// WebKit +['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'], +// Old WebKit (Safari 5.1) +['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'], +// Mozilla +['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'], +// Microsoft +['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']]; -var VolumeMenuButton = (function (_PopupButton) { - _inherits(VolumeMenuButton, _PopupButton); +var specApi = apiMap[0]; +var browserApi = void 0; - function VolumeMenuButton(player) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; +// determine the supported set of functions +for (var i = 0; i < apiMap.length; i++) { + // check for exitFullscreen function + if (apiMap[i][1] in _document2['default']) { + browserApi = apiMap[i]; + break; + } +} - _classCallCheck(this, VolumeMenuButton); +// map the browser API names to the spec API names +if (browserApi) { + for (var _i = 0; _i < browserApi.length; _i++) { + FullscreenApi[specApi[_i]] = browserApi[_i]; + } +} - // Default to inline - if (options.inline === undefined) { - options.inline = true; - } +exports['default'] = FullscreenApi; - // If the vertical option isn't passed at all, default to true. - if (options.vertical === undefined) { - // If an inline volumeMenuButton is used, we should default to using - // a horizontal slider for obvious reasons. - if (options.inline) { - options.vertical = false; - } else { - options.vertical = true; - } - } +},{"95":95}],45:[function(_dereq_,module,exports){ +'use strict'; - // The vertical option needs to be set on the volumeBar as well, - // since that will need to be passed along to the VolumeBar constructor - options.volumeBar = options.volumeBar || {}; - options.volumeBar.vertical = !!options.vertical; +exports.__esModule = true; - _PopupButton.call(this, player, options); +var _component = _dereq_(5); - // Same listeners as MuteToggle - this.on(player, 'volumechange', this.volumeUpdate); - this.on(player, 'loadstart', this.volumeUpdate); +var _component2 = _interopRequireDefault(_component); - // hide mute toggle if the current tech doesn't support volume control - function updateVisibility() { - if (player.tech_ && player.tech_['featuresVolumeControl'] === false) { - this.addClass('vjs-hidden'); - } else { - this.removeClass('vjs-hidden'); - } - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - updateVisibility.call(this); - this.on(player, 'loadstart', updateVisibility); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - this.on(this.volumeBar, ['slideractive', 'focus'], function () { - this.addClass('vjs-slider-active'); - }); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - this.on(this.volumeBar, ['sliderinactive', 'blur'], function () { - this.removeClass('vjs-slider-active'); - }); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file loading-spinner.js + */ - this.on(this.volumeBar, ['focus'], function () { - this.addClass('vjs-lock-showing'); - }); - this.on(this.volumeBar, ['blur'], function () { - this.removeClass('vjs-lock-showing'); - }); +/* Loading Spinner +================================================================================ */ +/** + * Loading spinner for waiting events + * + * @extends Component + * @class LoadingSpinner + */ +var LoadingSpinner = function (_Component) { + _inherits(LoadingSpinner, _Component); + + function LoadingSpinner() { + _classCallCheck(this, LoadingSpinner); + + return _possibleConstructorReturn(this, _Component.apply(this, arguments)); } /** - * Allow sub components to stack CSS class names + * Create the component's DOM element * - * @return {String} The constructed class name - * @method buildCSSClass + * @method createEl */ - - VolumeMenuButton.prototype.buildCSSClass = function buildCSSClass() { - var orientationClass = ''; - if (!!this.options_.vertical) { - orientationClass = 'vjs-volume-menu-button-vertical'; - } else { - orientationClass = 'vjs-volume-menu-button-horizontal'; - } - - return 'vjs-volume-menu-button ' + _PopupButton.prototype.buildCSSClass.call(this) + ' ' + orientationClass; + LoadingSpinner.prototype.createEl = function createEl() { + return _Component.prototype.createEl.call(this, 'div', { + className: 'vjs-loading-spinner', + dir: 'ltr' + }); }; - /** - * Allow sub components to stack CSS class names - * - * @return {Popup} The volume popup button - * @method createPopup - */ + return LoadingSpinner; +}(_component2['default']); - VolumeMenuButton.prototype.createPopup = function createPopup() { - var popup = new _popupPopupJs2['default'](this.player_, { - contentElType: 'div' - }); +_component2['default'].registerComponent('LoadingSpinner', LoadingSpinner); +exports['default'] = LoadingSpinner; - var vb = new _volumeControlVolumeBarJs2['default'](this.player_, this.options_.volumeBar); +},{"5":5}],46:[function(_dereq_,module,exports){ +'use strict'; - popup.addChild(vb); +exports.__esModule = true; - this.menuContent = popup; - this.volumeBar = vb; +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; /** + * @file media-error.js + */ - this.attachVolumeBarEvents(); - return popup; - }; +var _object = _dereq_(139); - /** - * Handle click on volume popup and calls super - * - * @method handleClick - */ +var _object2 = _interopRequireDefault(_object); - VolumeMenuButton.prototype.handleClick = function handleClick() { - _muteToggleJs2['default'].prototype.handleClick.call(this); - _PopupButton.prototype.handleClick.call(this); - }; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - VolumeMenuButton.prototype.attachVolumeBarEvents = function attachVolumeBarEvents() { - this.menuContent.on(['mousedown', 'touchdown'], Fn.bind(this, this.handleMouseDown)); - }; +/* + * Custom MediaError class which mimics the standard HTML5 MediaError class. + * + * @param {Number|String|Object|MediaError} value + * This can be of multiple types: + * - Number: should be a standard error code + * - String: an error message (the code will be 0) + * - Object: arbitrary properties + * - MediaError (native): used to populate a video.js MediaError object + * - MediaError (video.js): will return itself if it's already a + * video.js MediaError object. + */ +function MediaError(value) { + + // Allow redundant calls to this constructor to avoid having `instanceof` + // checks peppered around the code. + if (value instanceof MediaError) { + return value; + } - VolumeMenuButton.prototype.handleMouseDown = function handleMouseDown(event) { - this.on(['mousemove', 'touchmove'], Fn.bind(this.volumeBar, this.volumeBar.handleMouseMove)); - this.on(_globalDocument2['default'], ['mouseup', 'touchend'], this.handleMouseUp); - }; + if (typeof value === 'number') { + this.code = value; + } else if (typeof value === 'string') { + // default code is zero, so this is a custom error + this.message = value; + } else if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object') { - VolumeMenuButton.prototype.handleMouseUp = function handleMouseUp(event) { - this.off(['mousemove', 'touchmove'], Fn.bind(this.volumeBar, this.volumeBar.handleMouseMove)); - }; + // We assign the `code` property manually because native MediaError objects + // do not expose it as an own/enumerable property of the object. + if (typeof value.code === 'number') { + this.code = value.code; + } - return VolumeMenuButton; -})(_popupPopupButtonJs2['default']); + (0, _object2['default'])(this, value); + } -VolumeMenuButton.prototype.volumeUpdate = _muteToggleJs2['default'].prototype.update; -VolumeMenuButton.prototype.controlText_ = 'Mute'; + if (!this.message) { + this.message = MediaError.defaultMessages[this.code] || ''; + } +} -_componentJs2['default'].registerComponent('VolumeMenuButton', VolumeMenuButton); -exports['default'] = VolumeMenuButton; -module.exports = exports['default']; +/* + * The error code that refers two one of the defined + * MediaError types + * + * @type {Number} + */ +MediaError.prototype.code = 0; -},{"../component.js":67,"../popup/popup-button.js":110,"../popup/popup.js":111,"../utils/fn.js":134,"./mute-toggle.js":71,"./volume-control/volume-bar.js":94,"global/document":1}],98:[function(_dereq_,module,exports){ -/** - * @file error-display.js +/* + * An optional message to be shown with the error. + * Message is not part of the HTML5 video spec + * but allows for more informative custom errors. + * + * @type {String} + */ +MediaError.prototype.message = ''; + +/* + * An optional status code that can be set by plugins + * to allow even more detail about the error. + * For example the HLS plugin might provide the specific + * HTTP status code that was returned when the error + * occurred, then allowing a custom error overlay + * to display more information. + * + * @type {Array} */ +MediaError.prototype.status = null; + +// These errors are indexed by the W3C standard numeric value. The order +// should not be changed! +MediaError.errorTypes = ['MEDIA_ERR_CUSTOM', 'MEDIA_ERR_ABORTED', 'MEDIA_ERR_NETWORK', 'MEDIA_ERR_DECODE', 'MEDIA_ERR_SRC_NOT_SUPPORTED', 'MEDIA_ERR_ENCRYPTED']; + +MediaError.defaultMessages = { + 1: 'You aborted the media playback', + 2: 'A network error caused the media download to fail part-way.', + 3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.', + 4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.', + 5: 'The media is encrypted and we do not have the keys to decrypt it.' +}; + +// Add types as properties on MediaError +// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4; +for (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) { + MediaError[MediaError.errorTypes[errNum]] = errNum; + // values should be accessible on both the class and instance + MediaError.prototype[MediaError.errorTypes[errNum]] = errNum; +} + +exports['default'] = MediaError; + +},{"139":139}],47:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _clickableComponent = _dereq_(3); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _clickableComponent2 = _interopRequireDefault(_clickableComponent); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _component = _dereq_(5); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _component2 = _interopRequireDefault(_component); -var _component = _dereq_('./component'); +var _menu = _dereq_(49); -var _component2 = _interopRequireDefault(_component); +var _menu2 = _interopRequireDefault(_menu); -var _modalDialog = _dereq_('./modal-dialog'); +var _dom = _dereq_(82); -var _modalDialog2 = _interopRequireDefault(_modalDialog); +var Dom = _interopRequireWildcard(_dom); + +var _fn = _dereq_(84); + +var Fn = _interopRequireWildcard(_fn); + +var _toTitleCase = _dereq_(92); + +var _toTitleCase2 = _interopRequireDefault(_toTitleCase); -var _utilsDom = _dereq_('./utils/dom'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var Dom = _interopRequireWildcard(_utilsDom); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _utilsMergeOptions = _dereq_('./utils/merge-options'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file menu-button.js + */ -var _utilsMergeOptions2 = _interopRequireDefault(_utilsMergeOptions); /** - * Display that an error has occurred making the video unplayable. + * A button class with a popup menu * - * @extends ModalDialog - * @class ErrorDisplay + * @param {Player|Object} player + * @param {Object=} options + * @extends Button + * @class MenuButton */ +var MenuButton = function (_ClickableComponent) { + _inherits(MenuButton, _ClickableComponent); -var ErrorDisplay = (function (_ModalDialog) { - _inherits(ErrorDisplay, _ModalDialog); + function MenuButton(player) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - /** - * Constructor for error display modal. - * - * @param {Player} player - * @param {Object} [options] - */ + _classCallCheck(this, MenuButton); - function ErrorDisplay(player, options) { - _classCallCheck(this, ErrorDisplay); + var _this = _possibleConstructorReturn(this, _ClickableComponent.call(this, player, options)); - _ModalDialog.call(this, player, options); - this.on(player, 'error', this.open); + _this.update(); + + _this.enabled_ = true; + + _this.el_.setAttribute('aria-haspopup', 'true'); + _this.el_.setAttribute('role', 'menuitem'); + _this.on('keydown', _this.handleSubmenuKeyPress); + return _this; } /** - * Include the old class for backward-compatibility. - * - * This can be removed in 6.0. + * Update menu * - * @method buildCSSClass - * @deprecated - * @return {String} + * @method update */ - ErrorDisplay.prototype.buildCSSClass = function buildCSSClass() { - return 'vjs-error-display ' + _ModalDialog.prototype.buildCSSClass.call(this); - }; - /** - * Generates the modal content based on the player error. - * - * @return {String|Null} - */ + MenuButton.prototype.update = function update() { + var menu = this.createMenu(); - ErrorDisplay.prototype.content = function content() { - var error = this.player().error(); - return error ? this.localize(error.message) : ''; - }; + if (this.menu) { + this.removeChild(this.menu); + } - return ErrorDisplay; -})(_modalDialog2['default']); + this.menu = menu; + this.addChild(menu); -ErrorDisplay.prototype.options_ = _utilsMergeOptions2['default'](_modalDialog2['default'].prototype.options_, { - fillAlways: true, - temporary: false, - uncloseable: true -}); + /** + * Track the state of the menu button + * + * @type {Boolean} + * @private + */ + this.buttonPressed_ = false; + this.el_.setAttribute('aria-expanded', 'false'); -_component2['default'].registerComponent('ErrorDisplay', ErrorDisplay); -exports['default'] = ErrorDisplay; -module.exports = exports['default']; + if (this.items && this.items.length === 0) { + this.hide(); + } else if (this.items && this.items.length > 1) { + this.show(); + } + }; -},{"./component":67,"./modal-dialog":107,"./utils/dom":132,"./utils/merge-options":138}],99:[function(_dereq_,module,exports){ -/** - * @file event-target.js - */ -'use strict'; + /** + * Create menu + * + * @return {Menu} The constructed menu + * @method createMenu + */ -exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + MenuButton.prototype.createMenu = function createMenu() { + var menu = new _menu2['default'](this.player_); -var _utilsEventsJs = _dereq_('./utils/events.js'); + // Add a title list item to the top + if (this.options_.title) { + var title = Dom.createEl('li', { + className: 'vjs-menu-title', + innerHTML: (0, _toTitleCase2['default'])(this.options_.title), + tabIndex: -1 + }); -var Events = _interopRequireWildcard(_utilsEventsJs); + menu.children_.unshift(title); + Dom.insertElFirst(title, menu.contentEl()); + } -var EventTarget = function EventTarget() {}; + this.items = this.createItems(); -EventTarget.prototype.allowedEvents_ = {}; + if (this.items) { + // Add menu items to the menu + for (var i = 0; i < this.items.length; i++) { + menu.addItem(this.items[i]); + } + } -EventTarget.prototype.on = function (type, fn) { - // Remove the addEventListener alias before calling Events.on - // so we don't get into an infinite type loop - var ael = this.addEventListener; - this.addEventListener = Function.prototype; - Events.on(this, type, fn); - this.addEventListener = ael; -}; -EventTarget.prototype.addEventListener = EventTarget.prototype.on; + return menu; + }; -EventTarget.prototype.off = function (type, fn) { - Events.off(this, type, fn); -}; -EventTarget.prototype.removeEventListener = EventTarget.prototype.off; + /** + * Create the list of menu items. Specific to each subclass. + * + * @method createItems + */ -EventTarget.prototype.one = function (type, fn) { - Events.one(this, type, fn); -}; -EventTarget.prototype.trigger = function (event) { - var type = event.type || event; + MenuButton.prototype.createItems = function createItems() {}; - if (typeof event === 'string') { - event = { - type: type - }; - } - event = Events.fixEvent(event); + /** + * Create the component's DOM element + * + * @return {Element} + * @method createEl + */ - if (this.allowedEvents_[type] && this['on' + type]) { - this['on' + type](event); - } - Events.trigger(this, event); -}; -// The standard DOM EventTarget.dispatchEvent() is aliased to trigger() -EventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger; + MenuButton.prototype.createEl = function createEl() { + return _ClickableComponent.prototype.createEl.call(this, 'div', { + className: this.buildCSSClass() + }); + }; -exports['default'] = EventTarget; -module.exports = exports['default']; + /** + * Allow sub components to stack CSS class names + * + * @return {String} The constructed class name + * @method buildCSSClass + */ -},{"./utils/events.js":133}],100:[function(_dereq_,module,exports){ -'use strict'; -exports.__esModule = true; + MenuButton.prototype.buildCSSClass = function buildCSSClass() { + var menuButtonClass = 'vjs-menu-button'; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + // If the inline option is passed, we want to use different styles altogether. + if (this.options_.inline === true) { + menuButtonClass += '-inline'; + } else { + menuButtonClass += '-popup'; + } -var _utilsLog = _dereq_('./utils/log'); + return 'vjs-menu-button ' + menuButtonClass + ' ' + _ClickableComponent.prototype.buildCSSClass.call(this); + }; -var _utilsLog2 = _interopRequireDefault(_utilsLog); + /** + * When you click the button it adds focus, which + * will show the menu indefinitely. + * So we'll remove focus when the mouse leaves the button. + * Focus is needed for tab navigation. + * Allow sub components to stack CSS class names + * + * @method handleClick + */ -/* - * @file extend.js - * - * A combination of node inherits and babel's inherits (after transpile). - * Both work the same but node adds `super_` to the subClass - * and Bable adds the superClass as __proto__. Both seem useful. - */ -var _inherits = function _inherits(subClass, superClass) { - if (typeof superClass !== 'function' && superClass !== null) { - throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); - } - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true + MenuButton.prototype.handleClick = function handleClick() { + this.one(this.menu.contentEl(), 'mouseleave', Fn.bind(this, function (e) { + this.unpressButton(); + this.el_.blur(); + })); + if (this.buttonPressed_) { + this.unpressButton(); + } else { + this.pressButton(); } - }); + }; - if (superClass) { - // node - subClass.super_ = superClass; - } -}; + /** + * Handle key press on menu + * + * @param {Object} event Key press event + * @method handleKeyPress + */ -/* - * Function for subclassing using the same inheritance that - * videojs uses internally - * ```js - * var Button = videojs.getComponent('Button'); - * ``` - * ```js - * var MyButton = videojs.extend(Button, { - * constructor: function(player, options) { - * Button.call(this, player, options); - * }, - * onClick: function() { - * // doSomething - * } - * }); - * ``` - */ -var extendFn = function extendFn(superClass) { - var subClassMethods = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - var subClass = function subClass() { - superClass.apply(this, arguments); - }; - var methods = {}; + MenuButton.prototype.handleKeyPress = function handleKeyPress(event) { - if (typeof subClassMethods === 'object') { - if (typeof subClassMethods.init === 'function') { - _utilsLog2['default'].warn('Constructor logic via init() is deprecated; please use constructor() instead.'); - subClassMethods.constructor = subClassMethods.init; - } - if (subClassMethods.constructor !== Object.prototype.constructor) { - subClass = subClassMethods.constructor; + // Escape (27) key or Tab (9) key unpress the 'button' + if (event.which === 27 || event.which === 9) { + if (this.buttonPressed_) { + this.unpressButton(); + } + // Don't preventDefault for Tab key - we still want to lose focus + if (event.which !== 9) { + event.preventDefault(); + } + // Up (38) key or Down (40) key press the 'button' + } else if (event.which === 38 || event.which === 40) { + if (!this.buttonPressed_) { + this.pressButton(); + event.preventDefault(); + } + } else { + _ClickableComponent.prototype.handleKeyPress.call(this, event); } - methods = subClassMethods; - } else if (typeof subClassMethods === 'function') { - subClass = subClassMethods; - } + }; - _inherits(subClass, superClass); + /** + * Handle key press on submenu + * + * @param {Object} event Key press event + * @method handleSubmenuKeyPress + */ - // Extend subObj's prototype with functions and other properties from props - for (var name in methods) { - if (methods.hasOwnProperty(name)) { - subClass.prototype[name] = methods[name]; + + MenuButton.prototype.handleSubmenuKeyPress = function handleSubmenuKeyPress(event) { + + // Escape (27) key or Tab (9) key unpress the 'button' + if (event.which === 27 || event.which === 9) { + if (this.buttonPressed_) { + this.unpressButton(); + } + // Don't preventDefault for Tab key - we still want to lose focus + if (event.which !== 9) { + event.preventDefault(); + } } - } + }; - return subClass; -}; + /** + * Makes changes based on button pressed + * + * @method pressButton + */ -exports['default'] = extendFn; -module.exports = exports['default']; -},{"./utils/log":137}],101:[function(_dereq_,module,exports){ -/** - * @file fullscreen-api.js - */ -'use strict'; + MenuButton.prototype.pressButton = function pressButton() { + if (this.enabled_) { + this.buttonPressed_ = true; + this.menu.lockShowing(); + this.el_.setAttribute('aria-expanded', 'true'); + // set the focus into the submenu + this.menu.focus(); + } + }; -exports.__esModule = true; + /** + * Makes changes based on button unpressed + * + * @method unpressButton + */ -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _globalDocument = _dereq_('global/document'); + MenuButton.prototype.unpressButton = function unpressButton() { + if (this.enabled_) { + this.buttonPressed_ = false; + this.menu.unlockShowing(); + this.el_.setAttribute('aria-expanded', 'false'); + // Set focus back to this menu button + this.el_.focus(); + } + }; -var _globalDocument2 = _interopRequireDefault(_globalDocument); + /** + * Disable the menu button + * + * @return {Component} + * @method disable + */ -/* - * Store the browser-specific methods for the fullscreen API - * @type {Object|undefined} - * @private - */ -var FullscreenApi = {}; -// browser API methods -// map approach from Screenful.js - https://github.com/sindresorhus/screenfull.js -var apiMap = [ -// Spec: https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html -['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'], -// WebKit -['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'], -// Old WebKit (Safari 5.1) -['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'], -// Mozilla -['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'], -// Microsoft -['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']]; + MenuButton.prototype.disable = function disable() { + // Unpress, but don't force focus on this button + this.buttonPressed_ = false; + this.menu.unlockShowing(); + this.el_.setAttribute('aria-expanded', 'false'); -var specApi = apiMap[0]; -var browserApi = undefined; + this.enabled_ = false; -// determine the supported set of functions -for (var i = 0; i < apiMap.length; i++) { - // check for exitFullscreen function - if (apiMap[i][1] in _globalDocument2['default']) { - browserApi = apiMap[i]; - break; - } -} + return _ClickableComponent.prototype.disable.call(this); + }; -// map the browser API names to the spec API names -if (browserApi) { - for (var i = 0; i < browserApi.length; i++) { - FullscreenApi[specApi[i]] = browserApi[i]; - } -} + /** + * Enable the menu button + * + * @return {Component} + * @method disable + */ -exports['default'] = FullscreenApi; -module.exports = exports['default']; -},{"global/document":1}],102:[function(_dereq_,module,exports){ -/** - * @file loading-spinner.js - */ + MenuButton.prototype.enable = function enable() { + this.enabled_ = true; + + return _ClickableComponent.prototype.enable.call(this); + }; + + return MenuButton; +}(_clickableComponent2['default']); + +_component2['default'].registerComponent('MenuButton', MenuButton); +exports['default'] = MenuButton; + +},{"3":3,"49":49,"5":5,"82":82,"84":84,"92":92}],48:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; +var _clickableComponent = _dereq_(3); + +var _clickableComponent2 = _interopRequireDefault(_clickableComponent); + +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); + +var _object = _dereq_(139); + +var _object2 = _interopRequireDefault(_object); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _component = _dereq_('./component'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file menu-item.js + */ -var _component2 = _interopRequireDefault(_component); -/* Loading Spinner -================================================================================ */ /** - * Loading spinner for waiting events + * The component for a menu item. `
  • ` * - * @extends Component - * @class LoadingSpinner + * @param {Player|Object} player + * @param {Object=} options + * @extends Button + * @class MenuItem */ +var MenuItem = function (_ClickableComponent) { + _inherits(MenuItem, _ClickableComponent); -var LoadingSpinner = (function (_Component) { - _inherits(LoadingSpinner, _Component); + function MenuItem(player, options) { + _classCallCheck(this, MenuItem); - function LoadingSpinner() { - _classCallCheck(this, LoadingSpinner); + var _this = _possibleConstructorReturn(this, _ClickableComponent.call(this, player, options)); - _Component.apply(this, arguments); + _this.selectable = options.selectable; + + _this.selected(options.selected); + + if (_this.selectable) { + // TODO: May need to be either menuitemcheckbox or menuitemradio, + // and may need logical grouping of menu items. + _this.el_.setAttribute('role', 'menuitemcheckbox'); + } else { + _this.el_.setAttribute('role', 'menuitem'); + } + return _this; } /** * Create the component's DOM element * + * @param {String=} type Desc + * @param {Object=} props Desc + * @return {Element} * @method createEl */ - LoadingSpinner.prototype.createEl = function createEl() { - return _Component.prototype.createEl.call(this, 'div', { - className: 'vjs-loading-spinner', - dir: 'ltr' - }); - }; - - return LoadingSpinner; -})(_component2['default']); - -_component2['default'].registerComponent('LoadingSpinner', LoadingSpinner); -exports['default'] = LoadingSpinner; -module.exports = exports['default']; - -},{"./component":67}],103:[function(_dereq_,module,exports){ -/** - * @file media-error.js - */ -'use strict'; - -exports.__esModule = true; - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -var _objectAssign = _dereq_('object.assign'); - -var _objectAssign2 = _interopRequireDefault(_objectAssign); -/* - * Custom MediaError to mimic the HTML5 MediaError - * - * @param {Number} code The media error code - */ -var MediaError = function MediaError(code) { - if (typeof code === 'number') { - this.code = code; - } else if (typeof code === 'string') { - // default code is zero, so this is a custom error - this.message = code; - } else if (typeof code === 'object') { - // object - _objectAssign2['default'](this, code); - } + MenuItem.prototype.createEl = function createEl(type, props, attrs) { + return _ClickableComponent.prototype.createEl.call(this, 'li', (0, _object2['default'])({ + className: 'vjs-menu-item', + innerHTML: this.localize(this.options_.label), + tabIndex: -1 + }, props), attrs); + }; - if (!this.message) { - this.message = MediaError.defaultMessages[this.code] || ''; - } -}; + /** + * Handle a click on the menu item, and set it to selected + * + * @method handleClick + */ -/* - * The error code that refers two one of the defined - * MediaError types - * - * @type {Number} - */ -MediaError.prototype.code = 0; -/* - * An optional message to be shown with the error. - * Message is not part of the HTML5 video spec - * but allows for more informative custom errors. - * - * @type {String} - */ -MediaError.prototype.message = ''; + MenuItem.prototype.handleClick = function handleClick() { + this.selected(true); + }; -/* - * An optional status code that can be set by plugins - * to allow even more detail about the error. - * For example the HLS plugin might provide the specific - * HTTP status code that was returned when the error - * occurred, then allowing a custom error overlay - * to display more information. - * - * @type {Array} - */ -MediaError.prototype.status = null; + /** + * Set this menu item as selected or not + * + * @param {Boolean} selected + * @method selected + */ -MediaError.errorTypes = ['MEDIA_ERR_CUSTOM', // = 0 -'MEDIA_ERR_ABORTED', // = 1 -'MEDIA_ERR_NETWORK', // = 2 -'MEDIA_ERR_DECODE', // = 3 -'MEDIA_ERR_SRC_NOT_SUPPORTED', // = 4 -'MEDIA_ERR_ENCRYPTED' // = 5 -]; -MediaError.defaultMessages = { - 1: 'You aborted the media playback', - 2: 'A network error caused the media download to fail part-way.', - 3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.', - 4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.', - 5: 'The media is encrypted and we do not have the keys to decrypt it.' -}; + MenuItem.prototype.selected = function selected(_selected) { + if (this.selectable) { + if (_selected) { + this.addClass('vjs-selected'); + this.el_.setAttribute('aria-checked', 'true'); + // aria-checked isn't fully supported by browsers/screen readers, + // so indicate selected state to screen reader in the control text. + this.controlText(', selected'); + } else { + this.removeClass('vjs-selected'); + this.el_.setAttribute('aria-checked', 'false'); + // Indicate un-selected state to screen reader + // Note that a space clears out the selected state text + this.controlText(' '); + } + } + }; -// Add types as properties on MediaError -// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4; -for (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) { - MediaError[MediaError.errorTypes[errNum]] = errNum; - // values should be accessible on both the class and instance - MediaError.prototype[MediaError.errorTypes[errNum]] = errNum; -} + return MenuItem; +}(_clickableComponent2['default']); -exports['default'] = MediaError; -module.exports = exports['default']; +_component2['default'].registerComponent('MenuItem', MenuItem); +exports['default'] = MenuItem; -},{"object.assign":45}],104:[function(_dereq_,module,exports){ -/** - * @file menu-button.js - */ +},{"139":139,"3":3,"5":5}],49:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _component = _dereq_(5); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _component2 = _interopRequireDefault(_component); -var _clickableComponentJs = _dereq_('../clickable-component.js'); +var _dom = _dereq_(82); -var _clickableComponentJs2 = _interopRequireDefault(_clickableComponentJs); +var Dom = _interopRequireWildcard(_dom); -var _componentJs = _dereq_('../component.js'); +var _fn = _dereq_(84); -var _componentJs2 = _interopRequireDefault(_componentJs); +var Fn = _interopRequireWildcard(_fn); -var _menuJs = _dereq_('./menu.js'); +var _events = _dereq_(83); -var _menuJs2 = _interopRequireDefault(_menuJs); +var Events = _interopRequireWildcard(_events); -var _utilsDomJs = _dereq_('../utils/dom.js'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var Dom = _interopRequireWildcard(_utilsDomJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _utilsFnJs = _dereq_('../utils/fn.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var Fn = _interopRequireWildcard(_utilsFnJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _utilsToTitleCaseJs = _dereq_('../utils/to-title-case.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file menu.js + */ -var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs); /** - * A button class with a popup menu + * The Menu component is used to build pop up menus, including subtitle and + * captions selection menus. * - * @param {Player|Object} player - * @param {Object=} options - * @extends Button - * @class MenuButton + * @extends Component + * @class Menu */ +var Menu = function (_Component) { + _inherits(Menu, _Component); -var MenuButton = (function (_ClickableComponent) { - _inherits(MenuButton, _ClickableComponent); - - function MenuButton(player) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - - _classCallCheck(this, MenuButton); + function Menu(player, options) { + _classCallCheck(this, Menu); - _ClickableComponent.call(this, player, options); + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options)); - this.update(); + _this.focusedChild_ = -1; - this.el_.setAttribute('aria-haspopup', true); - this.el_.setAttribute('role', 'menuitem'); - this.on('keydown', this.handleSubmenuKeyPress); + _this.on('keydown', _this.handleKeyPress); + return _this; } /** - * Update menu + * Add a menu item to the menu * - * @method update + * @param {Object|String} component Component or component type to add + * @method addItem */ - MenuButton.prototype.update = function update() { - var menu = this.createMenu(); - - if (this.menu) { - this.removeChild(this.menu); - } - this.menu = menu; - this.addChild(menu); - - /** - * Track the state of the menu button - * - * @type {Boolean} - * @private - */ - this.buttonPressed_ = false; - this.el_.setAttribute('aria-expanded', false); - - if (this.items && this.items.length === 0) { - this.hide(); - } else if (this.items && this.items.length > 1) { - this.show(); - } - }; + Menu.prototype.addItem = function addItem(component) { + this.addChild(component); + component.on('click', Fn.bind(this, function () { + this.unlockShowing(); + // TODO: Need to set keyboard focus back to the menuButton + })); + }; /** - * Create menu + * Create the component's DOM element * - * @return {Menu} The constructed menu - * @method createMenu + * @return {Element} + * @method createEl */ - MenuButton.prototype.createMenu = function createMenu() { - var menu = new _menuJs2['default'](this.player_); - - // Add a title list item to the top - if (this.options_.title) { - var title = Dom.createEl('li', { - className: 'vjs-menu-title', - innerHTML: _utilsToTitleCaseJs2['default'](this.options_.title), - tabIndex: -1 - }); - menu.children_.unshift(title); - Dom.insertElFirst(title, menu.contentEl()); - } - - this.items = this['createItems'](); - if (this.items) { - // Add menu items to the menu - for (var i = 0; i < this.items.length; i++) { - menu.addItem(this.items[i]); - } - } + Menu.prototype.createEl = function createEl() { + var contentElType = this.options_.contentElType || 'ul'; - return menu; - }; + this.contentEl_ = Dom.createEl(contentElType, { + className: 'vjs-menu-content' + }); - /** - * Create the list of menu items. Specific to each subclass. - * - * @method createItems - */ + this.contentEl_.setAttribute('role', 'menu'); - MenuButton.prototype.createItems = function createItems() {}; + var el = _Component.prototype.createEl.call(this, 'div', { + append: this.contentEl_, + className: 'vjs-menu' + }); - /** - * Create the component's DOM element - * - * @return {Element} - * @method createEl - */ + el.setAttribute('role', 'presentation'); + el.appendChild(this.contentEl_); - MenuButton.prototype.createEl = function createEl() { - return _ClickableComponent.prototype.createEl.call(this, 'div', { - className: this.buildCSSClass() + // Prevent clicks from bubbling up. Needed for Menu Buttons, + // where a click on the parent is significant + Events.on(el, 'click', function (event) { + event.preventDefault(); + event.stopImmediatePropagation(); }); + + return el; }; /** - * Allow sub components to stack CSS class names + * Handle key press for menu * - * @return {String} The constructed class name - * @method buildCSSClass + * @param {Object} event Event object + * @method handleKeyPress */ - MenuButton.prototype.buildCSSClass = function buildCSSClass() { - var menuButtonClass = 'vjs-menu-button'; - // If the inline option is passed, we want to use different styles altogether. - if (this.options_.inline === true) { - menuButtonClass += '-inline'; - } else { - menuButtonClass += '-popup'; - } + Menu.prototype.handleKeyPress = function handleKeyPress(event) { + // Left and Down Arrows + if (event.which === 37 || event.which === 40) { + event.preventDefault(); + this.stepForward(); - return 'vjs-menu-button ' + menuButtonClass + ' ' + _ClickableComponent.prototype.buildCSSClass.call(this); + // Up and Right Arrows + } else if (event.which === 38 || event.which === 39) { + event.preventDefault(); + this.stepBack(); + } }; /** - * When you click the button it adds focus, which - * will show the menu indefinitely. - * So we'll remove focus when the mouse leaves the button. - * Focus is needed for tab navigation. - * Allow sub components to stack CSS class names + * Move to next (lower) menu item for keyboard users * - * @method handleClick + * @method stepForward */ - MenuButton.prototype.handleClick = function handleClick() { - this.one('mouseout', Fn.bind(this, function () { - this.menu.unlockShowing(); - this.el_.blur(); - })); - if (this.buttonPressed_) { - this.unpressButton(); - } else { - this.pressButton(); + + Menu.prototype.stepForward = function stepForward() { + var stepChild = 0; + + if (this.focusedChild_ !== undefined) { + stepChild = this.focusedChild_ + 1; } + this.focus(stepChild); }; /** - * Handle key press on menu + * Move to previous (higher) menu item for keyboard users * - * @param {Object} event Key press event - * @method handleKeyPress + * @method stepBack */ - MenuButton.prototype.handleKeyPress = function handleKeyPress(event) { - // Escape (27) key or Tab (9) key unpress the 'button' - if (event.which === 27 || event.which === 9) { - if (this.buttonPressed_) { - this.unpressButton(); - } - // Don't preventDefault for Tab key - we still want to lose focus - if (event.which !== 9) { - event.preventDefault(); - } - // Up (38) key or Down (40) key press the 'button' - } else if (event.which === 38 || event.which === 40) { - if (!this.buttonPressed_) { - this.pressButton(); - event.preventDefault(); - } - } else { - _ClickableComponent.prototype.handleKeyPress.call(this, event); - } + Menu.prototype.stepBack = function stepBack() { + var stepChild = 0; + + if (this.focusedChild_ !== undefined) { + stepChild = this.focusedChild_ - 1; + } + this.focus(stepChild); }; /** - * Handle key press on submenu + * Set focus on a menu item in the menu * - * @param {Object} event Key press event - * @method handleSubmenuKeyPress + * @param {Object|String} item Index of child item set focus on + * @method focus */ - MenuButton.prototype.handleSubmenuKeyPress = function handleSubmenuKeyPress(event) { - // Escape (27) key or Tab (9) key unpress the 'button' - if (event.which === 27 || event.which === 9) { - if (this.buttonPressed_) { - this.unpressButton(); - } - // Don't preventDefault for Tab key - we still want to lose focus - if (event.which !== 9) { - event.preventDefault(); - } - } - }; + Menu.prototype.focus = function focus() { + var item = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - /** - * Makes changes based on button pressed - * - * @method pressButton - */ + var children = this.children().slice(); + var haveTitle = children.length && children[0].className && /vjs-menu-title/.test(children[0].className); - MenuButton.prototype.pressButton = function pressButton() { - this.buttonPressed_ = true; - this.menu.lockShowing(); - this.el_.setAttribute('aria-expanded', true); - this.menu.focus(); // set the focus into the submenu - }; + if (haveTitle) { + children.shift(); + } - /** - * Makes changes based on button unpressed - * - * @method unpressButton - */ + if (children.length > 0) { + if (item < 0) { + item = 0; + } else if (item >= children.length) { + item = children.length - 1; + } - MenuButton.prototype.unpressButton = function unpressButton() { - this.buttonPressed_ = false; - this.menu.unlockShowing(); - this.el_.setAttribute('aria-expanded', false); - this.el_.focus(); // Set focus back to this menu button + this.focusedChild_ = item; + + children[item].el_.focus(); + } }; - return MenuButton; -})(_clickableComponentJs2['default']); + return Menu; +}(_component2['default']); -_componentJs2['default'].registerComponent('MenuButton', MenuButton); -exports['default'] = MenuButton; -module.exports = exports['default']; +_component2['default'].registerComponent('Menu', Menu); +exports['default'] = Menu; -},{"../clickable-component.js":65,"../component.js":67,"../utils/dom.js":132,"../utils/fn.js":134,"../utils/to-title-case.js":141,"./menu.js":106}],105:[function(_dereq_,module,exports){ -/** - * @file menu-item.js - */ +},{"5":5,"82":82,"83":83,"84":84}],50:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _clickableComponentJs = _dereq_('../clickable-component.js'); +var _dom = _dereq_(82); -var _clickableComponentJs2 = _interopRequireDefault(_clickableComponentJs); +var Dom = _interopRequireWildcard(_dom); -var _componentJs = _dereq_('../component.js'); +var _fn = _dereq_(84); -var _componentJs2 = _interopRequireDefault(_componentJs); +var Fn = _interopRequireWildcard(_fn); -var _objectAssign = _dereq_('object.assign'); +var _component = _dereq_(5); -var _objectAssign2 = _interopRequireDefault(_objectAssign); +var _component2 = _interopRequireDefault(_component); -/** - * The component for a menu item. `
  • ` - * - * @param {Player|Object} player - * @param {Object=} options - * @extends Button - * @class MenuItem - */ +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var MenuItem = (function (_ClickableComponent) { - _inherits(MenuItem, _ClickableComponent); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - function MenuItem(player, options) { - _classCallCheck(this, MenuItem); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - _ClickableComponent.call(this, player, options); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - this.selectable = options['selectable']; +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file modal-dialog.js + */ - this.selected(options['selected']); - if (this.selectable) { - // TODO: May need to be either menuitemcheckbox or menuitemradio, - // and may need logical grouping of menu items. - this.el_.setAttribute('role', 'menuitemcheckbox'); - } else { - this.el_.setAttribute('role', 'menuitem'); - } - } +var MODAL_CLASS_NAME = 'vjs-modal-dialog'; +var ESC = 27; - /** - * Create the component's DOM element - * - * @param {String=} type Desc - * @param {Object=} props Desc - * @return {Element} - * @method createEl - */ +/** + * The `ModalDialog` displays over the video and its controls, which blocks + * interaction with the player until it is closed. + * + * Modal dialogs include a "Close" button and will close when that button + * is activated - or when ESC is pressed anywhere. + * + * @extends Component + * @class ModalDialog + */ - MenuItem.prototype.createEl = function createEl(type, props, attrs) { - return _ClickableComponent.prototype.createEl.call(this, 'li', _objectAssign2['default']({ - className: 'vjs-menu-item', - innerHTML: this.localize(this.options_['label']), - tabIndex: -1 - }, props), attrs); - }; +var ModalDialog = function (_Component) { + _inherits(ModalDialog, _Component); /** - * Handle a click on the menu item, and set it to selected - * - * @method handleClick - */ - - MenuItem.prototype.handleClick = function handleClick() { - this.selected(true); - }; - - /** - * Set this menu item as selected or not - * - * @param {Boolean} selected - * @method selected - */ - - MenuItem.prototype.selected = function selected(_selected) { - if (this.selectable) { - if (_selected) { - this.addClass('vjs-selected'); - this.el_.setAttribute('aria-checked', true); - // aria-checked isn't fully supported by browsers/screen readers, - // so indicate selected state to screen reader in the control text. - this.controlText(', selected'); - } else { - this.removeClass('vjs-selected'); - this.el_.setAttribute('aria-checked', false); - // Indicate un-selected state to screen reader - // Note that a space clears out the selected state text - this.controlText(' '); - } - } - }; - - return MenuItem; -})(_clickableComponentJs2['default']); - -_componentJs2['default'].registerComponent('MenuItem', MenuItem); -exports['default'] = MenuItem; -module.exports = exports['default']; - -},{"../clickable-component.js":65,"../component.js":67,"object.assign":45}],106:[function(_dereq_,module,exports){ -/** - * @file menu.js - */ -'use strict'; - -exports.__esModule = true; - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _componentJs = _dereq_('../component.js'); - -var _componentJs2 = _interopRequireDefault(_componentJs); - -var _utilsDomJs = _dereq_('../utils/dom.js'); - -var Dom = _interopRequireWildcard(_utilsDomJs); - -var _utilsFnJs = _dereq_('../utils/fn.js'); - -var Fn = _interopRequireWildcard(_utilsFnJs); - -var _utilsEventsJs = _dereq_('../utils/events.js'); - -var Events = _interopRequireWildcard(_utilsEventsJs); - -/** - * The Menu component is used to build pop up menus, including subtitle and - * captions selection menus. - * - * @extends Component - * @class Menu - */ - -var Menu = (function (_Component) { - _inherits(Menu, _Component); - - function Menu(player, options) { - _classCallCheck(this, Menu); - - _Component.call(this, player, options); - - this.focusedChild_ = -1; - - this.on('keydown', this.handleKeyPress); - } - - /** - * Add a menu item to the menu - * - * @param {Object|String} component Component or component type to add - * @method addItem - */ - - Menu.prototype.addItem = function addItem(component) { - this.addChild(component); - component.on('click', Fn.bind(this, function () { - this.unlockShowing(); - //TODO: Need to set keyboard focus back to the menuButton - })); - }; - - /** - * Create the component's DOM element - * - * @return {Element} - * @method createEl - */ - - Menu.prototype.createEl = function createEl() { - var contentElType = this.options_.contentElType || 'ul'; - this.contentEl_ = Dom.createEl(contentElType, { - className: 'vjs-menu-content' - }); - this.contentEl_.setAttribute('role', 'menu'); - var el = _Component.prototype.createEl.call(this, 'div', { - append: this.contentEl_, - className: 'vjs-menu' - }); - el.setAttribute('role', 'presentation'); - el.appendChild(this.contentEl_); - - // Prevent clicks from bubbling up. Needed for Menu Buttons, - // where a click on the parent is significant - Events.on(el, 'click', function (event) { - event.preventDefault(); - event.stopImmediatePropagation(); - }); - - return el; - }; - - /** - * Handle key press for menu - * - * @param {Object} event Event object - * @method handleKeyPress - */ - - Menu.prototype.handleKeyPress = function handleKeyPress(event) { - if (event.which === 37 || event.which === 40) { - // Left and Down Arrows - event.preventDefault(); - this.stepForward(); - } else if (event.which === 38 || event.which === 39) { - // Up and Right Arrows - event.preventDefault(); - this.stepBack(); - } - }; - - /** - * Move to next (lower) menu item for keyboard users - * - * @method stepForward - */ - - Menu.prototype.stepForward = function stepForward() { - var stepChild = 0; - - if (this.focusedChild_ !== undefined) { - stepChild = this.focusedChild_ + 1; - } - this.focus(stepChild); - }; - - /** - * Move to previous (higher) menu item for keyboard users - * - * @method stepBack - */ - - Menu.prototype.stepBack = function stepBack() { - var stepChild = 0; - - if (this.focusedChild_ !== undefined) { - stepChild = this.focusedChild_ - 1; - } - this.focus(stepChild); - }; - - /** - * Set focus on a menu item in the menu - * - * @param {Object|String} item Index of child item set focus on - * @method focus - */ - - Menu.prototype.focus = function focus() { - var item = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0]; - - var children = this.children().slice(); - var haveTitle = children.length && children[0].className && /vjs-menu-title/.test(children[0].className); - - if (haveTitle) { - children.shift(); - } - - if (children.length > 0) { - if (item < 0) { - item = 0; - } else if (item >= children.length) { - item = children.length - 1; - } - - this.focusedChild_ = item; - - children[item].el_.focus(); - } - }; - - return Menu; -})(_componentJs2['default']); - -_componentJs2['default'].registerComponent('Menu', Menu); -exports['default'] = Menu; -module.exports = exports['default']; - -},{"../component.js":67,"../utils/dom.js":132,"../utils/events.js":133,"../utils/fn.js":134}],107:[function(_dereq_,module,exports){ -/** - * @file modal-dialog.js - */ -'use strict'; - -exports.__esModule = true; - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _globalDocument = _dereq_('global/document'); - -var _globalDocument2 = _interopRequireDefault(_globalDocument); - -var _utilsDom = _dereq_('./utils/dom'); - -var Dom = _interopRequireWildcard(_utilsDom); - -var _utilsFn = _dereq_('./utils/fn'); - -var Fn = _interopRequireWildcard(_utilsFn); - -var _utilsLog = _dereq_('./utils/log'); - -var _utilsLog2 = _interopRequireDefault(_utilsLog); - -var _component = _dereq_('./component'); - -var _component2 = _interopRequireDefault(_component); - -var _closeButton = _dereq_('./close-button'); - -var _closeButton2 = _interopRequireDefault(_closeButton); - -var MODAL_CLASS_NAME = 'vjs-modal-dialog'; -var ESC = 27; - -/** - * The `ModalDialog` displays over the video and its controls, which blocks - * interaction with the player until it is closed. - * - * Modal dialogs include a "Close" button and will close when that button - * is activated - or when ESC is pressed anywhere. - * - * @extends Component - * @class ModalDialog - */ - -var ModalDialog = (function (_Component) { - _inherits(ModalDialog, _Component); - - /** - * Constructor for modals. + * Constructor for modals. * * @param {Player} player * @param {Object} [options] @@ -8921,42 +7280,36 @@ var ModalDialog = (function (_Component) { * still possible. * */ - function ModalDialog(player, options) { _classCallCheck(this, ModalDialog); - _Component.call(this, player, options); - this.opened_ = this.hasBeenOpened_ = this.hasBeenFilled_ = false; + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options)); + + _this.opened_ = _this.hasBeenOpened_ = _this.hasBeenFilled_ = false; - this.closeable(!this.options_.uncloseable); - this.content(this.options_.content); + _this.closeable(!_this.options_.uncloseable); + _this.content(_this.options_.content); // Make sure the contentEl is defined AFTER any children are initialized // because we only want the contents of the modal in the contentEl // (not the UI elements like the close button). - this.contentEl_ = Dom.createEl('div', { + _this.contentEl_ = Dom.createEl('div', { className: MODAL_CLASS_NAME + '-content' }, { role: 'document' }); - this.descEl_ = Dom.createEl('p', { + _this.descEl_ = Dom.createEl('p', { className: MODAL_CLASS_NAME + '-description vjs-offscreen', - id: this.el().getAttribute('aria-describedby') + id: _this.el().getAttribute('aria-describedby') }); - Dom.textContent(this.descEl_, this.description()); - this.el_.appendChild(this.descEl_); - this.el_.appendChild(this.contentEl_); + Dom.textContent(_this.descEl_, _this.description()); + _this.el_.appendChild(_this.descEl_); + _this.el_.appendChild(_this.contentEl_); + return _this; } - /* - * Modal dialog default options. - * - * @type {Object} - * @private - */ - /** * Create the modal's DOM element * @@ -8964,6 +7317,7 @@ var ModalDialog = (function (_Component) { * @return {Element} */ + ModalDialog.prototype.createEl = function createEl() { return _Component.prototype.createEl.call(this, 'div', { className: this.buildCSSClass(), @@ -8972,7 +7326,7 @@ var ModalDialog = (function (_Component) { 'aria-describedby': this.id() + '_description', 'aria-hidden': 'true', 'aria-label': this.label(), - role: 'dialog' + 'role': 'dialog' }); }; @@ -8983,6 +7337,7 @@ var ModalDialog = (function (_Component) { * @return {String} */ + ModalDialog.prototype.buildCSSClass = function buildCSSClass() { return MODAL_CLASS_NAME + ' vjs-hidden ' + _Component.prototype.buildCSSClass.call(this); }; @@ -8995,6 +7350,7 @@ var ModalDialog = (function (_Component) { * @param {Event} e */ + ModalDialog.prototype.handleKeyPress = function handleKeyPress(e) { if (e.which === ESC && this.closeable()) { this.close(); @@ -9007,6 +7363,7 @@ var ModalDialog = (function (_Component) { * @return {String} */ + ModalDialog.prototype.label = function label() { return this.options_.label || this.localize('Modal Window'); }; @@ -9018,6 +7375,7 @@ var ModalDialog = (function (_Component) { * @return {String} */ + ModalDialog.prototype.description = function description() { var desc = this.options_.description || this.localize('This is a modal window.'); @@ -9036,6 +7394,7 @@ var ModalDialog = (function (_Component) { * @return {ModalDialog} */ + ModalDialog.prototype.open = function open() { if (!this.opened_) { var player = this.player(); @@ -9058,7 +7417,7 @@ var ModalDialog = (function (_Component) { } if (this.closeable()) { - this.on(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress)); + this.on(this.el_.ownerDocument, 'keydown', Fn.bind(this, this.handleKeyPress)); } player.controls(false); @@ -9080,6 +7439,7 @@ var ModalDialog = (function (_Component) { * @return {Boolean} */ + ModalDialog.prototype.opened = function opened(value) { if (typeof value === 'boolean') { this[value ? 'open' : 'close'](); @@ -9094,6 +7454,7 @@ var ModalDialog = (function (_Component) { * @return {ModalDialog} */ + ModalDialog.prototype.close = function close() { if (this.opened_) { var player = this.player(); @@ -9106,7 +7467,7 @@ var ModalDialog = (function (_Component) { } if (this.closeable()) { - this.off(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress)); + this.off(this.el_.ownerDocument, 'keydown', Fn.bind(this, this.handleKeyPress)); } player.controls(true); @@ -9131,28 +7492,30 @@ var ModalDialog = (function (_Component) { * @return {Boolean} */ + ModalDialog.prototype.closeable = function closeable(value) { if (typeof value === 'boolean') { var closeable = this.closeable_ = !!value; - var _close = this.getChild('closeButton'); + var close = this.getChild('closeButton'); // If this is being made closeable and has no close button, add one. - if (closeable && !_close) { + if (closeable && !close) { // The close button should be a child of the modal - not its // content element, so temporarily change the content element. var temp = this.contentEl_; + this.contentEl_ = this.el_; - _close = this.addChild('closeButton'); + close = this.addChild('closeButton', { controlText: 'Close Modal Dialog' }); this.contentEl_ = temp; - this.on(_close, 'close', this.close); + this.on(close, 'close', this.close); } // If this is being made uncloseable and has a close button, remove it. - if (!closeable && _close) { - this.off(_close, 'close', this.close); - this.removeChild(_close); - _close.dispose(); + if (!closeable && close) { + this.off(close, 'close', this.close); + this.removeChild(close); + close.dispose(); } } return this.closeable_; @@ -9167,6 +7530,7 @@ var ModalDialog = (function (_Component) { * @return {ModalDialog} */ + ModalDialog.prototype.fill = function fill() { return this.fillWith(this.content()); }; @@ -9183,6 +7547,7 @@ var ModalDialog = (function (_Component) { * @return {ModalDialog} */ + ModalDialog.prototype.fillWith = function fillWith(content) { var contentEl = this.contentEl(); var parentEl = contentEl.parentNode; @@ -9217,6 +7582,7 @@ var ModalDialog = (function (_Component) { * @return {ModalDialog} */ + ModalDialog.prototype.empty = function empty() { this.trigger('beforemodalempty'); Dom.emptyEl(this.contentEl()); @@ -9240,6 +7606,7 @@ var ModalDialog = (function (_Component) { * @return {Mixed} */ + ModalDialog.prototype.content = function content(value) { if (typeof value !== 'undefined') { this.content_ = value; @@ -9248,7 +7615,15 @@ var ModalDialog = (function (_Component) { }; return ModalDialog; -})(_component2['default']); +}(_component2['default']); + +/* + * Modal dialog default options. + * + * @type {Object} + * @private + */ + ModalDialog.prototype.options_ = { temporary: true @@ -9256,144 +7631,222 @@ ModalDialog.prototype.options_ = { _component2['default'].registerComponent('ModalDialog', ModalDialog); exports['default'] = ModalDialog; -module.exports = exports['default']; -},{"./close-button":66,"./component":67,"./utils/dom":132,"./utils/fn":134,"./utils/log":137,"global/document":1}],108:[function(_dereq_,module,exports){ -/** - * @file player.js - */ -// Subclasses Component +},{"5":5,"82":82,"84":84}],51:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _component = _dereq_(5); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _component2 = _interopRequireDefault(_component); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _document = _dereq_(95); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _document2 = _interopRequireDefault(_document); -var _componentJs = _dereq_('./component.js'); +var _window = _dereq_(96); -var _componentJs2 = _interopRequireDefault(_componentJs); +var _window2 = _interopRequireDefault(_window); -var _globalDocument = _dereq_('global/document'); +var _events = _dereq_(83); -var _globalDocument2 = _interopRequireDefault(_globalDocument); +var Events = _interopRequireWildcard(_events); -var _globalWindow = _dereq_('global/window'); +var _dom = _dereq_(82); -var _globalWindow2 = _interopRequireDefault(_globalWindow); +var Dom = _interopRequireWildcard(_dom); -var _utilsEventsJs = _dereq_('./utils/events.js'); +var _fn = _dereq_(84); -var Events = _interopRequireWildcard(_utilsEventsJs); +var Fn = _interopRequireWildcard(_fn); -var _utilsDomJs = _dereq_('./utils/dom.js'); +var _guid = _dereq_(86); -var Dom = _interopRequireWildcard(_utilsDomJs); +var Guid = _interopRequireWildcard(_guid); -var _utilsFnJs = _dereq_('./utils/fn.js'); +var _browser = _dereq_(79); -var Fn = _interopRequireWildcard(_utilsFnJs); +var browser = _interopRequireWildcard(_browser); -var _utilsGuidJs = _dereq_('./utils/guid.js'); +var _log = _dereq_(87); -var Guid = _interopRequireWildcard(_utilsGuidJs); +var _log2 = _interopRequireDefault(_log); -var _utilsBrowserJs = _dereq_('./utils/browser.js'); +var _toTitleCase = _dereq_(92); -var browser = _interopRequireWildcard(_utilsBrowserJs); +var _toTitleCase2 = _interopRequireDefault(_toTitleCase); -var _utilsLogJs = _dereq_('./utils/log.js'); +var _timeRanges = _dereq_(91); -var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs); +var _buffer = _dereq_(80); -var _utilsToTitleCaseJs = _dereq_('./utils/to-title-case.js'); +var _stylesheet = _dereq_(90); -var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs); +var stylesheet = _interopRequireWildcard(_stylesheet); -var _utilsTimeRangesJs = _dereq_('./utils/time-ranges.js'); +var _fullscreenApi = _dereq_(44); -var _utilsBufferJs = _dereq_('./utils/buffer.js'); +var _fullscreenApi2 = _interopRequireDefault(_fullscreenApi); -var _utilsStylesheetJs = _dereq_('./utils/stylesheet.js'); +var _mediaError = _dereq_(46); -var stylesheet = _interopRequireWildcard(_utilsStylesheetJs); +var _mediaError2 = _interopRequireDefault(_mediaError); -var _fullscreenApiJs = _dereq_('./fullscreen-api.js'); +var _tuple = _dereq_(148); -var _fullscreenApiJs2 = _interopRequireDefault(_fullscreenApiJs); +var _tuple2 = _interopRequireDefault(_tuple); -var _mediaErrorJs = _dereq_('./media-error.js'); +var _object = _dereq_(139); -var _mediaErrorJs2 = _interopRequireDefault(_mediaErrorJs); +var _object2 = _interopRequireDefault(_object); -var _safeJsonParseTuple = _dereq_('safe-json-parse/tuple'); +var _mergeOptions = _dereq_(88); -var _safeJsonParseTuple2 = _interopRequireDefault(_safeJsonParseTuple); +var _mergeOptions2 = _interopRequireDefault(_mergeOptions); -var _objectAssign = _dereq_('object.assign'); +var _textTrackListConverter = _dereq_(70); -var _objectAssign2 = _interopRequireDefault(_objectAssign); +var _textTrackListConverter2 = _interopRequireDefault(_textTrackListConverter); -var _utilsMergeOptionsJs = _dereq_('./utils/merge-options.js'); +var _modalDialog = _dereq_(50); -var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs); +var _modalDialog2 = _interopRequireDefault(_modalDialog); + +var _tech = _dereq_(63); + +var _tech2 = _interopRequireDefault(_tech); -var _tracksTextTrackListConverterJs = _dereq_('./tracks/text-track-list-converter.js'); +var _audioTrackList = _dereq_(64); -var _tracksTextTrackListConverterJs2 = _interopRequireDefault(_tracksTextTrackListConverterJs); +var _audioTrackList2 = _interopRequireDefault(_audioTrackList); -// Include required child components (importing also registers them) +var _videoTrackList = _dereq_(77); -var _techLoaderJs = _dereq_('./tech/loader.js'); +var _videoTrackList2 = _interopRequireDefault(_videoTrackList); -var _techLoaderJs2 = _interopRequireDefault(_techLoaderJs); +_dereq_(62); -var _posterImageJs = _dereq_('./poster-image.js'); +_dereq_(60); -var _posterImageJs2 = _interopRequireDefault(_posterImageJs); +_dereq_(55); -var _tracksTextTrackDisplayJs = _dereq_('./tracks/text-track-display.js'); +_dereq_(69); -var _tracksTextTrackDisplayJs2 = _interopRequireDefault(_tracksTextTrackDisplayJs); +_dereq_(45); -var _loadingSpinnerJs = _dereq_('./loading-spinner.js'); +_dereq_(1); -var _loadingSpinnerJs2 = _interopRequireDefault(_loadingSpinnerJs); +_dereq_(4); -var _bigPlayButtonJs = _dereq_('./big-play-button.js'); +_dereq_(8); -var _bigPlayButtonJs2 = _interopRequireDefault(_bigPlayButtonJs); +_dereq_(41); -var _controlBarControlBarJs = _dereq_('./control-bar/control-bar.js'); +_dereq_(72); -var _controlBarControlBarJs2 = _interopRequireDefault(_controlBarControlBarJs); +_dereq_(61); -var _errorDisplayJs = _dereq_('./error-display.js'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var _errorDisplayJs2 = _interopRequireDefault(_errorDisplayJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _tracksTextTrackSettingsJs = _dereq_('./tracks/text-track-settings.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _tracksTextTrackSettingsJs2 = _interopRequireDefault(_tracksTextTrackSettingsJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _modalDialog = _dereq_('./modal-dialog'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file player.js + */ +// Subclasses Component -var _modalDialog2 = _interopRequireDefault(_modalDialog); -// Require html5 tech, at least for disposing the original video tag +// The following imports are used only to ensure that the corresponding modules +// are always included in the video.js package. Importing the modules will +// execute them and they will register themselves with video.js. -var _techTechJs = _dereq_('./tech/tech.js'); -var _techTechJs2 = _interopRequireDefault(_techTechJs); +// Import Html5 tech, at least for disposing the original video tag. -var _techHtml5Js = _dereq_('./tech/html5.js'); -var _techHtml5Js2 = _interopRequireDefault(_techHtml5Js); +var TECH_EVENTS_RETRIGGER = [ +/** + * Fired while the user agent is downloading media data + * + * @private + * @method Player.prototype.handleTechProgress_ + */ +'progress', +/** + * Fires when the loading of an audio/video is aborted + * + * @private + * @method Player.prototype.handleTechAbort_ + */ +'abort', +/** + * Fires when the browser is intentionally not getting media data + * + * @private + * @method Player.prototype.handleTechSuspend_ + */ +'suspend', +/** + * Fires when the current playlist is empty + * + * @private + * @method Player.prototype.handleTechEmptied_ + */ +'emptied', +/** + * Fires when the browser is trying to get media data, but data is not available + * + * @private + * @method Player.prototype.handleTechStalled_ + */ +'stalled', +/** + * Fires when the browser has loaded meta data for the audio/video + * + * @private + * @method Player.prototype.handleTechLoadedmetadata_ + */ +'loadedmetadata', +/** + * Fires when the browser has loaded the current frame of the audio/video + * + * @private + * @method Player.prototype.handleTechLoaddeddata_ + */ +'loadeddata', +/** + * Fires when the current playback position has changed + * + * @private + * @method Player.prototype.handleTechTimeUpdate_ + */ +'timeupdate', +/** + * Fires when the playing speed of the audio/video is changed + * + * @private + * @method Player.prototype.handleTechRatechange_ + */ +'ratechange', +/** + * Fires when the volume has been changed + * + * @private + * @method Player.prototype.handleTechVolumechange_ + */ +'volumechange', +/** + * Fires when the text track has been changed + * + * @private + * @method Player.prototype.handleTechTexttrackchange_ + */ +'texttrackchange']; /** * An instance of the `Player` class is created when any of the Video.js setup methods are used to initialize a video. @@ -9411,26 +7864,13 @@ var _techHtml5Js2 = _interopRequireDefault(_techHtml5Js); * @param {Element} tag The original video tag used for configuring options * @param {Object=} options Object of option names and values * @param {Function=} ready Ready callback function - * @extends Component * @class Player */ -var Player = (function (_Component) { +var Player = function (_Component) { _inherits(Player, _Component); - /** - * player's constructor function - * - * @constructs - * @method init - * @param {Element} tag The original video tag used for configuring options - * @param {Object=} options Player options - * @param {Function=} ready Ready callback function - */ - function Player(tag, options, ready) { - var _this = this; - _classCallCheck(this, Player); // Make sure tag ID exists @@ -9441,7 +7881,7 @@ var Player = (function (_Component) { // which overrides globally set options. // This latter part coincides with the load order // (tag must exist before Player) - options = _objectAssign2['default'](Player.getTagSettings(tag), options); + options = (0, _object2['default'])(Player.getTagSettings(tag), options); // Delay the initialization of children because we need to set up // player properties first, and can't use `this` before `super()` @@ -9454,22 +7894,45 @@ var Player = (function (_Component) { // see enableTouchActivity in Component options.reportTouchActivity = false; + // If language is not set, get the closest lang attribute + if (!options.language) { + if (typeof tag.closest === 'function') { + var closest = tag.closest('[lang]'); + + if (closest) { + options.language = closest.getAttribute('lang'); + } + } else { + var element = tag; + + while (element && element.nodeType === 1) { + if (Dom.getElAttributes(element).hasOwnProperty('lang')) { + options.language = element.getAttribute('lang'); + break; + } + element = element.parentNode; + } + } + } + // Run base component initializing with new options - _Component.call(this, null, options, ready); // if the global option object was accidentally blown away by // someone, bail early with an informative error - if (!this.options_ || !this.options_.techOrder || !this.options_.techOrder.length) { + var _this = _possibleConstructorReturn(this, _Component.call(this, null, options, ready)); + + if (!_this.options_ || !_this.options_.techOrder || !_this.options_.techOrder.length) { throw new Error('No techOrder specified. Did you overwrite ' + 'videojs.options instead of just changing the ' + 'properties you want to override?'); } - this.tag = tag; // Store the original tag used to set options + // Store the original tag used to set options + _this.tag = tag; // Store the tag attributes used to restore html5 element - this.tagAttributes = tag && Dom.getElAttributes(tag); + _this.tagAttributes = tag && Dom.getElAttributes(tag); // Update current language - this.language(this.options_.language); + _this.language(_this.options_.language); // Update Supported Languages if (options.languages) { @@ -9483,17 +7946,17 @@ var Player = (function (_Component) { _this.languages_ = languagesToLower; })(); } else { - this.languages_ = Player.prototype.options_.languages; + _this.languages_ = Player.prototype.options_.languages; } // Cache for video property values. - this.cache_ = {}; + _this.cache_ = {}; // Set poster - this.poster_ = options.poster || ''; + _this.poster_ = options.poster || ''; // Set controls - this.controls_ = !!options.controls; + _this.controls_ = !!options.controls; // Original tag settings stored in options // now remove immediately so native controls don't flash. @@ -9506,15 +7969,15 @@ var Player = (function (_Component) { * @private * @return {Boolean} True if the user is scrubbing */ - this.scrubbing_ = false; + _this.scrubbing_ = false; - this.el_ = this.createEl(); + _this.el_ = _this.createEl(); // We also want to pass the original player options to each component and plugin // as well so they don't need to reach back into the player for options later. // We also need to do another copy of this.options_ so we don't end up with // an infinite loop. - var playerOptionsCopy = _utilsMergeOptionsJs2['default'](this.options_); + var playerOptionsCopy = (0, _mergeOptions2['default'])(_this.options_); // Load plugins if (options.plugins) { @@ -9525,33 +7988,41 @@ var Player = (function (_Component) { if (typeof this[name] === 'function') { this[name](plugins[name]); } else { - _utilsLogJs2['default'].error('Unable to find plugin:', name); + _log2['default'].error('Unable to find plugin:', name); } }, _this); })(); } - this.options_.playerOptions = playerOptionsCopy; + _this.options_.playerOptions = playerOptionsCopy; - this.initChildren(); + _this.initChildren(); // Set isAudio based on whether or not an audio tag was used - this.isAudio(tag.nodeName.toLowerCase() === 'audio'); + _this.isAudio(tag.nodeName.toLowerCase() === 'audio'); // Update controls className. Can't do this when the controls are initially // set because the element doesn't exist yet. - if (this.controls()) { - this.addClass('vjs-controls-enabled'); + if (_this.controls()) { + _this.addClass('vjs-controls-enabled'); + } else { + _this.addClass('vjs-controls-disabled'); + } + + // Set ARIA label and region role depending on player type + _this.el_.setAttribute('role', 'region'); + if (_this.isAudio()) { + _this.el_.setAttribute('aria-label', 'audio player'); } else { - this.addClass('vjs-controls-disabled'); + _this.el_.setAttribute('aria-label', 'video player'); } - if (this.isAudio()) { - this.addClass('vjs-audio'); + if (_this.isAudio()) { + _this.addClass('vjs-audio'); } - if (this.flexNotSupported_()) { - this.addClass('vjs-no-flex'); + if (_this.flexNotSupported_()) { + _this.addClass('vjs-no-flex'); } // TODO: Make this smarter. Toggle user state between touching/mousing @@ -9562,28 +8033,23 @@ var Player = (function (_Component) { // iOS Safari has broken hover handling if (!browser.IS_IOS) { - this.addClass('vjs-workinghover'); + _this.addClass('vjs-workinghover'); } // Make player easily findable by ID - Player.players[this.id_] = this; + Player.players[_this.id_] = _this; // When the player is first initialized, trigger activity so components // like the control bar show themselves if needed - this.userActive(true); - this.reportUserActivity(); - this.listenForUserActivity_(); + _this.userActive(true); + _this.reportUserActivity(); + _this.listenForUserActivity_(); - this.on('fullscreenchange', this.handleFullscreenChange_); - this.on('stageclick', this.handleStageClick_); + _this.on('fullscreenchange', _this.handleFullscreenChange_); + _this.on('stageclick', _this.handleStageClick_); + return _this; } - /* - * Global player list - * - * @type {Object} - */ - /** * Destroys the video player and does any necessary cleanup * ```js @@ -9591,10 +8057,9 @@ var Player = (function (_Component) { * ``` * This is especially helpful if you are dynamically adding and removing videos * to/from the DOM. - * - * @method dispose */ + Player.prototype.dispose = function dispose() { this.trigger('dispose'); // prevent dispose from being called twice @@ -9606,9 +8071,11 @@ var Player = (function (_Component) { // Kill reference to this player Player.players[this.id_] = null; + if (this.tag && this.tag.player) { this.tag.player = null; } + if (this.el_ && this.el_.player) { this.el_.player = null; } @@ -9624,9 +8091,9 @@ var Player = (function (_Component) { * Create the component's DOM element * * @return {Element} - * @method createEl */ + Player.prototype.createEl = function createEl() { var el = this.el_ = _Component.prototype.createEl.call(this, 'div'); var tag = this.tag; @@ -9664,10 +8131,13 @@ var Player = (function (_Component) { // Add a style element in the player that we'll use to set the width/height // of the player in a way that's still overrideable by CSS, just like the // video element - this.styleEl_ = stylesheet.createStyleElement('vjs-styles-dimensions'); - var defaultsStyleEl = Dom.$('.vjs-styles-defaults'); - var head = Dom.$('head'); - head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling : head.firstChild); + if (_window2['default'].VIDEOJS_NO_DYNAMIC_STYLE !== true) { + this.styleEl_ = stylesheet.createStyleElement('vjs-styles-dimensions'); + var defaultsStyleEl = Dom.$('.vjs-styles-defaults'); + var head = Dom.$('head'); + + head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling : head.firstChild); + } // Pass in the width/height/aspectRatio options which will update the style el this.width(this.options_.width); @@ -9675,6 +8145,16 @@ var Player = (function (_Component) { this.fluid(this.options_.fluid); this.aspectRatio(this.options_.aspectRatio); + // Hide any links within the video/audio tag, because IE doesn't hide them completely. + var links = tag.getElementsByTagName('a'); + + for (var i = 0; i < links.length; i++) { + var linkEl = links.item(i); + + Dom.addElClass(linkEl, 'vjs-hidden'); + linkEl.setAttribute('hidden', 'hidden'); + } + // insertElFirst seems to cause the networkState to flicker from 3 to 2, so // keep track of the original for later so we can know if the source originally failed tag.initNetworkState_ = tag.networkState; @@ -9687,7 +8167,9 @@ var Player = (function (_Component) { // insert the tag as the first child of the player element // then manually add it to the children array so that this.addChild // will work properly for other components - Dom.insertElFirst(tag, el); // Breaks iPhone, fixed in HTML5 setup. + // + // Breaks iPhone, fixed in HTML5 setup. + Dom.insertElFirst(tag, el); this.children_.unshift(tag); this.el_ = el; @@ -9700,9 +8182,9 @@ var Player = (function (_Component) { * * @param {Number=} value Value for width * @return {Number} Width when getting - * @method width */ + Player.prototype.width = function width(value) { return this.dimension('width', value); }; @@ -9712,9 +8194,9 @@ var Player = (function (_Component) { * * @param {Number=} value Value for height * @return {Number} Height when getting - * @method height */ + Player.prototype.height = function height(value) { return this.dimension('height', value); }; @@ -9725,9 +8207,9 @@ var Player = (function (_Component) { * @param {String} dimension Either width or height * @param {Number=} value Value for dimension * @return {Component} - * @method dimension */ + Player.prototype.dimension = function dimension(_dimension, value) { var privDimension = _dimension + '_'; @@ -9742,7 +8224,7 @@ var Player = (function (_Component) { var parsedVal = parseFloat(value); if (isNaN(parsedVal)) { - _utilsLogJs2['default'].error('Improper value "' + value + '" supplied for for ' + _dimension); + _log2['default'].error('Improper value "' + value + '" supplied for for ' + _dimension); return this; } @@ -9754,12 +8236,12 @@ var Player = (function (_Component) { }; /** - * Add/remove the vjs-fluid class + * Get/set fluid mode * * @param {Boolean} bool Value of true adds the class, value of false removes the class - * @method fluid */ + Player.prototype.fluid = function fluid(bool) { if (bool === undefined) { return !!this.fluid_; @@ -9772,6 +8254,8 @@ var Player = (function (_Component) { } else { this.removeClass('vjs-fluid'); } + + this.updateStyleEl_(); }; /** @@ -9779,9 +8263,9 @@ var Player = (function (_Component) { * * @param {String=} ratio Aspect ratio for player * @return aspectRatio - * @method aspectRatio */ + Player.prototype.aspectRatio = function aspectRatio(ratio) { if (ratio === undefined) { return this.aspectRatio_; @@ -9802,21 +8286,37 @@ var Player = (function (_Component) { /** * Update styles of the player element (height, width and aspect ratio) - * - * @method updateStyleEl_ */ + Player.prototype.updateStyleEl_ = function updateStyleEl_() { - var width = undefined; - var height = undefined; - var aspectRatio = undefined; - var idClass = undefined; + if (_window2['default'].VIDEOJS_NO_DYNAMIC_STYLE === true) { + var _width = typeof this.width_ === 'number' ? this.width_ : this.options_.width; + var _height = typeof this.height_ === 'number' ? this.height_ : this.options_.height; + var techEl = this.tech_ && this.tech_.el(); + + if (techEl) { + if (_width >= 0) { + techEl.width = _width; + } + if (_height >= 0) { + techEl.height = _height; + } + } + + return; + } + + var width = void 0; + var height = void 0; + var aspectRatio = void 0; + var idClass = void 0; // The aspect ratio is either used directly or to calculate width and height. if (this.aspectRatio_ !== undefined && this.aspectRatio_ !== 'auto') { // Use any aspectRatio that's been specifically set aspectRatio = this.aspectRatio_; - } else if (this.videoWidth()) { + } else if (this.videoWidth() > 0) { // Otherwise try to get the aspect ratio from the video metadata aspectRatio = this.videoWidth() + ':' + this.videoHeight(); } else { @@ -9867,11 +8367,12 @@ var Player = (function (_Component) { * * @param {String} techName Name of the playback technology * @param {String} source Video source - * @method loadTech_ * @private */ + Player.prototype.loadTech_ = function loadTech_(techName, source) { + var _this2 = this; // Pause and remove current playback technology if (this.tech_) { @@ -9880,7 +8381,7 @@ var Player = (function (_Component) { // get rid of the HTML5 video tag as soon as we are using another tech if (techName !== 'Html5' && this.tag) { - _techTechJs2['default'].getTech('Html5').disposeMediaElement(this.tag); + _tech2['default'].getTech('Html5').disposeMediaElement(this.tag); this.tag.player = null; this.tag = null; } @@ -9891,12 +8392,14 @@ var Player = (function (_Component) { this.isReady_ = false; // Grab tech-specific options from player options and add source and parent element to use. - var techOptions = _objectAssign2['default']({ + var techOptions = (0, _object2['default'])({ + source: source, 'nativeControlsForTouch': this.options_.nativeControlsForTouch, - 'source': source, 'playerId': this.id(), 'techId': this.id() + '_' + techName + '_api', + 'videoTracks': this.videoTracks_, 'textTracks': this.textTracks_, + 'audioTracks': this.audioTracks_, 'autoplay': this.options_.autoplay, 'preload': this.options_.preload, 'loop': this.options_.loop, @@ -9912,28 +8415,35 @@ var Player = (function (_Component) { if (source) { this.currentType_ = source.type; + if (source.src === this.cache_.src && this.cache_.currentTime > 0) { techOptions.startTime = this.cache_.currentTime; } + this.cache_.sources = null; + this.cache_.source = source; this.cache_.src = source.src; } // Initialize tech instance - var techComponent = _techTechJs2['default'].getTech(techName); + var TechComponent = _tech2['default'].getTech(techName); + // Support old behavior of techs being registered as components. // Remove once that deprecated behavior is removed. - if (!techComponent) { - techComponent = _componentJs2['default'].getComponent(techName); + if (!TechComponent) { + TechComponent = _component2['default'].getComponent(techName); } - this.tech_ = new techComponent(techOptions); + this.tech_ = new TechComponent(techOptions); // player.triggerReady is always async, so don't need this to be async this.tech_.ready(Fn.bind(this, this.handleTechReady_), true); - _tracksTextTrackListConverterJs2['default'].jsonToTextTracks(this.textTracksJson_ || [], this.tech_); + _textTrackListConverter2['default'].jsonToTextTracks(this.textTracksJson_ || [], this.tech_); // Listen to all HTML5-defined events and trigger them on the player + TECH_EVENTS_RETRIGGER.forEach(function (event) { + _this2.on(_this2.tech_, event, _this2['handleTech' + (0, _toTitleCase2['default'])(event) + '_']); + }); this.on(this.tech_, 'loadstart', this.handleTechLoadStart_); this.on(this.tech_, 'waiting', this.handleTechWaiting_); this.on(this.tech_, 'canplay', this.handleTechCanPlay_); @@ -9945,22 +8455,12 @@ var Player = (function (_Component) { this.on(this.tech_, 'play', this.handleTechPlay_); this.on(this.tech_, 'firstplay', this.handleTechFirstPlay_); this.on(this.tech_, 'pause', this.handleTechPause_); - this.on(this.tech_, 'progress', this.handleTechProgress_); this.on(this.tech_, 'durationchange', this.handleTechDurationChange_); this.on(this.tech_, 'fullscreenchange', this.handleTechFullscreenChange_); this.on(this.tech_, 'error', this.handleTechError_); - this.on(this.tech_, 'suspend', this.handleTechSuspend_); - this.on(this.tech_, 'abort', this.handleTechAbort_); - this.on(this.tech_, 'emptied', this.handleTechEmptied_); - this.on(this.tech_, 'stalled', this.handleTechStalled_); - this.on(this.tech_, 'loadedmetadata', this.handleTechLoadedMetaData_); - this.on(this.tech_, 'loadeddata', this.handleTechLoadedData_); - this.on(this.tech_, 'timeupdate', this.handleTechTimeUpdate_); - this.on(this.tech_, 'ratechange', this.handleTechRateChange_); - this.on(this.tech_, 'volumechange', this.handleTechVolumeChange_); - this.on(this.tech_, 'texttrackchange', this.handleTechTextTrackChange_); this.on(this.tech_, 'loadedmetadata', this.updateStyleEl_); this.on(this.tech_, 'posterchange', this.handleTechPosterChange_); + this.on(this.tech_, 'textdata', this.handleTechTextData_); this.usingNativeControls(this.techGet_('controls')); @@ -9984,14 +8484,16 @@ var Player = (function (_Component) { /** * Unload playback technology * - * @method unloadTech_ * @private */ + Player.prototype.unloadTech_ = function unloadTech_() { // Save the current text tracks so that we can reuse the same text tracks with the next tech + this.videoTracks_ = this.videoTracks(); this.textTracks_ = this.textTracks(); - this.textTracksJson_ = _tracksTextTrackListConverterJs2['default'].textTracksToJson(this.tech_); + this.audioTracks_ = this.audioTracks(); + this.textTracksJson_ = _textTrackListConverter2['default'].textTracksToJson(this.tech_); this.isReady_ = false; @@ -10008,15 +8510,16 @@ var Player = (function (_Component) { * * @param {Object} * @return {Object} The Tech - * @method tech */ + Player.prototype.tech = function tech(safety) { if (safety && safety.IWillNotUseThisInPlugins) { return this.tech_; } var errorText = '\n Please make sure that you are not using this inside of a plugin.\n To disable this alert and error, please pass in an object with\n `IWillNotUseThisInPlugins` to the `tech` method. See\n https://github.com/videojs/video.js/issues/2617 for more info.\n '; - _globalWindow2['default'].alert(errorText); + + _window2['default'].alert(errorText); throw new Error(errorText); }; @@ -10039,9 +8542,9 @@ var Player = (function (_Component) { * on any controls will still keep the user active * * @private - * @method addTechControlsListeners_ */ + Player.prototype.addTechControlsListeners_ = function addTechControlsListeners_() { // Make sure to remove all the previous listeners in case we are called multiple times. this.removeTechControlsListeners_(); @@ -10068,10 +8571,10 @@ var Player = (function (_Component) { * Remove the listeners used for click and tap controls. This is needed for * toggling to controls disabled, where a tap/touch should do nothing. * - * @method removeTechControlsListeners_ * @private */ + Player.prototype.removeTechControlsListeners_ = function removeTechControlsListeners_() { // We don't want to just use `this.off()` because there might be other needed // listeners added by techs that extend this. @@ -10085,10 +8588,10 @@ var Player = (function (_Component) { /** * Player waits for the tech to be ready * - * @method handleTechReady_ * @private */ + Player.prototype.handleTechReady_ = function handleTechReady_() { this.triggerReady(); @@ -10107,8 +8610,13 @@ var Player = (function (_Component) { // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work. // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays) // This fixes both issues. Need to wait for API, so it updates displays correctly - if (this.src() && this.tag && this.options_.autoplay && this.paused()) { - delete this.tag.poster; // Chrome Fix. Fixed in Chrome v16. + if ((this.src() || this.currentSrc()) && this.tag && this.options_.autoplay && this.paused()) { + try { + // Chrome Fix. Fixed in Chrome v16. + delete this.tag.poster; + } catch (e) { + (0, _log2['default'])('deleting tag.poster throws in some browsers', e); + } this.play(); } }; @@ -10116,10 +8624,11 @@ var Player = (function (_Component) { /** * Fired when the user agent begins looking for media data * + * @event loadstart * @private - * @method handleTechLoadStart_ */ + Player.prototype.handleTechLoadStart_ = function handleTechLoadStart_() { // TODO: Update to use `emptied` event instead. See #1277. @@ -10147,9 +8656,9 @@ var Player = (function (_Component) { * @param {Boolean} hasStarted The value of true adds the class the value of false remove the class * @return {Boolean} Boolean value if has started * @private - * @method hasStarted */ + Player.prototype.hasStarted = function hasStarted(_hasStarted) { if (_hasStarted !== undefined) { // only update if this is a new value @@ -10172,9 +8681,9 @@ var Player = (function (_Component) { * Fired whenever the media begins or resumes playback * * @private - * @method handleTechPlay_ */ + Player.prototype.handleTechPlay_ = function handleTechPlay_() { this.removeClass('vjs-ended'); this.removeClass('vjs-paused'); @@ -10191,16 +8700,16 @@ var Player = (function (_Component) { * Fired whenever the media begins waiting * * @private - * @method handleTechWaiting_ */ + Player.prototype.handleTechWaiting_ = function handleTechWaiting_() { - var _this2 = this; + var _this3 = this; this.addClass('vjs-waiting'); this.trigger('waiting'); this.one('timeupdate', function () { - return _this2.removeClass('vjs-waiting'); + return _this3.removeClass('vjs-waiting'); }); }; @@ -10209,9 +8718,9 @@ var Player = (function (_Component) { * which is not consistent between browsers. See #1351 * * @private - * @method handleTechCanPlay_ */ + Player.prototype.handleTechCanPlay_ = function handleTechCanPlay_() { this.removeClass('vjs-waiting'); this.trigger('canplay'); @@ -10222,9 +8731,9 @@ var Player = (function (_Component) { * which is not consistent between browsers. See #1351 * * @private - * @method handleTechCanPlayThrough_ */ + Player.prototype.handleTechCanPlayThrough_ = function handleTechCanPlayThrough_() { this.removeClass('vjs-waiting'); this.trigger('canplaythrough'); @@ -10235,9 +8744,9 @@ var Player = (function (_Component) { * which is not consistent between browsers. See #1351 * * @private - * @method handleTechPlaying_ */ + Player.prototype.handleTechPlaying_ = function handleTechPlaying_() { this.removeClass('vjs-waiting'); this.trigger('playing'); @@ -10247,9 +8756,9 @@ var Player = (function (_Component) { * Fired whenever the player is jumping to a new time * * @private - * @method handleTechSeeking_ */ + Player.prototype.handleTechSeeking_ = function handleTechSeeking_() { this.addClass('vjs-seeking'); this.trigger('seeking'); @@ -10259,9 +8768,9 @@ var Player = (function (_Component) { * Fired when the player has finished jumping to a new time * * @private - * @method handleTechSeeked_ */ + Player.prototype.handleTechSeeked_ = function handleTechSeeked_() { this.removeClass('vjs-seeking'); this.trigger('seeked'); @@ -10274,12 +8783,12 @@ var Player = (function (_Component) { * prevent playback, use `myPlayer.one('play');` instead. * * @private - * @method handleTechFirstPlay_ */ + Player.prototype.handleTechFirstPlay_ = function handleTechFirstPlay_() { - //If the first starttime attribute is specified - //then we will start at the given offset in seconds + // If the first starttime attribute is specified + // then we will start at the given offset in seconds if (this.options_.starttime) { this.currentTime(this.options_.starttime); } @@ -10292,33 +8801,23 @@ var Player = (function (_Component) { * Fired whenever the media has been paused * * @private - * @method handleTechPause_ */ + Player.prototype.handleTechPause_ = function handleTechPause_() { this.removeClass('vjs-playing'); this.addClass('vjs-paused'); this.trigger('pause'); }; - /** - * Fired while the user agent is downloading media data - * - * @private - * @method handleTechProgress_ - */ - - Player.prototype.handleTechProgress_ = function handleTechProgress_() { - this.trigger('progress'); - }; - /** * Fired when the end of the media resource is reached (currentTime == duration) * + * @event ended * @private - * @method handleTechEnded_ */ + Player.prototype.handleTechEnded_ = function handleTechEnded_() { this.addClass('vjs-ended'); if (this.options_.loop) { @@ -10335,9 +8834,9 @@ var Player = (function (_Component) { * Fired when the duration of the media resource is first known or changed * * @private - * @method handleTechDurationChange_ */ + Player.prototype.handleTechDurationChange_ = function handleTechDurationChange_() { this.duration(this.techGet_('duration')); }; @@ -10347,13 +8846,15 @@ var Player = (function (_Component) { * * @param {Object=} event Event object * @private - * @method handleTechClick_ */ + Player.prototype.handleTechClick_ = function handleTechClick_(event) { // We're using mousedown to detect clicks thanks to Flash, but mousedown // will also be triggered with right-clicks, so we need to prevent that - if (event.button !== 0) return; + if (event.button !== 0) { + return; + } // When controls are disabled a click should not toggle playback because // the click is considered a control @@ -10371,9 +8872,9 @@ var Player = (function (_Component) { * activity state, which hides and shows the controls. * * @private - * @method handleTechTap_ */ + Player.prototype.handleTechTap_ = function handleTechTap_() { this.userActive(!this.userActive()); }; @@ -10382,9 +8883,9 @@ var Player = (function (_Component) { * Handle touch to start * * @private - * @method handleTechTouchStart_ */ + Player.prototype.handleTechTouchStart_ = function handleTechTouchStart_() { this.userWasActive = this.userActive(); }; @@ -10393,9 +8894,9 @@ var Player = (function (_Component) { * Handle touch to move * * @private - * @method handleTechTouchMove_ */ + Player.prototype.handleTechTouchMove_ = function handleTechTouchMove_() { if (this.userWasActive) { this.reportUserActivity(); @@ -10406,9 +8907,9 @@ var Player = (function (_Component) { * Handle touch to end * * @private - * @method handleTechTouchEnd_ */ + Player.prototype.handleTechTouchEnd_ = function handleTechTouchEnd_(event) { // Stop the mouse events from also happening event.preventDefault(); @@ -10418,9 +8919,9 @@ var Player = (function (_Component) { * Fired when the player switches in or out of fullscreen mode * * @private - * @method handleFullscreenChange_ */ + Player.prototype.handleFullscreenChange_ = function handleFullscreenChange_() { if (this.isFullscreen()) { this.addClass('vjs-fullscreen'); @@ -10434,9 +8935,9 @@ var Player = (function (_Component) { * use stageclick events triggered from inside the SWF instead * * @private - * @method handleStageClick_ */ + Player.prototype.handleStageClick_ = function handleStageClick_() { this.reportUserActivity(); }; @@ -10445,9 +8946,9 @@ var Player = (function (_Component) { * Handle Tech Fullscreen Change * * @private - * @method handleTechFullscreenChange_ */ + Player.prototype.handleTechFullscreenChange_ = function handleTechFullscreenChange_(event, data) { if (data) { this.isFullscreen(data.isFullscreen); @@ -10459,131 +8960,31 @@ var Player = (function (_Component) { * Fires when an error occurred during the loading of an audio/video * * @private - * @method handleTechError_ */ + Player.prototype.handleTechError_ = function handleTechError_() { var error = this.tech_.error(); - this.error(error && error.code); - }; - - /** - * Fires when the browser is intentionally not getting media data - * - * @private - * @method handleTechSuspend_ - */ - - Player.prototype.handleTechSuspend_ = function handleTechSuspend_() { - this.trigger('suspend'); - }; - - /** - * Fires when the loading of an audio/video is aborted - * - * @private - * @method handleTechAbort_ - */ - - Player.prototype.handleTechAbort_ = function handleTechAbort_() { - this.trigger('abort'); - }; - - /** - * Fires when the current playlist is empty - * - * @private - * @method handleTechEmptied_ - */ - - Player.prototype.handleTechEmptied_ = function handleTechEmptied_() { - this.trigger('emptied'); - }; - - /** - * Fires when the browser is trying to get media data, but data is not available - * - * @private - * @method handleTechStalled_ - */ - - Player.prototype.handleTechStalled_ = function handleTechStalled_() { - this.trigger('stalled'); - }; - - /** - * Fires when the browser has loaded meta data for the audio/video - * - * @private - * @method handleTechLoadedMetaData_ - */ - - Player.prototype.handleTechLoadedMetaData_ = function handleTechLoadedMetaData_() { - this.trigger('loadedmetadata'); - }; - - /** - * Fires when the browser has loaded the current frame of the audio/video - * - * @private - * @method handleTechLoadedData_ - */ - - Player.prototype.handleTechLoadedData_ = function handleTechLoadedData_() { - this.trigger('loadeddata'); - }; - - /** - * Fires when the current playback position has changed - * - * @private - * @method handleTechTimeUpdate_ - */ - - Player.prototype.handleTechTimeUpdate_ = function handleTechTimeUpdate_() { - this.trigger('timeupdate'); - }; - - /** - * Fires when the playing speed of the audio/video is changed - * - * @private - * @method handleTechRateChange_ - */ - - Player.prototype.handleTechRateChange_ = function handleTechRateChange_() { - this.trigger('ratechange'); - }; - - /** - * Fires when the volume has been changed - * - * @private - * @method handleTechVolumeChange_ - */ - Player.prototype.handleTechVolumeChange_ = function handleTechVolumeChange_() { - this.trigger('volumechange'); + this.error(error); }; - /** - * Fires when the text track has been changed - * - * @private - * @method handleTechTextTrackChange_ - */ + Player.prototype.handleTechTextData_ = function handleTechTextData_() { + var data = null; - Player.prototype.handleTechTextTrackChange_ = function handleTechTextTrackChange_() { - this.trigger('texttrackchange'); + if (arguments.length > 1) { + data = arguments[1]; + } + this.trigger('textdata', data); }; /** * Get object for cached values. * * @return {Object} - * @method getCache */ + Player.prototype.getCache = function getCache() { return this.cache_; }; @@ -10594,9 +8995,9 @@ var Player = (function (_Component) { * @param {String=} method Method * @param {Object=} arg Argument * @private - * @method techCall_ */ + Player.prototype.techCall_ = function techCall_(method, arg) { // If it's not ready yet, call method when it is if (this.tech_ && !this.tech_.isReady_) { @@ -10606,13 +9007,15 @@ var Player = (function (_Component) { // Otherwise call method now } else { - try { + try { + if (this.tech_) { this.tech_[method](arg); - } catch (e) { - _utilsLogJs2['default'](e); - throw e; } + } catch (e) { + (0, _log2['default'])(e); + throw e; } + } }; /** @@ -10621,9 +9024,9 @@ var Player = (function (_Component) { * @param {String} method Tech method * @return {Method} * @private - * @method techGet_ */ + Player.prototype.techGet_ = function techGet_(method) { if (this.tech_ && this.tech_.isReady_) { @@ -10635,15 +9038,14 @@ var Player = (function (_Component) { } catch (e) { // When building additional tech libs, an expected method may not be defined yet if (this.tech_[method] === undefined) { - _utilsLogJs2['default']('Video.js: ' + method + ' method not defined for ' + this.techName_ + ' playback technology.', e); - } else { + (0, _log2['default'])('Video.js: ' + method + ' method not defined for ' + this.techName_ + ' playback technology.', e); + // When a method isn't available on the object it throws a TypeError - if (e.name === 'TypeError') { - _utilsLogJs2['default']('Video.js: ' + method + ' unavailable on ' + this.techName_ + ' playback technology element.', e); - this.tech_.isReady_ = false; - } else { - _utilsLogJs2['default'](e); - } + } else if (e.name === 'TypeError') { + (0, _log2['default'])('Video.js: ' + method + ' unavailable on ' + this.techName_ + ' playback technology element.', e); + this.tech_.isReady_ = false; + } else { + (0, _log2['default'])(e); } throw e; } @@ -10659,11 +9061,19 @@ var Player = (function (_Component) { * ``` * * @return {Player} self - * @method play */ + Player.prototype.play = function play() { - this.techCall_('play'); + // Only calls the tech's play if we already have a src loaded + if (this.src() || this.currentSrc()) { + this.techCall_('play'); + } else { + this.tech_.one('loadstart', function () { + this.play(); + }); + } + return this; }; @@ -10674,9 +9084,9 @@ var Player = (function (_Component) { * ``` * * @return {Player} self - * @method pause */ + Player.prototype.pause = function pause() { this.techCall_('pause'); return this; @@ -10690,9 +9100,9 @@ var Player = (function (_Component) { * ``` * * @return {Boolean} false if the media is currently playing, or true otherwise - * @method paused */ + Player.prototype.paused = function paused() { // The initial state of paused should be true (in Safari it's actually false) return this.techGet_('paused') === false ? false : true; @@ -10705,9 +9115,9 @@ var Player = (function (_Component) { * @param {Boolean} isScrubbing True/false the user is scrubbing * @return {Boolean} The scrubbing status when getting * @return {Object} The player when setting - * @method scrubbing */ + Player.prototype.scrubbing = function scrubbing(isScrubbing) { if (isScrubbing !== undefined) { this.scrubbing_ = !!isScrubbing; @@ -10736,9 +9146,9 @@ var Player = (function (_Component) { * @param {Number|String=} seconds The time to seek to * @return {Number} The time in seconds, when not setting * @return {Player} self, when the current time is set - * @method currentTime */ + Player.prototype.currentTime = function currentTime(seconds) { if (seconds !== undefined) { @@ -10753,11 +9163,13 @@ var Player = (function (_Component) { // currentTime when scrubbing, but may not provide much performance benefit afterall. // Should be tested. Also something has to read the actual current time or the cache will // never get updated. - return this.cache_.currentTime = this.techGet_('currentTime') || 0; + this.cache_.currentTime = this.techGet_('currentTime') || 0; + return this.cache_.currentTime; }; /** - * Get the length in time of the video in seconds + * Normally gets the length in time of the video in seconds; + * in all but the rarest use cases an argument will NOT be passed to the method * ```js * var lengthOfVideo = myPlayer.duration(); * ``` @@ -10767,9 +9179,9 @@ var Player = (function (_Component) { * * @param {Number} seconds Duration when setting * @return {Number} The duration of the video in seconds when getting - * @method duration */ + Player.prototype.duration = function duration(seconds) { if (seconds === undefined) { return this.cache_.duration || 0; @@ -10806,9 +9218,9 @@ var Player = (function (_Component) { * Not a native video element function, but useful * * @return {Number} The time remaining in seconds - * @method remainingTime */ + Player.prototype.remainingTime = function remainingTime() { return this.duration() - this.currentTime(); }; @@ -10833,14 +9245,14 @@ var Player = (function (_Component) { * ``` * * @return {Object} A mock TimeRange object (following HTML spec) - * @method buffered */ + Player.prototype.buffered = function buffered() { var buffered = this.techGet_('buffered'); if (!buffered || !buffered.length) { - buffered = _utilsTimeRangesJs.createTimeRange(0, 0); + buffered = (0, _timeRanges.createTimeRange)(0, 0); } return buffered; @@ -10855,11 +9267,11 @@ var Player = (function (_Component) { * (This method isn't in the HTML5 spec, but it's very convenient) * * @return {Number} A decimal between 0 and 1 representing the percent - * @method bufferedPercent */ + Player.prototype.bufferedPercent = function bufferedPercent() { - return _utilsBufferJs.bufferedPercent(this.buffered(), this.duration()); + return (0, _buffer.bufferedPercent)(this.buffered(), this.duration()); }; /** @@ -10867,13 +9279,13 @@ var Player = (function (_Component) { * This is used in the progress bar to encapsulate all time ranges. * * @return {Number} The end of the last buffered time range - * @method bufferedEnd */ + Player.prototype.bufferedEnd = function bufferedEnd() { - var buffered = this.buffered(), - duration = this.duration(), - end = buffered.end(buffered.length - 1); + var buffered = this.buffered(); + var duration = this.duration(); + var end = buffered.end(buffered.length - 1); if (end > duration) { end = duration; @@ -10895,14 +9307,15 @@ var Player = (function (_Component) { * @param {Number} percentAsDecimal The new volume as a decimal percent * @return {Number} The current volume when getting * @return {Player} self when setting - * @method volume */ + Player.prototype.volume = function volume(percentAsDecimal) { - var vol = undefined; + var vol = void 0; if (percentAsDecimal !== undefined) { - vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); // Force value to between 0 and 1 + // Force value to between 0 and 1 + vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); this.cache_.volume = vol; this.techCall_('setVolume', vol); @@ -10926,15 +9339,15 @@ var Player = (function (_Component) { * @param {Boolean=} muted True to mute, false to unmute * @return {Boolean} True if mute is on, false if not when getting * @return {Player} self when setting mute - * @method muted */ + Player.prototype.muted = function muted(_muted) { if (_muted !== undefined) { this.techCall_('setMuted', _muted); return this; } - return this.techGet_('muted') || false; // Default to false + return this.techGet_('muted') || false; }; // Check if current tech can support native fullscreen @@ -10943,9 +9356,9 @@ var Player = (function (_Component) { * Check to see if fullscreen is supported * * @return {Boolean} - * @method supportsFullScreen */ + Player.prototype.supportsFullScreen = function supportsFullScreen() { return this.techGet_('supportsFullScreen') || false; }; @@ -10965,9 +9378,9 @@ var Player = (function (_Component) { * @param {Boolean=} isFS Update the player's fullscreen state * @return {Boolean} true if fullscreen false if not when getting * @return {Player} self when setting - * @method isFullscreen */ + Player.prototype.isFullscreen = function isFullscreen(isFS) { if (isFS !== undefined) { this.isFullscreen_ = !!isFS; @@ -10989,11 +9402,11 @@ var Player = (function (_Component) { * Safari. * * @return {Player} self - * @method requestFullscreen */ + Player.prototype.requestFullscreen = function requestFullscreen() { - var fsApi = _fullscreenApiJs2['default']; + var fsApi = _fullscreenApi2['default']; this.isFullscreen(true); @@ -11006,12 +9419,12 @@ var Player = (function (_Component) { // when canceling fullscreen. Otherwise if there's multiple // players on a page, they would all be reacting to the same fullscreen // events - Events.on(_globalDocument2['default'], fsApi.fullscreenchange, Fn.bind(this, function documentFullscreenChange(e) { - this.isFullscreen(_globalDocument2['default'][fsApi.fullscreenElement]); + Events.on(_document2['default'], fsApi.fullscreenchange, Fn.bind(this, function documentFullscreenChange(e) { + this.isFullscreen(_document2['default'][fsApi.fullscreenElement]); // If cancelling fullscreen, remove event listener. if (this.isFullscreen() === false) { - Events.off(_globalDocument2['default'], fsApi.fullscreenchange, documentFullscreenChange); + Events.off(_document2['default'], fsApi.fullscreenchange, documentFullscreenChange); } this.trigger('fullscreenchange'); @@ -11039,16 +9452,17 @@ var Player = (function (_Component) { * ``` * * @return {Player} self - * @method exitFullscreen */ + Player.prototype.exitFullscreen = function exitFullscreen() { - var fsApi = _fullscreenApiJs2['default']; + var fsApi = _fullscreenApi2['default']; + this.isFullscreen(false); // Check for browser element fullscreen support if (fsApi.requestFullscreen) { - _globalDocument2['default'][fsApi.exitFullscreen](); + _document2['default'][fsApi.exitFullscreen](); } else if (this.tech_.supportsFullScreen()) { this.techCall_('exitFullScreen'); } else { @@ -11061,24 +9475,23 @@ var Player = (function (_Component) { /** * When fullscreen isn't supported we can stretch the video container to as wide as the browser will let us. - * - * @method enterFullWindow */ + Player.prototype.enterFullWindow = function enterFullWindow() { this.isFullWindow = true; // Storing original doc overflow value to return to when fullscreen is off - this.docOrigOverflow = _globalDocument2['default'].documentElement.style.overflow; + this.docOrigOverflow = _document2['default'].documentElement.style.overflow; // Add listener for esc key to exit fullscreen - Events.on(_globalDocument2['default'], 'keydown', Fn.bind(this, this.fullWindowOnEscKey)); + Events.on(_document2['default'], 'keydown', Fn.bind(this, this.fullWindowOnEscKey)); // Hide any scroll bars - _globalDocument2['default'].documentElement.style.overflow = 'hidden'; + _document2['default'].documentElement.style.overflow = 'hidden'; // Apply fullscreen styles - Dom.addElClass(_globalDocument2['default'].body, 'vjs-full-window'); + Dom.addElClass(_document2['default'].body, 'vjs-full-window'); this.trigger('enterFullWindow'); }; @@ -11087,9 +9500,9 @@ var Player = (function (_Component) { * Check for call to either exit full window or full screen on ESC key * * @param {String} event Event to check for key press - * @method fullWindowOnEscKey */ + Player.prototype.fullWindowOnEscKey = function fullWindowOnEscKey(event) { if (event.keyCode === 27) { if (this.isFullscreen() === true) { @@ -11102,19 +9515,18 @@ var Player = (function (_Component) { /** * Exit full window - * - * @method exitFullWindow */ + Player.prototype.exitFullWindow = function exitFullWindow() { this.isFullWindow = false; - Events.off(_globalDocument2['default'], 'keydown', this.fullWindowOnEscKey); + Events.off(_document2['default'], 'keydown', this.fullWindowOnEscKey); // Unhide scroll bars. - _globalDocument2['default'].documentElement.style.overflow = this.docOrigOverflow; + _document2['default'].documentElement.style.overflow = this.docOrigOverflow; // Remove fullscreen styles - Dom.removeElClass(_globalDocument2['default'].body, 'vjs-full-window'); + Dom.removeElClass(_document2['default'].body, 'vjs-full-window'); // Resize the box, controller, and poster to original sizes // this.positionAll(); @@ -11126,26 +9538,26 @@ var Player = (function (_Component) { * * @param {String} type The mimetype to check * @return {String} 'probably', 'maybe', or '' (empty string) - * @method canPlayType */ + Player.prototype.canPlayType = function canPlayType(type) { - var can = undefined; + var can = void 0; // Loop through each playback technology in the options order for (var i = 0, j = this.options_.techOrder; i < j.length; i++) { - var techName = _utilsToTitleCaseJs2['default'](j[i]); - var tech = _techTechJs2['default'].getTech(techName); + var techName = (0, _toTitleCase2['default'])(j[i]); + var tech = _tech2['default'].getTech(techName); // Support old behavior of techs being registered as components. // Remove once that deprecated behavior is removed. if (!tech) { - tech = _componentJs2['default'].getComponent(techName); + tech = _component2['default'].getComponent(techName); } // Check if the current tech is defined before continuing if (!tech) { - _utilsLogJs2['default'].error('The "' + techName + '" tech is undefined. Skipped browser support check for that tech.'); + _log2['default'].error('The "' + techName + '" tech is undefined. Skipped browser support check for that tech.'); continue; } @@ -11169,20 +9581,22 @@ var Player = (function (_Component) { * * @param {Array} sources The sources for a media asset * @return {Object|Boolean} Object of source and tech order, otherwise false - * @method selectSource */ + Player.prototype.selectSource = function selectSource(sources) { + var _this4 = this; + // Get only the techs specified in `techOrder` that exist and are supported by the // current platform - var techs = this.options_.techOrder.map(_utilsToTitleCaseJs2['default']).map(function (techName) { + var techs = this.options_.techOrder.map(_toTitleCase2['default']).map(function (techName) { // `Component.getComponent(...)` is for support of old behavior of techs // being registered as components. // Remove once that deprecated behavior is removed. - return [techName, _techTechJs2['default'].getTech(techName) || _componentJs2['default'].getComponent(techName)]; + return [techName, _tech2['default'].getTech(techName) || _component2['default'].getComponent(techName)]; }).filter(function (_ref) { - var techName = _ref[0]; - var tech = _ref[1]; + var techName = _ref[0], + tech = _ref[1]; // Check if the current tech is defined before continuing if (tech) { @@ -11190,7 +9604,7 @@ var Player = (function (_Component) { return tech.isSupported(); } - _utilsLogJs2['default'].error('The "' + techName + '" tech is undefined. Skipped browser support check for that tech.'); + _log2['default'].error('The "' + techName + '" tech is undefined. Skipped browser support check for that tech.'); return false; }); @@ -11198,7 +9612,7 @@ var Player = (function (_Component) { // `tester` with both. If `tester` returns a non-falsy value, exit early and return // that value. var findFirstPassingTechSourcePair = function findFirstPassingTechSourcePair(outerArray, innerArray, tester) { - var found = undefined; + var found = void 0; outerArray.some(function (outerChoice) { return innerArray.some(function (innerChoice) { @@ -11213,17 +9627,17 @@ var Player = (function (_Component) { return found; }; - var foundSourceAndTech = undefined; + var foundSourceAndTech = void 0; var flip = function flip(fn) { return function (a, b) { return fn(b, a); }; }; var finder = function finder(_ref2, source) { - var techName = _ref2[0]; - var tech = _ref2[1]; + var techName = _ref2[0], + tech = _ref2[1]; - if (tech.canPlaySource(source)) { + if (tech.canPlaySource(source, _this4.options_[techName.toLowerCase()])) { return { source: source, tech: techName }; } }; @@ -11271,19 +9685,20 @@ var Player = (function (_Component) { * @param {String|Object|Array=} source The source URL, object, or array of sources * @return {String} The current video source when getting * @return {String} The player when setting - * @method src */ + Player.prototype.src = function src(source) { if (source === undefined) { return this.techGet_('src'); } - var currentTech = _techTechJs2['default'].getTech(this.techName_); + var currentTech = _tech2['default'].getTech(this.techName_); + // Support old behavior of techs being registered as components. // Remove once that deprecated behavior is removed. if (!currentTech) { - currentTech = _componentJs2['default'].getComponent(this.techName_); + currentTech = _component2['default'].getComponent(this.techName_); } // case: Array of source objects to choose from and pick the best to play @@ -11292,46 +9707,49 @@ var Player = (function (_Component) { // case: URL String (http://myvideo...) } else if (typeof source === 'string') { - // create a source object from the string - this.src({ src: source }); - - // case: Source object { src: '', type: '' ... } - } else if (source instanceof Object) { - // check if the source has a type and the loaded tech cannot play the source - // if there's no type we'll just try the current tech - if (source.type && !currentTech.canPlaySource(source)) { - // create a source list with the current source and send through - // the tech loop to check for a compatible technology - this.sourceList_([source]); - } else { - this.cache_.src = source.src; - this.currentType_ = source.type || ''; - - // wait until the tech is ready to set the source - this.ready(function () { - - // The setSource tech method was added with source handlers - // so older techs won't support it - // We need to check the direct prototype for the case where subclasses - // of the tech do not support source handlers - if (currentTech.prototype.hasOwnProperty('setSource')) { - this.techCall_('setSource', source); - } else { - this.techCall_('src', source.src); - } + // create a source object from the string + this.src({ src: source }); + + // case: Source object { src: '', type: '' ... } + } else if (source instanceof Object) { + // check if the source has a type and the loaded tech cannot play the source + // if there's no type we'll just try the current tech + if (source.type && !currentTech.canPlaySource(source, this.options_[this.techName_.toLowerCase()])) { + // create a source list with the current source and send through + // the tech loop to check for a compatible technology + this.sourceList_([source]); + } else { + this.cache_.sources = null; + this.cache_.source = source; + this.cache_.src = source.src; - if (this.options_.preload === 'auto') { - this.load(); - } + this.currentType_ = source.type || ''; - if (this.options_.autoplay) { - this.play(); - } + // wait until the tech is ready to set the source + this.ready(function () { - // Set the source synchronously if possible (#2326) - }, true); + // The setSource tech method was added with source handlers + // so older techs won't support it + // We need to check the direct prototype for the case where subclasses + // of the tech do not support source handlers + if (currentTech.prototype.hasOwnProperty('setSource')) { + this.techCall_('setSource', source); + } else { + this.techCall_('src', source.src); } - } + + if (this.options_.preload === 'auto') { + this.load(); + } + + if (this.options_.autoplay) { + this.play(); + } + + // Set the source synchronously if possible (#2326) + }, true); + } + } return this; }; @@ -11341,9 +9759,9 @@ var Player = (function (_Component) { * * @param {Array} sources Array of source objects * @private - * @method sourceList_ */ + Player.prototype.sourceList_ = function sourceList_(sources) { var sourceTech = this.selectSource(sources); @@ -11355,6 +9773,8 @@ var Player = (function (_Component) { // load this technology with the chosen source this.loadTech_(sourceTech.tech, sourceTech.source); } + + this.cache_.sources = sources; } else { // We need to wrap this in a timeout to give folks a chance to add error event handlers this.setTimeout(function () { @@ -11371,9 +9791,9 @@ var Player = (function (_Component) { * Begin loading the src data. * * @return {Player} Returns the player - * @method load */ + Player.prototype.load = function load() { this.techCall_('load'); return this; @@ -11384,23 +9804,62 @@ var Player = (function (_Component) { * and calls `reset` on the tech`. * * @return {Player} Returns the player - * @method reset */ + Player.prototype.reset = function reset() { - this.loadTech_(_utilsToTitleCaseJs2['default'](this.options_.techOrder[0]), null); + this.loadTech_((0, _toTitleCase2['default'])(this.options_.techOrder[0]), null); this.techCall_('reset'); return this; }; + /** + * Returns the current source objects. + * + * @return {Object[]} The current source objects + * @method currentSources + */ + + + Player.prototype.currentSources = function currentSources() { + var source = this.currentSource(); + var sources = []; + + // assume `{}` or `{ src }` + if (Object.keys(source).length !== 0) { + sources.push(source); + } + + return this.cache_.sources || sources; + }; + + /** + * Returns the current source object. + * + * @return {Object} The current source object + * @method currentSource + */ + + + Player.prototype.currentSource = function currentSource() { + var source = {}; + var src = this.currentSrc(); + + if (src) { + source.src = src; + } + + return this.cache_.source || source; + }; + /** * Returns the fully qualified URL of the current source value e.g. http://mysite.com/video.mp4 * Can be used in conjuction with `currentType` to assist in rebuilding the current source object. * * @return {String} The current source - * @method currentSrc */ + Player.prototype.currentSrc = function currentSrc() { return this.techGet_('currentSrc') || this.cache_.src || ''; }; @@ -11411,9 +9870,9 @@ var Player = (function (_Component) { * source and tech later * * @return {String} The source MIME type - * @method currentType */ + Player.prototype.currentType = function currentType() { return this.currentType_ || ''; }; @@ -11424,9 +9883,9 @@ var Player = (function (_Component) { * @param {Boolean} value Boolean to determine if preload should be used * @return {String} The preload attribute value when getting * @return {Player} Returns the player when setting - * @method preload */ + Player.prototype.preload = function preload(value) { if (value !== undefined) { this.techCall_('setPreload', value); @@ -11442,9 +9901,9 @@ var Player = (function (_Component) { * @param {Boolean} value Boolean to determine if video should autoplay * @return {String} The autoplay attribute value when getting * @return {Player} Returns the player when setting - * @method autoplay */ + Player.prototype.autoplay = function autoplay(value) { if (value !== undefined) { this.techCall_('setAutoplay', value); @@ -11460,13 +9919,13 @@ var Player = (function (_Component) { * @param {Boolean} value Boolean to determine if video should loop * @return {String} The loop attribute value when getting * @return {Player} Returns the player when setting - * @method loop */ + Player.prototype.loop = function loop(value) { if (value !== undefined) { this.techCall_('setLoop', value); - this.options_['loop'] = value; + this.options_.loop = value; return this; } return this.techGet_('loop'); @@ -11486,9 +9945,9 @@ var Player = (function (_Component) { * @param {String=} src Poster image source URL * @return {String} poster URL when getting * @return {Player} self when setting - * @method poster */ + Player.prototype.poster = function poster(src) { if (src === undefined) { return this.poster_; @@ -11521,9 +9980,9 @@ var Player = (function (_Component) { * the normal APIs. * * @private - * @method handleTechPosterChange_ */ + Player.prototype.handleTechPosterChange_ = function handleTechPosterChange_() { if (!this.poster_ && this.tech_ && this.tech_.poster) { this.poster_ = this.tech_.poster() || ''; @@ -11538,12 +9997,13 @@ var Player = (function (_Component) { * * @param {Boolean} bool Set controls to showing or not * @return {Boolean} Controls are showing - * @method controls */ + Player.prototype.controls = function controls(bool) { if (bool !== undefined) { - bool = !!bool; // force boolean + bool = !!bool; + // Don't trigger a change event unless it actually changed if (this.controls_ !== bool) { this.controls_ = bool; @@ -11585,12 +10045,13 @@ var Player = (function (_Component) { * @param {Boolean} bool True signals that native controls are on * @return {Player} Returns the player * @private - * @method usingNativeControls */ + Player.prototype.usingNativeControls = function usingNativeControls(bool) { if (bool !== undefined) { - bool = !!bool; // force boolean + bool = !!bool; + // Don't trigger a change event unless it actually changed if (this.usingNativeControls_ !== bool) { this.usingNativeControls_ = bool; @@ -11631,9 +10092,9 @@ var Player = (function (_Component) { * @param {*} err A MediaError or a String/Number to be turned into a MediaError * @return {MediaError|null} when getting * @return {Player} when setting - * @method error */ + Player.prototype.error = function error(err) { if (err === undefined) { return this.error_ || null; @@ -11643,23 +10104,20 @@ var Player = (function (_Component) { if (err === null) { this.error_ = err; this.removeClass('vjs-error'); - this.errorDisplay.close(); + if (this.errorDisplay) { + this.errorDisplay.close(); + } return this; } - // error instance - if (err instanceof _mediaErrorJs2['default']) { - this.error_ = err; - } else { - this.error_ = new _mediaErrorJs2['default'](err); - } + this.error_ = new _mediaError2['default'](err); // add the vjs-error classname to the player this.addClass('vjs-error'); // log the name of the error type and any message // ie8 just logs "[object object]" if you just log the error object - _utilsLogJs2['default'].error('(CODE:' + this.error_.code + ' ' + _mediaErrorJs2['default'].errorTypes[this.error_.code] + ')', this.error_.message, this.error_); + _log2['default'].error('(CODE:' + this.error_.code + ' ' + _mediaError2['default'].errorTypes[this.error_.code] + ')', this.error_.message, this.error_); // fire an error event on the player this.trigger('error'); @@ -11667,47 +10125,13 @@ var Player = (function (_Component) { return this; }; - /** - * Returns whether or not the player is in the "ended" state. - * - * @return {Boolean} True if the player is in the ended state, false if not. - * @method ended - */ - - Player.prototype.ended = function ended() { - return this.techGet_('ended'); - }; - - /** - * Returns whether or not the player is in the "seeking" state. - * - * @return {Boolean} True if the player is in the seeking state, false if not. - * @method seeking - */ - - Player.prototype.seeking = function seeking() { - return this.techGet_('seeking'); - }; - - /** - * Returns the TimeRanges of the media that are currently available - * for seeking to. - * - * @return {TimeRanges} the seekable intervals of the media timeline - * @method seekable - */ - - Player.prototype.seekable = function seekable() { - return this.techGet_('seekable'); - }; - /** * Report user activity * * @param {Object} event Event object - * @method reportUserActivity */ + Player.prototype.reportUserActivity = function reportUserActivity(event) { this.userActivity_ = true; }; @@ -11717,9 +10141,9 @@ var Player = (function (_Component) { * * @param {Boolean} bool Value when setting * @return {Boolean} Value if user is active user when getting - * @method userActive */ + Player.prototype.userActive = function userActive(bool) { if (bool !== undefined) { bool = !!bool; @@ -11766,14 +10190,13 @@ var Player = (function (_Component) { * Listen for user activity based on timeout value * * @private - * @method listenForUserActivity_ */ - Player.prototype.listenForUserActivity_ = function listenForUserActivity_() { - var mouseInProgress = undefined, - lastMoveX = undefined, - lastMoveY = undefined; + Player.prototype.listenForUserActivity_ = function listenForUserActivity_() { + var mouseInProgress = void 0; + var lastMoveX = void 0; + var lastMoveY = void 0; var handleActivity = Fn.bind(this, this.reportUserActivity); var handleMouseMove = function handleMouseMove(e) { @@ -11819,8 +10242,9 @@ var Player = (function (_Component) { // `this.reportUserActivity` simply sets this.userActivity_ to true, which // then gets picked up by this loop // http://ejohn.org/blog/learning-from-twitter/ - var inactivityTimeout = undefined; - var activityCheck = this.setInterval(function () { + var inactivityTimeout = void 0; + + this.setInterval(function () { // Check to see if mouse/touch activity has happened if (this.userActivity_) { // Reset the activity tracker @@ -11832,13 +10256,14 @@ var Player = (function (_Component) { // Clear any existing inactivity timeout to start the timer over this.clearTimeout(inactivityTimeout); - var timeout = this.options_['inactivityTimeout']; + var timeout = this.options_.inactivityTimeout; + if (timeout > 0) { // In milliseconds, if no more activity has occurred the // user will be considered inactive inactivityTimeout = this.setTimeout(function () { // Protect against the case where the inactivityTimeout can trigger just - // before the next user activity is picked up by the activityCheck loop + // before the next user activity is picked up by the activity check loop // causing a flicker if (!this.userActivity_) { this.userActive(false); @@ -11858,20 +10283,19 @@ var Player = (function (_Component) { * @param {Number} rate New playback rate to set. * @return {Number} Returns the new playback rate when setting * @return {Number} Returns the current playback rate when getting - * @method playbackRate */ + Player.prototype.playbackRate = function playbackRate(rate) { if (rate !== undefined) { this.techCall_('setPlaybackRate', rate); return this; } - if (this.tech_ && this.tech_['featuresPlaybackRate']) { + if (this.tech_ && this.tech_.featuresPlaybackRate) { return this.techGet_('playbackRate'); - } else { - return 1.0; } + return 1.0; }; /** @@ -11881,9 +10305,9 @@ var Player = (function (_Component) { * @return {Boolean} Returns true if player is audio, false if not when getting * @return {Player} Returns the player if setting * @private - * @method isAudio */ + Player.prototype.isAudio = function isAudio(bool) { if (bool !== undefined) { this.isAudio_ = !!bool; @@ -11894,100 +10318,91 @@ var Player = (function (_Component) { }; /** - * Returns the current state of network activity for the element, from - * the codes in the list below. - * - NETWORK_EMPTY (numeric value 0) - * The element has not yet been initialised. All attributes are in - * their initial states. - * - NETWORK_IDLE (numeric value 1) - * The element's resource selection algorithm is active and has - * selected a resource, but it is not actually using the network at - * this time. - * - NETWORK_LOADING (numeric value 2) - * The user agent is actively trying to download data. - * - NETWORK_NO_SOURCE (numeric value 3) - * The element's resource selection algorithm is active, but it has - * not yet found a resource to use. + * Get a video track list + * @link https://html.spec.whatwg.org/multipage/embedded-content.html#videotracklist * - * @see https://html.spec.whatwg.org/multipage/embedded-content.html#network-states - * @return {Number} the current network activity state - * @method networkState + * @return {VideoTrackList} thes current video track list */ - Player.prototype.networkState = function networkState() { - return this.techGet_('networkState'); + + Player.prototype.videoTracks = function videoTracks() { + // if we have not yet loadTech_, we create videoTracks_ + // these will be passed to the tech during loading + if (!this.tech_) { + this.videoTracks_ = this.videoTracks_ || new _videoTrackList2['default'](); + return this.videoTracks_; + } + + return this.tech_.videoTracks(); }; /** - * Returns a value that expresses the current state of the element - * with respect to rendering the current playback position, from the - * codes in the list below. - * - HAVE_NOTHING (numeric value 0) - * No information regarding the media resource is available. - * - HAVE_METADATA (numeric value 1) - * Enough of the resource has been obtained that the duration of the - * resource is available. - * - HAVE_CURRENT_DATA (numeric value 2) - * Data for the immediate current playback position is available. - * - HAVE_FUTURE_DATA (numeric value 3) - * Data for the immediate current playback position is available, as - * well as enough data for the user agent to advance the current - * playback position in the direction of playback. - * - HAVE_ENOUGH_DATA (numeric value 4) - * The user agent estimates that enough data is available for - * playback to proceed uninterrupted. + * Get an audio track list + * @link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist * - * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate - * @return {Number} the current playback rendering state - * @method readyState + * @return {AudioTrackList} thes current audio track list */ - Player.prototype.readyState = function readyState() { - return this.techGet_('readyState'); + + Player.prototype.audioTracks = function audioTracks() { + // if we have not yet loadTech_, we create videoTracks_ + // these will be passed to the tech during loading + if (!this.tech_) { + this.audioTracks_ = this.audioTracks_ || new _audioTrackList2['default'](); + return this.audioTracks_; + } + + return this.tech_.audioTracks(); }; - /* - * Text tracks are tracks of timed text events. - * Captions - text displayed over the video for the hearing impaired - * Subtitles - text displayed over the video for those who don't understand language in the video - * Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video - * Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device - */ + /** + * Text tracks are tracks of timed text events. + * Captions - text displayed over the video for the hearing impaired + * Subtitles - text displayed over the video for those who don't understand language in the video + * Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video + * Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device + */ /** * Get an array of associated text tracks. captions, subtitles, chapters, descriptions * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks * * @return {Array} Array of track objects - * @method textTracks */ + Player.prototype.textTracks = function textTracks() { // cannot use techGet_ directly because it checks to see whether the tech is ready. // Flash is unlikely to be ready in time but textTracks should still work. - return this.tech_ && this.tech_['textTracks'](); + if (this.tech_) { + return this.tech_.textTracks(); + } }; /** * Get an array of remote text tracks * * @return {Array} - * @method remoteTextTracks */ + Player.prototype.remoteTextTracks = function remoteTextTracks() { - return this.tech_ && this.tech_['remoteTextTracks'](); + if (this.tech_) { + return this.tech_.remoteTextTracks(); + } }; /** * Get an array of remote html track elements * * @return {HTMLTrackElement[]} - * @method remoteTextTrackEls */ + Player.prototype.remoteTextTrackEls = function remoteTextTrackEls() { - return this.tech_ && this.tech_['remoteTextTrackEls'](); + if (this.tech_) { + return this.tech_.remoteTextTrackEls(); + } }; /** @@ -11998,42 +10413,61 @@ var Player = (function (_Component) { * @param {String} kind Captions, subtitles, chapters, descriptions, or metadata * @param {String=} label Optional label * @param {String=} language Optional language - * @method addTextTrack */ + Player.prototype.addTextTrack = function addTextTrack(kind, label, language) { - return this.tech_ && this.tech_['addTextTrack'](kind, label, language); + if (this.tech_) { + return this.tech_.addTextTrack(kind, label, language); + } }; /** - * Add a remote text track + * Creates a remote text track object and returns an html track element. * - * @param {Object} options Options for remote text track - * @method addRemoteTextTrack + * @param {Object} options The object should contain values for + * kind, language, label, and src (location of the WebVTT file) + * @param {Boolean} [manualCleanup=true] if set to false, the TextTrack will be + * automatically removed from the video element whenever the source changes + * @return {HTMLTrackElement} An Html Track Element. + * This can be an emulated {@link HTMLTrackElement} or a native one. + * @deprecated The default value of the "manualCleanup" parameter will default + * to "false" in upcoming versions of Video.js */ - Player.prototype.addRemoteTextTrack = function addRemoteTextTrack(options) { - return this.tech_ && this.tech_['addRemoteTextTrack'](options); + + Player.prototype.addRemoteTextTrack = function addRemoteTextTrack(options, manualCleanup) { + if (this.tech_) { + return this.tech_.addRemoteTextTrack(options, manualCleanup); + } }; /** * Remove a remote text track * * @param {Object} track Remote text track to remove - * @method removeRemoteTextTrack */ + // destructure the input into an object with a track argument, defaulting to arguments[0] + // default the whole argument to an empty object if nothing was passed in - Player.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) { - this.tech_ && this.tech_['removeRemoteTextTrack'](track); + + Player.prototype.removeRemoteTextTrack = function removeRemoteTextTrack() { + var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref3$track = _ref3.track, + track = _ref3$track === undefined ? arguments[0] : _ref3$track; + + if (this.tech_) { + return this.tech_.removeRemoteTextTrack(track); + } }; /** * Get video width * * @return {Number} Video width - * @method videoWidth */ + Player.prototype.videoWidth = function videoWidth() { return this.tech_ && this.tech_.videoWidth && this.tech_.videoWidth() || 0; }; @@ -12042,21 +10476,19 @@ var Player = (function (_Component) { * Get video height * * @return {Number} Video height - * @method videoHeight */ + Player.prototype.videoHeight = function videoHeight() { return this.tech_ && this.tech_.videoHeight && this.tech_.videoHeight() || 0; }; // Methods to add support for - // initialTime: function(){ return this.techCall_('initialTime'); }, - // startOffsetTime: function(){ return this.techCall_('startOffsetTime'); }, - // played: function(){ return this.techCall_('played'); }, - // videoTracks: function(){ return this.techCall_('videoTracks'); }, - // audioTracks: function(){ return this.techCall_('audioTracks'); }, - // defaultPlaybackRate: function(){ return this.techCall_('defaultPlaybackRate'); }, - // defaultMuted: function(){ return this.techCall_('defaultMuted'); } + // initialTime: function() { return this.techCall_('initialTime'); }, + // startOffsetTime: function() { return this.techCall_('startOffsetTime'); }, + // played: function() { return this.techCall_('played'); }, + // defaultPlaybackRate: function() { return this.techCall_('defaultPlaybackRate'); }, + // defaultMuted: function() { return this.techCall_('defaultMuted'); } /** * The player's language code @@ -12067,15 +10499,15 @@ var Player = (function (_Component) { * @param {String} code The locale string * @return {String} The locale string when getting * @return {Player} self when setting - * @method language */ + Player.prototype.language = function language(code) { if (code === undefined) { return this.language_; } - this.language_ = ('' + code).toLowerCase(); + this.language_ = String(code).toLowerCase(); return this; }; @@ -12085,22 +10517,22 @@ var Player = (function (_Component) { * Languages specified directly in the player options have precedence * * @return {Array} Array of languages - * @method languages */ + Player.prototype.languages = function languages() { - return _utilsMergeOptionsJs2['default'](Player.prototype.options_.languages, this.languages_); + return (0, _mergeOptions2['default'])(Player.prototype.options_.languages, this.languages_); }; /** * Converts track info to JSON * * @return {Object} JSON object of options - * @method toJSON */ + Player.prototype.toJSON = function toJSON() { - var options = _utilsMergeOptionsJs2['default'](this.options_); + var options = (0, _mergeOptions2['default'])(this.options_); var tracks = options.tracks; options.tracks = []; @@ -12109,7 +10541,7 @@ var Player = (function (_Component) { var track = tracks[i]; // deep merge tracks and null out player so no circular references - track = _utilsMergeOptionsJs2['default'](track); + track = (0, _mergeOptions2['default'])(track); track.player = undefined; options.tracks[i] = track; } @@ -12134,17 +10566,18 @@ var Player = (function (_Component) { * @return {ModalDialog} */ + Player.prototype.createModal = function createModal(content, options) { - var player = this; + var _this5 = this; options = options || {}; options.content = content || ''; - var modal = new _modalDialog2['default'](player, options); + var modal = new _modalDialog2['default'](this, options); - player.addChild(modal); + this.addChild(modal); modal.on('dispose', function () { - player.removeChild(modal); + _this5.removeChild(modal); }); return modal.open(); @@ -12156,34 +10589,37 @@ var Player = (function (_Component) { * @param {Element} tag The player tag * @return {Array} An array of sources and track objects * @static - * @method getTagSettings */ + Player.getTagSettings = function getTagSettings(tag) { var baseOptions = { - 'sources': [], - 'tracks': [] + sources: [], + tracks: [] }; var tagOptions = Dom.getElAttributes(tag); var dataSetup = tagOptions['data-setup']; + if (Dom.hasElClass(tag, 'vjs-fluid')) { + tagOptions.fluid = true; + } + // Check if data-setup attr exists. if (dataSetup !== null) { // Parse options JSON - - var _safeParseTuple = _safeJsonParseTuple2['default'](dataSetup || '{}'); - - var err = _safeParseTuple[0]; - var data = _safeParseTuple[1]; + // If empty string, make it a parsable json object. + var _safeParseTuple = (0, _tuple2['default'])(dataSetup || '{}'), + err = _safeParseTuple[0], + data = _safeParseTuple[1]; if (err) { - _utilsLogJs2['default'].error(err); + _log2['default'].error(err); } - _objectAssign2['default'](tagOptions, data); + (0, _object2['default'])(tagOptions, data); } - _objectAssign2['default'](baseOptions, tagOptions); + (0, _object2['default'])(baseOptions, tagOptions); // Get tag children settings if (tag.hasChildNodes()) { @@ -12193,6 +10629,7 @@ var Player = (function (_Component) { var child = children[i]; // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/ var childName = child.nodeName.toLowerCase(); + if (childName === 'source') { baseOptions.sources.push(Dom.getElAttributes(child)); } else if (childName === 'track') { @@ -12204,12 +10641,37 @@ var Player = (function (_Component) { return baseOptions; }; + /** + * Determine wether or not flexbox is supported + * + * @return {Boolean} wether or not flexbox is supported + */ + + + Player.prototype.flexNotSupported_ = function flexNotSupported_() { + var elem = _document2['default'].createElement('i'); + + // Note: We don't actually use flexBasis (or flexOrder), but it's one of the more + // common flex features that we can rely on when checking for flex support. + return !('flexBasis' in elem.style || 'webkitFlexBasis' in elem.style || 'mozFlexBasis' in elem.style || 'msFlexBasis' in elem.style || + // IE10-specific (2012 flex spec) + 'msFlexOrder' in elem.style); + }; + return Player; -})(_componentJs2['default']); +}(_component2['default']); + +/* + * Global player list + * + * @type {Object} + */ + Player.players = {}; -var navigator = _globalWindow2['default'].navigator; +var navigator = _window2['default'].navigator; + /* * Player instance options, surfaced using options * options = Player.prototype.options_ @@ -12227,7 +10689,7 @@ Player.prototype.options_ = { flash: {}, // defaultVolume: 0.85, - defaultVolume: 0.00, // The freakin seaguls are driving me crazy! + defaultVolume: 0.00, // default inactivity timeout inactivityTimeout: 2000, @@ -12240,7 +10702,7 @@ Player.prototype.options_ = { // Included control sets children: ['mediaLoader', 'posterImage', 'textTrackDisplay', 'loadingSpinner', 'bigPlayButton', 'controlBar', 'errorDisplay', 'textTrackSettings'], - language: _globalDocument2['default'].getElementsByTagName('html')[0].getAttribute('lang') || navigator.languages && navigator.languages[0] || navigator.userLanguage || navigator.language || 'en', + language: navigator && (navigator.languages && navigator.languages[0] || navigator.userLanguage || navigator.language) || 'en', // locales and their language translations languages: {}, @@ -12249,33 +10711,125 @@ Player.prototype.options_ = { notSupportedMessage: 'No compatible source was found for this media.' }; +[ +/** + * Returns whether or not the player is in the "ended" state. + * + * @return {Boolean} True if the player is in the ended state, false if not. + * @method Player.prototype.ended + */ +'ended', +/** + * Returns whether or not the player is in the "seeking" state. + * + * @return {Boolean} True if the player is in the seeking state, false if not. + * @method Player.prototype.seeking + */ +'seeking', +/** + * Returns the TimeRanges of the media that are currently available + * for seeking to. + * + * @return {TimeRanges} the seekable intervals of the media timeline + * @method Player.prototype.seekable + */ +'seekable', +/** + * Returns the current state of network activity for the element, from + * the codes in the list below. + * - NETWORK_EMPTY (numeric value 0) + * The element has not yet been initialised. All attributes are in + * their initial states. + * - NETWORK_IDLE (numeric value 1) + * The element's resource selection algorithm is active and has + * selected a resource, but it is not actually using the network at + * this time. + * - NETWORK_LOADING (numeric value 2) + * The user agent is actively trying to download data. + * - NETWORK_NO_SOURCE (numeric value 3) + * The element's resource selection algorithm is active, but it has + * not yet found a resource to use. + * + * @see https://html.spec.whatwg.org/multipage/embedded-content.html#network-states + * @return {Number} the current network activity state + * @method Player.prototype.networkState + */ +'networkState', +/** + * Returns a value that expresses the current state of the element + * with respect to rendering the current playback position, from the + * codes in the list below. + * - HAVE_NOTHING (numeric value 0) + * No information regarding the media resource is available. + * - HAVE_METADATA (numeric value 1) + * Enough of the resource has been obtained that the duration of the + * resource is available. + * - HAVE_CURRENT_DATA (numeric value 2) + * Data for the immediate current playback position is available. + * - HAVE_FUTURE_DATA (numeric value 3) + * Data for the immediate current playback position is available, as + * well as enough data for the user agent to advance the current + * playback position in the direction of playback. + * - HAVE_ENOUGH_DATA (numeric value 4) + * The user agent estimates that enough data is available for + * playback to proceed uninterrupted. + * + * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate + * @return {Number} the current playback rendering state + * @method Player.prototype.readyState + */ +'readyState'].forEach(function (fn) { + Player.prototype[fn] = function () { + return this.techGet_(fn); + }; +}); + +TECH_EVENTS_RETRIGGER.forEach(function (event) { + Player.prototype['handleTech' + (0, _toTitleCase2['default'])(event) + '_'] = function () { + return this.trigger(event); + }; +}); + +/* document methods */ /** * Fired when the player has initial duration and dimension information * * @event loadedmetadata + * @private + * @method Player.prototype.handleLoadedMetaData_ + */ + +/** + * Fired when the player receives text data + * + * @event textdata + * @private + * @method Player.prototype.handleTextData_ */ -Player.prototype.handleLoadedMetaData_; /** * Fired when the player has downloaded data at the current playback position * * @event loadeddata + * @private + * @method Player.prototype.handleLoadedData_ */ -Player.prototype.handleLoadedData_; /** * Fired when the user is active, e.g. moves the mouse over the player * * @event useractive + * @private + * @method Player.prototype.handleUserActive_ */ -Player.prototype.handleUserActive_; /** * Fired when the user is inactive, e.g. a short delay after the last mouse move or control interaction * * @event userinactive + * @private + * @method Player.prototype.handleUserInactive_ */ -Player.prototype.handleUserInactive_; /** * Fired when the current playback position has changed * @@ -12283,56 +10837,39 @@ Player.prototype.handleUserInactive_; * playback technology in use. * * @event timeupdate + * @private + * @method Player.prototype.handleTimeUpdate_ */ -Player.prototype.handleTimeUpdate_; - -/** - * Fired when video playback ends - * - * @event ended - */ -Player.prototype.handleTechEnded_; /** * Fired when the volume changes * * @event volumechange + * @private + * @method Player.prototype.handleVolumeChange_ */ -Player.prototype.handleVolumeChange_; /** * Fired when an error occurs * * @event error + * @private + * @method Player.prototype.handleError_ */ -Player.prototype.handleError_; - -Player.prototype.flexNotSupported_ = function () { - var elem = _globalDocument2['default'].createElement('i'); - - // Note: We don't actually use flexBasis (or flexOrder), but it's one of the more - // common flex features that we can rely on when checking for flex support. - return !('flexBasis' in elem.style || 'webkitFlexBasis' in elem.style || 'mozFlexBasis' in elem.style || 'msFlexBasis' in elem.style || 'msFlexOrder' in elem.style) /* IE10-specific (2012 flex spec) */; -}; -_componentJs2['default'].registerComponent('Player', Player); +_component2['default'].registerComponent('Player', Player); exports['default'] = Player; -module.exports = exports['default']; -// If empty string, make it a parsable json object. -},{"./big-play-button.js":63,"./component.js":67,"./control-bar/control-bar.js":68,"./error-display.js":98,"./fullscreen-api.js":101,"./loading-spinner.js":102,"./media-error.js":103,"./modal-dialog":107,"./poster-image.js":112,"./tech/html5.js":117,"./tech/loader.js":118,"./tech/tech.js":119,"./tracks/text-track-display.js":123,"./tracks/text-track-list-converter.js":125,"./tracks/text-track-settings.js":127,"./utils/browser.js":129,"./utils/buffer.js":130,"./utils/dom.js":132,"./utils/events.js":133,"./utils/fn.js":134,"./utils/guid.js":136,"./utils/log.js":137,"./utils/merge-options.js":138,"./utils/stylesheet.js":139,"./utils/time-ranges.js":140,"./utils/to-title-case.js":141,"global/document":1,"global/window":2,"object.assign":45,"safe-json-parse/tuple":54}],109:[function(_dereq_,module,exports){ -/** - * @file plugins.js - */ +},{"1":1,"139":139,"148":148,"4":4,"41":41,"44":44,"45":45,"46":46,"5":5,"50":50,"55":55,"60":60,"61":61,"62":62,"63":63,"64":64,"69":69,"70":70,"72":72,"77":77,"79":79,"8":8,"80":80,"82":82,"83":83,"84":84,"86":86,"87":87,"88":88,"90":90,"91":91,"92":92,"95":95,"96":96}],52:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _player = _dereq_(51); -var _playerJs = _dereq_('./player.js'); +var _player2 = _interopRequireDefault(_player); -var _playerJs2 = _interopRequireDefault(_playerJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } /** * The method for registering a video.js plugin @@ -12342,51 +10879,35 @@ var _playerJs2 = _interopRequireDefault(_playerJs); * @method plugin */ var plugin = function plugin(name, init) { - _playerJs2['default'].prototype[name] = init; -}; - + _player2['default'].prototype[name] = init; +}; /** + * @file plugins.js + */ exports['default'] = plugin; -module.exports = exports['default']; -},{"./player.js":108}],110:[function(_dereq_,module,exports){ -/** - * @file popup-button.js - */ +},{"51":51}],53:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _clickableComponentJs = _dereq_('../clickable-component.js'); +var _clickableComponent = _dereq_(3); -var _clickableComponentJs2 = _interopRequireDefault(_clickableComponentJs); +var _clickableComponent2 = _interopRequireDefault(_clickableComponent); -var _componentJs = _dereq_('../component.js'); +var _component = _dereq_(5); -var _componentJs2 = _interopRequireDefault(_componentJs); - -var _popupJs = _dereq_('./popup.js'); - -var _popupJs2 = _interopRequireDefault(_popupJs); - -var _utilsDomJs = _dereq_('../utils/dom.js'); +var _component2 = _interopRequireDefault(_component); -var Dom = _interopRequireWildcard(_utilsDomJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _utilsFnJs = _dereq_('../utils/fn.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var Fn = _interopRequireWildcard(_utilsFnJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _utilsToTitleCaseJs = _dereq_('../utils/to-title-case.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file popup-button.js + */ -var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs); /** * A button class with a popup control @@ -12396,18 +10917,18 @@ var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs); * @extends ClickableComponent * @class PopupButton */ - -var PopupButton = (function (_ClickableComponent) { +var PopupButton = function (_ClickableComponent) { _inherits(PopupButton, _ClickableComponent); function PopupButton(player) { - var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; _classCallCheck(this, PopupButton); - _ClickableComponent.call(this, player, options); + var _this = _possibleConstructorReturn(this, _ClickableComponent.call(this, player, options)); - this.update(); + _this.update(); + return _this; } /** @@ -12416,6 +10937,7 @@ var PopupButton = (function (_ClickableComponent) { * @method update */ + PopupButton.prototype.update = function update() { var popup = this.createPopup(); @@ -12440,6 +10962,7 @@ var PopupButton = (function (_ClickableComponent) { * @method createPopup */ + PopupButton.prototype.createPopup = function createPopup() {}; /** @@ -12449,6 +10972,7 @@ var PopupButton = (function (_ClickableComponent) { * @method createEl */ + PopupButton.prototype.createEl = function createEl() { return _ClickableComponent.prototype.createEl.call(this, 'div', { className: this.buildCSSClass() @@ -12462,6 +10986,7 @@ var PopupButton = (function (_ClickableComponent) { * @method buildCSSClass */ + PopupButton.prototype.buildCSSClass = function buildCSSClass() { var menuButtonClass = 'vjs-menu-button'; @@ -12476,43 +11001,44 @@ var PopupButton = (function (_ClickableComponent) { }; return PopupButton; -})(_clickableComponentJs2['default']); +}(_clickableComponent2['default']); -_componentJs2['default'].registerComponent('PopupButton', PopupButton); +_component2['default'].registerComponent('PopupButton', PopupButton); exports['default'] = PopupButton; -module.exports = exports['default']; -},{"../clickable-component.js":65,"../component.js":67,"../utils/dom.js":132,"../utils/fn.js":134,"../utils/to-title-case.js":141,"./popup.js":111}],111:[function(_dereq_,module,exports){ -/** - * @file popup.js - */ +},{"3":3,"5":5}],54:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _component = _dereq_(5); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _component2 = _interopRequireDefault(_component); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _dom = _dereq_(82); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var Dom = _interopRequireWildcard(_dom); -var _componentJs = _dereq_('../component.js'); +var _fn = _dereq_(84); -var _componentJs2 = _interopRequireDefault(_componentJs); +var Fn = _interopRequireWildcard(_fn); -var _utilsDomJs = _dereq_('../utils/dom.js'); +var _events = _dereq_(83); -var Dom = _interopRequireWildcard(_utilsDomJs); +var Events = _interopRequireWildcard(_events); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _utilsFnJs = _dereq_('../utils/fn.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var Fn = _interopRequireWildcard(_utilsFnJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _utilsEventsJs = _dereq_('../utils/events.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file popup.js + */ -var Events = _interopRequireWildcard(_utilsEventsJs); /** * The Popup component is used to build pop up controls. @@ -12520,14 +11046,13 @@ var Events = _interopRequireWildcard(_utilsEventsJs); * @extends Component * @class Popup */ - -var Popup = (function (_Component) { +var Popup = function (_Component) { _inherits(Popup, _Component); function Popup() { _classCallCheck(this, Popup); - _Component.apply(this, arguments); + return _possibleConstructorReturn(this, _Component.apply(this, arguments)); } /** @@ -12536,7 +11061,6 @@ var Popup = (function (_Component) { * @param {Object|String} component Component or component type to add * @method addItem */ - Popup.prototype.addItem = function addItem(component) { this.addChild(component); component.on('click', Fn.bind(this, function () { @@ -12551,15 +11075,19 @@ var Popup = (function (_Component) { * @method createEl */ + Popup.prototype.createEl = function createEl() { var contentElType = this.options_.contentElType || 'ul'; + this.contentEl_ = Dom.createEl(contentElType, { className: 'vjs-menu-content' }); + var el = _Component.prototype.createEl.call(this, 'div', { append: this.contentEl_, className: 'vjs-menu' }); + el.appendChild(this.contentEl_); // Prevent clicks from bubbling up. Needed for Popup Buttons, @@ -12573,47 +11101,48 @@ var Popup = (function (_Component) { }; return Popup; -})(_componentJs2['default']); +}(_component2['default']); -_componentJs2['default'].registerComponent('Popup', Popup); +_component2['default'].registerComponent('Popup', Popup); exports['default'] = Popup; -module.exports = exports['default']; -},{"../component.js":67,"../utils/dom.js":132,"../utils/events.js":133,"../utils/fn.js":134}],112:[function(_dereq_,module,exports){ -/** - * @file poster-image.js - */ +},{"5":5,"82":82,"83":83,"84":84}],55:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _clickableComponent = _dereq_(3); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _clickableComponent2 = _interopRequireDefault(_clickableComponent); + +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _fn = _dereq_(84); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var Fn = _interopRequireWildcard(_fn); -var _clickableComponentJs = _dereq_('./clickable-component.js'); +var _dom = _dereq_(82); -var _clickableComponentJs2 = _interopRequireDefault(_clickableComponentJs); +var Dom = _interopRequireWildcard(_dom); -var _componentJs = _dereq_('./component.js'); +var _browser = _dereq_(79); -var _componentJs2 = _interopRequireDefault(_componentJs); +var browser = _interopRequireWildcard(_browser); -var _utilsFnJs = _dereq_('./utils/fn.js'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var Fn = _interopRequireWildcard(_utilsFnJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _utilsDomJs = _dereq_('./utils/dom.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var Dom = _interopRequireWildcard(_utilsDomJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _utilsBrowserJs = _dereq_('./utils/browser.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file poster-image.js + */ -var browser = _interopRequireWildcard(_utilsBrowserJs); /** * The component that handles showing the poster image. @@ -12623,17 +11152,17 @@ var browser = _interopRequireWildcard(_utilsBrowserJs); * @extends Button * @class PosterImage */ - -var PosterImage = (function (_ClickableComponent) { +var PosterImage = function (_ClickableComponent) { _inherits(PosterImage, _ClickableComponent); function PosterImage(player, options) { _classCallCheck(this, PosterImage); - _ClickableComponent.call(this, player, options); + var _this = _possibleConstructorReturn(this, _ClickableComponent.call(this, player, options)); - this.update(); - player.on('posterchange', Fn.bind(this, this.update)); + _this.update(); + player.on('posterchange', Fn.bind(_this, _this.update)); + return _this; } /** @@ -12642,6 +11171,7 @@ var PosterImage = (function (_ClickableComponent) { * @method dispose */ + PosterImage.prototype.dispose = function dispose() { this.player().off('posterchange', this.update); _ClickableComponent.prototype.dispose.call(this); @@ -12654,6 +11184,7 @@ var PosterImage = (function (_ClickableComponent) { * @method createEl */ + PosterImage.prototype.createEl = function createEl() { var el = Dom.createEl('div', { className: 'vjs-poster', @@ -12680,6 +11211,7 @@ var PosterImage = (function (_ClickableComponent) { * @method update */ + PosterImage.prototype.update = function update() { var url = this.player().poster(); @@ -12701,11 +11233,13 @@ var PosterImage = (function (_ClickableComponent) { * @method setSrc */ + PosterImage.prototype.setSrc = function setSrc(url) { if (this.fallbackImg_) { this.fallbackImg_.src = url; } else { var backgroundImage = ''; + // Any falsey values should stay as an empty string, otherwise // this will throw an extra error if (url) { @@ -12722,6 +11256,7 @@ var PosterImage = (function (_ClickableComponent) { * @method handleClick */ + PosterImage.prototype.handleClick = function handleClick() { // We don't want a click to trigger playback when controls are disabled // but CSS should be hiding the poster to prevent that from happening @@ -12733,41 +11268,41 @@ var PosterImage = (function (_ClickableComponent) { }; return PosterImage; -})(_clickableComponentJs2['default']); +}(_clickableComponent2['default']); -_componentJs2['default'].registerComponent('PosterImage', PosterImage); +_component2['default'].registerComponent('PosterImage', PosterImage); exports['default'] = PosterImage; -module.exports = exports['default']; -},{"./clickable-component.js":65,"./component.js":67,"./utils/browser.js":129,"./utils/dom.js":132,"./utils/fn.js":134}],113:[function(_dereq_,module,exports){ -/** - * @file setup.js - * - * Functions for automatically setting up a player - * based on the data-setup attribute of the video tag - */ +},{"3":3,"5":5,"79":79,"82":82,"84":84}],56:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; +exports.hasLoaded = exports.autoSetupTimeout = exports.autoSetup = undefined; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _events = _dereq_(83); -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var Events = _interopRequireWildcard(_events); -var _utilsEventsJs = _dereq_('./utils/events.js'); +var _document = _dereq_(95); -var Events = _interopRequireWildcard(_utilsEventsJs); +var _document2 = _interopRequireDefault(_document); -var _globalDocument = _dereq_('global/document'); +var _window = _dereq_(96); -var _globalDocument2 = _interopRequireDefault(_globalDocument); +var _window2 = _interopRequireDefault(_window); -var _globalWindow = _dereq_('global/window'); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var _globalWindow2 = _interopRequireDefault(_globalWindow); +var _windowLoaded = false; /** + * @file setup.js + * + * Functions for automatically setting up a player + * based on the data-setup attribute of the video tag + */ -var _windowLoaded = false; -var videojs = undefined; +var videojs = void 0; // Automatically set up any tags that have a data-setup attribute var autoSetup = function autoSetup() { @@ -12776,70 +11311,73 @@ var autoSetup = function autoSetup() { // var audios = Array.prototype.slice.call(document.getElementsByTagName('audio')); // var mediaEls = vids.concat(audios); - // Because IE8 doesn't support calling slice on a node list, we need to loop through each list of elements - // to build up a new, combined list of elements. - var vids = _globalDocument2['default'].getElementsByTagName('video'); - var audios = _globalDocument2['default'].getElementsByTagName('audio'); + // Because IE8 doesn't support calling slice on a node list, we need to loop + // through each list of elements to build up a new, combined list of elements. + var vids = _document2['default'].getElementsByTagName('video'); + var audios = _document2['default'].getElementsByTagName('audio'); var mediaEls = []; + if (vids && vids.length > 0) { for (var i = 0, e = vids.length; i < e; i++) { mediaEls.push(vids[i]); } } + if (audios && audios.length > 0) { - for (var i = 0, e = audios.length; i < e; i++) { - mediaEls.push(audios[i]); + for (var _i = 0, _e = audios.length; _i < _e; _i++) { + mediaEls.push(audios[_i]); } } // Check if any media elements exist if (mediaEls && mediaEls.length > 0) { - for (var i = 0, e = mediaEls.length; i < e; i++) { - var mediaEl = mediaEls[i]; + for (var _i2 = 0, _e2 = mediaEls.length; _i2 < _e2; _i2++) { + var mediaEl = mediaEls[_i2]; // Check if element exists, has getAttribute func. - // IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately. + // IE seems to consider typeof el.getAttribute == 'object' instead of + // 'function' like expected, at least when loading the player immediately. if (mediaEl && mediaEl.getAttribute) { // Make sure this player hasn't already been set up. - if (mediaEl['player'] === undefined) { + if (mediaEl.player === undefined) { var options = mediaEl.getAttribute('data-setup'); // Check if data-setup attr exists. // We only auto-setup if they've added the data-setup attr. if (options !== null) { // Create new video.js instance. - var player = videojs(mediaEl); + videojs(mediaEl); } } // If getAttribute isn't defined, we need to wait for the DOM. } else { - autoSetupTimeout(1); - break; - } + autoSetupTimeout(1); + break; + } } // No videos were found, so keep looping unless page is finished loading. } else if (!_windowLoaded) { - autoSetupTimeout(1); - } + autoSetupTimeout(1); + } }; // Pause to let the DOM keep processing -var autoSetupTimeout = function autoSetupTimeout(wait, vjs) { +function autoSetupTimeout(wait, vjs) { if (vjs) { videojs = vjs; } setTimeout(autoSetup, wait); -}; +} -if (_globalDocument2['default'].readyState === 'complete') { +if (_document2['default'].readyState === 'complete') { _windowLoaded = true; } else { - Events.one(_globalWindow2['default'], 'load', function () { + Events.one(_window2['default'], 'load', function () { _windowLoaded = true; }); } @@ -12852,37 +11390,35 @@ exports.autoSetup = autoSetup; exports.autoSetupTimeout = autoSetupTimeout; exports.hasLoaded = hasLoaded; -},{"./utils/events.js":133,"global/document":1,"global/window":2}],114:[function(_dereq_,module,exports){ -/** - * @file slider.js - */ +},{"83":83,"95":95,"96":96}],57:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _component = _dereq_(5); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _component2 = _interopRequireDefault(_component); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _dom = _dereq_(82); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var Dom = _interopRequireWildcard(_dom); -var _componentJs = _dereq_('../component.js'); +var _object = _dereq_(139); -var _componentJs2 = _interopRequireDefault(_componentJs); +var _object2 = _interopRequireDefault(_object); -var _utilsDomJs = _dereq_('../utils/dom.js'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var Dom = _interopRequireWildcard(_utilsDomJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _globalDocument = _dereq_('global/document'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _globalDocument2 = _interopRequireDefault(_globalDocument); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _objectAssign = _dereq_('object.assign'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file slider.js + */ -var _objectAssign2 = _interopRequireDefault(_objectAssign); /** * The base functionality for sliders like the volume bar and seek bar @@ -12892,29 +11428,29 @@ var _objectAssign2 = _interopRequireDefault(_objectAssign); * @extends Component * @class Slider */ - -var Slider = (function (_Component) { +var Slider = function (_Component) { _inherits(Slider, _Component); function Slider(player, options) { _classCallCheck(this, Slider); - _Component.call(this, player, options); - // Set property names to bar to match with the child Slider class is looking for - this.bar = this.getChild(this.options_.barName); + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options)); + + _this.bar = _this.getChild(_this.options_.barName); // Set a horizontal or vertical class on the slider depending on the slider type - this.vertical(!!this.options_.vertical); + _this.vertical(!!_this.options_.vertical); - this.on('mousedown', this.handleMouseDown); - this.on('touchstart', this.handleMouseDown); - this.on('focus', this.handleFocus); - this.on('blur', this.handleBlur); - this.on('click', this.handleClick); + _this.on('mousedown', _this.handleMouseDown); + _this.on('touchstart', _this.handleMouseDown); + _this.on('focus', _this.handleFocus); + _this.on('blur', _this.handleBlur); + _this.on('click', _this.handleClick); - this.on(player, 'controlsvisible', this.update); - this.on(player, this.playerEvent, this.update); + _this.on(player, 'controlsvisible', _this.update); + _this.on(player, _this.playerEvent, _this.update); + return _this; } /** @@ -12926,22 +11462,23 @@ var Slider = (function (_Component) { * @method createEl */ + Slider.prototype.createEl = function createEl(type) { - var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; // Add the slider element class to all sub classes props.className = props.className + ' vjs-slider'; - props = _objectAssign2['default']({ + props = (0, _object2['default'])({ tabIndex: 0 }, props); - attributes = _objectAssign2['default']({ + attributes = (0, _object2['default'])({ 'role': 'slider', 'aria-valuenow': 0, 'aria-valuemin': 0, 'aria-valuemax': 100, - tabIndex: 0 + 'tabIndex': 0 }, attributes); return _Component.prototype.createEl.call(this, type, props, attributes); @@ -12954,17 +11491,20 @@ var Slider = (function (_Component) { * @method handleMouseDown */ + Slider.prototype.handleMouseDown = function handleMouseDown(event) { + var doc = this.bar.el_.ownerDocument; + event.preventDefault(); Dom.blockTextSelection(); this.addClass('vjs-sliding'); this.trigger('slideractive'); - this.on(_globalDocument2['default'], 'mousemove', this.handleMouseMove); - this.on(_globalDocument2['default'], 'mouseup', this.handleMouseUp); - this.on(_globalDocument2['default'], 'touchmove', this.handleMouseMove); - this.on(_globalDocument2['default'], 'touchend', this.handleMouseUp); + this.on(doc, 'mousemove', this.handleMouseMove); + this.on(doc, 'mouseup', this.handleMouseUp); + this.on(doc, 'touchmove', this.handleMouseMove); + this.on(doc, 'touchend', this.handleMouseUp); this.handleMouseMove(event); }; @@ -12975,6 +11515,7 @@ var Slider = (function (_Component) { * @method handleMouseMove */ + Slider.prototype.handleMouseMove = function handleMouseMove() {}; /** @@ -12983,16 +11524,19 @@ var Slider = (function (_Component) { * @method handleMouseUp */ + Slider.prototype.handleMouseUp = function handleMouseUp() { + var doc = this.bar.el_.ownerDocument; + Dom.unblockTextSelection(); this.removeClass('vjs-sliding'); this.trigger('sliderinactive'); - this.off(_globalDocument2['default'], 'mousemove', this.handleMouseMove); - this.off(_globalDocument2['default'], 'mouseup', this.handleMouseUp); - this.off(_globalDocument2['default'], 'touchmove', this.handleMouseMove); - this.off(_globalDocument2['default'], 'touchend', this.handleMouseUp); + this.off(doc, 'mousemove', this.handleMouseMove); + this.off(doc, 'mouseup', this.handleMouseUp); + this.off(doc, 'touchmove', this.handleMouseMove); + this.off(doc, 'touchend', this.handleMouseUp); this.update(); }; @@ -13003,10 +11547,13 @@ var Slider = (function (_Component) { * @method update */ + Slider.prototype.update = function update() { // In VolumeBar init we have a setTimeout for update that pops and update to the end of the // execution stack. The player is destroyed before then update will cause an error - if (!this.el_) return; + if (!this.el_) { + return; + } // If scrubbing, we could use a cached value to make the handle keep up with the user's mouse. // On HTML5 browsers scrubbing is really smooth, but some flash players are slow, so we might want to utilize this later. @@ -13015,7 +11562,9 @@ var Slider = (function (_Component) { var bar = this.bar; // If there's no bar... - if (!bar) return; + if (!bar) { + return; + } // Protect against no duration and other division issues if (typeof progress !== 'number' || progress !== progress || progress < 0 || progress === Infinity) { @@ -13040,8 +11589,10 @@ var Slider = (function (_Component) { * @method calculateDistance */ + Slider.prototype.calculateDistance = function calculateDistance(event) { var position = Dom.getPointerPosition(this.el_, event); + if (this.vertical()) { return position.y; } @@ -13054,8 +11605,9 @@ var Slider = (function (_Component) { * @method handleFocus */ + Slider.prototype.handleFocus = function handleFocus() { - this.on(_globalDocument2['default'], 'keydown', this.handleKeyPress); + this.on(this.bar.el_.ownerDocument, 'keydown', this.handleKeyPress); }; /** @@ -13065,13 +11617,15 @@ var Slider = (function (_Component) { * @method handleKeyPress */ + Slider.prototype.handleKeyPress = function handleKeyPress(event) { + // Left and Down Arrows if (event.which === 37 || event.which === 40) { - // Left and Down Arrows event.preventDefault(); this.stepBack(); - } else if (event.which === 38 || event.which === 39) { + // Up and Right Arrows + } else if (event.which === 38 || event.which === 39) { event.preventDefault(); this.stepForward(); } @@ -13083,8 +11637,9 @@ var Slider = (function (_Component) { * @method handleBlur */ + Slider.prototype.handleBlur = function handleBlur() { - this.off(_globalDocument2['default'], 'keydown', this.handleKeyPress); + this.off(this.bar.el_.ownerDocument, 'keydown', this.handleKeyPress); }; /** @@ -13095,6 +11650,7 @@ var Slider = (function (_Component) { * @method handleClick */ + Slider.prototype.handleClick = function handleClick(event) { event.stopImmediatePropagation(); event.preventDefault(); @@ -13108,6 +11664,7 @@ var Slider = (function (_Component) { * @method vertical */ + Slider.prototype.vertical = function vertical(bool) { if (bool === undefined) { return this.vertical_ || false; @@ -13125,19 +11682,55 @@ var Slider = (function (_Component) { }; return Slider; -})(_componentJs2['default']); +}(_component2['default']); -_componentJs2['default'].registerComponent('Slider', Slider); +_component2['default'].registerComponent('Slider', Slider); exports['default'] = Slider; -module.exports = exports['default']; -},{"../component.js":67,"../utils/dom.js":132,"global/document":1,"object.assign":45}],115:[function(_dereq_,module,exports){ +},{"139":139,"5":5,"82":82}],58:[function(_dereq_,module,exports){ +"use strict"; + +exports.__esModule = true; +exports["default"] = timeExpiringCache; +/** + * @file flash-cache.js + * + * Auto-caching method wrapper to avoid calling through to Flash too + * often. + */ + /** - * @file flash-rtmp.js + * Returns a new getter function that returns a cached value if + * invoked multiple times within the specified duration. + * + * @param {Function} getter the function to be cached + * @param {Number} cacheDuration the number of milliseconds to cache + * results for + * @return {Function} a new function that returns cached results if + * invoked multiple times within the cache duration */ +function timeExpiringCache(getter, cacheDuration) { + var result = function cachedGetter() { + var now = new Date().getTime(); + + if (now - result.lastCheckTime_ >= cacheDuration) { + result.lastCheckTime_ = now; + result.cache_ = getter(); + } + return result.cache_; + }; + + result.lastCheckTime_ = -Infinity; + return result; +} + +},{}],59:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; +/** + * @file flash-rtmp.js + */ function FlashRtmpDecorator(Flash) { Flash.streamingFormats = { 'rtmp/mp4': 'MP4', @@ -13154,13 +11747,16 @@ function FlashRtmpDecorator(Flash) { stream: '' }; - if (!src) return parts; + if (!src) { + return parts; + } // Look for the normal URL separator we expect, '&'. // If found, we split the URL into two pieces around the // first '&'. var connEnd = src.search(/&(?!\w+=)/); - var streamBegin = undefined; + var streamBegin = void 0; + if (connEnd !== -1) { streamBegin = connEnd + 1; } else { @@ -13171,6 +11767,7 @@ function FlashRtmpDecorator(Flash) { connEnd = streamBegin = src.length; } } + parts.connection = src.substring(0, connEnd); parts.stream = src.substring(streamBegin, src.length); @@ -13211,9 +11808,10 @@ function FlashRtmpDecorator(Flash) { /** * Check if Flash can handle the source natively * @param {Object} source The source object + * @param {Object} options The options passed to the tech * @return {String} 'probably', 'maybe', or '' (empty string) */ - Flash.rtmpSourceHandler.canHandleSource = function (source) { + Flash.rtmpSourceHandler.canHandleSource = function (source, options) { var can = Flash.rtmpSourceHandler.canPlayType(source.type); if (can) { @@ -13231,14 +11829,15 @@ function FlashRtmpDecorator(Flash) { * Pass the source to the flash object * Adaptive source handlers will have more complicated workflows before passing * video data to the video element - * @param {Object} source The source object - * @param {Flash} tech The instance of the Flash tech + * @param {Object} source The source object + * @param {Flash} tech The instance of the Flash tech + * @param {Object} options The options to pass to the source */ - Flash.rtmpSourceHandler.handleSource = function (source, tech) { + Flash.rtmpSourceHandler.handleSource = function (source, tech, options) { var srcParts = Flash.streamToParts(source.src); - tech['setRtmpConnection'](srcParts.connection); - tech['setRtmpStream'](srcParts.stream); + tech.setRtmpConnection(srcParts.connection); + tech.setRtmpStream(srcParts.stream); }; // Register the native source handler @@ -13248,59 +11847,63 @@ function FlashRtmpDecorator(Flash) { } exports['default'] = FlashRtmpDecorator; -module.exports = exports['default']; - -},{}],116:[function(_dereq_,module,exports){ -/** - * @file flash.js - * VideoJS-SWF - Custom Flash Player with HTML5-ish API - * https://github.com/zencoder/video-js-swf - * Not using setupTriggers. Using global onEvent func to distribute events - */ +},{}],60:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _tech = _dereq_(63); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _tech2 = _interopRequireDefault(_tech); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _dom = _dereq_(82); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var Dom = _interopRequireWildcard(_dom); -var _tech = _dereq_('./tech'); +var _url = _dereq_(93); -var _tech2 = _interopRequireDefault(_tech); +var Url = _interopRequireWildcard(_url); -var _utilsDomJs = _dereq_('../utils/dom.js'); +var _timeRanges = _dereq_(91); -var Dom = _interopRequireWildcard(_utilsDomJs); +var _flashRtmp = _dereq_(59); -var _utilsUrlJs = _dereq_('../utils/url.js'); +var _flashRtmp2 = _interopRequireDefault(_flashRtmp); -var Url = _interopRequireWildcard(_utilsUrlJs); +var _flashCache = _dereq_(58); -var _utilsTimeRangesJs = _dereq_('../utils/time-ranges.js'); +var _flashCache2 = _interopRequireDefault(_flashCache); -var _flashRtmp = _dereq_('./flash-rtmp'); +var _component = _dereq_(5); -var _flashRtmp2 = _interopRequireDefault(_flashRtmp); +var _component2 = _interopRequireDefault(_component); -var _component = _dereq_('../component'); +var _window = _dereq_(96); -var _component2 = _interopRequireDefault(_component); +var _window2 = _interopRequireDefault(_window); -var _globalWindow = _dereq_('global/window'); +var _object = _dereq_(139); -var _globalWindow2 = _interopRequireDefault(_globalWindow); +var _object2 = _interopRequireDefault(_object); -var _objectAssign = _dereq_('object.assign'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _objectAssign2 = _interopRequireDefault(_objectAssign); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file flash.js + * VideoJS-SWF - Custom Flash Player with HTML5-ish API + * https://github.com/zencoder/video-js-swf + * Not using setupTriggers. Using global onEvent func to distribute events + */ + +var navigator = _window2['default'].navigator; -var navigator = _globalWindow2['default'].navigator; /** * Flash Media Controller - Wrapper for fallback SWF API * @@ -13310,17 +11913,17 @@ var navigator = _globalWindow2['default'].navigator; * @class Flash */ -var Flash = (function (_Tech) { +var Flash = function (_Tech) { _inherits(Flash, _Tech); function Flash(options, ready) { _classCallCheck(this, Flash); - _Tech.call(this, options, ready); - // Set the source when ready + var _this = _possibleConstructorReturn(this, _Tech.call(this, options, ready)); + if (options.source) { - this.ready(function () { + _this.ready(function () { this.setSource(options.source); }, true); } @@ -13328,7 +11931,7 @@ var Flash = (function (_Tech) { // Having issues with Flash reloading on certain page actions (hide/resize/fullscreen) in certain browsers // This allows resetting the playhead when we catch the reload if (options.startTime) { - this.ready(function () { + _this.ready(function () { this.load(); this.play(); this.currentTime(options.startTime); @@ -13339,18 +11942,45 @@ var Flash = (function (_Tech) { // A 4.x workflow we weren't able to solve for in 5.0 // because of the need to hard code these functions // into the swf for security reasons - _globalWindow2['default'].videojs = _globalWindow2['default'].videojs || {}; - _globalWindow2['default'].videojs.Flash = _globalWindow2['default'].videojs.Flash || {}; - _globalWindow2['default'].videojs.Flash.onReady = Flash.onReady; - _globalWindow2['default'].videojs.Flash.onEvent = Flash.onEvent; - _globalWindow2['default'].videojs.Flash.onError = Flash.onError; + _window2['default'].videojs = _window2['default'].videojs || {}; + _window2['default'].videojs.Flash = _window2['default'].videojs.Flash || {}; + _window2['default'].videojs.Flash.onReady = Flash.onReady; + _window2['default'].videojs.Flash.onEvent = Flash.onEvent; + _window2['default'].videojs.Flash.onError = Flash.onError; - this.on('seeked', function () { + _this.on('seeked', function () { this.lastSeekTarget_ = undefined; }); - } - // Create setters and getters for attributes + // calling into the SWF can be expensive, especially if Flash is + // busy rendering video frames + // automatically cache commonly used properties for a short period + // of time so that multiple calls within a short time period don't + // all pay a big performance penalty for properties that change + // relatively slowly over time + var getCurrentTimeCached = (0, _flashCache2['default'])(function () { + return _this.el_.vjs_getProperty('currentTime'); + }, 100); + + _this.currentTime = function (time) { + // when seeking make the reported time keep up with the requested time + // by reading the time we're seeking to + if (_this.seeking()) { + return _this.lastSeekTarget_ || 0; + } + + return getCurrentTimeCached(); + }; + _this.buffered = (0, _flashCache2['default'])(function () { + var ranges = _this.el_.vjs_getProperty('buffered'); + + if (ranges.length === 0) { + return (0, _timeRanges.createTimeRange)(); + } + return (0, _timeRanges.createTimeRange)(ranges[0][0], ranges[0][1]); + }, 100); + return _this; + } /** * Create the component's DOM element @@ -13359,6 +11989,7 @@ var Flash = (function (_Tech) { * @method createEl */ + Flash.prototype.createEl = function createEl() { var options = this.options_; @@ -13367,38 +11998,43 @@ var Flash = (function (_Tech) { // Otherwise this adds a CDN url. // The CDN also auto-adds a swf URL for that specific version. if (!options.swf) { - options.swf = '//vjs.zencdn.net/swf/5.0.1/video-js.swf'; + var ver = '5.1.0'; + + options.swf = '//vjs.zencdn.net/swf/' + ver + '/video-js.swf'; } // Generate ID for swf object var objId = options.techId; // Merge default flashvars with ones passed in to init - var flashVars = _objectAssign2['default']({ + var flashVars = (0, _object2['default'])({ // SWF Callback Functions - 'readyFunction': 'videojs.Flash.onReady', - 'eventProxyFunction': 'videojs.Flash.onEvent', - 'errorEventProxyFunction': 'videojs.Flash.onError', + readyFunction: 'videojs.Flash.onReady', + eventProxyFunction: 'videojs.Flash.onEvent', + errorEventProxyFunction: 'videojs.Flash.onError', // Player Settings - 'autoplay': options.autoplay, - 'preload': options.preload, - 'loop': options.loop, - 'muted': options.muted + autoplay: options.autoplay, + preload: options.preload, + loop: options.loop, + muted: options.muted }, options.flashVars); // Merge default parames with ones passed in - var params = _objectAssign2['default']({ - 'wmode': 'opaque', // Opaque is needed to overlay controls, but can affect playback performance - 'bgcolor': '#000000' // Using bgcolor prevents a white flash when the object is loading + var params = (0, _object2['default'])({ + // Opaque is needed to overlay controls, but can affect playback performance + wmode: 'opaque', + // Using bgcolor prevents a white flash when the object is loading + bgcolor: '#000000' }, options.params); // Merge default attributes with ones passed in - var attributes = _objectAssign2['default']({ - 'id': objId, - 'name': objId, // Both ID and Name needed or swf to identify itself + var attributes = (0, _object2['default'])({ + // Both ID and Name needed or swf to identify itself + id: objId, + name: objId, 'class': 'vjs-tech' }, options.attributes); @@ -13414,6 +12050,7 @@ var Flash = (function (_Tech) { * @method play */ + Flash.prototype.play = function play() { if (this.ended()) { this.setCurrentTime(0); @@ -13427,6 +12064,7 @@ var Flash = (function (_Tech) { * @method pause */ + Flash.prototype.pause = function pause() { this.el_.vjs_pause(); }; @@ -13439,6 +12077,7 @@ var Flash = (function (_Tech) { * @method src */ + Flash.prototype.src = function src(_src) { if (_src === undefined) { return this.currentSrc(); @@ -13456,7 +12095,10 @@ var Flash = (function (_Tech) { * @method setSrc */ + Flash.prototype.setSrc = function setSrc(src) { + var _this2 = this; + // Make sure source URL is absolute. src = Url.getAbsoluteURL(src); this.el_.vjs_src(src); @@ -13464,9 +12106,8 @@ var Flash = (function (_Tech) { // Currently the SWF doesn't autoplay if you load a source later. // e.g. Load player w/ no source, wait 2s, set src. if (this.autoplay()) { - var tech = this; this.setTimeout(function () { - tech.play(); + return _this2.play(); }, 0); } }; @@ -13476,6 +12117,7 @@ var Flash = (function (_Tech) { * @return {boolean} true if seeking */ + Flash.prototype.seeking = function seeking() { return this.lastSeekTarget_ !== undefined; }; @@ -13487,8 +12129,10 @@ var Flash = (function (_Tech) { * @method setCurrentTime */ + Flash.prototype.setCurrentTime = function setCurrentTime(time) { var seekable = this.seekable(); + if (seekable.length) { // clamp to the current seekable range time = time > seekable.start(0) ? time : seekable.start(0); @@ -13509,27 +12153,34 @@ var Flash = (function (_Tech) { * @method currentTime */ - Flash.prototype.currentTime = function currentTime(time) { - // when seeking make the reported time keep up with the requested time - // by reading the time we're seeking to - if (this.seeking()) { - return this.lastSeekTarget_ || 0; - } - return this.el_.vjs_getProperty('currentTime'); - }; - /** * Get current source * * @method currentSrc */ + Flash.prototype.currentSrc = function currentSrc() { if (this.currentSource_) { return this.currentSource_.src; - } else { - return this.el_.vjs_getProperty('currentSrc'); } + return this.el_.vjs_getProperty('currentSrc'); + }; + + /** + * Get media duration + * + * @returns {Number} Media duration + */ + + + Flash.prototype.duration = function duration() { + if (this.readyState() === 0) { + return NaN; + } + var duration = this.el_.vjs_getProperty('duration'); + + return duration >= 0 ? duration : Infinity; }; /** @@ -13538,6 +12189,7 @@ var Flash = (function (_Tech) { * @method load */ + Flash.prototype.load = function load() { this.el_.vjs_load(); }; @@ -13548,6 +12200,7 @@ var Flash = (function (_Tech) { * @method poster */ + Flash.prototype.poster = function poster() { this.el_.vjs_getProperty('poster'); }; @@ -13558,6 +12211,7 @@ var Flash = (function (_Tech) { * @method setPoster */ + Flash.prototype.setPoster = function setPoster() {}; /** @@ -13567,12 +12221,14 @@ var Flash = (function (_Tech) { * @method seekable */ + Flash.prototype.seekable = function seekable() { var duration = this.duration(); + if (duration === 0) { - return _utilsTimeRangesJs.createTimeRange(); + return (0, _timeRanges.createTimeRange)(); } - return _utilsTimeRangesJs.createTimeRange(0, duration); + return (0, _timeRanges.createTimeRange)(0, duration); }; /** @@ -13582,14 +12238,6 @@ var Flash = (function (_Tech) { * @method buffered */ - Flash.prototype.buffered = function buffered() { - var ranges = this.el_.vjs_getProperty('buffered'); - if (ranges.length === 0) { - return _utilsTimeRangesJs.createTimeRange(); - } - return _utilsTimeRangesJs.createTimeRange(ranges[0][0], ranges[0][1]); - }; - /** * Get fullscreen support - * Flash does not allow fullscreen through javascript @@ -13599,8 +12247,10 @@ var Flash = (function (_Tech) { * @method supportsFullScreen */ + Flash.prototype.supportsFullScreen = function supportsFullScreen() { - return false; // Flash does not allow fullscreen through javascript + // Flash does not allow fullscreen through javascript + return false; }; /** @@ -13612,23 +12262,29 @@ var Flash = (function (_Tech) { * @method enterFullScreen */ + Flash.prototype.enterFullScreen = function enterFullScreen() { return false; }; return Flash; -})(_tech2['default']); +}(_tech2['default']); + +// Create setters and getters for attributes + var _api = Flash.prototype; var _readWrite = 'rtmpConnection,rtmpStream,preload,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted'.split(','); -var _readOnly = 'networkState,readyState,initialTime,duration,startOffsetTime,paused,ended,videoTracks,audioTracks,videoWidth,videoHeight'.split(','); +var _readOnly = 'networkState,readyState,initialTime,startOffsetTime,paused,ended,videoWidth,videoHeight'.split(','); function _createSetter(attr) { var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1); + _api['set' + attrUpper] = function (val) { return this.el_.vjs_setProperty(attr, val); }; } + function _createGetter(attr) { _api[attr] = function () { return this.el_.vjs_getProperty(attr); @@ -13642,8 +12298,8 @@ for (var i = 0; i < _readWrite.length; i++) { } // Create getters for read-only attributes -for (var i = 0; i < _readOnly.length; i++) { - _createGetter(_readOnly[i]); +for (var _i = 0; _i < _readOnly.length; _i++) { + _createGetter(_readOnly[_i]); } /* Flash Support Testing -------------------------------------------------------- */ @@ -13682,13 +12338,15 @@ Flash.nativeSourceHandler.canPlayType = function (type) { * Check Flash can handle the source natively * * @param {Object} source The source object + * @param {Object} options The options passed to the tech * @return {String} 'probably', 'maybe', or '' (empty string) */ -Flash.nativeSourceHandler.canHandleSource = function (source) { - var type; +Flash.nativeSourceHandler.canHandleSource = function (source, options) { + var type = void 0; function guessMimeType(src) { var ext = Url.getFileExtension(src); + if (ext) { return 'video/' + ext; } @@ -13710,10 +12368,11 @@ Flash.nativeSourceHandler.canHandleSource = function (source) { * Adaptive source handlers will have more complicated workflows before passing * video data to the video element * - * @param {Object} source The source object - * @param {Flash} tech The instance of the Flash tech + * @param {Object} source The source object + * @param {Flash} tech The instance of the Flash tech + * @param {Object} options The options to pass to the source */ -Flash.nativeSourceHandler.handleSource = function (source, tech) { +Flash.nativeSourceHandler.handleSource = function (source, tech, options) { tech.setSrc(source.src); }; @@ -13760,7 +12419,7 @@ Flash.checkReady = function (tech) { } else { // wait longer this.setTimeout(function () { - Flash['checkReady'](tech); + Flash.checkReady(tech); }, 50); } }; @@ -13768,7 +12427,16 @@ Flash.checkReady = function (tech) { // Trigger events from the swf on the player Flash.onEvent = function (swfID, eventName) { var tech = Dom.getEl(swfID).tech; - tech.trigger(eventName); + var args = Array.prototype.slice.call(arguments, 2); + + // dispatch Flash events asynchronously for two reasons: + // - Flash swallows any exceptions generated by javascript it + // invokes + // - Flash is suspended until the javascript returns which may cause + // playback performance issues + tech.setTimeout(function () { + tech.trigger(eventName, args); + }, 1); }; // Log errors from the swf @@ -13790,7 +12458,7 @@ Flash.version = function () { // IE try { - version = new _globalWindow2['default'].ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1]; + version = new _window2['default'].ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1]; // other browsers } catch (e) { @@ -13798,7 +12466,9 @@ Flash.version = function () { if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) { version = (navigator.plugins['Shockwave Flash 2.0'] || navigator.plugins['Shockwave Flash']).description.replace(/\D+/g, ',').match(/^,?(.+),?$/)[1]; } - } catch (err) {} + } catch (err) { + // satisfy linter + } } return version.split(','); }; @@ -13827,11 +12497,13 @@ Flash.getEmbedCode = function (swf, flashVars, params, attributes) { } // Add swf, flashVars, and other default params - params = _objectAssign2['default']({ - 'movie': swf, - 'flashvars': flashVarsString, - 'allowScriptAccess': 'always', // Required to talk to swf - 'allowNetworking': 'all' // All should be default, but having security issues. + params = (0, _object2['default'])({ + movie: swf, + flashvars: flashVarsString, + // Required to talk to swf + allowScriptAccess: 'always', + // All should be default, but having security issues. + allowNetworking: 'all' }, params); // Create param tags string @@ -13839,13 +12511,13 @@ Flash.getEmbedCode = function (swf, flashVars, params, attributes) { paramsString += ''; }); - attributes = _objectAssign2['default']({ + attributes = (0, _object2['default'])({ // Add swf to attributes (need both for IE and Others to work) - 'data': swf, + data: swf, // Default to 100% width/height - 'width': '100%', - 'height': '100%' + width: '100%', + height: '100%' }, attributes); @@ -13858,107 +12530,119 @@ Flash.getEmbedCode = function (swf, flashVars, params, attributes) { }; // Run Flash through the RTMP decorator -_flashRtmp2['default'](Flash); +(0, _flashRtmp2['default'])(Flash); _component2['default'].registerComponent('Flash', Flash); _tech2['default'].registerTech('Flash', Flash); exports['default'] = Flash; -module.exports = exports['default']; - -},{"../component":67,"../utils/dom.js":132,"../utils/time-ranges.js":140,"../utils/url.js":142,"./flash-rtmp":115,"./tech":119,"global/window":2,"object.assign":45}],117:[function(_dereq_,module,exports){ -/** - * @file html5.js - * HTML5 Media Controller - Wrapper for HTML5 Media API - */ +},{"139":139,"5":5,"58":58,"59":59,"63":63,"82":82,"91":91,"93":93,"96":96}],61:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _templateObject = _taggedTemplateLiteralLoose(['Text Tracks are being loaded from another origin but the crossorigin attribute isn\'t used.\n This may prevent text tracks from loading.'], ['Text Tracks are being loaded from another origin but the crossorigin attribute isn\'t used.\n This may prevent text tracks from loading.']); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _tech = _dereq_(63); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _tech2 = _interopRequireDefault(_tech); -var _techJs = _dereq_('./tech.js'); +var _component = _dereq_(5); -var _techJs2 = _interopRequireDefault(_techJs); +var _component2 = _interopRequireDefault(_component); -var _component = _dereq_('../component'); +var _dom = _dereq_(82); -var _component2 = _interopRequireDefault(_component); +var Dom = _interopRequireWildcard(_dom); + +var _url = _dereq_(93); + +var Url = _interopRequireWildcard(_url); + +var _fn = _dereq_(84); + +var Fn = _interopRequireWildcard(_fn); -var _utilsDomJs = _dereq_('../utils/dom.js'); +var _log = _dereq_(87); -var Dom = _interopRequireWildcard(_utilsDomJs); +var _log2 = _interopRequireDefault(_log); -var _utilsUrlJs = _dereq_('../utils/url.js'); +var _tsml = _dereq_(149); -var Url = _interopRequireWildcard(_utilsUrlJs); +var _tsml2 = _interopRequireDefault(_tsml); + +var _browser = _dereq_(79); + +var browser = _interopRequireWildcard(_browser); + +var _document = _dereq_(95); -var _utilsFnJs = _dereq_('../utils/fn.js'); +var _document2 = _interopRequireDefault(_document); -var Fn = _interopRequireWildcard(_utilsFnJs); +var _window = _dereq_(96); -var _utilsLogJs = _dereq_('../utils/log.js'); +var _window2 = _interopRequireDefault(_window); -var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs); +var _object = _dereq_(139); -var _utilsBrowserJs = _dereq_('../utils/browser.js'); +var _object2 = _interopRequireDefault(_object); -var browser = _interopRequireWildcard(_utilsBrowserJs); +var _mergeOptions = _dereq_(88); -var _globalDocument = _dereq_('global/document'); +var _mergeOptions2 = _interopRequireDefault(_mergeOptions); -var _globalDocument2 = _interopRequireDefault(_globalDocument); +var _toTitleCase = _dereq_(92); -var _globalWindow = _dereq_('global/window'); +var _toTitleCase2 = _interopRequireDefault(_toTitleCase); -var _globalWindow2 = _interopRequireDefault(_globalWindow); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _objectAssign = _dereq_('object.assign'); +function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; } -var _objectAssign2 = _interopRequireDefault(_objectAssign); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _utilsMergeOptionsJs = _dereq_('../utils/merge-options.js'); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file html5.js + * HTML5 Media Controller - Wrapper for HTML5 Media API + */ /** * HTML5 Media Controller - Wrapper for HTML5 Media API * * @param {Object=} options Object of option names and values * @param {Function=} ready Ready callback function - * @extends Tech * @class Html5 */ - -var Html5 = (function (_Tech) { +var Html5 = function (_Tech) { _inherits(Html5, _Tech); function Html5(options, ready) { _classCallCheck(this, Html5); - _Tech.call(this, options, ready); + var _this = _possibleConstructorReturn(this, _Tech.call(this, options, ready)); var source = options.source; + var crossoriginTracks = false; // Set the source if one is provided // 1) Check if the source is new (if not, we want to keep the original so playback isn't interrupted) // 2) Check to see if the network state of the tag was failed at init, and if so, reset the source // anyway so the error gets fired. - if (source && (this.el_.currentSrc !== source.src || options.tag && options.tag.initNetworkState_ === 3)) { - this.setSource(source); + if (source && (_this.el_.currentSrc !== source.src || options.tag && options.tag.initNetworkState_ === 3)) { + _this.setSource(source); } else { - this.handleLateInit_(this.el_); + _this.handleLateInit_(_this.el_); } - if (this.el_.hasChildNodes()) { + if (_this.el_.hasChildNodes()) { - var nodes = this.el_.childNodes; + var nodes = _this.el_.childNodes; var nodesLength = nodes.length; var removeNodes = []; @@ -13967,7 +12651,7 @@ var Html5 = (function (_Tech) { var nodeName = node.nodeName.toLowerCase(); if (nodeName === 'track') { - if (!this.featuresNativeTextTracks) { + if (!_this.featuresNativeTextTracks) { // Empty video tag tracks so the built-in player doesn't use them also. // This may not be fast enough to stop HTML5 browsers from reading the tags // so we'll need to turn off any default tracks if we're manually doing @@ -13975,70 +12659,113 @@ var Html5 = (function (_Tech) { removeNodes.push(node); } else { // store HTMLTrackElement and TextTrack to remote list - this.remoteTextTrackEls().addTrackElement_(node); - this.remoteTextTracks().addTrack_(node.track); + _this.remoteTextTrackEls().addTrackElement_(node); + _this.remoteTextTracks().addTrack_(node.track); + if (!crossoriginTracks && !_this.el_.hasAttribute('crossorigin') && Url.isCrossOrigin(node.src)) { + crossoriginTracks = true; + } } } } for (var i = 0; i < removeNodes.length; i++) { - this.el_.removeChild(removeNodes[i]); + _this.el_.removeChild(removeNodes[i]); } } - if (this.featuresNativeTextTracks) { - this.handleTextTrackChange_ = Fn.bind(this, this.handleTextTrackChange); - this.handleTextTrackAdd_ = Fn.bind(this, this.handleTextTrackAdd); - this.handleTextTrackRemove_ = Fn.bind(this, this.handleTextTrackRemove); - this.proxyNativeTextTracks_(); + // TODO: add text tracks into this list + var trackTypes = ['audio', 'video']; + + // ProxyNative Video/Audio Track + trackTypes.forEach(function (type) { + var elTracks = _this.el()[type + 'Tracks']; + var techTracks = _this[type + 'Tracks'](); + var capitalType = (0, _toTitleCase2['default'])(type); + + if (!_this['featuresNative' + capitalType + 'Tracks'] || !elTracks || !elTracks.addEventListener) { + return; + } + + _this['handle' + capitalType + 'TrackChange_'] = function (e) { + techTracks.trigger({ + type: 'change', + target: techTracks, + currentTarget: techTracks, + srcElement: techTracks + }); + }; + _this['handle' + capitalType + 'TrackAdd_'] = function (e) { + return techTracks.addTrack(e.track); + }; + _this['handle' + capitalType + 'TrackRemove_'] = function (e) { + return techTracks.removeTrack(e.track); + }; + + elTracks.addEventListener('change', _this['handle' + capitalType + 'TrackChange_']); + elTracks.addEventListener('addtrack', _this['handle' + capitalType + 'TrackAdd_']); + elTracks.addEventListener('removetrack', _this['handle' + capitalType + 'TrackRemove_']); + _this['removeOld' + capitalType + 'Tracks_'] = function (e) { + return _this.removeOldTracks_(techTracks, elTracks); + }; + + // Remove (native) tracks that are not used anymore + _this.on('loadstart', _this['removeOld' + capitalType + 'Tracks_']); + }); + + if (_this.featuresNativeTextTracks) { + if (crossoriginTracks) { + _log2['default'].warn((0, _tsml2['default'])(_templateObject)); + } + + _this.handleTextTrackChange_ = Fn.bind(_this, _this.handleTextTrackChange); + _this.handleTextTrackAdd_ = Fn.bind(_this, _this.handleTextTrackAdd); + _this.handleTextTrackRemove_ = Fn.bind(_this, _this.handleTextTrackRemove); + _this.proxyNativeTextTracks_(); } // Determine if native controls should be used // Our goal should be to get the custom controls on mobile solid everywhere // so we can remove this all together. Right now this will block custom // controls on touch enabled laptops like the Chrome Pixel - if (browser.TOUCH_ENABLED && options.nativeControlsForTouch === true || browser.IS_IPHONE || browser.IS_NATIVE_ANDROID) { - this.setControls(true); + if ((browser.TOUCH_ENABLED || browser.IS_IPHONE || browser.IS_NATIVE_ANDROID) && options.nativeControlsForTouch === true) { + _this.setControls(true); } - this.triggerReady(); - } - - /* HTML5 Support Testing ---------------------------------------------------- */ + // on iOS, we want to proxy `webkitbeginfullscreen` and `webkitendfullscreen` + // into a `fullscreenchange` event + _this.proxyWebkitFullscreen_(); - /* - * Element for testing browser HTML5 video capabilities - * - * @type {Element} - * @constant - * @private - */ + _this.triggerReady(); + return _this; + } /** * Dispose of html5 media element - * - * @method dispose */ + Html5.prototype.dispose = function dispose() { - var tt = this.el().textTracks; - var emulatedTt = this.textTracks(); + var _this2 = this; - // remove native event listeners - if (tt && tt.removeEventListener) { - tt.removeEventListener('change', this.handleTextTrackChange_); - tt.removeEventListener('addtrack', this.handleTextTrackAdd_); - tt.removeEventListener('removetrack', this.handleTextTrackRemove_); - } + // Un-ProxyNativeTracks + ['audio', 'video', 'text'].forEach(function (type) { + var capitalType = (0, _toTitleCase2['default'])(type); + var tl = _this2.el_[type + 'Tracks']; - // clearout the emulated text track list. - var i = emulatedTt.length; + if (tl && tl.removeEventListener) { + tl.removeEventListener('change', _this2['handle' + capitalType + 'TrackChange_']); + tl.removeEventListener('addtrack', _this2['handle' + capitalType + 'TrackAdd_']); + tl.removeEventListener('removetrack', _this2['handle' + capitalType + 'TrackRemove_']); + } - while (i--) { - emulatedTt.removeTrack_(emulatedTt[i]); - } + // Stop removing old text tracks + if (tl) { + _this2.off('loadstart', _this2['removeOld' + capitalType + 'Tracks_']); + } + }); Html5.disposeMediaElement(this.el_); + // tech will handle clearing of the emulated track list _Tech.prototype.dispose.call(this); }; @@ -14046,45 +12773,51 @@ var Html5 = (function (_Tech) { * Create the component's DOM element * * @return {Element} - * @method createEl */ + Html5.prototype.createEl = function createEl() { var el = this.options_.tag; // Check if this browser supports moving the element into the box. // On the iPhone video will break if you move the element, // So we have to create a brand new element. - if (!el || this['movingMediaElementInDOM'] === false) { + if (!el || this.movingMediaElementInDOM === false) { // If the original tag is still there, clone and remove it. if (el) { var clone = el.cloneNode(true); + el.parentNode.insertBefore(clone, el); Html5.disposeMediaElement(el); el = clone; } else { - el = _globalDocument2['default'].createElement('video'); + el = _document2['default'].createElement('video'); // determine if native controls should be used var tagAttributes = this.options_.tag && Dom.getElAttributes(this.options_.tag); - var attributes = _utilsMergeOptionsJs2['default']({}, tagAttributes); + var attributes = (0, _mergeOptions2['default'])({}, tagAttributes); + if (!browser.TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) { delete attributes.controls; } - Dom.setElAttributes(el, _objectAssign2['default'](attributes, { + Dom.setElAttributes(el, (0, _object2['default'])(attributes, { id: this.options_.techId, 'class': 'vjs-tech' })); } + + el.playerId = this.options_.playerId; } // Update specific tag settings, in case they were overridden var settingsAttrs = ['autoplay', 'preload', 'loop', 'muted']; + for (var i = settingsAttrs.length - 1; i >= 0; i--) { var attr = settingsAttrs[i]; var overwriteAttrs = {}; + if (typeof this.options_[attr] !== 'undefined') { overwriteAttrs[attr] = this.options_[attr]; } @@ -14100,8 +12833,9 @@ var Html5 = (function (_Tech) { // has already fired and we need to fire it manually because many things // rely on it. + Html5.prototype.handleLateInit_ = function handleLateInit_(el) { - var _this = this; + var _this3 = this; if (el.networkState === 0 || el.networkState === 3) { // The video element hasn't started loading the source yet @@ -14110,7 +12844,7 @@ var Html5 = (function (_Tech) { } if (el.readyState === 0) { - var _ret = (function () { + var _ret = function () { // NetworkState is set synchronously BUT loadstart is fired at the // end of the current stack, usually before setInterval(fn, 0). // So at this point we know loadstart may have already fired or is @@ -14125,7 +12859,8 @@ var Html5 = (function (_Tech) { var setLoadstartFired = function setLoadstartFired() { loadstartFired = true; }; - _this.on('loadstart', setLoadstartFired); + + _this3.on('loadstart', setLoadstartFired); var triggerLoadstart = function triggerLoadstart() { // We did miss the original loadstart. Make sure the player @@ -14134,9 +12869,10 @@ var Html5 = (function (_Tech) { this.trigger('loadstart'); } }; - _this.on('loadedmetadata', triggerLoadstart); - _this.ready(function () { + _this3.on('loadedmetadata', triggerLoadstart); + + _this3.ready(function () { this.off('loadstart', setLoadstartFired); this.off('loadedmetadata', triggerLoadstart); @@ -14147,11 +12883,11 @@ var Html5 = (function (_Tech) { }); return { - v: undefined + v: void 0 }; - })(); + }(); - if (typeof _ret === 'object') return _ret.v; + if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; } // From here on we know that loadstart already fired and we missed it. @@ -14201,11 +12937,15 @@ var Html5 = (function (_Tech) { tt.addEventListener('addtrack', this.handleTextTrackAdd_); tt.addEventListener('removetrack', this.handleTextTrackRemove_); } + + // Remove (native) texttracks that are not used anymore + this.on('loadstart', this.removeOldTextTracks_); } }; Html5.prototype.handleTextTrackChange = function handleTextTrackChange(e) { var tt = this.textTracks(); + this.textTracks().trigger({ type: 'change', target: tt, @@ -14223,59 +12963,80 @@ var Html5 = (function (_Tech) { }; /** - * Play for html5 tech - * - * @method play + * This is a helper function that is used in removeOldTextTracks_, removeOldAudioTracks_ and + * removeOldVideoTracks_ + * @param {Track[]} techTracks Tracks for this tech + * @param {Track[]} elTracks Tracks for the HTML5 video element + * @private */ - Html5.prototype.play = function play() { - this.el_.play(); - }; - /** - * Pause for html5 tech - * - * @method pause - */ + Html5.prototype.removeOldTracks_ = function removeOldTracks_(techTracks, elTracks) { + // This will loop over the techTracks and check if they are still used by the HTML5 video element + // If not, they will be removed from the emulated list + var removeTracks = []; - Html5.prototype.pause = function pause() { - this.el_.pause(); - }; + if (!elTracks) { + return; + } - /** - * Paused for html5 tech - * - * @return {Boolean} - * @method paused - */ + for (var i = 0; i < techTracks.length; i++) { + var techTrack = techTracks[i]; + var found = false; + + for (var j = 0; j < elTracks.length; j++) { + if (elTracks[j] === techTrack) { + found = true; + break; + } + } + + if (!found) { + removeTracks.push(techTrack); + } + } + + for (var _i = 0; _i < removeTracks.length; _i++) { + var _track = removeTracks[_i]; + + techTracks.removeTrack_(_track); + } + }; + + Html5.prototype.removeOldTextTracks_ = function removeOldTextTracks_() { + var techTracks = this.textTracks(); + var elTracks = this.el().textTracks; - Html5.prototype.paused = function paused() { - return this.el_.paused; + this.removeOldTracks_(techTracks, elTracks); }; /** - * Get current time - * - * @return {Number} - * @method currentTime + * Play for html5 tech */ - Html5.prototype.currentTime = function currentTime() { - return this.el_.currentTime; + + Html5.prototype.play = function play() { + var playPromise = this.el_.play(); + + // Catch/silence error when a pause interrupts a play request + // on browsers which return a promise + if (playPromise !== undefined && typeof playPromise.then === 'function') { + playPromise.then(null, function (e) {}); + } }; /** * Set current time * * @param {Number} seconds Current time of video - * @method setCurrentTime */ + Html5.prototype.setCurrentTime = function setCurrentTime(seconds) { try { this.el_.currentTime = seconds; } catch (e) { - _utilsLogJs2['default'](e, 'Video is not ready. (Video.js)'); + (0, _log2['default'])(e, 'Video is not ready. (Video.js)'); // this.warning(VideoJS.warnings.videoNotReady); } }; @@ -14284,102 +13045,109 @@ var Html5 = (function (_Tech) { * Get duration * * @return {Number} - * @method duration */ + Html5.prototype.duration = function duration() { - return this.el_.duration || 0; - }; + var _this4 = this; + + // Android Chrome will report duration as Infinity for VOD HLS until after + // playback has started, which triggers the live display erroneously. + // Return NaN if playback has not started and trigger a durationupdate once + // the duration can be reliably known. + if (this.el_.duration === Infinity && browser.IS_ANDROID && browser.IS_CHROME) { + if (this.el_.currentTime === 0) { + var _ret2 = function () { + // Wait for the first `timeupdate` with currentTime > 0 - there may be + // several with 0 + var checkProgress = function checkProgress() { + if (_this4.el_.currentTime > 0) { + // Trigger durationchange for genuinely live video + if (_this4.el_.duration === Infinity) { + _this4.trigger('durationchange'); + } + _this4.off(_this4.player_, 'timeupdate', checkProgress); + } + }; - /** - * Get a TimeRange object that represents the intersection - * of the time ranges for which the user agent has all - * relevant media - * - * @return {TimeRangeObject} - * @method buffered - */ + _this4.on(_this4.player_, 'timeupdate', checkProgress); + return { + v: NaN + }; + }(); - Html5.prototype.buffered = function buffered() { - return this.el_.buffered; + if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === "object") return _ret2.v; + } + } + return this.el_.duration || NaN; }; /** - * Get volume level + * Get player width * * @return {Number} - * @method volume */ - Html5.prototype.volume = function volume() { - return this.el_.volume; + + Html5.prototype.width = function width() { + return this.el_.offsetWidth; }; /** - * Set volume level + * Get player height * - * @param {Number} percentAsDecimal Volume percent as a decimal - * @method setVolume + * @return {Number} */ - Html5.prototype.setVolume = function setVolume(percentAsDecimal) { - this.el_.volume = percentAsDecimal; + + Html5.prototype.height = function height() { + return this.el_.offsetHeight; }; /** - * Get if muted + * Proxy iOS `webkitbeginfullscreen` and `webkitendfullscreen` into + * `fullscreenchange` event * - * @return {Boolean} - * @method muted + * @private + * @method proxyWebkitFullscreen_ */ - Html5.prototype.muted = function muted() { - return this.el_.muted; - }; - /** - * Set muted - * - * @param {Boolean} If player is to be muted or note - * @method setMuted - */ + Html5.prototype.proxyWebkitFullscreen_ = function proxyWebkitFullscreen_() { + var _this5 = this; - Html5.prototype.setMuted = function setMuted(muted) { - this.el_.muted = muted; - }; + if (!('webkitDisplayingFullscreen' in this.el_)) { + return; + } - /** - * Get player width - * - * @return {Number} - * @method width - */ + var endFn = function endFn() { + this.trigger('fullscreenchange', { isFullscreen: false }); + }; - Html5.prototype.width = function width() { - return this.el_.offsetWidth; - }; + var beginFn = function beginFn() { + this.one('webkitendfullscreen', endFn); - /** - * Get player height - * - * @return {Number} - * @method height - */ + this.trigger('fullscreenchange', { isFullscreen: true }); + }; - Html5.prototype.height = function height() { - return this.el_.offsetHeight; + this.on('webkitbeginfullscreen', beginFn); + this.on('dispose', function () { + _this5.off('webkitbeginfullscreen', beginFn); + _this5.off('webkitendfullscreen', endFn); + }); }; /** * Get if there is fullscreen support * * @return {Boolean} - * @method supportsFullScreen */ + Html5.prototype.supportsFullScreen = function supportsFullScreen() { if (typeof this.el_.webkitEnterFullScreen === 'function') { - var userAgent = _globalWindow2['default'].navigator.userAgent; + var userAgent = _window2['default'].navigator && _window2['default'].navigator.userAgent || ''; + // Seems to be broken in Chromium/Chrome && Safari in Leopard if (/Android/.test(userAgent) || !/Chrome|Mac OS X 10.5/.test(userAgent)) { return true; @@ -14390,23 +13158,12 @@ var Html5 = (function (_Tech) { /** * Request to enter fullscreen - * - * @method enterFullScreen */ + Html5.prototype.enterFullScreen = function enterFullScreen() { var video = this.el_; - if ('webkitDisplayingFullscreen' in video) { - this.one('webkitbeginfullscreen', function () { - this.one('webkitendfullscreen', function () { - this.trigger('fullscreenchange', { isFullscreen: false }); - }); - - this.trigger('fullscreenchange', { isFullscreen: true }); - }); - } - if (video.paused && video.networkState <= video.HAVE_METADATA) { // attempt to prime the video element for programmatic access // this isn't necessary on the desktop but shouldn't hurt @@ -14425,10 +13182,9 @@ var Html5 = (function (_Tech) { /** * Request to exit fullscreen - * - * @method exitFullScreen */ + Html5.prototype.exitFullScreen = function exitFullScreen() { this.el_.webkitExitFullScreen(); }; @@ -14438,46 +13194,23 @@ var Html5 = (function (_Tech) { * * @param {Object=} src Source object * @return {Object} - * @method src */ + Html5.prototype.src = function src(_src) { if (_src === undefined) { return this.el_.src; - } else { - // Setting src through `src` instead of `setSrc` will be deprecated - this.setSrc(_src); } - }; - - /** - * Set video - * - * @param {Object} src Source object - * @deprecated - * @method setSrc - */ - - Html5.prototype.setSrc = function setSrc(src) { - this.el_.src = src; - }; - - /** - * Load media into player - * - * @method load - */ - Html5.prototype.load = function load() { - this.el_.load(); + // Setting src through `src` instead of `setSrc` will be deprecated + this.setSrc(_src); }; /** * Reset the tech. Removes all sources and calls `load`. - * - * @method reset */ + Html5.prototype.reset = function reset() { Html5.resetMediaElement(this.el_); }; @@ -14486,511 +13219,212 @@ var Html5 = (function (_Tech) { * Get current source * * @return {Object} - * @method currentSrc */ + Html5.prototype.currentSrc = function currentSrc() { if (this.currentSource_) { return this.currentSource_.src; - } else { - return this.el_.currentSrc; } + return this.el_.currentSrc; }; /** - * Get poster + * Set controls attribute * - * @return {String} - * @method poster + * @param {String} val Value for controls attribute */ - Html5.prototype.poster = function poster() { - return this.el_.poster; - }; - - /** - * Set poster - * - * @param {String} val URL to poster image - * @method - */ - Html5.prototype.setPoster = function setPoster(val) { - this.el_.poster = val; + Html5.prototype.setControls = function setControls(val) { + this.el_.controls = !!val; }; /** - * Get preload attribute + * Creates and returns a text track object * - * @return {String} - * @method preload + * @param {String} kind Text track kind (subtitles, captions, descriptions + * chapters and metadata) + * @param {String=} label Label to identify the text track + * @param {String=} language Two letter language abbreviation + * @return {TextTrackObject} */ - Html5.prototype.preload = function preload() { - return this.el_.preload; - }; - /** - * Set preload attribute - * - * @param {String} val Value for preload attribute - * @method setPreload - */ + Html5.prototype.addTextTrack = function addTextTrack(kind, label, language) { + if (!this.featuresNativeTextTracks) { + return _Tech.prototype.addTextTrack.call(this, kind, label, language); + } - Html5.prototype.setPreload = function setPreload(val) { - this.el_.preload = val; + return this.el_.addTextTrack(kind, label, language); }; /** - * Get autoplay attribute + * Creates either native TextTrack or an emulated TextTrack depending + * on the value of `featuresNativeTextTracks` * - * @return {String} - * @method autoplay + * @param {Object} options The object should contain values for + * kind, language, label and src (location of the WebVTT file) */ - Html5.prototype.autoplay = function autoplay() { - return this.el_.autoplay; - }; - - /** - * Set autoplay attribute - * - * @param {String} val Value for preload attribute - * @method setAutoplay - */ - Html5.prototype.setAutoplay = function setAutoplay(val) { - this.el_.autoplay = val; - }; + Html5.prototype.createRemoteTextTrack = function createRemoteTextTrack(options) { + if (!this.featuresNativeTextTracks) { + return _Tech.prototype.createRemoteTextTrack.call(this, options); + } + var htmlTrackElement = _document2['default'].createElement('track'); - /** - * Get controls attribute - * - * @return {String} - * @method controls - */ + if (options.kind) { + htmlTrackElement.kind = options.kind; + } + if (options.label) { + htmlTrackElement.label = options.label; + } + if (options.language || options.srclang) { + htmlTrackElement.srclang = options.language || options.srclang; + } + if (options['default']) { + htmlTrackElement['default'] = options['default']; + } + if (options.id) { + htmlTrackElement.id = options.id; + } + if (options.src) { + htmlTrackElement.src = options.src; + } - Html5.prototype.controls = function controls() { - return this.el_.controls; + return htmlTrackElement; }; /** - * Set controls attribute + * Creates a remote text track object and returns an html track element. * - * @param {String} val Value for controls attribute - * @method setControls + * @param {Object} options The object should contain values for + * kind, language, label, and src (location of the WebVTT file) + * @param {Boolean} [manualCleanup=true] if set to false, the TextTrack will be + * automatically removed from the video element whenever the source changes + * @return {HTMLTrackElement} An Html Track Element. + * This can be an emulated {@link HTMLTrackElement} or a native one. + * @deprecated The default value of the "manualCleanup" parameter will default + * to "false" in upcoming versions of Video.js */ - Html5.prototype.setControls = function setControls(val) { - this.el_.controls = !!val; - }; - - /** - * Get loop attribute - * - * @return {String} - * @method loop - */ - Html5.prototype.loop = function loop() { - return this.el_.loop; - }; + Html5.prototype.addRemoteTextTrack = function addRemoteTextTrack(options, manualCleanup) { + var htmlTrackElement = _Tech.prototype.addRemoteTextTrack.call(this, options, manualCleanup); - /** - * Set loop attribute - * - * @param {String} val Value for loop attribute - * @method setLoop - */ + this.el().appendChild(htmlTrackElement); - Html5.prototype.setLoop = function setLoop(val) { - this.el_.loop = val; + return htmlTrackElement; }; /** - * Get error value + * Remove remote text track from TextTrackList object * - * @return {String} - * @method error + * @param {TextTrackObject} track Texttrack object to remove */ - Html5.prototype.error = function error() { - return this.el_.error; - }; - /** - * Get whether or not the player is in the "seeking" state - * - * @return {Boolean} - * @method seeking - */ + Html5.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) { + _Tech.prototype.removeRemoteTextTrack.call(this, track); - Html5.prototype.seeking = function seeking() { - return this.el_.seeking; - }; + var tracks = this.$$('track'); - /** - * Get a TimeRanges object that represents the - * ranges of the media resource to which it is possible - * for the user agent to seek. - * - * @return {TimeRangeObject} - * @method seekable - */ + var i = tracks.length; - Html5.prototype.seekable = function seekable() { - return this.el_.seekable; + while (i--) { + if (track === tracks[i] || track === tracks[i].track) { + this.el().removeChild(tracks[i]); + } + } }; - /** - * Get if video ended - * - * @return {Boolean} - * @method ended - */ + return Html5; +}(_tech2['default']); - Html5.prototype.ended = function ended() { - return this.el_.ended; - }; +/* HTML5 Support Testing ---------------------------------------------------- */ - /** - * Get the value of the muted content attribute - * This attribute has no dynamic effect, it only - * controls the default state of the element - * - * @return {Boolean} - * @method defaultMuted - */ +/** + * Element for testing browser HTML5 video capabilities + * + * @type {Element} + * @constant + * @private + */ - Html5.prototype.defaultMuted = function defaultMuted() { - return this.el_.defaultMuted; - }; - /** - * Get desired speed at which the media resource is to play - * - * @return {Number} - * @method playbackRate - */ +Html5.TEST_VID = _document2['default'].createElement('video'); +var track = _document2['default'].createElement('track'); - Html5.prototype.playbackRate = function playbackRate() { - return this.el_.playbackRate; - }; +track.kind = 'captions'; +track.srclang = 'en'; +track.label = 'English'; +Html5.TEST_VID.appendChild(track); - /** - * Returns a TimeRanges object that represents the ranges of the - * media resource that the user agent has played. - * @return {TimeRangeObject} the range of points on the media - * timeline that has been reached through normal playback - * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-played - */ +/** + * Check if HTML5 video is supported by this browser/device + * + * @return {Boolean} + */ +Html5.isSupported = function () { + // IE9 with no Media Player is a LIAR! (#984) + try { + Html5.TEST_VID.volume = 0.5; + } catch (e) { + return false; + } - Html5.prototype.played = function played() { - return this.el_.played; - }; + return !!Html5.TEST_VID.canPlayType; +}; - /** - * Set desired speed at which the media resource is to play - * - * @param {Number} val Speed at which the media resource is to play - * @method setPlaybackRate - */ - - Html5.prototype.setPlaybackRate = function setPlaybackRate(val) { - this.el_.playbackRate = val; - }; - - /** - * Get the current state of network activity for the element, from - * the list below - * NETWORK_EMPTY (numeric value 0) - * NETWORK_IDLE (numeric value 1) - * NETWORK_LOADING (numeric value 2) - * NETWORK_NO_SOURCE (numeric value 3) - * - * @return {Number} - * @method networkState - */ - - Html5.prototype.networkState = function networkState() { - return this.el_.networkState; - }; - - /** - * Get a value that expresses the current state of the element - * with respect to rendering the current playback position, from - * the codes in the list below - * HAVE_NOTHING (numeric value 0) - * HAVE_METADATA (numeric value 1) - * HAVE_CURRENT_DATA (numeric value 2) - * HAVE_FUTURE_DATA (numeric value 3) - * HAVE_ENOUGH_DATA (numeric value 4) - * - * @return {Number} - * @method readyState - */ - - Html5.prototype.readyState = function readyState() { - return this.el_.readyState; - }; - - /** - * Get width of video - * - * @return {Number} - * @method videoWidth - */ - - Html5.prototype.videoWidth = function videoWidth() { - return this.el_.videoWidth; - }; - - /** - * Get height of video - * - * @return {Number} - * @method videoHeight - */ - - Html5.prototype.videoHeight = function videoHeight() { - return this.el_.videoHeight; - }; - - /** - * Get text tracks - * - * @return {TextTrackList} - * @method textTracks - */ - - Html5.prototype.textTracks = function textTracks() { - return _Tech.prototype.textTracks.call(this); - }; - - /** - * Creates and returns a text track object - * - * @param {String} kind Text track kind (subtitles, captions, descriptions - * chapters and metadata) - * @param {String=} label Label to identify the text track - * @param {String=} language Two letter language abbreviation - * @return {TextTrackObject} - * @method addTextTrack - */ - - Html5.prototype.addTextTrack = function addTextTrack(kind, label, language) { - if (!this['featuresNativeTextTracks']) { - return _Tech.prototype.addTextTrack.call(this, kind, label, language); - } - - return this.el_.addTextTrack(kind, label, language); - }; - - /** - * Creates a remote text track object and returns a html track element - * - * @param {Object} options The object should contain values for - * kind, language, label and src (location of the WebVTT file) - * @return {HTMLTrackElement} - * @method addRemoteTextTrack - */ - - Html5.prototype.addRemoteTextTrack = function addRemoteTextTrack() { - var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; - - if (!this['featuresNativeTextTracks']) { - return _Tech.prototype.addRemoteTextTrack.call(this, options); - } - - var htmlTrackElement = _globalDocument2['default'].createElement('track'); - - if (options.kind) { - htmlTrackElement.kind = options.kind; - } - if (options.label) { - htmlTrackElement.label = options.label; - } - if (options.language || options.srclang) { - htmlTrackElement.srclang = options.language || options.srclang; - } - if (options['default']) { - htmlTrackElement['default'] = options['default']; - } - if (options.id) { - htmlTrackElement.id = options.id; - } - if (options.src) { - htmlTrackElement.src = options.src; - } - - this.el().appendChild(htmlTrackElement); - - // store HTMLTrackElement and TextTrack to remote list - this.remoteTextTrackEls().addTrackElement_(htmlTrackElement); - this.remoteTextTracks().addTrack_(htmlTrackElement.track); - - return htmlTrackElement; - }; - - /** - * Remove remote text track from TextTrackList object - * - * @param {TextTrackObject} track Texttrack object to remove - * @method removeRemoteTextTrack - */ - - Html5.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) { - if (!this['featuresNativeTextTracks']) { - return _Tech.prototype.removeRemoteTextTrack.call(this, track); - } - - var tracks = undefined, - i = undefined; - - var trackElement = this.remoteTextTrackEls().getTrackElementByTrack_(track); - - // remove HTMLTrackElement and TextTrack from remote list - this.remoteTextTrackEls().removeTrackElement_(trackElement); - this.remoteTextTracks().removeTrack_(track); - - tracks = this.$$('track'); - - i = tracks.length; - while (i--) { - if (track === tracks[i] || track === tracks[i].track) { - this.el().removeChild(tracks[i]); - } - } - }; - - return Html5; -})(_techJs2['default']); - -Html5.TEST_VID = _globalDocument2['default'].createElement('video'); -var track = _globalDocument2['default'].createElement('track'); -track.kind = 'captions'; -track.srclang = 'en'; -track.label = 'English'; -Html5.TEST_VID.appendChild(track); - -/* - * Check if HTML5 video is supported by this browser/device +/** + * Check if the volume can be changed in this browser/device. + * Volume cannot be changed in a lot of mobile devices. + * Specifically, it can't be changed from 1 on iOS. * * @return {Boolean} */ -Html5.isSupported = function () { - // IE9 with no Media Player is a LIAR! (#984) +Html5.canControlVolume = function () { + // IE will error if Windows Media Player not installed #3315 try { - Html5.TEST_VID['volume'] = 0.5; + var volume = Html5.TEST_VID.volume; + + Html5.TEST_VID.volume = volume / 2 + 0.1; + return volume !== Html5.TEST_VID.volume; } catch (e) { return false; } - - return !!Html5.TEST_VID.canPlayType; }; -// Add Source Handler pattern functions to this tech -_techJs2['default'].withSourceHandlers(Html5); - -/* - * The default native source handler. - * This simply passes the source to the video element. Nothing fancy. - * - * @param {Object} source The source object - * @param {Html5} tech The instance of the HTML5 tech - */ -Html5.nativeSourceHandler = {}; - -/* - * Check if the video element can play the given videotype +/** + * Check if playbackRate is supported in this browser/device. * - * @param {String} type The mimetype to check - * @return {String} 'probably', 'maybe', or '' (empty string) + * @return {Boolean} */ -Html5.nativeSourceHandler.canPlayType = function (type) { - // IE9 on Windows 7 without MediaPlayer throws an error here - // https://github.com/videojs/video.js/issues/519 - try { - return Html5.TEST_VID.canPlayType(type); - } catch (e) { - return ''; +Html5.canControlPlaybackRate = function () { + // Playback rate API is implemented in Android Chrome, but doesn't do anything + // https://github.com/videojs/video.js/issues/3180 + if (browser.IS_ANDROID && browser.IS_CHROME) { + return false; } -}; - -/* - * Check if the video element can handle the source natively - * - * @param {Object} source The source object - * @return {String} 'probably', 'maybe', or '' (empty string) - */ -Html5.nativeSourceHandler.canHandleSource = function (source) { - var match, ext; - - // If a type was provided we should rely on that - if (source.type) { - return Html5.nativeSourceHandler.canPlayType(source.type); - } else if (source.src) { - // If no type, fall back to checking 'video/[EXTENSION]' - ext = Url.getFileExtension(source.src); + // IE will error if Windows Media Player not installed #3315 + try { + var playbackRate = Html5.TEST_VID.playbackRate; - return Html5.nativeSourceHandler.canPlayType('video/' + ext); + Html5.TEST_VID.playbackRate = playbackRate / 2 + 0.1; + return playbackRate !== Html5.TEST_VID.playbackRate; + } catch (e) { + return false; } - - return ''; -}; - -/* - * Pass the source to the video element - * Adaptive source handlers will have more complicated workflows before passing - * video data to the video element - * - * @param {Object} source The source object - * @param {Html5} tech The instance of the Html5 tech - */ -Html5.nativeSourceHandler.handleSource = function (source, tech) { - tech.setSrc(source.src); -}; - -/* -* Clean up the source handler when disposing the player or switching sources.. -* (no cleanup is needed when supporting the format natively) -*/ -Html5.nativeSourceHandler.dispose = function () {}; - -// Register the native source handler -Html5.registerSourceHandler(Html5.nativeSourceHandler); - -/* - * Check if the volume can be changed in this browser/device. - * Volume cannot be changed in a lot of mobile devices. - * Specifically, it can't be changed from 1 on iOS. - * - * @return {Boolean} - */ -Html5.canControlVolume = function () { - var volume = Html5.TEST_VID.volume; - Html5.TEST_VID.volume = volume / 2 + 0.1; - return volume !== Html5.TEST_VID.volume; -}; - -/* - * Check if playbackRate is supported in this browser/device. - * - * @return {Number} [description] - */ -Html5.canControlPlaybackRate = function () { - var playbackRate = Html5.TEST_VID.playbackRate; - Html5.TEST_VID.playbackRate = playbackRate / 2 + 0.1; - return playbackRate !== Html5.TEST_VID.playbackRate; }; -/* +/** * Check to see if native text tracks are supported by this browser/device * * @return {Boolean} */ Html5.supportsNativeTextTracks = function () { - var supportsTextTracks; + var supportsTextTracks = void 0; // Figure out native text track support // If mode is a number, we cannot change it because it'll disappear from view. @@ -14999,7 +13433,7 @@ Html5.supportsNativeTextTracks = function () { // TODO: Investigate firefox: https://github.com/videojs/video.js/issues/1862 supportsTextTracks = !!Html5.TEST_VID.textTracks; if (supportsTextTracks && Html5.TEST_VID.textTracks.length > 0) { - supportsTextTracks = typeof Html5.TEST_VID.textTracks[0]['mode'] !== 'number'; + supportsTextTracks = typeof Html5.TEST_VID.textTracks[0].mode !== 'number'; } if (supportsTextTracks && browser.IS_FIREFOX) { supportsTextTracks = false; @@ -15011,6 +13445,28 @@ Html5.supportsNativeTextTracks = function () { return supportsTextTracks; }; +/** + * Check to see if native video tracks are supported by this browser/device + * + * @return {Boolean} + */ +Html5.supportsNativeVideoTracks = function () { + var supportsVideoTracks = !!Html5.TEST_VID.videoTracks; + + return supportsVideoTracks; +}; + +/** + * Check to see if native audio tracks are supported by this browser/device + * + * @return {Boolean} + */ +Html5.supportsNativeAudioTracks = function () { + var supportsAudioTracks = !!Html5.TEST_VID.audioTracks; + + return supportsAudioTracks; +}; + /** * An array of events available on the Html5 tech. * @@ -15019,56 +13475,76 @@ Html5.supportsNativeTextTracks = function () { */ Html5.Events = ['loadstart', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'loadedmetadata', 'loadeddata', 'canplay', 'canplaythrough', 'playing', 'waiting', 'seeking', 'seeked', 'ended', 'durationchange', 'timeupdate', 'progress', 'play', 'pause', 'ratechange', 'volumechange']; -/* +/** * Set the tech's volume control support status * * @type {Boolean} */ -Html5.prototype['featuresVolumeControl'] = Html5.canControlVolume(); +Html5.prototype.featuresVolumeControl = Html5.canControlVolume(); -/* +/** * Set the tech's playbackRate support status * * @type {Boolean} */ -Html5.prototype['featuresPlaybackRate'] = Html5.canControlPlaybackRate(); +Html5.prototype.featuresPlaybackRate = Html5.canControlPlaybackRate(); -/* +/** * Set the tech's status on moving the video element. * In iOS, if you move a video element in the DOM, it breaks video playback. * * @type {Boolean} */ -Html5.prototype['movingMediaElementInDOM'] = !browser.IS_IOS; +Html5.prototype.movingMediaElementInDOM = !browser.IS_IOS; -/* +/** * Set the the tech's fullscreen resize support status. * HTML video is able to automatically resize when going to fullscreen. * (No longer appears to be used. Can probably be removed.) */ -Html5.prototype['featuresFullscreenResize'] = true; +Html5.prototype.featuresFullscreenResize = true; -/* +/** * Set the tech's progress event support status * (this disables the manual progress events of the Tech) */ -Html5.prototype['featuresProgressEvents'] = true; +Html5.prototype.featuresProgressEvents = true; -/* +/** + * Set the tech's timeupdate event support status + * (this disables the manual timeupdate events of the Tech) + */ +Html5.prototype.featuresTimeupdateEvents = true; + +/** * Sets the tech's status on native text track support * * @type {Boolean} */ -Html5.prototype['featuresNativeTextTracks'] = Html5.supportsNativeTextTracks(); - -// HTML5 Feature detection and Device Fixes --------------------------------- // -var canPlayType = undefined; -var mpegurlRE = /^application\/(?:x-|vnd\.apple\.)mpegurl/i; -var mp4RE = /^video\/mp4/i; +Html5.prototype.featuresNativeTextTracks = Html5.supportsNativeTextTracks(); -Html5.patchCanPlayType = function () { +/** + * Sets the tech's status on native text track support + * + * @type {Boolean} + */ +Html5.prototype.featuresNativeVideoTracks = Html5.supportsNativeVideoTracks(); + +/** + * Sets the tech's status on native audio track support + * + * @type {Boolean} + */ +Html5.prototype.featuresNativeAudioTracks = Html5.supportsNativeAudioTracks(); + +// HTML5 Feature detection and Device Fixes --------------------------------- // +var canPlayType = void 0; +var mpegurlRE = /^application\/(?:x-|vnd\.apple\.)mpegurl/i; +var mp4RE = /^video\/mp4/i; + +Html5.patchCanPlayType = function () { // Android 4.0 and above can play HLS to some extent but it reports being unable to do so - if (browser.ANDROID_VERSION >= 4.0) { + if (browser.ANDROID_VERSION >= 4.0 && !browser.IS_FIREFOX) { if (!canPlayType) { canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType; } @@ -15098,6 +13574,7 @@ Html5.patchCanPlayType = function () { Html5.unpatchCanPlayType = function () { var r = Html5.TEST_VID.constructor.prototype.canPlayType; + Html5.TEST_VID.constructor.prototype.canPlayType = canPlayType; canPlayType = null; return r; @@ -15145,6 +13622,7 @@ Html5.resetMediaElement = function (el) { var sources = el.querySelectorAll('source'); var i = sources.length; + while (i--) { el.removeChild(sources[i]); } @@ -15158,45 +13636,378 @@ Html5.resetMediaElement = function (el) { (function () { try { el.load(); - } catch (e) {} + } catch (e) { + // satisfy linter + } })(); } }; -_component2['default'].registerComponent('Html5', Html5); -_techJs2['default'].registerTech('Html5', Html5); -exports['default'] = Html5; -module.exports = exports['default']; +/* Native HTML5 element property wrapping ----------------------------------- */ +// Wrap native properties with a getter +[ +/** + * Paused for html5 tech + * + * @method Html5.prototype.paused + * @return {Boolean} + */ +'paused', +/** + * Get current time + * + * @method Html5.prototype.currentTime + * @return {Number} + */ +'currentTime', +/** + * Get a TimeRange object that represents the intersection + * of the time ranges for which the user agent has all + * relevant media + * + * @return {TimeRangeObject} + * @method Html5.prototype.buffered + */ +'buffered', +/** + * Get volume level + * + * @return {Number} + * @method Html5.prototype.volume + */ +'volume', +/** + * Get if muted + * + * @return {Boolean} + * @method Html5.prototype.muted + */ +'muted', +/** + * Get poster + * + * @return {String} + * @method Html5.prototype.poster + */ +'poster', +/** + * Get preload attribute + * + * @return {String} + * @method Html5.prototype.preload + */ +'preload', +/** + * Get autoplay attribute + * + * @return {String} + * @method Html5.prototype.autoplay + */ +'autoplay', +/** + * Get controls attribute + * + * @return {String} + * @method Html5.prototype.controls + */ +'controls', +/** + * Get loop attribute + * + * @return {String} + * @method Html5.prototype.loop + */ +'loop', +/** + * Get error value + * + * @return {String} + * @method Html5.prototype.error + */ +'error', +/** + * Get whether or not the player is in the "seeking" state + * + * @return {Boolean} + * @method Html5.prototype.seeking + */ +'seeking', +/** + * Get a TimeRanges object that represents the + * ranges of the media resource to which it is possible + * for the user agent to seek. + * + * @return {TimeRangeObject} + * @method Html5.prototype.seekable + */ +'seekable', +/** + * Get if video ended + * + * @return {Boolean} + * @method Html5.prototype.ended + */ +'ended', +/** + * Get the value of the muted content attribute + * This attribute has no dynamic effect, it only + * controls the default state of the element + * + * @return {Boolean} + * @method Html5.prototype.defaultMuted + */ +'defaultMuted', +/** + * Get desired speed at which the media resource is to play + * + * @return {Number} + * @method Html5.prototype.playbackRate + */ +'playbackRate', +/** + * Returns a TimeRanges object that represents the ranges of the + * media resource that the user agent has played. + * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-played + * + * @return {TimeRangeObject} the range of points on the media + * timeline that has been reached through + * normal playback + * @method Html5.prototype.played + */ +'played', +/** + * Get the current state of network activity for the element, from + * the list below + * - NETWORK_EMPTY (numeric value 0) + * - NETWORK_IDLE (numeric value 1) + * - NETWORK_LOADING (numeric value 2) + * - NETWORK_NO_SOURCE (numeric value 3) + * + * @return {Number} + * @method Html5.prototype.networkState + */ +'networkState', +/** + * Get a value that expresses the current state of the element + * with respect to rendering the current playback position, from + * the codes in the list below + * - HAVE_NOTHING (numeric value 0) + * - HAVE_METADATA (numeric value 1) + * - HAVE_CURRENT_DATA (numeric value 2) + * - HAVE_FUTURE_DATA (numeric value 3) + * - HAVE_ENOUGH_DATA (numeric value 4) + * + * @return {Number} + * @method Html5.prototype.readyState + */ +'readyState', +/** + * Get width of video + * + * @return {Number} + * @method Html5.prototype.videoWidth + */ +'videoWidth', +/** + * Get height of video + * + * @return {Number} + * @method Html5.prototype.videoHeight + */ +'videoHeight'].forEach(function (prop) { + Html5.prototype[prop] = function () { + return this.el_[prop]; + }; +}); + +// Wrap native properties with a setter in this format: +// set + toTitleCase(name) +[ +/** + * Set volume level + * + * @param {Number} percentAsDecimal Volume percent as a decimal + * @method Html5.prototype.setVolume + */ +'volume', +/** + * Set muted + * + * @param {Boolean} muted If player is to be muted or note + * @method Html5.prototype.setMuted + */ +'muted', +/** + * Set video source + * + * @param {Object} src Source object + * @deprecated since version 5 + * @method Html5.prototype.setSrc + */ +'src', +/** + * Set poster + * + * @param {String} val URL to poster image + * @method Html5.prototype.setPoster + */ +'poster', +/** + * Set preload attribute + * + * @param {String} val Value for the preload attribute + * @method Htm5.prototype.setPreload + */ +'preload', +/** + * Set autoplay attribute + * + * @param {Boolean} autoplay Value for the autoplay attribute + * @method setAutoplay + */ +'autoplay', +/** + * Set loop attribute + * + * @param {Boolean} loop Value for the loop attribute + * @method Html5.prototype.setLoop + */ +'loop', +/** + * Set desired speed at which the media resource is to play + * + * @param {Number} val Speed at which the media resource is to play + * @method Html5.prototype.setPlaybackRate + */ +'playbackRate'].forEach(function (prop) { + Html5.prototype['set' + (0, _toTitleCase2['default'])(prop)] = function (v) { + this.el_[prop] = v; + }; +}); + +// wrap native functions with a function +[ +/** + * Pause for html5 tech + * + * @method Html5.prototype.pause + */ +'pause', +/** + * Load media into player + * + * @method Html5.prototype.load + */ +'load'].forEach(function (prop) { + Html5.prototype[prop] = function () { + return this.el_[prop](); + }; +}); + +// Add Source Handler pattern functions to this tech +_tech2['default'].withSourceHandlers(Html5); + +/** + * The default native source handler. + * This simply passes the source to the video element. Nothing fancy. + * + * @param {Object} source The source object + * @param {Html5} tech The instance of the HTML5 tech + */ +Html5.nativeSourceHandler = {}; + +/** + * Check if the video element can play the given videotype + * + * @param {String} type The mimetype to check + * @return {String} 'probably', 'maybe', or '' (empty string) + */ +Html5.nativeSourceHandler.canPlayType = function (type) { + // IE9 on Windows 7 without MediaPlayer throws an error here + // https://github.com/videojs/video.js/issues/519 + try { + return Html5.TEST_VID.canPlayType(type); + } catch (e) { + return ''; + } +}; + +/** + * Check if the video element can handle the source natively + * + * @param {Object} source The source object + * @param {Object} options The options passed to the tech + * @return {String} 'probably', 'maybe', or '' (empty string) + */ +Html5.nativeSourceHandler.canHandleSource = function (source, options) { + + // If a type was provided we should rely on that + if (source.type) { + return Html5.nativeSourceHandler.canPlayType(source.type); + + // If no type, fall back to checking 'video/[EXTENSION]' + } else if (source.src) { + var ext = Url.getFileExtension(source.src); + + return Html5.nativeSourceHandler.canPlayType('video/' + ext); + } + + return ''; +}; -},{"../component":67,"../utils/browser.js":129,"../utils/dom.js":132,"../utils/fn.js":134,"../utils/log.js":137,"../utils/merge-options.js":138,"../utils/url.js":142,"./tech.js":119,"global/document":1,"global/window":2,"object.assign":45}],118:[function(_dereq_,module,exports){ /** - * @file loader.js + * Pass the source to the video element + * Adaptive source handlers will have more complicated workflows before passing + * video data to the video element + * + * @param {Object} source The source object + * @param {Html5} tech The instance of the Html5 tech + * @param {Object} options The options to pass to the source + */ +Html5.nativeSourceHandler.handleSource = function (source, tech, options) { + tech.setSrc(source.src); +}; + +/* + * Clean up the source handler when disposing the player or switching sources.. + * (no cleanup is needed when supporting the format natively) */ +Html5.nativeSourceHandler.dispose = function () {}; + +// Register the native source handler +Html5.registerSourceHandler(Html5.nativeSourceHandler); + +_component2['default'].registerComponent('Html5', Html5); +_tech2['default'].registerTech('Html5', Html5); +exports['default'] = Html5; + +},{"139":139,"149":149,"5":5,"63":63,"79":79,"82":82,"84":84,"87":87,"88":88,"92":92,"93":93,"95":95,"96":96}],62:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _component = _dereq_(5); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _component2 = _interopRequireDefault(_component); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _tech = _dereq_(63); -var _componentJs = _dereq_('../component.js'); +var _tech2 = _interopRequireDefault(_tech); -var _componentJs2 = _interopRequireDefault(_componentJs); +var _toTitleCase = _dereq_(92); -var _techJs = _dereq_('./tech.js'); +var _toTitleCase2 = _interopRequireDefault(_toTitleCase); -var _techJs2 = _interopRequireDefault(_techJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _globalWindow = _dereq_('global/window'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _globalWindow2 = _interopRequireDefault(_globalWindow); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _utilsToTitleCaseJs = _dereq_('../utils/to-title-case.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file loader.js + */ -var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs); /** * The Media Loader is the component that decides which playback technology to load @@ -15208,26 +14019,26 @@ var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs); * @extends Component * @class MediaLoader */ - -var MediaLoader = (function (_Component) { +var MediaLoader = function (_Component) { _inherits(MediaLoader, _Component); function MediaLoader(player, options, ready) { _classCallCheck(this, MediaLoader); - _Component.call(this, player, options, ready); - // If there are no sources when the player is initialized, // load the first supported playback technology. - if (!options.playerOptions['sources'] || options.playerOptions['sources'].length === 0) { - for (var i = 0, j = options.playerOptions['techOrder']; i < j.length; i++) { - var techName = _utilsToTitleCaseJs2['default'](j[i]); - var tech = _techJs2['default'].getTech(techName); + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options, ready)); + + if (!options.playerOptions.sources || options.playerOptions.sources.length === 0) { + for (var i = 0, j = options.playerOptions.techOrder; i < j.length; i++) { + var techName = (0, _toTitleCase2['default'])(j[i]); + var tech = _tech2['default'].getTech(techName); + // Support old behavior of techs being registered as components. // Remove once that deprecated behavior is removed. if (!techName) { - tech = _componentJs2['default'].getComponent(techName); + tech = _component2['default'].getComponent(techName); } // Check if the browser supports this technology @@ -15237,87 +14048,117 @@ var MediaLoader = (function (_Component) { } } } else { - // // Loop through playback technologies (HTML5, Flash) and check for support. - // // Then load the best source. - // // A few assumptions here: - // // All playback technologies respect preload false. - player.src(options.playerOptions['sources']); + // Loop through playback technologies (HTML5, Flash) and check for support. + // Then load the best source. + // A few assumptions here: + // All playback technologies respect preload false. + player.src(options.playerOptions.sources); } + return _this; } return MediaLoader; -})(_componentJs2['default']); +}(_component2['default']); -_componentJs2['default'].registerComponent('MediaLoader', MediaLoader); +_component2['default'].registerComponent('MediaLoader', MediaLoader); exports['default'] = MediaLoader; -module.exports = exports['default']; - -},{"../component.js":67,"../utils/to-title-case.js":141,"./tech.js":119,"global/window":2}],119:[function(_dereq_,module,exports){ -/** - * @file tech.js - * Media Technology Controller - Base class for media playback - * technology controllers like Flash and HTML5 - */ +},{"5":5,"63":63,"92":92}],63:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _component = _dereq_(5); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _component2 = _interopRequireDefault(_component); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _htmlTrackElement = _dereq_(67); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var _htmlTrackElement2 = _interopRequireDefault(_htmlTrackElement); -var _component = _dereq_('../component'); +var _htmlTrackElementList = _dereq_(66); -var _component2 = _interopRequireDefault(_component); +var _htmlTrackElementList2 = _interopRequireDefault(_htmlTrackElementList); + +var _mergeOptions = _dereq_(88); + +var _mergeOptions2 = _interopRequireDefault(_mergeOptions); + +var _textTrack = _dereq_(73); + +var _textTrack2 = _interopRequireDefault(_textTrack); + +var _textTrackList = _dereq_(71); + +var _textTrackList2 = _interopRequireDefault(_textTrackList); + +var _videoTrackList = _dereq_(77); + +var _videoTrackList2 = _interopRequireDefault(_videoTrackList); -var _tracksHtmlTrackElement = _dereq_('../tracks/html-track-element'); +var _audioTrackList = _dereq_(64); -var _tracksHtmlTrackElement2 = _interopRequireDefault(_tracksHtmlTrackElement); +var _audioTrackList2 = _interopRequireDefault(_audioTrackList); -var _tracksHtmlTrackElementList = _dereq_('../tracks/html-track-element-list'); +var _fn = _dereq_(84); -var _tracksHtmlTrackElementList2 = _interopRequireDefault(_tracksHtmlTrackElementList); +var Fn = _interopRequireWildcard(_fn); -var _utilsMergeOptionsJs = _dereq_('../utils/merge-options.js'); +var _log = _dereq_(87); -var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs); +var _log2 = _interopRequireDefault(_log); -var _tracksTextTrack = _dereq_('../tracks/text-track'); +var _timeRanges = _dereq_(91); -var _tracksTextTrack2 = _interopRequireDefault(_tracksTextTrack); +var _buffer = _dereq_(80); -var _tracksTextTrackList = _dereq_('../tracks/text-track-list'); +var _mediaError = _dereq_(46); -var _tracksTextTrackList2 = _interopRequireDefault(_tracksTextTrackList); +var _mediaError2 = _interopRequireDefault(_mediaError); -var _utilsFnJs = _dereq_('../utils/fn.js'); +var _window = _dereq_(96); -var Fn = _interopRequireWildcard(_utilsFnJs); +var _window2 = _interopRequireDefault(_window); -var _utilsLogJs = _dereq_('../utils/log.js'); +var _document = _dereq_(95); -var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs); +var _document2 = _interopRequireDefault(_document); -var _utilsTimeRangesJs = _dereq_('../utils/time-ranges.js'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _utilsBufferJs = _dereq_('../utils/buffer.js'); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _mediaErrorJs = _dereq_('../media-error.js'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file tech.js + * Media Technology Controller - Base class for media playback + * technology controllers like Flash and HTML5 + */ -var _mediaErrorJs2 = _interopRequireDefault(_mediaErrorJs); +function createTrackHelper(self, kind, label, language) { + var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + + var tracks = self.textTracks(); + + options.kind = kind; -var _globalWindow = _dereq_('global/window'); + if (label) { + options.label = label; + } + if (language) { + options.language = language; + } + options.tech = self; -var _globalWindow2 = _interopRequireDefault(_globalWindow); + var track = new _textTrack2['default'](options); -var _globalDocument = _dereq_('global/document'); + tracks.addTrack_(track); -var _globalDocument2 = _interopRequireDefault(_globalDocument); + return track; +} /** * Base class for media (HTML5 Video, Flash) controllers @@ -15328,63 +14169,63 @@ var _globalDocument2 = _interopRequireDefault(_globalDocument); * @class Tech */ -var Tech = (function (_Component) { +var Tech = function (_Component) { _inherits(Tech, _Component); function Tech() { - var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; - var ready = arguments.length <= 1 || arguments[1] === undefined ? function () {} : arguments[1]; + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var ready = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {}; _classCallCheck(this, Tech); // we don't want the tech to report user activity automatically. // This is done manually in addControlsListeners options.reportTouchActivity = false; - _Component.call(this, null, options, ready); // keep track of whether the current source has played at all to // implement a very limited played() - this.hasStarted_ = false; - this.on('playing', function () { + var _this = _possibleConstructorReturn(this, _Component.call(this, null, options, ready)); + + _this.hasStarted_ = false; + _this.on('playing', function () { this.hasStarted_ = true; }); - this.on('loadstart', function () { + _this.on('loadstart', function () { this.hasStarted_ = false; }); - this.textTracks_ = options.textTracks; + _this.textTracks_ = options.textTracks; + _this.videoTracks_ = options.videoTracks; + _this.audioTracks_ = options.audioTracks; // Manually track progress in cases where the browser/flash player doesn't report it. - if (!this.featuresProgressEvents) { - this.manualProgressOn(); + if (!_this.featuresProgressEvents) { + _this.manualProgressOn(); } // Manually track timeupdates in cases where the browser/flash player doesn't report it. - if (!this.featuresTimeupdateEvents) { - this.manualTimeUpdatesOn(); + if (!_this.featuresTimeupdateEvents) { + _this.manualTimeUpdatesOn(); } if (options.nativeCaptions === false || options.nativeTextTracks === false) { - this.featuresNativeTextTracks = false; + _this.featuresNativeTextTracks = false; } - if (!this.featuresNativeTextTracks) { - this.on('ready', this.emulateTextTracks); + if (!_this.featuresNativeTextTracks) { + _this.emulateTextTracks(); } - this.initTextTrackListeners(); + _this.autoRemoteTextTracks_ = new _textTrackList2['default'](); + + _this.initTextTrackListeners(); + _this.initTrackListeners(); // Turn on component tap events - this.emitTapEvents(); + _this.emitTapEvents(); + return _this; } - /* - * List of associated text tracks - * - * @type {Array} - * @private - */ - /* Fallbacks for unsupported event types ================================================================================ */ // Manually trigger progress events based on changes to the buffered amount @@ -15395,6 +14236,7 @@ var Tech = (function (_Component) { * @method manualProgressOn */ + Tech.prototype.manualProgressOn = function manualProgressOn() { this.on('durationchange', this.onDurationChange); @@ -15410,6 +14252,7 @@ var Tech = (function (_Component) { * @method manualProgressOff */ + Tech.prototype.manualProgressOff = function manualProgressOff() { this.manualProgress = false; this.stopTrackingProgress(); @@ -15423,6 +14266,7 @@ var Tech = (function (_Component) { * @method trackProgress */ + Tech.prototype.trackProgress = function trackProgress() { this.stopTrackingProgress(); this.progressInterval = this.setInterval(Fn.bind(this, function () { @@ -15448,6 +14292,7 @@ var Tech = (function (_Component) { * @method onDurationChange */ + Tech.prototype.onDurationChange = function onDurationChange() { this.duration_ = this.duration(); }; @@ -15459,8 +14304,9 @@ var Tech = (function (_Component) { * @method buffered */ + Tech.prototype.buffered = function buffered() { - return _utilsTimeRangesJs.createTimeRange(0, 0); + return (0, _timeRanges.createTimeRange)(0, 0); }; /** @@ -15470,8 +14316,9 @@ var Tech = (function (_Component) { * @method bufferedPercent */ + Tech.prototype.bufferedPercent = function bufferedPercent() { - return _utilsBufferJs.bufferedPercent(this.buffered(), this.duration_); + return (0, _buffer.bufferedPercent)(this.buffered(), this.duration_); }; /** @@ -15480,17 +14327,18 @@ var Tech = (function (_Component) { * @method stopTrackingProgress */ + Tech.prototype.stopTrackingProgress = function stopTrackingProgress() { this.clearInterval(this.progressInterval); }; - /*! Time Tracking -------------------------------------------------------------- */ /** * Set event listeners for on play and pause and tracking current time * * @method manualTimeUpdatesOn */ + Tech.prototype.manualTimeUpdatesOn = function manualTimeUpdatesOn() { this.manualTimeUpdates = true; @@ -15504,6 +14352,7 @@ var Tech = (function (_Component) { * @method manualTimeUpdatesOff */ + Tech.prototype.manualTimeUpdatesOff = function manualTimeUpdatesOff() { this.manualTimeUpdates = false; this.stopTrackingCurrentTime(); @@ -15517,13 +14366,16 @@ var Tech = (function (_Component) { * @method trackCurrentTime */ + Tech.prototype.trackCurrentTime = function trackCurrentTime() { if (this.currentTimeInterval) { this.stopTrackingCurrentTime(); } this.currentTimeInterval = this.setInterval(function () { this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true }); - }, 250); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15 + + // 42 = 24 fps // 250 is what Webkit uses // FF uses 15 + }, 250); }; /** @@ -15532,6 +14384,7 @@ var Tech = (function (_Component) { * @method stopTrackingCurrentTime */ + Tech.prototype.stopTrackingCurrentTime = function stopTrackingCurrentTime() { this.clearInterval(this.currentTimeInterval); @@ -15546,16 +14399,11 @@ var Tech = (function (_Component) { * @method dispose */ + Tech.prototype.dispose = function dispose() { - // clear out text tracks because we can't reuse them between techs - var textTracks = this.textTracks(); - if (textTracks) { - var i = textTracks.length; - while (i--) { - this.removeRemoteTextTrack(textTracks[i]); - } - } + // clear out all tracks because we can't reuse them between techs + this.clearTracks(['audio', 'video', 'text']); // Turn off any manual progress or timeupdate tracking if (this.manualProgress) { @@ -15569,12 +14417,65 @@ var Tech = (function (_Component) { _Component.prototype.dispose.call(this); }; + /** + * clear out a track list, or multiple track lists + * + * Note: Techs without source handlers should call this between + * sources for video & audio tracks, as usually you don't want + * to use them between tracks and we have no automatic way to do + * it for you + * + * @method clearTracks + * @param {Array|String} types type(s) of track lists to empty + */ + + + Tech.prototype.clearTracks = function clearTracks(types) { + var _this2 = this; + + types = [].concat(types); + // clear out all tracks because we can't reuse them between techs + types.forEach(function (type) { + var list = _this2[type + 'Tracks']() || []; + var i = list.length; + + while (i--) { + var track = list[i]; + + if (type === 'text') { + _this2.removeRemoteTextTrack(track); + } + list.removeTrack_(track); + } + }); + }; + + /** + * Remove any TextTracks added via addRemoteTextTrack that are + * flagged for automatic garbage collection + * + * @method cleanupAutoTextTracks + */ + + + Tech.prototype.cleanupAutoTextTracks = function cleanupAutoTextTracks() { + var list = this.autoRemoteTextTracks_ || []; + var i = list.length; + + while (i--) { + var track = list[i]; + + this.removeRemoteTextTrack(track); + } + }; + /** * Reset the tech. Removes all sources and resets readyState. * * @method reset */ + Tech.prototype.reset = function reset() {}; /** @@ -15587,13 +14488,10 @@ var Tech = (function (_Component) { * @method error */ + Tech.prototype.error = function error(err) { if (err !== undefined) { - if (err instanceof _mediaErrorJs2['default']) { - this.error_ = err; - } else { - this.error_ = new _mediaErrorJs2['default'](err); - } + this.error_ = new _mediaError2['default'](err); this.trigger('error'); } return this.error_; @@ -15609,11 +14507,12 @@ var Tech = (function (_Component) { * @method played */ + Tech.prototype.played = function played() { if (this.hasStarted_) { - return _utilsTimeRangesJs.createTimeRange(0, 0); + return (0, _timeRanges.createTimeRange)(0, 0); } - return _utilsTimeRangesJs.createTimeRange(); + return (0, _timeRanges.createTimeRange)(); }; /** @@ -15622,6 +14521,7 @@ var Tech = (function (_Component) { * @method setCurrentTime */ + Tech.prototype.setCurrentTime = function setCurrentTime() { // improve the accuracy of manual timeupdates if (this.manualTimeUpdates) { @@ -15635,6 +14535,7 @@ var Tech = (function (_Component) { * @method initTextTrackListeners */ + Tech.prototype.initTextTrackListeners = function initTextTrackListeners() { var textTrackListChanges = Fn.bind(this, function () { this.trigger('texttrackchange'); @@ -15642,7 +14543,9 @@ var Tech = (function (_Component) { var tracks = this.textTracks(); - if (!tracks) return; + if (!tracks) { + return; + } tracks.addEventListener('removetrack', textTrackListChanges); tracks.addEventListener('addtrack', textTrackListChanges); @@ -15654,46 +14557,105 @@ var Tech = (function (_Component) { }; /** - * Emulate texttracks + * Initialize audio and video track listeners * - * @method emulateTextTracks + * @method initTrackListeners */ - Tech.prototype.emulateTextTracks = function emulateTextTracks() { - var _this = this; - var tracks = this.textTracks(); - if (!tracks) { - return; - } + Tech.prototype.initTrackListeners = function initTrackListeners() { + var _this3 = this; + + var trackTypes = ['video', 'audio']; + + trackTypes.forEach(function (type) { + var trackListChanges = function trackListChanges() { + _this3.trigger(type + 'trackchange'); + }; + + var tracks = _this3[type + 'Tracks'](); + + tracks.addEventListener('removetrack', trackListChanges); + tracks.addEventListener('addtrack', trackListChanges); + + _this3.on('dispose', function () { + tracks.removeEventListener('removetrack', trackListChanges); + tracks.removeEventListener('addtrack', trackListChanges); + }); + }); + }; + + /** + * Add vtt.js if necessary + * + * @private + */ + + + Tech.prototype.addWebVttScript_ = function addWebVttScript_() { + var _this4 = this; - if (!_globalWindow2['default']['WebVTT'] && this.el().parentNode != null) { + if (!_window2['default'].WebVTT && this.el().parentNode !== null && this.el().parentNode !== undefined) { (function () { - var script = _globalDocument2['default'].createElement('script'); - script.src = _this.options_['vtt.js'] || 'https://cdn.rawgit.com/gkatsev/vtt.js/vjs-v0.12.1/dist/vtt.min.js'; + var script = _document2['default'].createElement('script'); + + script.src = _this4.options_['vtt.js'] || 'https://cdn.rawgit.com/gkatsev/vtt.js/vjs-v0.12.1/dist/vtt.min.js'; script.onload = function () { - _this.trigger('vttjsloaded'); + _this4.trigger('vttjsloaded'); }; script.onerror = function () { - _this.trigger('vttjserror'); + _this4.trigger('vttjserror'); }; - _this.on('dispose', function () { + _this4.on('dispose', function () { script.onload = null; script.onerror = null; }); - _this.el().parentNode.appendChild(script); - _globalWindow2['default']['WebVTT'] = true; + // but have not loaded yet and we set it to true before the inject so that + // we don't overwrite the injected window.WebVTT if it loads right away + _window2['default'].WebVTT = true; + _this4.el().parentNode.appendChild(script); })(); } + }; + + /** + * Emulate texttracks + * + * @method emulateTextTracks + */ + + + Tech.prototype.emulateTextTracks = function emulateTextTracks() { + var _this5 = this; + + var tracks = this.textTracks(); + + if (!tracks) { + return; + } + + this.remoteTextTracks().on('addtrack', function (e) { + _this5.textTracks().addTrack_(e.track); + }); + + this.remoteTextTracks().on('removetrack', function (e) { + _this5.textTracks().removeTrack_(e.track); + }); + + // Initially, Tech.el_ is a child of a dummy-div wait until the Component system + // signals that the Tech is ready at which point Tech.el_ is part of the DOM + // before inserting the WebVTT script + this.on('ready', this.addWebVttScript_); var updateDisplay = function updateDisplay() { - return _this.trigger('texttrackchange'); + return _this5.trigger('texttrackchange'); }; var textTracksChanges = function textTracksChanges() { updateDisplay(); for (var i = 0; i < tracks.length; i++) { var track = tracks[i]; + track.removeEventListener('cuechange', updateDisplay); if (track.mode === 'showing') { track.addEventListener('cuechange', updateDisplay); @@ -15709,6 +14671,32 @@ var Tech = (function (_Component) { }); }; + /** + * Get videotracks + * + * @returns {VideoTrackList} + * @method videoTracks + */ + + + Tech.prototype.videoTracks = function videoTracks() { + this.videoTracks_ = this.videoTracks_ || new _videoTrackList2['default'](); + return this.videoTracks_; + }; + + /** + * Get audiotracklist + * + * @returns {AudioTrackList} + * @method audioTracks + */ + + + Tech.prototype.audioTracks = function audioTracks() { + this.audioTracks_ = this.audioTracks_ || new _audioTrackList2['default'](); + return this.audioTracks_; + }; + /* * Provide default methods for text tracks. * @@ -15722,8 +14710,9 @@ var Tech = (function (_Component) { * @method textTracks */ + Tech.prototype.textTracks = function textTracks() { - this.textTracks_ = this.textTracks_ || new _tracksTextTrackList2['default'](); + this.textTracks_ = this.textTracks_ || new _textTrackList2['default'](); return this.textTracks_; }; @@ -15734,8 +14723,9 @@ var Tech = (function (_Component) { * @method remoteTextTracks */ + Tech.prototype.remoteTextTracks = function remoteTextTracks() { - this.remoteTextTracks_ = this.remoteTextTracks_ || new _tracksTextTrackList2['default'](); + this.remoteTextTracks_ = this.remoteTextTracks_ || new _textTrackList2['default'](); return this.remoteTextTracks_; }; @@ -15746,8 +14736,9 @@ var Tech = (function (_Component) { * @method remoteTextTrackEls */ + Tech.prototype.remoteTextTrackEls = function remoteTextTrackEls() { - this.remoteTextTrackEls_ = this.remoteTextTrackEls_ || new _tracksHtmlTrackElementList2['default'](); + this.remoteTextTrackEls_ = this.remoteTextTrackEls_ || new _htmlTrackElementList2['default'](); return this.remoteTextTrackEls_; }; @@ -15762,6 +14753,7 @@ var Tech = (function (_Component) { * @method addTextTrack */ + Tech.prototype.addTextTrack = function addTextTrack(kind, label, language) { if (!kind) { throw new Error('TextTrack kind is required but was not provided'); @@ -15771,27 +14763,58 @@ var Tech = (function (_Component) { }; /** - * Creates a remote text track object and returns a emulated html track element + * Create an emulated TextTrack for use by addRemoteTextTrack + * + * This is intended to be overridden by classes that inherit from + * Tech in order to create native or custom TextTracks. * * @param {Object} options The object should contain values for * kind, language, label and src (location of the WebVTT file) - * @return {HTMLTrackElement} - * @method addRemoteTextTrack */ - Tech.prototype.addRemoteTextTrack = function addRemoteTextTrack(options) { - var track = _utilsMergeOptionsJs2['default'](options, { + + Tech.prototype.createRemoteTextTrack = function createRemoteTextTrack(options) { + var track = (0, _mergeOptions2['default'])(options, { tech: this }); - var htmlTrackElement = new _tracksHtmlTrackElement2['default'](track); + return new _htmlTrackElement2['default'](track); + }; + + /** + * Creates a remote text track object and returns an html track element. + * + * @param {Object} options The object should contain values for + * kind, language, label, and src (location of the WebVTT file) + * @param {Boolean} [manualCleanup=true] if set to false, the TextTrack will be + * automatically removed from the video element whenever the source changes + * @return {HTMLTrackElement} An Html Track Element. + * This can be an emulated {@link HTMLTrackElement} or a native one. + * @deprecated The default value of the "manualCleanup" parameter will default + * to "false" in upcoming versions of Video.js + */ + + + Tech.prototype.addRemoteTextTrack = function addRemoteTextTrack() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var manualCleanup = arguments[1]; + + var htmlTrackElement = this.createRemoteTextTrack(options); + + if (manualCleanup !== true && manualCleanup !== false) { + // deprecation warning + _log2['default'].warn('Calling addRemoteTextTrack without explicitly setting the "manualCleanup" parameter to `true` is deprecated and default to `false` in future version of video.js'); + manualCleanup = true; + } // store HTMLTrackElement and TextTrack to remote list this.remoteTextTrackEls().addTrackElement_(htmlTrackElement); this.remoteTextTracks().addTrack_(htmlTrackElement.track); - // must come after remoteTextTracks() - this.textTracks().addTrack_(htmlTrackElement.track); + if (manualCleanup !== true) { + // create the TextTrackList if it doesn't exist + this.autoRemoteTextTracks_.addTrack_(htmlTrackElement.track); + } return htmlTrackElement; }; @@ -15803,14 +14826,14 @@ var Tech = (function (_Component) { * @method removeRemoteTextTrack */ - Tech.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) { - this.textTracks().removeTrack_(track); + Tech.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) { var trackElement = this.remoteTextTrackEls().getTrackElementByTrack_(track); // remove HTMLTrackElement and TextTrack from remote list this.remoteTextTrackEls().removeTrackElement_(trackElement); this.remoteTextTracks().removeTrack_(track); + this.autoRemoteTextTracks_.removeTrack_(track); }; /** @@ -15821,6 +14844,7 @@ var Tech = (function (_Component) { * @method setPoster */ + Tech.prototype.setPoster = function setPoster() {}; /* @@ -15833,6 +14857,7 @@ var Tech = (function (_Component) { * @return {String} 'probably', 'maybe', or '' (empty string) */ + Tech.prototype.canPlayType = function canPlayType() { return ''; }; @@ -15845,6 +14870,7 @@ var Tech = (function (_Component) { * @return {Boolean} Whether it is a tech or not */ + Tech.isTech = function isTech(component) { return component.prototype instanceof Tech || component instanceof Tech || component === Tech; }; @@ -15858,6 +14884,7 @@ var Tech = (function (_Component) { * @method registerComponent */ + Tech.registerTech = function registerTech(name, tech) { if (!Tech.techs_) { Tech.techs_ = {}; @@ -15880,42 +14907,46 @@ var Tech = (function (_Component) { * @method getComponent */ + Tech.getTech = function getTech(name) { if (Tech.techs_ && Tech.techs_[name]) { return Tech.techs_[name]; } - if (_globalWindow2['default'] && _globalWindow2['default'].videojs && _globalWindow2['default'].videojs[name]) { - _utilsLogJs2['default'].warn('The ' + name + ' tech was added to the videojs object when it should be registered using videojs.registerTech(name, tech)'); - return _globalWindow2['default'].videojs[name]; + if (_window2['default'] && _window2['default'].videojs && _window2['default'].videojs[name]) { + _log2['default'].warn('The ' + name + ' tech was added to the videojs object when it should be registered using videojs.registerTech(name, tech)'); + return _window2['default'].videojs[name]; } }; return Tech; -})(_component2['default']); - -Tech.prototype.textTracks_; +}(_component2['default']); -var createTrackHelper = function createTrackHelper(self, kind, label, language) { - var options = arguments.length <= 4 || arguments[4] === undefined ? {} : arguments[4]; - - var tracks = self.textTracks(); +/** + * List of associated text tracks + * + * @type {TextTrackList} + * @private + */ - options.kind = kind; - if (label) { - options.label = label; - } - if (language) { - options.language = language; - } - options.tech = self; +Tech.prototype.textTracks_; // eslint-disable-line - var track = new _tracksTextTrack2['default'](options); - tracks.addTrack_(track); +/** + * List of associated audio tracks + * + * @type {AudioTrackList} + * @private + */ +Tech.prototype.audioTracks_; // eslint-disable-line - return track; -}; +/** + * List of associated video tracks + * + * @type {VideoTrackList} + * @private + */ +Tech.prototype.videoTracks_; // eslint-disable-line Tech.prototype.featuresVolumeControl = true; @@ -15930,22 +14961,23 @@ Tech.prototype.featuresTimeupdateEvents = false; Tech.prototype.featuresNativeTextTracks = false; -/* +/** * A functional mixin for techs that want to use the Source Handler pattern. * * ##### EXAMPLE: * - * Tech.withSourceHandlers.call(MyTech); + * Tech.withSourceHandlers(MyTech); * */ Tech.withSourceHandlers = function (_Tech) { - /* + + /** * Register a source handler * Source handlers are scripts for handling specific formats. * The source handler pattern is used for adaptive formats (HLS, DASH) that * manually load video data and feed it into a Source Buffer (Media Source Extensions) * @param {Function} handler The source handler - * @param {Boolean} first Register it before any existing handlers + * @param {Number} index The index to register the handler among existing handlers */ _Tech.registerSourceHandler = function (handler, index) { var handlers = _Tech.sourceHandlers; @@ -15962,14 +14994,14 @@ Tech.withSourceHandlers = function (_Tech) { handlers.splice(index, 0, handler); }; - /* + /** * Check if the tech can support the given type * @param {String} type The mimetype to check * @return {String} 'probably', 'maybe', or '' (empty string) */ _Tech.canPlayType = function (type) { var handlers = _Tech.sourceHandlers || []; - var can = undefined; + var can = void 0; for (var i = 0; i < handlers.length; i++) { can = handlers[i].canPlayType(type); @@ -15982,19 +15014,20 @@ Tech.withSourceHandlers = function (_Tech) { return ''; }; - /* + /** * Return the first source handler that supports the source * TODO: Answer question: should 'probably' be prioritized over 'maybe' - * @param {Object} source The source object + * @param {Object} source The source object + * @param {Object} options The options passed to the tech * @returns {Object} The first source handler that supports the source * @returns {null} Null if no source handler is found */ - _Tech.selectSourceHandler = function (source) { + _Tech.selectSourceHandler = function (source, options) { var handlers = _Tech.sourceHandlers || []; - var can = undefined; + var can = void 0; for (var i = 0; i < handlers.length; i++) { - can = handlers[i].canHandleSource(source); + can = handlers[i].canHandleSource(source, options); if (can) { return handlers[i]; @@ -16004,22 +15037,23 @@ Tech.withSourceHandlers = function (_Tech) { return null; }; - /* + /** * Check if the tech can support the given source * @param {Object} srcObj The source object + * @param {Object} options The options passed to the tech * @return {String} 'probably', 'maybe', or '' (empty string) */ - _Tech.canPlaySource = function (srcObj) { - var sh = _Tech.selectSourceHandler(srcObj); + _Tech.canPlaySource = function (srcObj, options) { + var sh = _Tech.selectSourceHandler(srcObj, options); if (sh) { - return sh.canHandleSource(srcObj); + return sh.canHandleSource(srcObj, options); } return ''; }; - /* + /** * When using a source handler, prefer its implementation of * any function normally provided by the tech. */ @@ -16040,7 +15074,7 @@ Tech.withSourceHandlers = function (_Tech) { }; }, _Tech.prototype); - /* + /** * Create a function for setting the source using a source object * and source handlers. * Should never be called unless a source handler was found. @@ -16048,7 +15082,7 @@ Tech.withSourceHandlers = function (_Tech) { * @return {Tech} self */ _Tech.prototype.setSource = function (source) { - var sh = _Tech.selectSourceHandler(source); + var sh = _Tech.selectSourceHandler(source, this.options_); if (!sh) { // Fall back to a native source hander when unsupported sources are @@ -16056,7 +15090,7 @@ Tech.withSourceHandlers = function (_Tech) { if (_Tech.nativeSourceHandler) { sh = _Tech.nativeSourceHandler; } else { - _utilsLogJs2['default'].error('No source hander found for the current source.'); + _log2['default'].error('No source hander found for the current source.'); } } @@ -16064,19 +15098,57 @@ Tech.withSourceHandlers = function (_Tech) { this.disposeSourceHandler(); this.off('dispose', this.disposeSourceHandler); - this.currentSource_ = source; - this.sourceHandler_ = sh.handleSource(source, this); + if (sh !== _Tech.nativeSourceHandler) { + this.currentSource_ = source; + + // Catch if someone replaced the src without calling setSource. + // If they do, set currentSource_ to null and dispose our source handler. + this.off(this.el_, 'loadstart', _Tech.prototype.firstLoadStartListener_); + this.off(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_); + this.one(this.el_, 'loadstart', _Tech.prototype.firstLoadStartListener_); + } + + this.sourceHandler_ = sh.handleSource(source, this, this.options_); this.on('dispose', this.disposeSourceHandler); return this; }; + // On the first loadstart after setSource + _Tech.prototype.firstLoadStartListener_ = function () { + this.one(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_); + }; + + // On successive loadstarts when setSource has not been called again + _Tech.prototype.successiveLoadStartListener_ = function () { + this.disposeSourceHandler(); + this.one(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_); + }; + /* * Clean up any existing source handler */ _Tech.prototype.disposeSourceHandler = function () { - if (this.sourceHandler_ && this.sourceHandler_.dispose) { - this.sourceHandler_.dispose(); + // if we have a source and get another one + // then we are loading something new + // than clear all of our current tracks + if (this.currentSource_) { + this.clearTracks(['audio', 'video']); + this.currentSource_ = null; + } + + // always clean up auto-text tracks + this.cleanupAutoTextTracks(); + + if (this.sourceHandler_) { + this.off(this.el_, 'loadstart', _Tech.prototype.firstLoadStartListener_); + this.off(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_); + + if (this.sourceHandler_.dispose) { + this.sourceHandler_.dispose(); + } + + this.sourceHandler_ = null; } }; }; @@ -16086,132 +15158,378 @@ _component2['default'].registerComponent('Tech', Tech); _component2['default'].registerComponent('MediaTechController', Tech); Tech.registerTech('Tech', Tech); exports['default'] = Tech; -module.exports = exports['default']; - -},{"../component":67,"../media-error.js":103,"../tracks/html-track-element":121,"../tracks/html-track-element-list":120,"../tracks/text-track":128,"../tracks/text-track-list":126,"../utils/buffer.js":130,"../utils/fn.js":134,"../utils/log.js":137,"../utils/merge-options.js":138,"../utils/time-ranges.js":140,"global/document":1,"global/window":2}],120:[function(_dereq_,module,exports){ -/** - * @file html-track-element-list.js - */ +},{"46":46,"5":5,"64":64,"66":66,"67":67,"71":71,"73":73,"77":77,"80":80,"84":84,"87":87,"88":88,"91":91,"95":95,"96":96}],64:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _trackList = _dereq_(75); -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _trackList2 = _interopRequireDefault(_trackList); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _browser = _dereq_(79); -var _utilsBrowserJs = _dereq_('../utils/browser.js'); +var browser = _interopRequireWildcard(_browser); -var browser = _interopRequireWildcard(_utilsBrowserJs); +var _document = _dereq_(95); -var _globalDocument = _dereq_('global/document'); +var _document2 = _interopRequireDefault(_document); -var _globalDocument2 = _interopRequireDefault(_globalDocument); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var HtmlTrackElementList = (function () { - function HtmlTrackElementList() { - var trackElements = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - _classCallCheck(this, HtmlTrackElementList); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - var list = this; +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - if (browser.IS_IE8) { - list = _globalDocument2['default'].createElement('custom'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file audio-track-list.js + */ - for (var prop in HtmlTrackElementList.prototype) { - if (prop !== 'constructor') { - list[prop] = HtmlTrackElementList.prototype[prop]; - } - } - } - list.trackElements_ = []; +/** + * anywhere we call this function we diverge from the spec + * as we only support one enabled audiotrack at a time + * + * @param {Array|AudioTrackList} list list to work on + * @param {AudioTrack} track the track to skip + */ +var disableOthers = function disableOthers(list, track) { + for (var i = 0; i < list.length; i++) { + if (track.id === list[i].id) { + continue; + } + // another audio track is enabled, disable it + list[i].enabled = false; + } +}; - Object.defineProperty(list, 'length', { - get: function get() { - return this.trackElements_.length; - } - }); +/** + * A list of possible audio tracks. All functionality is in the + * base class Tracklist and the spec for AudioTrackList is located at: + * @link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist + * + * interface AudioTrackList : EventTarget { + * readonly attribute unsigned long length; + * getter AudioTrack (unsigned long index); + * AudioTrack? getTrackById(DOMString id); + * + * attribute EventHandler onchange; + * attribute EventHandler onaddtrack; + * attribute EventHandler onremovetrack; + * }; + * + * @param {AudioTrack[]} tracks a list of audio tracks to instantiate the list with + * @extends TrackList + * @class AudioTrackList + */ - for (var i = 0, _length = trackElements.length; i < _length; i++) { - list.addTrackElement_(trackElements[i]); - } +var AudioTrackList = function (_TrackList) { + _inherits(AudioTrackList, _TrackList); - if (browser.IS_IE8) { - return list; - } - } + function AudioTrackList() { + var _this, _ret; - HtmlTrackElementList.prototype.addTrackElement_ = function addTrackElement_(trackElement) { - this.trackElements_.push(trackElement); - }; + var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - HtmlTrackElementList.prototype.getTrackElementByTrack_ = function getTrackElementByTrack_(track) { - var trackElement_ = undefined; + _classCallCheck(this, AudioTrackList); - for (var i = 0, _length2 = this.trackElements_.length; i < _length2; i++) { - if (track === this.trackElements_[i].track) { - trackElement_ = this.trackElements_[i]; + var list = void 0; + // make sure only 1 track is enabled + // sorted from last index to first index + for (var i = tracks.length - 1; i >= 0; i--) { + if (tracks[i].enabled) { + disableOthers(tracks, tracks[i]); break; } } - return trackElement_; - }; - - HtmlTrackElementList.prototype.removeTrackElement_ = function removeTrackElement_(trackElement) { - for (var i = 0, _length3 = this.trackElements_.length; i < _length3; i++) { - if (trackElement === this.trackElements_[i]) { - this.trackElements_.splice(i, 1); - - break; + // IE8 forces us to implement inheritance ourselves + // as it does not support Object.defineProperty properly + if (browser.IS_IE8) { + list = _document2['default'].createElement('custom'); + for (var prop in _trackList2['default'].prototype) { + if (prop !== 'constructor') { + list[prop] = _trackList2['default'].prototype[prop]; + } + } + for (var _prop in AudioTrackList.prototype) { + if (_prop !== 'constructor') { + list[_prop] = AudioTrackList.prototype[_prop]; + } } } - }; - return HtmlTrackElementList; -})(); + list = (_this = _possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this); + list.changing_ = false; -exports['default'] = HtmlTrackElementList; -module.exports = exports['default']; + return _ret = list, _possibleConstructorReturn(_this, _ret); + } + + AudioTrackList.prototype.addTrack_ = function addTrack_(track) { + var _this2 = this; + + if (track.enabled) { + disableOthers(this, track); + } + + _TrackList.prototype.addTrack_.call(this, track); + // native tracks don't have this + if (!track.addEventListener) { + return; + } + + track.addEventListener('enabledchange', function () { + // when we are disabling other tracks (since we don't support + // more than one track at a time) we will set changing_ + // to true so that we don't trigger additional change events + if (_this2.changing_) { + return; + } + _this2.changing_ = true; + disableOthers(_this2, track); + _this2.changing_ = false; + _this2.trigger('change'); + }); + }; + + AudioTrackList.prototype.addTrack = function addTrack(track) { + this.addTrack_(track); + }; + + AudioTrackList.prototype.removeTrack = function removeTrack(track) { + _TrackList.prototype.removeTrack_.call(this, track); + }; + + return AudioTrackList; +}(_trackList2['default']); + +exports['default'] = AudioTrackList; + +},{"75":75,"79":79,"95":95}],65:[function(_dereq_,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _trackEnums = _dereq_(74); + +var _track = _dereq_(76); + +var _track2 = _interopRequireDefault(_track); + +var _mergeOptions = _dereq_(88); + +var _mergeOptions2 = _interopRequireDefault(_mergeOptions); + +var _browser = _dereq_(79); + +var browser = _interopRequireWildcard(_browser); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -},{"../utils/browser.js":129,"global/document":1}],121:[function(_dereq_,module,exports){ /** - * @file html-track-element.js + * A single audio text track as defined in: + * @link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotrack + * + * interface AudioTrack { + * readonly attribute DOMString id; + * readonly attribute DOMString kind; + * readonly attribute DOMString label; + * readonly attribute DOMString language; + * attribute boolean enabled; + * }; + * + * @param {Object=} options Object of option names and values + * @class AudioTrack */ +var AudioTrack = function (_Track) { + _inherits(AudioTrack, _Track); + + function AudioTrack() { + var _this, _ret; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, AudioTrack); + + var settings = (0, _mergeOptions2['default'])(options, { + kind: _trackEnums.AudioTrackKind[options.kind] || '' + }); + // on IE8 this will be a document element + // for every other browser this will be a normal object + var track = (_this = _possibleConstructorReturn(this, _Track.call(this, settings)), _this); + var enabled = false; + + if (browser.IS_IE8) { + for (var prop in AudioTrack.prototype) { + if (prop !== 'constructor') { + track[prop] = AudioTrack.prototype[prop]; + } + } + } + + Object.defineProperty(track, 'enabled', { + get: function get() { + return enabled; + }, + set: function set(newEnabled) { + // an invalid or unchanged value + if (typeof newEnabled !== 'boolean' || newEnabled === enabled) { + return; + } + enabled = newEnabled; + this.trigger('enabledchange'); + } + }); + // if the user sets this track to selected then + // set selected to that true value otherwise + // we keep it false + if (settings.enabled) { + track.enabled = settings.enabled; + } + track.loaded_ = true; + + return _ret = track, _possibleConstructorReturn(_this, _ret); + } + + return AudioTrack; +}(_track2['default']); + +exports['default'] = AudioTrack; + +},{"74":74,"76":76,"79":79,"88":88}],66:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; +var _browser = _dereq_(79); + +var browser = _interopRequireWildcard(_browser); + +var _document = _dereq_(95); + +var _document2 = _interopRequireDefault(_document); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** + * @file html-track-element-list.js + */ + +var HtmlTrackElementList = function () { + function HtmlTrackElementList() { + var trackElements = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + + _classCallCheck(this, HtmlTrackElementList); + + var list = this; // eslint-disable-line + + if (browser.IS_IE8) { + list = _document2['default'].createElement('custom'); + + for (var prop in HtmlTrackElementList.prototype) { + if (prop !== 'constructor') { + list[prop] = HtmlTrackElementList.prototype[prop]; + } + } + } + + list.trackElements_ = []; + + Object.defineProperty(list, 'length', { + get: function get() { + return this.trackElements_.length; + } + }); + + for (var i = 0, length = trackElements.length; i < length; i++) { + list.addTrackElement_(trackElements[i]); + } + + if (browser.IS_IE8) { + return list; + } + } + + HtmlTrackElementList.prototype.addTrackElement_ = function addTrackElement_(trackElement) { + this.trackElements_.push(trackElement); + }; + + HtmlTrackElementList.prototype.getTrackElementByTrack_ = function getTrackElementByTrack_(track) { + var trackElement_ = void 0; + + for (var i = 0, length = this.trackElements_.length; i < length; i++) { + if (track === this.trackElements_[i].track) { + trackElement_ = this.trackElements_[i]; + + break; + } + } + + return trackElement_; + }; + + HtmlTrackElementList.prototype.removeTrackElement_ = function removeTrackElement_(trackElement) { + for (var i = 0, length = this.trackElements_.length; i < length; i++) { + if (trackElement === this.trackElements_[i]) { + this.trackElements_.splice(i, 1); + + break; + } + } + }; + + return HtmlTrackElementList; +}(); + +exports['default'] = HtmlTrackElementList; + +},{"79":79,"95":95}],67:[function(_dereq_,module,exports){ +'use strict'; -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +exports.__esModule = true; -var _utilsBrowserJs = _dereq_('../utils/browser.js'); +var _browser = _dereq_(79); -var browser = _interopRequireWildcard(_utilsBrowserJs); +var browser = _interopRequireWildcard(_browser); -var _globalDocument = _dereq_('global/document'); +var _document = _dereq_(95); -var _globalDocument2 = _interopRequireDefault(_globalDocument); +var _document2 = _interopRequireDefault(_document); -var _eventTarget = _dereq_('../event-target'); +var _eventTarget = _dereq_(42); var _eventTarget2 = _interopRequireDefault(_eventTarget); -var _tracksTextTrack = _dereq_('../tracks/text-track'); +var _textTrack = _dereq_(73); + +var _textTrack2 = _interopRequireDefault(_textTrack); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _tracksTextTrack2 = _interopRequireDefault(_tracksTextTrack); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file html-track-element.js + */ var NONE = 0; var LOADING = 1; @@ -16241,21 +15559,21 @@ var ERROR = 3; * @class HTMLTrackElement */ -var HTMLTrackElement = (function (_EventTarget) { +var HTMLTrackElement = function (_EventTarget) { _inherits(HTMLTrackElement, _EventTarget); function HTMLTrackElement() { - var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, HTMLTrackElement); - _EventTarget.call(this); + var _this = _possibleConstructorReturn(this, _EventTarget.call(this)); - var readyState = undefined, - trackElement = this; + var readyState = void 0; + var trackElement = _this; // eslint-disable-line if (browser.IS_IE8) { - trackElement = _globalDocument2['default'].createElement('custom'); + trackElement = _document2['default'].createElement('custom'); for (var prop in HTMLTrackElement.prototype) { if (prop !== 'constructor') { @@ -16264,7 +15582,7 @@ var HTMLTrackElement = (function (_EventTarget) { } } - var track = new _tracksTextTrack2['default'](options); + var track = new _textTrack2['default'](options); trackElement.kind = track.kind; trackElement.src = track.src; @@ -16296,12 +15614,15 @@ var HTMLTrackElement = (function (_EventTarget) { }); if (browser.IS_IE8) { - return trackElement; + var _ret; + + return _ret = trackElement, _possibleConstructorReturn(_this, _ret); } + return _this; } return HTMLTrackElement; -})(_eventTarget2['default']); +}(_eventTarget2['default']); HTMLTrackElement.prototype.allowedEvents_ = { load: 'load' @@ -16313,29 +15634,28 @@ HTMLTrackElement.LOADED = LOADED; HTMLTrackElement.ERROR = ERROR; exports['default'] = HTMLTrackElement; -module.exports = exports['default']; -},{"../event-target":99,"../tracks/text-track":128,"../utils/browser.js":129,"global/document":1}],122:[function(_dereq_,module,exports){ -/** - * @file text-track-cue-list.js - */ +},{"42":42,"73":73,"79":79,"95":95}],68:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _browser = _dereq_(79); -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var browser = _interopRequireWildcard(_browser); + +var _document = _dereq_(95); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _document2 = _interopRequireDefault(_document); -var _utilsBrowserJs = _dereq_('../utils/browser.js'); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var browser = _interopRequireWildcard(_utilsBrowserJs); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var _globalDocument = _dereq_('global/document'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** + * @file text-track-cue-list.js + */ -var _globalDocument2 = _interopRequireDefault(_globalDocument); /** * A List of text track cues as defined in: @@ -16351,14 +15671,14 @@ var _globalDocument2 = _interopRequireDefault(_globalDocument); * @class TextTrackCueList */ -var TextTrackCueList = (function () { +var TextTrackCueList = function () { function TextTrackCueList(cues) { _classCallCheck(this, TextTrackCueList); - var list = this; + var list = this; // eslint-disable-line if (browser.IS_IE8) { - list = _globalDocument2['default'].createElement('custom'); + list = _document2['default'].createElement('custom'); for (var prop in TextTrackCueList.prototype) { if (prop !== 'constructor') { @@ -16388,6 +15708,7 @@ var TextTrackCueList = (function () { * @private */ + TextTrackCueList.prototype.setCues_ = function setCues_(cues) { var oldLength = this.length || 0; var i = 0; @@ -16423,6 +15744,7 @@ var TextTrackCueList = (function () { * @return {Object} a single cue */ + TextTrackCueList.prototype.getCueById = function getCueById(id) { var result = null; @@ -16439,54 +15761,39 @@ var TextTrackCueList = (function () { }; return TextTrackCueList; -})(); +}(); exports['default'] = TextTrackCueList; -module.exports = exports['default']; -},{"../utils/browser.js":129,"global/document":1}],123:[function(_dereq_,module,exports){ -/** - * @file text-track-display.js - */ +},{"79":79,"95":95}],69:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var _component = _dereq_('../component'); +var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _menuMenuJs = _dereq_('../menu/menu.js'); - -var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs); - -var _menuMenuItemJs = _dereq_('../menu/menu-item.js'); +var _fn = _dereq_(84); -var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs); +var Fn = _interopRequireWildcard(_fn); -var _menuMenuButtonJs = _dereq_('../menu/menu-button.js'); +var _window = _dereq_(96); -var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs); +var _window2 = _interopRequireDefault(_window); -var _utilsFnJs = _dereq_('../utils/fn.js'); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } -var Fn = _interopRequireWildcard(_utilsFnJs); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _globalDocument = _dereq_('global/document'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _globalDocument2 = _interopRequireDefault(_globalDocument); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _globalWindow = _dereq_('global/window'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file text-track-display.js + */ -var _globalWindow2 = _interopRequireDefault(_globalWindow); var darkGray = '#222'; var lightGray = '#ccc'; @@ -16503,6 +15810,39 @@ var fontMap = { smallcaps: '"Andale Mono", "Lucida Console", monospace, sans-serif' }; +/** + * Add cue HTML to display + * + * @param {Number} color Hex number for color, like #f0e + * @param {Number} opacity Value for opacity,0.0 - 1.0 + * @return {RGBAColor} In the form 'rgba(255, 0, 0, 0.3)' + * @method constructColor + */ +function constructColor(color, opacity) { + return 'rgba(' + + // color looks like "#f0e" + parseInt(color[1] + color[1], 16) + ',' + parseInt(color[2] + color[2], 16) + ',' + parseInt(color[3] + color[3], 16) + ',' + opacity + ')'; +} + +/** + * Try to update style + * Some style changes will throw an error, particularly in IE8. Those should be noops. + * + * @param {Element} el The element to be styles + * @param {CSSProperty} style The CSS property to be styled + * @param {CSSStyle} rule The actual style to be applied to the property + * @method tryUpdateStyle + */ +function tryUpdateStyle(el, style, rule) { + try { + el.style[style] = rule; + } catch (e) { + + // Satisfies linter. + return; + } +} + /** * The component for displaying text track cues * @@ -16513,54 +15853,76 @@ var fontMap = { * @class TextTrackDisplay */ -var TextTrackDisplay = (function (_Component) { +var TextTrackDisplay = function (_Component) { _inherits(TextTrackDisplay, _Component); function TextTrackDisplay(player, options, ready) { _classCallCheck(this, TextTrackDisplay); - _Component.call(this, player, options, ready); + var _this = _possibleConstructorReturn(this, _Component.call(this, player, options, ready)); - player.on('loadstart', Fn.bind(this, this.toggleDisplay)); - player.on('texttrackchange', Fn.bind(this, this.updateDisplay)); + player.on('loadstart', Fn.bind(_this, _this.toggleDisplay)); + player.on('texttrackchange', Fn.bind(_this, _this.updateDisplay)); // This used to be called during player init, but was causing an error // if a track should show by default and the display hadn't loaded yet. // Should probably be moved to an external track loader when we support // tracks that don't need a display. - player.ready(Fn.bind(this, function () { - if (player.tech_ && player.tech_['featuresNativeTextTracks']) { + player.ready(Fn.bind(_this, function () { + if (player.tech_ && player.tech_.featuresNativeTextTracks) { this.hide(); return; } player.on('fullscreenchange', Fn.bind(this, this.updateDisplay)); - var tracks = this.options_.playerOptions['tracks'] || []; + var tracks = this.options_.playerOptions.tracks || []; + for (var i = 0; i < tracks.length; i++) { - var track = tracks[i]; - this.player_.addRemoteTextTrack(track); + this.player_.addRemoteTextTrack(tracks[i]); + } + + var modes = { captions: 1, subtitles: 1 }; + var trackList = this.player_.textTracks(); + var firstDesc = void 0; + var firstCaptions = void 0; + + if (trackList) { + for (var _i = 0; _i < trackList.length; _i++) { + var track = trackList[_i]; + + if (track['default']) { + if (track.kind === 'descriptions' && !firstDesc) { + firstDesc = track; + } else if (track.kind in modes && !firstCaptions) { + firstCaptions = track; + } + } + } + + // We want to show the first default track but captions and subtitles + // take precedence over descriptions. + // So, display the first default captions or subtitles track + // and otherwise the first default descriptions track. + if (firstCaptions) { + firstCaptions.mode = 'showing'; + } else if (firstDesc) { + firstDesc.mode = 'showing'; + } } })); + return _this; } - /** - * Add cue HTML to display - * - * @param {Number} color Hex number for color, like #f0e - * @param {Number} opacity Value for opacity,0.0 - 1.0 - * @return {RGBAColor} In the form 'rgba(255, 0, 0, 0.3)' - * @method constructColor - */ - /** * Toggle display texttracks * * @method toggleDisplay */ + TextTrackDisplay.prototype.toggleDisplay = function toggleDisplay() { - if (this.player_.tech_ && this.player_.tech_['featuresNativeTextTracks']) { + if (this.player_.tech_ && this.player_.tech_.featuresNativeTextTracks) { this.hide(); } else { this.show(); @@ -16574,9 +15936,13 @@ var TextTrackDisplay = (function (_Component) { * @method createEl */ + TextTrackDisplay.prototype.createEl = function createEl() { return _Component.prototype.createEl.call(this, 'div', { className: 'vjs-text-track-display' + }, { + 'aria-live': 'off', + 'aria-atomic': 'true' }); }; @@ -16586,9 +15952,10 @@ var TextTrackDisplay = (function (_Component) { * @method clearDisplay */ + TextTrackDisplay.prototype.clearDisplay = function clearDisplay() { - if (typeof _globalWindow2['default']['WebVTT'] === 'function') { - _globalWindow2['default']['WebVTT']['processCues'](_globalWindow2['default'], [], this.el_); + if (typeof _window2['default'].WebVTT === 'function') { + _window2['default'].WebVTT.processCues(_window2['default'], [], this.el_); } }; @@ -16598,6 +15965,7 @@ var TextTrackDisplay = (function (_Component) { * @method updateDisplay */ + TextTrackDisplay.prototype.updateDisplay = function updateDisplay() { var tracks = this.player_.textTracks(); @@ -16607,11 +15975,37 @@ var TextTrackDisplay = (function (_Component) { return; } - for (var i = 0; i < tracks.length; i++) { + // Track display prioritization model: if multiple tracks are 'showing', + // display the first 'subtitles' or 'captions' track which is 'showing', + // otherwise display the first 'descriptions' track which is 'showing' + + var descriptionsTrack = null; + var captionsSubtitlesTrack = null; + + var i = tracks.length; + + while (i--) { var track = tracks[i]; - if (track['mode'] === 'showing') { - this.updateForTrack(track); + + if (track.mode === 'showing') { + if (track.kind === 'descriptions') { + descriptionsTrack = track; + } else { + captionsSubtitlesTrack = track; + } + } + } + + if (captionsSubtitlesTrack) { + if (this.getAttribute('aria-live') !== 'off') { + this.setAttribute('aria-live', 'off'); } + this.updateForTrack(captionsSubtitlesTrack); + } else if (descriptionsTrack) { + if (this.getAttribute('aria-live') !== 'assertive') { + this.setAttribute('aria-live', 'assertive'); + } + this.updateForTrack(descriptionsTrack); } }; @@ -16622,28 +16016,32 @@ var TextTrackDisplay = (function (_Component) { * @method updateForTrack */ + TextTrackDisplay.prototype.updateForTrack = function updateForTrack(track) { - if (typeof _globalWindow2['default']['WebVTT'] !== 'function' || !track['activeCues']) { + if (typeof _window2['default'].WebVTT !== 'function' || !track.activeCues) { return; } - var overrides = this.player_['textTrackSettings'].getValues(); - + var overrides = this.player_.textTrackSettings.getValues(); var cues = []; - for (var _i = 0; _i < track['activeCues'].length; _i++) { - cues.push(track['activeCues'][_i]); + + for (var _i2 = 0; _i2 < track.activeCues.length; _i2++) { + cues.push(track.activeCues[_i2]); } - _globalWindow2['default']['WebVTT']['processCues'](_globalWindow2['default'], track['activeCues'], this.el_); + _window2['default'].WebVTT.processCues(_window2['default'], cues, this.el_); var i = cues.length; + while (i--) { var cue = cues[i]; + if (!cue) { continue; } var cueDiv = cue.displayState; + if (overrides.color) { cueDiv.firstChild.style.color = overrides.color; } @@ -16675,7 +16073,8 @@ var TextTrackDisplay = (function (_Component) { } } if (overrides.fontPercent && overrides.fontPercent !== 1) { - var fontSize = _globalWindow2['default'].parseFloat(cueDiv.style.fontSize); + var fontSize = _window2['default'].parseFloat(cueDiv.style.fontSize); + cueDiv.style.fontSize = fontSize * overrides.fontPercent + 'px'; cueDiv.style.height = 'auto'; cueDiv.style.top = 'auto'; @@ -16692,81 +16091,15 @@ var TextTrackDisplay = (function (_Component) { }; return TextTrackDisplay; -})(_component2['default']); - -function constructColor(color, opacity) { - return 'rgba(' + - // color looks like "#f0e" - parseInt(color[1] + color[1], 16) + ',' + parseInt(color[2] + color[2], 16) + ',' + parseInt(color[3] + color[3], 16) + ',' + opacity + ')'; -} - -/** - * Try to update style - * Some style changes will throw an error, particularly in IE8. Those should be noops. - * - * @param {Element} el The element to be styles - * @param {CSSProperty} style The CSS property to be styled - * @param {CSSStyle} rule The actual style to be applied to the property - * @method tryUpdateStyle - */ -function tryUpdateStyle(el, style, rule) { - // - try { - el.style[style] = rule; - } catch (e) {} -} +}(_component2['default']); _component2['default'].registerComponent('TextTrackDisplay', TextTrackDisplay); exports['default'] = TextTrackDisplay; -module.exports = exports['default']; -},{"../component":67,"../menu/menu-button.js":104,"../menu/menu-item.js":105,"../menu/menu.js":106,"../utils/fn.js":134,"global/document":1,"global/window":2}],124:[function(_dereq_,module,exports){ -/** - * @file text-track-enums.js - */ +},{"5":5,"84":84,"96":96}],70:[function(_dereq_,module,exports){ +'use strict'; -/** - * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode - * - * enum TextTrackMode { "disabled", "hidden", "showing" }; - */ -'use strict'; - -exports.__esModule = true; -var TextTrackMode = { - disabled: 'disabled', - hidden: 'hidden', - showing: 'showing' -}; - -/** - * https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackkind - * - * enum TextTrackKind { - * "subtitles", - * "captions", - * "descriptions", - * "chapters", - * "metadata" - * }; - */ -var TextTrackKind = { - subtitles: 'subtitles', - captions: 'captions', - descriptions: 'descriptions', - chapters: 'chapters', - metadata: 'metadata' -}; - -/* jshint ignore:start */ -// we ignore jshint here because it does not see -// TextTrackMode or TextTrackKind as defined here somehow... -exports.TextTrackMode = TextTrackMode; -exports.TextTrackKind = TextTrackKind; - -/* jshint ignore:end */ - -},{}],125:[function(_dereq_,module,exports){ +exports.__esModule = true; /** * Utilities for capturing text track state and re-creating tracks * based on a capture. @@ -16781,11 +16114,9 @@ exports.TextTrackKind = TextTrackKind; * @return {Object} a serializable javascript representation of the * @private */ -'use strict'; - -exports.__esModule = true; var trackToJson_ = function trackToJson_(track) { var ret = ['kind', 'label', 'language', 'id', 'inBandMetadataTrackDispatchType', 'mode', 'src'].reduce(function (acc, prop, i) { + if (track[prop]) { acc[prop] = track[prop]; } @@ -16822,6 +16153,7 @@ var textTracksToJson = function textTracksToJson(tech) { }); var tracks = Array.prototype.map.call(trackEls, function (trackEl) { var json = trackToJson_(trackEl.track); + if (trackEl.src) { json.src = trackEl.src; } @@ -16844,6 +16176,7 @@ var textTracksToJson = function textTracksToJson(tech) { var jsonToTextTracks = function jsonToTextTracks(json, tech) { json.forEach(function (track) { var addedTrack = tech.addRemoteTextTrack(track).track; + if (!track.src && track.cues) { track.cues.forEach(function (cue) { return addedTrack.addCue(cue); @@ -16855,43 +16188,45 @@ var jsonToTextTracks = function jsonToTextTracks(json, tech) { }; exports['default'] = { textTracksToJson: textTracksToJson, jsonToTextTracks: jsonToTextTracks, trackToJson_: trackToJson_ }; -module.exports = exports['default']; -},{}],126:[function(_dereq_,module,exports){ -/** - * @file text-track-list.js - */ +},{}],71:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } +var _trackList = _dereq_(75); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } +var _trackList2 = _interopRequireDefault(_trackList); -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _fn = _dereq_(84); -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } +var Fn = _interopRequireWildcard(_fn); -var _eventTarget = _dereq_('../event-target'); +var _browser = _dereq_(79); -var _eventTarget2 = _interopRequireDefault(_eventTarget); +var browser = _interopRequireWildcard(_browser); + +var _document = _dereq_(95); -var _utilsFnJs = _dereq_('../utils/fn.js'); +var _document2 = _interopRequireDefault(_document); -var Fn = _interopRequireWildcard(_utilsFnJs); +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _utilsBrowserJs = _dereq_('../utils/browser.js'); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var browser = _interopRequireWildcard(_utilsBrowserJs); +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } -var _globalDocument = _dereq_('global/document'); +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file text-track-list.js + */ -var _globalDocument2 = _interopRequireDefault(_globalDocument); /** - * A text track list as defined in: - * https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist + * A list of possible text tracks. All functionality is in the + * base class TrackList. The spec for TextTrackList is located at: + * @link https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist * * interface TextTrackList : EventTarget { * readonly attribute unsigned long length; @@ -16903,86 +16238,47 @@ var _globalDocument2 = _interopRequireDefault(_globalDocument); * attribute EventHandler onremovetrack; * }; * - * @param {Track[]} tracks A list of tracks to initialize the list with - * @extends EventTarget + * @param {TextTrack[]} tracks A list of tracks to initialize the list with + * @extends TrackList * @class TextTrackList */ - -var TextTrackList = (function (_EventTarget) { - _inherits(TextTrackList, _EventTarget); +var TextTrackList = function (_TrackList) { + _inherits(TextTrackList, _TrackList); function TextTrackList() { - var tracks = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; + var _this, _ret; + + var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; _classCallCheck(this, TextTrackList); - _EventTarget.call(this); - var list = this; + var list = void 0; + // IE8 forces us to implement inheritance ourselves + // as it does not support Object.defineProperty properly if (browser.IS_IE8) { - list = _globalDocument2['default'].createElement('custom'); - - for (var prop in TextTrackList.prototype) { + list = _document2['default'].createElement('custom'); + for (var prop in _trackList2['default'].prototype) { if (prop !== 'constructor') { - list[prop] = TextTrackList.prototype[prop]; + list[prop] = _trackList2['default'].prototype[prop]; } } - } - - list.tracks_ = []; - - Object.defineProperty(list, 'length', { - get: function get() { - return this.tracks_.length; + for (var _prop in TextTrackList.prototype) { + if (_prop !== 'constructor') { + list[_prop] = TextTrackList.prototype[_prop]; + } } - }); - - for (var i = 0; i < tracks.length; i++) { - list.addTrack_(tracks[i]); } - if (browser.IS_IE8) { - return list; - } + list = (_this = _possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this); + return _ret = list, _possibleConstructorReturn(_this, _ret); } - /** - * change - One or more tracks in the track list have been enabled or disabled. - * addtrack - A track has been added to the track list. - * removetrack - A track has been removed from the track list. - */ - - /** - * Add TextTrack from TextTrackList - * - * @param {TextTrack} track - * @method addTrack_ - * @private - */ - TextTrackList.prototype.addTrack_ = function addTrack_(track) { - var index = this.tracks_.length; - - if (!('' + index in this)) { - Object.defineProperty(this, index, { - get: function get() { - return this.tracks_[index]; - } - }); - } - + _TrackList.prototype.addTrack_.call(this, track); track.addEventListener('modechange', Fn.bind(this, function () { this.trigger('change'); })); - - // Do not add duplicate tracks - if (this.tracks_.indexOf(track) === -1) { - this.tracks_.push(track); - this.trigger({ - track: track, - type: 'addtrack' - }); - } }; /** @@ -16994,8 +16290,9 @@ var TextTrackList = (function (_EventTarget) { * @private */ + TextTrackList.prototype.removeTrack_ = function removeTrack_(rtrack) { - var track = undefined; + var track = void 0; for (var i = 0, l = this.length; i < l; i++) { if (this[i] === rtrack) { @@ -17029,6 +16326,7 @@ var TextTrackList = (function (_EventTarget) { * @private */ + TextTrackList.prototype.getTrackById = function getTrackById(id) { var result = null; @@ -17045,64 +16343,206 @@ var TextTrackList = (function (_EventTarget) { }; return TextTrackList; -})(_eventTarget2['default']); - -TextTrackList.prototype.allowedEvents_ = { - change: 'change', - addtrack: 'addtrack', - removetrack: 'removetrack' -}; - -// emulate attribute EventHandler support to allow for feature detection -for (var _event in TextTrackList.prototype.allowedEvents_) { - TextTrackList.prototype['on' + _event] = null; -} +}(_trackList2['default']); exports['default'] = TextTrackList; -module.exports = exports['default']; -},{"../event-target":99,"../utils/browser.js":129,"../utils/fn.js":134,"global/document":1}],127:[function(_dereq_,module,exports){ -/** - * @file text-track-settings.js - */ +},{"75":75,"79":79,"84":84,"95":95}],72:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; +var _window = _dereq_(96); + +var _window2 = _interopRequireDefault(_window); + +var _component = _dereq_(5); + +var _component2 = _interopRequireDefault(_component); + +var _dom = _dereq_(82); + +var _fn = _dereq_(84); + +var Fn = _interopRequireWildcard(_fn); + +var _obj = _dereq_(89); + +var Obj = _interopRequireWildcard(_obj); + +var _log = _dereq_(87); + +var _log2 = _interopRequireDefault(_log); + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** + * @file text-track-settings.js + */ + + +var LOCAL_STORAGE_KEY = 'vjs-text-track-settings'; + +var COLOR_BLACK = ['#000', 'Black']; +var COLOR_BLUE = ['#00F', 'Blue']; +var COLOR_CYAN = ['#0FF', 'Cyan']; +var COLOR_GREEN = ['#0F0', 'Green']; +var COLOR_MAGENTA = ['#F0F', 'Magenta']; +var COLOR_RED = ['#F00', 'Red']; +var COLOR_WHITE = ['#FFF', 'White']; +var COLOR_YELLOW = ['#FF0', 'Yellow']; + +var OPACITY_OPAQUE = ['1', 'Opaque']; +var OPACITY_SEMI = ['0.5', 'Semi-Transparent']; +var OPACITY_TRANS = ['0', 'Transparent']; + +// Configuration for the various element. +var selectConfigs = { + backgroundColor: { + selector: '.vjs-bg-color > select', + id: 'captions-background-color-%s', + label: 'Color', + options: [COLOR_BLACK, COLOR_WHITE, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_MAGENTA, COLOR_CYAN] + }, + + backgroundOpacity: { + selector: '.vjs-bg-opacity > select', + id: 'captions-background-opacity-%s', + label: 'Transparency', + options: [OPACITY_OPAQUE, OPACITY_SEMI, OPACITY_TRANS] + }, + + color: { + selector: '.vjs-fg-color > select', + id: 'captions-foreground-color-%s', + label: 'Color', + options: [COLOR_WHITE, COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_MAGENTA, COLOR_CYAN] + }, -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + edgeStyle: { + selector: '.vjs-edge-style > select', + id: '%s', + label: 'Text Edge Style', + options: [['none', 'None'], ['raised', 'Raised'], ['depressed', 'Depressed'], ['uniform', 'Uniform'], ['dropshadow', 'Dropshadow']] + }, -var _component = _dereq_('../component'); + fontFamily: { + selector: '.vjs-font-family > select', + id: 'captions-font-family-%s', + label: 'Font Family', + options: [['proportionalSansSerif', 'Proportional Sans-Serif'], ['monospaceSansSerif', 'Monospace Sans-Serif'], ['proportionalSerif', 'Proportional Serif'], ['monospaceSerif', 'Monospace Serif'], ['casual', 'Casual'], ['script', 'Script'], ['small-caps', 'Small Caps']] + }, -var _component2 = _interopRequireDefault(_component); + fontPercent: { + selector: '.vjs-font-percent > select', + id: 'captions-font-size-%s', + label: 'Font Size', + options: [['0.50', '50%'], ['0.75', '75%'], ['1.00', '100%'], ['1.25', '125%'], ['1.50', '150%'], ['1.75', '175%'], ['2.00', '200%'], ['3.00', '300%'], ['4.00', '400%']], + 'default': 2, + parser: function parser(v) { + return v === '1.00' ? null : Number(v); + } + }, -var _utilsEventsJs = _dereq_('../utils/events.js'); + textOpacity: { + selector: '.vjs-text-opacity > select', + id: 'captions-foreground-opacity-%s', + label: 'Transparency', + options: [OPACITY_OPAQUE, OPACITY_SEMI] + }, -var Events = _interopRequireWildcard(_utilsEventsJs); + // Options for this object are defined below. + windowColor: { + selector: '.vjs-window-color > select', + id: 'captions-window-color-%s', + label: 'Color' + }, -var _utilsFnJs = _dereq_('../utils/fn.js'); + // Options for this object are defined below. + windowOpacity: { + selector: '.vjs-window-opacity > select', + id: 'captions-window-opacity-%s', + label: 'Transparency', + options: [OPACITY_TRANS, OPACITY_SEMI, OPACITY_OPAQUE] + } +}; -var Fn = _interopRequireWildcard(_utilsFnJs); +selectConfigs.windowColor.options = selectConfigs.backgroundColor.options; -var _utilsLogJs = _dereq_('../utils/log.js'); +/** + * Parses out option values. + * + * @private + * @param {String} value + * @param {Function} [parser] + * Optional function to adjust the value. + * @return {Mixed} + * Will be `undefined` if no value exists (or if given value is "none"). + */ +function parseOptionValue(value, parser) { + if (parser) { + value = parser(value); + } -var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs); + if (value && value !== 'none') { + return value; + } +} -var _safeJsonParseTuple = _dereq_('safe-json-parse/tuple'); +/** + * Gets the value of the selected \n \n \n \n \n \n \n \n \n \n \n \n \n
  • \n
    \n \n \n \n \n \n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n
    \n \n \n
    '; + TextTrackSettings.prototype.createElControls_ = function createElControls_() { + var defaultsButton = (0, _dom.createEl)('button', { + className: 'vjs-default-button', + textContent: this.localize('Defaults') + }); - return template; -} + var doneButton = (0, _dom.createEl)('button', { + className: 'vjs-done-button', + textContent: 'Done' + }); -exports['default'] = TextTrackSettings; -module.exports = exports['default']; + return (0, _dom.createEl)('div', { + className: 'vjs-tracksettings-controls' + }, undefined, [defaultsButton, doneButton]); + }; -},{"../component":67,"../utils/events.js":133,"../utils/fn.js":134,"../utils/log.js":137,"global/window":2,"safe-json-parse/tuple":54}],128:[function(_dereq_,module,exports){ -/** - * @file text-track.js - */ -'use strict'; + /** + * Create the component's DOM element + * + * @return {Element} + * @method createEl + */ -exports.__esModule = true; -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } + TextTrackSettings.prototype.createEl = function createEl() { + var settings = (0, _dom.createEl)('div', { + className: 'vjs-tracksettings' + }, undefined, [this.createElColors_(), this.createElFont_(), this.createElControls_()]); + + var heading = (0, _dom.createEl)('div', { + className: 'vjs-control-text', + id: 'TTsettingsDialogLabel-' + this.id_, + textContent: 'Caption Settings Dialog' + }, { + 'aria-level': '1', + 'role': 'heading' + }); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + var description = (0, _dom.createEl)('div', { + className: 'vjs-control-text', + id: 'TTsettingsDialogDescription-' + this.id_, + textContent: 'Beginning of dialog window. Escape will cancel and close the window.' + }); + + var doc = (0, _dom.createEl)('div', undefined, { + role: 'document' + }, [heading, description, settings]); + + return (0, _dom.createEl)('div', { + className: 'vjs-caption-settings vjs-modal-overlay', + tabIndex: -1 + }, { + 'role': 'dialog', + 'aria-labelledby': heading.id, + 'aria-describedby': description.id + }, doc); + }; + + /** + * Gets an object of text track settings (or null). + * + * @return {Object} + * An object with config values parsed from the DOM or localStorage. + * @method getValues + */ -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + TextTrackSettings.prototype.getValues = function getValues() { + var _this3 = this; -var _textTrackCueList = _dereq_('./text-track-cue-list'); + return Obj.reduce(selectConfigs, function (accum, config, key) { + var value = getSelectedOptionValue(_this3.$(config.selector), config.parser); -var _textTrackCueList2 = _interopRequireDefault(_textTrackCueList); + if (value !== undefined) { + accum[key] = value; + } + + return accum; + }, {}); + }; + + /** + * Sets text track settings from an object of values. + * + * @param {Object} values + * An object with config values parsed from the DOM or localStorage. + * @method setValues + */ + + + TextTrackSettings.prototype.setValues = function setValues(values) { + var _this4 = this; -var _utilsFnJs = _dereq_('../utils/fn.js'); + Obj.each(selectConfigs, function (config, key) { + setSelectedOption(_this4.$(config.selector), values[key], config.parser); + }); + }; -var Fn = _interopRequireWildcard(_utilsFnJs); + /** + * Sets all \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n Background\n \n \n \n \n \n \n
    \n
    \n Window\n \n \n \n \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n \n \n ';return n}function u(t){var e=void 0;return t.selectedOptions?e=t.selectedOptions[0]:t.options&&(e=t.options[t.options.selectedIndex]),e.value}function c(t,e){if(e){var o=void 0;for(o=0;o select").selectedIndex=0,this.$(".vjs-bg-color > select").selectedIndex=0, +this.$(".window-color > select").selectedIndex=0,this.$(".vjs-text-opacity > select").selectedIndex=0,this.$(".vjs-bg-opacity > select").selectedIndex=0,this.$(".vjs-window-opacity > select").selectedIndex=0,this.$(".vjs-edge-style select").selectedIndex=0,this.$(".vjs-font-family select").selectedIndex=0,this.$(".vjs-font-percent select").selectedIndex=2,this.updateDisplay()})),h.on(r.$(".vjs-fg-color > select"),"change",y.bind(r,r.updateDisplay)),h.on(r.$(".vjs-bg-color > select"),"change",y.bind(r,r.updateDisplay)),h.on(r.$(".window-color > select"),"change",y.bind(r,r.updateDisplay)),h.on(r.$(".vjs-text-opacity > select"),"change",y.bind(r,r.updateDisplay)),h.on(r.$(".vjs-bg-opacity > select"),"change",y.bind(r,r.updateDisplay)),h.on(r.$(".vjs-window-opacity > select"),"change",y.bind(r,r.updateDisplay)),h.on(r.$(".vjs-font-percent select"),"change",y.bind(r,r.updateDisplay)),h.on(r.$(".vjs-edge-style select"),"change",y.bind(r,r.updateDisplay)),h.on(r.$(".vjs-font-family select"),"change",y.bind(r,r.updateDisplay)),r.options_.persistTextTrackSettings&&r.restoreSettings(),r}return a(e,t),e.prototype.createEl=function(){var e=this.id_,o="TTsettingsDialogLabel-"+e,n="TTsettingsDialogDescription-"+e;return t.prototype.createEl.call(this,"div",{className:"vjs-caption-settings vjs-modal-overlay",innerHTML:l(e,o,n),tabIndex:-1},{role:"dialog","aria-labelledby":o,"aria-describedby":n})},e.prototype.getValues=function(){var t=u(this.$(".vjs-edge-style select")),e=u(this.$(".vjs-font-family select")),o=u(this.$(".vjs-fg-color > select")),n=u(this.$(".vjs-text-opacity > select")),r=u(this.$(".vjs-bg-color > select")),i=u(this.$(".vjs-bg-opacity > select")),s=u(this.$(".window-color > select")),a=u(this.$(".vjs-window-opacity > select")),l=w["default"].parseFloat(u(this.$(".vjs-font-percent > select"))),c={fontPercent:l,fontFamily:e,textOpacity:n,windowColor:s,windowOpacity:a,backgroundOpacity:i,edgeStyle:t,color:o,backgroundColor:r};for(var p in c)(""===c[p]||"none"===c[p]||"fontPercent"===p&&1===c[p])&&delete c[p];return c},e.prototype.setValues=function(t){c(this.$(".vjs-edge-style select"),t.edgeStyle),c(this.$(".vjs-font-family select"),t.fontFamily),c(this.$(".vjs-fg-color > select"),t.color),c(this.$(".vjs-text-opacity > select"),t.textOpacity),c(this.$(".vjs-bg-color > select"),t.backgroundColor),c(this.$(".vjs-bg-opacity > select"),t.backgroundOpacity),c(this.$(".window-color > select"),t.windowColor),c(this.$(".vjs-window-opacity > select"),t.windowOpacity);var e=t.fontPercent;e&&(e=e.toFixed(2)),c(this.$(".vjs-font-percent > select"),e)},e.prototype.restoreSettings=function(){var t=void 0,e=void 0;try{var o=(0,m["default"])(w["default"].localStorage.getItem("vjs-text-track-settings"));t=o[0],e=o[1],t&&A["default"].error(t)}catch(n){A["default"].warn(n)}e&&this.setValues(e)},e.prototype.saveSettings=function(){if(this.options_.persistTextTrackSettings){var t=this.getValues();try{Object.getOwnPropertyNames(t).length>0?w["default"].localStorage.setItem("vjs-text-track-settings",JSON.stringify(t)):w["default"].localStorage.removeItem("vjs-text-track-settings")}catch(e){A["default"].warn(e)}}},e.prototype.updateDisplay=function(){var t=this.player_.getChild("textTrackDisplay");t&&t.updateDisplay()},e}(f["default"]);f["default"].registerComponent("TextTrackSettings",_),o["default"]=_},{145:145,5:5,81:81,82:82,85:85,93:93}],72:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(67),u=r(l),c=t(82),p=n(c),f=t(73),d=t(85),h=r(d),v=t(93),y=r(v),g=t(75),A=r(g),b=t(90),m=t(147),j=r(m),w=t(86),_=r(w),k=t(78),x=n(k),T=function(t,e){var o=new y["default"].WebVTT.Parser(y["default"],y["default"].vttjs,y["default"].WebVTT.StringDecoder()),n=[];o.oncue=function(t){e.addCue(t)},o.onparsingerror=function(t){n.push(t)},o.onflush=function(){e.trigger({type:"loadeddata",target:e})},o.parse(t),n.length>0&&(y["default"].console&&y["default"].console.groupCollapsed&&y["default"].console.groupCollapsed("Text Track parsing errors for "+e.src),n.forEach(function(t){return h["default"].error(t)}),y["default"].console&&y["default"].console.groupEnd&&y["default"].console.groupEnd()),o.flush()},E=function(t,e){var o={uri:t},n=(0,b.isCrossOrigin)(t);n&&(o.cors=n),(0,j["default"])(o,p.bind(this,function(t,o,n){return t?h["default"].error(t,o):(e.loaded_=!0,void("function"!=typeof y["default"].WebVTT?e.tech_&&!function(){var t=function(){return T(n,e)};e.tech_.on("vttjsloaded",t),e.tech_.on("vttjserror",function(){h["default"].error("vttjs failed to load, stopping trying to process "+e.src),e.tech_.off("vttjsloaded",t)})}():T(n,e)))}))},C=function(t){function e(){var o,n,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(i(this,e),!r.tech)throw new Error("A tech was not provided.");var a=(0,_["default"])(r,{kind:f.TextTrackKind[r.kind]||"subtitles",language:r.language||r.srclang||""}),l=f.TextTrackMode[a.mode]||"disabled",c=a["default"];"metadata"!==a.kind&&"chapters"!==a.kind||(l="hidden");var d=o=s(this,t.call(this,a));if(d.tech_=a.tech,x.IS_IE8)for(var h in e.prototype)"constructor"!==h&&(d[h]=e.prototype[h]);d.cues_=[],d.activeCues_=[];var v=new u["default"](d.cues_),y=new u["default"](d.activeCues_),g=!1,A=p.bind(d,function(){this.activeCues,g&&(this.trigger("cuechange"),g=!1)});return"disabled"!==l&&d.tech_.on("timeupdate",A),Object.defineProperty(d,"default",{get:function(){return c},set:function(){}}),Object.defineProperty(d,"mode",{get:function(){return l},set:function(t){f.TextTrackMode[t]&&(l=t,"showing"===l&&this.tech_.on("timeupdate",A),this.trigger("modechange"))}}),Object.defineProperty(d,"cues",{get:function(){return this.loaded_?v:null},set:function(){}}),Object.defineProperty(d,"activeCues",{get:function(){if(!this.loaded_)return null;if(0===this.cues.length)return y;for(var t=this.tech_.currentTime(),e=[],o=0,n=this.cues.length;o=t?e.push(r):r.startTime===r.endTime&&r.startTime<=t&&r.startTime+.5>=t&&e.push(r)}if(g=!1,e.length!==this.activeCues_.length)g=!0;else for(var i=0;i0&&void 0!==arguments[0]?arguments[0]:[],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;i(this,e);var a=s(this,t.call(this));if(!r&&(r=a,p.IS_IE8)){r=d["default"].createElement("custom");for(var l in e.prototype)"constructor"!==l&&(r[l]=e.prototype[l])}r.tracks_=[],Object.defineProperty(r,"length",{get:function(){return this.tracks_.length}});for(var u=0;u0&&void 0!==arguments[0]?arguments[0]:{};i(this,e);var r=s(this,t.call(this)),a=r;if(u.IS_IE8){a=p["default"].createElement("custom");for(var l in e.prototype)"constructor"!==l&&(a[l]=e.prototype[l])}var c={id:n.id||"vjs_track_"+d.newGUID(),kind:n.kind||"",label:n.label||"",language:n.language||""},f=function(t){Object.defineProperty(a,t,{get:function(){return c[t]},set:function(){}})};for(var h in c)f(h);return o=a,s(r,o)}return a(e,t),e}(v["default"]);o["default"]=y},{42:42,78:78,84:84,92:92}],76:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function s(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}o.__esModule=!0;var l=t(74),u=r(l),c=t(78),p=n(c),f=t(92),d=r(f),h=function(t,e){for(var o=0;o0&&void 0!==arguments[0]?arguments[0]:[];i(this,e);for(var a=void 0,l=r.length-1;l>=0;l--)if(r[l].selected){h(r,r[l]);break}if(p.IS_IE8){a=d["default"].createElement("custom");for(var c in u["default"].prototype)"constructor"!==c&&(a[c]=u["default"].prototype[c]);for(var f in e.prototype)"constructor"!==f&&(a[f]=e.prototype[f])}return a=o=s(this,t.call(this,r,a)),a.changing_=!1,Object.defineProperty(a,"selectedIndex",{get:function(){for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:{};i(this,e);var a=(0,f["default"])(r,{kind:l.VideoTrackKind[r.kind]||""}),u=o=s(this,t.call(this,a)),c=!1;if(h.IS_IE8)for(var p in e.prototype)"constructor"!==p&&(u[p]=e.prototype[p]);return Object.defineProperty(u,"selected",{get:function(){return c},set:function(t){"boolean"==typeof t&&t!==c&&(c=t,this.trigger("selectedchange"))}}),a.selected&&(u.selected=a.selected),n=u,s(o,n)}return a(e,t),e}(c["default"]);o["default"]=v},{73:73,75:75,78:78,86:86}],78:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0,o.BACKGROUND_SIZE_SUPPORTED=o.TOUCH_ENABLED=o.IE_VERSION=o.IS_IE8=o.IS_CHROME=o.IS_EDGE=o.IS_FIREFOX=o.IS_NATIVE_ANDROID=o.IS_OLD_ANDROID=o.ANDROID_VERSION=o.IS_ANDROID=o.IOS_VERSION=o.IS_IOS=o.IS_IPOD=o.IS_IPHONE=o.IS_IPAD=void 0;var r=t(92),i=n(r),s=t(93),a=n(s),l=a["default"].navigator&&a["default"].navigator.userAgent||"",u=/AppleWebKit\/([\d.]+)/i.exec(l),c=u?parseFloat(u.pop()):null,p=o.IS_IPAD=/iPad/i.test(l),f=o.IS_IPHONE=/iPhone/i.test(l)&&!p,d=o.IS_IPOD=/iPod/i.test(l),h=(o.IS_IOS=f||p||d,o.IOS_VERSION=function(){var t=l.match(/OS (\d+)_/i);return t&&t[1]?t[1]:null}(),o.IS_ANDROID=/Android/i.test(l)),v=o.ANDROID_VERSION=function(){var t=l.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i);if(!t)return null;var e=t[1]&&parseFloat(t[1]),o=t[2]&&parseFloat(t[2]);return e&&o?parseFloat(t[1]+"."+t[2]):e?e:null}(),y=(o.IS_OLD_ANDROID=h&&/webkit/i.test(l)&&v<2.3,o.IS_NATIVE_ANDROID=h&&v<5&&c<537,o.IS_FIREFOX=/Firefox/i.test(l),o.IS_EDGE=/Edge/i.test(l));o.IS_CHROME=!y&&/Chrome/i.test(l),o.IS_IE8=/MSIE\s8\.0/.test(l),o.IE_VERSION=function(t){return t&&parseFloat(t[1])}(/MSIE\s(\d+)\.\d/.exec(l)),o.TOUCH_ENABLED=!!("ontouchstart"in a["default"]||a["default"].DocumentTouch&&i["default"]instanceof a["default"].DocumentTouch),o.BACKGROUND_SIZE_SUPPORTED="backgroundSize"in i["default"].createElement("video").style},{92:92,93:93}],79:[function(t,e,o){"use strict";function n(t,e){var o=0,n=void 0,i=void 0;if(!e)return 0;t&&t.length||(t=(0,r.createTimeRange)(0,0));for(var s=0;se&&(i=e),o+=i-n;return o/e}o.__esModule=!0,o.bufferedPercent=n;var r=t(88)},{88:88}],80:[function(t,e,o){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){return t.raw=e,t}function s(t){return"string"==typeof t&&/\S/.test(t)}function a(t){if(/\s/.test(t))throw new Error("class has illegal whitespace characters")}function l(t){return new RegExp("(^|\\s)"+t+"($|\\s)")}function u(t){return!!t&&"object"===("undefined"==typeof t?"undefined":M(t))&&1===t.nodeType}function c(t){return function(e,o){if(!s(e))return D["default"][t](null);s(o)&&(o=D["default"].querySelector(o));var n=u(o)?o:D["default"];return n[t]&&n[t](e)}}function p(t){return 0===t.indexOf("#")&&(t=t.slice(1)),D["default"].getElementById(t)}function f(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"div",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=D["default"].createElement(t);return Object.getOwnPropertyNames(e).forEach(function(t){var o=e[t];t.indexOf("aria-")!==-1||"role"===t||"type"===t?(U["default"].warn((0,V["default"])(I,t,o)),n.setAttribute(t,o)):n[t]=o}),Object.getOwnPropertyNames(o).forEach(function(t){n.setAttribute(t,o[t])}),n}function d(t,e){"undefined"==typeof t.textContent?t.innerText=e:t.textContent=e}function h(t,e){e.firstChild?e.insertBefore(t,e.firstChild):e.appendChild(t)}function v(t){var e=t[G];return e||(e=t[G]=Q.newGUID()),Y[e]||(Y[e]={}),Y[e]}function y(t){var e=t[G];return!!e&&!!Object.getOwnPropertyNames(Y[e]).length}function g(t){var e=t[G];if(e){delete Y[e];try{delete t[G]}catch(o){t.removeAttribute?t.removeAttribute(G):t[G]=null}}}function A(t,e){return a(e),t.classList?t.classList.contains(e):l(e).test(t.className)}function b(t,e){return t.classList?t.classList.add(e):A(t,e)||(t.className=(t.className+" "+e).trim()),t}function m(t,e){return t.classList?t.classList.remove(e):(a(e),t.className=t.className.split(/\s+/).filter(function(t){return t!==e}).join(" ")),t}function j(t,e,o){var n=A(t,e);if("function"==typeof o&&(o=o(t,e)),"boolean"!=typeof o&&(o=!n),o!==n)return o?b(t,e):m(t,e),t}function w(t,e){Object.getOwnPropertyNames(e).forEach(function(o){var n=e[o];null===n||"undefined"==typeof n||n===!1?t.removeAttribute(o):t.setAttribute(o,n===!0?"":n)})}function _(t){var e={},o=",autoplay,controls,loop,muted,default,";if(t&&t.attributes&&t.attributes.length>0)for(var n=t.attributes,r=n.length-1;r>=0;r--){var i=n[r].name,s=n[r].value;"boolean"!=typeof t[i]&&o.indexOf(","+i+",")===-1||(s=null!==s),e[i]=s}return e}function k(){D["default"].body.focus(),D["default"].onselectstart=function(){return!1}}function x(){D["default"].onselectstart=function(){return!0}}function T(t){var e=void 0;if(t.getBoundingClientRect&&t.parentNode&&(e=t.getBoundingClientRect()),!e)return{left:0,top:0};var o=D["default"].documentElement,n=D["default"].body,r=o.clientLeft||n.clientLeft||0,i=N["default"].pageXOffset||n.scrollLeft,s=e.left+i-r,a=o.clientTop||n.clientTop||0,l=N["default"].pageYOffset||n.scrollTop,u=e.top+l-a;return{left:Math.round(s),top:Math.round(u)}}function E(t,e){var o={},n=T(t),r=t.offsetWidth,i=t.offsetHeight,s=n.top,a=n.left,l=e.pageY,u=e.pageX;return e.changedTouches&&(u=e.changedTouches[0].pageX,l=e.changedTouches[0].pageY),o.y=Math.max(0,Math.min(1,(s-l+i)/i)),o.x=Math.max(0,Math.min(1,(u-a)/r)),o}function C(t){return!!t&&"object"===("undefined"==typeof t?"undefined":M(t))&&3===t.nodeType}function S(t){for(;t.firstChild;)t.removeChild(t.firstChild);return t}function O(t){return"function"==typeof t&&(t=t()),(Array.isArray(t)?t:[t]).map(function(t){return"function"==typeof t&&(t=t()),u(t)||C(t)?t:"string"==typeof t&&/\S/.test(t)?D["default"].createTextNode(t):void 0}).filter(function(t){return t})}function B(t,e){return O(e).forEach(function(e){return t.appendChild(e)}),t}function P(t,e){return B(S(t),e)}o.__esModule=!0,o.$$=o.$=void 0;var M="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},I=i(["Setting attributes in the second argument of createEl()\n has been deprecated. Use the third argument instead.\n createEl(type, properties, attributes). Attempting to set "," to ","."],["Setting attributes in the second argument of createEl()\n has been deprecated. Use the third argument instead.\n createEl(type, properties, attributes). Attempting to set "," to ","."]);o.isEl=u,o.getEl=p,o.createEl=f,o.textContent=d,o.insertElFirst=h,o.getElData=v,o.hasElData=y,o.removeElData=g,o.hasElClass=A,o.addElClass=b,o.removeElClass=m,o.toggleElClass=j,o.setElAttributes=w,o.getElAttributes=_,o.blockTextSelection=k,o.unblockTextSelection=x,o.findElPosition=T,o.getPointerPosition=E,o.isTextNode=C,o.emptyEl=S,o.normalizeContent=O,o.appendContent=B,o.insertContent=P;var R=t(92),D=r(R),F=t(93),N=r(F),L=t(84),Q=n(L),z=t(85),U=r(z),H=t(146),V=r(H),Y={},G="vdata"+(new Date).getTime();o.$=c("querySelector"),o.$$=c("querySelectorAll")},{146:146,84:84,85:85,92:92,93:93}],81:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t,e){var o=d.getElData(t);0===o.handlers[e].length&&(delete o.handlers[e],t.removeEventListener?t.removeEventListener(e,o.dispatcher,!1):t.detachEvent&&t.detachEvent("on"+e,o.dispatcher)),Object.getOwnPropertyNames(o.handlers).length<=0&&(delete o.handlers,delete o.dispatcher,delete o.disabled),0===Object.getOwnPropertyNames(o).length&&d.removeElData(t)}function s(t,e,o,n){o.forEach(function(o){t(e,o,n)})}function a(t){function e(){return!0}function o(){return!1}return t&&t.isPropagationStopped||!function(){var n=t||b["default"].event;t={};for(var r in n)"layerX"!==r&&"layerY"!==r&&"keyLocation"!==r&&"webkitMovementX"!==r&&"webkitMovementY"!==r&&("returnValue"===r&&n.preventDefault||(t[r]=n[r]));if(t.target||(t.target=t.srcElement||j["default"]),t.relatedTarget||(t.relatedTarget=t.fromElement===t.target?t.toElement:t.fromElement),t.preventDefault=function(){n.preventDefault&&n.preventDefault(),t.returnValue=!1,n.returnValue=!1,t.defaultPrevented=!0},t.defaultPrevented=!1,t.stopPropagation=function(){n.stopPropagation&&n.stopPropagation(),t.cancelBubble=!0,n.cancelBubble=!0,t.isPropagationStopped=e},t.isPropagationStopped=o,t.stopImmediatePropagation=function(){n.stopImmediatePropagation&&n.stopImmediatePropagation(),t.isImmediatePropagationStopped=e,t.stopPropagation()},t.isImmediatePropagationStopped=o,null!==t.clientX&&void 0!==t.clientX){var i=j["default"].documentElement,s=j["default"].body;t.pageX=t.clientX+(i&&i.scrollLeft||s&&s.scrollLeft||0)-(i&&i.clientLeft||s&&s.clientLeft||0),t.pageY=t.clientY+(i&&i.scrollTop||s&&s.scrollTop||0)-(i&&i.clientTop||s&&s.clientTop||0)}t.which=t.charCode||t.keyCode,null!==t.button&&void 0!==t.button&&(t.button=1&t.button?0:4&t.button?1:2&t.button?2:0)}(),t}function l(t,e,o){if(Array.isArray(e))return s(l,t,e,o);var n=d.getElData(t);n.handlers||(n.handlers={}),n.handlers[e]||(n.handlers[e]=[]),o.guid||(o.guid=v.newGUID()),n.handlers[e].push(o),n.dispatcher||(n.disabled=!1,n.dispatcher=function(e,o){if(!n.disabled){e=a(e);var r=n.handlers[e.type];if(r)for(var i=r.slice(0),s=0,l=i.length;s1&&void 0!==arguments[1]?arguments[1]:t;t=t<0?0:t;var o=Math.floor(t%60),n=Math.floor(t/60%60),r=Math.floor(t/3600),i=Math.floor(e/60%60),s=Math.floor(e/3600);return(isNaN(t)||t===1/0)&&(r=n=o="-"),r=r>0||s>0?r+":":"",n=((r||i>=10)&&n<10?"0"+n:n)+":",o=o<10?"0"+o:o,r+n+o}o.__esModule=!0,o["default"]=n},{}],84:[function(t,e,o){"use strict";function n(){return r++}o.__esModule=!0,o.newGUID=n;var r=1},{}],85:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0,o.logByType=void 0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=t(93),s=n(i),a=t(78),l=void 0,u=o.logByType=function(t,e){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:!!a.IE_VERSION&&a.IE_VERSION<11;"log"!==t&&e.unshift(t.toUpperCase()+":"),l.history.push(e),e.unshift("VIDEOJS:");var n=s["default"].console&&s["default"].console[t];n&&(o&&(e=e.map(function(t){if(t&&"object"===("undefined"==typeof t?"undefined":r(t))||Array.isArray(t))try{return JSON.stringify(t)}catch(e){return String(t)}return String(t)}).join(" ")),n.apply?n[Array.isArray(e)?"apply":"call"](s["default"].console,e):n(e))};l=function(){for(var t=arguments.length,e=Array(t),o=0;oo)throw new Error("Failed to execute '"+t+"' on 'TimeRanges': The index provided ("+e+") is greater than or equal to the maximum bound ("+o+").")}function i(t,e,o,n){return void 0===n&&(u["default"].warn("DEPRECATED: Function '"+t+"' on 'TimeRanges' called without an index argument."),n=0),r(t,n,o.length-1),o[n][e]}function s(t){return void 0===t||0===t.length?{length:0,start:function(){throw new Error("This TimeRanges object is empty")},end:function(){throw new Error("This TimeRanges object is empty")}}:{length:t.length,start:i.bind(null,"start",0,t),end:i.bind(null,"end",1,t)}}function a(t,e){return Array.isArray(t)?s(t):void 0===t||void 0===e?s():s([[t,e]])}o.__esModule=!0,o.createTimeRange=void 0,o.createTimeRanges=a;var l=t(85),u=n(l);o.createTimeRange=a},{85:85}],89:[function(t,e,o){"use strict";function n(t){return t.charAt(0).toUpperCase()+t.slice(1)}o.__esModule=!0,o["default"]=n},{}],90:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}o.__esModule=!0,o.isCrossOrigin=o.getFileExtension=o.getAbsoluteURL=o.parseUrl=void 0;var r=t(92),i=n(r),s=t(93),a=n(s),l=o.parseUrl=function(t){var e=["protocol","hostname","port","pathname","search","hash","host"],o=i["default"].createElement("a");o.href=t;var n=""===o.host&&"file:"!==o.protocol,r=void 0;n&&(r=i["default"].createElement("div"),r.innerHTML='',o=r.firstChild,r.setAttribute("style","display:none; position:absolute;"),i["default"].body.appendChild(r));for(var s={},a=0;ax',t=e.firstChild.href}return t},o.getFileExtension=function(t){if("string"==typeof t){var e=/^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/i,o=e.exec(t);if(o)return o.pop().toLowerCase()}return""},o.isCrossOrigin=function(t){var e=a["default"].location,o=l(t),n=":"===o.protocol?e.protocol:o.protocol,r=n+o.host!==e.protocol+e.host;return r}},{92:92,93:93}],91:[function(e,o,n){"use strict";function r(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e["default"]=t,e}function i(t){return t&&t.__esModule?t:{"default":t}}function s(t,e,o){var n=void 0;if("string"==typeof t){if(0===t.indexOf("#")&&(t=t.slice(1)),s.getPlayers()[t])return e&&Q["default"].warn('Player "'+t+'" is already initialised. Options will not be applied.'),o&&s.getPlayers()[t].ready(o),s.getPlayers()[t];n=U.getEl(t)}else n=t;if(!n||!n.nodeName)throw new TypeError("The element or ID supplied is not valid. (videojs)");return n.player||_["default"].players[n.playerId]||new _["default"](n,e,o)}n.__esModule=!0;var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l=e(93),u=i(l),c=e(92),p=i(c),f=e(56),d=r(f),h=e(87),v=r(h),y=e(5),g=i(y),A=e(42),b=i(A),m=e(81),j=r(m),w=e(51),_=i(w),k=e(52),x=i(k),T=e(86),E=i(T),C=e(82),S=r(C),O=e(72),B=i(O),P=e(64),M=i(P),I=e(77),R=i(I),D=e(88),F=e(83),N=i(F),L=e(85),Q=i(L),z=e(80),U=r(z),H=e(78),V=r(H),Y=e(90),G=r(Y),W=e(43),X=i(W),J=e(131),K=i(J),Z=e(147),q=i(Z),$=e(62),tt=i($); +if("undefined"==typeof HTMLVideoElement&&u["default"].document&&u["default"].document.createElement&&(p["default"].createElement("video"),p["default"].createElement("audio"),p["default"].createElement("track")),u["default"].VIDEOJS_NO_DYNAMIC_STYLE!==!0){var et=U.$(".vjs-styles-defaults");if(!et){et=v.createStyleElement("vjs-styles-defaults");var ot=U.$("head");ot&&ot.insertBefore(et,ot.firstChild),v.setTextContent(et,"\n .video-js {\n width: 300px;\n height: 150px;\n }\n\n .vjs-fluid {\n padding-top: 56.25%\n }\n ")}}d.autoSetupTimeout(1,s),s.VERSION="5.12.6",s.options=_["default"].prototype.options_,s.getPlayers=function(){return _["default"].players},s.players=_["default"].players,s.getComponent=g["default"].getComponent,s.registerComponent=function(t,e){tt["default"].isTech(e)&&Q["default"].warn("The "+t+" tech was registered as a component. It should instead be registered using videojs.registerTech(name, tech)"),g["default"].registerComponent.call(g["default"],t,e)},s.getTech=tt["default"].getTech,s.registerTech=tt["default"].registerTech,s.browser=V,s.TOUCH_ENABLED=V.TOUCH_ENABLED,s.extend=X["default"],s.mergeOptions=E["default"],s.bind=S.bind,s.plugin=x["default"],s.addLanguage=function(t,e){var o;return t=(""+t).toLowerCase(),(0,K["default"])(s.options.languages,(o={},o[t]=e,o))[t]},s.log=Q["default"],s.createTimeRange=s.createTimeRanges=D.createTimeRanges,s.formatTime=N["default"],s.parseUrl=G.parseUrl,s.isCrossOrigin=G.isCrossOrigin,s.EventTarget=b["default"],s.on=j.on,s.one=j.one,s.off=j.off,s.trigger=j.trigger,s.xhr=q["default"],s.TextTrack=B["default"],s.AudioTrack=M["default"],s.VideoTrack=R["default"],s.isEl=U.isEl,s.isTextNode=U.isTextNode,s.createEl=U.createEl,s.hasClass=U.hasElClass,s.addClass=U.addElClass,s.removeClass=U.removeElClass,s.toggleClass=U.toggleElClass,s.setAttributes=U.setElAttributes,s.getAttributes=U.getElAttributes,s.emptyEl=U.emptyEl,s.appendContent=U.appendContent,s.insertContent=U.insertContent,"function"==typeof t&&t.amd?t("videojs",[],function(){return s}):"object"===("undefined"==typeof n?"undefined":a(n))&&"object"===("undefined"==typeof o?"undefined":a(o))&&(o.exports=s),n["default"]=s},{131:131,147:147,42:42,43:43,5:5,51:51,52:52,56:56,62:62,64:64,72:72,77:77,78:78,80:80,81:81,82:82,83:83,85:85,86:86,87:87,88:88,90:90,92:92,93:93}],92:[function(t,e,o){(function(o){var n="undefined"!=typeof o?o:"undefined"!=typeof window?window:{},r=t(94);if("undefined"!=typeof document)e.exports=document;else{var i=n["__GLOBAL_DOCUMENT_CACHE@4"];i||(i=n["__GLOBAL_DOCUMENT_CACHE@4"]=r),e.exports=i}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{94:94}],93:[function(t,e,o){(function(t){"undefined"!=typeof window?e.exports=window:"undefined"!=typeof t?e.exports=t:"undefined"!=typeof self?e.exports=self:e.exports={}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],94:[function(t,e,o){},{}],95:[function(t,e,o){var n=t(111),r=n(Date,"now"),i=r||function(){return(new Date).getTime()};e.exports=i},{111:111}],96:[function(t,e,o){function n(t,e,o){function n(){g&&clearTimeout(g),d&&clearTimeout(d),b=0,d=g=A=void 0}function l(e,o){o&&clearTimeout(o),d=g=A=void 0,e&&(b=i(),h=t.apply(y,f),g||d||(f=y=void 0))}function u(){var t=e-(i()-v);t<=0||t>e?l(A,d):g=setTimeout(u,t)}function c(){l(j,g)}function p(){if(f=arguments,v=i(),y=this,A=j&&(g||!w),m===!1)var o=w&&!g;else{d||w||(b=v);var n=m-(v-b),r=n<=0||n>m;r?(d&&(d=clearTimeout(d)),b=v,h=t.apply(y,f)):d||(d=setTimeout(c,n))}return r&&g?g=clearTimeout(g):g||e===m||(g=setTimeout(u,e)),o&&(r=!0,h=t.apply(y,f)),!r||g||d||(f=y=void 0),h}var f,d,h,v,y,g,A,b=0,m=!1,j=!0;if("function"!=typeof t)throw new TypeError(s);if(e=e<0?0:+e||0,o===!0){var w=!0;j=!1}else r(o)&&(w=!!o.leading,m="maxWait"in o&&a(+o.maxWait||0,e),j="trailing"in o?!!o.trailing:j);return p.cancel=n,p}var r=t(124),i=t(95),s="Expected a function",a=Math.max;e.exports=n},{124:124,95:95}],97:[function(t,e,o){function n(t,e){if("function"!=typeof t)throw new TypeError(r);return e=i(void 0===e?t.length-1:+e||0,0),function(){for(var o=arguments,n=-1,r=i(o.length-e,0),s=Array(r);++n2?o[s-2]:void 0,l=s>2?o[2]:void 0,u=s>1?o[s-1]:void 0;for("function"==typeof a?(a=r(a,u,5),s-=2):(a="function"==typeof u?u:void 0,s-=a?1:0),l&&i(o[0],o[1],l)&&(a=s<3?void 0:a,s=1);++n-1&&t%1==0&&t-1&&t%1==0&&t<=r}var r=9007199254740991;e.exports=n},{}],117:[function(t,e,o){function n(t){return!!t&&"object"==typeof t}e.exports=n},{}],118:[function(t,e,o){function n(t){for(var e=u(t),o=e.length,n=o&&t.length,c=!!n&&a(n)&&(i(t)||r(t)||l(t)),f=-1,d=[];++f0,g=f.enumErrorProps&&(t===_||t instanceof Error),A=f.enumPrototypes&&a(t);++n2?arguments[2]:{},s=n(e);i&&(s=s.concat(Object.getOwnPropertySymbols(e))),r(s,function(n){c(t,n,e[n],o[n])})};p.supportsDescriptors=!!u,e.exports=p},{138:138,141:141}],138:[function(t,e,o){var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString;e.exports=function(t,e,o){if("[object Function]"!==r.call(e))throw new TypeError("iterator must be a function");var i=t.length;if(i===+i)for(var s=0;s0&&!n.call(t,0))for(var d=0;d0)for(var v=0;v=0&&"[object Function]"===n.call(t.callee)),o}},{}],143:[function(t,e,o){"use strict";var n=t(135),r=function(){if(!Object.assign)return!1;for(var t="abcdefghijklmnopqrst",e=t.split(""),o={},n=0;n0&&(h=setTimeout(function(){d=!0,u.abort("timeout");var t=new Error("XMLHttpRequest timeout");t.code="ETIMEDOUT",n(t)},t.timeout)),u.setRequestHeader)for(p in A)A.hasOwnProperty(p)&&u.setRequestHeader(p,A[p]);else if(t.headers&&!r(t.headers))throw new Error("Headers cannot be set on an XDomainRequest object");return"responseType"in t&&(u.responseType=t.responseType),"beforeSend"in t&&"function"==typeof t.beforeSend&&t.beforeSend(u),u.send(g),u}function l(){}var u=t(93),c=t(149),p=t(148),f=t(152),d=t(153);e.exports=s,s.XMLHttpRequest=u.XMLHttpRequest||l,s.XDomainRequest="withCredentials"in new s.XMLHttpRequest?s.XMLHttpRequest:u.XDomainRequest,n(["get","put","post","patch","head","delete"],function(t){s["delete"===t?"del":t]=function(e,o,n){return o=i(e,o,n),o.method=t.toUpperCase(),a(o)}})},{148:148,149:149,152:152,153:153,93:93}],148:[function(t,e,o){function n(t){var e=r.call(t);return"[object Function]"===e||"function"==typeof t&&"[object RegExp]"!==e||"undefined"!=typeof window&&(t===window.setTimeout||t===window.alert||t===window.confirm||t===window.prompt)}e.exports=n;var r=Object.prototype.toString},{}],149:[function(t,e,o){function n(t){var e=!1;return function(){if(!e)return e=!0,t.apply(this,arguments)}}e.exports=n,n.proto=n(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return n(this)},configurable:!0})})},{}],150:[function(t,e,o){function n(t,e,o){if(!a(e))throw new TypeError("iterator must be a function");arguments.length<3&&(o=this),"[object Array]"===l.call(t)?r(t,e,o):"string"==typeof t?i(t,e,o):s(t,e,o)}function r(t,e,o){for(var n=0,r=t.length;n100)throw new Error("Position must be between 0 and 100.");m=t,this.hasBeenReset=!0}})),Object.defineProperty(a,"positionAlign",r({},u,{get:function(){return j},set:function(t){var e=n(t);if(!e)throw new SyntaxError("An invalid or illegal string was specified.");j=e,this.hasBeenReset=!0}})),Object.defineProperty(a,"size",r({},u,{get:function(){return w},set:function(t){if(t<0||t>100)throw new Error("Size must be between 0 and 100.");w=t,this.hasBeenReset=!0}})),Object.defineProperty(a,"align",r({},u,{get:function(){return _},set:function(t){var e=n(t);if(!e)throw new SyntaxError("An invalid or illegal string was specified.");_=e,this.hasBeenReset=!0}})),a.displayState=void 0,l)return a}var s="auto",a={"":!0,lr:!0,rl:!0},l={start:!0,middle:!0,end:!0,left:!0,right:!0};i.prototype.getCueAsHTML=function(){return WebVTT.convertCueToDOMTree(window,this.text)},t.VTTCue=t.VTTCue||i,e.VTTCue=i}(this,this.vttjs||{}),function(t,e){function o(t){if("string"!=typeof t)return!1;var e=i[t.toLowerCase()];return!!e&&t.toLowerCase()}function n(t){return"number"==typeof t&&t>=0&&t<=100}function r(){var t=100,e=3,r=0,i=100,s=0,a=100,l="";Object.defineProperties(this,{width:{enumerable:!0,get:function(){return t},set:function(e){if(!n(e))throw new Error("Width must be between 0 and 100.");t=e}},lines:{enumerable:!0,get:function(){return e},set:function(t){if("number"!=typeof t)throw new TypeError("Lines must be set to a number.");e=t}},regionAnchorY:{enumerable:!0,get:function(){return i},set:function(t){if(!n(t))throw new Error("RegionAnchorX must be between 0 and 100.");i=t}},regionAnchorX:{enumerable:!0,get:function(){return r},set:function(t){if(!n(t))throw new Error("RegionAnchorY must be between 0 and 100.");r=t}},viewportAnchorY:{enumerable:!0,get:function(){return a},set:function(t){if(!n(t))throw new Error("ViewportAnchorY must be between 0 and 100.");a=t}},viewportAnchorX:{enumerable:!0,get:function(){return s},set:function(t){if(!n(t))throw new Error("ViewportAnchorX must be between 0 and 100.");s=t}},scroll:{enumerable:!0,get:function(){return l},set:function(t){var e=o(t);if(e===!1)throw new SyntaxError("An invalid or illegal string was specified.");l=e}}})}var i={"":!0,up:!0};t.VTTRegion=t.VTTRegion||r,e.VTTRegion=r}(this,this.vttjs||{}),function(t){function e(t,e){this.name="ParsingError",this.code=t.code,this.message=e||t.message}function o(t){function e(t,e,o,n){return 3600*(0|t)+60*(0|e)+(0|o)+(0|n)/1e3}var o=t.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);return o?o[3]?e(o[1],o[2],o[3].replace(":",""),o[4]):o[1]>59?e(o[1],o[2],0,o[4]):e(0,o[1],o[2],o[4]):null}function n(){this.values=h(null)}function r(t,e,o,n){var r=n?t.split(n):[t];for(var i in r)if("string"==typeof r[i]){var s=r[i].split(o);if(2===s.length){var a=s[0],l=s[1];e(a,l)}}}function i(t,i,s){function a(){var n=o(t);if(null===n)throw new e(e.Errors.BadTimeStamp,"Malformed timestamp: "+c);return t=t.replace(/^[^\sa-zA-Z-]+/,""),n}function l(t,e){var o=new n;r(t,function(t,e){switch(t){case"region":for(var n=s.length-1;n>=0;n--)if(s[n].id===e){o.set(t,s[n].region);break}break;case"vertical":o.alt(t,e,["rl","lr"]);break;case"line":var r=e.split(","),i=r[0];o.integer(t,i),o.percent(t,i)?o.set("snapToLines",!1):null,o.alt(t,i,["auto"]),2===r.length&&o.alt("lineAlign",r[1],["start","middle","end"]);break;case"position":r=e.split(","),o.percent(t,r[0]),2===r.length&&o.alt("positionAlign",r[1],["start","middle","end"]);break;case"size":o.percent(t,e);break;case"align":o.alt(t,e,["start","middle","end","left","right"])}},/:/,/\s/),e.region=o.get("region",null),e.vertical=o.get("vertical",""),e.line=o.get("line","auto"),e.lineAlign=o.get("lineAlign","start"),e.snapToLines=o.get("snapToLines",!0),e.size=o.get("size",100),e.align=o.get("align","middle"),e.position=o.get("position",{start:0,left:0,middle:50,end:100,right:100},e.align),e.positionAlign=o.get("positionAlign",{start:"start",left:"start",middle:"middle",end:"end",right:"end"},e.align)}function u(){t=t.replace(/^\s+/,"")}var c=t;if(u(),i.startTime=a(),u(),"-->"!==t.substr(0,3))throw new e(e.Errors.BadTimeStamp,"Malformed time stamp (time stamps must be separated by '-->'): "+c);t=t.substr(3),u(),i.endTime=a(),u(),l(t,i)}function s(t,e){function n(){function t(t){return e=e.substr(t.length),t}if(!e)return null;var o=e.match(/^([^<]*)(<[^>]+>?)?/);return t(o[1]?o[1]:o[2])}function r(t){return v[t]}function i(t){for(;h=t.match(/&(amp|lt|gt|lrm|rlm|nbsp);/);)t=t.replace(h[0],r);return t}function s(t,e){return!A[e.localName]||A[e.localName]===t.localName}function a(e,o){var n=y[e];if(!n)return null; +var r=t.document.createElement(n);r.localName=n;var i=g[e];return i&&o&&(r[i]=o.trim()),r}for(var l,u=t.document.createElement("div"),c=u,p=[];null!==(l=n());)if("<"!==l[0])c.appendChild(t.document.createTextNode(i(l)));else{if("/"===l[1]){p.length&&p[p.length-1]===l.substr(2).replace(">","")&&(p.pop(),c=c.parentNode);continue}var f,d=o(l.substr(1,l.length-2));if(d){f=t.document.createProcessingInstruction("timestamp",d),c.appendChild(f);continue}var h=l.match(/^<([^.\s\/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/);if(!h)continue;if(f=a(h[1],h[3]),!f)continue;if(!s(c,f))continue;h[2]&&(f.className=h[2].substr(1).replace("."," ")),p.push(h[1]),c.appendChild(f),c=f}return u}function a(t){function e(t,e){for(var o=e.childNodes.length-1;o>=0;o--)t.push(e.childNodes[o])}function o(t){if(!t||!t.length)return null;var n=t.pop(),r=n.textContent||n.innerText;if(r){var i=r.match(/^.*(\n|\r)/);return i?(t.length=0,i[0]):r}return"ruby"===n.tagName?o(t):n.childNodes?(e(t,n),o(t)):void 0}var n,r=[],i="";if(!t||!t.childNodes)return"ltr";for(e(r,t);i=o(r);)for(var s=0;s=0&&t.line<=100))return t.line;if(!t.track||!t.track.textTrackList||!t.track.textTrackList.mediaElement)return-1;for(var e=t.track,o=e.textTrackList,n=0,r=0;rl&&(r=new p(t),s=l),t=new p(i)}return r||i}var i=new p(e),s=e.cue,a=l(s),u=[];if(s.snapToLines){var c;switch(s.vertical){case"":u=["+y","-y"],c="height";break;case"rl":u=["+x","-x"],c="width";break;case"lr":u=["-x","+x"],c="width"}var f=i.lineHeight,d=f*Math.round(a),h=o[c]+f,v=u[0];Math.abs(d)>h&&(d=d<0?-1:1,d*=Math.ceil(h/f)*f),a<0&&(d+=""===s.vertical?o.height:o.width,u=u.reverse()),i.move(v,d)}else{var y=i.lineHeight/o.height*100;switch(s.lineAlign){case"middle":a-=y/2;break;case"end":a-=y}switch(s.vertical){case"":e.applyStyles({top:e.formatStyle(a,"%")});break;case"rl":e.applyStyles({left:e.formatStyle(a,"%")});break;case"lr":e.applyStyles({right:e.formatStyle(a,"%")})}u=["+y","-x","+x","-y"],i=new p(e)}var g=r(i,u);e.move(g.toCSSCompatValues(o))}function d(){}var h=Object.create||function(){function t(){}return function(e){if(1!==arguments.length)throw new Error("Object.create shim only accepts one parameter.");return t.prototype=e,new t}}();e.prototype=h(Error.prototype),e.prototype.constructor=e,e.Errors={BadSignature:{code:0,message:"Malformed WebVTT signature."},BadTimeStamp:{code:1,message:"Malformed time stamp."}},n.prototype={set:function(t,e){this.get(t)||""===e||(this.values[t]=e)},get:function(t,e,o){return o?this.has(t)?this.values[t]:e[o]:this.has(t)?this.values[t]:e},has:function(t){return t in this.values},alt:function(t,e,o){for(var n=0;n=0&&e<=100))&&(this.set(t,e),!0)}};var v={"&":"&","<":"<",">":">","‎":"‎","‏":"‏"," ":" "},y={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",v:"span",lang:"span"},g={v:"title",lang:"lang"},A={rt:"ruby"},b=[1470,1472,1475,1478,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1520,1521,1522,1523,1524,1544,1547,1549,1563,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1645,1646,1647,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1765,1766,1774,1775,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1807,1808,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1969,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2e3,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2036,2037,2042,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2074,2084,2088,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2142,2208,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,8207,64285,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64434,64435,64436,64437,64438,64439,64440,64441,64442,64443,64444,64445,64446,64447,64448,64449,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64606,64607,64608,64609,64610,64611,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65018,65019,65020,65136,65137,65138,65139,65140,65142,65143,65144,65145,65146,65147,65148,65149,65150,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,67584,67585,67586,67587,67588,67589,67592,67594,67595,67596,67597,67598,67599,67600,67601,67602,67603,67604,67605,67606,67607,67608,67609,67610,67611,67612,67613,67614,67615,67616,67617,67618,67619,67620,67621,67622,67623,67624,67625,67626,67627,67628,67629,67630,67631,67632,67633,67634,67635,67636,67637,67639,67640,67644,67647,67648,67649,67650,67651,67652,67653,67654,67655,67656,67657,67658,67659,67660,67661,67662,67663,67664,67665,67666,67667,67668,67669,67671,67672,67673,67674,67675,67676,67677,67678,67679,67840,67841,67842,67843,67844,67845,67846,67847,67848,67849,67850,67851,67852,67853,67854,67855,67856,67857,67858,67859,67860,67861,67862,67863,67864,67865,67866,67867,67872,67873,67874,67875,67876,67877,67878,67879,67880,67881,67882,67883,67884,67885,67886,67887,67888,67889,67890,67891,67892,67893,67894,67895,67896,67897,67903,67968,67969,67970,67971,67972,67973,67974,67975,67976,67977,67978,67979,67980,67981,67982,67983,67984,67985,67986,67987,67988,67989,67990,67991,67992,67993,67994,67995,67996,67997,67998,67999,68e3,68001,68002,68003,68004,68005,68006,68007,68008,68009,68010,68011,68012,68013,68014,68015,68016,68017,68018,68019,68020,68021,68022,68023,68030,68031,68096,68112,68113,68114,68115,68117,68118,68119,68121,68122,68123,68124,68125,68126,68127,68128,68129,68130,68131,68132,68133,68134,68135,68136,68137,68138,68139,68140,68141,68142,68143,68144,68145,68146,68147,68160,68161,68162,68163,68164,68165,68166,68167,68176,68177,68178,68179,68180,68181,68182,68183,68184,68192,68193,68194,68195,68196,68197,68198,68199,68200,68201,68202,68203,68204,68205,68206,68207,68208,68209,68210,68211,68212,68213,68214,68215,68216,68217,68218,68219,68220,68221,68222,68223,68352,68353,68354,68355,68356,68357,68358,68359,68360,68361,68362,68363,68364,68365,68366,68367,68368,68369,68370,68371,68372,68373,68374,68375,68376,68377,68378,68379,68380,68381,68382,68383,68384,68385,68386,68387,68388,68389,68390,68391,68392,68393,68394,68395,68396,68397,68398,68399,68400,68401,68402,68403,68404,68405,68416,68417,68418,68419,68420,68421,68422,68423,68424,68425,68426,68427,68428,68429,68430,68431,68432,68433,68434,68435,68436,68437,68440,68441,68442,68443,68444,68445,68446,68447,68448,68449,68450,68451,68452,68453,68454,68455,68456,68457,68458,68459,68460,68461,68462,68463,68464,68465,68466,68472,68473,68474,68475,68476,68477,68478,68479,68608,68609,68610,68611,68612,68613,68614,68615,68616,68617,68618,68619,68620,68621,68622,68623,68624,68625,68626,68627,68628,68629,68630,68631,68632,68633,68634,68635,68636,68637,68638,68639,68640,68641,68642,68643,68644,68645,68646,68647,68648,68649,68650,68651,68652,68653,68654,68655,68656,68657,68658,68659,68660,68661,68662,68663,68664,68665,68666,68667,68668,68669,68670,68671,68672,68673,68674,68675,68676,68677,68678,68679,68680,126464,126465,126466,126467,126469,126470,126471,126472,126473,126474,126475,126476,126477,126478,126479,126480,126481,126482,126483,126484,126485,126486,126487,126488,126489,126490,126491,126492,126493,126494,126495,126497,126498,126500,126503,126505,126506,126507,126508,126509,126510,126511,126512,126513,126514,126516,126517,126518,126519,126521,126523,126530,126535,126537,126539,126541,126542,126543,126545,126546,126548,126551,126553,126555,126557,126559,126561,126562,126564,126567,126568,126569,126570,126572,126573,126574,126575,126576,126577,126578,126580,126581,126582,126583,126585,126586,126587,126588,126590,126592,126593,126594,126595,126596,126597,126598,126599,126600,126601,126603,126604,126605,126606,126607,126608,126609,126610,126611,126612,126613,126614,126615,126616,126617,126618,126619,126625,126626,126627,126629,126630,126631,126632,126633,126635,126636,126637,126638,126639,126640,126641,126642,126643,126644,126645,126646,126647,126648,126649,126650,126651,1114109];u.prototype.applyStyles=function(t,e){e=e||this.div;for(var o in t)t.hasOwnProperty(o)&&(e.style[o]=t[o])},u.prototype.formatStyle=function(t,e){return 0===t?0:t+e},c.prototype=h(u.prototype),c.prototype.constructor=c,p.prototype.move=function(t,e){switch(e=void 0!==e?e:this.lineHeight,t){case"+x":this.left+=e,this.right+=e;break;case"-x":this.left-=e,this.right-=e;break;case"+y":this.top+=e,this.bottom+=e;break;case"-y":this.top-=e,this.bottom-=e}},p.prototype.overlaps=function(t){return this.leftt.left&&this.topt.top},p.prototype.overlapsAny=function(t){for(var e=0;e=t.top&&this.bottom<=t.bottom&&this.left>=t.left&&this.right<=t.right},p.prototype.overlapsOppositeAxis=function(t,e){switch(e){case"+x":return this.leftt.right;case"+y":return this.topt.bottom}},p.prototype.intersectPercentage=function(t){var e=Math.max(0,Math.min(this.right,t.right)-Math.max(this.left,t.left)),o=Math.max(0,Math.min(this.bottom,t.bottom)-Math.max(this.top,t.top)),n=e*o;return n/(this.height*this.width)},p.prototype.toCSSCompatValues=function(t){return{top:this.top-t.top,bottom:t.bottom-this.bottom,left:this.left-t.left,right:t.right-this.right,height:this.height,width:this.width}},p.getSimpleBoxPosition=function(t){var e=t.div?t.div.offsetHeight:t.tagName?t.offsetHeight:0,o=t.div?t.div.offsetWidth:t.tagName?t.offsetWidth:0,n=t.div?t.div.offsetTop:t.tagName?t.offsetTop:0;t=t.div?t.div.getBoundingClientRect():t.tagName?t.getBoundingClientRect():t;var r={left:t.left,right:t.right,top:t.top||n,height:t.height||e,bottom:t.bottom||n+(t.height||e),width:t.width||o};return r},d.StringDecoder=function(){return{decode:function(t){if(!t)return"";if("string"!=typeof t)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(t))}}},d.convertCueToDOMTree=function(t,e){return t&&e?s(t,e):null};var m=.05,j="sans-serif",w="1.5%";d.processCues=function(t,e,o){function n(t){for(var e=0;e")===-1){l.cue.id=u;continue}case"CUE":try{i(u,l.cue,l.regionList)}catch(f){l.reportOrThrowError(f),l.cue=null,l.state="BADCUE";continue}l.state="CUETEXT";continue;case"CUETEXT":var d=u.indexOf("-->")!==-1;if(!u||d&&(p=!0)){l.oncue&&l.oncue(l.cue),l.cue=null,l.state="ID";continue}l.cue.text&&(l.cue.text+="\n"),l.cue.text+=u;continue;case"BADCUE":u||(l.state="ID");continue}}}catch(f){l.reportOrThrowError(f),"CUETEXT"===l.state&&l.cue&&l.oncue&&l.oncue(l.cue),l.cue=null,l.state="INITIAL"===l.state?"BADWEBVTT":"BADCUE"}return this},flush:function(){var t=this;try{if(t.buffer+=t.decoder.decode(),(t.cue||"HEADER"===t.state)&&(t.buffer+="\n\n",t.parse()),"INITIAL"===t.state)throw new e(e.Errors.BadSignature)}catch(o){t.reportOrThrowError(o)}return t.onflush&&t.onflush(),this}},t.WebVTT=d}(this,this.vttjs||{}),function(t,e){"function"==typeof define&&define.amd?define([],e.bind(this,t,t.videojs)):"undefined"!=typeof module&&module.exports?module.exports=e(t,t.videojs):e(t,t.videojs)}(window,function(t,e){"use strict";t.videojs_hotkeys={version:"0.2.17"};var o=function(o){function n(t){return 32===t.which||179===t.which}function r(t){return 37===t.which||177===t.which}function i(t){return 39===t.which||176===t.which}function s(t){return 38===t.which}function a(t){return 40===t.which}function l(t){return 77===t.which}function u(t){return 70===t.which}var c=this,p=c.el(),f=document,d={volumeStep:.1,seekStep:5,enableMute:!0,enableVolumeScroll:!0,enableFullscreen:!0,enableNumbers:!0,enableJogStyle:!1,alwaysCaptureHotkeys:!1,enableModifiersForNumbers:!0,playPauseKey:n,rewindKey:r,forwardKey:i,volumeUpKey:s,volumeDownKey:a,muteKey:l,fullscreenKey:u,customKeys:{}},h=1,v=2,y=3,g=4,A=5,b=6,m=7,j=e.mergeOptions||e.util.mergeOptions;o=j(d,o||{});var w=o.volumeStep,_=o.seekStep,k=o.enableMute,x=o.enableVolumeScroll,T=o.enableFullscreen,E=o.enableNumbers,C=o.enableJogStyle,S=o.alwaysCaptureHotkeys,O=o.enableModifiersForNumbers;p.hasAttribute("tabIndex")||p.setAttribute("tabIndex","-1"),p.style.outline="none",!S&&c.options_.autoplay||c.one("play",function(){p.focus()}),c.on("userinactive",function(){var t=function(){clearTimeout(e)},e=setTimeout(function(){c.off("useractive",t),f.activeElement.parentElement==p.querySelector(".vjs-control-bar")&&p.focus()},10);c.one("useractive",t)}),c.on("play",function(){var t=p.querySelector(".iframeblocker");t&&""===t.style.display&&(t.style.display="block",t.style.bottom="39px")});var B=function(t){var e,n=t.which,r=t.preventDefault;if(c.controls()){var i=f.activeElement;if(S||i==p||i==p.querySelector(".vjs-tech")||i==p.querySelector(".vjs-control-bar")||i==p.querySelector(".iframeblocker"))switch(I(t,c)){case h:r(),S&&t.stopPropagation(),c.paused()?c.play():c.pause();break;case v:r(),e=c.currentTime()-_,c.currentTime()<=_&&(e=0),c.currentTime(e);break;case y:r(),c.currentTime(c.currentTime()+_);break;case A:r(),C?(e=c.currentTime()-1,c.currentTime()<=1&&(e=0),c.currentTime(e)):c.volume(c.volume()-w);break;case g:r(),C?c.currentTime(c.currentTime()+1):c.volume(c.volume()+w);break;case b:k&&c.muted(!c.muted());break;case m:T&&(c.isFullscreen()?c.exitFullscreen():c.requestFullscreen());break;default:if((n>47&&n<59||n>95&&n<106)&&(O||!(t.metaKey||t.ctrlKey||t.altKey))&&E){var s=48;n>95&&(s=96);var a=n-s;r(),c.currentTime(c.duration()*a*.1)}for(var l in o.customKeys){var u=o.customKeys[l];u&&u.key&&u.handler&&u.key(t)&&(r(),u.handler(c,o,t))}}}},P=function(t){if(c.controls()){var e=t.relatedTarget||t.toElement||f.activeElement;e!=p&&e!=p.querySelector(".vjs-tech")&&e!=p.querySelector(".iframeblocker")||T&&(c.isFullscreen()?c.exitFullscreen():c.requestFullscreen())}},M=function(e){if(c.controls()){var o=e.relatedTarget||e.toElement||f.activeElement;if((S||o==p||o==p.querySelector(".vjs-tech")||o==p.querySelector(".iframeblocker")||o==p.querySelector(".vjs-control-bar"))&&x){e=t.event||e;var n=Math.max(-1,Math.min(1,e.wheelDelta||-e.detail));e.preventDefault(),1==n?c.volume(c.volume()+w):n==-1&&c.volume(c.volume()-w)}}},I=function(t,e){return o.playPauseKey(t,e)?h:o.rewindKey(t,e)?v:o.forwardKey(t,e)?y:o.volumeUpKey(t,e)?g:o.volumeDownKey(t,e)?A:o.muteKey(t,e)?b:o.fullscreenKey(t,e)?m:void 0};return c.on("keydown",B),c.on("dblclick",P),c.on("mousewheel",M),c.on("DOMMouseScroll",M),this};e.plugin("hotkeys",o)}),function(t,e){"function"==typeof define&&define.amd?define(["video.js"],function(o){return t.Youtube=e(o)}):"object"==typeof module&&module.exports?module.exports=t.Youtube=e(require("video.js")):t.Youtube=e(t.videojs)}(this,function(t){"use strict";function e(){if(!r.apiLoaded){var t=document.createElement("script");t.src="https://www.youtube.com/iframe_api";var e=document.getElementsByTagName("script")[0];e.parentNode.insertBefore(t,e),r.apiLoaded=!0}}function o(){var t=".vjs-youtube .vjs-iframe-blocker { display: none; }.vjs-youtube.vjs-user-inactive .vjs-iframe-blocker { display: block; }.vjs-youtube .vjs-poster { background-size: cover; }.vjs-youtube-mobile .vjs-big-play-button { display: none; }",e=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",o.styleSheet?o.styleSheet.cssText=t:o.appendChild(document.createTextNode(t)),e.appendChild(o)}var n=t.getComponent("Tech"),r=t.extend(n,{apiLoaded:!1,constructor:function(t,e){n.call(this,t,e),this.setPoster(t.poster),this.setSrc(this.options_.source,!0),setTimeout(function(){this.el_.parentNode.className+=" vjs-youtube",r.isApiReady?(this.setSrc(this.options_.source,!0),this.initYTPlayer()):r.apiReadyQueue.push(this)}.bind(this))},dispose:function(){this.el_.parentNode.className=this.el_.parentNode.className.replace(" vjs-youtube","").replace(" vjs-youtube-mobile","")},createEl:function(){e(),o();var t=document.createElement("div");t.setAttribute("id",this.options_.techId),t.setAttribute("style","width:100%;height:100%;top:0;left:0;position:absolute");var n=document.createElement("div");if(n.appendChild(t),!i&&!this.options_.ytControls){var r=document.createElement("div");r.setAttribute("class","vjs-iframe-blocker"),r.setAttribute("style","position:absolute;top:0;left:0;width:100%;height:100%"),r.onclick=function(){this.pause()}.bind(this),n.appendChild(r)}return n},initYTPlayer:function(){var t={controls:0,modestbranding:1,rel:0,showinfo:0,loop:this.options_.loop?1:0};"undefined"!=typeof this.options_.autohide&&(t.autohide=this.options_.autohide),"undefined"!=typeof this.options_.cc_load_policy&&(t.cc_load_policy=this.options_.cc_load_policy),"undefined"!=typeof this.options_.ytControls&&(t.controls=this.options_.ytControls),"undefined"!=typeof this.options_.disablekb&&(t.disablekb=this.options_.disablekb),"undefined"!=typeof this.options_.end&&(t.end=this.options_.end),"undefined"!=typeof this.options_.color&&(t.color=this.options_.color),t.controls?"undefined"!=typeof this.options_.fs&&(t.fs=this.options_.fs):t.fs=0,"undefined"!=typeof this.options_.end&&(t.end=this.options_.end),"undefined"!=typeof this.options_.hl?t.hl=this.options_.hl:"undefined"!=typeof this.options_.language&&(t.hl=this.options_.language.substr(0,2)),"undefined"!=typeof this.options_.iv_load_policy&&(t.iv_load_policy=this.options_.iv_load_policy),"undefined"!=typeof this.options_.list?t.list=this.options_.list:this.url&&"undefined"!=typeof this.url.listId&&(t.list=this.url.listId),"undefined"!=typeof this.options_.listType&&(t.listType=this.options_.listType),"undefined"!=typeof this.options_.modestbranding&&(t.modestbranding=this.options_.modestbranding),"undefined"!=typeof this.options_.playlist&&(t.playlist=this.options_.playlist),"undefined"!=typeof this.options_.playsinline&&(t.playsinline=this.options_.playsinline),"undefined"!=typeof this.options_.rel&&(t.rel=this.options_.rel),"undefined"!=typeof this.options_.showinfo&&(t.showinfo=this.options_.showinfo),"undefined"!=typeof this.options_.start&&(t.start=this.options_.start),"undefined"!=typeof this.options_.theme&&(t.theme=this.options_.theme),this.activeVideoId=this.url?this.url.videoId:null,this.activeList=t.list,this.ytPlayer=new YT.Player(this.options_.techId,{videoId:this.activeVideoId,playerVars:t,events:{onReady:this.onPlayerReady.bind(this),onPlaybackQualityChange:this.onPlayerPlaybackQualityChange.bind(this),onStateChange:this.onPlayerStateChange.bind(this),onError:this.onPlayerError.bind(this)}})},onPlayerReady:function(){this.playerReady_=!0,this.triggerReady(),this.playOnReady&&this.play()},onPlayerPlaybackQualityChange:function(){},onPlayerStateChange:function(t){var e=t.data;if(e!==this.lastState&&!this.errorNumber){switch(e){case-1:this.trigger("loadedmetadata"),this.trigger("durationchange");break;case YT.PlayerState.ENDED:this.trigger("ended");break;case YT.PlayerState.PLAYING:this.trigger("timeupdate"),this.trigger("durationchange"),this.trigger("playing"),this.trigger("play"),this.isSeeking&&this.onSeeked();break;case YT.PlayerState.PAUSED:this.trigger("canplay"),this.isSeeking?this.onSeeked():this.trigger("pause");break;case YT.PlayerState.BUFFERING:this.player_.trigger("timeupdate"),this.player_.trigger("waiting")}this.lastState=e}},onPlayerError:function(t){this.errorNumber=t.data,this.trigger("error"),this.ytPlayer.stopVideo(),this.ytPlayer.destroy(),this.ytPlayer=null},error:function(){switch(this.errorNumber){case 5:return{code:"Error while trying to play the video"};case 2:case 100:case 150:return{code:"Unable to find the video"};case 101:return{code:"Playback on other Websites has been disabled by the video owner."}}return{code:"YouTube unknown error ("+this.errorNumber+")"}},src:function(t){return t&&(this.setSrc({src:t}),this.options_.autoplay&&!i&&this.play()),this.source},poster:function(){return this.poster_},setPoster:function(t){this.poster_=t},setSrc:function(t){t&&t.src&&(delete this.errorNumber,this.source=t,this.url=r.parseUrl(t.src),this.options_.poster||this.url.videoId&&(this.poster_="https://img.youtube.com/vi/"+this.url.videoId+"/0.jpg",this.checkHighResPoster()),this.options_.autoplay&&!i&&(this.isReady_?this.play():this.playOnReady=!0))},play:function(){this.url&&this.url.videoId&&(this.wasPausedBeforeSeek=!1,this.isReady_?(this.url.listId&&(this.activeList===this.url.listId?this.ytPlayer.playVideo():(this.ytPlayer.loadPlaylist(this.url.listId),this.activeList=this.url.listId)),this.activeVideoId===this.url.videoId?this.ytPlayer.playVideo():(this.ytPlayer.loadVideoById(this.url.videoId),this.activeVideoId=this.url.videoId)):(this.trigger("waiting"),this.playOnReady=!0))},pause:function(){this.ytPlayer&&this.ytPlayer.pauseVideo()},paused:function(){return!this.ytPlayer||this.lastState!==YT.PlayerState.PLAYING&&this.lastState!==YT.PlayerState.BUFFERING},currentTime:function(){return this.ytPlayer?this.ytPlayer.getCurrentTime():0},setCurrentTime:function(t){this.lastState===YT.PlayerState.PAUSED&&(this.timeBeforeSeek=this.currentTime()),this.isSeeking||(this.wasPausedBeforeSeek=this.paused()),this.ytPlayer.seekTo(t,!0),this.trigger("timeupdate"),this.trigger("seeking"),this.isSeeking=!0,this.lastState===YT.PlayerState.PAUSED&&this.timeBeforeSeek!==t&&(clearInterval(this.checkSeekedInPauseInterval), +this.checkSeekedInPauseInterval=setInterval(function(){this.lastState===YT.PlayerState.PAUSED&&this.isSeeking?this.currentTime()!==this.timeBeforeSeek&&(this.trigger("timeupdate"),this.onSeeked()):clearInterval(this.checkSeekedInPauseInterval)}.bind(this),250))},onSeeked:function(){clearInterval(this.checkSeekedInPauseInterval),this.isSeeking=!1,this.wasPausedBeforeSeek&&this.pause(),this.trigger("seeked")},playbackRate:function(){return this.ytPlayer?this.ytPlayer.getPlaybackRate():1},setPlaybackRate:function(t){this.ytPlayer&&(this.ytPlayer.setPlaybackRate(t),this.trigger("ratechange"))},duration:function(){return this.ytPlayer?this.ytPlayer.getDuration():0},currentSrc:function(){return this.source},ended:function(){return!!this.ytPlayer&&this.lastState===YT.PlayerState.ENDED},volume:function(){return this.ytPlayer?this.ytPlayer.getVolume()/100:1},setVolume:function(t){this.ytPlayer&&(this.ytPlayer.setVolume(100*t),this.setTimeout(function(){this.trigger("volumechange")},50))},muted:function(){return!!this.ytPlayer&&this.ytPlayer.isMuted()},setMuted:function(t){this.ytPlayer&&(this.muted(!0),t?this.ytPlayer.mute():this.ytPlayer.unMute(),this.setTimeout(function(){this.trigger("volumechange")},50))},buffered:function(){if(!this.ytPlayer||!this.ytPlayer.getVideoLoadedFraction)return{length:0,start:function(){throw new Error("This TimeRanges object is empty")},end:function(){throw new Error("This TimeRanges object is empty")}};var t=this.ytPlayer.getVideoLoadedFraction()*this.ytPlayer.getDuration();return{length:this.ytPlayer.getDuration(),start:function(){return 0},end:function(){return t}}},load:function(){},reset:function(){},supportsFullScreen:function(){return!0},checkHighResPoster:function(){var t="https://img.youtube.com/vi/"+this.url.videoId+"/maxresdefault.jpg";try{var e=new Image;e.onload=function(){if("naturalHeight"in e){if(e.naturalHeight<=90||e.naturalWidth<=120)return}else if(e.height<=90||e.width<=120)return;this.poster_=t,this.trigger("posterchange")}.bind(this),e.onerror=function(){},e.src=t}catch(o){}}});r.isSupported=function(){return!0},r.canPlaySource=function(t){return"video/youtube"===t.type};var i=/(iPad|iPhone|iPod|Android)/g.test(navigator.userAgent);r.parseUrl=function(t){var e={videoId:null},o=/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/,n=t.match(o);n&&11===n[2].length&&(e.videoId=n[2]);var r=/[?&]list=([^#\&\?]+)/;return n=t.match(r),n&&n[1]&&(e.listId=n[1]),e},r.apiReadyQueue=[],window.onYouTubeIframeAPIReady=function(){r.isApiReady=!0;for(var t=0;t=0;o--)e[o].src==t&&("hd"!==e[o]["data-quality"]?this.currentRes="sd":this.currentRes="hd")}},{key:"setResolutionsNeededFromPlayer",value:function(){if(this.resolutionsNeeded=!1,"object"==typeof this.typeAndTech){var t=this.typeAndTech.type;if(void 0!==this.sourcesByType[t]&&this.sourcesByType[t].length>1)for(var e=this.sourcesByType[t].length-1;e>=0;e--)if(void 0!==this.sourcesByType[t][e]["data-quality"]||this.sourcesByType[t][e]["data-quality"]!=this.currentRes)return void(this.resolutionsNeeded=!0)}}},{key:"removeSources",value:function(){var t=this.player_.el_.getElementsByTagName("video")[0];if("Html5"===this.player_.techName_&&t)for(var e=t.getElementsByTagName("source"),o=0;o=0;r--){var i=t[r].src;if(void 0!==i&&""!==i){if(i.search(/^\/\//)!=-1)i=o+i;else{if(i.search(/:\/\//)!=-1)continue;i=i.search(/^\//)!=-1?n+i:e+i}t[r].src=i}}return t}},{key:"getSourceForResolutionChange",value:function(){for(var t=this.typeAndTech.type,e=this.sourcesByType[t],o=e.length-1;o>=0;o--)if("hd"==this.currentRes){if(void 0==e[o]["data-quality"]||"hd"!==e[o]["data-quality"])return e[o]}else if("hd"==e[o]["data-quality"])return e[o];return e[0]}},{key:"switchResolution",value:function(){var t=this.getSourceForResolutionChange();this.switchSource(t)}},{key:"stopStream",value:function(){switch(this.player_.techName_){case"Flash":this.player_.tech_.el_.vjs_stop()}}},{key:"selectSource",value:function(t){this.removeSources();var e=this.sourcesByType,o=this.selectTypeAndTech(t);return!!o&&(this.options_.sourceResolutions=e[o.type],this.selectResolution(this.options_.sourceResolutions))}},{key:"selectTypeAndTech",value:function(t){for(var e,o,n=0,r=this.player_.options_.techOrder;ni?i:n;return t[s]}},{key:"switchSource",value:function(t){if(this.player_.cache_.src===t.src)return this.player_.trigger("resolutionchange"),this.player_;var e=this.player_.currentTime(),o=this.player_.paused();this.player_.pause(),this.stopStream(),"Html5"===this.player_.techName_?this.player_.src(t.src):this.player_.loadTech(this.player_.techName_,{src:t.src});var n=this;this.player_.ready(function(){this.player_.one("loadeddata",videojs.bind(this.player_,function(){this.player_.currentTime(e)})),this.player_.trigger("resolutionchange"),o||(this.player_.load(),this.player_.play()),localStorage.setItem("videojs_preferred_res",parseInt(t.index,10)),n.setCurrentResFromPlayer(),n.updateButton()})}},{key:"updateButton",value:function(){var t=this.prepareButtonElement(this.el_);this.resolutionsNeeded?t.removeClass("vjs-hidden"):t.addClass("vjs-hidden"),"hd"==this.currentRes?t.addClass("vjs-ag-res-hd"):t.removeClass("vjs-ag-res-hd"),this.el_.blur()}},{key:"prepareButtonElement",value:function(t){return"function"!=typeof t.addClass&&(t.addClass=function(t){if(this.classList)this.classList.add(t);else if(-1==this.className.indexOf(t)){var e=this.className.split(" ");e.push(t),this.className=e.join(" ")}return this}),"function"!=typeof t.removeClass&&(t.removeClass=function(t){if(this.classList)this.classList.remove(t);else{var e=this.className.split(" ");e.splice(e.indexOf(t),1),this.className=e.join(" ")}return this}),t}}]),e}(VjsButtonResBBase);videojs.reduce=function(t,e,o,n){if(t&&0!==t.length){for(var r=0,i=t.length;r=0;e--)if(this.players[e].id===t)return this.players[e].getPlayer();for(var e=this.lightboxtriggers.length-1;e>=0;e--)if(this.lightboxtriggers[e].playerid===t)return this.lightboxtriggers[e].getPlayer();return!1}},{key:"destroyPlayer",value:function(t){for(var e=this.players.length-1;e>=0;e--)if(this.players[e].id===t)return this.players[e].destroy(),this.players.splice(e,1),!0;for(var e=this.lightboxtriggers.length-1;e>=0;e--)if(this.lightboxtriggers[e].playerid===t)return this.closeLightbox(),!0;return!1}},{key:"closeLightbox",value:function(){for(var t=this.lightboxtriggers.length-1;t>=0;t--)this.lightboxtriggers[t].closeLightbox();this.consolidatePlayers()}},{key:"consolidatePlayers",value:function(){for(var t=this.players.length-1;t>=0;t--)void 0===this.players[t]||this.players[t].alive||(delete this.players[t],this.players=this.players.filter(function(){return!0}))}},{key:"configureVideoJS",value:function(){window.HELP_IMPROVE_VIDEOJS=!1}}]),t}();o["default"]=d,e.exports=o["default"]},{"./components/Lightbox":3,"./components/LightboxTrigger":4,"./components/Player":5,"./lib/DOMElement":6}],2:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(o,"__esModule",{value:!0});var i=function(){function t(t,e){for(var o=0;o=8&&t.ie().actualVersion<=11?this.options.youtube={ytControls:2,color:"white",modestbranding:1}:this.options.youtube={iv_load_policy:3}}},{key:"setVimeoOptions",value:function(){this.options.techOrder=["vimeo"],this.options.sources=[{type:"video/vimeo",src:"https://vimeo.com/"+this.getPlayerAttributeFromVideoElement("vimeo-id")}]}},{key:"getSkinClass",value:function(){var t="vjs-afterglow-skin";"afterglow"!==this.skin&&(t+=" afterglow-skin-"+this.skin);var e=new a["default"];return 9==e.ie().actualVersion&&(t+=" ie9-is-bad"),t}}]),t}();o["default"]=l,e.exports=o["default"]},{"../lib/Util":7}],3:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(o,"__esModule",{value:!0});var s=function(){function t(t,e){for(var o=0;ot?("undefined"!=typeof e&&e<.9*o.width?o.playerwidth=e:o.playerwidth=.9*o.width,o.playerheight=o.playerwidth*t):("undefined"!=typeof e&&e<.92*o.height/t?o.playerheight=e*t:o.playerheight=.92*o.height,o.playerwidth=o.playerheight/t),o.playeroffsettop=(o.height-o.playerheight)/2,o.playeroffsetleft=(o.width-o.playerwidth)/2,o}},{key:"close",value:function(){this.player.destroy(!0),this.node.parentNode.removeChild(this.node),this.emit("close")}},{key:"getPlayer",value:function(){if(void 0!==this.player)return this.player.getPlayer()}}]),e}(d["default"]);o["default"]=y,e.exports=o["default"]},{"../../../../vendor/Emitter/Emitter":9,"../lib/DOMElement":6,"../lib/Util":7,"./Player":5}],4:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(o,"__esModule",{value:!0});var s=function(){function t(t,e){for(var o=0;o=8&&o<=11&&this.videoelement.addClass("vjs-IE")}},{key:"applyParameters",value:function(){if("false"==this.videoelement.getAttribute("data-overscale")&&this.videoelement.setAttribute("data-maxwidth",this.videoelement.getAttribute("width")),"none"!=this.videoelement.getAttribute("data-autoresize")&&"false"!=this.videoelement.getAttribute("data-autoresize")){this.videoelement.addClass("vjs-responsive");var t=this.calculateRatio();this.videoelement.node.style.paddingTop=100*t+"%",this.videoelement.removeAttribute("height"),this.videoelement.removeAttribute("width"),this.videoelement.setAttribute("data-ratio",t)}}},{key:"applyYoutubeClasses",value:function(){this.videoelement.addClass("vjs-youtube"),document.querySelector("video").controls&&this.videoelement.addClass("vjs-using-native-controls"),/iPad|iPhone|iPod|iOS/.test(navigator.platform)&&this.videoelement.addClass("vjs-iOS");var t=this.util.ie().actualVersion;t>=8&&t<=11&&this.videoelement.addClass("vjs-using-native-controls")}},{key:"applyVimeoClasses",value:function(){this.videoelement.addClass("vjs-vimeo")}},{key:"calculateRatio",value:function(){if(this.videoelement.getAttribute("data-ratio"))var t=this.videoelement.getAttribute("data-ratio");else{if(!this.videoelement.getAttribute("height")||!this.videoelement.getAttribute("width"))return console.error("Please provide witdh and height for your video element."),0;var t=this.videoelement.getAttribute("height")/this.videoelement.getAttribute("width")}return parseFloat(t)}},{key:"getSkinName",value:function(){return this.videoelement.getAttribute("data-skin")?this.videoelement.getAttribute("data-skin"):"afterglow"}},{key:"destroy",value:function(){this.videojs.paused()||this.videojs.pause(),this.videojs.isFullscreen()&&this.videojs.exitFullscreen(),this.videojs.dispose(),this.alive=!1}},{key:"getPlayer",value:function(){return this.videojs}}]),t}();o["default"]=c,e.exports=o["default"]},{"../lib/Util":7,"./Config":2}],6:[function(t,e,o){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(o,"__esModule",{value:!0});var r=function(){function t(t,e){for(var o=0;o0&&!/x64|x32/gi.test(window.navigator.userAgent)&&(t={isTheBrowser:!0,actualVersion:"11"}),t}},{key:"isMobile",value:function(){var t=function(){return navigator.userAgent.match(/Android/i)},e=function(){return navigator.userAgent.match(/BlackBerry/i)},o=function(){return navigator.userAgent.match(/iPhone|iPad|iPod/i)},n=function(){return navigator.userAgent.match(/Opera Mini/i)},r=function(){return navigator.userAgent.match(/IEMobile/i)};return!!(t()||e()||o()||n()||r())}},{key:"merge_objects",value:function(t,e){var o={};for(var n in t)o[n]=t[n];for(var n in e)o[n]=e[n];return o}},{key:"addEventListener",value:function(t,e,o){null!=t&&"undefined"!=typeof t&&(t.addEventListener?t.addEventListener(e,o,!1):t.attachEvent?t.attachEvent("on"+e,o):t["on"+e]=o)}}]),t}();o["default"]=i,e.exports=o["default"]},{}],8:[function(t,e,o){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}var r=t("./afterglow/Afterglow"),i=n(r);document.addEventListener("DOMContentLoaded",function(){ +window.afterglow=new i["default"],window.afterglow.init()})},{"./afterglow/Afterglow":1}],9:[function(t,e,o){"use strict";function n(t){if(t)return r(t)}function r(t){for(var e in n.prototype)t[e]=n.prototype[e];return t}e.exports=n,n.prototype.on=n.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+t]=this._callbacks["$"+t]||[]).push(e),this},n.prototype.once=function(t,e){function o(){this.off(t,o),e.apply(this,arguments)}return o.fn=e,this.on(t,o),this},n.prototype.off=n.prototype.removeListener=n.prototype.removeAllListeners=n.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var o=this._callbacks["$"+t];if(!o)return this;if(1==arguments.length)return delete this._callbacks["$"+t],this;for(var n,r=0;roYZ)hAj z6NmrbPhs>+7%3EPo2x-?4R0TG(wpgH8+wu~VTrH>Xj({)BtsMMcYmL!E>)FEvJKsx znO$dh8msQ}x#~F{y{h^Qs)6ho_iN8k-DuaFYU^Ykz5kY0>M@M%ssy_&`V7{F6Pzc~ zYr`ZfqE;o6zO`**cwb=-d(HiS%yg0V?=Xy*;Kt9UK;?rA%rzobKUCcl*+mp z=*Cp8XuZ2l!k4WE;mej)__9?OzHBXQLDRJStwt&}=+V~715BS3JFE78$LVZ_Ze<6yjDbVW?z*#Ov|zQR>H}qwbEif8zXLH;IshHtw*CCmz&4P-Y#U2YaaBP zO>nM)*<8iuC^P?#H>sJoSd*xP8U_+?CEWMfs^6x+V{f9YM zh)NY3&9%2GUanGA$Qn$v$)BR+Izrsrp@e$%O$sOg&?S%0RYq#ZioexZbE>#gx9Rrh zRp-}d8#aqDjDi%!0E)Wfa_HAv&$o73)bmhQiU*<)@Y7@2LJLJDMA-X^W}~S zRhU45K47&v&`&(F2(SB|qQOf`TFmITJyyTw-v0MixcxHDhaa;N0O?LUux%?i_iCyU z73V2#+y|~#!;G=o1>zEu8BI3#t>HiO6zJgKH;Vujz|%Ct1`N-V^|`RL%uLZgr~e*z=wOF`cfH@=RiqC(+wt?P49m#vc~gX)4Y`}!d!y*W1AHV#XlYj^wyaGz z6;N8wYz=2EZCdiG=IU)VHq_iovE^f$5!YEUL~d=Z z!54{D@tr~0-AV;mQ4cbLYCc3KTm_RkY??B4!=b{~cYNj1@_UM88G0zfJBNkKMQr}Z};zLQ?#YUm1 zi>_~4MzKAY!MkX*>V`w}c@()D6q*{Fp3O-!d^^l1XJ-<3KDd_|=99{5PZB_NcZTJq zMbV>U3z0K_Fy6KrOiwFF4C9FMVOUgRitf`nP5S4b4X0d^Xb8mWTw7?V*DS-Bt2W)O z1!^zcozR6^*ihe;sLXJp*D_g}N}W&K&D{9Oc+5AxS)l=g|8FpdCsO9O!@X}##pl5G@x)Jn$We8&m8rQ|@0I0!6!WijBmBaj& zT7nB9iG_#XtQRn=sp??Xm7a9o*5Jq#^DFuk+G&b~H**L=W}#?WsR&x4XY$7=gX0;R zyt^0$UPC&P-9?`}=N+LAc^AaF3vX(pKHdX{+ZY0r$);gj*;~uvqkOvPu<}@m=KBg+2hq>xce-y0~zRz(-%)cAnWb>l_-oZECxXH2T)f=-ifIIa+W5{tY*Y1pVgZ1S~+V} z8tSZKgYN1MAsY{&MF~fy*AHR8eh9IDV6E--QG}DS=yj+$nLXW>IM=GSy51E}ci)h~ z`ZX>D{a(=f@53X~e#cW+U3>f9GtfsgF!+@K@mzZlzdu||dBj>-oyCkg^K17!wmH6> zb7=>dvtnTH5hHjk+`NvjqRgtox7g0i@hI9{xy~p*c26EMoR;P+ocvtd{pP@bf->iJ zGd?e-t@fCMfIGvoNSZt~s6fsPL!vQ5&+|A;)W;VANGK!1M8C@Gt|hgoCz=V>WPI8R z@_p;vQFV<*QVa93sO2l-s2;FEPpulNI93g2*0gh)^muG7X}s!LHoBD@EieNqFy(i3 zv9Ct!iN~|`TOpxPVSdFLS8SnwP}mh7AFI>KC#2ARc{Glws}cT7r3>XWw|l?uZ0io~ z=;`8&rO8iQEM;Y|cH!ux38SzPcH*lG8X!WBbp$JCeTsr~dCI-$$>W1NmBrD00iJTO}N z7=ykAjO92{{J0Eio5?UwtHV31XFR&63W?Ji{)0A?YSbcv4i4vkhQpynEVQ|~slu!7 zt`*EFz^(osE=1o3u+(6xGB%->%Rd@aZ>_p}T)p(}JkPFLRrtzm9tFO}rW=}UZt4e* z{Kxqu9pV{rOA>i^*J0ktg0c(58;g(o;XW0#D!HyIT6ND2`yeg2)?0NfC9* z{Pr&EQugUjM{j=$qUkU!hnH^ZiDXuMI(0|caDpQvj*Yd^Kbfg!U1IX!2z?mlOWa@K zXs99b!F)sM{NZkf7<9g77%5{q+!4P1A0Co$Z?U)@bFROCfI&!cbDui=kJQ$6X~92@l-yc+%67Rz!FpFVy19Y-_E zr4hAcY4AE!S#`BKGg6ApaAPD(K6U|SdUIKzEz?a0<;50_#PX{ee50Pv0|#06KJ%4F zof~xa!&_c|)G_(v+HOd;yDwLt<{KjYw5VMygi<#fwD1;!G3`-)9!KwdmwT}Hb%&^X z{`m?k+~6PR|IRJIMf?h&s`6lJ!Ef8!+pW=eyPJ_)--Rmd+Xe8 z_SU&=D)cSRg|tlBvft}^#JaxCHsxy(PF9CrTb1jr$Db5+d%3FNZnZ`D`|B@en^QVP zt&uMF#=_c}kDB|IGWW&t+hTLyu*LRN=H3u2(AGUI_i&XNi;sFLEO0#XzgA{eEu(Z} zc9Y|O*m8?%y8h~X9)F2OdH^!vDrt}YZ`#s&r#qw)lUbeE1D!Q+uWi_U7u_+mji;X1 zDBNxz-J;#t(y&{6M*3PUafS7U2`xP0QG8ABQ1$G8XXw=PwRl7y%7vvr=XJ<5{ePB@ z==3o*Lh~TH?CHZ+gsq|epsWD}?+)&~lb!v45)Dfy2=KKfJMTnaaPGzGssl$dItLgx za#lp8IQuT0lt zpZ)P|C1B!bVY1KuSW6U9a=wrM_~m6>kcd5w|3U{3z(uYKgOlYTkIG4&c0_t70w9`y z5dcdvC3g!F(luPkj*AoatE9iMi6pQrMIQZg66dfM{0Bnam2h=6@pyj;G`iBG&^Q)p zF;Bx*CqWwBbPmvmgzLNv(=;nPFw+s=na&T+TCwK*0PwuL%(I)$1R&N3R`u=sSD$`5 zIDPm2==AmbPw!qiWHQC}h5?Q}xZ_)Y>EBJK1Dpc_`(cSA;8JnKb@pf@OT`u?$s`$*>9IdCOAMVZHN)(3JA=`G+D%hlDgdwLobZ|PF*m;Rjt$0(eCB&Fk* z)2XuY6rbYOxn(C#0avF(dUZUHtvc?}5zIi}CtS}?*cm2aQFKE1e|fqbuWCK6S}&F6 zK1Sye@bW{^CZ6IBPzvb}W#0>Hubv=Z1qTnVvKE7ASExc%~) zz*1M+P^H3RMAZ-rIYe98)zuV#0PIQtINrJ%hd49@Gbqx<=B_41*@@!v5|YoN4%Y5u zxw1T@gUjcvi5}o^cgJ~FX7qvhJ)Ht4Yh36)sxk>$u)wZQh9zLuI~s1-hry>nN#sbN z_$z&KlgB0d-6K%^JieIlJfPw{0xi0{k0L5Rh^F74?^{#p+W2^q=qOHqPhlOVnR2j# zl^(syA%LC@k0e3rh8~%~*S1H7@HO$sI8ec~0)!|Cl9!EvGLOXUSIMp{{f!0Xg)3aR zf-sY6VY+7%py6H~9=^oW7%1S6RdFmB%b98|Fn9MalX&=9t&hET8SXiye*wOdXzC`% z@;1R`9V-oSnidJY)4=(EfG(qcM&Rs_p;D)tM;9?_IlasPJExR(eGy+^@fU1(WDFFk zQX?2o$=!y(LAL$v=?U3b0)-_|_$>g1%|@V5y1)>SbNGa#K7!Bw=8i`$;d|tf>u(M- z1m_r-)KUP9FXhb&j+lS!t*%~Y@u<^-Eti= z6?PbO0wT7&?1X6t+1yUVnCuQ5TsXmNP6zJoD1yTe+%K@F9fV61vf`1G0FQzd;KjQ@ z#@j{?2lfr+WP5afl$oUnz}ZMHJFJ~&FNWJ)?T!=XaY#drIKDH^lDLd$U3y~EK!eit z)1n+O26hFdMwgeBdRd`>g9Mm=lIpl795JDTcEl;m@Th~sMoy%lw{jRf?tvMcUG{P-^0L4iDioFhJ>~_Nvi)GQ5 z*t6m3KS#G85Vi&?8Na!K5V?DE84oX4SNoglSJ~Kv(pzN1?K819KUUWUy1oW<4FJuD z|H!7liD;YbZu`54yf+s@-YCn`5x3x_$^knyaQC4Q!%3wlc#sU%yia|0=g)V=h`EvGv!pzf_lp2O!JqI$-B_9Q-)&)ekweO$Qj~C zLmu_ZQRThHPmy<)O!6x01$;q{Acn&Ei6IL{nv)nB#n+CFnwcA+rH`P5C>8L_B9stO z$&IWciUPQctE(3(5{Nits)!;Bx@#toB1Rxt@g_&F3a(5oGttPN26`qHXR>T3Vj_A% zXA&`g^!Qj#j8;m!D_VB3Tf6`}N4y)PoNX=LKM%ag+_>R&J++uoX^qiD7!(bxO*0-BaRkvj5_h{EkfM~lAgbR zzwd8WU;8dLLGAipu_3sg+8Lb{G=Y>wQ&)>{2(^NUUX2AgKYz@MOx=mbgG^@dAa(rX zkQ;*^xl#BL%8T^;-5%NP`@4OzyW#I{Fz$rxZTNc|z@uy}1&m7pLolO z8EvkjWeZZc8;?$d4F0{p&w#R8UB!RlldOnbMxf>a1()%N{p)&w5z_3Gjn^5-rt&rC zbSN&$sk1if!Y2Rm)0HJ8T8lm6-}`$!#{|3F7o=T)Uw$TeC%_IXKnlAuUt!*W zv+@L|gXAt?z0&~oQ)CL|bx#9-v05|@`L8M+HP+(tC9lqVW7AR61*rwyj&4!boxx9J zYLBwX@bWo&ABoFbwKk)!wQN_u)08?bJO*f@o+X3=7TCp0>d?!WzJv&6pl5KlV!b~o ze++tqa(&&?3mlgxVk~?Lwk+2h80$^9u(skxsvw@1S0V-y0k6e^GyPP_G&ztr%TZJr{KV zWp!?1fOJ5|;P~mw0}wVHg$zNUzSHd?E3@w|bi0KBK!OKf`_$(aB~42aB}UP@0FC1` zUTad_%#yR5YIQ+8SOgA#nhHV^rWcd&LWP-XvMZsTnNu{>D7ZudK+a00qtrCWP#Fr5 zDv&#H)I~P_=F+98Ta1$!5dS(=sU*afxMt)BAh- zn#ZH2x&UzXq6k!*3RA#q431yo#<7V@u2;K=7+idD`)1TE46A^D0W6EXf%eK3%&0Z+ zE#xQ47 z&w)%E0{<1}w@iG0n|2s0DCD;&?`6HBB$v*DlVyO##o#Cb50mVXGYxFT-hj~pK`dAu zdORepU9gKADkP&I7v;pM{$yvAMNHlteF1u%X~$c*&QRWOzzc(%>Sl7h!J!7bhzPu> zf-GGBfxyVsE+aq~Ms7-aB=?9-4U!T|ZtXJUlzch~pjI4z#P|2?0ef|o{RPk#YqgYH z5YtN5u8?xeso+&8vg*La_2kfjE>4cq6GnRtYQT5I(+t2CLKnDt0 zT7So4Cs$_$gtM7B@LpAY{+Yf8I4bHjs%}rpj?4hLBhlo78Rwga=6BVS&dpgrk>Zm3dgRw&Z(G|KpTUGMu8H9BL>AXdWows(@$7#AM@p&dE^d%`YFN9^YiJn zJ~zdG&PZEO+IBG;hO@aOC%<)Y z;v3iO{$4*4rMG{L;(S4Hk&=uRfi()z&3giCNf1*P0WX;%3msZWr<5`_If+T(O$TB3 zVgeLgLI04HK3hvhF7)_2e^V=J(di)3+Ja4g2DpOIXy2u?VOgOA&>(o0ev%;N&sy%&V*F z*Ps$cvaaLeBld8*4?tIu6EoVph{_}M06i&T^nEx5l`QAKCeb9~LM0{P{$7ZYl*I0M zQe5HzZds>~`aC&RAx0;u5oJU*yECC~%~EV?KOd zS$0JrJ|+%g$BUUHh+~3Zb!ms$WG73L+fFzfMnI!?Xgl~6&f4hE=WA1c1R_b1P!%n4 zl7CW0qeEOeDM)K8RLR)~QIKJ_cw_t-dxmM=-)AVc6DG!Td-yz*uF{}wbqA5$THtU5 zfffaHk6xqK<=SO1m&(FcaBlz%2^q!3u6Ts|31}$Ax67Mad;g0LV+{FbQKT87Q3oy_{8wQKAm@TnN~lB()RQM3yyRdI_B*D5 zd}$2j$G!)(`_kZDp1iU)uJwqIFRo|)jc5K1Xz;gTdD$)gnFIKL_(QrD{~`7U#g7@4 zd8`02#buzewrh|xHP$kT!fVdSXz4?ID^DyLQ99C>9;d^0j)`3aqhMRZ^>PqDL#8il zP$iRq7j?B!_GBKS`m3hx;gX4Uq=ZX+@;B2@MU;!$;`k|yk1S4RR)#Y>*9iquSTsj{ zpT9vb%>X0eAP^3JUjY8d)RJs$<5A;^sp@JswqtHAJC~((`?99p&P-rZ@d*Zfpsg4> zWUv5jjqQn0$=c*g=p;lL=zJiB50pow)Ktl`*PXSj8ntAa@hRK@T1uN5-qXgW^~{H_ zQJ``xk##I(^@Lmv21(@F`iVVy*a9kNqIm^np@t=ldH!O5YiJp`Z4s*x&bx}ra9WqK zrud{hw<&MFWhEgjfN^%UZz=%RQjVjOAY&6&rH$HCo~>nMa`k5R%>-Xvoz+!st+?wD zdnz_&dvH6tjJPR-^2&xPNuyEqV9(nSuVVBKEiRRpHnEOSg@ywWH7uHCRBT&y<^d7X zFka7RkPp{?G5P{rwEh?xAyt1jC6-Ca-grG1w#cTUK#qoFN5IP+eJg7rjD)Mvy4ly=tY%6Ah>C1qiUz#1B&{z7kQyy5u}jA7f-ClKs-KC z?Tg4Wb?Dq2mFJWOk8@yO;2+6eq_8DZ*BjheH3!>&RhKR5%3J>K7FSx{-SKyK$nKuM zyGQmm{k_fU3E5dHFfSFDe+vrCXl~f(BH^jxA)!g1SpaM(_4GeWe zzfk*8`E=*knr^U3p_|Q zU7K=$gj!amk|i~o@ooQEB%DTNYisho`ZznmTY$kTT+9o@G&=u)c$wgmn#`G8i#VHX#W&g<(T`2_F|Q{*b!?SN7f>0|Lr!Tg6b`Gq(O zb08bz+;@^PcK`w~ml)`IdhA#Y7bkU-mDAu(=zsdh4g%XFs$u|a35yzmKu6H1;+YX8 zv#*#FVzj5HUnmKJ@i-!eNR>b4v7We_3`jvg9aTPHkr1wJdZ9Nvg!_g=IP;ejfvgs?`MJC%EBzBngSlFR_x zeBdu|lO_hZo}d|e&+qq0zwh_^q`%?!H%Nce?{AX+uHWA!8-0JHPd2vvjV-dV?Qd+8 zji>&`Q?jw=Z|srH4S#ckY;O90o10{F%ir80o7?{8Hrd?uH+RWa&)@1%M6l!UkUf77 zP{H036)aJ~Zvhp2FGF^GuTw9!pjw41iq|rS)5(t(%v60ze=!fYW;ch|=&m;|s-mv9 zFZJq#5x?^;OV_I+4%dm)im2I(I}EmsK;%VV;!@4k%$&REAv`Ly0t@+n9ahFYQy}x& z1o1Nr_W^t_Wid-x%o5svEBA$q2w!Hq9Gr|tusU2-RJa_>D_s&vwhBC8RC%c5zy}fd zNFHlG#rSU^>T6!lm~pV?O|H4kksz+6Gc^B)XXt#6UCN;DcJ9X?)@WCiUzfuYI=Z3< z+VR$$XHT&HkB(XFr#C-;A0W24(>(KK=jZ6jF0#9^V{?IQ9m!}L(ST-LuPb)Y^@1Si zKj|?{gNnWaub>*U`w-VsKdJo6xq%nXVUp696k>+OLRI|75;ZJQ!xA;rP{T%>l)m>s zDgA6j!T16u`Y>?;`gJKG^%P%%>5uL?tn37K>t|Yl^ZWsG^pZD!*+z(7FfO-67ZE`f z>(G@wwsf@LVusH~t4WZCvt>t`5@h70WxAI$8>2I)t*9G*TpPZmv|#y$MLQ+V^>Aw z)wfHaMEf;=`P00}RCf6YwOf4Bu5&MV^;AM!H-z(4-CFTB&XuI13Iqp{#Wz-2c~inp zMva}2JDi!1P?Zu$ErT*a})_O_sZw7c5ztbEZBLcz<+j6BfhH^6S(}I;KO5yB zev1gjHUJ9q=IvYfpb_vziA2(NF!7ez820C_v?12-U;_@ho`XoVY0^A52*&5Atg_|z zx5(CiQ-A9z+1m5B_H>?p875)L)BoxTwUFz6e+8yK?IJQnH(QmPi30t6NM-Lr)#pa{ z2O%dGXUPK+*+4=&2|}iUZBSo{6iFv7Vt^(NeU|35X^DT8R{7&!pLJed3koT~&$vNJ-k}y3`kS4pOYf9c+o^C#FM4{#y0~?xJvA+v)due{g{j?eF*f3}*9thdW7;Zo0UC zC$=1RF{+-%Vswu6Ot?23#KMpVJ^oS|h8v^j)v}8Y31W)xkK>a;a)0k8l^-yb{U2)q zL$Gv^py3l6L=v5s7&?Z!(liDZu2V9#7W$CzNQQ zB?D3AAu1|xDn9T-Ms?0-s;MmI8eoZk*_N1XiP>tH4FgNfr>0Vmzr3l(U*1&$NqtSM zn3^&oBSA7SxcyF7^2 z)3rW2QLp3|8i8SV=qXM;BY!+n1o4xNftsa7S=KVxOmph0(ph)b++scV=#&i$>)MXm z{3?&APtlCJDr?F;hbpHyUT*WcSk`g7^bWJ!N6>Cdk#Sup~cZYqig-$J(lV=5w!QZxw=HL=V} z-Xe;zxR@9sb6gQAMiJ_Njqm?Dy*eLN`CaKasx2sHM2(V)1TFrV7lKC%wS?$mA+eS? zG&96o#W0_ool(0lT@4YjY&g7(F#K8N*g#iHR5CwJiRvz8)?KI7e=!x_m3 z(*=vwBgu~6-y!`yzrQD5KNoWwvZT?MH2M;h&6E*8)r7>`nsRWXj2OWnb!^pVj;(qO z7=CS?;btOUfRKvRk5YVxv=k6j{$dQ>6qIC92t# z6cCk?Gj$uHBRC>x(wUS&5**o4TY1SretE>s(KX{E=rXb6bEgjCfV z9dzhs+QI;k)Kl%oels6~tWQ2o%OeA8*Yl8yTo1Z^V`%EKn<|dV2tSSISw8`7G`xF%??a ztEcWGa%_k}P6z;PhP}+JDN(y*Bc+~;1C87n&ETXCIn!lVli&9H+xW84e@Zrb{s!~H zxc$`Mep-JC0sd-Z=|pVFUoH8oT`!~gekE7^g zL=Sjnu<)OAJ~V7B<^*l|(6D@H_;(NsH4cl8M2N#QZKU#u|CAj!^g~#ka&Tw6Xv<&VTf8l53 zGjN}N+QmPFzUJ_cHKzjuErHD`94$0rpH#xS)}(oT;>U$M0aJKeq!s zUDpj6Lps!TISTZIr#Vg|oopPX1?+Tf$ej_K?d)PkAkEpX>wuL*u8zIK;h1Pdm_s=v z?pT^EQUy7<^9-mtYaD}_1Q82VBid`XVc+cgn|(nPE!}f0q1y05e1lk zq@*zYb%YHt2ueyQ6wZp#%Wq#H!t{oZ<>`2PkBQW4H|~yt4fR0qQq9gi=J4Y5E-d5g z=tzLHf;vGKZ&ooz3g-3cZ{fQsYVp8dqY16?hNIy4L=*KrX3!XRex9hn6fZKx1Ne11 zrLV!(;c9PtGhzkPwgMS#%puKzgkQ>kGIOGYqAi9n(6}3$WV7dQ_5?my`ZQU-IxTV4 zBVU~mS2bFGBe||<^=<5EK0nbvsABnzX5wdn*r??IX`n{QTO!)&v&qFUx%>o|B(Bd7y;;WGmF1NC zQ^CwD7${a@{XrF=uL|ms^rC4I#Bn@RZ0(cSVjB)kuhVdx>IjGqt&=t+=I4>ZHDDj2ReQ1;bwo8E*%MZfg zrK?^t$(5>(S}>F~tn@Kmy9|H|0y>_&{INXb*fEwzaVh3eK zpBy9wV<7oggfhJsxAf~2LqjC1tBEC4H|ohKP6Q%F?k0kWOuZ=^HyfUR_$z&EdX@hg zmIDy22jFZXuE+4%crX-KyJtQ$+eJ4@<+Ye{`Q*5mqao8O&{2Zo2@LQ)dKF92U8q3}>uEf)SgLyD4B zC!Zm6K8EF<1qiF3h3J6{zq#4kERCWG7t!Wqg1rYJ^Dbk+d&m(^Ku1i2XaeQAV>?)s z7JBWgxC6DQeZr8c$@9V-_gL~5a8QSP5VdGUGsT$7!>GCic%Gksm0}BQHn#J^eTsrB zajQ)MM!F1TYA^`qm+mc=V15baza^7BCzxN5QJ%>mzlw@s9&6HIKHf}cJ%vZ-)zy_6 zc;lcuBq0a6tQLaM8t|~stde;+s@V3$D=PUhdhzt zyw=AunaBN;ef7h?n@S@|lME{iCYdx5PBUF|H9QB`hTO9b zxu*`fcj6zP43y{H%SE(<1{P-)-{A?mMT3byL2JspJ>x-oQA$mcX##v+8{qRAU%__$ zja~l!wYlSO?g&u2m^I*17`haOF2TGZ46Rl#5UY28czbn*F0Y(|{xCD})jSVjF8dY* z2VSzA`nF7UV{6@&U1gmBK*{tK@w-~neK9s)c1Up)zTXXlTp+1!#8J7xQ7G7zIEwjC zyM^3q)S80N4OE-T-3!#3df4lpA*dCPdO7=he~&-Xi%EEar~Xs=In8bW;wg`PxdJ4h zh{7m;=af-i_{A@@35hSO_dT1CIBXXZPa1{9;haKZfjKdJAvDJFZ3AV+2DHaxrwqry zZ4B`Z(K%83MHnDqNRYU=c$zou5Pu5@XNjF8npAk2J&r8JbpbUCVZ zJ(Izv@=C0eQVlObJD{#otjTuvW3HJb&a5vIq>Rg(+Poe$3Z!%~ka`!CHK5WXN_Gr2 zvg3SSvZIm?of(A3S^fQ$>}~ja8`90r=3-XCOY&n$ek{q4MS?hfQ#U)!K6PF)ozCxn z>Mlohx6+aRW$aF!HPaQTfO;Az@djsiB4Z~l;AH@i28$?uch|F%$PC?pxx%CGPu`;XVPk z1lLl>e{&&8UMQjQgRi18ME_y`UTi96_RTP<=-?q(wC0xXl^89_ z(`LcnPH*YlZyu8(JX)=xQdA zVe>-G+t#z7zq%T72U}z%_av+fg?XA{bH>euD>}QbNx)PD=tvxrcvf3vNT~{hlE!M% zJIL*N2lbw;#njHG78ABb&3iR%HmgzZQ-ABJW;V6CH0oVK%_Y=)tSn)FKBze;-OW7) zyS|N7;W|rTMNDzQ^N(+yS5fP#a4jPsYPgHMLS7!9VN90jcqa4 z7^iy~4L`rdScGN_H`Xra^(`^kOebElp~iS(SF9T&>KRL2>CY8MukI{THoM>RZR1}c zp4xnCVYa{4HHY39SnXkd9jw93wWZ8y~ZMmXL6Mqm*IP3D7_G%n_p%n}@FD`yuS0sFK0RG9QE zZLpVs?zaW#exssf4i*^wzQEHS7bgGkATjdK3Qg4_M&A17HqyUZDaukHvV>4yNg#qU z4^to_l`FQl6frV?d~TvqTq<0N_xorRmkL+nK*&|D#G7b23p zrId$AqqMvmr%9aR)`*`0de>13T*DoY;m9jR_N!EwlCOUCQ1~pVra<|9e}6Ys^OQ;} z)km9mIn4>XO#l`0);}@XJPGTBuURBzJ%rZ6DNhZnQIlhThe?XUA;!jVh(p5>=~jA{ zJ?7#iUW-cKn_7-j+4fm7$t_LSj>ufC&o|H{!?;o00mjc28HREkiBOob ziJ;fz(b-pVJ#~!Ee5$OA0*>EQ;xfzQf59yc(aDRw%$%NC)*L7p+1%BC$i|a#U4%5l z7rs=JLBQ{SQ}PBuDXn(aSj|`wk3UwlG^if@7uCo)CWjMT)avdra zLJt(BO(I%zlB+tqpTl47%p!WH*0I&ZgUT$KrR^2UZAa8N*(tNh@RI&MArmI6W>5%g zDq`MOP{fqY8rgLzaMc@L644v|t@Wl{H2u>QG<$r1dHyMlG zqI3kEnbY|+Zl24hv1KOb=U;s)l)k>!=<6$GL@LY<8qN`u*b=px?&%1n!t+Wk(NXw_jSeE5|B+%gcq<4 zj$^UgAK7G&ZjY$;{GL|FQi0r^$4T-$xe0FzJUC?pfGiL5TRc%P{3I(P>Ah&C0Fzz~ zsSs-mg+^gr&)@Em-5q~-2cg_=*)xFcLgaXV=7A@S;mqf79Mxkm9TY0bktEqo#58(P zZagJwZl)3eME7c8>H!U`sanq@7MPx3Ys6k7)5lQD*9WMN_x#)#a7{4&qqF@vl z%^AxPef{-_7F`fHlNT3iOJ!xGfCcXF%YlO@m%88JkiJAs_TUb`0RKQwLEJr$zX(5n zC%k9vFdRoG><#|d0j#uUeqpUx42I9aSYOSXN?@6TemM)coV$I0w~tryo5bX{-&| z5f#bws4CW%gDFW7NeH45wtC*B+IKB~=O?0GjbK`ZiXCslJOz@uTCYx$UBtuAbsSO} z7l>M*d`A)N>kw9YH0X?zD1s(r|Xd;P}|dqkm4KqI?b4s(?!nAzvSTiS>kY`N4z4>1io*;-sbt z38Rw4$kr3!vTvfZ&vE(D(lg6BF#Bi8uPvjf<;bzH9LtEzjFxd7>H~O*3}a%;V7@Y{ z9CLt;H5VG+RrW92;2_!3KBU@z#-k_8)q-TpP_$HK9EEM~u8P{eT@|)H(^BOK-X2z| zFU0`V!~@p<2|&>BxOW1q7mr6d40?m%vrtA3TwC){SN(W+0zeXOZmcp0cas2fxI=j; zH<2Xs7}^;>lMx8V&`xoj9FI>D9KV)6%+8S32l#y zF;z+co;%KcCn@uXS+4!WnmZJ&wP+nIX1w+wtpia>z2Z64aUD25XE45s!P@60!6V?q z{5t=&&t>;ioPs50kbb2``o*Y84TrGaE$va5DYM?`ACI^_64orB;WV(9QCA%gI?q&x zmv?!!w=AJJmd&H1QwJ!2cI$bL{}=I61-`4JPxTOPX8{mXBW7WpdqhnVOXoORGMt)n z0_+$7G)SlT8sT6O96N6hUcGsKdhqe%>B~=tNAKSvZk0*TU%dZ#bnr?`dv|d3m-iq4 ztfjp=c=`U-ftGam@#X2e_eZCPpFVu3H*)aq<;TB$z|<2`+vebt(}x}bIg|2-Cx0B( zn(f>mHsrmICJ|NyJelSBgo+6}u%rNwuMjJoMYKPqJKDQYSm@kl6DR~|rvPj+0(t~d z2Vlc7v=04msr?VLNx}*M+F?GCNQH>1exRvqNP^zQ%yC-Kt1%wtC;<5?rPBx)C$g<} z3;BS^^V=~_H%v#Jn+Vp7*0~I?S$|WXquT5N`Oep zkJX&x1n8wiJ(rejotDb+foOBbhyM`NE-l`c3SLV}@3CPlTMXW|_7vwi%(af9--W7S zihkGb9_n}Hv-G9w11P6AEDkb>-o=?zmi+`geALVu2KKj3j|x5aA@IZV$NzMzZn!q_l3N#i;~m5&?D zQ&dod?upb-5%P7Wg+s?iSEk=;ECrVaX2pa!VN&4g(BjnIdv&!ZTx+ZL-;By+=HI?r zx>gd80Zl~RCe!?_n*M^yK7Y&you;`%!z~G^>b2s_D2eOL1XWg|HB=pEpk&W#l&skU zfouH+*6WME-k&1S5GD|(-AP(p#^)vK30-#qgaZ~iNM6TzQR1vYw(_;8Hnu`vg@xniQh8E#J%7_Wbe2||+&Ff= zDBiEF;3f4=Z0*+7!VWY*3O&2gn~&ou|TiF9H@Em`H(4_y6vX4 z3U=VAvucHE$=1fG&2ZsS_LcT0>4V0pVKFRjA19AM(PYp4&3^|b375X6z{!Wz2y$4x zrctZpP+6Af};U4cK7_>6}_R33X`LCXb3K%NhipAzj^4gE}%m^W2mD37QW_H7`@;AyDKhqLU9W229M*LAnBs!H2U%=0O0C)l#B7`{ zGVEG-Wv3ls&^@XlTtz?Ibx5ab%ky28TYN-!8hXrhGj;$a-CFiJKBNiO#zh&T9C z%VK8UOZneY{VJx%-%g-GN>OiC_}P#Z`{}1c7gATwtqE#7k02Hv+{Tn}4Kjr0Oj3V~Af_6bTR!XU!}9p$k4h)7 z9O6S?1PR&zI3JfMrl?_2SL;YDIpo$Llx}s`>ZrCZt>(6u{xFv0(vnUk3v&!n7MWeG@>Lg)8LmR)8bK|}9aqu2oPrUc4bc!r& z&r~Ux@8oLL_C}`5G4ATCz+Yd1URiTal}Q7c#-4w^nMV|#2@{Cstd)sT@HalCv(04Z zdhVw=K2_M$PUU~)5l?AWQjQZ{K*3$}SCs0=duodLq{RZQH;Br0iP8PNE>v>f;yv&D z1vrT8#xb7`s&#I7*q4nfMQdFgA^wOF2~nWZxuKnPo$ArHHdnV?3+Pj&r6tzLFia7G z(^`L{&e?5;!T9uoDtjFi!*EP>z9@KykzWIG%`<784tw~3QPiAOAY3xy=dAGAQut)G z{blTsu-|jeBA^f=I#jGB#7zR^0r)rMd6m)b{XOeV2a2n!S}KQ(;#gp9L7Cr##RnJ^ z%oh5A14@+%Et&Kk4l_kw{j@bZlBn3*vE6?yhU9iVt`YzjuRw>xL{XCv5<8@OE$S@n zP8$+Cxx}@_HLwVvRONitx7ZMGa(nT!3;;x!YNno8|G3)K6Elp>sz*2vp$wpVU<@(!KPt&Wr{c15#W!6R7nSzt(8dVh#9hhnxsUmzi3yA zcC>bxrynky_MMj$YB6yAN}w-OjuNEO158BtK~+wIH(f!lP&`WGS+Eu(s;FJ~1d6IP z*A`t_EQ47FpwxtwFz+uwhih__nk;`ol(HFTYZK=T^EgB!wRhPlLJP=l3JZ4_pCxcJ zG*n}|Vc3-cNF?>yqyFl(#b8@_H7@b0O}G}6AkZS|xLZHjypME0;}u@e{-J#8`MP+C zcVWDVV}DI6YMT_T;NSr1uY<%jm(4m(QO$CtOg|VE;H=CmRus^wbqFV4Ke2zORDPfZ zmK)q!9q=k%EP7Kd6rEMZfV1G2WR|Ew2pJZ0&GRdj7cAdomO_SK&zsDiE@Rl+)RnUP zx>9yeSIXW{oNmJBmPdYp&nu7Iz~|Flj{vfBZ#?puJ8Ad=Er0gN5m)FwfX^e3yu?o^ ze2A4G`8|F=^~ejT{N5uUP*;B(ntltVKX~K~e(reWBYeK`$Sc%>*n+lS!}lwXyc1dx zKf(7qkNg++h4e4@{4bAug3lf3<4^GU$s<2=$4P&K&!0W=N6dvu{RKY%=#jtTCoIT+ z!slN-@@E_$H1*%``DgSVzk`&ryS+#M-Nt`+cJbdW`kQ8M;Xf>qem{Su|L*jd1m>T? zu>(7Hfu|A~Vl)PVzs00LEQ2=i0Oe!)A`TZmVJ6CE7;~P$Kh%h^P9B!h%ckLU(?Mwk z4J*Y{PRQ?CWJe^YcdznA3g~eZ;6HGof!#jEzq->C^uJ(f< zNV+M|GYD@6beS%&{y|d3Ac5Ovx@{1R-YNYi)_%E_cmmlK@ic#BVGAr0JZgBCQn#xJ z&?gc@1JgQDiS^;-`+OAT4axkSL4l_nmcGk6vQP&O>M%ZsBiaRmcZ7Cm9U#GS1aDD? zo{3*1gCJaLbYNG0LHJ8gp5XY$Y++(%&DOaI(-KX=u(cf8*>}+Ie;Hl`8KHlb053o< z*H=74l1i+sJ5hgSEd0EXYUPXlm74GbhyxC6p=o93P(W5Fr={>PR_;MKymVDX`l+0{p0A}u7BZ{KhuTBvG@>r7CS9QVOZ4uN@?U7Q zN+yy8L?$VfUvPcJPrOBwZZXU!XJTqIFo0wN+gbp- zRX3#&nQd!Z+E>(axhdBlo$T|!E-dL)kUM{3>_XF%JQCaVHM|-ncH5wI#RRZ~&7;F+PRB5#JiXkqyxQ05syP9+Mp)=P ziN3tc%0po#dTJ}4X6slEDx7xT9G<>;e|UdymO+D5IIfonAE=8SHj?5P1~NK52`11P zum(9r77-PIOgIwxB$8v!879>2*y}7;b57ZjNL_!6KbZ*^wwS&`PDK^K))x`iG7yCi zF^y{ZVX+oDK4;-;x`2`a6d@*s{N?<-mR6Lv30z#E>MuSO1k#*SxAqc+)OF^=6h$ZVXiZ3opt~`?lHWY>!ybTFi042~l4rTWcCYAe9rEU6f}Bm`e3o_+r0dbRDJe)&l4Bvb;*RPs4HSAl8tLv1re*0gkL0h|>{NQc3;R zGC?;ihbA5P`OT|?_y2i#`tJSdtG~T_{`P;(%hSW7zx{Nuf@V`fsg)nW;051`LzY0@ z`EV^$OhF(CNyy|Cj(F$1=>E=ix@sBLH`Nm_UKqvLf6vY8;cVSpHX408t-3T(PfK3n)!_7P09gDE6 z!$sKqFo~N?Om!o+dGj>D?|ZEUS;T+tX>-jvbr257;0~1-3#p#$>g`HmAX`3Ftp zZm9;yvT%_%tY;Cu25u3}La{~+H~Ad^5z(H7Zu;TP6(h_$RF2VceprjvesHLpha^T9 z6j@IH`(ceA;DH!GstKSOPs%UtscREl(o=3*NICOze`Te*B&S^6oPE$o0Oo(@#TKoD z7HSOE!E;U7wsNDiajCmes=J}qIHl~@lmGeqXzlMl{PR1m16F!CIovCY7Zd>=Bm$rfHy8W}0#8ZQP@Sy;ug^bx8@!c>yGBsp!`MJMd-!tXmOlnP z>S&Px45Zma3I_q`)pN?O8utm8iyyK0QHXmfQiS58x;LwH!+M)mJI%~z6)43Dh9ex2j&RV+WjK2)33^shs$+ev6-&4J{ zt^`AByJHw0dKxRUF}8n!ach$`=l5ze_{UTVL5biI9_2>g&4b#}pQN%D+J*lKsXlrF zD~cWt`(M;cj-os$@AAT)pt;|o!n7dGL}gF12r5x86HO8yX%q>h;^HHQqDI*SCzfl1 z#k(S#WTr!r6CCuS`_q1rF8qNV^XaV%I}5?xuuv2rHw^a!&1@Yi zf&`_@sxHEgSCAp-Mp(T;#@m1tY2KiXOms%=2e(7VOcMZkwb zaD)m4uJHc?;A8UrJtsE;jW)TzHzfi_bCu3pMTvhj$R-V<#Plg*p{}@)N=5#GnNrPA z5&?mcAd0A@KwzfS+o6Cy&~QVQd6Z$cvKqplQ$1&V1Bhxmy29BhuKQKT1SK()5e{=K)2`nzY1i~qxx)>9#IULi6 zL|A`Ud`ArVOHNm`bCh-XD+wzaCU7LEze##wiE#KoMunI-g`5u4M*$kXycDhcqiG`l zz!xNZuKWki;vXHj&6nAz+X0X&>Ry)RxbUAmxq$X2XK+8Rp74iI_80K>lej1*QSoGB zr~j0)>sJ{}GEUDkJ`c3qL=l0;Q`4!S)>(fgI51rWHD0gUQDq{K_Pc0+5hduJi7NT4 zh86fAVQnV{D9znQ4O9{8tW_}xU0Y46Lt(23n6{~2IIdR-$EU_Rx2;~?`<77Woz(}i z7hh-rZI$O-L0i?ime8m;^PJeMEhZ z(6JQv%#mqW)U9P3lm!&vvVnYv7>RYjxQRnd@>HgoEt1K?@pPg34`(I6y&FYIR7RZ& zDbZm~hZs@_;Vcm1Uo=A8p*1LAl*Ky~c2MY6WLJ^!3tUjiGwYP9pHG|ip(4^7z=k3@ zWu&aYt`sOKoV=JFcS3R*7PMXTXCi;B4CJe3#WYAqBDOrERz-f+V|$9unq|r;->8l4 zlu12m$taDmdQ*Wi>jf*+I=-ez(Q0*8-}6^i%z7iYIr8d&-k{Gi#7k&X@yHPttp30!T`vJun9tj)bRu_WL zd~{EOpKa_=S{^;PCwU^8x)5w>tqao)lbW3&e|@UNNp3?)>;0M&d^Bz+Wte9#g>j7= z9_EdWrYw46*GytDW0N(&qsb%p-P*bdfWk18@D$3i2uHM+_+aLX;&dpiu&X0SWyZcb!^R$wTCB}L)pjxyTAHdzNNbCK2@BRn ze^6_)wMj}@wznvKOV^dMTAN1F(=f_4{h!$C*W^02(ZxzgD6uWZD{>WAs_`jVDPr~G zTB(6q?(FcJkG8{7}iuL>VhbX^KBT^ zz~<52Ej3^6=42G1m(eXs=#d#{veIIle?nd2K^cpBe93CgLIB1VKnPeoC5;LDjcq?J zPbeb~)D%_M=pZMcwp#t>MHxSkVRfMGYfM3g&WY;dM}St7+E}|$#tuWN$!>5IVh|A@ zgrcOOmfNp$EI)H02tH_*YYrEoP!SKePNO0b{(>vt0->agoPvpImSh(gTm_>je@asy zssqzap~Aj9yX#3BUWai)rA5^F_B>s7BKERLyC#-J3xK!rYn`KYrm-p5c+(+l;w<+~ zK9>;(zA_F<3@cACCY0gapG^gaBA!O;MWs_l7c{jnYHNbwRY7o|j-Mf2l)C71@olQ+ z`U-MrHab(3X@uHJ3C@5SjT_3Ne-+6x*C2Jd#LKF-Bg{|*%Uge%42+divK%-eJr3wPNnr_47 zfZS?8^h#6wlva(Qc2zgRC+*5%nVk8LGRCbjF(#d}n38j?Da-weg12FL*}V$Cz@*vF zICc9(JFW7uN)-YI5wToOe<3uCKi({l0HrJ*r~y066g$>nRYz z=$kf+AfN_7nRP``g;<>pkLz`8EvwYyToY0&Z~(1}x3p~Yt{TBz>xb~If?zf00UFIq zg;e$C_Fd`?QuQ{J_A)Ee=$H2m7~uZPBaJ2 zE)IK?pyo|&;wO@?X5>PB=PgtQj6TZMv%%4oOlRJSYFv4JcvhzgTFBl9Z*M>iP zP1M|pAs26>+XT(NoExYJ+ztdokEDjnGQ4!u(0GtNOVt=te|JnTucnxmq7M!d+ZFb5 zX7vEnR@|bqmm@M~*6y%L(o&Ji?V=!7CqyX=;qZf5hudr@P-oxyVJ%0)37io+T9d9= zx}C$%@pz05(s=w%4ud+>9X{oSsV)T8?EWAOY8=NF4&aa~!8W+!5en}XTkorI>}m^1 zQ|bu*xFij#e~|b0ZCa2gQx6>lp<1bBY#2u!#&+D7z&%6vJL=l|Zp*?(Uu9tl;EyRf zEihfos4D#u`*iVX)v`jJ$jD(rqBO{;z=)rgmEM&0HC0UnER9vI;6Oy*)Yxf?@p_e^ z%7N15%-M26&$&3T>}+7&N-;Mz6?6Icgf?|X)t~)ze>#;eL5(xS3er=wPlrKbw*UeI z{cM*69jROB(|kCmIgLV}=0k4I7d2?(YNDIU4-ee-s7*sxujY~Gc^=-PF*E*!(J>6b zrin@(r;yed>>8yuckqv2P60`%etMV{Ct@0^$c(PYjEyNxrD<(s=0??rg=U<(5CPY@ z#D9s#f5=jOYBmh&B!F|-hGf!sO4nRh0B^zu?bL~*Di0VJzm^NzNa&b6!i-#m#L!e? z=kiGW>6(v6rVa%YXrTbrN>eGT)a0d11)r$c9qn^1H$|RF_o3Qn(XQvqfl{qNm(?Uy zJ{MF)RECgEN>c#L!Py0N-`NAxQYZjnt)K2R#O)_4%iBFwDt|O(v(C9^Rp%4gY=!q5 zVolkcrC21)b+;>~HVrRe@?otgHnSB474O3_lRkYdcxv_A{9Ih+(_cBQmwETC;JhR6Wv zfO+5(EeMzgv8Ipz1QqCHdE$E2^#JKJsj9H~DlQaaN=*{3%(WLP-ad5@sRhNhf1X^? zoy{kc`||y(17VoVn(ZPDL?a-7tW`j4%l*zMg-_NT&mn3mr=Qfcn#e*~gxVXCse@6E z^E6TY1fdga<3_lcsZ*oo>u2yCMn0>?7v~FvDkW?QrGH{9k9?MdI9B7N4dxn zn{V{2nvQ6Ah`vEnMR2BkuB+={e_SOkoD#99@HDBaT83?_oBe~_EW7zMph z5~av9)f2H?>Typ6TozLsxy5ooJFxca+b726S9;BKu7Ya|S@&jG1%8;IEnaX?Qmf-o zu51(Ar;UT-WOWpM*o4wUNe|l)Q+EUvQ$B{}LsSqxDAjE*jQVXpk3wiPD%4sPAo@}%`T6_wpQysM7DtO{#$#WGt1Pt zFKM(l_rNqmKR&Qlb3i_@|Evv6En^I9R*8l zhUiEy77gavh}tk+bGa(#Fs&Cx15Q<)hGgV-dX|3vWO(kHt0PvaDc#bQbnZI`Sue^8 z&sOp~IHdAs^o**>fo%k=bP#J*3)0=U&hRj+4WbT3vj04M|E_-2YQ1Rq(yI~t>{(QMf9*>H^s+xl>+Mqq(%gQV(_5lp-4U7110;<@(CjBC3Znaayah6@ zLW!ai?uG^-@82{g=#s@((|m%7&>?i3NY4moovLc49=;-_&qFkf3Br5+54q{L$ziV^@kZ0kjnJ>qj$467U0g{^0F0Z9Tt7YE-zt5p5EcD5W<;IEREjXjoq~e|1HfEf;>ixeBFoe2SsCAcT9_ zhpTruj?+gaqzIh?%MsMQu-9V30QaD6NfL_WH1A7)o$V7gJ`ogMtnO;~i!vq?JQFX9-!4VR|tOv$lu zRZ}^jf1$rn#0WoC_np-7bU3 zaX&DB*W`Cbz?$Dp$z9*?lm6z85C4(=*0vA-ku86VZ1w%EKG}kw@O#_G)E$3ohhTu4 z?Vi8gBiry3e((9)dt|5Q@ASw{-{0wzoeh6ye}n97`a7HCKX!Kgon5lC=kM&1r+xov zpFG|1pYD*SyZ+N%@^sICx<_{X-FkRlvb*K)Zjs$>e|MYg?)bYqWcR7R`;_cLaVWp% z@9vSk4S#Qg>}~pcn;2suSvdXon}74zwL8Fl12Q zf8Xxo@HfA8G~#a4o?N9zIM&F$~3@-PpB*V`$BVa2A5aZUs#>Hn8j%VEm@PiI@|i{MIrY+%g>85(9nBaBvvmZ44-ge}{v^ z2yZgxyb%tr0YS;bT*V5LL8`*>IJspX5-C;OvLzG>K>IfUrRy)S8XBN76&`J6WU<$g z?=5MP0Sg8Y9%X50D6>#V5Hni+L2|@YC?|n^-68HzvTcvC!(C^k^BMCv_wF67Cy`3Vwbo6Rf0;D!F7cXYV z=_vZ*ulFnXebIgK{NEWjjAKrgFI(UT&syN(p7!ry)-&|ds zYQ4o*)Tu!o1E@7n55^Yjqk)~1izn1cr7i|Ksi5ka3OD5|Y?x`aq-$_1PomoBYAMXN zp^9z;91q}NYN7SRB!^l5f3Q}r{or^%RJO3(91dH!$Wh)&g}s64l!M6E3X7@t>+5SRZMk+OHbwE*l_i&10g{>UAnhXF0+TvL_D5}cQaltApPA-(n_;0d zkhq9V`XV5%YBo0Je>aY`aT(~j&j=d=l>wABXZBGXdK9QgsR($U> z2v_mGu@76?^FylUsGICE^9^N(u_Pz)uPw5n^XWi6Vwc2n24n4zUc=pIq_82gf4U@y zmjv;WApVBp5E@v11lg1%{<=i(S(pbowN0fIT3(48AP2!Ze~`J|YmAT$O}Hy7N&%6I zB@8v(oYOOJG3gZ~i888J@y0^u*>F-+`LFR)wPf9%`aw0hOo8#SsoxXqOL%}-KV z<4r!iteZ0KPSWN*sC& z#w?ew0V#DINNrTNForKy7rlsJ>JGPgv(}?(I>})T{W-e*fW(aT=7>yfPMgdl(9LB$ zyu82P>Q!I+u1y9`r5j~5et~Mtp674wuE-jzf2*5&D@tpv4ZP0sn=l_WxM)VaT3-+m zaN}#Oh#~EeHd=NWzs*=n*RJN9J&($>D0_--LWCiPNUQ8bWs=psCj~R>qKt4HX)Sb_ zB3K_XG(T-GfdBH)OrPp9a|) z?0XiZD2WJ*lF}kTv^!56Z>>-8sASYze`G2}6`se`vH6&=!^s)*$O1%ChPiBvT24x2 zeL|-l7l&efbzcwFB1N6pwhvhQrymc3C;x*xa11QR$-e*hCx3tPB-Y#31f0tH zix#>xjxFlcmR)R$IU)HIy_h*L;kIPES1q-1V{+)2(zyz6&rr9+X>61IG`&bEe_oJg zjKyVPIwkB+_fy|o43|aLoH?A!rm+yIpl%#p-tr(r2Jj;^_)?w`bb};6@L_?MU;~3( z))3nSe&My@xRxQJ%)BN}RN+Ai@Bpv>-cmBNl*}w8GxJGi2B}h(`xQsc;t*prmo=Y%p=Y<>i{KX@u zLNfIkzE3^!CAhKLU67-%DzeJB<;?18ZjWowm9D^CQIat~YU!#qQwGPXgQ4{zT>UJxL#IN?kRLn&SGl5roVd^0y z62G{_O~m=FEg{fT7%J%~%r7wb1EavEi;B`ThE_-&8SU3CZq9|E&DrkuyFFk-F)?tS zJb_!%{TIODQQA$T@(H9qe{t5bHHXE)T!&mpa;Ac^K)a7OBSP)YJ{yuQT*lXYJicRH zZ--Ex1n%UQmZEfxp(w82!93+znBOWMyCnvDSC6}{#ad_1zmcqAX1rG&oVw)menz+F?sbPGael0l^*hgvX!(PihZj!Aha!kaXpwhdq#So&+!z zF8o@9QRp?~%X*7v$)@-QN*O)RbM zE_^poPKmY8DsWmA_95u)XMX>QX(4a8qtx1DR6x5QKck8^46asHzt1=U9&|!o-){2xhS%q5EL8?WTYGC+5P< z5n94@_iMxse`u&M)f6c_au6ITyvfUe3c4zWp5&5y7l>Hc1gl@aKHOAIPYq+FYa)=sJ@Uv=m-)x5Nv^CJjUM3z$U`y4 z5gPrXs7(_SHMVD$TT#wi0c=$?8ARK!<0LxxQbuXP`j--reMSTVtr}skHuv8t_n*Aa z{-7_fe*q;W<+t0YKjxEop2V8u^zCAzu z6Nbr)XkQ#G)RB_YBk+H~^I^zB>JCL?UzsPfzcS&E>l|KY!_PP2b;P(U{Sz+DAEWYT zf7DPwiqrWW?-bJI_4@m(wI>$@A!7H6h97+LKV;wSu6bntcTYS(S4vbu7}1yR6>J(_ ztK!%}|ZP<-(- zT7Jxe;Z5XMpgV^(HFR=k@#ERsH$gu0G$$)?0SIW9V2gTgeVwxlp;3)>jhZtBtgY1{M6wZ<8%_v2wpaEyob~8t+;Pwx$wDjN zWVZ?OHmM)b^CC!mIAht}DJ|FGU=SBY;6$Ul=)Q2+r+4g@2Lb>;j2zO+S^>xHe?9+x#?^i*y+>VE=sbz;1E<|;{g>l2={|oWJ)Q+! zOYL2Ya0b7}KBT-4*aOGe$Ty-5=ee^{Y&g%h*aAO?MxbYhM$Z5hxLG1OWkW&dryMBC)`H{SAQpm7EfEj)0R|=-EaM07rsakl1Fz)e_&hXCx3u+ zCi>Tx&WyfEXMP90*-5BoPew#Jy}!B0Mz9D4JybuS_k|p#5?vb!z;&T!f$gKdu(jsO zrZ!K2wEBY452K_;pxIG8e-WtpwWh2UCSWJNXjS(r}H!kz+rV+tH;xcD| zyTQr7n82NP9XAGfRunu zI(`3Nvs)G!?V{vADD$z(z)f&FMD3wOyP%_Mr@q z7Wl2@rpw%Aa%~Xn>-TjJ#nnt6Qww=*azc>Nf6=L&RW4gsk@Dsr%IS0%qoHpjm%)wv zdpxFQUy#x9lhJVQqq;?*lk7Wtu|)IqtM8 ze^}`}r3sWRlW~MDHUkW}mZrqenhaWO;o8{%>eomu(d@btSFgcLY(qUOKR{CHK;`$O zA)l%#9^S-dgiJUJQWDQmU#kHS&Gg7t&%$1K{=;p+wYO$2S=I}N2TYKwt+FJDv#ypJ zOx#R`D$bg>T&mU6S^;>@(BW$DSX6bfe*(|LZ3O#zPHV0mm1_{Cw4JM2c57LX%`&;V zcBG+MWoA?Bt!2y`ieVU3^(sb9_WORWpxyPfh!-6OKUL7`RwsTYT_?mqC9qD|>6Wq= z_Yurm(DHhsx+OL9ohm{_4qX-?sJ5bbMcT_5x1+5nzaBj;CXcqYHKRa8MAh6@e^_J(P`gL5PlYTiKxH}=*|Nxg1ZD@Ob*}}`F-5=268UwOnUW*gh!82n89t*Da{eWe?2mrH@c;#Q=d3tRarf;m0iiPd(!q^sJvLwwqaU$ z9i>`lWk14tUB@Z1AMux@1BM&D>W-VIepfQVrEFc-ODmOd6EKoH10#uj=VwH-FakQV zmPH$WseyaQyTz>QO5_G^9RYT66HnhpgT~2e}-fSpU(Qw5rBB z__hVRRRzV@wY3Tmv&S3bS`>O;=Q7k~BS!QwRzpzEX=;fJk416H1bqDB5Mqo?v1m+E z#=fvi`WS>Oghh-8hR`bMdh@p=9ilBUJ%sEXDY#K|5s&BtJ%v2Q^Ia8AYdWRPj;|hN zAVl&Jsep*u__!s10ZV4_8w*;@6e`m+1XXih^ez`Kg?cGWT zbMSs}*DV)nRjwqqU`` z4$dFewCtLW>`tyVCtyLnALZ8eMzc-9m}?&u;w^h<_CZ%Uub@CA zEZ|ZC)Ki7Gf1@AYpS(R52uHhP?XRx5Zt1lV|JB}iJiml&wO592 zSg1@{ANbGq2(p~BsE<^O_S#Ww&}w~$_Q0=}`m`Xee@1=8peYRgobMEqVoctOoaiE> z6c)!EesAF5vN&BO(~a_LJVu>a=S!ZPUuC`d4kwo2=`Ko274%CzQT-w^m>?1b;o_8l zyfOz##K6w3P(6y*i$93QqT`YX+2gznJ7@g04-=s72XU9MbIuQ3Scd?vXDwzN&3R|G zQg)swe`Sq{0Z&e?Eh%#CeOx5}Aa@Yf9`PyRYdj~{nViMN`D#aZ{;8fbL-jMT;Cw8s zL*Mrc&VVP?q9;KziFz%AGh3Y@Og83n+`ux$cXr3)4LhRSCf3SmH7XF+;j{- zqD8@00@vagf!mSItORxRIq*II`S|_m>yvlHe|KK1fRi@>9^UA{Q_~_d{9?&AJpVDd zt%fe^>wgi{r!;eUqhUTJGXANfCvRS=JLG?>v;SDyS%h4ZbkS|71+E*Q~H1jksle}OqK0V11)ijt2 ze>Bnbtqev4->`8jcuvXvB&Z7>1w?eY*XZUs;}b46{yvHGd*jC z5u-In6_XD0A3B;IyEgE?G0c6H?W4Fuq>NO=^faWXnrKy!=t{OKZc}TlOL^VtmVmw) z_MW{``uxzCToHqKqvC~I{MnT?@+-9v@wX~1Sgf0LYXWGj>&S=qIht+8Df7KkL zMQatFf4#&oKnT9DUlflk;r5UEQcj1=@cV(t2wfGEXBvuxEm6@y<{@nN5 z--4Ka3u5}OZu=22ZGSC@DVhSvD5gxw{t{lvGGM-vy$^WLzR-8PbS`fY)D#qe=z^q=p_;u)cn+GuTkWKO?LOD?%lDE~1wno~j{R zs}VUzOCaN0Jx=v7?u{|#;KzBxSn-vg`v@&7lte`=Z|>h{z% zk=w3S?E4h2;Gv+u@2;ct#ffD?C%@KV*3?qv3;}_%Z0Vr!M5QA@t|e6K|I(uti|?s3}Z1g zEz^v}(6mf57DGRaCs@Z*e`YPVYZ{B8EtzI4hL&c_jK$`LoLE&-Y705BTDS@wH}0s= zt7sU57X>LjlQ)K>yhqElxjr6=ZBmI%0)XNadC>9j92LcwafxITS5*g$+~jSrsxY{) zM0>`zpwa=$bOA%I^WgED_6i?0hWa@L?~<>Yjf=^FMO(6)D4j$jf02HYy1GeBl@+TB z;Fk~dg_V&uAY72PhRXNKG(@pt=>uH%^X+a(Rx$rG_5o)#XRZ(PW_&{q`!!iBBqH3G zDMH_~aOJ0Za(n~H(U=X?UF<2cI%zh~{Wb9b|L~G03-cdl!eCU09B-vZ#RtmOrl8*< zTSb$h(y7bKTCb|Df3$@&{%lMW0-IWVbakce)kb3W#^`CSCySaCf|J*%#sgQAaL8AR z1ozAy>R1o%!I@(+0!7D`e9p8QO@%Zmx8dEXmH||$9jbEnk-$mbYgOGBR%fg>D`K9{ ztDe@DdrD(_6>#rUo3FKMPby=wR&-L$<+;Xuh~<)bFN z7fO8-3u8F|mVR3b)(`YN1yru$uFF-qnme6+HkqUQGnPFbGHp?Rd#~m>)ZWQe_M>G0 z6&=!UDh5HWK) zD-T=}yJ2kFhfk-yKAB|-y?$xDpNCm5?RVJ3Fd#ig%?faNKQmREa^#~g(aEf6l2+W1 zS=`a0!UnPGG3z;z6uL#7bdf8sA0~+Emi#^iyoor424I4@OaR z)xmEa-L-3Q!&LMnWMPn|--+ud(`Jb%T?e}HhGR}K9MrNG>&Lf~E}L5<&KJ%tQ`n!Q z>%WpAfAlK0)+pDn>W)`wjk$AK-&V{vNjKze{x!b%`Rr^uMbcBa9VVqnC25~dl}5Ss z^ID|`arkn9;v;j*=fEasfy9;Bt8-hH%})jT_H(Ywa$E#kTj;<(kM6D#bS`wWb@f|R z7V+&C%ZXm@H*Z_b_I9(q1q)G9`c0BzEk2^Ve>MNc>MTOmPX*JA+5R`Aq+vTZMyc7XgY^0${~+lSW12Z&NENS{%iP-4 ze+-Q{c{*>SmI6nl;$hRT<*DfP+cgpOCJl~BErkGRK$pKY`CF|?Jx>LRwn7EHMV+@( zOhf zDn8)6cUho;oMN;j%;UdL5pcu=X=UbI# zG%Xmkc_~m}X;n2;6&V7w>9nlAqZ8v9A%sdzL*MRfvom+mc$(y6_yGHAP4ohtBUp~Z z;C~wBN*fLnLS4j-sDX*PMG>nFm6I~I7q~>%HZGA{_^+mNUF|t|ZP*MM*EEkyV^76; zT*J_VTr@dn*D)Ufwm~Nt_As31G9$Nuym*5RG$jv=lOSeK4e^wqQRZehdC}b9S+M37@mTxTl0;4d3dB4& z)kiODHcQ2-&q96IH@wN{KoGU%QTK?Ld4k9~_a0G2F(Gg6(7E~br16(`MSmFW8+$g) z48>Qzqbl3VLS8Oey4fl{vbv%8x@nrNoOPbWMBg$i?C0OP$F{cW!r0~DOH?Fw_P@{` zws+LE?@l_nvzb3wqWVYJE~+~(%SbwcnEOZuQlfINOhi#tSks^0-4BG;^iHt9B>LA8ZE)+kgJSesBOOPlJP}Hf?Ga0Kn9v-ub4C_)Qt{n~wLF>v)e) zNp2UlyK{GhntaR+`#4NRKx0&n8^Tu#Xl$CUD0IKo$&?qe3~*?4c7ezPoB-wmgPwRC z9@KxD`L|0{?flfYXi2W7ZikN2q{g{&V#aa)QJ5rU$+~zOP9Fv?h8%~a* z@mS38`ueq0W~}+sqIvtAcZsNn#*pXq~Z`PbxL+t17)E05`d z`|s66W}?4!W}xOv(CY55QYvD$~Lmil!?@vt4cf3Wf;T9#$_do8U(>21mX@6DCJSq1dQ0fzmn#xhb ze?vl#*$tpL9HXgC>^A}40|OrLLD5Tghw{Uk-D4Qi9}aqDoj$7 ziS+5pNW;mT`+u;?2CswXo#0@{KiCTn_JkEFQaK2u_x@iE>and&Hi#D6WnP|hauX9Y3-v$`-hMki^; zya+DstS(2a6}QM_&90Ginj?BOLAUg%!3hZzjOMG-CfYt_*q8I&KGnw?%OAn%ZFmWEiF|25><)}us1-k zXX2y#-+w^eH+=LPKKhmT=o5o|gBO{`zS$-AP0H9e%;fSGUa!#*v*llfZT~Rb_AkO6 z|K<-feXO9UsRhl%08;|0Mq!F4a-#8C#*euaN6V1X5%EMuCQ>@$Vc!O%k#wtTBxU?E zA}iYg{Q#zj+NA^h%bv-j=0IB8LL#%n9k5?NGJjy9uJ&cWb|cfX(44C`$K5rz0ru3pZPboys8_;1y&-04^ zm3T!o_sKW5>o+v_8=Cti9#f=Zaej3Xxz5Ho$_unob<1A6zkz@J_P)2__{OJg{IqTT zw1b~^)TemE@f_9YL>y4&va%@eM={X7VaEOa$v_S>>s2;j4pGK%lX3j}iHU!s=YNq~ z_)7S<^Pk(>+YTV%&VLRD0|zkihnppljqfy*=3*Q{S;k=m)l3~<1f|brtd$1u3eXo`0WskB+p1?+X7vGsVVYSfl z2+UVBI<L3~yj~T4rP<{P=2Gq|S%7<9<63>tvb_MC@|;~=jba|T$U})E=B=7m=_Qyhv0j2j&y!iS+Y}&8Mr!Bh=$nKdmVbt9P?1}% zlOYBGXI-iXE*fgaos_@QGtKzR(1)u!SmSO^dVPOhv^`ef++t+HBknOm@20PQ8ssX%%7q(Hc8$?|a zfjFHeUG{|6GT@DC7;d=;M}J(@u;tOl|?`r7Ip|(2KCDpUX|!ADcrqB%tgb zoG4GC%@IaK4;;u3hzvgaEIld_lE4?Zyke&+ohRj2%k)?jp>?948-Gu(uUitac2wF! z6x-Fm`@O!1Oz!FxE{~}6U@5d-P$^J zr*Vn#4GJU)enwmdPk%l}Q1nI2L{*y}K9R>h)ITGE*Ll=7$kZ;-#2?DuL9RPgnbJ6FG2>KffKmolJb6iePR?r$JirugFO;; z0$Tf@mzS50SNB#Aq`K?zng|!s3rn&v9lwv)sB!6OGTdkI3tC4yPJA0Vj ziQbBLo}&v*&S^(0=T}O3UQo;(s#Xr0kB3+BDQ2ZJ1^7>K9l>`zQQF6@WfpPjPbqWg zY>z)T@ZS#nb2jb)M{S6t-Fng7VVy1g zWfPw_wGOo8TYun8(gaSeF4P-rK`py_l`Fo|4!X?JlKX;MUvDE_rYDII+y*Eh z(&80hdZjCN3Kls{{sHJ>H6@JxWYoCfj6VY!&vWtkndG=#rIy*anskwsaOKfnab~Q- zSJ6!}f`cV{COa>_xDKJpn}{p3Syf+ctB7BJ#``seE`Mo7gE@IwP2pirf9+!=SW;IT z8%$k;pKsMp=U|*)c#eNjQ7pgU-f5YlxKs##x`fqYBid36m#pXD9f&UMk$F$QjIR%m z38p9Mizpqwe0v;Xo!}ZGj^WzwYlR>Qc7%_ta_Oiagj)55i)ClesppNlp zef==cqkntD7uT30QHyVVlW~8 z;;-m*>hcoLTBf`$GM3)Caupy|!Qz_FJj@!vRFdw1?zF7Rx)C~g|3rD-V#A92ieUvu zKDnIl;Bir1zTJ!8?#2JZ_o6B1QywzD|9_Y^;J;_XPs z5ILF+#v+byF_dxJX}~FWzTb#9zIWK}3W>eU1H%!U*?BHpxiw13tf zgR;D{YC4u=+$2_?ksnH2Ch=$pS@dF;S1fO%T8CK{N{`|zARnJ2vG8n*zf`jz<*e7v zNNMzjp~6vb!duMPYOLwa?>9=A<>$m!gQ~GiwPxnngVtneJ!VlT%w$px+V`RJpRZoM zavH3{c=-IU*GU;a+hTc^mPKyl^M4m3n5LDByuu>y2R6VkFSY+Xz;^j2D0Flm%^S?KEw&W36(2{bvAJvRb@0Pi<{Wo{XcvFIdW2*;aGUd43w-B!8PrO3s_> zEu3rI`%3oagW9chyo#=jQoK@wjSPp+58c1AADxO{KT={H1*UefI@{jZ4xG`CY*otI_~y zObg|)AkD03$&6W*;eWM#@{{(RwB0u;$Epib*XjqPMWlT}eKo~=r_#eO>s+m4kEw>4 z1Ry^ae^)KV1HC*yrQelHDNUy5r}*4Bg6FT<;ENFg+)$4}2RKW)%B{Valx1dMkX#P4 z$-W?npm!JwOIcbT;Fl^)z^qoV!i`=uP&Gz9Ta|+^a(yqoU4I*{8pCKz$eYrl*x=xhg@?V108XiDHP znY}P8Bbs3p4=?VWAmeGwRO*5yrWSoAW@=Qo@0z&F;2K8itmLxo1JtyxW~)OBR9~y) znsbU#|GJXX0)5bEvYyLUTcPKh1BB4kN2Rv8=YJXff!xh8xUfx^IL2BHs9^b^SzQDp zUs)&wO#hwR`vj@4S@i^kZ&(8bkzcbs3KCyhrv#->Lxt^9u@(yQnN(XOpP2*CbN%wP2w%6SFN*{I$mFI^N-&8`Vhud#tnQE2WL==;#J*;fawjEZb1waDaHbmwtO>E zTz_LRll2moTdWj@YJ-(_r(YU&Y1LA;d$O#Xpw&xRTdG@?=_Th~sHJHKHdt|A%W|SE z5gbmp4`P9OLo@<vs{zm}K)(*6xJIa?zR&{#qk!C&uLn)^T;o8F zG62!1P!EZ?PdQvLK2!9w)RStZ za<9A90qa=3K3ZW=yY#9wY;!d;QkogA=myD}(k0$X1=?^3t?TamnJSjel>g_`lXp$j z9Zj#2%X_HS3+7kH^k|pNJ)hIqHm7K{`{gFf=y-=>$vS1#bPMJS)kv$zGpgDeet(KP zm#Z3uoysXXuULhh!(9%fZvg)&;K-A9@T6@76A_kT2ixD2b-yX=epA-{IwO|-gM~&c zJDhX1hn%ZiaITOSbq}wcb9G>HuAa7#afKYL17uz0?hSITn1A(ic)j!d-?)LyXK3m- z&p)f!-myyySMA$cDH%5y|fL$yv%^5*xTy ztl8p`gBQeFp=>1rc!{yxr8{EGcR7ML9oEJ+XN$ryBX_wN&!{wE#!!==YF0nSK+zBq zec`OH+fti|{EPvQ8Aam)U7)X!i9zKCi!ICt*`QGt6!s3NJ7$lWE;3!bwtpf3p8wds zAEyg@4WC_dpF^{ZchIqQ>pV>I1Ry3XFJL|w&7?TWv!XbGbx2YVgYl9ZK&U$}LLem} z(*jepB18L@!0SfdX&Yc?L^{s8=mezFGlprN*jY!Jg9R(dnT zF!cfJw#ST~j{e}#3YV_rhx=cf6E2q*A!$kdn^p&2M{DR0nV;Tajgzl3`&S}Rpt8oB2-eMi}1u76xQJPS+Y>T-7u&%+Y# z0YWNrFVM1)XD6Ns^Hb4-%8pm$q38X|bZ8XvTFc*NMR5Iu}XKuC$fvk1#F z?n5G6yy=C7XN9Ll79j4Q3dzYc;jrrtM0sFMIDknIo9RKNd58Yg%!Z)5R9^C$fV|?6&fST>9LI&%*Vp1{!p z@81&O1{&<0nGAs=Vh9`r@DF`??;rS<$UC)IqfcAG(|?v?6)cM~TBVM%=Fc*6J>Ki# zLxhe-SRCcR(O%FUCSyYdQU}TLZ=xg(9Q^C}MREnt_}9@q9P0SNAiF`FCCcxi4*84| zQHl4os2jQuxWM!XXLN^tNDSfx+A}%|NsAE$B1b=b@?~N74CE(#m@_=f1TE^VKwkod z$oK-!34avEW3-P~TKFJt=|IDn7}666*LYM=*_8sFbti^xc6e-yS+i;ZSexF&t6{C_nh+Cwr7QUJQJhi^X>=LG!DosD4=cH0jhUcZDJ zgc#Z>=NCK3w!Vl*kU+mYg)_2KjgjpDC3b1d@4RScb0Y^0Fkp~{+oOQ3<>5n5$8NIQJ%7wKUkO z0KAZ`iVW2RqkGen(DEl~%^w=4-SDib0*!D4eiVvmBb)8c=s9$Mw7H4MI}&fQm)^rQ zYJHOrOosD9j&fb6~2R4IMeMLz-2wbE1c=@X%?+`vrCKC zKUR^a!jyGe{-sqTXH*g0X(~CWW;2yvl*LQBscj(&W9^7fcLAHV#8KfQYW{`l3&FYM*r z;o0k-kIxU^y?lT2`Xx&{d4Ka#OW;pt6I%Y0(@N_nr~Kiklb7P@M~sWjpATOO`wq@k zC4@SGQ<$Ui7Sqm+;FTgV>*`|7G`dZ$q7tJk+0&b_6!{@K)FOI+5^f!i$D{bK@x^~9 z<;N|z_i@IPlSaW-~6k0dDoF;t(olAod>6n`w^qQrui#@OKN zb(Y5J`}+FY7(k4g3CNM@<*!3m&e!F1I-X94zB!#W4a!mThO8&HPEH%{$Ki%|zLhBT z6xd@Z4=RNmXolg&^u^jbOoutlyy^r(z4{8zZY7Si zNCKT(U)Sav6VRX#gMXz~K5T1f#`=2Jt(4kunhwQS^@6w?%Msu6Y1KFJ_4@kOU3~Fd zQtIn-`)s?pYoHv$l}xcx|B@AZ>O#`YBwyhh7}P zwS5y;3*&*^dVBi%_+#}!XOgfxadeti9m))liEMFOL5BtRitMWeX!-0m6Vtc&Q)~;9fX@htjK*MmUvrzxs{QD%%?@tL|L(evz2&p@P=WZ70d8M-+ zQv1cfWPdFvJ2=)lND8r1Fz)=PgH4xs+(@R}1~_PR0}xjZR8T-{Eb^ti0>2RPXAT46 zFIDGwn8DRpE4ytiyRDbqrn0Fy-zESptJuBGkTmudg%5*e=x8%d{s|m!4HXdp{X&lh zxcv|n!%aueUH3!H?h}CJ&ju;<+DF)c7CS&Y9DkN@BrhgFfKpIkP^Vh|Jr*V!Nd|@0I-$L!^T(kOOEo5OghN2ij_(hB! z+A)Ln70{VxG#$68SnaKbNJ>v9f4d$qLIRUlUIyHs}NaK-~BvHm9Qp9VNJfdDZ)9Y zy&MVRn;2+mdM4Ifr@l62FM+#M#gue>XCv8wzf6@3_Hz+(ek0(eXcrL{O2tV|!*6g$ z8rRH4HoS)w8cfiwkMSi-8Fz;8-haA1;96Td*q^J_E-T#93ZK;+`Qe=7ZhC>_1z>nb zqXYo;d#DfRp1F8_$D)zrk+SB*qbn(ahf#c41}z^}JZQ~2>_#*?EL;xq3%7b3<23mg zl6yc6yn*UqV;XNrguF97&s@d7oLpYQ4#m9105;hO^TJxA4aa47vrqmTJ*R9-iUOhbAF$FHSKbgb;yFlj}61Q!MdU82q( zH2BwKSY8wL!`^?S_`|qyv1Mce(V(EqG3zIFie^FHeM}M*4~fFWqvT>9GZ9cRR*Gt} zfBO}w)BBLdaua<9q=Y>Jh<|MRZm~JqNW86ti0IGra!ocPZ!5<P z)EEH|Qz%5o6OfIg5ITAx`9-Rh6O90>!}yY+&$#<}{Mw|TUnm7s7ot!Ug|>dtEUpYG zmg)3})v}E6>RK>aM7{9L!smb;^Vz~%PY2#FjC=RQda3C5vW}6(h<`F_)Ay56*9#XH z#jlGdVB>uE9h}VXboS@l&@xG<_cs^W2)0T=57iG%pdfSPc6M!}{g_-0&k zt8fhG0XHE&!cWub`~R*3LndWX9FM{Y>`x+v!!e52rOQ1Ou4|+XGN~E$ay)v4P$j$; z1z$#G6yCxc43NLw!yAJ{JmE@wJ|aKBhd#xO7Oxjtc9wF3&3|WCS0kD72~rAdPU2`q zcqh7`rJW;pY?KXtLomU(46y6N-ynICT0VS6uMB_-9glv>iiDERShYU^nhYmSCLiMz z6axB$NAQX>d=ImA3eRbl-$bM2AF-IS6C5OiA3WuSoJ5iG6G4ObTp02)%-#2%|B4Gk z-ofiD&ws;JM1TJhrtTZh{|EPL@&Ug7!}EV6k0tw_|1-S*2*e)VxIcu>Eg73_xX4R_ zB>+H&`tW4>+d*J7a23>>Nkr&q-CdC*@>Nxk;+DOL? z;}Y&O%7{~?y}G3TZx-?vb5vy41nK`QY}tD5%M`6YdK#HEdOps^Vh)a&ouL6i41P$# zwio&|$*e?S$(?P^s+?OxzAq^VnVRWDiM~OT0{an%(OUJ$?7lSKut z!#Yon;}GS9v=p{Ib%*BQ!vkNcyYpIS+%g8%Zw)nMkc0hruS2)`G2ZosE^8J-I9YxHLWj(61w#tcT8e#>h4F0OmyCDq_03H@Okma* z_R*G0bk_EbdYu%uPqJ(Exk1-P%ZkClWbB2K6R5vvjBS}F_!^%U(bk3e8EI?OWI~cp z)qk|%ChO~oMm0~TKrR+WLd)A^xpX?5av6j3~C(pfE z*}S_>2G>~gb(9|giZPv*O@IXWsHTj0e>Y}KB)Q@-Y_E&QZY$VTFYRDky=(_9^lPM( zG%_MGKm(KJQ=*>29r-L5m)lhCyHwr@0DlnF3vr@T{iZWMBd@xLDgn)_30ix&>><3> z8QVs7X5^S*s=9KhPI23?v#&mCx|~9Wr81*MA2M0FAXRUwiKqfI|MQe@k(>*bTByB( z?3F~yd7lCGv=%Qu27rd4JQ%s-Nw4S&)B}6QS>zM%;i~T93OOw>lWmH3V8trRnt$GH zx1I!3kk(NLpdfVAL3hM+MS|%!$G;5nKICG(m?ccNxE%?L4{CBUFli7Kz0j!J?tP65F1L+Tp|cdL)cj zN1K~yzRLSCGd$9e>bo}V+#PtjSbt++^5D&h?3y!(l0IaqDJCYui|h^-S7=`l_rA(u zVZ2V}(=Qf|{7O{Ir2TKKFkTSqP2Zz_&bPR2XQRgG1zl_fG10vND@w{$Ia^Aa7jBIX z6;*Fu0si$d#~gd`I^s#3O;nxGj(y9wusiByswn^q^;+6OfzZ-DLj=77$bTH0AX6i1 zya#r4a*vUVBW@Zlg}ShpQ?}VM{bxGWK%>u=CABf1E|br6g2RaXJcc9uxx6I8pKDu& z1Nsz)W9lE-B(@BjM5I4&;gxI>8U1+$lBTg(4`VT8_!+hs-E6}- zM=yf-8n7QfN9QawW*p%%FFqz+%*fa;)Eq!sqkPtaTfgM83F1>hu0CuxbX$Xb}Gl$Fnln-uS&cf{aDbicjT^2paj8h>V?v*}(CbmU2Kg;PT#eS z9~A}=*8|vVgo06~bk(H?R7Q-*=O&rb#htblvVLdc()yCwmRvtXBS+1O$K>CqJw8#; zEca*28b*DnKdvdPowZ~D$q`ySFcUO!7eCI5{EIlaUn~-hm`K#=u~J-pt?w|lQpWe5 zR|iEb<2=Ps#DDs`*t0GJ76B;=#X7T5C4ygn5$~CIxmlZdVhR$cy|0UXuJ~D%;`M08g1Mq<#jeG8&S$f zB47yg1#n`-$)O)9B7a=x3qy{ieM6a3(_vSgL{23^MOLu;z^0 z^|rx*EhLhx6GeeB`VarADrSM`lISDvS;G8Z6MsN-m}!dNBHKM^)A$Gpj^9S#>@_P| zJ{>ikl|m_uut}27F?{m?@b`L9LBDUKqAQjj(g9laLlH(2rXiKgKw76>L4*_{(!+TA z9%HqlYmHt<`C;j{yb3z1blz7Ylb$}#NaTxQtP##2BpLfFIPu4y0Un{3rZO3t$+Nw!N`Ub7Ae3uaGl1O>pBDxUxW@cmejO7 zb*-q}uy=Zx!7{Wuk#a2^0diXO;$GD6hZ*}7&grkqavb2~6mlwH`~}Ta$bOo64BdmR zycIlYeYfR1NKa6~V)c@{yE~$2YMQUH;pjSZxSs$?scysyy|q>f)5yP3U%J7^t$&YO zTiz-cJ*{9TUbKRr*%HDXtt}yKDk+qn`Ihrj>1AEHPV{fB4gphSu$Gcph4Q_TbZ>raee#{>l4pD}ikmGdn}Z(w7|d zj2YAdV0x3?3BbgA?~o5<6B^VHs()cmIO5W9Xm3P;WdV*_@e_%E)Q@_1~mFr^SmmD;wUL@0vAmRA(U?k7@mfU6dD zN0o{1UuyW&_bg|Fp9e%8q7j^;;l1vZquJo$xdD|LjmV?LMchD=DuIvR1An%JLe@&V zO{xaPhP6+fH2lD%4amVD`9vC$3}r2yPS;Y>!zF_es}~MLNn>`%5$AmU5?zK+U$Fn! zyIbft^x7p8)=y~1C+*vKIJ@ao57)vIi=O!W8r?x)vwAL!N`pef^xvCsL=|qj<|kpo z4ESU2M=@azx?*>4Uz1tH?tha5O=c0hB(g}D$RZ{uix==pB8!+p+{=((khhH?zY-Sm z3tqP|yl zMOK<7fiZx1Lu=o^t&shg#SvP;O`5IEPetQFDGJ}AaYfMBX|=|mJ1Y5_Y%GFCdrwcF zeN0tl7}Iq$0bsAyHjaj94YP^%9*w>I=JwuyX=U*T>A7JOZGWIn0St_h!U3|@ZTkhn zSmDLM*=x49oBNJ0!=HvGsFOFJh>mIiXp3~t1}SI02n<@So+Yw6Wn|CL(67+HK*m}e z&??8J)C;3xFfqq%_Zi&{#0^jZyF~SHJ&@ufR_3N>)N*R=c-igm|t z5!p{_pA5jL5q}SZK`o4H%8&{@k54KKY?83L&>SOA_02Xbne!|)fqM@91{&aYyA(}&0AHM78d1I;eTJu&Q!SowUi=!SxbU)m#AFM zf+@W-Ym}t!5AqRGP2~Cq^BumEMgUjRyf7;SI^q-jp{JN0V|>26#OKRPU;1c*cm4!v zpRe=q?`B0Z$VvFZ{Gfuvgm29+$^};V-uyzg3Lof)-lQ7-2kk{pFy$4GkP6r|vm*GQ zSs}2!A%D`9IRfo(q6qmX!!!ZMPlgHNt6`?#7Y3b;-z!E7>~tA9u4*}iUBL(Ognczk z2|k$bI46c-!3Xo*rVztayl#eFaqWI89KYB1>!7xndBHMaOxle`*fFCWLxqJY|D$~?1?1OwUTDS&iVNdZ%$quzBzw+a`fTt@w>D0 zqkqGrACLdvuG8-%)2X{GQ<$SB8=*)wtohk);65hHcIlIT7=6wW4V^%JzTA?4@Pm6 z3!L%_=(|eN5Xra}kbPI-A?H-+>daJURwo?P85e>Wjb*_Zz~hw1vm{ueJleX0KDKv=IiTM-K(&&Rsr-AV?W+N z*~&bi*NBXG-RRrbY|CGRy;h%j|9_ey0$ln-|JuLx@BJ(Pke2=i)x19;$HVSEwY0Kp z3KkGCj7eE;BSs7PEL3FR9aadnwizQRXP%58bq(cl5z<7^vU3xC{%e$w12q^=@XHj`sGh$26n%P|V>Re}5j6lS|#v ztshCNbnWP&WCuzI@DES>Q z{50Hb!}d&EDea7XQZ;1KJ7{WSBYl>4yrP$q9AP8vcZ$1&DHBPPv` z{RdTo9~9UlzREZAtxX{(jvYPFsQ z@Q=z{(75V^Nrf%^o`0x)0*&*HveWXa8v;58|9toaL_>?3vYtJ48Hw!cE!=?$_yMI%)!t(9Fvpqi6@B!Hk$c`HU3h2& z#co@CVyY+ws)10S6e=IVniPGMc6T#3@}Xwp-f#s6e-KK5Jb&s8C}cLE?J5mY)~=^h z=F0$vvBvVimoEN|f(W%{$-5Oa6OPFJa;eREi_dv$k4fO$+ij+{+iq{85T2jg38fsc zfEw-X1Llsqz5TSlQm{g;7Oc-6{O)rzie2?0Q_g>KJ2P4V> zS1V>f$wha7Uq&qJ!z?&N{LjB+x`nr}Z`c!{$%kF)Xn*QnL7&)w185w&(Y=C&y$|l; z`QGEOK`vw>5uZ_xQqY%Y}VXTTiim+pwqZW1DD9iyGPke-mn}6XpdhWByU?<&)s2{RL-F5({4S+JB zS`y<#XVp-;c(x<+k#?Qmw~I8;ASE-4{d_PrQP1I&lG^^ zHh}3ijI_;0YQf1&^F`GD%ARj45;aOSFi8iT4>&2Y+x6Tt3SIum))TprW)^+Xj638HBMQhLFC!uaj!+ zr8f`k_M$mSN%t%s9$iOyfx8{O4ygHt`N|}H4YSSRRf#ugj5C-bn?|ZrD}VAWl?+bi ztxy)MbLeP(XzF&h>p)zPEMkOkAa>B~0_R{gppIi&U(e}pBo>ye=HeLj?bb%MMB6Dn zz)sfI4zFZ$?GO)Ya^G_IuZv?D-f8aHCMu1FWVs+K!Uevsv@S`jF5nXh&}9|_C9_aFRU6!@m$11~&`MI>Gjhnn zU<5`zXKlo&?fZ)QwS<3CM-B)#=#JUFHWB?qD~M9So$fe@JQ?Ib>%ZJiI|5uBAh>|* zPK>F!(LGYyejodA36APxn}lNQn*NVm;z2m7?#gi}!Xo_5+2EZXcz;UOyZ7V z@iv_AocbjPh+2C`V^_ez*k)&Z3GyNRr}NvTquo8Ox_mIWoJL5*p5+$WUV=mLrbvq| zqC4eMto$0Dor2QXoqw}7RuDxC8|HCW$y%D#+XjFnH?G9;Gm#dldNV?=C2yjl?Bb^M zjR7bdtSsamN>Q!?NCJ5_c^dq-S-2mI;-hz?t| zW_Y^VEeQAZVD15K!KP{L`1Q@huSV^nSQS&Msc19oVIC}MAAcCIh;{SvkVu1&E2365 zpuDzr+Iu0o+1ENb_p;!e1iCP4cgRR3y&CLdtapgW~8eIKCAQ(iB`{9CH-g=-HhX*__ zA5=r9Xh(6{yXl9gy-)b(4*#6vpWpD$XZ&-9e~$6bQ6J@Cr^v!S?M3+K0{@Kg&jkMr z@Xr|kT;iW0{<+3KxA^BC|6Jjp!+yxY)=B+jya-R`pMQ)x4zVhxapl2zw5Qc+o+c)Y8I6)x)4Z4-S}8_Z20Kf(SR_XK zkBuO01tX|B}A*ICu~s*0uTJ#Jmo&ZkdOG zzplQaPw}@s^!#p?d5ym;ab3=qi3Wj~LXqja^mCH){<&f5>X0kE&yuznpgfnOOA>j2< z|JK;nxaQK-uyWq%y`rsd+xByG&qcpw)rLBGg=|#Y1?xUyp7gWovAjb}+-&cA9z#_i zNTAW&R1ijp`g{V>SBhg;^z%Lpk)7G@TU+PhHx46`hJw1wCQ3M01VB8Fnxhx*5XLr) zxcx`er3Jm;_k23l{9tNfo*P~RW}^=n+jQdgKgZ5vRQAy%RhN_Fy#^@{c}a%*2j`j9 z{@i_nA1Sd{9aV4^A@<1*o*}%~SeGI$m<(tdZLjwh zJm2nw*zU^Gf@w-x8UV=|;zv=IiFt*RW*6VG@^rFNTSBv;Kg78pq+@tLGAtHpEbm4Y zOmhuacP783-3B4s**^EOfr-fYjtX}Xe(jebfAbtB60jGHBH7`}sa4prC}Jw>2I^V6 z6T$tYyG?x5DP#GWpMNt}gUVCiv(QH`N%7-XSzk?D9THINZvhF~hh8oVz39f8#Jnt4 zoZ(ZE{oa0SpaBGM-8BUx^L=oeeNbI`TjTzJS;XE?$5vS>!%O$R+B>+JDp!R>=C{?2 zxo50~w^{$XFsHJ_!eBBK%}h(quE?5Je-}iZGzx87bWt=iG08au@T=I9hMeu3r`Ec< zRoqgl)AHr&gaO#8(j?wi`Vw^-_{~1Hh=&Fir9FK2=C(Bf0gV(U0-7M-!^)f{HZ2VS zWn7+;{KR(fkj1L%CZ*`l?%bfpy^NQ*%)PF;tj9Pj?CGny(v)kl<&1qP&WV!SVrAKY z(USN~u7Kj4}L zT~?e#l3R4=Cdu3ATwvkrLh!6xKTb}1FYY6l9$b0;#*dl%oUc+;?HX>U>pG(cf#6(m zTJ9%e!o>FEwV6rE{jkErM)T;f6q3-8{+o)oIyhdSM|w-~utbcY`j&Bo!Z3akQv$~A zt-g3}GzpZ^9?SWonqbr(y&s~uljy3e?I?%z59e)36@xDmsqRwfW9#IaM%gbOM`R-^ za~WQ+;)6X!!8!3-C`YbJJ{C^=9!oaammKp#JbbRC+*v0kEQT4&?c@7;4{ycV zoLVp4G$xs~>cj=@HG6hyKL@DVjk$_W^=snTV{{Zs{6CZVEjj#3adtBt2_M6a#k<9he^qwUd1-{s&n{rv6K}_|m=dNgou@U|7b%i%2QqAuW;h+(@!X^OcS%)| zwqMX}u*QvbjmF0vq_`K@qM6WZ?qIAHE^Nav1!l?!{wafW_@M`fnWfQwEkD~PcMBQe z&hI@Ymzsi~qOX)R(Hy$YU`JN22`V?-5DGL74Al>SdTzKIWbna%M4WAt=qTxVPOfD+ z5*5ommS2dq*ZxQ|3@ih~QnXV(s`Pw~OFsQ(_QO}ZG1l!*DjHO@EV%?fwK(nE6U}Sf zi!7Eqabux^eYEJVpLSB{v$xP3?vT|%EhIrWH&SGI;3VfQd3;_Wrw_%V86tGi+%bSL zD@aQrCb#&AxBwZG$3PUjkImTc^BCfs6I0mOAjW3kJjMhf>^@*kra+hvcN`UY?8S&- zwLpJ>a*(G%k^#Xq!-@}iOSC8rPEC%nm=J#j$?~mW+D{g4K2{nv3B*^rdXjEf+!Vpn zr2CNnfD77&SD_$&M&)mhaAYjBqP$6$AP@q6-u74YGuUNnQ(XKOEX6F-FF2GSCkWSM zVfq&fdhml@Zyjufnlp9uuczEW^2rn!pmYFJ_qVT|J2tsjgs({2BDvT@d$mmDq%>O+y9#lwOqjR_qQa<+|*v~RnRg1c1iFAee5R*6eF=_@* zzde$_U_%EqqQ0Ex?%la zE5mvTp7QN81)ul*iHs2-J*~igNN|7me5K7IU^|2Dy3k_%eO#GCX89JrHQxp}tcjeU zb)t=HB`sDQLOmrk(y(Cy6dbzD3ptnT0_`mNe+ZqD8o)z_tTSjDckEV%`pIoOd2r3v zoN5}BT7kPrYdx$PU#ab{`og1{yXWjiO*(-l&296C17JGD#=oRF!`DWl}$qQYhk2+e-fZkB+$A z$Sd7LTx3nm9PKr_DQEcDj61ui1Gt>fk0bwj`lS?OcDn4BDWpczESU!2#`}AN_r+XJ zy`yZ^yXRSFE7qx%tK(>$MqA4X=zivu?v7;41Uglqio5Y(*Y3sX`B*GS4Tn!-p~Ua0 zLbuIIa0Oz*WCY*E7^6V(Hx@PCxr;(5h>ZK-wVz{x8PC)O>|b{|!-S~~XR|z!%~Nht z&kMa5nnJ`}R9WU{+poL`FB8#R~2*;mA=jc{ED~wp;;cw$F)~LC~WUEfYf+k!=q{+YngeTSlW2U(CGCW7EAxxUV9%$(9%^Y8E_?LGc_eGu2OYk-5s z(Z>${Mo9)Ka*3b`@IDuR#j%INHY0#*ShbKvx$HZC-P`j-{S&gEsl2=)&DN7rDNK+xh@KwXs<&AZx!rhq?c*ao<5-r=94p>5cOrvu2JP0A@Dnh2qrUl!Xl^vRA?8 zcmiL8s0=yL%4ZrD&vFDJ>E@dIY!o!2qqau)dZ-OkmPB)LS%gyab`-hBr0=4 zB|kCB>aVb@4;rqS1$P14S~6+VkgHi$eUf(9lRhemhJ_B>-Voip_}Lxap0C%t;8sZq zyHvH{0JHTJH{Iw2eXOow`vy`+-|-&nJ&J>Bc(dV04cmEnNw&ifsBl_2TeY_d$0~>e z+a6(OuES^6?MqxTQCJ#|-ja>41~+L<5^A{BHR5!`s23DLSmOKc^+7j39Jee=*<5=` z5wfZ_#UF&AG=rB|>hv%QR+?TCPVUcmw_1OB0tG9<$WS7oyx+!+17>W3p(7gf*Um9xU@pNbj)+Z!9_^#R!Q52Qa{oCkcoi8 zJY))Ik2yn8IH(`2WK_%~`zUI4L320r1E8+Tr$fJ14ox!UI$TfaR|m1AtUz??B)->C z6&iy(Ui4PYIr8n^r15P`@Gr&`4&4uc_i&Z)bwh;$ye%Z)W_fcojCn8@X5f?wdLuBS zs@0X{%fqI{MxT38dHv!tj~A*mF^*aDB!95Lc}=;fZ7=nRjK3q2FHyX{M8(%p1NdQ! zTV@V``tqV{A|*K|B9!om{CQ0Q2#Y9WKd;WNm!)ip^Xa&vSD9@eiH3Wjsd0PA6gxf| z_n6Y=7xO8>H1~|;J5r|_3CFoy;s>?!p(hpL*ho^! zh~V?(k^ZsnE$r|Vj&uE)@E&0?+MrW^U0y4qf!Fm}mkr14Mo|0(Owg;mmD*RKs|-8I z4=)!N=FqnUp5Ae&R9Lu6WLQt5uX?sh?gx26^fwK-G12J6U{IG#jV6VdMdjrnm>HvJ};UM-GUs1;*-i2R>fTR;V3S>yO{n9l}q$09cHI!@2^8x zSqC@i=-$ev;_7HVOj%x5O~F8}&u4HhJ&0TPFX7%K!PNr4@EnWe@^nMTEZJe0uthqaz1{ygnaB($a_Fz416ikeQ zTe+aNg6tXDf(N8HNb)nEGtLLs9r;467+&A6Ga;tt@!hw-e1KkRz(X;Bc<6rkROF!; zLV#=^JvmYliqfl+9bFw1Xf5(>-5T(c>xU57Ef@IS9@atZm^eb1}>KJofhh1r%eTzt>HD z#0*_mI3LQt0{wd-HZbJBi{|g%Be4dq<@PEU#*CY7Y)jOj#+p|CY*uwi?=4VH?54Z0 zx)tV`zQl$}CH0-E^^X>z_jF^oJV8`kc_H4F!Fs3IQ>R)ukj-O%CG05((W1o~fp-Fz zI62(MrQx{Xrp$MhM$+FBGRk$Rnm-=`f-Qh^dN+r%{yVFUQFVZG2p0vNTZ z>QVc|GvDw6k*Tpit7r;^nP(tVko`3oZSh{Mh&QW;5}8Wt4~7(GshphF-GS%dk97=W zL)hgW)yZn-Q5@Y-J5Jo{zH}iWWhMjb?{i9fjAInTrs$SHsr0K2-|%G=>-1w(+pUP= zD)rASF?*8tT~&27$34jBUBq>OGf<$iUDjh4SOpz+p4ot0CtkgKb5 zBKKZM@a$|K>~K6~jkfXaWK-S|o#(TVRyqy!xsuV*T-c40mwRy%wYET}!EsCZo$>8w z1xQi1+vemAq3-LEl_O0 z@*xX%N%Ix&inKw3KC=D_ah)jL7+np0i^V;*wC>#gG$JwCC2(2y7!o^sk^X*?Cw<&y zUGljX3M<Ok~A_VB6BNqP3DRLO#}wAC?bXNN?yew)6?^>#?S7T3LFV>6L3&#}+I);#e7KV{O zKlJikt=Y%$<%2Pm*G({J@v^z}=a}XnzKvl=$@hk;Eg3_57F?X7Fy~iq7BwW8->XBj zE_ea~V}rp+e%H=z+=YXlQ0S9Wds)jr_3d5UOlcH7rEJJf##&8ekq&e`Z+Yb6&epXO z3GU~&lsT9Qr`dY+C`$y7JSLZ}wxnF=5w+|mU(97MeEX7HiJR|@Z%J?#(XPv*7& zn>_u63-4Wynb&hbI{4l7Q?cyp$!xLz`HerYJbRxWUNvrC5N)P(spS7RPyxH`J-%-F zb4+`JVuF!6Te}1^zu9SlYk;DsAC53F!%l5kk$SCnL63~kj?EnEGlbj)@1qINo;w_fv0`@r$8hV2Rk>4DxUC>%!y zmoxie!7c5Tqe!!h%v$&N`>ojZFN%P2c^B6GP9Dr<^aOuhUcAGS5sbavmcCFHd zRbNnylJm z4D%LeDeu&y1$O(W9(%-L3452m(+6$mCXbhvtVixQHI>p$Lx=>sex}FD+(hyK1tc}3IrBLJ!XwBf7k$5(dJQHf?o}oI#^LyW5H=qNyalsi_ZNVisV%_tb8C- zcD9Dp^(<#HMGF{EAN_)8sF;MsiPHV%j?1O`&QZzH$8#;IrXW`rR$hJVSmfMTFl{SU z>q3iu%gQW{dA3JeADk;*U+Qu>Y z?!)(SxEE2G1I~DvGI#teba?3?P77I#2!pa(_c%0%L7A51jNR8uA ztj0;5!Pc2J#BE*>R5YD)fsF5bRl#V!FrJYp181ezh&a6I#HC9mT3U{OgkvzSvJ~bqJ|ieRkBmrupn)Kr)zWide-y>y6sJW zBb#@AI$UPfYN2J3>x5UCDP@Go$~Nu%@alKjsep}M`JnMyUq$oH4U>>xi(`@Sle+ZF z`JWrRYRiGOI(Kg6Fq?tNnQaqni{Ofp^T$@>h+bf)ZM;|PujfPk!cUnokm&@OWyTU7 zDGtpF`D2~V%-gEou-F;_X~;iZ1VV<>Bd-`*CnF1v^K0$Tms=S5UT?hvaP_fe%CcuV zMerxq70L_;hlOeSWy|g>YEB}LGexc^&tckUc$$~g>wgaFPG~wl>`HBBXi}DFX9cT4 zlIs9mvblt41b9bIy}Q@ES(qEGaJ@Y!5(RZN$IZw6J)>sPri3lJx~dpXDHCb$QPc#K{-}Kpe#TIeSTe{u<;bXzTRz6+;%6{$g(48qw z9qD}w%CddWEP(M=h8tkHRmnnr8IjYJ_fk95kNvQUpCr9;ylL{AcogX%uLTqFc!N^C z+aGugDj0@%2}XX&a+CXvE4rV-hr?f5NX!am&T zD}ELHBg($^qu2Z#6-hb_WtFE_erwu0BD`C88!U|X!P*Cm%v*?EheDA58Akq)I3On) z1>l9d1VcT{kHOmQ{T0BV(?85HSclCqO8HXfxs}Y~} zM5Oi=k1b*Meez4!b=LQTUF$$UTrw}sm z9YPoet{(!^r^%-ovY&>?#y7GKj1dbZ!6yfzfQSeZGz;!h$)^~M8)LH+L>AJGGC6<_ z6y*zv8)c6oY?j2Ol3y_zccNY~1XuDj9q1Q0(<0PHRa2cQ^!c(46F8IZGf2l>Cq=1)vji{3WIYNKkaZ8p-rL|Bnbe6X3k`|25$3 z3~RS#9U>VZ`OiL`2Xl|{cODY`m)xzuG_>&7|1dzw!Q}q&HKF=^2N4Dd0|n@a;A4M4 zSi>yC)T5daw}>(2=hK=uFr*~|Xf;SByMe7jV+_A`Zz`ym#0 zsY2r0#{XFab&jOl*hlie9{?C!4Q#O^Bs&~K_Z9=_L@u(Omz0koDtN|HA*~n!(iVOy zNbqn8Jb5>e%gY|%Z!`yq{*NO=_>bJ=o{YPi| zsf-WJ8y^bJviZ1+q#E`!+@ks39np>868BnyazH{$JkiIZrfbqN`>)Sm(CTm1sMQSB zeySr><}U?j@ny1Qyrs`T!Et=qvwCR<&b(*bK)71f=DsEe+W{`DfJBI zhBJc&k>Ysqtfc=G{ObSb1^CBi+<#w$M)~8CQgBc{=i^QI#}GnNK^d5cOrZM5eEuQ& z2h!dlKuk-$ycnPw#m|Lpa=l0ai-kDe~!I$xlY)B0WXmOZz8?k#QI&aH5+1!wm(kU z(C+bI|DR+*YLb2h;Gg{0(5(QG4qXLXwP_7e2VDhP4X*Q3hgio@M|_3MI=g<;F@S@k z>L0FUeVd(C3tR`fJ*ZuzJ&y8+vRGM+5^8C8Fw7OGJ<0#aF|6OL1(yTrVa>nHkQNB1D;&S_R{zrZ_q`9c!|9Mz7Zk37|KZ8`-@@Og z9@HFs2C4v23@?V2$eMroA1(~(-+dX2M;C>maoBTxOjFa^j0II#h``zK*)$W4i5P;=-4 zf*2S6e;WVGjUqCY*W@|n$gn8--wmu+&BLzGw9FS0`^2fyG)BB}Ph$J=m*Tx-q29e2 zEPP+~ljzw5efrvVFKId2C6O-T{+oFMiI_~l4f+Gd!7Ukoog~;b*@qicJGq)0l=dG$ zO+NpJ^$9eQZb{rt62!|mC^vEN_5x6y84x;ipJe8L$n!A&xM}tO6ypx~KL9+rn;R4> zxrzsrFgb?@l=>fl!JUbrDD4$1qmK)c68~9L@J&&nG?v*&0+*2_8JYLmZLmP4em|4V@cn*AeJ0zAo}$>A^Udb}K)8)2#Y)pMbI2Xp z+V=gL8UBi+@Tg)revO@xD#zCsjQexG5agRt!x2c@J4(a4Tz5* zPm>|>{d)Uy_*Hrx`7WCD!t%QFAK;&bOw-F@!aJNqV(#HDMsWTk2Yj1@$d$o4rVHRa z5i5>xiW4IXbux*apk5F+$V^SLE+`bQ=6*d)&?t#bGASs;F*g^{Nc#^nA{NuIU;x{k zK}5qlHc7W&56c{Q64tPbO;Rf$!88vQ)-Z6I?~5*C@{?3sRU3_#@qENN%$EBQdL~=o z6Z{Z+%O7cAHl!I>lVn<$iD+P+rn(Y6$P2`^%pKGyIrMtWkB8tC&)G0X&A-@+e(&W6 z1V#yXkOAg3e$z^MpY>qAG%f#c3wr#>{h#M-5JDT}Dj#r!b*7D-faI5d)&uxBa4Yf2 ztcSjJ+E2AaaTwiqDi86Ul-yVjIqW$t&##;y-Q@q~T^n`f+iPB8<2Clmd~oj`c&}L$ zzj&QZ%YXXg%*eO4Y2+Oyy|I@*7{y4IA-%jU?lc zv*@gNz5pnkFDRaCr6&k`E1Q%);IrH~{ZnBy%g|J9(=KMY@1R*^s$=`}Xn%8Y-~pZJ zUch@dX5-5keLL=Wo@eo~AO3U~G<$&3(P6h^lWy1}IU{4ALYR2aa;C|5<^A^4qj-9- ztkjR^Z(F;Cus5sC9K@X$Z`FJ;TDw*M`{B`1^TY?Xr^?I zbE4wg`%7Cw^kbS|c$BvyNl`e{fBG&vmG`yJreL;fZH-Y|okLd@$<)hcV!*1SUf62i ze=WTt=Z`V3O!o3PnC4AKRGs04dBaDQX7%o}OFCwblBVc%%59Q-oBCWMMN`c@k~}M5 zRyR6j1;=u>tRLHkI%oCf#QN)6R$`xAmrIwmOZ z-C$!H;=;OEE#Kd!3>fEtEQQam#5+;eh1#6tXHSbdoh-VHZJro5*VwOm@<#n zTmImeY1F&nr%`)Z3bC%JjyLl( z=Zglhwh$j*Q=5#nr1K4^FY<81@$HyIfu8C&>*|ean5!Xt$NL?^VZU`QMqM|YML#?6 zj6O29gs>&8vR5^wmapxG{m}0wU7jhfs5P=hyVLb_>w)w9(UEPfNE2NY^NCQh8o9Nv ze#2=Yw85h94y)^iL`O!aR-`n*%dn)?-_!G>k|wr@ar&jJs!khsuCDdStmYT^O4ftP zl}3c}s7E`8-IHb?7*NIsQ*CANrfv?lw3o$#j2Fp(rS!jjWK6!*_xWqz5l1RaPC z-0NP2f9lHq)G6$h0vtSAEGPk_zItgkimZ0?2YSW4NHa&ziwngcjM_}VHt9;u!t)qr zzWG&3-|vU};HIw|osa862i)qJnWeUF`z{u($ajc?OVVAKMWRP;<=axrZfKkcgxd|| zEh@&&4?k!X0+fGsJ%+sd{~FZTm@Un$&=|y{711b6(>*fFZe5I{AEb)1T;PM z_|#*I*?CtHHB|;7O}izSS3So5c+r>`vkr9XcF5CLpTR7&HO!Avk{fhlnmB|)C^L_E zfYB_%`fqvsBp93#8g4*#Mo!@RO^73TD~_@HyPTz8tFh z__33ukXTaADe35V<}6)Rw9mB;+@W(A!g~ulRa`%1j~)<}1x6Tc>JXd+wqGH4%qPM= zu~!N5UWbQ`YLlgynHFir<8iv0q-ow&a4~Am4VBXRC51!{q&P}6)>qe4zk=$_Uo>k)$y<8$&~R#w>sT#O^umVXxv#Wv`MvH82H{?MVGKSQjA@BBj5w9d!&N z#b@fR9K}{%?AIeeeOxlhn$>Z1F3_CurqR<@N;>v!cx7%z7gmCP8} z;yOw;xR0;4I+SBhNKL#Lq8-I+j76)Zg0B=BgGDv*d#pF-W+t9a_*pOeWYq{nA^Gtl zjm-JB&5 zcV;CLZ4X$$k5AW4^E6AtH{U@Knwq_I9{F5pv2|~PkUekKz|GKYU3)B`>U{75)kJ!r z%GY)Es_eXvpXcY2c6x;C$1nptskJE}sYD`_j;9zA^<~gPR|qfnq9wq6lG*&$mRTdeidUYEyHJ zJl=KBNP*h22g-+H7Irqeej0J7?tLDwoL^F8^T01S4o|qNp}tdQorh^-OsHDkKBIw-C2NELj_b-|0Q^(d$4^KF$WtD;Eg4PBGqiho8 zF{M*r7j%YnGgMPY^4cz1f3XxjEH5(C-8m}90Gn#4nd5mfYT@=b7WCeJJWT4+vop$ zhRx%ZI9ucGX^Mf)<g@6}p3KN;IdxOeV zbQ?laBBlZ_7T&YMIwYC)#ySn447-A~JS03$2hsBvkXqDrbulb^!0xz}nKp9lZ)OKP zgv(UOnviFE7vr`l$joVVc-(^<8qthzk6_@Aby>*ov^*K{ z4yeP2@3}tpjzHBlezhOo0A#9z9Sa9QWFI}Z%D+908ug@){l$2Gf^(I0eBk_G9D3{T zQo8HWWeWVMX|Y=E^~-A;5Rtc0dT9f&AKoT+y1NLGUvKOWyRb#yN7(P_hI&6RdcZ&nm;LR6N=L40X8_c~2}z%z4WndkxrpU@v!UHGQPFma?A%G`8AFFJDK8 zFecyF_I~!!d?-KlJFI=si-g=eH@;kyBUj)2a)P9J6V6>e2&GgRq9P@;Wmp9CXY2w? z`B%6$R?a+O3d#|&p33yRTx_$5Yj)z1S5}HUw3v>XgW1ne&dw@5N}frDl$GMqi@Umx zGb!3>xnQ1xnF(%j!mW5Y=0Vy1206+k z)-F{?=ZP`+-X>^N<9@}-lU`vGLFu*3#G>lluwMcN9(&q%W?iIKTwMtuP|wW5gIF2* z;Rdr6SkjkR)}J?7EOMM#@OYjWG|RnhK}U3zo$2aJJ2>!8XABv9^GG)@_RM)#$~bWf z-d7*Wys-IYLR)&QBdZF(34VF(;;(do6nc)&;iB2bW zb(~YD6Y}oy?KvIJ_xT8TFI9Y>UVBq`nQM8PdmA`uGHFnpJT`j7^8mXYR%9V#0_Ln> zHIw_I%j%0etkj*|(8Zovs8&UfJ;Rms_0&BrZqh6g3>Icn`H%TSa)pOqkKkKUBmn6$YIUxa=d+edkqp1-GZKLw( z5XI$zJqxoVvpQXxfq4fbpKBMj=r5sGGe}Ld@k>Y4eP)mOznoIbC1NtO zJ|=j*-rm=^xIgry>@LQb5nnSaClXP(nGCO9+h0^=Cb(t%Ji2H*h&M9#6J`hbsMd^~ zb!MTa1ZifivxtMPH@NJ`Cu%;Q;Y>R}bwRd;;TFE*|U>3tlJR=wHoNEqg(6i$#l9Ne_N@`ly%RKOq?sO@5ZiTjibuc z(@&G=s`-u~_b3hfC8aa{89kP?j`Rmcm2wrbmp1{ffxWA&24y5|uQdZ{-$u85$$CqT z=Y{d4$eT{cLf3ldgSbmua-TMp&|l(ArXi}F?AXqD%Z2pS4;C8&F)lO=c7MO`-M%rP1yHd0^M zNTBFxoV5mUqn${itE$aTAgV&e>Ct`|CsrwR zBy`7rIj5XO-F5|IZfRqFwNr1iAba~B8%{E}^Q{QyQ=$iz{qe{SaH-8*w{$L3ZONn=qsw+gAY=nI zD$<}`eRc19=vh`cfDzFIbz9T&GHehCKoF68-Zo;$^`EY}psJMPS%A*U*kcc)Y4X-3 zQM@|L;Zx!iPWP?P!eosMwl8zc4u3UIc89&9ARR*)$pbJ`@xDi&7xoBsk(bg9d1?vc1kX( zur?ZDx3Rp3$OozySt*up(~q6E(NACr+zBD>E9v&0X+!%>bI`bn>S-@YTI15JiR|+7vk8;Hc2FIeI%oJV=l7)Q zO2nIly(^2xWi+K%w~KKAxq74BX17X&X`cK%|M}_#3-EsF11zStl!E3HDL+R=LUF5m z+?q9-c$$#w_JWz;B7ar-!kp`ecUI@ndB4}Fbj^;mv+VebbRsfZv_91C?M-g{de|?H zW5E5qU>MA3Mv`HpMHK4_I3=3NN){+B=q6vDNRa*(lulhaSw0K-ok)Ui*sDj4Nd;dwbwS| zQ040=K3VDN+B|Um;@J5NV>xN@zM@sQXmHoWxh@lr!=-~omPCzJTsh>+PNv(9ZRhV4 zcxS4k8L6x-s&dj=0qL*e&!wBrqJ`Sh7Jj?3!_`$EQ1SCm0S=bbU9SAGpQS^%Vun(} z#LV|K3zfe#(a!xU;M;DwZ?4`tW1M5T>ObGK>jb881ZV)jszqYQ(8XPciPwAL9^r=I zn84Py>)~X+s!QP7A$>d>_!yv$HoVBtf1-=5Andb>kNmS+YJA6IDNu;+R9cCD z?uBUmJk6cNVoXuH$8`quNwk+A{4PZrbcF^w^!?e~44sp&w=CYHqCb{#Et1bXNLudd zc%gXJv9N;VJ8B*X)-D`8&tD?f6$6byu9(=U!72y(cKbST#kQ)pYw_bvE7{Pi0|7?cF8C$?4IzN!?A!@i$HhWdcx%IDhT; zrt1L4+4TJmDe2xv?z4FvZalIVI|@eR7R~pi=C7xCAxCRv1#Km$Ugkyk^QL0bvyj=z z*1ZI)a-b8jgDmUCPQ~P9nXnQTYWIMme{zxpr}oAlBzTiHhK0xAR#wKoAJ>(t{$By_K^Rv`Yr3} z>FK@5XQ1LC!j$DmXX0_dmbCIadc`XD&%q$XWs>A?I&ZJ?1GK8{3>KhJIjU^D`6Yi_ z-I1h=d#CP@Rfhmm6p_!T&BgF@{6iZw&@PL;WW%MMFS!#&4Xo}0KN+6P_lk{o0e-f+ z=K6GDjAOFV#oM{cB1zS=!x3M#QgsSd$c*`-(2>Q4TF)4#jm<*t@Wrv>BGdSQ>P@F~ zi*Qm*cvOY)c+685Q(b@E`IjSF)xIE3Q;FQtYm&~(&H36hN89tI^$9*u9JCze*jbtV z1&$rm8EI*wH0nX^uI~i(%bz~=M5zPfwiMmRCHA}I9WUnKnNZf8n$}I!rHxeTj1tj7 zs`)v=Uqhjtx194?^2a~n`SSe*aJJ0yUOMBLzO;qf=gB6p6uZdA7z>9~YBypr9hokR zo0JmRsmO?X*9Uq5Ma$5@8lID}im@oW&eIXQqO{kMKjOPlJEK6#T=&gr_2`9eXTifv zxq7G6(4ctb)>gh^iF^OUp|k9DwNyp+0x^nmr{yZDx0Gy%YT0cyJ*7EcwvuG|tWM-y zB-uwf(f&zA5VJ67I6Eaem}Mo9wH5i8l< z?xn~#=flj3+9h-W+j;=Hu$dQT_RP?Py z)G*iPycw7HKKgYgfvMzm=9rUpUxHY?#ZD0Cn42q##$W^m?;d`zpp>^h%egN7FNcb; z#o6g!v{a>K_M$5#PPXmwl6p?VC*)L`oXvTcL=2W|t|36d+I)dEk40QUU@o;o{6~k%jo)f=#tme(`eC<<9&dL0 zqx?BWpxxar#v4xNe`x#lE})ci5IXd*D!cpNv_FA&RI|LQa*e&^)Wn5!A6~%l=v3sM z2GUX=8GYm{+UxF_Jqpc~9EncznHv6^ukuB9p3S*WphV6B$XO`lnC-5` z;eySxhTaTYe{=E629v3NWwKy+nooP5_V&6@5c4D(=R4U52BLbJp_8Txy)v$4qF*1( zcd}u+lik@ejI&ZzEL=uw27i|?sj;(U zhJLc@e^Z>v0eOOubgsp<(=9vHOcg?@Mx*T6(takhbIi$jd6=<_&g;h5&cue5x&iNo z6Wt_Hl3{w+6!|@PF3qZl2K(fR)9=kbs5!*s99#c6Am?^cNZagNHQ8xNj0(Rk(n~YK zC=eakG1AB)_y@Xhoz>oTs08a{R&M&w@H+ra96o))37hCN5N?QX{q{_ zy@7i2&~SWEdkh6qSE}9@U@fCkT-ULxoxnhNXEz|N&mcH^SX-g1<_f8G8l}UiZ((1q ze@fV-{-!MIK?v@;joHY3GRdtghg;)LBLnNeRs-qsevtYl!V4YU3!ugJqs>#id1FfE zOp)9d52$T=GNqH+ZCZSzdUS)HH6`(&RINB&=luI3n@-cY2Lt?MI&FF3w+_Vz&E#et zk9oqd-ArGo*pBjjA^c23NlY z6^13NAnf*S-OHVaHi}zO1w^PPFrhfNJnpOKe#ow0PowmnUvq2+SBYw2%oM-dD&{cM zY;-8^zpZ+j(AMw~<;Tq_VwhFc_WR#Zox(BO*3Dw7E2+)f8 zR9>iYs2T}Ii)Yzrp$0>!l-dl0uog|9~(ai-#pCOL1jweAnI@gHX6zs_u2 z0&s)HxcpP~q95}sv&r)1Wbwb)Q2b5CVY{_>qg{CG@dYchYL<#Smi?QugBo%a!r=^V z0F^s;O{rvVcU0r8dt`^v_{TTUe;?jpQ`68`Ku=+BgP3ONgeYA48s$%Nr2*@|QvRi}-4a~Hg!912D`f__T@9X_m# z7j2(q=9$L7w{uvwQ>DjdEVY9;6d-wkJf6w2)IsW1O z$K&tb|NO&i&tI7kged#?#>5^$fV~mwpyu6LxTiKOiQk--sD2*_`$vaGIbUCN@`HSc zsN|=9MQKMDi&}irzPziZT94qD>bLes%V%@jb1xA}zB32YtHU5VH~ryZvo~xHh0@rF zQS^?F)8#v|@}L;rc*ZeFf6e6YYOyK(^xg>Wj2*9PP?r<RAm!s-LRtR$c!}XE)1E_Flh#XZ2)+>zsG4y8d*75E!+ae;syh+OvcQ5%29% zzL`hi#a-Ft3)_3&x145Wqjw?v+lP*`g2+eK5?s!_w8n4i$~4PPeeJGBc(3WP3|>)- zoApBV8YWy(=~$jXPQpK9zIy)>|-jP00N)6w5F>znOAIvP4))=g3 z0CUH<)>`e~TeXQ(f33-*t8}_nB|T@vY`g(I4s*+nT@G%-L{~3&s<$zZ%@!qXP0%Zv z2Jr5XsZU|cXBno)x_NPGVOC1>W%^+9+C1BM!MChc)lQtLNwIYm$W4J`XEJUxYB3q{ zZTVR>PiTB)jjNkK*G!6>^+#I1-j>)cMtLHRWsTWz`M-iae~rDKHfK8l#jMluS^PUQ zuHk#+yQc@$+?dL~{J~X`%|$Ix)It@ty`05Svp6H$->##)EZo}5$1at%6|9^O)r3~q zRn6)_Z!*h1;}jfsJ7)E|KJ?T+dX~+w|FO-#xLd1MZH#HDl(9Ac>znU?JbwG`$DiK+ z^5*!Lx3Ay4fB&}+V@MBP7?`T(P9Hd)`c=d`_l5fIhOv7%@b4e8hoRr97z`tSef%EA zcSnBkhoboZcSTVP{^uf_xe8)CJ5oDhPZsAK{%y;AHtyfvmQAvJt0q4OUa1XuL-$2B zC8{Zb)K^kx3jdI*R}R^Ki!wQemZGaWtW@va?sz}We^Tt5S1g6Hra*T^v6wyZsctsd zZ(n6@Y?`bXlbKX@XM~x)kF8(N^0#bW9>k^`^+ibwld}34$bZ2$r$-PoT}kRL;Wa9;NmDnRsN#3oEvEKGxuiKhG)qjr zSw%joeI~$cC-8A^RpDqob>LOZzvbj zdo4=hMxxD)<4Nc7%|pqxt)aqrXx)ok7|VOpnIGobke#U_>2>Grni&(ro#eON(lQj9{^i0m#`%VI0d7<1?(!&)UA_0lje%^`epUEVIY*det9j$F9#>08SBoQ5alnH9f5x)5 z_;b+uR3AMIF|icK$BGZXZ&vaja;2*CIJia>5 zr)jNp+8pGF5Jri2jGN!-A_9d;W?dMpw<;qQG~aPP&3GA{xu9t_)0|}I=tcFk$)r+! zlIo8TAtK$t@|I~Wn61}=f4T>2U%?`g4k+4KBmx1}g@%tNd9aRmEwzLX51HQZ@946j z={Id#lM(Zv9E@@F)4IcWY4-0L9q^tchx4QD?fc*Nvgz@YnvFl3K1gFvIF zDRtK>qZWq`OaL0)mMwkTCb#;gu=YlM)3PG;Aiinv&<8tsXOr17_3rydTMl67QjP40 z!{s`CPG+Yo9Cc*@_(4@}srtvtulbukb2<5{&sgtvjSuZ3KGrR_~+nNiuP=J{`$?gI{44n{?QnP+7jwE zt8aI_tFPW>8vAKY!n+43)Nod&&(F@(z^9%(K!Za)8bo+Rs%lBEm0#{4) z<)$L0k5WB_5;7wyIY$uLKkVt8?Ws6M)?S%Rv$^V1_(=6Ne}>n!@9D5k4}Nehne#>a z&i$l*R(^BO)b)9B&}j>{gWl{}FL`Q`9ptWT$LX+sUnTVO8g9n5bWe-!@V>7FPs`#J z2aSx-!C64^2OZ ziQh7d9mamc+U8f2<6(4nyo zvDG{=?y-a28^@-!kd&iST}?$`1NUIOf8;TE&6DmLf4cEMn)Mu;yU|~3wvmmt7vtlq zVBXpHukJGg>4f)M_|`vsuZ`-;T4vYDmhH9!JE`-|veFpTKKD#%256p@Ta>#`T{qLx zmG!}@*^;lBhujUswTdW(VxIB{OYFs{E8tDbTBojy*kUz}UfRmkX+CcEu`L>kP504W zk+#37e|^Pn{x833rscXU+Ly4h=5`%-Rrk%~zvg-;+NZxyIkVKQZnxj4pk4gk6g1au zQK@9nzdx1i4@bjq+>!E%ONOj*nGe4Ey!0JZTM{l^^F$& zi*hf?`YsDYYg`%_O{k1?rYg18f!0Q&TBm52e|+Gt%oCjJ1Jb=q6Q)*^tE<_y83i~R zRRPNQ>cLz&boT4 zeD%NJ9)81WP*EVcgH@}Be5#8eZ!z%#pPQIi&uKu{|yZJ z#RG=?!W!~({63i0o}c@W1>DvDeqD~|C5T#@!S7e+_;?p5%eSa+En1&fi#ud6>3TeM zy7hntN)m4-O3!gsx?;m;(sDhb_P!S0f1=!SHL9R(+UJ^o6JlJ+?d=@iY^HT?V#BY? z-M4QXi&3LPX;)3^iv!=VCeT)x7G1eC@3%0e{sFrR;CnbD-h1-65;?lKDw3(q@1SiN zbsD@?DX&zorTTu)4T@PA?|*_(ztb}3aqZhzD${I!uDXFS&*a$g{?x`AjTd)5f2L0e z*o>`pPCjljqn9H5!f^_38AUdYXZP@{S_IiNT{Lk5OP}(G@x59q-tEpOI5x}f%SXH4 zTRRFMd;ejtc?f{&Vhh!lFI%x&|BxcDOL6ZS&mV&{S z0%&7%NKZj&fAqKt+M@0~vY=K0b`*)C+jO{vcDgyr#iMvmH{3`1_Up7mXJ~Bh>bw_# zjz5Rl)mMAmaeJU&aiCSDr*&#=P`ymQW`+B@PCCt0-&^HqH1PhT=HF|~fBSX0!9Do& z(eA;1HCq}6YIYod!|eEflZo!)KjK7p)9hYVd0wBlV#pq+_LGZh)@pm(&2h%IDw}E< zMeCsDnF$=Gr)L+FrS8Owu8llbrAD^^CwJ_{VeuMqdp8!y_U-i#ciRfHIm}nR9FLFn zRj1n+@XJ=ka^P>kSPZQbf7Q6a-QE7Pwpvu>t@$Rl`w&#kp>V2iB7Ej${LW_!#_+5@ z*K{*F*!-%KAI^_d&+(*h0HISAg_?LUq3JK1k2{{~0(LZU<)-QKbv6InS4@MYRspws zEw7#WIp~M#9^Y0fm%uGmW4iFDyqZ&tqGr6;%L*GO@NHWg_gl9%?$@_A?jMa>8oph{ zD7p;@P?{UA4C1W>!IEm>03tkhN1Po#!+uzTA{9OV=R5K z^U2iY`tf3Qc`~15f3u$#>(T5=BkBW(5VoH>XakN{hFaIw`>hpmb_G`Xy;cRkzRW@Y z`*NLD88q_V*n8;6YyP6FAN?7|H&HJddg|i&Q7;~PF@D9+6Zn-wPkMeb^b*hS?+?BH zzIW$qM|$i0(DC-3{>$mes9T!~D)qOBcPC(+Ep7#QV5VQs>a_NWJ(r>bGw+BSBk6r|%Tp z0D()6%N&=5yArKB(DU?IpJnop^J>kjzvx0A8W-wPf061JDPA}MY|DvDO(SdjB1SX4 zoS^iv*7F%{oaBaHyROfo-BOu#wbg@SU3bMthsB}(fBR^h|Gr^a{yo;GjWZS2MoSaP z-ivA-K@BonyZwH0gF zSNur6i659JcB|2_TU(iTB6tC0uHzWuz>S>;>b6wb?kaK3{kabLhti)ZD$b)gT`n5*t$aioTX z@mLMUb4UXIw>P=9UM&26cXYByC%@GU6E)Gmcd6#!_Xy^hWyZs!-V)!@E_`K0VJEqd zO{&G_Y7S1)&c3s;YkhLQvomMU?_x0RZm!I%#LT8y-vg-F+@k6qQaa%G_k7D79A6ek zD!nn)x?``-1Jw@YQFrwJ0#Hi<0v-bt000OG05()`Nyh@3b|P#60O=o>XKw*C22gAP G0002%X4B>X delta 73877 zcmV(tKoYZEqX7 z5=Otzub}WIY9K1nq;`Qu>w1wBC+%e{yE7R@qd+7ip$!2H07_OQ{`Y%MZKx^~KvJ@u z?iuDuTSV>a+3GBhUR8Yt)j;-*`?YVVZnW!7wRJL&-hWFg^%%x>Rf4@1eFkg83CX)e8D(ABT^DuVG$C-rVPkH=bi$&_YBC*_5bW4uML3R5W!6tc}JAT$Oppv%tVcvAtc3`T;a* z!;)09+IgV8(9DKsyoykNi@r94=&IBsV4_lA>(GE$GYr%lcB6f6mR`*R`S&0G{==Lr zM5T(2=Gt2oFITB5WDO?TCIu7#=#t0hDkHUH#oubIIaS=L+jRT$ zs`Kl!4Vy(6MnQ^V07cz#IrOWoXInch>Uk)uMNGrvv^OXaYcxlHgMWFA6rqcx`EtjE zDomh2AFx^-=qDaogx7sf(cq;eEoSuF9;;t-Z~uEM+rfOMxF*tQj%do|UF zit`jV?gQ7WVa8bP0&$7Sj3%4=*6^Qs3UqMrn?-;M;Axs+1BPeG`dnCAW~S($)Blgw z`W)S!=iyaUbg;vJyWa2bD$)m??f7|ChGpdTyeY!YhTP5V{ZVw`0X`BVw6v=dTh^wV z3Mj2-wuZBoHZ6HobM>|w8)|N)aZ^U#=Ld?<;#*eDcr z(e+KsD7NP^co&UU-Ee3=k0N)2LQ`YYvpH#oZ-@Eh>`da$2lq0=d{SBMNdl1hRtVH{CD42w!k(cPWXq<{X|aLOf#hCr;&wS|^?%`%L+YSZ0X zp!UMu30qoMk0R zW_z76nrfzQ1h8#TPVBdN)$BKT)$Gsos)_N{=kXG2EG+%3zb!*!TBONdyB(jcQRRuA zZQfks(eMJ>na$EF#-1%A`vvRL*qoKi#H4rI_^k(0Y(slp$@7z!nF}v-*9UrVsG(ka)L# z1@|gW;HU4PPH{Z)U;fwYtMDTFCSe7yh_v*HS_yg9B9@LkDo8V8FRvYbH4pK9-n!b%OBB~>Uo?4+d0HolJ&;{#mBJZ zMm0A_#(NR;h%jLN7tTd-3LotO$BXKBLBYDS#$S*;1Lm9s{r zq0TBc=$`HnvhfgFlyGEv{Sfx+hY$;Y*4kblMK~#oUWb~K+0$)_bFFHt>s|45_YE1W zU*kg1?*+a8K0G4rcRY2~wYTp*1ARmTgI@^{&$S2fyQ9UFN350ASx}Ya_v9hNX=%>F$kRo7@FwJ;xxTD~HV>H!<{)T*J1W7S}0O*^MakH^-M#;cxXqg%<*0yB^TQ+`($ z`)ahFcsyIb6%q;+=2xt7#TE*GgDYyZ8Ifw(ii5 zo-WQXNr8+tJ5 z45P0(^!mRoo1_lg>T14u*hcLJePTOOR4dMpQH^dJL2~1>^fq(CO^@V%dUPG7Wue@J z8iz#L_2^1@o7)!8L$6-FGLD}(Zq#qBIEUNfp+*Clv$WneB(=EJ6CzG?aD4JOZ*9Et zK5Ym&X?4@;>!Q8F&)pH@4jcGNTX~$DV&t}HN2+eue6`piTC^SxlSj9y)aMo%EH^K1 zj%@>b!Y$P1-&Ya-Me$01M_+iZ;#9!9Eh)U4-CQRL&!WWY(o<+^s5&j%3$$E}!%8`p zDdyCKP;<70@{qgQNYpuREHGy(T}eVITrt#kOnr%-+E1^c6S|B)#_4!c8m6Sp1EZyn zG3Z;sSdJ6LkISI8nGEx^I=r)b#-n?xkT|X3KWHBULYteLD!l6M zS;3qF-0JV)LiB9_OAV$fV-sq*{G&nj)~dV5)l2Wr^X#fsg|E!!QQ&KAx}nMDrhf3q zf1FR!A)XPpB$0P_9p;@ZD7!$sLCM1;x`M@W9ZG>a-XK1A%kD)~@{Hp7?Z@!qEsVu= zE~9Ydc*nhyZa5x)1HJJA&$*j#X_c0;n=eYyHH-w^4iMeSlCl)BlVg|`rlX^-;rIC|&1+=KnEJ4D^{ z&sSLC2LC|+cWwbL;#UAwl?PJ`e%s#OZjHX%-F!4MYIDmwe-!gYdZc=blSKZO_6SL= zD$q8O^Lr1RvH%0K{bseaW%@NyT!hgxvGdp#AHz(4S$&Fd6{yFsiw)Mbrg^K~TjzGO zx6W--p>J_6q-DyM{a)82*7a?+DPN0lvO4tIs$6e9{-mhe%T*2csx89bUw<*%oYE<3 zjdZa$7S_&u)ZDj}xi6027MuHqEw-mJ_l97Bw(e=UhpWt3eAH86f#Z??wKB768KoPu zn;ge~mRnTQ^;hTf_)9d>1CR+B!Oiq^5~zFIES_1KM?A!gsZEG$NNj5(Ul&B#<56? zc^bAl3DW4MbBI19T<1lYrdip6nU46*bbfHwiZ$m4fam39p51gN0I^1}s&C%C{Pfe| z>DzZ7PhY+J^!BAgCR1#07~t50JHC~F{@rvsz&RkWABIWd4#h542dBa%Sg?O`9G!^e z%H8ZB^CNFchNP+)5w>vtFbKdV}I=+D)SLqP!dwYinNarnu;G z2vhg2?;oqUk7VAR16Q(Blz9wieIWOc-U42+TwN`@r>9ZzhA!nn>EAhUjKWEOQaXM) zohlno@hNVdTXy0UaCJJQSI6_%s^cDggc<1jgzMP}JHsR_icSdsm#53|s@CJG^-^i> zLv$ViFFzD*;wkO`rI7wmcFxea2fdHPVG<*$u-+*q032LTD}nvPl@Ken65Zd6+b^#P zEOoUFRVpk-R1L9^L$sA$T}=Uhz^(*<wpM2-ZC zztSf+d0evJJp#qgCvkk0_fTBND`!O=#dG0ZF^)0UlWgv0~JgwKuDfeID{0Ac_e1PN+iybTlN8jD5aGO zPhPshg=+}2sTQYuHUT>B#nI6VJduF{0$CNug0-Bf)&g^R|00QppVj&}hAzWDr}Qtt zSQ1U$hF?4qQloRBxegZK1EW&_4mX zg=F=*8`ioTYTXU23v?%NT$d_za_{JMLG+^7+FU0Fp(=*$J?BS;baG>YQM#8r8EnsT6-xQmOd$lS<)|RQd{} zQo@L%Nszk<(nvrYZ6J}9xfUk*2aRB@?n7SKw=@|*%fcpCx!zz=7@1*KSjD9K>c;(tXjl0j2tz^s4%1#MvaX2+q}N3u1kb~yh@iMl zxUXL!IBNDLMG42ab9@XiYA7=1xr%5@$sgi(YYFQ6Nh|RRQVM3N0!m+aL2JB#TvIW@^Ya<2hy`XWBNmylj#y;wg=`R0+6vK5)IuZNvoi&< z6X$buJIZd5*6*Ih>4+oyY8Zm0@D|}&0?DP^-}g7GuLBpGpf;E<*$`Z>ws6n{(o0QU zEyDNI3gV&~3j&M(h!vT-6OFT)%;2nl>S)^`HwKq=qi|W2!`kroHpt$lzqd*Dw*0*< z#&ePVZGRsH!COl~@KO-`Yv*nr^g=`#l3Zg*iXfiBkmyub3LB&*+}|tI3tYzx5wS;# zM?Nj7kp~|{bF{ra!9BjXfCJ7&n6xj4oK4PP+X~pz=|f~Zbn5fHG;J?MJ6{uj_}Q)p z>Tc}scq9ZCy})b2xc>=U5FrfM(uDy#x-ej~RT!|L2?O@_Y_b65=9Mnv#Bk!`x_M+J z;=~iaf*z>vqCrI20$)$#)D81-dTL=Rr+NubNUxi#XxV~K=*A;tHRI9!eFlWx>MH&V zpJYYkGIl8sD7cJA>|fUdjF4u3r)<2=KsJ@HIj2K$QBIw;Q5QD(kDp$@biFApgc5b^ z5&z!b<2feS<$<6q1N`zc$yfq*SOLb&mH7&13v8z+*g#|^0qdOxs7oYMI4><$i>4uS zTBW0QVO+l8)p>7hI!d}AwV>P4Ext!&@DpVLAG68u@)>%HiOXBHHsgbTv}{+tr5V!j zF+dabEFl!Iz%E`=hhE0?B}6C#J%cm3>-|CbW6&Fv>+7Cg;J7>yW8qVIIf(cJQOkRd%sAR|kgB`;DD@)E! zZ4*1i@1S0V-y54?4*dmzV@llElQe}B1(*+b-5$QX}s2?x|u9PuP%rOi!?@46-mPMViI1c zFjGx-CA2ehiiR2m7uNvDS;=&ing$svt|3wdatDsO$j0AX^cHo0i*XVI;$Nrg&m@LA zxm0$GS65>wdw~A{2GkdfS+pEBF0m|ddVgWwAG)RYssEcLvY*nSQ=KD>$jOU4I#tYKs2`*|rr1lRRKm z;T*9ac={Zq2-6FHMFAJqq`nULj*rUpfV=P(0LJM7cC^5t*PP4y7n6Cj7wDlb@csvi ze*U2=8+1DY>2-?BYyy=4LUF+m0wjFw&hzlLb8`tr04GqdD5L}QdnY~znr;ZpTA1H5 z5qa8Se4~(&qfDLkiqdjA3r@oU$`^y9)c*Z_JYZx(5DPAUh@Koth8OHkhYB?*C`ma@ zss`H`Wf7C$M_+)HXGRVdhBTB{A5g|1rz*A_rEq}4?kK`Fs^<)lVIYuowaW-AhLM|+ z9?3mo(`Kb~lv}$eIi;*l0;m-S@%=s1KUiI5e*x;nS}o-k#I%yNDdbI@MSun<${q`J z>gG<6H$eRNrNTy?#>tSz$$-YG?GAE1(6M)i>;tjyTt+awBOtQRQ>Y(tPEvzte5V@8 z94Nu|jFsV-reqHXl&`KR8yt_Z)?(ty>TBc=+t2BL)W8%9#ae$EWG7eW66D+m+3M{Jk8-%if{%@1EhIE0g$XH~kJ0cFuYK?gL02~}=wCPU4lPZJ@d#N{`6CVo9E}#X?<>rxtO+~wC$n>vFq51 z_EyQ4@RR}FQs92TVq=e4ei*_>?oC~TTAU?+J8}#XJ*`ot{MNyVZ(Otcd;Lh1-oZ6W z`UNdUN-|bt*(hH(?+L6WoISKj;3ZS!u0sn|l~SH3Cow6!=^*T0On|s6=pT~OHzCR6 zg&tRIXlg|*IvpfhTd>IhR}dNbZW}lM~YbxJKPbhwYno2=ScN6i9K@>AUh>FW{3~9G~Nxd zIUX@rIIh%SEptwzmV*Z)mK5QlhcH^?6vnVR06^i~si&|yKb;8_WD|oe1;kB4uJKEe zSY92XP&trTG-=puE}qaPFAwRplwN3myJ=~L%2XcnKEJxEehn%)CF?paK41^02LN;x z5i+CAi>UmFj=U!&jJ^-2pc3=^=Omg$T;8N4+}{fclakmSPl`)Cz%A?aL7yk5D#Yj{ zHKL5DrdDlsJE)Bo$A$vhO8KXhAXZ)CQWK`rKSYx`IkZ*Ow(J{V`FHjWpLBnJhu@rw zRVWv;dUO5x8n_G#10$45BanNTu;=jV;CXc(vAG4vwX|S8xKf$H-ja|^&C^(!U0fu! z#D?h!ysBwEZmXEj2-ZNloFR?Z8=wXK9jJuiFPlD~M z;M6*67V+E()-mLZ%5F4-}g>||+j+X;um2>6i>Z3i_1 zSQ{Psif@X0B-s_JLNm^P-oULH9pTbRpbYSM1sP_Gr`DgbXPD;weTE`R6e9$5 zJzt?yZ7zX5acCM++z#Xoa^ z6@N(A;y=XRp!hL=qr#jOpc1(#H`aCya;C;wCQ*3JSu`zui24DEB_m2l`qITe*C5%E2J9SX)1_M-N*-E%mdP;VZ5Ht;3Y0`^rZxUXrwJ}goOXylvpMud*k(7*gcyv z2cd7BVywKZtV}vsjlX|7;?l9#8kEwrzYOkcPdN>Vn&P^4J2Sfp|8$TxD#7YKpyX52 zT@acmK?*s1@x*Ej#9JKIQ;9rN+tAHX%}{CZI0p^~{*fF=3R^ODy}^xD$Fg0?+oIUL z~Hw{8)SdS-`|;@ke#Kf_fpmSx1j31xzpnGL-qO5r1>o<{Rb<& z3@Yy+X_v(X0#=8HJNrn#P)}6(bm!MEZ!kxq!GRp&Ji|siZ(uK+$19f85k5w-oE@Ln zWpriX9v^6FdwfC+Z8vRQn{tE#Tcx}vb-z)6)!}I*T%l!aYx4R2I6J{xfo~Id-&7A4 znpz9Fqnqrfgawim2VHsgvS`VV8vQo0U8Dn_?YQZgoTSjG9~tm|1n_=y$KTwcCOx}8 zx=h$z>eVk@CM+?{<6I_e?P)#}wh_hT(n?}Wv65&rGBUj$aFjv9z(f*hm%{lVXMa(D z!%b-D!eRK7eom?JVA^G1C>jOAAHs-_d6q|og!LWdB&;hmmBEPdzX?gW(GVNj3;4Kz z@rU&B4`oC@A(To{Dm0{dRIHKcJgm}sDBk*->Q3n!deY+3!D_@*>EE=Xg}PNIZAUZd z1n4B7S_&8=eVPf3kqV5#G=~Oq&4XNjsHV|Ho!YFf)CJT|370UjeRQi*C>YmeD~B5MHXVsA;PU^-zr@@_2hxLyg1hyZk#s#n? zEEWm^9YLdtmq?W7zGSYo(Uk)ILP=1LKFfGyoGO3JBbae-E0BVYV5)q;A|YJc^g?fT z2=^ho;+2lZ;gB|undmkC1FV&QKD5hl41lwc38SbO<}sV4Oe`j6)MrSQ!o#mt31N*i zcPgjpd~r^uB$)xW`M{s!CQS@*Jwb#0p5O10e&6r+Nq@udZ;<|`-`^ztJ-@$4Hv0ZX zpKNUT8(U;!+uztG8@v9-F4@@kH}=WqhQGN%HaGpvO|rS=Z*GyzZGUrrn{4j+n|oxd z=Wq2WBG~bF$iBZ1s9=AI3YMtgw}1-1m&rfA@~IbFP_5G6ip=43@}mVaRbSHW(8KNi z&EYjVppJ{GsOud_HACUs1kltB7hv)a=DwVB1C@@}e(sspe`1;a&859~D}G zg*<61Zg0DLcHF-uv@654+&_myqn{y!G?IXM}RV0pOetjmo%@=66o z(yam!7*!tXn({#uKGMgUZ#w=PsQQ}sJZ49&c_nOab0ny1=~U1E;VC*XWVbS?yD$9l zhc((&u?Q?n)UZSi zOVm(94I6Dz`i%!l>1X2!#uqTrhlvW%15OF4r}z>~e{|1bWhby(Khp}F=MR`moV>|Y zMD&8u<}DhG2&q_qhpz0grK5uus}#T8@@3kN)#l-9t|n#l75JHU76LmNas7Wi&Ga(K z)~)_-tyN{a>!M2N<^WaFrPh(&_CXZ%{PJmca}$2`@z>5SRd(JG3Qg8p&ZiWA0=9dD ze+D&%3e6`n#oAq@XWl@6t=OW^6r(1aDu+ibUU$|~e3`a?8F49PA{*wrY~-Hk;K{7l z2`nWzCfln7=a?$wxQs%yltlgN5zzOSL^0A*NS`pMmq%nChSXFt@$>QWC>q%8TSIOZ z4b&9-u&8K$y`*dH0#~EfLk+31u7oRQ9Uo#RmGz@8-J;8B7i`h2IeOMxH@en_rT2_` zzIbrB*}|-U_sTQQ3^CR+3d@pLS)z)^sub;N%*xij#;x?JPEjsAuWqB`)m%DW-9X2y zDRaE~by*ok3;!G!@mZWuSDccQ`3W_VTq`G1uU8ez!?MN{(WbtQbW9g^QSB)dbzRI7 zb%{6PbsXp6%- zn3{k@x1uEJFIf2@U8!O}s3hEHq|NpxOfkR9q-)EHQ}PW_^bp-q4?;KQ2yC`ULE zVMnSMf}G<%o~-vzDA7Pm2BOMCG*sYJyyu6E>YUHiQd!J3z!I}9G20TeEf{})drJ?w zrAvPMy}lN6Yp<`w-1?emF*SumMuHF{0N7~D>l$`Eite zxg|MxRHG=WZs@9HNwXCt(VS_Wmv*STek!e05r%9Hb9J#1_AY9p2PW(v;{^)Z!|jnC zYW1K|E%P?4>i#gArEShsZ0}ruWdNy}=P_td_2T2X+}t;ZE*W$81`EG|!XDY!_GT&l zd~NcF4pl0in)Hb=LW{G^8T1HrKb#~ml$S9B<52St5fUWa&EL3t4$E8v|zZn2(wbe@J?b!{7MzJABl*=R=Hnze2xoayctqXTUbwAQ6-S<5;aG|tTB zlJX69PvxRz4_WCn$ewI}VAKlv)bcbv$eBmVVH78B3V7;A*h=b+k|v)g8K7uL@>t0G zMaf8d6E!=`D}#=_qPB~DAO2%P;J&}t7a@n4PpWNykIGJ#?n;&v=90qvx)i1n)OA}? zE%+AN0~lWtk&vP*fVhWcRuUCajKv7WaG~Rh3NeaMe|!Je3DWt0$j0wVs8M}DF(Ybq zR3vEA&-@HLT5KhR6AKBh#G#oXz$%9M&c0xUk7ljeJf$q~L+XaXIZcD3~OQX$=?)0gF2?5`fN)ttUiKP~;8-?Cd40XiED zHy`4TrHG=>c=zXja5wVabh2XgIkMyTcSwKV@9&HE&BYvpENS#5jlKkBbsBwlUYCM3 zDe#^Y0wWltuB-aYbybf6!>_Fs+)Ts^5K@u)QHn2(mI8vxADL9XEV88XHL{IW=zI;FLARk~S)5Y+AZ6QLqJ}|Uc=>u0Ggqj7I zGb-2DRcX(jslDCOa%c670S{B6N$W1=7xbAjLQ7T4=<2dRF5b4zM97T?S@$aZ!U7N} z(!X*&da~j1s9N2tI8{nev7wq>$z~zdCYiNu!7MTT*W}0A)x=%YBB0e#G#uqaB!)Z> z*6mgNB^tSZ8yK9ju?fnslA7>7YGvey7!G!YCd9X+m@!E zhb@Mh^R>IaJxe9s%Eu(8ateFE)crk<4S~lA0r1T5l$kXpYL{%J)C+N-5jL}I*N-@R zWmkFM_WRrThSA?88$Ex6c~soq^|yD$n};TN*;qORTXIrMPHOquVZL^JN55g5TC8Y# zfS|2^l6+`I736EGFF!tg0@*+QJ?-%SeIvQQX5=ZfbfWG*CsBTTM2!dVl5}h1Yj6|x z-Jc8yjZQZ2Q@{cb43W;wC|VZL1KtxXoaUTQ3LA_0Gh03>ET0tqT`pS|_Sy1PUliss z6lY$|CFm@uU-L&8j6VQ(C|H9@LDcSCuY$;bkpgm@)%2_w4;&I%9x`UxUcIona<@7r z+3+`nYm$wnr>G^^`AvYGZ3XK5THwrA1}qPhFx%ma1%k|a-V{K?_NvLj#bTa}mf&Iu zF8*DiF8hx&LKopFgFD7w_!;>O+^3&*@eiTzHvD7F>A*lsU~>vb3v<{f)iH;Ut84^+ zEaWIIXp|~vDy`S?J6P$@?aWTsYD3154s~6Q0=?R4PS8jv8%JpYJ6#)cX9QQE+^s ziTWNhXbd4gPlR8J7nzCy{5qY|*I?^#wYR+)aerxBfs7pHkmjJkFJzfHQ9{vw77rL` z+>K4L+4DDh0v{~>lPq7ImbmJXuTF@o8uj;(Tvyz8ZtQ6Kd+6&^HR9etBkq(LahL8s zeEtHtS01@(!*jX$W)(KPSwYDK@Ei|`Si^G<^z|=7EPk`-^7SzBlJtIfEO^FN2;C71 zyAi}l^wH$=vI-DygoK~zv{UzgJlQs-`+Jyj7F=iXsM8Z(R4C%5Il1byGe@7D`T9DW zTnv-TPjE@%`uxx{Wz5}DPPuOs%)EkuVindOQ~~;`px#9J8w?aD|c6?j$WPLrt0sp@nE!&1XaAJetV0H`3KgQdv2!wI_AlxxEh zJXp&vvd4kLJwghoq3$VmP*(KGVNx&#l7B@g(|dkPzfLjCL$bP>Si)|jo{ZuTAX4OR zA|S}ro3e4U;fcS}U#3@o`J!Pt0MU8?&L-k|44;k%LvcmUgURvm1l5z_3|u!~1Zc=V zC+s?8Q}kFvug?g%d8y1glD8z4!{KC|%3#yu9RS5{dBnW2P+1)4IOL|8%93SfsrNlwKKjtvSo+XeQeR8z>#^Q{)A#1Jo>)ZZhYLwb z2)_V)k%YoSRkc|7>I^ALRvmVR%#j$Ddm13Dej1`TG5qERYO^$oCR{|DlL_`7gv?Ql z0q-G4IP~O}6cZ@Voz%giw9so`#kHqJ?GuJnO`aF#xW|&efU`N=gQ!I-nkmLq-a^$a z!1MgH6kA|ZL7f+W?o$+8iCb+7Fw*@eQ-eV;zjS1=1oKNU|1Fv9Il=sbjPgtl`DIiL z^H`Gx^YLan>nXf5udc4tz#9kMAqhFiWwm(R@PUoc7f>I7dPrS?p?|ClgFGp%CnD}! zQ(fQ%+;*Ipm29PxR{4fjxzDlL8Y_aifFuX-;E*AxKs<7P!>` zo+_rS6tbsqFgSmjG0`%Ad=%2vdvk;V8 zS}-Rz>?DQ16?R&Bd{{mS{^~Kn_g8$tP}2)(IrQe%a*$Li8qUquO?Wi??KQ&R|F8jI zAq%97MN=Aop>SV7VV(NU9-`Fn?)+Rzz!uPGSj+>(5_~Pe*RM~b;k&Ca98J!su>Gs) zFchM}2art7u{t=(BpU~C&`2*GRfT3j8d+3ON>(7FJd94M`w=UR!7@2w8KRHl8{JW_%k~GP%!eEj~ z6X7(|30K2&aBavv>yUfukb5Wo@yS4W-o0EzJ7{2WX7L@Kpj$MU_!G3IyxTJ#q!%UB zB$Xz>=d}SoukjUZ&)?YN?_Zlc{^pJVrHfeuE`^~>VdxUf8^X|P^#ZYaN4HmJ=-kRF z=npf017FSa5ax1VQE=cT%c*b6R5!NPUD;LE2>_H#UlG5nH9Zhx^JRw=N8$V3Fvtax z+D06e3mk=lU5TSgcYg=frr?UB))ahhquNyNUZB?0!(R6cL9KYy%h})id;F1JOu`F1 z^`FwuX?6n;PkHRi6(9jc6h1kpeDcCCexXf&NPJnn@7aXJVY`rc(kLVj=M)kP%!#20 zp)rJC0O`1wTfG%3sYo& zw5tXJVdfhwrJ*FI%TcZCsSF&IS7P;)YIq6S0dhG^)f7{>RCi^@7{tl8Ki&+IP$&V%Z zu_Qkh3|sZ>-0U>_)Oo>lI=`#C9M#=_N=N#avAb{9Ojo1=>gnuoQfenM4AKJb^k1<0 z9n^g3aIZN%zt{Vra?}}LM~?5{dj}pHEmD;++yiJM*Y#8pqNrLF#mmL4&G=z0l3t7eFk}yL?Ej)#3F-W<(Gd@S3#-E& z@oX+;;=aUvOWe1_eZMl?C*YRgTI%?3E+okdB{UZBRaA!PKkVO&O~uT<8737SJOqo@ z+|s=iqh%PUg6fD{o$roY6*spWY*U>mo_dN1j&o-+EhtrKb>qyexRh(#eia-zeE<#= zV_XygF6RAUi2#=faESnaWe9M8F1$7yOMXARmPc11ob&YJ+wzHeH(v$EeGpC7klgxr zz;Yr0goR^MF<|p>t&UXoZj%4#}mk@pZZ_(7e(qPTD|&kswL zmZeI|{}K0yUpqoh4cc=6jR77sf7%ZE)8>A#pK##7oM_wQzs+)b$e;p$@21)F;pWl` zc}W#7q10ookmru!_5eKv0A0-lGHhO`dE0s#^jB9y?qG|oub)*>>srEA8U?>^1V%P?TdbB^ zEJjwelSJ21Qj5jd7ITepx|h-L^P5RokKxAJ<-EQnCY$NROE%OPPwa|yV?;e;sVn`t z;^@_#MapImdcJM^3&c~KZ!OIB*ShA=8w0C7tb_Gh2et!Re@v)<;vkwWs<9B8g3lO1 z6-z$gwt_5lV!7u0-kD`LZ4C*>hW8Ua$V#L)HF>HTS8Gw;^y@y0I{2BEZj5-dx$kf8 ztI^#Ag|IZNUP@Sg^;lSwuppk@^|;1z8=loo5@*{yXTnQwW_adhcZ-L134&k+SQpa` zJa?Rj&f=mEq9b5`Hg|>MBGHBYIuQhl^}m(!fE+XPS{Z~YUK&6BWB_?ksh)L6Eb14Y6gX{rXuEj2}MlVtdU)p0$07^B@w;R-&$|VMbke`L9@p<4*L*dL+Clm zU&1|qN3c(Lf0ME3ElNkwnK_+L`Lh0*kjlRB8Mx?^*py3=bi7ip9 z>7I^IDm<^$5^ZJ0!{(JiyI%qA-tYVUK9Sr!+1~WGH_7&vzr7^|nOn;M-b?=eS5G~g z{5^d2H19`ydvgViTU@v)#F7zih=Wqfag?@y%M0gmsYaU1s!!h6;Z!*O)N-r$da9l%O!<`>qA#bEdxjP=#LsRWie=$EsA%elAd z?``6h{3bEE?RVvWk58o-@BJ=b_|%PoRW&ce_a-x3XOhDD$0-m?K}7;7seTUJoA>?6 z5TG@1R+OY5iRCUmSVToKJ*tZJ8`#OY`9t}FrN;Zr$3$zprtA;d&WoE1}oMj-hN>92?j1iZnUTPpuIQ3Ye>i0N42~zl{dXAnB zG@z3p(Ao9(b`j`&lMvY^(5bwCH!&|}5=q0^34`NfCy)L)iHhWsB+8!Hr8Bdd{^1OY=eVjOZ$*&8;_nWR|}FYL(x)ym2nidy}K%E z`*u~>_DoBaBY1OErM?gYP!kVX|0e)J!{gowuwFbK)Alyv?%;Emzq1;50%wuS0{8UCD978+BadJF9ISD54@1RCMP?ukLm6tYdOToo& zPH^#CR7}9PCbT^+##AYP0eJ2>_noB7A7;7s6Kn2BwAP|^u$b}MgR~ArCH0EuP{(!P z_?*G`DhBI-n*@)55A*B%*8!K^Q*jEGm_hoL8tE6KCN&(wdbhMkVW!M_r++-+_DEQ> zfQHk+UPfJYJm@@A9bVq$)!wj#;#fA1j!qq**sbR|{$IpP75J`yzPXQFRO%K0F*RZq z*11R2B(Zdkqb0+sDJQ^=0YHOvimwq47QwOe=J4g~XQziBKAgVzboBAv8^oDlvl zA3h$w)Y9G_e*EjZ4}a0pULL-9_wrCnI{NV9^zFNkr$?XOzppoP`1ZwzzrDxQ6H?pe z;I8jGf6FGF@GQ%dXonO58Iyg7Cx3jbHQTvCY{+{ZO(LuacrwfL2^AA|U`YWUUm;dF zi)epJceHn*u+X{9CQt~_P660t1oQ}^4#0+EXdU|BQu`lflY|ujw8MNNkqQx2{XkRK zkOaMpnd7veS7SWPQ2_E)N~aMpPGno{7V-g+=eJ{=ZkUcbHxaBEt#cV(vwx;ON4Eto z!ziK!J24D?D!GRQD5K=5dZYxAlmL;GAFDaX3D8T4dM+*5IxUss1JUNb5C0*kU0S>? z6}*;|-ebd9wivu^?JLf6m}?zHzYA5v6#cIK4b<<-XX$r6HhRb67Ih-jJfb?rMV?{^ zvb@P22oCHRRZ8&vJ)fZC7JpmOJWD9&3mb{H&JK6>;{bqUS`Xqe{%CTBh5i!VzQ^O% zZj09*a+sbkd_foCg|T67lE!s}DjzqPr>LL^-4m&wBIN5#3x|%4u1vqxSPCu;%!&zd z!lb~}p~b1a_v&g-xYkzfzZsRu%)foLbgd*F1Dc4sO{V!Ptkr6dBt1*rZ0*iT139ekMxHn<_ArN7M=jHV|a+G}Pt8S@y;8{5eWHi&`W{giU)s z8W9Qeni8LtQm2Da2z5hyP$T}RBNClT2QUM}nxAr0gJ&DQG(=O0>GsJ@Zab@TetAsQ!PB(aM|KgI!bm&Og42ItoNJ5Y4gd^xOk%uc{TAD z?STaYBqJMVEg5T#f}hs>M>Tus*07Cca|S1Wl7Bd6-~!dLc4U`C@xo}XW>juQ&<@*( zY)+Tq%we`~G*2v}QCx&)_U`eHLH&>c8IrYosg>uiUUa*?ck!XnPZ77NsUlD5cQC(l15gl{+pbkWiWPO@qa6X#?GD)%eW@Utdhx z34fPY$jWIe+TEc#)%E1HKJSw8x8)puzaHM%dV6Oy^{d6l?uqbQLbmF9-2#peiu_Tf zlQjk~847ph5nf$=qRV!lbjt{3uUaW@kRdQ=i}f#xSn|LRp}I2*q*6UFyG15 zs_l(Tmt)-3SAoC20==^4oGOzBGL1cbGmj`f6DAPNSt}Ex;BS0NXPe2+_1sT$e5$ag zoyz~pBc9T%q#P%@fP%Z`uPD`#_kYwB^GS;ZT5k}Q>k^~;dtIpHyuo|k`73Y`*^Og9 z9aQVw@USl%SBloU_=xx;MkGXmO6P`l)^(~!+uB^+axI`wm6n!RBf~I72u^E_I%l^X z2IJEUs_b=G48t+i`J&(*Mt%*%HP57VI_%*CMp1KCfpE!)pR>YeOW~8%_J5bLL&AQ~ zIg5Zoi0DwUmJl}ykO$!3kmprKyZ863HytRhu4<_qGKyn?wFPB<6Bh4bP%vBQ2M#Dz zCbVSIcR0)xdG*uQ>`0EeO-Y&JgR; zJVbr_p2F{zE#>yRUvW=+V*Oc|g!%SV75eI1YRpw=r3f>25s{IFLU6t2O_r0F`_Rca zt#8?8&H7kYg;icD1)GN9l_}n2M}R*PQY9T=wpJpcBWB13YLXJM{(qufDcaH6WuAVx zaN2iXP^iVg^-F=iOgT!BN)Ip*;RjVY3Ep%CxkB+Mjc37HjHse^;S(sT)?8b3Ww8uq z8Gup~R>Hi$0v)c&QEIXTQOahVtxcRW%;OM^)ZS*J2rVGHDJrPWy-QspsqBCEkVcCXW3z zt*C8Mw1R^Jq`wXm*IYL1I7Kzfl`{QcRDiQGuUJt)r`92yeEr0pQu%=vSZ;7@b-=55 zvFJ^;P;^!q1I~h9l3Ah#A!Jz0HP5e9Ua-{3UJ4n0Jx?v8$ZPzBo<6|mYmdA{Er_i>kGzHNmmYZ~v?6|j?^hoA zPworpU-0>#9)J0S1B15z1fQQg@-ugw^f&nY*&~01&mEZZU*YqQ9{Df)gr5Hlpa12N zzhGUM#ec)+U(kE}4$J}mMcT^U-lo6z@!u`_yH9`OKYR2S{oZ9&`b+}z&*0dB9lO9& zi3~9s1Hs>7QXrN=8+d^7F?|t-3!g9(WiyO9Pv9SF#D7>P4@>D~({Q@!ptOR9mEtKU zzy| z#ZgouuUEKKAA+RRr@{*^Vn?but;8AhE055u=p(wUdxorH3|JO2R#M=Z(~Ai@Y|>zZ zBpNeD`+pRiDhUIb;5x@x_XMC*2=}dODF_XL4`u)pI*owG=~U)O*&tb6?FT`SbW@;b z5Z(;vGF@Q(!=#Eq0=La{+aMafQ~FJ;{c`8$IGPdO}on{{NN4jj~Be18r{vfLjNiOUVvV%uXu(e zl~`GKqRLqKc_G!x7Y8df;Rz529N0qB%FdyHtWZu%;bE-Y!*F=%s*1|xanvodpRyaE zdVfMB$WH>L&T(`yRR;+4Q#o}#UrUKBWLA|AwTIAYL|s@-x-+!C)iE5ov<4jFa;g9fQ^TrUwmP!~OHB*ifdWORBGOrSGh4RVSs zA}Roxa3u0cB*&aHOsLzjS6Qy+oU$X4x)y&j6E18qeTAHgDuAsoBCcg13Ljw_)$+q) zEpmL$!q;>GB?BlzObYqS`FSm^D1UDgxVS>qUwkSEq&cT&%7yu+$Xcun~qA zyjl3gOA7w7N}&}hO+a1)kDFejN>OWYpY7G}O5|ZGuVZSnyU2F68U%pzyqcg;L(Fd= zL=eiIxrs;RrQ;Dx)@2l5T$WsUCJk&T3^8~c60!hFpmQ9`?jcMn528xlAb&`Y%M(A+ zFLg;UmFlzb#eU7`I!fWK1f^Jw2 zO*-)N>z9Y`{(N-$_TA~rzrB6-=JkuyqmO_4>2L+jri4-}KZ3z?z7PBqy=4pW6_gV|Gh~3lXnse$P9FV~sDlryPJ=w|qeGl^;Ct&gqn#kQ!4UlEw zB5zpFB6>8RqCE@U^uy~bMwoY~9HZm>uokWT;7~UYNsKNivYh_+ z!x}%p12KS96F@VblwaCY*Cx26r`)!Xa^~g1%1U)fPPw`{`=E~ir7chg&2Nm;!E;&c z4C_!$m-W>((*~< zSh?XSE~$Huv#3MQtIrM{p_QU9;nf(3;Qo%kk59X`!3i^N27~0Ik+~qYn42Qkcu$)P z&Ib(6GY+Bd??=K_ZcWO5`xYQeqK4{h6?lFA;oE?)#O5_B17FJq%7Mh^B)9xA=uz*B z42mEjCsH_EKz~=CQ+EHjqqtoBh{caWTvm}Hv?0~KSzQGZz04e2-a##eO^(v&f2AnN z`>}UWOIve%{(etW|HP1!=R0^p9BzRWcMCXofMb1x_d$5vKY4<#?*^$cTFV~k1#G+U zB&iSe{(iGpty5cVKm9`j%lG7ej{hfI|JSqi|2`4-iGNY2aCr}$iXd3$v&9TmTScWA z46>#0$aBPT9~I>uohoqto_6T}y3Sg$=5+4FcZXlWjaJSINM~+`Muf<{xNk$P*C_04|AhS=Rxi8Pf}S6&BgzO#2`I` z6`>Eu{eQ3OHAe{_ly`YyPmtnoP>)(rY@)I!IR};2mx(6jkEDwPQ*rSDBUGcvg4577 zdE;G?P4Z#nM(k#bbs>Qg zN?TmS2B+h?EW5uHj^5OIyMK8wF>?$GH54$KHL7e_4wWnW-Ed7{$lqb+N zPUN2<|MdR;_(bW>BmcDWof$Q+U}Z>&FS^wLoHe+cA9a@|^wLn?lbwsyt@_X+dKr^J zhlxj+b84@76UO+sP^mflcn7^WG;5n17<`PJ1mR-X<59O_e{g?1nbROf#rf zS!fK|YemeI->7qlsSP!XDEe&c=ZK}Z)UtGRM3Y-)WSve!dCEsyD^c#Qr6!dq)Vspe zh8m*@rJAKMy6XG@8mb-Xo^pgHWiWYD^YEQpG^hnU(>!+ia-5aLToT2^pf^1T{S0YKXLI=#No(>N-N8?Fh(L$;X8brL7gA9|zPAy<0q8 zM2#o}Td7d&iV#7d2TZ=d=fp{%Q8M@UrdYvfu2P(<=#~Znr$NG)j!7)E7?*UZq(We( zR5O$$LtrF`A}Zk!m?`ykD4-8C+)!nH%zrRjSquZ3iCIe0N zVP5|=PLj77%IQBs_16GF>64MhQ`0uN8jqyF-!o_aSK()5mveL~2`n)_C&DS93LO)! zejL-+NLW{Vj12j6P*=3`G3)TB7FIM&;7CxXmGr_A5j9|pS~YPBIUT0d0u+CFDSuk| zN7F?9fzMF*=J^kt#XmZ5n=i9bw*w$m)V(arap6CCaslm4&ftDrJ>jpZ>@VQ$Cvj0s zqTRKgeF#QcRUa#6wWx|y9yJ&zBC32sM zD*4lh75E?-ZYKsPh2BODRAKI{Rev#(U0Y46h+(S;n6{~2IIdR-$EU_Rx2;~?g_qC? zp4A7j7hh-rZI$O-L0i?ime8m;^PJdBHY!Tjrq<2h&u9Uue9dTerW>QkdtQV|0*DG2 ze->HLu@v{rk!e`etz{dO1r*?tgnWn?iFLquk0VU-R2G{plF9J#bYVXLXMZKXy&FYI zR7RZ&DbZm~hZvU#;Vcm1Uo=A8p*1LAl*Ky~c2MY6WLJ@JE?iLYHS3h>uuq%zp(4^7 zz=k4&Wu&aYt`sOKe7~3-_hfPz7PMV-iXu!Ez7iTwj8d&-k{Gi#7k&a#xHT^l89bIkGvJulzt&{Ma77&^*J-8=% zBAU7oY-z0v)0dMLogsg#s)SE&LrLrXniG69ZYO1!XD@|ujT>I~jg6)(dSlm2VliWr zHNc}uFAv<>x(R^7FqCjN%CQJXw3=0&94haoX{ZJUuZ>xV7EFFuq+8I7PSt2ghWQC$ zHjv_UD6FunBS&S%zBFZ)<%C&YqPaUN?EqIC>>PS zHM?4yM$*%;>@}UJ*y`8hIV zElTK-8E7)~Vw?#=UE)C*i+YgClRlmp7}fdcASa-q#13hjBusMbv}$JY9Ao_6|zBCYD7DfVc5$oui4Tu_@Si(;;l)EDuaR zmk|fPG7d@%D^D;cl;PZ;O^=5no<?hV!JR-VLSDWGt~YBCFrf!$kUoblXEn)td4spb2UTvYS%>3$}LBRijoYS z-QT+zDnPv83bNSO2b_loi9N68uue4gKFWuhy|9=GR68aeOp;ec-)vqX5=08ee>#3g^UNli8okJfe=RDv{?iJ zH2}&?G>R%t>uh*juVZUjr5@*+kXnHQXjQzWWt(@^h!9&pgl`lCt9c;MXn$TRq^dV} z;8K^8s=In9W|F|<%;Nr&1uUxfq_%aew#7B41dXcm8K^>uQI4n_eb#WIIcRoq*rNpX zbZQenk$g2H7wS82p)z3fQLdg1j;>@nb8%GT%Im|kdS1}t{yuo4`}U1Cwngvk#C^bG z@D|Lq;K`3$3VlHvcvPM#qJMFWvf(@E=G}FapC^#6#b6Mg)%YP~+K=6gmnHREP&ulp zX(gS@zTc&X#qclDElgs8-U4Z5pqVCUEu3YeTOwKM^&9Rxt0wNz*2!d5>jO2Su22CD zO!S2kkhFd;IdP&N8F6CF{We2vXxTG1vQI4czuJhV#b0RcZAS(6fq&6gkJ$=sqUKHv zxp*6WFK9;U+{#7Zb|4sfBsKh=;iaS2%7g4_ss^gMV|sZt#k3S1d63wyu$ME_381#( z7M;BukvTJ&hfR{^j#O?J1+h9IN?8c6A~3;Ia*)fjL=(~^ykv;9DR<* zWAw7dgMe}v)S*80DSt0abs?~3_XlB><2bgM0!K`n(eBSjD9Bq3#;?M$t1To=sU!H~ zk~FA7-ru)rL7q%K^frV_sFtx|Fm@Q*abE)W41M^hYwx=)3mbivg(ZMLrs(;=^i!jn z07&f9#iv!v3UwkQhY5+&Afo~!ep*&~Q`*;5H7T$(R<(iy5r2JCi>WCF{Z)o42TGSS zXUhpa=iRQeS)&JZg|PtgG#28rDQ2n=-AT@v)h zZlO=};hg3-3VoUnxlLfyppC1EZYpO!aNDCc4PCvON1o+*c#9U%_!maUFaVn-DtVkj zT4Tg)l-k_EKYxBX1tg(5`(dV_h-s+WGx{?#Hm1~HNRIW9nHyCf7TSX9LWEgL&t*;N zxx{~o#`aQOZ8m7?mw@x+h8)v)c-OpT04Kwy=+sH6Di7Ekzm^M|PUx6C!c1s{e9=^p z=h933>6%YXrp5&mf1$Y5N`WbB+T<8b1-7UL9swK5lz-wB@h9E3>R5<|JztKLDiQLU zMCMy|s(@?3w-)VL;;Sf|l%^P&1I0TG_w8>H9^$(-%1x@6^Yf_M^ex%g1W#b2o0O;pV2a ziQSk2o>O=2s42f&rMeATeCqLAQ3s&DbZM_%EMGp)i{Y9Ds1CZ*I!u!X5)ON2?Vgm7 zRnC7@Wwgp8P}!`o?^$&rMK)XEgNA5dHg`1^@qFF!jj4*n3mEy<;c}qTVj0jFoUCaa zvwwZ?*oSKtXd7?40=22fCwI;;Ca8C?z!|aB){cuUzfp;i7G7solV0&NZ_MVVbGZ5j(`n~NcDLGouF_(Tf==0Re?$A5wfbh12gz3NJo^o?27c6}Ka z3T>$-31{-!^B!-Xy6Duxl3P!%=+5R9%YS|G?&YDd0cXv2k@TZ6s6W&yAhzY6f0V)} zYmVm-HIV{i7~ zu+>;>Jx-}}`^XMhXc4`Da;T$RWQol;dRFajG(1Ef@TnF()7;l}oiMVM7SM`V^nah4 z^n5Ktw#><#wl=FOQ{GW?wGFz(>Z7Yp<8ncWA`s+1(x4`Yt{*gy=$F6jGHLC9p+*SW zCb7@Ip}RLK6OaYyQzg$O>>V^#M<+w350fa&U!&mpI!x%573^RsQ&Y0BjqyJ9(C3X! zOqqTZ`j}D7CgRFCMLh?(nT&Dh3x6e1%8OGy5zD0>cM8D;S+$W{%r3M8YrnpIVr+h; z6i(+VnAMPVZw9vDhY8x^1qUTH@DAn5HgUV!I5&|HVFnLVthe@q{O0@Irn%sO=^J-;Yr`GxheF$yZm-Zfv z253E-Enj0tj|@V{1UFsku76o#G(<^yv1l;QX4Ho1noCys;%U7!8i1)3fyR zC&Pc*Tph7WP3e}dq>JS_NPAIM_!pDk!4VbMqkK*iq}zyC>897JSEW1Ao#E$K8$=zF zWPd(-_qKl2YQ1PU)2j|tF%UmcBq@U+1ieA_G^#z9rUAw}7^L;~sec=9ZUE0|F43^= z4$kI>lSYGRc1sim(fvK%0vX++MDYpt`h(E-ZyFXZiRz?|Iu>JY@_&#(;xP|W>W~D`2cqae9FAVtyED21$Y*nFOIYOv%&9AQ1;@7=*{k2^j~& z2LH(ehpj0-+l&vy3rE2O@zGf&HwkWW_6TW=W z)j6F^8EC!&((pP4{xHk2s5RgVe>U-t9qJ_(At4 zZW0o^=OJdQQWv#7aoJ%`mE$Wa9V;uK446pyf~y9+L`gY`pLilokgn%ppHP2E*1+|# zyrcQ(Y=4+tje$u=^8$ACJ2zp`InO5Ph^rr9z&%`=u75Kn$HFgAm%je502ZSlD{OC7d6YkuV2C4Mb(zTMfdQ7@Uqm_ zKCEa!Z#d@b%;4LRY8h)aX=f6r5mPL7*4dZiJL`1S9bz^Fw~#&O%ozuH>LwbMIGlxF zv0Fh>jSVC_1{lBTZzAGED8IFg-?xn4w|~SyUo(CmhU6Oq3gYqmFeKjyK5g;)8W5B` z%vEqV8C5JCkCR*WA(2uQS=JJ}2B7_GfYS8`TMZ3R@e2=+GqTu5$>*6g$$$d`2#;bn zG)h`1hKmH5GMMT|rhqz0oLa!&aTV<7$!CRY{6<{OoVvXI%Z80V_b|bIY4e9~ha5c;U zd`?6;&m;K*!k;l=rR%YHXBKzHynpqt5(TUbt}A>{qxYG&E1_%}p1n>-(HDQcU%~H- z?(=6a{_@8U?>@bKd3yBvzYkB3KD~ec?!(8!m#EK*!##%~p``Qm)y1jSTYNv4x8q#hp~v8<-AIm?)7tLuxoPrxq_+G*$JMrIvJU z;_~rKl&Hv~pBaepS;Ytm`JW!zeCJyWz<#wDHI}ZX+!2}{DC#C=3WuB~|)w-Gr`PpEAwMQF9k1yl|L z`Jh`o4F^S4IXW&_WyPV0QW+ochCx<6;0>z>ym62nCv?;+~<#Cwr@3HOaz`++1ba{&peg@$xo;MC)OM8Au zwIX%%XlCu9>@b$(B>uHUHgrB6s7LIQSk7Rq9nx#K`-~JeWcIsDf_O;~FA3srC=Tgw z?juQ@Gm`l061`_(9)IN24wzDCc_nUu90cn?=60_!q&YOp6Uh94gMJ|asxUKGhW zEI&lCgPPq!<<|*ssqypRhZ16WWZAIR-B9aputydlc&S3%Du2J%oDTKymc&%~fI8Y5 zX^+--k`L%jQ8^~H6u|)9z9Sl8@wDlMO0yfs@2M$QacZW7UmU;R>k+l1RA+ZAQmBZY zTN}wNPfwGDGMr;dheMGlf64uV3@iesarX=bb*NEzM6H^+NkQE*0OxLXrA*gEHyEHE z3slv0#+6iKM}POQ^|F(3z2v8{R?Z&Kz}}`cf`Q(sQN6)MsmyPFlF}M)@|R}alyP^G zHt#{*Q(@~in3fwfHpARIp%iZ43RZB=y-*6bZ-$UX%wmoO+X`!`tuFv{?(44dNC#_9 z32X1p74bzSvM%rMsreB6dD?@2m_I`5pE>9WNwJF|8h@$U=&Se(FrpjYn)7=ugO(`5 zJBV1!BF6Xf0HT?%rLsVy+0DLe6hMiMg&uLZqA#v9#zvJ5o_o#(d~OAW~?_yWNLHTWZsu^4MNWmYPatgcikm{}KPgp*Edq020f{{M-^GDXv+%4*Yb8 z;o~C!+mLnoV?bS68mU1F+$8gs02D3y@f6ObE1JcqvF=iDs##rjqE0@A$>Uu2A0&E$ z^9IBQkSQ0hXyoZ4xO4LIYW(DCyyf`LoA+C&Ux*3k$u%Ur`srt9N<_6+d3N<4XjxNz zOn^7osy zz6wMbDXw(SGf{_ye5`_m7H!IS^N9XJN| z>g2%x`;)&vc@pbwYr)r;LF$`};j)OWGlz58G!`PY@r|R)TOMS{?0BC# zS~T%R8y9LDUR{%0TuYRh?QH6=$bTE!EAsxP_KLjU$5-Ui-QLG%ndd>v_B#?6IRS95#ZjIMMZ z=Zdn-ts8=25gxp`w(2X6Jtyjp?~vkC8sbfBbLMe916v|Bdb4G8U!hrzwSNxFno$#Y zH0qEoh{Uh9EW*$RiKScy?#9MQ-UFC z;EzKo5r?Uz;Ih)%p)_&SB|C5m;ciA(XA#C#fGr_8iKPb+JfqYJB?G8DsXgQjD}`of z(r=g^phQMw6E{G(&wp$U8>82ddKoP~V4EV5DBcczUGHV4c1tA=AD~VUK2o0*Spv)Y z>BCRbra_`^u1rIv8T{a=Yhv+3B0c_!H8K5+a6n|i_?6!d3mmP@?1c^DX=c`4VJPS# z;uJ0@-6)8Dd!jH_R+_q9gqM;*^!11_op!)T~-K^)nu z`NW(j)QRbS+JA^;(NJNkDVuoYD0rdpH17f`AgcrcB$r&jKsUl{T6O%R8A(fAMHn7J z`R^a|Y%(VN;WmkK@v|T-)C|K`qG=W(rdy1YxO5!?m+yI?848o?JQB{G;(8Ja1>T*X zbHGNJmK~v(fK;A8h~k<<>*jsX8@zw|PG}XqUt9Ag?ti=E_pne2`z!gBH&FD=)90e- z8(Q@F@f#@eLUr1w0h^t*;+8DaZixoSo6|RYFDj!%Dd9p$d|5MGY_9 z!4ibTXca-_Ud!{?P#6_xZbfz{slhNuHAB!3AM*s+^&hbOyUKnFm)!@3@v{(xZ}V`__ojrwKew0!s< zC?5>5N#17+a+o=f`-L%;T<7#E8+^KrZem7bn6GfCzK_eFP|E}HF6SHGD5T5d_u=Kn z)}@aSvw2P7GPnNjcirZO=Xbx^@_@|KqJL;YkItIcFq?Snik^c8T*-iLP1wGLXnT{p z>1cAFw?B@jmkCAL3*9roMDYzu%f2?KvyE+__xiKh;v5+CV;C2MJR!325o6Hek9-#<$QRlvClK2$kTK`*qHSghn-%IBFjiu(np88p%djZa5+A*k0M+ zaMq*iNykBxE(^tYo!unJGo^k&&x;`O;WTEqr?gxLgF##rffJ2yqr1XkpWZSo08n!L zFm_0@X-PLTdpC;>m?WZR8%VN-Tz}cWL2O)n%dq>9u=U-ybFMm7={@QLL+45TA#mEQ z)_*xZ(~#hAqzkpAYpK0!5zgSZ*oTz&0ej#$8~H}G;e6+86dTU-Ew;elK_k$!1EXhv zD%`G+KC`3YA66nQiJTO9M9XAIX$~tA>b?mgqqMwlT1cMY-=Jb&Af3dZ~G z|JOx35|HH4EfSkn>C7J>`-%SivY+u++0XBwfjkY>?8!Jjr+3#E*%%g~poi)Q^kb2u zkfUoO6u4H|Jg|M#7q-@1+0^C? zOgn&AE;U1g&1-n&QnRN|46#{z_n9F#dqQHfl!?ul`O+bLJwvtv6MwRu!0RcJ?_9|C zBfP)x{5M$lQ_nw!*EgR34s%1lUc&1;&wp!B5>-iCQIWJo3nXoT)d=~SKMvR06eJH0 z9g}(}W*F?ngav&81V6f5U*AC;8hmUb@O!JV9nMkoqQrBF7YK6kHGDmW+~=%%R7A&C zs@@1?c)%$azGyB9Cx79TGZSF(di~C1bF;$`x?wo&P5Q8i!-WnBrF+3E8liB`%pwaY zN4i}%x4OS2r?u>jEWyrkx74!g86gMrV(9tf*-VaBvzOAgImO&PXePxWrkzk4lt&7B zHgm`5I?@Y9%yq&!~3;xPLlkzYBZZZjDpEDy-_A z71d%mL{1cH571UNN(aOC<@&qJF~FAR@+fd9{BpY+*7K( zhIcgo3oGG4M1Lyv)Mvt#!&x>Vp0y;TuuZ>sg!Y20bBoK$v3dBF zGZ5F$-hYC^>iAiTi{rPTtZ@P@#nlOfDsU~yzk+stGUNQj`uRc3S}ejFlspL6x6-uY zck;$y`tt#7f$1agkPXP%NH6sc9H%c&-cV3I0}@DzNUcpKiDG;EDm&{Cb;TmATwKOFS)1Wz<1#`f_*)w zHP?>HHHcE$&ebftwJgYHnO+=dx3u-Q`3|Tp?0ook)qRZb|DCRrlSuXlXTC zV_}7C`c~AbQ80_Dts?tY2_SQx606Oc!e&j?W<_r)@*74sPy2p?@Uy^6L`Azm$0%44 z+$8{GasbE3@8eEPkaIyNH&>){1b^kD=h8n)Bz&Wc!whbdPHB!1?veST(XBk4`oszQ z)ar??>`IQ^*Q3@{75NMxAp9eBl$x29{Rr!I6{pC4#9xvQ7!C=mJ8qFGTFJzhvUOcU zw^Sldz({Tlj3oA*pAgMzBn7dU334_YE+sZU7M@c*i!}u-W9S{tGFW9LtAF10b)tVb z;ltk!e|UHD=16mBTKPi&;P8 zMXYXha>BVFUrd+o+vx2>Z``2iZVqc%l%lRMi=i79)Goihl@blJ6Vc?ZWxB;b){Chd?Q&*0P*{zP;~`sZ9F|$ ztpW<}$odecLsbh?hO9i6{9Iy-oIaCXpj zD?r>|qVQ7+r+2VO)~RD!$tVw7_}LiGXLgF}!>O*2k?{+ayU9^tK42umGUe_(h7Wpg zc#@rO@ki?ms~YRKqkk=kvnnXQuB}yom_3djS5?vbx=>yr8!@8lu^NJMK~pPy%`lG0 z!pL|+O1`XLQVn5MwR%^C>y2gX8HV;N9fanmBps3oK0bu(9qHV0bPYUE=}s>k1IDp*0*g6V|H)`;<_Rpnn?CNXRUU$&d2`10Nbj z)60sOi(54$L2^KIQi_q)9u*cbX6~w&<~G+V1hx>szMIfIBXo*e&`+%ps& z>J{H@&QW?fPJd84NcF{-_*Wi$S)c`tIJH)cDS(H~J&sYAn!Y-JSktm=O1yJu1710F zVqv_h4YB*G)|}Wj^?sCF+Z)X`1>mlIR5-uvq1gvrC%%FnEX32rW!&yq`>Si#TY7E8 z{I&O8&$3_y0=cQeIg1lwLqQvZm1`|2g3kxa%=$qKGk@xqVa<1uwM?(oZ=!LUhqcno zy*hq(^y=gns$;F~`N(&7vQ%fCB&oeJ^rb^(%KE^6vPTW(Oig{HT7=(@;=oqxJFo}) zwbZ8t<~8ag-cVt%27RZP787zgWS(X(cLP9pGm(t08=kfGmF=YKZxR?N0taV^Slf@XZ*Df6QE$R zxQp32=LasVLjc#a7Bi0KqBC15yGV+&#w3s@r`DDfDf2Eal7Et)3u}+~l<+lPkn2p& z;_`g8qr3Q2FPNeF8CY^Yme!%~`z2?>Wp~qS;eXcnZ{gP8HC^QoTW&Y_yg9o`haV{J zNBp7bT~Ff6X+GXc{C`4jI))$6FC|*@yT0ad9PK# z$!h=)uXW(5DXVij38C~u*nsUMTgzu1l zOym5Hd2Gz`16WrP?v~7gWc+2sXw6Z@q<=pBhmNMlt_{3z469q^v_RY;Qamf-vKj(h zO{y!%S0&aJx2ZK=sl4uVQ$=>EiCcufQu^ZXrd$Vv_=e(znW1Y*v?=o5!F>Hb-7L=nUzr)B~iorTsVNUrLkNyI4N`LEz zg>VtKs|7S^P^R>%ShwTMmo&4)$`TJNa~UR^TxICU^OFpLsB$iuI5Q^)huJ$yYRcq zEM%BfOfATU8BUjl&}G&#hEx9iKYt{Uu5Qfo|L;h&|M4{x?VrK!Bx05ZS}0mHLy)m( znS%caUdbw9v4X!}z#cX@rqP1%vXGO&TFOO+CyZ&ub^bA+E3DdrkHWPju`3tV;B{D7 z52>@?LQnpcyfWl`XZn01kfW&(x04$tgL~&rdec5yWEf#g(HAR%mLZL32!DwERXDC> zP*7^Uafce4_`uA68)BkjL3$u#TV^ z!mh_f(f&8I_xtL~@he#U5?79M zGg7psS0)z{=w7xGGjRa<}GQ-414HiT0drL8X3{=>mpa=fUGQ?G-+14E1x0 zz$RZc^BR)_i)L)sQ96yrBK;(Fb!(g|D^?Z2FYoCKDbJ3(dD`K9{tB%;rdZahh8qWyu@>82D zwrWo*W3pCsQqASL#(aq7lAW$97Fi~yHsZlJj&ixK*5$YEasxIk*ymav?LfI)RHu%U zrY5VY-*FCJZGVmR+^c%F@CX`Rvz$WRsi%GrAJBEm_UOJ>YpXAm`X&~}asVv-wiK)% z=tY{FT=iZTx^ne^}Ob>)S~BuBzBhZUpn?&5z7DzJZgpjE>n=vukle}|K5M=a}N-~~8}IkmV?3G@oXg1Iy{G3Z+) z#8;aAm#cgVls4`11^pDqW@Upb45?9aUUdsxN5JjM*f1463F{c_>v!ThtgzW^D&viK z!!f5AKnEN<9iVj5Rdb8Hgr#%Kbnh3a?LWw5{2^B9sD^*w)$~t)jxT;HOXgp0ku`;G z*WAPcXJ@k+lEccJ2E*1%>Hln|G{CK&*DCGA;mak;n9Nt913Q^Ts8?3N&P`c1KNjfl z(77thNfB&qp>O*H>m!woE=@q}5q9v`qm;tEv1~ zY2t?)#0ph}%DRZ9U-0%(M8FzDCvRKS*9i&SsY z;C9tgSd*V>P3n0nG>-My=q>7exoQGy@4D8WmZh$gzv!&$jaKuWhxX(}9jIko+Kr>} zLpy&0IqhA+53Dm+t2%>OA7VYjrD#>j4;P!r0uAKyqXB9j|6`f}en#%+ZX;%q3XR}? z(?Yxm?LDgfQT8&rrSAFnxOn_%ONvtoMJvff`5|%zykDwOf;NeAfW<9CfP6BcQ{u z=|e_BISq158v_B|D6_`@E%Ryoe{m^?@g$Fd4ur*wU~zf-lxGx;3(S-@MpNVyH@Mg4 zMmB2PaI@oY5n*0y+3%nQZs4-TH;I;LL&>nKo|u8n`< z#T{?4^g4?RX_u-TeY|+|rh@=2z)F3{m8_4BL1EQA(^SdO8mmB|zg1sXRb&XEXS1^U zj;_e(M5ZWRCmrrEsKcDXBUqD<;XNQ9YoZtE+{6Nx23IJX-Ef#7_abgY4NTN+-B@j? z;g_*Z!L=f6;}W@rmwGDK)t&<#lU#paH}FaxW67S1^;nL#bA|_%Mu2S)D22@oXA#aH z9%5d+!Ci0PUZJ?XYyf669S?E9VqT%hw7{b;LOmJEW$2FDrzSk7f)1+=dcywZYS#sGiid76?l%V|Ng zr-m3;5Q_`51Kz^Cq}6*W*v6){y$CHv-cY!{x^H-H(g7BlhoG(q+A;?~3r?VC=6jGc>*V>Q}aag(hDz%|tysq(@etB)@H%<`2$V7f>(TV!w08 zY;7$POY+?)_vjL-S>Jz@ONxDruvdJs34L7a&JYd$iMGGlK{1O~SSvo-$Ht~)KKBPJ zRA>p~MZ1Aj8A;a`b05l(X;kj5i7cuLYlaBB`@!x$Ge6i3_ILgL{a}CJ-+vP9Kk=Wm zgC}kO$xiTO$A9u9c=E)5+6tbwY-R~8h=*yAu=`c1_p4IxSEYa6FSnH#qsHnUT1n*Y z7*%3fD1}Lwije21Wjchf6!P4(0aGY{tCJ~Df*Ih^=!ylA5;y_OK?^ z=&bswZ&5dX7s&{e(k`FkgTS6SB5H zdg|Rr;c$uMYyf||DZ6%5+XDn4Q@w;jYaMNSz!nbCc}>(C^h0}o_@e3^VZHH^%0^V# zs2^&X;8l9-jl#^PbDR4SpjAyCH5l$~EYcNQNCVg5wF}9KE-O;Q0hB+}2iNki$VGp?pP55eQ4fSD#zqL$ z@mj!a(>QS}T>e<5f_N=cgV$nQx;Jp?KG_SN>~Tv!x-{{+-1~Z6e!VWgUYEb|y4+<( zg-`Yk6B0BM(M(A27QKR7luStexQk9Vt>7k#H8a25zef>VFm5W3C;trzJ!XJ|Ivf}m zacaK_@E(5{@SsIk;`$RueX{EMnZQC|$ROkTnW$sVmxH-S6`;YL`T~kO{yi#s)mc-6 zxnJlXU}l|*EJG?#bLzkXeBp%(m`znf&bTK$GS-jO-Q-Rsx*}6ylA25pg|3V=oG!Qz ztE})kc-{@3?D|jkgD3mK92=<|1k(F|w2}3n7P5c;Awb%8j0=81BRH=GS_(5XcM9i~ zkYHU`RCKPCDpS81CoP5M3*kdB+(@F8nThnRLMu~RkR|6YCGUx8Uw36lzWlh%lUH4w zhrPaUKa830uyHOti%PX!R>!9X&QwSF6mR*3^4gL=FNpb{)kVE=FYkNCya-P1ye>^_~?_b zpzbR^`V}Ajjriy@gMEV+nZ~}^-9~&gW$b?&X1ja?uUBZ%-10BOwtoTyY!G?MBbN{;e_T=pm4ClJ}`sCo{@!RjiOa6TH61sieJbL%;%i>J8YY&&8s{wCy_H~0M(f%T3 zMONQzCQ(?aGtZ=~Sd`PtylIt%;qnII4cBUehxVAw>;t8h!i-DDNi8#{fwbl0=P7OX zEQ}>Co$J1r>R3FC`^DYyZ~+p`d`T#@y@IE6dqmQR$tYk_j*jI49Y*v#ulRp4iXVvP zKKsgc{fg#(MRUKz^^jC9&Mz+_*V&jvd4U$)ZrN-1H}H?&-uE^f-}tnRpSG=^cJR}V z`V?RqO^>PyKjAFeh7a#vG=4lewgJ& zaswDCs?(uD4P?58qdJHt#bXBRH&kE0odfl=fbt>Myu>pkhuy*@XE~KhVb#CTkQwYo zh&*SPm*bd+$MR6(hh!_%h&nql}1uPUQ0(!v090L~W&ItkD!3*1{*bSmCi9npq zk}i9~YZ>syH4K?vgkvvA;Lp717Gzx*N`u27fec9{5v3A<^DTdow;S83rfR1qfObSZ zZAHK%wjo$(ChSwyxYZVwdSOJOqp@~koMCbUNH1OSZ=>s2ghu{cZqokP9I_z+Wq0pH zc@k}op?^-`WTO#UmSaj(A`F2vG)!`Aejswo#8}jzb#kBE`mV2A60vsFk7b+@yX}9kb)U*ui~2ZF>(7GE(vOD5>&`Vwa;~A7wdUNcwX${T3vSphV7fsT z=0L4=U7GGS&JPCkTJxo@7R3{qiVME`REwv>42-zVon?3dbq4kUAgGxAw>PKivNsxg zRcl%^L)9<+L$^%Xgewfat-<~$5_=r zBN5tp)P~K}e$_-Y$}U6hpoB~_a5p9_0b`8w!%563BGj6LY>c4--9if}!0;#bDdfKh zy>JFj;37`SyY=;{Q3So6}b zuSzM_!%BZ5_O;b&Ikp<9$8ZLR*{$fUc;`8~(By)4v~qr>6r7)8;ZU`5*nB*^j88Eu zoqoX4imM2|@TP}*ur82!blal@H>22z9P z;(=r-N`p!*vq?4SA}ir?roH0KS%t5n>tqZEOZH55UVL#KLgzOTpJ%hGzS>q1zy5@9 zKZSoTX+?ttd09>2K~I0}W5j7vshb##XG7*-)u88KoL|k3e^F6>zu=yznKHXjT7S}7 z!49$!mZ^o4*K_c;#&{JdV4zyrDtO+|J{*0^@56;hKd+uRR-4uVl zIVBbKZP~R&mV+2$$3}p8Y;c`5J}R;P?AKbI>>tzzxQI)!nFJ~zMl?4$srTyJS@zc= zOM~412tQ|!5HIn$Ez@qjd%zXrCd~2Nr+WXN>z5yN_kM2-4U?*F_jS&_3fg7-W2r!G%i* zgWv{E9^x!f`AA%B0r7AxJBwN!6V(Y39e+h{Zle*NwM=C!-|tHm{slbAJt zsU-ad-5Xk!$t3g!|AjKg<;EX(72^+%d~#XjlgEW{`g$*Zy%+xQKV-? zU?~Q)lL9qJ3`==1D#AqNlY&b_dh&^TsfdTih_v^cG*0CP4b?_eWdqIMS}YHmU=)fP zH7+6KLy|$Xn)3Rg3Z$&@1~8frQvqpg*uaF#E;S36Ju^niHeUM-N4Nx};0|M?!0R&% zl9IXy7$b$nJNXEOt}#YRmEnKS{g4%oe-5-QD=PK|DC4w@An}kTV!n59viklhB~VpAUnLl2(m!EInCI6R z)y^R81*Ekh;bap1gSzk|B($1)kaQYfC!25)qy=*f3LoF#NBCr>9*2MT6)s(HU+@U0 zfz!k(xwzaU#%JTZ2K(Y5$?FJF*QP4Z@@@VXOd0V20*A8<`JxBCbN|#o^pE^c{)vC) zf9}uy8eh`Ze#SmMpa(ps-Ul_{!JXEX7ygg_8|c8mI_S}gLBocRA3Eq$|GYA2$(*aT zi(fX0LsV&59}w)(#u0yHY)~CqOFee}edjIy^!=V-a>CAH516JHlfLs(KI0d`LG+#X z{E6}_#w-+2FMSw^;#<|H5I${==-c91lv(r%d z`?z$H(c4&Uijlu+OfUcs1QC0!|Ds;CnokgzJlSKf?IyvfcB>`cxAAj(TYjg~?LGOO zinm4iZB~9;l;2_RJK}wpz3y>?c$9eyq#WO#E6ff&4&`t z)FzJL{0gw5o$-H1ffZOYP0mqkntfXiUi3V5&?4$zG&o**#qi8r4;b1TfS51(^Lgi3 zm*a>VJv^?;d&C#IvEMCGYN@KUSi^2rB5uL${F3bt7I}$j2Ec@GXR3{ld0$4 zETWrOl-CA4uh+$9WmR>R=`$vWs=a8&$TdAS`MRPlfvuq&PkM!}&N1uUs`*=A&oLqe zRAmfs2@64RPgp4SMOwu`;~w`)7UUxtVwg9;-C~z+QX+hlp>(>|b6ft6tk-je45O+K z!jlntp#Og%1j!jQs6e$402oe?!lrOWW()6=Ysr(h;?I`mfDI40!6W(kf#dh=vIx(c?~37Rcp7 zbQF2ire+eQ3-oRT{K5qO?8wQpx1)i4M?#BglcRqm9uF}pd#zcC^-&*)Kf`vUY8Rad za@h#EV6;!~i{Ev6Ur4yRbdsx*`iD=qhGIWrvTLaOmrVJ^?=|H=C+Y7w=Rea8w{*U> zOYjkMUAdeeG2h0e|0Q#6U>?79zG>XWd0o@4+8?`Ooz`-}dQ|8=&?i8^Dj5x|a>%Ob zawmVdUf=8d#{vMDrM5UH59+*ubuXSr`zmVaJbK-XAJ(Ks7e2N@No-YbNJ zt=^)iXZ z+2w0Q$2Oe}f#aET%>&Oi1ghC!g*3I^_y$nC06A;W4zzj|M?>274?aDs`}k66x-RVL zi}*50Q*?)(jT%EL)?g64**GeIjEmuQJZ=n7ZZM|62ZM1|#N^+XXT(mY_D=KVyJvrc z9A*QOX~I18P|>FBKWaO2qEhlq320nr!)Uyj-NZSII2m0KXE)ev&t2WKW$y{fS5vud|0Bwf90Tue@uP2pcpPu{Wty1KV026a!NqUe%V`M8X) z-CMv(nEexs<6|u#LF~;-rIO7xnQP%CGB??u~IlOr>rU&!f;XGS!Exf zQ25Fa3ST``eeqO^UEWpn7vBl}#qHqfw&{}hS@86k(rDcIDpdX|RQ@Vd{%y)u`%jlD zTkSHbD@sr`u`9}C@8IC*c9SUZT_$zV0xwYkRMy$z7SR!gF}N_54p+81ECh}<}fSiw`NrCPJACQT`Ifn^jdYhx58V;0~EYxEl!8ht`R+wwd5$r{|!OKlU`AchgC^k$B6 zN(0tyk16LJ{=sfaN3Ik)`D;1#tsb50K!vo@qXRY_&AaKj)w_S`s3|d;igQzG7>x2Z zW+4&e(oxfFmJ9by+z~3!>#8n*({V2%i%G0&m=xSE=^)fSI(3|DZf1eXK+IJXT%Ut0 zpwj@KRf)5iI}V+zWH^jdKB(bB$E!@Gl~xgoVoxZm4@jR9I#>U%G5Bu0*q+L z9liAW{!lX|!~}op*A2maUDeR#MexqCeADW{>u3#qi}BMttZ9g<%>Jc_$f2}GWpq_m zk+SqqE5I~yhuW#qBZMC;^0+fpa_)!vmi6uzd)XQaBbo(ujq84DtGla2yBfd%jM%ed zp_002bmoL+HzHc=5zQZJ03wny8qahrj3S(#O@QATrB6=8)fshh|XA#S!57k7tOVA4o z3!u1{^qGGV5Nt23N*NuI*&_2}4U5DGap6odj6mrpOO0D4+w^gBZ)HD6Z(Z}io+F{gt;J(~i1 zwZ}^B8>0u9d$Hygwz?U~+iQ-;Kn3oKO^tOHI8}dYtS{^9+&wTj0*6aH=}CYaXs~x~ zvI7q1{yk6<0sKS1c>7O%ix=y9+@77_*^XirtcuuErH-=ZPcjlD-s|Cgga&ae)>+_a zFX&o^YtBfW8^^znk~DDeuj3cVB|PI_NAnh<;|GK68gZ5=zk@pDGfqUsclxq!=w1~9 z)5m{;(H;6BW~&ou&uGw=7GnzRhn_9u%hK){$WM5`V0e}ZTGm^Ez61)9@dcg}D2&Hw zAFs6VUfj}whA}auClJVw&u_axUVFlJ?`xQfuk56+?4;kwPD01OkB;hOr~AI#RL@2+ zwykB`df9eAU`XLg$6Jg>T0_wgH08_qOz3~9_E7b^Yg<;uZ7y9`lTNDb83k6*Eu$|T$JvM<#84GgVfr&n@2Js6ZQ()(&`_(vHVUM<5S1q#XaQ^kU4OXF+fs|;4|_8WiP zX^Y$Ov`;+;E{KhrK8@QnguGIYoeg)aPre3N`HEhAMKAu)r~^;;HS~hvA~Nd0ABAny z;tbfV8a#3{{=XVtfOOIU=)xYp`B63%zg;(D{G1h1;WmGx3`T-Ut>`VI1g&Ah%!~bHnGH#Zp}d z&`lOa> z3jcbA|2xGSHbr-T>UhHfjQ@cFhbuRQh&Zh7C!k3s7Nyd?KPJxblgC9RdLRI-Y+|_2 zUK||$_xJBk-oJf$etP^rN9U*SfBf;}-PzI0Fl(Njyg&Tm{OIk$i`Vpie02WP(Yw>* zlehRnOV1t-e|UHD=7>EXz5IWkKfOABcl7Gy7xwb@;OzLPqw|BeFW;RUzhr4AuU~2j z{K;%W%YSlOY5nAsKm2&|Qat^DG3NO5!AoIN!MUo0P$zH-bI&ihc5Vc(6xB>u7i*@` zO>!BP=mp%K-h`#d571)~(fiYI>tHe&$3Mpx|DBW{w%p!_VY9#CZ6$xr_;Wm9`2Do2 zd3v5UC)vdHJd&gU#87?SN`8!nP_T@P5(|!uvBB4?EREIo_4Tz0fEYCskR#K}Uxlum zuhDEanazg2Ih{2P%5n3WY$vu(P8;rr;f8mQT*kdRUDuoI6c)`U)>@msh|Vce{VVhbBFFUG4cV*e7Y7SiNCKT(U)ScFIRgN!v$tLSu&tpP z>+4y!Qfk9#Iux(S3*v4pM|{VpRo}!{>+4&$@x`a4)Ys?c`F3;1x1EA3{J6KiK6t*j z^Tam}&DN_Vk4M>OZ6Ve1+Cpzf+U$1pQ@C~qy*Pwx`#P=`#sh!5_2%^W=tJ@JL$kG| ze?6)%ivd@vb2)c;O|%*xnjeN+Vy|O;ChS;SbDbK1=9BodJTT{23|dEZcV?H%4y9wfH3z&-^Kd4*yJ6hPr&*b$m@1anD9 zKD+7hJH(2T5Q&_PFxgBcyKpPE+!Ghm5n``HZmJ!o3aBDO;r>}Wc-F@Gc${bFFA(2I z)Ot3P)8#lFdl-;HUs$x;%C09v zoobV(-}-rnDGIXNr-0ihq3ILb>Hm2LpmJ*S=r#m2${?$xn=57!Xkd0*A5J+yD?NkI zp=sLsP{^-!y>>>>!RQ+a5LlPdxN(b)2ATUZKnMXxCiN=Q=cMc`qwX$`K2Kc7{rl|0 zhr)v^W5a)OzhTc>v8gJywuT-mIr$cbq3ZxdBFuNF4XmrB1~0Mq>+5Zl2shJg7$Z?; zIH8n%(hYjqfhjPq4*&XETf1J_rw!tD0E@+?&O-fj^B>bVzdPl2t{4!Ahdh|Vb2kh0 zykcvlq&1Cy$<$JIaH4gP^ogZjf%BgjHweHSKr4R|$+zJed0jb}944cD-B{$2#2~(q zZemv4@t11D+|PYW{OxUP*=@b-HkH+6Y8d-4H>cmcj>;;n1k<7&Su{b%bzT-U09K`= zO+49@JKh?qbpZTALv(T=2hX?%nKL=}*P0D2Ts=PaWaep z6d6+@_3V38QnoQsxW>&=dPQKCfe0qPC=P3pZfTe^# zC_$v>|3Y_;i$4JA*}JOj&RW^p8eIHqYfFEo8*33p+N!q8N^PXxeLn=aP{s``LYChA z9dmF4Y>d{)nU`{{y0sMduU zq&<_qQi+$@#+Ju}kJzjXk;@U!z2?U(NnPlh*`<#HvtV$Xjcx$~mC=2WQ5MgaER{9$ z`x+dz3u-9ES!2uh--uf+@kVk?q*;~XzI=D&DRUyDA%Rz?Z6uz#tE!!+Z#-0H- zP^SShx4MoKq{z*eJv~=Do*=yAV-SBOH0k$+hZ%pIWfT7zu|=PQLZ5I^LVF_7NMXLo z%Sm$-t$&9rAXQSb9HnIW=B9}EmiBVwL|n&+KH@WTOkH1_vX}HR%%}wQzO#{FSY4*W z2m84QIinW{0yIbo3#D5or{Pm&2ODw!^fUEYM&~tW7}Hd)BUW8~Y4obj;6{HpZo!Le zcn7;;FhysG#+NK*tT-Za>c*dIZ4HHkIJCs!!8S2^A5YPjSdUPG#np*y<3|mAL9fLsDal| z9UKPZ4Jpoln(@aj<6lljBUpbk%v%g#V~;T}>@PIf8I>E!X6{F_*0XG)Dy0{c>(=W0 zwOS`+^`{}lBik5nMjd_3Z=&+5Ni;bUr#OBsWvb(lCx-npVo$g*7*ZA$JfXp#lVN#9 zq%M2^fr6spVZoM><41#nF2}5&)G3+;dEYXzUpyps0v=x%^O%W%II@3IRFnPNugHqH z3u!FZ(PzM!*du`Dw(l03*i{FEc*jYeE{3vu*0ZmkB zOUDyOmZL2?N+X$rs+KnzxmLedN`~y??&m?Zl7fDr6wru>$SrUKy1X)^uV%9std><| zV%LIbBf^Jg7Cr~;n9qNg-n9CKacn@!H`a?xhom|d7$f4UP2W4Cu45M$#jneuVB>uA z4V=txbYAz%&@xG1-iNeN`44G)5~Y&Y zcfe5NVYBg`dkHJAl3c3_d5v*2Y}RX$Es%r~?cfo8N#N$zdgwJ9aJj|Tlajjt09e$3 z+ZP|G$+xKBD@t{ z(9+IXnoJ2lv4Se$vusVJ9U%jCoDDu9aABMjI4j{9Bu`VzheLGS0a)A7_{XeBDCv|n z{39Ura870N2~J!gU{?47UU6OSV2*!;=QPW&$xEY{=r?~jH4N(Tlw&#dBIO;ykXKw@ z_BzbnSDybj&awO_y#CGe-*YYEAHvjq@A*G**Ehey*PlH9dvt2E`^@uyhWGD*EX8~J zuc328_J|uU^2=c106e0}1X+i75QGg}$6z+08(9Qz)%1h$*g>u-v=P8RuA0isS}W}N z$N9ecH?)5yV0h9{9VTQUA@2>3OgbFLc>%OLr#8?R1tZ{%ufDkX4dtq?H5IXaia(9S zf1LYkZKSw{aS68|WyGn{UR^Q~F$;Oixk0jPf=Tf_Y}tD5%M`6YdKy{2dOps^a_*Cu zouL7D49-o#wimj+$*kmS$z3bXtK4Zr1w_&vGBtnGNf~{ECI$90x+Lr4Q}j3!4`;Kg zKb#afc^8J~8l3h{iMvup7RRladJZ|b`^9129NF8i;_Xv>_c|LyTvdpYn5^>+ObA{p zzu1#S1+K$7PmTd8oc;QG3frE#!#y@4iv=iJB5RrLVA*7zpNRRw9$9==P5{kjhC?FS zsbhb<{LWM{BLzy2^6Z)yCk&WX3){KOcyeH5VhV|RKXpp6I)?hFT-Gf)c+@0Js|lp_ zg1LWWWl>ePHMb^XX7n(mEx*~J%17)`C5gJkJf*&vUR*F#GOeZ9H(40Z7k$Zi*N(5R z<6#1`zO;|FT%xnKZ`A9guziwUtIrL3zgmA)3=Sq^gp{1D{Y7Km%QV4(`M8WCFU-$K zk)yI35{jy(4L4a|Pc&M4HUlEFFcMncCd;K$@080R=V^B$sVQs!)u^2abggnmu$y(O zJUUVD&CBNPRWi83ny;e#5KxTSjNEwQqna}2#o3rKk>rZUu)QuGyRBeXy|jaE^|F5* zw9xgHP6&;)$Z95~sKi-?JN8*FE}N>{cd5J+03fIr;+d!VO=o;Yu6hr(Mw*vXGzfCp zLwKXJ;En9e4mQJ7b>&c<;M8d#ITxO_ zP_&FpnMA4rJO`RM01ZQx0px$#i|iH_S19O^ zoT18>VH{HC_AwT|9!qj3PvQ`Lh4F$=Z~7kfbH2rGI~$dXFX&<`h~4iESW(iy%h^)W zyl{sFP*L^f72sbVbIh>^uOok+#Mwmc8tvG(d<&DLUZ$D?uu!k1Ep$vR-801O4*;1H z6J%;cjd#zE4*B~Aa&gSP2S_nB?B$egwoLz-%{0*Hvt>zbEUQuSnNDyRkt@(}j6b6h zu?x6DZaAP%aX6v=jd&1C&1@CvPZ`mg(VtpqOC(mc(3VKbeuUR+q#J*^$K=IS<0IW5 zA$gB}eKZza$~xHLU#hjm;!0r;sN9u`sqNYP z`|)%1-$P@@5kAg|4E%B8fWMR^uP97s6wqLZSA)xH8)dt z_FFAfVbc<0k+m>WDXV{Q*q;<{qqoEsMs&Zu)$+(4Ng8IMv*}cYjHd>6Jcd-}ZH>N+iFBMnjy^Y~eqiL@-p{Cp$b$d+qkgJ|= zY*T;WRC-k`d}Tl-YZ@>+-{>h+W#H(AOrwZ5aI> z!%WF=P84u{I(~U{^4HVA5m$hr2q~Qq+fq@7h+G5H#U0l~HH;_rIH?pe)8LR+r9p&_ z^7XDo15i%>c@BT(xEjCI5)5^Sl)=$%+N)lWU5CCn=!I=OcKWVu{HWT1xE{b>BYups zwyZ8apfX}aKDXMHUJ$jdko7xLm)4go`{eo|8aZxOoNE6*?eU3%X1U8_)-Wo0{c%lU z?W`pONMhVTZlx&h;>TGjeh~-viv_6>6QnvlR*LK7^&Nl4R?7I^^Xj08Wn85EidcUa zd)8&ZA|REfSZ6l=uIr&-0usdB87e?L!v>n+9fU3;7{P#wHk-KU-{%4_?X?PN^4H!W zo4?c@lMrHOH-LY*RUc!srRhM4uqZaJu~;Fp;zv5%GxqLpzG_+(byCq69vDbZLg-3cE(?Tv(>yH2({1FgSG? zKL^Y?{w}Ml)W4E0@zE-1TE>lUNhki>22}B_v|xWJz6}~@SLnQM7=M-y{lF6;)cP=( zPuhPs^mR1@2h~Yr@zQm|gC^ax-=O7_&YErtTU&!Ov@ln_ZSY$P5=lsmGSnD-^Z%wQ z=7H#v=p*l0!hFlqjo~n}FTX{0vCyXRk)n^bG44UlLY+@XO+~0s`Z;Wp-gvT^!QM#L56ha}_{h)MP zUIn*TMiLLAIiLL@Qt*Fw0D}gA@c!NFkcV=4pN}77 ztE-i&!{wesclrRXa^JbiiV{_2;c=4T26QG-dBszTILZfCm@6u-cxDG()Gq_=k%NC5 z;3|(tVadrR$6?}hD30hzf|2~zFhz94&&B9cVm&OYA1zVPhJvgQemHycI{fx|)S&j9 zZvh5<>wNcoEBfwR=w_~I;8m?I_!Z=%gJ;xO4$>@*JBPt8Hu=QbU%X`S>Pb=7o zm#yGuwuEqRYfDI*N=o?WzUBN>dRf$$xT#fQ`WU*L%>r|*B;{`P#< z`}>Ej{syFdXu9y+grRl&8=i-j);;+2mst-Int$=W*-CtjiAZ+6OgW*byH+eu;msdZ;hhf9%~2 z^c#BZlIi$IGyr9yMHWDEHq%2S@x-DhJ|7R|oISim2Vr9Nsc@YOGC700U^;P@nE{q= zis8J@3=_UsMyOuPbk{<5UPxBqg=BU1UB+1$7**y{#LSwEV}KS7VbYaKq%v)2y>HNf z9ERn&6b`x4SqjE3h2wv)Nct>c>?{;+32~R0pJg-iAL1ZkBp5UvO#i(Z9B8;enAJ2) zn2(Z}yNXSi55m~p(_O{F*On%8gRdxZOPI(lCO@(l@Jb@L*nPUAMKy%HZH#J|u&9Rc zx{Xl{6BgAlCVxq1@OtF=hxoed`KM6!(DP5=^$Aq<0=}Mj{*Qm~x)1HXf!7~B{}{hQ z*>~`I?D;RTkI>LttOIhrg5d=V6x^Z_R?ygKwI-iCD*1|Rv4RF15iNcGAyt(@ z&qw1a+!=pbZIft-R&$$Z7uML@Z*K4XmsS>kkP$I#qJ8Em0(d0NvuWwJ{Q_4;xVCZj zn(dut+wo;U>(IPeC3+^}T^rbgMILXvm~qeX$I$kj)hUBLhlWO#{)P5#B{Xzp3umQX z7)=349A-nd2yr1cmWtvist4SK+!+o;GtI_v*(iUmvgvpz%ta9C((+F!04hguWIw5W zGESvNJd6;yG}JZ2eDyrOIJamV0Cj}s73^XkN$pWz5mg@XY*18Xl+gLn}W;dgrs52R86)?g`umgrxl(U|O(56|xEu zwSRvYxR2bw(!Y4&yJQZDJ`h4ejW~b=#4G%p*_kT)s+LlOFKbCqZiMC}EW+L^vqs5} z`CdLks!0KUZ@$BK(gEUX*%xMoKpxXv_i0?B)nZw$U@~%Oyqy~ zGjbFQG@VZkIiZpX`XU}5^P|7J6YTEzd%>Q+*ADjD{@!-5x9#uk2YdVe{!XyJMhXxwE#*1;C> zc+|x|51I;c?e!#hMsfj*;+H{vE~!urf>&+JTWZ@c6rYS6)Eafso-)z*MB+lDjSMmhd7iyYq+-B(h) z`^)w9!8nd`fp=a4)m%v$B5~XTV)`;X;4C-Y$bst2DrGXy$WJ5^QrM&b%QZ6Ye4x!Q zXEW3$9ffy1tEmSs++)R?E);*>yzx5a^RP9WmEXnPv3uYTz2Gt|*vw$NQ(rf28$kK7 z`_aGD(k3io@JOi^_&3zCJ96yqAA}zba_e?|eeIGRbm;Oe^!g&a z5gKUMo9@l#1uZLeF#YbjlXqS8zB>#n(~0wWQ<(@az-bujV;T4W<^_LSJzrnH>|TbI zwF;o07&Q1A%2wt9Db9?9Hs}=IY|CGRy;h%j|B6D%jQpX0<=^;s{-u9FOMi{VA0LsA zWcRyWTKSEI$2qg4Lc0;8w~Z`Rq~a}B2(`8uCo^Y0+#q!gh0PJtP0+G)9ew^eO33pj zj3;t8vL;W$3S(r|AU%JdjFIn)nYvhkNC`elPTGW9iG`^@nG0!Md;5vU^d+C7yv{lL zJR$GMx`%W>k{&L!qlY3&C>_8*JnhfW`Ek2tQ52~v&pc)hbHz!AO{$5CODT`%GYiXS z(RtIW4v_WP3Y0%6 z320{gWG3&MZGROA999gf8+2)K<$yFLR+Dw9nJ*Upa9WP>?OQjB2gtjW^>s#0N z2cnuQ^;#D+S+tC4{$I4|p9RmJ(S%tP2dbN%ZARFDsniIe zrDYD{*m?uFgH^_mf}WHl$?ZS4ER;n%pxUlF2xi;V&icAgPlIa%nONde#VvL(PLnl_~_euc#%+`Ot1qW70#Wq7KJZ-shLJzh9 zJ=mu57EG=>VN#P5zb9&=K;wL;?Cf~e9RVGKe?EKy>S2ePvS3Elsq*2bVM1$^XPHvT zE3%(L?xl+k>;}X^y$P>`V(CP&I-##Oa1AQ(2Lv@$dxOQp9A~~)^wGsm?s+4+^Uyky zUAXwfRIPssRCA&}DQrH1H7WY2xzWws$cLJV$-@nKns#dzb0+x7&NDP{I%Hlpb0v z7*l(v#X>o>ced**1uN9rf%SO`zfXOr1~vz*+%|vEd)qDe1zd6)=s$kOp)OcaNZ)}? zw8J)$1+%TKEL^c{b!B+Ba3qwhZkQ{)tIf?0hVdEouKFP$Qkwo49m;SB9~gRdN1(vJ z3@6u17;v3jE>W1>D_Pys}UE%I?UOZPynR7N)hWEhH@P_KvoYu+ZC2wS{cMZ<`i! z1+`%D$g3O&lOMxaoJQ39My{QPR@JxOHuQgVo3>DUC6>gsG_7~4IQ4kxDvU^h500{A z9A%MMiA6h^qakD`%rKOldTxwsVktq%ywt9}6u?h=IRvb% z0z@d*4eivz?CjSTW@jI^#6B&|3e-n2tu()2>K1}qjyYz;ticX7Ioby%mE-zeK;(|X1I<1M{V-$X?H5>hip-|9l%)v zxD4o)L_0Co0hBJD?}+^z!8qCsA1?SkJzz*D0C4n&GC&klq9)q8ZnyZkZVQNw27T2t z3um#_qH_TM;1|wlo9Ku33RKGKB^!SgfHYHjG?qfkuNdKpG_3%L(v1SZqs#7ib2Hf3 z7(b8r&|u0E=+@v?{!>lGAqkLHmJ2}vYo^K0cCh?TkGlr*#(B(CJ1>h3=qk2~2 zTLQ6Uo30e=SE6aU#16>YH)mX^0o2dIHk^ZPb`C6vmUS7p(iH9|vI5gKg1CRW+s|qZ z!Ti8KXa+{wW+Sy=W~OyB>Nw|j-15S`7dARUYrf$)!ko;qKXiAZ)o&KpgbL0|GaytB zF}14PlG>cR)sfLqR$_h%RE17Dy}pQZjc-1i<hxAp8<+t$Yi;4s4Xd?qkcpbq#Z<~Hy| z^~nLGUBGdsIqOne)8;#dECDo^G)8Cg%AQ<0fZ z9BkD$zfq_Y6MBn+e0OIN;K#ZLZc0CW>_6}ovoFDu>b zSP`aSIu$&MY`ewmHJ%^P1$jmDg>5+NNl3y5R)un<9y1Z+HyU{B%*p%8C}0Ok@P2I{ zm8Jap#yGN`3cq&vGd~pF9iR8*HF-~$wW)0Wd7?di{7Eyu?RvAD?KnJcxWtik5VHI+ zzHAwu&+}o!oyqaguUik=3z6z651s?Zw)?TKP}kn4p!S|64+1CD+PP1a0H5&-c)KnuiTfmi){f|Yqcf2anCUJidv@vSAj7t9KRM;VS ziRp^R=ua~ap&$qFPxZj0ic#K5GynXR`Q26WGi8ppI_pr_cf$+Vsk0i12!`ogV*nLF zX=$AQrb>m5lE_P7a%ZEvcFr=CrlFd~WXo`O_^s^0zPJr1e^)We(}uYIUgU|4NSozC zJ-1!9#yyEq{-R}WwP!#>WtXBS`kk)f7fN92H=^en^v!hG7p6WwMc{?0gYWALQx~7mi-SL4b1{zl*4V=b^&06{8vQir zij+ppjp>AAu%8J>^UEU0?Y7Q2{xdg-rTOX6!*w_WP?urg5zqjSzk~yR_GOuE_cG1P zQB#xsGhBbbDMWL7(F?+B@PU%K`)k(37CO_lA+|^9iKuj_B8`wF`ba-K6QD!t2$3l| zaXjuPn4DDja{}6`7CvNhju-}c?5sq1piv#mF;v%-KM4My&rwoD!}XhUQDk{9VW=bJ zj@VIBDt$Q_Io&yVXNFt5y}Gt=jc1;TCF}FAJ7RWo5SL%$xF{x`^PgN9v!IC*0_x=j z?u_+ad6O~qmngunQbQ@fh62K7htP!gs4$Jw@cmJ%EhgV`zzCv@<8c&T8iYr7Icb9r z{^YY8k-|mL?_l${uUf)$%t9c7k`!u#0mH(=4a z^TdI-QrZ=33xv;w50ZJ}OxupM?CU!*_etuVX|)gtDD$sr`W6D?7+K%|>r#alWyt5O zyj#=AUoY3L33Sad;P{wMFHG0*b`65WH;aB`Q|!EO$5LAz+|=oEsP0R7jsFH*dCO1s zn6CnQ;XRo+bGFS?%hoQ6&8KHa^{ctJbzBu%Ht2D~r%U#YUNtMm_4?y#)>SC;Ur3-R zIB4v+lj1c$%ZZCR*{A_O6O^T)ucErx1U7lK^qG0#rGO%#vvESILK0m6^dj;VOk#smw(uMiZ^wz)qKj*!tkn4ZbzOmG9-_LTC5Q+DU0VT3wm(l8hZHVB}4Sr zLNvk~)0^wt5ZXxc!N;!&hxi^5_=Lk~#zuL2w)vkfUJONPNgaVyIiZB+Kg&WlQSHCj zs;WbyCfvW-l(QaEG!?2U3s?z^mXZf?$X~ez2n2ozdYf)*W>hI` z{wQK9>j0RgJ7NJaU+E4LA9czoe&(h|rgBhu>N^(th(#%WoHFanvCBw)ioMMk?E_Ee zxh|AmO+#K5E6$LKupV!VD1Y>!j*6VY*>0GPZpe1M%~8L37V)=}kyTd8u)^JsaLKOw znOaELVlJk!`(lmgE-tsN`K2Y=8Y5N`P8K@eRgf}zkFbCUcXYMyZeHa#rs}HR3vj#M zO71ehV!ug#@Vc&T)VY_>$u!@6WNL3FBO6Tu>3k5^>DO#aGb#56x>rvTV5YiK%qs95<(6ilz<(a7$;nol48=l_Gu}mx;|9K)dQIS-}3*H}@Nqia&)o-~A5<{6y;WNSvpX z=QUM5G^kO}aY-V64gYUAv{hrxZyjk%9g!2~+C&P#)X}e>Zi6;jvaow_g6v2eDrJf3 zOw!--d~uPLefsHOms3yNX4UbI7`jRXSyy?!eJkHVLa=Osi^5Q6O+G!iocBd=-$jDHqIpO%WB1n=(OcJc zxH9RwoQu5y=L2fTwmncKd7_<`--`AJ<^n*oQ7^>2e9>oV=Rdu1f@pW9{q3p~Bx;sS zDOj&tE^sfZ&C)qnQ>Hl;%HSrsEg+^#OCNixa98b(5HT%le~q8B>Jx6Ehg|tJeU{bM z&uegzy<aDE36E4_VFPmch2GLGF}SF)bl(T>HfaEN)G5UmdSh>ku9v#aG^475lU;>m>s}0rgn7KHj&T@8UCTcJ?2xa^$%r|7o zKd>wSZ2Qh8s_@!x>q4cKZ6p!1NaHM^4IintkA8X8-%6nWTZE9L)n+1+7jdqcBa9vl zt48-vic%ftovuznS_*Nwg$MXKh{!Akf+(~FrXHV%-%c3|!*#XdYz9svOdukjhcSfT zmzgqQ+zSM4!?4n&L`GRhIC~lkR1PKX`EbmAvwgf7o6UV7az7;p3smHg{$kbugf%lc zt0=PK2r3S5A0aqSrS!((FmMk%w>w6~f*lo>jyM|%7_Rgvk5mtC9XdXqN{}DkocUW4 zs`TJ>W=$t>;c>Q3nklnt5_u{7)R{F?rztOIU>SUz7?^iZ!0<5lBXGWC^l#G^LbdBG zOB?-d2-*+&CLdcYsQh9=54PV0@2!KOP_eI$f`7st@FSiP8I%ri=pa0A-_+T@#Cw5! zmE19B&Wo2vK#6rn-rP456o?p!CU8jowoWm^(rPk2^&oYARE@T-+4gSHvY#c5>MiBL zGfcX)Ot*Aheu7!*b@{XRmCJ-WGM=ucMlpfN?3NwZm^u~{gviuZZI@R~>O$Swe^-2d z-!=awm84gp?#8TKM+qYJvqY!oa9!R9~NqDi^Qkb|r+`Nziqrbw4Uk^g#ahDi`n4R??Q z+~yJn@BGO`z}l}>yp_YZ$leI4nXXqCq6G3l@7WkWxv z@^mL~oiqah>l?33ho~7Aj%1E-y?cUb`(%#vKhM%svy*8wzZ8i`2@TkgG|BmI!ZB%% zNo=X{4o$0*8v~5jCvY2}TnK)wx~M`hY1l#0isbD6{KLgN4WXtG0v2YHLr9rOtG?lEL?g(yqy!^m0`cOV=ut}H$Q1Qq9^8khX;%0pRSw%|;Wzg6H zv?KGYHXKNvwhjqCUs(CH)m20bIWGRW*iK@6nUK}82MSyb=b^)@>$H$dr+NFh6dPvs zjM;<;AS%2_1xz}5T= zOAKO#kYQb@KFNQZsys%0Xos;lFjco$uM+5zO>1%)r4qK1>q$m zg%gZdGF|knAYTka`1GqL+tc@;tEyWF-~(+=LR`{8YhWEaAS7*nXqC7*Y*gY;j=8Dp z0jJvRL5h1Q4>h4f7*1!kpAuIdhp-t<=t%7@wrwzr;yXGAus_c!V}0X3KHlRppEr|` zGhSZhwZ`@0|3*#@H?-Q|5&bISH;8E2j6+0j&42Zf{FRO zWa^AH>BQRhJi)yAr|YI&aEtr)4>19ymEKfe?-f6|$J#0nffL>SU1e6dGtV0n%zcO| zko-sXhRf@NI7He6K`ag~?1=Tt#`mAb{n86NB0^fWmbB=5y|DIPtPzT$-82be2|(S7 ztUkJ7dE=}ZN}RnSojoY_?8lUkZ;Tn@+nf|ISutGl>~=&EVg-6kJ=V;%hZB3nxqHK$ z5)<9ysud1qNBI?gdBVE}6GoK<+9w*5FT2LhxFm(-BVWTB^ zqjC>c!30KGij?q}vpWgWIvCi^@Gi(yxdTvcY4l|d>I+Kt6>TRz;eIK{4@c0sGQIbi z@tw$AC7lEXX(9}IZdm5tmaw52T^cY}3$vK-p>xH^AEhSw?H_`HST>+;C?Ze6aDb>aUzi&^TrC9s@Ceyr9iCK1r3JorFX8N6 zehG*a-u{?@@@G$gk8j?+WV7I3n6I5TAq6-u%*F%YS- z$;Hd$?0B+s{puWI-6-4)b3b6uP2D*l=p||6)p-L~iLO2}g?jiS2k z*ku{f%i`P}@~yfy4w2Iwm(Q(k<;aY7Jue}enD4+o%UIK^%ZA_v4 zKcEArC+M;hB4T9Fav!$9jn{wA*?a`E=I$Lwkz+Erdnkb6B8zaLcL99?Td~3RuHQr# zUu@-hfar0x)qS$)@k9g|yQ8!)E5k~Z40^HpzqOzYMOso{3qpBoQN_11&#IduIlI|2 z2TU91M2ge5vrd8NY0G}^rXR=wKi+BL4^`FBs2Y@4n1pd7_tKWT$+8#7uxvHuHSGt3 zET1(-_npIhXp08*-FuKC924Zsonb$T3_fu@gBA-qZH;Y9`qc|K-S`W(QBGcYLbay; zVTaX|_OJa(>)Nw+9Nb_hfV+GS!_4yqqlF|T#r}FGi{L87P5@t);tO5Z#<;As1YsW` z^9m{{Vu{==;fUGhLy|ITZ4pLTO%WZ=CK35!q0MQNa;6PYlb}L&2b6UnY8tN9%*p!C zKdGJVw(K0kpI&|gxZ$Mt*;9RO#YzH~ar7gy;r4;35Ct5R1b3H==vp3vrG~aqTZ&%T zWfMbGJXG5v;2v9%8{TDtkK%r4QzP3gC5XQ(l-+(M;(aBvOVC6>`kL=w=YeXw=6{F# z85loa`2DjX{=WHvjQUf9_C{y6YTpY@i%;9_MY-;c{A54^Kn+5;fo~1}Am-4jm8%p% zEXf&PDx+np-D9U$WPwqjV~rC!GTf^!p4d!!W;CJr>jVtM%esI3`Jw-uXZh6QtXeyC z)ZpvDYRs-!uv~!VQ+{=IxA{r_36c%#fRvmMAihBK4C0YJ#D&iCE3tgm$1?{5iQXr@ zlEuTuNOsQwfSjSKOT$|4gxghinCNNzgF#!&d>?h;UK#K$VW=LaeM0~~w7mp0IuNA} z=st^j?(Mo4Zy@8@ltm~%{L%1_^*kg>4cW;%$mMKVmI$1%Wq?jXG~nW^k?iN+#-iB^B;KmNnm8J$Fb8j7CeTir*wMqnZ`#^U91 zK(T-;LXe*~k)UwEG)VZ==Fk~pd%<&0mDc2avHN|Q5Cf#%}a3z#gc%pWa?H`_)Vc2k03f!><$cTTC z0&@Lgo4^__9x_qPnK_1age)p8nB#9JwYC8L7hjeBi?*UhKd3WnlXW$2J!JLCz>(cf zbZc0g*-rLGtwtm|w9}B7^N`wy`^B&5x;13N3vt!AbjET0a-qqr>S(9Ma0PD7v-uCm|x|!QQ*njvG>9(V_2@l3GUKLMfJ9fn$=WfhS z-=ZA^JsJdZNuNy8mIH?@3R8hBT$}-%Y`J8>{aNS7q;^p0Po3$MnW^+5BomoW{?P!& ztPJ~`!jno)Ph8e;W})JA41BcT4*5*ohrPQab9b4|LVdAdg`J#*L(9|h&)W7ClX8GK z<@Tx^cL~^~t>DoCrEb7vZvpWpQ|KW9u9op*IpVRZ!RfrlN2Kpdo0jRLcjHF@oTL`v z^{N74S9d8>H{OLjA7PdFlBNm)k40?Ku<0gxvFl1kBu<9ME-jeud?q-Tsz6bS=U(3n z^PNh5ivf@4?0^la!jqG*qU6%hac#uPq)O>3R&QqFg&^a*n|vQ8C!Z)s@OWa*+q>oY zYyEOxtz+l=GX;(_em%x?l}Ho-PA>9eUsXEaHdmqkPf?>OPCE5smbLO=R=M!5*s_LY zn%*Ajp8B5ro&@ANln*$?kn>Rr)BT-eX{;RS?=XB10ECs*2R`+4Jj(4*76QH4Xys>x zg?Oh{!?JxjO}Hbnz`zKuz_U_RF%J zX`)>Wzv=T~`K#YiSxELv17IKHbYPF^{V}Rz@>Fa$AXe;Ma8e(@gx#_7YYzhVu&twI zzJ1=dc}cRCbHIc}8=fR-9k5C|lXtNmO2%Kb1{?sN-?$k&C}@#L{*(}h}kKeDYFZGs#6s$L*)rC zzC&L5O;qu5hX+&I=2Ewm>`44)oD)|M(^+_QqIpK|mw3eC%eQvE<@fbF**mi<=X<(Q zi?KN6y6eq6eD-bE)`{@>Qz>`3QWLd+lly?{`~~I4cEqu*wnX5}QIPJ8jU#SX$sKM+ zqF@ke^&|RV{o!nlTck^WweJ@99hwE!=_uM-Q0BxB4j~*f4%0aTyaTHG7~udn7f!mW zkWku;3WTD*XC{pK3-_F1#q^afL_8W3*6YHd6!*0t{9h~9Hf)_o7`2Z$86H-n7P&m| z&Pk%3!-LZq@^(P|Z`dX~v(XxkFgLrt6ehS8t*RxL(%gBq^`s)?fGPbSSJ0FtL&CQg zP=0~xu^=hx=-jpIHK_c<9f)rNfKlrzMgUS? zg?KkoahO^>vzN9H{;ug*K0Sp3exD73$(ezA2bhNFCsyD)3ofgB`{b46Dc{@@pOSp( zolsycW+TPi(cG6BiRGbR95E(Zsj?JgJ9);r*W2sL;kV5TM?8Ijxo2c^OBGsn`}$%m z#WvLg zZ;NcN+VX($@_cWibC_}s^+srEYo*VUmQ59%zXv;rv?7^~yDD6;lXYs^^OWOyqB7C` zrEXdZ_Z^pP`1{q3(fMH%padTW5!gz^4T-UvRE#zU6U4=~0xDc?3P)EA>Rz9n;K)T~ zLl?ZfxOL>r(A<=oPFwz(IW+15;T|+;zPSR->;V3WNjzLCrLg^T8;X9|11l~koP|28 zUZrCShpN<>a<(fQU(lNBN}LLQ=*g23xnakrOn%RW-z3M(>)A0J^#nZJbVI$}Zgxk#-yEbP)V%IZ)l(qcYKOt3 zT3j?K!DQoebC!E~)tsbkDs(fRD6nAk=3bv++MtlCd{MIR(l=MFbnI9B!ax=sIc##f zq18cqQmQ3hPku5>dRO8B>HfQK(!>6Mr*X;yCN&$oxUF|JNgfZizCL28EO$|dejAuD zllx9R%3-p3RlK|&~pd<3!7(2vN&DR^b6nrs!ny*#tVdz5C2$fajn)GH?fO{&H|1)k@_ z^c87Zq|Me-)qE_5W5SniM1^ejPe%nB^vk(R%MBvZQ4dl7l?PBnm$-P;F2mCAbi3C1*U4oyyIgn!ruNb&PtMwnxFggluh}uCB|*_tx35 zlqXB|=S?#Xo~e>0(-RV-vVEN)2Ww3~uxoJrquR7}>6;cB0NaaY>y`-2MW+BrypH84 zLM|@*9v+bR9v;{I&#g@=8*B9%%ShK9EN8s~np!F0T>3arT(jBx+i9Y&hx7{!?@d$p z0S--ndh$8tCG?>^afZvvl5R$8++x+c%bu=xZ>E0}rLYDpX&;(CQtQH@f!euZ|>0LPEzMn_AB+})*mn~hn*6F4cEnZqphU&jBsis5DVw(s!9zr&ETz||*5#9~w z7(*v-En%yNyCS_dHr=c0@>CVtYz50TK>m|6rA`?`{mrSL2+;v*)(8?HC16*rm5+ve z0Z*sP7r8srxa|TvcaJ)?glIE3eQ-=1SMlFc&TwN%q-D&4qm5d*dc$2TKvB0lz*bYQ zEHA@jhhTlCM;ItfuyZLZ0>3)Fn{87N%yQ!bP2B}xl@WbWKPV&fVfPd zAtwrM>RyF9#Agby-S{z)tC_ z0@N{Ey@!uOx#VUEDwV#y$!jL}p<`MV4Cgb2U&;KOY)-ld%$*pXPETjlc5lhnyyG+L zm2ZsJWoK{`nDn-tfF+Hnz0az);yl*EOL>l%g)?~p?@uQ6aQ7^s^oYS;DEgs(PfwNh z@&X>Ecg8)N^^%k4b$q3=QeL}-x4?`?B~rg-YHr5_S1UB<3f$BhhYDV}H`7;*uJIJ# zMjA5lGv`Lv!dcuaj-g@4G{xJJX{)L+AhQ+}@;A-_GR$bH<`rFY?p3#fPHc2*tsVk& zy6twApR98%X1{vG9ezBDnk!0hxK$XXRZeZOrsnMSGIww}-V4^IiNHOfUK`x6F6VlB z*;HsX;;N|9Hul#6r8Q*+L&enB7eW^h^m!m09SZLWYyL2Qd*aDYbOjnfcmZZ;K8o_zqS4Q*( zG&j6@4ZMH#`^K&D@YCb@%fJ~`Cuj`kDabq#;@MLh!c5>&SAHy*teaBhe5Y%jI^@3V zpq-8k#Nk3$Nz%tg4rK*8VU>44FK)Hkl->}~se2dU3Yx9LZg=Y|GzPX+zTd!6>+%`V z(!@A3>N7mqE?T5az76dwJxAjq#4Agf_|a}9aFY*kUfhyMjQqSW)dQKhw&l956Ur}z zDS5K=GT53v=v!8{$EO?xR9Ti*)qnD(Z;ZpfJ;r2)P`$jqzns5At)Vep-vL|jb4ozV z+xmOF;EF2C4;)@5qtn?zRNhP(|nrbNmv zm$(5gg-k?|QY>X49FD{xs=z>wEJvIn&JQ|A0{tO>z zn|zc%mHf>Vk3|ED1AM1f@vWr5Nd9-|Nb+r_Xh{B4LZO!8+xy>yj--$J{$~Jx89573 zaFv1)C`F)Rv;4kK3gjMSC^*Vd{EGKIrC3P&uTW^11 z(v{p-sMqNhLS~#K9#{C`&dA z-{U;e-x$O=)YE{T<4irzK}(|LG>c%MB*J^MUKJz;oB(sNFu>cooh z3f+O6qo|?}wH+9W$rvBWAk+tkNoF*Z89o^E9J+4$!aIE)T_jud*P%{!iP!u&CrlhW ziuIed@Y3%ZBy*xE(Z3r=t)-R{Y8cE7r}}cjB(S4d|1$ilfj0j-MVccmo*cIf?*ejSnjff0sz`qU_#6N4K!PW~h4kM9 z;O})QZZVMH{l5V4SHsn0L5tBnClUsC#0(yP5_lv=(uhrDk^ggZP;o*-@P7+{f348oFM<7smDpN*DYC|E>P}*r%sTyVLQ>dYSV{a}fMgz2 z9N7T#7veeTLCNBI=|PFW8eo3L8?l1kedXM#?l&DUO&|X~o-qDPwljYxI^LQMR2*DN zm(eS}k?mua2$_QTB;@R0#mKfRb|@s%s{TKqkd|YaPK6FRvG6zYF}iDj=TYRpwfHp$ zXNn}yagb2kUOfJPkpQ8#fi#%x$M-#DY8kgfQNK&DkD$2!J4_Ircj zD<#H=J4o$FJRK!PW-LAwsT4?WJUSjzm@5_bW#fXDqeT+o{7-lD&c8@^0ik$84p6*! z3Jy?&_)HE^&UkH5#&3RP!TTh!w&U?RLD3mV;4l6_y0UzVVkM=y{DOpt^k0BK zo}U90J-&()6eGT!6BPD80*-=P6tmIyBKkj+p*e(#Q;`(r12IY##PErK0;J+EIYAlY z;kiC;;~#m8@SG%~!aeaKj(?JjlUH4JAz$*;UcVlv3%`GUjlL2)NLZNpnJ)K!a~na5 zo}^`FpE+3B3&zKZ8l65}9}kDe>1yx9 zPhto7z}INZAF?>!?oVVhd`T_nhxpQK(>pwWAu|t_ML?HqZhrCZFh0e3f*J5hlws#LHU2T|d?kc1fcrl=9P?MydLk_9!F`!|vneC3qWAc?$UlAUTNWQz6p682t z3%Zrf0)D+kJ&8qInv-fI1;v?U1Zv#mE8E-$d8D z@l%C#_cM0G(*pUD%F3hX$obE^@ukZ;BhBbDp#FNBp|9qb%WOa~$dR&A27+JyN$;GV z2eT|idTA`+p-*IgX+M(VSw;K3q;O3P4dXN-9huq6ubOhL-iomzT;7#-KXPIlk*TZ@(8Tc#p_&d z=8UzKYKUi>kyk)tN;h8Oh)HaeIW^(=HsRS3YkzJQZ{GaY%NF*oCnb#W zx#96%(aU!Tys#u~fk=*2yq$ZOqUer0eYD-C(Ft`V(;_!OmoQNk^KIdhe4 zt=Ke27R$OciE=^FYp7Udhb&uET5dc)Tf=M6m+Wpt%>%ey*;dfp*xAVS-+w67+Y+rn z-mvwL5Zz6yut6nX8P9dR!G~9>N$Iv|RGw+X(0=EbjRzL|9G~Xb>9%8IVI6nv`uFdY zMkXaSdrUalTL)o^l=iYuDtV|YnD`FZ$?ot}_s?J4N!Y@dYd~^2IfMIhB0`tCv+AT9 z{YzzjR{;XaiUE6a1?KYzAuE0vdk6Ur2ho56Bf9#fjk^=iaN53ZN%ivFaf@=GM~$1e zqOo-aZAw7aX8 zR*ohPI!rCRfsv#w#mW`1WOcWbxwP4lVoT<^P9Ue4ZpSro6I}i@PaP})y4}iEq-G7X zraJ`9r2u=s{GqzKJ=&{L#c7;$4wvxkk3+cT;fwd%AxmV+_zzOPWLxmUygHri2O1f@ zHAkeJyG%F}|Z* z+Q8Z2iSoV9bqy>c#%G7ulRC%uxy0WJ{CK-8P!!z5NiO60A;z744?=wBw2Yy*Pg-ry zqwVAGk3(B3`_7@Fh9|EuRs;#Bz%bH1>UgYmmU0YdvT-kL#vqBhk-!OB7>qMH@y& zV)#NdA4j{5?VP2j$1k4`ucWTeIDjAHa+{;IMmHl{&m``fcwCd?O7oKFL%2%*unf&!i>%J zVm@m}BX*W2x?x~L<@R)o=Lzu+6WdER-?`f2(6#}?BG$sYv^D4oMl^eU2F#6vP-$_Wp(^JmBLdH_ z30tAAvV&QM=+YV&>)m-+fec@NR?WD6q0W)Iu~N=Uo-i*1emuQ&WVnmMux`iHDEwDeMG48#EF5Ql_-AQR# z*l@r6?o|{ACGB%K)8v>`J?XsD*$8tzYJzP|lz}9Lwp)Ja!P{Y3C%n;fF2|ow55=D+k*S>ina?}IyR9uMhwB%m8rSh4-wXtG&y;@2Vi|2@&dQl2~#37 zS~)Bk^6Pp(F5ZV>O5ILH?3K8$)P0KKQvA&)G`z6qRK;y_hG<$R*1y|W?tS$g%C~{j z+)R?`C7=o`O$VRQA5;=AhJ`d)S_Q0EH+5o&539IePvl+9`M2Al^4Xo^^z-KFv+7!F zrP2g{?A-?4@3qH#P2j4ZuKLRMyFs35xJR~kaZ+f|=E2xh08o0XM7kHl}b5m4$75KBesY?gqN)GxiuXGAV zoVz#?x3?1#dNvR{FWd=mai81xP+)-8e;(S2%t_xoJm^wX&mRktVkGow`D= zRIiKgDW?`1_)KG&oDITmcJ3@d&RpnflxD)IF57>YmPS^sE#~E^vApD0VxK z(`UD)XJj_E7h%{ zEg@3Wj>k_kv4orl)wo;VXDp*TeVP=dcY>bc6qpjNaD+C}46Xc1#Ay}6;9yXLZn@iM zH%mk*o4oxcgXZ6Bs)Mmeki8J_izx5f(-pdWi$D=B4S7k_5 zZp5|tp8=YkA&fotJg#iMA$QVsP`1UPY>&Jx0da37a;MiysKwi;+tc$HC-mkGeM%Xp zfab>OJvaN*Y(R*o@&sQq+xX_f_pK3IobwixAxP^$9>XWKSjze0t4t7#e~?875;!wZJC z*wJM($JN*KVynwrZPwumpP9?1bZ_l5z))P-V2KZxZX>0Ul9ziGPMYQzGnQq!prvfm zM0DEWL5nkW*Rok07hHxiyt??$DG9Eac<_d0+`Evu~3IxWt0H z3Tt}R2xBvCQ>k#Fg@T<$YU}PO#(HHzBkD&t9Ca%}&Pq;nd?C6eW8kFM$92hSz78rh zD$?cAr13%QDBeB?;IIf~Mez?44<>9q3s-Y1u44~p4Ve{|p4GBlMT61BQbz@ESYaoZ zRX)$ix=5v7Ap-9XG{vydv#Y(paV=@Bs_c>D1$GmNWA9fMOeSC^^fQ;LpK4K!>FQzC z(II){$#9LGpOSZol)j!iY^}L8^LK{T!;y4R0~eP!Vi{Z8ec5RY;2zSa?g_Ma zrwhaDtc%gUq{-`dxOjYdVXipPi-|UFc*UY^_`IGwYx#LV1@tZFRU- zcD8KTSRt3b(3@k}gsxhhp{;dQ)vHzT!g0^i#lwcL6l4lJY)|a8)PcS~1vRXy6dNR5 zr=ITXuC^-8c7FCSD4dxn*R(+T!SN!cIp@i7hlSA0tmB3VrkN7Jiu)o3fjue>mGVtM z_2+b_>fCUPHr}*fu?3mM-pA_Q@l!i4j?~oAJPdfCMnJW(2z>Dn!q#eIxZZY+;3c)P zwUyzT>B6P1Nlx%$MCoHn^?P|rtXs;fBcSb0_LHlfVm|~>X&OFa#_ps#(iokwe=;kX z@?K#6Xfe#9X#n6ab z$%l1Xn|4E|mb@(9&(Ci>ozJEHsH#B4%PAvyRxGy6^el{8QE7CExZd;awpB->3^^cs zW~7lYn=6%yr^GdlLh0xj>r;M1%Y1cROJ+#9W(mavf-c|~bSEvj-ndwau;!9+ir_Lw z3;iDOslhgO;Tc(9jtEuSA(alcue4?Ayqn`rZy%0J4vYC&_3_ZrL|ir>{aM^w_wdxe zXu~A4wPW+dm^E!>ZLQl(_*=4{XLC%ZvpfBo!)frn8-5DSq+`wZCz;x|tpTsYqH#66 zkNzlajsxmX!()9dQEG2Rt+N7RaM_(SL`t_@_By45Ku5$W~0AYMc#0V1N?-8qL@U9w`sc%Yyb^aj$xxNA5>t=+LxL-lhf`I>tq8H?DA> zN*Qi#-sZHo9PrEAg6j;cM}5w8G{E~k8@Zjb94F`ph_vJCyc_lhXwMbT5yGLx}Fypat0wiX6?{Y3Lgt)n`vbNHM0 zE)Yg1=XGKn;6m1HrsUrxr@VL)Jt0#!lZu)8K|tY0I}WG}TGPFet~5~=x`rUHvD-k*x2gv5*|Tx(A^@lSQK z^UiYDj202s88>#&5e!8|?MW1bCjj9fO1uS#3FC|9%+>4~NzY>^U4mz8TFe1ArT&uy zFd0A2iLyeIw^`uVj^=K*gO7` zkwoZFHf<8g<$8>mQ1CK8>&i;g*4CiZDyfoh5vCyPpM1AumWt>E(@Io^2B_-t$n|z9 zuL+bMU}K#+-JWJAVJC4JpiPIsezl0R#=I;w30joMKkZkBJPoyDEXiuBwO&2pq3vr~ z#(6$y*!OIqUOVh{E5)$CPtzGP$KzZ$hhNcfY{4|;sqp!x-3(UwVr89RN*$qEJsX!{ zu(ztp*W!6w71e|_s+8Rj0vz?9r@ublBEC!dAt$hdrf+?UzF1vrJh>%1^gO(~JXeXU(d7v7wXVFRti*tXZCT z*D}m3l116S0)JYRW<|{-r)oWqKoN zFt}16@1j(O%R=$jg}7F*=&0bf4jy85keZc796A@7YO6LwN1ZiEt-OY4AZ;5a_O>Z* zE&Y1dL(N0wdVP-)=tC%OpT4|H8dMhi52v zY@)U7%$U`~HLDJw`gX4t_4f1wHzqDpT0D_G+qZI!<-4|>w9StIs^BVh6(g?Eqo&UcKOIV8?HIhy7ygk6#4hr()P3Tq6mhKgS){Rn?*RK3engoNoC zpV~47zXYY>(eT5g$NoSaYRrAFF3%Qr;tQx$*%{2`M&#(5h^B8{V1a1CXqUr9?Lg1Q zKEFmiKU@8tofVy_h2<9wBa>agkYABuZ9g@OF_~8w5K%wUVyp302=wHa)}(~-LLAOp z*t)_JW8n)kO)Yw!Z0bAaurzCb?&LwL;K`FJ37QCutIoWiG19M{ao7GXZ)0kj%k$`G zTkJ6Ei_vH0%gTb@-yRqpPVdplDz_M=gw3ou0h+6Je;|kJtx)@RcXyjDREni08_`xO zfriZk$m9oIyW5LYPki4WE9nbk0m=Racogc!C4ZYB!N{4Z`RV>$1$0v?D;M2!reMLV zVVBz2`VPw5;}T#P-ezYuReO^pDh#AwCeB87vr_l!*N~%t(6*oobjrva^Jgd~3x$ zZvFc1UDrLfR|3p12>sR!)P7&$%01;GF3Kwzie+Q={JM*hp0ks-rw9is_xlj>T(^ba zvzODsL&Uk6TDLp=`R_(`mt%FqY|%P5J;l#41x=?0QM0rX!V~sRqh3%84c9W~$ZNj< z@+KenSvLoU{bZ->;!AX8;%eAXcXziV@pK4JFP64}fJ7`KxkPzfRlNF}2-ByU7B=N* z`T*0_r9iUmn=hKdQUno$e3-XgLSPJDQn8NlEWYET3EfX{h2~9qu8X8Ao$#m|IOa;* zUVW!1B2L5t67a*`79Wm$kTltJfiM&hxwn!U?%?7XUrJFs!X<)oPL1P|)4$S61`C2p zJ&f2MJiY0cRA#)5mbFPAB@6N7yhNluYY1*i>Z^5SZ}?G~W1dK`js@7j5(VF zQQzb^qjDu2Y-R66iIu%eUC)N&PujG*`*Iq5Piw6fyHi_zScQ?&{{lQV| ze+0!DI_8`-_5rNhjoCbH1r%cQ#8LgV3xEF#FBfa^XZU`;9;9h3OYqd3I~& zTx46jxH?xg%d11)Iqs>}E9meZG@N&{xf(YXu(FKY7d0sKf;rar&ZieE{atC{9xq2l z%T_Y#%)6f#)53i719Jtg=0fSPs8GrLmVFK8{(AF*U484e-5jTe+KzLvZIBZRxPSU| z4%x3&$NN$B!<()W%3E2LOy@(pm|q0bQ5Gym`EU-U6Kz0Yb-}x_zcWcV?vBi^R8tF; zkK=afWu|vVsf-rElp736*G6OA_m!L(+tZ6|aqt`vnzc8{6t-Bto_O9_L_($%9c%e%F0;7`N=aXq^b=s?uxsIkh zXXlW%4EePULwPy1!KMrDL)5bllBxZ)yJ&a1$LU!^lL6BtY}-hlNPahZL)^1h(CIpKYE+r-`i*$Db4ix^YQ)Njf#hz zP>MnCxPCF6U;Izh>0qGm{D0j#knzR7(ztDJ;q5)R^o=|k<@d|J2E}hFg4UcD8TJ-x zrFH4dH!F!Of5sV(ijVR^931z6$>^QcFC4Fny9E?R%Wwe=evzyl`R%L4K z>^CBrSlT$I@l=JCsNWVV+$~`nypFdeOm>x8{FO5C8jN<$Q9wg0Qx3|Y9zTUrzT@|X_>so!S zZA-;fQxmALBO^_m(0E@3*9uTEV2jjSI8o{4HGZqf84r-v>W9-Rdc4{14fCfMf%f-( zj5nOj(e&$GLMi7Ubbst&Rd)Zs>-_}YNzL-A$~E$q6XOul4ZMWm(W%HC4Wy+$)*s_W zo54u2aV(+9W%mfb8_vILgTp2?)J(+~u$sY!X-|88E)zxSJ{N-kaxfw!vt# z((-_qk46pl+aV5lZe`>l&)sMNX-8$-TUraYu+O@EtG-^w=6{h0jJ*F^T+L$7E~b^c z2b4Sz{iEWx%g}A-ELb!T4jnf%rlRI&Eu()|Td~a!;o+^Pv7=p$l_N8Ap5IV z45MkODi$uIHG{v)7gbx=yNm8;d9#rQTbkCE&I>S89nNT@9o#qyU0Y{%dwWMuXIl}z zl_oZw&wbH{<==-VRWH~WaPMwscQI5A%PpFN)87{P^?y5hLTbsw-SV>08jXXX@05;o z=?ymG=w`3fu#d>1cB~_if|vj?>Fk_6s4__Wj}_A)95f*Z0S(I%D0P2wiwQzSZ`~?xpqyNZRsbgKE;_F zkSFj(=YLvUJAT=rPE{e4YBZcaS=wx-c8)n7Esv+{qVu{jwllW=q;9~w!B{s*lw^>t zniO#PxlJCZgLU$}HSfZre2MN4ue5xEWfizGZKqLhc)m zk7~hCAa$kceF4@oD#djZt9la{2-o%i(&h|;vxkipx@xYF*-fL|FdA6cm#Y#sYOpPd zx_=XbwcnVH+$EFT?&NT5+-W3WH?Y+}y1W~tL5c7}yY&KSar|ie6mQ;`k~vc(_rpDE zo1RSRsP>o^zo;JFpl3r#JStTyPS-jAzMM`b+1!Hxemt49d4w^U`!_U~Hr63%$VAUqOXo$tno@ zJzMwkJf|&&K-~E>Ukd0?x!gaH)h>ma~ua(k!t?S6u;Xl<}lP8bSU4y zt$Lc!*6;!4$IBUptHWsgqZ{ZCuW+boV1F#2XRubN!EtcxRgOm9=NA{V%sY8#uT#s{tBV-D zOW^b%rdc|^373IJ`J-HE!1}L@e`##DI2SSQJa%`@AM`>x-rcpJ-%&uv7FIfnwqa8f zrt$CWReCX=&+|f`f6zWecK+GhTkd)Pj05xB*|h57u)@fD^Y-P>-@p3!!++cNAHRG1 z^A9h*U}by{qU@s^<9h_2^@gZ}ns;mAo>{jfL33K7`h7&~og5eCe0|Z$kMaTBk)H(> zr5#-?YLTV=xUQyJ58#*Tw+@HPCv)3#FX2PJGY8YFTOc|&y}@y_H*9x>(m04wbU%K~ zmT$<)qhfI5nT<(mCcmyZrGE^vJ6*TaX}qdIT~6TV&UlASWM{1Ym0i9X!`p|6Jn*U# zsph2{FuXIHT|EB@2Rk(%?|9vVGuw)n2gVGJ+Y{z$pa^CgG3=VNinAJZ<{fMj-V)`# zp4GsY`k6{@ z7m|J%2a&QwSx_Y@&y{&0%wloCGik}aEwWpT@+ut58gti!-$S?Iz00!fkwf=u%l*!OHniO=yK()vN-# z#jjC!}XWs@wws>#ohS84;^!2M87iE2t9 z^_9$-!r!Orl|%O5qD+pVrSNr!mFctF9q-3khI8|ZrGHS?6zHxg7IOwZ)6E9w?W@F% zO_LR4G!x67j4;#pk=@s`{B1ff@8Qa<>r>;8-PsNHPQ`msI*A=tT9m8*4Y6ovHmsZB zb)z7@-HVbHCT5ix$bZ2xrw0%-UPzZEqHr{fArv(gNG%3f08Px%*CGDPPQ&z z-Bgycn>j6W&br=9?O4=PiRy27Ggh=R%pM}$jDNhyFBZ5@((X66AGTZb%P9H);TtuK zSUbP=K7~Qc#!-{2Vp`0yWs~@9tU+hPPu9b>W(GrT;WDh=3EbCMOSe>av{ie)s?kdA zuF7M*1)y;li@rd%I??5MsH0CKb71ZvZOOXa#QkCG6SL=Zqr)t^)2!peYr<+g`$b>e z@_%$Bq0Vf6Q0=F8RI8K8WOP$`8ytiIUGojR&zI9eL1xfSQFkIY=+}Bsw{yKuBrfYe zf$m|9*HPK1fb-A-qeZYz%{KwX# z@0)VsZ@c$rL&l~vOGl%uMW{C6X_oF!mw)@GV=fPG(a>jiY3PnxH4sXZ?*GTrq|4N& zW$GAth}tlq7lB`HRsCq!~rt7Wm1P3dCjG~>9klP{dSgB_GjNz>#2@3z&I zp++^f-Q%Ht~K=vi@9D(+Lzc`R#dJx8sf`hSXH zh>4~6_)+oU_f10nQ!dSp|5%s()^%B9zAvr%s}T+MXPeWxYxU&}hWP4B%|bs>-_QNv z(tI!feahyOd~xvVYFelc*8VDjPm18u558_&-YsqVnUd^Zzm$8Y_h;+lsND5ajRxf* zz|RYKT`v8*@raI{N5Lv=YSwXPn}1v=ZXO-Fd+(Dz`2(-@)oBQZHSJ^C1@z1Os@xz2 z27IatxDg=>yji(6QyH|&47V2S9>>{ceBt;wshQqk#jbc-mad-n9X7_lY4)2Ut(T<| zVM|FmhruT&ZNG62>ssY--{i@$2TmuW<^+bf(Qc`PYd39`yE}{Vngngef`8VJ4WH)a z+%wpihU!|du&Y{Ox29dOYBp9pY2A@r8NSV>>DR8ZRifZDpM0(Re@CwKe3I2lr>#GZ z2w{VGLpS-jXDzeQ?2ZMyIhBqHn%_8mrh5!dRM0e=aZaZf=tcD`$;489lIoA(5F*>c z@|IaFn5~z6{G*LruqLGahkrKKgg}60puvMl?ycjxrIy&TL#8*jbNFm%`b*nMWVkpe z2V>myw7EaLwDS8#2fQQ7@%&_W_wMiA>Ez?1nn`~;xtGRXY-YEZPXC?Tm{B>d@?n=@ zHdlSKxxdrXaT=Vpg!V`wJ3hS^*dBds7v5btsm8Oq_G&vrLV>M=>VLzFd_vu|N~mRj z2POcGZp)Uw?Mz$!3|M=kzG+zix)he&0DPw^w^aROwT=0kvbh?6(RZo)zS%PSfXw{z^i6Mc*UGjUyt>~x2O7zNvg3XzkfqI!F|;nmc6dILDAkp&)=Z=Rr~rG**_YiP+LUZX7%fycm2iN zPGhsyBz(JvLJenS{QUe}4SXu(9va-?(I7$)sj3ycR(@@cc0sxPaZ}#Um79u~K1%fz zO2~Ae?55h)l0wmmaP9Ct~q-7w{#c0_j;qKh98&_RTxM48+dbh#szUk*64O(WggCuBJ z+k$FxJc!pPLG*{|?GMx2AEviIOmBZP(_3x3Y|Z#~zX|QZHo0vlDE`Jaw%W#vJM3V0 zx~(ZKB<1K-S5x7~z`Y0WA9?Ft^J2S(Zv2mCJ;$bQ^ncfyZDgzM#cXL+Fz*}&*LRtL zbi_L?e482HX`{Nfmf20RWxMUbPU^h#X=w~8~?$ZAZ>qB%f+7c zFLO21a(`VGy>+m%=K9X=RQJonb8|N%+R)#poLTDDUAEt-pk4mm6f}32qEgA?|9C3d zANvZw@c_yTmaBQ{q_#d)4xU@L8#Z$TzI1YVwAHKN(y>pZC&ZO_kuc3jsG7XksaTtZ zPJeIa@_gH{Y2Ey8mXFbx?uu_T5A9`tZf?M;%=Qg~e&vR5!wX)yvHovh$S>|O+FBTqNJ3zO`t5Ud_#r!KAz6spHrE7br=* z8Y?}=Rq2W?*<|Hizl zy_V|xJ=X_jWxW3hM*U99oX53qU#mo?^9$7tjCcjdp7*CV)@Z!A^D%uPz;dzp6!$ZPP{L7O>nxem}lfOU1kW`52dE*<<)<_XiuE|EF)? z9W;IZt1h-sZTYGdyY-9|d0ooenrET6n?9_0ZYh49@$R_$JJ_x_hWeXpB|m9FZ}qJC zz!gQ`Vah`nA+58)NB2=#l-mnc9)HkX7`^iDqaUBA#pH5lJfH079Cj28b`(GxXF<9O zN{7RTRnQjo;DH6T3b3O{6n=BVEwt0^PAwk9b8f?Z;8uPeci;?-%|o1b0?^sdVGi-t zf;(;x^egVKs`Ru@tqrP=*_UbIey)>FrmF9)QZyQP??LnL4d(s2+_F9R?0>=AgM(_e zGzit~IQfRz@&6#iSD-9y{huOK5xa4J<4pBi)z+td)w`9#da#2YUwoVs3pw! z3DeWF%kffo;)QP=%~i3{Ent&7j^40%4L7}83uOEDdd7ZRVYYkqs+Z&8uD$AXTm5_4 zs#p&E4H%1|b*vf}xVztb(tlQqs=T$miS2s`s^(BQ)i(}3^U_`ClLcLNR@pVT869o^ z)X9(MC#vUo)H8t4v5G=XJQ&gRm(Adgr@DYWOEo zOtRMcIl=eWuenvTy`~^JhO2gW+pbxE*Ng8p57Bm@d=MBLC)(VTK!0~6gi>uJRa4Lr z#cdwnRw|dkEmdQ>@SwDsQ;ec!yw}SLTPN^sCm9c0Pck0XPcj~!3|kt$UBxK;1_UV0 zt@cFSa9pwbThxH*b~Qi^_2Q4A{y+3k?~L>h&A5UjLFE*Xmm48Omd+r=;zhuz*7q1MpuC4c5E8?6AtkQd_3jXyf2mS9$by6kJ zNPBDVp&hLSi?V*)&oH`)yYawN4=;$j$-qnSD+ZpxuN-*N3(|p?dO`1S;Pno@b)YxW z+szLh@8I#joSl8d+LKQBUq1e-H#&U$WTy5z|MK|2^A(iJ<$pVDpdh;Q(foLU&SP{l zUB17}o~!1(%oc+zs96UF`8vqTEqX1N50+|(_kN+KCiCJzbPqlM>EZ6~qk}I=bo-?r z9$ZYdA!BIcBlTczKFzka0|3EI*deW&0F z2t0B;=6EdJrD)ZIUSuEj-6i+!Uaf8GFMKFOqe4CEA2R(R!w1JwPsbp= 8 && util.ie().actualVersion <= 11){ this.options.youtube = { ytControls : 2, - color : "white" + color : "white", + modestbranding : 1 }; } else{ diff --git a/vendor/videojs/plugins/videojs.hotkeys.js b/vendor/videojs/plugins/videojs.hotkeys.js index c3245f2..c6a2045 100644 --- a/vendor/videojs/plugins/videojs.hotkeys.js +++ b/vendor/videojs/plugins/videojs.hotkeys.js @@ -73,7 +73,7 @@ // Remove player outline to fix video performance issue pEl.style.outline = "none"; - if (alwaysCaptureHotkeys || !player.autoplay()) { + if (alwaysCaptureHotkeys || !player.options_.autoplay) { player.one('play', function() { pEl.focus(); // Fixes the .vjs-big-play-button handing focus back to body instead of the player }); diff --git a/vendor/videojs/video.js b/vendor/videojs/video.js index 3ea2b1c..258cd06 100644 --- a/vendor/videojs/video.js +++ b/vendor/videojs/video.js @@ -1,6 +1,6 @@ /** * @license - * Video.js 5.13.1 + * Video.js 5.12.6 * Copyright Brightcove, Inc. * Available under Apache License Version 2.0 * @@ -46,10 +46,10 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var BigPlayButton = function (_Button) { _inherits(BigPlayButton, _Button); - function BigPlayButton() { + function BigPlayButton(player, options) { _classCallCheck(this, BigPlayButton); - return _possibleConstructorReturn(this, _Button.apply(this, arguments)); + return _possibleConstructorReturn(this, _Button.call(this, player, options)); } /** @@ -58,6 +58,8 @@ var BigPlayButton = function (_Button) { * @return {String} The constructed class name * @method buildCSSClass */ + + BigPlayButton.prototype.buildCSSClass = function buildCSSClass() { return 'vjs-big-play-button'; }; @@ -94,11 +96,11 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _log = _dereq_(87); +var _log = _dereq_(85); var _log2 = _interopRequireDefault(_log); -var _object = _dereq_(139); +var _object = _dereq_(136); var _object2 = _interopRequireDefault(_object); @@ -124,10 +126,10 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var Button = function (_ClickableComponent) { _inherits(Button, _ClickableComponent); - function Button() { + function Button(player, options) { _classCallCheck(this, Button); - return _possibleConstructorReturn(this, _ClickableComponent.apply(this, arguments)); + return _possibleConstructorReturn(this, _ClickableComponent.call(this, player, options)); } /** @@ -139,6 +141,8 @@ var Button = function (_ClickableComponent) { * @return {Element} * @method createEl */ + + Button.prototype.createEl = function createEl() { var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'button'; var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; @@ -201,32 +205,6 @@ var Button = function (_ClickableComponent) { return _component2['default'].prototype.addChild.call(this, child, options); }; - /** - * Enable the button element - * - * @return {Component} - * @method enable - */ - - - Button.prototype.enable = function enable() { - _ClickableComponent.prototype.enable.call(this); - this.el_.removeAttribute('disabled'); - }; - - /** - * Disable the button element - * - * @return {Component} - * @method disable - */ - - - Button.prototype.disable = function disable() { - _ClickableComponent.prototype.disable.call(this); - this.el_.setAttribute('disabled', 'disabled'); - }; - /** * Handle KeyPress (document level) - Extend with specific functionality for button * @@ -251,7 +229,7 @@ var Button = function (_ClickableComponent) { _component2['default'].registerComponent('Button', Button); exports['default'] = Button; -},{"139":139,"3":3,"5":5,"87":87}],3:[function(_dereq_,module,exports){ +},{"136":136,"3":3,"5":5,"85":85}],3:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -260,27 +238,27 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _events = _dereq_(83); +var _events = _dereq_(81); var Events = _interopRequireWildcard(_events); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _log = _dereq_(87); +var _log = _dereq_(85); var _log2 = _interopRequireDefault(_log); -var _document = _dereq_(95); +var _document = _dereq_(92); var _document2 = _interopRequireDefault(_document); -var _object = _dereq_(139); +var _object = _dereq_(136); var _object2 = _interopRequireDefault(_object); @@ -315,7 +293,10 @@ var ClickableComponent = function (_Component) { _this.emitTapEvents(); - _this.enable(); + _this.on('tap', _this.handleClick); + _this.on('click', _this.handleClick); + _this.on('focus', _this.handleFocus); + _this.on('blur', _this.handleBlur); return _this; } @@ -352,8 +333,6 @@ var ClickableComponent = function (_Component) { 'aria-live': 'polite' }, attributes); - this.tabIndex_ = props.tabIndex; - var el = _Component.prototype.createEl.call(this, tag, props, attributes); this.createControlTextEl(el); @@ -422,6 +401,30 @@ var ClickableComponent = function (_Component) { return 'vjs-control vjs-button ' + _Component.prototype.buildCSSClass.call(this); }; + /** + * Adds a child component inside this clickable-component + * + * @param {String|Component} child The class name or instance of a child to add + * @param {Object=} options Options, including options to be passed to children of the child. + * @return {Component} The child component (created by this process if a string was used) + * @method addChild + */ + + + ClickableComponent.prototype.addChild = function addChild(child) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + // TODO: Fix adding an actionable child to a ClickableComponent; currently + // it will cause issues with assistive technology (e.g. screen readers) + // which support ARIA, since an element with role="button" cannot have + // actionable child elements. + + // let className = this.constructor.name; + // log.warn(`Adding a child to a ClickableComponent (${className}) can cause issues with assistive technology which supports ARIA, since an element with role="button" cannot have actionable child elements.`); + + return _Component.prototype.addChild.call(this, child, options); + }; + /** * Enable the component element * @@ -433,13 +436,6 @@ var ClickableComponent = function (_Component) { ClickableComponent.prototype.enable = function enable() { this.removeClass('vjs-disabled'); this.el_.setAttribute('aria-disabled', 'false'); - if (typeof this.tabIndex_ !== 'undefined') { - this.el_.setAttribute('tabIndex', this.tabIndex_); - } - this.on('tap', this.handleClick); - this.on('click', this.handleClick); - this.on('focus', this.handleFocus); - this.on('blur', this.handleBlur); return this; }; @@ -454,13 +450,6 @@ var ClickableComponent = function (_Component) { ClickableComponent.prototype.disable = function disable() { this.addClass('vjs-disabled'); this.el_.setAttribute('aria-disabled', 'true'); - if (typeof this.tabIndex_ !== 'undefined') { - this.el_.removeAttribute('tabIndex'); - } - this.off('tap', this.handleClick); - this.off('click', this.handleClick); - this.off('focus', this.handleFocus); - this.off('blur', this.handleBlur); return this; }; @@ -521,7 +510,7 @@ var ClickableComponent = function (_Component) { _component2['default'].registerComponent('ClickableComponent', ClickableComponent); exports['default'] = ClickableComponent; -},{"139":139,"5":5,"82":82,"83":83,"84":84,"87":87,"95":95}],4:[function(_dereq_,module,exports){ +},{"136":136,"5":5,"80":80,"81":81,"82":82,"85":85,"92":92}],4:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -580,35 +569,35 @@ exports['default'] = CloseButton; exports.__esModule = true; -var _window = _dereq_(96); +var _window = _dereq_(93); var _window2 = _interopRequireDefault(_window); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _guid = _dereq_(86); +var _guid = _dereq_(84); var Guid = _interopRequireWildcard(_guid); -var _events = _dereq_(83); +var _events = _dereq_(81); var Events = _interopRequireWildcard(_events); -var _log = _dereq_(87); +var _log = _dereq_(85); var _log2 = _interopRequireDefault(_log); -var _toTitleCase = _dereq_(92); +var _toTitleCase = _dereq_(89); var _toTitleCase2 = _interopRequireDefault(_toTitleCase); -var _mergeOptions = _dereq_(88); +var _mergeOptions = _dereq_(86); var _mergeOptions2 = _interopRequireDefault(_mergeOptions); @@ -939,12 +928,6 @@ var Component = function () { Component.prototype.getChild = function getChild(name) { - if (!name) { - return; - } - - name = (0, _toTitleCase2['default'])(name); - return this.childNameIndex_[name]; }; @@ -985,9 +968,9 @@ var Component = function () { var component = void 0; var componentName = void 0; - // If child is a string, create component with options + // If child is a string, create nt with options if (typeof child === 'string') { - componentName = (0, _toTitleCase2['default'])(child); + componentName = child; // Options can also be specified as a boolean, so convert to an empty object if false. if (!options) { @@ -1000,7 +983,9 @@ var Component = function () { options = {}; } - var componentClassName = options.componentClass || componentName; + // If no componentClass in options, assume componentClass is the name lowercased + // (e.g. playButton) + var componentClassName = options.componentClass || (0, _toTitleCase2['default'])(componentName); // Set name through options options.name = componentName; @@ -1675,48 +1660,6 @@ var Component = function () { return this; }; - /** - * Get the value of an attribute on the component's element - * - * @param {String} attribute Attribute to get - * @return {String} - * @method getAttribute - */ - - - Component.prototype.getAttribute = function getAttribute(attribute) { - return Dom.getAttribute(this.el_, attribute); - }; - - /** - * Set the value of an attribute on the component's element - * - * @param {String} attribute Attribute to set - * @param {String} value Value to set the attribute to - * @return {Component} - * @method setAttribute - */ - - - Component.prototype.setAttribute = function setAttribute(attribute, value) { - Dom.setAttribute(this.el_, attribute, value); - return this; - }; - - /** - * Remove an attribute from the component's element - * - * @param {String} attribute Attribute to remove - * @return {Component} - * @method removeAttribute - */ - - - Component.prototype.removeAttribute = function removeAttribute(attribute) { - Dom.removeAttribute(this.el_, attribute); - return this; - }; - /** * Set or get the width of the component (CSS values) * Setting the video tag dimension values only works with values in pixels. @@ -1854,20 +1797,16 @@ var Component = function () { var computedStyle = _window2['default'].getComputedStyle(this.el_); computedWidthOrHeight = computedStyle.getPropertyValue(widthOrHeight) || computedStyle[widthOrHeight]; - } - - // remove 'px' from variable and parse as integer - computedWidthOrHeight = parseFloat(computedWidthOrHeight); - - // if the computed value is still 0, it's possible that the browser is lying - // and we want to check the offset values. - // This code also runs on IE8 and wherever getComputedStyle doesn't exist. - if (computedWidthOrHeight === 0) { + } else if (this.el_.currentStyle) { + // ie 8 doesn't support computed style, shim it + // return clientWidth or clientHeight instead for better accuracy var rule = 'offset' + (0, _toTitleCase2['default'])(widthOrHeight); computedWidthOrHeight = this.el_[rule]; } + // remove 'px' from variable and parse as integer + computedWidthOrHeight = parseFloat(computedWidthOrHeight); return computedWidthOrHeight; }; @@ -2156,18 +2095,11 @@ var Component = function () { Component.registerComponent = function registerComponent(name, comp) { - if (!name) { - return; - } - - name = (0, _toTitleCase2['default'])(name); - if (!Component.components_) { Component.components_ = {}; } Component.components_[name] = comp; - return comp; }; @@ -2182,19 +2114,12 @@ var Component = function () { Component.getComponent = function getComponent(name) { - if (!name) { - return; - } - - name = (0, _toTitleCase2['default'])(name); - if (Component.components_ && Component.components_[name]) { return Component.components_[name]; } if (_window2['default'] && _window2['default'].videojs && _window2['default'].videojs[name]) { _log2['default'].warn('The ' + name + ' component was added to the videojs object when it should be registered using videojs.registerComponent(name, component)'); - return _window2['default'].videojs[name]; } }; @@ -2257,7 +2182,7 @@ var Component = function () { Component.registerComponent('Component', Component); exports['default'] = Component; -},{"82":82,"83":83,"84":84,"86":86,"87":87,"88":88,"92":92,"96":96}],6:[function(_dereq_,module,exports){ +},{"80":80,"81":81,"82":82,"84":84,"85":85,"86":86,"89":89,"93":93}],6:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -2371,7 +2296,7 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); @@ -2466,7 +2391,7 @@ var AudioTrackMenuItem = function (_MenuItem) { _component2['default'].registerComponent('AudioTrackMenuItem', AudioTrackMenuItem); exports['default'] = AudioTrackMenuItem; -},{"48":48,"5":5,"84":84}],8:[function(_dereq_,module,exports){ +},{"48":48,"5":5,"82":82}],8:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -2665,7 +2590,7 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); @@ -2740,7 +2665,7 @@ var LiveDisplay = function (_Component) { _component2['default'].registerComponent('LiveDisplay', LiveDisplay); exports['default'] = LiveDisplay; -},{"5":5,"82":82}],11:[function(_dereq_,module,exports){ +},{"5":5,"80":80}],11:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -2753,7 +2678,7 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); @@ -2872,7 +2797,7 @@ MuteToggle.prototype.controlText_ = 'Mute'; _component2['default'].registerComponent('MuteToggle', MuteToggle); exports['default'] = MuteToggle; -},{"2":2,"5":5,"82":82}],12:[function(_dereq_,module,exports){ +},{"2":2,"5":5,"80":80}],12:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -3001,7 +2926,7 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); @@ -3193,7 +3118,7 @@ PlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate'; _component2['default'].registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton); exports['default'] = PlaybackRateMenuButton; -},{"14":14,"47":47,"49":49,"5":5,"82":82}],14:[function(_dereq_,module,exports){ +},{"14":14,"47":47,"49":49,"5":5,"80":80}],14:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -3287,7 +3212,7 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); @@ -3393,35 +3318,35 @@ var LoadProgressBar = function (_Component) { _component2['default'].registerComponent('LoadProgressBar', LoadProgressBar); exports['default'] = LoadProgressBar; -},{"5":5,"82":82}],16:[function(_dereq_,module,exports){ +},{"5":5,"80":80}],16:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; +var _window = _dereq_(93); + +var _window2 = _interopRequireDefault(_window); + var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _formatTime = _dereq_(85); +var _formatTime = _dereq_(83); var _formatTime2 = _interopRequireDefault(_formatTime); -var _throttle = _dereq_(101); +var _throttle = _dereq_(98); var _throttle2 = _interopRequireDefault(_throttle); -var _computedStyle = _dereq_(81); - -var _computedStyle2 = _interopRequireDefault(_computedStyle); - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } @@ -3501,7 +3426,7 @@ var MouseTimeDisplay = function (_Component) { if (this.keepTooltipsInside) { var clampedPosition = this.clampPosition_(position); var difference = position - clampedPosition + 1; - var tooltipWidth = parseFloat((0, _computedStyle2['default'])(this.tooltip, 'width')); + var tooltipWidth = parseFloat(_window2['default'].getComputedStyle(this.tooltip).width); var tooltipWidthHalf = tooltipWidth / 2; this.tooltip.innerHTML = time; @@ -3530,8 +3455,8 @@ var MouseTimeDisplay = function (_Component) { return position; } - var playerWidth = parseFloat((0, _computedStyle2['default'])(this.player().el(), 'width')); - var tooltipWidth = parseFloat((0, _computedStyle2['default'])(this.tooltip, 'width')); + var playerWidth = parseFloat(_window2['default'].getComputedStyle(this.player().el()).width); + var tooltipWidth = parseFloat(_window2['default'].getComputedStyle(this.tooltip).width); var tooltipWidthHalf = tooltipWidth / 2; var actualPosition = position; @@ -3550,7 +3475,7 @@ var MouseTimeDisplay = function (_Component) { _component2['default'].registerComponent('MouseTimeDisplay', MouseTimeDisplay); exports['default'] = MouseTimeDisplay; -},{"101":101,"5":5,"81":81,"82":82,"84":84,"85":85}],17:[function(_dereq_,module,exports){ +},{"5":5,"80":80,"82":82,"83":83,"93":93,"98":98}],17:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -3559,11 +3484,11 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _formatTime = _dereq_(85); +var _formatTime = _dereq_(83); var _formatTime2 = _interopRequireDefault(_formatTime); @@ -3637,7 +3562,7 @@ var PlayProgressBar = function (_Component) { _component2['default'].registerComponent('PlayProgressBar', PlayProgressBar); exports['default'] = PlayProgressBar; -},{"5":5,"84":84,"85":85}],18:[function(_dereq_,module,exports){ +},{"5":5,"82":82,"83":83}],18:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -3706,6 +3631,10 @@ exports['default'] = ProgressControl; exports.__esModule = true; +var _window = _dereq_(93); + +var _window2 = _interopRequireDefault(_window); + var _slider = _dereq_(57); var _slider2 = _interopRequireDefault(_slider); @@ -3714,18 +3643,14 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _formatTime = _dereq_(85); +var _formatTime = _dereq_(83); var _formatTime2 = _interopRequireDefault(_formatTime); -var _computedStyle = _dereq_(81); - -var _computedStyle2 = _interopRequireDefault(_computedStyle); - _dereq_(15); _dereq_(17); @@ -3805,8 +3730,8 @@ var SeekBar = function (_Slider) { this.updateAriaAttributes(this.tooltipProgressBar.el_); this.tooltipProgressBar.el_.style.width = this.bar.el_.style.width; - var playerWidth = parseFloat((0, _computedStyle2['default'])(this.player().el(), 'width')); - var tooltipWidth = parseFloat((0, _computedStyle2['default'])(this.tooltipProgressBar.tooltip, 'width')); + var playerWidth = parseFloat(_window2['default'].getComputedStyle(this.player().el()).width); + var tooltipWidth = parseFloat(_window2['default'].getComputedStyle(this.tooltipProgressBar.tooltip).width); var tooltipStyle = this.tooltipProgressBar.el().style; tooltipStyle.maxWidth = Math.floor(playerWidth - tooltipWidth / 2) + 'px'; @@ -3927,7 +3852,7 @@ SeekBar.prototype.playerEvent = 'timeupdate'; _component2['default'].registerComponent('SeekBar', SeekBar); exports['default'] = SeekBar; -},{"15":15,"17":17,"20":20,"5":5,"57":57,"81":81,"84":84,"85":85}],20:[function(_dereq_,module,exports){ +},{"15":15,"17":17,"20":20,"5":5,"57":57,"82":82,"83":83,"93":93}],20:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -3936,11 +3861,11 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _formatTime = _dereq_(85); +var _formatTime = _dereq_(83); var _formatTime2 = _interopRequireDefault(_formatTime); @@ -4012,7 +3937,7 @@ var TooltipProgressBar = function (_Component) { _component2['default'].registerComponent('TooltipProgressBar', TooltipProgressBar); exports['default'] = TooltipProgressBar; -},{"5":5,"84":84,"85":85}],21:[function(_dereq_,module,exports){ +},{"5":5,"82":82,"83":83}],21:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -4365,11 +4290,11 @@ var _menu = _dereq_(49); var _menu2 = _interopRequireDefault(_menu); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _toTitleCase = _dereq_(92); +var _toTitleCase = _dereq_(89); var _toTitleCase2 = _interopRequireDefault(_toTitleCase); @@ -4544,7 +4469,7 @@ ChaptersButton.prototype.controlText_ = 'Chapters'; _component2['default'].registerComponent('ChaptersButton', ChaptersButton); exports['default'] = ChaptersButton; -},{"26":26,"30":30,"31":31,"49":49,"5":5,"82":82,"92":92}],26:[function(_dereq_,module,exports){ +},{"26":26,"30":30,"31":31,"49":49,"5":5,"80":80,"89":89}],26:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -4557,7 +4482,7 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); @@ -4638,7 +4563,7 @@ var ChaptersTrackMenuItem = function (_MenuItem) { _component2['default'].registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem); exports['default'] = ChaptersTrackMenuItem; -},{"48":48,"5":5,"84":84}],27:[function(_dereq_,module,exports){ +},{"48":48,"5":5,"82":82}],27:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -4651,7 +4576,7 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); @@ -4752,7 +4677,7 @@ DescriptionsButton.prototype.controlText_ = 'Descriptions'; _component2['default'].registerComponent('DescriptionsButton', DescriptionsButton); exports['default'] = DescriptionsButton; -},{"30":30,"5":5,"84":84}],28:[function(_dereq_,module,exports){ +},{"30":30,"5":5,"82":82}],28:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -5015,15 +4940,15 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _window = _dereq_(96); +var _window = _dereq_(93); var _window2 = _interopRequireDefault(_window); -var _document = _dereq_(95); +var _document = _dereq_(92); var _document2 = _interopRequireDefault(_document); @@ -5157,7 +5082,7 @@ var TextTrackMenuItem = function (_MenuItem) { _component2['default'].registerComponent('TextTrackMenuItem', TextTrackMenuItem); exports['default'] = TextTrackMenuItem; -},{"48":48,"5":5,"84":84,"95":95,"96":96}],32:[function(_dereq_,module,exports){ +},{"48":48,"5":5,"82":82,"92":92,"93":93}],32:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -5166,11 +5091,11 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _formatTime = _dereq_(85); +var _formatTime = _dereq_(83); var _formatTime2 = _interopRequireDefault(_formatTime); @@ -5258,7 +5183,7 @@ var CurrentTimeDisplay = function (_Component) { _component2['default'].registerComponent('CurrentTimeDisplay', CurrentTimeDisplay); exports['default'] = CurrentTimeDisplay; -},{"5":5,"82":82,"85":85}],33:[function(_dereq_,module,exports){ +},{"5":5,"80":80,"83":83}],33:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -5267,11 +5192,11 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _formatTime = _dereq_(85); +var _formatTime = _dereq_(83); var _formatTime2 = _interopRequireDefault(_formatTime); @@ -5366,7 +5291,7 @@ var DurationDisplay = function (_Component) { _component2['default'].registerComponent('DurationDisplay', DurationDisplay); exports['default'] = DurationDisplay; -},{"5":5,"82":82,"85":85}],34:[function(_dereq_,module,exports){ +},{"5":5,"80":80,"83":83}],34:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -5375,11 +5300,11 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _formatTime = _dereq_(85); +var _formatTime = _dereq_(83); var _formatTime2 = _interopRequireDefault(_formatTime); @@ -5472,7 +5397,7 @@ var RemainingTimeDisplay = function (_Component) { _component2['default'].registerComponent('RemainingTimeDisplay', RemainingTimeDisplay); exports['default'] = RemainingTimeDisplay; -},{"5":5,"82":82,"85":85}],35:[function(_dereq_,module,exports){ +},{"5":5,"80":80,"83":83}],35:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -5542,7 +5467,7 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); @@ -5603,7 +5528,7 @@ var TrackButton = function (_MenuButton) { _component2['default'].registerComponent('TrackButton', TrackButton); exports['default'] = TrackButton; -},{"47":47,"5":5,"84":84}],37:[function(_dereq_,module,exports){ +},{"47":47,"5":5,"82":82}],37:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -5616,7 +5541,7 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); @@ -5760,7 +5685,7 @@ VolumeBar.prototype.playerEvent = 'volumechange'; _component2['default'].registerComponent('VolumeBar', VolumeBar); exports['default'] = VolumeBar; -},{"39":39,"5":5,"57":57,"84":84}],38:[function(_dereq_,module,exports){ +},{"39":39,"5":5,"57":57,"82":82}],38:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -5900,7 +5825,7 @@ exports['default'] = VolumeLevel; exports.__esModule = true; -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); @@ -6089,7 +6014,7 @@ VolumeMenuButton.prototype.controlText_ = 'Mute'; _component2['default'].registerComponent('VolumeMenuButton', VolumeMenuButton); exports['default'] = VolumeMenuButton; -},{"11":11,"37":37,"5":5,"53":53,"54":54,"84":84}],41:[function(_dereq_,module,exports){ +},{"11":11,"37":37,"5":5,"53":53,"54":54,"82":82}],41:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -6102,7 +6027,7 @@ var _modalDialog = _dereq_(50); var _modalDialog2 = _interopRequireDefault(_modalDialog); -var _mergeOptions = _dereq_(88); +var _mergeOptions = _dereq_(86); var _mergeOptions2 = _interopRequireDefault(_mergeOptions); @@ -6181,12 +6106,12 @@ ErrorDisplay.prototype.options_ = (0, _mergeOptions2['default'])(_modalDialog2[' _component2['default'].registerComponent('ErrorDisplay', ErrorDisplay); exports['default'] = ErrorDisplay; -},{"5":5,"50":50,"88":88}],42:[function(_dereq_,module,exports){ +},{"5":5,"50":50,"86":86}],42:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -var _events = _dereq_(83); +var _events = _dereq_(81); var Events = _interopRequireWildcard(_events); @@ -6247,14 +6172,14 @@ EventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger; exports['default'] = EventTarget; -},{"83":83}],43:[function(_dereq_,module,exports){ +},{"81":81}],43:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; -var _log = _dereq_(87); +var _log = _dereq_(85); var _log2 = _interopRequireDefault(_log); @@ -6340,12 +6265,12 @@ var extendFn = function extendFn(superClass) { exports['default'] = extendFn; -},{"87":87}],44:[function(_dereq_,module,exports){ +},{"85":85}],44:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -var _document = _dereq_(95); +var _document = _dereq_(92); var _document2 = _interopRequireDefault(_document); @@ -6396,7 +6321,7 @@ if (browserApi) { exports['default'] = FullscreenApi; -},{"95":95}],45:[function(_dereq_,module,exports){ +},{"92":92}],45:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -6461,7 +6386,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol */ -var _object = _dereq_(139); +var _object = _dereq_(136); var _object2 = _interopRequireDefault(_object); @@ -6559,7 +6484,7 @@ for (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) { exports['default'] = MediaError; -},{"139":139}],47:[function(_dereq_,module,exports){ +},{"136":136}],47:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -6576,15 +6501,15 @@ var _menu = _dereq_(49); var _menu2 = _interopRequireDefault(_menu); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _toTitleCase = _dereq_(92); +var _toTitleCase = _dereq_(89); var _toTitleCase2 = _interopRequireDefault(_toTitleCase); @@ -6889,7 +6814,7 @@ var MenuButton = function (_ClickableComponent) { _component2['default'].registerComponent('MenuButton', MenuButton); exports['default'] = MenuButton; -},{"3":3,"49":49,"5":5,"82":82,"84":84,"92":92}],48:[function(_dereq_,module,exports){ +},{"3":3,"49":49,"5":5,"80":80,"82":82,"89":89}],48:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -6902,7 +6827,7 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _object = _dereq_(139); +var _object = _dereq_(136); var _object2 = _interopRequireDefault(_object); @@ -7008,7 +6933,7 @@ var MenuItem = function (_ClickableComponent) { _component2['default'].registerComponent('MenuItem', MenuItem); exports['default'] = MenuItem; -},{"139":139,"3":3,"5":5}],49:[function(_dereq_,module,exports){ +},{"136":136,"3":3,"5":5}],49:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -7017,15 +6942,15 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _events = _dereq_(83); +var _events = _dereq_(81); var Events = _interopRequireWildcard(_events); @@ -7204,16 +7129,16 @@ var Menu = function (_Component) { _component2['default'].registerComponent('Menu', Menu); exports['default'] = Menu; -},{"5":5,"82":82,"83":83,"84":84}],50:[function(_dereq_,module,exports){ +},{"5":5,"80":80,"81":81,"82":82}],50:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); @@ -7632,7 +7557,7 @@ ModalDialog.prototype.options_ = { _component2['default'].registerComponent('ModalDialog', ModalDialog); exports['default'] = ModalDialog; -},{"5":5,"82":82,"84":84}],51:[function(_dereq_,module,exports){ +},{"5":5,"80":80,"82":82}],51:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -7641,47 +7566,47 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _document = _dereq_(95); +var _document = _dereq_(92); var _document2 = _interopRequireDefault(_document); -var _window = _dereq_(96); +var _window = _dereq_(93); var _window2 = _interopRequireDefault(_window); -var _events = _dereq_(83); +var _events = _dereq_(81); var Events = _interopRequireWildcard(_events); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _guid = _dereq_(86); +var _guid = _dereq_(84); var Guid = _interopRequireWildcard(_guid); -var _browser = _dereq_(79); +var _browser = _dereq_(78); var browser = _interopRequireWildcard(_browser); -var _log = _dereq_(87); +var _log = _dereq_(85); var _log2 = _interopRequireDefault(_log); -var _toTitleCase = _dereq_(92); +var _toTitleCase = _dereq_(89); var _toTitleCase2 = _interopRequireDefault(_toTitleCase); -var _timeRanges = _dereq_(91); +var _timeRanges = _dereq_(88); -var _buffer = _dereq_(80); +var _buffer = _dereq_(79); -var _stylesheet = _dereq_(90); +var _stylesheet = _dereq_(87); var stylesheet = _interopRequireWildcard(_stylesheet); @@ -7693,19 +7618,19 @@ var _mediaError = _dereq_(46); var _mediaError2 = _interopRequireDefault(_mediaError); -var _tuple = _dereq_(148); +var _tuple = _dereq_(145); var _tuple2 = _interopRequireDefault(_tuple); -var _object = _dereq_(139); +var _object = _dereq_(136); var _object2 = _interopRequireDefault(_object); -var _mergeOptions = _dereq_(88); +var _mergeOptions = _dereq_(86); var _mergeOptions2 = _interopRequireDefault(_mergeOptions); -var _textTrackListConverter = _dereq_(70); +var _textTrackListConverter = _dereq_(69); var _textTrackListConverter2 = _interopRequireDefault(_textTrackListConverter); @@ -7713,25 +7638,25 @@ var _modalDialog = _dereq_(50); var _modalDialog2 = _interopRequireDefault(_modalDialog); -var _tech = _dereq_(63); +var _tech = _dereq_(62); var _tech2 = _interopRequireDefault(_tech); -var _audioTrackList = _dereq_(64); +var _audioTrackList = _dereq_(63); var _audioTrackList2 = _interopRequireDefault(_audioTrackList); -var _videoTrackList = _dereq_(77); +var _videoTrackList = _dereq_(76); var _videoTrackList2 = _interopRequireDefault(_videoTrackList); -_dereq_(62); +_dereq_(61); -_dereq_(60); +_dereq_(59); _dereq_(55); -_dereq_(69); +_dereq_(68); _dereq_(45); @@ -7743,9 +7668,9 @@ _dereq_(8); _dereq_(41); -_dereq_(72); +_dereq_(71); -_dereq_(61); +_dereq_(60); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } @@ -8236,7 +8161,7 @@ var Player = function (_Component) { }; /** - * Get/set fluid mode + * Add/remove the vjs-fluid class * * @param {Boolean} bool Value of true adds the class, value of false removes the class */ @@ -8254,8 +8179,6 @@ var Player = function (_Component) { } else { this.removeClass('vjs-fluid'); } - - this.updateStyleEl_(); }; /** @@ -8316,7 +8239,7 @@ var Player = function (_Component) { if (this.aspectRatio_ !== undefined && this.aspectRatio_ !== 'auto') { // Use any aspectRatio that's been specifically set aspectRatio = this.aspectRatio_; - } else if (this.videoWidth() > 0) { + } else if (this.videoWidth()) { // Otherwise try to get the aspect ratio from the video metadata aspectRatio = this.videoWidth() + ':' + this.videoHeight(); } else { @@ -8415,13 +8338,10 @@ var Player = function (_Component) { if (source) { this.currentType_ = source.type; - if (source.src === this.cache_.src && this.cache_.currentTime > 0) { techOptions.startTime = this.cache_.currentTime; } - this.cache_.sources = null; - this.cache_.source = source; this.cache_.src = source.src; } @@ -9719,10 +9639,7 @@ var Player = function (_Component) { // the tech loop to check for a compatible technology this.sourceList_([source]); } else { - this.cache_.sources = null; - this.cache_.source = source; this.cache_.src = source.src; - this.currentType_ = source.type || ''; // wait until the tech is ready to set the source @@ -9773,8 +9690,6 @@ var Player = function (_Component) { // load this technology with the chosen source this.loadTech_(sourceTech.tech, sourceTech.source); } - - this.cache_.sources = sources; } else { // We need to wrap this in a timeout to give folks a chance to add error event handlers this.setTimeout(function () { @@ -9813,45 +9728,6 @@ var Player = function (_Component) { return this; }; - /** - * Returns the current source objects. - * - * @return {Object[]} The current source objects - * @method currentSources - */ - - - Player.prototype.currentSources = function currentSources() { - var source = this.currentSource(); - var sources = []; - - // assume `{}` or `{ src }` - if (Object.keys(source).length !== 0) { - sources.push(source); - } - - return this.cache_.sources || sources; - }; - - /** - * Returns the current source object. - * - * @return {Object} The current source object - * @method currentSource - */ - - - Player.prototype.currentSource = function currentSource() { - var source = {}; - var src = this.currentSrc(); - - if (src) { - source.src = src; - } - - return this.cache_.source || source; - }; - /** * Returns the fully qualified URL of the current source value e.g. http://mysite.com/video.mp4 * Can be used in conjuction with `currentType` to assist in rebuilding the current source object. @@ -10423,22 +10299,15 @@ var Player = function (_Component) { }; /** - * Creates a remote text track object and returns an html track element. + * Add a remote text track * - * @param {Object} options The object should contain values for - * kind, language, label, and src (location of the WebVTT file) - * @param {Boolean} [manualCleanup=true] if set to false, the TextTrack will be - * automatically removed from the video element whenever the source changes - * @return {HTMLTrackElement} An Html Track Element. - * This can be an emulated {@link HTMLTrackElement} or a native one. - * @deprecated The default value of the "manualCleanup" parameter will default - * to "false" in upcoming versions of Video.js + * @param {Object} options Options for remote text track */ - Player.prototype.addRemoteTextTrack = function addRemoteTextTrack(options, manualCleanup) { + Player.prototype.addRemoteTextTrack = function addRemoteTextTrack(options) { if (this.tech_) { - return this.tech_.addRemoteTextTrack(options, manualCleanup); + return this.tech_.addRemoteTextTrack(options); } }; @@ -10601,10 +10470,6 @@ var Player = function (_Component) { var tagOptions = Dom.getElAttributes(tag); var dataSetup = tagOptions['data-setup']; - if (Dom.hasElClass(tag, 'vjs-fluid')) { - tagOptions.fluid = true; - } - // Check if data-setup attr exists. if (dataSetup !== null) { // Parse options JSON @@ -10860,7 +10725,7 @@ TECH_EVENTS_RETRIGGER.forEach(function (event) { _component2['default'].registerComponent('Player', Player); exports['default'] = Player; -},{"1":1,"139":139,"148":148,"4":4,"41":41,"44":44,"45":45,"46":46,"5":5,"50":50,"55":55,"60":60,"61":61,"62":62,"63":63,"64":64,"69":69,"70":70,"72":72,"77":77,"79":79,"8":8,"80":80,"82":82,"83":83,"84":84,"86":86,"87":87,"88":88,"90":90,"91":91,"92":92,"95":95,"96":96}],52:[function(_dereq_,module,exports){ +},{"1":1,"136":136,"145":145,"4":4,"41":41,"44":44,"45":45,"46":46,"5":5,"50":50,"55":55,"59":59,"60":60,"61":61,"62":62,"63":63,"68":68,"69":69,"71":71,"76":76,"78":78,"79":79,"8":8,"80":80,"81":81,"82":82,"84":84,"85":85,"86":86,"87":87,"88":88,"89":89,"92":92,"93":93}],52:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -11015,15 +10880,15 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _events = _dereq_(83); +var _events = _dereq_(81); var Events = _interopRequireWildcard(_events); @@ -11106,7 +10971,7 @@ var Popup = function (_Component) { _component2['default'].registerComponent('Popup', Popup); exports['default'] = Popup; -},{"5":5,"82":82,"83":83,"84":84}],55:[function(_dereq_,module,exports){ +},{"5":5,"80":80,"81":81,"82":82}],55:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -11119,15 +10984,15 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _browser = _dereq_(79); +var _browser = _dereq_(78); var browser = _interopRequireWildcard(_browser); @@ -11273,21 +11138,21 @@ var PosterImage = function (_ClickableComponent) { _component2['default'].registerComponent('PosterImage', PosterImage); exports['default'] = PosterImage; -},{"3":3,"5":5,"79":79,"82":82,"84":84}],56:[function(_dereq_,module,exports){ +},{"3":3,"5":5,"78":78,"80":80,"82":82}],56:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; exports.hasLoaded = exports.autoSetupTimeout = exports.autoSetup = undefined; -var _events = _dereq_(83); +var _events = _dereq_(81); var Events = _interopRequireWildcard(_events); -var _document = _dereq_(95); +var _document = _dereq_(92); var _document2 = _interopRequireDefault(_document); -var _window = _dereq_(96); +var _window = _dereq_(93); var _window2 = _interopRequireDefault(_window); @@ -11390,7 +11255,7 @@ exports.autoSetup = autoSetup; exports.autoSetupTimeout = autoSetupTimeout; exports.hasLoaded = hasLoaded; -},{"83":83,"95":95,"96":96}],57:[function(_dereq_,module,exports){ +},{"81":81,"92":92,"93":93}],57:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -11399,11 +11264,11 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _object = _dereq_(139); +var _object = _dereq_(136); var _object2 = _interopRequireDefault(_object); @@ -11687,44 +11552,7 @@ var Slider = function (_Component) { _component2['default'].registerComponent('Slider', Slider); exports['default'] = Slider; -},{"139":139,"5":5,"82":82}],58:[function(_dereq_,module,exports){ -"use strict"; - -exports.__esModule = true; -exports["default"] = timeExpiringCache; -/** - * @file flash-cache.js - * - * Auto-caching method wrapper to avoid calling through to Flash too - * often. - */ - -/** - * Returns a new getter function that returns a cached value if - * invoked multiple times within the specified duration. - * - * @param {Function} getter the function to be cached - * @param {Number} cacheDuration the number of milliseconds to cache - * results for - * @return {Function} a new function that returns cached results if - * invoked multiple times within the cache duration - */ -function timeExpiringCache(getter, cacheDuration) { - var result = function cachedGetter() { - var now = new Date().getTime(); - - if (now - result.lastCheckTime_ >= cacheDuration) { - result.lastCheckTime_ = now; - result.cache_ = getter(); - } - return result.cache_; - }; - - result.lastCheckTime_ = -Infinity; - return result; -} - -},{}],59:[function(_dereq_,module,exports){ +},{"136":136,"5":5,"80":80}],58:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -11848,42 +11676,38 @@ function FlashRtmpDecorator(Flash) { exports['default'] = FlashRtmpDecorator; -},{}],60:[function(_dereq_,module,exports){ +},{}],59:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -var _tech = _dereq_(63); +var _tech = _dereq_(62); var _tech2 = _interopRequireDefault(_tech); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _url = _dereq_(93); +var _url = _dereq_(90); var Url = _interopRequireWildcard(_url); -var _timeRanges = _dereq_(91); +var _timeRanges = _dereq_(88); -var _flashRtmp = _dereq_(59); +var _flashRtmp = _dereq_(58); var _flashRtmp2 = _interopRequireDefault(_flashRtmp); -var _flashCache = _dereq_(58); - -var _flashCache2 = _interopRequireDefault(_flashCache); - var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _window = _dereq_(96); +var _window = _dereq_(93); var _window2 = _interopRequireDefault(_window); -var _object = _dereq_(139); +var _object = _dereq_(136); var _object2 = _interopRequireDefault(_object); @@ -11951,34 +11775,6 @@ var Flash = function (_Tech) { _this.on('seeked', function () { this.lastSeekTarget_ = undefined; }); - - // calling into the SWF can be expensive, especially if Flash is - // busy rendering video frames - // automatically cache commonly used properties for a short period - // of time so that multiple calls within a short time period don't - // all pay a big performance penalty for properties that change - // relatively slowly over time - var getCurrentTimeCached = (0, _flashCache2['default'])(function () { - return _this.el_.vjs_getProperty('currentTime'); - }, 100); - - _this.currentTime = function (time) { - // when seeking make the reported time keep up with the requested time - // by reading the time we're seeking to - if (_this.seeking()) { - return _this.lastSeekTarget_ || 0; - } - - return getCurrentTimeCached(); - }; - _this.buffered = (0, _flashCache2['default'])(function () { - var ranges = _this.el_.vjs_getProperty('buffered'); - - if (ranges.length === 0) { - return (0, _timeRanges.createTimeRange)(); - } - return (0, _timeRanges.createTimeRange)(ranges[0][0], ranges[0][1]); - }, 100); return _this; } @@ -12153,6 +11949,16 @@ var Flash = function (_Tech) { * @method currentTime */ + + Flash.prototype.currentTime = function currentTime(time) { + // when seeking make the reported time keep up with the requested time + // by reading the time we're seeking to + if (this.seeking()) { + return this.lastSeekTarget_ || 0; + } + return this.el_.vjs_getProperty('currentTime'); + }; + /** * Get current source * @@ -12238,6 +12044,16 @@ var Flash = function (_Tech) { * @method buffered */ + + Flash.prototype.buffered = function buffered() { + var ranges = this.el_.vjs_getProperty('buffered'); + + if (ranges.length === 0) { + return (0, _timeRanges.createTimeRange)(); + } + return (0, _timeRanges.createTimeRange)(ranges[0][0], ranges[0][1]); + }; + /** * Get fullscreen support - * Flash does not allow fullscreen through javascript @@ -12427,16 +12243,8 @@ Flash.checkReady = function (tech) { // Trigger events from the swf on the player Flash.onEvent = function (swfID, eventName) { var tech = Dom.getEl(swfID).tech; - var args = Array.prototype.slice.call(arguments, 2); - - // dispatch Flash events asynchronously for two reasons: - // - Flash swallows any exceptions generated by javascript it - // invokes - // - Flash is suspended until the javascript returns which may cause - // playback performance issues - tech.setTimeout(function () { - tech.trigger(eventName, args); - }, 1); + + tech.trigger(eventName, Array.prototype.slice.call(arguments, 2)); }; // Log errors from the swf @@ -12536,7 +12344,7 @@ _component2['default'].registerComponent('Flash', Flash); _tech2['default'].registerTech('Flash', Flash); exports['default'] = Flash; -},{"139":139,"5":5,"58":58,"59":59,"63":63,"82":82,"91":91,"93":93,"96":96}],61:[function(_dereq_,module,exports){ +},{"136":136,"5":5,"58":58,"62":62,"80":80,"88":88,"90":90,"93":93}],60:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -12545,7 +12353,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol var _templateObject = _taggedTemplateLiteralLoose(['Text Tracks are being loaded from another origin but the crossorigin attribute isn\'t used.\n This may prevent text tracks from loading.'], ['Text Tracks are being loaded from another origin but the crossorigin attribute isn\'t used.\n This may prevent text tracks from loading.']); -var _tech = _dereq_(63); +var _tech = _dereq_(62); var _tech2 = _interopRequireDefault(_tech); @@ -12553,47 +12361,47 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _dom = _dereq_(80); var Dom = _interopRequireWildcard(_dom); -var _url = _dereq_(93); +var _url = _dereq_(90); var Url = _interopRequireWildcard(_url); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _log = _dereq_(87); +var _log = _dereq_(85); var _log2 = _interopRequireDefault(_log); -var _tsml = _dereq_(149); +var _tsml = _dereq_(146); var _tsml2 = _interopRequireDefault(_tsml); -var _browser = _dereq_(79); +var _browser = _dereq_(78); var browser = _interopRequireWildcard(_browser); -var _document = _dereq_(95); +var _document = _dereq_(92); var _document2 = _interopRequireDefault(_document); -var _window = _dereq_(96); +var _window = _dereq_(93); var _window2 = _interopRequireDefault(_window); -var _object = _dereq_(139); +var _object = _dereq_(136); var _object2 = _interopRequireDefault(_object); -var _mergeOptions = _dereq_(88); +var _mergeOptions = _dereq_(86); var _mergeOptions2 = _interopRequireDefault(_mergeOptions); -var _toTitleCase = _dereq_(92); +var _toTitleCase = _dereq_(89); var _toTitleCase2 = _interopRequireDefault(_toTitleCase); @@ -13049,37 +12857,7 @@ var Html5 = function (_Tech) { Html5.prototype.duration = function duration() { - var _this4 = this; - - // Android Chrome will report duration as Infinity for VOD HLS until after - // playback has started, which triggers the live display erroneously. - // Return NaN if playback has not started and trigger a durationupdate once - // the duration can be reliably known. - if (this.el_.duration === Infinity && browser.IS_ANDROID && browser.IS_CHROME) { - if (this.el_.currentTime === 0) { - var _ret2 = function () { - // Wait for the first `timeupdate` with currentTime > 0 - there may be - // several with 0 - var checkProgress = function checkProgress() { - if (_this4.el_.currentTime > 0) { - // Trigger durationchange for genuinely live video - if (_this4.el_.duration === Infinity) { - _this4.trigger('durationchange'); - } - _this4.off(_this4.player_, 'timeupdate', checkProgress); - } - }; - - _this4.on(_this4.player_, 'timeupdate', checkProgress); - return { - v: NaN - }; - }(); - - if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === "object") return _ret2.v; - } - } - return this.el_.duration || NaN; + return this.el_.duration || 0; }; /** @@ -13114,7 +12892,7 @@ var Html5 = function (_Tech) { Html5.prototype.proxyWebkitFullscreen_ = function proxyWebkitFullscreen_() { - var _this5 = this; + var _this4 = this; if (!('webkitDisplayingFullscreen' in this.el_)) { return; @@ -13132,8 +12910,8 @@ var Html5 = function (_Tech) { this.on('webkitbeginfullscreen', beginFn); this.on('dispose', function () { - _this5.off('webkitbeginfullscreen', beginFn); - _this5.off('webkitendfullscreen', endFn); + _this4.off('webkitbeginfullscreen', beginFn); + _this4.off('webkitendfullscreen', endFn); }); }; @@ -13260,18 +13038,21 @@ var Html5 = function (_Tech) { }; /** - * Creates either native TextTrack or an emulated TextTrack depending - * on the value of `featuresNativeTextTracks` + * Creates a remote text track object and returns a html track element * * @param {Object} options The object should contain values for * kind, language, label and src (location of the WebVTT file) + * @return {HTMLTrackElement} */ - Html5.prototype.createRemoteTextTrack = function createRemoteTextTrack(options) { + Html5.prototype.addRemoteTextTrack = function addRemoteTextTrack() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (!this.featuresNativeTextTracks) { - return _Tech.prototype.createRemoteTextTrack.call(this, options); + return _Tech.prototype.addRemoteTextTrack.call(this, options); } + var htmlTrackElement = _document2['default'].createElement('track'); if (options.kind) { @@ -13293,28 +13074,12 @@ var Html5 = function (_Tech) { htmlTrackElement.src = options.src; } - return htmlTrackElement; - }; - - /** - * Creates a remote text track object and returns an html track element. - * - * @param {Object} options The object should contain values for - * kind, language, label, and src (location of the WebVTT file) - * @param {Boolean} [manualCleanup=true] if set to false, the TextTrack will be - * automatically removed from the video element whenever the source changes - * @return {HTMLTrackElement} An Html Track Element. - * This can be an emulated {@link HTMLTrackElement} or a native one. - * @deprecated The default value of the "manualCleanup" parameter will default - * to "false" in upcoming versions of Video.js - */ - - - Html5.prototype.addRemoteTextTrack = function addRemoteTextTrack(options, manualCleanup) { - var htmlTrackElement = _Tech.prototype.addRemoteTextTrack.call(this, options, manualCleanup); - this.el().appendChild(htmlTrackElement); + // store HTMLTrackElement and TextTrack to remote list + this.remoteTextTrackEls().addTrackElement_(htmlTrackElement); + this.remoteTextTracks().addTrack_(htmlTrackElement.track); + return htmlTrackElement; }; @@ -13326,7 +13091,15 @@ var Html5 = function (_Tech) { Html5.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) { - _Tech.prototype.removeRemoteTextTrack.call(this, track); + if (!this.featuresNativeTextTracks) { + return _Tech.prototype.removeRemoteTextTrack.call(this, track); + } + + var trackElement = this.remoteTextTrackEls().getTrackElementByTrack_(track); + + // remove HTMLTrackElement and TextTrack from remote list + this.remoteTextTrackEls().removeTrackElement_(trackElement); + this.remoteTextTracks().removeTrack_(track); var tracks = this.$$('track'); @@ -13981,7 +13754,7 @@ _component2['default'].registerComponent('Html5', Html5); _tech2['default'].registerTech('Html5', Html5); exports['default'] = Html5; -},{"139":139,"149":149,"5":5,"63":63,"79":79,"82":82,"84":84,"87":87,"88":88,"92":92,"93":93,"95":95,"96":96}],62:[function(_dereq_,module,exports){ +},{"136":136,"146":146,"5":5,"62":62,"78":78,"80":80,"82":82,"85":85,"86":86,"89":89,"90":90,"92":92,"93":93}],61:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -13990,11 +13763,11 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _tech = _dereq_(63); +var _tech = _dereq_(62); var _tech2 = _interopRequireDefault(_tech); -var _toTitleCase = _dereq_(92); +var _toTitleCase = _dereq_(89); var _toTitleCase2 = _interopRequireDefault(_toTitleCase); @@ -14063,7 +13836,7 @@ var MediaLoader = function (_Component) { _component2['default'].registerComponent('MediaLoader', MediaLoader); exports['default'] = MediaLoader; -},{"5":5,"63":63,"92":92}],63:[function(_dereq_,module,exports){ +},{"5":5,"62":62,"89":89}],62:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -14072,55 +13845,55 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _htmlTrackElement = _dereq_(67); +var _htmlTrackElement = _dereq_(66); var _htmlTrackElement2 = _interopRequireDefault(_htmlTrackElement); -var _htmlTrackElementList = _dereq_(66); +var _htmlTrackElementList = _dereq_(65); var _htmlTrackElementList2 = _interopRequireDefault(_htmlTrackElementList); -var _mergeOptions = _dereq_(88); +var _mergeOptions = _dereq_(86); var _mergeOptions2 = _interopRequireDefault(_mergeOptions); -var _textTrack = _dereq_(73); +var _textTrack = _dereq_(72); var _textTrack2 = _interopRequireDefault(_textTrack); -var _textTrackList = _dereq_(71); +var _textTrackList = _dereq_(70); var _textTrackList2 = _interopRequireDefault(_textTrackList); -var _videoTrackList = _dereq_(77); +var _videoTrackList = _dereq_(76); var _videoTrackList2 = _interopRequireDefault(_videoTrackList); -var _audioTrackList = _dereq_(64); +var _audioTrackList = _dereq_(63); var _audioTrackList2 = _interopRequireDefault(_audioTrackList); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _log = _dereq_(87); +var _log = _dereq_(85); var _log2 = _interopRequireDefault(_log); -var _timeRanges = _dereq_(91); +var _timeRanges = _dereq_(88); -var _buffer = _dereq_(80); +var _buffer = _dereq_(79); var _mediaError = _dereq_(46); var _mediaError2 = _interopRequireDefault(_mediaError); -var _window = _dereq_(96); +var _window = _dereq_(93); var _window2 = _interopRequireDefault(_window); -var _document = _dereq_(95); +var _document = _dereq_(92); var _document2 = _interopRequireDefault(_document); @@ -14213,11 +13986,9 @@ var Tech = function (_Component) { } if (!_this.featuresNativeTextTracks) { - _this.emulateTextTracks(); + _this.on('ready', _this.emulateTextTracks); } - _this.autoRemoteTextTracks_ = new _textTrackList2['default'](); - _this.initTextTrackListeners(); _this.initTrackListeners(); @@ -14450,25 +14221,6 @@ var Tech = function (_Component) { }); }; - /** - * Remove any TextTracks added via addRemoteTextTrack that are - * flagged for automatic garbage collection - * - * @method cleanupAutoTextTracks - */ - - - Tech.prototype.cleanupAutoTextTracks = function cleanupAutoTextTracks() { - var list = this.autoRemoteTextTracks_ || []; - var i = list.length; - - while (i--) { - var track = list[i]; - - this.removeRemoteTextTrack(track); - } - }; - /** * Reset the tech. Removes all sources and resets readyState. * @@ -14586,15 +14338,21 @@ var Tech = function (_Component) { }; /** - * Add vtt.js if necessary + * Emulate texttracks * - * @private + * @method emulateTextTracks */ - Tech.prototype.addWebVttScript_ = function addWebVttScript_() { + Tech.prototype.emulateTextTracks = function emulateTextTracks() { var _this4 = this; + var tracks = this.textTracks(); + + if (!tracks) { + return; + } + if (!_window2['default'].WebVTT && this.el().parentNode !== null && this.el().parentNode !== undefined) { (function () { var script = _document2['default'].createElement('script'); @@ -14616,39 +14374,9 @@ var Tech = function (_Component) { _this4.el().parentNode.appendChild(script); })(); } - }; - - /** - * Emulate texttracks - * - * @method emulateTextTracks - */ - - - Tech.prototype.emulateTextTracks = function emulateTextTracks() { - var _this5 = this; - - var tracks = this.textTracks(); - - if (!tracks) { - return; - } - - this.remoteTextTracks().on('addtrack', function (e) { - _this5.textTracks().addTrack_(e.track); - }); - - this.remoteTextTracks().on('removetrack', function (e) { - _this5.textTracks().removeTrack_(e.track); - }); - - // Initially, Tech.el_ is a child of a dummy-div wait until the Component system - // signals that the Tech is ready at which point Tech.el_ is part of the DOM - // before inserting the WebVTT script - this.on('ready', this.addWebVttScript_); var updateDisplay = function updateDisplay() { - return _this5.trigger('texttrackchange'); + return _this4.trigger('texttrackchange'); }; var textTracksChanges = function textTracksChanges() { updateDisplay(); @@ -14763,58 +14491,28 @@ var Tech = function (_Component) { }; /** - * Create an emulated TextTrack for use by addRemoteTextTrack - * - * This is intended to be overridden by classes that inherit from - * Tech in order to create native or custom TextTracks. + * Creates a remote text track object and returns a emulated html track element * * @param {Object} options The object should contain values for * kind, language, label and src (location of the WebVTT file) + * @return {HTMLTrackElement} + * @method addRemoteTextTrack */ - Tech.prototype.createRemoteTextTrack = function createRemoteTextTrack(options) { + Tech.prototype.addRemoteTextTrack = function addRemoteTextTrack(options) { var track = (0, _mergeOptions2['default'])(options, { tech: this }); - return new _htmlTrackElement2['default'](track); - }; - - /** - * Creates a remote text track object and returns an html track element. - * - * @param {Object} options The object should contain values for - * kind, language, label, and src (location of the WebVTT file) - * @param {Boolean} [manualCleanup=true] if set to false, the TextTrack will be - * automatically removed from the video element whenever the source changes - * @return {HTMLTrackElement} An Html Track Element. - * This can be an emulated {@link HTMLTrackElement} or a native one. - * @deprecated The default value of the "manualCleanup" parameter will default - * to "false" in upcoming versions of Video.js - */ - - - Tech.prototype.addRemoteTextTrack = function addRemoteTextTrack() { - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var manualCleanup = arguments[1]; - - var htmlTrackElement = this.createRemoteTextTrack(options); - - if (manualCleanup !== true && manualCleanup !== false) { - // deprecation warning - _log2['default'].warn('Calling addRemoteTextTrack without explicitly setting the "manualCleanup" parameter to `true` is deprecated and default to `false` in future version of video.js'); - manualCleanup = true; - } + var htmlTrackElement = new _htmlTrackElement2['default'](track); // store HTMLTrackElement and TextTrack to remote list this.remoteTextTrackEls().addTrackElement_(htmlTrackElement); this.remoteTextTracks().addTrack_(htmlTrackElement.track); - if (manualCleanup !== true) { - // create the TextTrackList if it doesn't exist - this.autoRemoteTextTracks_.addTrack_(htmlTrackElement.track); - } + // must come after remoteTextTracks() + this.textTracks().addTrack_(htmlTrackElement.track); return htmlTrackElement; }; @@ -14828,12 +14526,13 @@ var Tech = function (_Component) { Tech.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) { + this.textTracks().removeTrack_(track); + var trackElement = this.remoteTextTrackEls().getTrackElementByTrack_(track); // remove HTMLTrackElement and TextTrack from remote list this.remoteTextTrackEls().removeTrackElement_(trackElement); this.remoteTextTracks().removeTrack_(track); - this.autoRemoteTextTracks_.removeTrack_(track); }; /** @@ -14966,7 +14665,7 @@ Tech.prototype.featuresNativeTextTracks = false; * * ##### EXAMPLE: * - * Tech.withSourceHandlers(MyTech); + * Tech.withSourceHandlers.call(MyTech); * */ Tech.withSourceHandlers = function (_Tech) { @@ -14977,7 +14676,7 @@ Tech.withSourceHandlers = function (_Tech) { * The source handler pattern is used for adaptive formats (HLS, DASH) that * manually load video data and feed it into a Source Buffer (Media Source Extensions) * @param {Function} handler The source handler - * @param {Number} index The index to register the handler among existing handlers + * @param {Boolean} first Register it before any existing handlers */ _Tech.registerSourceHandler = function (handler, index) { var handlers = _Tech.sourceHandlers; @@ -15098,7 +14797,17 @@ Tech.withSourceHandlers = function (_Tech) { this.disposeSourceHandler(); this.off('dispose', this.disposeSourceHandler); + // if we have a source and get another one + // then we are loading something new + // than clear all of our current tracks + if (this.currentSource_) { + this.clearTracks(['audio', 'video']); + + this.currentSource_ = null; + } + if (sh !== _Tech.nativeSourceHandler) { + this.currentSource_ = source; // Catch if someone replaced the src without calling setSource. @@ -15121,6 +14830,7 @@ Tech.withSourceHandlers = function (_Tech) { // On successive loadstarts when setSource has not been called again _Tech.prototype.successiveLoadStartListener_ = function () { + this.currentSource_ = null; this.disposeSourceHandler(); this.one(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_); }; @@ -15129,25 +14839,10 @@ Tech.withSourceHandlers = function (_Tech) { * Clean up any existing source handler */ _Tech.prototype.disposeSourceHandler = function () { - // if we have a source and get another one - // then we are loading something new - // than clear all of our current tracks - if (this.currentSource_) { - this.clearTracks(['audio', 'video']); - this.currentSource_ = null; - } - - // always clean up auto-text tracks - this.cleanupAutoTextTracks(); - - if (this.sourceHandler_) { + if (this.sourceHandler_ && this.sourceHandler_.dispose) { this.off(this.el_, 'loadstart', _Tech.prototype.firstLoadStartListener_); this.off(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_); - - if (this.sourceHandler_.dispose) { - this.sourceHandler_.dispose(); - } - + this.sourceHandler_.dispose(); this.sourceHandler_ = null; } }; @@ -15159,20 +14854,20 @@ _component2['default'].registerComponent('MediaTechController', Tech); Tech.registerTech('Tech', Tech); exports['default'] = Tech; -},{"46":46,"5":5,"64":64,"66":66,"67":67,"71":71,"73":73,"77":77,"80":80,"84":84,"87":87,"88":88,"91":91,"95":95,"96":96}],64:[function(_dereq_,module,exports){ +},{"46":46,"5":5,"63":63,"65":65,"66":66,"70":70,"72":72,"76":76,"79":79,"82":82,"85":85,"86":86,"88":88,"92":92,"93":93}],63:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -var _trackList = _dereq_(75); +var _trackList = _dereq_(74); var _trackList2 = _interopRequireDefault(_trackList); -var _browser = _dereq_(79); +var _browser = _dereq_(78); var browser = _interopRequireWildcard(_browser); -var _document = _dereq_(95); +var _document = _dereq_(92); var _document2 = _interopRequireDefault(_document); @@ -15309,22 +15004,22 @@ var AudioTrackList = function (_TrackList) { exports['default'] = AudioTrackList; -},{"75":75,"79":79,"95":95}],65:[function(_dereq_,module,exports){ +},{"74":74,"78":78,"92":92}],64:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -var _trackEnums = _dereq_(74); +var _trackEnums = _dereq_(73); -var _track = _dereq_(76); +var _track = _dereq_(75); var _track2 = _interopRequireDefault(_track); -var _mergeOptions = _dereq_(88); +var _mergeOptions = _dereq_(86); var _mergeOptions2 = _interopRequireDefault(_mergeOptions); -var _browser = _dereq_(79); +var _browser = _dereq_(78); var browser = _interopRequireWildcard(_browser); @@ -15409,16 +15104,16 @@ var AudioTrack = function (_Track) { exports['default'] = AudioTrack; -},{"74":74,"76":76,"79":79,"88":88}],66:[function(_dereq_,module,exports){ +},{"73":73,"75":75,"78":78,"86":86}],65:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -var _browser = _dereq_(79); +var _browser = _dereq_(78); var browser = _interopRequireWildcard(_browser); -var _document = _dereq_(95); +var _document = _dereq_(92); var _document2 = _interopRequireDefault(_document); @@ -15498,16 +15193,16 @@ var HtmlTrackElementList = function () { exports['default'] = HtmlTrackElementList; -},{"79":79,"95":95}],67:[function(_dereq_,module,exports){ +},{"78":78,"92":92}],66:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -var _browser = _dereq_(79); +var _browser = _dereq_(78); var browser = _interopRequireWildcard(_browser); -var _document = _dereq_(95); +var _document = _dereq_(92); var _document2 = _interopRequireDefault(_document); @@ -15515,7 +15210,7 @@ var _eventTarget = _dereq_(42); var _eventTarget2 = _interopRequireDefault(_eventTarget); -var _textTrack = _dereq_(73); +var _textTrack = _dereq_(72); var _textTrack2 = _interopRequireDefault(_textTrack); @@ -15635,16 +15330,16 @@ HTMLTrackElement.ERROR = ERROR; exports['default'] = HTMLTrackElement; -},{"42":42,"73":73,"79":79,"95":95}],68:[function(_dereq_,module,exports){ +},{"42":42,"72":72,"78":78,"92":92}],67:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -var _browser = _dereq_(79); +var _browser = _dereq_(78); var browser = _interopRequireWildcard(_browser); -var _document = _dereq_(95); +var _document = _dereq_(92); var _document2 = _interopRequireDefault(_document); @@ -15765,7 +15460,7 @@ var TextTrackCueList = function () { exports['default'] = TextTrackCueList; -},{"79":79,"95":95}],69:[function(_dereq_,module,exports){ +},{"78":78,"92":92}],68:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -15774,11 +15469,11 @@ var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _window = _dereq_(96); +var _window = _dereq_(93); var _window2 = _interopRequireDefault(_window); @@ -15941,7 +15636,7 @@ var TextTrackDisplay = function (_Component) { return _Component.prototype.createEl.call(this, 'div', { className: 'vjs-text-track-display' }, { - 'aria-live': 'off', + 'aria-live': 'assertive', 'aria-atomic': 'true' }); }; @@ -15997,14 +15692,8 @@ var TextTrackDisplay = function (_Component) { } if (captionsSubtitlesTrack) { - if (this.getAttribute('aria-live') !== 'off') { - this.setAttribute('aria-live', 'off'); - } this.updateForTrack(captionsSubtitlesTrack); } else if (descriptionsTrack) { - if (this.getAttribute('aria-live') !== 'assertive') { - this.setAttribute('aria-live', 'assertive'); - } this.updateForTrack(descriptionsTrack); } }; @@ -16096,7 +15785,7 @@ var TextTrackDisplay = function (_Component) { _component2['default'].registerComponent('TextTrackDisplay', TextTrackDisplay); exports['default'] = TextTrackDisplay; -},{"5":5,"84":84,"96":96}],70:[function(_dereq_,module,exports){ +},{"5":5,"82":82,"93":93}],69:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -16189,24 +15878,24 @@ var jsonToTextTracks = function jsonToTextTracks(json, tech) { exports['default'] = { textTracksToJson: textTracksToJson, jsonToTextTracks: jsonToTextTracks, trackToJson_: trackToJson_ }; -},{}],71:[function(_dereq_,module,exports){ +},{}],70:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -var _trackList = _dereq_(75); +var _trackList = _dereq_(74); var _trackList2 = _interopRequireDefault(_trackList); -var _fn = _dereq_(84); +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _browser = _dereq_(79); +var _browser = _dereq_(78); var browser = _interopRequireWildcard(_browser); -var _document = _dereq_(95); +var _document = _dereq_(92); var _document2 = _interopRequireDefault(_document); @@ -16347,32 +16036,34 @@ var TextTrackList = function (_TrackList) { exports['default'] = TextTrackList; -},{"75":75,"79":79,"84":84,"95":95}],72:[function(_dereq_,module,exports){ +},{"74":74,"78":78,"82":82,"92":92}],71:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; -var _window = _dereq_(96); - -var _window2 = _interopRequireDefault(_window); - var _component = _dereq_(5); var _component2 = _interopRequireDefault(_component); -var _dom = _dereq_(82); +var _events = _dereq_(81); -var _fn = _dereq_(84); +var Events = _interopRequireWildcard(_events); + +var _fn = _dereq_(82); var Fn = _interopRequireWildcard(_fn); -var _obj = _dereq_(89); +var _log = _dereq_(85); -var Obj = _interopRequireWildcard(_obj); +var _log2 = _interopRequireDefault(_log); -var _log = _dereq_(87); +var _tuple = _dereq_(145); -var _log2 = _interopRequireDefault(_log); +var _tuple2 = _interopRequireDefault(_tuple); + +var _window = _dereq_(93); + +var _window2 = _interopRequireDefault(_window); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } @@ -16387,162 +16078,45 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" */ -var LOCAL_STORAGE_KEY = 'vjs-text-track-settings'; - -var COLOR_BLACK = ['#000', 'Black']; -var COLOR_BLUE = ['#00F', 'Blue']; -var COLOR_CYAN = ['#0FF', 'Cyan']; -var COLOR_GREEN = ['#0F0', 'Green']; -var COLOR_MAGENTA = ['#F0F', 'Magenta']; -var COLOR_RED = ['#F00', 'Red']; -var COLOR_WHITE = ['#FFF', 'White']; -var COLOR_YELLOW = ['#FF0', 'Yellow']; - -var OPACITY_OPAQUE = ['1', 'Opaque']; -var OPACITY_SEMI = ['0.5', 'Semi-Transparent']; -var OPACITY_TRANS = ['0', 'Transparent']; - -// Configuration for the various element. -var selectConfigs = { - backgroundColor: { - selector: '.vjs-bg-color > select', - id: 'captions-background-color-%s', - label: 'Color', - options: [COLOR_BLACK, COLOR_WHITE, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_MAGENTA, COLOR_CYAN] - }, - - backgroundOpacity: { - selector: '.vjs-bg-opacity > select', - id: 'captions-background-opacity-%s', - label: 'Transparency', - options: [OPACITY_OPAQUE, OPACITY_SEMI, OPACITY_TRANS] - }, - - color: { - selector: '.vjs-fg-color > select', - id: 'captions-foreground-color-%s', - label: 'Color', - options: [COLOR_WHITE, COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_MAGENTA, COLOR_CYAN] - }, - - edgeStyle: { - selector: '.vjs-edge-style > select', - id: '%s', - label: 'Text Edge Style', - options: [['none', 'None'], ['raised', 'Raised'], ['depressed', 'Depressed'], ['uniform', 'Uniform'], ['dropshadow', 'Dropshadow']] - }, - - fontFamily: { - selector: '.vjs-font-family > select', - id: 'captions-font-family-%s', - label: 'Font Family', - options: [['proportionalSansSerif', 'Proportional Sans-Serif'], ['monospaceSansSerif', 'Monospace Sans-Serif'], ['proportionalSerif', 'Proportional Serif'], ['monospaceSerif', 'Monospace Serif'], ['casual', 'Casual'], ['script', 'Script'], ['small-caps', 'Small Caps']] - }, - - fontPercent: { - selector: '.vjs-font-percent > select', - id: 'captions-font-size-%s', - label: 'Font Size', - options: [['0.50', '50%'], ['0.75', '75%'], ['1.00', '100%'], ['1.25', '125%'], ['1.50', '150%'], ['1.75', '175%'], ['2.00', '200%'], ['3.00', '300%'], ['4.00', '400%']], - 'default': 2, - parser: function parser(v) { - return v === '1.00' ? null : Number(v); - } - }, - - textOpacity: { - selector: '.vjs-text-opacity > select', - id: 'captions-foreground-opacity-%s', - label: 'Transparency', - options: [OPACITY_OPAQUE, OPACITY_SEMI] - }, - - // Options for this object are defined below. - windowColor: { - selector: '.vjs-window-color > select', - id: 'captions-window-color-%s', - label: 'Color' - }, - - // Options for this object are defined below. - windowOpacity: { - selector: '.vjs-window-opacity > select', - id: 'captions-window-opacity-%s', - label: 'Transparency', - options: [OPACITY_TRANS, OPACITY_SEMI, OPACITY_OPAQUE] - } -}; +function captionOptionsMenuTemplate(uniqueId, dialogLabelId, dialogDescriptionId) { + var template = '\n
    \n
    Captions Settings Dialog
    \n
    Beginning of dialog window. Escape will cancel and close the window.
    \n
    \n
    \n
    \n Text\n \n \n \n \n \n \n
    \n
    \n Background\n \n \n \n \n \n \n
    \n
    \n Window\n \n \n \n \n \n \n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n \n \n
    \n
    \n
    \n \n \n
    \n
    \n
    \n '; -selectConfigs.windowColor.options = selectConfigs.backgroundColor.options; + return template; +} -/** - * Parses out option values. - * - * @private - * @param {String} value - * @param {Function} [parser] - * Optional function to adjust the value. - * @return {Mixed} - * Will be `undefined` if no value exists (or if given value is "none"). - */ -function parseOptionValue(value, parser) { - if (parser) { - value = parser(value); - } +function getSelectedOptionValue(target) { + var selectedOption = void 0; - if (value && value !== 'none') { - return value; + // not all browsers support selectedOptions, so, fallback to options + if (target.selectedOptions) { + selectedOption = target.selectedOptions[0]; + } else if (target.options) { + selectedOption = target.options[target.options.selectedIndex]; } -} - -/** - * Gets the value of the selected