diff --git a/package.json b/package.json index 19d2430..1fd9607 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,6 @@ "@auth0/auth0-spa-js": "^2.0.0", "@babel/plugin-syntax-flow": "^7.14.5", "@babel/plugin-transform-react-jsx": "^7.14.9", - "@clappr/core": "^0.4.22", - "@clappr/hlsjs-playback": "^0.6.0", - "@clappr/plugins": "^0.4.16", - "@clappr/stats-plugin": "^0.2.0", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@fontsource/dosis": "^4.5.10", diff --git a/public/_player/clappr/dist/clappr-nerd-stats.min.js b/public/_player/clappr/dist/clappr-nerd-stats.min.js deleted file mode 100644 index 29e6892..0000000 --- a/public/_player/clappr/dist/clappr-nerd-stats.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Skipped minification because the original files appears to be already minified. - * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("Clappr"),require("ClapprStats")):"function"==typeof define&&define.amd?define(["Clappr","ClapprStats"],e):"object"==typeof exports?exports.ClapprNerdStats=e(require("Clappr"),require("ClapprStats")):t.ClapprNerdStats=e(t.Clappr,t.ClapprStats)}(window,(function(t,e){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=1)}([function(t,e,n){"use strict";var r,o="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};r=function(){return this}();try{r=r||new Function("return this")()}catch(t){"object"===("undefined"==typeof window?"undefined":o(window))&&(r=window)}t.exports=r},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n=this.statsBoxWidthThreshold?(this.$el.find(this.statsBoxElem).addClass("wide"),this.$el.find(this.statsBoxElem).removeClass("narrow")):(this.$el.find(this.statsBoxElem).removeClass("wide"),this.$el.find(this.statsBoxElem).addClass("narrow"))}},{key:"render",value:function(){var t=o.Styler.getStyleFor(a.default,{baseUrl:this.options.baseUrl});return this.core.$el.append(t),this.core.$el.append(this.$el),this.hide(),this}}]),e}(o.UICorePlugin);e.default=d,t.exports=e.default},function(e,n){e.exports=t},function(t,n){t.exports=e},function(t,e,n){(e=n(5)(!1)).push([t.i,".clappr-nerd-stats[data-clappr-nerd-stats] .stats-box {\n position: absolute;\n display: inline-block;\n top: 2em;\n left: 2em;\n padding: 5px 5px 5px 5px;\n margin: 0;\n line-height: 20px;\n font-size: 11px;\n box-shadow: 0 0 0 1px hsla(0, 0%, 100%, 0.15);\n background: rgba(0, 0, 0, 0.8);\n color: #fff;\n z-index: 1000;\n overflow: auto;\n max-height: 300px;\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .stats-box.narrow {\n width: 260px;\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .stats-box.wide {\n width: 860px;\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .stats-box ul {\n display: inline-block;\n float: left;\n padding: 5px 5px 5px 5px;\n width: 210px;\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .stats-box ul, li {\n list-style-type: none;\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .stats-box li:nth-child(2n) {\n background: hsla(0, 0%, 100%, 0.15);\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .stats-box li {\n padding: 0 5px;\n text-align: left;\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .stats-box li.title {\n text-align: center;\n font-weight: bold;\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .stats-box li div {\n padding-left: 5px;\n margin: 0;\n float: right;\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .stats-box a.close-button {\n position: absolute;\n right: 0.3em;\n top: 0;\n font-size: 18px;\n cursor: pointer;\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .icon-show-stats a {\n z-index: 1000;\n position: absolute;\n float: right;\n color: white;\n display: none;\n cursor: pointer;\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .icon-show-stats.top-right a {\n display: block;\n top: 5px;\n right: 10px;\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .icon-show-stats.top-left a {\n display: block;\n top: 5px;\n left: 10px;\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .icon-show-stats.bottom-right a {\n display: block;\n right: 10px;\n bottom: 5px;\n}\n\n.clappr-nerd-stats[data-clappr-nerd-stats] .icon-show-stats.bottom-left a {\n display: block;\n bottom: 5px;\n left: 10px;\n}\n",""]),t.exports=e},function(t,e,n){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var n=function(t,e){var n=t[1]||"",r=t[3];if(!r)return n;if(e&&"function"==typeof btoa){var o=(a=r,s=btoa(unescape(encodeURIComponent(JSON.stringify(a)))),c="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(s),"/*# ".concat(c," */")),i=r.sources.map((function(t){return"/*# sourceURL=".concat(r.sourceRoot||"").concat(t," */")}));return[n].concat(i).concat([o]).join("\n")}var a,s,c;return[n].join("\n")}(e,t);return e[2]?"@media ".concat(e[2]," {").concat(n,"}"):n})).join("")},e.i=function(t,n,r){"string"==typeof t&&(t=[[null,t,""]]);var o={};if(r)for(var i=0;i <% counters = metrics.counters %> <% timers = metrics.timers %> <% extra = metrics.extra %>
×
  • General
  • Display resolution:
    <%= general.displayResolution %>
  • Volume:
    <%= general.volume %>
  • Counters
  • Plays:
    <%= counters.play %>
  • Pauses:
    <%= counters.pause %>
  • Errors:
    <%= counters.error %>
  • Bufferings:
    <%= counters.buffering %>
  • Decoded frames:
    <%= counters.decodedFrames %>
  • Dropped frames:
    <%= counters.droppedFrames %>
  • Frames per second:
    <%= counters.fps %>
  • Bitrate changes:
    <%= counters.changeLevel %>
  • Seeks:
    <%= counters.seek %>
  • Fullscreen:
    <%= counters.fullscreen %>
  • DVR seeks:
    <%= counters.dvrUsage %>
  • Timers
  • Startup time:
    <%= timers.startup %>
  • Watching time:
    <%= timers.watch %>
  • Pause time:
    <%= timers.pause %>
  • Buffering time:
    <%= timers.buffering %>
  • Session time:
    <%= timers.session %>
  • Latency:
    <%= timers.latency %>
  • Extra
  • Playback:
    <%= extra.playbackName %>
  • Playback type:
    <%= extra.playbackType %>
  • Buffer size:
    <%= extra.buffersize %>
  • Video duration:
    <%= extra.duration %>
  • Current time:
    <%= extra.currentTime %>
  • Bitrate weighted mean:
    <%= extra.bitrateWeightedMean %>
  • Bitrate most used:
    <%= extra.bitrateMostUsed %>
  • % Watched:
    <%= extra.watchedPercentage %>
  • % Buffering:
    <%= extra.bufferingPercentage %>
  • Bandwidth:
    <%= extra.bandwidth %>
'},function(t,e,n){"use strict";(function(e){var n="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},r=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,o=/^\w*$/,i=/^\./,a=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,s=/\\(\\)?/g,c=/^\[object .+?Constructor\]$/,u="object"==(void 0===e?"undefined":n(e))&&e&&e.Object===Object&&e,l="object"==("undefined"==typeof self?"undefined":n(self))&&self&&self.Object===Object&&self,p=u||l||Function("return this")();var f,d=Array.prototype,h=Function.prototype,y=Object.prototype,v=p["__core-js_shared__"],b=(f=/[^.]+$/.exec(v&&v.keys&&v.keys.IE_PROTO||""))?"Symbol(src)_1."+f:"",_=h.toString,g=y.hasOwnProperty,m=y.toString,w=RegExp("^"+_.call(g).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),x=p.Symbol,j=d.splice,k=R(p,"Map"),S=R(Object,"create"),O=x?x.prototype:void 0,P=O?O.toString:void 0;function E(t){var e=-1,n=t?t.length:0;for(this.clear();++e-1},C.prototype.set=function(t,e){var n=this.__data__,r=A(n,t);return r<0?n.push([t,e]):n[r][1]=e,this},M.prototype.clear=function(){this.__data__={hash:new E,map:new(k||C),string:new E}},M.prototype.delete=function(t){return B(this,t).delete(t)},M.prototype.get=function(t){return B(this,t).get(t)},M.prototype.has=function(t){return B(this,t).has(t)},M.prototype.set=function(t,e){return B(this,t).set(t,e),this};var I=U((function(t){var e;t=null==(e=t)?"":function(t){if("string"==typeof t)return t;if(D(t))return P?P.call(t):"";var e=t+"";return"0"==e&&1/t==-1/0?"-0":e}(e);var n=[];return i.test(t)&&n.push(""),t.replace(a,(function(t,e,r,o){n.push(r?o.replace(s,"$1"):e||t)})),n}));function F(t){if("string"==typeof t||D(t))return t;var e=t+"";return"0"==e&&1/t==-1/0?"-0":e}function U(t,e){if("function"!=typeof t||e&&"function"!=typeof e)throw new TypeError("Expected a function");var n=function n(){var r=arguments,o=e?e.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var a=t.apply(this,r);return n.cache=i.set(o,a),a};return n.cache=new(U.Cache||M),n}U.Cache=M;var z=Array.isArray;function N(t){var e=void 0===t?"undefined":n(t);return!!t&&("object"==e||"function"==e)}function D(t){return"symbol"==(void 0===t?"undefined":n(t))||function(t){return!!t&&"object"==(void 0===t?"undefined":n(t))}(t)&&"[object Symbol]"==m.call(t)}t.exports=function(t,e,n){var r=null==t?void 0:T(t,e);return void 0===r?n:r}}).call(this,n(0))},function(t,e,n){"use strict";(function(t,n){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},o="[object Arguments]",i="[object Function]",a="[object GeneratorFunction]",s="[object Map]",c="[object Set]",u=/\w*$/,l=/^\[object .+?Constructor\]$/,p=/^(?:0|[1-9]\d*)$/,f={};f[o]=f["[object Array]"]=f["[object ArrayBuffer]"]=f["[object DataView]"]=f["[object Boolean]"]=f["[object Date]"]=f["[object Float32Array]"]=f["[object Float64Array]"]=f["[object Int8Array]"]=f["[object Int16Array]"]=f["[object Int32Array]"]=f[s]=f["[object Number]"]=f["[object Object]"]=f["[object RegExp]"]=f[c]=f["[object String]"]=f["[object Symbol]"]=f["[object Uint8Array]"]=f["[object Uint8ClampedArray]"]=f["[object Uint16Array]"]=f["[object Uint32Array]"]=!0,f["[object Error]"]=f[i]=f["[object WeakMap]"]=!1;var d="object"==(void 0===t?"undefined":r(t))&&t&&t.Object===Object&&t,h="object"==("undefined"==typeof self?"undefined":r(self))&&self&&self.Object===Object&&self,y=d||h||Function("return this")(),v="object"==r(e)&&e&&!e.nodeType&&e,b=v&&"object"==r(n)&&n&&!n.nodeType&&n,_=b&&b.exports===v;function g(t,e){return t.set(e[0],e[1]),t}function m(t,e){return t.add(e),t}function w(t,e,n,r){var o=-1,i=t?t.length:0;for(r&&i&&(n=t[++o]);++o-1},at.prototype.set=function(t,e){var n=this.__data__,r=pt(n,t);return r<0?n.push([t,e]):n[r][1]=e,this},st.prototype.clear=function(){this.__data__={hash:new it,map:new(G||at),string:new it}},st.prototype.delete=function(t){return vt(this,t).delete(t)},st.prototype.get=function(t){return vt(this,t).get(t)},st.prototype.has=function(t){return vt(this,t).has(t)},st.prototype.set=function(t,e){return vt(this,t).set(t,e),this},ct.prototype.clear=function(){this.__data__=new at},ct.prototype.delete=function(t){return this.__data__.delete(t)},ct.prototype.get=function(t){return this.__data__.get(t)},ct.prototype.has=function(t){return this.__data__.has(t)},ct.prototype.set=function(t,e){var n=this.__data__;if(n instanceof at){var r=n.__data__;if(!G||r.length<199)return r.push([t,e]),this;n=this.__data__=new st(r)}return n.set(t,e),this};var _t=W?k(W,Object):function(){return[]},gt=function(t){return B.call(t)};function mt(t,e){return!!(e=null==e?9007199254740991:e)&&("number"==typeof t||p.test(t))&&t>-1&&t%1==0&&t-1&&t%1==0&&t<=9007199254740991}(t.length)&&!Pt(t)}var Ot=q||function(){return!1};function Pt(t){var e=Et(t)?B.call(t):"";return e==i||e==a}function Et(t){var e=void 0===t?"undefined":r(t);return!!t&&("object"==e||"function"==e)}function Ct(t){return St(t)?ut(t):function(t){if(!wt(t))return K(t);var e=[];for(var n in Object(t))$.call(t,n)&&"constructor"!=n&&e.push(n);return e}(t)}n.exports=function(t){return ft(t,!0,!0)}}).call(this,n(0),n(9)(t))},function(t,e,n){"use strict";t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n>1].factor>t?o=e-1:r=e;return n[r]},d.prototype.parse=function(t,e){var n=t.match(this._regexp);if(!n)return null;var r,o=n[2];if(c(this._prefixes,o))r=this._prefixes[o];else{if(e||(o=o.toLowerCase(),!c(this._lcPrefixes,o)))return null;o=this._lcPrefixes[o],r=this._prefixes[o]}return{factor:r,prefix:o,unit:n[3],value:+n[1]}};var h={binary:d.create(",ki,Mi,Gi,Ti,Pi,Ei,Zi,Yi".split(","),1024),SI:d.create("y,z,a,f,p,n,ยต,m,,k,M,G,T,P,E,Z,Y".split(","),1e3,-8)},y={scale:"SI",strict:!1,unit:"",decimals:2,separator:" "};function v(t,n){var r=g(t,n=e({},y,n)),o=r.prefix+n.unit;return function(t,e){if(!e)return Math.round(t);var n=Math.pow(10,e);return Math.round(t*n)/n}(r.value,n.decimals)+(o?n.separator+o:"")}function b(t,e){var n=_(t,e);return n.value*n.factor}function _(t,n){if(!p(t))throw new TypeError("str must be a string");n=e({},y,n);var r=f(h,n.scale);if(!r)throw new Error("missing scale");var o=r.parse(t,n.strict);if(!o)throw new Error("cannot parse str");return o}function g(t,n){if(0===t)return{value:0,prefix:""};if(!l(t))throw new TypeError("value must be a number");n=e({},y,n);var r=f(h,n.scale);if(!r)throw new Error("missing scale");var o,i=n.prefix;if(null!=i){if(!c(r._prefixes,i))throw new Error("invalid prefix");o=r._prefixes[i]}else{var a=r.findPrefix(t);i=a.prefix,o=a.factor}return{prefix:i,value:t/=o}}return v.parse=b,b.raw=_,v.raw=g,v.Scale=d,v})?r.apply(e,o):r)||(t.exports=i)},function(t,e,n){"use strict";var r;!function(o,i,a){if(o){for(var s,c={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},u={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},l={"~":"`","!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},p={option:"alt",command:"meta",return:"enter",escape:"esc",plus:"+",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},f=1;f<20;++f)c[111+f]="f"+f;for(f=0;f<=9;++f)c[f+96]=f.toString();_.prototype.bind=function(t,e,n){return t=t instanceof Array?t:[t],this._bindMultiple.call(this,t,e,n),this},_.prototype.unbind=function(t,e){return this.bind.call(this,t,(function(){}),e)},_.prototype.trigger=function(t,e){return this._directMap[t+":"+e]&&this._directMap[t+":"+e]({},t),this},_.prototype.reset=function(){return this._callbacks={},this._directMap={},this},_.prototype.stopCallback=function(t,e){if((" "+e.className+" ").indexOf(" mousetrap ")>-1)return!1;if(function t(e,n){return null!==e&&e!==i&&(e===n||t(e.parentNode,n))}(e,this.target))return!1;if("composedPath"in t&&"function"==typeof t.composedPath){var n=t.composedPath()[0];n!==t.target&&(e=n)}return"INPUT"==e.tagName||"SELECT"==e.tagName||"TEXTAREA"==e.tagName||e.isContentEditable},_.prototype.handleKey=function(){var t=this;return t._handleKey.apply(t,arguments)},_.addKeycodes=function(t){for(var e in t)t.hasOwnProperty(e)&&(c[e]=t[e]);s=null},_.init=function(){var t=_(i);for(var e in t)"_"!==e.charAt(0)&&(_[e]=function(e){return function(){return t[e].apply(t,arguments)}}(e))},_.init(),o.Mousetrap=_,t.exports&&(t.exports=_),void 0===(r=function(){return _}.call(e,n,e,t))||(t.exports=r)}function d(t,e,n){t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent("on"+e,n)}function h(t){if("keypress"==t.type){var e=String.fromCharCode(t.which);return t.shiftKey||(e=e.toLowerCase()),e}return c[t.which]?c[t.which]:u[t.which]?u[t.which]:String.fromCharCode(t.which).toLowerCase()}function y(t){return"shift"==t||"ctrl"==t||"alt"==t||"meta"==t}function v(t,e,n){return n||(n=function(){if(!s)for(var t in s={},c)t>95&&t<112||c.hasOwnProperty(t)&&(s[c[t]]=t);return s}()[t]?"keydown":"keypress"),"keypress"==n&&e.length&&(n="keydown"),n}function b(t,e){var n,r,o,i=[];for(n=function(t){return"+"===t?["+"]:(t=t.replace(/\+{2}/g,"+plus")).split("+")}(t),o=0;o1?f(t,s,n,r):(a=b(t,r),e._callbacks[a.key]=e._callbacks[a.key]||[],u(a.key,a.modifiers,{type:a.action},o,t,i),e._callbacks[a.key][o?"unshift":"push"]({callback:n,modifiers:a.modifiers,action:a.action,seq:o,level:i,combo:t}))}e._handleKey=function(t,e,n){var r,o=u(t,e,n),i={},p=0,f=!1;for(r=0;r=r._urisToMeasureBandwidth.length||0>>0;if("function"!=typeof e)throw new TypeError("predicate must be a function");for(var i=arguments[1],r=0;r>>0;if("function"!=typeof e)throw new TypeError("predicate must be a function");for(var i=arguments[1],r=0;r]*>/,p=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,g=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,v=/^(?:body|html)$/i,m=/([A-Z])/g,y=["val","css","html","text","data","width","height","offset"],A=u.createElement("table"),b=u.createElement("tr"),E={tr:u.createElement("tbody"),tbody:A,thead:A,tfoot:A,td:b,th:b,"*":u.createElement("div")},T=/complete|loaded|interactive/,k=/^[\w-]*$/,_={},S=_.toString,C={},w=u.createElement("div"),R={tabindex:"tabIndex",readonly:"readOnly",for:"htmlFor",class:"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},O=Array.isArray||function(e){return e instanceof Array};function L(e){return null==e?String(e):_[S.call(e)]||"object"}function D(e){return"function"==L(e)}function I(e){return null!=e&&e==e.window}function P(e){return null!=e&&e.nodeType==e.DOCUMENT_NODE}function x(e){return"object"==L(e)}function N(e){return x(e)&&!I(e)&&Object.getPrototypeOf(e)==Object.prototype}function M(e){var n=!!e&&"length"in e&&e.length,i=t.type(e);return"function"!=i&&!I(e)&&("array"==i||0===n||"number"==typeof n&&n>0&&n-1 in e)}function F(e){return e.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function B(e){return e in d?d[e]:d[e]=new RegExp("(^|\\s)"+e+"(\\s|$)")}function U(e,t){return"number"!=typeof t||h[F(e)]?t:t+"px"}function j(e){return"children"in e?l.call(e.children):t.map(e.childNodes,(function(e){if(1==e.nodeType)return e}))}function V(e,t){var n,i=e?e.length:0;for(n=0;n")),void 0===n&&(n=f.test(e)&&RegExp.$1),n in E||(n="*"),(o=E[n]).innerHTML=""+e,r=t.each(l.call(o.childNodes),(function(){o.removeChild(this)}))),N(i)&&(a=t(r),t.each(i,(function(e,t){y.indexOf(e)>-1?a[e](t):a.attr(e,t)}))),r},C.Z=function(e,t){return new V(e,t)},C.isZ=function(e){return e instanceof C.Z},C.init=function(e,n){var i,r;if(!e)return C.Z();if("string"==typeof e)if("<"==(e=e.trim())[0]&&f.test(e))i=C.fragment(e,RegExp.$1,n),e=null;else{if(void 0!==n)return t(n).find(e);i=C.qsa(u,e)}else{if(D(e))return t(u).ready(e);if(C.isZ(e))return e;if(O(e))r=e,i=s.call(r,(function(e){return null!=e}));else if(x(e))i=[e],e=null;else if(f.test(e))i=C.fragment(e.trim(),RegExp.$1,n),e=null;else{if(void 0!==n)return t(n).find(e);i=C.qsa(u,e)}}return C.Z(i,e)},(t=function(e,t){return C.init(e,t)}).extend=function(e){var t,n=l.call(arguments,1);return"boolean"==typeof e&&(t=e,e=n.shift()),n.forEach((function(n){K(e,n,t)})),e},C.qsa=function(e,t){var n,i="#"==t[0],r=!i&&"."==t[0],a=i||r?t.slice(1):t,o=k.test(a);return e.getElementById&&o&&i?(n=e.getElementById(a))?[n]:[]:1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType?[]:l.call(o&&!i&&e.getElementsByClassName?r?e.getElementsByClassName(a):e.getElementsByTagName(t):e.querySelectorAll(t))},t.contains=u.documentElement.contains?function(e,t){return e!==t&&e.contains(t)}:function(e,t){for(;t&&(t=t.parentNode);)if(t===e)return!0;return!1},t.type=L,t.isFunction=D,t.isWindow=I,t.isArray=O,t.isPlainObject=N,t.isEmptyObject=function(e){var t;for(t in e)return!1;return!0},t.isNumeric=function(e){var t=Number(e),n=typeof e;return null!=e&&"boolean"!=n&&("string"!=n||e.length)&&!isNaN(t)&&isFinite(t)||!1},t.inArray=function(e,t,n){return a.indexOf.call(t,e,n)},t.camelCase=i,t.trim=function(e){return null==e?"":String.prototype.trim.call(e)},t.uuid=0,t.support={},t.expr={},t.noop=function(){},t.map=function(e,n){var i,r,a,o,s=[];if(M(e))for(r=0;r0?t.fn.concat.apply([],o):o},t.each=function(e,t){var n,i;if(M(e)){for(n=0;n=0?e:e+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each((function(){null!=this.parentNode&&this.parentNode.removeChild(this)}))},each:function(e){return a.every.call(this,(function(t,n){return!1!==e.call(t,n,t)})),this},filter:function(e){return D(e)?this.not(this.not(e)):t(s.call(this,(function(t){return C.matches(t,e)})))},add:function(e,n){return t(r(this.concat(t(e,n))))},is:function(e){return this.length>0&&C.matches(this[0],e)},not:function(e){var n=[];if(D(e)&&void 0!==e.call)this.each((function(t){e.call(this,t)||n.push(this)}));else{var i="string"==typeof e?this.filter(e):M(e)&&D(e.item)?l.call(e):t(e);this.forEach((function(e){i.indexOf(e)<0&&n.push(e)}))}return t(n)},has:function(e){return this.filter((function(){return x(e)?t.contains(this,e):t(this).find(e).size()}))},eq:function(e){return-1===e?this.slice(e):this.slice(e,+e+1)},first:function(){var e=this[0];return e&&!x(e)?e:t(e)},last:function(){var e=this[this.length-1];return e&&!x(e)?e:t(e)},find:function(e){var n=this;return e?"object"==typeof e?t(e).filter((function(){var e=this;return a.some.call(n,(function(n){return t.contains(n,e)}))})):1==this.length?t(C.qsa(this[0],e)):this.map((function(){return C.qsa(this,e)})):t()},closest:function(e,n){var i=[],r="object"==typeof e&&t(e);return this.each((function(t,a){for(;a&&!(r?r.indexOf(a)>=0:C.matches(a,e));)a=a!==n&&!P(a)&&a.parentNode;a&&i.indexOf(a)<0&&i.push(a)})),t(i)},parents:function(e){for(var n=[],i=this;i.length>0;)i=t.map(i,(function(e){if((e=e.parentNode)&&!P(e)&&n.indexOf(e)<0)return n.push(e),e}));return G(n,e)},parent:function(e){return G(r(this.pluck("parentNode")),e)},children:function(e){return G(this.map((function(){return j(this)})),e)},contents:function(){return this.map((function(){return this.contentDocument||l.call(this.childNodes)}))},siblings:function(e){return G(this.map((function(e,t){return s.call(j(t.parentNode),(function(e){return e!==t}))})),e)},empty:function(){return this.each((function(){this.innerHTML=""}))},pluck:function(e){return t.map(this,(function(t){return t[e]}))},show:function(){return this.each((function(){var e,t,n;"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=(e=this.nodeName,c[e]||(t=u.createElement(e),u.body.appendChild(t),n=getComputedStyle(t,"").getPropertyValue("display"),t.parentNode.removeChild(t),"none"==n&&(n="block"),c[e]=n),c[e]))}))},replaceWith:function(e){return this.before(e).remove()},wrap:function(e){var n=D(e);if(this[0]&&!n)var i=t(e).get(0),r=i.parentNode||this.length>1;return this.each((function(a){t(this).wrapAll(n?e.call(this,a):r?i.cloneNode(!0):i)}))},wrapAll:function(e){if(this[0]){var n;for(t(this[0]).before(e=t(e));(n=e.children()).length;)e=n.first();t(e).append(this)}return this},wrapInner:function(e){var n=D(e);return this.each((function(i){var r=t(this),a=r.contents(),o=n?e.call(this,i):e;a.length?a.wrapAll(o):r.append(o)}))},unwrap:function(){return this.parent().each((function(){t(this).replaceWith(t(this).children())})),this},clone:function(){return this.map((function(){return this.cloneNode(!0)}))},hide:function(){return this.css("display","none")},toggle:function(e){return this.each((function(){var n=t(this);(void 0===e?"none"==n.css("display"):e)?n.show():n.hide()}))},prev:function(e){return t(this.pluck("previousElementSibling")).filter(e||"*")},next:function(e){return t(this.pluck("nextElementSibling")).filter(e||"*")},html:function(e){return 0 in arguments?this.each((function(n){var i=this.innerHTML;t(this).empty().append(Y(this,e,n,i))})):0 in this?this[0].innerHTML:null},text:function(e){return 0 in arguments?this.each((function(t){var n=Y(this,e,t,this.textContent);this.textContent=null==n?"":""+n})):0 in this?this.pluck("textContent").join(""):null},attr:function(t,n){var i;return"string"!=typeof t||1 in arguments?this.each((function(i){if(1===this.nodeType)if(x(t))for(e in t)H(this,e,t[e]);else H(this,t,Y(this,n,i,this.getAttribute(t)))})):0 in this&&1==this[0].nodeType&&null!=(i=this[0].getAttribute(t))?i:void 0},removeAttr:function(e){return this.each((function(){1===this.nodeType&&e.split(" ").forEach((function(e){H(this,e)}),this)}))},prop:function(e,t){return e=R[e]||e,1 in arguments?this.each((function(n){this[e]=Y(this,t,n,this[e])})):this[0]&&this[0][e]},removeProp:function(e){return e=R[e]||e,this.each((function(){delete this[e]}))},data:function(e,t){var n="data-"+e.replace(m,"-$1").toLowerCase(),i=1 in arguments?this.attr(n,t):this.attr(n);return null!==i?z(i):void 0},val:function(e){return 0 in arguments?(null==e&&(e=""),this.each((function(t){this.value=Y(this,e,t,this.value)}))):this[0]&&(this[0].multiple?t(this[0]).find("option").filter((function(){return this.selected})).pluck("value"):this[0].value)},offset:function(e){if(e)return this.each((function(n){var i=t(this),r=Y(this,e,n,i.offset()),a=i.offsetParent().offset(),o={top:r.top-a.top,left:r.left-a.left};"static"==i.css("position")&&(o.position="relative"),i.css(o)}));if(!this.length)return null;if(u.documentElement!==this[0]&&!t.contains(u.documentElement,this[0]))return{top:0,left:0};var n=this[0].getBoundingClientRect();return{left:n.left+window.pageXOffset,top:n.top+window.pageYOffset,width:Math.round(n.width),height:Math.round(n.height)}},css:function(n,r){if(arguments.length<2){var a=this[0];if("string"==typeof n){if(!a)return;return a.style[i(n)]||getComputedStyle(a,"").getPropertyValue(n)}if(O(n)){if(!a)return;var o={},s=getComputedStyle(a,"");return t.each(n,(function(e,t){o[t]=a.style[i(t)]||s.getPropertyValue(t)})),o}}var l="";if("string"==L(n))r||0===r?l=F(n)+":"+U(n,r):this.each((function(){this.style.removeProperty(F(n))}));else for(e in n)n[e]||0===n[e]?l+=F(e)+":"+U(e,n[e])+";":this.each((function(){this.style.removeProperty(F(e))}));return this.each((function(){this.style.cssText+=";"+l}))},index:function(e){return e?this.indexOf(t(e)[0]):this.parent().children().indexOf(this[0])},hasClass:function(e){return!!e&&a.some.call(this,(function(e){return this.test($(e))}),B(e))},addClass:function(e){return e?this.each((function(i){if("className"in this){n=[];var r=$(this);Y(this,e,i,r).split(/\s+/g).forEach((function(e){t(this).hasClass(e)||n.push(e)}),this),n.length&&$(this,r+(r?" ":"")+n.join(" "))}})):this},removeClass:function(e){return this.each((function(t){if("className"in this){if(void 0===e)return $(this,"");n=$(this),Y(this,e,t,n).split(/\s+/g).forEach((function(e){n=n.replace(B(e)," ")})),$(this,n.trim())}}))},toggleClass:function(e,n){return e?this.each((function(i){var r=t(this);Y(this,e,i,$(this)).split(/\s+/g).forEach((function(e){(void 0===n?!r.hasClass(e):n)?r.addClass(e):r.removeClass(e)}))})):this},scrollTop:function(e){if(this.length){var t="scrollTop"in this[0];return void 0===e?t?this[0].scrollTop:this[0].pageYOffset:this.each(t?function(){this.scrollTop=e}:function(){this.scrollTo(this.scrollX,e)})}},scrollLeft:function(e){if(this.length){var t="scrollLeft"in this[0];return void 0===e?t?this[0].scrollLeft:this[0].pageXOffset:this.each(t?function(){this.scrollLeft=e}:function(){this.scrollTo(e,this.scrollY)})}},position:function(){if(this.length){var e=this[0],n=this.offsetParent(),i=this.offset(),r=v.test(n[0].nodeName)?{top:0,left:0}:n.offset();return i.top-=parseFloat(t(e).css("margin-top"))||0,i.left-=parseFloat(t(e).css("margin-left"))||0,r.top+=parseFloat(t(n[0]).css("border-top-width"))||0,r.left+=parseFloat(t(n[0]).css("border-left-width"))||0,{top:i.top-r.top,left:i.left-r.left}}},offsetParent:function(){return this.map((function(){for(var e=this.offsetParent||u.body;e&&!v.test(e.nodeName)&&"static"==t(e).css("position");)e=e.offsetParent;return e}))}},t.fn.detach=t.fn.remove,["width","height"].forEach((function(e){var n=e.replace(/./,(function(e){return e[0].toUpperCase()}));t.fn[e]=function(i){var r,a=this[0];return void 0===i?I(a)?a["inner"+n]:P(a)?a.documentElement["scroll"+n]:(r=this.offset())&&r[e]:this.each((function(n){(a=t(this)).css(e,Y(this,i,n,a[e]()))}))}})),["after","prepend","before","append"].forEach((function(e,n){var i=n%2;t.fn[e]=function(){var e,r,a=t.map(arguments,(function(n){var i=[];return"array"==(e=L(n))?(n.forEach((function(e){return void 0!==e.nodeType?i.push(e):t.zepto.isZ(e)?i=i.concat(e.get()):void(i=i.concat(C.fragment(e)))})),i):"object"==e||null==n?n:C.fragment(n)})),o=this.length>1;return a.length<1?this:this.each((function(e,s){r=i?s:s.parentNode,s=0==n?s.nextSibling:1==n?s.firstChild:2==n?s:null;var l=t.contains(u.documentElement,r);a.forEach((function(e){if(o)e=e.cloneNode(!0);else if(!r)return t(e).remove();r.insertBefore(e,s),l&&W(e,(function(e){if(!(null==e.nodeName||"SCRIPT"!==e.nodeName.toUpperCase()||e.type&&"text/javascript"!==e.type||e.src)){var t=e.ownerDocument?e.ownerDocument.defaultView:window;t.eval.call(t,e.innerHTML)}}))}))}))},t.fn[i?e+"To":"insert"+(n?"Before":"After")]=function(n){return t(n)[e](this),this}})),C.Z.prototype=V.prototype=t.fn,C.uniq=r,C.deserializeValue=z,t.zepto=C,t}();window.Zepto=m,void 0===window.$&&(window.$=m),function(e){var t,n,i=+new Date,r=window.document,a=/)<[^<]*)*<\/script>/gi,o=/^(?:text|application)\/javascript/i,s=/^(?:text|application)\/xml/i,l=/^\s*$/,u=r.createElement("a");function c(t,n,i,a){if(t.global)return function(t,n,i){var r=e.Event(n);return e(t).trigger(r,i),!r.isDefaultPrevented()}(n||r,i,a)}function d(e,t){var n=t.context;if(!1===t.beforeSend.call(n,e,t)||!1===c(t,n,"ajaxBeforeSend",[e,t]))return!1;c(t,n,"ajaxSend",[e,t])}function h(e,t,n,i){var r=n.context;n.success.call(r,e,"success",t),i&&i.resolveWith(r,[e,"success",t]),c(n,r,"ajaxSuccess",[t,n,e]),p("success",t,n)}function f(e,t,n,i,r){var a=i.context;i.error.call(a,n,t,e),r&&r.rejectWith(a,[n,t,e]),c(i,a,"ajaxError",[n,i,e||t]),p(t,n,i)}function p(t,n,i){var r=i.context;i.complete.call(r,n,t),c(i,r,"ajaxComplete",[n,i]),function(t){t.global&&!--e.active&&c(t,null,"ajaxStop")}(i)}function g(){}function v(e,t){return""==t?e:(e+"&"+t).replace(/[&?]{1,2}/,"?")}function m(t,n,i,r){return e.isFunction(n)&&(r=i,i=n,n=void 0),e.isFunction(i)||(r=i,i=void 0),{url:t,data:n,success:i,dataType:r}}u.href=window.location.href,e.active=0,e.ajaxJSONP=function(t,n){if(!("type"in t))return e.ajax(t);var a,o,s=t.jsonpCallback,l=(e.isFunction(s)?s():s)||"Zepto"+i++,u=r.createElement("script"),c=window[l],p=function(t){e(u).triggerHandler("error",t||"abort")},g={abort:p};return n&&n.promise(g),e(u).on("load error",(function(i,r){clearTimeout(o),e(u).off().remove(),"error"!=i.type&&a?h(a[0],g,t,n):f(null,r||"error",g,t,n),window[l]=c,a&&e.isFunction(c)&&c(a[0]),c=a=void 0})),!1===d(g,t)?(p("abort"),g):(window[l]=function(){a=arguments},u.src=t.url.replace(/\?(.+)=\?/,"?$1="+l),r.head.appendChild(u),t.timeout>0&&(o=setTimeout((function(){p("timeout")}),t.timeout)),g)},e.ajaxSettings={type:"GET",beforeSend:g,success:g,error:g,complete:g,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:"application/json",xml:"application/xml, text/xml",html:"text/html",text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:g},e.ajax=function(i){var a,p,m=e.extend({},i||{}),y=e.Deferred&&e.Deferred();for(t in e.ajaxSettings)void 0===m[t]&&(m[t]=e.ajaxSettings[t]);!function(t){t.global&&0==e.active++&&c(t,null,"ajaxStart")}(m),m.crossDomain||((a=r.createElement("a")).href=m.url,a.href=a.href,m.crossDomain=u.protocol+"//"+u.host!=a.protocol+"//"+a.host),m.url||(m.url=window.location.toString()),(p=m.url.indexOf("#"))>-1&&(m.url=m.url.slice(0,p)),function(t){t.processData&&t.data&&"string"!=e.type(t.data)&&(t.data=e.param(t.data,t.traditional)),!t.data||t.type&&"GET"!=t.type.toUpperCase()&&"jsonp"!=t.dataType||(t.url=v(t.url,t.data),t.data=void 0)}(m);var A=m.dataType,b=/\?.+=\?/.test(m.url);if(b&&(A="jsonp"),!1!==m.cache&&(i&&!0===i.cache||"script"!=A&&"jsonp"!=A)||(m.url=v(m.url,"_="+Date.now())),"jsonp"==A)return b||(m.url=v(m.url,m.jsonp?m.jsonp+"=?":!1===m.jsonp?"":"callback=?")),e.ajaxJSONP(m,y);var E,T=m.accepts[A],k={},_=function(e,t){k[e.toLowerCase()]=[e,t]},S=/^([\w-]+:)\/\//.test(m.url)?RegExp.$1:window.location.protocol,C=m.xhr(),w=C.setRequestHeader;if(y&&y.promise(C),m.crossDomain||_("X-Requested-With","XMLHttpRequest"),_("Accept",T||"*/*"),(T=m.mimeType||T)&&(T.indexOf(",")>-1&&(T=T.split(",",2)[0]),C.overrideMimeType&&C.overrideMimeType(T)),(m.contentType||!1!==m.contentType&&m.data&&"GET"!=m.type.toUpperCase())&&_("Content-Type",m.contentType||"application/x-www-form-urlencoded"),m.headers)for(n in m.headers)_(n,m.headers[n]);if(C.setRequestHeader=_,C.onreadystatechange=function(){if(4==C.readyState){C.onreadystatechange=g,clearTimeout(E);var t,n=!1;if(C.status>=200&&C.status<300||304==C.status||0==C.status&&"file:"==S){if(A=A||function(e){return e&&(e=e.split(";",2)[0]),e&&("text/html"==e?"html":"application/json"==e?"json":o.test(e)?"script":s.test(e)&&"xml")||"text"}(m.mimeType||C.getResponseHeader("content-type")),"arraybuffer"==C.responseType||"blob"==C.responseType)t=C.response;else{t=C.responseText;try{t=function(e,t,n){if(n.dataFilter==g)return e;var i=n.context;return n.dataFilter.call(i,e,t)}(t,A,m),"script"==A?(0,eval)(t):"xml"==A?t=C.responseXML:"json"==A&&(t=l.test(t)?null:e.parseJSON(t))}catch(e){n=e}if(n)return f(n,"parsererror",C,m,y)}h(t,C,m,y)}else f(C.statusText||null,C.status?"error":"abort",C,m,y)}},!1===d(C,m))return C.abort(),f(null,"abort",C,m,y),C;var R=!("async"in m)||m.async;if(C.open(m.type,m.url,R,m.username,m.password),m.xhrFields)for(n in m.xhrFields)C[n]=m.xhrFields[n];for(n in k)w.apply(C,k[n]);return m.timeout>0&&(E=setTimeout((function(){C.onreadystatechange=g,C.abort(),f(null,"timeout",C,m,y)}),m.timeout)),C.send(m.data?m.data:null),C},e.get=function(){return e.ajax(m.apply(null,arguments))},e.post=function(){var t=m.apply(null,arguments);return t.type="POST",e.ajax(t)},e.getJSON=function(){var t=m.apply(null,arguments);return t.dataType="json",e.ajax(t)},e.fn.load=function(t,n,i){if(!this.length)return this;var r,o=this,s=t.split(/\s/),l=m(t,n,i),u=l.success;return s.length>1&&(l.url=s[0],r=s[1]),l.success=function(t){o.html(r?e("
").html(t.replace(a,"")).find(r):t),u&&u.apply(o,arguments)},e.ajax(l),this};var y=encodeURIComponent;e.param=function(t,n){var i=[];return i.add=function(t,n){e.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(y(t)+"="+y(n))},function t(n,i,r,a){var o,s=e.isArray(i),l=e.isPlainObject(i);e.each(i,(function(i,u){o=e.type(u),a&&(i=r?a:a+"["+(l||"object"==o||"array"==o?i:"")+"]"),!a&&s?n.add(u.name,u.value):"array"==o||!r&&"object"==o?t(n,u,r,i):n.add(i,u)}))}(i,t,n),i.join("&").replace(/%20/g,"+")}}(m),(g=m).Callbacks=function(e){e=g.extend({},e);var t,n,i,r,a,o,s=[],l=!e.once&&[],u=function(d){for(t=e.memory&&d,n=!0,o=r||0,r=0,a=s.length,i=!0;s&&o-1;)s.splice(n,1),i&&(n<=a&&--a,n<=o&&--o)})),this},has:function(e){return!(!s||!(e?g.inArray(e,s)>-1:s.length))},empty:function(){return a=s.length=0,this},disable:function(){return s=l=t=void 0,this},disabled:function(){return!s},lock:function(){return l=void 0,t||c.disable(),this},locked:function(){return!l},fireWith:function(e,t){return!s||n&&!l||(t=[e,(t=t||[]).slice?t.slice():t],i?l.push(t):u(t)),this},fire:function(){return c.fireWith(this,arguments)},fired:function(){return!!n}};return c},function(e){var t=Array.prototype.slice;function n(t){var i=[["resolve","done",e.Callbacks({once:1,memory:1}),"resolved"],["reject","fail",e.Callbacks({once:1,memory:1}),"rejected"],["notify","progress",e.Callbacks({memory:1})]],r="pending",a={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},then:function(){var t=arguments;return n((function(n){e.each(i,(function(i,r){var s=e.isFunction(t[i])&&t[i];o[r[1]]((function(){var t=s&&s.apply(this,arguments);if(t&&e.isFunction(t.promise))t.promise().done(n.resolve).fail(n.reject).progress(n.notify);else{var i=this===a?n.promise():this,o=s?[t]:arguments;n[r[0]+"With"](i,o)}}))})),t=null})).promise()},promise:function(t){return null!=t?e.extend(t,a):a}},o={};return e.each(i,(function(e,t){var n=t[2],s=t[3];a[t[1]]=n.add,s&&n.add((function(){r=s}),i[1^e][2].disable,i[2][2].lock),o[t[0]]=function(){return o[t[0]+"With"](this===o?a:this,arguments),this},o[t[0]+"With"]=n.fireWith})),a.promise(o),t&&t.call(o,o),o}e.when=function(i){var r,a,o,s=t.call(arguments),l=s.length,u=0,c=1!==l||i&&e.isFunction(i.promise)?l:0,d=1===c?i:n(),h=function(e,n,i){return function(a){n[e]=this,i[e]=arguments.length>1?t.call(arguments):a,i===r?d.notifyWith(n,i):--c||d.resolveWith(n,i)}};if(l>1)for(r=new Array(l),a=new Array(l),o=new Array(l);u-1)return this},has:function(e,n,i){if(t.qsa(this,i).length)return this}},o=new RegExp("(.*):(\\w+)(?:\\(([^)]+)\\))?$\\s*"),s=/^\s*>/,l="Zepto"+ +new Date;function u(e,t){e=e.replace(/=#\]/g,'="#"]');var n,i,r=o.exec(e);if(r&&r[2]in a&&(n=a[r[2]],i=r[3],e=r[1],i)){var s=Number(i);i=isNaN(s)?i.replace(/^["']|["']$/g,""):s}return t(e,n,i)}t.qsa=function(i,r){return u(r,(function(a,o,u){try{var c;!a&&o?a="*":s.test(a)&&(c=e(i).addClass(l),a="."+l+" "+a);var d=n(i,a)}catch(e){throw console.error("error performing selector: %o",r),e}finally{c&&c.removeClass(l)}return o?t.uniq(e.map(d,(function(e,t){return o.call(e,t,d,u)}))):d}))},t.matches=function(e,t){return u(t,(function(t,n,r){return(!t||i(e,t))&&(!n||n.call(e,null,r)===e)}))}}(m);var y,A,b,E=m,T=[{name:"Chromium",group:"Chrome",identifier:"Chromium/([0-9.]*)"},{name:"Chrome Mobile",group:"Chrome",identifier:"Chrome/([0-9.]*) Mobile",versionIdentifier:"Chrome/([0-9.]*)"},{name:"Chrome",group:"Chrome",identifier:"Chrome/([0-9.]*)"},{name:"Chrome for iOS",group:"Chrome",identifier:"CriOS/([0-9.]*)"},{name:"Android Browser",group:"Chrome",identifier:"CrMo/([0-9.]*)"},{name:"Firefox",group:"Firefox",identifier:"Firefox/([0-9.]*)"},{name:"Opera Mini",group:"Opera",identifier:"Opera Mini/([0-9.]*)"},{name:"Opera",group:"Opera",identifier:"Opera ([0-9.]*)"},{name:"Opera",group:"Opera",identifier:"Opera/([0-9.]*)",versionIdentifier:"Version/([0-9.]*)"},{name:"IEMobile",group:"Explorer",identifier:"IEMobile/([0-9.]*)"},{name:"Internet Explorer",group:"Explorer",identifier:"MSIE ([a-zA-Z0-9.]*)"},{name:"Internet Explorer",group:"Explorer",identifier:"Trident/([0-9.]*)",versionIdentifier:"rv:([0-9.]*)"},{name:"Spartan",group:"Spartan",identifier:"Edge/([0-9.]*)",versionIdentifier:"Edge/([0-9.]*)"},{name:"Safari",group:"Safari",identifier:"Safari/([0-9.]*)",versionIdentifier:"Version/([0-9.]*)"}],k=[{name:"Windows 2000",group:"Windows",identifier:"Windows NT 5.0",version:"5.0"},{name:"Windows XP",group:"Windows",identifier:"Windows NT 5.1",version:"5.1"},{name:"Windows Vista",group:"Windows",identifier:"Windows NT 6.0",version:"6.0"},{name:"Windows 7",group:"Windows",identifier:"Windows NT 6.1",version:"7.0"},{name:"Windows 8",group:"Windows",identifier:"Windows NT 6.2",version:"8.0"},{name:"Windows 8.1",group:"Windows",identifier:"Windows NT 6.3",version:"8.1"},{name:"Windows 10",group:"Windows",identifier:"Windows NT 10.0",version:"10.0"},{name:"Windows Phone",group:"Windows Phone",identifier:"Windows Phone ([0-9.]*)"},{name:"Windows Phone",group:"Windows Phone",identifier:"Windows Phone OS ([0-9.]*)"},{name:"Windows",group:"Windows",identifier:"Windows"},{name:"Chrome OS",group:"Chrome OS",identifier:"CrOS"},{name:"Android",group:"Android",identifier:"Android",versionIdentifier:"Android ([a-zA-Z0-9.-]*)"},{name:"iPad",group:"iOS",identifier:"iPad",versionIdentifier:"OS ([0-9_]*)",versionSeparator:"[_|.]"},{name:"iPod",group:"iOS",identifier:"iPod",versionIdentifier:"OS ([0-9_]*)",versionSeparator:"[_|.]"},{name:"iPhone",group:"iOS",identifier:"iPhone OS",versionIdentifier:"OS ([0-9_]*)",versionSeparator:"[_|.]"},{name:"Mac OS X High Sierra",group:"Mac OS",identifier:"Mac OS X (10([_|.])13([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS X Sierra",group:"Mac OS",identifier:"Mac OS X (10([_|.])12([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS X El Capitan",group:"Mac OS",identifier:"Mac OS X (10([_|.])11([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS X Yosemite",group:"Mac OS",identifier:"Mac OS X (10([_|.])10([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS X Mavericks",group:"Mac OS",identifier:"Mac OS X (10([_|.])9([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS X Mountain Lion",group:"Mac OS",identifier:"Mac OS X (10([_|.])8([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS X Lion",group:"Mac OS",identifier:"Mac OS X (10([_|.])7([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS X Snow Leopard",group:"Mac OS",identifier:"Mac OS X (10([_|.])6([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS X Leopard",group:"Mac OS",identifier:"Mac OS X (10([_|.])5([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS X Tiger",group:"Mac OS",identifier:"Mac OS X (10([_|.])4([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS X Panther",group:"Mac OS",identifier:"Mac OS X (10([_|.])3([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS X Jaguar",group:"Mac OS",identifier:"Mac OS X (10([_|.])2([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS X Puma",group:"Mac OS",identifier:"Mac OS X (10([_|.])1([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS X Cheetah",group:"Mac OS",identifier:"Mac OS X (10([_|.])0([0-9_.]*))",versionSeparator:"[_|.]"},{name:"Mac OS",group:"Mac OS",identifier:"Mac OS"},{name:"Ubuntu",group:"Linux",identifier:"Ubuntu",versionIdentifier:"Ubuntu/([0-9.]*)"},{name:"Debian",group:"Linux",identifier:"Debian"},{name:"Gentoo",group:"Linux",identifier:"Gentoo"},{name:"Linux",group:"Linux",identifier:"Linux"},{name:"BlackBerry",group:"BlackBerry",identifier:"BlackBerry"}],_={},S=function(e,t){var n=e.split(".",2);t.fullVersion=e,n[0]&&(t.majorVersion=parseInt(n[0])),n[1]&&(t.minorVersion=parseInt(n[1]))},C=function(e,t,n){var i="["==t.substr(0,1)?new RegExp(t,"g"):t,r=e.split(i,2);"."!=t&&(e=e.replace(new RegExp(t,"g"),".")),n.fullVersion=e,r&&r[0]&&(n.majorVersion=parseInt(r[0])),r&&r[1]&&(n.minorVersion=parseInt(r[1]))},w=function(e){var t,n=e.match(/\b(playstation 4|nx|opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(n[1]))return t=/\brv[ :]+(\d+)/g.exec(e)||[],{name:"IE",version:parseInt(t[1]||"")};if("Chrome"===n[1]){if(null!=(t=e.match(/\bOPR\/(\d+)/)))return{name:"Opera",version:parseInt(t[1])};if(null!=(t=e.match(/\bEdge\/(\d+)/)))return{name:"Edge",version:parseInt(t[1])}}else/android/i.test(e)&&(t=e.match(/version\/(\d+)/i))&&(n.splice(1,1,"Android WebView"),n.splice(2,1,t[1]));return{name:(n=n[2]?[n[1],n[2]]:[navigator.appName,navigator.appVersion,"-?"])[0],version:parseInt(n[1])}}(navigator.userAgent);function R(e,t){if(t)for(var n in t){var i=Object.getOwnPropertyDescriptor(t,n);i?Object.defineProperty(e,n,i):e[n]=t[n]}return e}function O(e,t){var n=function(e){function n(){var e,i;r(this,n);for(var a=arguments.length,o=new Array(a),s=0;s0&&void 0!==arguments[0]?arguments[0]:document;e.exitFullscreen?e.exitFullscreen():e.webkitCancelFullScreen?e.webkitCancelFullScreen():e.webkitExitFullscreen?e.webkitExitFullscreen():e.mozCancelFullScreen?e.mozCancelFullScreen():e.msExitFullscreen&&e.msExitFullscreen()},fullscreenEnabled:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},D=function(){function e(){r(this,e)}return o(e,null,[{key:"_defaultConfig",value:function(){return{volume:{value:100,parse:parseInt}}}},{key:"_defaultValueFor",value:function(e){try{return this._defaultConfig()[e].parse(this._defaultConfig()[e].value)}catch(e){return}}},{key:"_createKeyspace",value:function(e){return"clappr.".concat(document.domain,".").concat(e)}},{key:"restore",value:function(e){return _.hasLocalstorage&&localStorage[this._createKeyspace(e)]?this._defaultConfig()[e].parse(localStorage[this._createKeyspace(e)]):this._defaultValueFor(e)}},{key:"persist",value:function(e,t){if(_.hasLocalstorage)try{return localStorage[this._createKeyspace(e)]=t,!0}catch(e){return!1}}}]),e}(),I=function(){function e(){r(this,e)}return o(e,null,[{key:"parse",value:function(e){for(var t,n=/\+/g,i=/([^&=]+)=?([^&]*)/g,r=function(e){return decodeURIComponent(e.replace(n," "))},a={};t=i.exec(e);)a[r(t[1]).toLowerCase()]=r(t[2]);return a}},{key:"params",get:function(){var e=window.location.search.substring(1);return e!==this.query&&(this._urlParams=this.parse(e),this.query=e),this._urlParams}},{key:"hashParams",get:function(){var e=window.location.hash.substring(1);return e!==this.hash&&(this._hashParams=this.parse(e),this.hash=e),this._hashParams}}]),e}();function P(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"t",t=0,n=I.params[e]||I.hashParams[e]||"",i=n.match(/[0-9]+[hms]+/g)||[];if(i.length>0){var r={h:3600,m:60,s:1};i.forEach((function(e){if(e){var n=e[e.length-1],i=parseInt(e.slice(0,e.length-1),10);t+=i*r[n]}}))}else n&&(t=parseInt(n,10));return t}var x={};function N(e){return x[e]||(x[e]=0),e+ ++x[e]}function M(e){return e-parseFloat(e)+1>=0}function F(){var e=document.getElementsByTagName("script");return e.length?e[e.length-1].src:""}var B=(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)}).bind(window),U=(window.cancelAnimationFrame||window.mozCancelAnimationFrame||window.webkitCancelAnimationFrame||window.clearTimeout).bind(window);function j(){return window.navigator&&window.navigator.language}function V(e,t){var n=(t=Object.assign({inline:!1,muted:!1,timeout:250,type:"video",source:v.mp4,element:null},t)).element?t.element:document.createElement(t.type);n.muted=t.muted,!0===t.muted&&n.setAttribute("muted","muted"),!0===t.inline&&n.setAttribute("playsinline","playsinline"),n.src=t.source;var i=n.play(),r=setTimeout((function(){a(!1,new Error("Timeout ".concat(t.timeout," ms has been reached")))}),t.timeout),a=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;clearTimeout(r),e(t,n)};void 0!==i?i.then((function(){return a(!0)})).catch((function(e){return a(!1,e)})):a(!0)}var K=[],G=function(){function e(){r(this,e)}return o(e,null,[{key:"configure",value:function(e){this.options=E.extend(this.options,e)}},{key:"create",value:function(e){return this.options.recycleVideo&&"video"===e&&K.length>0?K.shift():document.createElement(e)}},{key:"garbage",value:function(e){this.options.recycleVideo&&"VIDEO"===e.tagName.toUpperCase()&&(E(e).children().remove(),Object.values(e.attributes).forEach((function(t){return e.removeAttribute(t.name)})),K.push(e))}}]),e}();G.options={recycleVideo:!1};var Y=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:500;r(this,e),this.delay=t,this.lastTime=0}return o(e,[{key:"handle",value:function(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=(new Date).getTime(),r=i-this.lastTime;r0&&(t(),n&&e.preventDefault()),this.lastTime=i}}]),e}(),H={Config:D,Fullscreen:L,QueryString:I,DomRecycler:G,assign:R,extend:O,formatTime:function(e,t){if(!isFinite(e))return"--:--";e*=1e3;var n=(e=parseInt(e/1e3))%60,i=(e=parseInt(e/60))%60,r=(e=parseInt(e/60))%24,a=parseInt(e/24),o="";return a&&a>0&&(o+=a+":",r<1&&(o+="00:")),(r&&r>0||t)&&(o+=("0"+r).slice(-2)+":"),o+=("0"+i).slice(-2)+":",(o+=("0"+n).slice(-2)).trim()},seekStringToSeconds:P,uniqueId:N,currentScriptUrl:F,isNumber:M,requestAnimationFrame:B,cancelAnimationFrame:U,getBrowserLanguage:j,now:function(){return window.performance&&window.performance.now?performance.now():Date.now()},removeArrayItem:function(e,t){var n=e.indexOf(t);n>=0&&e.splice(n,1)},listContainsIgnoreCase:function(e,t){return void 0!==e&&void 0!==t&&void 0!==t.find((function(t){return e.toLowerCase()===t.toLowerCase()}))},canAutoPlayMedia:V,Media:v,DoubleEventHandler:Y},$="font-weight: bold; font-size: 13px;",z="color: #ff8000;"+$,W="color: #ff0000;"+$,q=["color: #0000ff;font-weight: bold; font-size: 13px;","color: #006600;font-weight: bold; font-size: 13px;",z,W,W],X=["debug","info","warn","error","disabled"],Z=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;r(this,e),this.BLACKLIST=["timeupdate","playback:timeupdate","playback:progress","container:hover","container:timeupdate","container:progress"],this.level=t,this.offLevel=n}return o(e,[{key:"debug",value:function(e){this.log(e,0,Array.prototype.slice.call(arguments,1))}},{key:"info",value:function(e){this.log(e,1,Array.prototype.slice.call(arguments,1))}},{key:"warn",value:function(e){this.log(e,2,Array.prototype.slice.call(arguments,1))}},{key:"error",value:function(e){this.log(e,3,Array.prototype.slice.call(arguments,1))}},{key:"onOff",value:function(){this.level===this.offLevel?this.level=this.previousLevel:(this.previousLevel=this.level,this.level=this.offLevel),window.console&&window.console.log&&window.console.log("%c[Clappr.Log] set log level to "+X[this.level],z)}},{key:"level",value:function(e){this.level=e}},{key:"log",value:function(e,t,n){if(!(this.BLACKLIST.indexOf(n[0])>=0||t0&&void 0!==arguments[0]?arguments[0]:{};return r(this,t),(e=d(this,l(t).call(this,n)))._options=n,e.uniqueId=N("o"),e}return s(t,e),o(t,[{key:"options",get:function(){return this._options}}]),t}(ne),ae=/^(\S+)\s*(.*)$/,oe=function(e){function t(e){var n;return r(this,t),(n=d(this,l(t).call(this,e))).cid=N("c"),n._ensureElement(),n.delegateEvents(),n}return s(t,e),o(t,[{key:"tagName",get:function(){return"div"}},{key:"events",get:function(){return{}}},{key:"attributes",get:function(){return{}}}]),o(t,[{key:"$",value:function(e){return this.$el.find(e)}},{key:"render",value:function(){return this}},{key:"destroy",value:function(){return this.$el.remove(),this.stopListening(),this.undelegateEvents(),this}},{key:"setElement",value:function(e,t){return this.$el&&this.undelegateEvents(),this.$el=E.zepto.isZ(e)?e:E(e),this.el=this.$el[0],!1!==t&&this.delegateEvents(),this}},{key:"delegateEvents",value:function(e){if(!e&&!(e=this.events))return this;for(var t in this.undelegateEvents(),e){var n=e[t];if(n&&n.constructor!==Function&&(n=this[e[t]]),n){var i=t.match(ae),r=i[1],a=i[2];r+=".delegateEvents"+this.cid,""===a?this.$el.on(r,n.bind(this)):this.$el.on(r,a,n.bind(this))}}return this}},{key:"undelegateEvents",value:function(){return this.$el.off(".delegateEvents"+this.cid),this}},{key:"_ensureElement",value:function(){if(this.el)this.setElement(this.el,!1);else{var e=E.extend({},this.attributes);this.id&&(e.id=this.id),this.className&&(e.class=this.className);var t=E(G.create(this.tagName)).attr(e);this.setElement(t,!1)}}}]),t}(re),se=function(e){function t(){var e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=arguments.length>1?arguments[1]:void 0;return r(this,t),(e=d(this,l(t).call(this,n))).core=i,e}return s(t,e),o(t,[{key:"name",get:function(){return"error"}}],[{key:"Levels",get:function(){return{FATAL:"FATAL",WARN:"WARN",INFO:"INFO"}}}]),o(t,[{key:"createError",value:function(e){this.core?this.core.trigger(ne.ERROR,e):Z.warn(this.name,"Core is not set. Error: ",e)}}]),t}(re),le={createError:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{useCodePrefix:!0},n=this.constructor&&this.constructor.type||"",i=this.name||n,r=this.i18n||this.core&&this.core.i18n||this.container&&this.container.i18n,a="".concat(i,":").concat(e&&e.code||"unknown"),o={description:"",level:se.Levels.FATAL,origin:i,scope:n,raw:{}},s=Object.assign({},o,e,{code:t.useCodePrefix?a:e.code});if(r&&s.level==se.Levels.FATAL&&!s.UI){var l={title:r.t("default_error_title"),message:r.t("default_error_message")};s.UI=l}return this.playerError?this.playerError.createError(s):Z.warn(i,"PlayerError is not defined. Error: ",s),s}},ue=function(e){function t(e){var n;return r(this,t),(n=d(this,l(t).call(this,e.options))).core=e,n.enabled=!0,n.bindEvents(),n.render(),n}return s(t,e),o(t,[{key:"playerError",get:function(){return this.core.playerError}}]),o(t,[{key:"bindEvents",value:function(){}},{key:"getExternalInterface",value:function(){return{}}},{key:"enable",value:function(){this.enabled||(this.bindEvents(),this.$el.show(),this.enabled=!0)}},{key:"disable",value:function(){this.stopListening(),this.$el.hide(),this.enabled=!1}},{key:"render",value:function(){return this}}]),t}(oe);function ce(e,t){void 0===t&&(t={});var n=t.insertAt;if(e&&"undefined"!=typeof document){var i=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css","top"===n&&i.firstChild?i.insertBefore(r,i.firstChild):i.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}}Object.assign(ue.prototype,le),ue.extend=function(e){return O(ue,e)},ue.type="core";ce(".container[data-container] {\n position: absolute;\n background-color: black;\n height: 100%;\n width: 100%;\n max-width: 100%; }\n .container[data-container] .chromeless {\n cursor: default; }\n\n[data-player]:not(.nocursor) .container[data-container]:not(.chromeless).pointer-enabled {\n cursor: pointer; }\n");var de=function(e){function t(e,n,i){var a;return r(this,t),(a=d(this,l(t).call(this,e)))._i18n=n,a.currentTime=0,a.volume=100,a.playback=e.playback,a.playerError=i,a.settings=E.extend({},a.playback.settings),a.isReady=!1,a.mediaControlDisabled=!1,a.plugins=[a.playback],a.dblTapHandler=new Y(500),a.clickTimer=null,a.clickDelay=200,a.bindEvents(),a}return s(t,e),o(t,[{key:"name",get:function(){return"Container"}},{key:"attributes",get:function(){return{class:"container","data-container":""}}},{key:"events",get:function(){return{click:"clicked",dblclick:"dblClicked",touchend:"dblTap",contextmenu:"onContextMenu",mouseenter:"mouseEnter",mouseleave:"mouseLeave"}}},{key:"ended",get:function(){return this.playback.ended}},{key:"buffering",get:function(){return this.playback.buffering}},{key:"i18n",get:function(){return this._i18n}},{key:"hasClosedCaptionsTracks",get:function(){return this.playback.hasClosedCaptionsTracks}},{key:"closedCaptionsTracks",get:function(){return this.playback.closedCaptionsTracks}},{key:"closedCaptionsTrackId",get:function(){return this.playback.closedCaptionsTrackId},set:function(e){this.playback.closedCaptionsTrackId=e}}]),o(t,[{key:"bindEvents",value:function(){this.listenTo(this.playback,ne.PLAYBACK_PROGRESS,this.onProgress),this.listenTo(this.playback,ne.PLAYBACK_TIMEUPDATE,this.timeUpdated),this.listenTo(this.playback,ne.PLAYBACK_READY,this.ready),this.listenTo(this.playback,ne.PLAYBACK_BUFFERING,this.onBuffering),this.listenTo(this.playback,ne.PLAYBACK_BUFFERFULL,this.bufferfull),this.listenTo(this.playback,ne.PLAYBACK_SETTINGSUPDATE,this.settingsUpdate),this.listenTo(this.playback,ne.PLAYBACK_LOADEDMETADATA,this.loadedMetadata),this.listenTo(this.playback,ne.PLAYBACK_HIGHDEFINITIONUPDATE,this.highDefinitionUpdate),this.listenTo(this.playback,ne.PLAYBACK_BITRATE,this.updateBitrate),this.listenTo(this.playback,ne.PLAYBACK_PLAYBACKSTATE,this.playbackStateChanged),this.listenTo(this.playback,ne.PLAYBACK_DVR,this.playbackDvrStateChanged),this.listenTo(this.playback,ne.PLAYBACK_MEDIACONTROL_DISABLE,this.disableMediaControl),this.listenTo(this.playback,ne.PLAYBACK_MEDIACONTROL_ENABLE,this.enableMediaControl),this.listenTo(this.playback,ne.PLAYBACK_SEEKED,this.onSeeked),this.listenTo(this.playback,ne.PLAYBACK_ENDED,this.onEnded),this.listenTo(this.playback,ne.PLAYBACK_PLAY,this.playing),this.listenTo(this.playback,ne.PLAYBACK_PAUSE,this.paused),this.listenTo(this.playback,ne.PLAYBACK_STOP,this.stopped),this.listenTo(this.playback,ne.PLAYBACK_ERROR,this.error),this.listenTo(this.playback,ne.PLAYBACK_SUBTITLE_AVAILABLE,this.subtitleAvailable),this.listenTo(this.playback,ne.PLAYBACK_SUBTITLE_CHANGED,this.subtitleChanged)}},{key:"subtitleAvailable",value:function(){this.trigger(ne.CONTAINER_SUBTITLE_AVAILABLE)}},{key:"subtitleChanged",value:function(e){this.trigger(ne.CONTAINER_SUBTITLE_CHANGED,e)}},{key:"playbackStateChanged",value:function(e){this.trigger(ne.CONTAINER_PLAYBACKSTATE,e)}},{key:"playbackDvrStateChanged",value:function(e){this.settings=this.playback.settings,this.dvrInUse=e,this.trigger(ne.CONTAINER_PLAYBACKDVRSTATECHANGED,e)}},{key:"updateBitrate",value:function(e){this.trigger(ne.CONTAINER_BITRATE,e)}},{key:"statsReport",value:function(e){this.trigger(ne.CONTAINER_STATS_REPORT,e)}},{key:"getPlaybackType",value:function(){return this.playback.getPlaybackType()}},{key:"isDvrEnabled",value:function(){return!!this.playback.dvrEnabled}},{key:"isDvrInUse",value:function(){return!!this.dvrInUse}},{key:"destroy",value:function(){this.disableResizeObserver(),this.trigger(ne.CONTAINER_DESTROYED,this,this.name),this.stopListening(),this.plugins.forEach((function(e){return e.destroy()})),this.$el.remove()}},{key:"setStyle",value:function(e){this.$el.css(e)}},{key:"animate",value:function(e,t){return this.$el.animate(e,t).promise()}},{key:"ready",value:function(){this.isReady=!0,this.trigger(ne.CONTAINER_READY,this.name)}},{key:"isPlaying",value:function(){return this.playback.isPlaying()}},{key:"getStartTimeOffset",value:function(){return this.playback.getStartTimeOffset()}},{key:"getCurrentTime",value:function(){return this.currentTime}},{key:"getDuration",value:function(){return this.playback.getDuration()}},{key:"error",value:function(e){this.isReady||this.ready(),this.trigger(ne.CONTAINER_ERROR,e,this.name)}},{key:"loadedMetadata",value:function(e){this.trigger(ne.CONTAINER_LOADEDMETADATA,e)}},{key:"timeUpdated",value:function(e){this.currentTime=e.current,this.trigger(ne.CONTAINER_TIMEUPDATE,e,this.name)}},{key:"onProgress",value:function(){for(var e=arguments.length,t=new Array(e),n=0;n=0&&e<=100){var n=t*(e/100);this.seek(n)}}},{key:"setVolume",value:function(e){this.volume=parseFloat(e),this.trigger(ne.CONTAINER_VOLUME,this.volume,this.name),this.playback.volume(this.volume)}},{key:"fullscreen",value:function(){this.trigger(ne.CONTAINER_FULLSCREEN,this.name)}},{key:"onBuffering",value:function(){this.trigger(ne.CONTAINER_STATE_BUFFERING,this.name)}},{key:"bufferfull",value:function(){this.trigger(ne.CONTAINER_STATE_BUFFERFULL,this.name)}},{key:"addPlugin",value:function(e){this.plugins.push(e)}},{key:"hasPlugin",value:function(e){return!!this.getPlugin(e)}},{key:"getPlugin",value:function(e){return this.plugins.filter((function(t){return t.name===e}))[0]}},{key:"mouseEnter",value:function(){this.options.chromeless&&!this.options.allowUserInteraction||this.trigger(ne.CONTAINER_MOUSE_ENTER)}},{key:"mouseLeave",value:function(){this.options.chromeless&&!this.options.allowUserInteraction||this.trigger(ne.CONTAINER_MOUSE_LEAVE)}},{key:"settingsUpdate",value:function(){this.settings=this.playback.settings,this.trigger(ne.CONTAINER_SETTINGSUPDATE)}},{key:"highDefinitionUpdate",value:function(e){this.trigger(ne.CONTAINER_HIGHDEFINITIONUPDATE,e)}},{key:"isHighDefinitionInUse",value:function(){return this.playback.isHighDefinitionInUse()}},{key:"disableMediaControl",value:function(){this.mediaControlDisabled||(this.mediaControlDisabled=!0,this.trigger(ne.CONTAINER_MEDIACONTROL_DISABLE))}},{key:"enableMediaControl",value:function(){this.mediaControlDisabled&&(this.mediaControlDisabled=!1,this.trigger(ne.CONTAINER_MEDIACONTROL_ENABLE))}},{key:"updateStyle",value:function(){!this.options.chromeless||this.options.allowUserInteraction?this.$el.removeClass("chromeless"):this.$el.addClass("chromeless")}},{key:"enableResizeObserver",value:function(){var e=this;this.disableResizeObserver(),this.resizeObserverInterval=setInterval((function(){return e.checkResize()}),500)}},{key:"disableResizeObserver",value:function(){this.resizeObserverInterval&&clearInterval(this.resizeObserverInterval)}},{key:"checkResize",value:function(){var e={width:this.el.clientWidth,height:this.el.clientHeight},t=this.currentSize||{},n=t.width;(t.height!==e.height||n!==e.width)&&(this.currentSize=e,this.trigger(ne.CONTAINER_RESIZE,e))}},{key:"configure",value:function(e){this._options=E.extend(this._options,e),this.updateStyle(),this.playback.configure(this.options),this.trigger(ne.CONTAINER_OPTIONS_CHANGE)}},{key:"render",value:function(){return this.$el.append(this.playback.render().el),this.updateStyle(),this.checkResize(),this.enableResizeObserver(),this}}]),t}(oe);Object.assign(de.prototype,le);var he=function(e){function t(e,n,i){var a;return r(this,t),(a=d(this,l(t).call(this,e))).settings={},a._i18n=n,a.playerError=i,a._consented=!1,a}return s(t,e),o(t,[{key:"isAudioOnly",get:function(){return!1}},{key:"isAdaptive",get:function(){return!1}},{key:"ended",get:function(){return!1}},{key:"i18n",get:function(){return this._i18n}},{key:"buffering",get:function(){return!1}}]),o(t,[{key:"consent",value:function(e){"function"==typeof e&&e()}},{key:"play",value:function(){}},{key:"pause",value:function(){}},{key:"stop",value:function(){}},{key:"seek",value:function(e){}},{key:"seekPercentage",value:function(e){}},{key:"getStartTimeOffset",value:function(){return 0}},{key:"getDuration",value:function(){return 0}},{key:"isPlaying",value:function(){return!1}},{key:"getPlaybackType",value:function(){return t.NO_OP}},{key:"isHighDefinitionInUse",value:function(){return!1}},{key:"mute",value:function(){}},{key:"unmute",value:function(){}},{key:"volume",value:function(e){}},{key:"configure",value:function(e){this._options=E.extend(this._options,e)}},{key:"attemptAutoPlay",value:function(){var e=this;this.canAutoPlay((function(t,n){t&&e.play()}))}},{key:"canAutoPlay",value:function(e){e(!0,null)}},{key:"isReady",get:function(){return!1}},{key:"hasClosedCaptionsTracks",get:function(){return this.closedCaptionsTracks.length>0}},{key:"closedCaptionsTracks",get:function(){return[]}},{key:"closedCaptionsTrackId",get:function(){return-1},set:function(e){}}]),t}(oe);Object.assign(he.prototype,le),he.extend=function(e){return O(he,e)},he.canPlay=function(e,t){return!1},he.VOD="vod",he.AOD="aod",he.LIVE="live",he.NO_OP="no_op",he.type="playback";var fe=function(e){function t(e,n,i,a){var o;return r(this,t),(o=d(this,l(t).call(this,e)))._i18n=i,o.loader=n,o.playerError=a,o}return s(t,e),o(t,[{key:"options",get:function(){return this._options},set:function(e){this._options=e}}]),o(t,[{key:"createContainers",value:function(){var e=this;return E.Deferred((function(t){t.resolve(e.options.sources.map((function(t){return e.createContainer(t)})))}))}},{key:"findPlaybackPlugin",value:function(e,t){return this.loader.playbackPlugins.filter((function(n){return n.canPlay(e,t)}))[0]}},{key:"createContainer",value:function(e){var t=null,n=this.options.mimeType;"object"===i(e)?(t=e.source.toString(),e.mimeType&&(n=e.mimeType)):t=e.toString(),t.match(/^\/\//)&&(t=window.location.protocol+t);var r=E.extend({},this.options,{src:t,mimeType:n}),a=this.findPlaybackPlugin(t,n),o=a?new a(r,this._i18n,this.playerError):new he;r=E.extend({},r,{playback:o});var s=new de(r,this._i18n,this.playerError),l=E.Deferred();return l.promise(s),this.addContainerPlugins(s),this.listenToOnce(s,ne.CONTAINER_READY,(function(){return l.resolve(s)})),s}},{key:"addContainerPlugins",value:function(e){this.loader.containerPlugins.forEach((function(t){e.addPlugin(new t(e))}))}}]),t}(re);ce('[data-player] {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n -o-user-select: none;\n user-select: none;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n transform: translate3d(0, 0, 0);\n position: relative;\n margin: 0;\n padding: 0;\n border: 0;\n font-style: normal;\n font-weight: normal;\n text-align: center;\n overflow: hidden;\n font-size: 100%;\n font-family: "Roboto", "Open Sans", Arial, sans-serif;\n text-shadow: 0 0 0;\n box-sizing: border-box; }\n [data-player] div, [data-player] span, [data-player] applet, [data-player] object, [data-player] iframe,\n [data-player] h1, [data-player] h2, [data-player] h3, [data-player] h4, [data-player] h5, [data-player] h6, [data-player] p, [data-player] blockquote, [data-player] pre,\n [data-player] a, [data-player] abbr, [data-player] acronym, [data-player] address, [data-player] big, [data-player] cite, [data-player] code,\n [data-player] del, [data-player] dfn, [data-player] em, [data-player] img, [data-player] ins, [data-player] kbd, [data-player] q, [data-player] s, [data-player] samp,\n [data-player] small, [data-player] strike, [data-player] strong, [data-player] sub, [data-player] sup, [data-player] tt, [data-player] var,\n [data-player] b, [data-player] u, [data-player] i, [data-player] center,\n [data-player] dl, [data-player] dt, [data-player] dd, [data-player] ol, [data-player] ul, [data-player] li,\n [data-player] fieldset, [data-player] form, [data-player] label, [data-player] legend,\n [data-player] table, [data-player] caption, [data-player] tbody, [data-player] tfoot, [data-player] thead, [data-player] tr, [data-player] th, [data-player] td,\n [data-player] article, [data-player] aside, [data-player] canvas, [data-player] details, [data-player] embed,\n [data-player] figure, [data-player] figcaption, [data-player] footer, [data-player] header, [data-player] hgroup,\n [data-player] menu, [data-player] nav, [data-player] output, [data-player] ruby, [data-player] section, [data-player] summary,\n [data-player] time, [data-player] mark, [data-player] audio, [data-player] video {\n margin: 0;\n padding: 0;\n border: 0;\n font: inherit;\n font-size: 100%;\n vertical-align: baseline; }\n [data-player] table {\n border-collapse: collapse;\n border-spacing: 0; }\n [data-player] caption, [data-player] th, [data-player] td {\n text-align: left;\n font-weight: normal;\n vertical-align: middle; }\n [data-player] q, [data-player] blockquote {\n quotes: none; }\n [data-player] q:before, [data-player] q:after, [data-player] blockquote:before, [data-player] blockquote:after {\n content: "";\n content: none; }\n [data-player] a img {\n border: none; }\n [data-player]:focus {\n outline: 0; }\n [data-player] * {\n max-width: none;\n box-sizing: inherit;\n float: none; }\n [data-player] div {\n display: block; }\n [data-player].fullscreen {\n width: 100% !important;\n height: 100% !important;\n top: 0;\n left: 0; }\n [data-player].nocursor {\n cursor: none; }\n\n.clappr-style {\n display: none !important; }\n');var pe=function(e){function t(e){var n;return r(this,t),(n=d(this,l(t).call(this,e))).playerError=new se(e,c(n)),n.configureDomRecycler(),n.firstResize=!0,n.plugins=[],n.containers=[],n._boundFullscreenHandler=function(){return n.handleFullscreenChange()},E(document).bind("fullscreenchange",n._boundFullscreenHandler),E(document).bind("MSFullscreenChange",n._boundFullscreenHandler),E(document).bind("mozfullscreenchange",n._boundFullscreenHandler),_.isMobile&&E(window).bind("resize",(function(e){n.handleWindowResize(e)})),n}return s(t,e),o(t,[{key:"events",get:function(){return{webkitfullscreenchange:"handleFullscreenChange",mousemove:"onMouseMove",mouseleave:"onMouseLeave"}}},{key:"attributes",get:function(){return{"data-player":"",tabindex:9999}}},{key:"isReady",get:function(){return!!this.ready}},{key:"i18n",get:function(){return this.getPlugin("strings")||{t:function(e){return e}}}},{key:"mediaControl",get:function(){return this._mediaControl||(this._mediaControl=this.getPlugin("media_control"))||this.dummyMediaControl}},{key:"dummyMediaControl",get:function(){return this._dummyMediaControl||(this._dummyMediaControl=new ue(this)),this._dummyMediaControl}},{key:"activeContainer",get:function(){return this._activeContainer},set:function(e){this._activeContainer=e,this.trigger(ne.CORE_ACTIVE_CONTAINER_CHANGED,this._activeContainer)}},{key:"activePlayback",get:function(){return this.activeContainer&&this.activeContainer.playback}}]),o(t,[{key:"configureDomRecycler",value:function(){var e=this.options&&this.options.playback&&this.options.playback.recycleVideo;G.configure({recycleVideo:e})}},{key:"createContainers",value:function(e){this.defer=E.Deferred(),this.defer.promise(this),this.containerFactory=new fe(e,e.loader,this.i18n,this.playerError),this.prepareContainers()}},{key:"prepareContainers",value:function(){var e=this;this.containerFactory.createContainers().then((function(t){return e.setupContainers(t)})).then((function(t){return e.resolveOnContainersReady(t)}))}},{key:"updateSize",value:function(){this.isFullscreen()?this.setFullscreen():this.setPlayerSize()}},{key:"setFullscreen",value:function(){_.isiOS||(this.$el.addClass("fullscreen"),this.$el.removeAttr("style"),this.previousSize={width:this.options.width,height:this.options.height},this.currentSize={width:E(window).width(),height:E(window).height()})}},{key:"setPlayerSize",value:function(){this.$el.removeClass("fullscreen"),this.currentSize=this.previousSize,this.previousSize={width:E(window).width(),height:E(window).height()},this.resize(this.currentSize)}},{key:"resize",value:function(e){M(e.height)||M(e.width)?(this.el.style.height="".concat(e.height,"px"),this.el.style.width="".concat(e.width,"px")):(this.el.style.height="".concat(e.height),this.el.style.width="".concat(e.width)),this.previousSize={width:this.options.width,height:this.options.height},this.options.width=e.width,this.options.height=e.height,this.currentSize=e,this.triggerResize(this.currentSize)}},{key:"enableResizeObserver",value:function(){var e=this;this.disableResizeObserver();this.resizeObserverInterval=setInterval((function(){e.triggerResize({width:e.el.clientWidth,height:e.el.clientHeight})}),500)}},{key:"triggerResize",value:function(e){(this.firstResize||this.oldHeight!==e.height||this.oldWidth!==e.width)&&(this.oldHeight=e.height,this.oldWidth=e.width,this.computedSize=e,this.firstResize=!1,this.trigger(ne.CORE_RESIZE,e))}},{key:"disableResizeObserver",value:function(){this.resizeObserverInterval&&clearInterval(this.resizeObserverInterval),this.resizeObserverInterval=null}},{key:"resolveOnContainersReady",value:function(e){var t=this;E.when.apply(E,e).done((function(){t.defer.resolve(t),t.ready=!0,t.trigger(ne.CORE_READY)}))}},{key:"addPlugin",value:function(e){this.plugins.push(e)}},{key:"hasPlugin",value:function(e){return!!this.getPlugin(e)}},{key:"getPlugin",value:function(e){return this.plugins.filter((function(t){return t.name===e}))[0]}},{key:"load",value:function(e,t){this.options.mimeType=t,e=e&&e.constructor===Array?e:[e],this.options.sources=e,this.containers.forEach((function(e){return e.destroy()})),this.containerFactory.options=E.extend(this.options,{sources:e}),this.prepareContainers()}},{key:"destroy",value:function(){this.disableResizeObserver(),this.containers.forEach((function(e){return e.destroy()})),this.plugins.forEach((function(e){return e.destroy()})),this.$el.remove(),E(document).unbind("fullscreenchange",this._boundFullscreenHandler),E(document).unbind("MSFullscreenChange",this._boundFullscreenHandler),E(document).unbind("mozfullscreenchange",this._boundFullscreenHandler),this.stopListening()}},{key:"handleFullscreenChange",value:function(){this.trigger(ne.CORE_FULLSCREEN,this.isFullscreen()),this.updateSize()}},{key:"handleWindowResize",value:function(e){var t=window.innerWidth>window.innerHeight?"landscape":"portrait";this._screenOrientation!==t&&(this._screenOrientation=t,this.triggerResize({width:this.el.clientWidth,height:this.el.clientHeight}),this.trigger(ne.CORE_SCREEN_ORIENTATION_CHANGED,{event:e,orientation:this._screenOrientation}))}},{key:"removeContainer",value:function(e){this.stopListening(e),this.containers=this.containers.filter((function(t){return t!==e}))}},{key:"setupContainer",value:function(e){this.listenTo(e,ne.CONTAINER_DESTROYED,this.removeContainer),this.containers.push(e)}},{key:"setupContainers",value:function(e){return e.forEach(this.setupContainer.bind(this)),this.trigger(ne.CORE_CONTAINERS_CREATED),this.renderContainers(),this.activeContainer=e[0],this.render(),this.appendToParent(),this.containers}},{key:"renderContainers",value:function(){var e=this;this.containers.forEach((function(t){return e.el.appendChild(t.render().el)}))}},{key:"createContainer",value:function(e,t){var n=this.containerFactory.createContainer(e,t);return this.setupContainer(n),this.el.appendChild(n.render().el),n}},{key:"getCurrentContainer",value:function(){return this.activeContainer}},{key:"getCurrentPlayback",value:function(){return this.activePlayback}},{key:"getPlaybackType",value:function(){return this.activeContainer&&this.activeContainer.getPlaybackType()}},{key:"isFullscreen",value:function(){var e=L.fullscreenElement();if(!e)return!1;var t=this.activePlayback&&this.activePlayback.el;return e===this.el||e===t}},{key:"toggleFullscreen",value:function(){if(this.isFullscreen())L.cancelFullscreen(),!_.isiOS&&this.$el.removeClass("fullscreen nocursor");else{var e=_.isiOS?this.activePlayback&&this.activePlayback.el:this.el;if(!e)return;L.requestFullscreen(e),!_.isiOS&&this.$el.addClass("fullscreen")}}},{key:"onMouseMove",value:function(e){this.trigger(ne.CORE_MOUSE_MOVE,e)}},{key:"onMouseLeave",value:function(e){this.trigger(ne.CORE_MOUSE_LEAVE,e)}},{key:"configure",value:function(e){var t=this;this._options=E.extend(this._options,e),this.configureDomRecycler();var n=e.source||e.sources;n&&this.load(n,e.mimeType||this.options.mimeType),this.trigger(ne.CORE_OPTIONS_CHANGE,e),this.containers.forEach((function(e){return e.configure(t.options)}))}},{key:"appendToParent",value:function(){!(this.$el.parent()&&this.$el.parent().length)&&this.$el.appendTo(this.options.parentElement)}},{key:"render",value:function(){this.options.width=this.options.width||this.$el.width(),this.options.height=this.options.height||this.$el.height();var e={width:this.options.width,height:this.options.height};return this.previousSize=this.currentSize=this.computedSize=e,this.updateSize(),this.enableResizeObserver(),this}}]),t}(oe);Object.assign(pe.prototype,le);var ge,ve=function(e){function t(e){var n;return r(this,t),(n=d(this,l(t).call(this))).player=e,n._options=e.options,n}return s(t,e),o(t,[{key:"loader",get:function(){return this.player.loader}}]),o(t,[{key:"create",value:function(){return this.options.loader=this.loader,this.core=new pe(this.options),this.addCorePlugins(),this.core.createContainers(this.options),this.core}},{key:"addCorePlugins",value:function(){var e=this;return this.loader.corePlugins.forEach((function(t){var n=new t(e.core);e.core.addPlugin(n),e.setupExternalInterface(n)})),this.core}},{key:"setupExternalInterface",value:function(e){var t=e.getExternalInterface();for(var n in t)this.player[n]=t[n].bind(e)}}]),t}(re),me=/(\d+)(?:\.(\d+))?(?:\.(\d+))?/,ye=function(){function e(t,n,i){r(this,e),this.major=parseInt(t||0,10),this.minor=parseInt(n||0,10),this.patch=parseInt(i||0,10)}return o(e,null,[{key:"parse",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",n=t.match(me)||[],i=f(n,4),r=i[1],a=i[2],o=i[3];return void 0===r?null:new e(r,a,o)}}]),o(e,[{key:"compare",value:function(e){var t=this.major-e.major;return t=(t=t||this.minor-e.minor)||this.patch-e.patch}},{key:"inc",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"patch";return void 0!==this[e]&&(this[e]+=1),this}},{key:"satisfies",value:function(e,t){return this.compare(e)>=0&&(!t||this.compare(t)<0)}},{key:"toString",value:function(){return"".concat(this.major,".").concat(this.minor,".").concat(this.patch)}}]),e}(),Ae=function(e,t){return e&&t?Object.entries(e).filter((function(e){return f(e,2)[1].type===t})).reduce((function(e,t){var n=f(t,2),i=n[0],r=n[1];return e[i]=r,e}),{}):{}},be=(ge={plugins:{},playbacks:[]},function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;r(this,e),this.playerId=n,this.playbackPlugins=p(ge.playbacks);var i=e.registeredPlugins,a=i.core,o=i.container;this.containerPlugins=Object.values(o),this.corePlugins=Object.values(a),Array.isArray(t)||this.validateExternalPluginsType(t),this.addExternalPlugins(t)}return o(e,null,[{key:"checkVersionSupport",value:function(e){var t=e.prototype,n=t.supportedVersion,i=t.name;if(!n||!n.min)return Z.warn("Loader","missing version information for ".concat(i)),!1;var r=n.max?ye.parse(n.max):ye.parse(n.min).inc("minor"),a=ye.parse(n.min);return!!ye.parse("0.4.11").satisfies(a,r)||(Z.warn("Loader","unsupported plugin ".concat(i,": Clappr version ").concat("0.4.11"," does not match required range [").concat(a,",").concat(r,")")),!1)}},{key:"registerPlugin",value:function(t){if(!t||!t.prototype.name)return Z.warn("Loader","missing information to register plugin: ".concat(t)),!1;e.checkVersionSupport(t);var n=ge.plugins;if(!n)return!1;var i=n[t.prototype.name];return i&&Z.warn("Loader","overriding plugin entry: ".concat(t.prototype.name," - ").concat(i)),n[t.prototype.name]=t,!0}},{key:"registerPlayback",value:function(t){if(!t||!t.prototype.name)return!1;e.checkVersionSupport(t);var n=ge.playbacks,i=n.findIndex((function(e){return e.name===t.prototype.name}));if(i>=0){var r=n[i];n.splice(i,1),Z.warn("Loader","overriding playback entry: ".concat(r.name," - ").concat(r))}return ge.playbacks=[t].concat(p(n)),!0}},{key:"unregisterPlugin",value:function(e){if(!e)return!1;var t=ge.plugins;return!!t[e]&&(delete t[e],!0)}},{key:"unregisterPlayback",value:function(e){if(!e)return!1;var t=ge.playbacks,n=t.findIndex((function(t){return t.prototype.name===e}));return!(n<0||(t.splice(n,1),ge.playbacks=t,0))}},{key:"clearPlugins",value:function(){ge.plugins={}}},{key:"clearPlaybacks",value:function(){ge.playbacks=[]}},{key:"registeredPlaybacks",get:function(){return p(ge.playbacks)}},{key:"registeredPlugins",get:function(){var e=ge.plugins;return{core:Ae(e,"core"),container:Ae(e,"container")}}}]),o(e,[{key:"groupPluginsByType",value:function(e){return Array.isArray(e)&&(e=e.reduce((function(e,t){return e[t.type]||(e[t.type]=[]),e[t.type].push(t),e}),{})),e}},{key:"removeDups",value:function(e){var t=e.reduceRight((function(e,t){return e[t.prototype.name]&&delete e[t.prototype.name],e[t.prototype.name]=t,e}),Object.create(null)),n=[];for(var i in t)n.unshift(t[i]);return n}},{key:"addExternalPlugins",value:function(t){if((t=this.groupPluginsByType(t)).playback){var n=t.playback.filter((function(t){return e.checkVersionSupport(t),!0}));this.playbackPlugins=this.removeDups(n.concat(this.playbackPlugins))}if(t.container){var i=t.container.filter((function(t){return e.checkVersionSupport(t),!0}));this.containerPlugins=this.removeDups(i.concat(this.containerPlugins))}if(t.core){var r=t.core.filter((function(t){return e.checkVersionSupport(t),!0}));this.corePlugins=this.removeDups(r.concat(this.corePlugins))}}},{key:"validateExternalPluginsType",value:function(e){["playback","container","core"].forEach((function(t){(e[t]||[]).forEach((function(e){var n="external "+e.type+" plugin on "+t+" array";if(e.type!==t)throw new ReferenceError(n)}))}))}}]),e}()),Ee=F().replace(/\/[^/]+$/,""),Te=function(e){function t(e){var n;r(this,t),n=d(this,l(t).call(this,e));var i={playerId:N(""),persistConfig:!0,width:640,height:360,baseUrl:Ee,allowUserInteraction:_.isMobile,playback:{recycleVideo:!0}};return n._options=E.extend(i,e),n.options.sources=n._normalizeSources(e),n.options.chromeless||(n.options.allowUserInteraction=!0),n.options.allowUserInteraction||(n.options.disableKeyboardShortcuts=!0),n._registerOptionEventListeners(n.options.events),n._coreFactory=new ve(c(n)),n.options.parentId?n.setParentId(n.options.parentId):n.options.parent&&n.attachTo(n.options.parent),n}return s(t,e),o(t,[{key:"loader",set:function(e){this._loader=e},get:function(){return this._loader||(this._loader=new be(this.options.plugins||{},this.options.playerId)),this._loader}},{key:"ended",get:function(){return this.core.activeContainer.ended}},{key:"buffering",get:function(){return this.core.activeContainer.buffering}},{key:"isReady",get:function(){return!!this._ready}},{key:"eventsMapping",get:function(){return{onReady:ne.PLAYER_READY,onResize:ne.PLAYER_RESIZE,onPlay:ne.PLAYER_PLAY,onPause:ne.PLAYER_PAUSE,onStop:ne.PLAYER_STOP,onEnded:ne.PLAYER_ENDED,onSeek:ne.PLAYER_SEEK,onError:ne.PLAYER_ERROR,onTimeUpdate:ne.PLAYER_TIMEUPDATE,onVolumeUpdate:ne.PLAYER_VOLUMEUPDATE,onSubtitleAvailable:ne.PLAYER_SUBTITLE_AVAILABLE}}}]),o(t,[{key:"setParentId",value:function(e){var t=document.querySelector(e);return t&&this.attachTo(t),this}},{key:"attachTo",value:function(e){return this.options.parentElement=e,this.core=this._coreFactory.create(),this._addEventListeners(),this}},{key:"_addEventListeners",value:function(){return this.core.isReady?this._onReady():this.listenToOnce(this.core,ne.CORE_READY,this._onReady),this.listenTo(this.core,ne.CORE_ACTIVE_CONTAINER_CHANGED,this._containerChanged),this.listenTo(this.core,ne.CORE_FULLSCREEN,this._onFullscreenChange),this.listenTo(this.core,ne.CORE_RESIZE,this._onResize),this}},{key:"_addContainerEventListeners",value:function(){var e=this.core.activeContainer;return e&&(this.listenTo(e,ne.CONTAINER_PLAY,this._onPlay),this.listenTo(e,ne.CONTAINER_PAUSE,this._onPause),this.listenTo(e,ne.CONTAINER_STOP,this._onStop),this.listenTo(e,ne.CONTAINER_ENDED,this._onEnded),this.listenTo(e,ne.CONTAINER_SEEK,this._onSeek),this.listenTo(e,ne.CONTAINER_ERROR,this._onError),this.listenTo(e,ne.CONTAINER_TIMEUPDATE,this._onTimeUpdate),this.listenTo(e,ne.CONTAINER_VOLUME,this._onVolumeUpdate),this.listenTo(e,ne.CONTAINER_SUBTITLE_AVAILABLE,this._onSubtitleAvailable)),this}},{key:"_registerOptionEventListeners",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=Object.keys(t).length>0;return i&&Object.keys(n).forEach((function(t){var i=e.eventsMapping[t];i&&e.off(i,n[t])})),Object.keys(t).forEach((function(n){var i=e.eventsMapping[n];if(i){var r=t[n];(r="function"==typeof r&&r)&&e.on(i,r)}})),this}},{key:"_containerChanged",value:function(){this.stopListening(),this._addEventListeners()}},{key:"_onReady",value:function(){this._ready=!0,this._addContainerEventListeners(),this.trigger(ne.PLAYER_READY)}},{key:"_onFullscreenChange",value:function(e){this.trigger(ne.PLAYER_FULLSCREEN,e)}},{key:"_onVolumeUpdate",value:function(e){this.trigger(ne.PLAYER_VOLUMEUPDATE,e)}},{key:"_onSubtitleAvailable",value:function(){this.trigger(ne.PLAYER_SUBTITLE_AVAILABLE)}},{key:"_onResize",value:function(e){this.trigger(ne.PLAYER_RESIZE,e)}},{key:"_onPlay",value:function(){this.trigger(ne.PLAYER_PLAY)}},{key:"_onPause",value:function(){this.trigger(ne.PLAYER_PAUSE)}},{key:"_onStop",value:function(){this.trigger(ne.PLAYER_STOP,this.getCurrentTime())}},{key:"_onEnded",value:function(){this.trigger(ne.PLAYER_ENDED)}},{key:"_onSeek",value:function(e){this.trigger(ne.PLAYER_SEEK,e)}},{key:"_onTimeUpdate",value:function(e){this.trigger(ne.PLAYER_TIMEUPDATE,e)}},{key:"_onError",value:function(e){this.trigger(ne.PLAYER_ERROR,e)}},{key:"_normalizeSources",value:function(e){var t=e.sources||(void 0!==e.source?[e.source]:[]);return 0===t.length?[{source:"",mimeType:""}]:t}},{key:"resize",value:function(e){return this.core.resize(e),this}},{key:"load",value:function(e,t,n){return void 0!==n&&this.configure({autoPlay:!!n}),this.core.load(e,t),this}},{key:"destroy",value:function(){return this.stopListening(),this.core.destroy(),this}},{key:"consent",value:function(e){this.core.getCurrentPlayback().consent(e)}},{key:"play",value:function(){return this.core.activeContainer.play(),this}},{key:"pause",value:function(){return this.core.activeContainer.pause(),this}},{key:"stop",value:function(){return this.core.activeContainer.stop(),this}},{key:"seek",value:function(e){return this.core.activeContainer.seek(e),this}},{key:"seekPercentage",value:function(e){return this.core.activeContainer.seekPercentage(e),this}},{key:"mute",value:function(){return this.core.activePlayback.mute(),this}},{key:"unmute",value:function(){return this.core.activePlayback.unmute(),this}},{key:"isPlaying",value:function(){return this.core.activeContainer.isPlaying()}},{key:"isDvrEnabled",value:function(){return this.core.activeContainer.isDvrEnabled()}},{key:"isDvrInUse",value:function(){return this.core.activeContainer.isDvrInUse()}},{key:"configure",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this._registerOptionEventListeners(e.events,this.options.events),this.core.configure(e),this}},{key:"getPlugin",value:function(e){return this.core.plugins.concat(this.core.activeContainer.plugins).filter((function(t){return t.name===e}))[0]}},{key:"getCurrentTime",value:function(){return this.core.activeContainer.getCurrentTime()}},{key:"getStartTimeOffset",value:function(){return this.core.activeContainer.getStartTimeOffset()}},{key:"getDuration",value:function(){return this.core.activeContainer.getDuration()}}]),t}(re);Object.assign(Te.prototype,le);var ke=function(e){function t(e){var n;return r(this,t),(n=d(this,l(t).call(this,e.options))).container=e,n.enabled=!0,n.bindEvents(),n}return s(t,e),o(t,[{key:"playerError",get:function(){return this.container.playerError}}]),o(t,[{key:"enable",value:function(){this.enabled||(this.bindEvents(),this.enabled=!0)}},{key:"disable",value:function(){this.enabled&&(this.stopListening(),this.enabled=!1)}},{key:"bindEvents",value:function(){}},{key:"destroy",value:function(){this.stopListening()}}]),t}(re);Object.assign(ke.prototype,le),ke.extend=function(e){return O(ke,e)},ke.type="container";var _e=function(e){function t(e){var n;return r(this,t),(n=d(this,l(t).call(this,e.options))).core=e,n.enabled=!0,n.bindEvents(),n}return s(t,e),o(t,[{key:"playerError",get:function(){return this.core.playerError}}]),o(t,[{key:"bindEvents",value:function(){}},{key:"enable",value:function(){this.enabled||(this.bindEvents(),this.enabled=!0)}},{key:"disable",value:function(){this.enabled&&(this.stopListening(),this.enabled=!1)}},{key:"getExternalInterface",value:function(){return{}}},{key:"destroy",value:function(){this.stopListening()}}]),t}(re);Object.assign(_e.prototype,le),_e.extend=function(e){return O(_e,e)},_e.type="core";var Se=function(e){function t(e){var n;return r(this,t),(n=d(this,l(t).call(this,e.options))).container=e,n.enabled=!0,n.bindEvents(),n}return s(t,e),o(t,[{key:"playerError",get:function(){return this.container.playerError}}]),o(t,[{key:"enable",value:function(){this.enabled||(this.bindEvents(),this.$el.show(),this.enabled=!0)}},{key:"disable",value:function(){this.stopListening(),this.$el.hide(),this.enabled=!1}},{key:"bindEvents",value:function(){}}]),t}(oe);Object.assign(Se.prototype,le),Se.extend=function(e){return O(Se,e)},Se.type="container";var Ce="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{};function we(){throw new Error("setTimeout has not been defined")}function Re(){throw new Error("clearTimeout has not been defined")}var Oe=we,Le=Re;function De(e){if(Oe===setTimeout)return setTimeout(e,0);if((Oe===we||!Oe)&&setTimeout)return Oe=setTimeout,setTimeout(e,0);try{return Oe(e,0)}catch(t){try{return Oe.call(null,e,0)}catch(t){return Oe.call(this,e,0)}}}"function"==typeof Ce.setTimeout&&(Oe=setTimeout),"function"==typeof Ce.clearTimeout&&(Le=clearTimeout);var Ie,Pe=[],xe=!1,Ne=-1;function Me(){xe&&Ie&&(xe=!1,Ie.length?Pe=Ie.concat(Pe):Ne=-1,Pe.length&&Fe())}function Fe(){if(!xe){var e=De(Me);xe=!0;for(var t=Pe.length;t;){for(Ie=Pe,Pe=[];++Ne/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g}),Ve=/(.)^/,Ke={"'":"'","\\":"\\","\r":"r","\n":"n","\t":"t","\u2028":"u2028","\u2029":"u2029"},Ge=/\\|'|\r|\n|\t|\u2028|\u2029/g,Ye={"&":"&","<":"<",">":">",'"':""","'":"'"},He=new RegExp("[&<>\"']","g"),$e=function(e){return null===e?"":(""+e).replace(He,(function(e){return Ye[e]}))},ze=0,We=function(e,t){var n,i=new RegExp([(je.escape||Ve).source,(je.interpolate||Ve).source,(je.evaluate||Ve).source].join("|")+"|$","g"),r=0,a="__p+='";e.replace(i,(function(t,n,i,o,s){return a+=e.slice(r,s).replace(Ge,(function(e){return"\\"+Ke[e]})),n&&(a+="'+\n((__t=("+n+"))==null?'':escapeExpr(__t))+\n'"),i&&(a+="'+\n((__t=("+i+"))==null?'':__t)+\n'"),o&&(a+="';\n"+o+"\n__p+='"),r=s+t.length,t})),a+="';\n",je.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n//# sourceURL=/microtemplates/source["+ze+++"]";try{n=new Function(je.variable||"obj","escapeExpr",a)}catch(e){throw e.source=a,e}if(t)return n(t,$e);var o=function(e){return n.call(this,e,$e)};return o.source="function("+(je.variable||"obj")+"){\n"+a+"}",o};We.settings=je;ce("[data-html5-video] {\n position: absolute;\n height: 100%;\n width: 100%;\n display: block; }\n");var qe={mp4:["avc1.42E01E","avc1.58A01E","avc1.4D401E","avc1.64001E","mp4v.20.8","mp4v.20.240","mp4a.40.2"].map((function(e){return'video/mp4; codecs="'+e+', mp4a.40.2"'})),ogg:['video/ogg; codecs="theora, vorbis"','video/ogg; codecs="dirac"','video/ogg; codecs="theora, speex"'],"3gpp":['video/3gpp; codecs="mp4v.20.8, samr"'],webm:['video/webm; codecs="vp8, vorbis"'],mkv:['video/x-matroska; codecs="theora, vorbis"'],m3u8:["application/x-mpegurl"]};qe.ogv=qe.ogg,qe["3gp"]=qe["3gpp"];var Xe={wav:["audio/wav"],mp3:["audio/mp3",'audio/mpeg;codecs="mp3"'],aac:['audio/mp4;codecs="mp4a.40.5"'],oga:["audio/ogg"]},Ze=Object.keys(Xe).reduce((function(e,t){return[].concat(p(e),p(Xe[t]))}),[]),Qe={code:"unknown",message:"unknown"},Je=function(e){function t(){var e,n;r(this,t);for(var i=arguments.length,a=new Array(i),o=0;o=0}},{key:"attributes",get:function(){return{"data-html5-video":""}}},{key:"events",get:function(){return{canplay:"_onCanPlay",canplaythrough:"_handleBufferingEvents",durationchange:"_onDurationChange",ended:"_onEnded",error:"_onError",loadeddata:"_onLoadedData",loadedmetadata:"_onLoadedMetadata",pause:"_onPause",playing:"_onPlaying",progress:"_onProgress",seeking:"_onSeeking",seeked:"_onSeeked",stalled:"_handleBufferingEvents",timeupdate:"_onTimeUpdate",waiting:"_onWaiting"}}},{key:"ended",get:function(){return this.el.ended}},{key:"buffering",get:function(){return this._isBuffering}}]),o(t,[{key:"configure",value:function(e){h(l(t.prototype),"configure",this).call(this,e),this.el.loop=!!e.loop}},{key:"attemptAutoPlay",value:function(){var e=this;this.canAutoPlay((function(t,n){n&&Z.warn(e.name,"autoplay error.",{result:t,error:n}),t&&function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n=0?he.LIVE:e}},{key:"isHighDefinitionInUse",value:function(){return!1}},{key:"consent",value:function(e){var n=this;if(this.isPlaying())h(l(t.prototype),"consent",this).call(this,e);else{var i=function i(){n.el.removeEventListener("loadedmetadata",i,!1),n.el.removeEventListener("error",i,!1),h(l(t.prototype),"consent",n).call(n,e)};this.el.addEventListener("loadedmetadata",i,!1),this.el.addEventListener("error",i,!1),this.el.load()}}},{key:"play",value:function(){this.trigger(ne.PLAYBACK_PLAY_INTENT),this._stopped=!1,this._setupSrc(this._src),this._handleBufferingEvents();var e=this.el.play();e&&e.catch&&e.catch((function(){}))}},{key:"pause",value:function(){this.el.pause()}},{key:"stop",value:function(){this.pause(),this._stopped=!0,this.el.removeAttribute("src"),this.el.load(),this._stopPlayheadMovingChecks(),this._handleBufferingEvents(),this.trigger(ne.PLAYBACK_STOP)}},{key:"volume",value:function(e){0===e?(this.$el.attr({muted:"true"}),this.el.muted=!0):(this.$el.attr({muted:null}),this.el.muted=!1,this.el.volume=e/100)}},{key:"mute",value:function(){this.el.muted=!0}},{key:"unmute",value:function(){this.el.muted=!1}},{key:"isMuted",value:function(){return!0===this.el.muted||0===this.el.volume}},{key:"isPlaying",value:function(){return!this.el.paused&&!this.el.ended}},{key:"_startPlayheadMovingChecks",value:function(){null===this._playheadMovingTimer&&(this._playheadMovingTimeOnCheck=null,this._determineIfPlayheadMoving(),this._playheadMovingTimer=setInterval(this._determineIfPlayheadMoving.bind(this),500))}},{key:"_stopPlayheadMovingChecks",value:function(){null!==this._playheadMovingTimer&&(clearInterval(this._playheadMovingTimer),this._playheadMovingTimer=null,this._playheadMoving=!1)}},{key:"_determineIfPlayheadMoving",value:function(){var e=this._playheadMovingTimeOnCheck,t=this.el.currentTime;this._playheadMoving=e!==t,this._playheadMovingTimeOnCheck=t,this._handleBufferingEvents()}},{key:"_onWaiting",value:function(){this._loadStarted=!0,this._handleBufferingEvents()}},{key:"_onLoadedData",value:function(){this._loadStarted=!0,this._handleBufferingEvents()}},{key:"_onCanPlay",value:function(){this._handleBufferingEvents()}},{key:"_onPlaying",value:function(){this._checkForClosedCaptions(),this._startPlayheadMovingChecks(),this._handleBufferingEvents(),this.trigger(ne.PLAYBACK_PLAY)}},{key:"_onPause",value:function(){this._stopPlayheadMovingChecks(),this._handleBufferingEvents(),this.trigger(ne.PLAYBACK_PAUSE)}},{key:"_onSeeking",value:function(){this._handleBufferingEvents(),this.trigger(ne.PLAYBACK_SEEK)}},{key:"_onSeeked",value:function(){this._handleBufferingEvents(),this.trigger(ne.PLAYBACK_SEEKED)}},{key:"_onEnded",value:function(){this._handleBufferingEvents(),this.trigger(ne.PLAYBACK_ENDED,this.name)}},{key:"_handleBufferingEvents",value:function(){var e=!this.el.ended&&!this.el.paused,t=this._loadStarted&&!this.el.ended&&!this._stopped&&(e&&!this._playheadMoving||this.el.readyState=e[n].start&&this.el.currentTime<=e[n].end&&(t=n);var i={start:e[t].start,current:e[t].end,total:this.el.duration};this.trigger(ne.PLAYBACK_PROGRESS,i,e)}}},{key:"_typeFor",value:function(e){var n=t._mimeTypesForUrl(e,qe,this.options.mimeType);return 0===n.length&&(n=t._mimeTypesForUrl(e,Xe,this.options.mimeType)),(n[0]||"").split(";")[0]}},{key:"_ready",value:function(){this._isReadyState||(this._isReadyState=!0,this.trigger(ne.PLAYBACK_READY,this.name))}},{key:"_checkForClosedCaptions",value:function(){if(this.isHTML5Video&&!this._ccIsSetup){if(this.hasClosedCaptionsTracks){this.trigger(ne.PLAYBACK_SUBTITLE_AVAILABLE);var e=this.closedCaptionsTrackId;this.closedCaptionsTrackId=e,this.handleTextTrackChange=this._handleTextTrackChange.bind(this),this.el.textTracks.addEventListener("change",this.handleTextTrackChange)}this._ccIsSetup=!0}}},{key:"_handleTextTrackChange",value:function(){var e=this.closedCaptionsTracks.find((function(e){return"showing"===e.track.mode}))||{id:-1};this._ccTrackId!==e.id&&(this._ccTrackId=e.id,this.trigger(ne.PLAYBACK_SUBTITLE_CHANGED,{id:e.id}))}},{key:"render",value:function(){return this.options.playback.disableContextMenu&&this.$el.on("contextmenu",(function(){return!1})),this._externalTracks&&this._externalTracks.length>0&&this.$el.html(this.template({tracks:this._externalTracks})),this._ready(),this}},{key:"isReady",get:function(){return this._isReadyState}},{key:"isHTML5Video",get:function(){return this.name===t.prototype.name}},{key:"closedCaptionsTracks",get:function(){var e=0;return(this.el.textTracks?Array.from(this.el.textTracks):[]).filter((function(e){return"subtitles"===e.kind||"captions"===e.kind})).map((function(t){return{id:e++,name:t.label,track:t}}))}},{key:"closedCaptionsTrackId",get:function(){return this._ccTrackId},set:function(e){if(M(e)){var t,n=this.closedCaptionsTracks;if(-1!==e){if(!(t=n.find((function(t){return t.id===e}))))return;if("showing"===t.track.mode)return}n.filter((function(e){return"hidden"!==e.track.mode})).forEach((function(e){return e.track.mode="hidden"})),t&&(t.track.mode="showing"),this._ccTrackId=e,this.trigger(ne.PLAYBACK_SUBTITLE_CHANGED,{id:e})}}},{key:"template",get:function(){return We('<% for (var i = 0; i < tracks.length; i++) { %>\n \n<% }; %>\n')}}]),t}(he);Je._mimeTypesForUrl=function(e,t,n){var i=(e.split("?")[0].match(/.*\.(.*)$/)||[])[1],r=n||i&&t[i.toLowerCase()]||[];return r.constructor===Array?r:[r]},Je._canPlay=function(e,t,n,i){var r=Je._mimeTypesForUrl(n,t,i),a=document.createElement(e);return!!r.filter((function(e){return!!a.canPlayType(e).replace(/no/,"")}))[0]},Je.canPlay=function(e,t){return Je._canPlay("audio",Xe,e,t)||Je._canPlay("video",qe,e,t)};var et=function(e){function t(){return r(this,t),d(this,l(t).apply(this,arguments))}return s(t,e),o(t,[{key:"updateSettings",value:function(){this.settings.left=["playpause","position","duration"],this.settings.seekEnabled=this.isSeekEnabled(),this.trigger(ne.PLAYBACK_SETTINGSUPDATE)}},{key:"getPlaybackType",value:function(){return he.AOD}},{key:"name",get:function(){return"html5_audio"}},{key:"supportedVersion",get:function(){return{min:"0.4.11"}}},{key:"tagName",get:function(){return"audio"}},{key:"isAudioOnly",get:function(){return!0}}]),t}(Je);et.canPlay=function(e,t){return Je._canPlay("audio",{wav:["audio/wav"],mp3:["audio/mp3",'audio/mpeg;codecs="mp3"'],aac:['audio/mp4;codecs="mp4a.40.5"'],oga:["audio/ogg"]},e,t)};ce("[data-html-img] {\n max-width: 100%;\n max-height: 100%; }\n");var tt=function(e){function t(e){var n;return r(this,t),(n=d(this,l(t).call(this,e))).el.src=e.src,n}return s(t,e),o(t,[{key:"getPlaybackType",value:function(){return he.NO_OP}},{key:"name",get:function(){return"html_img"}},{key:"supportedVersion",get:function(){return{min:"0.4.11"}}},{key:"tagName",get:function(){return"img"}},{key:"attributes",get:function(){return{"data-html-img":""}}},{key:"events",get:function(){return{load:"_onLoad",abort:"_onError",error:"_onError"}}}]),o(t,[{key:"render",value:function(){return this.trigger(ne.PLAYBACK_READY,this.name),this}},{key:"_onLoad",value:function(){this.trigger(ne.PLAYBACK_ENDED,this.name)}},{key:"_onError",value:function(e){var t="error"===e.type?"load error":"loading aborted";this.trigger(ne.PLAYBACK_ERROR,{message:t},this.name)}}]),t}(he);tt.canPlay=function(e){return/\.(png|jpg|jpeg|gif|bmp|tiff|pgm|pnm|webp)(|\?.*)$/i.test(e)};ce("[data-no-op] {\n position: absolute;\n height: 100%;\n width: 100%;\n text-align: center; }\n\n[data-no-op] p[data-no-op-msg] {\n position: absolute;\n text-align: center;\n font-size: 25px;\n left: 0;\n right: 0;\n color: white;\n padding: 10px;\n /* center vertically */\n top: 50%;\n transform: translateY(-50%);\n max-height: 100%;\n overflow: auto; }\n\n[data-no-op] canvas[data-no-op-canvas] {\n background-color: #777;\n height: 100%;\n width: 100%; }\n");var nt=function(e){function t(){var e,n;r(this,t);for(var i=arguments.length,a=new Array(i),o=0;o\n

<%=message%>

\n

")}},{key:"attributes",get:function(){return{"data-no-op":""}}}]),o(t,[{key:"render",value:function(){var e=this.options.playbackNotSupportedMessage||this.i18n.t("playback_not_supported");this.$el.html(this.template({message:e})),this.trigger(ne.PLAYBACK_READY,this.name);var t=!(!this.options.poster||!this.options.poster.showForNoOp);return!this.options.autoPlay&&t||this._animate(),this}},{key:"_noise",value:function(){if(this._noiseFrameNum=(this._noiseFrameNum+1)%5,!this._noiseFrameNum){var e,t=this.context.createImageData(this.context.canvas.width,this.context.canvas.height);try{e=new Uint32Array(t.data.buffer)}catch(r){e=new Uint32Array(this.context.canvas.width*this.context.canvas.height*4);for(var n=t.data,i=0;i1&&void 0!==arguments[1]?arguments[1]:{baseUrl:""};return E('').html(We(e.toString())(t))}},rt=function(e){function t(e){var n;return r(this,t),(n=d(this,l(t).call(this,e)))._initializeMessages(),n}return s(t,e),o(t,[{key:"name",get:function(){return"strings"}},{key:"supportedVersion",get:function(){return{min:"0.4.11"}}}]),o(t,[{key:"t",value:function(e){var t=this._language(),n=this._messages.en;return(t&&this._messages[t]||n)[e]||n[e]||e}},{key:"_language",value:function(){return this.core.options.language||j()}},{key:"_initializeMessages",value:function(){this._messages=E.extend(!0,{en:{live:"live",back_to_live:"back to live",disabled:"Disabled",playback_not_supported:"Your browser does not support the playback of this video. Please try using a different browser.",default_error_title:"Could not play video.",default_error_message:"There was a problem trying to load the video."},pt:{live:"ao vivo",back_to_live:"voltar para o ao vivo",disabled:"Desativado",playback_not_supported:"Seu navegador nรฃo supporta a reproduรงรฃo deste video. Por favor, tente usar um navegador diferente.",default_error_title:"Nรฃo foi possรญvel reproduzir o vรญdeo.",default_error_message:"Ocorreu um problema ao tentar carregar o vรญdeo."},es:{live:"vivo",back_to_live:"volver en vivo",disabled:"Discapacitado",playback_not_supported:"Su navegador no soporta la reproducciรณn de un video. Por favor, trate de usar un navegador diferente."},ru:{live:"ะฟั€ัะผะพะน ัั„ะธั€",back_to_live:"ะบ ะฟั€ัะผะพะผัƒ ัั„ะธั€ัƒ",disabled:"ะžั‚ะบะปัŽั‡ะตะฝะพ",playback_not_supported:"ะ’ะฐัˆ ะฑั€ะฐัƒะทะตั€ ะฝะต ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ะฒะพัะฟั€ะพะธะทะฒะตะดะตะฝะธะต ัั‚ะพะณะพ ะฒะธะดะตะพ. ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะฟะพะฟั€ะพะฑัƒะนั‚ะต ะดั€ัƒะณะพะน ะฑั€ะฐัƒะทะตั€."},fr:{live:"en direct",back_to_live:"retour au direct",disabled:"Dรฉsactivรฉ",playback_not_supported:"Votre navigateur ne supporte pas la lecture de cette vidรฉo. Merci de tenter sur un autre navigateur.",default_error_title:"Impossible de lire la vidรฉo.",default_error_message:"Un problรจme est survenu lors du chargement de la vidรฉo."},tr:{live:"canlฤฑ",back_to_live:"canlฤฑ yayฤฑna dรถn",disabled:"Engelli",playback_not_supported:"Tarayฤฑcฤฑnฤฑz bu videoyu oynatma desteฤŸine sahip deฤŸil. Lรผtfen farklฤฑ bir tarayฤฑcฤฑ ile deneyin."},et:{live:"Otseรผlekanne",back_to_live:"Tagasi otseรผlekande juurde",disabled:"Keelatud",playback_not_supported:"Teie brauser ei toeta selle video taasesitust. Proovige kasutada muud brauserit."},ar:{live:"ู…ุจุงุดุฑ",back_to_live:"ุงู„ุฑุฌูˆุน ุฅู„ู‰ ุงู„ู…ุจุงุดุฑ",disabled:"ู…ุนุทู‘ู„",playback_not_supported:"ุงู„ู…ุชุตูุญ ุงู„ุฐูŠ ุชุณุชุฎุฏู…ู‡ ู„ุง ูŠุฏุนู… ุชุดุบูŠู„ ู‡ุฐุง ุงู„ููŠุฏูŠูˆ. ุงู„ุฑุฌุงุก ุฅุณุชุฎุฏุงู… ู…ุชุตูุญ ุขุฎุฑ.",default_error_title:"ุบูŠุฑ ู‚ุงุฏุฑ ุงู„ู‰ ุงู„ุชุดุบูŠู„.",default_error_message:"ุญุฏุซุช ู…ุดูƒู„ุฉ ุฃุซู†ุงุก ุชุญู…ูŠู„ ุงู„ููŠุฏูŠูˆ."}},this.core.options.strings||{}),this._messages["pt-BR"]=this._messages.pt,this._messages["en-US"]=this._messages.en,this._messages["es-419"]=this._messages.es,this._messages["fr-FR"]=this._messages.fr,this._messages["tr-TR"]=this._messages.tr,this._messages["et-EE"]=this._messages.et,this._messages["ar-IQ"]=this._messages.ar}}]),t}(_e),at=function(e){function t(){return r(this,t),d(this,l(t).apply(this,arguments))}return s(t,e),o(t,[{key:"bindEvents",value:function(){this.listenTo(this.core,ne.CORE_CONTAINERS_CREATED,this.onContainersCreated)}},{key:"onContainersCreated",value:function(){var e=this.core.containers.filter((function(e){return"no_op"!==e.playback.name}))[0]||this.core.containers[0];e&&this.core.containers.forEach((function(t){t!==e&&t.destroy()}))}},{key:"name",get:function(){return"sources"}},{key:"supportedVersion",get:function(){return{min:"0.4.11"}}}]),t}(_e);be.registerPlugin(rt),be.registerPlugin(at),be.registerPlayback(nt),be.registerPlayback(tt),be.registerPlayback(et),be.registerPlayback(Je);var ot={Player:Te,Events:ne,Browser:_,ContainerPlugin:ke,UIContainerPlugin:Se,CorePlugin:_e,UICorePlugin:ue,Playback:he,Container:de,Core:pe,PlayerError:se,Loader:be,BaseObject:re,UIObject:oe,Utils:H,HTML5Audio:et,HTML5Video:Je,HTMLImg:tt,Log:Z,Styler:it,version:"0.4.11",template:We,$:E};function st(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function lt(e,t){for(var n=0;n ul {\n list-style-type: none;\n position: absolute;\n bottom: 25px;\n border: 1px solid black;\n display: none;\n background-color: #e6e6e6; }\n .cc-controls[data-cc-controls] li {\n font-size: 10px; }\n .cc-controls[data-cc-controls] li[data-title] {\n background-color: #c3c2c2;\n padding: 5px; }\n .cc-controls[data-cc-controls] li a {\n color: #444;\n padding: 2px 10px;\n display: block;\n text-decoration: none; }\n .cc-controls[data-cc-controls] li a:hover {\n background-color: #555;\n color: white; }\n .cc-controls[data-cc-controls] li a:hover a {\n color: white;\n text-decoration: none; }\n .cc-controls[data-cc-controls] li.current a {\n color: #f00; }\n");var mt=function(e){function t(e){var n;st(this,t),n=ft(this,dt(t).call(this,e));var i=e.options.closedCaptionsConfig;return n._title=i&&i.title?i.title:null,n._ariaLabel=i&&i.ariaLabel?i.ariaLabel:"cc-button",n._labelCb=i&&i.labelCallback&&"function"==typeof i.labelCallback?i.labelCallback:function(e){return e.name},n}return ct(t,e),ut(t,[{key:"name",get:function(){return"closed_captions"}},{key:"supportedVersion",get:function(){return{min:"0.4.9"}}},{key:"template",get:function(){return We('\n\n')}},{key:"events",get:function(){return{"click [data-cc-button]":"toggleContextMenu","click [data-cc-select]":"onTrackSelect"}}},{key:"attributes",get:function(){return{class:"cc-controls","data-cc-controls":""}}}]),ut(t,[{key:"bindEvents",value:function(){this.bindCoreEvents(),this.bindContainerEvents()}},{key:"bindCoreEvents",value:function(){var e=this;this.core.mediaControl.settings?(this.listenTo(this.core,ne.CORE_ACTIVE_CONTAINER_CHANGED,this.containerChanged),this.listenTo(this.core.mediaControl,ne.MEDIACONTROL_RENDERED,this.render),this.listenTo(this.core.mediaControl,ne.MEDIACONTROL_HIDE,this.hideContextMenu)):setTimeout((function(){return e.bindCoreEvents()}),100)}},{key:"bindContainerEvents",value:function(){this.container=this.core.activeContainer,this.container&&(this.listenTo(this.container,ne.CONTAINER_SUBTITLE_AVAILABLE,this.onSubtitleAvailable),this.listenTo(this.container,ne.CONTAINER_SUBTITLE_CHANGED,this.onSubtitleChanged),this.listenTo(this.container,ne.CONTAINER_STOP,this.onContainerStop))}},{key:"onContainerStop",value:function(){this.ccAvailable(!1)}},{key:"containerChanged",value:function(){this.ccAvailable(!1),this.stopListening(),this.bindEvents()}},{key:"onSubtitleAvailable",value:function(){this.renderCcButton(),this.ccAvailable(!0)}},{key:"onSubtitleChanged",value:function(e){this.setCurrentContextMenuElement(e.id)}},{key:"onTrackSelect",value:function(e){var t=parseInt(e.target.dataset.ccSelect,10);return this.container.closedCaptionsTrackId=t,this.hideContextMenu(),e.stopPropagation(),!1}},{key:"ccAvailable",value:function(e){var t=e?"addClass":"removeClass";this.$el[t]("available")}},{key:"toggleContextMenu",value:function(){this.$el.find("ul").toggle()}},{key:"hideContextMenu",value:function(){this.$el.find("ul").hide()}},{key:"contextMenuElement",value:function(e){return this.$el.find("ul a"+(isNaN(e)?"":'[data-cc-select="'+e+'"]')).parent()}},{key:"setCurrentContextMenuElement",value:function(e){if(this._trackId!==e){this.contextMenuElement().removeClass("current"),this.contextMenuElement(e).addClass("current");var t=e>-1?"addClass":"removeClass";this.$ccButton[t]("enabled"),this._trackId=e}}},{key:"renderCcButton",value:function(){for(var e=this.container?this.container.closedCaptionsTracks:[],t=0;t\n\n'),this.$el.append(this.style)}},{key:"render",value:function(){this.renderCcButton();var e=this.core.mediaControl.$el.find("button[data-fullscreen]");return e[0]?this.$el.insertAfter(e):this.core.mediaControl.$el.find(".media-control-right-panel[data-media-control]").prepend(this.$el),this}}]),t}(ue);vt('.dvr-controls[data-dvr-controls] {\n display: inline-block;\n float: left;\n color: #fff;\n line-height: 32px;\n font-size: 10px;\n font-weight: bold;\n margin-left: 6px; }\n .dvr-controls[data-dvr-controls] .live-info {\n cursor: default;\n font-family: "Roboto", "Open Sans", Arial, sans-serif;\n text-transform: uppercase; }\n .dvr-controls[data-dvr-controls] .live-info:before {\n content: "";\n display: inline-block;\n position: relative;\n width: 7px;\n height: 7px;\n border-radius: 3.5px;\n margin-right: 3.5px;\n background-color: #ff0101; }\n .dvr-controls[data-dvr-controls] .live-info.disabled {\n opacity: 0.3; }\n .dvr-controls[data-dvr-controls] .live-info.disabled:before {\n background-color: #fff; }\n .dvr-controls[data-dvr-controls] .live-button {\n cursor: pointer;\n outline: none;\n display: none;\n border: 0;\n color: #fff;\n background-color: transparent;\n height: 32px;\n padding: 0;\n opacity: 0.7;\n font-family: "Roboto", "Open Sans", Arial, sans-serif;\n text-transform: uppercase;\n transition: all 0.1s ease; }\n .dvr-controls[data-dvr-controls] .live-button:before {\n content: "";\n display: inline-block;\n position: relative;\n width: 7px;\n height: 7px;\n border-radius: 3.5px;\n margin-right: 3.5px;\n background-color: #fff; }\n .dvr-controls[data-dvr-controls] .live-button:hover {\n opacity: 1;\n text-shadow: rgba(255, 255, 255, 0.75) 0 0 5px; }\n\n.dvr .dvr-controls[data-dvr-controls] .live-info {\n display: none; }\n\n.dvr .dvr-controls[data-dvr-controls] .live-button {\n display: block; }\n\n.dvr.media-control.live[data-media-control] .media-control-layer[data-controls] .bar-container[data-seekbar] .bar-background[data-seekbar] .bar-fill-2[data-seekbar] {\n background-color: #005aff; }\n\n.media-control.live[data-media-control] .media-control-layer[data-controls] .bar-container[data-seekbar] .bar-background[data-seekbar] .bar-fill-2[data-seekbar] {\n background-color: #ff0101; }\n');var yt=function(e){function t(e){var n;return st(this,t),(n=ft(this,dt(t).call(this,e))).settingsUpdate(),n}return ct(t,e),ut(t,[{key:"template",get:function(){return We('
<%= live %>
\n\n')}},{key:"name",get:function(){return"dvr_controls"}},{key:"supportedVersion",get:function(){return{min:"0.4.9"}}},{key:"events",get:function(){return{"click .live-button":"click"}}},{key:"attributes",get:function(){return{class:"dvr-controls","data-dvr-controls":""}}}]),ut(t,[{key:"bindEvents",value:function(){this.bindCoreEvents(),this.bindContainerEvents()}},{key:"bindCoreEvents",value:function(){var e=this;this.core.mediaControl.settings?(this.listenTo(this.core.mediaControl,ne.MEDIACONTROL_CONTAINERCHANGED,this.containerChanged),this.listenTo(this.core.mediaControl,ne.MEDIACONTROL_RENDERED,this.settingsUpdate),this.listenTo(this.core,ne.CORE_OPTIONS_CHANGE,this.render)):setTimeout((function(){return e.bindCoreEvents()}),100)}},{key:"bindContainerEvents",value:function(){this.core.activeContainer&&(this.listenToOnce(this.core.activeContainer,ne.CONTAINER_TIMEUPDATE,this.render),this.listenTo(this.core.activeContainer,ne.CONTAINER_PLAYBACKDVRSTATECHANGED,this.dvrChanged))}},{key:"containerChanged",value:function(){this.stopListening(),this.bindEvents()}},{key:"dvrChanged",value:function(e){this.core.getPlaybackType()===he.LIVE&&(this.settingsUpdate(),this.core.mediaControl.$el.addClass("live"),e?(this.core.mediaControl.$el.addClass("dvr"),this.core.mediaControl.$el.find(".media-control-indicator[data-position], .media-control-indicator[data-duration]").hide()):this.core.mediaControl.$el.removeClass("dvr"))}},{key:"click",value:function(){var e=this.core.mediaControl,t=e.container;t.isPlaying()||t.play(),e.$el.hasClass("dvr")&&t.seek(t.getDuration())}},{key:"settingsUpdate",value:function(){var e=this;this.stopListening(),this.core.mediaControl.$el.removeClass("live"),this.shouldRender()&&(this.render(),this.$el.click((function(){return e.click()}))),this.bindEvents()}},{key:"shouldRender",value:function(){return(void 0===this.core.options.useDvrControls||!!this.core.options.useDvrControls)&&this.core.getPlaybackType()===he.LIVE}},{key:"render",value:function(){return this.$el.html(this.template({live:this.core.i18n.t("live"),backToLive:this.core.i18n.t("back_to_live")})),this.shouldRender()&&(this.core.mediaControl.$el.addClass("live"),this.core.mediaControl.$(".media-control-left-panel[data-media-control]").append(this.$el)),this}}]),t}(ue),At=function(e){function t(){return st(this,t),ft(this,dt(t).apply(this,arguments))}return ct(t,e),ut(t,[{key:"bindEvents",value:function(){this.listenTo(this.core,ne.CORE_ACTIVE_CONTAINER_CHANGED,this.containerChanged);var e=this.core.activeContainer;e&&(this.listenTo(e,ne.CONTAINER_ENDED,this.ended),this.listenTo(e,ne.CONTAINER_STOP,this.ended))}},{key:"containerChanged",value:function(){this.stopListening(),this.bindEvents()}},{key:"ended",value:function(){(void 0===this.core.options.exitFullscreenOnEnd||this.core.options.exitFullscreenOnEnd)&&this.core.isFullscreen()&&this.core.toggleFullscreen()}},{key:"name",get:function(){return"end_video"}},{key:"supportedVersion",get:function(){return{min:"0.4.9"}}}]),t}(_e);vt("div.player-error-screen {\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n color: #CCCACA;\n position: absolute;\n top: 0;\n height: 100%;\n width: 100%;\n background-color: rgba(0, 0, 0, 0.7);\n z-index: 2000;\n display: flex;\n flex-direction: column;\n justify-content: center; }\n div.player-error-screen__content[data-error-screen] {\n font-size: 14px;\n color: #CCCACA;\n margin-top: 45px; }\n div.player-error-screen__title[data-error-screen] {\n font-weight: bold;\n line-height: 30px;\n font-size: 18px; }\n div.player-error-screen__message[data-error-screen] {\n width: 90%;\n margin: 0 auto; }\n div.player-error-screen__code[data-error-screen] {\n font-size: 13px;\n margin-top: 15px; }\n div.player-error-screen__reload {\n cursor: pointer;\n width: 30px;\n margin: 15px auto 0; }\n");var bt=function(e){function t(e){var n;return st(this,t),(n=ft(this,dt(t).call(this,e))).options.disableErrorScreen?ft(n,n.disable()):n}return ct(t,e),ut(t,[{key:"name",get:function(){return"error_screen"}},{key:"supportedVersion",get:function(){return{min:"0.4.9"}}},{key:"template",get:function(){return We('
\n <% if (icon) { %>\n
<%= icon %>
\n <% } %>\n
<%= title %>
\n
<%= message %>
\n
Error code: <%= code %>
\n
<%= reloadIcon %>
\n
\n')}},{key:"container",get:function(){return this.core.getCurrentContainer()}},{key:"attributes",get:function(){return{class:"player-error-screen","data-error-screen":""}}}]),ut(t,[{key:"bindEvents",value:function(){this.listenTo(this.core,ne.ERROR,this.onError),this.listenTo(this.core,ne.CORE_ACTIVE_CONTAINER_CHANGED,this.onContainerChanged)}},{key:"bindReload",value:function(){this.reloadButton=this.$el.find(".player-error-screen__reload"),this.reloadButton&&this.reloadButton.on("click",this.reload.bind(this))}},{key:"reload",value:function(){var e=this;this.listenToOnce(this.core,ne.CORE_READY,(function(){return e.container.play()})),this.core.load(this.options.sources,this.options.mimeType),this.unbindReload()}},{key:"unbindReload",value:function(){this.reloadButton&&this.reloadButton.off("click")}},{key:"onContainerChanged",value:function(){this.err=null,this.unbindReload(),this.hide()}},{key:"onError",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e.level===se.Levels.FATAL&&(this.err=e,this.container.disableMediaControl(),this.container.stop(),this.show())}},{key:"show",value:function(){this.render(),this.$el.show()}},{key:"hide",value:function(){this.$el.hide()}},{key:"render",value:function(){if(this.err)return this.$el.html(this.template({title:this.err.UI.title,message:this.err.UI.message,code:this.err.code,icon:this.err.UI.icon||"",reloadIcon:'\n \n \n'})),this.core.$el.append(this.el),this.bindReload(),this}}]),t}(ue),Et='\n \n',Tt='\n \n',kt=E('link[rel="shortcut icon"]'),_t=function(e){function t(e){var n;return st(this,t),(n=ft(this,dt(t).call(this,e)))._container=null,n.configure(),n}return ct(t,e),ut(t,[{key:"name",get:function(){return"favicon"}},{key:"supportedVersion",get:function(){return{min:"0.4.9"}}},{key:"oldIcon",get:function(){return kt}}]),ut(t,[{key:"configure",value:function(){this.core.options.changeFavicon?this.enabled||(this.stopListening(this.core,ne.CORE_OPTIONS_CHANGE),this.enable()):this.enabled&&(this.disable(),this.listenTo(this.core,ne.CORE_OPTIONS_CHANGE,this.configure))}},{key:"bindEvents",value:function(){this.listenTo(this.core,ne.CORE_OPTIONS_CHANGE,this.configure),this.listenTo(this.core,ne.CORE_ACTIVE_CONTAINER_CHANGED,this.containerChanged),this.core.activeContainer&&this.containerChanged()}},{key:"containerChanged",value:function(){this._container&&this.stopListening(this._container),this._container=this.core.activeContainer,this.listenTo(this._container,ne.CONTAINER_PLAY,this.setPlayIcon),this.listenTo(this._container,ne.CONTAINER_PAUSE,this.setPauseIcon),this.listenTo(this._container,ne.CONTAINER_STOP,this.resetIcon),this.listenTo(this._container,ne.CONTAINER_ENDED,this.resetIcon),this.listenTo(this._container,ne.CONTAINER_ERROR,this.resetIcon),this.resetIcon()}},{key:"disable",value:function(){pt(dt(t.prototype),"disable",this).call(this),this.resetIcon()}},{key:"destroy",value:function(){pt(dt(t.prototype),"destroy",this).call(this),this.resetIcon()}},{key:"createIcon",value:function(e){var t=E("");t[0].width=16,t[0].height=16;var n=t[0].getContext("2d");n.fillStyle="#000";var i=E(e).find("path").attr("d"),r=new Path2D(i);n.fill(r);var a=E('');return a.attr("href",t[0].toDataURL("image/png")),a}},{key:"setPlayIcon",value:function(){this.playIcon||(this.playIcon=this.createIcon(Et)),this.changeIcon(this.playIcon)}},{key:"setPauseIcon",value:function(){this.pauseIcon||(this.pauseIcon=this.createIcon(Tt)),this.changeIcon(this.pauseIcon)}},{key:"resetIcon",value:function(){E('link[rel="shortcut icon"]').remove(),E("head").append(this.oldIcon)}},{key:"changeIcon",value:function(e){e&&(E('link[rel="shortcut icon"]').remove(),E("head").append(e))}}]),t}(_e),St=function(e){function t(e){var n;return st(this,t),(n=ft(this,dt(t).call(this,e))).container.options.gaAccount&&(n.account=n.container.options.gaAccount,n.trackerName=n.container.options.gaTrackerName?n.container.options.gaTrackerName+".":"Clappr.",n.domainName=n.container.options.gaDomainName,n.currentHDState=void 0,n.embedScript()),n}return ct(t,e),ut(t,[{key:"name",get:function(){return"google_analytics"}},{key:"supportedVersion",get:function(){return{min:"0.4.9"}}}]),ut(t,[{key:"embedScript",value:function(){var e=this;if(window._gat)this.addEventListeners();else{var t=document.createElement("script");t.setAttribute("type","text/javascript"),t.setAttribute("async","async"),t.setAttribute("src","//www.google-analytics.com/ga.js"),t.onload=function(){return e.addEventListeners()},document.body.appendChild(t)}}},{key:"addEventListeners",value:function(){var e=this;this.container&&(this.listenTo(this.container,ne.CONTAINER_READY,this.onReady),this.listenTo(this.container,ne.CONTAINER_PLAY,this.onPlay),this.listenTo(this.container,ne.CONTAINER_STOP,this.onStop),this.listenTo(this.container,ne.CONTAINER_PAUSE,this.onPause),this.listenTo(this.container,ne.CONTAINER_ENDED,this.onEnded),this.listenTo(this.container,ne.CONTAINER_STATE_BUFFERING,this.onBuffering),this.listenTo(this.container,ne.CONTAINER_STATE_BUFFERFULL,this.onBufferFull),this.listenTo(this.container,ne.CONTAINER_ERROR,this.onError),this.listenTo(this.container,ne.CONTAINER_PLAYBACKSTATE,this.onPlaybackChanged),this.listenTo(this.container,ne.CONTAINER_VOLUME,(function(t){return e.onVolumeChanged(t)})),this.listenTo(this.container,ne.CONTAINER_SEEK,(function(t){return e.onSeek(t)})),this.listenTo(this.container,ne.CONTAINER_FULL_SCREEN,this.onFullscreen),this.listenTo(this.container,ne.CONTAINER_HIGHDEFINITIONUPDATE,this.onHD),this.listenTo(this.container,ne.CONTAINER_PLAYBACKDVRSTATECHANGED,this.onDVR)),_gaq.push([this.trackerName+"_setAccount",this.account]),this.domainName&&_gaq.push([this.trackerName+"_setDomainName",this.domainName])}},{key:"onReady",value:function(){this.push(["Video","Playback",this.container.playback.name])}},{key:"onPlay",value:function(){this.push(["Video","Play",this.container.playback.src])}},{key:"onStop",value:function(){this.push(["Video","Stop",this.container.playback.src])}},{key:"onEnded",value:function(){this.push(["Video","Ended",this.container.playback.src])}},{key:"onBuffering",value:function(){this.push(["Video","Buffering",this.container.playback.src])}},{key:"onBufferFull",value:function(){this.push(["Video","Bufferfull",this.container.playback.src])}},{key:"onError",value:function(){this.push(["Video","Error",this.container.playback.src])}},{key:"onHD",value:function(e){var t=e?"ON":"OFF";t!==this.currentHDState&&(this.currentHDState=t,this.push(["Video","HD - "+t,this.container.playback.src]))}},{key:"onPlaybackChanged",value:function(e){null!==e.type&&this.push(["Video","Playback Type - "+e.type,this.container.playback.src])}},{key:"onDVR",value:function(e){var t=e?"ON":"OFF";this.push(["Interaction","DVR - "+t,this.container.playback.src])}},{key:"onPause",value:function(){this.push(["Video","Pause",this.container.playback.src])}},{key:"onSeek",value:function(){this.push(["Video","Seek",this.container.playback.src])}},{key:"onVolumeChanged",value:function(){this.push(["Interaction","Volume",this.container.playback.src])}},{key:"onFullscreen",value:function(){this.push(["Interaction","Fullscreen",this.container.playback.src])}},{key:"push",value:function(e){var t=[this.trackerName+"_trackEvent"].concat(e);_gaq.push(t)}}]),t}(ke),Ct="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{};function wt(){throw new Error("setTimeout has not been defined")}function Rt(){throw new Error("clearTimeout has not been defined")}var Ot=wt,Lt=Rt;function Dt(e){if(Ot===setTimeout)return setTimeout(e,0);if((Ot===wt||!Ot)&&setTimeout)return Ot=setTimeout,setTimeout(e,0);try{return Ot(e,0)}catch(t){try{return Ot.call(null,e,0)}catch(t){return Ot.call(this,e,0)}}}"function"==typeof Ct.setTimeout&&(Ot=setTimeout),"function"==typeof Ct.clearTimeout&&(Lt=clearTimeout);var It,Pt=[],xt=!1,Nt=-1;function Mt(){xt&&It&&(xt=!1,It.length?Pt=It.concat(Pt):Nt=-1,Pt.length&&Ft())}function Ft(){if(!xt){var e=Dt(Mt);xt=!0;for(var t=Pt.length;t;){for(It=Pt,Pt=[];++Nt1)for(var n=1;n
\n
\n <% var renderBar = function(name) { %>\n
>\n
>\n
>
\n
>
\n
>
\n
\n
>\n
>
\n
\n
\n <% }; %>\n <% var renderSegmentedBar = function(name, segments) {\n segments = segments || 10; %>\n
>\n <% for (var i = 0; i < segments; i++) { %>\n
>
\n <% } %>\n
\n <% }; %>\n <% var renderDrawer = function(name, renderContent) { %>\n
>\n
>\n
>
\n >\n
\n <% renderContent(name); %>\n
\n <% }; %>\n <% var renderIndicator = function(name) { %>\n
>
\n <% }; %>\n <% var renderButton = function(name) { %>\n \n <% }; %>\n <% var templates = {\n bar: renderBar,\n segmentedBar: renderSegmentedBar,\n };\n var render = function(settingsList) {\n settingsList.forEach(function(setting) {\n if(setting === "seekbar") {\n renderBar(setting);\n } else if (setting === "volume") {\n renderDrawer(setting, settings.volumeBarTemplate ? templates[settings.volumeBarTemplate] : function(name) { return renderSegmentedBar(name); });\n } else if (setting === "duration" || setting === "position") {\n renderIndicator(setting);\n } else {\n renderButton(setting);\n }\n });\n }; %>\n <% if (settings.default && settings.default.length) { %>\n
\n <% render(settings.default); %>\n
\n <% } %>\n <% if (settings.left && settings.left.length) { %>\n
\n <% render(settings.left); %>\n
\n <% } %>\n <% if (settings.right && settings.right.length) { %>\n
\n <% render(settings.right); %>\n
\n <% } %>\n
\n')}},{key:"volume",get:function(){return this.container&&this.container.isReady?this.container.volume:this.intendedVolume}},{key:"muted",get:function(){return 0===this.volume}}]),ut(t,[{key:"getExternalInterface",value:function(){var e=this;return{setVolume:this.setVolume,getVolume:function(){return e.volume}}}},{key:"bindEvents",value:function(){var e=this;this.stopListening(),this.listenTo(this.core,ne.CORE_ACTIVE_CONTAINER_CHANGED,this.onActiveContainerChanged),this.listenTo(this.core,ne.CORE_MOUSE_MOVE,this.show),this.listenTo(this.core,ne.CORE_MOUSE_LEAVE,(function(){return e.hide(e.options.hideMediaControlDelay)})),this.listenTo(this.core,ne.CORE_FULLSCREEN,this.show),this.listenTo(this.core,ne.CORE_OPTIONS_CHANGE,this.configure),this.listenTo(this.core,ne.CORE_RESIZE,this.playerResize),this.bindContainerEvents()}},{key:"bindContainerEvents",value:function(){this.container&&(this.listenTo(this.container,ne.CONTAINER_PLAY,this.changeTogglePlay),this.listenTo(this.container,ne.CONTAINER_PAUSE,this.changeTogglePlay),this.listenTo(this.container,ne.CONTAINER_STOP,this.changeTogglePlay),this.listenTo(this.container,ne.CONTAINER_DBLCLICK,this.toggleFullscreen),this.listenTo(this.container,ne.CONTAINER_TIMEUPDATE,this.onTimeUpdate),this.listenTo(this.container,ne.CONTAINER_PROGRESS,this.updateProgressBar),this.listenTo(this.container,ne.CONTAINER_SETTINGSUPDATE,this.settingsUpdate),this.listenTo(this.container,ne.CONTAINER_PLAYBACKDVRSTATECHANGED,this.settingsUpdate),this.listenTo(this.container,ne.CONTAINER_HIGHDEFINITIONUPDATE,this.highDefinitionUpdate),this.listenTo(this.container,ne.CONTAINER_MEDIACONTROL_DISABLE,this.disable),this.listenTo(this.container,ne.CONTAINER_MEDIACONTROL_ENABLE,this.enable),this.listenTo(this.container,ne.CONTAINER_ENDED,this.ended),this.listenTo(this.container,ne.CONTAINER_VOLUME,this.onVolumeChanged),this.listenTo(this.container,ne.CONTAINER_OPTIONS_CHANGE,this.setInitialVolume),"video"===this.container.playback.el.nodeName.toLowerCase()&&this.listenToOnce(this.container,ne.CONTAINER_LOADEDMETADATA,this.onLoadedMetadataOnVideoTag))}},{key:"disable",value:function(){this.userDisabled=!0,this.hide(),this.unbindKeyEvents(),this.$el.hide()}},{key:"enable",value:function(){this.options.chromeless||(this.userDisabled=!1,this.bindKeyEvents(),this.show())}},{key:"play",value:function(){this.container&&this.container.play()}},{key:"pause",value:function(){this.container&&this.container.pause()}},{key:"stop",value:function(){this.container&&this.container.stop()}},{key:"setInitialVolume",value:function(){var e=this.persistConfig?$t.restore("volume"):100,t=this.container&&this.container.options||this.options;this.setVolume(t.mute?0:e,!0)}},{key:"onVolumeChanged",value:function(){this.updateVolumeUI()}},{key:"onLoadedMetadataOnVideoTag",value:function(){var e=this.playback&&this.playback.el;!zt.fullscreenEnabled()&&e.webkitSupportsFullscreen&&(this.fullScreenOnVideoTagSupported=!0,this.settingsUpdate())}},{key:"updateVolumeUI",value:function(){if(this.rendered){this.$volumeBarContainer.find(".bar-fill-2").css({});var e=this.$volumeBarContainer.width(),t=this.$volumeBarBackground.width(),n=(e-t)/2,i=t*this.volume/100+n;this.$volumeBarFill.css({width:"".concat(this.volume,"%")}),this.$volumeBarScrubber.css({left:i}),this.$volumeBarContainer.find(".segmented-bar-element").removeClass("fill");var r=Math.ceil(this.volume/10);this.$volumeBarContainer.find(".segmented-bar-element").slice(0,r).addClass("fill"),this.$volumeIcon.html(""),this.$volumeIcon.removeClass("muted"),this.muted?(this.$volumeIcon.append('\n \n'),this.$volumeIcon.addClass("muted")):this.$volumeIcon.append(Yt),this.applyButtonStyle(this.$volumeIcon)}}},{key:"changeTogglePlay",value:function(){this.$playPauseToggle.html(""),this.$playStopToggle.html(""),this.container&&this.container.isPlaying()?(this.$playPauseToggle.append(Tt),this.$playStopToggle.append(Gt),this.trigger(ne.MEDIACONTROL_PLAYING)):(this.$playPauseToggle.append(Et),this.$playStopToggle.append(Et),this.trigger(ne.MEDIACONTROL_NOTPLAYING),_.isMobile&&this.show()),this.applyButtonStyle(this.$playPauseToggle),this.applyButtonStyle(this.$playStopToggle)}},{key:"mousemoveOnSeekBar",value:function(e){if(this.settings.seekEnabled){var t=e.pageX-this.$seekBarContainer.offset().left-this.$seekBarHover.width()/2;this.$seekBarHover.css({left:t})}this.trigger(ne.MEDIACONTROL_MOUSEMOVE_SEEKBAR,e)}},{key:"mouseleaveOnSeekBar",value:function(e){this.trigger(ne.MEDIACONTROL_MOUSELEAVE_SEEKBAR,e)}},{key:"onVolumeClick",value:function(e){this.setVolume(this.getVolumeFromUIEvent(e))}},{key:"mousemoveOnVolumeBar",value:function(e){this.draggingVolumeBar&&this.setVolume(this.getVolumeFromUIEvent(e))}},{key:"playerResize",value:function(e){this.$fullscreenToggle.html("");var t=this.core.isFullscreen()?'\n \n':Ht;this.$fullscreenToggle.append(t),this.applyButtonStyle(this.$fullscreenToggle),0!==this.$el.find(".media-control").length&&this.$el.removeClass("w320"),(e.width<=320||this.options.hideVolumeBar)&&this.$el.addClass("w320")}},{key:"togglePlayPause",value:function(){return this.container.isPlaying()?this.container.pause():this.container.play(),!1}},{key:"togglePlayStop",value:function(){this.container.isPlaying()?this.container.stop():this.container.play()}},{key:"startSeekDrag",value:function(e){this.settings.seekEnabled&&(this.draggingSeekBar=!0,this.$el.addClass("dragging"),this.$seekBarLoaded.addClass("media-control-notransition"),this.$seekBarPosition.addClass("media-control-notransition"),this.$seekBarScrubber.addClass("media-control-notransition"),e&&e.preventDefault())}},{key:"startVolumeDrag",value:function(e){this.draggingVolumeBar=!0,this.$el.addClass("dragging"),e&&e.preventDefault()}},{key:"stopDrag",value:function(e){this.draggingSeekBar&&this.seek(e),this.$el.removeClass("dragging"),this.$seekBarLoaded.removeClass("media-control-notransition"),this.$seekBarPosition.removeClass("media-control-notransition"),this.$seekBarScrubber.removeClass("media-control-notransition dragging"),this.draggingSeekBar=!1,this.draggingVolumeBar=!1}},{key:"updateDrag",value:function(e){if(this.draggingSeekBar){e.preventDefault();var t=(e.pageX-this.$seekBarContainer.offset().left)/this.$seekBarContainer.width()*100;t=Math.min(100,Math.max(t,0)),this.setSeekPercentage(t)}else this.draggingVolumeBar&&(e.preventDefault(),this.setVolume(this.getVolumeFromUIEvent(e)))}},{key:"getVolumeFromUIEvent",value:function(e){return(e.pageX-this.$volumeBarContainer.offset().left)/this.$volumeBarContainer.width()*100}},{key:"toggleMute",value:function(){this.setVolume(this.muted?100:0)}},{key:"setVolume",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e=Math.min(100,Math.max(e,0)),this.intendedVolume=e,this.persistConfig&&!n&&$t.persist("volume",e);var i=function(){t.container&&t.container.isReady?t.container.setVolume(e):t.listenToOnce(t.container,ne.CONTAINER_READY,(function(){t.container.setVolume(e)}))};this.container?i():this.listenToOnce(this,ne.MEDIACONTROL_CONTAINERCHANGED,(function(){return i()}))}},{key:"toggleFullscreen",value:function(){this.trigger(ne.MEDIACONTROL_FULLSCREEN,this.name),this.container.fullscreen(),this.core.toggleFullscreen(),this.resetUserKeepVisible()}},{key:"onActiveContainerChanged",value:function(){this.fullScreenOnVideoTagSupported=null,this.bindEvents(),this.setInitialVolume(),this.changeTogglePlay(),this.bindContainerEvents(),this.settingsUpdate(),this.container&&this.container.trigger(ne.CONTAINER_PLAYBACKDVRSTATECHANGED,this.container.isDvrInUse()),this.container&&this.container.mediaControlDisabled&&this.disable(),this.trigger(ne.MEDIACONTROL_CONTAINERCHANGED)}},{key:"showVolumeBar",value:function(){this.hideVolumeId&&clearTimeout(this.hideVolumeId),this.$volumeBarContainer.removeClass("volume-bar-hide")}},{key:"hideVolumeBar",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:400;this.$volumeBarContainer&&(this.draggingVolumeBar?this.hideVolumeId=setTimeout((function(){return e.hideVolumeBar()}),t):(this.hideVolumeId&&clearTimeout(this.hideVolumeId),this.hideVolumeId=setTimeout((function(){return e.$volumeBarContainer.addClass("volume-bar-hide")}),t)))}},{key:"ended",value:function(){this.changeTogglePlay()}},{key:"updateProgressBar",value:function(e){var t=e.start/e.total*100,n=e.current/e.total*100;this.$seekBarLoaded.css({left:"".concat(t,"%"),width:"".concat(n-t,"%")})}},{key:"onTimeUpdate",value:function(e){if(!this.draggingSeekBar){var t=e.current<0?e.total:e.current;this.currentPositionValue=t,this.currentDurationValue=e.total,this.renderSeekBar()}}},{key:"renderSeekBar",value:function(){if(null!==this.currentPositionValue&&null!==this.currentDurationValue){this.currentSeekBarPercentage=100,this.container&&(this.container.getPlaybackType()!==he.LIVE||this.container.isDvrInUse())&&(this.currentSeekBarPercentage=this.currentPositionValue/this.currentDurationValue*100),this.setSeekPercentage(this.currentSeekBarPercentage);var e=Wt(this.currentPositionValue),t=Wt(this.currentDurationValue);e!==this.displayedPosition&&(this.$position.text(e),this.displayedPosition=e),t!==this.displayedDuration&&(this.$duration.text(t),this.displayedDuration=t)}}},{key:"seek",value:function(e){if(this.settings.seekEnabled){var t=(e.pageX-this.$seekBarContainer.offset().left)/this.$seekBarContainer.width()*100;return t=Math.min(100,Math.max(t,0)),this.container&&this.container.seekPercentage(t),this.setSeekPercentage(t),!1}}},{key:"setKeepVisible",value:function(){this.keepVisible=!0}},{key:"resetKeepVisible",value:function(){this.keepVisible=!1}},{key:"setUserKeepVisible",value:function(){this.userKeepVisible=!0}},{key:"resetUserKeepVisible",value:function(){this.userKeepVisible=!1}},{key:"isVisible",value:function(){return!this.$el.hasClass("media-control-hide")}},{key:"show",value:function(e){var t=this;if(!this.disabled){var n=e&&e.clientX!==this.lastMouseX&&e.clientY!==this.lastMouseY;(!e||n||navigator.userAgent.match(/firefox/i))&&(clearTimeout(this.hideId),this.$el.show(),this.trigger(ne.MEDIACONTROL_SHOW,this.name),this.container&&this.container.trigger(ne.CONTAINER_MEDIACONTROL_SHOW,this.name),this.$el.removeClass("media-control-hide"),this.hideId=setTimeout((function(){return t.hide()}),2e3),e&&(this.lastMouseX=e.clientX,this.lastMouseY=e.clientY));this.updateCursorStyle(!0)}}},{key:"hide",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;if(this.isVisible()){var n=t||2e3;if(clearTimeout(this.hideId),this.disabled||!1!==this.options.hideMediaControl){var i=this.userKeepVisible||this.keepVisible,r=this.draggingSeekBar||this.draggingVolumeBar;if(!this.disabled&&(t||i||r))this.hideId=setTimeout((function(){return e.hide()}),n);else{this.trigger(ne.MEDIACONTROL_HIDE,this.name),this.container&&this.container.trigger(ne.CONTAINER_MEDIACONTROL_HIDE,this.name),this.$el.addClass("media-control-hide"),this.hideVolumeBar(0);var a=!1;this.updateCursorStyle(a)}}}}},{key:"updateCursorStyle",value:function(e){e?this.core.$el.removeClass("nocursor"):this.core.isFullscreen()&&this.core.$el.addClass("nocursor")}},{key:"settingsUpdate",value:function(){var e=this.getSettings();!e||this.fullScreenOnVideoTagSupported||zt.fullscreenEnabled()||(e.default&&Xt(e.default,"fullscreen"),e.left&&Xt(e.left,"fullscreen"),e.right&&Xt(e.right,"fullscreen")),JSON.stringify(this.settings)!==JSON.stringify(e)&&(this.settings=e,this.render())}},{key:"getSettings",value:function(){return E.extend(!0,{},this.container&&this.container.settings)}},{key:"highDefinitionUpdate",value:function(e){this.isHD=e;var t=e?"addClass":"removeClass";this.$hdIndicator[t]("enabled")}},{key:"createCachedElements",value:function(){var e=this.$el.find(".media-control-layer");this.$duration=e.find(".media-control-indicator[data-duration]"),this.$fullscreenToggle=e.find("button.media-control-button[data-fullscreen]"),this.$playPauseToggle=e.find("button.media-control-button[data-playpause]"),this.$playStopToggle=e.find("button.media-control-button[data-playstop]"),this.$position=e.find(".media-control-indicator[data-position]"),this.$seekBarContainer=e.find(".bar-container[data-seekbar]"),this.$seekBarHover=e.find(".bar-hover[data-seekbar]"),this.$seekBarLoaded=e.find(".bar-fill-1[data-seekbar]"),this.$seekBarPosition=e.find(".bar-fill-2[data-seekbar]"),this.$seekBarScrubber=e.find(".bar-scrubber[data-seekbar]"),this.$volumeBarContainer=e.find(".bar-container[data-volume]"),this.$volumeContainer=e.find(".drawer-container[data-volume]"),this.$volumeIcon=e.find(".drawer-icon[data-volume]"),this.$volumeBarBackground=this.$el.find(".bar-background[data-volume]"),this.$volumeBarFill=this.$el.find(".bar-fill-1[data-volume]"),this.$volumeBarScrubber=this.$el.find(".bar-scrubber[data-volume]"),this.$hdIndicator=this.$el.find("button.media-control-button[data-hd-indicator]"),this.resetIndicators(),this.initializeIcons()}},{key:"resetIndicators",value:function(){this.displayedPosition=this.$position.text(),this.displayedDuration=this.$duration.text()}},{key:"initializeIcons",value:function(){var e=this.$el.find(".media-control-layer");e.find("button.media-control-button[data-play]").append(Et),e.find("button.media-control-button[data-pause]").append(Tt),e.find("button.media-control-button[data-stop]").append(Gt),this.$playPauseToggle.append(Et),this.$playStopToggle.append(Et),this.$volumeIcon.append(Yt),this.$fullscreenToggle.append(Ht),this.$hdIndicator.append('\n \n')}},{key:"setSeekPercentage",value:function(e){e=Math.max(Math.min(e,100),0),this.displayedSeekBarPercentage!==e&&(this.displayedSeekBarPercentage=e,this.$seekBarPosition.removeClass("media-control-notransition"),this.$seekBarScrubber.removeClass("media-control-notransition"),this.$seekBarPosition.css({width:"".concat(e,"%")}),this.$seekBarScrubber.css({left:"".concat(e,"%")}))}},{key:"seekRelative",value:function(e){if(this.settings.seekEnabled){var t=this.container.getCurrentTime(),n=this.container.getDuration(),i=Math.min(Math.max(t+e,0),n);i=Math.min(100*i/n,100),this.container.seekPercentage(i)}}},{key:"bindKeyAndShow",value:function(e,t){var n=this;this.kibo.down(e,(function(){return n.show(),t()}))}},{key:"bindKeyEvents",value:function(){var e=this;if(!_.isMobile&&!this.options.disableKeyboardShortcuts){this.unbindKeyEvents(),this.kibo=new Vt(this.options.focusElement||this.options.parentElement),this.bindKeyAndShow("space",(function(){return e.togglePlayPause()})),this.bindKeyAndShow("left",(function(){return e.seekRelative(-5)})),this.bindKeyAndShow("right",(function(){return e.seekRelative(5)})),this.bindKeyAndShow("shift left",(function(){return e.seekRelative(-10)})),this.bindKeyAndShow("shift right",(function(){return e.seekRelative(10)})),this.bindKeyAndShow("shift ctrl left",(function(){return e.seekRelative(-15)})),this.bindKeyAndShow("shift ctrl right",(function(){return e.seekRelative(15)}));["1","2","3","4","5","6","7","8","9","0"].forEach((function(t){e.bindKeyAndShow(t,(function(){e.settings.seekEnabled&&e.container&&e.container.seekPercentage(10*t)}))}))}}},{key:"unbindKeyEvents",value:function(){this.kibo&&(this.kibo.off("space"),this.kibo.off("left"),this.kibo.off("right"),this.kibo.off("shift left"),this.kibo.off("shift right"),this.kibo.off("shift ctrl left"),this.kibo.off("shift ctrl right"),this.kibo.off(["1","2","3","4","5","6","7","8","9","0"]))}},{key:"parseColors",value:function(){if(this.options.mediacontrol){this.buttonsColor=this.options.mediacontrol.buttons;var e=this.options.mediacontrol.seekbar;this.$el.find(".bar-fill-2[data-seekbar]").css("background-color",e),this.$el.find(".media-control-icon svg path").css("fill",this.buttonsColor),this.$el.find(".segmented-bar-element[data-volume]").css("boxShadow","inset 2px 0 0 "+this.buttonsColor)}}},{key:"applyButtonStyle",value:function(e){this.buttonsColor&&e&&E(e).find("svg path").css("fill",this.buttonsColor)}},{key:"destroy",value:function(){E(document).unbind("mouseup",this.stopDragHandler),E(document).unbind("mousemove",this.updateDragHandler),this.unbindKeyEvents(),this.stopListening(),pt(dt(t.prototype),"destroy",this).call(this)}},{key:"configure",value:function(e){this.options.chromeless||e.source||e.sources?this.disable():this.enable(),this.trigger(ne.MEDIACONTROL_OPTIONS_CHANGE)}},{key:"render",value:function(){var e=this,t=this.options.hideMediaControlDelay||2e3;this.settings&&this.$el.html(this.template({settings:this.settings})),this.createCachedElements(),this.$playPauseToggle.addClass("paused"),this.$playStopToggle.addClass("stopped"),this.changeTogglePlay(),this.container&&(this.hideId=setTimeout((function(){return e.hide()}),t),this.disabled&&this.hide()),_.isSafari&&_.isMobile&&(_.version<10?this.$volumeContainer.css("display","none"):this.$volumeBarContainer.css("display","none")),this.$seekBarPosition.addClass("media-control-notransition"),this.$seekBarScrubber.addClass("media-control-notransition");var n=0;return this.displayedSeekBarPercentage&&(n=this.displayedSeekBarPercentage),this.displayedSeekBarPercentage=null,this.setSeekPercentage(n),Bt((function(){!e.settings.seekEnabled&&e.$seekBarContainer.addClass("seek-disabled"),!_.isMobile&&!e.options.disableKeyboardShortcuts&&e.bindKeyEvents(),e.playerResize({width:e.options.width,height:e.options.height}),e.hideVolumeBar(0)})),this.parseColors(),this.highDefinitionUpdate(this.isHD),this.core.$el.append(this.el),this.rendered=!0,this.updateVolumeUI(),this.trigger(ne.MEDIACONTROL_RENDERED),this}}]),t}(ue);Zt.extend=function(e){return qt(Zt,e)};vt(".player-poster[data-poster] {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n height: 100%;\n width: 100%;\n z-index: 998;\n top: 0;\n left: 0;\n background-color: transparent;\n background-size: cover;\n background-repeat: no-repeat;\n background-position: 50% 50%; }\n .player-poster[data-poster].clickable {\n cursor: pointer; }\n .player-poster[data-poster]:hover .play-wrapper[data-poster] {\n opacity: 1; }\n .player-poster[data-poster] .play-wrapper[data-poster] {\n width: 100%;\n height: 25%;\n margin: 0 auto;\n opacity: 0.75;\n transition: opacity 0.1s ease; }\n .player-poster[data-poster] .play-wrapper[data-poster] svg {\n height: 100%; }\n .player-poster[data-poster] .play-wrapper[data-poster] svg path {\n fill: #fff; }\n");var Qt=function(e){function t(e){var n;return st(this,t),(n=ft(this,dt(t).call(this,e))).hasStartedPlaying=!1,n.playRequested=!1,n.render(),Bt((function(){return n.update()})),n}return ct(t,e),ut(t,[{key:"name",get:function(){return"poster"}},{key:"supportedVersion",get:function(){return{min:"0.4.9"}}},{key:"template",get:function(){return We('
\n')}},{key:"shouldRender",get:function(){var e=!(!this.options.poster||!this.options.poster.showForNoOp);return"html_img"!==this.container.playback.name&&(this.container.playback.getPlaybackType()!==he.NO_OP||e)}},{key:"attributes",get:function(){return{class:"player-poster","data-poster":""}}},{key:"events",get:function(){return{click:"clicked"}}},{key:"showOnVideoEnd",get:function(){return!this.options.poster||this.options.poster.showOnVideoEnd||void 0===this.options.poster.showOnVideoEnd}}]),ut(t,[{key:"bindEvents",value:function(){this.listenTo(this.container,ne.CONTAINER_STOP,this.onStop),this.listenTo(this.container,ne.CONTAINER_PLAY,this.onPlay),this.listenTo(this.container,ne.CONTAINER_STATE_BUFFERING,this.update),this.listenTo(this.container,ne.CONTAINER_STATE_BUFFERFULL,this.update),this.listenTo(this.container,ne.CONTAINER_OPTIONS_CHANGE,this.render),this.listenTo(this.container,ne.CONTAINER_ERROR,this.onError),this.showOnVideoEnd&&this.listenTo(this.container,ne.CONTAINER_ENDED,this.onStop)}},{key:"onError",value:function(e){this.hasFatalError=e.level===se.Levels.FATAL,this.hasFatalError&&(this.hasStartedPlaying=!1,this.playRequested=!1,this.showPlayButton())}},{key:"onPlay",value:function(){this.hasStartedPlaying=!0,this.update()}},{key:"onStop",value:function(){this.hasStartedPlaying=!1,this.playRequested=!1,this.update()}},{key:"updatePlayButton",value:function(e){!e||this.options.chromeless&&!this.options.allowUserInteraction?this.hidePlayButton():this.showPlayButton()}},{key:"showPlayButton",value:function(){this.hasFatalError&&!this.options.disableErrorScreen||(this.$playButton.show(),this.$el.addClass("clickable"))}},{key:"hidePlayButton",value:function(){this.$playButton.hide(),this.$el.removeClass("clickable")}},{key:"clicked",value:function(){if(!this.hasStartedPlaying)return this.options.chromeless&&!this.options.allowUserInteraction||(this.playRequested=!0,this.update(),this.container.play()),!1}},{key:"shouldHideOnPlay",value:function(){return!this.container.playback.isAudioOnly}},{key:"update",value:function(){if(this.shouldRender){var e=!this.playRequested&&!this.hasStartedPlaying&&!this.container.buffering;this.updatePlayButton(e),this.updatePoster()}}},{key:"updatePoster",value:function(){this.hasStartedPlaying?this.hidePoster():this.showPoster()}},{key:"showPoster",value:function(){this.container.disableMediaControl(),this.$el.show()}},{key:"hidePoster",value:function(){this.container.enableMediaControl(),this.shouldHideOnPlay()&&this.$el.hide()}},{key:"render",value:function(){if(this.shouldRender){if(this.$el.html(this.template()),this.options.poster&&void 0===this.options.poster.custom){var e=this.options.poster.url||this.options.poster;this.$el.css({"background-image":"url("+e+")"})}else this.options.poster&&this.$el.css({background:this.options.poster.custom});this.container.$el.append(this.el),this.$playWrapper=this.$el.find(".play-wrapper"),this.$playWrapper.append(Et),this.$playButton=this.$playWrapper.find("svg"),this.$playButton.addClass("poster-icon"),this.$playButton.attr("data-poster","");var t=this.options.mediacontrol&&this.options.mediacontrol.buttons;return t&&this.$el.find("svg path").css("fill",t),this.options.mediacontrol&&this.options.mediacontrol.buttons&&(t=this.options.mediacontrol.buttons,this.$playButton.css("color",t)),this.update(),this}}}]),t}(Se);vt('.seek-time[data-seek-time] {\n position: absolute;\n white-space: nowrap;\n height: 20px;\n line-height: 20px;\n font-size: 0;\n left: -100%;\n bottom: 55px;\n background-color: rgba(2, 2, 2, 0.5);\n z-index: 9999;\n transition: opacity 0.1s ease; }\n .seek-time[data-seek-time].hidden[data-seek-time] {\n opacity: 0; }\n .seek-time[data-seek-time] [data-seek-time] {\n display: inline-block;\n color: white;\n font-size: 10px;\n padding-left: 7px;\n padding-right: 7px;\n vertical-align: top; }\n .seek-time[data-seek-time] [data-duration] {\n display: inline-block;\n color: rgba(255, 255, 255, 0.5);\n font-size: 10px;\n padding-right: 7px;\n vertical-align: top; }\n .seek-time[data-seek-time] [data-duration]:before {\n content: "|";\n margin-right: 7px; }\n');var Jt=H.formatTime,en=function(e){function t(e){var n;return st(this,t),(n=ft(this,dt(t).call(this,e))).hoveringOverSeekBar=!1,n.hoverPosition=null,n.duration=null,n.firstFragDateTime=null,n.actualLiveTime=!!n.mediaControl.options.actualLiveTime,n.actualLiveTime&&(n.mediaControl.options.actualLiveServerTime?n.actualLiveServerTimeDiff=(new Date).getTime()-new Date(n.mediaControl.options.actualLiveServerTime).getTime():n.actualLiveServerTimeDiff=0),n}return ct(t,e),ut(t,[{key:"name",get:function(){return"seek_time"}},{key:"supportedVersion",get:function(){return{min:"0.4.9"}}},{key:"template",get:function(){return We("\n\n")}},{key:"attributes",get:function(){return{class:"seek-time","data-seek-time":""}}},{key:"mediaControl",get:function(){return this.core.mediaControl}},{key:"mediaControlContainer",get:function(){return this.mediaControl.container}},{key:"isLiveStreamWithDvr",get:function(){return this.mediaControlContainer&&this.mediaControlContainer.getPlaybackType()===he.LIVE&&this.mediaControlContainer.isDvrEnabled()}},{key:"durationShown",get:function(){return this.isLiveStreamWithDvr&&!this.actualLiveTime}},{key:"useActualLiveTime",get:function(){return this.actualLiveTime&&this.isLiveStreamWithDvr}}]),ut(t,[{key:"bindEvents",value:function(){this.listenTo(this.mediaControl,ne.MEDIACONTROL_RENDERED,this.render),this.listenTo(this.mediaControl,ne.MEDIACONTROL_MOUSEMOVE_SEEKBAR,this.showTime),this.listenTo(this.mediaControl,ne.MEDIACONTROL_MOUSELEAVE_SEEKBAR,this.hideTime),this.listenTo(this.mediaControl,ne.MEDIACONTROL_CONTAINERCHANGED,this.onContainerChanged),this.mediaControlContainer&&(this.listenTo(this.mediaControlContainer,ne.CONTAINER_PLAYBACKDVRSTATECHANGED,this.update),this.listenTo(this.mediaControlContainer,ne.CONTAINER_TIMEUPDATE,this.updateDuration))}},{key:"onContainerChanged",value:function(){this.stopListening(),this.bindEvents()}},{key:"updateDuration",value:function(e){this.duration=e.total,this.firstFragDateTime=e.firstFragDateTime,this.update()}},{key:"showTime",value:function(e){this.hoveringOverSeekBar=!0,this.calculateHoverPosition(e),this.update()}},{key:"hideTime",value:function(){this.hoveringOverSeekBar=!1,this.update()}},{key:"calculateHoverPosition",value:function(e){var t=e.pageX-this.mediaControl.$seekBarContainer.offset().left;this.hoverPosition=Math.min(1,Math.max(t/this.mediaControl.$seekBarContainer.width(),0))}},{key:"getSeekTime",value:function(){var e,t,n,i;return this.useActualLiveTime?(this.firstFragDateTime?(i=new Date(this.firstFragDateTime),(n=new Date(this.firstFragDateTime)).setHours(0,0,0,0),t=(i.getTime()-n.getTime())/1e3+this.duration):(n=new Date((new Date).getTime()-this.actualLiveServerTimeDiff),t=((i=new Date(n))-n.setHours(0,0,0,0))/1e3),(e=t-this.duration+this.hoverPosition*this.duration)<0&&(e+=86400)):e=this.hoverPosition*this.duration,{seekTime:e,secondsSinceMidnight:t}}},{key:"update",value:function(){if(this.rendered)if(this.shouldBeVisible()){var e=this.getSeekTime(),t=Jt(e.seekTime,this.useActualLiveTime);if(t!==this.displayedSeekTime&&(this.$seekTimeEl.text(t),this.displayedSeekTime=t),this.durationShown){this.$durationEl.show();var n=Jt(this.actualLiveTime?e.secondsSinceMidnight:this.duration,this.actualLiveTime);n!==this.displayedDuration&&(this.$durationEl.text(n),this.displayedDuration=n)}else this.$durationEl.hide();this.$el.show();var i=this.mediaControl.$seekBarContainer.width(),r=this.$el.width(),a=this.hoverPosition*i;a-=r/2,a=Math.max(0,Math.min(a,i-r)),this.$el.css("left",a)}else this.$el.hide(),this.$el.css("left","-100%")}},{key:"shouldBeVisible",value:function(){return this.mediaControlContainer&&this.mediaControlContainer.settings.seekEnabled&&this.hoveringOverSeekBar&&null!==this.hoverPosition&&null!==this.duration}},{key:"render",value:function(){this.rendered=!0,this.displayedDuration=null,this.displayedSeekTime=null,this.$el.html(this.template()),this.$el.hide(),this.mediaControl.$el.append(this.el),this.$seekTimeEl=this.$el.find("[data-seek-time]"),this.$durationEl=this.$el.find("[data-duration]"),this.$durationEl.hide(),this.update()}}]),t}(ue);vt(".spinner-three-bounce[data-spinner] {\n position: absolute;\n margin: 0 auto;\n width: 70px;\n text-align: center;\n z-index: 999;\n left: 0;\n right: 0;\n margin-left: auto;\n margin-right: auto;\n /* center vertically */\n top: 50%;\n transform: translateY(-50%); }\n .spinner-three-bounce[data-spinner] > div {\n width: 18px;\n height: 18px;\n background-color: #FFFFFF;\n border-radius: 100%;\n display: inline-block;\n -webkit-animation: bouncedelay 1.4s infinite ease-in-out;\n animation: bouncedelay 1.4s infinite ease-in-out;\n /* Prevent first frame from flickering when animation starts */\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both; }\n .spinner-three-bounce[data-spinner] [data-bounce1] {\n -webkit-animation-delay: -0.32s;\n animation-delay: -0.32s; }\n .spinner-three-bounce[data-spinner] [data-bounce2] {\n -webkit-animation-delay: -0.16s;\n animation-delay: -0.16s; }\n\n@-webkit-keyframes bouncedelay {\n 0%, 80%, 100% {\n transform: scale(0); }\n 40% {\n transform: scale(1); } }\n\n@keyframes bouncedelay {\n 0%, 80%, 100% {\n transform: scale(0); }\n 40% {\n transform: scale(1); } }\n");var tn=function(e){function t(e){var n;return st(this,t),(n=ft(this,dt(t).call(this,e))).template=We("
\n"),n.showTimeout=null,n.listenTo(n.container,ne.CONTAINER_STATE_BUFFERING,n.onBuffering),n.listenTo(n.container,ne.CONTAINER_STATE_BUFFERFULL,n.onBufferFull),n.listenTo(n.container,ne.CONTAINER_STOP,n.onStop),n.listenTo(n.container,ne.CONTAINER_ENDED,n.onStop),n.listenTo(n.container,ne.CONTAINER_ERROR,n.onStop),n.render(),n}return ct(t,e),ut(t,[{key:"name",get:function(){return"spinner"}},{key:"supportedVersion",get:function(){return{min:"0.4.9"}}},{key:"attributes",get:function(){return{"data-spinner":"",class:"spinner-three-bounce"}}}]),ut(t,[{key:"onBuffering",value:function(){this.show()}},{key:"onBufferFull",value:function(){this.hide()}},{key:"onStop",value:function(){this.hide()}},{key:"show",value:function(){var e=this;null===this.showTimeout&&(this.showTimeout=setTimeout((function(){return e.$el.show()}),300))}},{key:"hide",value:function(){null!==this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=null),this.$el.hide()}},{key:"render",value:function(){return this.$el.html(this.template()),this.container.$el.append(this.$el),this.$el.hide(),this.container.buffering&&this.onBuffering(),this}}]),t}(Se),nn=function(e){function t(e){var n;return st(this,t),(n=ft(this,dt(t).call(this,e))).setInitialAttrs(),n.reportInterval=n.options.reportInterval||5e3,n.state="IDLE",n}return ct(t,e),ut(t,[{key:"name",get:function(){return"stats"}},{key:"supportedVersion",get:function(){return{min:"0.4.9"}}}]),ut(t,[{key:"bindEvents",value:function(){this.listenTo(this.container.playback,ne.PLAYBACK_PLAY,this.onPlay),this.listenTo(this.container,ne.CONTAINER_STOP,this.onStop),this.listenTo(this.container,ne.CONTAINER_ENDED,this.onStop),this.listenTo(this.container,ne.CONTAINER_DESTROYED,this.onStop),this.listenTo(this.container,ne.CONTAINER_STATE_BUFFERING,this.onBuffering),this.listenTo(this.container,ne.CONTAINER_STATE_BUFFERFULL,this.onBufferFull),this.listenTo(this.container,ne.CONTAINER_STATS_ADD,this.onStatsAdd),this.listenTo(this.container,ne.CONTAINER_BITRATE,this.onStatsAdd),this.listenTo(this.container.playback,ne.PLAYBACK_STATS_ADD,this.onStatsAdd)}},{key:"setInitialAttrs",value:function(){this.firstPlay=!0,this.startupTime=0,this.rebufferingTime=0,this.watchingTime=0,this.rebuffers=0,this.externalMetrics={}}},{key:"onPlay",value:function(){this.state="PLAYING",this.watchingTimeInit=Date.now(),this.intervalId||(this.intervalId=setInterval(this.report.bind(this),this.reportInterval))}},{key:"onStop",value:function(){clearInterval(this.intervalId),this.report(),this.intervalId=void 0,this.state="STOPPED"}},{key:"onBuffering",value:function(){this.firstPlay?this.startupTimeInit=Date.now():this.rebufferingTimeInit=Date.now(),this.state="BUFFERING",this.rebuffers++}},{key:"onBufferFull",value:function(){this.firstPlay&&this.startupTimeInit?(this.firstPlay=!1,this.startupTime=Date.now()-this.startupTimeInit,this.watchingTimeInit=Date.now()):this.rebufferingTimeInit&&(this.rebufferingTime+=this.getRebufferingTime()),this.rebufferingTimeInit=void 0,this.state="PLAYING"}},{key:"getRebufferingTime",value:function(){return Date.now()-this.rebufferingTimeInit}},{key:"getWatchingTime",value:function(){return Date.now()-this.watchingTimeInit-this.rebufferingTime}},{key:"isRebuffering",value:function(){return!!this.rebufferingTimeInit}},{key:"onStatsAdd",value:function(e){E.extend(this.externalMetrics,e)}},{key:"getStats",value:function(){var e={startupTime:this.startupTime,rebuffers:this.rebuffers,rebufferingTime:this.isRebuffering()?this.rebufferingTime+this.getRebufferingTime():this.rebufferingTime,watchingTime:this.isRebuffering()?this.getWatchingTime()-this.getRebufferingTime():this.getWatchingTime()};return E.extend(e,this.externalMetrics),e}},{key:"report",value:function(){this.container.statsReport(this.getStats())}}]),t}(ke);vt(".clappr-watermark[data-watermark] {\n position: absolute;\n min-width: 70px;\n max-width: 200px;\n width: 12%;\n text-align: center;\n z-index: 10; }\n\n.clappr-watermark[data-watermark] a {\n outline: none;\n cursor: pointer; }\n\n.clappr-watermark[data-watermark] img {\n max-width: 100%; }\n\n.clappr-watermark[data-watermark-bottom-left] {\n bottom: 10px;\n left: 10px; }\n\n.clappr-watermark[data-watermark-bottom-right] {\n bottom: 10px;\n right: 42px; }\n\n.clappr-watermark[data-watermark-top-left] {\n top: 10px;\n left: 10px; }\n\n.clappr-watermark[data-watermark-top-right] {\n top: 10px;\n right: 37px; }\n");for(var rn={ClickToPause:gt,ClosedCaptions:mt,DVRControls:yt,EndVideo:At,ErrorScreen:bt,Favicon:_t,GoogleAnalytics:St,MediaControl:Zt,Poster:Qt,SeekTime:en,SpinnerThreeBounce:tn,Stats:nn,WaterMark:function(e){function t(e){var n;return st(this,t),(n=ft(this,dt(t).call(this,e))).configure(),n}return ct(t,e),ut(t,[{key:"name",get:function(){return"watermark"}},{key:"supportedVersion",get:function(){return{min:"0.4.9"}}},{key:"template",get:function(){return We('
>\n<% if(typeof imageLink !== \'undefined\') { %>\n\n<% } %>\n\n<% if(typeof imageLink !== \'undefined\') { %>\n\n<% } %>\n
\n')}}]),ut(t,[{key:"bindEvents",value:function(){this.listenTo(this.container,ne.CONTAINER_PLAY,this.onPlay),this.listenTo(this.container,ne.CONTAINER_STOP,this.onStop),this.listenTo(this.container,ne.CONTAINER_OPTIONS_CHANGE,this.configure)}},{key:"configure",value:function(){this.position=this.options.position||"bottom-right",this.options.watermark?(this.imageUrl=this.options.watermark,this.imageLink=this.options.watermarkLink,this.render()):this.$el.remove()}},{key:"onPlay",value:function(){this.hidden||this.$el.show()}},{key:"onStop",value:function(){this.$el.hide()}},{key:"render",value:function(){this.$el.hide();var e={position:this.position,imageUrl:this.imageUrl,imageLink:this.imageLink};return this.$el.html(this.template(e)),this.container.$el.append(this.$el),this}}]),t}(Se)},an=0,on=Object.values(rn);ane.length)&&(t=e.length);for(var n=0,i=new Array(t);n0}),!1)}e.exports=function(e,t){t=t||{};var r={main:n.m},a=t.all?{main:Object.keys(r.main)}:function(e,t){for(var n={main:[t]},i={main:[]},r={main:{}};s(n);)for(var a=Object.keys(n),l=0;l>>8^255&v^99,e[f]=v,t[v]=f;var m=h[f],y=h[m],A=h[y],b=257*h[v]^16843008*v;i[f]=b<<24|b>>>8,r[f]=b<<16|b>>>16,a[f]=b<<8|b>>>24,o[f]=b,b=16843009*A^65537*y^257*m^16843008*f,l[v]=b<<24|b>>>8,u[v]=b<<16|b>>>16,c[v]=b<<8|b>>>24,d[v]=b,f?(f=m^h[h[h[A^m]]],p^=h[h[p]]):f=p=1}},t.expandKey=function(e){for(var t=this.uint8ArrayToUint32Array_(e),n=!0,i=0;i>>5}function h(e,t){return!!(t+1>>6),!((l=(60&t[n+2])>>>2)>p.length-1))return c=(1&t[n+2])<<2,c|=(192&t[n+3])>>>6,s.logger.log("manifest codec:"+a+",ADTS data:type:"+o+",sampleingIndex:"+l+"["+p[l]+"Hz],channelConfig:"+c),/firefox/i.test(h)?l>=6?(o=5,d=new Array(4),u=l-3):(o=2,d=new Array(2),u=l):-1!==h.indexOf("android")?(o=2,d=new Array(2),u=l):(o=5,d=new Array(4),a&&(-1!==a.indexOf("mp4a.40.29")||-1!==a.indexOf("mp4a.40.5"))||!a&&l>=6?u=l-3:((a&&-1!==a.indexOf("mp4a.40.2")&&(l>=6&&1===c||/vivaldi/i.test(h))||!a&&1===c)&&(o=2,d=new Array(2)),u=l)),d[0]=o<<3,d[0]|=(14&l)>>1,d[1]|=(1&l)<<7,d[1]|=c<<3,5===o&&(d[1]|=(14&u)>>1,d[2]=(1&u)<<7,d[2]|=8,d[3]=0),{config:d,samplerate:p[l],channelCount:c,codec:"mp4a.40."+o,manifestCodec:f};e.trigger(i.default.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+l})}(t,n,a,o);e.config=l.config,e.samplerate=l.samplerate,e.channelCount=l.channelCount,e.codec=l.codec,e.manifestCodec=l.manifestCodec,s.logger.log("parsed codec:"+e.codec+",rate:"+l.samplerate+",nb channel:"+l.channelCount)}}function g(e){return 9216e4/e}function v(e,t,n,i,r){var a=function(e,t,n,i,r){var a,o,s=e.length;if(a=c(e,t),o=d(e,t),(o-=a)>0&&t+a+o<=s)return{headerLength:a,frameLength:o,stamp:n+i*r}}(t,n,i,r,g(e.samplerate));if(a){var o=a.stamp,s=a.headerLength,l=a.frameLength,u={unit:t.subarray(n+s,n+s+l),pts:o,dts:o};return e.samples.push(u),{sample:u,length:l+s}}}var m=n("./src/demux/id3.js"),y=function(){function e(e,t,n){this.observer=e,this.config=n,this.remuxer=t}var t=e.prototype;return t.resetInitSegment=function(e,t,n,i){this._audioTrack={container:"audio/adts",type:"audio",id:0,sequenceNumber:0,isAAC:!0,samples:[],len:0,manifestCodec:t,duration:i,inputTimeScale:9e4}},t.resetTimeStamp=function(){},e.probe=function(e){if(!e)return!1;for(var t=(m.default.getID3Data(e,0)||[]).length,n=e.length;tt.length)){var a=this.parseHeader(t,n);if(a&&n+a.frameLength<=t.length){var o=i+r*(9e4*a.samplesPerFrame/a.sampleRate),s={unit:t.subarray(n,n+a.frameLength),pts:o,dts:o};return e.config=[],e.channelCount=a.channelCount,e.samplerate=a.sampleRate,e.samples.push(s),{sample:s,length:a.frameLength}}}},parseHeader:function(e,t){var n=e[t+1]>>3&3,i=e[t+1]>>1&3,r=e[t+2]>>4&15,a=e[t+2]>>2&3,o=e[t+2]>>1&1;if(1!==n&&0!==r&&15!==r&&3!==a){var s=3===n?3-i:3===i?3:4,l=1e3*b.BitratesMap[14*s+r-1],u=3===n?0:2===n?1:2,c=b.SamplingRateMap[3*u+a],d=e[t+3]>>6==3?1:2,h=b.SamplesCoefficients[n][i],f=b.BytesInSlot[i],p=8*h*f;return{sampleRate:c,channelCount:d,frameLength:parseInt(h*l/c+o,10)*f,samplesPerFrame:p}}},isHeaderPattern:function(e,t){return 255===e[t]&&224==(224&e[t+1])&&0!=(6&e[t+1])},isHeader:function(e,t){return!!(t+1e?(this.word<<=e,this.bitsAvailable-=e):(e-=this.bitsAvailable,e-=(t=e>>3)>>3,this.bytesAvailable-=t,this.loadWord(),this.word<<=e,this.bitsAvailable-=e)},t.readBits=function(e){var t=Math.min(this.bitsAvailable,e),n=this.word>>>32-t;return e>32&&s.logger.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=t,this.bitsAvailable>0?this.word<<=t:this.bytesAvailable>0&&this.loadWord(),(t=e-t)>0&&this.bitsAvailable?n<>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()},t.skipUEG=function(){this.skipBits(1+this.skipLZ())},t.skipEG=function(){this.skipBits(1+this.skipLZ())},t.readUEG=function(){var e=this.skipLZ();return this.readBits(e+1)-1},t.readEG=function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)},t.readBoolean=function(){return 1===this.readBits(1)},t.readUByte=function(){return this.readBits(8)},t.readUShort=function(){return this.readBits(16)},t.readUInt=function(){return this.readBits(32)},t.skipScalingList=function(e){var t,n=8,i=8;for(t=0;t=e.length)return void n();if(!(e[t].unit.length<32)){var i=this.decrypter.isSync();if(this.decryptAacSample(e,t,n,i),!i)return}}},t.getAvcEncryptedData=function(e){for(var t=16*Math.floor((e.length-48)/160)+16,n=new Int8Array(t),i=0,r=32;r<=e.length-16;r+=160,i+=16)n.set(e.subarray(r,r+16),i);return n},t.getAvcDecryptedUnit=function(e,t){t=new Uint8Array(t);for(var n=0,i=32;i<=e.length-16;i+=160,n+=16)e.set(t.subarray(n,n+16),i);return e},t.decryptAvcSample=function(e,t,n,i,r,a){var o=this.discardEPB(r.data),s=this.getAvcEncryptedData(o),l=this;this.decryptBuffer(s.buffer,(function(s){r.data=l.getAvcDecryptedUnit(o,s),a||l.decryptAvcSamples(e,t,n+1,i)}))},t.decryptAvcSamples=function(e,t,n,i){for(;;t++,n=0){if(t>=e.length)return void i();for(var r=e[t].units;!(n>=r.length);n++){var a=r[n];if(!(a.length<=48||1!==a.type&&5!==a.type)){var o=this.decrypter.isSync();if(this.decryptAvcSample(e,t,n,i,a,o),!o)return}}}},e}(),_={video:1,audio:2,id3:3,text:4},S=function(){function e(e,t,n,i){this.observer=e,this.config=n,this.typeSupported=i,this.remuxer=t,this.sampleAes=null}var t=e.prototype;return t.setDecryptData=function(e){null!=e&&null!=e.key&&"SAMPLE-AES"===e.method?this.sampleAes=new k(this.observer,this.config,e,this.discardEPB):this.sampleAes=null},e.probe=function(t){var n=e._syncOffset(t);return!(n<0||(n&&s.logger.warn("MPEG2-TS detected but first sync word found @ offset "+n+", junk ahead ?"),0))},e._syncOffset=function(e){for(var t=Math.min(1e3,e.length-564),n=0;n>4>1){if((d=l+5+t[l+4])===l+188)continue}else d=l+4;switch(c){case A:u&&(k&&(h=R(k))&&O(h,!1),k={data:[],size:0}),k&&(k.data.push(t.subarray(d,l+188)),k.size+=l+188-d);break;case b:u&&(_&&(h=R(_))&&(m.isAAC?L(h):D(h)),_={data:[],size:0}),_&&(_.data.push(t.subarray(d,l+188)),_.size+=l+188-d);break;case E:u&&(S&&(h=R(S))&&I(h),S={data:[],size:0}),S&&(S.data.push(t.subarray(d,l+188)),S.size+=l+188-d);break;case 0:u&&(d+=t[d]+1),T=this._pmtId=C(t,d);break;case T:u&&(d+=t[d]+1);var x=w(t,d,!0===this.typeSupported.mpeg||!0===this.typeSupported.mp3,null!=this.sampleAes);(A=x.avc)>0&&(v.pid=A),(b=x.audio)>0&&(m.pid=b,m.isAAC=x.isAAC),(E=x.id3)>0&&(y.pid=E),p&&!g&&(s.logger.log("reparse from beginning"),p=!1,l=P-188),g=this.pmtParsed=!0;break;case 17:case 8191:break;default:p=!0}}else this.observer.trigger(i.default.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"TS packet did not start with 0x47"});k&&(h=R(k))?(O(h,!0),v.pesData=null):v.pesData=k,_&&(h=R(_))?(m.isAAC?L(h):D(h),m.pesData=null):(_&&_.size&&s.logger.log("last AAC PES packet truncated,might overlap between fragments"),m.pesData=_),S&&(h=R(S))?(I(h),y.pesData=null):y.pesData=S,null==this.sampleAes?this.remuxer.remux(m,v,y,this._txtTrack,n,a,o):this.decryptAndRemux(m,v,y,this._txtTrack,n,a,o)},t.decryptAndRemux=function(e,t,n,i,r,a,o){if(e.samples&&e.isAAC){var s=this;this.sampleAes.decryptAacSamples(e.samples,0,(function(){s.decryptAndRemuxAvc(e,t,n,i,r,a,o)}))}else this.decryptAndRemuxAvc(e,t,n,i,r,a,o)},t.decryptAndRemuxAvc=function(e,t,n,i,r,a,o){if(t.samples){var s=this;this.sampleAes.decryptAvcSamples(t.samples,0,0,(function(){s.remuxer.remux(e,t,n,i,r,a,o)}))}else this.remuxer.remux(e,t,n,i,r,a,o)},t.destroy=function(){this._initPTS=this._initDTS=void 0,this._duration=0},t._parsePAT=function(e,t){return(31&e[t+10])<<8|e[t+11]},t._parsePMT=function(e,t,n,i){var r,a,o={audio:-1,avc:-1,id3:-1,isAAC:!0};for(r=t+3+((15&e[t+1])<<8|e[t+2])-4,t+=12+((15&e[t+10])<<8|e[t+11]);t1;){var h=new Uint8Array(d[0].length+d[1].length);h.set(d[0]),h.set(d[1],d[0].length),d[0]=h,d.splice(1,1)}if(1===((t=d[0])[0]<<16)+(t[1]<<8)+t[2]){if((i=(t[4]<<8)+t[5])&&i>e.size-6)return null;if(192&(n=t[7])&&((o=536870912*(14&t[9])+4194304*(255&t[10])+16384*(254&t[11])+128*(255&t[12])+(254&t[13])/2)>4294967295&&(o-=8589934592),64&n?((l=536870912*(14&t[14])+4194304*(255&t[15])+16384*(254&t[16])+128*(255&t[17])+(254&t[18])/2)>4294967295&&(l-=8589934592),o-l>54e5&&(s.logger.warn(Math.round((o-l)/9e4)+"s delta between PTS and DTS, align them"),o=l)):l=o),u=(r=t[8])+9,e.size<=u)return null;e.size-=u,a=new Uint8Array(e.size);for(var f=0,p=d.length;fg){u-=g;continue}t=t.subarray(u),g-=u,u=0}a.set(t,c),c+=g}return i&&(i-=r+3),{data:a,pts:o,dts:l,len:i}}return null},t.pushAccesUnit=function(e,t){if(e.units.length&&e.frame){var n=t.samples,i=n.length;if(isNaN(e.pts)){if(!i)return void t.dropped++;var r=n[i-1];e.pts=r.pts,e.dts=r.dts}!this.config.forceKeyFrameOnDiscontinuity||!0===e.key||t.sps&&(i||this.contiguous)?(e.id=i,n.push(e)):t.dropped++}e.debug.length&&s.logger.log(e.pts+"/"+e.dts+":"+e.debug)},t._parseAVCPES=function(e,t){var n,i,r,a=this,o=this._avcTrack,s=this._parseAVCNALu(e.data),l=this.avcSample,u=!1,c=this.pushAccesUnit.bind(this),d=function(e,t,n,i){return{key:e,pts:t,dts:n,units:[],debug:i}};e.data=null,l&&s.length&&!o.audFound&&(c(l,o),l=this.avcSample=d(!1,e.pts,e.dts,"")),s.forEach((function(t){switch(t.type){case 1:i=!0,l||(l=a.avcSample=d(!0,e.pts,e.dts,"")),l.frame=!0;var s=t.data;if(u&&s.length>4){var h=new T(s).readSliceType();2!==h&&4!==h&&7!==h&&9!==h||(l.key=!0)}break;case 5:i=!0,l||(l=a.avcSample=d(!0,e.pts,e.dts,"")),l.key=!0,l.frame=!0;break;case 6:i=!0,(n=new T(a.discardEPB(t.data))).readUByte();for(var f=0,p=0,g=!1,v=0;!g&&n.bytesAvailable>1;){f=0;do{f+=v=n.readUByte()}while(255===v);p=0;do{p+=v=n.readUByte()}while(255===v);if(4===f&&0!==n.bytesAvailable){if(g=!0,181===n.readUByte()&&49===n.readUShort()&&1195456820===n.readUInt()&&3===n.readUByte()){var y=n.readUByte(),A=31&y,b=[y,n.readUByte()];for(r=0;r16){var E=[];for(r=0;r<16;r++)E.push(n.readUByte().toString(16)),3!==r&&5!==r&&7!==r&&9!==r||E.push("-");var k=p-16,_=new Uint8Array(k);for(r=0;r0){if(t.pts>=e[n-1].pts)e.push(t);else for(var i=n-1;i>=0;i--)if(t.pts=0)i={data:e.subarray(d,a-l-1),type:r},c.push(i);else{var h=this._getLastNalUnit();if(h&&(u&&a<=4-u&&h.state&&(h.data=h.data.subarray(0,h.data.byteLength-u)),(n=a-l-1)>0)){var f=new Uint8Array(h.data.byteLength+n);f.set(h.data,0),f.set(e.subarray(0,n),h.data.byteLength),h.data=f}}a=0&&l>=0&&(i={data:e.subarray(d,o),type:r,state:l},c.push(i)),0===c.length){var p=this._getLastNalUnit();if(p){var g=new Uint8Array(p.data.byteLength+e.byteLength);g.set(p.data,0),g.set(e,p.data.byteLength),p.data=g}}return s.naluState=l,c},t.discardEPB=function(e){for(var t,n,i=e.byteLength,r=[],a=1;a1&&(s.logger.log("AAC: align PTS for overlapping frames by "+Math.round((E-m)/90)),m=E)}for(;a>24&255,t[1]=i>>16&255,t[2]=i>>8&255,t[3]=255&i,t.set(e,4),r=0,i=8;r>24&255,t>>16&255,t>>8&255,255&t,i>>24,i>>16&255,i>>8&255,255&i,r>>24,r>>16&255,r>>8&255,255&r,85,196,0,0]))},e.mdia=function(t){return e.box(e.types.mdia,e.mdhd(t.timescale,t.duration),e.hdlr(t.type),e.minf(t))},e.mfhd=function(t){return e.box(e.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))},e.minf=function(t){return"audio"===t.type?e.box(e.types.minf,e.box(e.types.smhd,e.SMHD),e.DINF,e.stbl(t)):e.box(e.types.minf,e.box(e.types.vmhd,e.VMHD),e.DINF,e.stbl(t))},e.moof=function(t,n,i){return e.box(e.types.moof,e.mfhd(t),e.traf(i,n))},e.moov=function(t){for(var n=t.length,i=[];n--;)i[n]=e.trak(t[n]);return e.box.apply(null,[e.types.moov,e.mvhd(t[0].timescale,t[0].duration)].concat(i).concat(e.mvex(t)))},e.mvex=function(t){for(var n=t.length,i=[];n--;)i[n]=e.trex(t[n]);return e.box.apply(null,[e.types.mvex].concat(i))},e.mvhd=function(t,n){n*=t;var i=Math.floor(n/(R+1)),r=Math.floor(n%(R+1)),a=new Uint8Array([1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,t>>24&255,t>>16&255,t>>8&255,255&t,i>>24,i>>16&255,i>>8&255,255&i,r>>24,r>>16&255,r>>8&255,255&r,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return e.box(e.types.mvhd,a)},e.sdtp=function(t){var n,i,r=t.samples||[],a=new Uint8Array(4+r.length);for(i=0;i>>8&255),a.push(255&r),a=a.concat(Array.prototype.slice.call(i));for(n=0;n>>8&255),o.push(255&r),o=o.concat(Array.prototype.slice.call(i));var s=e.box(e.types.avcC,new Uint8Array([1,a[3],a[4],a[5],255,224|t.sps.length].concat(a).concat([t.pps.length]).concat(o))),l=t.width,u=t.height,c=t.pixelRatio[0],d=t.pixelRatio[1];return e.box(e.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,l>>8&255,255&l,u>>8&255,255&u,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),s,e.box(e.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])),e.box(e.types.pasp,new Uint8Array([c>>24,c>>16&255,c>>8&255,255&c,d>>24,d>>16&255,d>>8&255,255&d])))},e.esds=function(e){var t=e.config.length;return new Uint8Array([0,0,0,0,3,23+t,0,1,0,4,15+t,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([t]).concat(e.config).concat([6,1,2]))},e.mp4a=function(t){var n=t.samplerate;return e.box(e.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,n>>8&255,255&n,0,0]),e.box(e.types.esds,e.esds(t)))},e.mp3=function(t){var n=t.samplerate;return e.box(e.types[".mp3"],new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,n>>8&255,255&n,0,0]))},e.stsd=function(t){return"audio"===t.type?t.isAAC||"mp3"!==t.codec?e.box(e.types.stsd,e.STSD,e.mp4a(t)):e.box(e.types.stsd,e.STSD,e.mp3(t)):e.box(e.types.stsd,e.STSD,e.avc1(t))},e.tkhd=function(t){var n=t.id,i=t.duration*t.timescale,r=t.width,a=t.height,o=Math.floor(i/(R+1)),s=Math.floor(i%(R+1));return e.box(e.types.tkhd,new Uint8Array([1,0,0,7,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,n>>24&255,n>>16&255,n>>8&255,255&n,0,0,0,0,o>>24,o>>16&255,o>>8&255,255&o,s>>24,s>>16&255,s>>8&255,255&s,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,r>>8&255,255&r,0,0,a>>8&255,255&a,0,0]))},e.traf=function(t,n){var i=e.sdtp(t),r=t.id,a=Math.floor(n/(R+1)),o=Math.floor(n%(R+1));return e.box(e.types.traf,e.box(e.types.tfhd,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r])),e.box(e.types.tfdt,new Uint8Array([1,0,0,0,a>>24,a>>16&255,a>>8&255,255&a,o>>24,o>>16&255,o>>8&255,255&o])),e.trun(t,i.length+16+20+8+16+8+8),i)},e.trak=function(t){return t.duration=t.duration||4294967295,e.box(e.types.trak,e.tkhd(t),e.mdia(t))},e.trex=function(t){var n=t.id;return e.box(e.types.trex,new Uint8Array([0,0,0,0,n>>24,n>>16&255,n>>8&255,255&n,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))},e.trun=function(t,n){var i,r,a,o,s,l,u=t.samples||[],c=u.length,d=12+16*c,h=new Uint8Array(d);for(n+=8+d,h.set([0,0,15,1,c>>>24&255,c>>>16&255,c>>>8&255,255&c,n>>>24&255,n>>>16&255,n>>>8&255,255&n],0),i=0;i>>24&255,a>>>16&255,a>>>8&255,255&a,o>>>24&255,o>>>16&255,o>>>8&255,255&o,s.isLeading<<2|s.dependsOn,s.isDependedOn<<6|s.hasRedundancy<<4|s.paddingValue<<1|s.isNonSync,61440&s.degradPrio,15&s.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*i);return e.box(e.types.trun,h)},e.initSegment=function(t){e.types||e.init();var n,i=e.moov(t);return(n=new Uint8Array(e.FTYP.byteLength+i.byteLength)).set(e.FTYP),n.set(i,e.FTYP.byteLength),n},e}();function L(e,t,n,i){void 0===n&&(n=1),void 0===i&&(i=!1);var r=e*t*n;return i?Math.round(r):r}function D(e,t){return void 0===t&&(t=!1),L(e,1e3,1/9e4,t)}function I(e,t){return void 0===t&&(t=1),L(e,9e4,1/t)}var P,x=I(10),N=I(.2),M=function(){function e(e,t,n,i){this.observer=e,this.config=t,this.typeSupported=n;var r=navigator.userAgent;this.isSafari=i&&i.indexOf("Apple")>-1&&r&&!r.match("CriOS"),this.ISGenerated=!1}var t=e.prototype;return t.destroy=function(){},t.resetTimeStamp=function(e){this._initPTS=this._initDTS=e},t.resetInitSegment=function(){this.ISGenerated=!1},t.remux=function(e,t,n,r,a,o,l){if(this.ISGenerated||this.generateIS(e,t,a),this.ISGenerated){var u=e.samples.length,c=t.samples.length,d=a,h=a;if(u&&c){var f=(e.samples[0].pts-t.samples[0].pts)/t.inputTimeScale;d+=Math.max(0,f),h+=Math.max(0,-f)}if(u){e.timescale||(s.logger.warn("regenerate InitSegment as audio detected"),this.generateIS(e,t,a));var p,g=this.remuxAudio(e,d,o,l);c&&(g&&(p=g.endPTS-g.startPTS),t.timescale||(s.logger.warn("regenerate InitSegment as video detected"),this.generateIS(e,t,a)),this.remuxVideo(t,h,o,p,l))}else if(c){var v=this.remuxVideo(t,h,o,0,l);v&&e.codec&&this.remuxEmptyAudio(e,d,o,v)}}n.samples.length&&this.remuxID3(n,a),r.samples.length&&this.remuxText(r,a),this.observer.trigger(i.default.FRAG_PARSED)},t.generateIS=function(e,t,n){var a,o,l=this.observer,u=e.samples,c=t.samples,d=this.typeSupported,h="audio/mp4",f={},p={tracks:f},g=void 0===this._initPTS;if(g&&(a=o=1/0),e.config&&u.length&&(e.timescale=e.samplerate,s.logger.log("audio sampling rate : "+e.samplerate),e.isAAC||(d.mpeg?(h="audio/mpeg",e.codec=""):d.mp3&&(e.codec="mp3")),f.audio={container:h,codec:e.codec,initSegment:!e.isAAC&&d.mpeg?new Uint8Array:O.initSegment([e]),metadata:{channelCount:e.channelCount}},g&&(a=o=u[0].pts-e.inputTimeScale*n)),t.sps&&t.pps&&c.length){var v=t.inputTimeScale;t.timescale=v,f.video={container:"video/mp4",codec:t.codec,initSegment:O.initSegment([t]),metadata:{width:t.width,height:t.height}},g&&(a=Math.min(a,c[0].pts-v*n),o=Math.min(o,c[0].dts-v*n),this.observer.trigger(i.default.INIT_PTS_FOUND,{initPTS:a}))}Object.keys(f).length?(l.trigger(i.default.FRAG_PARSING_INIT_SEGMENT,p),this.ISGenerated=!0,g&&(this._initPTS=a,this._initDTS=o)):l.trigger(i.default.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"no audio/video samples found"})},t.remuxVideo=function(e,t,n,a,o){var l,u,c,d,h,f,p,g=8,v=e.timescale,m=e.samples,y=[],A=m.length,b=this._PTSNormalize,E=this._initPTS,T=this.nextAvcDts,k=this.isSafari;if(0!==A){k&&(n|=m.length&&T&&(o&&Math.abs(t-T/v)<.1||Math.abs(m[0].pts-T-E)1?s.logger.log("AVC: "+D(w,!0)+" ms hole between fragments detected,filling it"):w<-1&&s.logger.log("AVC: "+D(-w,!0)+" ms overlapping between fragments detected"),h=T,m[0].dts=h,d=Math.max(d-w,T),m[0].pts=d,s.logger.log("Video: PTS/DTS adjusted: "+D(d,!0)+"/"+D(h,!0)+", delta: "+D(w,!0)+" ms")),C=m[m.length-1],p=Math.max(C.dts,0),f=Math.max(C.pts,0,p),k&&(l=Math.round((p-h)/(m.length-1)));for(var R=0,L=0,I=0;I0?V-1:V].dts;if(Z.stretchShortVideoTrack){var J=Z.maxBufferHole,ee=Math.floor(J*v),te=(a?d+a*v:this.nextAudioPts)-K.pts;te>ee?((l=te-Q)<0&&(l=Q),s.logger.log("It is approximately "+D(te,!1)+" ms to the next segment; using duration "+D(l,!1)+" ms for the last video frame.")):l=Q}else l=Q}H=Math.round(K.pts-K.dts)}y.push({size:Y,duration:l,cts:H,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0,dependsOn:K.key?2:1,isNonSync:K.key?0:1}})}this.nextAvcDts=p+l;var ne=e.dropped;if(e.nbNalu=0,e.dropped=0,y.length&&navigator.userAgent.toLowerCase().indexOf("chrome")>-1){var ie=y[0].flags;ie.dependsOn=2,ie.isNonSync=0}e.samples=y,c=O.moof(e.sequenceNumber++,h,e),e.samples=[];var re={data1:c,data2:u,startPTS:d/v,endPTS:(f+l)/v,startDTS:h/v,endDTS:this.nextAvcDts/v,type:"video",hasAudio:!1,hasVideo:!0,nb:y.length,dropped:ne};return this.observer.trigger(i.default.FRAG_PARSING_DATA,re),re}},t.remuxAudio=function(e,t,n,a){var o,l,u,c,d,h,f=e.inputTimeScale,p=e.timescale,g=f/p,v=(e.isAAC?1024:1152)*g,m=this._PTSNormalize,y=this._initPTS,A=!e.isAAC&&this.typeSupported.mpeg,b=A?0:8,E=e.samples,T=[],k=this.nextAudioPts;if(n|=E.length&&k&&(a&&Math.abs(t-k/f)<.1||Math.abs(E[0].pts-k-y)<20*v),E.forEach((function(e){e.pts=e.dts=m(e.pts-y,t*f)})),0!==(E=E.filter((function(e){return e.pts>=0}))).length){if(n||(k=a?t*f:E[0].pts),e.isAAC)for(var _=this.config.maxAudioFramesDrift,S=0,C=k;S=_*v&&R0&&G0&&((l=w.getSilentFrame(e.manifestCodec||e.codec,e.channelCount))||(l=V.subarray()),F+=Y*l.length);else if(G<-12){s.logger.log("drop overlapping AAC sample, expected/parsed/delta: "+D(k,!0)+" ms / "+D(K,!0)+" ms / "+D(-G,!0)+" ms"),F-=V.byteLength;continue}K=k}if(d=K,!(F>0))return;F+=b;try{u=new Uint8Array(F)}catch(e){return void this.observer.trigger(i.default.ERROR,{type:r.ErrorTypes.MUX_ERROR,details:r.ErrorDetails.REMUX_ALLOC_ERROR,fatal:!1,bytes:F,reason:"fail allocating audio mdat "+F})}A||(new DataView(u.buffer).setUint32(0,F),u.set(O.types.mdat,4));for(var H=0;H=2&&(z=T[M-2].duration,o.duration=z),M){this.nextAudioPts=k=h+g*z,e.samples=T,c=A?new Uint8Array:O.moof(e.sequenceNumber++,d/g,e),e.samples=[];var W=d/f,q=k/f,X={data1:c,data2:u,startPTS:W,endPTS:q,startDTS:W,endDTS:q,type:"audio",hasAudio:!0,hasVideo:!1,nb:M};return this.observer.trigger(i.default.FRAG_PARSING_DATA,X),X}return null}},t.remuxEmptyAudio=function(e,t,n,i){var r=e.inputTimeScale,a=r/(e.samplerate?e.samplerate:r),o=this.nextAudioPts,l=(void 0!==o?o:i.startDTS*r)+this._initDTS,u=i.endDTS*r+this._initDTS,c=1024*a,d=Math.ceil((u-l)/c),h=w.getSilentFrame(e.manifestCodec||e.codec,e.channelCount);if(s.logger.warn("remux empty Audio"),h){for(var f=[],p=0;p4294967296;)e+=n;return e},e}(),F=function(){function e(e){this.observer=e}var t=e.prototype;return t.destroy=function(){},t.resetTimeStamp=function(){},t.resetInitSegment=function(){},t.remux=function(e,t,n,r,a,o,s,l){var u=this.observer,c="";e&&(c+="audio"),t&&(c+="video"),u.trigger(i.default.FRAG_PARSING_DATA,{data1:l,startPTS:a,startDTS:a,type:c,hasAudio:!!e,hasVideo:!!t,nb:1,dropped:0}),u.trigger(i.default.FRAG_PARSED)},e}(),B=Object(l.getSelfScope)();try{P=B.performance.now.bind(B.performance)}catch(e){s.logger.debug("Unable to use Performance API on this environment"),P=B.Date.now}var U=function(){function e(e,t,n,i){this.observer=e,this.typeSupported=t,this.config=n,this.vendor=i}var t=e.prototype;return t.destroy=function(){var e=this.demuxer;e&&e.destroy()},t.push=function(e,t,n,r,o,s,l,u,c,d,h,f){var p=this;if(e.byteLength>0&&null!=t&&null!=t.key&&"AES-128"===t.method){var g=this.decrypter;null==g&&(g=this.decrypter=new a.default(this.observer,this.config));var v=P();g.decrypt(e,t.key.buffer,t.iv.buffer,(function(e){var a=P();p.observer.trigger(i.default.FRAG_DECRYPTED,{stats:{tstart:v,tdecrypt:a}}),p.pushDecrypted(new Uint8Array(e),t,new Uint8Array(n),r,o,s,l,u,c,d,h,f)}))}else this.pushDecrypted(new Uint8Array(e),t,new Uint8Array(n),r,o,s,l,u,c,d,h,f)},t.pushDecrypted=function(e,t,n,a,o,s,l,u,c,d,h,f){var p=this.demuxer;if(!p||(l||u)&&!this.probe(e)){for(var g=this.observer,v=this.typeSupported,m=this.config,b=[{demux:S,remux:M},{demux:A.default,remux:F},{demux:y,remux:M},{demux:C,remux:M}],E=0,T=b.length;E1?n-1:0),r=1;r1?n-1:0),r=1;r0)return t.subarray(i,i+r)},e._readSize=function(e,t){var n=0;return n=(127&e[t])<<21,n|=(127&e[t+1])<<14,n|=(127&e[t+2])<<7,n|=127&e[t+3]},e.getTimeStamp=function(t){for(var n=e.getID3Frames(t),i=0;i>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:c+=String.fromCharCode(a);break;case 12:case 13:s=e[d++],c+=String.fromCharCode((31&a)<<6|63&s);break;case 14:s=e[d++],l=e[d++],c+=String.fromCharCode((15&a)<<12|(63&s)<<6|(63&l)<<0)}}return c},e}();function o(){var e=Object(r.getSelfScope)();return i||void 0===e.TextDecoder||(i=new e.TextDecoder("utf-8")),i}var s=a._utf8ArrayToStr;t.default=a},"./src/demux/mp4demuxer.js": -/*!*********************************!*\ - !*** ./src/demux/mp4demuxer.js ***! - \*********************************/ -/*! exports provided: default */function(e,t,n){n.r(t);var i=n(/*! ../utils/logger */"./src/utils/logger.js"),r=n(/*! ../events */"./src/events.js"),a=Math.pow(2,32)-1,o=function(){function e(e,t){this.observer=e,this.remuxer=t}var t=e.prototype;return t.resetTimeStamp=function(e){this.initPTS=e},t.resetInitSegment=function(t,n,i,a){if(t&&t.byteLength){var o=this.initData=e.parseInitSegment(t);null==n&&(n="mp4a.40.5"),null==i&&(i="avc1.42e01e");var s={};o.audio&&o.video?s.audiovideo={container:"video/mp4",codec:n+","+i,initSegment:a?t:null}:(o.audio&&(s.audio={container:"audio/mp4",codec:n,initSegment:a?t:null}),o.video&&(s.video={container:"video/mp4",codec:i,initSegment:a?t:null})),this.observer.trigger(r.default.FRAG_PARSING_INIT_SEGMENT,{tracks:s})}else n&&(this.audioCodec=n),i&&(this.videoCodec=i)},e.probe=function(t){return e.findBox({data:t,start:0,end:Math.min(t.length,16384)},["moof"]).length>0},e.bin2str=function(e){return String.fromCharCode.apply(null,e)},e.readUint16=function(e,t){e.data&&(t+=e.start,e=e.data);var n=e[t]<<8|e[t+1];return n<0?65536+n:n},e.readUint32=function(e,t){e.data&&(t+=e.start,e=e.data);var n=e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3];return n<0?4294967296+n:n},e.writeUint32=function(e,t,n){e.data&&(t+=e.start,e=e.data),e[t]=n>>24,e[t+1]=n>>16&255,e[t+2]=n>>8&255,e[t+3]=255&n},e.findBox=function(t,n){var i,r,a,o,s,l,u=[];if(t.data?(s=t.start,a=t.end,t=t.data):(s=0,a=t.byteLength),!n.length)return null;for(i=s;i1?i+r:a,e.bin2str(t.subarray(i+4,i+8))===n[0]&&(1===n.length?u.push({data:t,start:i+8,end:l}):(o=e.findBox({data:t,start:i+8,end:l},n.slice(1))).length&&(u=u.concat(o))),i=l;return u},e.parseSegmentIndex=function(t){var n,i=e.findBox(t,["moov"])[0],r=i?i.end:null,a=0,o=e.findBox(t,["sidx"]);if(!o||!o[0])return null;n=[];var s=(o=o[0]).data[0];a=0===s?8:16;var l=e.readUint32(o,a);a+=4,a+=0===s?8:16,a+=2;var u=o.end+0,c=e.readUint16(o,a);a+=2;for(var d=0;d>>31)return void console.warn("SIDX has hierarchical references (not supported)");var g=e.readUint32(o,h);h+=4,n.push({referenceSize:p,subsegmentDuration:g,info:{duration:g/l,start:u,end:u+p-1}}),u+=p,a=h+=4}return{earliestPresentationTime:0,timescale:l,version:s,referencesCount:c,references:n,moovEndOffset:r}},e.parseInitSegment=function(t){var n=[];return e.findBox(t,["moov","trak"]).forEach((function(t){var r=e.findBox(t,["tkhd"])[0];if(r){var a=r.data[r.start],o=0===a?12:20,s=e.readUint32(r,o),l=e.findBox(t,["mdia","mdhd"])[0];if(l){o=0===(a=l.data[l.start])?12:20;var u=e.readUint32(l,o),c=e.findBox(t,["mdia","hdlr"])[0];if(c){var d={soun:"audio",vide:"video"}[e.bin2str(c.data.subarray(c.start+8,c.start+12))];if(d){var h=e.findBox(t,["mdia","minf","stbl","stsd"]);if(h.length){h=h[0];var f=e.bin2str(h.data.subarray(h.start+12,h.start+16));i.logger.log("MP4Demuxer:"+d+":"+f+" found")}n[s]={timescale:u,type:d},n[d]={timescale:u,id:s}}}}}})),n},e.getStartDTS=function(t,n){var i,r,a;return i=e.findBox(n,["moof","traf"]),r=[].concat.apply([],i.map((function(n){return e.findBox(n,["tfhd"]).map((function(i){var r,a;return r=e.readUint32(i,4),a=t[r].timescale||9e4,e.findBox(n,["tfdt"]).map((function(t){var n,i;return n=t.data[t.start],i=e.readUint32(t,4),1===n&&(i*=Math.pow(2,32),i+=e.readUint32(t,8)),i}))[0]/a}))}))),a=Math.min.apply(null,r),isFinite(a)?a:0},e.offsetStartDTS=function(t,n,i){e.findBox(n,["moof","traf"]).map((function(n){return e.findBox(n,["tfhd"]).map((function(r){var o=e.readUint32(r,4),s=t[o].timescale||9e4;e.findBox(n,["tfdt"]).map((function(t){var n=t.data[t.start],r=e.readUint32(t,4);if(0===n)e.writeUint32(t,4,r-i*s);else{r*=Math.pow(2,32),r+=e.readUint32(t,8),r-=i*s,r=Math.max(r,0);var o=Math.floor(r/(a+1)),l=Math.floor(r%(a+1));e.writeUint32(t,4,o),e.writeUint32(t,8,l)}}))}))}))},t.append=function(t,n,i,a){var o=this.initData;o||(this.resetInitSegment(t,this.audioCodec,this.videoCodec,!1),o=this.initData);var s,l=this.initPTS;if(void 0===l){var u=e.getStartDTS(o,t);this.initPTS=l=u-n,this.observer.trigger(r.default.INIT_PTS_FOUND,{initPTS:l})}e.offsetStartDTS(o,t,l),s=e.getStartDTS(o,t),this.remuxer.remux(o.audio,o.video,null,null,s,i,a,t)},t.destroy=function(){},e}();t.default=o},"./src/errors.ts": -/*!***********************!*\ - !*** ./src/errors.ts ***! - \***********************/ -/*! exports provided: ErrorTypes, ErrorDetails */function(e,t,n){var i,r;n.r(t),n.d(t,"ErrorTypes",(function(){return i})),n.d(t,"ErrorDetails",(function(){return r})),function(e){e.NETWORK_ERROR="networkError",e.MEDIA_ERROR="mediaError",e.KEY_SYSTEM_ERROR="keySystemError",e.MUX_ERROR="muxError",e.OTHER_ERROR="otherError"}(i||(i={})),function(e){e.KEY_SYSTEM_NO_KEYS="keySystemNoKeys",e.KEY_SYSTEM_NO_ACCESS="keySystemNoAccess",e.KEY_SYSTEM_NO_SESSION="keySystemNoSession",e.KEY_SYSTEM_LICENSE_REQUEST_FAILED="keySystemLicenseRequestFailed",e.KEY_SYSTEM_NO_INIT_DATA="keySystemNoInitData",e.MANIFEST_LOAD_ERROR="manifestLoadError",e.MANIFEST_LOAD_TIMEOUT="manifestLoadTimeOut",e.MANIFEST_PARSING_ERROR="manifestParsingError",e.MANIFEST_INCOMPATIBLE_CODECS_ERROR="manifestIncompatibleCodecsError",e.LEVEL_LOAD_ERROR="levelLoadError",e.LEVEL_LOAD_TIMEOUT="levelLoadTimeOut",e.LEVEL_SWITCH_ERROR="levelSwitchError",e.AUDIO_TRACK_LOAD_ERROR="audioTrackLoadError",e.AUDIO_TRACK_LOAD_TIMEOUT="audioTrackLoadTimeOut",e.FRAG_LOAD_ERROR="fragLoadError",e.FRAG_LOAD_TIMEOUT="fragLoadTimeOut",e.FRAG_DECRYPT_ERROR="fragDecryptError",e.FRAG_PARSING_ERROR="fragParsingError",e.REMUX_ALLOC_ERROR="remuxAllocError",e.KEY_LOAD_ERROR="keyLoadError",e.KEY_LOAD_TIMEOUT="keyLoadTimeOut",e.BUFFER_ADD_CODEC_ERROR="bufferAddCodecError",e.BUFFER_APPEND_ERROR="bufferAppendError",e.BUFFER_APPENDING_ERROR="bufferAppendingError",e.BUFFER_STALLED_ERROR="bufferStalledError",e.BUFFER_FULL_ERROR="bufferFullError",e.BUFFER_SEEK_OVER_HOLE="bufferSeekOverHole",e.BUFFER_NUDGE_ON_STALL="bufferNudgeOnStall",e.INTERNAL_EXCEPTION="internalException"}(r||(r={}))},"./src/events.js": -/*!***********************!*\ - !*** ./src/events.js ***! - \***********************/ -/*! exports provided: default */function(e,t,n){n.r(t),t.default={MEDIA_ATTACHING:"hlsMediaAttaching",MEDIA_ATTACHED:"hlsMediaAttached",MEDIA_DETACHING:"hlsMediaDetaching",MEDIA_DETACHED:"hlsMediaDetached",BUFFER_RESET:"hlsBufferReset",BUFFER_CODECS:"hlsBufferCodecs",BUFFER_CREATED:"hlsBufferCreated",BUFFER_APPENDING:"hlsBufferAppending",BUFFER_APPENDED:"hlsBufferAppended",BUFFER_EOS:"hlsBufferEos",BUFFER_FLUSHING:"hlsBufferFlushing",BUFFER_FLUSHED:"hlsBufferFlushed",MANIFEST_LOADING:"hlsManifestLoading",MANIFEST_LOADED:"hlsManifestLoaded",MANIFEST_PARSED:"hlsManifestParsed",LEVEL_SWITCHING:"hlsLevelSwitching",LEVEL_SWITCHED:"hlsLevelSwitched",LEVEL_LOADING:"hlsLevelLoading",LEVEL_LOADED:"hlsLevelLoaded",LEVEL_UPDATED:"hlsLevelUpdated",LEVEL_PTS_UPDATED:"hlsLevelPtsUpdated",AUDIO_TRACKS_UPDATED:"hlsAudioTracksUpdated",AUDIO_TRACK_SWITCHING:"hlsAudioTrackSwitching",AUDIO_TRACK_SWITCHED:"hlsAudioTrackSwitched",AUDIO_TRACK_LOADING:"hlsAudioTrackLoading",AUDIO_TRACK_LOADED:"hlsAudioTrackLoaded",SUBTITLE_TRACKS_UPDATED:"hlsSubtitleTracksUpdated",SUBTITLE_TRACK_SWITCH:"hlsSubtitleTrackSwitch",SUBTITLE_TRACK_LOADING:"hlsSubtitleTrackLoading",SUBTITLE_TRACK_LOADED:"hlsSubtitleTrackLoaded",SUBTITLE_FRAG_PROCESSED:"hlsSubtitleFragProcessed",INIT_PTS_FOUND:"hlsInitPtsFound",FRAG_LOADING:"hlsFragLoading",FRAG_LOAD_PROGRESS:"hlsFragLoadProgress",FRAG_LOAD_EMERGENCY_ABORTED:"hlsFragLoadEmergencyAborted",FRAG_LOADED:"hlsFragLoaded",FRAG_DECRYPTED:"hlsFragDecrypted",FRAG_PARSING_INIT_SEGMENT:"hlsFragParsingInitSegment",FRAG_PARSING_USERDATA:"hlsFragParsingUserdata",FRAG_PARSING_METADATA:"hlsFragParsingMetadata",FRAG_PARSING_DATA:"hlsFragParsingData",FRAG_PARSED:"hlsFragParsed",FRAG_BUFFERED:"hlsFragBuffered",FRAG_CHANGED:"hlsFragChanged",FPS_DROP:"hlsFpsDrop",FPS_DROP_LEVEL_CAPPING:"hlsFpsDropLevelCapping",ERROR:"hlsError",DESTROYING:"hlsDestroying",KEY_LOADING:"hlsKeyLoading",KEY_LOADED:"hlsKeyLoaded",STREAM_STATE_TRANSITION:"hlsStreamStateTransition",LIVE_BACK_BUFFER_REACHED:"hlsLiveBackBufferReached"}},"./src/hls.ts": -/*!*********************************!*\ - !*** ./src/hls.ts + 50 modules ***! - \*********************************/ -/*! exports provided: default */ -/*! ModuleConcatenation bailout: Cannot concat with ./src/crypt/decrypter.js because of ./src/demux/demuxer-worker.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./src/demux/demuxer-inline.js because of ./src/demux/demuxer-worker.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./src/demux/id3.js because of ./src/demux/demuxer-worker.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./src/demux/mp4demuxer.js because of ./src/demux/demuxer-worker.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./src/errors.ts because of ./src/demux/demuxer-worker.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./src/events.js because of ./src/demux/demuxer-worker.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./src/polyfills/number-isFinite.js because of ./src/demux/demuxer-worker.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./src/utils/get-self-scope.js because of ./src/demux/demuxer-worker.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./src/utils/logger.js because of ./src/demux/demuxer-worker.js */ -/*! ModuleConcatenation bailout: Cannot concat with ./node_modules/eventemitter3/index.js (<- Module is not an ECMAScript module) */ -/*! ModuleConcatenation bailout: Cannot concat with ./node_modules/url-toolkit/src/url-toolkit.js (<- Module is not an ECMAScript module) */function(e,t,n){n.r(t);var i={};n.r(i),n.d(i,"newCue",(function(){return vt}));var r,a,o=n("./node_modules/url-toolkit/src/url-toolkit.js"),s=n("./src/errors.ts"),l=n("./src/polyfills/number-isFinite.js"),u=n("./src/events.js"),c=n("./src/utils/logger.js"),d={hlsEventGeneric:!0,hlsHandlerDestroying:!0,hlsHandlerDestroyed:!0},h=function(){function e(e){this.hls=void 0,this.handledEvents=void 0,this.useGenericHandler=void 0,this.hls=e,this.onEvent=this.onEvent.bind(this);for(var t=arguments.length,n=new Array(t>1?t-1:0),i=1;i>8*(15-n)&255;return t},r.setDecryptDataFromLevelKey=function(e,t){var n=e;return e&&e.method&&e.uri&&!e.iv&&((n=new v(e.baseuri,e.reluri)).method=e.method,n.iv=this.createInitializationVector(t)),n},t=e,(n=[{key:"url",get:function(){return!this._url&&this.relurl&&(this._url=Object(o.buildAbsoluteURL)(this.baseurl,this.relurl,{alwaysNormalize:!0})),this._url},set:function(e){this._url=e}},{key:"byteRange",get:function(){return this._byteRange?this._byteRange:[]}},{key:"byteRangeStartOffset",get:function(){return this.byteRange[0]}},{key:"byteRangeEndOffset",get:function(){return this.byteRange[1]}},{key:"decryptdata",get:function(){if(!this.levelkey&&!this._decryptdata)return null;if(!this._decryptdata&&this.levelkey){var e=this.sn;"number"!=typeof e&&(this.levelkey&&"AES-128"===this.levelkey.method&&!this.levelkey.iv&&c.logger.warn('missing IV for initialization segment with method="'+this.levelkey.method+'" - compliance issue'),e=0),this._decryptdata=this.setDecryptDataFromLevelKey(this.levelkey,e)}return this._decryptdata}},{key:"endProgramDateTime",get:function(){if(null===this.programDateTime)return null;if(!Object(l.isFiniteNumber)(this.programDateTime))return null;var e=Object(l.isFiniteNumber)(this.duration)?this.duration:0;return this.programDateTime+1e3*e}},{key:"encrypted",get:function(){return!(!this.decryptdata||null===this.decryptdata.uri||null!==this.decryptdata.key)}}])&&m(t.prototype,n),i&&m(t,i),e}();function A(e,t){for(var n=0;nNumber.MAX_SAFE_INTEGER?1/0:t},t.hexadecimalInteger=function(e){if(this[e]){var t=(this[e]||"0x").slice(2);t=(1&t.length?"0":"")+t;for(var n=new Uint8Array(t.length/2),i=0;iNumber.MAX_SAFE_INTEGER?1/0:t},t.decimalFloatingPoint=function(e){return parseFloat(this[e])},t.enumeratedString=function(e){return this[e]},t.decimalResolution=function(e){var t=E.exec(this[e]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}},e.parseAttrList=function(e){var t,n={};for(T.lastIndex=0;null!==(t=T.exec(e));){var i=t[2];0===i.indexOf('"')&&i.lastIndexOf('"')===i.length-1&&(i=i.slice(1,-1)),n[t[1]]=i}return n},e}(),_={audio:{a3ds:!0,"ac-3":!0,"ac-4":!0,alac:!0,alaw:!0,dra1:!0,"dts+":!0,"dts-":!0,dtsc:!0,dtse:!0,dtsh:!0,"ec-3":!0,enca:!0,g719:!0,g726:!0,m4ae:!0,mha1:!0,mha2:!0,mhm1:!0,mhm2:!0,mlpa:!0,mp4a:!0,"raw ":!0,Opus:!0,samr:!0,sawb:!0,sawp:!0,sevc:!0,sqcp:!0,ssmv:!0,twos:!0,ulaw:!0},video:{avc1:!0,avc2:!0,avc3:!0,avc4:!0,avcp:!0,drac:!0,dvav:!0,dvhe:!0,encv:!0,hev1:!0,hvc1:!0,mjp2:!0,mp4v:!0,mvc1:!0,mvc2:!0,mvc3:!0,mvc4:!0,resv:!0,rv60:!0,s263:!0,svc1:!0,svc2:!0,"vc-1":!0,vp08:!0,vp09:!0}};function S(e,t){return MediaSource.isTypeSupported((t||"video")+'/mp4;codecs="'+e+'"')}var C=/#EXT-X-STREAM-INF:([^\n\r]*)[\r\n]+([^\r\n]+)/g,w=/#EXT-X-MEDIA:(.*)/g,R=new RegExp([/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source,/|(?!#)([\S+ ?]+)/.source,/|#EXT-X-BYTERANGE:*(.+)/.source,/|#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,/|#.*/.source].join(""),"g"),O=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE): *(\d+))|(?:#EXT-X-(TARGETDURATION): *(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DISCONTINUITY-SEQ)UENCE:(\d+))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-("0.4.0"):(\d+))|(?:#EXT-X-(MAP):(.+))|(?:(#)([^:]*):(.*))|(?:(#)(.*))(?:.*)\r?\n?/,L=/\.(mp4|m4s|m4v|m4a)$/i,D=function(){function e(){}return e.findGroup=function(e,t){for(var n=0;n2?(t=n.shift()+".",t+=parseInt(n.shift()).toString(16),t+=("000"+parseInt(n.shift()).toString(16)).substr(-4)):t=e,t},e.resolve=function(e,t){return o.buildAbsoluteURL(t,e,{alwaysNormalize:!0})},e.parseMasterPlaylist=function(t,n){var i,r=[];function a(e,t){["video","audio"].forEach((function(n){var i=e.filter((function(e){return function(e,t){var n=_[t];return!!n&&!0===n[e.slice(0,4)]}(e,n)}));if(i.length){var r=i.filter((function(e){return 0===e.lastIndexOf("avc1",0)||0===e.lastIndexOf("mp4a",0)}));t[n+"Codec"]=r.length>0?r[0]:i[0],e=e.filter((function(e){return-1===i.indexOf(e)}))}})),t.unknownCodecs=e}for(C.lastIndex=0;null!=(i=C.exec(t));){var o={},s=o.attrs=new k(i[1]);o.url=e.resolve(i[2],n);var l=s.decimalResolution("RESOLUTION");l&&(o.width=l.width,o.height=l.height),o.bitrate=s.decimalInteger("AVERAGE-BANDWIDTH")||s.decimalInteger("BANDWIDTH"),o.name=s.NAME,a([].concat((s.CODECS||"").split(/[ ,]+/)),o),o.videoCodec&&-1!==o.videoCodec.indexOf("avc1")&&(o.videoCodec=e.convertAVC1ToAVCOTI(o.videoCodec)),r.push(o)}return r},e.parseMasterPlaylistMedia=function(t,n,i,r){var a;void 0===r&&(r=[]);var o=[],s=0;for(w.lastIndex=0;null!==(a=w.exec(t));){var l=new k(a[1]);if(l.TYPE===i){var u={id:s++,groupId:l["GROUP-ID"],name:l.NAME||l.LANGUAGE,type:i,default:"YES"===l.DEFAULT,autoselect:"YES"===l.AUTOSELECT,forced:"YES"===l.FORCED,lang:l.LANGUAGE};if(l.URI&&(u.url=e.resolve(l.URI,n)),r.length){var c=e.findGroup(r,u.groupId);u.audioCodec=c?c.codec:r[0].codec}o.push(u)}}return o},e.parseLevelPlaylist=function(e,t,n,i,r){var a,o,s,u=0,d=0,h=new b(t),f=0,p=null,g=new y,m=null;for(R.lastIndex=0;null!==(a=R.exec(e));){var A=a[1];if(A){g.duration=parseFloat(A);var E=(" "+a[2]).slice(1);g.title=E||null,g.tagList.push(E?["INF",A,E]:["INF",A])}else if(a[3]){if(Object(l.isFiniteNumber)(g.duration)){var T=u++;g.type=i,g.start=d,s&&(g.levelkey=s),g.sn=T,g.level=n,g.cc=f,g.urlId=r,g.baseurl=t,g.relurl=(" "+a[3]).slice(1),I(g,p),h.fragments.push(g),p=g,d+=g.duration,g=new y}}else if(a[4]){var _=(" "+a[4]).slice(1);p?g.setByteRange(_,p):g.setByteRange(_)}else if(a[5])g.rawProgramDateTime=(" "+a[5]).slice(1),g.tagList.push(["PROGRAM-DATE-TIME",g.rawProgramDateTime]),null===m&&(m=h.fragments.length);else{if(!(a=a[0].match(O))){c.logger.warn("No matches on slow regex match for level playlist!");continue}for(o=1;o=0&&(s.method=D,s.key=null,s.iv=x));break;case"START":var N=new k(S).decimalFloatingPoint("TIME-OFFSET");Object(l.isFiniteNumber)(N)&&(h.startTimeOffset=N);break;case"MAP":var M=new k(S);g.relurl=M.URI,M.BYTERANGE&&g.setByteRange(M.BYTERANGE),g.baseurl=t,g.level=n,g.type=i,g.sn="initSegment",h.initSegment=g,(g=new y).rawProgramDateTime=h.initSegment.rawProgramDateTime;break;default:c.logger.warn("line parsed but not handled: "+a)}}}return(g=p)&&!g.relurl&&(h.fragments.pop(),d-=g.duration),h.totalduration=d,h.averagetargetduration=d/h.fragments.length,h.endSN=u-1,h.startCC=h.fragments[0]?h.fragments[0].cc:0,h.endCC=f,!h.initSegment&&h.fragments.length&&h.fragments.every((function(e){return L.test(e.relurl)}))&&(c.logger.warn("MP4 fragments found but no init segment (probably no MAP, incomplete M3U8), trying to fetch SIDX"),(g=new y).relurl=h.fragments[0].relurl,g.baseurl=t,g.level=n,g.type=i,g.sn="initSegment",h.initSegment=g,h.needSidxRanges=!0),m&&function(e,t){for(var n=e[t],i=t-1;i>=0;i--){var r=e[i];r.programDateTime=n.programDateTime-1e3*r.duration,n=r}}(h.fragments,m),h},e}();function I(e,t){e.rawProgramDateTime?e.programDateTime=Date.parse(e.rawProgramDateTime):t&&t.programDateTime&&(e.programDateTime=t.endProgramDateTime),Object(l.isFiniteNumber)(e.programDateTime)||(e.programDateTime=null,e.rawProgramDateTime=null)}var P=window.performance,x=function(e){var t,n;function i(t){var n;return(n=e.call(this,t,u.default.MANIFEST_LOADING,u.default.LEVEL_LOADING,u.default.AUDIO_TRACK_LOADING,u.default.SUBTITLE_TRACK_LOADING)||this).loaders={},n}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,i.canHaveQualityLevels=function(e){return e!==r.AUDIO_TRACK&&e!==r.SUBTITLE_TRACK},i.mapContextToLevelType=function(e){switch(e.type){case r.AUDIO_TRACK:return a.AUDIO;case r.SUBTITLE_TRACK:return a.SUBTITLE;default:return a.MAIN}},i.getResponseUrl=function(e,t){var n=e.url;return void 0!==n&&0!==n.indexOf("data:")||(n=t.url),n};var o=i.prototype;return o.createInternalLoader=function(e){var t=this.hls.config,n=t.pLoader,i=t.loader,r=new(n||i)(t);return e.loader=r,this.loaders[e.type]=r,r},o.getInternalLoader=function(e){return this.loaders[e.type]},o.resetInternalLoader=function(e){this.loaders[e]&&delete this.loaders[e]},o.destroyInternalLoaders=function(){for(var e in this.loaders){var t=this.loaders[e];t&&t.destroy(),this.resetInternalLoader(e)}},o.destroy=function(){this.destroyInternalLoaders(),e.prototype.destroy.call(this)},o.onManifestLoading=function(e){this.load({url:e.url,type:r.MANIFEST,level:0,id:null,responseType:"text"})},o.onLevelLoading=function(e){this.load({url:e.url,type:r.LEVEL,level:e.level,id:e.id,responseType:"text"})},o.onAudioTrackLoading=function(e){this.load({url:e.url,type:r.AUDIO_TRACK,level:null,id:e.id,responseType:"text"})},o.onSubtitleTrackLoading=function(e){this.load({url:e.url,type:r.SUBTITLE_TRACK,level:null,id:e.id,responseType:"text"})},o.load=function(e){var t=this.hls.config;c.logger.debug("Loading playlist of type "+e.type+", level: "+e.level+", id: "+e.id);var n,i,a,o,s=this.getInternalLoader(e);if(s){var l=s.context;if(l&&l.url===e.url)return c.logger.trace("playlist request ongoing"),!1;c.logger.warn("aborting previous loader for type: "+e.type),s.abort()}switch(e.type){case r.MANIFEST:n=t.manifestLoadingMaxRetry,i=t.manifestLoadingTimeOut,a=t.manifestLoadingRetryDelay,o=t.manifestLoadingMaxRetryTimeout;break;case r.LEVEL:n=0,o=0,a=0,i=t.levelLoadingTimeOut;break;default:n=t.levelLoadingMaxRetry,i=t.levelLoadingTimeOut,a=t.levelLoadingRetryDelay,o=t.levelLoadingMaxRetryTimeout}s=this.createInternalLoader(e);var u={timeout:i,maxRetry:n,retryDelay:a,maxRetryDelay:o},d={onSuccess:this.loadsuccess.bind(this),onError:this.loaderror.bind(this),onTimeout:this.loadtimeout.bind(this)};return c.logger.debug("Calling internal loader delegate for URL: "+e.url),s.load(e,u,d),!0},o.loadsuccess=function(e,t,n,i){if(void 0===i&&(i=null),n.isSidxRequest)return this._handleSidxRequest(e,n),void this._handlePlaylistLoaded(e,t,n,i);if(this.resetInternalLoader(n.type),"string"!=typeof e.data)throw new Error('expected responseType of "text" for PlaylistLoader');var r=e.data;t.tload=P.now(),0===r.indexOf("#EXTM3U")?r.indexOf("#EXTINF:")>0||r.indexOf("#EXT-X-TARGETDURATION:")>0?this._handleTrackOrLevelPlaylist(e,t,n,i):this._handleMasterPlaylist(e,t,n,i):this._handleManifestParsingError(e,n,"no EXTM3U delimiter",i)},o.loaderror=function(e,t,n){void 0===n&&(n=null),this._handleNetworkError(t,n,!1,e)},o.loadtimeout=function(e,t,n){void 0===n&&(n=null),this._handleNetworkError(t,n,!0)},o._handleMasterPlaylist=function(e,t,n,r){var a=this.hls,o=e.data,s=i.getResponseUrl(e,n),l=D.parseMasterPlaylist(o,s);if(l.length){var d=l.map((function(e){return{id:e.attrs.AUDIO,codec:e.audioCodec}})),h=D.parseMasterPlaylistMedia(o,s,"AUDIO",d),f=D.parseMasterPlaylistMedia(o,s,"SUBTITLES");if(h.length){var p=!1;h.forEach((function(e){e.url||(p=!0)})),!1===p&&l[0].audioCodec&&!l[0].attrs.AUDIO&&(c.logger.log("audio codec signaled in quality level, but no embedded audio track signaled, create one"),h.unshift({type:"main",name:"main",default:!1,autoselect:!1,forced:!1,id:-1}))}a.trigger(u.default.MANIFEST_LOADED,{levels:l,audioTracks:h,subtitles:f,url:s,stats:t,networkDetails:r})}else this._handleManifestParsingError(e,n,"no level found in manifest",r)},o._handleTrackOrLevelPlaylist=function(e,t,n,a){var o=this.hls,s=n.id,c=n.level,d=n.type,h=i.getResponseUrl(e,n),f=Object(l.isFiniteNumber)(s)?s:0,p=Object(l.isFiniteNumber)(c)?c:f,g=i.mapContextToLevelType(n),v=D.parseLevelPlaylist(e.data,h,p,g,f);if(v.tload=t.tload,d===r.MANIFEST){var m={url:h,details:v};o.trigger(u.default.MANIFEST_LOADED,{levels:[m],audioTracks:[],url:h,stats:t,networkDetails:a})}if(t.tparsed=P.now(),v.needSidxRanges){var y=v.initSegment.url;this.load({url:y,isSidxRequest:!0,type:d,level:c,levelDetails:v,id:s,rangeStart:0,rangeEnd:2048,responseType:"arraybuffer"})}else n.levelDetails=v,this._handlePlaylistLoaded(e,t,n,a)},o._handleSidxRequest=function(e,t){if("string"==typeof e.data)throw new Error("sidx request must be made with responseType of array buffer");var n=f.default.parseSegmentIndex(new Uint8Array(e.data));if(n){var i=n.references,r=t.levelDetails;i.forEach((function(e,t){var n=e.info;if(r){var i=r.fragments[t];0===i.byteRange.length&&i.setByteRange(String(1+n.end-n.start)+"@"+String(n.start))}})),r&&r.initSegment.setByteRange(String(n.moovEndOffset)+"@0")}},o._handleManifestParsingError=function(e,t,n,i){this.hls.trigger(u.default.ERROR,{type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:e.url,reason:n,networkDetails:i})},o._handleNetworkError=function(e,t,n,i){var a,o;void 0===n&&(n=!1),void 0===i&&(i=null),c.logger.info("A network error occured while loading a "+e.type+"-type playlist");var l=this.getInternalLoader(e);switch(e.type){case r.MANIFEST:a=n?s.ErrorDetails.MANIFEST_LOAD_TIMEOUT:s.ErrorDetails.MANIFEST_LOAD_ERROR,o=!0;break;case r.LEVEL:a=n?s.ErrorDetails.LEVEL_LOAD_TIMEOUT:s.ErrorDetails.LEVEL_LOAD_ERROR,o=!1;break;case r.AUDIO_TRACK:a=n?s.ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT:s.ErrorDetails.AUDIO_TRACK_LOAD_ERROR,o=!1;break;default:o=!1}l&&(l.abort(),this.resetInternalLoader(e.type));var d={type:s.ErrorTypes.NETWORK_ERROR,details:a,fatal:o,url:e.url,loader:l,context:e,networkDetails:t};i&&(d.response=i),this.hls.trigger(u.default.ERROR,d)},o._handlePlaylistLoaded=function(e,t,n,a){var o=n.type,s=n.level,l=n.id,c=n.levelDetails;if(c&&c.targetduration)if(i.canHaveQualityLevels(n.type))this.hls.trigger(u.default.LEVEL_LOADED,{details:c,level:s||0,id:l||0,stats:t,networkDetails:a});else switch(o){case r.AUDIO_TRACK:this.hls.trigger(u.default.AUDIO_TRACK_LOADED,{details:c,id:l,stats:t,networkDetails:a});break;case r.SUBTITLE_TRACK:this.hls.trigger(u.default.SUBTITLE_TRACK_LOADED,{details:c,id:l,stats:t,networkDetails:a})}else this._handleManifestParsingError(e,n,"invalid target duration",a)},i}(h),N=function(e){var t,n;function i(t){var n;return(n=e.call(this,t,u.default.FRAG_LOADING)||this).loaders={},n}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var r=i.prototype;return r.destroy=function(){var t=this.loaders;for(var n in t){var i=t[n];i&&i.destroy()}this.loaders={},e.prototype.destroy.call(this)},r.onFragLoading=function(e){var t=e.frag,n=t.type,i=this.loaders,r=this.hls.config,a=r.fLoader,o=r.loader;t.loaded=0;var s,u,d,h=i[n];h&&(c.logger.warn("abort previous fragment loader for type: "+n),h.abort()),h=i[n]=t.loader=r.fLoader?new a(r):new o(r),s={url:t.url,frag:t,responseType:"arraybuffer",progressData:!1};var f=t.byteRangeStartOffset,p=t.byteRangeEndOffset;Object(l.isFiniteNumber)(f)&&Object(l.isFiniteNumber)(p)&&(s.rangeStart=f,s.rangeEnd=p),u={timeout:r.fragLoadingTimeOut,maxRetry:0,retryDelay:0,maxRetryDelay:r.fragLoadingMaxRetryTimeout},d={onSuccess:this.loadsuccess.bind(this),onError:this.loaderror.bind(this),onTimeout:this.loadtimeout.bind(this),onProgress:this.loadprogress.bind(this)},h.load(s,u,d)},r.loadsuccess=function(e,t,n,i){void 0===i&&(i=null);var r=e.data,a=n.frag;a.loader=void 0,this.loaders[a.type]=void 0,this.hls.trigger(u.default.FRAG_LOADED,{payload:r,frag:a,stats:t,networkDetails:i})},r.loaderror=function(e,t,n){void 0===n&&(n=null);var i=t.frag,r=i.loader;r&&r.abort(),this.loaders[i.type]=void 0,this.hls.trigger(u.default.ERROR,{type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.FRAG_LOAD_ERROR,fatal:!1,frag:t.frag,response:e,networkDetails:n})},r.loadtimeout=function(e,t,n){void 0===n&&(n=null);var i=t.frag,r=i.loader;r&&r.abort(),this.loaders[i.type]=void 0,this.hls.trigger(u.default.ERROR,{type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.FRAG_LOAD_TIMEOUT,fatal:!1,frag:t.frag,networkDetails:n})},r.loadprogress=function(e,t,n,i){void 0===i&&(i=null);var r=t.frag;r.loaded=e.loaded,this.hls.trigger(u.default.FRAG_LOAD_PROGRESS,{frag:r,stats:e,networkDetails:i})},i}(h),M=function(e){var t,n;function i(t){var n;return(n=e.call(this,t,u.default.KEY_LOADING)||this).loaders={},n.decryptkey=null,n.decrypturl=null,n}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var r=i.prototype;return r.destroy=function(){for(var t in this.loaders){var n=this.loaders[t];n&&n.destroy()}this.loaders={},e.prototype.destroy.call(this)},r.onKeyLoading=function(e){var t=e.frag,n=t.type,i=this.loaders[n];if(t.decryptdata){var r=t.decryptdata.uri;if(r!==this.decrypturl||null===this.decryptkey){var a=this.hls.config;if(i&&(c.logger.warn("abort previous key loader for type:"+n),i.abort()),!r)return void c.logger.warn("key uri is falsy");t.loader=this.loaders[n]=new a.loader(a),this.decrypturl=r,this.decryptkey=null;var o={url:r,frag:t,responseType:"arraybuffer"},s={timeout:a.fragLoadingTimeOut,maxRetry:0,retryDelay:a.fragLoadingRetryDelay,maxRetryDelay:a.fragLoadingMaxRetryTimeout},l={onSuccess:this.loadsuccess.bind(this),onError:this.loaderror.bind(this),onTimeout:this.loadtimeout.bind(this)};t.loader.load(o,s,l)}else this.decryptkey&&(t.decryptdata.key=this.decryptkey,this.hls.trigger(u.default.KEY_LOADED,{frag:t}))}else c.logger.warn("Missing decryption data on fragment in onKeyLoading")},r.loadsuccess=function(e,t,n){var i=n.frag;i.decryptdata?(this.decryptkey=i.decryptdata.key=new Uint8Array(e.data),i.loader=void 0,delete this.loaders[i.type],this.hls.trigger(u.default.KEY_LOADED,{frag:i})):c.logger.error("after key load, decryptdata unset")},r.loaderror=function(e,t){var n=t.frag,i=n.loader;i&&i.abort(),delete this.loaders[n.type],this.hls.trigger(u.default.ERROR,{type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.KEY_LOAD_ERROR,fatal:!1,frag:n,response:e})},r.loadtimeout=function(e,t){var n=t.frag,i=n.loader;i&&i.abort(),delete this.loaders[n.type],this.hls.trigger(u.default.ERROR,{type:s.ErrorTypes.NETWORK_ERROR,details:s.ErrorDetails.KEY_LOAD_TIMEOUT,fatal:!1,frag:n})},i}(h),F="NOT_LOADED",B="APPENDING",U="PARTIAL",j="OK",V=function(e){var t,n;function i(t){var n;return(n=e.call(this,t,u.default.BUFFER_APPENDED,u.default.FRAG_BUFFERED,u.default.FRAG_LOADED)||this).bufferPadding=.2,n.fragments=Object.create(null),n.timeRanges=Object.create(null),n.config=t.config,n}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var r=i.prototype;return r.destroy=function(){this.fragments=Object.create(null),this.timeRanges=Object.create(null),this.config=null,h.prototype.destroy.call(this),e.prototype.destroy.call(this)},r.getBufferedFrag=function(e,t){var n=this.fragments,i=Object.keys(n).filter((function(i){var r=n[i];if(r.body.type!==t)return!1;if(!r.buffered)return!1;var a=r.body;return a.startPTS<=e&&e<=a.endPTS}));if(0===i.length)return null;var r=i.pop();return n[r].body},r.detectEvictedFragments=function(e,t){var n,i,r=this;Object.keys(this.fragments).forEach((function(a){var o=r.fragments[a];if(!0===o.buffered){var s=o.range[e];if(s){n=s.time;for(var l=0;l=i&&t<=r){a.push({startPTS:Math.max(e,n.start(s)),endPTS:Math.min(t,n.end(s))});break}if(ei)a.push({startPTS:Math.max(e,n.start(s)),endPTS:Math.min(t,n.end(s))}),o=!0;else if(t<=i)break}return{time:a,partial:o}},r.getFragmentKey=function(e){return e.type+"_"+e.level+"_"+e.urlId+"_"+e.sn},r.getPartialFragment=function(e){var t,n,i,r=this,a=null,o=0;return Object.keys(this.fragments).forEach((function(s){var l=r.fragments[s];r.isPartial(l)&&(n=l.body.startPTS-r.bufferPadding,i=l.body.endPTS+r.bufferPadding,e>=n&&e<=i&&(t=Math.min(e-n,i-e),o<=t&&(a=l.body,o=t)))})),a},r.getState=function(e){var t=this.getFragmentKey(e),n=this.fragments[t],i=F;return void 0!==n&&(i=n.buffered?!0===this.isPartial(n)?U:j:B),i},r.isPartial=function(e){return!0===e.buffered&&(void 0!==e.range.video&&!0===e.range.video.partial||void 0!==e.range.audio&&!0===e.range.audio.partial)},r.isTimeBuffered=function(e,t,n){for(var i,r,a=0;a=i&&t<=r)return!0;if(t<=i)return!1}return!1},r.onFragLoaded=function(e){var t=e.frag;Object(l.isFiniteNumber)(t.sn)&&!t.bitrateTest&&(this.fragments[this.getFragmentKey(t)]={body:t,range:Object.create(null),buffered:!1})},r.onBufferAppended=function(e){var t=this;this.timeRanges=e.timeRanges,Object.keys(this.timeRanges).forEach((function(e){var n=t.timeRanges[e];t.detectEvictedFragments(e,n)}))},r.onFragBuffered=function(e){this.detectPartialFragments(e.frag)},r.hasFragment=function(e){var t=this.getFragmentKey(e);return void 0!==this.fragments[t]},r.removeFragment=function(e){var t=this.getFragmentKey(e);delete this.fragments[t]},r.removeAllFragments=function(){this.fragments=Object.create(null)},i}(h),K={search:function(e,t){for(var n=0,i=e.length-1,r=null,a=null;n<=i;){var o=t(a=e[r=(n+i)/2|0]);if(o>0)n=r+1;else{if(!(o<0))return a;i=r-1}}return null}},G=function(){function e(){}return e.isBuffered=function(e,t){try{if(e)for(var n=e.buffered,i=0;i=n.start(i)&&t<=n.end(i))return!0}catch(e){}return!1},e.bufferInfo=function(e,t,n){try{if(e){var i,r=e.buffered,a=[];for(i=0;io&&(i[a-1].end=e[r].end):i.push(e[r])}else i.push(e[r])}else i=e;for(var s,l=0,u=t,c=t,d=0;d=h&&t1?t-1:0),i=1;it?(i.duration=a-i.start,i.duration<0&&c.logger.warn("negative duration computed for frag "+i.sn+",level "+i.level+", there should be some duration drift between playlist and fragment!")):(r.duration=i.start-a,r.duration<0&&c.logger.warn("negative duration computed for frag "+r.sn+",level "+r.level+", there should be some duration drift between playlist and fragment!")):r.start=n>t?i.start+i.duration:Math.max(i.start-r.duration,0)}function te(e,t,n,i,r,a){var o=n;if(Object(l.isFiniteNumber)(t.startPTS)){var s=Math.abs(t.startPTS-n);Object(l.isFiniteNumber)(t.deltaPTS)?t.deltaPTS=Math.max(s,t.deltaPTS):t.deltaPTS=s,o=Math.max(n,t.startPTS),n=Math.min(n,t.startPTS),i=Math.max(i,t.endPTS),r=Math.min(r,t.startDTS),a=Math.max(a,t.endDTS)}var u=n-t.start;t.start=t.startPTS=n,t.maxStartPTS=o,t.endPTS=i,t.startDTS=r,t.endDTS=a,t.duration=i-n;var c,d,h,f=t.sn;if(!e||fe.endSN)return 0;for(c=f-e.startSN,(d=e.fragments)[c]=t,h=c;h>0;h--)ee(d,h,h-1);for(h=c;hi.length))for(var a=0;an.startCC||e&&e.cc=(e[e.length-1].endProgramDateTime||0))return null;n=n||0;for(var i=0;ie&&n.start?-1:0}function de(e,t,n){var i=1e3*Math.min(t,n.duration+(n.deltaPTS?n.deltaPTS:0));return(n.endProgramDateTime||0)-i>e}var he=function(){function e(e,t,n,i){this.config=e,this.media=t,this.fragmentTracker=n,this.hls=i,this.nudgeRetry=0,this.stallReported=!1,this.stalled=null,this.moved=!1,this.seeking=!1}var t=e.prototype;return t.poll=function(e){var t=this.config,n=this.media,i=this.stalled,r=n.currentTime,a=n.seeking,o=this.seeking&&!a,s=!this.seeking&&a;if(this.seeking=a,r===e){if((s||o)&&(this.stalled=null),!n.paused&&!n.ended&&0!==n.playbackRate&&n.buffered.length){var l=G.bufferInfo(n,r,0),u=l.len>0,d=l.nextStart||0;if(u||d){if(a){if(l.len>2||!d||d-r>2)return;this.moved=!1}if(!this.moved&&this.stalled){var h=Math.max(d,l.start||0)-r;if(h>0&&h<=2)return void this._trySkipBufferHole(null)}var f=self.performance.now();if(null!==i){var p=f-i;!a&&p>=250&&this._reportStall(l.len);var g=G.bufferInfo(n,r,t.maxBufferHole);this._tryFixBufferStall(g,p)}else this.stalled=f}}}else if(this.moved=!0,null!==i){if(this.stallReported){var v=self.performance.now()-i;c.logger.warn("playback not stuck anymore @"+r+", after "+Math.round(v)+"ms"),this.stallReported=!1}this.stalled=null,this.nudgeRetry=0}},t._tryFixBufferStall=function(e,t){var n=this.config,i=this.fragmentTracker,r=this.media.currentTime,a=i.getPartialFragment(r);a&&this._trySkipBufferHole(a)||e.len>n.maxBufferHole&&t>1e3*n.highBufferWatchdogPeriod&&(c.logger.warn("Trying to nudge playhead over buffer-hole"),this.stalled=null,this._tryNudgeBuffer())},t._reportStall=function(e){var t=this.hls,n=this.media;this.stallReported||(this.stallReported=!0,c.logger.warn("Playback stalling at @"+n.currentTime+" due to low buffer"),t.trigger(u.default.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1,buffer:e}))},t._trySkipBufferHole=function(e){for(var t=this.config,n=this.hls,i=this.media,r=i.currentTime,a=0,o=0;o=a&&r1?i-1:0),a=1;a1&&(this.clearNextTick(),this._tickTimer=self.setTimeout(this._boundTick,0)),this._tickCallCount=0)},r.doTick=function(){},i}(h),ge="STOPPED",ve="STARTING",me="IDLE",ye="PAUSED",Ae="KEY_LOADING",be="FRAG_LOADING",Ee="FRAG_LOADING_WAITING_RETRY",Te="WAITING_TRACK",ke="PARSING",_e="PARSED",Se="BUFFER_FLUSHING",Ce="ENDED",we="ERROR",Re="WAITING_INIT_PTS",Oe="WAITING_LEVEL",Le=function(e){var t,n;function i(){return e.apply(this,arguments)||this}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var r=i.prototype;return r.doTick=function(){},r.startLoad=function(){},r.stopLoad=function(){var e=this.fragCurrent;e&&(e.loader&&e.loader.abort(),this.fragmentTracker.removeFragment(e)),this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.fragCurrent=null,this.fragPrevious=null,this.clearInterval(),this.clearNextTick(),this.state=ge},r._streamEnded=function(e,t){var n=this.fragCurrent,i=this.fragmentTracker;if(!t.live&&n&&!n.backtracked&&n.sn===t.endSN&&!e.nextStart){var r=i.getState(n);return r===U||r===j}return!1},r.onMediaSeeking=function(){var e=this.config,t=this.media,n=this.mediaBuffer,i=this.state,r=t?t.currentTime:null,a=G.bufferInfo(n||t,r,this.config.maxBufferHole);if(Object(l.isFiniteNumber)(r)&&c.logger.log("media seeking to "+r.toFixed(3)),i===be){var o=this.fragCurrent;if(0===a.len&&o){var s=e.maxFragLookUpTolerance,u=o.start-s,d=o.start+o.duration+s;rd?(o.loader&&(c.logger.log("seeking outside of buffer while fragment load in progress, cancel fragment load"),o.loader.abort()),this.fragCurrent=null,this.fragPrevious=null,this.state=me):c.logger.log("seeking outside of buffer but within currently loaded fragment range")}}else i===Ce&&(0===a.len&&(this.fragPrevious=null,this.fragCurrent=null),this.state=me);t&&(this.lastCurrentTime=r),this.loadedmetadata||(this.nextLoadPosition=this.startPosition=r),this.tick()},r.onMediaEnded=function(){this.startPosition=this.lastCurrentTime=0},r.onHandlerDestroying=function(){this.stopLoad(),e.prototype.onHandlerDestroying.call(this)},r.onHandlerDestroyed=function(){this.state=ge,this.fragmentTracker=null},r.computeLivePosition=function(e,t){var n=void 0!==this.config.liveSyncDuration?this.config.liveSyncDuration:this.config.liveSyncDurationCount*t.targetduration;return e+Math.max(0,t.totalduration-n)},i}(pe);function De(e,t){for(var n=0;n0&&-1===e&&(c.logger.log("override startPosition with lastCurrentTime @"+t.toFixed(3)),e=t),this.state=me,this.nextLoadPosition=this.startPosition=this.lastCurrentTime=e,this.tick()}else this.forceStartLoad=!0,this.state=ge},h.stopLoad=function(){this.forceStartLoad=!1,e.prototype.stopLoad.call(this)},h.doTick=function(){switch(this.state){case Se:this.fragLoadError=0;break;case me:this._doTickIdle();break;case Oe:var e=this.levels[this.level];e&&e.details&&(this.state=me);break;case Ee:var t=window.performance.now(),n=this.retryDate;(!n||t>=n||this.media&&this.media.seeking)&&(c.logger.log("mediaController: retryDate reached, switch back to IDLE state"),this.state=me)}this._checkBuffer(),this._checkFragmentChanged()},h._doTickIdle=function(){var e=this.hls,t=e.config,n=this.media;if(void 0!==this.levelLastLoaded&&(n||!this.startFragRequested&&t.startFragPrefetch)){var i;i=this.loadedmetadata?n.currentTime:this.nextLoadPosition;var r=e.nextLoadLevel,a=this.levels[r];if(a){var o,s=a.bitrate;o=s?Math.max(8*t.maxBufferSize/s,t.maxBufferLength):t.maxBufferLength,o=Math.min(o,t.maxMaxBufferLength);var l=G.bufferInfo(this.mediaBuffer?this.mediaBuffer:n,i,t.maxBufferHole),d=l.len;if(!(d>=o)){c.logger.trace("buffer length of "+d.toFixed(3)+" is below max of "+o.toFixed(3)+". checking for more payload ..."),this.level=e.nextLoadLevel=r;var h=a.details;if(!h||h.live&&this.levelLastLoaded!==r)this.state=Oe;else{if(this._streamEnded(l,h)){var f={};return this.altAudio&&(f.type="video"),this.hls.trigger(u.default.BUFFER_EOS,f),void(this.state=Ce)}this._fetchPayloadOrEos(i,l,h)}}}}},h._fetchPayloadOrEos=function(e,t,n){var i=this.fragPrevious,r=this.level,a=n.fragments,o=a.length;if(0!==o){var s,l=a[0].start,u=a[o-1].start+a[o-1].duration,d=t.end;if(n.initSegment&&!n.initSegment.data)s=n.initSegment;else if(n.live){var h=this.config.initialLiveManifestSize;if(oh&&h>u.currentTime&&(c.logger.log("buffer end: "+t.toFixed(3)+" is located too far from the end of live sliding playlist, reset currentTime to : "+h.toFixed(3)),u.currentTime=h),this.nextLoadPosition=h}if(e.PTSKnown&&t>i&&u&&u.readyState)return null;if(this.startFragRequested&&!e.PTSKnown){if(r)if(e.hasProgramDateTime)c.logger.log("live playlist, switching playlist, load frag with same PDT: "+r.programDateTime),s=le(a,r.endProgramDateTime,l.maxFragLookUpTolerance);else{var f=r.sn+1;if(f>=e.startSN&&f<=e.endSN){var p=a[f-e.startSN];r.cc===p.cc&&(s=p,c.logger.log("live playlist, switching playlist, load frag with next SN: "+s.sn))}s||(s=K.search(a,(function(e){return r.cc-e.cc})))&&c.logger.log("live playlist, switching playlist, load frag with same CC: "+s.sn)}s||(s=a[Math.min(o-1,Math.round(o/2))],c.logger.log("live playlist, switching playlist, unknown, load middle frag : "+s.sn))}return s},h._findFragment=function(e,t,n,i,r,a,o){var s,l=this.hls.config;if(s=ra-l.maxFragLookUpTolerance?0:l.maxFragLookUpTolerance):i[n-1]){var u=s.sn-o.startSN,d=t&&s.level===t.level,h=i[u-1],f=i[u+1];if(t&&s.sn===t.sn)if(d&&!s.backtracked)if(s.snl.maxBufferHole&&t.dropped&&u?(s=h,c.logger.warn("Previous fragment was dropped with large PTS gap between audio and video. Maybe fragment is not starting with a keyframe? Loading previous one to try to overcome this")):(s=f,c.logger.log("Re-loading fragment with SN: "+s.sn))}else s=null;else s.backtracked&&(f&&f.backtracked?(c.logger.warn("Already backtracked from fragment "+f.sn+", will not backtrack to fragment "+s.sn+". Loading fragment "+f.sn),s=f):(c.logger.warn("Loaded fragment with dropped frames, backtracking 1 segment to find a keyframe"),s.dropped=0,h?(s=h).backtracked=!0:u&&(s=null)))}return s},h._loadKey=function(e){this.state=Ae,this.hls.trigger(u.default.KEY_LOADING,{frag:e})},h._loadFragment=function(e){var t=this.fragmentTracker.getState(e);this.fragCurrent=e,"initSegment"!==e.sn&&(this.startFragRequested=!0),Object(l.isFiniteNumber)(e.sn)&&!e.bitrateTest&&(this.nextLoadPosition=e.start+e.duration),e.backtracked||t===F||t===U?(e.autoLevel=this.hls.autoLevelEnabled,e.bitrateTest=this.bitrateTest,this.hls.trigger(u.default.FRAG_LOADING,{frag:e}),this.demuxer||(this.demuxer=new Q(this.hls,"main")),this.state=be):t===B&&this._reduceMaxBufferLength(e.duration)&&this.fragmentTracker.removeFragment(e)},h.getBufferedFrag=function(e){return this.fragmentTracker.getBufferedFrag(e,a.MAIN)},h.followingBufferedFrag=function(e){return e?this.getBufferedFrag(e.endPTS+.5):null},h._checkFragmentChanged=function(){var e,t,n=this.media;if(n&&n.readyState&&!1===n.seeking&&((t=n.currentTime)>this.lastCurrentTime&&(this.lastCurrentTime=t),G.isBuffered(n,t)?e=this.getBufferedFrag(t):G.isBuffered(n,t+.1)&&(e=this.getBufferedFrag(t+.1)),e)){var i=e;if(i!==this.fragPlaying){this.hls.trigger(u.default.FRAG_CHANGED,{frag:i});var r=i.level;this.fragPlaying&&this.fragPlaying.level===r||this.hls.trigger(u.default.LEVEL_SWITCHED,{level:r}),this.fragPlaying=i}}},h.immediateLevelSwitch=function(){if(c.logger.log("immediateLevelSwitch"),!this.immediateSwitch){this.immediateSwitch=!0;var e,t=this.media;t?(e=t.paused,t.pause()):e=!0,this.previouslyPaused=e}var n=this.fragCurrent;n&&n.loader&&n.loader.abort(),this.fragCurrent=null,this.flushMainBuffer(0,Number.POSITIVE_INFINITY)},h.immediateLevelSwitchEnd=function(){var e=this.media;e&&e.buffered.length&&(this.immediateSwitch=!1,G.isBuffered(e,e.currentTime)&&(e.currentTime-=1e-4),this.previouslyPaused||e.play())},h.nextLevelSwitch=function(){var e=this.media;if(e&&e.readyState){var t,n,i;if((n=this.getBufferedFrag(e.currentTime))&&n.startPTS>1&&this.flushMainBuffer(0,n.startPTS-1),e.paused)t=0;else{var r=this.hls.nextLoadLevel,a=this.levels[r],o=this.fragLastKbps;t=o&&this.fragCurrent?this.fragCurrent.duration*a.bitrate/(1e3*o)+1:0}if((i=this.getBufferedFrag(e.currentTime+t))&&(i=this.followingBufferedFrag(i))){var s=this.fragCurrent;s&&s.loader&&s.loader.abort(),this.fragCurrent=null,this.flushMainBuffer(i.maxStartPTS,Number.POSITIVE_INFINITY)}}},h.flushMainBuffer=function(e,t){this.state=Se;var n={startOffset:e,endOffset:t};this.altAudio&&(n.type="video"),this.hls.trigger(u.default.BUFFER_FLUSHING,n)},h.onMediaAttached=function(e){var t=this.media=this.mediaBuffer=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("seeked",this.onvseeked),t.addEventListener("ended",this.onvended);var n=this.config;this.levels&&n.autoStartLoad&&this.hls.startLoad(n.startPosition),this.gapController=new he(n,t,this.fragmentTracker,this.hls)},h.onMediaDetaching=function(){var e=this.media;e&&e.ended&&(c.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var t=this.levels;t&&t.forEach((function(e){e.details&&e.details.fragments.forEach((function(e){e.backtracked=void 0}))})),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("seeked",this.onvseeked),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.fragmentTracker.removeAllFragments(),this.media=this.mediaBuffer=null,this.loadedmetadata=!1,this.stopLoad()},h.onMediaSeeked=function(){var e=this.media,t=e?e.currentTime:void 0;Object(l.isFiniteNumber)(t)&&c.logger.log("media seeked to "+t.toFixed(3)),this.tick()},h.onManifestLoading=function(){c.logger.log("trigger BUFFER_RESET"),this.hls.trigger(u.default.BUFFER_RESET),this.fragmentTracker.removeAllFragments(),this.stalled=!1,this.startPosition=this.lastCurrentTime=0},h.onManifestParsed=function(e){var t,n=!1,i=!1;e.levels.forEach((function(e){(t=e.audioCodec)&&(-1!==t.indexOf("mp4a.40.2")&&(n=!0),-1!==t.indexOf("mp4a.40.5")&&(i=!0))})),this.audioCodecSwitch=n&&i,this.audioCodecSwitch&&c.logger.log("both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.altAudio=e.altAudio,this.levels=e.levels,this.startFragRequested=!1;var r=this.config;(r.autoStartLoad||this.forceStartLoad)&&this.hls.startLoad(r.startPosition)},h.onLevelLoaded=function(e){var t=e.details,n=e.level,i=this.levels[this.levelLastLoaded],r=this.levels[n],a=t.totalduration,o=0;if(c.logger.log("level "+n+" loaded ["+t.startSN+","+t.endSN+"],duration:"+a),t.live){var s=r.details;s&&t.fragments.length>0?(ne(s,t),o=t.fragments[0].start,this.liveSyncPosition=this.computeLivePosition(o,s),t.PTSKnown&&Object(l.isFiniteNumber)(o)?c.logger.log("live playlist sliding:"+o.toFixed(3)):(c.logger.log("live playlist - outdated PTS, unknown sliding"),se(this.fragPrevious,i,t))):(c.logger.log("live playlist - first load, unknown sliding"),t.PTSKnown=!1,se(this.fragPrevious,i,t))}else t.PTSKnown=!1;if(r.details=t,this.levelLastLoaded=n,this.hls.trigger(u.default.LEVEL_UPDATED,{details:t,level:n}),!1===this.startFragRequested){if(-1===this.startPosition||-1===this.lastCurrentTime){var d=t.startTimeOffset;Object(l.isFiniteNumber)(d)?(d<0&&(c.logger.log("negative start time offset "+d+", count from end of last fragment"),d=o+a+d),c.logger.log("start time offset found in playlist, adjust startPosition to "+d),this.startPosition=d):t.live?(this.startPosition=this.computeLivePosition(o,t),c.logger.log("configure startPosition to "+this.startPosition)):this.startPosition=0,this.lastCurrentTime=this.startPosition}this.nextLoadPosition=this.startPosition}this.state===Oe&&(this.state=me),this.tick()},h.onKeyLoaded=function(){this.state===Ae&&(this.state=me,this.tick())},h.onFragLoaded=function(e){var t=this.fragCurrent,n=this.hls,i=this.levels,r=this.media,a=e.frag;if(this.state===be&&t&&"main"===a.type&&a.level===t.level&&a.sn===t.sn){var o=e.stats,s=i[t.level],l=s.details;if(this.bitrateTest=!1,this.stats=o,c.logger.log("Loaded "+t.sn+" of ["+l.startSN+" ,"+l.endSN+"],level "+t.level),a.bitrateTest&&n.nextLoadLevel)this.state=me,this.startFragRequested=!1,o.tparsed=o.tbuffered=window.performance.now(),n.trigger(u.default.FRAG_BUFFERED,{stats:o,frag:t,id:"main"}),this.tick();else if("initSegment"===a.sn)this.state=me,o.tparsed=o.tbuffered=window.performance.now(),l.initSegment.data=e.payload,n.trigger(u.default.FRAG_BUFFERED,{stats:o,frag:t,id:"main"}),this.tick();else{c.logger.log("Parsing "+t.sn+" of ["+l.startSN+" ,"+l.endSN+"],level "+t.level+", cc "+t.cc),this.state=ke,this.pendingBuffering=!0,this.appended=!1,a.bitrateTest&&(a.bitrateTest=!1,this.fragmentTracker.onFragLoaded({frag:a}));var d=!(r&&r.seeking)&&(l.PTSKnown||!l.live),h=l.initSegment?l.initSegment.data:[],f=this._getAudioCodec(s);(this.demuxer=this.demuxer||new Q(this.hls,"main")).push(e.payload,h,f,s.videoCodec,t,l.totalduration,d)}}this.fragLoadError=0},h.onFragParsingInitSegment=function(e){var t=this.fragCurrent,n=e.frag;if(t&&"main"===e.id&&n.sn===t.sn&&n.level===t.level&&this.state===ke){var i,r,a=e.tracks;if(a.audio&&this.altAudio&&delete a.audio,r=a.audio){var o=this.levels[this.level].audioCodec,s=navigator.userAgent.toLowerCase();o&&this.audioCodecSwap&&(c.logger.log("swapping playlist audio codec"),o=-1!==o.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5"),this.audioCodecSwitch&&1!==r.metadata.channelCount&&-1===s.indexOf("firefox")&&(o="mp4a.40.5"),-1!==s.indexOf("android")&&"audio/mpeg"!==r.container&&(o="mp4a.40.2",c.logger.log("Android: force audio codec to "+o)),r.levelCodec=o,r.id=e.id}for(i in(r=a.video)&&(r.levelCodec=this.levels[this.level].videoCodec,r.id=e.id),this.hls.trigger(u.default.BUFFER_CODECS,a),a){r=a[i],c.logger.log("main track:"+i+",container:"+r.container+",codecs[level/parsed]=["+r.levelCodec+"/"+r.codec+"]");var l=r.initSegment;l&&(this.appended=!0,this.pendingBuffering=!0,this.hls.trigger(u.default.BUFFER_APPENDING,{type:i,data:l,parent:"main",content:"initSegment"}))}this.tick()}},h.onFragParsingData=function(e){var t=this,n=this.fragCurrent,i=e.frag;if(n&&"main"===e.id&&i.sn===n.sn&&i.level===n.level&&("audio"!==e.type||!this.altAudio)&&this.state===ke){var r=this.levels[this.level],a=n;if(Object(l.isFiniteNumber)(e.endPTS)||(e.endPTS=e.startPTS+n.duration,e.endDTS=e.startDTS+n.duration),!0===e.hasAudio&&a.addElementaryStream(g.AUDIO),!0===e.hasVideo&&a.addElementaryStream(g.VIDEO),c.logger.log("Parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb+",dropped:"+(e.dropped||0)),"video"===e.type)if(a.dropped=e.dropped,a.dropped)if(a.backtracked)c.logger.warn("Already backtracked on this fragment, appending with the gap",a.sn);else{var o=r.details;if(!o||a.sn!==o.startSN)return c.logger.warn("missing video frame(s), backtracking fragment",a.sn),this.fragmentTracker.removeFragment(a),a.backtracked=!0,this.nextLoadPosition=e.startPTS,this.state=me,this.fragPrevious=a,void this.tick();c.logger.warn("missing video frame(s) on first frag, appending with gap",a.sn)}else a.backtracked=!1;var s=te(r.details,a,e.startPTS,e.endPTS,e.startDTS,e.endDTS),d=this.hls;d.trigger(u.default.LEVEL_PTS_UPDATED,{details:r.details,level:this.level,drift:s,type:e.type,start:e.startPTS,end:e.endPTS}),[e.data1,e.data2].forEach((function(n){n&&n.length&&t.state===ke&&(t.appended=!0,t.pendingBuffering=!0,d.trigger(u.default.BUFFER_APPENDING,{type:e.type,data:n,parent:"main",content:"data"}))})),this.tick()}},h.onFragParsed=function(e){var t=this.fragCurrent,n=e.frag;t&&"main"===e.id&&n.sn===t.sn&&n.level===t.level&&this.state===ke&&(this.stats.tparsed=window.performance.now(),this.state=_e,this._checkAppendedParsed())},h.onAudioTrackSwitching=function(e){var t=!!e.url,n=e.id;if(!t){if(this.mediaBuffer!==this.media){c.logger.log("switching on main audio, use media.buffered to schedule main fragment loading"),this.mediaBuffer=this.media;var i=this.fragCurrent;i.loader&&(c.logger.log("switching to main audio track, cancel main fragment load"),i.loader.abort()),this.fragCurrent=null,this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=me}var r=this.hls;r.trigger(u.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"}),r.trigger(u.default.AUDIO_TRACK_SWITCHED,{id:n}),this.altAudio=!1}},h.onAudioTrackSwitched=function(e){var t=e.id,n=!!this.hls.audioTracks[t].url;if(n){var i=this.videoBuffer;i&&this.mediaBuffer!==i&&(c.logger.log("switching on alternate audio, use video.buffered to schedule main fragment loading"),this.mediaBuffer=i)}this.altAudio=n,this.tick()},h.onBufferCreated=function(e){var t,n,i=e.tracks,r=!1;for(var a in i){var o=i[a];"main"===o.id?(n=a,t=o,"video"===a&&(this.videoBuffer=i[a].buffer)):r=!0}r&&t?(c.logger.log("alternate track found, use "+n+".buffered to schedule main fragment loading"),this.mediaBuffer=t.buffer):this.mediaBuffer=this.media},h.onBufferAppended=function(e){if("main"===e.parent){var t=this.state;t!==ke&&t!==_e||(this.pendingBuffering=e.pending>0,this._checkAppendedParsed())}},h._checkAppendedParsed=function(){if(!(this.state!==_e||this.appended&&this.pendingBuffering)){var e=this.fragCurrent;if(e){var t=this.mediaBuffer?this.mediaBuffer:this.media;c.logger.log("main buffered : "+ae.toString(t.buffered)),this.fragPrevious=e;var n=this.stats;n.tbuffered=window.performance.now(),this.fragLastKbps=Math.round(8*n.total/(n.tbuffered-n.tfirst)),this.hls.trigger(u.default.FRAG_BUFFERED,{stats:n,frag:e,id:"main"}),this.state=me}this.tick()}},h.onError=function(e){var t=e.frag||this.fragCurrent;if(!t||"main"===t.type){var n=!!this.media&&G.isBuffered(this.media,this.media.currentTime)&&G.isBuffered(this.media,this.media.currentTime+.5);switch(e.details){case s.ErrorDetails.FRAG_LOAD_ERROR:case s.ErrorDetails.FRAG_LOAD_TIMEOUT:case s.ErrorDetails.KEY_LOAD_ERROR:case s.ErrorDetails.KEY_LOAD_TIMEOUT:if(!e.fatal)if(this.fragLoadError+1<=this.config.fragLoadingMaxRetry){var i=Math.min(Math.pow(2,this.fragLoadError)*this.config.fragLoadingRetryDelay,this.config.fragLoadingMaxRetryTimeout);c.logger.warn("mediaController: frag loading failed, retry in "+i+" ms"),this.retryDate=window.performance.now()+i,this.loadedmetadata||(this.startFragRequested=!1,this.nextLoadPosition=this.startPosition),this.fragLoadError++,this.state=Ee}else c.logger.error("mediaController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.state=we;break;case s.ErrorDetails.LEVEL_LOAD_ERROR:case s.ErrorDetails.LEVEL_LOAD_TIMEOUT:this.state!==we&&(e.fatal?(this.state=we,c.logger.warn("streamController: "+e.details+",switch to "+this.state+" state ...")):e.levelRetry||this.state!==Oe||(this.state=me));break;case s.ErrorDetails.BUFFER_FULL_ERROR:"main"!==e.parent||this.state!==ke&&this.state!==_e||(n?(this._reduceMaxBufferLength(this.config.maxBufferLength),this.state=me):(c.logger.warn("buffer full error also media.currentTime is not buffered, flush everything"),this.fragCurrent=null,this.flushMainBuffer(0,Number.POSITIVE_INFINITY)))}}},h._reduceMaxBufferLength=function(e){var t=this.config;return t.maxMaxBufferLength>=e&&(t.maxMaxBufferLength/=2,c.logger.warn("main:reduce max buffer length to "+t.maxMaxBufferLength+"s"),!0)},h._checkBuffer=function(){var e=this.media;if(e&&0!==e.readyState){var t=(this.mediaBuffer?this.mediaBuffer:e).buffered;!this.loadedmetadata&&t.length?(this.loadedmetadata=!0,this._seekToStartPos()):this.immediateSwitch?this.immediateLevelSwitchEnd():this.gapController.poll(this.lastCurrentTime,t)}},h.onFragLoadEmergencyAborted=function(){this.state=me,this.loadedmetadata||(this.startFragRequested=!1,this.nextLoadPosition=this.startPosition),this.tick()},h.onBufferFlushed=function(){var e=this.mediaBuffer?this.mediaBuffer:this.media;e&&this.fragmentTracker.detectEvictedFragments(g.VIDEO,e.buffered),this.state=me,this.fragPrevious=null},h.swapAudioCodec=function(){this.audioCodecSwap=!this.audioCodecSwap},h._seekToStartPos=function(){var e=this.media,t=e.currentTime,n=e.seeking?t:this.startPosition;t!==n&&n>=0&&(c.logger.log("target start position not buffered, seek to buffered.start(0) "+n+" from current time "+t+" "),e.currentTime=n)},h._getAudioCodec=function(e){var t=this.config.defaultAudioCodec||e.audioCodec;return this.audioCodecSwap&&(c.logger.log("swapping playlist audio codec"),t&&(t=-1!==t.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5")),t},r=i,(o=[{key:"state",set:function(e){if(this.state!==e){var t=this.state;this._state=e,c.logger.log("main stream-controller: "+t+"->"+e),this.hls.trigger(u.default.STREAM_STATE_TRANSITION,{previousState:t,nextState:e})}},get:function(){return this._state}},{key:"currentLevel",get:function(){var e=this.media;if(e){var t=this.getBufferedFrag(e.currentTime);if(t)return t.level}return-1}},{key:"nextBufferedFrag",get:function(){var e=this.media;return e?this.followingBufferedFrag(this.getBufferedFrag(e.currentTime)):null}},{key:"nextLevel",get:function(){var e=this.nextBufferedFrag;return e?e.level:-1}},{key:"liveSyncPosition",get:function(){return this._liveSyncPosition},set:function(e){this._liveSyncPosition=e}}])&&De(r.prototype,o),d&&De(r,d),i}(Le);function xe(e,t){for(var n=0;n0){t=n[0].bitrate,n.sort((function(e,t){return e.bitrate-t.bitrate})),this._levels=n;for(var d=0;d=0&&e1&&d.loadError0){var t=this.currentLevelIndex,n=e.urlId,i=e.url[n];c.logger.log("Attempt loading level index "+t+" with URL-id "+n),this.hls.trigger(u.default.LEVEL_LOADING,{url:i,level:t,id:n})}}},r=i,(a=[{key:"levels",get:function(){return this._levels}},{key:"level",get:function(){return this.currentLevelIndex},set:function(e){var t=this._levels;t&&(e=Math.min(e,t.length-1),this.currentLevelIndex===e&&t[e].details||this.setLevelInternal(e))}},{key:"manualLevel",get:function(){return this.manualLevelIndex},set:function(e){this.manualLevelIndex=e,void 0===this._startLevel&&(this._startLevel=e),-1!==e&&(this.level=e)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(e){this._firstLevel=e}},{key:"startLevel",get:function(){if(void 0===this._startLevel){var e=this.hls.config.startLevel;return void 0!==e?e:this._firstLevel}return this._startLevel},set:function(e){this._startLevel=e}},{key:"nextLoadLevel",get:function(){return-1!==this.manualLevelIndex?this.manualLevelIndex:this.hls.nextAutoLevel},set:function(e){this.level=e,-1===this.manualLevelIndex&&(this.hls.nextAutoLevel=e)}}])&&xe(r.prototype,a),o&&xe(r,o),i}(h),Me=n("./src/demux/id3.js");function Fe(e,t){var n;try{n=new Event("addtrack")}catch(e){(n=document.createEvent("Event")).initEvent("addtrack",!1,!1)}n.track=e,t.dispatchEvent(n)}function Be(e){if(e&&e.cues)for(;e.cues.length>0;)e.removeCue(e.cues[0])}var Ue=function(e){var t,n;function i(t){var n;return(n=e.call(this,t,u.default.MEDIA_ATTACHED,u.default.MEDIA_DETACHING,u.default.FRAG_PARSING_METADATA,u.default.LIVE_BACK_BUFFER_REACHED)||this).id3Track=void 0,n.media=void 0,n}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var r=i.prototype;return r.destroy=function(){h.prototype.destroy.call(this)},r.onMediaAttached=function(e){this.media=e.media,this.media},r.onMediaDetaching=function(){Be(this.id3Track),this.id3Track=void 0,this.media=void 0},r.getID3Track=function(e){for(var t=0;ts&&(c.logger.warn("detected an id3 sample with endTime < startTime, adjusting endTime to (startTime + 0.25)"),s=o+.25);for(var l=0;le[e.length-1].endTime)return e[e.length-1];for(var n=0,i=e.length-1;n<=i;){var r=Math.floor((i+n)/2);if(te[r].endTime))return e[r];n=r+1}}return e[n].endTime-t=this.minWeight_},t.getEstimate=function(){return this.canEstimate()?Math.min(this.fast_.getEstimate(),this.slow_.getEstimate()):this.defaultEstimate_},t.destroy=function(){},e}();function Ke(e,t){for(var n=0;n500*n.duration/s){var l=e.levels,d=Math.max(1,a.bw?a.bw/8:1e3*a.loaded/o),h=l[n.level],f=h.realBitrate?Math.max(h.realBitrate,h.bitrate):h.bitrate,p=a.total?a.total:Math.max(a.loaded,Math.round(n.duration*f/8)),g=t.currentTime,v=(p-a.loaded)/d,m=(G.bufferInfo(t,g,e.config.maxBufferHole).end-g)/s;if(m<2*n.duration/s&&v>m){var y;for(y=n.level-1;y>r;y--){var A=l[y].realBitrate?Math.max(l[y].realBitrate,l[y].bitrate):l[y].bitrate;if(n.duration*A/(6.4*d)=i;u--){var d=l[u];if(d){var h=d.details,f=h?h.totalduration/h.fragments.length:t,p=!!h&&h.live,g=void 0;g=u<=e?o*n:s*n;var v=l[u].realBitrate?Math.max(l[u].realBitrate,l[u].bitrate):l[u].bitrate,m=v*f/g;if(c.logger.trace("level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: "+u+"/"+Math.round(g)+"/"+v+"/"+f+"/"+a+"/"+m),g>v&&(!m||p&&!this.bitrateTestDelay||m=0)return f;c.logger.trace("rebuffering expected to happen, lets try to find a quality level minimizing the rebuffering");var p=s?Math.min(s,i.maxStarvationDelay):i.maxStarvationDelay,g=i.abrBandWidthFactor,v=i.abrBandWidthUpFactor;if(0===h){var m=this.bitrateTestDelay;m&&(p=(s?Math.min(s,i.maxLoadingDelay):i.maxLoadingDelay)-m,c.logger.trace("bitrate test took "+Math.round(1e3*m)+"ms, set first fragment max fetchDuration to "+Math.round(1e3*p)+" ms"),g=v=1)}return f=this._findBestLevel(o,s,d,r,t,h+p,g,v,n),Math.max(f,0)}}])&&Ke(r.prototype,a),o&&Ke(r,o),i}(h),He=z(),$e=function(e){var t,n;function i(t){var n;return(n=e.call(this,t,u.default.MEDIA_ATTACHING,u.default.MEDIA_DETACHING,u.default.MANIFEST_PARSED,u.default.BUFFER_RESET,u.default.BUFFER_APPENDING,u.default.BUFFER_CODECS,u.default.BUFFER_EOS,u.default.BUFFER_FLUSHING,u.default.LEVEL_PTS_UPDATED,u.default.LEVEL_UPDATED)||this)._msDuration=null,n._levelDuration=null,n._levelTargetDuration=10,n._live=null,n._objectUrl=null,n._needsFlush=!1,n._needsEos=!1,n.config=void 0,n.audioTimestampOffset=void 0,n.bufferCodecEventsExpected=0,n._bufferCodecEventsTotal=0,n.media=null,n.mediaSource=null,n.segments=[],n.parent=void 0,n.appending=!1,n.appended=0,n.appendError=0,n.flushBufferCounter=0,n.tracks={},n.pendingTracks={},n.sourceBuffer={},n.flushRange=[],n._onMediaSourceOpen=function(){c.logger.log("media source opened"),n.hls.trigger(u.default.MEDIA_ATTACHED,{media:n.media});var e=n.mediaSource;e&&e.removeEventListener("sourceopen",n._onMediaSourceOpen),n.checkPendingTracks()},n._onMediaSourceClose=function(){c.logger.log("media source closed")},n._onMediaSourceEnded=function(){c.logger.log("media source ended")},n._onSBUpdateEnd=function(){if(n.audioTimestampOffset&&n.sourceBuffer.audio){var e=n.sourceBuffer.audio;c.logger.warn("change mpeg audio timestamp offset from "+e.timestampOffset+" to "+n.audioTimestampOffset),e.timestampOffset=n.audioTimestampOffset,delete n.audioTimestampOffset}n._needsFlush&&n.doFlush(),n._needsEos&&n.checkEos(),n.appending=!1;var t=n.parent,i=n.segments.reduce((function(e,n){return n.parent===t?e+1:e}),0),r={},a=n.sourceBuffer;for(var o in a){var s=a[o];if(!s)throw Error("handling source buffer update end error: source buffer for "+o+" uninitilized and unable to update buffered TimeRanges.");r[o]=s.buffered}n.hls.trigger(u.default.BUFFER_APPENDED,{parent:t,pending:i,timeRanges:r}),n._needsFlush||n.doAppending(),n.updateMediaElementDuration(),0===i&&n.flushLiveBackBuffer()},n._onSBUpdateError=function(e){c.logger.error("sourceBuffer error:",e),n.hls.trigger(u.default.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.BUFFER_APPENDING_ERROR,fatal:!1})},n.config=t.config,n}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var r=i.prototype;return r.destroy=function(){h.prototype.destroy.call(this)},r.onLevelPtsUpdated=function(e){var t=e.type,n=this.tracks.audio;if("audio"===t&&n&&"audio/mpeg"===n.container){var i=this.sourceBuffer.audio;if(!i)throw Error("Level PTS Updated and source buffer for audio uninitalized");if(Math.abs(i.timestampOffset-e.start)>.1){var r=i.updating;try{i.abort()}catch(e){c.logger.warn("can not abort audio buffer: "+e)}r?this.audioTimestampOffset=e.start:(c.logger.warn("change mpeg audio timestamp offset from "+i.timestampOffset+" to "+e.start),i.timestampOffset=e.start)}}},r.onManifestParsed=function(e){this.bufferCodecEventsExpected=this._bufferCodecEventsTotal=e.altAudio?2:1,c.logger.log(this.bufferCodecEventsExpected+" bufferCodec event(s) expected")},r.onMediaAttaching=function(e){var t=this.media=e.media;if(t&&He){var n=this.mediaSource=new He;n.addEventListener("sourceopen",this._onMediaSourceOpen),n.addEventListener("sourceended",this._onMediaSourceEnded),n.addEventListener("sourceclose",this._onMediaSourceClose),t.src=window.URL.createObjectURL(n),this._objectUrl=t.src}},r.onMediaDetaching=function(){c.logger.log("media source detaching");var e=this.mediaSource;if(e){if("open"===e.readyState)try{e.endOfStream()}catch(e){c.logger.warn("onMediaDetaching:"+e.message+" while calling endOfStream")}e.removeEventListener("sourceopen",this._onMediaSourceOpen),e.removeEventListener("sourceended",this._onMediaSourceEnded),e.removeEventListener("sourceclose",this._onMediaSourceClose),this.media&&(this._objectUrl&&window.URL.revokeObjectURL(this._objectUrl),this.media.src===this._objectUrl?(this.media.removeAttribute("src"),this.media.load()):c.logger.warn("media.src was changed by a third party - skip cleanup")),this.mediaSource=null,this.media=null,this._objectUrl=null,this.bufferCodecEventsExpected=this._bufferCodecEventsTotal,this.pendingTracks={},this.tracks={},this.sourceBuffer={},this.flushRange=[],this.segments=[],this.appended=0}this.hls.trigger(u.default.MEDIA_DETACHED)},r.checkPendingTracks=function(){var e=this.bufferCodecEventsExpected,t=this.pendingTracks,n=Object.keys(t).length;(n&&!e||2===n)&&(this.createSourceBuffers(t),this.pendingTracks={},this.doAppending())},r.onBufferReset=function(){var e=this.sourceBuffer;for(var t in e){var n=e[t];try{n&&(this.mediaSource&&this.mediaSource.removeSourceBuffer(n),n.removeEventListener("updateend",this._onSBUpdateEnd),n.removeEventListener("error",this._onSBUpdateError))}catch(e){}}this.sourceBuffer={},this.flushRange=[],this.segments=[],this.appended=0},r.onBufferCodecs=function(e){var t=this;Object.keys(this.sourceBuffer).length||(Object.keys(e).forEach((function(n){t.pendingTracks[n]=e[n]})),this.bufferCodecEventsExpected=Math.max(this.bufferCodecEventsExpected-1,0),this.mediaSource&&"open"===this.mediaSource.readyState&&this.checkPendingTracks())},r.createSourceBuffers=function(e){var t=this.sourceBuffer,n=this.mediaSource;if(!n)throw Error("createSourceBuffers called when mediaSource was null");for(var i in e)if(!t[i]){var r=e[i];if(!r)throw Error("source buffer exists for track "+i+", however track does not");var a=r.levelCodec||r.codec,o=r.container+";codecs="+a;c.logger.log("creating sourceBuffer("+o+")");try{var l=t[i]=n.addSourceBuffer(o);l.addEventListener("updateend",this._onSBUpdateEnd),l.addEventListener("error",this._onSBUpdateError),this.tracks[i]={buffer:l,codec:a,id:r.id,container:r.container,levelCodec:r.levelCodec}}catch(e){c.logger.error("error while trying to add sourceBuffer:"+e.message),this.hls.trigger(u.default.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.BUFFER_ADD_CODEC_ERROR,fatal:!1,err:e,mimeType:o})}}this.hls.trigger(u.default.BUFFER_CREATED,{tracks:this.tracks})},r.onBufferAppending=function(e){this._needsFlush||(this.segments?this.segments.push(e):this.segments=[e],this.doAppending())},r.onBufferEos=function(e){for(var t in this.sourceBuffer)if(!e.type||e.type===t){var n=this.sourceBuffer[t];n&&!n.ended&&(n.ended=!0,c.logger.log(t+" sourceBuffer now EOS"))}this.checkEos()},r.checkEos=function(){var e=this.sourceBuffer,t=this.mediaSource;if(t&&"open"===t.readyState){for(var n in e){var i=e[n];if(i){if(!i.ended)return;if(i.updating)return void(this._needsEos=!0)}}c.logger.log("all media data are available, signal endOfStream() to MediaSource and stop loading fragment");try{t.endOfStream()}catch(e){c.logger.warn("exception while calling mediaSource.endOfStream()")}this._needsEos=!1}else this._needsEos=!1},r.onBufferFlushing=function(e){e.type?this.flushRange.push({start:e.startOffset,end:e.endOffset,type:e.type}):(this.flushRange.push({start:e.startOffset,end:e.endOffset,type:"video"}),this.flushRange.push({start:e.startOffset,end:e.endOffset,type:"audio"})),this.flushBufferCounter=0,this.doFlush()},r.flushLiveBackBuffer=function(){if(this._live){var e=this.config.liveBackBufferLength;if(isFinite(e)&&!(e<0))if(this.media)for(var t=this.media.currentTime,n=this.sourceBuffer,i=Object.keys(n),r=t-Math.max(e,this._levelTargetDuration),a=i.length-1;a>=0;a--){var o=i[a],s=n[o];if(s){var l=s.buffered;l.length>0&&r>l.start(0)&&this.removeBufferRange(o,s,0,r)&&this.hls.trigger(u.default.LIVE_BACK_BUFFER_REACHED,{bufferEnd:r})}}else c.logger.error("flushLiveBackBuffer called without attaching media")}},r.onLevelUpdated=function(e){var t=e.details;t.fragments.length>0&&(this._levelDuration=t.totalduration+t.fragments[0].start,this._levelTargetDuration=t.averagetargetduration||t.targetduration||10,this._live=t.live,this.updateMediaElementDuration())},r.updateMediaElementDuration=function(){var e,t=this.config;if(null!==this._levelDuration&&this.media&&this.mediaSource&&this.sourceBuffer&&0!==this.media.readyState&&"open"===this.mediaSource.readyState){for(var n in this.sourceBuffer){var i=this.sourceBuffer[n];if(i&&!0===i.updating)return}e=this.media.duration,null===this._msDuration&&(this._msDuration=this.mediaSource.duration),!0===this._live&&!0===t.liveDurationInfinity?(c.logger.log("Media Source duration is set to Infinity"),this._msDuration=this.mediaSource.duration=1/0):(this._levelDuration>this._msDuration&&this._levelDuration>e||!Object(l.isFiniteNumber)(e))&&(c.logger.log("Updating Media Source duration to "+this._levelDuration.toFixed(3)),this._msDuration=this.mediaSource.duration=this._levelDuration)}},r.doFlush=function(){for(;this.flushRange.length;){var e=this.flushRange[0];if(!this.flushBuffer(e.start,e.end,e.type))return void(this._needsFlush=!0);this.flushRange.shift(),this.flushBufferCounter=0}if(0===this.flushRange.length){this._needsFlush=!1;var t=0,n=this.sourceBuffer;try{for(var i in n){var r=n[i];r&&(t+=r.buffered.length)}}catch(e){c.logger.error("error while accessing sourceBuffer.buffered")}this.appended=t,this.hls.trigger(u.default.BUFFER_FLUSHED)}},r.doAppending=function(){var e=this.config,t=this.hls,n=this.segments,i=this.sourceBuffer;if(Object.keys(i).length){if(!this.media||this.media.error)return this.segments=[],void c.logger.error("trying to append although a media error occured, flush segment and abort");if(!this.appending){var r=n.shift();if(r)try{var a=i[r.type];if(!a)return void this._onSBUpdateEnd();if(a.updating)return void n.unshift(r);a.ended=!1,this.parent=r.parent,a.appendBuffer(r.data),this.appendError=0,this.appended++,this.appending=!0}catch(i){c.logger.error("error while trying to append buffer:"+i.message),n.unshift(r);var o={type:s.ErrorTypes.MEDIA_ERROR,parent:r.parent,details:"",fatal:!1};22===i.code?(this.segments=[],o.details=s.ErrorDetails.BUFFER_FULL_ERROR):(this.appendError++,o.details=s.ErrorDetails.BUFFER_APPEND_ERROR,this.appendError>e.appendErrorMaxRetry&&(c.logger.log("fail "+e.appendErrorMaxRetry+" times to append segment in sourceBuffer"),this.segments=[],o.fatal=!0)),t.trigger(u.default.ERROR,o)}}}},r.flushBuffer=function(e,t,n){var i=this.sourceBuffer;if(!Object.keys(i).length)return!0;var r="null";if(this.media&&(r=this.media.currentTime.toFixed(3)),c.logger.log("flushBuffer,pos/start/end: "+r+"/"+e+"/"+t),this.flushBufferCounter>=this.appended)return c.logger.warn("abort flushing too many retries"),!0;var a=i[n];if(a){if(a.ended=!1,a.updating)return c.logger.warn("cannot flush, sb updating in progress"),!1;if(this.removeBufferRange(n,a,e,t))return this.flushBufferCounter++,!1}return c.logger.log("buffer flushed"),!0},r.removeBufferRange=function(e,t,n,i){try{for(var r=0;r.5){var u="null";return this.media&&(u=this.media.currentTime.toString()),c.logger.log("sb remove "+e+" ["+s+","+l+"], of ["+a+","+o+"], pos:"+u),t.remove(s,l),!0}}}catch(e){c.logger.warn("removeBufferRange failed",e)}return!1},i}(h);function ze(e,t){for(var n=0;nthis.autoLevelCapping&&t.streamController.nextLevelSwitch(),this.autoLevelCapping=t.autoLevelCapping}}},s.getMaxLevel=function(e){var t=this;if(!this.levels)return-1;var n=this.levels.filter((function(n,r){return i.isLevelAllowed(r,t.restrictedLevels)&&r<=e}));return i.getMaxLevelByMediaSize(n,this.mediaWidth,this.mediaHeight)},s.startCapping=function(){this.timer||(this.autoLevelCapping=Number.POSITIVE_INFINITY,this.hls.firstLevel=this.getMaxLevel(this.firstLevel),clearInterval(this.timer),this.timer=setInterval(this.detectPlayerSize.bind(this),1e3),this.detectPlayerSize())},s.stopCapping=function(){this.restrictedLevels=[],this.firstLevel=null,this.autoLevelCapping=Number.POSITIVE_INFINITY,this.timer&&(this.timer=clearInterval(this.timer),this.timer=null)},i.isLevelAllowed=function(e,t){return void 0===t&&(t=[]),-1===t.indexOf(e)},i.getMaxLevelByMediaSize=function(e,t,n){if(!e||e&&!e.length)return-1;for(var i,r,a=e.length-1,o=0;o=t||s.height>=n)&&(i=s,!(r=e[o+1])||i.width!==r.width||i.height!==r.height)){a=o;break}}return a},r=i,o=[{key:"contentScaleFactor",get:function(){var e=1;try{e=window.devicePixelRatio}catch(e){}return e}}],(a=[{key:"mediaWidth",get:function(){var e,t=this.media;return t&&(e=t.width||t.clientWidth||t.offsetWidth,e*=i.contentScaleFactor),e}},{key:"mediaHeight",get:function(){var e,t=this.media;return t&&(e=t.height||t.clientHeight||t.offsetHeight,e*=i.contentScaleFactor),e}}])&&ze(r.prototype,a),o&&ze(r,o),i}(h),qe=window.performance,Xe=function(e){var t,n;function i(t){return e.call(this,t,u.default.MEDIA_ATTACHING)||this}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var r=i.prototype;return r.destroy=function(){this.timer&&clearInterval(this.timer),this.isVideoPlaybackQualityAvailable=!1},r.onMediaAttaching=function(e){var t=this.hls.config;t.capLevelOnFPSDrop&&("function"==typeof(this.video=e.media instanceof window.HTMLVideoElement?e.media:null).getVideoPlaybackQuality&&(this.isVideoPlaybackQualityAvailable=!0),clearInterval(this.timer),this.timer=setInterval(this.checkFPSInterval.bind(this),t.fpsDroppedMonitoringPeriod))},r.checkFPS=function(e,t,n){var i=qe.now();if(t){if(this.lastTime){var r=i-this.lastTime,a=n-this.lastDroppedFrames,o=t-this.lastDecodedFrames,s=1e3*a/r,l=this.hls;if(l.trigger(u.default.FPS_DROP,{currentDropped:a,currentDecoded:o,totalDroppedFrames:n}),s>0&&a>l.config.fpsDroppedMonitoringThreshold*o){var d=l.currentLevel;c.logger.warn("drop FPS ratio greater than max allowed value for currentLevel: "+d),d>0&&(-1===l.autoLevelCapping||l.autoLevelCapping>=d)&&(d-=1,l.trigger(u.default.FPS_DROP_LEVEL_CAPPING,{level:d,droppedLevel:l.currentLevel}),l.autoLevelCapping=d,l.streamController.nextLevelSwitch())}}this.lastTime=i,this.lastDroppedFrames=n,this.lastDecodedFrames=t}},r.checkFPSInterval=function(){var e=this.video;if(e)if(this.isVideoPlaybackQualityAvailable){var t=e.getVideoPlaybackQuality();this.checkFPS(e,t.totalVideoFrames,t.droppedVideoFrames)}else this.checkFPS(e,e.webkitDecodedFrameCount,e.webkitDroppedFrameCount)},i}(h),Ze=window,Qe=Ze.performance,Je=Ze.XMLHttpRequest,et=function(){function e(e){e&&e.xhrSetup&&(this.xhrSetup=e.xhrSetup)}var t=e.prototype;return t.destroy=function(){this.abort(),this.loader=null},t.abort=function(){var e=this.loader;e&&4!==e.readyState&&(this.stats.aborted=!0,e.abort()),window.clearTimeout(this.requestTimeout),this.requestTimeout=null,window.clearTimeout(this.retryTimeout),this.retryTimeout=null},t.load=function(e,t,n){this.context=e,this.config=t,this.callbacks=n,this.stats={trequest:Qe.now(),retry:0},this.retryDelay=t.retryDelay,this.loadInternal()},t.loadInternal=function(){var e,t=this.context;e=this.loader=new Je;var n=this.stats;n.tfirst=0,n.loaded=0;var i=this.xhrSetup;try{if(i)try{i(e,t.url)}catch(n){e.open("GET",t.url,!0),i(e,t.url)}e.readyState||e.open("GET",t.url,!0)}catch(n){return void this.callbacks.onError({code:e.status,text:n.message},t,e)}t.rangeEnd&&e.setRequestHeader("Range","bytes="+t.rangeStart+"-"+(t.rangeEnd-1)),e.onreadystatechange=this.readystatechange.bind(this),e.onprogress=this.loadprogress.bind(this),e.responseType=t.responseType,this.requestTimeout=window.setTimeout(this.loadtimeout.bind(this),this.config.timeout),e.send()},t.readystatechange=function(e){var t=e.currentTarget,n=t.readyState,i=this.stats,r=this.context,a=this.config;if(!i.aborted&&n>=2)if(window.clearTimeout(this.requestTimeout),0===i.tfirst&&(i.tfirst=Math.max(Qe.now(),i.trequest)),4===n){var o=t.status;if(o>=200&&o<300){var s,l;i.tload=Math.max(i.tfirst,Qe.now()),l="arraybuffer"===r.responseType?(s=t.response).byteLength:(s=t.responseText).length,i.loaded=i.total=l;var u={url:t.responseURL,data:s};this.callbacks.onSuccess(u,i,r,t)}else i.retry>=a.maxRetry||o>=400&&o<499?(c.logger.error(o+" while loading "+r.url),this.callbacks.onError({code:o,text:t.statusText},r,t)):(c.logger.warn(o+" while loading "+r.url+", retrying in "+this.retryDelay+"..."),this.destroy(),this.retryTimeout=window.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,a.maxRetryDelay),i.retry++)}else this.requestTimeout=window.setTimeout(this.loadtimeout.bind(this),a.timeout)},t.loadtimeout=function(){c.logger.warn("timeout while loading "+this.context.url),this.callbacks.onTimeout(this.stats,this.context,null)},t.loadprogress=function(e){var t=e.currentTarget,n=this.stats;n.loaded=e.loaded,e.lengthComputable&&(n.total=e.total);var i=this.callbacks.onProgress;i&&i(n,this.context,null,t)},e}();function tt(e,t){for(var n=0;n=this.tracks.length)c.logger.warn("Invalid audio track id:",e.id);else{if(c.logger.log("audioTrack "+e.id+" loaded"),this.tracks[e.id].details=e.details,e.details.live&&!this.hasInterval()){var t=1e3*e.details.targetduration;this.setInterval(t)}!e.details.live&&this.hasInterval()&&this.clearInterval()}},l.onAudioTrackSwitched=function(e){var t=this.tracks[e.id].groupId;t&&this.audioGroupId!==t&&(this.audioGroupId=t)},l.onLevelLoaded=function(e){this._selectAudioGroup(e.level)},l.onError=function(e){e.type===s.ErrorTypes.NETWORK_ERROR&&(e.fatal&&this.clearInterval(),e.details===s.ErrorDetails.AUDIO_TRACK_LOAD_ERROR&&(c.logger.warn("Network failure on audio-track id:",e.context.id),this._handleLoadError()))},l._setAudioTrack=function(e){if(this._trackId===e&&this.tracks[this._trackId].details)c.logger.debug("Same id as current audio-track passed, and track details available -> no-op");else if(e<0||e>=this.tracks.length)c.logger.warn("Invalid id passed to audio-track controller");else{var t=this.tracks[e];c.logger.log("Now switching to audio-track index "+e),this.clearInterval(),this._trackId=e;var n=t.url,i=t.type,r=t.id;this.hls.trigger(u.default.AUDIO_TRACK_SWITCHING,{id:r,type:i,url:n}),this._loadTrackDetailsIfNeeded(t)}},l.doTick=function(){this._updateTrack(this._trackId)},l._selectAudioGroup=function(e){var t=this.hls.levels[e];if(t&&t.audioGroupIds){var n=t.audioGroupIds[t.urlId];this.audioGroupId!==n&&(this.audioGroupId=n,this._selectInitialAudioTrack())}},l._selectInitialAudioTrack=function(){var e=this,t=this.tracks;if(t.length){var n=this.tracks[this._trackId],i=null;if(n&&(i=n.name),this._selectDefaultTrack){var r=t.filter((function(e){return e.default}));r.length?t=r:c.logger.warn("No default audio tracks defined")}var a=!1,o=function(){t.forEach((function(t){a||e.audioGroupId&&t.groupId!==e.audioGroupId||i&&i!==t.name||(e._setAudioTrack(t.id),a=!0)}))};o(),a||(i=null,o()),a||(c.logger.error("No track found for running audio group-ID: "+this.audioGroupId),this.hls.trigger(u.default.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.AUDIO_TRACK_LOAD_ERROR,fatal:!0}))}},l._needsTrackLoading=function(e){var t=e.details,n=e.url;return!(t&&!t.live||!n)},l._loadTrackDetailsIfNeeded=function(e){if(this._needsTrackLoading(e)){var t=e.url,n=e.id;c.logger.log("loading audio-track playlist for id: "+n),this.hls.trigger(u.default.AUDIO_TRACK_LOADING,{url:t,id:n})}},l._updateTrack=function(e){if(!(e<0||e>=this.tracks.length)){this.clearInterval(),this._trackId=e,c.logger.log("trying to update audio-track "+e);var t=this.tracks[e];this._loadTrackDetailsIfNeeded(t)}},l._handleLoadError=function(){this.trackIdBlacklist[this._trackId]=!0;var e=this._trackId,t=this.tracks[e],n=t.name,i=t.language,r=t.groupId;c.logger.warn("Loading failed on audio track id: "+e+", group-id: "+r+', name/language: "'+n+'" / "'+i+'"');for(var a=e,o=0;o0&&-1===e?(c.logger.log("audio:override startPosition with lastCurrentTime @"+t.toFixed(3)),this.state=me):(this.lastCurrentTime=this.startPosition?this.startPosition:e,this.state=ve),this.nextLoadPosition=this.startPosition=this.lastCurrentTime,this.tick()}else this.startPosition=e,this.state=ge},d.doTick=function(){var e,t,n,i=this.hls,r=i.config;switch(this.state){case we:case ye:case Se:break;case ve:this.state=Te,this.loadedmetadata=!1;break;case me:var a=this.tracks;if(!a)break;if(!this.media&&(this.startFragRequested||!r.startFragPrefetch))break;if(this.loadedmetadata)e=this.media.currentTime;else if(void 0===(e=this.nextLoadPosition))break;var o=this.mediaBuffer?this.mediaBuffer:this.media,s=this.videoBuffer?this.videoBuffer:this.media,d=G.bufferInfo(o,e,r.maxBufferHole),h=G.bufferInfo(s,e,r.maxBufferHole),f=d.len,p=d.end,g=this.fragPrevious,v=Math.min(r.maxBufferLength,r.maxMaxBufferLength),m=Math.max(v,h.len),y=this.audioSwitch,A=this.trackId;if((fk||d.nextStart))return;c.logger.log("alt audio track ahead of main track, seek to start of alt audio track"),this.media.currentTime=k+.05}if(n.initSegment&&!n.initSegment.data)b=n.initSegment;else if(p<=k){if(b=E[0],null!==this.videoTrackCC&&b.cc!==this.videoTrackCC&&(b=function(e,t){return K.search(e,(function(e){return e.cct?-1:0}))}(E,this.videoTrackCC)),n.live&&b.loadIdx&&b.loadIdx===this.fragLoadIdx){var S=d.nextStart?d.nextStart:k;return c.logger.log("no alt audio available @currentTime:"+this.media.currentTime+", seeking @"+(S+.05)),void(this.media.currentTime=S+.05)}}else{var C,w=r.maxFragLookUpTolerance,R=g?E[g.sn-E[0].sn+1]:void 0,O=function(e){var t=Math.min(w,e.duration);return e.start+e.duration-t<=p?1:e.start-t>p&&e.start?-1:0};p<_?(p>_-w&&(w=0),C=R&&!O(R)?R:K.search(E,O)):C=E[T-1],C&&(b=C,k=C.start,g&&b.level===g.level&&b.sn===g.sn&&(b.sn=D||I)&&(c.logger.log("audioStreamController: retryDate reached, switch back to IDLE state"),this.state=me);break;case Re:var P=this.videoTrackCC;if(void 0===this.initPTS[P])break;var x=this.waitingFragment;if(x){var N=x.frag.cc;P!==N?(t=this.tracks[this.trackId]).details&&t.details.live&&(c.logger.warn("Waiting fragment CC ("+N+") does not match video track CC ("+P+")"),this.waitingFragment=null,this.state=me):(this.state=be,this.onFragLoaded(this.waitingFragment),this.waitingFragment=null)}else this.state=me}},d.onMediaAttached=function(e){var t=this.media=this.mediaBuffer=e.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvended=this.onMediaEnded.bind(this),t.addEventListener("seeking",this.onvseeking),t.addEventListener("ended",this.onvended);var n=this.config;this.tracks&&n.autoStartLoad&&this.startLoad(n.startPosition)},d.onMediaDetaching=function(){var e=this.media;e&&e.ended&&(c.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=this.mediaBuffer=this.videoBuffer=null,this.loadedmetadata=!1,this.fragmentTracker.removeAllFragments(),this.stopLoad()},d.onAudioTracksUpdated=function(e){c.logger.log("audio tracks updated"),this.tracks=e.audioTracks},d.onAudioTrackSwitching=function(e){var t=!!e.url;this.trackId=e.id,this.fragCurrent=null,this.state=ye,this.waitingFragment=null,t?this.setInterval(100):this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),t&&(this.audioSwitch=!0,this.state=me),this.tick()},d.onAudioTrackLoaded=function(e){var t=e.details,n=e.id,i=this.tracks[n],r=t.totalduration,a=0;if(c.logger.log("track "+n+" loaded ["+t.startSN+","+t.endSN+"],duration:"+r),t.live){var o=i.details;o&&t.fragments.length>0?(ne(o,t),a=t.fragments[0].start,t.PTSKnown?c.logger.log("live audio playlist sliding:"+a.toFixed(3)):c.logger.log("live audio playlist - outdated PTS, unknown sliding")):(t.PTSKnown=!1,c.logger.log("live audio playlist - first load, unknown sliding"))}else t.PTSKnown=!1;if(i.details=t,!this.startFragRequested){if(-1===this.startPosition){var s=t.startTimeOffset;Object(l.isFiniteNumber)(s)?(c.logger.log("start time offset found in playlist, adjust startPosition to "+s),this.startPosition=s):t.live?(this.startPosition=this.computeLivePosition(a,t),c.logger.log("compute startPosition for audio-track to "+this.startPosition)):this.startPosition=0}this.nextLoadPosition=this.startPosition}this.state===Te&&(this.state=me),this.tick()},d.onKeyLoaded=function(){this.state===Ae&&(this.state=me,this.tick())},d.onFragLoaded=function(e){var t=this.fragCurrent,n=e.frag;if(this.state===be&&t&&"audio"===n.type&&n.level===t.level&&n.sn===t.sn){var i=this.tracks[this.trackId],r=i.details,a=r.totalduration,o=t.level,s=t.sn,l=t.cc,d=this.config.defaultAudioCodec||i.audioCodec||"mp4a.40.2",h=this.stats=e.stats;if("initSegment"===s)this.state=me,h.tparsed=h.tbuffered=rt.now(),r.initSegment.data=e.payload,this.hls.trigger(u.default.FRAG_BUFFERED,{stats:h,frag:t,id:"audio"}),this.tick();else{this.state=ke,this.appended=!1,this.demuxer||(this.demuxer=new Q(this.hls,"audio"));var f=this.initPTS[l],p=r.initSegment?r.initSegment.data:[];r.initSegment||void 0!==f?(this.pendingBuffering=!0,c.logger.log("Demuxing "+s+" of ["+r.startSN+" ,"+r.endSN+"],track "+o),this.demuxer.push(e.payload,p,d,null,t,a,!1,f)):(c.logger.log("unknown video PTS for continuity counter "+l+", waiting for video PTS before demuxing audio frag "+s+" of ["+r.startSN+" ,"+r.endSN+"],track "+o),this.waitingFragment=e,this.state=Re)}}this.fragLoadError=0},d.onFragParsingInitSegment=function(e){var t=this.fragCurrent,n=e.frag;if(t&&"audio"===e.id&&n.sn===t.sn&&n.level===t.level&&this.state===ke){var i,r=e.tracks;if(r.video&&delete r.video,i=r.audio){i.levelCodec=i.codec,i.id=e.id,this.hls.trigger(u.default.BUFFER_CODECS,r),c.logger.log("audio track:audio,container:"+i.container+",codecs[level/parsed]=["+i.levelCodec+"/"+i.codec+"]");var a=i.initSegment;if(a){var o={type:"audio",data:a,parent:"audio",content:"initSegment"};this.audioSwitch?this.pendingData=[o]:(this.appended=!0,this.pendingBuffering=!0,this.hls.trigger(u.default.BUFFER_APPENDING,o))}this.tick()}}},d.onFragParsingData=function(e){var t=this,n=this.fragCurrent,i=e.frag;if(n&&"audio"===e.id&&"audio"===e.type&&i.sn===n.sn&&i.level===n.level&&this.state===ke){var r=this.trackId,a=this.tracks[r],o=this.hls;Object(l.isFiniteNumber)(e.endPTS)||(e.endPTS=e.startPTS+n.duration,e.endDTS=e.startDTS+n.duration),n.addElementaryStream(g.AUDIO),c.logger.log("parsed "+e.type+",PTS:["+e.startPTS.toFixed(3)+","+e.endPTS.toFixed(3)+"],DTS:["+e.startDTS.toFixed(3)+"/"+e.endDTS.toFixed(3)+"],nb:"+e.nb),te(a.details,n,e.startPTS,e.endPTS);var d=this.audioSwitch,h=this.media,f=!1;if(d)if(h&&h.readyState){var p=h.currentTime;c.logger.log("switching audio track : currentTime:"+p),p>=e.startPTS&&(c.logger.log("switching audio track : flushing all audio"),this.state=Se,o.trigger(u.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"}),f=!0,this.audioSwitch=!1,o.trigger(u.default.AUDIO_TRACK_SWITCHED,{id:r}))}else this.audioSwitch=!1,o.trigger(u.default.AUDIO_TRACK_SWITCHED,{id:r});var v=this.pendingData;if(!v)return c.logger.warn("Apparently attempt to enqueue media payload without codec initialization data upfront"),void o.trigger(u.default.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:null,fatal:!0});this.audioSwitch||([e.data1,e.data2].forEach((function(t){t&&t.length&&v.push({type:e.type,data:t,parent:"audio",content:"data"})})),!f&&v.length&&(v.forEach((function(e){t.state===ke&&(t.pendingBuffering=!0,t.hls.trigger(u.default.BUFFER_APPENDING,e))})),this.pendingData=[],this.appended=!0)),this.tick()}},d.onFragParsed=function(e){var t=this.fragCurrent,n=e.frag;t&&"audio"===e.id&&n.sn===t.sn&&n.level===t.level&&this.state===ke&&(this.stats.tparsed=rt.now(),this.state=_e,this._checkAppendedParsed())},d.onBufferReset=function(){this.mediaBuffer=this.videoBuffer=null,this.loadedmetadata=!1},d.onBufferCreated=function(e){var t=e.tracks.audio;t&&(this.mediaBuffer=t.buffer,this.loadedmetadata=!0),e.tracks.video&&(this.videoBuffer=e.tracks.video.buffer)},d.onBufferAppended=function(e){if("audio"===e.parent){var t=this.state;t!==ke&&t!==_e||(this.pendingBuffering=e.pending>0,this._checkAppendedParsed())}},d._checkAppendedParsed=function(){if(!(this.state!==_e||this.appended&&this.pendingBuffering)){var e=this.fragCurrent,t=this.stats,n=this.hls;if(e){this.fragPrevious=e,t.tbuffered=rt.now(),n.trigger(u.default.FRAG_BUFFERED,{stats:t,frag:e,id:"audio"});var i=this.mediaBuffer?this.mediaBuffer:this.media;i&&c.logger.log("audio buffered : "+ae.toString(i.buffered)),this.audioSwitch&&this.appended&&(this.audioSwitch=!1,n.trigger(u.default.AUDIO_TRACK_SWITCHED,{id:this.trackId})),this.state=me}this.tick()}},d.onError=function(e){var t=e.frag;if(!t||"audio"===t.type)switch(e.details){case s.ErrorDetails.FRAG_LOAD_ERROR:case s.ErrorDetails.FRAG_LOAD_TIMEOUT:var n=e.frag;if(n&&"audio"!==n.type)break;if(!e.fatal){var i=this.fragLoadError;i?i++:i=1;var r=this.config;if(i<=r.fragLoadingMaxRetry){this.fragLoadError=i;var a=Math.min(Math.pow(2,i-1)*r.fragLoadingRetryDelay,r.fragLoadingMaxRetryTimeout);c.logger.warn("AudioStreamController: frag loading failed, retry in "+a+" ms"),this.retryDate=rt.now()+a,this.state=Ee}else c.logger.error("AudioStreamController: "+e.details+" reaches max retry, redispatch as fatal ..."),e.fatal=!0,this.state=we}break;case s.ErrorDetails.AUDIO_TRACK_LOAD_ERROR:case s.ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT:case s.ErrorDetails.KEY_LOAD_ERROR:case s.ErrorDetails.KEY_LOAD_TIMEOUT:this.state!==we&&(this.state=e.fatal?we:me,c.logger.warn("AudioStreamController: "+e.details+" while loading frag, now switching to "+this.state+" state ..."));break;case s.ErrorDetails.BUFFER_FULL_ERROR:if("audio"===e.parent&&(this.state===ke||this.state===_e)){var o=this.mediaBuffer,l=this.media.currentTime;if(o&&G.isBuffered(o,l)&&G.isBuffered(o,l+.5)){var d=this.config;d.maxMaxBufferLength>=d.maxBufferLength&&(d.maxMaxBufferLength/=2,c.logger.warn("AudioStreamController: reduce max buffer length to "+d.maxMaxBufferLength+"s")),this.state=me}else c.logger.warn("AudioStreamController: buffer full error also media.currentTime is not buffered, flush audio buffer"),this.fragCurrent=null,this.state=Se,this.hls.trigger(u.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:"audio"})}}},d.onBufferFlushed=function(){var e=this,t=this.pendingData;t&&t.length?(c.logger.log("AudioStreamController: appending pending audio data after buffer flushed"),t.forEach((function(t){e.hls.trigger(u.default.BUFFER_APPENDING,t)})),this.appended=!0,this.pendingData=[],this.state=_e):(this.state=me,this.fragPrevious=null,this.tick())},r=i,(a=[{key:"state",set:function(e){if(this.state!==e){var t=this.state;this._state=e,c.logger.log("audio stream:"+t+"->"+e)}},get:function(){return this._state}}])&&it(r.prototype,a),o&&it(r,o),i}(Le),ot=function(){if("undefined"!=typeof window&&window.VTTCue)return window.VTTCue;var e={"":!0,lr:!0,rl:!0},t={start:!0,middle:!0,end:!0,left:!0,right:!0};function n(e){return"string"==typeof e&&!!t[e.toLowerCase()]&&e.toLowerCase()}function i(e){for(var t=1;t100)throw new Error("Position must be between 0 and 100.");y=e,this.hasBeenReset=!0}})),Object.defineProperty(o,"positionAlign",i({},s,{get:function(){return A},set:function(e){var t=n(e);if(!t)throw new SyntaxError("An invalid or illegal string was specified.");A=t,this.hasBeenReset=!0}})),Object.defineProperty(o,"size",i({},s,{get:function(){return b},set:function(e){if(e<0||e>100)throw new Error("Size must be between 0 and 100.");b=e,this.hasBeenReset=!0}})),Object.defineProperty(o,"align",i({},s,{get:function(){return E},set:function(e){var t=n(e);if(!t)throw new SyntaxError("An invalid or illegal string was specified.");E=t,this.hasBeenReset=!0}})),o.displayState=void 0}return r.prototype.getCueAsHTML=function(){return window.WebVTT.convertCueToDOMTree(window,this.text)},r}(),st=function(){return{decode:function(e){if(!e)return"";if("string"!=typeof e)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(e))}}};function lt(){this.window=window,this.state="INITIAL",this.buffer="",this.decoder=new st,this.regionList=[]}function ut(){this.values=Object.create(null)}function ct(e,t,n,i){var r=i?e.split(i):[e];for(var a in r)if("string"==typeof r[a]){var o=r[a].split(n);2===o.length&&t(o[0],o[1])}}ut.prototype={set:function(e,t){this.get(e)||""===t||(this.values[e]=t)},get:function(e,t,n){return n?this.has(e)?this.values[e]:t[n]:this.has(e)?this.values[e]:t},has:function(e){return e in this.values},alt:function(e,t,n){for(var i=0;i=0&&t<=100)&&(this.set(e,t),!0)}};var dt=new ot(0,0,0),ht="middle"===dt.align?"middle":"center";function ft(e,t,n){var i=e;function r(){var t=function(e){function t(e,t,n,i){return 3600*(0|e)+60*(0|t)+(0|n)+(0|i)/1e3}var n=e.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);return n?n[3]?t(n[1],n[2],n[3].replace(":",""),n[4]):n[1]>59?t(n[1],n[2],0,n[4]):t(0,n[1],n[2],n[4]):null}(e);if(null===t)throw new Error("Malformed timestamp: "+i);return e=e.replace(/^[^\sa-zA-Z-]+/,""),t}function a(){e=e.replace(/^\s+/,"")}if(a(),t.startTime=r(),a(),"--\x3e"!==e.substr(0,3))throw new Error("Malformed time stamp (time stamps must be separated by '--\x3e'): "+i);e=e.substr(3),a(),t.endTime=r(),a(),function(e,t){var i=new ut;ct(e,(function(e,t){switch(e){case"region":for(var r=n.length-1;r>=0;r--)if(n[r].id===t){i.set(e,n[r].region);break}break;case"vertical":i.alt(e,t,["rl","lr"]);break;case"line":var a=t.split(","),o=a[0];i.integer(e,o),i.percent(e,o)&&i.set("snapToLines",!1),i.alt(e,o,["auto"]),2===a.length&&i.alt("lineAlign",a[1],["start",ht,"end"]);break;case"position":a=t.split(","),i.percent(e,a[0]),2===a.length&&i.alt("positionAlign",a[1],["start",ht,"end","line-left","line-right","auto"]);break;case"size":i.percent(e,t);break;case"align":i.alt(e,t,["start",ht,"end","left","right"])}}),/:/,/\s/),t.region=i.get("region",null),t.vertical=i.get("vertical","");var r=i.get("line","auto");"auto"===r&&-1===dt.line&&(r=-1),t.line=r,t.lineAlign=i.get("lineAlign","start"),t.snapToLines=i.get("snapToLines",!0),t.size=i.get("size",100),t.align=i.get("align",ht);var a=i.get("position","auto");"auto"===a&&50===dt.position&&(a="start"===t.align||"left"===t.align?0:"end"===t.align||"right"===t.align?100:50),t.position=a}(e,t)}function pt(e){return e.replace(//gi,"\n")}lt.prototype={parse:function(e){var t=this;function n(){var e=t.buffer,n=0;for(e=pt(e);n=16?s--:s++,navigator.userAgent.match(/Firefox\//)?a.line=c+1:a.line=c>7?c-2:c+1,a.align="left",a.position=Math.max(0,Math.min(100,s/32*100)),e.addCue(a)}}var mt,yt={42:225,92:233,94:237,95:243,96:250,123:231,124:247,125:209,126:241,127:9608,128:174,129:176,130:189,131:191,132:8482,133:162,134:163,135:9834,136:224,137:32,138:232,139:226,140:234,141:238,142:244,143:251,144:193,145:201,146:211,147:218,148:220,149:252,150:8216,151:161,152:42,153:8217,154:9473,155:169,156:8480,157:8226,158:8220,159:8221,160:192,161:194,162:199,163:200,164:202,165:203,166:235,167:206,168:207,169:239,170:212,171:217,172:249,173:219,174:171,175:187,176:195,177:227,178:205,179:204,180:236,181:210,182:242,183:213,184:245,185:123,186:125,187:92,188:94,189:95,190:124,191:8764,192:196,193:228,194:214,195:246,196:223,197:165,198:164,199:9475,200:197,201:229,202:216,203:248,204:9487,205:9491,206:9495,207:9499},At=function(e){var t=e;return yt.hasOwnProperty(e)&&(t=yt[e]),String.fromCharCode(t)},bt={17:1,18:3,21:5,22:7,23:9,16:11,19:12,20:14},Et={17:2,18:4,21:6,22:8,23:10,19:13,20:15},Tt={25:1,26:3,29:5,30:7,31:9,24:11,27:12,28:14},kt={25:2,26:4,29:6,30:8,31:10,27:13,28:15},_t=["white","green","blue","cyan","red","yellow","magenta","black","transparent"];!function(e){e[e.ERROR=0]="ERROR",e[e.TEXT=1]="TEXT",e[e.WARNING=2]="WARNING",e[e.INFO=2]="INFO",e[e.DEBUG=3]="DEBUG",e[e.DATA=3]="DATA"}(mt||(mt={}));var St={verboseFilter:{DATA:3,DEBUG:3,INFO:2,WARNING:2,TEXT:1,ERROR:0},time:null,verboseLevel:0,setTime:function(e){this.time=e},log:function(e,t){this.verboseFilter[e],this.verboseLevel}},Ct=function(e){for(var t=[],n=0;n100&&(St.log("ERROR","Too large cursor position "+this.pos),this.pos=100)},t.moveCursor=function(e){var t=this.pos+e;if(e>1)for(var n=this.pos+1;n=144&&this.backSpace();var t=At(e);this.pos>=100?St.log("ERROR","Cannot insert "+e.toString(16)+" ("+t+") at position "+this.pos+". Skipping it!"):(this.chars[this.pos].setChar(t,this.currPenState),this.moveCursor(1))},t.clearFromPos=function(e){var t;for(t=e;t<100;t++)this.chars[t].reset()},t.clear=function(){this.clearFromPos(0),this.pos=0,this.currPenState.reset()},t.clearToEndOfRow=function(){this.clearFromPos(this.pos)},t.getTextString=function(){for(var e=[],t=!0,n=0;n<100;n++){var i=this.chars[n].uchar;" "!==i&&(t=!1),e.push(i)}return t?"":e.join("")},t.setPenStyles=function(e){this.currPenState.setStyles(e),this.chars[this.pos].setPenState(this.currPenState)},e}(),Lt=function(){function e(){this.rows=void 0,this.currRow=void 0,this.nrRollUpRows=void 0,this.lastOutputScreen=void 0,this.rows=[];for(var e=0;e<15;e++)this.rows.push(new Ot);this.currRow=14,this.nrRollUpRows=null,this.reset()}var t=e.prototype;return t.reset=function(){for(var e=0;e<15;e++)this.rows[e].clear();this.currRow=14},t.equals=function(e){for(var t=!0,n=0;n<15;n++)if(!this.rows[n].equals(e.rows[n])){t=!1;break}return t},t.copy=function(e){for(var t=0;t<15;t++)this.rows[t].copy(e.rows[t])},t.isEmpty=function(){for(var e=!0,t=0;t<15;t++)if(!this.rows[t].isEmpty()){e=!1;break}return e},t.backSpace=function(){this.rows[this.currRow].backSpace()},t.clearToEndOfRow=function(){this.rows[this.currRow].clearToEndOfRow()},t.insertChar=function(e){this.rows[this.currRow].insertChar(e)},t.setPen=function(e){this.rows[this.currRow].setPenStyles(e)},t.moveCursor=function(e){this.rows[this.currRow].moveCursor(e)},t.setCursor=function(e){St.log("INFO","setCursor: "+e),this.rows[this.currRow].setCursor(e)},t.setPAC=function(e){St.log("INFO","pacData = "+JSON.stringify(e));var t=e.row-1;if(this.nrRollUpRows&&t0&&(n=e?"["+t.join(" | ")+"]":t.join("\n")),n},t.getTextAndFormat=function(){return this.rows},e}(),Dt=function(){function e(e,t){this.chNr=void 0,this.outputFilter=void 0,this.mode=void 0,this.verbose=void 0,this.displayedMemory=void 0,this.nonDisplayedMemory=void 0,this.lastOutputScreen=void 0,this.currRollUpRow=void 0,this.writeScreen=void 0,this.cueStartTime=void 0,this.lastCueEndTime=void 0,this.chNr=e,this.outputFilter=t,this.mode=null,this.verbose=0,this.displayedMemory=new Lt,this.nonDisplayedMemory=new Lt,this.lastOutputScreen=new Lt,this.currRollUpRow=this.displayedMemory.rows[14],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null}var t=e.prototype;return t.reset=function(){this.mode=null,this.displayedMemory.reset(),this.nonDisplayedMemory.reset(),this.lastOutputScreen.reset(),this.currRollUpRow=this.displayedMemory.rows[14],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null},t.getHandler=function(){return this.outputFilter},t.setHandler=function(e){this.outputFilter=e},t.setPAC=function(e){this.writeScreen.setPAC(e)},t.setBkgData=function(e){this.writeScreen.setBkgData(e)},t.setMode=function(e){e!==this.mode&&(this.mode=e,St.log("INFO","MODE="+e),"MODE_POP-ON"===this.mode?this.writeScreen=this.nonDisplayedMemory:(this.writeScreen=this.displayedMemory,this.writeScreen.reset()),"MODE_ROLL-UP"!==this.mode&&(this.displayedMemory.nrRollUpRows=null,this.nonDisplayedMemory.nrRollUpRows=null),this.mode=e)},t.insertChars=function(e){for(var t=0;t=46,t.italics)t.foreground="white";else{var n=Math.floor(e/2)-16;t.foreground=["white","green","blue","cyan","red","yellow","magenta"][n]}St.log("INFO","MIDROW: "+JSON.stringify(t)),this.writeScreen.setPen(t)},t.outputDataUpdate=function(e){void 0===e&&(e=!1);var t=St.time;null!==t&&this.outputFilter&&(null!==this.cueStartTime||this.displayedMemory.isEmpty()?this.displayedMemory.equals(this.lastOutputScreen)||(this.outputFilter.newCue(this.cueStartTime,t,this.lastOutputScreen),e&&this.outputFilter.dispatchCue&&this.outputFilter.dispatchCue(),this.cueStartTime=this.displayedMemory.isEmpty()?null:t):this.cueStartTime=t,this.lastOutputScreen.copy(this.displayedMemory))},t.cueSplitAtTime=function(e){this.outputFilter&&(this.displayedMemory.isEmpty()||(this.outputFilter.newCue&&this.outputFilter.newCue(this.cueStartTime,e,this.displayedMemory),this.cueStartTime=e))},e}(),It=function(){function e(e,t,n){this.field=void 0,this.outputs=void 0,this.channels=void 0,this.currChNr=void 0,this.lastCmdA=void 0,this.lastCmdB=void 0,this.lastTime=void 0,this.dataCounters=void 0,this.field=e||1,this.outputs=[t,n],this.channels=[new Dt(1,t),new Dt(2,n)],this.currChNr=-1,this.lastCmdA=null,this.lastCmdB=null,this.lastTime=null,this.dataCounters={padding:0,char:0,cmd:0,other:0}}var t=e.prototype;return t.getHandler=function(e){return this.channels[e].getHandler()},t.setHandler=function(e,t){this.channels[e].setHandler(t)},t.addData=function(e,t){var n,i,r,a=!1;this.lastTime=e,St.setTime(e);for(var o=0;o ("+Ct([i,r])+")"),(n=this.parseCmd(i,r))||(n=this.parseMidrow(i,r)),n||(n=this.parsePAC(i,r)),n||(n=this.parseBackgroundAttributes(i,r)),n||(a=this.parseChars(i,r))&&(this.currChNr&&this.currChNr>=0?this.channels[this.currChNr-1].insertChars(a):St.log("WARNING","No channel found yet. TEXT-MODE?")),n?this.dataCounters.cmd+=2:a?this.dataCounters.char+=2:(this.dataCounters.other+=2,St.log("WARNING","Couldn't parse cleaned data "+Ct([i,r])+" orig: "+Ct([t[o],t[o+1]])))):this.dataCounters.padding+=2},t.parseCmd=function(e,t){var n=null;if(!((20===e||28===e)&&t>=32&&t<=47||(23===e||31===e)&&t>=33&&t<=35))return!1;if(e===this.lastCmdA&&t===this.lastCmdB)return this.lastCmdA=null,this.lastCmdB=null,St.log("DEBUG","Repeated command ("+Ct([e,t])+") is dropped"),!0;n=20===e||23===e?1:2;var i=this.channels[n-1];return 20===e||28===e?32===t?i.ccRCL():33===t?i.ccBS():34===t?i.ccAOF():35===t?i.ccAON():36===t?i.ccDER():37===t?i.ccRU(2):38===t?i.ccRU(3):39===t?i.ccRU(4):40===t?i.ccFON():41===t?i.ccRDC():42===t?i.ccTR():43===t?i.ccRTD():44===t?i.ccEDM():45===t?i.ccCR():46===t?i.ccENM():47===t&&i.ccEOC():i.ccTO(t-32),this.lastCmdA=e,this.lastCmdB=t,this.currChNr=n,!0},t.parseMidrow=function(e,t){var n=null;return(17===e||25===e)&&t>=32&&t<=47&&((n=17===e?1:2)!==this.currChNr?(St.log("ERROR","Mismatch channel in midrow parsing"),!1):(this.channels[n-1].ccMIDROW(t),St.log("DEBUG","MIDROW ("+Ct([e,t])+")"),!0))},t.parsePAC=function(e,t){var n,i=null;if(!((e>=17&&e<=23||e>=25&&e<=31)&&t>=64&&t<=127||(16===e||24===e)&&t>=64&&t<=95))return!1;if(e===this.lastCmdA&&t===this.lastCmdB)return this.lastCmdA=null,this.lastCmdB=null,!0;n=e<=23?1:2,i=t>=64&&t<=95?1===n?bt[e]:Tt[e]:1===n?Et[e]:kt[e];var r=this.interpretPAC(i,t);return this.channels[n-1].setPAC(r),this.lastCmdA=e,this.lastCmdB=t,this.currChNr=n,!0},t.interpretPAC=function(e,t){var n=t,i={color:null,italics:!1,indent:null,underline:!1,row:e};return n=t>95?t-96:t-64,i.underline=1==(1&n),n<=13?i.color=["white","green","blue","cyan","red","yellow","magenta","white"][Math.floor(n/2)]:n<=15?(i.italics=!0,i.color="white"):i.indent=4*Math.floor((n-16)/2),i},t.parseChars=function(e,t){var n=null,i=null,r=null;if(e>=25?(n=2,r=e-8):(n=1,r=e),r>=17&&r<=19){var a=t;a=17===r?t+80:18===r?t+112:t+144,St.log("INFO","Special char '"+At(a)+"' in channel "+n),i=[a]}else e>=32&&e<=127&&(i=0===t?[e]:[e,t]);if(i){var o=Ct(i);St.log("DEBUG","Char codes = "+o.join(",")),this.lastCmdA=null,this.lastCmdB=null}return i},t.parseBackgroundAttributes=function(e,t){var n,i,r;return((16===e||24===e)&&t>=32&&t<=47||(23===e||31===e)&&t>=45&&t<=47)&&(n={},16===e||24===e?(i=Math.floor((t-32)/2),n.background=_t[i],t%2==1&&(n.background=n.background+"_semi")):45===t?n.background="transparent":(n.foreground="black",47===t&&(n.underline=!0)),r=e<24?1:2,this.channels[r-1].setBkgData(n),this.lastCmdA=null,this.lastCmdB=null,!0)},t.reset=function(){for(var e=0;ee)&&(this.startTime=e),this.endTime=t,this.screen=n,this.timelineController.createCaptionsTrack(this.trackName)},e}(),xt=function(e,t,n){return e.substr(n||0,t.length)===t},Nt=function(e){for(var t=5381,n=e.length;n;)t=33*t^e.charCodeAt(--n);return(t>>>0).toString()},Mt={parse:function(e,t,n,i,r,a){var o,s=Object(Me.utf8ArrayToStr)(new Uint8Array(e)).trim().replace(/\r\n|\n\r|\n|\r/g,"\n").split("\n"),u="00:00.000",c=0,d=0,h=0,f=[],p=!0,g=!1,v=new gt;v.oncue=function(e){var t=n[i],r=n.ccOffset;t&&t.new&&(void 0!==d?r=n.ccOffset=t.start:function(e,t,n){var i=e[t],r=e[i.prevCC];if(!r||!r.new&&i.new)return e.ccOffset=e.presentationOffset=i.start,void(i.new=!1);for(;r&&r.new;)e.ccOffset+=i.start-r.start,i.new=!1,r=e[(i=r).prevCC];e.presentationOffset=n}(n,i,h)),h&&(r=h-n.presentationOffset),g&&(e.startTime+=r-d,e.endTime+=r-d),e.id=Nt(e.startTime.toString())+Nt(e.endTime.toString())+Nt(e.text),e.text=decodeURIComponent(encodeURIComponent(e.text)),e.endTime>0&&f.push(e)},v.onparsingerror=function(e){o=e},v.onflush=function(){o&&a?a(o):r(f)},s.forEach((function(e){if(p){if(xt(e,"X-TIMESTAMP-MAP=")){p=!1,g=!0,e.substr(16).split(",").forEach((function(e){xt(e,"LOCAL:")?u=e.substr(6):xt(e,"MPEGTS:")&&(c=parseInt(e.substr(7)))}));try{t+(9e4*n[i].start||0)<0&&(t+=8589934592),c-=t,d=function(e){var t=parseInt(e.substr(-3)),n=parseInt(e.substr(-6,2)),i=parseInt(e.substr(-9,2)),r=e.length>9?parseInt(e.substr(0,e.indexOf(":"))):0;if(!(Object(l.isFiniteNumber)(t)&&Object(l.isFiniteNumber)(n)&&Object(l.isFiniteNumber)(i)&&Object(l.isFiniteNumber)(r)))throw Error("Malformed X-TIMESTAMP-MAP: Local:"+e);return t+=1e3*n,t+=6e4*i,t+=36e5*r}(u)/1e3,h=c/9e4}catch(e){g=!1,o=e}return}""===e&&(p=!1)}v.parse(e+"\n")})),v.flush()}};function Ft(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function Bt(e,t){return e&&e.label===t.name&&!(e.textTrack1||e.textTrack2)}var Ut=function(e){var t,n;function i(t){var n;if((n=e.call(this,t,u.default.MEDIA_ATTACHING,u.default.MEDIA_DETACHING,u.default.FRAG_PARSING_USERDATA,u.default.FRAG_DECRYPTED,u.default.MANIFEST_LOADING,u.default.MANIFEST_LOADED,u.default.FRAG_LOADED,u.default.INIT_PTS_FOUND)||this).media=null,n.config=void 0,n.enabled=!0,n.Cues=void 0,n.textTracks=[],n.tracks=[],n.initPTS=[],n.unparsedVttFrags=[],n.cueRanges=[],n.captionsTracks={},n.captionsProperties=void 0,n.cea608Parser=void 0,n.lastSn=-1,n.prevCC=-1,n.vttCCs=null,n.hls=t,n.config=t.config,n.Cues=t.config.cueHandler,n.captionsProperties={textTrack1:{label:n.config.captionsTextTrack1Label,languageCode:n.config.captionsTextTrack1LanguageCode},textTrack2:{label:n.config.captionsTextTrack2Label,languageCode:n.config.captionsTextTrack2LanguageCode}},n.config.enableCEA708Captions){var i=new Pt(Ft(n),"textTrack1"),r=new Pt(Ft(n),"textTrack2");n.cea608Parser=new It(0,i,r)}return n}n=e,(t=i).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n;var r=i.prototype;return r.addCues=function(e,t,n,i){for(var r,a,o,s,l=this.cueRanges,u=!1,c=l.length;c--;){var d=l[c],h=(r=d[0],a=d[1],o=t,s=n,Math.min(a,s)-Math.max(r,o));if(h>=0&&(d[0]=Math.min(d[0],t),d[1]=Math.max(d[1],n),u=!0,h/(n-t)>.5))return}u||l.push([t,n]),this.Cues.newCue(this.captionsTracks[e],t,n,i)},r.onInitPtsFound=function(e){var t=this,n=e.frag,i=e.id,r=e.initPTS,a=this.unparsedVttFrags;"main"===i&&(this.initPTS[n.cc]=r),a.length&&(this.unparsedVttFrags=[],a.forEach((function(e){t.onFragLoaded(e)})))},r.getExistingTrack=function(e){var t=this.media;if(t)for(var n=0;n=a.length||n!==r||!o||this.stopped)this._clearReloadTimer();else if(c.logger.log("subtitle track "+n+" loaded"),i.live){var s=re(o.details,i,e.stats.trequest);c.logger.log("Reloading live subtitle playlist in "+s+"ms"),this.timer=setTimeout((function(){t._loadCurrentTrack()}),s)}else this._clearReloadTimer()},s.startLoad=function(){this.stopped=!1,this._loadCurrentTrack()},s.stopLoad=function(){this.stopped=!0,this._clearReloadTimer()},s._clearReloadTimer=function(){this.timer&&(clearTimeout(this.timer),this.timer=null)},s._loadCurrentTrack=function(){var e=this.trackId,t=this.tracks,n=this.hls,i=t[e];e<0||!i||i.details&&!i.details.live||(c.logger.log("Loading subtitle track "+e),n.trigger(u.default.SUBTITLE_TRACK_LOADING,{url:i.url,id:e}))},s._toggleTrackModes=function(e){var t=this.media,n=this.subtitleDisplay,i=this.trackId;if(t){var r=Vt(t.textTracks);if(-1===e)[].slice.call(r).forEach((function(e){e.mode="disabled"}));else{var a=r[i];a&&(a.mode="disabled")}var o=r[e];o&&(o.mode=n?"showing":"hidden")}},s._setSubtitleTrackInternal=function(e){var t=this.hls,n=this.tracks;!Object(l.isFiniteNumber)(e)||e<-1||e>=n.length||(this.trackId=e,c.logger.log("Switching to subtitle track "+e),t.trigger(u.default.SUBTITLE_TRACK_SWITCH,{id:e}),this._loadCurrentTrack())},s._onTextTracksChanged=function(){if(this.media){for(var e=-1,t=Vt(this.media.textTracks),n=0;n=i[o].start&&a<=i[o].end){r=i[o];break}var s=t.start+t.duration;r?r.end=s:(r={start:a,end:s},i.push(r))}}},r.onMediaAttached=function(e){var t=e.media;this.media=t,t.addEventListener("seeking",this._onMediaSeeking),this.state=me},r.onMediaDetaching=function(){var e=this;this.media&&(this.media.removeEventListener("seeking",this._onMediaSeeking),this.fragmentTracker.removeAllFragments(),this.currentTrackId=-1,this.tracks.forEach((function(t){e.tracksBuffered[t.id]=[]})),this.media=null,this.state=ge)},r.onError=function(e){var t=e.frag;t&&"subtitle"===t.type&&(this.state=me)},r.onSubtitleTracksUpdated=function(e){var t=this;c.logger.log("subtitle tracks updated"),this.tracksBuffered=[],this.tracks=e.subtitleTracks,this.tracks.forEach((function(e){t.tracksBuffered[e.id]=[]}))},r.onSubtitleTrackSwitch=function(e){if(this.currentTrackId=e.id,this.tracks&&this.tracks.length&&-1!==this.currentTrackId){var t=this.tracks[this.currentTrackId];t&&t.details&&this.setInterval(500)}else this.clearInterval()},r.onSubtitleTrackLoaded=function(e){var t=e.id,n=e.details,i=this.currentTrackId,r=this.tracks,a=r[i];t>=r.length||t!==i||!a||(n.live&&function(e,t,n){void 0===n&&(n=0);var i=-1;ie(e,t,(function(e,t,n){t.start=e.start,i=n}));var r=t.fragments;if(i<0)r.forEach((function(e){e.start+=n}));else for(var a=i+1;a0&&n&&n.key&&"AES-128"===n.method){var a=Ht.now();this.decrypter.decrypt(e.payload,n.key.buffer,n.iv.buffer,(function(e){var t=Ht.now();r.trigger(u.default.FRAG_DECRYPTED,{frag:i,payload:e,stats:{tstart:a,tdecrypt:t}})}))}},r.onLevelUpdated=function(e){var t=e.details.fragments;this.lastAVStart=t.length?t[0].start:0},r.doTick=function(){if(this.media)switch(this.state){case me:var e=this.config,t=this.currentTrackId,n=this.fragmentTracker,i=this.media,r=this.tracks;if(!r||!r[t]||!r[t].details)break;var a,o=e.maxBufferHole,s=e.maxFragLookUpTolerance,l=Math.min(e.maxBufferLength,e.maxMaxBufferLength),d=G.bufferedInfo(this._getBuffered(),i.currentTime,o),h=d.end,f=d.len,p=r[t].details,g=p.fragments,v=g.length,m=g[v-1].start+g[v-1].duration;if(f>l)return;var y=this.fragPrevious;h3)return void this.hls.trigger(u.default.ERROR,{type:s.ErrorTypes.KEY_SYSTEM_ERROR,details:s.ErrorDetails.KEY_SYSTEM_LICENSE_REQUEST_FAILED,fatal:!0});var r=3-this._requestLicenseFailureCount+1;c.logger.warn("Retrying license request, "+r+" attempts left"),this._requestLicense(n,i)}}},l._generateLicenseRequestChallenge=function(e,t){switch(e.mediaKeySystemDomain){case Kt.WIDEVINE:return t}throw new Error("unsupported key-system: "+e.mediaKeySystemDomain)},l._requestLicense=function(e,t){c.logger.log("Requesting content license for key-system");var n=this._mediaKeysList[0];if(!n)return c.logger.error("Fatal error: Media is encrypted but no key-system access has been obtained yet"),void this.hls.trigger(u.default.ERROR,{type:s.ErrorTypes.KEY_SYSTEM_ERROR,details:s.ErrorDetails.KEY_SYSTEM_NO_ACCESS,fatal:!0});try{var i=this.getLicenseServerUrl(n.mediaKeySystemDomain),r=this._createLicenseXhr(i,e,t);c.logger.log("Sending license request to URL: "+i);var a=this._generateLicenseRequestChallenge(n,e);r.send(a)}catch(e){c.logger.error("Failure requesting DRM license: "+e),this.hls.trigger(u.default.ERROR,{type:s.ErrorTypes.KEY_SYSTEM_ERROR,details:s.ErrorDetails.KEY_SYSTEM_LICENSE_REQUEST_FAILED,fatal:!0})}},l.onMediaAttached=function(e){if(this._emeEnabled){var t=e.media;this._media=t,t.addEventListener("encrypted",this._onMediaEncrypted)}},l.onMediaDetached=function(){this._media&&(this._media.removeEventListener("encrypted",this._onMediaEncrypted),this._media=null)},l.onManifestParsed=function(e){if(this._emeEnabled){var t=e.levels.map((function(e){return e.audioCodec})),n=e.levels.map((function(e){return e.videoCodec}));this._attemptKeySystemAccess(Kt.WIDEVINE,t,n)}},r=i,(a=[{key:"requestMediaKeySystemAccess",get:function(){if(!this._requestMediaKeySystemAccess)throw new Error("No requestMediaKeySystemAccess function configured");return this._requestMediaKeySystemAccess}}])&&Wt(r.prototype,a),o&&Wt(r,o),i}(h)});function Zt(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Qt(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function Jt(e,t){for(var n=0;nt)return i;return 0}},{key:"maxAutoLevel",get:function(){var e=this.levels,t=this.autoLevelCapping;return-1===t&&e&&e.length?e.length-1:t}},{key:"nextAutoLevel",get:function(){return Math.min(Math.max(this.abrController.nextAutoLevel,this.minAutoLevel),this.maxAutoLevel)},set:function(e){this.abrController.nextAutoLevel=Math.max(this.minAutoLevel,e)}},{key:"audioTracks",get:function(){var e=this.audioTrackController;return e?e.audioTracks:[]}},{key:"audioTrack",get:function(){var e=this.audioTrackController;return e?e.audioTrack:-1},set:function(e){var t=this.audioTrackController;t&&(t.audioTrack=e)}},{key:"liveSyncPosition",get:function(){return this.streamController.liveSyncPosition}},{key:"subtitleTracks",get:function(){var e=this.subtitleTrackController;return e?e.subtitleTracks:[]}},{key:"subtitleTrack",get:function(){var e=this.subtitleTrackController;return e?e.subtitleTrack:-1},set:function(e){var t=this.subtitleTrackController;t&&(t.subtitleTrack=e)}},{key:"subtitleDisplay",get:function(){var e=this.subtitleTrackController;return!!e&&e.subtitleDisplay},set:function(e){var t=this.subtitleTrackController;t&&(t.subtitleDisplay=e)}}]),i}(q);tn.defaultConfig=void 0},"./src/polyfills/number-isFinite.js": -/*!******************************************!*\ - !*** ./src/polyfills/number-isFinite.js ***! - \******************************************/ -/*! exports provided: isFiniteNumber */function(e,t,n){n.r(t),n.d(t,"isFiniteNumber",(function(){return i}));var i=Number.isFinite||function(e){return"number"==typeof e&&isFinite(e)}},"./src/utils/get-self-scope.js": -/*!*************************************!*\ - !*** ./src/utils/get-self-scope.js ***! - \*************************************/ -/*! exports provided: getSelfScope */function(e,t,n){function i(){return"undefined"==typeof window?self:window}n.r(t),n.d(t,"getSelfScope",(function(){return i}))},"./src/utils/logger.js": -/*!*****************************!*\ - !*** ./src/utils/logger.js ***! - \*****************************/ -/*! exports provided: enableLogs, logger */function(e,t,n){n.r(t),n.d(t,"enableLogs",(function(){return c})),n.d(t,"logger",(function(){return d}));var i=n(/*! ./get-self-scope */"./src/utils/get-self-scope.js");function r(){}var a={trace:r,debug:r,log:r,warn:r,info:r,error:r},o=a;function s(e,t){return t="["+e+"] > "+t}var l=Object(i.getSelfScope)();function u(e){var t=l.console[e];return t?function(){for(var n=arguments.length,i=new Array(n),r=0;r1?t-1:0),i=1;i0&&(t=this._duration*(e/100)),this.seek(t)}},{key:"seek",value:function(e){e<0&&(Z.warn("Attempt to seek to a negative time. Resetting to live point. Use seekToLivePoint() to seek to the live point."),e=this.getDuration()),this.dvrEnabled&&this._updateDvr(e0)switch(this._recoverAttemptsRemaining-=1,t.type){case kn.ErrorTypes.NETWORK_ERROR:switch(t.details){case kn.ErrorDetails.MANIFEST_LOAD_ERROR:case kn.ErrorDetails.MANIFEST_LOAD_TIMEOUT:case kn.ErrorDetails.MANIFEST_PARSING_ERROR:case kn.ErrorDetails.LEVEL_LOAD_ERROR:case kn.ErrorDetails.LEVEL_LOAD_TIMEOUT:Z.error("hlsjs: unrecoverable network fatal error.",{evt:e,data:t}),n=this.createError(i),this.trigger(ne.PLAYBACK_ERROR,n),this.stop();break;default:Z.warn("hlsjs: trying to recover from network error.",{evt:e,data:t}),i.level=se.Levels.WARN,this._hls.startLoad()}break;case kn.ErrorTypes.MEDIA_ERROR:Z.warn("hlsjs: trying to recover from media error.",{evt:e,data:t}),i.level=se.Levels.WARN,this._recover(e,t,i);break;default:Z.error("hlsjs: could not recover from error.",{evt:e,data:t}),n=this.createError(i),this.trigger(ne.PLAYBACK_ERROR,n),this.stop()}else Z.error("hlsjs: could not recover from error after maximum number of attempts.",{evt:e,data:t}),n=this.createError(i),this.trigger(ne.PLAYBACK_ERROR,n),this.stop();else{if(this.options.playback.triggerFatalErrorOnResourceDenied&&this._keyIsDenied(t))return Z.error("hlsjs: could not load decrypt key.",{evt:e,data:t}),n=this.createError(i),this.trigger(ne.PLAYBACK_ERROR,n),void this.stop();i.level=se.Levels.WARN,Z.warn("hlsjs: non-fatal error occurred",{evt:e,data:t})}}},{key:"_keyIsDenied",value:function(e){return e.type===kn.ErrorTypes.NETWORK_ERROR&&e.details===kn.ErrorDetails.KEY_LOAD_ERROR&&e.response&&e.response.code>=400}},{key:"_onTimeUpdate",value:function(){var e={current:this.getCurrentTime(),total:this.getDuration(),firstFragDateTime:this.getProgramDateTime()};this._lastTimeUpdate&&e.current===this._lastTimeUpdate.current&&e.total===this._lastTimeUpdate.total||(this._lastTimeUpdate=e,this.trigger(ne.PLAYBACK_TIMEUPDATE,e,this.name))}},{key:"_onDurationChange",value:function(){var e=this.getDuration();this._lastDuration!==e&&(this._lastDuration=e,An(gn(n.prototype),"_onDurationChange",this).call(this))}},{key:"_onProgress",value:function(){if(this.el.buffered.length){for(var e=[],t=0,n=0;n=e[n].start&&this.el.currentTime<=e[n].end&&(t=n);var i={start:e[t].start,current:e[t].end,total:this.getDuration()};this.trigger(ne.PLAYBACK_PROGRESS,i,e)}}},{key:"play",value:function(){this._hls||this._setup(),An(gn(n.prototype),"play",this).call(this),this._startTimeUpdateTimer()}},{key:"pause",value:function(){this._hls&&(An(gn(n.prototype),"pause",this).call(this),this.dvrEnabled&&this._updateDvr(!0))}},{key:"stop",value:function(){this._stopTimeUpdateTimer(),this._hls&&(An(gn(n.prototype),"stop",this).call(this),this._hls.destroy(),delete this._hls)}},{key:"destroy",value:function(){this._stopTimeUpdateTimer(),this._hls&&(this._hls.destroy(),delete this._hls),An(gn(n.prototype),"destroy",this).call(this)}},{key:"_updatePlaybackType",value:function(e,t){this._playbackType=t.details.live?he.LIVE:he.VOD,this._onLevelUpdated(e,t),this._ccTracksUpdated&&this._playbackType===he.LIVE&&this.hasClosedCaptionsTracks&&this._onSubtitleLoaded()}},{key:"_fillLevels",value:function(){this._levels=this._hls.levels.map((function(e,t){return{id:t,level:e,label:"".concat(e.bitrate/1e3,"Kbps")}})),this.trigger(ne.PLAYBACK_LEVELS_AVAILABLE,this._levels)}},{key:"_onLevelUpdated",value:function(e,t){this._segmentTargetDuration=t.details.targetduration,this._playlistType=t.details.type||null;var n=!1,i=!1,r=t.details.fragments,a=this._playableRegionStartTime,o=this._playableRegionDuration;if(0!==r.length){if(r[0].rawProgramDateTime&&(this._programDateTime=r[0].rawProgramDateTime),this._playableRegionStartTime!==r[0].start&&(n=!0,this._playableRegionStartTime=r[0].start),n)if(this._localStartTimeCorrelation){var s=this._localStartTimeCorrelation,l=this._now-s.local,u=(s.remote+l)/1e3;ua+this._extrapolatedWindowDuration&&(this._localStartTimeCorrelation={local:this._now,remote:1e3*Math.max(r[0].start,a+this._extrapolatedWindowDuration)})}else this._localStartTimeCorrelation={local:this._now,remote:1e3*(r[0].start+this._extrapolatedWindowDuration/2)};var c=t.details.totalduration;if(this._playbackType===he.LIVE){var d=t.details.targetduration*((this.options.playback.hlsjsConfig||{}).liveSyncDurationCount||kn.DefaultConfig.liveSyncDurationCount);d<=c?(c-=d,this._durationExcludesAfterLiveSyncPoint=!0):this._durationExcludesAfterLiveSyncPoint=!1}c!==this._playableRegionDuration&&(i=!0,this._playableRegionDuration=c);var h=r[0].start+c,f=a+o;if(h!==f)if(this._localEndTimeCorrelation){var p=this._localEndTimeCorrelation,g=this._now-p.local,v=(p.remote+g)/1e3;v>h?this._localEndTimeCorrelation={local:this._now,remote:1e3*h}:vf&&(this._localEndTimeCorrelation={local:this._now,remote:1e3*f})}else this._localEndTimeCorrelation={local:this._now,remote:1e3*h};i&&this._onDurationChange(),n&&this._onProgress()}}},{key:"_onFragmentLoaded",value:function(e,t){this.trigger(ne.PLAYBACK_FRAGMENT_LOADED,t)}},{key:"_onSubtitleLoaded",value:function(){if(!this._ccIsSetup){this.trigger(ne.PLAYBACK_SUBTITLE_AVAILABLE);var e=this._playbackType===he.LIVE?-1:this.closedCaptionsTrackId;this.closedCaptionsTrackId=e,this._ccIsSetup=!0}}},{key:"_onLevelSwitch",value:function(e,t){this.levels.length||this._fillLevels(),this.trigger(ne.PLAYBACK_LEVEL_SWITCH_END),this.trigger(ne.PLAYBACK_LEVEL_SWITCH,t);var n=this._hls.levels[t.level];n&&(this.highDefinition=n.height>=720||n.bitrate/1e3>=2e3,this.trigger(ne.PLAYBACK_HIGHDEFINITIONUPDATE,this.highDefinition),this.trigger(ne.PLAYBACK_BITRATE,{height:n.height,width:n.width,bandwidth:n.bitrate,bitrate:n.bitrate,level:t.level}))}},{key:"getPlaybackType",value:function(){return this._playbackType}},{key:"isSeekEnabled",value:function(){return this._playbackType===he.VOD||this.dvrEnabled}},{key:"dvrEnabled",get:function(){return this._durationExcludesAfterLiveSyncPoint&&this._duration>=this._minDvrSize&&this.getPlaybackType()===he.LIVE}}]),n}(Je);return wn.canPlay=function(e,t){var n=e.split("?")[0].match(/.*\.(.*)$/)||[],i=n.length>1&&"m3u8"===n[1].toLowerCase()||Cn(t,["application/vnd.apple.mpegurl","application/x-mpegURL"]);return!(!kn.isSupported()||!i)},ln.Loader.registerPlayback(wn),n({},ln,{HLS:wn})})); -//# sourceMappingURL=clappr.min.js.map diff --git a/public/_player/clappr/dist/clappr.min.js.map b/public/_player/clappr/dist/clappr.min.js.map deleted file mode 100644 index 7430bc7..0000000 --- a/public/_player/clappr/dist/clappr.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"clappr.min.js","sources":["../node_modules/@clappr/core/dist/clappr-core.esm.js","../node_modules/@clappr/plugins/dist/clappr-plugins.esm.js","../src/base_bundle.js","../node_modules/@clappr/hlsjs-playback/dist/hlsjs-playback.esm.js","../src/main.js"],"sourcesContent":["function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n}\n\nfunction _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = _getPrototypeOf(object);\n if (object === null) break;\n }\n\n return object;\n}\n\nfunction _get(target, property, receiver) {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get;\n } else {\n _get = function _get(target, property, receiver) {\n var base = _superPropBase(target, property);\n\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n\n if (desc.get) {\n return desc.get.call(receiver);\n }\n\n return desc.value;\n };\n }\n\n return _get(target, property, receiver || target);\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) {\n return;\n }\n\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\n// Copyright 2014 Globo.com Player authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/**\n * Array.prototype.find\n *\n * Original source : https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find\n * See also : https://tc39.github.io/ecma262/#sec-array.prototype.find\n */\nif (!Array.prototype.find) {\n // eslint-disable-next-line\n Object.defineProperty(Array.prototype, 'find', {\n // Note: ES6 arrow function syntax is not used on purpose to avoid this to be undefined\n value: function value(predicate) {\n // 1. Let O be ? ToObject(this value).\n if (this == null) throw new TypeError('\"this\" is null or not defined');\n var o = Object(this); // 2. Let len be ? ToLength(? Get(O, \"length\")).\n\n var len = o.length >>> 0; // 3. If IsCallable(predicate) is false, throw a TypeError exception.\n\n if (typeof predicate !== 'function') throw new TypeError('predicate must be a function'); // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\n\n var thisArg = arguments[1]; // 5. Let k be 0.\n\n var k = 0; // 6. Repeat, while k < len\n\n while (k < len) {\n // a. Let Pk be ! ToString(k).\n // b. Let kValue be ? Get(O, Pk).\n // c. Let testResult be ToBoolean(? Call(predicate, T, ยซ kValue, k, O ยป)).\n // d. If testResult is true, return kValue.\n var kValue = o[k];\n if (predicate.call(thisArg, kValue, k, o)) return kValue; // e. Increase k by 1.\n\n k++;\n } // 7. Return undefined.\n\n\n return undefined;\n }\n });\n} // polyfills for smart TVs\n\n\nif (!Object.entries) {\n Object.entries = function (obj) {\n var ownProps = Object.keys(obj),\n i = ownProps.length,\n resArray = new Array(i); // preallocate the Array\n\n while (i--) {\n resArray[i] = [ownProps[i], obj[ownProps[i]]];\n }\n\n return resArray;\n };\n}\n\nif (!Object.values) {\n Object.values = function (obj) {\n var ownProps = Object.keys(obj),\n i = ownProps.length,\n resArray = new Array(i); // preallocate the Array\n\n while (i--) {\n resArray[i] = obj[ownProps[i]];\n }\n\n return resArray;\n };\n}\n/**\n * Object.assign\n * This polyfill doesn't support symbol properties, since ES5 doesn't have symbols anyway\n *\n * Original source : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n */\n\n\nif (typeof Object.assign != 'function') {\n // Must be writable: true, enumerable: false, configurable: true\n Object.defineProperty(Object, 'assign', {\n // length of function is 2.\n value: function assign(target, varArgs) {\n\n if (target == null) {\n // TypeError if undefined or null\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var to = Object(target);\n\n for (var index = 1; index < arguments.length; index++) {\n var nextSource = arguments[index];\n\n if (nextSource != null) {\n // Skip over if undefined or null\n for (var nextKey in nextSource) {\n // Avoid bugs when hasOwnProperty is shadowed\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n\n return to;\n },\n writable: true,\n configurable: true\n });\n} // https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n\n\nif (!Array.prototype.findIndex) {\n Object.defineProperty(Array.prototype, 'findIndex', {\n value: function value(predicate) {\n // 1. Let O be ? ToObject(this value).\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n var o = Object(this); // 2. Let len be ? ToLength(? Get(O, \"length\")).\n\n var len = o.length >>> 0; // 3. If IsCallable(predicate) is false, throw a TypeError exception.\n\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\n\n\n var thisArg = arguments[1]; // 5. Let k be 0.\n\n var k = 0; // 6. Repeat, while k < len\n\n while (k < len) {\n // a. Let Pk be ! ToString(k).\n // b. Let kValue be ? Get(O, Pk).\n // c. Let testResult be ToBoolean(? Call(predicate, T, ยซ kValue, k, O ยป)).\n // d. If testResult is true, return k.\n var kValue = o[k];\n\n if (predicate.call(thisArg, kValue, k, o)) {\n return k;\n } // e. Increase k by 1.\n\n\n k++;\n } // 7. Return -1.\n\n\n return -1;\n },\n configurable: true,\n writable: true\n });\n}\n\n// https://github.com/mathiasbynens/small\nvar mp4 = 'data:video/mp4;base64,AAAAHGZ0eXBpc29tAAACAGlzb21pc28ybXA0MQAAAAhmcmVlAAAC721kYXQhEAUgpBv/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcCEQBSCkG//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADengAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAsJtb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAALwABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAB7HRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAIAAAAAAAAALwAAAAAAAAAAAAAAAQEAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAAC8AAAAAAAEAAAAAAWRtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAAKxEAAAIAFXEAAAAAAAtaGRscgAAAAAAAAAAc291bgAAAAAAAAAAAAAAAFNvdW5kSGFuZGxlcgAAAAEPbWluZgAAABBzbWhkAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAADTc3RibAAAAGdzdHNkAAAAAAAAAAEAAABXbXA0YQAAAAAAAAABAAAAAAAAAAAAAgAQAAAAAKxEAAAAAAAzZXNkcwAAAAADgICAIgACAASAgIAUQBUAAAAAAfQAAAHz+QWAgIACEhAGgICAAQIAAAAYc3R0cwAAAAAAAAABAAAAAgAABAAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAIAAAABAAAAHHN0c3oAAAAAAAAAAAAAAAIAAAFzAAABdAAAABRzdGNvAAAAAAAAAAEAAAAsAAAAYnVkdGEAAABabWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAtaWxzdAAAACWpdG9vAAAAHWRhdGEAAAABAAAAAExhdmY1Ni40MC4xMDE=';\nvar Media = {\n mp4: mp4\n};\n\n/* Zepto v1.2.0 - zepto ajax callbacks deferred event ie selector - zeptojs.com/license */\nvar Zepto = function () {\n var undefined$1,\n key,\n $,\n classList,\n emptyArray = [],\n concat = emptyArray.concat,\n filter = emptyArray.filter,\n slice = emptyArray.slice,\n document = window.document,\n elementDisplay = {},\n classCache = {},\n cssNumber = {\n 'column-count': 1,\n 'columns': 1,\n 'font-weight': 1,\n 'line-height': 1,\n 'opacity': 1,\n 'z-index': 1,\n 'zoom': 1\n },\n fragmentRE = /^\\s*<(\\w+|!)[^>]*>/,\n singleTagRE = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,\n rootNodeRE = /^(?:body|html)$/i,\n capitalRE = /([A-Z])/g,\n // special attributes that should be get/set via method calls\n methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset'],\n adjacencyOperators = ['after', 'prepend', 'before', 'append'],\n table = document.createElement('table'),\n tableRow = document.createElement('tr'),\n containers = {\n 'tr': document.createElement('tbody'),\n 'tbody': table,\n 'thead': table,\n 'tfoot': table,\n 'td': tableRow,\n 'th': tableRow,\n '*': document.createElement('div')\n },\n readyRE = /complete|loaded|interactive/,\n simpleSelectorRE = /^[\\w-]*$/,\n class2type = {},\n toString = class2type.toString,\n zepto = {},\n camelize,\n uniq,\n tempParent = document.createElement('div'),\n propMap = {\n 'tabindex': 'tabIndex',\n 'readonly': 'readOnly',\n 'for': 'htmlFor',\n 'class': 'className',\n 'maxlength': 'maxLength',\n 'cellspacing': 'cellSpacing',\n 'cellpadding': 'cellPadding',\n 'rowspan': 'rowSpan',\n 'colspan': 'colSpan',\n 'usemap': 'useMap',\n 'frameborder': 'frameBorder',\n 'contenteditable': 'contentEditable'\n },\n isArray = Array.isArray || function (object) {\n return object instanceof Array;\n };\n\n zepto.matches = function (element, selector) {\n if (!selector || !element || element.nodeType !== 1) return false;\n var matchesSelector = element.matches || element.webkitMatchesSelector || element.mozMatchesSelector || element.oMatchesSelector || element.matchesSelector;\n if (matchesSelector) return matchesSelector.call(element, selector); // fall back to performing a selector:\n\n var match,\n parent = element.parentNode,\n temp = !parent;\n if (temp) (parent = tempParent).appendChild(element);\n match = ~zepto.qsa(parent, selector).indexOf(element);\n temp && tempParent.removeChild(element);\n return match;\n };\n\n function type(obj) {\n return obj == null ? String(obj) : class2type[toString.call(obj)] || \"object\";\n }\n\n function isFunction(value) {\n return type(value) == \"function\";\n }\n\n function isWindow(obj) {\n return obj != null && obj == obj.window;\n }\n\n function isDocument(obj) {\n return obj != null && obj.nodeType == obj.DOCUMENT_NODE;\n }\n\n function isObject(obj) {\n return type(obj) == \"object\";\n }\n\n function isPlainObject(obj) {\n return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype;\n }\n\n function likeArray(obj) {\n var length = !!obj && 'length' in obj && obj.length,\n type = $.type(obj);\n return 'function' != type && !isWindow(obj) && ('array' == type || length === 0 || typeof length == 'number' && length > 0 && length - 1 in obj);\n }\n\n function compact(array) {\n return filter.call(array, function (item) {\n return item != null;\n });\n }\n\n function flatten(array) {\n return array.length > 0 ? $.fn.concat.apply([], array) : array;\n }\n\n camelize = function (str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n };\n\n function dasherize(str) {\n return str.replace(/::/g, '/').replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\\d])([A-Z])/g, '$1_$2').replace(/_/g, '-').toLowerCase();\n }\n\n uniq = function (array) {\n return filter.call(array, function (item, idx) {\n return array.indexOf(item) == idx;\n });\n };\n\n function classRE(name) {\n return name in classCache ? classCache[name] : classCache[name] = new RegExp('(^|\\\\s)' + name + '(\\\\s|$)');\n }\n\n function maybeAddPx(name, value) {\n return typeof value == \"number\" && !cssNumber[dasherize(name)] ? value + \"px\" : value;\n }\n\n function defaultDisplay(nodeName) {\n var element, display;\n\n if (!elementDisplay[nodeName]) {\n element = document.createElement(nodeName);\n document.body.appendChild(element);\n display = getComputedStyle(element, '').getPropertyValue(\"display\");\n element.parentNode.removeChild(element);\n display == \"none\" && (display = \"block\");\n elementDisplay[nodeName] = display;\n }\n\n return elementDisplay[nodeName];\n }\n\n function children(element) {\n return 'children' in element ? slice.call(element.children) : $.map(element.childNodes, function (node) {\n if (node.nodeType == 1) return node;\n });\n }\n\n function Z(dom, selector) {\n var i,\n len = dom ? dom.length : 0;\n\n for (i = 0; i < len; i++) this[i] = dom[i];\n\n this.length = len;\n this.selector = selector || '';\n } // `$.zepto.fragment` takes a html string and an optional tag name\n // to generate DOM nodes from the given html string.\n // The generated DOM nodes are returned as an array.\n // This function can be overridden in plugins for example to make\n // it compatible with browsers that don't support the DOM fully.\n\n\n zepto.fragment = function (html, name, properties) {\n var dom, nodes, container; // A special case optimization for a single tag\n\n if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1));\n\n if (!dom) {\n if (html.replace) html = html.replace(tagExpanderRE, \"<$1>\");\n if (name === undefined$1) name = fragmentRE.test(html) && RegExp.$1;\n if (!(name in containers)) name = '*';\n container = containers[name];\n container.innerHTML = '' + html;\n dom = $.each(slice.call(container.childNodes), function () {\n container.removeChild(this);\n });\n }\n\n if (isPlainObject(properties)) {\n nodes = $(dom);\n $.each(properties, function (key, value) {\n if (methodAttributes.indexOf(key) > -1) nodes[key](value);else nodes.attr(key, value);\n });\n }\n\n return dom;\n }; // `$.zepto.Z` swaps out the prototype of the given `dom` array\n // of nodes with `$.fn` and thus supplying all the Zepto functions\n // to the array. This method can be overridden in plugins.\n\n\n zepto.Z = function (dom, selector) {\n return new Z(dom, selector);\n }; // `$.zepto.isZ` should return `true` if the given object is a Zepto\n // collection. This method can be overridden in plugins.\n\n\n zepto.isZ = function (object) {\n return object instanceof zepto.Z;\n }; // `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and\n // takes a CSS selector and an optional context (and handles various\n // special cases).\n // This method can be overridden in plugins.\n\n\n zepto.init = function (selector, context) {\n var dom; // If nothing given, return an empty Zepto collection\n\n if (!selector) return zepto.Z(); // Optimize for string selectors\n else if (typeof selector == 'string') {\n selector = selector.trim(); // If it's a html fragment, create nodes from it\n // Note: In both Chrome 21 and Firefox 15, DOM error 12\n // is thrown if the fragment doesn't begin with <\n\n if (selector[0] == '<' && fragmentRE.test(selector)) dom = zepto.fragment(selector, RegExp.$1, context), selector = null; // If there's a context, create a collection on that context first, and select\n // nodes from there\n else if (context !== undefined$1) return $(context).find(selector); // If it's a CSS selector, use it to select nodes.\n else dom = zepto.qsa(document, selector);\n } // If a function is given, call it when the DOM is ready\n else if (isFunction(selector)) return $(document).ready(selector); // If a Zepto collection is given, just return it\n else if (zepto.isZ(selector)) return selector;else {\n // normalize array if an array of nodes is given\n if (isArray(selector)) dom = compact(selector); // Wrap DOM nodes.\n else if (isObject(selector)) dom = [selector], selector = null; // If it's a html fragment, create nodes from it\n else if (fragmentRE.test(selector)) dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null; // If there's a context, create a collection on that context first, and select\n // nodes from there\n else if (context !== undefined$1) return $(context).find(selector); // And last but no least, if it's a CSS selector, use it to select nodes.\n else dom = zepto.qsa(document, selector);\n } // create a new Zepto collection from the nodes found\n\n return zepto.Z(dom, selector);\n }; // `$` will be the base `Zepto` object. When calling this\n // function just call `$.zepto.init, which makes the implementation\n // details of selecting nodes and creating Zepto collections\n // patchable in plugins.\n\n\n $ = function (selector, context) {\n return zepto.init(selector, context);\n };\n\n function extend(target, source, deep) {\n for (key in source) if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {\n if (isPlainObject(source[key]) && !isPlainObject(target[key])) target[key] = {};\n if (isArray(source[key]) && !isArray(target[key])) target[key] = [];\n extend(target[key], source[key], deep);\n } else if (source[key] !== undefined$1) target[key] = source[key];\n } // Copy all but undefined properties from one or more\n // objects to the `target` object.\n\n\n $.extend = function (target) {\n var deep,\n args = slice.call(arguments, 1);\n\n if (typeof target == 'boolean') {\n deep = target;\n target = args.shift();\n }\n\n args.forEach(function (arg) {\n extend(target, arg, deep);\n });\n return target;\n }; // `$.zepto.qsa` is Zepto's CSS selector implementation which\n // uses `document.querySelectorAll` and optimizes for some special cases, like `#id`.\n // This method can be overridden in plugins.\n\n\n zepto.qsa = function (element, selector) {\n var found,\n maybeID = selector[0] == '#',\n maybeClass = !maybeID && selector[0] == '.',\n nameOnly = maybeID || maybeClass ? selector.slice(1) : selector,\n // Ensure that a 1 char tag name still gets checked\n isSimple = simpleSelectorRE.test(nameOnly);\n return element.getElementById && isSimple && maybeID ? // Safari DocumentFragment doesn't have getElementById\n (found = element.getElementById(nameOnly)) ? [found] : [] : element.nodeType !== 1 && element.nodeType !== 9 && element.nodeType !== 11 ? [] : slice.call(isSimple && !maybeID && element.getElementsByClassName ? // DocumentFragment doesn't have getElementsByClassName/TagName\n maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class\n element.getElementsByTagName(selector) : // Or a tag\n element.querySelectorAll(selector) // Or it's not simple, and we need to query all\n );\n };\n\n function filtered(nodes, selector) {\n return selector == null ? $(nodes) : $(nodes).filter(selector);\n }\n\n $.contains = document.documentElement.contains ? function (parent, node) {\n return parent !== node && parent.contains(node);\n } : function (parent, node) {\n while (node && (node = node.parentNode)) if (node === parent) return true;\n\n return false;\n };\n\n function funcArg(context, arg, idx, payload) {\n return isFunction(arg) ? arg.call(context, idx, payload) : arg;\n }\n\n function setAttribute(node, name, value) {\n value == null ? node.removeAttribute(name) : node.setAttribute(name, value);\n } // access className property while respecting SVGAnimatedString\n\n\n function className(node, value) {\n var klass = node.className || '',\n svg = klass && klass.baseVal !== undefined$1;\n if (value === undefined$1) return svg ? klass.baseVal : klass;\n svg ? klass.baseVal = value : node.className = value;\n } // \"true\" => true\n // \"false\" => false\n // \"null\" => null\n // \"42\" => 42\n // \"42.5\" => 42.5\n // \"08\" => \"08\"\n // JSON => parse if valid\n // String => self\n\n\n function deserializeValue(value) {\n try {\n return value ? value == \"true\" || (value == \"false\" ? false : value == \"null\" ? null : +value + \"\" == value ? +value : /^[\\[\\{]/.test(value) ? $.parseJSON(value) : value) : value;\n } catch (e) {\n return value;\n }\n }\n\n $.type = type;\n $.isFunction = isFunction;\n $.isWindow = isWindow;\n $.isArray = isArray;\n $.isPlainObject = isPlainObject;\n\n $.isEmptyObject = function (obj) {\n var name;\n\n for (name in obj) return false;\n\n return true;\n };\n\n $.isNumeric = function (val) {\n var num = Number(val),\n type = typeof val;\n return val != null && type != 'boolean' && (type != 'string' || val.length) && !isNaN(num) && isFinite(num) || false;\n };\n\n $.inArray = function (elem, array, i) {\n return emptyArray.indexOf.call(array, elem, i);\n };\n\n $.camelCase = camelize;\n\n $.trim = function (str) {\n return str == null ? \"\" : String.prototype.trim.call(str);\n }; // plugin compatibility\n\n\n $.uuid = 0;\n $.support = {};\n $.expr = {};\n\n $.noop = function () {};\n\n $.map = function (elements, callback) {\n var value,\n values = [],\n i,\n key;\n if (likeArray(elements)) for (i = 0; i < elements.length; i++) {\n value = callback(elements[i], i);\n if (value != null) values.push(value);\n } else for (key in elements) {\n value = callback(elements[key], key);\n if (value != null) values.push(value);\n }\n return flatten(values);\n };\n\n $.each = function (elements, callback) {\n var i, key;\n\n if (likeArray(elements)) {\n for (i = 0; i < elements.length; i++) if (callback.call(elements[i], i, elements[i]) === false) return elements;\n } else {\n for (key in elements) if (callback.call(elements[key], key, elements[key]) === false) return elements;\n }\n\n return elements;\n };\n\n $.grep = function (elements, callback) {\n return filter.call(elements, callback);\n };\n\n if (window.JSON) $.parseJSON = JSON.parse; // Populate the class2type map\n\n $.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function (i, name) {\n class2type[\"[object \" + name + \"]\"] = name.toLowerCase();\n }); // Define methods that will be available on all\n // Zepto collections\n\n $.fn = {\n constructor: zepto.Z,\n length: 0,\n // Because a collection acts like an array\n // copy over these useful array functions.\n forEach: emptyArray.forEach,\n reduce: emptyArray.reduce,\n push: emptyArray.push,\n sort: emptyArray.sort,\n splice: emptyArray.splice,\n indexOf: emptyArray.indexOf,\n concat: function () {\n var i,\n value,\n args = [];\n\n for (i = 0; i < arguments.length; i++) {\n value = arguments[i];\n args[i] = zepto.isZ(value) ? value.toArray() : value;\n }\n\n return concat.apply(zepto.isZ(this) ? this.toArray() : this, args);\n },\n // `map` and `slice` in the jQuery API work differently\n // from their array counterparts\n map: function (fn) {\n return $($.map(this, function (el, i) {\n return fn.call(el, i, el);\n }));\n },\n slice: function () {\n return $(slice.apply(this, arguments));\n },\n ready: function (callback) {\n // need to check if document.body exists for IE as that browser reports\n // document ready when it hasn't yet created the body element\n if (readyRE.test(document.readyState) && document.body) callback($);else document.addEventListener('DOMContentLoaded', function () {\n callback($);\n }, false);\n return this;\n },\n get: function (idx) {\n return idx === undefined$1 ? slice.call(this) : this[idx >= 0 ? idx : idx + this.length];\n },\n toArray: function () {\n return this.get();\n },\n size: function () {\n return this.length;\n },\n remove: function () {\n return this.each(function () {\n if (this.parentNode != null) this.parentNode.removeChild(this);\n });\n },\n each: function (callback) {\n emptyArray.every.call(this, function (el, idx) {\n return callback.call(el, idx, el) !== false;\n });\n return this;\n },\n filter: function (selector) {\n if (isFunction(selector)) return this.not(this.not(selector));\n return $(filter.call(this, function (element) {\n return zepto.matches(element, selector);\n }));\n },\n add: function (selector, context) {\n return $(uniq(this.concat($(selector, context))));\n },\n is: function (selector) {\n return this.length > 0 && zepto.matches(this[0], selector);\n },\n not: function (selector) {\n var nodes = [];\n if (isFunction(selector) && selector.call !== undefined$1) this.each(function (idx) {\n if (!selector.call(this, idx)) nodes.push(this);\n });else {\n var excludes = typeof selector == 'string' ? this.filter(selector) : likeArray(selector) && isFunction(selector.item) ? slice.call(selector) : $(selector);\n this.forEach(function (el) {\n if (excludes.indexOf(el) < 0) nodes.push(el);\n });\n }\n return $(nodes);\n },\n has: function (selector) {\n return this.filter(function () {\n return isObject(selector) ? $.contains(this, selector) : $(this).find(selector).size();\n });\n },\n eq: function (idx) {\n return idx === -1 ? this.slice(idx) : this.slice(idx, +idx + 1);\n },\n first: function () {\n var el = this[0];\n return el && !isObject(el) ? el : $(el);\n },\n last: function () {\n var el = this[this.length - 1];\n return el && !isObject(el) ? el : $(el);\n },\n find: function (selector) {\n var result,\n $this = this;\n if (!selector) result = $();else if (typeof selector == 'object') result = $(selector).filter(function () {\n var node = this;\n return emptyArray.some.call($this, function (parent) {\n return $.contains(parent, node);\n });\n });else if (this.length == 1) result = $(zepto.qsa(this[0], selector));else result = this.map(function () {\n return zepto.qsa(this, selector);\n });\n return result;\n },\n closest: function (selector, context) {\n var nodes = [],\n collection = typeof selector == 'object' && $(selector);\n this.each(function (_, node) {\n while (node && !(collection ? collection.indexOf(node) >= 0 : zepto.matches(node, selector))) node = node !== context && !isDocument(node) && node.parentNode;\n\n if (node && nodes.indexOf(node) < 0) nodes.push(node);\n });\n return $(nodes);\n },\n parents: function (selector) {\n var ancestors = [],\n nodes = this;\n\n while (nodes.length > 0) nodes = $.map(nodes, function (node) {\n if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) {\n ancestors.push(node);\n return node;\n }\n });\n\n return filtered(ancestors, selector);\n },\n parent: function (selector) {\n return filtered(uniq(this.pluck('parentNode')), selector);\n },\n children: function (selector) {\n return filtered(this.map(function () {\n return children(this);\n }), selector);\n },\n contents: function () {\n return this.map(function () {\n return this.contentDocument || slice.call(this.childNodes);\n });\n },\n siblings: function (selector) {\n return filtered(this.map(function (i, el) {\n return filter.call(children(el.parentNode), function (child) {\n return child !== el;\n });\n }), selector);\n },\n empty: function () {\n return this.each(function () {\n this.innerHTML = '';\n });\n },\n // `pluck` is borrowed from Prototype.js\n pluck: function (property) {\n return $.map(this, function (el) {\n return el[property];\n });\n },\n show: function () {\n return this.each(function () {\n this.style.display == \"none\" && (this.style.display = '');\n if (getComputedStyle(this, '').getPropertyValue(\"display\") == \"none\") this.style.display = defaultDisplay(this.nodeName);\n });\n },\n replaceWith: function (newContent) {\n return this.before(newContent).remove();\n },\n wrap: function (structure) {\n var func = isFunction(structure);\n if (this[0] && !func) var dom = $(structure).get(0),\n clone = dom.parentNode || this.length > 1;\n return this.each(function (index) {\n $(this).wrapAll(func ? structure.call(this, index) : clone ? dom.cloneNode(true) : dom);\n });\n },\n wrapAll: function (structure) {\n if (this[0]) {\n $(this[0]).before(structure = $(structure));\n var children; // drill down to the inmost element\n\n while ((children = structure.children()).length) structure = children.first();\n\n $(structure).append(this);\n }\n\n return this;\n },\n wrapInner: function (structure) {\n var func = isFunction(structure);\n return this.each(function (index) {\n var self = $(this),\n contents = self.contents(),\n dom = func ? structure.call(this, index) : structure;\n contents.length ? contents.wrapAll(dom) : self.append(dom);\n });\n },\n unwrap: function () {\n this.parent().each(function () {\n $(this).replaceWith($(this).children());\n });\n return this;\n },\n clone: function () {\n return this.map(function () {\n return this.cloneNode(true);\n });\n },\n hide: function () {\n return this.css(\"display\", \"none\");\n },\n toggle: function (setting) {\n return this.each(function () {\n var el = $(this);\n (setting === undefined$1 ? el.css(\"display\") == \"none\" : setting) ? el.show() : el.hide();\n });\n },\n prev: function (selector) {\n return $(this.pluck('previousElementSibling')).filter(selector || '*');\n },\n next: function (selector) {\n return $(this.pluck('nextElementSibling')).filter(selector || '*');\n },\n html: function (html) {\n return 0 in arguments ? this.each(function (idx) {\n var originHtml = this.innerHTML;\n $(this).empty().append(funcArg(this, html, idx, originHtml));\n }) : 0 in this ? this[0].innerHTML : null;\n },\n text: function (text) {\n return 0 in arguments ? this.each(function (idx) {\n var newText = funcArg(this, text, idx, this.textContent);\n this.textContent = newText == null ? '' : '' + newText;\n }) : 0 in this ? this.pluck('textContent').join(\"\") : null;\n },\n attr: function (name, value) {\n var result;\n return typeof name == 'string' && !(1 in arguments) ? 0 in this && this[0].nodeType == 1 && (result = this[0].getAttribute(name)) != null ? result : undefined$1 : this.each(function (idx) {\n if (this.nodeType !== 1) return;\n if (isObject(name)) for (key in name) setAttribute(this, key, name[key]);else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name)));\n });\n },\n removeAttr: function (name) {\n return this.each(function () {\n this.nodeType === 1 && name.split(' ').forEach(function (attribute) {\n setAttribute(this, attribute);\n }, this);\n });\n },\n prop: function (name, value) {\n name = propMap[name] || name;\n return 1 in arguments ? this.each(function (idx) {\n this[name] = funcArg(this, value, idx, this[name]);\n }) : this[0] && this[0][name];\n },\n removeProp: function (name) {\n name = propMap[name] || name;\n return this.each(function () {\n delete this[name];\n });\n },\n data: function (name, value) {\n var attrName = 'data-' + name.replace(capitalRE, '-$1').toLowerCase();\n var data = 1 in arguments ? this.attr(attrName, value) : this.attr(attrName);\n return data !== null ? deserializeValue(data) : undefined$1;\n },\n val: function (value) {\n if (0 in arguments) {\n if (value == null) value = \"\";\n return this.each(function (idx) {\n this.value = funcArg(this, value, idx, this.value);\n });\n } else {\n return this[0] && (this[0].multiple ? $(this[0]).find('option').filter(function () {\n return this.selected;\n }).pluck('value') : this[0].value);\n }\n },\n offset: function (coordinates) {\n if (coordinates) return this.each(function (index) {\n var $this = $(this),\n coords = funcArg(this, coordinates, index, $this.offset()),\n parentOffset = $this.offsetParent().offset(),\n props = {\n top: coords.top - parentOffset.top,\n left: coords.left - parentOffset.left\n };\n if ($this.css('position') == 'static') props['position'] = 'relative';\n $this.css(props);\n });\n if (!this.length) return null;\n if (document.documentElement !== this[0] && !$.contains(document.documentElement, this[0])) return {\n top: 0,\n left: 0\n };\n var obj = this[0].getBoundingClientRect();\n return {\n left: obj.left + window.pageXOffset,\n top: obj.top + window.pageYOffset,\n width: Math.round(obj.width),\n height: Math.round(obj.height)\n };\n },\n css: function (property, value) {\n if (arguments.length < 2) {\n var element = this[0];\n\n if (typeof property == 'string') {\n if (!element) return;\n return element.style[camelize(property)] || getComputedStyle(element, '').getPropertyValue(property);\n } else if (isArray(property)) {\n if (!element) return;\n var props = {};\n var computedStyle = getComputedStyle(element, '');\n $.each(property, function (_, prop) {\n props[prop] = element.style[camelize(prop)] || computedStyle.getPropertyValue(prop);\n });\n return props;\n }\n }\n\n var css = '';\n\n if (type(property) == 'string') {\n if (!value && value !== 0) this.each(function () {\n this.style.removeProperty(dasherize(property));\n });else css = dasherize(property) + \":\" + maybeAddPx(property, value);\n } else {\n for (key in property) if (!property[key] && property[key] !== 0) this.each(function () {\n this.style.removeProperty(dasherize(key));\n });else css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';';\n }\n\n return this.each(function () {\n this.style.cssText += ';' + css;\n });\n },\n index: function (element) {\n return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0]);\n },\n hasClass: function (name) {\n if (!name) return false;\n return emptyArray.some.call(this, function (el) {\n return this.test(className(el));\n }, classRE(name));\n },\n addClass: function (name) {\n if (!name) return this;\n return this.each(function (idx) {\n if (!('className' in this)) return;\n classList = [];\n var cls = className(this),\n newName = funcArg(this, name, idx, cls);\n newName.split(/\\s+/g).forEach(function (klass) {\n if (!$(this).hasClass(klass)) classList.push(klass);\n }, this);\n classList.length && className(this, cls + (cls ? \" \" : \"\") + classList.join(\" \"));\n });\n },\n removeClass: function (name) {\n return this.each(function (idx) {\n if (!('className' in this)) return;\n if (name === undefined$1) return className(this, '');\n classList = className(this);\n funcArg(this, name, idx, classList).split(/\\s+/g).forEach(function (klass) {\n classList = classList.replace(classRE(klass), \" \");\n });\n className(this, classList.trim());\n });\n },\n toggleClass: function (name, when) {\n if (!name) return this;\n return this.each(function (idx) {\n var $this = $(this),\n names = funcArg(this, name, idx, className(this));\n names.split(/\\s+/g).forEach(function (klass) {\n (when === undefined$1 ? !$this.hasClass(klass) : when) ? $this.addClass(klass) : $this.removeClass(klass);\n });\n });\n },\n scrollTop: function (value) {\n if (!this.length) return;\n var hasScrollTop = 'scrollTop' in this[0];\n if (value === undefined$1) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset;\n return this.each(hasScrollTop ? function () {\n this.scrollTop = value;\n } : function () {\n this.scrollTo(this.scrollX, value);\n });\n },\n scrollLeft: function (value) {\n if (!this.length) return;\n var hasScrollLeft = 'scrollLeft' in this[0];\n if (value === undefined$1) return hasScrollLeft ? this[0].scrollLeft : this[0].pageXOffset;\n return this.each(hasScrollLeft ? function () {\n this.scrollLeft = value;\n } : function () {\n this.scrollTo(value, this.scrollY);\n });\n },\n position: function () {\n if (!this.length) return;\n var elem = this[0],\n // Get *real* offsetParent\n offsetParent = this.offsetParent(),\n // Get correct offsets\n offset = this.offset(),\n parentOffset = rootNodeRE.test(offsetParent[0].nodeName) ? {\n top: 0,\n left: 0\n } : offsetParent.offset(); // Subtract element margins\n // note: when an element has margin: auto the offsetLeft and marginLeft\n // are the same in Safari causing offset.left to incorrectly be 0\n\n offset.top -= parseFloat($(elem).css('margin-top')) || 0;\n offset.left -= parseFloat($(elem).css('margin-left')) || 0; // Add offsetParent borders\n\n parentOffset.top += parseFloat($(offsetParent[0]).css('border-top-width')) || 0;\n parentOffset.left += parseFloat($(offsetParent[0]).css('border-left-width')) || 0; // Subtract the two offsets\n\n return {\n top: offset.top - parentOffset.top,\n left: offset.left - parentOffset.left\n };\n },\n offsetParent: function () {\n return this.map(function () {\n var parent = this.offsetParent || document.body;\n\n while (parent && !rootNodeRE.test(parent.nodeName) && $(parent).css(\"position\") == \"static\") parent = parent.offsetParent;\n\n return parent;\n });\n }\n }; // for now\n\n $.fn.detach = $.fn.remove // Generate the `width` and `height` functions\n ;\n ['width', 'height'].forEach(function (dimension) {\n var dimensionProperty = dimension.replace(/./, function (m) {\n return m[0].toUpperCase();\n });\n\n $.fn[dimension] = function (value) {\n var offset,\n el = this[0];\n if (value === undefined$1) return isWindow(el) ? el['inner' + dimensionProperty] : isDocument(el) ? el.documentElement['scroll' + dimensionProperty] : (offset = this.offset()) && offset[dimension];else return this.each(function (idx) {\n el = $(this);\n el.css(dimension, funcArg(this, value, idx, el[dimension]()));\n });\n };\n });\n\n function traverseNode(node, fun) {\n fun(node);\n\n for (var i = 0, len = node.childNodes.length; i < len; i++) traverseNode(node.childNodes[i], fun);\n } // Generate the `after`, `prepend`, `before`, `append`,\n // `insertAfter`, `insertBefore`, `appendTo`, and `prependTo` methods.\n\n\n adjacencyOperators.forEach(function (operator, operatorIndex) {\n var inside = operatorIndex % 2; //=> prepend, append\n\n $.fn[operator] = function () {\n // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings\n var argType,\n nodes = $.map(arguments, function (arg) {\n var arr = [];\n argType = type(arg);\n\n if (argType == \"array\") {\n arg.forEach(function (el) {\n if (el.nodeType !== undefined$1) return arr.push(el);else if ($.zepto.isZ(el)) return arr = arr.concat(el.get());\n arr = arr.concat(zepto.fragment(el));\n });\n return arr;\n }\n\n return argType == \"object\" || arg == null ? arg : zepto.fragment(arg);\n }),\n parent,\n copyByClone = this.length > 1;\n if (nodes.length < 1) return this;\n return this.each(function (_, target) {\n parent = inside ? target : target.parentNode; // convert all methods to a \"before\" operation\n\n target = operatorIndex == 0 ? target.nextSibling : operatorIndex == 1 ? target.firstChild : operatorIndex == 2 ? target : null;\n var parentInDocument = $.contains(document.documentElement, parent);\n nodes.forEach(function (node) {\n if (copyByClone) node = node.cloneNode(true);else if (!parent) return $(node).remove();\n parent.insertBefore(node, target);\n if (parentInDocument) traverseNode(node, function (el) {\n if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' && (!el.type || el.type === 'text/javascript') && !el.src) {\n var target = el.ownerDocument ? el.ownerDocument.defaultView : window;\n target['eval'].call(target, el.innerHTML);\n }\n });\n });\n });\n }; // after => insertAfter\n // prepend => prependTo\n // before => insertBefore\n // append => appendTo\n\n\n $.fn[inside ? operator + 'To' : 'insert' + (operatorIndex ? 'Before' : 'After')] = function (html) {\n $(html)[operator](this);\n return this;\n };\n });\n zepto.Z.prototype = Z.prototype = $.fn; // Export internal API functions in the `$.zepto` namespace\n\n zepto.uniq = uniq;\n zepto.deserializeValue = deserializeValue;\n $.zepto = zepto;\n return $;\n}();\n\nwindow.Zepto = Zepto;\nwindow.$ === undefined && (window.$ = Zepto);\n\n(function ($) {\n var jsonpID = +new Date(),\n document = window.document,\n key,\n name,\n rscript = /)<[^<]*)*<\\/script>/gi,\n scriptTypeRE = /^(?:text|application)\\/javascript/i,\n xmlTypeRE = /^(?:text|application)\\/xml/i,\n jsonType = 'application/json',\n htmlType = 'text/html',\n blankRE = /^\\s*$/,\n originAnchor = document.createElement('a');\n originAnchor.href = window.location.href; // trigger a custom event and return false if it was cancelled\n\n function triggerAndReturn(context, eventName, data) {\n var event = $.Event(eventName);\n $(context).trigger(event, data);\n return !event.isDefaultPrevented();\n } // trigger an Ajax \"global\" event\n\n\n function triggerGlobal(settings, context, eventName, data) {\n if (settings.global) return triggerAndReturn(context || document, eventName, data);\n } // Number of active Ajax requests\n\n\n $.active = 0;\n\n function ajaxStart(settings) {\n if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart');\n }\n\n function ajaxStop(settings) {\n if (settings.global && ! --$.active) triggerGlobal(settings, null, 'ajaxStop');\n } // triggers an extra global event \"ajaxBeforeSend\" that's like \"ajaxSend\" but cancelable\n\n\n function ajaxBeforeSend(xhr, settings) {\n var context = settings.context;\n if (settings.beforeSend.call(context, xhr, settings) === false || triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false) return false;\n triggerGlobal(settings, context, 'ajaxSend', [xhr, settings]);\n }\n\n function ajaxSuccess(data, xhr, settings, deferred) {\n var context = settings.context,\n status = 'success';\n settings.success.call(context, data, status, xhr);\n if (deferred) deferred.resolveWith(context, [data, status, xhr]);\n triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data]);\n ajaxComplete(status, xhr, settings);\n } // type: \"timeout\", \"error\", \"abort\", \"parsererror\"\n\n\n function ajaxError(error, type, xhr, settings, deferred) {\n var context = settings.context;\n settings.error.call(context, xhr, type, error);\n if (deferred) deferred.rejectWith(context, [xhr, type, error]);\n triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error || type]);\n ajaxComplete(type, xhr, settings);\n } // status: \"success\", \"notmodified\", \"error\", \"timeout\", \"abort\", \"parsererror\"\n\n\n function ajaxComplete(status, xhr, settings) {\n var context = settings.context;\n settings.complete.call(context, xhr, status);\n triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings]);\n ajaxStop(settings);\n }\n\n function ajaxDataFilter(data, type, settings) {\n if (settings.dataFilter == empty) return data;\n var context = settings.context;\n return settings.dataFilter.call(context, data, type);\n } // Empty function, used as default callback\n\n\n function empty() {}\n\n $.ajaxJSONP = function (options, deferred) {\n if (!('type' in options)) return $.ajax(options);\n\n var _callbackName = options.jsonpCallback,\n callbackName = ($.isFunction(_callbackName) ? _callbackName() : _callbackName) || 'Zepto' + jsonpID++,\n script = document.createElement('script'),\n originalCallback = window[callbackName],\n responseData,\n abort = function (errorType) {\n $(script).triggerHandler('error', errorType || 'abort');\n },\n xhr = {\n abort: abort\n },\n abortTimeout;\n\n if (deferred) deferred.promise(xhr);\n $(script).on('load error', function (e, errorType) {\n clearTimeout(abortTimeout);\n $(script).off().remove();\n\n if (e.type == 'error' || !responseData) {\n ajaxError(null, errorType || 'error', xhr, options, deferred);\n } else {\n ajaxSuccess(responseData[0], xhr, options, deferred);\n }\n\n window[callbackName] = originalCallback;\n if (responseData && $.isFunction(originalCallback)) originalCallback(responseData[0]);\n originalCallback = responseData = undefined;\n });\n\n if (ajaxBeforeSend(xhr, options) === false) {\n abort('abort');\n return xhr;\n }\n\n window[callbackName] = function () {\n responseData = arguments;\n };\n\n script.src = options.url.replace(/\\?(.+)=\\?/, '?$1=' + callbackName);\n document.head.appendChild(script);\n if (options.timeout > 0) abortTimeout = setTimeout(function () {\n abort('timeout');\n }, options.timeout);\n return xhr;\n };\n\n $.ajaxSettings = {\n // Default type of request\n type: 'GET',\n // Callback that is executed before request\n beforeSend: empty,\n // Callback that is executed if the request succeeds\n success: empty,\n // Callback that is executed the the server drops error\n error: empty,\n // Callback that is executed on request complete (both: error and success)\n complete: empty,\n // The context for the callbacks\n context: null,\n // Whether to trigger \"global\" Ajax events\n global: true,\n // Transport\n xhr: function () {\n return new window.XMLHttpRequest();\n },\n // MIME types mapping\n // IIS returns Javascript as \"application/x-javascript\"\n accepts: {\n script: 'text/javascript, application/javascript, application/x-javascript',\n json: jsonType,\n xml: 'application/xml, text/xml',\n html: htmlType,\n text: 'text/plain'\n },\n // Whether the request is to another domain\n crossDomain: false,\n // Default timeout\n timeout: 0,\n // Whether data should be serialized to string\n processData: true,\n // Whether the browser should be allowed to cache GET responses\n cache: true,\n //Used to handle the raw response data of XMLHttpRequest.\n //This is a pre-filtering function to sanitize the response.\n //The sanitized response should be returned\n dataFilter: empty\n };\n\n function mimeToDataType(mime) {\n if (mime) mime = mime.split(';', 2)[0];\n return mime && (mime == htmlType ? 'html' : mime == jsonType ? 'json' : scriptTypeRE.test(mime) ? 'script' : xmlTypeRE.test(mime) && 'xml') || 'text';\n }\n\n function appendQuery(url, query) {\n if (query == '') return url;\n return (url + '&' + query).replace(/[&?]{1,2}/, '?');\n } // serialize payload and append it to the URL for GET requests\n\n\n function serializeData(options) {\n if (options.processData && options.data && $.type(options.data) != \"string\") options.data = $.param(options.data, options.traditional);\n if (options.data && (!options.type || options.type.toUpperCase() == 'GET' || 'jsonp' == options.dataType)) options.url = appendQuery(options.url, options.data), options.data = undefined;\n }\n\n $.ajax = function (options) {\n var settings = $.extend({}, options || {}),\n deferred = $.Deferred && $.Deferred(),\n urlAnchor,\n hashIndex;\n\n for (key in $.ajaxSettings) if (settings[key] === undefined) settings[key] = $.ajaxSettings[key];\n\n ajaxStart(settings);\n\n if (!settings.crossDomain) {\n urlAnchor = document.createElement('a');\n urlAnchor.href = settings.url; // cleans up URL for .href (IE only), see https://github.com/madrobby/zepto/pull/1049\n\n urlAnchor.href = urlAnchor.href;\n settings.crossDomain = originAnchor.protocol + '//' + originAnchor.host !== urlAnchor.protocol + '//' + urlAnchor.host;\n }\n\n if (!settings.url) settings.url = window.location.toString();\n if ((hashIndex = settings.url.indexOf('#')) > -1) settings.url = settings.url.slice(0, hashIndex);\n serializeData(settings);\n var dataType = settings.dataType,\n hasPlaceholder = /\\?.+=\\?/.test(settings.url);\n if (hasPlaceholder) dataType = 'jsonp';\n if (settings.cache === false || (!options || options.cache !== true) && ('script' == dataType || 'jsonp' == dataType)) settings.url = appendQuery(settings.url, '_=' + Date.now());\n\n if ('jsonp' == dataType) {\n if (!hasPlaceholder) settings.url = appendQuery(settings.url, settings.jsonp ? settings.jsonp + '=?' : settings.jsonp === false ? '' : 'callback=?');\n return $.ajaxJSONP(settings, deferred);\n }\n\n var mime = settings.accepts[dataType],\n headers = {},\n setHeader = function (name, value) {\n headers[name.toLowerCase()] = [name, value];\n },\n protocol = /^([\\w-]+:)\\/\\//.test(settings.url) ? RegExp.$1 : window.location.protocol,\n xhr = settings.xhr(),\n nativeSetHeader = xhr.setRequestHeader,\n abortTimeout;\n\n if (deferred) deferred.promise(xhr);\n if (!settings.crossDomain) setHeader('X-Requested-With', 'XMLHttpRequest');\n setHeader('Accept', mime || '*/*');\n\n if (mime = settings.mimeType || mime) {\n if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0];\n xhr.overrideMimeType && xhr.overrideMimeType(mime);\n }\n\n if (settings.contentType || settings.contentType !== false && settings.data && settings.type.toUpperCase() != 'GET') setHeader('Content-Type', settings.contentType || 'application/x-www-form-urlencoded');\n if (settings.headers) for (name in settings.headers) setHeader(name, settings.headers[name]);\n xhr.setRequestHeader = setHeader;\n\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n xhr.onreadystatechange = empty;\n clearTimeout(abortTimeout);\n var result,\n error = false;\n\n if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304 || xhr.status == 0 && protocol == 'file:') {\n dataType = dataType || mimeToDataType(settings.mimeType || xhr.getResponseHeader('content-type'));\n if (xhr.responseType == 'arraybuffer' || xhr.responseType == 'blob') result = xhr.response;else {\n result = xhr.responseText;\n\n try {\n // http://perfectionkills.com/global-eval-what-are-the-options/\n // sanitize response accordingly if data filter callback provided\n result = ajaxDataFilter(result, dataType, settings);\n if (dataType == 'script') (1, eval)(result);else if (dataType == 'xml') result = xhr.responseXML;else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result);\n } catch (e) {\n error = e;\n }\n\n if (error) return ajaxError(error, 'parsererror', xhr, settings, deferred);\n }\n ajaxSuccess(result, xhr, settings, deferred);\n } else {\n ajaxError(xhr.statusText || null, xhr.status ? 'error' : 'abort', xhr, settings, deferred);\n }\n }\n };\n\n if (ajaxBeforeSend(xhr, settings) === false) {\n xhr.abort();\n ajaxError(null, 'abort', xhr, settings, deferred);\n return xhr;\n }\n\n var async = 'async' in settings ? settings.async : true;\n xhr.open(settings.type, settings.url, async, settings.username, settings.password);\n if (settings.xhrFields) for (name in settings.xhrFields) xhr[name] = settings.xhrFields[name];\n\n for (name in headers) nativeSetHeader.apply(xhr, headers[name]);\n\n if (settings.timeout > 0) abortTimeout = setTimeout(function () {\n xhr.onreadystatechange = empty;\n xhr.abort();\n ajaxError(null, 'timeout', xhr, settings, deferred);\n }, settings.timeout); // avoid sending empty string (#319)\n\n xhr.send(settings.data ? settings.data : null);\n return xhr;\n }; // handle optional data/success arguments\n\n\n function parseArguments(url, data, success, dataType) {\n if ($.isFunction(data)) dataType = success, success = data, data = undefined;\n if (!$.isFunction(success)) dataType = success, success = undefined;\n return {\n url: url,\n data: data,\n success: success,\n dataType: dataType\n };\n }\n\n $.get = function ()\n /* url, data, success, dataType */\n {\n return $.ajax(parseArguments.apply(null, arguments));\n };\n\n $.post = function ()\n /* url, data, success, dataType */\n {\n var options = parseArguments.apply(null, arguments);\n options.type = 'POST';\n return $.ajax(options);\n };\n\n $.getJSON = function ()\n /* url, data, success */\n {\n var options = parseArguments.apply(null, arguments);\n options.dataType = 'json';\n return $.ajax(options);\n };\n\n $.fn.load = function (url, data, success) {\n if (!this.length) return this;\n var self = this,\n parts = url.split(/\\s/),\n selector,\n options = parseArguments(url, data, success),\n callback = options.success;\n if (parts.length > 1) options.url = parts[0], selector = parts[1];\n\n options.success = function (response) {\n self.html(selector ? $('
').html(response.replace(rscript, \"\")).find(selector) : response);\n callback && callback.apply(self, arguments);\n };\n\n $.ajax(options);\n return this;\n };\n\n var escape = encodeURIComponent;\n\n function serialize(params, obj, traditional, scope) {\n var type,\n array = $.isArray(obj),\n hash = $.isPlainObject(obj);\n $.each(obj, function (key, value) {\n type = $.type(value);\n if (scope) key = traditional ? scope : scope + '[' + (hash || type == 'object' || type == 'array' ? key : '') + ']'; // handle data in serializeArray() format\n\n if (!scope && array) params.add(value.name, value.value); // recurse into nested objects\n else if (type == \"array\" || !traditional && type == \"object\") serialize(params, value, traditional, key);else params.add(key, value);\n });\n }\n\n $.param = function (obj, traditional) {\n var params = [];\n\n params.add = function (key, value) {\n if ($.isFunction(value)) value = value();\n if (value == null) value = \"\";\n this.push(escape(key) + '=' + escape(value));\n };\n\n serialize(params, obj, traditional);\n return params.join('&').replace(/%20/g, '+');\n };\n})(Zepto);\n\n(function ($) {\n // Create a collection of callbacks to be fired in a sequence, with configurable behaviour\n // Option flags:\n // - once: Callbacks fired at most one time.\n // - memory: Remember the most recent context and arguments\n // - stopOnFalse: Cease iterating over callback list\n // - unique: Permit adding at most one instance of the same callback\n $.Callbacks = function (options) {\n options = $.extend({}, options);\n\n var memory,\n // Last fire value (for non-forgettable lists)\n fired,\n // Flag to know if list was already fired\n firing,\n // Flag to know if list is currently firing\n firingStart,\n // First callback to fire (used internally by add and fireWith)\n firingLength,\n // End of the loop when firing\n firingIndex,\n // Index of currently firing callback (modified by remove if needed)\n list = [],\n // Actual callback list\n stack = !options.once && [],\n // Stack of fire calls for repeatable lists\n fire = function (data) {\n memory = options.memory && data;\n fired = true;\n firingIndex = firingStart || 0;\n firingStart = 0;\n firingLength = list.length;\n firing = true;\n\n for (; list && firingIndex < firingLength; ++firingIndex) {\n if (list[firingIndex].apply(data[0], data[1]) === false && options.stopOnFalse) {\n memory = false;\n break;\n }\n }\n\n firing = false;\n\n if (list) {\n if (stack) stack.length && fire(stack.shift());else if (memory) list.length = 0;else Callbacks.disable();\n }\n },\n Callbacks = {\n add: function () {\n if (list) {\n var start = list.length,\n add = function (args) {\n $.each(args, function (_, arg) {\n if (typeof arg === \"function\") {\n if (!options.unique || !Callbacks.has(arg)) list.push(arg);\n } else if (arg && arg.length && typeof arg !== 'string') add(arg);\n });\n };\n\n add(arguments);\n if (firing) firingLength = list.length;else if (memory) {\n firingStart = start;\n fire(memory);\n }\n }\n\n return this;\n },\n remove: function () {\n if (list) {\n $.each(arguments, function (_, arg) {\n var index;\n\n while ((index = $.inArray(arg, list, index)) > -1) {\n list.splice(index, 1); // Handle firing indexes\n\n if (firing) {\n if (index <= firingLength) --firingLength;\n if (index <= firingIndex) --firingIndex;\n }\n }\n });\n }\n\n return this;\n },\n has: function (fn) {\n return !!(list && (fn ? $.inArray(fn, list) > -1 : list.length));\n },\n empty: function () {\n firingLength = list.length = 0;\n return this;\n },\n disable: function () {\n list = stack = memory = undefined;\n return this;\n },\n disabled: function () {\n return !list;\n },\n lock: function () {\n stack = undefined;\n if (!memory) Callbacks.disable();\n return this;\n },\n locked: function () {\n return !stack;\n },\n fireWith: function (context, args) {\n if (list && (!fired || stack)) {\n args = args || [];\n args = [context, args.slice ? args.slice() : args];\n if (firing) stack.push(args);else fire(args);\n }\n\n return this;\n },\n fire: function () {\n return Callbacks.fireWith(this, arguments);\n },\n fired: function () {\n return !!fired;\n }\n };\n\n return Callbacks;\n };\n})(Zepto);\n\n(function ($) {\n var slice = Array.prototype.slice;\n\n function Deferred(func) {\n var tuples = [// action, add listener, listener list, final state\n [\"resolve\", \"done\", $.Callbacks({\n once: 1,\n memory: 1\n }), \"resolved\"], [\"reject\", \"fail\", $.Callbacks({\n once: 1,\n memory: 1\n }), \"rejected\"], [\"notify\", \"progress\", $.Callbacks({\n memory: 1\n })]],\n state = \"pending\",\n promise = {\n state: function () {\n return state;\n },\n always: function () {\n deferred.done(arguments).fail(arguments);\n return this;\n },\n then: function ()\n /* fnDone [, fnFailed [, fnProgress]] */\n {\n var fns = arguments;\n return Deferred(function (defer) {\n $.each(tuples, function (i, tuple) {\n var fn = $.isFunction(fns[i]) && fns[i];\n deferred[tuple[1]](function () {\n var returned = fn && fn.apply(this, arguments);\n\n if (returned && $.isFunction(returned.promise)) {\n returned.promise().done(defer.resolve).fail(defer.reject).progress(defer.notify);\n } else {\n var context = this === promise ? defer.promise() : this,\n values = fn ? [returned] : arguments;\n defer[tuple[0] + \"With\"](context, values);\n }\n });\n });\n fns = null;\n }).promise();\n },\n promise: function (obj) {\n return obj != null ? $.extend(obj, promise) : promise;\n }\n },\n deferred = {};\n $.each(tuples, function (i, tuple) {\n var list = tuple[2],\n stateString = tuple[3];\n promise[tuple[1]] = list.add;\n\n if (stateString) {\n list.add(function () {\n state = stateString;\n }, tuples[i ^ 1][2].disable, tuples[2][2].lock);\n }\n\n deferred[tuple[0]] = function () {\n deferred[tuple[0] + \"With\"](this === deferred ? promise : this, arguments);\n return this;\n };\n\n deferred[tuple[0] + \"With\"] = list.fireWith;\n });\n promise.promise(deferred);\n if (func) func.call(deferred, deferred);\n return deferred;\n }\n\n $.when = function (sub) {\n var resolveValues = slice.call(arguments),\n len = resolveValues.length,\n i = 0,\n remain = len !== 1 || sub && $.isFunction(sub.promise) ? len : 0,\n deferred = remain === 1 ? sub : Deferred(),\n progressValues,\n progressContexts,\n resolveContexts,\n updateFn = function (i, ctx, val) {\n return function (value) {\n ctx[i] = this;\n val[i] = arguments.length > 1 ? slice.call(arguments) : value;\n\n if (val === progressValues) {\n deferred.notifyWith(ctx, val);\n } else if (! --remain) {\n deferred.resolveWith(ctx, val);\n }\n };\n };\n\n if (len > 1) {\n progressValues = new Array(len);\n progressContexts = new Array(len);\n resolveContexts = new Array(len);\n\n for (; i < len; ++i) {\n if (resolveValues[i] && $.isFunction(resolveValues[i].promise)) {\n resolveValues[i].promise().done(updateFn(i, resolveContexts, resolveValues)).fail(deferred.reject).progress(updateFn(i, progressContexts, progressValues));\n } else {\n --remain;\n }\n }\n }\n\n if (!remain) deferred.resolveWith(resolveContexts, resolveValues);\n return deferred.promise();\n };\n\n $.Deferred = Deferred;\n})(Zepto);\n\n(function ($) {\n var _zid = 1,\n undefined$1,\n slice = Array.prototype.slice,\n isFunction = $.isFunction,\n isString = function (obj) {\n return typeof obj == 'string';\n },\n handlers = {},\n specialEvents = {},\n focusinSupported = 'onfocusin' in window,\n focus = {\n focus: 'focusin',\n blur: 'focusout'\n },\n hover = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n };\n\n specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents';\n\n function zid(element) {\n return element._zid || (element._zid = _zid++);\n }\n\n function findHandlers(element, event, fn, selector) {\n event = parse(event);\n if (event.ns) var matcher = matcherFor(event.ns);\n return (handlers[zid(element)] || []).filter(function (handler) {\n return handler && (!event.e || handler.e == event.e) && (!event.ns || matcher.test(handler.ns)) && (!fn || zid(handler.fn) === zid(fn)) && (!selector || handler.sel == selector);\n });\n }\n\n function parse(event) {\n var parts = ('' + event).split('.');\n return {\n e: parts[0],\n ns: parts.slice(1).sort().join(' ')\n };\n }\n\n function matcherFor(ns) {\n return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)');\n }\n\n function eventCapture(handler, captureSetting) {\n return handler.del && !focusinSupported && handler.e in focus || !!captureSetting;\n }\n\n function realEvent(type) {\n return hover[type] || focusinSupported && focus[type] || type;\n }\n\n function add(element, events, fn, data, selector, delegator, capture) {\n var id = zid(element),\n set = handlers[id] || (handlers[id] = []);\n events.split(/\\s/).forEach(function (event) {\n if (event == 'ready') return $(document).ready(fn);\n var handler = parse(event);\n handler.fn = fn;\n handler.sel = selector; // emulate mouseenter, mouseleave\n\n if (handler.e in hover) fn = function (e) {\n var related = e.relatedTarget;\n if (!related || related !== this && !$.contains(this, related)) return handler.fn.apply(this, arguments);\n };\n handler.del = delegator;\n var callback = delegator || fn;\n\n handler.proxy = function (e) {\n e = compatible(e);\n if (e.isImmediatePropagationStopped()) return;\n e.data = data;\n var result = callback.apply(element, e._args == undefined$1 ? [e] : [e].concat(e._args));\n if (result === false) e.preventDefault(), e.stopPropagation();\n return result;\n };\n\n handler.i = set.length;\n set.push(handler);\n if ('addEventListener' in element) element.addEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture));\n });\n }\n\n function remove(element, events, fn, selector, capture) {\n var id = zid(element);\n (events || '').split(/\\s/).forEach(function (event) {\n findHandlers(element, event, fn, selector).forEach(function (handler) {\n delete handlers[id][handler.i];\n if ('removeEventListener' in element) element.removeEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture));\n });\n });\n }\n\n $.event = {\n add: add,\n remove: remove\n };\n\n $.proxy = function (fn, context) {\n var args = 2 in arguments && slice.call(arguments, 2);\n\n if (isFunction(fn)) {\n var proxyFn = function () {\n return fn.apply(context, args ? args.concat(slice.call(arguments)) : arguments);\n };\n\n proxyFn._zid = zid(fn);\n return proxyFn;\n } else if (isString(context)) {\n if (args) {\n args.unshift(fn[context], fn);\n return $.proxy.apply(null, args);\n } else {\n return $.proxy(fn[context], fn);\n }\n } else {\n throw new TypeError(\"expected function\");\n }\n };\n\n $.fn.bind = function (event, data, callback) {\n return this.on(event, data, callback);\n };\n\n $.fn.unbind = function (event, callback) {\n return this.off(event, callback);\n };\n\n $.fn.one = function (event, selector, data, callback) {\n return this.on(event, selector, data, callback, 1);\n };\n\n var returnTrue = function () {\n return true;\n },\n returnFalse = function () {\n return false;\n },\n ignoreProperties = /^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,\n eventMethods = {\n preventDefault: 'isDefaultPrevented',\n stopImmediatePropagation: 'isImmediatePropagationStopped',\n stopPropagation: 'isPropagationStopped'\n };\n\n function compatible(event, source) {\n if (source || !event.isDefaultPrevented) {\n source || (source = event);\n $.each(eventMethods, function (name, predicate) {\n var sourceMethod = source[name];\n\n event[name] = function () {\n this[predicate] = returnTrue;\n return sourceMethod && sourceMethod.apply(source, arguments);\n };\n\n event[predicate] = returnFalse;\n });\n event.timeStamp || (event.timeStamp = Date.now());\n if (source.defaultPrevented !== undefined$1 ? source.defaultPrevented : 'returnValue' in source ? source.returnValue === false : source.getPreventDefault && source.getPreventDefault()) event.isDefaultPrevented = returnTrue;\n }\n\n return event;\n }\n\n function createProxy(event) {\n var key,\n proxy = {\n originalEvent: event\n };\n\n for (key in event) if (!ignoreProperties.test(key) && event[key] !== undefined$1) proxy[key] = event[key];\n\n return compatible(proxy, event);\n }\n\n $.fn.delegate = function (selector, event, callback) {\n return this.on(event, selector, callback);\n };\n\n $.fn.undelegate = function (selector, event, callback) {\n return this.off(event, selector, callback);\n };\n\n $.fn.live = function (event, callback) {\n $(document.body).delegate(this.selector, event, callback);\n return this;\n };\n\n $.fn.die = function (event, callback) {\n $(document.body).undelegate(this.selector, event, callback);\n return this;\n };\n\n $.fn.on = function (event, selector, data, callback, one) {\n var autoRemove,\n delegator,\n $this = this;\n\n if (event && !isString(event)) {\n $.each(event, function (type, fn) {\n $this.on(type, selector, data, fn, one);\n });\n return $this;\n }\n\n if (!isString(selector) && !isFunction(callback) && callback !== false) callback = data, data = selector, selector = undefined$1;\n if (callback === undefined$1 || data === false) callback = data, data = undefined$1;\n if (callback === false) callback = returnFalse;\n return $this.each(function (_, element) {\n if (one) autoRemove = function (e) {\n remove(element, e.type, callback);\n return callback.apply(this, arguments);\n };\n if (selector) delegator = function (e) {\n var evt,\n match = $(e.target).closest(selector, element).get(0);\n\n if (match && match !== element) {\n evt = $.extend(createProxy(e), {\n currentTarget: match,\n liveFired: element\n });\n return (autoRemove || callback).apply(match, [evt].concat(slice.call(arguments, 1)));\n }\n };\n add(element, event, callback, data, selector, delegator || autoRemove);\n });\n };\n\n $.fn.off = function (event, selector, callback) {\n var $this = this;\n\n if (event && !isString(event)) {\n $.each(event, function (type, fn) {\n $this.off(type, selector, fn);\n });\n return $this;\n }\n\n if (!isString(selector) && !isFunction(callback) && callback !== false) callback = selector, selector = undefined$1;\n if (callback === false) callback = returnFalse;\n return $this.each(function () {\n remove(this, event, callback, selector);\n });\n };\n\n $.fn.trigger = function (event, args) {\n event = isString(event) || $.isPlainObject(event) ? $.Event(event) : compatible(event);\n event._args = args;\n return this.each(function () {\n // handle focus(), blur() by calling them directly\n if (event.type in focus && typeof this[event.type] == \"function\") this[event.type](); // items in the collection might not be DOM elements\n else if ('dispatchEvent' in this) this.dispatchEvent(event);else $(this).triggerHandler(event, args);\n });\n }; // triggers event handlers on current element just as if an event occurred,\n // doesn't trigger an actual event, doesn't bubble\n\n\n $.fn.triggerHandler = function (event, args) {\n var e, result;\n this.each(function (i, element) {\n e = createProxy(isString(event) ? $.Event(event) : event);\n e._args = args;\n e.target = element;\n $.each(findHandlers(element, event.type || event), function (i, handler) {\n result = handler.proxy(e);\n if (e.isImmediatePropagationStopped()) return false;\n });\n });\n return result;\n } // shortcut methods for `.bind(event, fn)` for each event type\n ;\n\n ('focusin focusout focus blur load resize scroll unload click dblclick ' + 'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave ' + 'change select keydown keypress keyup error').split(' ').forEach(function (event) {\n $.fn[event] = function (callback) {\n return 0 in arguments ? this.bind(event, callback) : this.trigger(event);\n };\n });\n\n $.Event = function (type, props) {\n if (!isString(type)) props = type, type = props.type;\n var event = document.createEvent(specialEvents[type] || 'Events'),\n bubbles = true;\n if (props) for (var name in props) name == 'bubbles' ? bubbles = !!props[name] : event[name] = props[name];\n event.initEvent(type, bubbles, true);\n return compatible(event);\n };\n})(Zepto);\n\n(function () {\n // getComputedStyle shouldn't freak out when called\n // without a valid element as argument\n try {\n getComputedStyle(undefined);\n } catch (e) {\n var nativeGetComputedStyle = getComputedStyle;\n\n window.getComputedStyle = function (element, pseudoElement) {\n try {\n return nativeGetComputedStyle(element, pseudoElement);\n } catch (e) {\n return null;\n }\n };\n }\n})();\n\n(function ($) {\n var zepto = $.zepto,\n oldQsa = zepto.qsa,\n oldMatches = zepto.matches;\n\n function visible(elem) {\n elem = $(elem);\n return !!(elem.width() || elem.height()) && elem.css(\"display\") !== \"none\";\n } // Implements a subset from:\n // http://api.jquery.com/category/selectors/jquery-selector-extensions/\n //\n // Each filter function receives the current index, all nodes in the\n // considered set, and a value if there were parentheses. The value\n // of `this` is the node currently being considered. The function returns the\n // resulting node(s), null, or undefined.\n //\n // Complex selectors are not supported:\n // li:has(label:contains(\"foo\")) + li:has(label:contains(\"bar\"))\n // ul.inner:first > li\n\n\n var filters = $.expr[':'] = {\n visible: function () {\n if (visible(this)) return this;\n },\n hidden: function () {\n if (!visible(this)) return this;\n },\n selected: function () {\n if (this.selected) return this;\n },\n checked: function () {\n if (this.checked) return this;\n },\n parent: function () {\n return this.parentNode;\n },\n first: function (idx) {\n if (idx === 0) return this;\n },\n last: function (idx, nodes) {\n if (idx === nodes.length - 1) return this;\n },\n eq: function (idx, _, value) {\n if (idx === value) return this;\n },\n contains: function (idx, _, text) {\n if ($(this).text().indexOf(text) > -1) return this;\n },\n has: function (idx, _, sel) {\n if (zepto.qsa(this, sel).length) return this;\n }\n };\n var filterRe = new RegExp('(.*):(\\\\w+)(?:\\\\(([^)]+)\\\\))?$\\\\s*'),\n childRe = /^\\s*>/,\n classTag = 'Zepto' + +new Date();\n\n function process(sel, fn) {\n // quote the hash in `a[href^=#]` expression\n sel = sel.replace(/=#\\]/g, '=\"#\"]');\n var filter,\n arg,\n match = filterRe.exec(sel);\n\n if (match && match[2] in filters) {\n filter = filters[match[2]], arg = match[3];\n sel = match[1];\n\n if (arg) {\n var num = Number(arg);\n if (isNaN(num)) arg = arg.replace(/^[\"']|[\"']$/g, '');else arg = num;\n }\n }\n\n return fn(sel, filter, arg);\n }\n\n zepto.qsa = function (node, selector) {\n return process(selector, function (sel, filter, arg) {\n try {\n var taggedParent;\n if (!sel && filter) sel = '*';else if (childRe.test(sel)) // support \"> *\" child queries by tagging the parent node with a\n // unique class and prepending that classname onto the selector\n taggedParent = $(node).addClass(classTag), sel = '.' + classTag + ' ' + sel;\n var nodes = oldQsa(node, sel);\n } catch (e) {\n console.error('error performing selector: %o', selector);\n throw e;\n } finally {\n if (taggedParent) taggedParent.removeClass(classTag);\n }\n\n return !filter ? nodes : zepto.uniq($.map(nodes, function (n, i) {\n return filter.call(n, i, nodes, arg);\n }));\n });\n };\n\n zepto.matches = function (node, selector) {\n return process(selector, function (sel, filter, arg) {\n return (!sel || oldMatches(node, sel)) && (!filter || filter.call(node, null, arg) === node);\n });\n };\n})(Zepto);\n\nvar zepto = Zepto;\n\n/* eslint-disable no-useless-escape */\n// The order of the following arrays is important, be careful if you change it.\nvar BROWSER_DATA = [{\n name: 'Chromium',\n group: 'Chrome',\n identifier: 'Chromium/([0-9\\.]*)'\n}, {\n name: 'Chrome Mobile',\n group: 'Chrome',\n identifier: 'Chrome/([0-9\\.]*) Mobile',\n versionIdentifier: 'Chrome/([0-9\\.]*)'\n}, {\n name: 'Chrome',\n group: 'Chrome',\n identifier: 'Chrome/([0-9\\.]*)'\n}, {\n name: 'Chrome for iOS',\n group: 'Chrome',\n identifier: 'CriOS/([0-9\\.]*)'\n}, {\n name: 'Android Browser',\n group: 'Chrome',\n identifier: 'CrMo/([0-9\\.]*)'\n}, {\n name: 'Firefox',\n group: 'Firefox',\n identifier: 'Firefox/([0-9\\.]*)'\n}, {\n name: 'Opera Mini',\n group: 'Opera',\n identifier: 'Opera Mini/([0-9\\.]*)'\n}, {\n name: 'Opera',\n group: 'Opera',\n identifier: 'Opera ([0-9\\.]*)'\n}, {\n name: 'Opera',\n group: 'Opera',\n identifier: 'Opera/([0-9\\.]*)',\n versionIdentifier: 'Version/([0-9\\.]*)'\n}, {\n name: 'IEMobile',\n group: 'Explorer',\n identifier: 'IEMobile/([0-9\\.]*)'\n}, {\n name: 'Internet Explorer',\n group: 'Explorer',\n identifier: 'MSIE ([a-zA-Z0-9\\.]*)'\n}, {\n name: 'Internet Explorer',\n group: 'Explorer',\n identifier: 'Trident/([0-9\\.]*)',\n versionIdentifier: 'rv:([0-9\\.]*)'\n}, {\n name: 'Spartan',\n group: 'Spartan',\n identifier: 'Edge/([0-9\\.]*)',\n versionIdentifier: 'Edge/([0-9\\.]*)'\n}, {\n name: 'Safari',\n group: 'Safari',\n identifier: 'Safari/([0-9\\.]*)',\n versionIdentifier: 'Version/([0-9\\.]*)'\n}];\n\n/* eslint-disable no-useless-escape */\n// The order of the following arrays is important, be careful if you change it.\nvar OS_DATA = [{\n name: 'Windows 2000',\n group: 'Windows',\n identifier: 'Windows NT 5.0',\n version: '5.0'\n}, {\n name: 'Windows XP',\n group: 'Windows',\n identifier: 'Windows NT 5.1',\n version: '5.1'\n}, {\n name: 'Windows Vista',\n group: 'Windows',\n identifier: 'Windows NT 6.0',\n version: '6.0'\n}, {\n name: 'Windows 7',\n group: 'Windows',\n identifier: 'Windows NT 6.1',\n version: '7.0'\n}, {\n name: 'Windows 8',\n group: 'Windows',\n identifier: 'Windows NT 6.2',\n version: '8.0'\n}, {\n name: 'Windows 8.1',\n group: 'Windows',\n identifier: 'Windows NT 6.3',\n version: '8.1'\n}, {\n name: 'Windows 10',\n group: 'Windows',\n identifier: 'Windows NT 10.0',\n version: '10.0'\n}, {\n name: 'Windows Phone',\n group: 'Windows Phone',\n identifier: 'Windows Phone ([0-9\\.]*)'\n}, {\n name: 'Windows Phone',\n group: 'Windows Phone',\n identifier: 'Windows Phone OS ([0-9\\.]*)'\n}, {\n name: 'Windows',\n group: 'Windows',\n identifier: 'Windows'\n}, {\n name: 'Chrome OS',\n group: 'Chrome OS',\n identifier: 'CrOS'\n}, {\n name: 'Android',\n group: 'Android',\n identifier: 'Android',\n versionIdentifier: 'Android ([a-zA-Z0-9\\.-]*)'\n}, {\n name: 'iPad',\n group: 'iOS',\n identifier: 'iPad',\n versionIdentifier: 'OS ([0-9_]*)',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'iPod',\n group: 'iOS',\n identifier: 'iPod',\n versionIdentifier: 'OS ([0-9_]*)',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'iPhone',\n group: 'iOS',\n identifier: 'iPhone OS',\n versionIdentifier: 'OS ([0-9_]*)',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X High Sierra',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])13([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X Sierra',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])12([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X El Capitan',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])11([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X Yosemite',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])10([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X Mavericks',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])9([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X Mountain Lion',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])8([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X Lion',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])7([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X Snow Leopard',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])6([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X Leopard',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])5([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X Tiger',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])4([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X Panther',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])3([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X Jaguar',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])2([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X Puma',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])1([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS X Cheetah',\n group: 'Mac OS',\n identifier: 'Mac OS X (10([_|\\.])0([0-9_\\.]*))',\n versionSeparator: '[_|\\.]'\n}, {\n name: 'Mac OS',\n group: 'Mac OS',\n identifier: 'Mac OS'\n}, {\n name: 'Ubuntu',\n group: 'Linux',\n identifier: 'Ubuntu',\n versionIdentifier: 'Ubuntu/([0-9\\.]*)'\n}, {\n name: 'Debian',\n group: 'Linux',\n identifier: 'Debian'\n}, {\n name: 'Gentoo',\n group: 'Linux',\n identifier: 'Gentoo'\n}, {\n name: 'Linux',\n group: 'Linux',\n identifier: 'Linux'\n}, {\n name: 'BlackBerry',\n group: 'BlackBerry',\n identifier: 'BlackBerry'\n}];\n\nvar Browser = {};\n\nvar hasLocalstorage = function hasLocalstorage() {\n try {\n localStorage.setItem('clappr', 'clappr');\n localStorage.removeItem('clappr');\n return true;\n } catch (e) {\n return false;\n }\n};\n\nvar hasFlash = function hasFlash() {\n try {\n var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');\n return !!fo;\n } catch (e) {\n return !!(navigator.mimeTypes && navigator.mimeTypes['application/x-shockwave-flash'] !== undefined && navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin);\n }\n};\n\nvar getBrowserInfo = function getBrowserInfo(ua) {\n var parts = ua.match(/\\b(playstation 4|nx|opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [],\n extra;\n\n if (/trident/i.test(parts[1])) {\n extra = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n return {\n name: 'IE',\n version: parseInt(extra[1] || '')\n };\n } else if (parts[1] === 'Chrome') {\n extra = ua.match(/\\bOPR\\/(\\d+)/);\n if (extra != null) return {\n name: 'Opera',\n version: parseInt(extra[1])\n };\n extra = ua.match(/\\bEdge\\/(\\d+)/);\n if (extra != null) return {\n name: 'Edge',\n version: parseInt(extra[1])\n };\n } else if (/android/i.test(ua) && (extra = ua.match(/version\\/(\\d+)/i))) {\n parts.splice(1, 1, 'Android WebView');\n parts.splice(2, 1, extra[1]);\n }\n\n parts = parts[2] ? [parts[1], parts[2]] : [navigator.appName, navigator.appVersion, '-?'];\n return {\n name: parts[0],\n version: parseInt(parts[1])\n };\n}; // Get browser data\n\nvar getBrowserData = function getBrowserData() {\n var browserObject = {};\n var userAgent = Browser.userAgent.toLowerCase(); // Check browser type\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = BROWSER_DATA[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var browser = _step.value;\n var browserRegExp = new RegExp(browser.identifier.toLowerCase());\n var browserRegExpResult = browserRegExp.exec(userAgent);\n\n if (browserRegExpResult != null && browserRegExpResult[1]) {\n browserObject.name = browser.name;\n browserObject.group = browser.group; // Check version\n\n if (browser.versionIdentifier) {\n var versionRegExp = new RegExp(browser.versionIdentifier.toLowerCase());\n var versionRegExpResult = versionRegExp.exec(userAgent);\n if (versionRegExpResult != null && versionRegExpResult[1]) setBrowserVersion(versionRegExpResult[1], browserObject);\n } else {\n setBrowserVersion(browserRegExpResult[1], browserObject);\n }\n\n break;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) {\n _iterator[\"return\"]();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return browserObject;\n}; // Set browser version\n\nvar setBrowserVersion = function setBrowserVersion(version, browserObject) {\n var splitVersion = version.split('.', 2);\n browserObject.fullVersion = version; // Major version\n\n if (splitVersion[0]) browserObject.majorVersion = parseInt(splitVersion[0]); // Minor version\n\n if (splitVersion[1]) browserObject.minorVersion = parseInt(splitVersion[1]);\n}; // Get OS data\n\n\nvar getOsData = function getOsData() {\n var osObject = {};\n var userAgent = Browser.userAgent.toLowerCase(); // Check browser type\n\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = OS_DATA[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var os = _step2.value;\n var osRegExp = new RegExp(os.identifier.toLowerCase());\n var osRegExpResult = osRegExp.exec(userAgent);\n\n if (osRegExpResult != null) {\n osObject.name = os.name;\n osObject.group = os.group; // Version defined\n\n if (os.version) {\n setOsVersion(os.version, os.versionSeparator ? os.versionSeparator : '.', osObject); // Version detected\n } else if (osRegExpResult[1]) {\n setOsVersion(osRegExpResult[1], os.versionSeparator ? os.versionSeparator : '.', osObject); // Version identifier\n } else if (os.versionIdentifier) {\n var versionRegExp = new RegExp(os.versionIdentifier.toLowerCase());\n var versionRegExpResult = versionRegExp.exec(userAgent);\n if (versionRegExpResult != null && versionRegExpResult[1]) setOsVersion(versionRegExpResult[1], os.versionSeparator ? os.versionSeparator : '.', osObject);\n }\n\n break;\n }\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) {\n _iterator2[\"return\"]();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n return osObject;\n}; // Set OS version\n\nvar setOsVersion = function setOsVersion(version, separator, osObject) {\n var finalSeparator = separator.substr(0, 1) == '[' ? new RegExp(separator, 'g') : separator;\n var splitVersion = version.split(finalSeparator, 2);\n if (separator != '.') version = version.replace(new RegExp(separator, 'g'), '.');\n osObject.fullVersion = version; // Major version\n\n if (splitVersion && splitVersion[0]) osObject.majorVersion = parseInt(splitVersion[0]); // Minor version\n\n if (splitVersion && splitVersion[1]) osObject.minorVersion = parseInt(splitVersion[1]);\n}; // Set viewport size\n\n\nvar getViewportSize = function getViewportSize() {\n var viewportObject = {};\n viewportObject.width = zepto(window).width();\n viewportObject.height = zepto(window).height();\n return viewportObject;\n}; // Set viewport orientation\n\nvar setViewportOrientation = function setViewportOrientation() {\n switch (window.orientation) {\n case -90:\n case 90:\n Browser.viewport.orientation = 'landscape';\n break;\n\n default:\n Browser.viewport.orientation = 'portrait';\n break;\n }\n};\n\nvar getDevice = function getDevice(ua) {\n var platformRegExp = /\\((iP(?:hone|ad|od))?(?:[^;]*; ){0,2}([^)]+(?=\\)))/;\n var matches = platformRegExp.exec(ua);\n var device = matches && (matches[1] || matches[2]) || '';\n return device;\n};\nvar browserInfo = getBrowserInfo(navigator.userAgent);\nBrowser.isEdge = /edge/i.test(navigator.userAgent);\nBrowser.isChrome = /chrome|CriOS/i.test(navigator.userAgent) && !Browser.isEdge;\nBrowser.isSafari = /safari/i.test(navigator.userAgent) && !Browser.isChrome && !Browser.isEdge;\nBrowser.isFirefox = /firefox/i.test(navigator.userAgent);\nBrowser.isLegacyIE = !!window.ActiveXObject;\nBrowser.isIE = Browser.isLegacyIE || /trident.*rv:1\\d/i.test(navigator.userAgent);\nBrowser.isIE11 = /trident.*rv:11/i.test(navigator.userAgent);\nBrowser.isChromecast = Browser.isChrome && /CrKey/i.test(navigator.userAgent);\nBrowser.isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone|IEMobile|Mobile Safari|Opera Mini/i.test(navigator.userAgent);\nBrowser.isiOS = /iPad|iPhone|iPod/i.test(navigator.userAgent);\nBrowser.isAndroid = /Android/i.test(navigator.userAgent);\nBrowser.isWindowsPhone = /Windows Phone/i.test(navigator.userAgent);\nBrowser.isWin8App = /MSAppHost/i.test(navigator.userAgent);\nBrowser.isWiiU = /WiiU/i.test(navigator.userAgent);\nBrowser.isPS4 = /PlayStation 4/i.test(navigator.userAgent);\nBrowser.hasLocalstorage = hasLocalstorage();\nBrowser.hasFlash = hasFlash();\n/**\n* @deprecated\n* This parameter currently exists for retrocompatibility reasons.\n* Use Browser.data.name instead.\n*/\n\nBrowser.name = browserInfo.name;\n/**\n* @deprecated\n* This parameter currently exists for retrocompatibility reasons.\n* Use Browser.data.fullVersion instead.\n*/\n\nBrowser.version = browserInfo.version;\nBrowser.userAgent = navigator.userAgent;\nBrowser.data = getBrowserData();\nBrowser.os = getOsData();\nBrowser.viewport = getViewportSize();\nBrowser.device = getDevice(Browser.userAgent);\ntypeof window.orientation !== 'undefined' && setViewportOrientation();\n\nfunction assign(obj, source) {\n if (source) {\n for (var prop in source) {\n var propDescriptor = Object.getOwnPropertyDescriptor(source, prop);\n propDescriptor ? Object.defineProperty(obj, prop, propDescriptor) : obj[prop] = source[prop];\n }\n }\n\n return obj;\n}\nfunction extend(parent, properties) {\n var Surrogate = /*#__PURE__*/function (_parent) {\n _inherits(Surrogate, _parent);\n\n function Surrogate() {\n var _getPrototypeOf2;\n\n var _this;\n\n _classCallCheck(this, Surrogate);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(Surrogate)).call.apply(_getPrototypeOf2, [this].concat(args)));\n if (properties.initialize) properties.initialize.apply(_assertThisInitialized(_this), args);\n return _this;\n }\n\n return Surrogate;\n }(parent);\n\n assign(Surrogate.prototype, properties);\n return Surrogate;\n}\nfunction formatTime(time, paddedHours) {\n if (!isFinite(time)) return '--:--';\n time = time * 1000;\n time = parseInt(time / 1000);\n var seconds = time % 60;\n time = parseInt(time / 60);\n var minutes = time % 60;\n time = parseInt(time / 60);\n var hours = time % 24;\n var days = parseInt(time / 24);\n var out = '';\n\n if (days && days > 0) {\n out += days + ':';\n if (hours < 1) out += '00:';\n }\n\n if (hours && hours > 0 || paddedHours) out += ('0' + hours).slice(-2) + ':';\n out += ('0' + minutes).slice(-2) + ':';\n out += ('0' + seconds).slice(-2);\n return out.trim();\n}\nvar Fullscreen = {\n fullscreenElement: function fullscreenElement() {\n return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement;\n },\n requestFullscreen: function requestFullscreen(el) {\n if (el.requestFullscreen) el.requestFullscreen();else if (el.webkitRequestFullscreen) el.webkitRequestFullscreen();else if (el.mozRequestFullScreen) el.mozRequestFullScreen();else if (el.msRequestFullscreen) el.msRequestFullscreen();else if (el.querySelector && el.querySelector('video') && el.querySelector('video').webkitEnterFullScreen) el.querySelector('video').webkitEnterFullScreen();else if (el.webkitEnterFullScreen) el.webkitEnterFullScreen();\n },\n cancelFullscreen: function cancelFullscreen() {\n var el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;\n if (el.exitFullscreen) el.exitFullscreen();else if (el.webkitCancelFullScreen) el.webkitCancelFullScreen();else if (el.webkitExitFullscreen) el.webkitExitFullscreen();else if (el.mozCancelFullScreen) el.mozCancelFullScreen();else if (el.msExitFullscreen) el.msExitFullscreen();\n },\n fullscreenEnabled: function fullscreenEnabled() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n};\nvar Config = /*#__PURE__*/function () {\n function Config() {\n _classCallCheck(this, Config);\n }\n\n _createClass(Config, null, [{\n key: \"_defaultConfig\",\n value: function _defaultConfig() {\n return {\n volume: {\n value: 100,\n parse: parseInt\n }\n };\n }\n }, {\n key: \"_defaultValueFor\",\n value: function _defaultValueFor(key) {\n try {\n return this._defaultConfig()[key].parse(this._defaultConfig()[key].value);\n } catch (e) {\n return undefined;\n }\n }\n }, {\n key: \"_createKeyspace\",\n value: function _createKeyspace(key) {\n return \"clappr.\".concat(document.domain, \".\").concat(key);\n }\n }, {\n key: \"restore\",\n value: function restore(key) {\n if (Browser.hasLocalstorage && localStorage[this._createKeyspace(key)]) return this._defaultConfig()[key].parse(localStorage[this._createKeyspace(key)]);\n return this._defaultValueFor(key);\n }\n }, {\n key: \"persist\",\n value: function persist(key, value) {\n if (Browser.hasLocalstorage) {\n try {\n localStorage[this._createKeyspace(key)] = value;\n return true;\n } catch (e) {\n return false;\n }\n }\n }\n }]);\n\n return Config;\n}();\nvar QueryString = /*#__PURE__*/function () {\n function QueryString() {\n _classCallCheck(this, QueryString);\n }\n\n _createClass(QueryString, null, [{\n key: \"parse\",\n value: function parse(paramsString) {\n var match;\n\n var pl = /\\+/g,\n // Regex for replacing addition symbol with a space\n search = /([^&=]+)=?([^&]*)/g,\n decode = function decode(s) {\n return decodeURIComponent(s.replace(pl, ' '));\n },\n params = {};\n\n while (match = search.exec(paramsString)) {\n // eslint-disable-line no-cond-assign\n params[decode(match[1]).toLowerCase()] = decode(match[2]);\n }\n\n return params;\n }\n }, {\n key: \"params\",\n get: function get() {\n var query = window.location.search.substring(1);\n\n if (query !== this.query) {\n this._urlParams = this.parse(query);\n this.query = query;\n }\n\n return this._urlParams;\n }\n }, {\n key: \"hashParams\",\n get: function get() {\n var hash = window.location.hash.substring(1);\n\n if (hash !== this.hash) {\n this._hashParams = this.parse(hash);\n this.hash = hash;\n }\n\n return this._hashParams;\n }\n }]);\n\n return QueryString;\n}();\nfunction seekStringToSeconds() {\n var paramName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 't';\n var seconds = 0;\n var seekString = QueryString.params[paramName] || QueryString.hashParams[paramName] || '';\n var parts = seekString.match(/[0-9]+[hms]+/g) || [];\n\n if (parts.length > 0) {\n var factor = {\n 'h': 3600,\n 'm': 60,\n 's': 1\n };\n parts.forEach(function (el) {\n if (el) {\n var suffix = el[el.length - 1];\n var time = parseInt(el.slice(0, el.length - 1), 10);\n seconds += time * factor[suffix];\n }\n });\n } else if (seekString) {\n seconds = parseInt(seekString, 10);\n }\n\n return seconds;\n}\nvar idsCounter = {};\nfunction uniqueId(prefix) {\n idsCounter[prefix] || (idsCounter[prefix] = 0);\n var id = ++idsCounter[prefix];\n return prefix + id;\n}\nfunction isNumber(value) {\n return value - parseFloat(value) + 1 >= 0;\n}\nfunction currentScriptUrl() {\n var scripts = document.getElementsByTagName('script');\n return scripts.length ? scripts[scripts.length - 1].src : '';\n}\nvar requestAnimationFrame = (window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || function (fn) {\n window.setTimeout(fn, 1000 / 60);\n}).bind(window);\nvar cancelAnimationFrame = (window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.clearTimeout).bind(window);\nfunction getBrowserLanguage() {\n return window.navigator && window.navigator.language;\n}\nfunction now() {\n if (window.performance && window.performance.now) return performance.now();\n return Date.now();\n} // remove the item from the array if it exists in the array\n\nfunction removeArrayItem(arr, item) {\n var i = arr.indexOf(item);\n if (i >= 0) arr.splice(i, 1);\n} // find an item regardless of its letter case\n\nfunction listContainsIgnoreCase(item, items) {\n if (item === undefined || items === undefined) return false;\n return items.find(function (itemEach) {\n return item.toLowerCase() === itemEach.toLowerCase();\n }) !== undefined;\n} // https://github.com/video-dev/can-autoplay\n\nfunction canAutoPlayMedia(cb, options) {\n options = Object.assign({\n inline: false,\n muted: false,\n timeout: 250,\n type: 'video',\n source: Media.mp4,\n element: null\n }, options);\n var element = options.element ? options.element : document.createElement(options.type);\n element.muted = options.muted;\n if (options.muted === true) element.setAttribute('muted', 'muted');\n if (options.inline === true) element.setAttribute('playsinline', 'playsinline');\n element.src = options.source;\n var promise = element.play();\n var timeoutId = setTimeout(function () {\n setResult(false, new Error(\"Timeout \".concat(options.timeout, \" ms has been reached\")));\n }, options.timeout);\n\n var setResult = function setResult(result) {\n var error = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n clearTimeout(timeoutId);\n cb(result, error);\n };\n\n if (promise !== undefined) {\n promise.then(function () {\n return setResult(true);\n })[\"catch\"](function (err) {\n return setResult(false, err);\n });\n } else {\n setResult(true);\n }\n} // Simple element factory with video recycle feature.\n\nvar videoStack = [];\nvar DomRecycler = /*#__PURE__*/function () {\n function DomRecycler() {\n _classCallCheck(this, DomRecycler);\n }\n\n _createClass(DomRecycler, null, [{\n key: \"configure\",\n value: function configure(options) {\n this.options = zepto.extend(this.options, options);\n }\n }, {\n key: \"create\",\n value: function create(name) {\n if (this.options.recycleVideo && name === 'video' && videoStack.length > 0) return videoStack.shift();\n return document.createElement(name);\n }\n }, {\n key: \"garbage\",\n value: function garbage(el) {\n if (!this.options.recycleVideo || el.tagName.toUpperCase() !== 'VIDEO') return;\n zepto(el).children().remove();\n Object.values(el.attributes).forEach(function (attr) {\n return el.removeAttribute(attr.name);\n });\n videoStack.push(el);\n }\n }]);\n\n return DomRecycler;\n}();\nDomRecycler.options = {\n recycleVideo: false\n};\nvar DoubleEventHandler = /*#__PURE__*/function () {\n function DoubleEventHandler() {\n var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 500;\n\n _classCallCheck(this, DoubleEventHandler);\n\n this.delay = delay;\n this.lastTime = 0;\n }\n\n _createClass(DoubleEventHandler, [{\n key: \"handle\",\n value: function handle(event, cb) {\n var prevented = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n // Based on http://jsfiddle.net/brettwp/J4djY/\n var currentTime = new Date().getTime();\n var diffTime = currentTime - this.lastTime;\n\n if (diffTime < this.delay && diffTime > 0) {\n cb();\n prevented && event.preventDefault();\n }\n\n this.lastTime = currentTime;\n }\n }]);\n\n return DoubleEventHandler;\n}();\nvar Utils = {\n Config: Config,\n Fullscreen: Fullscreen,\n QueryString: QueryString,\n DomRecycler: DomRecycler,\n assign: assign,\n extend: extend,\n formatTime: formatTime,\n seekStringToSeconds: seekStringToSeconds,\n uniqueId: uniqueId,\n currentScriptUrl: currentScriptUrl,\n isNumber: isNumber,\n requestAnimationFrame: requestAnimationFrame,\n cancelAnimationFrame: cancelAnimationFrame,\n getBrowserLanguage: getBrowserLanguage,\n now: now,\n removeArrayItem: removeArrayItem,\n listContainsIgnoreCase: listContainsIgnoreCase,\n canAutoPlayMedia: canAutoPlayMedia,\n Media: Media,\n DoubleEventHandler: DoubleEventHandler\n};\n\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\nvar BOLD = 'font-weight: bold; font-size: 13px;';\nvar INFO = 'color: #006600;' + BOLD;\nvar DEBUG = 'color: #0000ff;' + BOLD;\nvar WARN = 'color: #ff8000;' + BOLD;\nvar ERROR = 'color: #ff0000;' + BOLD;\nvar LEVEL_DEBUG = 0;\nvar LEVEL_INFO = 1;\nvar LEVEL_WARN = 2;\nvar LEVEL_ERROR = 3;\nvar LEVEL_DISABLED = LEVEL_ERROR;\nvar COLORS = [DEBUG, INFO, WARN, ERROR, ERROR];\nvar DESCRIPTIONS = ['debug', 'info', 'warn', 'error', 'disabled'];\n\nvar Log = /*#__PURE__*/function () {\n function Log() {\n var level = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : LEVEL_INFO;\n var offLevel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : LEVEL_DISABLED;\n\n _classCallCheck(this, Log);\n\n this.BLACKLIST = ['timeupdate', 'playback:timeupdate', 'playback:progress', 'container:hover', 'container:timeupdate', 'container:progress'];\n this.level = level;\n this.offLevel = offLevel;\n }\n\n _createClass(Log, [{\n key: \"debug\",\n value: function debug(klass) {\n this.log(klass, LEVEL_DEBUG, Array.prototype.slice.call(arguments, 1));\n }\n }, {\n key: \"info\",\n value: function info(klass) {\n this.log(klass, LEVEL_INFO, Array.prototype.slice.call(arguments, 1));\n }\n }, {\n key: \"warn\",\n value: function warn(klass) {\n this.log(klass, LEVEL_WARN, Array.prototype.slice.call(arguments, 1));\n }\n }, {\n key: \"error\",\n value: function error(klass) {\n this.log(klass, LEVEL_ERROR, Array.prototype.slice.call(arguments, 1));\n }\n }, {\n key: \"onOff\",\n value: function onOff() {\n if (this.level === this.offLevel) {\n this.level = this.previousLevel;\n } else {\n this.previousLevel = this.level;\n this.level = this.offLevel;\n } // handle instances where console.log is unavailable\n\n\n if (window.console && window.console.log) window.console.log('%c[Clappr.Log] set log level to ' + DESCRIPTIONS[this.level], WARN);\n }\n }, {\n key: \"level\",\n value: function level(newLevel) {\n this.level = newLevel;\n }\n }, {\n key: \"log\",\n value: function log(klass, level, message) {\n if (this.BLACKLIST.indexOf(message[0]) >= 0) return;\n if (level < this.level) return;\n\n if (!message) {\n message = klass;\n klass = null;\n }\n\n var color = COLORS[level];\n var klassDescription = '';\n if (klass) klassDescription = '[' + klass + ']';\n if (window.console && window.console.log) window.console.log.apply(console, ['%c[' + DESCRIPTIONS[level] + ']' + klassDescription, color].concat(message));\n }\n }]);\n\n return Log;\n}();\nLog.LEVEL_DEBUG = LEVEL_DEBUG;\nLog.LEVEL_INFO = LEVEL_INFO;\nLog.LEVEL_WARN = LEVEL_WARN;\nLog.LEVEL_ERROR = LEVEL_ERROR;\n\nLog.getInstance = function () {\n if (this._instance === undefined) this._instance = new this();\n return this._instance;\n};\n\nLog.setLevel = function (level) {\n this.getInstance().level = level;\n};\n\nLog.debug = function () {\n this.getInstance().debug.apply(this.getInstance(), arguments);\n};\n\nLog.info = function () {\n this.getInstance().info.apply(this.getInstance(), arguments);\n};\n\nLog.warn = function () {\n this.getInstance().warn.apply(this.getInstance(), arguments);\n};\n\nLog.error = function () {\n this.getInstance().error.apply(this.getInstance(), arguments);\n};\n\nvar slice = Array.prototype.slice;\nvar eventSplitter = /\\s+/;\n\nvar eventsApi = function eventsApi(obj, action, name, rest) {\n if (!name) return true; // Handle event maps.\n\n if (_typeof(name) === 'object') {\n for (var key in name) {\n obj[action].apply(obj, [key, name[key]].concat(rest));\n }\n\n return false;\n } // Handle space separated event names.\n\n\n if (eventSplitter.test(name)) {\n var names = name.split(eventSplitter);\n\n for (var i = 0, l = names.length; i < l; i++) {\n obj[action].apply(obj, [names[i]].concat(rest));\n }\n\n return false;\n }\n\n return true;\n};\n\nvar triggerEvents = function triggerEvents(events, args, klass, name) {\n var ev,\n i = -1;\n var l = events.length,\n a1 = args[0],\n a2 = args[1],\n a3 = args[2];\n run();\n\n function run() {\n try {\n switch (args.length) {\n /* eslint-disable curly */\n case 0:\n while (++i < l) {\n (ev = events[i]).callback.call(ev.ctx);\n }\n\n return;\n\n case 1:\n while (++i < l) {\n (ev = events[i]).callback.call(ev.ctx, a1);\n }\n\n return;\n\n case 2:\n while (++i < l) {\n (ev = events[i]).callback.call(ev.ctx, a1, a2);\n }\n\n return;\n\n case 3:\n while (++i < l) {\n (ev = events[i]).callback.call(ev.ctx, a1, a2, a3);\n }\n\n return;\n\n default:\n while (++i < l) {\n (ev = events[i]).callback.apply(ev.ctx, args);\n }\n\n return;\n }\n } catch (exception) {\n Log.error.apply(Log, [klass, 'error on event', name, 'trigger', '-', exception]);\n run();\n }\n }\n};\n/**\n * @class Events\n * @constructor\n * @module base\n */\n\n\nvar Events = /*#__PURE__*/function () {\n function Events() {\n _classCallCheck(this, Events);\n }\n\n _createClass(Events, [{\n key: \"on\",\n\n /**\n * listen to an event indefinitely, if you want to stop you need to call `off`\n * @method on\n * @param {String} name\n * @param {Function} callback\n * @param {Object} context\n */\n value: function on(name, callback, context) {\n if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;\n this._events || (this._events = {});\n var events = this._events[name] || (this._events[name] = []);\n events.push({\n callback: callback,\n context: context,\n ctx: context || this\n });\n return this;\n }\n /**\n * listen to an event only once\n * @method once\n * @param {String} name\n * @param {Function} callback\n * @param {Object} context\n */\n\n }, {\n key: \"once\",\n value: function once(name, callback, context) {\n var _this = this;\n\n var _once;\n\n if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;\n\n var off = function off() {\n return _this.off(name, _once);\n };\n\n _once = function once() {\n off();\n callback.apply(this, arguments);\n };\n\n return this.on(name, _once, context);\n }\n /**\n * stop listening to an event\n * @method off\n * @param {String} name\n * @param {Function} callback\n * @param {Object} context\n */\n\n }, {\n key: \"off\",\n value: function off(name, callback, context) {\n var retain, ev, events, names, i, l, j, k;\n if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;\n\n if (!name && !callback && !context) {\n this._events = void 0;\n return this;\n }\n\n names = name ? [name] : Object.keys(this._events); // jshint maxdepth:5\n\n for (i = 0, l = names.length; i < l; i++) {\n name = names[i];\n events = this._events[name];\n\n if (events) {\n this._events[name] = retain = [];\n\n if (callback || context) {\n for (j = 0, k = events.length; j < k; j++) {\n ev = events[j];\n if (callback && callback !== ev.callback && callback !== ev.callback._callback || context && context !== ev.context) retain.push(ev);\n }\n }\n\n if (!retain.length) delete this._events[name];\n }\n }\n\n return this;\n }\n /**\n * triggers an event given its `name`\n * @method trigger\n * @param {String} name\n */\n\n }, {\n key: \"trigger\",\n value: function trigger(name) {\n var klass = this.name || this.constructor.name;\n Log.debug.apply(Log, [klass].concat(Array.prototype.slice.call(arguments)));\n if (!this._events) return this;\n var args = slice.call(arguments, 1);\n if (!eventsApi(this, 'trigger', name, args)) return this;\n var events = this._events[name];\n var allEvents = this._events.all;\n if (events) triggerEvents(events, args, klass, name);\n if (allEvents) triggerEvents(allEvents, arguments, klass, name);\n return this;\n }\n /**\n * stop listening an event for a given object\n * @method stopListening\n * @param {Object} obj\n * @param {String} name\n * @param {Function} callback\n */\n\n }, {\n key: \"stopListening\",\n value: function stopListening(obj, name, callback) {\n var listeningTo = this._listeningTo;\n if (!listeningTo) return this;\n var remove = !name && !callback;\n if (!callback && _typeof(name) === 'object') callback = this;\n if (obj) (listeningTo = {})[obj._listenId] = obj;\n\n for (var id in listeningTo) {\n obj = listeningTo[id];\n obj.off(name, callback, this);\n if (remove || Object.keys(obj._events).length === 0) delete this._listeningTo[id];\n }\n\n return this;\n }\n }], [{\n key: \"register\",\n value: function register(eventName) {\n Events.Custom || (Events.Custom = {});\n var property = typeof eventName === 'string' && eventName.toUpperCase().trim();\n\n if (property && !Events.Custom[property]) {\n Events.Custom[property] = property.toLowerCase().split('_').map(function (value, index) {\n return index === 0 ? value : value = value[0].toUpperCase() + value.slice(1);\n }).join('');\n } else Log.error('Events', 'Error when register event: ' + eventName);\n }\n }, {\n key: \"listAvailableCustomEvents\",\n value: function listAvailableCustomEvents() {\n Events.Custom || (Events.Custom = {});\n return Object.keys(Events.Custom).filter(function (property) {\n return typeof Events.Custom[property] === 'string';\n });\n }\n }]);\n\n return Events;\n}();\nvar listenMethods = {\n listenTo: 'on',\n listenToOnce: 'once'\n};\nObject.keys(listenMethods).forEach(function (method) {\n Events.prototype[method] = function (obj, name, callback) {\n var listeningTo = this._listeningTo || (this._listeningTo = {});\n var id = obj._listenId || (obj._listenId = uniqueId('l'));\n listeningTo[id] = obj;\n if (!callback && _typeof(name) === 'object') callback = this;\n obj[listenMethods[method]](name, callback, this);\n return this;\n };\n}); // PLAYER EVENTS\n\n/**\n * Fired when the player is ready on startup\n *\n * @event PLAYER_READY\n */\n\nEvents.PLAYER_READY = 'ready';\n/**\n * Fired when player resizes\n *\n * @event PLAYER_RESIZE\n * @param {Object} currentSize an object with the current size\n */\n\nEvents.PLAYER_RESIZE = 'resize';\n/**\n * Fired when player changes its fullscreen state\n *\n * @event PLAYER_FULLSCREEN\n * @param {Boolean} whether or not the player is on fullscreen mode\n */\n\nEvents.PLAYER_FULLSCREEN = 'fullscreen';\n/**\n * Fired when player starts to play\n *\n * @event PLAYER_PLAY\n */\n\nEvents.PLAYER_PLAY = 'play';\n/**\n * Fired when player pauses\n *\n * @event PLAYER_PAUSE\n */\n\nEvents.PLAYER_PAUSE = 'pause';\n/**\n * Fired when player stops\n *\n * @event PLAYER_STOP\n */\n\nEvents.PLAYER_STOP = 'stop';\n/**\n * Fired when player ends the video\n *\n * @event PLAYER_ENDED\n */\n\nEvents.PLAYER_ENDED = 'ended';\n/**\n * Fired when player seeks the video\n *\n * @event PLAYER_SEEK\n * @param {Number} time the current time in seconds\n */\n\nEvents.PLAYER_SEEK = 'seek';\n/**\n * Fired when player receives an error\n *\n * @event PLAYER_ERROR\n * @param {Object} error the error\n */\n\nEvents.PLAYER_ERROR = 'playererror';\n/**\n * Fired when there is an error\n *\n * @event ERROR\n * @param {Object} error\n * the error with the following format `{code, description, level, raw, origin, scope}`\n * @param {String} [options.code]\n * error's code: code to identify error in the following format: origin:code\n * @param {String} [options.description]\n * error's description: description of the error\n * @param {String} [options.level]\n * error's level: FATAL or WARN.\n * @param {String} [options.origin]\n * error's origin. Example: hls, html5, etc\n * @param {String} [options.scope]\n * error's scope. Example: playback, container, etc\n * @param {String} [options.raw]\n * raw error: the initial error received\n */\n\nEvents.ERROR = 'error';\n/**\n * Fired when the time is updated on player\n *\n * @event PLAYER_TIMEUPDATE\n * @param {Object} progress Data\n * progress object\n * @param {Number} [progress.current]\n * current time (in seconds)\n * @param {Number} [progress.total]\n * total time (in seconds)\n */\n\nEvents.PLAYER_TIMEUPDATE = 'timeupdate';\n/**\n * Fired when player updates its volume\n *\n * @event PLAYER_VOLUMEUPDATE\n * @param {Number} volume the current volume\n */\n\nEvents.PLAYER_VOLUMEUPDATE = 'volumeupdate';\n/**\n * Fired when subtitle is available\n *\n * @event PLAYER_SUBTITLE_AVAILABLE\n */\n\nEvents.PLAYER_SUBTITLE_AVAILABLE = 'subtitleavailable'; // Playback Events\n\n/**\n * Fired when the playback is downloading the media\n *\n * @event PLAYBACK_PROGRESS\n * @param progress {Object}\n * Data progress object\n * @param [progress.start] {Number}\n * start position of buffered content at current position\n * @param [progress.current] {Number}\n * end position of buffered content at current position\n * @param [progress.total] {Number}\n * total content to be downloaded\n * @param buffered {Array}\n * array of buffered segments ({start, end}). [Only for supported playbacks]\n */\n\nEvents.PLAYBACK_PROGRESS = 'playback:progress';\n/**\n * Fired when the time is updated on playback\n *\n * @event PLAYBACK_TIMEUPDATE\n * @param {Object} progress Data\n * progress object\n * @param {Number} [progress.current]\n * current time (in seconds)\n * @param {Number} [progress.total]\n * total time (in seconds)\n */\n\nEvents.PLAYBACK_TIMEUPDATE = 'playback:timeupdate';\n/**\n * Fired when playback is ready\n *\n * @event PLAYBACK_READY\n */\n\nEvents.PLAYBACK_READY = 'playback:ready';\n/**\n * Fired when the playback starts having to buffer because\n * playback can currently not be smooth.\n *\n * This corresponds to the playback `buffering` property being\n * `true`.\n *\n * @event PLAYBACK_BUFFERING\n */\n\nEvents.PLAYBACK_BUFFERING = 'playback:buffering';\n/**\n * Fired when the playback has enough in the buffer to be\n * able to play smoothly, after previously being unable to\n * do this.\n *\n * This corresponds to the playback `buffering` property being\n * `false`.\n *\n * @event PLAYBACK_BUFFERFULL\n */\n\nEvents.PLAYBACK_BUFFERFULL = 'playback:bufferfull';\n/**\n * Fired when playback changes any settings (volume, seek and etc)\n *\n * @event PLAYBACK_SETTINGSUPDATE\n */\n\nEvents.PLAYBACK_SETTINGSUPDATE = 'playback:settingsupdate';\n/**\n * Fired when playback loaded its metadata\n *\n * @event PLAYBACK_LOADEDMETADATA\n * @param {Object} metadata Data\n * settings object\n * @param {Number} [metadata.duration]\n * the playback duration\n * @param {Object} [metadata.data]\n * extra meta data\n */\n\nEvents.PLAYBACK_LOADEDMETADATA = 'playback:loadedmetadata';\n/**\n * Fired when playback updates its video quality\n *\n * @event PLAYBACK_HIGHDEFINITIONUPDATE\n * @param {Boolean} isHD\n * true when is on HD, false otherwise\n */\n\nEvents.PLAYBACK_HIGHDEFINITIONUPDATE = 'playback:highdefinitionupdate';\n/**\n * Fired when playback updates its bitrate\n *\n * @event PLAYBACK_BITRATE\n * @param {Object} bitrate Data\n * bitrate object\n * @param {Number} [bitrate.bandwidth]\n * bitrate bandwidth when it's available\n * @param {Number} [bitrate.width]\n * playback width (ex: 720, 640, 1080)\n * @param {Number} [bitrate.height]\n * playback height (ex: 240, 480, 720)\n * @param {Number} [bitrate.level]\n * playback level when it's available, it could be just a map for width (0 => 240, 1 => 480, 2 => 720)\n */\n\nEvents.PLAYBACK_BITRATE = 'playback:bitrate';\n/**\n * Fired when the playback has its levels\n *\n * @event PLAYBACK_LEVELS_AVAILABLE\n * @param {Array} levels\n * the ordered levels, each one with the following format `{id: 1, label: '500kbps'}` ps: id should be a number >= 0\n * @param {Number} initial\n * the initial level otherwise -1 (AUTO)\n */\n\nEvents.PLAYBACK_LEVELS_AVAILABLE = 'playback:levels:available';\n/**\n * Fired when the playback starts to switch level\n *\n * @event PLAYBACK_LEVEL_SWITCH_START\n *\n */\n\nEvents.PLAYBACK_LEVEL_SWITCH_START = 'playback:levels:switch:start';\n/**\n * Fired when the playback ends the level switch\n *\n * @event PLAYBACK_LEVEL_SWITCH_END\n *\n */\n\nEvents.PLAYBACK_LEVEL_SWITCH_END = 'playback:levels:switch:end';\n/**\n * Fired when playback internal state changes\n *\n * @event PLAYBACK_PLAYBACKSTATE\n * @param {Object} state Data\n * state object\n * @param {String} [state.type]\n * the playback type\n */\n\nEvents.PLAYBACK_PLAYBACKSTATE = 'playback:playbackstate';\n/**\n * Fired when DVR becomes enabled/disabled.\n *\n * @event PLAYBACK_DVR\n * @param {boolean} state true if dvr enabled\n */\n\nEvents.PLAYBACK_DVR = 'playback:dvr'; // TODO doc\n\nEvents.PLAYBACK_MEDIACONTROL_DISABLE = 'playback:mediacontrol:disable'; // TODO doc\n\nEvents.PLAYBACK_MEDIACONTROL_ENABLE = 'playback:mediacontrol:enable';\n/**\n * Fired when the media for a playback ends.\n *\n * @event PLAYBACK_ENDED\n * @param {String} name the name of the playback\n */\n\nEvents.PLAYBACK_ENDED = 'playback:ended';\n/**\n * Fired when user requests `play()`\n *\n * @event PLAYBACK_PLAY_INTENT\n */\n\nEvents.PLAYBACK_PLAY_INTENT = 'playback:play:intent';\n/**\n * Fired when the media for a playback starts playing.\n * This is not necessarily when the user requests `play()`\n * The media may have to buffer first.\n * I.e. `isPlaying()` might return `true` before this event is fired,\n * because `isPlaying()` represents the intended state.\n *\n * @event PLAYBACK_PLAY\n */\n\nEvents.PLAYBACK_PLAY = 'playback:play';\n/**\n * Fired when the media for a playback pauses.\n *\n * @event PLAYBACK_PAUSE\n */\n\nEvents.PLAYBACK_PAUSE = 'playback:pause';\n/**\n * Fired when the media for a playback is seeking.\n *\n * @event PLAYBACK_SEEK\n */\n\nEvents.PLAYBACK_SEEK = 'playback:seek';\n/**\n * Fired when the media for a playback is seeked.\n *\n * @event PLAYBACK_SEEKED\n */\n\nEvents.PLAYBACK_SEEKED = 'playback:seeked';\n/**\n * Fired when the media for a playback is stopped.\n *\n * @event PLAYBACK_STOP\n */\n\nEvents.PLAYBACK_STOP = 'playback:stop';\n/**\n * Fired if an error occurs in the playback.\n *\n * @event PLAYBACK_ERROR\n * @param {Object} error An object containing the error details\n * @param {String} name Playback name\n */\n\nEvents.PLAYBACK_ERROR = 'playback:error'; // TODO doc\n\nEvents.PLAYBACK_STATS_ADD = 'playback:stats:add'; // TODO doc\n\nEvents.PLAYBACK_FRAGMENT_LOADED = 'playback:fragment:loaded'; // TODO doc\n\nEvents.PLAYBACK_LEVEL_SWITCH = 'playback:level:switch';\n/**\n * Fired when subtitle is available on playback for display\n *\n * @event PLAYBACK_SUBTITLE_AVAILABLE\n */\n\nEvents.PLAYBACK_SUBTITLE_AVAILABLE = 'playback:subtitle:available';\n/**\n * Fired when playback subtitle track has changed\n *\n * @event CONTAINER_SUBTITLE_CHANGED\n * @param {Object} track Data\n * track object\n * @param {Number} [track.id]\n * selected track id\n */\n\nEvents.PLAYBACK_SUBTITLE_CHANGED = 'playback:subtitle:changed'; // Core Events\n\n/**\n * Fired when the containers are created\n *\n * @event CORE_CONTAINERS_CREATED\n */\n\nEvents.CORE_CONTAINERS_CREATED = 'core:containers:created';\n/**\n * Fired when the active container changed\n *\n * @event CORE_ACTIVE_CONTAINER_CHANGED\n */\n\nEvents.CORE_ACTIVE_CONTAINER_CHANGED = 'core:active:container:changed';\n/**\n * Fired when the options were changed for the core\n *\n * @event CORE_OPTIONS_CHANGE\n * @param {Object} new options provided to configure() method\n */\n\nEvents.CORE_OPTIONS_CHANGE = 'core:options:change';\n/**\n * Fired after creating containers, when the core is ready\n *\n * @event CORE_READY\n */\n\nEvents.CORE_READY = 'core:ready';\n/**\n * Fired when the fullscreen state change\n *\n * @event CORE_FULLSCREEN\n * @param {Boolean} whether or not the player is on fullscreen mode\n */\n\nEvents.CORE_FULLSCREEN = 'core:fullscreen';\n/**\n * Fired when core updates size\n *\n * @event CORE_RESIZE\n * @param {Object} currentSize an object with the current size\n */\n\nEvents.CORE_RESIZE = 'core:resize';\n/**\n * Fired when the screen orientation has changed.\n * This event is trigger only for mobile devices.\n *\n * @event CORE_SCREEN_ORIENTATION_CHANGED\n * @param {Object} screen An object with screen orientation\n * screen object\n * @param {Object} [screen.event]\n * window resize event object\n * @param {String} [screen.orientation]\n * screen orientation (ie: 'landscape' or 'portrait')\n */\n\nEvents.CORE_SCREEN_ORIENTATION_CHANGED = 'core:screen:orientation:changed';\n/**\n * Fired when occurs mouse move event on core element\n *\n * @event CORE_MOUSE_MOVE\n * @param {Object} event a DOM event\n */\n\nEvents.CORE_MOUSE_MOVE = 'core:mousemove';\n/**\n * Fired when occurs mouse leave event on core element\n *\n * @event CORE_MOUSE_LEAVE\n * @param {Object} event a DOM event\n */\n\nEvents.CORE_MOUSE_LEAVE = 'core:mouseleave'; // Container Events\n\n/**\n * Fired when the container internal state changes\n *\n * @event CONTAINER_PLAYBACKSTATE\n * @param {Object} state Data\n * state object\n * @param {String} [state.type]\n * the playback type\n */\n\nEvents.CONTAINER_PLAYBACKSTATE = 'container:playbackstate';\nEvents.CONTAINER_PLAYBACKDVRSTATECHANGED = 'container:dvr';\n/**\n * Fired when the container updates its bitrate\n *\n * @event CONTAINER_BITRATE\n * @param {Object} bitrate Data\n * bitrate object\n * @param {Number} [bitrate.bandwidth]\n * bitrate bandwidth when it's available\n * @param {Number} [bitrate.width]\n * playback width (ex: 720, 640, 1080)\n * @param {Number} [bitrate.height]\n * playback height (ex: 240, 480, 720)\n * @param {Number} [bitrate.level]\n * playback level when it's available, it could be just a map for width (0 => 240, 1 => 480, 2 => 720)\n */\n\nEvents.CONTAINER_BITRATE = 'container:bitrate';\nEvents.CONTAINER_STATS_REPORT = 'container:stats:report';\nEvents.CONTAINER_DESTROYED = 'container:destroyed';\n/**\n * Fired when the container is ready\n *\n * @event CONTAINER_READY\n */\n\nEvents.CONTAINER_READY = 'container:ready';\n/**\n * Fired when the container was resized.\n *\n * Some fullscreen modes won't trigger this resize since they don't affect the container, only the playback contents.\n *\n * @event CONTAINER_RESIZE\n */\n\nEvents.CONTAINER_RESIZE = 'container:resize';\nEvents.CONTAINER_ERROR = 'container:error';\n/**\n * Fired when the container loaded its metadata\n *\n * @event CONTAINER_LOADEDMETADATA\n * @param {Object} metadata Data\n * settings object\n * @param {Number} [metadata.duration]\n * the playback duration\n * @param {Object} [metadata.data]\n * extra meta data\n */\n\nEvents.CONTAINER_LOADEDMETADATA = 'container:loadedmetadata';\n/**\n * Fired when subtitle is available on container for display\n *\n * @event CONTAINER_SUBTITLE_AVAILABLE\n */\n\nEvents.CONTAINER_SUBTITLE_AVAILABLE = 'container:subtitle:available';\n/**\n * Fired when subtitle track has changed\n *\n * @event CONTAINER_SUBTITLE_CHANGED\n * @param {Object} track Data\n * track object\n * @param {Number} [track.id]\n * selected track id\n */\n\nEvents.CONTAINER_SUBTITLE_CHANGED = 'container:subtitle:changed';\n/**\n * Fired when the time is updated on container\n *\n * @event CONTAINER_TIMEUPDATE\n * @param {Object} progress Data\n * progress object\n * @param {Number} [progress.current]\n * current time (in seconds)\n * @param {Number} [progress.total]\n * total time (in seconds)\n */\n\nEvents.CONTAINER_TIMEUPDATE = 'container:timeupdate';\n/**\n * Fired when the container is downloading the media\n *\n * @event CONTAINER_PROGRESS\n * @param {Object} progress Data\n * progress object\n * @param {Number} [progress.start]\n * initial downloaded content\n * @param {Number} [progress.current]\n * current dowloaded content\n * @param {Number} [progress.total]\n * total content to be downloaded\n */\n\nEvents.CONTAINER_PROGRESS = 'container:progress';\nEvents.CONTAINER_PLAY = 'container:play';\nEvents.CONTAINER_STOP = 'container:stop';\nEvents.CONTAINER_PAUSE = 'container:pause';\nEvents.CONTAINER_ENDED = 'container:ended';\nEvents.CONTAINER_CLICK = 'container:click';\nEvents.CONTAINER_DBLCLICK = 'container:dblclick';\nEvents.CONTAINER_CONTEXTMENU = 'container:contextmenu';\nEvents.CONTAINER_MOUSE_ENTER = 'container:mouseenter';\nEvents.CONTAINER_MOUSE_LEAVE = 'container:mouseleave';\n/**\n * Fired when the container seeks the video\n *\n * @event CONTAINER_SEEK\n * @param {Number} time the current time in seconds\n */\n\nEvents.CONTAINER_SEEK = 'container:seek';\n/**\n * Fired when the container was finished the seek video\n *\n * @event CONTAINER_SEEKED\n * @param {Number} time the current time in seconds\n */\n\nEvents.CONTAINER_SEEKED = 'container:seeked';\nEvents.CONTAINER_VOLUME = 'container:volume';\nEvents.CONTAINER_FULLSCREEN = 'container:fullscreen';\n/**\n * Fired when container is buffering\n *\n * @event CONTAINER_STATE_BUFFERING\n */\n\nEvents.CONTAINER_STATE_BUFFERING = 'container:state:buffering';\n/**\n * Fired when the container filled the buffer\n *\n * @event CONTAINER_STATE_BUFFERFULL\n */\n\nEvents.CONTAINER_STATE_BUFFERFULL = 'container:state:bufferfull';\n/**\n * Fired when the container changes any settings (volume, seek and etc)\n *\n * @event CONTAINER_SETTINGSUPDATE\n */\n\nEvents.CONTAINER_SETTINGSUPDATE = 'container:settingsupdate';\n/**\n * Fired when container updates its video quality\n *\n * @event CONTAINER_HIGHDEFINITIONUPDATE\n * @param {Boolean} isHD\n * true when is on HD, false otherwise\n */\n\nEvents.CONTAINER_HIGHDEFINITIONUPDATE = 'container:highdefinitionupdate';\n/**\n * Fired when the media control shows\n *\n * @event CONTAINER_MEDIACONTROL_SHOW\n */\n\nEvents.CONTAINER_MEDIACONTROL_SHOW = 'container:mediacontrol:show';\n/**\n * Fired when the media control hides\n *\n * @event CONTAINER_MEDIACONTROL_HIDE\n */\n\nEvents.CONTAINER_MEDIACONTROL_HIDE = 'container:mediacontrol:hide';\nEvents.CONTAINER_MEDIACONTROL_DISABLE = 'container:mediacontrol:disable';\nEvents.CONTAINER_MEDIACONTROL_ENABLE = 'container:mediacontrol:enable';\nEvents.CONTAINER_STATS_ADD = 'container:stats:add';\n/**\n * Fired when the options were changed for the container\n *\n * @event CONTAINER_OPTIONS_CHANGE\n */\n\nEvents.CONTAINER_OPTIONS_CHANGE = 'container:options:change'; // MediaControl Events\n\nEvents.MEDIACONTROL_RENDERED = 'mediacontrol:rendered';\n/**\n * Fired when the player enters/exit on fullscreen\n *\n * @event MEDIACONTROL_FULLSCREEN\n */\n\nEvents.MEDIACONTROL_FULLSCREEN = 'mediacontrol:fullscreen';\n/**\n * Fired when the media control shows\n *\n * @event MEDIACONTROL_SHOW\n */\n\nEvents.MEDIACONTROL_SHOW = 'mediacontrol:show';\n/**\n * Fired when the media control hides\n *\n * @event MEDIACONTROL_HIDE\n */\n\nEvents.MEDIACONTROL_HIDE = 'mediacontrol:hide';\n/**\n * Fired when mouse enters on the seekbar\n *\n * @event MEDIACONTROL_MOUSEMOVE_SEEKBAR\n * @param {Object} event\n * the javascript event\n */\n\nEvents.MEDIACONTROL_MOUSEMOVE_SEEKBAR = 'mediacontrol:mousemove:seekbar';\n/**\n * Fired when mouse leaves the seekbar\n *\n * @event MEDIACONTROL_MOUSELEAVE_SEEKBAR\n * @param {Object} event\n * the javascript event\n */\n\nEvents.MEDIACONTROL_MOUSELEAVE_SEEKBAR = 'mediacontrol:mouseleave:seekbar';\n/**\n * Fired when the media is being played\n *\n * @event MEDIACONTROL_PLAYING\n */\n\nEvents.MEDIACONTROL_PLAYING = 'mediacontrol:playing';\n/**\n * Fired when the media is not being played\n *\n * @event MEDIACONTROL_NOTPLAYING\n */\n\nEvents.MEDIACONTROL_NOTPLAYING = 'mediacontrol:notplaying';\n/**\n * Fired when the container was changed\n *\n * @event MEDIACONTROL_CONTAINERCHANGED\n */\n\nEvents.MEDIACONTROL_CONTAINERCHANGED = 'mediacontrol:containerchanged';\n/**\n * Fired when the options were changed for the mediacontrol\n *\n * @event MEDIACONTROL_OPTIONS_CHANGE\n */\n\nEvents.MEDIACONTROL_OPTIONS_CHANGE = 'mediacontrol:options:change';\n\n/**\n * @class BaseObject\n * @constructor\n * @extends Events\n * @module base\n */\n\nvar BaseObject = /*#__PURE__*/function (_Events) {\n _inherits(BaseObject, _Events);\n\n _createClass(BaseObject, [{\n key: \"options\",\n\n /**\n * returns the object options\n * @property options\n * @type Object\n */\n get: function get() {\n return this._options;\n }\n /**\n * @method constructor\n * @param {Object} options\n */\n\n }]);\n\n function BaseObject() {\n var _this;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, BaseObject);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(BaseObject).call(this, options));\n _this._options = options;\n _this.uniqueId = uniqueId('o');\n return _this;\n }\n /**\n * a unique id prefixed with `'o'`, `o1, o232`\n *\n * @property uniqueId\n * @type String\n */\n\n\n return BaseObject;\n}(Events);\n\nvar delegateEventSplitter = /^(\\S+)\\s*(.*)$/;\n/**\n * A base class to create ui object.\n * @class UIObject\n * @constructor\n * @extends BaseObject\n * @module base\n */\n\nvar UIObject = /*#__PURE__*/function (_BaseObject) {\n _inherits(UIObject, _BaseObject);\n\n _createClass(UIObject, [{\n key: \"tagName\",\n\n /**\n * a unique id prefixed with `'c'`, `c1, c232`\n *\n * @property cid\n * @type String\n */\n\n /**\n * the dom element itself\n *\n * @property el\n * @type HTMLElement\n */\n\n /**\n * the dom element wrapped by `$`\n *\n * @property $el\n * @type HTMLElement\n */\n\n /**\n * gets the tag name for the ui component\n * @method tagName\n * @default div\n * @return {String} tag's name\n */\n get: function get() {\n return 'div';\n }\n /**\n * a literal object mapping element's events to methods\n * @property events\n * @type Object\n * @example\n *\n *```javascript\n *\n * class MyButton extends UIObject {\n * constructor(options) {\n * super(options)\n * this.myId = 0\n * }\n * get events() { return { 'click': 'myClick' } }\n * myClick(){ this.myId = 42 }\n * }\n *\n * // when you click on MyButton the method `myClick` will be called\n *```\n */\n\n }, {\n key: \"events\",\n get: function get() {\n return {};\n }\n /**\n * a literal object mapping attributes and values to the element\n * element's attribute name and the value the attribute value\n * @property attributes\n * @type Object\n * @example\n *\n *```javascript\n *\n * class MyButton extends UIObject {\n * constructor(options) { super(options) }\n * get attributes() { return { class: 'my-button'} }\n * }\n *\n * // MyButton.el.className will be 'my-button'\n * ```\n */\n\n }, {\n key: \"attributes\",\n get: function get() {\n return {};\n }\n /**\n * it builds an ui component by:\n * * creating an id for the component `cid`\n * * making sure the element is created `$el`\n * * delegating all `events` to the element\n * @method constructor\n * @param {Object} options the options object\n */\n\n }]);\n\n function UIObject(options) {\n var _this;\n\n _classCallCheck(this, UIObject);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(UIObject).call(this, options));\n _this.cid = uniqueId('c');\n\n _this._ensureElement();\n\n _this.delegateEvents();\n\n return _this;\n }\n /**\n * selects within the component.\n * @method $\n * @param {String} selector a selector to find within the component.\n * @return {HTMLElement} an element, if it exists.\n * @example\n * ```javascript\n * fullScreenBarUIComponent.$('.button-full') //will return only `.button-full` within the component\n * ```\n */\n\n\n _createClass(UIObject, [{\n key: \"$\",\n value: function $(selector) {\n return this.$el.find(selector);\n }\n /**\n * render the component, usually attach it to a real existent `element`\n * @method render\n * @return {UIObject} itself\n */\n\n }, {\n key: \"render\",\n value: function render() {\n return this;\n }\n /**\n * removes the ui component from DOM\n * @method destroy\n * @return {UIObject} itself\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.$el.remove();\n this.stopListening();\n this.undelegateEvents();\n return this;\n }\n /**\n * set element to `el` and `$el`\n * @method setElement\n * @param {HTMLElement} element\n * @param {Boolean} delegate whether is delegate or not\n * @return {UIObject} itself\n */\n\n }, {\n key: \"setElement\",\n value: function setElement(element, delegate) {\n if (this.$el) this.undelegateEvents();\n this.$el = zepto.zepto.isZ(element) ? element : zepto(element);\n this.el = this.$el[0];\n if (delegate !== false) this.delegateEvents();\n return this;\n }\n /**\n * delegates all the original `events` on `element` to its callbacks\n * @method delegateEvents\n * @param {Object} events\n * @return {UIObject} itself\n */\n\n }, {\n key: \"delegateEvents\",\n value: function delegateEvents(events) {\n if (!(events || (events = this.events))) return this;\n this.undelegateEvents();\n\n for (var key in events) {\n var method = events[key];\n if (method && method.constructor !== Function) method = this[events[key]];\n if (!method) continue;\n var match = key.match(delegateEventSplitter);\n var eventName = match[1],\n selector = match[2];\n eventName += '.delegateEvents' + this.cid;\n if (selector === '') this.$el.on(eventName, method.bind(this));else this.$el.on(eventName, selector, method.bind(this));\n }\n\n return this;\n }\n /**\n * undelegats all the `events`\n * @method undelegateEvents\n * @return {UIObject} itself\n */\n\n }, {\n key: \"undelegateEvents\",\n value: function undelegateEvents() {\n this.$el.off('.delegateEvents' + this.cid);\n return this;\n }\n /**\n * ensures the creation of this ui component\n * @method _ensureElement\n * @private\n */\n\n }, {\n key: \"_ensureElement\",\n value: function _ensureElement() {\n if (!this.el) {\n var attrs = zepto.extend({}, this.attributes);\n if (this.id) attrs.id = this.id;\n if (this.className) attrs['class'] = this.className;\n var $el = zepto(DomRecycler.create(this.tagName)).attr(attrs);\n this.setElement($el, false);\n } else {\n this.setElement(this.el, false);\n }\n }\n }]);\n\n return UIObject;\n}(BaseObject);\n\n/**\n * The PlayerError is responsible to receive and propagate errors.\n * @class PlayerError\n * @constructor\n * @extends BaseObject\n * @module components\n */\n\nvar PlayerError = /*#__PURE__*/function (_BaseObject) {\n _inherits(PlayerError, _BaseObject);\n\n _createClass(PlayerError, [{\n key: \"name\",\n get: function get() {\n return 'error';\n }\n /**\n * @property Levels\n * @type {Object} object with error levels\n */\n\n }], [{\n key: \"Levels\",\n get: function get() {\n return {\n FATAL: 'FATAL',\n WARN: 'WARN',\n INFO: 'INFO'\n };\n }\n }]);\n\n function PlayerError() {\n var _this;\n\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var core = arguments.length > 1 ? arguments[1] : undefined;\n\n _classCallCheck(this, PlayerError);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(PlayerError).call(this, options));\n _this.core = core;\n return _this;\n }\n /**\n * creates and trigger an error.\n * @method createError\n * @param {Object} err should be an object with code, description, level, origin, scope and raw error.\n */\n\n\n _createClass(PlayerError, [{\n key: \"createError\",\n value: function createError(err) {\n if (!this.core) {\n Log.warn(this.name, 'Core is not set. Error: ', err);\n return;\n }\n\n this.core.trigger(Events.ERROR, err);\n }\n }]);\n\n return PlayerError;\n}(BaseObject);\n\nvar ErrorMixin = {\n /**\n * creates an error.\n * @method createError\n * @param {Object} error should be an object with code, description, level and raw error.\n * @return {Object} Object with formatted error data including origin and scope\n */\n createError: function createError(error) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n useCodePrefix: true\n };\n var scope = this.constructor && this.constructor.type || '';\n var origin = this.name || scope;\n var i18n = this.i18n || this.core && this.core.i18n || this.container && this.container.i18n;\n var prefixedCode = \"\".concat(origin, \":\").concat(error && error.code || 'unknown');\n var defaultError = {\n description: '',\n level: PlayerError.Levels.FATAL,\n origin: origin,\n scope: scope,\n raw: {}\n };\n var errorData = Object.assign({}, defaultError, error, {\n code: options.useCodePrefix ? prefixedCode : error.code\n });\n\n if (i18n && errorData.level == PlayerError.Levels.FATAL && !errorData.UI) {\n var defaultUI = {\n title: i18n.t('default_error_title'),\n message: i18n.t('default_error_message')\n };\n errorData.UI = defaultUI;\n }\n\n if (this.playerError) this.playerError.createError(errorData);else Log.warn(origin, 'PlayerError is not defined. Error: ', errorData);\n return errorData;\n }\n};\n\nvar UICorePlugin = /*#__PURE__*/function (_UIObject) {\n _inherits(UICorePlugin, _UIObject);\n\n _createClass(UICorePlugin, [{\n key: \"playerError\",\n get: function get() {\n return this.core.playerError;\n }\n }]);\n\n function UICorePlugin(core) {\n var _this;\n\n _classCallCheck(this, UICorePlugin);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(UICorePlugin).call(this, core.options));\n _this.core = core;\n _this.enabled = true;\n\n _this.bindEvents();\n\n _this.render();\n\n return _this;\n }\n\n _createClass(UICorePlugin, [{\n key: \"bindEvents\",\n value: function bindEvents() {}\n }, {\n key: \"getExternalInterface\",\n value: function getExternalInterface() {\n return {};\n }\n }, {\n key: \"enable\",\n value: function enable() {\n if (!this.enabled) {\n this.bindEvents();\n this.$el.show();\n this.enabled = true;\n }\n }\n }, {\n key: \"disable\",\n value: function disable() {\n this.stopListening();\n this.$el.hide();\n this.enabled = false;\n }\n }, {\n key: \"render\",\n value: function render() {\n return this;\n }\n }]);\n\n return UICorePlugin;\n}(UIObject);\nObject.assign(UICorePlugin.prototype, ErrorMixin);\n\nUICorePlugin.extend = function (properties) {\n return extend(UICorePlugin, properties);\n};\n\nUICorePlugin.type = 'core';\n\nfunction styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar css = \".container[data-container] {\\n position: absolute;\\n background-color: black;\\n height: 100%;\\n width: 100%;\\n max-width: 100%; }\\n .container[data-container] .chromeless {\\n cursor: default; }\\n\\n[data-player]:not(.nocursor) .container[data-container]:not(.chromeless).pointer-enabled {\\n cursor: pointer; }\\n\";\nstyleInject(css);\n\n/**\n * An abstraction to represent a container for a given playback\n * TODO: describe its responsabilities\n * @class Container\n * @constructor\n * @extends UIObject\n * @module base\n */\n\nvar Container = /*#__PURE__*/function (_UIObject) {\n _inherits(Container, _UIObject);\n\n _createClass(Container, [{\n key: \"name\",\n\n /**\n * container's name\n * @method name\n * @default Container\n * @return {String} container's name\n */\n get: function get() {\n return 'Container';\n }\n }, {\n key: \"attributes\",\n get: function get() {\n return {\n \"class\": 'container',\n 'data-container': ''\n };\n }\n }, {\n key: \"events\",\n get: function get() {\n return {\n 'click': 'clicked',\n 'dblclick': 'dblClicked',\n 'touchend': 'dblTap',\n 'contextmenu': 'onContextMenu',\n 'mouseenter': 'mouseEnter',\n 'mouseleave': 'mouseLeave'\n };\n }\n /**\n * Determine if the playback has ended.\n * @property ended\n * @type Boolean\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return this.playback.ended;\n }\n /**\n * Determine if the playback is having to buffer in order for\n * playback to be smooth.\n * (i.e if a live stream is playing smoothly, this will be false)\n * @property buffering\n * @type Boolean\n */\n\n }, {\n key: \"buffering\",\n get: function get() {\n return this.playback.buffering;\n }\n /**\n * The internationalization plugin.\n * @property i18n\n * @type {Strings}\n */\n\n }, {\n key: \"i18n\",\n get: function get() {\n return this._i18n;\n }\n /**\n * checks if has closed caption tracks.\n * @property hasClosedCaptionsTracks\n * @type {Boolean}\n */\n\n }, {\n key: \"hasClosedCaptionsTracks\",\n get: function get() {\n return this.playback.hasClosedCaptionsTracks;\n }\n /**\n * gets the available closed caption tracks.\n * @property closedCaptionsTracks\n * @type {Array} an array of objects with at least 'id' and 'name' properties\n */\n\n }, {\n key: \"closedCaptionsTracks\",\n get: function get() {\n return this.playback.closedCaptionsTracks;\n }\n /**\n * gets the selected closed caption track index. (-1 is disabled)\n * @property closedCaptionsTrackId\n * @type {Number}\n */\n\n }, {\n key: \"closedCaptionsTrackId\",\n get: function get() {\n return this.playback.closedCaptionsTrackId;\n }\n /**\n * sets the selected closed caption track index. (-1 is disabled)\n * @property closedCaptionsTrackId\n * @type {Number}\n */\n ,\n set: function set(trackId) {\n this.playback.closedCaptionsTrackId = trackId;\n }\n /**\n * it builds a container\n * @method constructor\n * @param {Object} options the options object\n * @param {Strings} i18n the internationalization component\n */\n\n }]);\n\n function Container(options, i18n, playerError) {\n var _this;\n\n _classCallCheck(this, Container);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(Container).call(this, options));\n _this._i18n = i18n;\n _this.currentTime = 0;\n _this.volume = 100;\n _this.playback = options.playback;\n _this.playerError = playerError;\n _this.settings = zepto.extend({}, _this.playback.settings);\n _this.isReady = false;\n _this.mediaControlDisabled = false;\n _this.plugins = [_this.playback];\n _this.dblTapHandler = new DoubleEventHandler(500);\n _this.clickTimer = null;\n _this.clickDelay = 200; // FIXME: could be a player option\n\n _this.bindEvents();\n\n return _this;\n }\n /**\n * binds playback events to the methods of the container.\n * it listens to playback's events and triggers them as container events.\n *\n * | Playback |\n * |----------|\n * | progress |\n * | timeupdate |\n * | ready |\n * | buffering |\n * | bufferfull |\n * | settingsupdate |\n * | loadedmetadata |\n * | highdefinitionupdate |\n * | bitrate |\n * | playbackstate |\n * | dvr |\n * | mediacontrol_disable |\n * | mediacontrol_enable |\n * | ended |\n * | play |\n * | pause |\n * | error |\n *\n * ps: the events usually translate from PLABACK_x to CONTAINER_x, you can check all the events at `Event` class.\n *\n * @method bindEvents\n */\n\n\n _createClass(Container, [{\n key: \"bindEvents\",\n value: function bindEvents() {\n this.listenTo(this.playback, Events.PLAYBACK_PROGRESS, this.onProgress);\n this.listenTo(this.playback, Events.PLAYBACK_TIMEUPDATE, this.timeUpdated);\n this.listenTo(this.playback, Events.PLAYBACK_READY, this.ready);\n this.listenTo(this.playback, Events.PLAYBACK_BUFFERING, this.onBuffering);\n this.listenTo(this.playback, Events.PLAYBACK_BUFFERFULL, this.bufferfull);\n this.listenTo(this.playback, Events.PLAYBACK_SETTINGSUPDATE, this.settingsUpdate);\n this.listenTo(this.playback, Events.PLAYBACK_LOADEDMETADATA, this.loadedMetadata);\n this.listenTo(this.playback, Events.PLAYBACK_HIGHDEFINITIONUPDATE, this.highDefinitionUpdate);\n this.listenTo(this.playback, Events.PLAYBACK_BITRATE, this.updateBitrate);\n this.listenTo(this.playback, Events.PLAYBACK_PLAYBACKSTATE, this.playbackStateChanged);\n this.listenTo(this.playback, Events.PLAYBACK_DVR, this.playbackDvrStateChanged);\n this.listenTo(this.playback, Events.PLAYBACK_MEDIACONTROL_DISABLE, this.disableMediaControl);\n this.listenTo(this.playback, Events.PLAYBACK_MEDIACONTROL_ENABLE, this.enableMediaControl);\n this.listenTo(this.playback, Events.PLAYBACK_SEEKED, this.onSeeked);\n this.listenTo(this.playback, Events.PLAYBACK_ENDED, this.onEnded);\n this.listenTo(this.playback, Events.PLAYBACK_PLAY, this.playing);\n this.listenTo(this.playback, Events.PLAYBACK_PAUSE, this.paused);\n this.listenTo(this.playback, Events.PLAYBACK_STOP, this.stopped);\n this.listenTo(this.playback, Events.PLAYBACK_ERROR, this.error);\n this.listenTo(this.playback, Events.PLAYBACK_SUBTITLE_AVAILABLE, this.subtitleAvailable);\n this.listenTo(this.playback, Events.PLAYBACK_SUBTITLE_CHANGED, this.subtitleChanged);\n }\n }, {\n key: \"subtitleAvailable\",\n value: function subtitleAvailable() {\n this.trigger(Events.CONTAINER_SUBTITLE_AVAILABLE);\n }\n }, {\n key: \"subtitleChanged\",\n value: function subtitleChanged(track) {\n this.trigger(Events.CONTAINER_SUBTITLE_CHANGED, track);\n }\n }, {\n key: \"playbackStateChanged\",\n value: function playbackStateChanged(state) {\n this.trigger(Events.CONTAINER_PLAYBACKSTATE, state);\n }\n }, {\n key: \"playbackDvrStateChanged\",\n value: function playbackDvrStateChanged(dvrInUse) {\n this.settings = this.playback.settings;\n this.dvrInUse = dvrInUse;\n this.trigger(Events.CONTAINER_PLAYBACKDVRSTATECHANGED, dvrInUse);\n }\n }, {\n key: \"updateBitrate\",\n value: function updateBitrate(newBitrate) {\n this.trigger(Events.CONTAINER_BITRATE, newBitrate);\n }\n }, {\n key: \"statsReport\",\n value: function statsReport(metrics) {\n this.trigger(Events.CONTAINER_STATS_REPORT, metrics);\n }\n }, {\n key: \"getPlaybackType\",\n value: function getPlaybackType() {\n return this.playback.getPlaybackType();\n }\n /**\n * returns `true` if DVR is enable otherwise `false`.\n * @method isDvrEnabled\n * @return {Boolean}\n */\n\n }, {\n key: \"isDvrEnabled\",\n value: function isDvrEnabled() {\n return !!this.playback.dvrEnabled;\n }\n /**\n * returns `true` if DVR is in use otherwise `false`.\n * @method isDvrInUse\n * @return {Boolean}\n */\n\n }, {\n key: \"isDvrInUse\",\n value: function isDvrInUse() {\n return !!this.dvrInUse;\n }\n /**\n * destroys the container\n * @method destroy\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.disableResizeObserver();\n this.trigger(Events.CONTAINER_DESTROYED, this, this.name);\n this.stopListening();\n this.plugins.forEach(function (plugin) {\n return plugin.destroy();\n });\n this.$el.remove();\n }\n }, {\n key: \"setStyle\",\n value: function setStyle(style) {\n this.$el.css(style);\n }\n }, {\n key: \"animate\",\n value: function animate(style, duration) {\n return this.$el.animate(style, duration).promise();\n }\n }, {\n key: \"ready\",\n value: function ready() {\n this.isReady = true;\n this.trigger(Events.CONTAINER_READY, this.name);\n }\n }, {\n key: \"isPlaying\",\n value: function isPlaying() {\n return this.playback.isPlaying();\n }\n }, {\n key: \"getStartTimeOffset\",\n value: function getStartTimeOffset() {\n return this.playback.getStartTimeOffset();\n }\n }, {\n key: \"getCurrentTime\",\n value: function getCurrentTime() {\n return this.currentTime;\n }\n }, {\n key: \"getDuration\",\n value: function getDuration() {\n return this.playback.getDuration();\n }\n }, {\n key: \"error\",\n value: function error(_error) {\n if (!this.isReady) this.ready();\n this.trigger(Events.CONTAINER_ERROR, _error, this.name);\n }\n }, {\n key: \"loadedMetadata\",\n value: function loadedMetadata(metadata) {\n this.trigger(Events.CONTAINER_LOADEDMETADATA, metadata);\n }\n }, {\n key: \"timeUpdated\",\n value: function timeUpdated(timeProgress) {\n this.currentTime = timeProgress.current;\n this.trigger(Events.CONTAINER_TIMEUPDATE, timeProgress, this.name);\n }\n }, {\n key: \"onProgress\",\n value: function onProgress() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n this.trigger.apply(this, [Events.CONTAINER_PROGRESS].concat(args, [this.name]));\n }\n }, {\n key: \"playing\",\n value: function playing() {\n this.trigger(Events.CONTAINER_PLAY, this.name);\n }\n }, {\n key: \"paused\",\n value: function paused() {\n this.trigger(Events.CONTAINER_PAUSE, this.name);\n }\n /**\n * plays the playback\n * @method play\n */\n\n }, {\n key: \"play\",\n value: function play() {\n this.playback.play();\n }\n /**\n * stops the playback\n * @method stop\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n this.playback.stop();\n this.currentTime = 0;\n }\n /**\n * pauses the playback\n * @method pause\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n this.playback.pause();\n }\n }, {\n key: \"onEnded\",\n value: function onEnded() {\n this.trigger(Events.CONTAINER_ENDED, this, this.name);\n this.currentTime = 0;\n }\n }, {\n key: \"stopped\",\n value: function stopped() {\n this.trigger(Events.CONTAINER_STOP);\n }\n }, {\n key: \"clicked\",\n value: function clicked() {\n var _this2 = this;\n\n if (!this.options.chromeless || this.options.allowUserInteraction) {\n // The event is delayed because it can be canceled by a double-click event\n // An example of use is to prevent playback from pausing when switching to full screen\n this.clickTimer = setTimeout(function () {\n _this2.clickTimer && _this2.trigger(Events.CONTAINER_CLICK, _this2, _this2.name);\n }, this.clickDelay);\n }\n }\n }, {\n key: \"cancelClicked\",\n value: function cancelClicked() {\n clearTimeout(this.clickTimer);\n this.clickTimer = null;\n }\n }, {\n key: \"dblClicked\",\n value: function dblClicked() {\n if (!this.options.chromeless || this.options.allowUserInteraction) {\n this.cancelClicked();\n this.trigger(Events.CONTAINER_DBLCLICK, this, this.name);\n }\n }\n }, {\n key: \"dblTap\",\n value: function dblTap(evt) {\n var _this3 = this;\n\n if (!this.options.chromeless || this.options.allowUserInteraction) {\n this.dblTapHandler.handle(evt, function () {\n _this3.cancelClicked();\n\n _this3.trigger(Events.CONTAINER_DBLCLICK, _this3, _this3.name);\n });\n }\n }\n }, {\n key: \"onContextMenu\",\n value: function onContextMenu(event) {\n if (!this.options.chromeless || this.options.allowUserInteraction) this.trigger(Events.CONTAINER_CONTEXTMENU, event, this.name);\n }\n }, {\n key: \"seek\",\n value: function seek(time) {\n this.trigger(Events.CONTAINER_SEEK, time, this.name);\n this.playback.seek(time);\n }\n }, {\n key: \"onSeeked\",\n value: function onSeeked() {\n this.trigger(Events.CONTAINER_SEEKED, this.name);\n }\n }, {\n key: \"seekPercentage\",\n value: function seekPercentage(percentage) {\n var duration = this.getDuration();\n\n if (percentage >= 0 && percentage <= 100) {\n var time = duration * (percentage / 100);\n this.seek(time);\n }\n }\n }, {\n key: \"setVolume\",\n value: function setVolume(value) {\n this.volume = parseFloat(value);\n this.trigger(Events.CONTAINER_VOLUME, this.volume, this.name);\n this.playback.volume(this.volume);\n }\n }, {\n key: \"fullscreen\",\n value: function fullscreen() {\n this.trigger(Events.CONTAINER_FULLSCREEN, this.name);\n }\n }, {\n key: \"onBuffering\",\n value: function onBuffering() {\n this.trigger(Events.CONTAINER_STATE_BUFFERING, this.name);\n }\n }, {\n key: \"bufferfull\",\n value: function bufferfull() {\n this.trigger(Events.CONTAINER_STATE_BUFFERFULL, this.name);\n }\n /**\n * adds plugin to the container\n * @method addPlugin\n * @param {Object} plugin\n */\n\n }, {\n key: \"addPlugin\",\n value: function addPlugin(plugin) {\n this.plugins.push(plugin);\n }\n /**\n * checks if a plugin, given its name, exist\n * @method hasPlugin\n * @param {String} name\n * @return {Boolean}\n */\n\n }, {\n key: \"hasPlugin\",\n value: function hasPlugin(name) {\n return !!this.getPlugin(name);\n }\n /**\n * get the plugin given its name\n * @method getPlugin\n * @param {String} name\n */\n\n }, {\n key: \"getPlugin\",\n value: function getPlugin(name) {\n return this.plugins.filter(function (plugin) {\n return plugin.name === name;\n })[0];\n }\n }, {\n key: \"mouseEnter\",\n value: function mouseEnter() {\n if (!this.options.chromeless || this.options.allowUserInteraction) this.trigger(Events.CONTAINER_MOUSE_ENTER);\n }\n }, {\n key: \"mouseLeave\",\n value: function mouseLeave() {\n if (!this.options.chromeless || this.options.allowUserInteraction) this.trigger(Events.CONTAINER_MOUSE_LEAVE);\n }\n }, {\n key: \"settingsUpdate\",\n value: function settingsUpdate() {\n this.settings = this.playback.settings;\n this.trigger(Events.CONTAINER_SETTINGSUPDATE);\n }\n }, {\n key: \"highDefinitionUpdate\",\n value: function highDefinitionUpdate(isHD) {\n this.trigger(Events.CONTAINER_HIGHDEFINITIONUPDATE, isHD);\n }\n }, {\n key: \"isHighDefinitionInUse\",\n value: function isHighDefinitionInUse() {\n return this.playback.isHighDefinitionInUse();\n }\n }, {\n key: \"disableMediaControl\",\n value: function disableMediaControl() {\n if (!this.mediaControlDisabled) {\n this.mediaControlDisabled = true;\n this.trigger(Events.CONTAINER_MEDIACONTROL_DISABLE);\n }\n }\n }, {\n key: \"enableMediaControl\",\n value: function enableMediaControl() {\n if (this.mediaControlDisabled) {\n this.mediaControlDisabled = false;\n this.trigger(Events.CONTAINER_MEDIACONTROL_ENABLE);\n }\n }\n }, {\n key: \"updateStyle\",\n value: function updateStyle() {\n if (!this.options.chromeless || this.options.allowUserInteraction) this.$el.removeClass('chromeless');else this.$el.addClass('chromeless');\n }\n }, {\n key: \"enableResizeObserver\",\n value: function enableResizeObserver() {\n var _this4 = this;\n\n this.disableResizeObserver();\n this.resizeObserverInterval = setInterval(function () {\n return _this4.checkResize();\n }, 500);\n }\n }, {\n key: \"disableResizeObserver\",\n value: function disableResizeObserver() {\n this.resizeObserverInterval && clearInterval(this.resizeObserverInterval);\n }\n }, {\n key: \"checkResize\",\n value: function checkResize() {\n var newSize = {\n width: this.el.clientWidth,\n height: this.el.clientHeight\n };\n\n var _ref = this.currentSize || {},\n width = _ref.width,\n height = _ref.height;\n\n var isResize = height !== newSize.height || width !== newSize.width;\n\n if (isResize) {\n this.currentSize = newSize;\n this.trigger(Events.CONTAINER_RESIZE, newSize);\n }\n }\n /**\n * enables to configure the container after its creation\n * @method configure\n * @param {Object} options all the options to change in form of a javascript object\n */\n\n }, {\n key: \"configure\",\n value: function configure(options) {\n this._options = zepto.extend(this._options, options);\n this.updateStyle();\n this.playback.configure(this.options);\n this.trigger(Events.CONTAINER_OPTIONS_CHANGE);\n }\n }, {\n key: \"render\",\n value: function render() {\n this.$el.append(this.playback.render().el);\n this.updateStyle();\n this.checkResize();\n this.enableResizeObserver();\n return this;\n }\n }]);\n\n return Container;\n}(UIObject);\nObject.assign(Container.prototype, ErrorMixin);\n\n/**\n * An abstraction to represent a generic playback, it's like an interface to be implemented by subclasses.\n * @class Playback\n * @constructor\n * @extends UIObject\n * @module base\n */\n\nvar Playback = /*#__PURE__*/function (_UIObject) {\n _inherits(Playback, _UIObject);\n\n _createClass(Playback, [{\n key: \"isAudioOnly\",\n\n /**\n * Determine if the playback does not contain video/has video but video should be ignored.\n * @property isAudioOnly\n * @type Boolean\n */\n get: function get() {\n return false;\n }\n }, {\n key: \"isAdaptive\",\n get: function get() {\n return false;\n }\n /**\n * Determine if the playback has ended.\n * @property ended\n * @type Boolean\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return false;\n }\n /**\n * The internationalization plugin.\n * @property i18n\n * @type {Strings}\n */\n\n }, {\n key: \"i18n\",\n get: function get() {\n return this._i18n;\n }\n /**\n * Determine if the playback is having to buffer in order for\n * playback to be smooth.\n * (i.e if a live stream is playing smoothly, this will be false)\n * @property buffering\n * @type Boolean\n */\n\n }, {\n key: \"buffering\",\n get: function get() {\n return false;\n }\n /**\n * @method constructor\n * @param {Object} options the options object\n * @param {Strings} i18n the internationalization component\n */\n\n }]);\n\n function Playback(options, i18n, playerError) {\n var _this;\n\n _classCallCheck(this, Playback);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(Playback).call(this, options));\n _this.settings = {};\n _this._i18n = i18n;\n _this.playerError = playerError;\n _this._consented = false;\n return _this;\n }\n /**\n * Gives user consent to playback (mobile devices).\n * @method consent\n * @param {Function} callback function called when playback is consented\n */\n\n\n _createClass(Playback, [{\n key: \"consent\",\n value: function consent(cb) {\n if (typeof cb === 'function') cb();\n }\n /**\n * plays the playback.\n * @method play\n */\n\n }, {\n key: \"play\",\n value: function play() {}\n /**\n * pauses the playback.\n * @method pause\n */\n\n }, {\n key: \"pause\",\n value: function pause() {}\n /**\n * stops the playback.\n * @method stop\n */\n\n }, {\n key: \"stop\",\n value: function stop() {}\n /**\n * seeks the playback to a given `time` in seconds\n * @method seek\n * @param {Number} time should be a number between 0 and the video duration\n */\n\n }, {\n key: \"seek\",\n value: function seek(time) {} // eslint-disable-line no-unused-vars\n\n /**\n * seeks the playback to a given `percentage` in percentage\n * @method seekPercentage\n * @param {Number} time should be a number between 0 and 100\n */\n\n }, {\n key: \"seekPercentage\",\n value: function seekPercentage(percentage) {} // eslint-disable-line no-unused-vars\n\n /**\n * The time that \"0\" now represents relative to when playback started.\n * For a stream with a sliding window this will increase as content is\n * removed from the beginning.\n * @method getStartTimeOffset\n * @return {Number} time (in seconds) that time \"0\" represents.\n */\n\n }, {\n key: \"getStartTimeOffset\",\n value: function getStartTimeOffset() {\n return 0;\n }\n /**\n * gets the duration in seconds\n * @method getDuration\n * @return {Number} duration (in seconds) of the current source\n */\n\n }, {\n key: \"getDuration\",\n value: function getDuration() {\n return 0;\n }\n /**\n * checks if the playback is playing.\n * @method isPlaying\n * @return {Boolean} `true` if the current playback is playing, otherwise `false`\n */\n\n }, {\n key: \"isPlaying\",\n value: function isPlaying() {\n return false;\n }\n /**\n * checks if the playback is ready.\n * @property isReady\n * @type {Boolean} `true` if the current playback is ready, otherwise `false`\n */\n\n }, {\n key: \"getPlaybackType\",\n // eslint-disable-line no-unused-vars\n\n /**\n * gets the playback type (`'vod', 'live', 'aod'`)\n * @method getPlaybackType\n * @return {String} you should write the playback type otherwise it'll assume `'no_op'`\n * @example\n * ```javascript\n * html5VideoPlayback.getPlaybackType() //vod\n * html5AudioPlayback.getPlaybackType() //aod\n * html5VideoPlayback.getPlaybackType() //live\n * flashHlsPlayback.getPlaybackType() //live\n * ```\n */\n value: function getPlaybackType() {\n return Playback.NO_OP;\n }\n /**\n * checks if the playback is in HD.\n * @method isHighDefinitionInUse\n * @return {Boolean} `true` if the playback is playing in HD, otherwise `false`\n */\n\n }, {\n key: \"isHighDefinitionInUse\",\n value: function isHighDefinitionInUse() {\n return false;\n }\n /**\n * mutes the playback\n * @method mute\n */\n\n }, {\n key: \"mute\",\n value: function mute() {}\n /**\n * restores the playback volume\n * @method unmute\n */\n\n }, {\n key: \"unmute\",\n value: function unmute() {}\n /**\n * sets the volume for the playback\n * @method volume\n * @param {Number} value a number between 0 (`muted`) to 100 (`max`)\n */\n\n }, {\n key: \"volume\",\n value: function volume(value) {} // eslint-disable-line no-unused-vars\n\n /**\n * enables to configure the playback after its creation\n * @method configure\n * @param {Object} options all the options to change in form of a javascript object\n */\n\n }, {\n key: \"configure\",\n value: function configure(options) {\n this._options = zepto.extend(this._options, options);\n }\n /**\n * attempt to autoplays the playback.\n * @method attemptAutoPlay\n */\n\n }, {\n key: \"attemptAutoPlay\",\n value: function attemptAutoPlay() {\n var _this2 = this;\n\n this.canAutoPlay(function (result, error) {\n // eslint-disable-line no-unused-vars\n result && _this2.play();\n });\n }\n /**\n * checks if the playback can autoplay.\n * @method canAutoPlay\n * @param {Function} callback function where first param is Boolean and second param is playback Error or null\n */\n\n }, {\n key: \"canAutoPlay\",\n value: function canAutoPlay(cb) {\n cb(true, null); // Assume playback can autoplay by default\n }\n }, {\n key: \"isReady\",\n get: function get() {\n return false;\n }\n /**\n * checks if the playback has closed caption tracks.\n * @property hasClosedCaptionsTracks\n * @type {Boolean}\n */\n\n }, {\n key: \"hasClosedCaptionsTracks\",\n get: function get() {\n return this.closedCaptionsTracks.length > 0;\n }\n /**\n * gets the playback available closed caption tracks.\n * @property closedCaptionsTracks\n * @type {Array} an array of objects with at least 'id' and 'name' properties\n */\n\n }, {\n key: \"closedCaptionsTracks\",\n get: function get() {\n return [];\n }\n /**\n * gets the selected closed caption track index. (-1 is disabled)\n * @property closedCaptionsTrackId\n * @type {Number}\n */\n\n }, {\n key: \"closedCaptionsTrackId\",\n get: function get() {\n return -1;\n }\n /**\n * sets the selected closed caption track index. (-1 is disabled)\n * @property closedCaptionsTrackId\n * @type {Number}\n */\n ,\n set: function set(trackId) {}\n }]);\n\n return Playback;\n}(UIObject);\nObject.assign(Playback.prototype, ErrorMixin);\n\nPlayback.extend = function (properties) {\n return extend(Playback, properties);\n};\n/**\n * checks if the playback can play a given `source`\n * If a mimeType is provided then this will be used instead of inferring the mimetype\n * from the source extension.\n * @method canPlay\n * @static\n * @param {String} source the given source ex: `http://example.com/play.mp4`\n * @param {String} [mimeType] the given mime type, ex: `'application/vnd.apple.mpegurl'`\n * @return {Boolean} `true` if the playback is playable, otherwise `false`\n */\n\n\nPlayback.canPlay = function (source, mimeType) {\n // eslint-disable-line no-unused-vars\n return false;\n};\n/**\n * a playback type for video on demand\n *\n * @property VOD\n * @static\n * @type String\n */\n\n\nPlayback.VOD = 'vod';\n/**\n * a playback type for audio on demand\n *\n * @property AOD\n * @static\n * @type String\n */\n\nPlayback.AOD = 'aod';\n/**\n * a playback type for live video\n *\n * @property LIVE\n * @static\n * @type String\n */\n\nPlayback.LIVE = 'live';\n/**\n * a default playback type\n *\n * @property NO_OP\n * @static\n * @type String\n */\n\nPlayback.NO_OP = 'no_op';\n/**\n * the plugin type\n *\n * @property type\n * @static\n * @type String\n */\n\nPlayback.type = 'playback';\n\nvar ContainerFactory = /*#__PURE__*/function (_BaseObject) {\n _inherits(ContainerFactory, _BaseObject);\n\n _createClass(ContainerFactory, [{\n key: \"options\",\n get: function get() {\n return this._options;\n },\n set: function set(options) {\n this._options = options;\n }\n }]);\n\n function ContainerFactory(options, loader, i18n, playerError) {\n var _this;\n\n _classCallCheck(this, ContainerFactory);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ContainerFactory).call(this, options));\n _this._i18n = i18n;\n _this.loader = loader;\n _this.playerError = playerError;\n return _this;\n }\n\n _createClass(ContainerFactory, [{\n key: \"createContainers\",\n value: function createContainers() {\n var _this2 = this;\n\n return zepto.Deferred(function (promise) {\n promise.resolve(_this2.options.sources.map(function (source) {\n return _this2.createContainer(source);\n }));\n });\n }\n }, {\n key: \"findPlaybackPlugin\",\n value: function findPlaybackPlugin(source, mimeType) {\n return this.loader.playbackPlugins.filter(function (p) {\n return p.canPlay(source, mimeType);\n })[0];\n }\n }, {\n key: \"createContainer\",\n value: function createContainer(source) {\n var resolvedSource = null,\n mimeType = this.options.mimeType;\n\n if (_typeof(source) === 'object') {\n resolvedSource = source.source.toString();\n if (source.mimeType) mimeType = source.mimeType;\n } else {\n resolvedSource = source.toString();\n }\n\n if (resolvedSource.match(/^\\/\\//)) resolvedSource = window.location.protocol + resolvedSource;\n var options = zepto.extend({}, this.options, {\n src: resolvedSource,\n mimeType: mimeType\n });\n var playbackPlugin = this.findPlaybackPlugin(resolvedSource, mimeType); // Fallback to empty playback object until we sort out unsupported sources error without NoOp playback\n\n var playback = playbackPlugin ? new playbackPlugin(options, this._i18n, this.playerError) : new Playback();\n options = zepto.extend({}, options, {\n playback: playback\n });\n var container = new Container(options, this._i18n, this.playerError);\n var defer = zepto.Deferred();\n defer.promise(container);\n this.addContainerPlugins(container);\n this.listenToOnce(container, Events.CONTAINER_READY, function () {\n return defer.resolve(container);\n });\n return container;\n }\n }, {\n key: \"addContainerPlugins\",\n value: function addContainerPlugins(container) {\n this.loader.containerPlugins.forEach(function (Plugin) {\n container.addPlugin(new Plugin(container));\n });\n }\n }]);\n\n return ContainerFactory;\n}(BaseObject);\n\nvar css$1 = \"[data-player] {\\n -webkit-touch-callout: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n -o-user-select: none;\\n user-select: none;\\n -webkit-font-smoothing: antialiased;\\n -moz-osx-font-smoothing: grayscale;\\n transform: translate3d(0, 0, 0);\\n position: relative;\\n margin: 0;\\n padding: 0;\\n border: 0;\\n font-style: normal;\\n font-weight: normal;\\n text-align: center;\\n overflow: hidden;\\n font-size: 100%;\\n font-family: \\\"Roboto\\\", \\\"Open Sans\\\", Arial, sans-serif;\\n text-shadow: 0 0 0;\\n box-sizing: border-box; }\\n [data-player] div, [data-player] span, [data-player] applet, [data-player] object, [data-player] iframe,\\n [data-player] h1, [data-player] h2, [data-player] h3, [data-player] h4, [data-player] h5, [data-player] h6, [data-player] p, [data-player] blockquote, [data-player] pre,\\n [data-player] a, [data-player] abbr, [data-player] acronym, [data-player] address, [data-player] big, [data-player] cite, [data-player] code,\\n [data-player] del, [data-player] dfn, [data-player] em, [data-player] img, [data-player] ins, [data-player] kbd, [data-player] q, [data-player] s, [data-player] samp,\\n [data-player] small, [data-player] strike, [data-player] strong, [data-player] sub, [data-player] sup, [data-player] tt, [data-player] var,\\n [data-player] b, [data-player] u, [data-player] i, [data-player] center,\\n [data-player] dl, [data-player] dt, [data-player] dd, [data-player] ol, [data-player] ul, [data-player] li,\\n [data-player] fieldset, [data-player] form, [data-player] label, [data-player] legend,\\n [data-player] table, [data-player] caption, [data-player] tbody, [data-player] tfoot, [data-player] thead, [data-player] tr, [data-player] th, [data-player] td,\\n [data-player] article, [data-player] aside, [data-player] canvas, [data-player] details, [data-player] embed,\\n [data-player] figure, [data-player] figcaption, [data-player] footer, [data-player] header, [data-player] hgroup,\\n [data-player] menu, [data-player] nav, [data-player] output, [data-player] ruby, [data-player] section, [data-player] summary,\\n [data-player] time, [data-player] mark, [data-player] audio, [data-player] video {\\n margin: 0;\\n padding: 0;\\n border: 0;\\n font: inherit;\\n font-size: 100%;\\n vertical-align: baseline; }\\n [data-player] table {\\n border-collapse: collapse;\\n border-spacing: 0; }\\n [data-player] caption, [data-player] th, [data-player] td {\\n text-align: left;\\n font-weight: normal;\\n vertical-align: middle; }\\n [data-player] q, [data-player] blockquote {\\n quotes: none; }\\n [data-player] q:before, [data-player] q:after, [data-player] blockquote:before, [data-player] blockquote:after {\\n content: \\\"\\\";\\n content: none; }\\n [data-player] a img {\\n border: none; }\\n [data-player]:focus {\\n outline: 0; }\\n [data-player] * {\\n max-width: none;\\n box-sizing: inherit;\\n float: none; }\\n [data-player] div {\\n display: block; }\\n [data-player].fullscreen {\\n width: 100% !important;\\n height: 100% !important;\\n top: 0;\\n left: 0; }\\n [data-player].nocursor {\\n cursor: none; }\\n\\n.clappr-style {\\n display: none !important; }\\n\";\nstyleInject(css$1);\n\n/**\n * The Core is responsible to manage Containers and the player state.\n * @class Core\n * @constructor\n * @extends UIObject\n * @module components\n */\n\nvar Core = /*#__PURE__*/function (_UIObject) {\n _inherits(Core, _UIObject);\n\n _createClass(Core, [{\n key: \"events\",\n get: function get() {\n return {\n 'webkitfullscreenchange': 'handleFullscreenChange',\n 'mousemove': 'onMouseMove',\n 'mouseleave': 'onMouseLeave'\n };\n }\n }, {\n key: \"attributes\",\n get: function get() {\n return {\n 'data-player': '',\n tabindex: 9999\n };\n }\n /**\n * checks if the core is ready.\n * @property isReady\n * @type {Boolean} `true` if the core is ready, otherwise `false`\n */\n\n }, {\n key: \"isReady\",\n get: function get() {\n return !!this.ready;\n }\n /**\n * The internationalization plugin.\n * @property i18n\n * @type {Strings}\n */\n\n }, {\n key: \"i18n\",\n get: function get() {\n return this.getPlugin('strings') || {\n t: function t(key) {\n return key;\n }\n };\n }\n /**\n * @deprecated\n * This property currently exists for backward compatibility reasons.\n * If you need to access the media control instance, use the method getPlugin('media_control').\n * This approach is still not recommended.\n */\n\n }, {\n key: \"mediaControl\",\n get: function get() {\n return this._mediaControl || (this._mediaControl = this.getPlugin('media_control')) || this.dummyMediaControl;\n }\n }, {\n key: \"dummyMediaControl\",\n get: function get() {\n if (this._dummyMediaControl) return this._dummyMediaControl;\n this._dummyMediaControl = new UICorePlugin(this);\n return this._dummyMediaControl;\n }\n /**\n * gets the active container reference.\n * @property activeContainer\n * @type {Object}\n */\n\n }, {\n key: \"activeContainer\",\n get: function get() {\n return this._activeContainer;\n }\n /**\n * sets the active container reference and trigger a event with the new reference.\n * @property activeContainer\n * @type {Object}\n */\n ,\n set: function set(container) {\n this._activeContainer = container;\n this.trigger(Events.CORE_ACTIVE_CONTAINER_CHANGED, this._activeContainer);\n }\n /**\n * gets the active playback reference.\n * @property activePlayback\n * @type {Object}\n */\n\n }, {\n key: \"activePlayback\",\n get: function get() {\n return this.activeContainer && this.activeContainer.playback;\n }\n }]);\n\n function Core(options) {\n var _this;\n\n _classCallCheck(this, Core);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(Core).call(this, options));\n _this.playerError = new PlayerError(options, _assertThisInitialized(_this));\n\n _this.configureDomRecycler();\n\n _this.firstResize = true;\n _this.plugins = [];\n _this.containers = []; //FIXME fullscreen api sucks\n\n _this._boundFullscreenHandler = function () {\n return _this.handleFullscreenChange();\n };\n\n zepto(document).bind('fullscreenchange', _this._boundFullscreenHandler);\n zepto(document).bind('MSFullscreenChange', _this._boundFullscreenHandler);\n zepto(document).bind('mozfullscreenchange', _this._boundFullscreenHandler);\n Browser.isMobile && zepto(window).bind('resize', function (o) {\n _this.handleWindowResize(o);\n });\n return _this;\n }\n\n _createClass(Core, [{\n key: \"configureDomRecycler\",\n value: function configureDomRecycler() {\n var recycleVideo = this.options && this.options.playback && this.options.playback.recycleVideo;\n DomRecycler.configure({\n recycleVideo: recycleVideo\n });\n }\n }, {\n key: \"createContainers\",\n value: function createContainers(options) {\n this.defer = zepto.Deferred();\n this.defer.promise(this);\n this.containerFactory = new ContainerFactory(options, options.loader, this.i18n, this.playerError);\n this.prepareContainers();\n }\n }, {\n key: \"prepareContainers\",\n value: function prepareContainers() {\n var _this2 = this;\n\n this.containerFactory.createContainers().then(function (containers) {\n return _this2.setupContainers(containers);\n }).then(function (containers) {\n return _this2.resolveOnContainersReady(containers);\n });\n }\n }, {\n key: \"updateSize\",\n value: function updateSize() {\n this.isFullscreen() ? this.setFullscreen() : this.setPlayerSize();\n }\n }, {\n key: \"setFullscreen\",\n value: function setFullscreen() {\n if (!Browser.isiOS) {\n this.$el.addClass('fullscreen');\n this.$el.removeAttr('style');\n this.previousSize = {\n width: this.options.width,\n height: this.options.height\n };\n this.currentSize = {\n width: zepto(window).width(),\n height: zepto(window).height()\n };\n }\n }\n }, {\n key: \"setPlayerSize\",\n value: function setPlayerSize() {\n this.$el.removeClass('fullscreen');\n this.currentSize = this.previousSize;\n this.previousSize = {\n width: zepto(window).width(),\n height: zepto(window).height()\n };\n this.resize(this.currentSize);\n }\n }, {\n key: \"resize\",\n value: function resize(options) {\n if (!isNumber(options.height) && !isNumber(options.width)) {\n this.el.style.height = \"\".concat(options.height);\n this.el.style.width = \"\".concat(options.width);\n } else {\n this.el.style.height = \"\".concat(options.height, \"px\");\n this.el.style.width = \"\".concat(options.width, \"px\");\n }\n\n this.previousSize = {\n width: this.options.width,\n height: this.options.height\n };\n this.options.width = options.width;\n this.options.height = options.height;\n this.currentSize = options;\n this.triggerResize(this.currentSize);\n }\n }, {\n key: \"enableResizeObserver\",\n value: function enableResizeObserver() {\n var _this3 = this;\n\n this.disableResizeObserver();\n\n var checkSizeCallback = function checkSizeCallback() {\n _this3.triggerResize({\n width: _this3.el.clientWidth,\n height: _this3.el.clientHeight\n });\n };\n\n this.resizeObserverInterval = setInterval(checkSizeCallback, 500);\n }\n }, {\n key: \"triggerResize\",\n value: function triggerResize(newSize) {\n var thereWasChange = this.firstResize || this.oldHeight !== newSize.height || this.oldWidth !== newSize.width;\n\n if (thereWasChange) {\n this.oldHeight = newSize.height;\n this.oldWidth = newSize.width;\n this.computedSize = newSize;\n this.firstResize = false;\n this.trigger(Events.CORE_RESIZE, newSize);\n }\n }\n }, {\n key: \"disableResizeObserver\",\n value: function disableResizeObserver() {\n this.resizeObserverInterval && clearInterval(this.resizeObserverInterval);\n this.resizeObserverInterval = null;\n }\n }, {\n key: \"resolveOnContainersReady\",\n value: function resolveOnContainersReady(containers) {\n var _this4 = this;\n\n zepto.when.apply(zepto, containers).done(function () {\n _this4.defer.resolve(_this4);\n\n _this4.ready = true;\n\n _this4.trigger(Events.CORE_READY);\n });\n }\n }, {\n key: \"addPlugin\",\n value: function addPlugin(plugin) {\n this.plugins.push(plugin);\n }\n }, {\n key: \"hasPlugin\",\n value: function hasPlugin(name) {\n return !!this.getPlugin(name);\n }\n }, {\n key: \"getPlugin\",\n value: function getPlugin(name) {\n return this.plugins.filter(function (plugin) {\n return plugin.name === name;\n })[0];\n }\n }, {\n key: \"load\",\n value: function load(sources, mimeType) {\n this.options.mimeType = mimeType;\n sources = sources && sources.constructor === Array ? sources : [sources];\n this.options.sources = sources;\n this.containers.forEach(function (container) {\n return container.destroy();\n });\n this.containerFactory.options = zepto.extend(this.options, {\n sources: sources\n });\n this.prepareContainers();\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.disableResizeObserver();\n this.containers.forEach(function (container) {\n return container.destroy();\n });\n this.plugins.forEach(function (plugin) {\n return plugin.destroy();\n });\n this.$el.remove();\n zepto(document).unbind('fullscreenchange', this._boundFullscreenHandler);\n zepto(document).unbind('MSFullscreenChange', this._boundFullscreenHandler);\n zepto(document).unbind('mozfullscreenchange', this._boundFullscreenHandler);\n this.stopListening();\n }\n }, {\n key: \"handleFullscreenChange\",\n value: function handleFullscreenChange() {\n this.trigger(Events.CORE_FULLSCREEN, this.isFullscreen());\n this.updateSize();\n }\n }, {\n key: \"handleWindowResize\",\n value: function handleWindowResize(event) {\n var orientation = window.innerWidth > window.innerHeight ? 'landscape' : 'portrait';\n if (this._screenOrientation === orientation) return;\n this._screenOrientation = orientation;\n this.triggerResize({\n width: this.el.clientWidth,\n height: this.el.clientHeight\n });\n this.trigger(Events.CORE_SCREEN_ORIENTATION_CHANGED, {\n event: event,\n orientation: this._screenOrientation\n });\n }\n }, {\n key: \"removeContainer\",\n value: function removeContainer(container) {\n this.stopListening(container);\n this.containers = this.containers.filter(function (c) {\n return c !== container;\n });\n }\n }, {\n key: \"setupContainer\",\n value: function setupContainer(container) {\n this.listenTo(container, Events.CONTAINER_DESTROYED, this.removeContainer);\n this.containers.push(container);\n }\n }, {\n key: \"setupContainers\",\n value: function setupContainers(containers) {\n containers.forEach(this.setupContainer.bind(this));\n this.trigger(Events.CORE_CONTAINERS_CREATED);\n this.renderContainers();\n this.activeContainer = containers[0];\n this.render();\n this.appendToParent();\n return this.containers;\n }\n }, {\n key: \"renderContainers\",\n value: function renderContainers() {\n var _this5 = this;\n\n this.containers.forEach(function (container) {\n return _this5.el.appendChild(container.render().el);\n });\n }\n }, {\n key: \"createContainer\",\n value: function createContainer(source, options) {\n var container = this.containerFactory.createContainer(source, options);\n this.setupContainer(container);\n this.el.appendChild(container.render().el);\n return container;\n }\n /**\n * @deprecated\n * This method currently exists for retrocompatibility reasons.\n * If you want the current container reference, use the activeContainer getter.\n */\n\n }, {\n key: \"getCurrentContainer\",\n value: function getCurrentContainer() {\n return this.activeContainer;\n }\n /**\n * @deprecated\n * This method currently exists for retrocompatibility reasons.\n * If you want the current playback reference, use the activePlayback getter.\n */\n\n }, {\n key: \"getCurrentPlayback\",\n value: function getCurrentPlayback() {\n return this.activePlayback;\n }\n }, {\n key: \"getPlaybackType\",\n value: function getPlaybackType() {\n return this.activeContainer && this.activeContainer.getPlaybackType();\n }\n }, {\n key: \"isFullscreen\",\n value: function isFullscreen() {\n // Ensure current instance is in fullscreen mode by checking fullscreen element\n var fullscreenElement = Fullscreen.fullscreenElement();\n if (!fullscreenElement) return false;\n var playbackEl = this.activePlayback && this.activePlayback.el;\n return fullscreenElement === this.el || fullscreenElement === playbackEl;\n }\n }, {\n key: \"toggleFullscreen\",\n value: function toggleFullscreen() {\n if (this.isFullscreen()) {\n Fullscreen.cancelFullscreen();\n !Browser.isiOS && this.$el.removeClass('fullscreen nocursor');\n } else {\n var fullscreenEl = Browser.isiOS ? this.activePlayback && this.activePlayback.el : this.el;\n if (!fullscreenEl) return;\n Fullscreen.requestFullscreen(fullscreenEl);\n !Browser.isiOS && this.$el.addClass('fullscreen');\n }\n }\n }, {\n key: \"onMouseMove\",\n value: function onMouseMove(event) {\n this.trigger(Events.CORE_MOUSE_MOVE, event);\n }\n }, {\n key: \"onMouseLeave\",\n value: function onMouseLeave(event) {\n this.trigger(Events.CORE_MOUSE_LEAVE, event);\n }\n /**\n * enables to configure the container after its creation\n * @method configure\n * @param {Object} options all the options to change in form of a javascript object\n */\n\n }, {\n key: \"configure\",\n value: function configure(options) {\n var _this6 = this;\n\n this._options = zepto.extend(this._options, options);\n this.configureDomRecycler();\n var sources = options.source || options.sources;\n sources && this.load(sources, options.mimeType || this.options.mimeType);\n this.trigger(Events.CORE_OPTIONS_CHANGE, options); // Trigger with newly provided options\n\n this.containers.forEach(function (container) {\n return container.configure(_this6.options);\n });\n }\n }, {\n key: \"appendToParent\",\n value: function appendToParent() {\n var hasCoreParent = this.$el.parent() && this.$el.parent().length;\n !hasCoreParent && this.$el.appendTo(this.options.parentElement);\n }\n }, {\n key: \"render\",\n value: function render() {\n this.options.width = this.options.width || this.$el.width();\n this.options.height = this.options.height || this.$el.height();\n var size = {\n width: this.options.width,\n height: this.options.height\n };\n this.previousSize = this.currentSize = this.computedSize = size;\n this.updateSize();\n this.enableResizeObserver();\n return this;\n }\n }]);\n\n return Core;\n}(UIObject);\nObject.assign(Core.prototype, ErrorMixin);\n\n/**\n * The Core Factory is responsible for instantiate the core and it's plugins.\n * @class CoreFactory\n * @constructor\n * @extends BaseObject\n * @module components\n */\n\nvar CoreFactory = /*#__PURE__*/function (_BaseObject) {\n _inherits(CoreFactory, _BaseObject);\n\n _createClass(CoreFactory, [{\n key: \"loader\",\n get: function get() {\n return this.player.loader;\n }\n /**\n * it builds the core factory\n * @method constructor\n * @param {Player} player the player object\n */\n\n }]);\n\n function CoreFactory(player) {\n var _this;\n\n _classCallCheck(this, CoreFactory);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(CoreFactory).call(this));\n _this.player = player;\n _this._options = player.options;\n return _this;\n }\n /**\n * creates a core and its plugins\n * @method create\n * @return {Core} created core\n */\n\n\n _createClass(CoreFactory, [{\n key: \"create\",\n value: function create() {\n this.options.loader = this.loader;\n this.core = new Core(this.options);\n this.addCorePlugins();\n this.core.createContainers(this.options);\n return this.core;\n }\n /**\n * given the core plugins (`loader.corePlugins`) it builds each one\n * @method addCorePlugins\n * @return {Core} the core with all plugins\n */\n\n }, {\n key: \"addCorePlugins\",\n value: function addCorePlugins() {\n var _this2 = this;\n\n this.loader.corePlugins.forEach(function (Plugin) {\n var plugin = new Plugin(_this2.core);\n\n _this2.core.addPlugin(plugin);\n\n _this2.setupExternalInterface(plugin);\n });\n return this.core;\n }\n }, {\n key: \"setupExternalInterface\",\n value: function setupExternalInterface(plugin) {\n var externalFunctions = plugin.getExternalInterface();\n\n for (var key in externalFunctions) {\n this.player[key] = externalFunctions[key].bind(plugin);\n }\n }\n }]);\n\n return CoreFactory;\n}(BaseObject);\n\nvar VERSION_REGEX = /(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?/;\n\nvar Version = /*#__PURE__*/function () {\n _createClass(Version, null, [{\n key: \"parse\",\n value: function parse() {\n var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var matches = str.match(VERSION_REGEX) || [];\n\n var _matches = _slicedToArray(matches, 4),\n major = _matches[1],\n minor = _matches[2],\n patch = _matches[3];\n\n if (typeof major === 'undefined') return null;\n return new Version(major, minor, patch);\n }\n }]);\n\n function Version(major, minor, patch) {\n _classCallCheck(this, Version);\n\n this.major = parseInt(major || 0, 10);\n this.minor = parseInt(minor || 0, 10);\n this.patch = parseInt(patch || 0, 10);\n }\n\n _createClass(Version, [{\n key: \"compare\",\n value: function compare(other) {\n var diff = this.major - other.major;\n diff = diff || this.minor - other.minor;\n diff = diff || this.patch - other.patch;\n return diff;\n }\n }, {\n key: \"inc\",\n value: function inc() {\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'patch';\n typeof this[type] !== 'undefined' && (this[type] += 1);\n return this;\n }\n }, {\n key: \"satisfies\",\n value: function satisfies(min, max) {\n return this.compare(min) >= 0 && (!max || this.compare(max) < 0);\n }\n }, {\n key: \"toString\",\n value: function toString() {\n return \"\".concat(this.major, \".\").concat(this.minor, \".\").concat(this.patch);\n }\n }]);\n\n return Version;\n}();\n\nvar filterPluginsByType = function filterPluginsByType(plugins, type) {\n if (!plugins || !type) return {};\n return Object.entries(plugins).filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n value = _ref2[1];\n\n return value.type === type;\n }).reduce(function (obj, _ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n key = _ref4[0],\n value = _ref4[1];\n\n return obj[key] = value, obj;\n }, {});\n};\n/**\n * It keeps a list of the default plugins (playback, container, core) and it merges external plugins with its internals.\n * @class Loader\n * @constructor\n * @extends BaseObject\n * @module components\n */\n\n\nvar Loader = (function () {\n var registry = {\n plugins: {},\n playbacks: []\n };\n var currentVersion = \"0.4.11\";\n return (/*#__PURE__*/function () {\n _createClass(Loader, null, [{\n key: \"checkVersionSupport\",\n value: function checkVersionSupport(entry) {\n var _entry$prototype = entry.prototype,\n supportedVersion = _entry$prototype.supportedVersion,\n name = _entry$prototype.name;\n\n if (!supportedVersion || !supportedVersion.min) {\n Log.warn('Loader', \"missing version information for \".concat(name));\n return false;\n }\n\n var maxVersion = supportedVersion.max ? Version.parse(supportedVersion.max) : Version.parse(supportedVersion.min).inc('minor');\n var minVersion = Version.parse(supportedVersion.min);\n\n if (!Version.parse(currentVersion).satisfies(minVersion, maxVersion)) {\n Log.warn('Loader', \"unsupported plugin \".concat(name, \": Clappr version \").concat(currentVersion, \" does not match required range [\").concat(minVersion, \",\").concat(maxVersion, \")\"));\n return false;\n }\n\n return true;\n }\n }, {\n key: \"registerPlugin\",\n value: function registerPlugin(pluginEntry) {\n if (!pluginEntry || !pluginEntry.prototype.name) {\n Log.warn('Loader', \"missing information to register plugin: \".concat(pluginEntry));\n return false;\n }\n\n Loader.checkVersionSupport(pluginEntry);\n var pluginRegistry = registry.plugins;\n if (!pluginRegistry) return false;\n var previousEntry = pluginRegistry[pluginEntry.prototype.name];\n if (previousEntry) Log.warn('Loader', \"overriding plugin entry: \".concat(pluginEntry.prototype.name, \" - \").concat(previousEntry));\n pluginRegistry[pluginEntry.prototype.name] = pluginEntry;\n return true;\n }\n }, {\n key: \"registerPlayback\",\n value: function registerPlayback(playbackEntry) {\n if (!playbackEntry || !playbackEntry.prototype.name) return false;\n Loader.checkVersionSupport(playbackEntry);\n var playbacks = registry.playbacks;\n var previousEntryIdx = playbacks.findIndex(function (entry) {\n return entry.name === playbackEntry.prototype.name;\n });\n\n if (previousEntryIdx >= 0) {\n var previousEntry = playbacks[previousEntryIdx];\n playbacks.splice(previousEntryIdx, 1);\n Log.warn('Loader', \"overriding playback entry: \".concat(previousEntry.name, \" - \").concat(previousEntry));\n }\n\n registry.playbacks = [playbackEntry].concat(_toConsumableArray(playbacks));\n return true;\n }\n }, {\n key: \"unregisterPlugin\",\n value: function unregisterPlugin(name) {\n if (!name) return false;\n var plugins = registry.plugins;\n var plugin = plugins[name];\n if (!plugin) return false;\n delete plugins[name];\n return true;\n }\n }, {\n key: \"unregisterPlayback\",\n value: function unregisterPlayback(name) {\n if (!name) return false;\n var playbacks = registry.playbacks;\n var index = playbacks.findIndex(function (entry) {\n return entry.prototype.name === name;\n });\n if (index < 0) return false;\n playbacks.splice(index, 1);\n registry.playbacks = playbacks;\n return true;\n }\n }, {\n key: \"clearPlugins\",\n value: function clearPlugins() {\n registry.plugins = {};\n }\n }, {\n key: \"clearPlaybacks\",\n value: function clearPlaybacks() {\n registry.playbacks = [];\n }\n /**\n * builds the loader\n * @method constructor\n * @param {Object} externalPlugins the external plugins\n * @param {Number} playerId you can embed multiple instances of clappr, therefore this is the unique id of each one.\n */\n\n }, {\n key: \"registeredPlaybacks\",\n get: function get() {\n return _toConsumableArray(registry.playbacks);\n }\n }, {\n key: \"registeredPlugins\",\n get: function get() {\n var plugins = registry.plugins;\n var core = filterPluginsByType(plugins, 'core');\n var container = filterPluginsByType(plugins, 'container');\n return {\n core: core,\n container: container\n };\n }\n }]);\n\n function Loader() {\n var externalPlugins = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var playerId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n _classCallCheck(this, Loader);\n\n this.playerId = playerId;\n this.playbackPlugins = _toConsumableArray(registry.playbacks);\n var _Loader$registeredPlu = Loader.registeredPlugins,\n core = _Loader$registeredPlu.core,\n container = _Loader$registeredPlu.container;\n this.containerPlugins = Object.values(container);\n this.corePlugins = Object.values(core);\n if (!Array.isArray(externalPlugins)) this.validateExternalPluginsType(externalPlugins);\n this.addExternalPlugins(externalPlugins);\n }\n /**\n * groups by type the external plugins that were passed through `options.plugins` it they're on a flat array\n * @method addExternalPlugins\n * @private\n * @param {Object} an config object or an array of plugins\n * @return {Object} plugins the config object with the plugins separated by type\n */\n\n\n _createClass(Loader, [{\n key: \"groupPluginsByType\",\n value: function groupPluginsByType(plugins) {\n if (Array.isArray(plugins)) {\n plugins = plugins.reduce(function (memo, plugin) {\n memo[plugin.type] || (memo[plugin.type] = []);\n memo[plugin.type].push(plugin);\n return memo;\n }, {});\n }\n\n return plugins;\n }\n }, {\n key: \"removeDups\",\n value: function removeDups(list) {\n var groupUp = function groupUp(plugins, plugin) {\n plugins[plugin.prototype.name] && delete plugins[plugin.prototype.name];\n plugins[plugin.prototype.name] = plugin;\n return plugins;\n };\n\n var pluginsMap = list.reduceRight(groupUp, Object.create(null));\n var plugins = [];\n\n for (var key in pluginsMap) {\n plugins.unshift(pluginsMap[key]);\n }\n\n return plugins;\n }\n /**\n * adds all the external plugins that were passed through `options.plugins`\n * @method addExternalPlugins\n * @private\n * @param {Object} plugins the config object with all plugins\n */\n\n }, {\n key: \"addExternalPlugins\",\n value: function addExternalPlugins(plugins) {\n plugins = this.groupPluginsByType(plugins);\n\n if (plugins.playback) {\n var playbacks = plugins.playback.filter(function (playback) {\n return Loader.checkVersionSupport(playback), true;\n });\n this.playbackPlugins = this.removeDups(playbacks.concat(this.playbackPlugins));\n }\n\n if (plugins.container) {\n var containerPlugins = plugins.container.filter(function (plugin) {\n return Loader.checkVersionSupport(plugin), true;\n });\n this.containerPlugins = this.removeDups(containerPlugins.concat(this.containerPlugins));\n }\n\n if (plugins.core) {\n var corePlugins = plugins.core.filter(function (plugin) {\n return Loader.checkVersionSupport(plugin), true;\n });\n this.corePlugins = this.removeDups(corePlugins.concat(this.corePlugins));\n }\n }\n /**\n * validate if the external plugins that were passed through `options.plugins` are associated to the correct type\n * @method validateExternalPluginsType\n * @private\n * @param {Object} plugins the config object with all plugins\n */\n\n }, {\n key: \"validateExternalPluginsType\",\n value: function validateExternalPluginsType(plugins) {\n var plugintypes = ['playback', 'container', 'core'];\n plugintypes.forEach(function (type) {\n (plugins[type] || []).forEach(function (el) {\n var errorMessage = 'external ' + el.type + ' plugin on ' + type + ' array';\n if (el.type !== type) throw new ReferenceError(errorMessage);\n });\n });\n }\n }]);\n\n return Loader;\n }()\n );\n})();\n\nvar baseUrl = currentScriptUrl().replace(/\\/[^/]+$/, '');\n/**\n * @class Player\n * @constructor\n * @extends BaseObject\n * @module components\n * @example\n * ### Using the Player\n *\n * Add the following script on your HTML:\n * ```html\n * \n * \n * \n * ```\n * Now, create the player:\n * ```html\n * \n *
\n * \n * \n * ```\n */\n\nvar Player = /*#__PURE__*/function (_BaseObject) {\n _inherits(Player, _BaseObject);\n\n _createClass(Player, [{\n key: \"loader\",\n set: function set(loader) {\n this._loader = loader;\n },\n get: function get() {\n if (!this._loader) this._loader = new Loader(this.options.plugins || {}, this.options.playerId);\n return this._loader;\n }\n /**\n * Determine if the playback has ended.\n * @property ended\n * @type Boolean\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return this.core.activeContainer.ended;\n }\n /**\n * Determine if the playback is having to buffer in order for\n * playback to be smooth.\n * (i.e if a live stream is playing smoothly, this will be false)\n * @property buffering\n * @type Boolean\n */\n\n }, {\n key: \"buffering\",\n get: function get() {\n return this.core.activeContainer.buffering;\n }\n /*\n * determine if the player is ready.\n * @property isReady\n * @type {Boolean} `true` if the player is ready. ie PLAYER_READY event has fired\n */\n\n }, {\n key: \"isReady\",\n get: function get() {\n return !!this._ready;\n }\n /**\n * An events map that allows the user to add custom callbacks in player's options.\n * @property eventsMapping\n * @type {Object}\n */\n\n }, {\n key: \"eventsMapping\",\n get: function get() {\n return {\n onReady: Events.PLAYER_READY,\n onResize: Events.PLAYER_RESIZE,\n onPlay: Events.PLAYER_PLAY,\n onPause: Events.PLAYER_PAUSE,\n onStop: Events.PLAYER_STOP,\n onEnded: Events.PLAYER_ENDED,\n onSeek: Events.PLAYER_SEEK,\n onError: Events.PLAYER_ERROR,\n onTimeUpdate: Events.PLAYER_TIMEUPDATE,\n onVolumeUpdate: Events.PLAYER_VOLUMEUPDATE,\n onSubtitleAvailable: Events.PLAYER_SUBTITLE_AVAILABLE\n };\n }\n /**\n * @typedef {Object} PlaybackConfig\n * @prop {boolean} disableContextMenu\n * disables the context menu (right click) on the video element if a HTML5Video playback is used.\n * @prop {boolean} preload\n * video will be preloaded according to `preload` attribute options **default**: `'metadata'`\n * @prop {boolean} controls\n * enabled/disables displaying controls\n * @prop {boolean} crossOrigin\n * enables cross-origin capability for media-resources\n * @prop {boolean} playInline\n * enables in-line video elements\n * @prop {boolean} audioOnly\n * enforce audio-only playback (when possible)\n * @prop {Object} externalTracks\n * pass externaly loaded track to playback\n * @prop {Number} [maxBufferLength]\n * The default behavior for the **HLS playback** is to keep buffering indefinitely, even on VoD.\n * This replicates the behavior for progressive download, which continues buffering when pausing the video, thus making the video available for playback even on slow networks.\n * To change this behavior use `maxBufferLength` where **value is in seconds**.\n * @prop {Number} [maxBackBufferLength]\n * After how much distance of the playhead data should be pruned from the buffer (influences memory consumption\n * of adaptive media-engines like Hls.js or Shaka)\n * @prop {Number} [minBufferLength]\n * After how much data in the buffer at least we attempt to consume it (influences QoS-related behavior\n * of adaptive media-engines like Hls.js or Shaka). If this is too low, and the available bandwidth is varying a lot\n * and too close to the streamed bitrate, we may continuously hit under-runs.\n * @prop {Number} [initialBandwidthEstimate]\n * define an initial bandwidth \"guess\" (or previously stored/established value) for underlying adaptive-bitreate engines\n * of adaptive playback implementations, like Hls.js or Shaka\n * @prop {Number} [maxAdaptiveBitrate]\n * Limits the streamed bitrate (for adaptive media-engines in underlying playback implementations)\n * @prop {Object} [maxAdaptiveVideoDimensions]\n * Limits the video dimensions in adaptive media-engines. Should be a literal object with `height` and `width`.\n * @prop {Boolean}[enableAutomaticABR] **default**: `true`\n * Allows to enable/disable automatic bitrate switching in adaptive media-engines\n * @prop {String} [preferredTextLanguage] **default**: `'pt-BR'`\n * Allows to set a preferred text language, that may be enabled by the media-engine if available.\n * @prop {String} [preferredAudioLanguage] **default**: `'pt-BR'`\n * Allows to set a preferred audio language, that may be enabled by the media-engine if available.\n */\n\n /**\n * ## Player's constructor\n *\n * You might pass the options object to build the player.\n * ```javascript\n * var options = {source: \"http://example.com/video.mp4\", param1: \"val1\"};\n * var player = new Clappr.Player(options);\n * ```\n *\n * @method constructor\n * @param {Object} options Data\n * options to build a player instance\n * @param {Number} [options.width]\n * player's width **default**: `640`\n * @param {Number} [options.height]\n * player's height **default**: `360`\n * @param {String} [options.parentId]\n * the id of the element on the page that the player should be inserted into\n * @param {Object} [options.parent]\n * a reference to a dom element that the player should be inserted into\n * @param {String} [options.source]\n * The media source URL, or {source: <>, mimeType: <>}\n * @param {Object} [options.sources]\n * An array of media source URL's, or an array of {source: <>, mimeType: <>}\n * @param {Boolean} [options.autoPlay]\n * automatically play after page load **default**: `false`\n * @param {Boolean} [options.loop]\n * automatically replay after it ends **default**: `false`\n * @param {Boolean} [options.chromeless]\n * player acts in chromeless mode **default**: `false`\n * @param {Boolean} [options.allowUserInteraction]\n * whether or not the player should handle click events when in chromeless mode **default**: `false` on desktops browsers, `true` on mobile.\n * @param {Boolean} [options.disableKeyboardShortcuts]\n * disable keyboard shortcuts. **default**: `false`. `true` if `allowUserInteraction` is `false`.\n * @param {Boolean} [options.mute]\n * start the video muted **default**: `false`\n * @param {String} [options.mimeType]\n * add `mimeType: \"application/vnd.apple.mpegurl\"` if you need to use a url without extension.\n * @param {Boolean} [options.actualLiveTime]\n * show duration and seek time relative to actual time.\n * @param {String} [options.actualLiveServerTime]\n * specify server time as a string, format: \"2015/11/26 06:01:03\". This option is meant to be used with actualLiveTime.\n * @param {Boolean} [options.persistConfig]\n * persist player's settings (volume) through the same domain **default**: `true`\n * @param {String} [options.preload] @deprecated\n * video will be preloaded according to `preload` attribute options **default**: `'metadata'`\n * @param {Number} [options.maxBufferLength] @deprecated\n * the default behavior for the **HLS playback** is to keep buffering indefinitely, even on VoD.\n * This replicates the behavior for progressive download, which continues buffering when pausing the video, thus making the video available for playback even on slow networks.\n * To change this behavior use `maxBufferLength` where **value is in seconds**.\n * @param {String} [options.gaAccount]\n * enable Google Analytics events dispatch **(play/pause/stop/buffering/etc)** by adding your `gaAccount`\n * @param {String} [options.gaTrackerName]\n * besides `gaAccount` you can optionally, pass your favorite trackerName as `gaTrackerName`\n * @param {Object} [options.mediacontrol]\n * customize control bar colors, example: `mediacontrol: {seekbar: \"#E113D3\", buttons: \"#66B2FF\"}`\n * @param {Boolean} [options.hideMediaControl]\n * control media control auto hide **default**: `true`\n * @param {Boolean} [options.hideVolumeBar]\n * when embedded with width less than 320, volume bar will hide. You can force this behavior for all sizes by adding `true` **default**: `false`\n * @param {String} [options.watermark]\n * put `watermark: 'http://url/img.png'` on your embed parameters to automatically add watermark on your video.\n * You can customize corner position by defining position parameter. Positions can be `bottom-left`, `bottom-right`, `top-left` and `top-right`.\n * @param {String} [options.watermarkLink]\n * `watermarkLink: 'http://example.net/'` - define URL to open when the watermark is clicked. If not provided watermark will not be clickable.\n * @param {Boolean} [options.disableVideoTagContextMenu] @deprecated\n * disables the context menu (right click) on the video element if a HTML5Video playback is used.\n * @param {Boolean} [options.autoSeekFromUrl]\n * Automatically seek to the seconds provided in the url (e.g example.com?t=100) **default**: `true`\n * @param {Boolean} [options.exitFullscreenOnEnd]\n * Automatically exit full screen when the media finishes. **default**: `true`\n * @param {String} [options.poster]\n * define a poster by adding its address `poster: 'http://url/img.png'`. It will appear after video embed, disappear on play and go back when user stops the video.\n * @param {String} [options.playbackNotSupportedMessage]\n * define a custom message to be displayed when a playback is not supported.\n * @param {Object} [options.events]\n * Specify listeners which will be registered with their corresponding player events.\n * E.g. onReady -> \"PLAYER_READY\", onTimeUpdate -> \"PLAYER_TIMEUPDATE\"\n * @param {PlaybackConfig} [options.playback]\n * Generic `Playback` component related configuration\n * @param {Boolean} [options.disableErrorScreen]\n * disables the error screen plugin.\n * @param {Number} [options.autoPlayTimeout]\n * autoplay check timeout.\n */\n\n }]);\n\n function Player(options) {\n var _this;\n\n _classCallCheck(this, Player);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(Player).call(this, options));\n var playbackDefaultOptions = {\n recycleVideo: true\n };\n var defaultOptions = {\n playerId: uniqueId(''),\n persistConfig: true,\n width: 640,\n height: 360,\n baseUrl: baseUrl,\n allowUserInteraction: Browser.isMobile,\n playback: playbackDefaultOptions\n };\n _this._options = zepto.extend(defaultOptions, options);\n _this.options.sources = _this._normalizeSources(options);\n\n if (!_this.options.chromeless) {\n // \"allowUserInteraction\" cannot be false if not in chromeless mode.\n _this.options.allowUserInteraction = true;\n }\n\n if (!_this.options.allowUserInteraction) {\n // if user iteraction is not allowed ensure keyboard shortcuts are disabled\n _this.options.disableKeyboardShortcuts = true;\n }\n\n _this._registerOptionEventListeners(_this.options.events);\n\n _this._coreFactory = new CoreFactory(_assertThisInitialized(_this));\n if (_this.options.parentId) _this.setParentId(_this.options.parentId);else if (_this.options.parent) _this.attachTo(_this.options.parent);\n return _this;\n }\n /**\n * Specify a `parentId` to the player.\n * @method setParentId\n * @param {String} parentId the element parent id.\n * @return {Player} itself\n */\n\n\n _createClass(Player, [{\n key: \"setParentId\",\n value: function setParentId(parentId) {\n var el = document.querySelector(parentId);\n if (el) this.attachTo(el);\n return this;\n }\n /**\n * You can use this method to attach the player to a given element. You don't need to do this when you specify it during the player instantiation passing the `parentId` param.\n * @method attachTo\n * @param {Object} element a given element.\n * @return {Player} itself\n */\n\n }, {\n key: \"attachTo\",\n value: function attachTo(element) {\n this.options.parentElement = element;\n this.core = this._coreFactory.create();\n\n this._addEventListeners();\n\n return this;\n }\n }, {\n key: \"_addEventListeners\",\n value: function _addEventListeners() {\n if (!this.core.isReady) this.listenToOnce(this.core, Events.CORE_READY, this._onReady);else this._onReady();\n this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this._containerChanged);\n this.listenTo(this.core, Events.CORE_FULLSCREEN, this._onFullscreenChange);\n this.listenTo(this.core, Events.CORE_RESIZE, this._onResize);\n return this;\n }\n }, {\n key: \"_addContainerEventListeners\",\n value: function _addContainerEventListeners() {\n var container = this.core.activeContainer;\n\n if (container) {\n this.listenTo(container, Events.CONTAINER_PLAY, this._onPlay);\n this.listenTo(container, Events.CONTAINER_PAUSE, this._onPause);\n this.listenTo(container, Events.CONTAINER_STOP, this._onStop);\n this.listenTo(container, Events.CONTAINER_ENDED, this._onEnded);\n this.listenTo(container, Events.CONTAINER_SEEK, this._onSeek);\n this.listenTo(container, Events.CONTAINER_ERROR, this._onError);\n this.listenTo(container, Events.CONTAINER_TIMEUPDATE, this._onTimeUpdate);\n this.listenTo(container, Events.CONTAINER_VOLUME, this._onVolumeUpdate);\n this.listenTo(container, Events.CONTAINER_SUBTITLE_AVAILABLE, this._onSubtitleAvailable);\n }\n\n return this;\n }\n }, {\n key: \"_registerOptionEventListeners\",\n value: function _registerOptionEventListeners() {\n var _this2 = this;\n\n var newEvents = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var hasNewEvents = Object.keys(newEvents).length > 0;\n hasNewEvents && Object.keys(events).forEach(function (userEvent) {\n var eventType = _this2.eventsMapping[userEvent];\n eventType && _this2.off(eventType, events[userEvent]);\n });\n Object.keys(newEvents).forEach(function (userEvent) {\n var eventType = _this2.eventsMapping[userEvent];\n\n if (eventType) {\n var eventFunction = newEvents[userEvent];\n eventFunction = typeof eventFunction === 'function' && eventFunction;\n eventFunction && _this2.on(eventType, eventFunction);\n }\n });\n return this;\n }\n }, {\n key: \"_containerChanged\",\n value: function _containerChanged() {\n this.stopListening();\n\n this._addEventListeners();\n }\n }, {\n key: \"_onReady\",\n value: function _onReady() {\n this._ready = true;\n\n this._addContainerEventListeners();\n\n this.trigger(Events.PLAYER_READY);\n }\n }, {\n key: \"_onFullscreenChange\",\n value: function _onFullscreenChange(fullscreen) {\n this.trigger(Events.PLAYER_FULLSCREEN, fullscreen);\n }\n }, {\n key: \"_onVolumeUpdate\",\n value: function _onVolumeUpdate(volume) {\n this.trigger(Events.PLAYER_VOLUMEUPDATE, volume);\n }\n }, {\n key: \"_onSubtitleAvailable\",\n value: function _onSubtitleAvailable() {\n this.trigger(Events.PLAYER_SUBTITLE_AVAILABLE);\n }\n }, {\n key: \"_onResize\",\n value: function _onResize(size) {\n this.trigger(Events.PLAYER_RESIZE, size);\n }\n }, {\n key: \"_onPlay\",\n value: function _onPlay() {\n this.trigger(Events.PLAYER_PLAY);\n }\n }, {\n key: \"_onPause\",\n value: function _onPause() {\n this.trigger(Events.PLAYER_PAUSE);\n }\n }, {\n key: \"_onStop\",\n value: function _onStop() {\n this.trigger(Events.PLAYER_STOP, this.getCurrentTime());\n }\n }, {\n key: \"_onEnded\",\n value: function _onEnded() {\n this.trigger(Events.PLAYER_ENDED);\n }\n }, {\n key: \"_onSeek\",\n value: function _onSeek(time) {\n this.trigger(Events.PLAYER_SEEK, time);\n }\n }, {\n key: \"_onTimeUpdate\",\n value: function _onTimeUpdate(timeProgress) {\n this.trigger(Events.PLAYER_TIMEUPDATE, timeProgress);\n }\n }, {\n key: \"_onError\",\n value: function _onError(error) {\n this.trigger(Events.PLAYER_ERROR, error);\n }\n }, {\n key: \"_normalizeSources\",\n value: function _normalizeSources(options) {\n var sources = options.sources || (options.source !== undefined ? [options.source] : []);\n return sources.length === 0 ? [{\n source: '',\n mimeType: ''\n }] : sources;\n }\n /**\n * resizes the current player canvas.\n * @method resize\n * @param {Object} size should be a literal object with `height` and `width`.\n * @return {Player} itself\n * @example\n * ```javascript\n * player.resize({height: 360, width: 640})\n * ```\n */\n\n }, {\n key: \"resize\",\n value: function resize(size) {\n this.core.resize(size);\n return this;\n }\n /**\n * loads a new source.\n * @method load\n * @param {Array|String} sources source or sources of video.\n * An array item can be a string or {source: <>, mimeType: <>}\n * @param {String} mimeType a mime type, example: `'application/vnd.apple.mpegurl'`\n * @param {Boolean} [autoPlay=false] whether playing should be started immediately\n * @return {Player} itself\n */\n\n }, {\n key: \"load\",\n value: function load(sources, mimeType, autoPlay) {\n if (autoPlay !== undefined) this.configure({\n autoPlay: !!autoPlay\n });\n this.core.load(sources, mimeType);\n return this;\n }\n /**\n * destroys the current player and removes it from the DOM.\n * @method destroy\n * @return {Player} itself\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.stopListening();\n this.core.destroy();\n return this;\n }\n /**\n * Gives user consent to playback. Required by mobile device after a click event before Player.load().\n * @method consent\n * @param {Function} callback function called when current playback is consented\n * @example\n * ```javascript\n * player.consent(function() { doSomethingNext(); });\n * ```\n */\n\n }, {\n key: \"consent\",\n value: function consent(cb) {\n this.core.getCurrentPlayback().consent(cb);\n }\n /**\n * plays the current video (`source`).\n * @method play\n * @return {Player} itself\n */\n\n }, {\n key: \"play\",\n value: function play() {\n this.core.activeContainer.play();\n return this;\n }\n /**\n * pauses the current video (`source`).\n * @method pause\n * @return {Player} itself\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n this.core.activeContainer.pause();\n return this;\n }\n /**\n * stops the current video (`source`).\n * @method stop\n * @return {Player} itself\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n this.core.activeContainer.stop();\n return this;\n }\n /**\n * seeks the current video (`source`). For example, `player.seek(120)` will seek to second 120 (2minutes) of the current video.\n * @method seek\n * @param {Number} time should be a number between 0 and the video duration.\n * @return {Player} itself\n */\n\n }, {\n key: \"seek\",\n value: function seek(time) {\n this.core.activeContainer.seek(time);\n return this;\n }\n /**\n * seeks the current video (`source`). For example, `player.seek(50)` will seek to the middle of the current video.\n * @method seekPercentage\n * @param {Number} time should be a number between 0 and 100.\n * @return {Player} itself\n */\n\n }, {\n key: \"seekPercentage\",\n value: function seekPercentage(percentage) {\n this.core.activeContainer.seekPercentage(percentage);\n return this;\n }\n /**\n * mutes the current video (`source`).\n * @method mute\n * @return {Player} itself\n */\n\n }, {\n key: \"mute\",\n value: function mute() {\n this.core.activePlayback.mute();\n return this;\n }\n /**\n * unmutes the current video (`source`).\n * @method unmute\n * @return {Player} itself\n */\n\n }, {\n key: \"unmute\",\n value: function unmute() {\n this.core.activePlayback.unmute();\n return this;\n }\n /**\n * checks if the player is playing.\n * @method isPlaying\n * @return {Boolean} `true` if the current source is playing, otherwise `false`\n */\n\n }, {\n key: \"isPlaying\",\n value: function isPlaying() {\n return this.core.activeContainer.isPlaying();\n }\n /**\n * returns `true` if DVR is enable otherwise `false`.\n * @method isDvrEnabled\n * @return {Boolean}\n */\n\n }, {\n key: \"isDvrEnabled\",\n value: function isDvrEnabled() {\n return this.core.activeContainer.isDvrEnabled();\n }\n /**\n * returns `true` if DVR is in use otherwise `false`.\n * @method isDvrInUse\n * @return {Boolean}\n */\n\n }, {\n key: \"isDvrInUse\",\n value: function isDvrInUse() {\n return this.core.activeContainer.isDvrInUse();\n }\n /**\n * enables to configure a player after its creation\n * @method configure\n * @param {Object} options all the options to change in form of a javascript object\n * @return {Player} itself\n */\n\n }, {\n key: \"configure\",\n value: function configure() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n this._registerOptionEventListeners(options.events, this.options.events);\n\n this.core.configure(options);\n return this;\n }\n /**\n * get a plugin by its name.\n * @method getPlugin\n * @param {String} name of the plugin.\n * @return {Object} the plugin instance\n * @example\n * ```javascript\n * var poster = player.getPlugin('poster');\n * poster.hidePlayButton();\n * ```\n */\n\n }, {\n key: \"getPlugin\",\n value: function getPlugin(name) {\n var plugins = this.core.plugins.concat(this.core.activeContainer.plugins);\n return plugins.filter(function (plugin) {\n return plugin.name === name;\n })[0];\n }\n /**\n * the current time in seconds.\n * @method getCurrentTime\n * @return {Number} current time (in seconds) of the current source\n */\n\n }, {\n key: \"getCurrentTime\",\n value: function getCurrentTime() {\n return this.core.activeContainer.getCurrentTime();\n }\n /**\n * The time that \"0\" now represents relative to when playback started.\n * For a stream with a sliding window this will increase as content is\n * removed from the beginning.\n * @method getStartTimeOffset\n * @return {Number} time (in seconds) that time \"0\" represents.\n */\n\n }, {\n key: \"getStartTimeOffset\",\n value: function getStartTimeOffset() {\n return this.core.activeContainer.getStartTimeOffset();\n }\n /**\n * the duration time in seconds.\n * @method getDuration\n * @return {Number} duration time (in seconds) of the current source\n */\n\n }, {\n key: \"getDuration\",\n value: function getDuration() {\n return this.core.activeContainer.getDuration();\n }\n }]);\n\n return Player;\n}(BaseObject);\nObject.assign(Player.prototype, ErrorMixin);\n\n/**\n * The base class for a container plugin\n * @class ContainerPlugin\n * @constructor\n * @extends BaseObject\n * @module base\n */\n\nvar ContainerPlugin = /*#__PURE__*/function (_BaseObject) {\n _inherits(ContainerPlugin, _BaseObject);\n\n _createClass(ContainerPlugin, [{\n key: \"playerError\",\n get: function get() {\n return this.container.playerError;\n }\n }]);\n\n function ContainerPlugin(container) {\n var _this;\n\n _classCallCheck(this, ContainerPlugin);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(ContainerPlugin).call(this, container.options));\n _this.container = container;\n _this.enabled = true;\n\n _this.bindEvents();\n\n return _this;\n }\n\n _createClass(ContainerPlugin, [{\n key: \"enable\",\n value: function enable() {\n if (!this.enabled) {\n this.bindEvents();\n this.enabled = true;\n }\n }\n }, {\n key: \"disable\",\n value: function disable() {\n if (this.enabled) {\n this.stopListening();\n this.enabled = false;\n }\n }\n }, {\n key: \"bindEvents\",\n value: function bindEvents() {}\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.stopListening();\n }\n }]);\n\n return ContainerPlugin;\n}(BaseObject);\nObject.assign(ContainerPlugin.prototype, ErrorMixin);\n\nContainerPlugin.extend = function (properties) {\n return extend(ContainerPlugin, properties);\n};\n\nContainerPlugin.type = 'container';\n\nvar CorePlugin = /*#__PURE__*/function (_BaseObject) {\n _inherits(CorePlugin, _BaseObject);\n\n _createClass(CorePlugin, [{\n key: \"playerError\",\n get: function get() {\n return this.core.playerError;\n }\n }]);\n\n function CorePlugin(core) {\n var _this;\n\n _classCallCheck(this, CorePlugin);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(CorePlugin).call(this, core.options));\n _this.core = core;\n _this.enabled = true;\n\n _this.bindEvents();\n\n return _this;\n }\n\n _createClass(CorePlugin, [{\n key: \"bindEvents\",\n value: function bindEvents() {}\n }, {\n key: \"enable\",\n value: function enable() {\n if (!this.enabled) {\n this.bindEvents();\n this.enabled = true;\n }\n }\n }, {\n key: \"disable\",\n value: function disable() {\n if (this.enabled) {\n this.stopListening();\n this.enabled = false;\n }\n }\n }, {\n key: \"getExternalInterface\",\n value: function getExternalInterface() {\n return {};\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.stopListening();\n }\n }]);\n\n return CorePlugin;\n}(BaseObject);\nObject.assign(CorePlugin.prototype, ErrorMixin);\n\nCorePlugin.extend = function (properties) {\n return extend(CorePlugin, properties);\n};\n\nCorePlugin.type = 'core';\n\n/**\n * The base class for an ui container plugin\n * @class UIContainerPlugin\n * @constructor\n * @extends UIObject\n * @module base\n */\n\nvar UIContainerPlugin = /*#__PURE__*/function (_UIObject) {\n _inherits(UIContainerPlugin, _UIObject);\n\n _createClass(UIContainerPlugin, [{\n key: \"playerError\",\n get: function get() {\n return this.container.playerError;\n }\n }]);\n\n function UIContainerPlugin(container) {\n var _this;\n\n _classCallCheck(this, UIContainerPlugin);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(UIContainerPlugin).call(this, container.options));\n _this.container = container;\n _this.enabled = true;\n\n _this.bindEvents();\n\n return _this;\n }\n\n _createClass(UIContainerPlugin, [{\n key: \"enable\",\n value: function enable() {\n if (!this.enabled) {\n this.bindEvents();\n this.$el.show();\n this.enabled = true;\n }\n }\n }, {\n key: \"disable\",\n value: function disable() {\n this.stopListening();\n this.$el.hide();\n this.enabled = false;\n }\n }, {\n key: \"bindEvents\",\n value: function bindEvents() {}\n }]);\n\n return UIContainerPlugin;\n}(UIObject);\nObject.assign(UIContainerPlugin.prototype, ErrorMixin);\n\nUIContainerPlugin.extend = function (properties) {\n return extend(UIContainerPlugin, properties);\n};\n\nUIContainerPlugin.type = 'container';\n\nvar global$1 = (typeof global !== \"undefined\" ? global :\n typeof self !== \"undefined\" ? self :\n typeof window !== \"undefined\" ? window : {});\n\n// shim for using process in browser\n// based off https://github.com/defunctzombie/node-process/blob/master/browser.js\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\nvar cachedSetTimeout = defaultSetTimout;\nvar cachedClearTimeout = defaultClearTimeout;\nif (typeof global$1.setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n}\nif (typeof global$1.clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n}\n\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\nfunction nextTick(fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n}\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\n\n// from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js\nvar performance$1 = global$1.performance || {};\nvar performanceNow =\n performance$1.now ||\n performance$1.mozNow ||\n performance$1.msNow ||\n performance$1.oNow ||\n performance$1.webkitNow ||\n function(){ return (new Date()).getTime() };\n\n/* eslint-disable no-var */\n// Simple JavaScript Templating\n// Paul Miller (http://paulmillr.com)\n// http://underscorejs.org\n// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n// By default, Underscore uses ERB-style template delimiters, change the\n// following template settings to use alternative delimiters.\nvar settings = {\n evaluate: /<%([\\s\\S]+?)%>/g,\n interpolate: /<%=([\\s\\S]+?)%>/g,\n escape: /<%-([\\s\\S]+?)%>/g\n}; // When customizing `templateSettings`, if you don't want to define an\n// interpolation, evaluation or escaping regex, we need one that is\n// guaranteed not to match.\n\nvar noMatch = /(.)^/; // Certain characters need to be escaped so that they can be put into a\n// string literal.\n\nvar escapes = {\n '\\'': '\\'',\n '\\\\': '\\\\',\n '\\r': 'r',\n '\\n': 'n',\n '\\t': 't',\n \"\\u2028\": 'u2028',\n \"\\u2029\": 'u2029'\n};\nvar escaper = /\\\\|'|\\r|\\n|\\t|\\u2028|\\u2029/g; // List of HTML entities for escaping.\n\nvar htmlEntities = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n '\\'': '''\n};\nvar entityRe = new RegExp('[&<>\"\\']', 'g');\n\nvar escapeExpr = function escapeExpr(string) {\n if (string === null) return '';\n return ('' + string).replace(entityRe, function (match) {\n return htmlEntities[match];\n });\n};\n\nvar counter = 0; // JavaScript micro-templating, similar to John Resig's implementation.\n// Underscore templating handles arbitrary delimiters, preserves whitespace,\n// and correctly escapes quotes within interpolated code.\n\nvar tmpl = function tmpl(text, data) {\n var render; // Combine delimiters into one regular expression via alternation.\n\n var matcher = new RegExp([(settings.escape || noMatch).source, (settings.interpolate || noMatch).source, (settings.evaluate || noMatch).source].join('|') + '|$', 'g'); // Compile the template source, escaping string literals appropriately.\n\n var index = 0;\n var source = '__p+=\\'';\n text.replace(matcher, function (match, escape, interpolate, evaluate, offset) {\n source += text.slice(index, offset).replace(escaper, function (match) {\n return '\\\\' + escapes[match];\n });\n if (escape) source += '\\'+\\n((__t=(' + escape + '))==null?\\'\\':escapeExpr(__t))+\\n\\'';\n if (interpolate) source += '\\'+\\n((__t=(' + interpolate + '))==null?\\'\\':__t)+\\n\\'';\n if (evaluate) source += '\\';\\n' + evaluate + '\\n__p+=\\'';\n index = offset + match.length;\n return match;\n });\n source += '\\';\\n'; // If a variable is not specified, place data values in local scope.\n\n if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n source = 'var __t,__p=\\'\\',__j=Array.prototype.join,' + 'print=function(){__p+=__j.call(arguments,\\'\\');};\\n' + source + 'return __p;\\n//# sourceURL=/microtemplates/source[' + counter++ + ']';\n\n try {\n /*jshint -W054 */\n // TODO: find a way to avoid eval\n render = new Function(settings.variable || 'obj', 'escapeExpr', source);\n } catch (e) {\n e.source = source;\n throw e;\n }\n\n if (data) return render(data, escapeExpr);\n\n var template = function template(data) {\n return render.call(this, data, escapeExpr);\n }; // Provide the compiled function source as a convenience for precompilation.\n\n\n template.source = 'function(' + (settings.variable || 'obj') + '){\\n' + source + '}';\n return template;\n};\n\ntmpl.settings = settings;\n\nvar tracksHTML = \"<% for (var i = 0; i < tracks.length; i++) { %>\\n \\\" kind=\\\"<%= tracks[i].kind %>\\\" label=\\\"<%= tracks[i].label %>\\\" srclang=\\\"<%= tracks[i].lang %>\\\" src=\\\"<%= tracks[i].src %>\\\">\\n<% }; %>\\n\";\n\nvar css$2 = \"[data-html5-video] {\\n position: absolute;\\n height: 100%;\\n width: 100%;\\n display: block; }\\n\";\nstyleInject(css$2);\n\nvar MIMETYPES = {\n 'mp4': ['avc1.42E01E', 'avc1.58A01E', 'avc1.4D401E', 'avc1.64001E', 'mp4v.20.8', 'mp4v.20.240', 'mp4a.40.2'].map(function (codec) {\n return 'video/mp4; codecs=\"' + codec + ', mp4a.40.2\"';\n }),\n 'ogg': ['video/ogg; codecs=\"theora, vorbis\"', 'video/ogg; codecs=\"dirac\"', 'video/ogg; codecs=\"theora, speex\"'],\n '3gpp': ['video/3gpp; codecs=\"mp4v.20.8, samr\"'],\n 'webm': ['video/webm; codecs=\"vp8, vorbis\"'],\n 'mkv': ['video/x-matroska; codecs=\"theora, vorbis\"'],\n 'm3u8': ['application/x-mpegurl']\n};\nMIMETYPES['ogv'] = MIMETYPES['ogg'];\nMIMETYPES['3gp'] = MIMETYPES['3gpp'];\nvar AUDIO_MIMETYPES = {\n 'wav': ['audio/wav'],\n 'mp3': ['audio/mp3', 'audio/mpeg;codecs=\"mp3\"'],\n 'aac': ['audio/mp4;codecs=\"mp4a.40.5\"'],\n 'oga': ['audio/ogg']\n};\nvar KNOWN_AUDIO_MIMETYPES = Object.keys(AUDIO_MIMETYPES).reduce(function (acc, k) {\n return [].concat(_toConsumableArray(acc), _toConsumableArray(AUDIO_MIMETYPES[k]));\n}, []);\nvar UNKNOWN_ERROR = {\n code: 'unknown',\n message: 'unknown'\n}; // TODO: rename this Playback to HTML5Playback (breaking change, only after 0.3.0)\n\nvar HTML5Video = /*#__PURE__*/function (_Playback) {\n _inherits(HTML5Video, _Playback);\n\n _createClass(HTML5Video, [{\n key: \"name\",\n get: function get() {\n return 'html5_video';\n }\n }, {\n key: \"supportedVersion\",\n get: function get() {\n return {\n min: \"0.4.11\"\n };\n }\n }, {\n key: \"tagName\",\n get: function get() {\n return this.isAudioOnly ? 'audio' : 'video';\n }\n }, {\n key: \"isAudioOnly\",\n get: function get() {\n var resourceUrl = this.options.src;\n\n var mimeTypes = HTML5Video._mimeTypesForUrl(resourceUrl, AUDIO_MIMETYPES, this.options.mimeType);\n\n return this.options.playback && this.options.playback.audioOnly || this.options.audioOnly || KNOWN_AUDIO_MIMETYPES.indexOf(mimeTypes[0]) >= 0;\n }\n }, {\n key: \"attributes\",\n get: function get() {\n return {\n 'data-html5-video': ''\n };\n }\n }, {\n key: \"events\",\n get: function get() {\n return {\n 'canplay': '_onCanPlay',\n 'canplaythrough': '_handleBufferingEvents',\n 'durationchange': '_onDurationChange',\n 'ended': '_onEnded',\n 'error': '_onError',\n 'loadeddata': '_onLoadedData',\n 'loadedmetadata': '_onLoadedMetadata',\n 'pause': '_onPause',\n 'playing': '_onPlaying',\n 'progress': '_onProgress',\n 'seeking': '_onSeeking',\n 'seeked': '_onSeeked',\n 'stalled': '_handleBufferingEvents',\n 'timeupdate': '_onTimeUpdate',\n 'waiting': '_onWaiting'\n };\n }\n /**\n * Determine if the playback has ended.\n * @property ended\n * @type Boolean\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return this.el.ended;\n }\n /**\n * Determine if the playback is having to buffer in order for\n * playback to be smooth.\n * This is related to the PLAYBACK_BUFFERING and PLAYBACK_BUFFERFULL events\n * @property buffering\n * @type Boolean\n */\n\n }, {\n key: \"buffering\",\n get: function get() {\n return this._isBuffering;\n }\n }]);\n\n function HTML5Video() {\n var _getPrototypeOf2;\n\n var _this;\n\n _classCallCheck(this, HTML5Video);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(HTML5Video)).call.apply(_getPrototypeOf2, [this].concat(args)));\n _this._destroyed = false;\n _this._loadStarted = false;\n _this._isBuffering = false;\n _this._playheadMoving = false;\n _this._playheadMovingTimer = null;\n _this._stopped = false;\n _this._ccTrackId = -1;\n\n _this._setupSrc(_this.options.src); // backwards compatibility (TODO: remove on 0.3.0)\n\n\n _this.options.playback || (_this.options.playback = _this.options || {});\n _this.options.playback.disableContextMenu = _this.options.playback.disableContextMenu || _this.options.disableVideoTagContextMenu;\n var playbackConfig = _this.options.playback;\n var preload = playbackConfig.preload || (Browser.isSafari ? 'auto' : _this.options.preload);\n var posterUrl; // FIXME: poster plugin should always convert poster to object with expected properties ?\n\n if (_this.options.poster) {\n if (typeof _this.options.poster === 'string') posterUrl = _this.options.poster;else if (typeof _this.options.poster.url === 'string') posterUrl = _this.options.poster.url;\n }\n\n zepto.extend(_this.el, {\n muted: _this.options.mute,\n defaultMuted: _this.options.mute,\n loop: _this.options.loop,\n poster: posterUrl,\n preload: preload || 'metadata',\n crossOrigin: playbackConfig.crossOrigin,\n 'x-webkit-playsinline': playbackConfig.playInline\n });\n if (playbackConfig.controls || _this.options.useVideoTagDefaultControls) _this.$el.attr('controls', '');\n playbackConfig.playInline && _this.$el.attr({\n playsinline: 'playsinline'\n });\n playbackConfig.crossOrigin && _this.$el.attr({\n crossorigin: playbackConfig.crossOrigin\n }); // TODO should settings be private?\n\n _this.settings = {\n \"default\": ['seekbar']\n };\n _this.settings.left = ['playpause', 'position', 'duration'];\n _this.settings.right = ['fullscreen', 'volume', 'hd-indicator'];\n playbackConfig.externalTracks && _this._setupExternalTracks(playbackConfig.externalTracks);\n _this.options.autoPlay && _this.attemptAutoPlay();\n return _this;\n }\n\n _createClass(HTML5Video, [{\n key: \"configure\",\n value: function configure(options) {\n _get(_getPrototypeOf(HTML5Video.prototype), \"configure\", this).call(this, options);\n\n this.el.loop = !!options.loop;\n } // See Playback.attemptAutoPlay()\n\n }, {\n key: \"attemptAutoPlay\",\n value: function attemptAutoPlay() {\n var _this2 = this;\n\n this.canAutoPlay(function (result, error) {\n error && Log.warn(_this2.name, 'autoplay error.', {\n result: result,\n error: error\n }); // https://github.com/clappr/clappr/issues/1076\n\n result && nextTick(function () {\n return !_this2._destroyed && _this2.play();\n });\n });\n } // See Playback.canAutoPlay()\n\n }, {\n key: \"canAutoPlay\",\n value: function canAutoPlay(cb) {\n if (this.options.disableCanAutoPlay) cb(true, null);\n var opts = {\n timeout: this.options.autoPlayTimeout || 500,\n inline: this.options.playback.playInline || false,\n muted: this.options.mute || false // Known issue: mediacontrols may asynchronously mute video\n\n }; // Use current video element if recycling feature enabled with mobile devices\n\n if (Browser.isMobile && DomRecycler.options.recycleVideo) opts.element = this.el; // Desktop browser autoplay policy may require user action\n // Mobile browser autoplay require user consent and video recycling feature enabled\n // It may returns a false positive with source-less player consent\n\n canAutoPlayMedia(cb, opts);\n }\n }, {\n key: \"_setupExternalTracks\",\n value: function _setupExternalTracks(tracks) {\n this._externalTracks = tracks.map(function (track) {\n return {\n kind: track.kind || 'subtitles',\n // Default is 'subtitles'\n label: track.label,\n lang: track.lang,\n src: track.src\n };\n });\n }\n /**\n * Sets the source url on the