!function e(t) { var r, i; r = this, i = function() { "use strict"; function r(e, t) { for (var r = 0; r < t.length; r++) { var i = t[r]; i.enumerable = i.enumerable || !1, i.configurable = !0, "value"in i && (i.writable = !0), Object.defineProperty(e, f(i.key), i) } } function i(e, t, i) { return t && r(e.prototype, t), i && r(e, i), Object.defineProperty(e, "prototype", { writable: !1 }), e } function n(e, t, r) { return (t = f(t))in e ? Object.defineProperty(e, t, { value: r, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = r, e } function a() { return a = Object.assign ? Object.assign.bind() : function(e) { for (var t = 1; t < arguments.length; t++) { var r = arguments[t]; for (var i in r) ({}).hasOwnProperty.call(r, i) && (e[i] = r[i]) } return e } , a.apply(null, arguments) } function s(e) { return s = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(e) { return e.__proto__ || Object.getPrototypeOf(e) } , s(e) } function o(e, t) { e.prototype = Object.create(t.prototype), e.prototype.constructor = e, h(e, t) } function l() { try { var e = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], (function() {} ))) } catch (e) {} return (l = function() { return !!e } )() } function u(e, t) { var r = Object.keys(e); if (Object.getOwnPropertySymbols) { var i = Object.getOwnPropertySymbols(e); t && (i = i.filter((function(t) { return Object.getOwnPropertyDescriptor(e, t).enumerable } ))), r.push.apply(r, i) } return r } function d(e) { for (var t = 1; t < arguments.length; t++) { var r = null != arguments[t] ? arguments[t] : {}; t % 2 ? u(Object(r), !0).forEach((function(t) { n(e, t, r[t]) } )) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : u(Object(r)).forEach((function(t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)) } )) } return e } function h(e, t) { return h = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(e, t) { return e.__proto__ = t, e } , h(e, t) } function f(e) { var t = function(e, t) { if ("object" != typeof e || !e) return e; var r = e[Symbol.toPrimitive]; if (void 0 !== r) { var i = r.call(e, t); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value.") } return ("string" === t ? String : Number)(e) }(e, "string"); return "symbol" == typeof t ? t : t + "" } function c(e) { var t = "function" == typeof Map ? new Map : void 0; return c = function(e) { if (null === e || !function(e) { try { return -1 !== Function.toString.call(e).indexOf("[native code]") } catch (t) { return "function" == typeof e } }(e)) return e; if ("function" != typeof e) throw new TypeError("Super expression must either be null or a function"); if (void 0 !== t) { if (t.has(e)) return t.get(e); t.set(e, r) } function r() { return function(e, t, r) { if (l()) return Reflect.construct.apply(null, arguments); var i = [null]; i.push.apply(i, t); var n = new (e.bind.apply(e, i)); return r && h(n, r.prototype), n }(e, arguments, s(this).constructor) } return r.prototype = Object.create(e.prototype, { constructor: { value: r, enumerable: !1, writable: !0, configurable: !0 } }), h(r, e) } , c(e) } function g(e) { return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e } var v, m, p = { exports: {} }, y = (v || (v = 1, function(e) { var t = Object.prototype.hasOwnProperty , r = "~"; function i() {} function n(e, t, r) { this.fn = e, this.context = t, this.once = r || !1 } function a(e, t, i, a, s) { if ("function" != typeof i) throw new TypeError("The listener must be a function"); var o = new n(i,a || e,s) , l = r ? r + t : t; return e._events[l] ? e._events[l].fn ? e._events[l] = [e._events[l], o] : e._events[l].push(o) : (e._events[l] = o, e._eventsCount++), e } function s(e, t) { 0 == --e._eventsCount ? e._events = new i : delete e._events[t] } function o() { this._events = new i, this._eventsCount = 0 } Object.create && (i.prototype = Object.create(null), (new i).__proto__ || (r = !1)), o.prototype.eventNames = function() { var e, i, n = []; if (0 === this._eventsCount) return n; for (i in e = this._events) t.call(e, i) && n.push(r ? i.slice(1) : i); return Object.getOwnPropertySymbols ? n.concat(Object.getOwnPropertySymbols(e)) : n } , o.prototype.listeners = function(e) { var t = r ? r + e : e , i = this._events[t]; if (!i) return []; if (i.fn) return [i.fn]; for (var n = 0, a = i.length, s = new Array(a); n < a; n++) s[n] = i[n].fn; return s } , o.prototype.listenerCount = function(e) { var t = r ? r + e : e , i = this._events[t]; return i ? i.fn ? 1 : i.length : 0 } , o.prototype.emit = function(e, t, i, n, a, s) { var o = r ? r + e : e; if (!this._events[o]) return !1; var l, u, d = this._events[o], h = arguments.length; if (d.fn) { switch (d.once && this.removeListener(e, d.fn, void 0, !0), h) { case 1: return d.fn.call(d.context), !0; case 2: return d.fn.call(d.context, t), !0; case 3: return d.fn.call(d.context, t, i), !0; case 4: return d.fn.call(d.context, t, i, n), !0; case 5: return d.fn.call(d.context, t, i, n, a), !0; case 6: return d.fn.call(d.context, t, i, n, a, s), !0 } for (u = 1, l = new Array(h - 1); u < h; u++) l[u - 1] = arguments[u]; d.fn.apply(d.context, l) } else { var f, c = d.length; for (u = 0; u < c; u++) switch (d[u].once && this.removeListener(e, d[u].fn, void 0, !0), h) { case 1: d[u].fn.call(d[u].context); break; case 2: d[u].fn.call(d[u].context, t); break; case 3: d[u].fn.call(d[u].context, t, i); break; case 4: d[u].fn.call(d[u].context, t, i, n); break; default: if (!l) for (f = 1, l = new Array(h - 1); f < h; f++) l[f - 1] = arguments[f]; d[u].fn.apply(d[u].context, l) } } return !0 } , o.prototype.on = function(e, t, r) { return a(this, e, t, r, !1) } , o.prototype.once = function(e, t, r) { return a(this, e, t, r, !0) } , o.prototype.removeListener = function(e, t, i, n) { var a = r ? r + e : e; if (!this._events[a]) return this; if (!t) return s(this, a), this; var o = this._events[a]; if (o.fn) o.fn !== t || n && !o.once || i && o.context !== i || s(this, a); else { for (var l = 0, u = [], d = o.length; l < d; l++) (o[l].fn !== t || n && !o[l].once || i && o[l].context !== i) && u.push(o[l]); u.length ? this._events[a] = 1 === u.length ? u[0] : u : s(this, a) } return this } , o.prototype.removeAllListeners = function(e) { var t; return e ? (t = r ? r + e : e, this._events[t] && s(this, t)) : (this._events = new i, this._eventsCount = 0), this } , o.prototype.off = o.prototype.removeListener, o.prototype.addListener = o.prototype.on, o.prefixed = r, o.EventEmitter = o, e.exports = o }(p)), p.exports), E = g(y), T = { exports: {} }, S = (m || (m = 1, function(e, t) { var r, i, n, a, s; r = /^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/, i = /^(?=([^\/?#]*))\1([^]*)$/, n = /(?:\/|^)\.(?=\/)/g, a = /(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g, s = { buildAbsoluteURL: function(e, t, r) { if (r = r || {}, e = e.trim(), !(t = t.trim())) { if (!r.alwaysNormalize) return e; var n = s.parseURL(e); if (!n) throw new Error("Error trying to parse base URL."); return n.path = s.normalizePath(n.path), s.buildURLFromParts(n) } var a = s.parseURL(t); if (!a) throw new Error("Error trying to parse relative URL."); if (a.scheme) return r.alwaysNormalize ? (a.path = s.normalizePath(a.path), s.buildURLFromParts(a)) : t; var o = s.parseURL(e); if (!o) throw new Error("Error trying to parse base URL."); if (!o.netLoc && o.path && "/" !== o.path[0]) { var l = i.exec(o.path); o.netLoc = l[1], o.path = l[2] } o.netLoc && !o.path && (o.path = "/"); var u = { scheme: o.scheme, netLoc: a.netLoc, path: null, params: a.params, query: a.query, fragment: a.fragment }; if (!a.netLoc && (u.netLoc = o.netLoc, "/" !== a.path[0])) if (a.path) { var d = o.path , h = d.substring(0, d.lastIndexOf("/") + 1) + a.path; u.path = s.normalizePath(h) } else u.path = o.path, a.params || (u.params = o.params, a.query || (u.query = o.query)); return null === u.path && (u.path = r.alwaysNormalize ? s.normalizePath(a.path) : a.path), s.buildURLFromParts(u) }, parseURL: function(e) { var t = r.exec(e); return t ? { scheme: t[1] || "", netLoc: t[2] || "", path: t[3] || "", params: t[4] || "", query: t[5] || "", fragment: t[6] || "" } : null }, normalizePath: function(e) { for (e = e.split("").reverse().join("").replace(n, ""); e.length !== (e = e.replace(a, "")).length; ) ; return e.split("").reverse().join("") }, buildURLFromParts: function(e) { return e.scheme + e.netLoc + e.path + e.params + e.query + e.fragment } }, e.exports = s }(T)), T.exports), A = Number.isFinite || function(e) { return "number" == typeof e && isFinite(e) } , L = Number.isSafeInteger || function(e) { return "number" == typeof e && Math.abs(e) <= I } , I = Number.MAX_SAFE_INTEGER || 9007199254740991, R = function(e) { return e.NETWORK_ERROR = "networkError", e.MEDIA_ERROR = "mediaError", e.KEY_SYSTEM_ERROR = "keySystemError", e.MUX_ERROR = "muxError", e.OTHER_ERROR = "otherError", e }({}), k = function(e) { return e.KEY_SYSTEM_NO_KEYS = "keySystemNoKeys", e.KEY_SYSTEM_NO_ACCESS = "keySystemNoAccess", e.KEY_SYSTEM_NO_SESSION = "keySystemNoSession", e.KEY_SYSTEM_NO_CONFIGURED_LICENSE = "keySystemNoConfiguredLicense", e.KEY_SYSTEM_LICENSE_REQUEST_FAILED = "keySystemLicenseRequestFailed", e.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED = "keySystemServerCertificateRequestFailed", e.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED = "keySystemServerCertificateUpdateFailed", e.KEY_SYSTEM_SESSION_UPDATE_FAILED = "keySystemSessionUpdateFailed", e.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED = "keySystemStatusOutputRestricted", e.KEY_SYSTEM_STATUS_INTERNAL_ERROR = "keySystemStatusInternalError", e.KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR = "keySystemDestroyMediaKeysError", e.KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR = "keySystemDestroyCloseSessionError", e.KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR = "keySystemDestroyRemoveSessionError", e.MANIFEST_LOAD_ERROR = "manifestLoadError", e.MANIFEST_LOAD_TIMEOUT = "manifestLoadTimeOut", e.MANIFEST_PARSING_ERROR = "manifestParsingError", e.MANIFEST_INCOMPATIBLE_CODECS_ERROR = "manifestIncompatibleCodecsError", e.LEVEL_EMPTY_ERROR = "levelEmptyError", e.LEVEL_LOAD_ERROR = "levelLoadError", e.LEVEL_LOAD_TIMEOUT = "levelLoadTimeOut", e.LEVEL_PARSING_ERROR = "levelParsingError", e.LEVEL_SWITCH_ERROR = "levelSwitchError", e.AUDIO_TRACK_LOAD_ERROR = "audioTrackLoadError", e.AUDIO_TRACK_LOAD_TIMEOUT = "audioTrackLoadTimeOut", e.SUBTITLE_LOAD_ERROR = "subtitleTrackLoadError", e.SUBTITLE_TRACK_LOAD_TIMEOUT = "subtitleTrackLoadTimeOut", e.FRAG_LOAD_ERROR = "fragLoadError", e.FRAG_LOAD_TIMEOUT = "fragLoadTimeOut", e.FRAG_DECRYPT_ERROR = "fragDecryptError", e.FRAG_PARSING_ERROR = "fragParsingError", e.FRAG_GAP = "fragGap", e.REMUX_ALLOC_ERROR = "remuxAllocError", e.KEY_LOAD_ERROR = "keyLoadError", e.KEY_LOAD_TIMEOUT = "keyLoadTimeOut", e.BUFFER_ADD_CODEC_ERROR = "bufferAddCodecError", e.BUFFER_INCOMPATIBLE_CODECS_ERROR = "bufferIncompatibleCodecsError", 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.ASSET_LIST_LOAD_ERROR = "assetListLoadError", e.ASSET_LIST_LOAD_TIMEOUT = "assetListLoadTimeout", e.ASSET_LIST_PARSING_ERROR = "assetListParsingError", e.INTERSTITIAL_ASSET_ITEM_ERROR = "interstitialAssetItemError", e.INTERNAL_EXCEPTION = "internalException", e.INTERNAL_ABORTED = "aborted", e.ATTACH_MEDIA_ERROR = "attachMediaError", e.UNKNOWN = "unknown", e }({}), b = function(e) { return e.MEDIA_ATTACHING = "hlsMediaAttaching", e.MEDIA_ATTACHED = "hlsMediaAttached", e.MEDIA_DETACHING = "hlsMediaDetaching", e.MEDIA_DETACHED = "hlsMediaDetached", e.MEDIA_ENDED = "hlsMediaEnded", e.STALL_RESOLVED = "hlsStallResolved", e.BUFFER_RESET = "hlsBufferReset", e.BUFFER_CODECS = "hlsBufferCodecs", e.BUFFER_CREATED = "hlsBufferCreated", e.BUFFER_APPENDING = "hlsBufferAppending", e.BUFFER_APPENDED = "hlsBufferAppended", e.BUFFER_EOS = "hlsBufferEos", e.BUFFERED_TO_END = "hlsBufferedToEnd", e.BUFFER_FLUSHING = "hlsBufferFlushing", e.BUFFER_FLUSHED = "hlsBufferFlushed", e.MANIFEST_LOADING = "hlsManifestLoading", e.MANIFEST_LOADED = "hlsManifestLoaded", e.MANIFEST_PARSED = "hlsManifestParsed", e.LEVEL_SWITCHING = "hlsLevelSwitching", e.LEVEL_SWITCHED = "hlsLevelSwitched", e.LEVEL_LOADING = "hlsLevelLoading", e.LEVEL_LOADED = "hlsLevelLoaded", e.LEVEL_UPDATED = "hlsLevelUpdated", e.LEVEL_PTS_UPDATED = "hlsLevelPtsUpdated", e.LEVELS_UPDATED = "hlsLevelsUpdated", e.AUDIO_TRACKS_UPDATED = "hlsAudioTracksUpdated", e.AUDIO_TRACK_SWITCHING = "hlsAudioTrackSwitching", e.AUDIO_TRACK_SWITCHED = "hlsAudioTrackSwitched", e.AUDIO_TRACK_LOADING = "hlsAudioTrackLoading", e.AUDIO_TRACK_LOADED = "hlsAudioTrackLoaded", e.AUDIO_TRACK_UPDATED = "hlsAudioTrackUpdated", e.SUBTITLE_TRACKS_UPDATED = "hlsSubtitleTracksUpdated", e.SUBTITLE_TRACKS_CLEARED = "hlsSubtitleTracksCleared", e.SUBTITLE_TRACK_SWITCH = "hlsSubtitleTrackSwitch", e.SUBTITLE_TRACK_LOADING = "hlsSubtitleTrackLoading", e.SUBTITLE_TRACK_LOADED = "hlsSubtitleTrackLoaded", e.SUBTITLE_TRACK_UPDATED = "hlsSubtitleTrackUpdated", e.SUBTITLE_FRAG_PROCESSED = "hlsSubtitleFragProcessed", e.CUES_PARSED = "hlsCuesParsed", e.NON_NATIVE_TEXT_TRACKS_FOUND = "hlsNonNativeTextTracksFound", e.INIT_PTS_FOUND = "hlsInitPtsFound", e.FRAG_LOADING = "hlsFragLoading", e.FRAG_LOAD_EMERGENCY_ABORTED = "hlsFragLoadEmergencyAborted", e.FRAG_LOADED = "hlsFragLoaded", e.FRAG_DECRYPTED = "hlsFragDecrypted", e.FRAG_PARSING_INIT_SEGMENT = "hlsFragParsingInitSegment", e.FRAG_PARSING_USERDATA = "hlsFragParsingUserdata", e.FRAG_PARSING_METADATA = "hlsFragParsingMetadata", e.FRAG_PARSED = "hlsFragParsed", e.FRAG_BUFFERED = "hlsFragBuffered", e.FRAG_CHANGED = "hlsFragChanged", e.FPS_DROP = "hlsFpsDrop", e.FPS_DROP_LEVEL_CAPPING = "hlsFpsDropLevelCapping", e.MAX_AUTO_LEVEL_UPDATED = "hlsMaxAutoLevelUpdated", e.ERROR = "hlsError", e.DESTROYING = "hlsDestroying", e.KEY_LOADING = "hlsKeyLoading", e.KEY_LOADED = "hlsKeyLoaded", e.LIVE_BACK_BUFFER_REACHED = "hlsLiveBackBufferReached", e.BACK_BUFFER_REACHED = "hlsBackBufferReached", e.STEERING_MANIFEST_LOADED = "hlsSteeringManifestLoaded", e.ASSET_LIST_LOADING = "hlsAssetListLoading", e.ASSET_LIST_LOADED = "hlsAssetListLoaded", e.INTERSTITIALS_UPDATED = "hlsInterstitialsUpdated", e.INTERSTITIALS_BUFFERED_TO_BOUNDARY = "hlsInterstitialsBufferedToBoundary", e.INTERSTITIAL_ASSET_PLAYER_CREATED = "hlsInterstitialAssetPlayerCreated", e.INTERSTITIAL_STARTED = "hlsInterstitialStarted", e.INTERSTITIAL_ASSET_STARTED = "hlsInterstitialAssetStarted", e.INTERSTITIAL_ASSET_ENDED = "hlsInterstitialAssetEnded", e.INTERSTITIAL_ASSET_ERROR = "hlsInterstitialAssetError", e.INTERSTITIAL_ENDED = "hlsInterstitialEnded", e.INTERSTITIALS_PRIMARY_RESUMED = "hlsInterstitialsPrimaryResumed", e.PLAYOUT_LIMIT_REACHED = "hlsPlayoutLimitReached", e.EVENT_CUE_ENTER = "hlsEventCueEnter", e }({}), D = "manifest", _ = "level", P = "audioTrack", C = "subtitleTrack", w = "main", O = "audio", x = "subtitle", M = function() { function e(e, t, r) { void 0 === t && (t = 0), void 0 === r && (r = 0), this.halfLife = void 0, this.alpha_ = void 0, this.estimate_ = void 0, this.totalWeight_ = void 0, this.halfLife = e, this.alpha_ = e ? Math.exp(Math.log(.5) / e) : 0, this.estimate_ = t, this.totalWeight_ = r } var t = e.prototype; return t.sample = function(e, t) { var r = Math.pow(this.alpha_, e); this.estimate_ = t * (1 - r) + r * this.estimate_, this.totalWeight_ += e } , t.getTotalWeight = function() { return this.totalWeight_ } , t.getEstimate = function() { if (this.alpha_) { var e = 1 - Math.pow(this.alpha_, this.totalWeight_); if (e) return this.estimate_ / e } return this.estimate_ } , e }(), F = function() { function e(e, t, r, i) { void 0 === i && (i = 100), this.defaultEstimate_ = void 0, this.minWeight_ = void 0, this.minDelayMs_ = void 0, this.slow_ = void 0, this.fast_ = void 0, this.defaultTTFB_ = void 0, this.ttfb_ = void 0, this.defaultEstimate_ = r, this.minWeight_ = .001, this.minDelayMs_ = 50, this.slow_ = new M(e), this.fast_ = new M(t), this.defaultTTFB_ = i, this.ttfb_ = new M(e) } var t = e.prototype; return t.update = function(e, t) { var r = this.slow_ , i = this.fast_ , n = this.ttfb_; r.halfLife !== e && (this.slow_ = new M(e,r.getEstimate(),r.getTotalWeight())), i.halfLife !== t && (this.fast_ = new M(t,i.getEstimate(),i.getTotalWeight())), n.halfLife !== e && (this.ttfb_ = new M(e,n.getEstimate(),n.getTotalWeight())) } , t.sample = function(e, t) { var r = (e = Math.max(e, this.minDelayMs_)) / 1e3 , i = 8 * t / r; this.fast_.sample(r, i), this.slow_.sample(r, i) } , t.sampleTTFB = function(e) { var t = e / 1e3 , r = Math.sqrt(2) * Math.exp(-Math.pow(t, 2) / 2); this.ttfb_.sample(r, Math.max(e, 5)) } , t.canEstimate = function() { return this.fast_.getTotalWeight() >= this.minWeight_ } , t.getEstimate = function() { return this.canEstimate() ? Math.min(this.fast_.getEstimate(), this.slow_.getEstimate()) : this.defaultEstimate_ } , t.getEstimateTTFB = function() { return this.ttfb_.getTotalWeight() >= this.minWeight_ ? this.ttfb_.getEstimate() : this.defaultTTFB_ } , t.destroy = function() {} , i(e, [{ key: "defaultEstimate", get: function() { return this.defaultEstimate_ } }]) }(), N = function(e, t) { this.trace = void 0, this.debug = void 0, this.log = void 0, this.warn = void 0, this.info = void 0, this.error = void 0; var r = "[" + e + "]:"; this.trace = U, this.debug = t.debug.bind(null, r), this.log = t.log.bind(null, r), this.warn = t.warn.bind(null, r), this.info = t.info.bind(null, r), this.error = t.error.bind(null, r) }, U = function() {}, B = { trace: U, debug: U, log: U, warn: U, info: U, error: U }; function G() { return a({}, B) } function K(e, t, r) { return t[e] ? t[e].bind(t) : function(e, t) { var r = self.console[e]; return r ? r.bind(self.console, (t ? "[" + t + "] " : "") + "[" + e + "] >") : U }(e, r) } var V = G(); function H(e, t, r) { var i = G(); if ("object" == typeof console && !0 === e || "object" == typeof e) { var n = ["debug", "log", "info", "warn", "error"]; n.forEach((function(t) { i[t] = K(t, e, r) } )); try { i.log('Debug logs enabled for "' + t + '" in hls.js version 1.6.12') } catch (e) { return G() } n.forEach((function(t) { V[t] = K(t, e) } )) } else a(V, i); return i } var Y = V; function W(e) { if (void 0 === e && (e = !0), "undefined" != typeof self) return (e || !self.MediaSource) && self.ManagedMediaSource || self.MediaSource || self.WebKitMediaSource } function j(e, t) { var r = Object.keys(e) , i = Object.keys(t) , n = r.length , a = i.length; return !n || !a || n === a && !r.some((function(e) { return -1 === i.indexOf(e) } )) } function q(e, t) { if (void 0 === t && (t = !1), "undefined" != typeof TextDecoder) { var r = new TextDecoder("utf-8").decode(e); if (t) { var i = r.indexOf("\0"); return -1 !== i ? r.substring(0, i) : r } return r.replace(/\0/g, "") } for (var n, a, s, o = e.length, l = "", u = 0; u < o; ) { if (0 === (n = e[u++]) && t) return l; if (0 !== n && 3 !== n) switch (n >> 4) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: l += String.fromCharCode(n); break; case 12: case 13: a = e[u++], l += String.fromCharCode((31 & n) << 6 | 63 & a); break; case 14: a = e[u++], s = e[u++], l += String.fromCharCode((15 & n) << 12 | (63 & a) << 6 | (63 & s) << 0) } } return l } function X(e) { for (var t = "", r = 0; r < e.length; r++) { var i = e[r].toString(16); i.length < 2 && (i = "0" + i), t += i } return t } function Q(e) { return Uint8Array.from(e.replace(/^0x/, "").replace(/([\da-fA-F]{2}) ?/g, "0x$1 ").replace(/ +$/, "").split(" ")).buffer } var z = function() { this.aborted = !1, this.loaded = 0, this.retry = 0, this.total = 0, this.chunkCount = 0, this.bwEstimate = 0, this.loading = { start: 0, first: 0, end: 0 }, this.parsing = { start: 0, end: 0 }, this.buffering = { start: 0, first: 0, end: 0 } } , $ = "audio" , Z = "video" , J = "audiovideo" , ee = function() { function e(e) { var t, r, i; this._byteRange = null, this._url = null, this._stats = null, this._streams = null, this.base = void 0, this.relurl = void 0, "string" == typeof e && (e = { url: e }), this.base = e, (i = ne(t = this, r = "stats")) && (i.enumerable = !0, Object.defineProperty(t, r, i)) } var t = e.prototype; return t.setByteRange = function(e, t) { var r, i = e.split("@", 2); r = 1 === i.length ? (null == t ? void 0 : t.byteRangeEndOffset) || 0 : parseInt(i[1]), this._byteRange = [r, parseInt(i[0]) + r] } , t.clearElementaryStreamInfo = function() { var e = this.elementaryStreams; e[$] = null, e[Z] = null, e[J] = null } , i(e, [{ key: "baseurl", get: function() { return this.base.url } }, { key: "byteRange", get: function() { return null === this._byteRange ? [] : this._byteRange } }, { key: "byteRangeStartOffset", get: function() { return this.byteRange[0] } }, { key: "byteRangeEndOffset", get: function() { return this.byteRange[1] } }, { key: "elementaryStreams", get: function() { var e; return null === this._streams && (this._streams = ((e = {})[$] = null, e[Z] = null, e[J] = null, e)), this._streams }, set: function(e) { this._streams = e } }, { key: "hasStats", get: function() { return null !== this._stats } }, { key: "hasStreams", get: function() { return null !== this._streams } }, { key: "stats", get: function() { return null === this._stats && (this._stats = new z), this._stats }, set: function(e) { this._stats = e } }, { key: "url", get: function() { return !this._url && this.baseurl && this.relurl && (this._url = S.buildAbsoluteURL(this.baseurl, this.relurl, { alwaysNormalize: !0 })), this._url || "" }, set: function(e) { this._url = e } }]) }(); function te(e) { return "initSegment" !== e.sn } var re = function(e) { function t(t, r) { var i; return (i = e.call(this, r) || this)._decryptdata = null, i._programDateTime = null, i._ref = null, i._bitrate = void 0, i.rawProgramDateTime = null, i.tagList = [], i.duration = 0, i.sn = 0, i.levelkeys = void 0, i.type = void 0, i.loader = null, i.keyLoader = null, i.level = -1, i.cc = 0, i.startPTS = void 0, i.endPTS = void 0, i.startDTS = void 0, i.endDTS = void 0, i.start = 0, i.playlistOffset = 0, i.deltaPTS = void 0, i.maxStartPTS = void 0, i.minEndPTS = void 0, i.data = void 0, i.bitrateTest = !1, i.title = null, i.initSegment = null, i.endList = void 0, i.gap = void 0, i.urlId = 0, i.type = t, i } o(t, e); var r = t.prototype; return r.addStart = function(e) { this.setStart(this.start + e) } , r.setStart = function(e) { this.start = e, this._ref && (this._ref.start = e) } , r.setDuration = function(e) { this.duration = e, this._ref && (this._ref.duration = e) } , r.setKeyFormat = function(e) { if (this.levelkeys) { var t = this.levelkeys[e]; t && !this._decryptdata && (this._decryptdata = t.getDecryptData(this.sn)) } } , r.abortRequests = function() { var e, t; null == (e = this.loader) || e.abort(), null == (t = this.keyLoader) || t.abort() } , r.setElementaryStreamInfo = function(e, t, r, i, n, a) { void 0 === a && (a = !1); var s = this.elementaryStreams , o = s[e]; o ? (o.startPTS = Math.min(o.startPTS, t), o.endPTS = Math.max(o.endPTS, r), o.startDTS = Math.min(o.startDTS, i), o.endDTS = Math.max(o.endDTS, n)) : s[e] = { startPTS: t, endPTS: r, startDTS: i, endDTS: n, partial: a } } , i(t, [{ key: "byteLength", get: function() { if (this.hasStats) { var e = this.stats.total; if (e) return e } if (this.byteRange.length) { var t = this.byteRange[0] , r = this.byteRange[1]; if (A(t) && A(r)) return r - t } return null } }, { key: "bitrate", get: function() { return this.byteLength ? 8 * this.byteLength / this.duration : this._bitrate ? this._bitrate : null }, set: function(e) { this._bitrate = e } }, { key: "decryptdata", get: function() { if (!this.levelkeys && !this._decryptdata) return null; if (!this._decryptdata && this.levelkeys && !this.levelkeys.NONE) { var e = this.levelkeys.identity; if (e) this._decryptdata = e.getDecryptData(this.sn); else { var t = Object.keys(this.levelkeys); if (1 === t.length) { var r = this._decryptdata = this.levelkeys[t[0]] || null; if (r) return r.getDecryptData(this.sn) } } } return this._decryptdata } }, { key: "end", get: function() { return this.start + this.duration } }, { key: "endProgramDateTime", get: function() { if (null === this.programDateTime) return null; var e = A(this.duration) ? this.duration : 0; return this.programDateTime + 1e3 * e } }, { key: "encrypted", get: function() { var e; if (null != (e = this._decryptdata) && e.encrypted) return !0; if (this.levelkeys) { var t, r = Object.keys(this.levelkeys), i = r.length; if (i > 1 || 1 === i && null != (t = this.levelkeys[r[0]]) && t.encrypted) return !0 } return !1 } }, { key: "programDateTime", get: function() { return null === this._programDateTime && this.rawProgramDateTime && (this.programDateTime = Date.parse(this.rawProgramDateTime)), this._programDateTime }, set: function(e) { A(e) ? this._programDateTime = e : this._programDateTime = this.rawProgramDateTime = null } }, { key: "ref", get: function() { return te(this) ? (this._ref || (this._ref = { base: this.base, start: this.start, duration: this.duration, sn: this.sn, programDateTime: this.programDateTime }), this._ref) : null } }]) }(ee) , ie = function(e) { function t(t, r, i, n, a) { var s; (s = e.call(this, i) || this).fragOffset = 0, s.duration = 0, s.gap = !1, s.independent = !1, s.relurl = void 0, s.fragment = void 0, s.index = void 0, s.duration = t.decimalFloatingPoint("DURATION"), s.gap = t.bool("GAP"), s.independent = t.bool("INDEPENDENT"), s.relurl = t.enumeratedString("URI"), s.fragment = r, s.index = n; var o = t.enumeratedString("BYTERANGE"); return o && s.setByteRange(o, a), a && (s.fragOffset = a.fragOffset + a.duration), s } return o(t, e), i(t, [{ key: "start", get: function() { return this.fragment.start + this.fragOffset } }, { key: "end", get: function() { return this.start + this.duration } }, { key: "loaded", get: function() { var e = this.elementaryStreams; return !!(e.audio || e.video || e.audiovideo) } }]) }(ee); function ne(e, t) { var r = Object.getPrototypeOf(e); if (r) { var i = Object.getOwnPropertyDescriptor(r, t); return i || ne(r, t) } } var ae = Math.pow(2, 32) - 1 , se = [].push , oe = { video: 1, audio: 2, id3: 3, text: 4 }; function le(e) { return String.fromCharCode.apply(null, e) } function ue(e, t) { var r = e[t] << 8 | e[t + 1]; return r < 0 ? 65536 + r : r } function de(e, t) { var r = fe(e, t); return r < 0 ? 4294967296 + r : r } function he(e, t) { var r = de(e, t); return r *= Math.pow(2, 32), r += de(e, t + 4) } function fe(e, t) { return e[t] << 24 | e[t + 1] << 16 | e[t + 2] << 8 | e[t + 3] } function ce(e, t) { var r = []; if (!t.length) return r; for (var i = e.byteLength, n = 0; n < i; ) { var a = de(e, n) , s = a > 1 ? n + a : i; if (le(e.subarray(n + 4, n + 8)) === t[0]) if (1 === t.length) r.push(e.subarray(n + 8, s)); else { var o = ce(e.subarray(n + 8, s), t.slice(1)); o.length && se.apply(r, o) } n = s } return r } function ge(e) { var t = [] , r = e[0] , i = 8 , n = de(e, i); i += 4; var a = 0 , s = 0; 0 === r ? (a = de(e, i), s = de(e, i + 4), i += 8) : (a = he(e, i), s = he(e, i + 8), i += 16), i += 2; var o = e.length + s , l = ue(e, i); i += 2; for (var u = 0; u < l; u++) { var d = i , h = de(e, d); d += 4; var f = 2147483647 & h; if (1 == (2147483648 & h) >>> 31) return Y.warn("SIDX has hierarchical references (not supported)"), null; var c = de(e, d); d += 4, t.push({ referenceSize: f, subsegmentDuration: c, info: { duration: c / n, start: o, end: o + f - 1 } }), o += f, i = d += 4 } return { earliestPresentationTime: a, timescale: n, version: r, referencesCount: l, references: t } } function ve(e) { for (var t = [], r = ce(e, ["moov", "trak"]), i = 0; i < r.length; i++) { var n = r[i] , a = ce(n, ["tkhd"])[0]; if (a) { var s = a[0] , o = de(a, 0 === s ? 12 : 20) , l = ce(n, ["mdia", "mdhd"])[0]; if (l) { var u = de(l, 0 === (s = l[0]) ? 12 : 20) , h = ce(n, ["mdia", "hdlr"])[0]; if (h) { var f = le(h.subarray(8, 12)) , c = { soun: $, vide: Z }[f] , g = me(ce(n, ["mdia", "minf", "stbl", "stsd"])[0]); c ? (t[o] = { timescale: u, type: c, stsd: g }, t[c] = d({ timescale: u, id: o }, g)) : t[o] = { timescale: u, type: f, stsd: g } } } } } return ce(e, ["moov", "mvex", "trex"]).forEach((function(e) { var r = de(e, 4) , i = t[r]; i && (i.default = { duration: de(e, 12), flags: de(e, 20) }) } )), t } function me(e) { var t, r = e.subarray(8), i = r.subarray(86), n = le(r.subarray(4, 8)), a = n, s = "enca" === n || "encv" === n; if (s) { var o = ce(r, [n])[0]; ce(o.subarray("enca" === n ? 28 : 78), ["sinf"]).forEach((function(e) { var t = ce(e, ["schm"])[0]; if (t) { var r = le(t.subarray(4, 8)); if ("cbcs" === r || "cenc" === r) { var i = ce(e, ["frma"])[0]; i && (a = le(i)) } } } )) } var l = a; switch (a) { case "avc1": case "avc2": case "avc3": case "avc4": var u = ce(i, ["avcC"])[0]; u && u.length > 3 && (a += "." + Ee(u[1]) + Ee(u[2]) + Ee(u[3]), t = pe("avc1" === l ? "dva1" : "dvav", i)); break; case "mp4a": var d = ce(r, [n])[0] , h = ce(d.subarray(28), ["esds"])[0]; if (h && h.length > 7) { var f = 4; if (3 !== h[f++]) break; f = ye(h, f), f += 2; var c = h[f++]; if (128 & c && (f += 2), 64 & c && (f += h[f++]), 4 !== h[f++]) break; f = ye(h, f); var g = h[f++]; if (64 !== g) break; if (a += "." + Ee(g), f += 12, 5 !== h[f++]) break; f = ye(h, f); var v = h[f++] , m = (248 & v) >> 3; 31 === m && (m += 1 + ((7 & v) << 3) + ((224 & h[f]) >> 5)), a += "." + m } break; case "hvc1": case "hev1": var p = ce(i, ["hvcC"])[0]; if (p && p.length > 12) { var y = p[1] , E = ["", "A", "B", "C"][y >> 6] , T = 31 & y , S = de(p, 2) , A = (32 & y) >> 5 ? "H" : "L" , L = p[12] , I = p.subarray(6, 12); a += "." + E + T, a += "." + function(e) { for (var t = 0, r = 0; r < 32; r++) t |= (e >> r & 1) << 31 - r; return t >>> 0 }(S).toString(16).toUpperCase(), a += "." + A + L; for (var R = "", k = I.length; k--; ) { var b = I[k]; (b || R) && (R = "." + b.toString(16).toUpperCase() + R) } a += R } t = pe("hev1" == l ? "dvhe" : "dvh1", i); break; case "dvh1": case "dvhe": case "dvav": case "dva1": case "dav1": a = pe(a, i) || a; break; case "vp09": var D = ce(i, ["vpcC"])[0]; if (D && D.length > 6) { var _ = D[4] , P = D[5] , C = D[6] >> 4 & 15; a += "." + Te(_) + "." + Te(P) + "." + Te(C) } break; case "av01": var w = ce(i, ["av1C"])[0]; if (w && w.length > 2) { var O = w[1] >>> 5 , x = 31 & w[1] , M = w[2] >>> 7 ? "H" : "M" , F = (64 & w[2]) >> 6 , N = (32 & w[2]) >> 5 , U = 2 === O && F ? N ? 12 : 10 : F ? 10 : 8 , B = (16 & w[2]) >> 4 , G = (8 & w[2]) >> 3 , K = (4 & w[2]) >> 2 , V = 3 & w[2]; a += "." + O + "." + Te(x) + M + "." + Te(U) + "." + B + "." + G + K + V + "." + Te(1) + "." + Te(1) + "." + Te(1) + ".0", t = pe("dav1", i) } } return { codec: a, encrypted: s, supplemental: t } } function pe(e, t) { var r = ce(t, ["dvvC"]) , i = r.length ? r[0] : ce(t, ["dvcC"])[0]; if (i) { var n = i[2] >> 1 & 127 , a = i[2] << 5 & 32 | i[3] >> 3 & 31; return e + "." + Te(n) + "." + Te(a) } } function ye(e, t) { for (var r = t + 5; 128 & e[t++] && t < r; ) ; return t } function Ee(e) { return ("0" + e.toString(16).toUpperCase()).slice(-2) } function Te(e) { return (e < 10 ? "0" : "") + e } function Se(e) { var t = ce(e, ["schm"])[0]; if (t) { var r = le(t.subarray(4, 8)); if ("cbcs" === r || "cenc" === r) return ce(e, ["schi", "tenc"])[0] } return null } function Ae(e, t) { var r = new Uint8Array(e.length + t.length); return r.set(e), r.set(t, e.length), r } function Le(e, t) { var r = [] , i = t.samples , n = t.timescale , a = t.id , s = !1; return ce(i, ["moof"]).map((function(o) { var l = o.byteOffset - 8; ce(o, ["traf"]).map((function(o) { var u = ce(o, ["tfdt"]).map((function(e) { var t = e[0] , r = de(e, 4); return 1 === t && (r *= Math.pow(2, 32), r += de(e, 8)), r / n } ))[0]; return void 0 !== u && (e = u), ce(o, ["tfhd"]).map((function(u) { var d = de(u, 4) , h = 16777215 & de(u, 0) , f = 0 , c = 0 != (16 & h) , g = 0 , v = 0 != (32 & h) , m = 8; d === a && (0 != (1 & h) && (m += 8), 0 != (2 & h) && (m += 4), 0 != (8 & h) && (f = de(u, m), m += 4), c && (g = de(u, m), m += 4), v && (m += 4), "video" === t.type && (s = Ie(t.codec)), ce(o, ["trun"]).map((function(a) { var o = a[0] , u = 16777215 & de(a, 0) , d = 0 != (1 & u) , h = 0 , c = 0 != (4 & u) , v = 0 != (256 & u) , m = 0 , p = 0 != (512 & u) , y = 0 , E = 0 != (1024 & u) , T = 0 != (2048 & u) , S = 0 , A = de(a, 4) , L = 8; d && (h = de(a, L), L += 4), c && (L += 4); for (var I = h + l, R = 0; R < A; R++) { if (v ? (m = de(a, L), L += 4) : m = f, p ? (y = de(a, L), L += 4) : y = g, E && (L += 4), T && (S = 0 === o ? de(a, L) : fe(a, L), L += 4), t.type === Z) for (var k = 0; k < y; ) { var b = de(i, I); Re(s, i[I += 4]) && ke(i.subarray(I, I + b), s ? 2 : 1, e + S / n, r), I += b, k += b + 4 } e += m / n } } ))) } )) } )) } )), r } function Ie(e) { if (!e) return !1; var t = e.substring(0, 4); return "hvc1" === t || "hev1" === t || "dvh1" === t || "dvhe" === t } function Re(e, t) { if (e) { var r = t >> 1 & 63; return 39 === r || 40 === r } return 6 == (31 & t) } function ke(e, t, r, i) { var n = be(e) , a = 0; a += t; for (var s = 0, o = 0, l = 0; a < n.length; ) { s = 0; do { if (a >= n.length) break; s += l = n[a++] } while (255 === l); o = 0; do { if (a >= n.length) break; o += l = n[a++] } while (255 === l); var u = n.length - a , d = a; if (o < u) a += o; else if (o > u) { Y.error("Malformed SEI payload. " + o + " is too small, only " + u + " bytes left to parse."); break } if (4 === s) { if (181 === n[d++]) { var h = ue(n, d); if (d += 2, 49 === h) { var f = de(n, d); if (d += 4, 1195456820 === f) { var c = n[d++]; if (3 === c) { var g = n[d++] , v = 64 & g , m = v ? 2 + 3 * (31 & g) : 0 , p = new Uint8Array(m); if (v) { p[0] = g; for (var y = 1; y < m; y++) p[y] = n[d++] } i.push({ type: c, payloadType: s, pts: r, bytes: p }) } } } } } else if (5 === s && o > 16) { for (var E = [], T = 0; T < 16; T++) { var S = n[d++].toString(16); E.push(1 == S.length ? "0" + S : S), 3 !== T && 5 !== T && 7 !== T && 9 !== T || E.push("-") } for (var A = o - 16, L = new Uint8Array(A), I = 0; I < A; I++) L[I] = n[d++]; i.push({ payloadType: s, pts: r, uuid: E.join(""), userData: q(L), userDataBytes: L }) } } } function be(e) { for (var t = e.byteLength, r = [], i = 1; i < t - 2; ) 0 === e[i] && 0 === e[i + 1] && 3 === e[i + 2] ? (r.push(i + 2), i += 2) : i++; if (0 === r.length) return e; var n = t - r.length , a = new Uint8Array(n) , s = 0; for (i = 0; i < n; s++, i++) s === r[0] && (s++, r.shift()), a[i] = e[s]; return a } function De(e, t, r) { if (16 !== e.byteLength) throw new RangeError("Invalid system id"); var i, n; i = new Uint8Array, n = new Uint8Array; var a = new Uint8Array(4); return r.byteLength > 0 && new DataView(a.buffer).setUint32(0, r.byteLength, !1), function(e) { for (var t = arguments.length, r = new Array(t > 1 ? t - 1 : 0), i = 1; i < t; i++) r[i - 1] = arguments[i]; for (var n = r.length, a = 8, s = n; s--; ) a += r[s].byteLength; var o = new Uint8Array(a); for (o[0] = a >> 24 & 255, o[1] = a >> 16 & 255, o[2] = a >> 8 & 255, o[3] = 255 & a, o.set(e, 4), s = 0, a = 8; s < n; s++) o.set(r[s], a), a += r[s].byteLength; return o }([112, 115, 115, 104], new Uint8Array([0, 0, 0, 0]), e, n, i, a, r) } function _e(e) { var t = e.getUint32(0) , r = e.byteOffset , i = e.byteLength; if (i < t) return { offset: r, size: i }; if (1886614376 !== e.getUint32(4)) return { offset: r, size: t }; var n = e.getUint32(8) >>> 24; if (0 !== n && 1 !== n) return { offset: r, size: t }; var a = e.buffer , s = X(new Uint8Array(a,r + 12,16)) , o = null , l = 0; if (0 === n) l = 28; else { var u = e.getUint32(28); if (!u || i < 32 + 16 * u) return { offset: r, size: t }; o = []; for (var d = 0; d < u; d++) o.push(new Uint8Array(a,r + 32 + 16 * d,16)); l = 32 + 16 * u } if (!l) return { offset: r, size: t }; var h = e.getUint32(l); return t - 32 < h ? { offset: r, size: t } : { version: n, systemId: s, kids: o, data: new Uint8Array(a,r + l + 4,h), offset: r, size: t } } var Pe = function() { return /\(Windows.+Firefox\//i.test(navigator.userAgent) } , Ce = { audio: { a3ds: 1, "ac-3": .95, "ac-4": 1, alac: .9, alaw: 1, dra1: 1, "dts+": 1, "dts-": 1, dtsc: 1, dtse: 1, dtsh: 1, "ec-3": .9, enca: 1, fLaC: .9, flac: .9, FLAC: .9, g719: 1, g726: 1, m4ae: 1, mha1: 1, mha2: 1, mhm1: 1, mhm2: 1, mlpa: 1, mp4a: 1, "raw ": 1, Opus: 1, opus: 1, samr: 1, sawb: 1, sawp: 1, sevc: 1, sqcp: 1, ssmv: 1, twos: 1, ulaw: 1 }, video: { avc1: 1, avc2: 1, avc3: 1, avc4: 1, avcp: 1, av01: .8, dav1: .8, drac: 1, dva1: 1, dvav: 1, dvh1: .7, dvhe: .7, encv: 1, hev1: .75, hvc1: .75, mjp2: 1, mp4v: 1, mvc1: 1, mvc2: 1, mvc3: 1, mvc4: 1, resv: 1, rv60: 1, s263: 1, svc1: 1, svc2: 1, "vc-1": 1, vp08: 1, vp09: .9 }, text: { stpp: 1, wvtt: 1 } }; function we(e, t) { var r = Ce[t]; return !!r && !!r[e.slice(0, 4)] } function Oe(e, t, r) { return void 0 === r && (r = !0), !e.split(",").some((function(e) { return !xe(e, t, r) } )) } function xe(e, t, r) { var i; void 0 === r && (r = !0); var n = W(r); return null != (i = null == n ? void 0 : n.isTypeSupported(Me(e, t))) && i } function Me(e, t) { return t + "/mp4;codecs=" + e } function Fe(e) { if (e) { var t = e.substring(0, 4); return Ce.video[t] } return 2 } function Ne(e) { var t = Pe(); return e.split(",").reduce((function(e, r) { var i = t && Ie(r) ? 9 : Ce.video[r]; return i ? (2 * i + e) / (e ? 3 : 2) : (Ce.audio[r] + e) / (e ? 2 : 1) } ), 0) } var Ue = {} , Be = /flac|opus|mp4a\.40\.34/i; function Ge(e, t) { return void 0 === t && (t = !0), e.replace(Be, (function(e) { return function(e, t) { if (void 0 === t && (t = !0), Ue[e]) return Ue[e]; for (var r = { flac: ["flac", "fLaC", "FLAC"], opus: ["opus", "Opus"], "mp4a.40.34": ["mp3"] }[e], i = 0; i < r.length; i++) { var n; if (xe(r[i], "audio", t)) return Ue[e] = r[i], r[i]; if ("mp3" === r[i] && null != (n = W(t)) && n.isTypeSupported("audio/mpeg")) return "" } return e }(e.toLowerCase(), t) } )) } function Ke(e, t) { if (e && (e.length > 4 || -1 !== ["ac-3", "ec-3", "alac", "fLaC", "Opus"].indexOf(e)) && (Ve(e, "audio") || Ve(e, "video"))) return e; if (t) { var r = t.split(","); if (r.length > 1) { if (e) for (var i = r.length; i--; ) if (r[i].substring(0, 4) === e.substring(0, 4)) return r[i]; return r[0] } } return t || e } function Ve(e, t) { return we(e, t) && xe(e, t) } function He(e) { if (e.startsWith("av01.")) { for (var t = e.split("."), r = ["0", "111", "01", "01", "01", "0"], i = t.length; i > 4 && i < 10; i++) t[i] = r[i - 4]; return t.join(".") } return e } function Ye(e) { var t = W(e) || { isTypeSupported: function() { return !1 } }; return { mpeg: t.isTypeSupported("audio/mpeg"), mp3: t.isTypeSupported('audio/mp4; codecs="mp3"'), ac3: t.isTypeSupported('audio/mp4; codecs="ac-3"') } } function We(e) { return e.replace(/^.+codecs=["']?([^"']+).*$/, "$1") } var je = { supported: !1, smooth: !1, powerEfficient: !1 } , qe = { supported: !0, configurations: [], decodingInfoResults: [{ supported: !0, powerEfficient: !0, smooth: !0 }] }; function Xe(e, t) { return { supported: !1, configurations: t, decodingInfoResults: [je], error: e } } function Qe(e, t, r, i) { void 0 === i && (i = {}); var n = e.videoCodec; if (!n && !e.audioCodec || !r) return Promise.resolve(qe); for (var a = [], s = function(e) { var t, r = null == (t = e.videoCodec) ? void 0 : t.split(","), i = $e(e), n = e.width || 640, a = e.height || 480, s = e.frameRate || 30, o = e.videoRange.toLowerCase(); return r ? r.map((function(e) { var t = { contentType: Me(He(e), "video"), width: n, height: a, bitrate: i, framerate: s }; return "sdr" !== o && (t.transferFunction = o), t } )) : [] }(e), o = s.length, l = function(e, t, r) { var i, n = null == (i = e.audioCodec) ? void 0 : i.split(","), a = $e(e); return n && e.audioGroups ? e.audioGroups.reduce((function(e, i) { var s, o = i ? null == (s = t.groups[i]) ? void 0 : s.tracks : null; return o ? o.reduce((function(e, t) { if (t.groupId === i) { var s = parseFloat(t.channels || ""); n.forEach((function(t) { var i = { contentType: Me(t, "audio"), bitrate: r ? ze(t, a) : a }; s && (i.channels = "" + s), e.push(i) } )) } return e } ), e) : e } ), []) : [] }(e, t, o > 0), u = l.length, d = o || 1 * u || 1; d--; ) { var h = { type: "media-source" }; if (o && (h.video = s[d % o]), u) { h.audio = l[d % u]; var f = h.audio.bitrate; h.video && f && (h.video.bitrate -= f) } a.push(h) } if (n) { var c = navigator.userAgent; if (n.split(",").some((function(e) { return Ie(e) } )) && Pe()) return Promise.resolve(Xe(new Error("Overriding Windows Firefox HEVC MediaCapabilities result based on user-agent string: (" + c + ")"), a)) } return Promise.all(a.map((function(e) { var t, n, a, s, o = (n = "", a = (t = e).audio, (s = t.video) && (n += We(s.contentType) + "_r" + s.height + "x" + s.width + "f" + Math.ceil(s.framerate) + (s.transferFunction || "sd") + "_" + Math.ceil(s.bitrate / 1e5)), a && (n += (s ? "_" : "") + We(a.contentType) + "_c" + a.channels), n); return i[o] || (i[o] = r.decodingInfo(e)) } ))).then((function(e) { return { supported: !e.some((function(e) { return !e.supported } )), configurations: a, decodingInfoResults: e } } )).catch((function(e) { return { supported: !1, configurations: a, decodingInfoResults: [], error: e } } )) } function ze(e, t) { if (t <= 1) return 1; var r = 128e3; return "ec-3" === e ? r = 768e3 : "ac-3" === e && (r = 64e4), Math.min(t / 2, r) } function $e(e) { return 1e3 * Math.ceil(Math.max(.9 * e.bitrate, e.averageBitrate) / 1e3) || 1 } var Ze = ["NONE", "TYPE-0", "TYPE-1", null] , Je = ["SDR", "PQ", "HLG"] , et = "" , tt = "YES" , rt = "v2"; function it(e) { var t = e.canSkipUntil , r = e.canSkipDateRanges , i = e.age; return t && i < t / 2 ? r ? rt : tt : et } var nt = function() { function e(e, t, r) { this.msn = void 0, this.part = void 0, this.skip = void 0, this.msn = e, this.part = t, this.skip = r } return e.prototype.addDirectives = function(e) { var t = new self.URL(e); return void 0 !== this.msn && t.searchParams.set("_HLS_msn", this.msn.toString()), void 0 !== this.part && t.searchParams.set("_HLS_part", this.part.toString()), this.skip && t.searchParams.set("_HLS_skip", this.skip), t.href } , e }() , at = function() { function e(e) { if (this._attrs = void 0, this.audioCodec = void 0, this.bitrate = void 0, this.codecSet = void 0, this.url = void 0, this.frameRate = void 0, this.height = void 0, this.id = void 0, this.name = void 0, this.supplemental = void 0, this.videoCodec = void 0, this.width = void 0, this.details = void 0, this.fragmentError = 0, this.loadError = 0, this.loaded = void 0, this.realBitrate = 0, this.supportedPromise = void 0, this.supportedResult = void 0, this._avgBitrate = 0, this._audioGroups = void 0, this._subtitleGroups = void 0, this._urlId = 0, this.url = [e.url], this._attrs = [e.attrs], this.bitrate = e.bitrate, e.details && (this.details = e.details), this.id = e.id || 0, this.name = e.name, this.width = e.width || 0, this.height = e.height || 0, this.frameRate = e.attrs.optionalFloat("FRAME-RATE", 0), this._avgBitrate = e.attrs.decimalInteger("AVERAGE-BANDWIDTH"), this.audioCodec = e.audioCodec, this.videoCodec = e.videoCodec, this.codecSet = [e.videoCodec, e.audioCodec].filter((function(e) { return !!e } )).map((function(e) { return e.substring(0, 4) } )).join(","), "supplemental"in e) { var t; this.supplemental = e.supplemental; var r = null == (t = e.supplemental) ? void 0 : t.videoCodec; r && r !== e.videoCodec && (this.codecSet += "," + r.substring(0, 4)) } this.addGroupId("audio", e.attrs.AUDIO), this.addGroupId("text", e.attrs.SUBTITLES) } var t = e.prototype; return t.hasAudioGroup = function(e) { return st(this._audioGroups, e) } , t.hasSubtitleGroup = function(e) { return st(this._subtitleGroups, e) } , t.addGroupId = function(e, t) { if (t) if ("audio" === e) { var r = this._audioGroups; r || (r = this._audioGroups = []), -1 === r.indexOf(t) && r.push(t) } else if ("text" === e) { var i = this._subtitleGroups; i || (i = this._subtitleGroups = []), -1 === i.indexOf(t) && i.push(t) } } , t.addFallback = function() {} , i(e, [{ key: "maxBitrate", get: function() { return Math.max(this.realBitrate, this.bitrate) } }, { key: "averageBitrate", get: function() { return this._avgBitrate || this.realBitrate || this.bitrate } }, { key: "attrs", get: function() { return this._attrs[0] } }, { key: "codecs", get: function() { return this.attrs.CODECS || "" } }, { key: "pathwayId", get: function() { return this.attrs["PATHWAY-ID"] || "." } }, { key: "videoRange", get: function() { return this.attrs["VIDEO-RANGE"] || "SDR" } }, { key: "score", get: function() { return this.attrs.optionalFloat("SCORE", 0) } }, { key: "uri", get: function() { return this.url[0] || "" } }, { key: "audioGroups", get: function() { return this._audioGroups } }, { key: "subtitleGroups", get: function() { return this._subtitleGroups } }, { key: "urlId", get: function() { return 0 }, set: function(e) {} }, { key: "audioGroupIds", get: function() { return this.audioGroups ? [this.audioGroupId] : void 0 } }, { key: "textGroupIds", get: function() { return this.subtitleGroups ? [this.textGroupId] : void 0 } }, { key: "audioGroupId", get: function() { var e; return null == (e = this.audioGroups) ? void 0 : e[0] } }, { key: "textGroupId", get: function() { var e; return null == (e = this.subtitleGroups) ? void 0 : e[0] } }]) }(); function st(e, t) { return !(!t || !e) && -1 !== e.indexOf(t) } function ot(e, t) { var r = !1 , i = []; if (e && (r = "SDR" !== e, i = [e]), t) { var n = "SDR" !== (i = t.allowedVideoRanges || Je.slice(0)).join("") && !t.videoCodec; (r = void 0 !== t.preferHDR ? t.preferHDR : n && function() { if ("function" == typeof matchMedia) { var e = matchMedia("(dynamic-range: high)") , t = matchMedia("bad query"); if (e.media !== t.media) return !0 === e.matches } return !1 }()) || (i = ["SDR"]) } return { preferHDR: r, allowedVideoRanges: i } } var lt = function(e, t) { return JSON.stringify(e, function(e) { var t = new WeakSet; return function(r, i) { if (e && (i = e(r, i)), "object" == typeof i && null !== i) { if (t.has(i)) return; t.add(i) } return i } }(t)) }; function ut(e, t) { Y.log('[abr] start candidates with "' + e + '" ignored because ' + t) } function dt(e) { return e.reduce((function(e, t) { var r = e.groups[t.groupId]; r || (r = e.groups[t.groupId] = { tracks: [], channels: { 2: 0 }, hasDefault: !1, hasAutoSelect: !1 }), r.tracks.push(t); var i = t.channels || "2"; return r.channels[i] = (r.channels[i] || 0) + 1, r.hasDefault = r.hasDefault || t.default, r.hasAutoSelect = r.hasAutoSelect || t.autoselect, r.hasDefault && (e.hasDefaultAudio = !0), r.hasAutoSelect && (e.hasAutoSelectAudio = !0), e } ), { hasDefaultAudio: !1, hasAutoSelectAudio: !1, groups: {} }) } function ht(e) { if (!e) return e; var t = e; return { lang: t.lang, assocLang: t.assocLang, characteristics: t.characteristics, channels: t.channels, audioCodec: t.audioCodec } } function ft(e, t, r) { if ("attrs"in e) { var i = t.indexOf(e); if (-1 !== i) return i } for (var n = 0; n < t.length; n++) if (ct(e, t[n], r)) return n; return -1 } function ct(e, t, r) { var i, n, a = e.groupId, s = e.name, o = e.lang, l = e.assocLang, u = e.default, d = e.forced; return (void 0 === a || t.groupId === a) && (void 0 === s || t.name === s) && (void 0 === o || (i = o, void 0 === (n = t.lang) && (n = "--"), i.length === n.length ? i === n : i.startsWith(n) || n.startsWith(i))) && (void 0 === o || t.assocLang === l) && (void 0 === u || t.default === u) && (void 0 === d || t.forced === d) && (!("characteristics"in e) || function(e, t) { void 0 === t && (t = ""); var r = e.split(",") , i = t.split(","); return r.length === i.length && !r.some((function(e) { return -1 === i.indexOf(e) } )) }(e.characteristics || "", t.characteristics)) && (void 0 === r || r(e, t)) } function gt(e, t) { var r = e.audioCodec , i = e.channels; return !(void 0 !== r && (t.audioCodec || "").substring(0, 4) !== r.substring(0, 4) || void 0 !== i && i !== (t.channels || "2")) } function vt(e, t, r) { for (var i = t; i > -1; i--) if (r(e[i])) return i; for (var n = t + 1; n < e.length; n++) if (r(e[n])) return n; return -1 } function mt(e, t) { var r; return !!e && e !== (null == (r = t.loadLevelObj) ? void 0 : r.uri) } var pt = function(e) { function t(t) { var r; return (r = e.call(this, "abr", t.logger) || this).hls = void 0, r.lastLevelLoadSec = 0, r.lastLoadedFragLevel = -1, r.firstSelection = -1, r._nextAutoLevel = -1, r.nextAutoLevelKey = "", r.audioTracksByGroup = null, r.codecTiers = null, r.timer = -1, r.fragCurrent = null, r.partCurrent = null, r.bitrateTestDelay = 0, r.rebufferNotice = -1, r.supportedCache = {}, r.bwEstimator = void 0, r._abandonRulesCheck = function(e) { var t, i = r, n = i.fragCurrent, a = i.partCurrent, s = i.hls, o = s.autoLevelEnabled, l = s.media; if (n && l) { var u = performance.now() , d = a ? a.stats : n.stats , h = a ? a.duration : n.duration , f = u - d.loading.start , c = s.minAutoLevel , g = n.level , v = r._nextAutoLevel; if (d.aborted || d.loaded && d.loaded === d.total || g <= c) return r.clearTimer(), void (r._nextAutoLevel = -1); if (o) { var m = v > -1 && v !== g , p = !!e || m; if (p || !l.paused && l.playbackRate && l.readyState) { var y = s.mainForwardBufferInfo; if (p || null !== y) { var E = r.bwEstimator.getEstimateTTFB() , T = Math.abs(l.playbackRate); if (!(f <= Math.max(E, h / (2 * T) * 1e3))) { var S = y ? y.len / T : 0 , L = d.loading.first ? d.loading.first - d.loading.start : -1 , I = d.loaded && L > -1 , R = r.getBwEstimate() , k = s.levels , D = k[g] , _ = Math.max(d.loaded, Math.round(h * (n.bitrate || D.averageBitrate) / 8)) , P = I ? f - L : f; P < 1 && I && (P = Math.min(f, 8 * d.loaded / R)); var C = I ? 1e3 * d.loaded / P : 0 , w = E / 1e3 , O = C ? (_ - d.loaded) / C : 8 * _ / R + w; if (!(O <= S)) { var x, M = C ? 8 * C : R, F = !0 === (null == (t = (null == e ? void 0 : e.details) || r.hls.latestLevelDetails) ? void 0 : t.live), N = r.hls.config.abrBandWidthUpFactor, U = Number.POSITIVE_INFINITY; for (x = g - 1; x > c; x--) { var B = k[x].maxBitrate , G = !k[x].details || F; if ((U = r.getTimeToLoadFrag(w, M, h * B, G)) < Math.min(S, h + w)) break } if (!(U >= O || U > 10 * h)) { I ? r.bwEstimator.sample(f - Math.min(E, L), d.loaded) : r.bwEstimator.sampleTTFB(f); var K = k[x].maxBitrate; r.getBwEstimate() * N > K && r.resetEstimator(K); var V = r.findBestLevel(K, c, x, 0, S, 1, 1); V > -1 && (x = V), r.warn("Fragment " + n.sn + (a ? " part " + a.index : "") + " of level " + g + " is loading too slowly;\n Fragment duration: " + n.duration.toFixed(3) + "\n Time to underbuffer: " + S.toFixed(3) + " s\n Estimated load time for current fragment: " + O.toFixed(3) + " s\n Estimated load time for down switch fragment: " + U.toFixed(3) + " s\n TTFB estimate: " + (0 | L) + " ms\n Current BW estimate: " + (A(R) ? 0 | R : "Unknown") + " bps\n New BW estimate: " + (0 | r.getBwEstimate()) + " bps\n Switching to level " + x + " @ " + (0 | K) + " bps"), s.nextLoadLevel = s.nextAutoLevel = x, r.clearTimer(); var H = function() { if (r.clearTimer(), r.fragCurrent === n && r.hls.loadLevel === x && x > 0) { var e = r.getStarvationDelay(); if (r.warn("Aborting inflight request " + (x > 0 ? "and switching down" : "") + "\n Fragment duration: " + n.duration.toFixed(3) + " s\n Time to underbuffer: " + e.toFixed(3) + " s"), n.abortRequests(), r.fragCurrent = r.partCurrent = null, x > c) { var t = r.findBestLevel(r.hls.levels[c].bitrate, c, x, 0, e, 1, 1); -1 === t && (t = c), r.hls.nextLoadLevel = r.hls.nextAutoLevel = t, r.resetEstimator(r.hls.levels[t].bitrate) } } }; m || O > 2 * U ? H() : r.timer = self.setInterval(H, 1e3 * U), s.trigger(b.FRAG_LOAD_EMERGENCY_ABORTED, { frag: n, part: a, stats: d }) } } } } } } } } , r.hls = t, r.bwEstimator = r.initEstimator(), r.registerListeners(), r } o(t, e); var r = t.prototype; return r.resetEstimator = function(e) { e && (this.log("setting initial bwe to " + e), this.hls.config.abrEwmaDefaultEstimate = e), this.firstSelection = -1, this.bwEstimator = this.initEstimator() } , r.initEstimator = function() { var e = this.hls.config; return new F(e.abrEwmaSlowVoD,e.abrEwmaFastVoD,e.abrEwmaDefaultEstimate) } , r.registerListeners = function() { var e = this.hls; e.on(b.MANIFEST_LOADING, this.onManifestLoading, this), e.on(b.FRAG_LOADING, this.onFragLoading, this), e.on(b.FRAG_LOADED, this.onFragLoaded, this), e.on(b.FRAG_BUFFERED, this.onFragBuffered, this), e.on(b.LEVEL_SWITCHING, this.onLevelSwitching, this), e.on(b.LEVEL_LOADED, this.onLevelLoaded, this), e.on(b.LEVELS_UPDATED, this.onLevelsUpdated, this), e.on(b.MAX_AUTO_LEVEL_UPDATED, this.onMaxAutoLevelUpdated, this), e.on(b.ERROR, this.onError, this) } , r.unregisterListeners = function() { var e = this.hls; e && (e.off(b.MANIFEST_LOADING, this.onManifestLoading, this), e.off(b.FRAG_LOADING, this.onFragLoading, this), e.off(b.FRAG_LOADED, this.onFragLoaded, this), e.off(b.FRAG_BUFFERED, this.onFragBuffered, this), e.off(b.LEVEL_SWITCHING, this.onLevelSwitching, this), e.off(b.LEVEL_LOADED, this.onLevelLoaded, this), e.off(b.LEVELS_UPDATED, this.onLevelsUpdated, this), e.off(b.MAX_AUTO_LEVEL_UPDATED, this.onMaxAutoLevelUpdated, this), e.off(b.ERROR, this.onError, this)) } , r.destroy = function() { this.unregisterListeners(), this.clearTimer(), this.hls = this._abandonRulesCheck = this.supportedCache = null, this.fragCurrent = this.partCurrent = null } , r.onManifestLoading = function(e, t) { this.lastLoadedFragLevel = -1, this.firstSelection = -1, this.lastLevelLoadSec = 0, this.supportedCache = {}, this.fragCurrent = this.partCurrent = null, this.onLevelsUpdated(), this.clearTimer() } , r.onLevelsUpdated = function() { this.lastLoadedFragLevel > -1 && this.fragCurrent && (this.lastLoadedFragLevel = this.fragCurrent.level), this._nextAutoLevel = -1, this.onMaxAutoLevelUpdated(), this.codecTiers = null, this.audioTracksByGroup = null } , r.onMaxAutoLevelUpdated = function() { this.firstSelection = -1, this.nextAutoLevelKey = "" } , r.onFragLoading = function(e, t) { var r, i = t.frag; this.ignoreFragment(i) || (i.bitrateTest || (this.fragCurrent = i, this.partCurrent = null != (r = t.part) ? r : null), this.clearTimer(), this.timer = self.setInterval(this._abandonRulesCheck, 100)) } , r.onLevelSwitching = function(e, t) { this.clearTimer() } , r.onError = function(e, t) { if (!t.fatal) switch (t.details) { case k.BUFFER_ADD_CODEC_ERROR: case k.BUFFER_APPEND_ERROR: this.lastLoadedFragLevel = -1, this.firstSelection = -1; break; case k.FRAG_LOAD_TIMEOUT: var r = t.frag , i = this.fragCurrent , n = this.partCurrent; if (r && i && r.sn === i.sn && r.level === i.level) { var a = performance.now() , s = n ? n.stats : r.stats , o = a - s.loading.start , l = s.loading.first ? s.loading.first - s.loading.start : -1; if (s.loaded && l > -1) { var u = this.bwEstimator.getEstimateTTFB(); this.bwEstimator.sample(o - Math.min(u, l), s.loaded) } else this.bwEstimator.sampleTTFB(o) } } } , r.getTimeToLoadFrag = function(e, t, r, i) { return e + r / t + (i ? e + this.lastLevelLoadSec : 0) } , r.onLevelLoaded = function(e, t) { var r = this.hls.config , i = t.stats.loading , n = i.end - i.first; A(n) && (this.lastLevelLoadSec = n / 1e3), t.details.live ? this.bwEstimator.update(r.abrEwmaSlowLive, r.abrEwmaFastLive) : this.bwEstimator.update(r.abrEwmaSlowVoD, r.abrEwmaFastVoD), this.timer > -1 && this._abandonRulesCheck(t.levelInfo) } , r.onFragLoaded = function(e, t) { var r = t.frag , i = t.part , n = i ? i.stats : r.stats; if (r.type === w && this.bwEstimator.sampleTTFB(n.loading.first - n.loading.start), !this.ignoreFragment(r)) { if (this.clearTimer(), r.level === this._nextAutoLevel && (this._nextAutoLevel = -1), this.firstSelection = -1, this.hls.config.abrMaxWithRealBitrate) { var a = i ? i.duration : r.duration , s = this.hls.levels[r.level] , o = (s.loaded ? s.loaded.bytes : 0) + n.loaded , l = (s.loaded ? s.loaded.duration : 0) + a; s.loaded = { bytes: o, duration: l }, s.realBitrate = Math.round(8 * o / l) } if (r.bitrateTest) { var u = { stats: n, frag: r, part: i, id: r.type }; this.onFragBuffered(b.FRAG_BUFFERED, u), r.bitrateTest = !1 } else this.lastLoadedFragLevel = r.level } } , r.onFragBuffered = function(e, t) { var r = t.frag , i = t.part , n = null != i && i.stats.loaded ? i.stats : r.stats; if (!n.aborted && !this.ignoreFragment(r)) { var a = n.parsing.end - n.loading.start - Math.min(n.loading.first - n.loading.start, this.bwEstimator.getEstimateTTFB()); this.bwEstimator.sample(a, n.loaded), n.bwEstimate = this.getBwEstimate(), r.bitrateTest ? this.bitrateTestDelay = a / 1e3 : this.bitrateTestDelay = 0 } } , r.ignoreFragment = function(e) { return e.type !== w || "initSegment" === e.sn } , r.clearTimer = function() { this.timer > -1 && (self.clearInterval(this.timer), this.timer = -1) } , r.getAutoLevelKey = function() { return this.getBwEstimate() + "_" + this.getStarvationDelay().toFixed(2) } , r.getNextABRAutoLevel = function() { var e = this.fragCurrent , t = this.partCurrent , r = this.hls; if (r.levels.length <= 1) return r.loadLevel; var i = r.maxAutoLevel , n = r.config , a = r.minAutoLevel , s = t ? t.duration : e ? e.duration : 0 , o = this.getBwEstimate() , l = this.getStarvationDelay() , u = n.abrBandWidthFactor , d = n.abrBandWidthUpFactor; if (l) { var h = this.findBestLevel(o, a, i, l, 0, u, d); if (h >= 0) return this.rebufferNotice = -1, h } var f = s ? Math.min(s, n.maxStarvationDelay) : n.maxStarvationDelay; if (!l) { var c = this.bitrateTestDelay; c && (f = (s ? Math.min(s, n.maxLoadingDelay) : n.maxLoadingDelay) - c, this.info("bitrate test took " + Math.round(1e3 * c) + "ms, set first fragment max fetchDuration to " + Math.round(1e3 * f) + " ms"), u = d = 1) } var g = this.findBestLevel(o, a, i, l, f, u, d); if (this.rebufferNotice !== g && (this.rebufferNotice = g, this.info((l ? "rebuffering expected" : "buffer is empty") + ", optimal quality level " + g)), g > -1) return g; var v = r.levels[a] , m = r.loadLevelObj; return m && (null == v ? void 0 : v.bitrate) < m.bitrate ? a : r.loadLevel } , r.getStarvationDelay = function() { var e = this.hls , t = e.media; if (!t) return 1 / 0; var r = t && 0 !== t.playbackRate ? Math.abs(t.playbackRate) : 1 , i = e.mainForwardBufferInfo; return (i ? i.len : 0) / r } , r.getBwEstimate = function() { return this.bwEstimator.canEstimate() ? this.bwEstimator.getEstimate() : this.hls.config.abrEwmaDefaultEstimate } , r.findBestLevel = function(e, t, r, i, n, a, s) { var o, l = this, u = i + n, d = this.lastLoadedFragLevel, h = -1 === d ? this.hls.firstLevel : d, f = this.fragCurrent, c = this.partCurrent, g = this.hls, v = g.levels, m = g.allAudioTracks, p = g.loadLevel, y = g.config; if (1 === v.length) return 0; var E, T = v[h], S = !(null == (o = this.hls.latestLevelDetails) || !o.live), L = -1 === p || -1 === d, I = "SDR", R = (null == T ? void 0 : T.frameRate) || 0, k = y.audioPreference, b = y.videoPreference, D = this.audioTracksByGroup || (this.audioTracksByGroup = dt(m)), _ = -1; if (L) { if (-1 !== this.firstSelection) return this.firstSelection; var P = this.codecTiers || (this.codecTiers = function(e, t, r, i) { return e.slice(r, i + 1).reduce((function(e, r, i) { if (!r.codecSet) return e; var n = r.audioGroups , a = e[r.codecSet]; a || (e[r.codecSet] = a = { minBitrate: 1 / 0, minHeight: 1 / 0, minFramerate: 1 / 0, minIndex: i, maxScore: 0, videoRanges: { SDR: 0 }, channels: { 2: 0 }, hasDefaultAudio: !n, fragmentError: 0 }), a.minBitrate = Math.min(a.minBitrate, r.bitrate); var s = Math.min(r.height, r.width); return a.minHeight = Math.min(a.minHeight, s), a.minFramerate = Math.min(a.minFramerate, r.frameRate), a.minIndex = Math.min(a.minIndex, i), a.maxScore = Math.max(a.maxScore, r.score), a.fragmentError += r.fragmentError, a.videoRanges[r.videoRange] = (a.videoRanges[r.videoRange] || 0) + 1, n && n.forEach((function(e) { if (e) { var r = t.groups[e]; r && (a.hasDefaultAudio = a.hasDefaultAudio || t.hasDefaultAudio ? r.hasDefault : r.hasAutoSelect || !t.hasDefaultAudio && !t.hasAutoSelectAudio, Object.keys(r.channels).forEach((function(e) { a.channels[e] = (a.channels[e] || 0) + r.channels[e] } ))) } } )), e } ), {}) }(v, D, t, r)) , C = function(e, t, r, i, n) { for (var a = Object.keys(e), s = null == i ? void 0 : i.channels, o = null == i ? void 0 : i.audioCodec, l = null == n ? void 0 : n.videoCodec, u = s && 2 === parseInt(s), d = !1, h = !1, f = 1 / 0, c = 1 / 0, g = 1 / 0, v = 1 / 0, m = 0, p = [], y = ot(t, n), E = y.preferHDR, T = y.allowedVideoRanges, S = function() { var t = e[a[L]]; d || (d = t.channels[2] > 0), f = Math.min(f, t.minHeight), c = Math.min(c, t.minFramerate), g = Math.min(g, t.minBitrate), T.filter((function(e) { return t.videoRanges[e] > 0 } )).length > 0 && (h = !0) }, L = a.length; L--; ) S(); f = A(f) ? f : 0, c = A(c) ? c : 0; var I = Math.max(1080, f) , R = Math.max(30, c); g = A(g) ? g : r, r = Math.max(g, r), h || (t = void 0); var k = a.length > 1; return { codecSet: a.reduce((function(t, i) { var n = e[i]; if (i === t) return t; if (p = h ? T.filter((function(e) { return n.videoRanges[e] > 0 } )) : [], k) { if (n.minBitrate > r) return ut(i, "min bitrate of " + n.minBitrate + " > current estimate of " + r), t; if (!n.hasDefaultAudio) return ut(i, "no renditions with default or auto-select sound found"), t; if (o && i.indexOf(o.substring(0, 4)) % 5 != 0) return ut(i, 'audio codec preference "' + o + '" not found'), t; if (s && !u) { if (!n.channels[s]) return ut(i, "no renditions with " + s + " channel sound found (channels options: " + Object.keys(n.channels) + ")"), t } else if ((!o || u) && d && 0 === n.channels[2]) return ut(i, "no renditions with stereo sound found"), t; if (n.minHeight > I) return ut(i, "min resolution of " + n.minHeight + " > maximum of " + I), t; if (n.minFramerate > R) return ut(i, "min framerate of " + n.minFramerate + " > maximum of " + R), t; if (!p.some((function(e) { return n.videoRanges[e] > 0 } ))) return ut(i, "no variants with VIDEO-RANGE of " + lt(p) + " found"), t; if (l && i.indexOf(l.substring(0, 4)) % 5 != 0) return ut(i, 'video codec preference "' + l + '" not found'), t; if (n.maxScore < m) return ut(i, "max score of " + n.maxScore + " < selected max of " + m), t } return t && (Ne(i) >= Ne(t) || n.fragmentError > e[t].fragmentError) ? t : (v = n.minIndex, m = n.maxScore, i) } ), void 0), videoRanges: p, preferHDR: E, minFramerate: c, minBitrate: g, minIndex: v } }(P, I, e, k, b) , w = C.codecSet , O = C.videoRanges , x = C.minFramerate , M = C.minBitrate , F = C.minIndex , N = C.preferHDR; _ = F, E = w, I = N ? O[O.length - 1] : O[0], R = x, e = Math.max(e, M), this.log("picked start tier " + lt(C)) } else E = null == T ? void 0 : T.codecSet, I = null == T ? void 0 : T.videoRange; for (var U, B = c ? c.duration : f ? f.duration : 0, G = this.bwEstimator.getEstimateTTFB() / 1e3, K = [], V = function() { var t, o = v[H], f = H > h; if (!o) return 0; if (y.useMediaCapabilities && !o.supportedResult && !o.supportedPromise) { var g = navigator.mediaCapabilities; "function" == typeof (null == g ? void 0 : g.decodingInfo) && function(e, t, r, i, n, a) { var s = e.videoCodec , o = e.audioCodec ? e.audioGroups : null , l = null == a ? void 0 : a.audioCodec , u = null == a ? void 0 : a.channels , d = u ? parseInt(u) : l ? 1 / 0 : 2 , h = null; if (null != o && o.length) try { h = 1 === o.length && o[0] ? t.groups[o[0]].channels : o.reduce((function(e, r) { if (r) { var i = t.groups[r]; if (!i) throw new Error("Audio track group " + r + " not found"); Object.keys(i.channels).forEach((function(t) { e[t] = (e[t] || 0) + i.channels[t] } )) } return e } ), { 2: 0 }) } catch (e) { return !0 } return void 0 !== s && (s.split(",").some((function(e) { return Ie(e) } )) || e.width > 1920 && e.height > 1088 || e.height > 1920 && e.width > 1088 || e.frameRate > Math.max(i, 30) || "SDR" !== e.videoRange && e.videoRange !== r || e.bitrate > Math.max(n, 8e6)) || !!h && A(d) && Object.keys(h).some((function(e) { return parseInt(e) > d } )) }(o, D, I, R, e, k) ? (o.supportedPromise = Qe(o, D, g, l.supportedCache), o.supportedPromise.then((function(e) { if (l.hls) { o.supportedResult = e; var t = l.hls.levels , r = t.indexOf(o); e.error ? l.warn('MediaCapabilities decodingInfo error: "' + e.error + '" for level ' + r + " " + lt(e)) : e.supported ? e.decodingInfoResults.some((function(e) { return !1 === e.smooth || !1 === e.powerEfficient } )) && l.log("MediaCapabilities decodingInfo for level " + r + " not smooth or powerEfficient: " + lt(e)) : (l.warn("Unsupported MediaCapabilities decodingInfo result for level " + r + " " + lt(e)), r > -1 && t.length > 1 && (l.log("Removing unsupported level " + r), l.hls.removeLevel(r), -1 === l.hls.loadLevel && (l.hls.nextLoadLevel = 0))) } } )).catch((function(e) { l.warn("Error handling MediaCapabilities decodingInfo: " + e) } ))) : o.supportedResult = qe } if ((E && o.codecSet !== E || I && o.videoRange !== I || f && R > o.frameRate || !f && R > 0 && R < o.frameRate || null != (t = o.supportedResult) && null != (t = t.decodingInfoResults) && t.some((function(e) { return !1 === e.smooth } ))) && (!L || H !== _)) return K.push(H), 0; var m, T = o.details, b = (c ? null == T ? void 0 : T.partTarget : null == T ? void 0 : T.averagetargetduration) || B; m = f ? s * e : a * e; var P = B && i >= 2 * B && 0 === n ? o.averageBitrate : o.maxBitrate , C = l.getTimeToLoadFrag(G, m, P * b, void 0 === T); if (m >= P && (H === d || 0 === o.loadError && 0 === o.fragmentError) && (C <= G || !A(C) || S && !l.bitrateTestDelay || C < u)) { var w = l.forcedAutoLevel; return H === p || -1 !== w && w === p || (K.length && l.trace("Skipped level(s) " + K.join(",") + " of " + r + ' max with CODECS and VIDEO-RANGE:"' + v[K[0]].codecs + '" ' + v[K[0]].videoRange + '; not compatible with "' + E + '" ' + I), l.info("switch candidate:" + h + "->" + H + " adjustedbw(" + Math.round(m) + ")-bitrate=" + Math.round(m - P) + " ttfb:" + G.toFixed(1) + " avgDuration:" + b.toFixed(1) + " maxFetchDuration:" + u.toFixed(1) + " fetchDuration:" + C.toFixed(1) + " firstSelection:" + L + " codecSet:" + o.codecSet + " videoRange:" + o.videoRange + " hls.loadLevel:" + p)), L && (l.firstSelection = H), { v: H } } }, H = r; H >= t; H--) if (0 !== (U = V()) && U) return U.v; return -1 } , r.deriveNextAutoLevel = function(e) { var t = this.hls , r = t.maxAutoLevel , i = t.minAutoLevel; return Math.min(Math.max(e, i), r) } , i(t, [{ key: "firstAutoLevel", get: function() { var e = this.hls , t = e.maxAutoLevel , r = e.minAutoLevel , i = this.getBwEstimate() , n = this.hls.config.maxStarvationDelay , a = this.findBestLevel(i, r, t, 0, n, 1, 1); if (a > -1) return a; var s = this.hls.firstLevel , o = Math.min(Math.max(s, r), t); return this.warn("Could not find best starting auto level. Defaulting to first in playlist " + s + " clamped to " + o), o } }, { key: "forcedAutoLevel", get: function() { return this.nextAutoLevelKey ? -1 : this._nextAutoLevel } }, { key: "nextAutoLevel", get: function() { var e = this.forcedAutoLevel , t = this.bwEstimator.canEstimate() , r = this.lastLoadedFragLevel > -1; if (!(-1 === e || t && r && this.nextAutoLevelKey !== this.getAutoLevelKey())) return e; var i = t && r ? this.getNextABRAutoLevel() : this.firstAutoLevel; if (-1 !== e) { var n = this.hls.levels; if (n.length > Math.max(e, i) && n[e].loadError <= n[i].loadError) return e } return this._nextAutoLevel = i, this.nextAutoLevelKey = this.getAutoLevelKey(), i }, set: function(e) { var t = this.deriveNextAutoLevel(e); this._nextAutoLevel !== t && (this.nextAutoLevelKey = "", this._nextAutoLevel = t) } }]) }(N) , yt = function(e, t) { for (var r = 0, i = e.length - 1, n = null, a = null; r <= i; ) { var s = t(a = e[n = (r + i) / 2 | 0]); if (s > 0) r = n + 1; else { if (!(s < 0)) return a; i = n - 1 } } return null }; function Et(e, t, r, i, n) { void 0 === r && (r = 0), void 0 === i && (i = 0), void 0 === n && (n = .005); var a = null; if (e) { a = t[1 + e.sn - t[0].sn] || null; var s = e.endDTS - r; s > 0 && s < 15e-7 && (r += 15e-7), a && e.level !== a.level && a.end <= e.end && (a = t[2 + e.sn - t[0].sn] || null) } else 0 === r && 0 === t[0].start && (a = t[0]); if (a && ((!e || e.level === a.level) && 0 === Tt(r, i, a) || function(e, t, r) { if (t && 0 === t.start && t.level < e.level && (t.endPTS || 0) > 0) { var i = t.tagList.reduce((function(e, t) { return "INF" === t[0] && (e += parseFloat(t[1])), e } ), r); return e.start <= i } return !1 }(a, e, Math.min(n, i)))) return a; var o = yt(t, Tt.bind(null, r, i)); return !o || o === e && a ? a : o } function Tt(e, t, r) { if (void 0 === e && (e = 0), void 0 === t && (t = 0), r.start <= e && r.start + r.duration > e) return 0; var i = Math.min(t, r.duration + (r.deltaPTS ? r.deltaPTS : 0)); return r.start + r.duration - i <= e ? 1 : r.start - i > e && r.start ? -1 : 0 } function St(e, t, r) { var i = 1e3 * Math.min(t, r.duration + (r.deltaPTS ? r.deltaPTS : 0)); return (r.endProgramDateTime || 0) - i > e } function At(e, t, r) { if (e && e.startCC <= t && e.endCC >= t) { var i, n = e.fragments, a = e.fragmentHint; return a && (n = n.concat(a)), yt(n, (function(e) { return e.cc < t ? 1 : e.cc > t ? -1 : (i = e, e.end <= r ? 1 : e.start > r ? -1 : 0) } )), i || null } return null } function Lt(e) { switch (e.details) { case k.FRAG_LOAD_TIMEOUT: case k.KEY_LOAD_TIMEOUT: case k.LEVEL_LOAD_TIMEOUT: case k.MANIFEST_LOAD_TIMEOUT: return !0 } return !1 } function It(e) { return e.details.startsWith("key") } function Rt(e) { return It(e) && !!e.frag && !e.frag.decryptdata } function kt(e, t) { var r = Lt(t); return e.default[(r ? "timeout" : "error") + "Retry"] } function bt(e, t) { var r = "linear" === e.backoff ? 1 : Math.pow(2, t); return Math.min(r * e.retryDelayMs, e.maxRetryDelayMs) } function Dt(e) { return d(d({}, e), { errorRetry: null, timeoutRetry: null }) } function _t(e, t, r, i) { if (!e) return !1; var n = null == i ? void 0 : i.code , a = t < e.maxNumRetry && (function(e) { return Pt(e) || !!e && (e < 400 || e > 499) }(n) || !!r); return e.shouldRetry ? e.shouldRetry(e, t, r, i, a) : a } function Pt(e) { return 0 === e && !1 === navigator.onLine } var Ct = 0 , wt = 2 , Ot = 3 , xt = 5 , Mt = 0 , Ft = 1 , Nt = 2 , Ut = 4 , Bt = function(e) { function t(t) { var r; return (r = e.call(this, "error-controller", t.logger) || this).hls = void 0, r.playlistError = 0, r.hls = t, r.registerListeners(), r } o(t, e); var r = t.prototype; return r.registerListeners = function() { var e = this.hls; e.on(b.ERROR, this.onError, this), e.on(b.MANIFEST_LOADING, this.onManifestLoading, this), e.on(b.LEVEL_UPDATED, this.onLevelUpdated, this) } , r.unregisterListeners = function() { var e = this.hls; e && (e.off(b.ERROR, this.onError, this), e.off(b.ERROR, this.onErrorOut, this), e.off(b.MANIFEST_LOADING, this.onManifestLoading, this), e.off(b.LEVEL_UPDATED, this.onLevelUpdated, this)) } , r.destroy = function() { this.unregisterListeners(), this.hls = null } , r.startLoad = function(e) {} , r.stopLoad = function() { this.playlistError = 0 } , r.getVariantLevelIndex = function(e) { return (null == e ? void 0 : e.type) === w ? e.level : this.getVariantIndex() } , r.getVariantIndex = function() { var e, t = this.hls, r = t.currentLevel; return null != (e = t.loadLevelObj) && e.details || -1 === r ? t.loadLevel : r } , r.variantHasKey = function(e, t) { if (e) { var r; if (null != (r = e.details) && r.hasKey(t)) return !0; var i = e.audioGroups; if (i) return this.hls.allAudioTracks.filter((function(e) { return i.indexOf(e.groupId) >= 0 } )).some((function(e) { var r; return null == (r = e.details) ? void 0 : r.hasKey(t) } )) } return !1 } , r.onManifestLoading = function() { this.playlistError = 0 } , r.onLevelUpdated = function() { this.playlistError = 0 } , r.onError = function(e, t) { var r; if (!t.fatal) { var i = this.hls , n = t.context; switch (t.details) { case k.FRAG_LOAD_ERROR: case k.FRAG_LOAD_TIMEOUT: case k.KEY_LOAD_ERROR: case k.KEY_LOAD_TIMEOUT: return void (t.errorAction = this.getFragRetryOrSwitchAction(t)); case k.FRAG_PARSING_ERROR: if (null != (r = t.frag) && r.gap) return void (t.errorAction = Gt()); case k.FRAG_GAP: case k.FRAG_DECRYPT_ERROR: return t.errorAction = this.getFragRetryOrSwitchAction(t), void (t.errorAction.action = wt); case k.LEVEL_EMPTY_ERROR: case k.LEVEL_PARSING_ERROR: var a, s = t.parent === w ? t.level : i.loadLevel; return void (t.details === k.LEVEL_EMPTY_ERROR && null != (a = t.context) && null != (a = a.levelDetails) && a.live ? t.errorAction = this.getPlaylistRetryOrSwitchAction(t, s) : (t.levelRetry = !1, t.errorAction = this.getLevelSwitchAction(t, s))); case k.LEVEL_LOAD_ERROR: case k.LEVEL_LOAD_TIMEOUT: return void ("number" == typeof (null == n ? void 0 : n.level) && (t.errorAction = this.getPlaylistRetryOrSwitchAction(t, n.level))); case k.AUDIO_TRACK_LOAD_ERROR: case k.AUDIO_TRACK_LOAD_TIMEOUT: case k.SUBTITLE_LOAD_ERROR: case k.SUBTITLE_TRACK_LOAD_TIMEOUT: if (n) { var o = i.loadLevelObj; if (o && (n.type === P && o.hasAudioGroup(n.groupId) || n.type === C && o.hasSubtitleGroup(n.groupId))) return t.errorAction = this.getPlaylistRetryOrSwitchAction(t, i.loadLevel), t.errorAction.action = wt, void (t.errorAction.flags = Ft) } return; case k.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED: return void (t.errorAction = { action: wt, flags: Nt }); case k.KEY_SYSTEM_SESSION_UPDATE_FAILED: case k.KEY_SYSTEM_STATUS_INTERNAL_ERROR: case k.KEY_SYSTEM_NO_SESSION: return void (t.errorAction = { action: wt, flags: Ut }); case k.BUFFER_ADD_CODEC_ERROR: case k.REMUX_ALLOC_ERROR: case k.BUFFER_APPEND_ERROR: var l; return void (t.errorAction || (t.errorAction = this.getLevelSwitchAction(t, null != (l = t.level) ? l : i.loadLevel))); case k.INTERNAL_EXCEPTION: case k.BUFFER_APPENDING_ERROR: case k.BUFFER_FULL_ERROR: case k.LEVEL_SWITCH_ERROR: case k.BUFFER_STALLED_ERROR: case k.BUFFER_SEEK_OVER_HOLE: case k.BUFFER_NUDGE_ON_STALL: return void (t.errorAction = Gt()) } t.type === R.KEY_SYSTEM_ERROR && (t.levelRetry = !1, t.errorAction = Gt()) } } , r.getPlaylistRetryOrSwitchAction = function(e, t) { var r = kt(this.hls.config.playlistLoadPolicy, e) , i = this.playlistError++; if (_t(r, i, Lt(e), e.response)) return { action: xt, flags: Mt, retryConfig: r, retryCount: i }; var n = this.getLevelSwitchAction(e, t); return r && (n.retryConfig = r, n.retryCount = i), n } , r.getFragRetryOrSwitchAction = function(e) { var t = this.hls , r = this.getVariantLevelIndex(e.frag) , i = t.levels[r] , n = t.config , a = n.fragLoadPolicy , s = n.keyLoadPolicy , o = kt(It(e) ? s : a, e) , l = t.levels.reduce((function(e, t) { return e + t.fragmentError } ), 0); if (i && (e.details !== k.FRAG_GAP && i.fragmentError++, !Rt(e) && _t(o, l, Lt(e), e.response))) return { action: xt, flags: Mt, retryConfig: o, retryCount: l }; var u = this.getLevelSwitchAction(e, r); return o && (u.retryConfig = o, u.retryCount = l), u } , r.getLevelSwitchAction = function(e, t) { var r = this.hls; null == t && (t = r.loadLevel); var i = this.hls.levels[t]; if (i) { var n, a, s = e.details; i.loadError++, s === k.BUFFER_APPEND_ERROR && i.fragmentError++; var o = -1 , l = r.levels , u = r.loadLevel , d = r.minAutoLevel , h = r.maxAutoLevel; r.autoLevelEnabled || r.config.preserveManualLevelOnError || (r.loadLevel = -1); for (var f, c = null == (n = e.frag) ? void 0 : n.type, g = (c === O && s === k.FRAG_PARSING_ERROR || "audio" === e.sourceBufferName && (s === k.BUFFER_ADD_CODEC_ERROR || s === k.BUFFER_APPEND_ERROR)) && l.some((function(e) { var t = e.audioCodec; return i.audioCodec !== t } )), v = "video" === e.sourceBufferName && (s === k.BUFFER_ADD_CODEC_ERROR || s === k.BUFFER_APPEND_ERROR) && l.some((function(e) { var t = e.codecSet , r = e.audioCodec; return i.codecSet !== t && i.audioCodec === r } )), m = null != (a = e.context) ? a : {}, p = m.type, y = m.groupId, E = function() { var t = (T + u) % l.length; if (t !== u && t >= d && t <= h && 0 === l[t].loadError) { var r, n, a = l[t]; if (s === k.FRAG_GAP && c === w && e.frag) { var f = l[t].details; if (f) { var m = Et(e.frag, f.fragments, e.frag.start); if (null != m && m.gap) return 0 } } else { if (p === P && a.hasAudioGroup(y) || p === C && a.hasSubtitleGroup(y)) return 0; if (c === O && null != (r = i.audioGroups) && r.some((function(e) { return a.hasAudioGroup(e) } )) || c === x && null != (n = i.subtitleGroups) && n.some((function(e) { return a.hasSubtitleGroup(e) } )) || g && i.audioCodec === a.audioCodec || v && i.codecSet === a.codecSet || !g && i.codecSet !== a.codecSet) return 0 } return o = t, 1 } }, T = l.length; T-- && (0 === (f = E()) || 1 !== f); ) ; if (o > -1 && r.loadLevel !== o) return e.levelRetry = !0, this.playlistError = 0, { action: wt, flags: Mt, nextAutoLevel: o } } return { action: wt, flags: Ft } } , r.onErrorOut = function(e, t) { var r; switch (null == (r = t.errorAction) ? void 0 : r.action) { case Ct: break; case wt: this.sendAlternateToPenaltyBox(t), t.errorAction.resolved || t.details === k.FRAG_GAP ? /MediaSource readyState: ended/.test(t.error.message) && (this.warn('MediaSource ended after "' + t.sourceBufferName + '" sourceBuffer append error. Attempting to recover from media error.'), this.hls.recoverMediaError()) : t.fatal = !0 } t.fatal && this.hls.stopLoad() } , r.sendAlternateToPenaltyBox = function(e) { var t = this.hls , r = e.errorAction; if (r) { var i = r.flags , n = r.nextAutoLevel; switch (i) { case Mt: this.switchLevel(e, n); break; case Nt: var a = this.getVariantLevelIndex(e.frag) , s = t.levels[a] , o = null == s ? void 0 : s.attrs["HDCP-LEVEL"]; if (r.hdcpLevel = o, "NONE" === o) this.warn("HDCP policy resticted output with HDCP-LEVEL=NONE"); else if (o) { t.maxHdcpLevel = Ze[Ze.indexOf(o) - 1], r.resolved = !0, this.warn('Restricting playback to HDCP-LEVEL of "' + t.maxHdcpLevel + '" or lower'); break } case Ut: var l = e.decryptdata; if (l) { for (var u = this.hls.levels, d = u.length, h = d; h--; ) { var f, c; this.variantHasKey(u[h], l) && (this.log("Banned key found in level " + h + " (" + u[h].bitrate + 'bps) or audio group "' + (null == (f = u[h].audioGroups) ? void 0 : f.join(",")) + '" (' + (null == (c = e.frag) ? void 0 : c.type) + " fragment) " + X(l.keyId || [])), u[h].fragmentError++, u[h].loadError++, this.log("Removing level " + h + " with key error (" + e.error + ")"), this.hls.removeLevel(h)) } var g = e.frag; if (this.hls.levels.length < d) r.resolved = !0; else if (g && g.type !== w) { var v = g.decryptdata; v && !l.matches(v) && (r.resolved = !0) } } } r.resolved || this.switchLevel(e, n) } } , r.switchLevel = function(e, t) { if (void 0 !== t && e.errorAction && (this.warn("switching to level " + t + " after " + e.details), this.hls.nextAutoLevel = t, e.errorAction.resolved = !0, this.hls.nextLoadLevel = this.hls.nextAutoLevel, e.details === k.BUFFER_ADD_CODEC_ERROR && e.mimeType && "audiovideo" !== e.sourceBufferName)) for (var r = We(e.mimeType), i = this.hls.levels, n = i.length; n--; ) i[n][e.sourceBufferName + "Codec"] === r && (this.log("Removing level " + n + " for " + e.details + ' ("' + r + '" not supported)'), this.hls.removeLevel(n)) } , t }(N); function Gt(e) { var t = { action: Ct, flags: Mt }; return e && (t.resolved = !0), t } var Kt = "NOT_LOADED" , Vt = "APPENDING" , Ht = "PARTIAL" , Yt = "OK" , Wt = function() { function e(e) { this.activePartLists = Object.create(null), this.endListFragments = Object.create(null), this.fragments = Object.create(null), this.timeRanges = Object.create(null), this.bufferPadding = .2, this.hls = void 0, this.hasGaps = !1, this.hls = e, this._registerListeners() } var t = e.prototype; return t._registerListeners = function() { var e = this.hls; e && (e.on(b.MANIFEST_LOADING, this.onManifestLoading, this), e.on(b.BUFFER_APPENDED, this.onBufferAppended, this), e.on(b.FRAG_BUFFERED, this.onFragBuffered, this), e.on(b.FRAG_LOADED, this.onFragLoaded, this)) } , t._unregisterListeners = function() { var e = this.hls; e && (e.off(b.MANIFEST_LOADING, this.onManifestLoading, this), e.off(b.BUFFER_APPENDED, this.onBufferAppended, this), e.off(b.FRAG_BUFFERED, this.onFragBuffered, this), e.off(b.FRAG_LOADED, this.onFragLoaded, this)) } , t.destroy = function() { this._unregisterListeners(), this.hls = this.fragments = this.activePartLists = this.endListFragments = this.timeRanges = null } , t.getAppendedFrag = function(e, t) { var r = this.activePartLists[t]; if (r) for (var i = r.length; i--; ) { var n = r[i]; if (!n) break; if (n.start <= e && e <= n.end && n.loaded) return n } return this.getBufferedFrag(e, t) } , t.getBufferedFrag = function(e, t) { return this.getFragAtPos(e, t, !0) } , t.getFragAtPos = function(e, t, r) { for (var i = this.fragments, n = Object.keys(i), a = n.length; a--; ) { var s = i[n[a]]; if ((null == s ? void 0 : s.body.type) === t && (!r || s.buffered)) { var o = s.body; if (o.start <= e && e <= o.end) return o } } return null } , t.detectEvictedFragments = function(e, t, r, i, n) { var a = this; this.timeRanges && (this.timeRanges[e] = t); var s = (null == i ? void 0 : i.fragment.sn) || -1; Object.keys(this.fragments).forEach((function(i) { var o = a.fragments[i]; if (o && !(s >= o.body.sn)) if (o.buffered || o.loaded && !n) { var l = o.range[e]; l && (0 !== l.time.length ? l.time.some((function(e) { var r = !a.isTimeBuffered(e.startPTS, e.endPTS, t); return r && a.removeFragment(o.body), r } )) : a.removeFragment(o.body)) } else o.body.type === r && a.removeFragment(o.body) } )) } , t.detectPartialFragments = function(e) { var t = this , r = this.timeRanges; if (r && "initSegment" !== e.frag.sn) { var i = e.frag , n = qt(i) , a = this.fragments[n]; if (!(!a || a.buffered && i.gap)) { var s = !i.relurl; Object.keys(r).forEach((function(n) { var o = i.elementaryStreams[n]; if (o) { var l = r[n] , u = s || !0 === o.partial; a.range[n] = t.getBufferedTimes(i, e.part, u, l) } } )), a.loaded = null, Object.keys(a.range).length ? (a.buffered = !0, (a.body.endList = i.endList || a.body.endList) && (this.endListFragments[a.body.type] = a), jt(a) || this.removeParts(i.sn - 1, i.type)) : this.removeFragment(a.body) } } } , t.removeParts = function(e, t) { var r = this.activePartLists[t]; r && (this.activePartLists[t] = Xt(r, (function(t) { return t.fragment.sn >= e } ))) } , t.fragBuffered = function(e, t) { var r = qt(e) , i = this.fragments[r]; !i && t && (i = this.fragments[r] = { body: e, appendedPTS: null, loaded: null, buffered: !1, range: Object.create(null) }, e.gap && (this.hasGaps = !0)), i && (i.loaded = null, i.buffered = !0) } , t.getBufferedTimes = function(e, t, r, i) { for (var n = { time: [], partial: r }, a = e.start, s = e.end, o = e.minEndPTS || s, l = e.maxStartPTS || a, u = 0; u < i.length; u++) { var d = i.start(u) - this.bufferPadding , h = i.end(u) + this.bufferPadding; if (l >= d && o <= h) { n.time.push({ startPTS: Math.max(a, i.start(u)), endPTS: Math.min(s, i.end(u)) }); break } if (a < h && s > d) { var f = Math.max(a, i.start(u)) , c = Math.min(s, i.end(u)); c > f && (n.partial = !0, n.time.push({ startPTS: f, endPTS: c })) } else if (s <= d) break } return n } , t.getPartialFragment = function(e) { var t, r, i, n = null, a = 0, s = this.bufferPadding, o = this.fragments; return Object.keys(o).forEach((function(l) { var u = o[l]; u && jt(u) && (r = u.body.start - s, i = u.body.end + s, e >= r && e <= i && (t = Math.min(e - r, i - e), a <= t && (n = u.body, a = t))) } )), n } , t.isEndListAppended = function(e) { var t = this.endListFragments[e]; return void 0 !== t && (t.buffered || jt(t)) } , t.getState = function(e) { var t = qt(e) , r = this.fragments[t]; return r ? r.buffered ? jt(r) ? Ht : Yt : Vt : Kt } , t.isTimeBuffered = function(e, t, r) { for (var i, n, a = 0; a < r.length; a++) { if (i = r.start(a) - this.bufferPadding, n = r.end(a) + this.bufferPadding, e >= i && t <= n) return !0; if (t <= i) return !1 } return !1 } , t.onManifestLoading = function() { this.removeAllFragments() } , t.onFragLoaded = function(e, t) { if ("initSegment" !== t.frag.sn && !t.frag.bitrateTest) { var r = t.frag , i = t.part ? null : t , n = qt(r); this.fragments[n] = { body: r, appendedPTS: null, loaded: i, buffered: !1, range: Object.create(null) } } } , t.onBufferAppended = function(e, t) { var r = t.frag , i = t.part , n = t.timeRanges , a = t.type; if ("initSegment" !== r.sn) { var s = r.type; if (i) { var o = this.activePartLists[s]; o || (this.activePartLists[s] = o = []), o.push(i) } this.timeRanges = n; var l = n[a]; this.detectEvictedFragments(a, l, s, i) } } , t.onFragBuffered = function(e, t) { this.detectPartialFragments(t) } , t.hasFragment = function(e) { var t = qt(e); return !!this.fragments[t] } , t.hasFragments = function(e) { var t = this.fragments , r = Object.keys(t); if (!e) return r.length > 0; for (var i = r.length; i--; ) { var n = t[r[i]]; if ((null == n ? void 0 : n.body.type) === e) return !0 } return !1 } , t.hasParts = function(e) { var t; return !(null == (t = this.activePartLists[e]) || !t.length) } , t.removeFragmentsInRange = function(e, t, r, i, n) { var a = this; i && !this.hasGaps || Object.keys(this.fragments).forEach((function(s) { var o = a.fragments[s]; if (o) { var l = o.body; l.type !== r || i && !l.gap || l.start < t && l.end > e && (o.buffered || n) && a.removeFragment(l) } } )) } , t.removeFragment = function(e) { var t = qt(e); e.clearElementaryStreamInfo(); var r = this.activePartLists[e.type]; if (r) { var i = e.sn; this.activePartLists[e.type] = Xt(r, (function(e) { return e.fragment.sn !== i } )) } delete this.fragments[t], e.endList && delete this.endListFragments[e.type] } , t.removeAllFragments = function() { var e; this.fragments = Object.create(null), this.endListFragments = Object.create(null), this.activePartLists = Object.create(null), this.hasGaps = !1; var t = null == (e = this.hls) || null == (e = e.latestLevelDetails) ? void 0 : e.partList; t && t.forEach((function(e) { return e.clearElementaryStreamInfo() } )) } , e }(); function jt(e) { var t, r, i; return e.buffered && !!(e.body.gap || null != (t = e.range.video) && t.partial || null != (r = e.range.audio) && r.partial || null != (i = e.range.audiovideo) && i.partial) } function qt(e) { return e.type + "_" + e.level + "_" + e.sn } function Xt(e, t) { return e.filter((function(e) { var r = t(e); return r || e.clearElementaryStreamInfo(), r } )) } var Qt = 0 , zt = 1 , $t = function() { function e(e, t, r) { this.subtle = void 0, this.aesIV = void 0, this.aesMode = void 0, this.subtle = e, this.aesIV = t, this.aesMode = r } return e.prototype.decrypt = function(e, t) { switch (this.aesMode) { case Qt: return this.subtle.decrypt({ name: "AES-CBC", iv: this.aesIV }, t, e); case zt: return this.subtle.decrypt({ name: "AES-CTR", counter: this.aesIV, length: 64 }, t, e); default: throw new Error("[AESCrypto] invalid aes mode " + this.aesMode) } } , e }() , Zt = function() { function e() { this.rcon = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54], this.subMix = [new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)], this.invSubMix = [new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)], this.sBox = new Uint32Array(256), this.invSBox = new Uint32Array(256), this.key = new Uint32Array(0), this.ksRows = 0, this.keySize = 0, this.keySchedule = void 0, this.invKeySchedule = void 0, this.initTable() } var t = e.prototype; return t.uint8ArrayToUint32Array_ = function(e) { for (var t = new DataView(e), r = new Uint32Array(4), i = 0; i < 4; i++) r[i] = t.getUint32(4 * i); return r } , t.initTable = function() { var e = this.sBox , t = this.invSBox , r = this.subMix , i = r[0] , n = r[1] , a = r[2] , s = r[3] , o = this.invSubMix , l = o[0] , u = o[1] , d = o[2] , h = o[3] , f = new Uint32Array(256) , c = 0 , g = 0 , v = 0; for (v = 0; v < 256; v++) f[v] = v < 128 ? v << 1 : v << 1 ^ 283; for (v = 0; v < 256; v++) { var m = g ^ g << 1 ^ g << 2 ^ g << 3 ^ g << 4; m = m >>> 8 ^ 255 & m ^ 99, e[c] = m, t[m] = c; var p = f[c] , y = f[p] , E = f[y] , T = 257 * f[m] ^ 16843008 * m; i[c] = T << 24 | T >>> 8, n[c] = T << 16 | T >>> 16, a[c] = T << 8 | T >>> 24, s[c] = T, T = 16843009 * E ^ 65537 * y ^ 257 * p ^ 16843008 * c, l[m] = T << 24 | T >>> 8, u[m] = T << 16 | T >>> 16, d[m] = T << 8 | T >>> 24, h[m] = T, c ? (c = p ^ f[f[f[E ^ p]]], g ^= f[f[g]]) : c = g = 1 } } , t.expandKey = function(e) { for (var t = this.uint8ArrayToUint32Array_(e), r = !0, i = 0; i < t.length && r; ) r = t[i] === this.key[i], i++; if (!r) { this.key = t; var n = this.keySize = t.length; if (4 !== n && 6 !== n && 8 !== n) throw new Error("Invalid aes key size=" + n); var a, s, o, l, u = this.ksRows = 4 * (n + 6 + 1), d = this.keySchedule = new Uint32Array(u), h = this.invKeySchedule = new Uint32Array(u), f = this.sBox, c = this.rcon, g = this.invSubMix, v = g[0], m = g[1], p = g[2], y = g[3]; for (a = 0; a < u; a++) a < n ? o = d[a] = t[a] : (l = o, a % n == 0 ? (l = f[(l = l << 8 | l >>> 24) >>> 24] << 24 | f[l >>> 16 & 255] << 16 | f[l >>> 8 & 255] << 8 | f[255 & l], l ^= c[a / n | 0] << 24) : n > 6 && a % n == 4 && (l = f[l >>> 24] << 24 | f[l >>> 16 & 255] << 16 | f[l >>> 8 & 255] << 8 | f[255 & l]), d[a] = o = (d[a - n] ^ l) >>> 0); for (s = 0; s < u; s++) a = u - s, l = 3 & s ? d[a] : d[a - 4], h[s] = s < 4 || a <= 4 ? l : v[f[l >>> 24]] ^ m[f[l >>> 16 & 255]] ^ p[f[l >>> 8 & 255]] ^ y[f[255 & l]], h[s] = h[s] >>> 0 } } , t.networkToHostOrderSwap = function(e) { return e << 24 | (65280 & e) << 8 | (16711680 & e) >> 8 | e >>> 24 } , t.decrypt = function(e, t, r) { for (var i, n, a, s, o, l, u, d, h, f, c, g, v, m, p = this.keySize + 6, y = this.invKeySchedule, E = this.invSBox, T = this.invSubMix, S = T[0], A = T[1], L = T[2], I = T[3], R = this.uint8ArrayToUint32Array_(r), k = R[0], b = R[1], D = R[2], _ = R[3], P = new Int32Array(e), C = new Int32Array(P.length), w = this.networkToHostOrderSwap; t < P.length; ) { for (h = w(P[t]), f = w(P[t + 1]), c = w(P[t + 2]), g = w(P[t + 3]), o = h ^ y[0], l = g ^ y[1], u = c ^ y[2], d = f ^ y[3], v = 4, m = 1; m < p; m++) i = S[o >>> 24] ^ A[l >> 16 & 255] ^ L[u >> 8 & 255] ^ I[255 & d] ^ y[v], n = S[l >>> 24] ^ A[u >> 16 & 255] ^ L[d >> 8 & 255] ^ I[255 & o] ^ y[v + 1], a = S[u >>> 24] ^ A[d >> 16 & 255] ^ L[o >> 8 & 255] ^ I[255 & l] ^ y[v + 2], s = S[d >>> 24] ^ A[o >> 16 & 255] ^ L[l >> 8 & 255] ^ I[255 & u] ^ y[v + 3], o = i, l = n, u = a, d = s, v += 4; i = E[o >>> 24] << 24 ^ E[l >> 16 & 255] << 16 ^ E[u >> 8 & 255] << 8 ^ E[255 & d] ^ y[v], n = E[l >>> 24] << 24 ^ E[u >> 16 & 255] << 16 ^ E[d >> 8 & 255] << 8 ^ E[255 & o] ^ y[v + 1], a = E[u >>> 24] << 24 ^ E[d >> 16 & 255] << 16 ^ E[o >> 8 & 255] << 8 ^ E[255 & l] ^ y[v + 2], s = E[d >>> 24] << 24 ^ E[o >> 16 & 255] << 16 ^ E[l >> 8 & 255] << 8 ^ E[255 & u] ^ y[v + 3], C[t] = w(i ^ k), C[t + 1] = w(s ^ b), C[t + 2] = w(a ^ D), C[t + 3] = w(n ^ _), k = h, b = f, D = c, _ = g, t += 4 } return C.buffer } , e }() , Jt = function() { function e(e, t, r) { this.subtle = void 0, this.key = void 0, this.aesMode = void 0, this.subtle = e, this.key = t, this.aesMode = r } return e.prototype.expandKey = function() { var e = function(e) { switch (e) { case Qt: return "AES-CBC"; case zt: return "AES-CTR"; default: throw new Error("[FastAESKey] invalid aes mode " + e) } }(this.aesMode); return this.subtle.importKey("raw", this.key, { name: e }, !1, ["encrypt", "decrypt"]) } , e }() , er = function() { function e(e, t) { var r = (void 0 === t ? {} : t).removePKCS7Padding , i = void 0 === r || r; if (this.logEnabled = !0, this.removePKCS7Padding = void 0, this.subtle = null, this.softwareDecrypter = null, this.key = null, this.fastAesKey = null, this.remainderData = null, this.currentIV = null, this.currentResult = null, this.useSoftware = void 0, this.enableSoftwareAES = void 0, this.enableSoftwareAES = e.enableSoftwareAES, this.removePKCS7Padding = i, i) try { var n = self.crypto; n && (this.subtle = n.subtle || n.webkitSubtle) } catch (e) {} this.useSoftware = !this.subtle } var t = e.prototype; return t.destroy = function() { this.subtle = null, this.softwareDecrypter = null, this.key = null, this.fastAesKey = null, this.remainderData = null, this.currentIV = null, this.currentResult = null } , t.isSync = function() { return this.useSoftware } , t.flush = function() { var e = this.currentResult , t = this.remainderData; if (!e || t) return this.reset(), null; var r, i, n, a = new Uint8Array(e); return this.reset(), this.removePKCS7Padding ? (i = (r = a).byteLength, (n = i && new DataView(r.buffer).getUint8(i - 1)) ? r.slice(0, i - n) : r) : a } , t.reset = function() { this.currentResult = null, this.currentIV = null, this.remainderData = null, this.softwareDecrypter && (this.softwareDecrypter = null) } , t.decrypt = function(e, t, r, i) { var n = this; return this.useSoftware ? new Promise((function(a, s) { var o = ArrayBuffer.isView(e) ? e : new Uint8Array(e); n.softwareDecrypt(o, t, r, i); var l = n.flush(); l ? a(l.buffer) : s(new Error("[softwareDecrypt] Failed to decrypt data")) } )) : this.webCryptoDecrypt(new Uint8Array(e), t, r, i) } , t.softwareDecrypt = function(e, t, r, i) { var n = this.currentIV , a = this.currentResult , s = this.remainderData; if (i !== Qt || 16 !== t.byteLength) return Y.warn("SoftwareDecrypt: can only handle AES-128-CBC"), null; this.logOnce("JS AES decrypt"), s && (e = Ae(s, e), this.remainderData = null); var o = this.getValidChunk(e); if (!o.length) return null; n && (r = n); var l = this.softwareDecrypter; l || (l = this.softwareDecrypter = new Zt), l.expandKey(t); var u = a; return this.currentResult = l.decrypt(o.buffer, 0, r), this.currentIV = o.slice(-16).buffer, u || null } , t.webCryptoDecrypt = function(e, t, r, i) { var n = this; if (this.key !== t || !this.fastAesKey) { if (!this.subtle) return Promise.resolve(this.onWebCryptoError(e, t, r, i)); this.key = t, this.fastAesKey = new Jt(this.subtle,t,i) } return this.fastAesKey.expandKey().then((function(t) { return n.subtle ? (n.logOnce("WebCrypto AES decrypt"), new $t(n.subtle,new Uint8Array(r),i).decrypt(e.buffer, t)) : Promise.reject(new Error("web crypto not initialized")) } )).catch((function(a) { return Y.warn("[decrypter]: WebCrypto Error, disable WebCrypto API, " + a.name + ": " + a.message), n.onWebCryptoError(e, t, r, i) } )) } , t.onWebCryptoError = function(e, t, r, i) { var n = this.enableSoftwareAES; if (n) { this.useSoftware = !0, this.logEnabled = !0, this.softwareDecrypt(e, t, r, i); var a = this.flush(); if (a) return a.buffer } throw new Error("WebCrypto" + (n ? " and softwareDecrypt" : "") + ": failed to decrypt data") } , t.getValidChunk = function(e) { var t = e , r = e.length - e.length % 16; return r !== e.length && (t = e.slice(0, r), this.remainderData = e.slice(r)), t } , t.logOnce = function(e) { this.logEnabled && (Y.log("[decrypter]: " + e), this.logEnabled = !1) } , e }() , tr = Math.pow(2, 17) , rr = function() { function e(e) { this.config = void 0, this.loader = null, this.partLoadTimeout = -1, this.config = e } var t = e.prototype; return t.destroy = function() { this.loader && (this.loader.destroy(), this.loader = null) } , t.abort = function() { this.loader && this.loader.abort() } , t.load = function(e, t) { var r = this , i = e.url; if (!i) return Promise.reject(new ar({ type: R.NETWORK_ERROR, details: k.FRAG_LOAD_ERROR, fatal: !1, frag: e, error: new Error("Fragment does not have a " + (i ? "part list" : "url")), networkDetails: null })); this.abort(); var n = this.config , a = n.fLoader , s = n.loader; return new Promise((function(o, l) { if (r.loader && r.loader.destroy(), e.gap) { if (e.tagList.some((function(e) { return "GAP" === e[0] } ))) return void l(nr(e)); e.gap = !1 } var u = r.loader = a ? new a(n) : new s(n) , h = ir(e); e.loader = u; var f = Dt(n.fragLoadPolicy.default) , c = { loadPolicy: f, timeout: f.maxLoadTimeMs, maxRetry: 0, retryDelay: 0, maxRetryDelay: 0, highWaterMark: "initSegment" === e.sn ? 1 / 0 : tr }; e.stats = u.stats; var g = { onSuccess: function(t, i, n, a) { r.resetLoader(e, u); var s = t.data; n.resetIV && e.decryptdata && (e.decryptdata.iv = new Uint8Array(s.slice(0, 16)), s = s.slice(16)), o({ frag: e, part: null, payload: s, networkDetails: a }) }, onError: function(t, n, a, s) { r.resetLoader(e, u), l(new ar({ type: R.NETWORK_ERROR, details: k.FRAG_LOAD_ERROR, fatal: !1, frag: e, response: d({ url: i, data: void 0 }, t), error: new Error("HTTP Error " + t.code + " " + t.text), networkDetails: a, stats: s })) }, onAbort: function(t, i, n) { r.resetLoader(e, u), l(new ar({ type: R.NETWORK_ERROR, details: k.INTERNAL_ABORTED, fatal: !1, frag: e, error: new Error("Aborted"), networkDetails: n, stats: t })) }, onTimeout: function(t, i, n) { r.resetLoader(e, u), l(new ar({ type: R.NETWORK_ERROR, details: k.FRAG_LOAD_TIMEOUT, fatal: !1, frag: e, error: new Error("Timeout after " + c.timeout + "ms"), networkDetails: n, stats: t })) } }; t && (g.onProgress = function(r, i, n, a) { return t({ frag: e, part: null, payload: n, networkDetails: a }) } ), u.load(h, c, g) } )) } , t.loadPart = function(e, t, r) { var i = this; this.abort(); var n = this.config , a = n.fLoader , s = n.loader; return new Promise((function(o, l) { if (i.loader && i.loader.destroy(), e.gap || t.gap) l(nr(e, t)); else { var u = i.loader = a ? new a(n) : new s(n) , h = ir(e, t); e.loader = u; var f = Dt(n.fragLoadPolicy.default) , c = { loadPolicy: f, timeout: f.maxLoadTimeMs, maxRetry: 0, retryDelay: 0, maxRetryDelay: 0, highWaterMark: tr }; t.stats = u.stats, u.load(h, c, { onSuccess: function(n, a, s, l) { i.resetLoader(e, u), i.updateStatsFromPart(e, t); var d = { frag: e, part: t, payload: n.data, networkDetails: l }; r(d), o(d) }, onError: function(r, n, a, s) { i.resetLoader(e, u), l(new ar({ type: R.NETWORK_ERROR, details: k.FRAG_LOAD_ERROR, fatal: !1, frag: e, part: t, response: d({ url: h.url, data: void 0 }, r), error: new Error("HTTP Error " + r.code + " " + r.text), networkDetails: a, stats: s })) }, onAbort: function(r, n, a) { e.stats.aborted = t.stats.aborted, i.resetLoader(e, u), l(new ar({ type: R.NETWORK_ERROR, details: k.INTERNAL_ABORTED, fatal: !1, frag: e, part: t, error: new Error("Aborted"), networkDetails: a, stats: r })) }, onTimeout: function(r, n, a) { i.resetLoader(e, u), l(new ar({ type: R.NETWORK_ERROR, details: k.FRAG_LOAD_TIMEOUT, fatal: !1, frag: e, part: t, error: new Error("Timeout after " + c.timeout + "ms"), networkDetails: a, stats: r })) } }) } } )) } , t.updateStatsFromPart = function(e, t) { var r = e.stats , i = t.stats , n = i.total; if (r.loaded += i.loaded, n) { var a = Math.round(e.duration / t.duration) , s = Math.min(Math.round(r.loaded / n), a) , o = (a - s) * Math.round(r.loaded / s); r.total = r.loaded + o } else r.total = Math.max(r.loaded, r.total); var l = r.loading , u = i.loading; l.start ? l.first += u.first - u.start : (l.start = u.start, l.first = u.first), l.end = u.end } , t.resetLoader = function(e, t) { e.loader = null, this.loader === t && (self.clearTimeout(this.partLoadTimeout), this.loader = null), t.destroy() } , e }(); function ir(e, t) { void 0 === t && (t = null); var r, i = t || e, n = { frag: e, part: t, responseType: "arraybuffer", url: i.url, headers: {}, rangeStart: 0, rangeEnd: 0 }, a = i.byteRangeStartOffset, s = i.byteRangeEndOffset; if (A(a) && A(s)) { var o, l = a, u = s; if ("initSegment" === e.sn && ("AES-128" === (r = null == (o = e.decryptdata) ? void 0 : o.method) || "AES-256" === r)) { var d = s - a; d % 16 && (u = s + (16 - d % 16)), 0 !== a && (n.resetIV = !0, l = a - 16) } n.rangeStart = l, n.rangeEnd = u } return n } function nr(e, t) { var r = new Error("GAP " + (e.gap ? "tag" : "attribute") + " found") , i = { type: R.MEDIA_ERROR, details: k.FRAG_GAP, fatal: !1, frag: e, error: r, networkDetails: null }; return t && (i.part = t), (t || e).stats.aborted = !0, new ar(i) } var ar = function(e) { function t(t) { var r; return (r = e.call(this, t.error.message) || this).data = void 0, r.data = t, r } return o(t, e), t }(c(Error)) , sr = function(e) { function t(t, r) { var i; return (i = e.call(this, t, r) || this)._boundTick = void 0, i._tickTimer = null, i._tickInterval = null, i._tickCallCount = 0, i._boundTick = i.tick.bind(i), i } o(t, e); var r = t.prototype; return r.destroy = function() { this.onHandlerDestroying(), this.onHandlerDestroyed() } , r.onHandlerDestroying = function() { this.clearNextTick(), this.clearInterval() } , r.onHandlerDestroyed = function() {} , r.hasInterval = function() { return !!this._tickInterval } , r.hasNextTick = function() { return !!this._tickTimer } , r.setInterval = function(e) { return !this._tickInterval && (this._tickCallCount = 0, this._tickInterval = self.setInterval(this._boundTick, e), !0) } , r.clearInterval = function() { return !!this._tickInterval && (self.clearInterval(this._tickInterval), this._tickInterval = null, !0) } , r.clearNextTick = function() { return !!this._tickTimer && (self.clearTimeout(this._tickTimer), this._tickTimer = null, !0) } , r.tick = function() { this._tickCallCount++, 1 === this._tickCallCount && (this.doTick(), this._tickCallCount > 1 && this.tickImmediate(), this._tickCallCount = 0) } , r.tickImmediate = function() { this.clearNextTick(), this._tickTimer = self.setTimeout(this._boundTick, 0) } , r.doTick = function() {} , t }(N) , or = function(e, t, r, i, n, a) { void 0 === i && (i = 0), void 0 === n && (n = -1), void 0 === a && (a = !1), this.level = void 0, this.sn = void 0, this.part = void 0, this.id = void 0, this.size = void 0, this.partial = void 0, this.transmuxing = { start: 0, executeStart: 0, executeEnd: 0, end: 0 }, this.buffering = { audio: { start: 0, executeStart: 0, executeEnd: 0, end: 0 }, video: { start: 0, executeStart: 0, executeEnd: 0, end: 0 }, audiovideo: { start: 0, executeStart: 0, executeEnd: 0, end: 0 } }, this.level = e, this.sn = t, this.id = r, this.size = i, this.part = n, this.partial = a } , lr = { length: 0, start: function() { return 0 }, end: function() { return 0 } } , ur = function() { function e() {} return e.isBuffered = function(t, r) { if (t) for (var i = e.getBuffered(t), n = i.length; n--; ) if (r >= i.start(n) && r <= i.end(n)) return !0; return !1 } , e.bufferedRanges = function(t) { if (t) { var r = e.getBuffered(t); return e.timeRangesToArray(r) } return [] } , e.timeRangesToArray = function(e) { for (var t = [], r = 0; r < e.length; r++) t.push({ start: e.start(r), end: e.end(r) }); return t } , e.bufferInfo = function(t, r, i) { if (t) { var n = e.bufferedRanges(t); if (n.length) return e.bufferedInfo(n, r, i) } return { len: 0, start: r, end: r, bufferedIndex: -1 } } , e.bufferedInfo = function(e, t, r) { t = Math.max(0, t), e.length > 1 && e.sort((function(e, t) { return e.start - t.start || t.end - e.end } )); var i = -1 , n = []; if (r) for (var a = 0; a < e.length; a++) { t >= e[a].start && t <= e[a].end && (i = a); var s = n.length; if (s) { var o = n[s - 1].end; e[a].start - o < r ? e[a].end > o && (n[s - 1].end = e[a].end) : n.push(e[a]) } else n.push(e[a]) } else n = e; for (var l, u = 0, d = t, h = t, f = 0; f < n.length; f++) { var c = n[f].start , g = n[f].end; if (-1 === i && t >= c && t <= g && (i = f), t + r >= c && t < g) d = c, u = (h = g) - t; else if (t + r < c) { l = c; break } } return { len: u, start: d || 0, end: h || 0, nextStart: l, buffered: e, bufferedIndex: i } } , e.getBuffered = function(e) { try { return e.buffered || lr } catch (e) { return Y.log("failed to get media.buffered", e), lr } } , e }() , dr = /\{\$([a-zA-Z0-9-_]+)\}/g; function hr(e) { return dr.test(e) } function fr(e, t) { if (null !== e.variableList || e.hasVariableRefs) { var r = e.variableList; return t.replace(dr, (function(t) { var i = t.substring(2, t.length - 1) , n = null == r ? void 0 : r[i]; return void 0 === n ? (e.playlistParsingError || (e.playlistParsingError = new Error('Missing preceding EXT-X-DEFINE tag for Variable Reference: "' + i + '"')), t) : n } )) } return t } function cr(e, t, r) { var i, n, a = e.variableList; if (a || (e.variableList = a = {}), "QUERYPARAM"in t) { i = t.QUERYPARAM; try { var s = new self.URL(r).searchParams; if (!s.has(i)) throw new Error('"' + i + '" does not match any query parameter in URI: "' + r + '"'); n = s.get(i) } catch (t) { e.playlistParsingError || (e.playlistParsingError = new Error("EXT-X-DEFINE QUERYPARAM: " + t.message)) } } else i = t.NAME, n = t.VALUE; i in a ? e.playlistParsingError || (e.playlistParsingError = new Error('EXT-X-DEFINE duplicate Variable Name declarations: "' + i + '"')) : a[i] = n || "" } function gr(e, t, r) { var i = t.IMPORT; if (r && i in r) { var n = e.variableList; n || (e.variableList = n = {}), n[i] = r[i] } else e.playlistParsingError || (e.playlistParsingError = new Error('EXT-X-DEFINE IMPORT attribute not found in Multivariant Playlist: "' + i + '"')) } var vr = /^(\d+)x(\d+)$/ , mr = /(.+?)=(".*?"|.*?)(?:,|$)/g , pr = function() { function e(t, r) { "string" == typeof t && (t = e.parseAttrList(t, r)), a(this, t) } var t = e.prototype; return t.decimalInteger = function(e) { var t = parseInt(this[e], 10); return t > Number.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 r = new Uint8Array(t.length / 2), i = 0; i < t.length / 2; i++) r[i] = parseInt(t.slice(2 * i, 2 * i + 2), 16); return r } return null } , t.hexadecimalIntegerAsNumber = function(e) { var t = parseInt(this[e], 16); return t > Number.MAX_SAFE_INTEGER ? 1 / 0 : t } , t.decimalFloatingPoint = function(e) { return parseFloat(this[e]) } , t.optionalFloat = function(e, t) { var r = this[e]; return r ? parseFloat(r) : t } , t.enumeratedString = function(e) { return this[e] } , t.enumeratedStringList = function(e, t) { var r = this[e]; return (r ? r.split(/[ ,]+/) : []).reduce((function(e, t) { return e[t.toLowerCase()] = !0, e } ), t) } , t.bool = function(e) { return "YES" === this[e] } , t.decimalResolution = function(e) { var t = vr.exec(this[e]); if (null !== t) return { width: parseInt(t[1], 10), height: parseInt(t[2], 10) } } , e.parseAttrList = function(e, t) { var r, i = {}; for (mr.lastIndex = 0; null !== (r = mr.exec(e)); ) { var n = r[1].trim() , a = r[2] , s = 0 === a.indexOf('"') && a.lastIndexOf('"') === a.length - 1 , o = !1; if (s) a = a.slice(1, -1); else switch (n) { case "IV": case "SCTE35-CMD": case "SCTE35-IN": case "SCTE35-OUT": o = !0 } if (t && (s || o)) a = fr(t, a); else if (!o && !s) switch (n) { case "CLOSED-CAPTIONS": if ("NONE" === a) break; case "ALLOWED-CPC": case "CLASS": case "ASSOC-LANGUAGE": case "AUDIO": case "BYTERANGE": case "CHANNELS": case "CHARACTERISTICS": case "CODECS": case "DATA-ID": case "END-DATE": case "GROUP-ID": case "ID": case "IMPORT": case "INSTREAM-ID": case "KEYFORMAT": case "KEYFORMATVERSIONS": case "LANGUAGE": case "NAME": case "PATHWAY-ID": case "QUERYPARAM": case "RECENTLY-REMOVED-DATERANGES": case "SERVER-URI": case "STABLE-RENDITION-ID": case "STABLE-VARIANT-ID": case "START-DATE": case "SUBTITLES": case "SUPPLEMENTAL-CODECS": case "URI": case "VALUE": case "VIDEO": case "X-ASSET-LIST": case "X-ASSET-URI": Y.warn(e + ": attribute " + n + " is missing quotes") } i[n] = a } return i } , i(e, [{ key: "clientAttrs", get: function() { return Object.keys(this).filter((function(e) { return "X-" === e.substring(0, 2) } )) } }]) }(); function yr(e) { return "SCTE35-OUT" === e || "SCTE35-IN" === e || "SCTE35-CMD" === e } var Er = function() { return i((function(e, t, r) { var i; if (void 0 === r && (r = 0), this.attr = void 0, this.tagAnchor = void 0, this.tagOrder = void 0, this._startDate = void 0, this._endDate = void 0, this._dateAtEnd = void 0, this._cue = void 0, this._badValueForSameId = void 0, this.tagAnchor = (null == t ? void 0 : t.tagAnchor) || null, this.tagOrder = null != (i = null == t ? void 0 : t.tagOrder) ? i : r, t) { var n = t.attr; for (var s in n) if (Object.prototype.hasOwnProperty.call(e, s) && e[s] !== n[s]) { Y.warn('DATERANGE tag attribute: "' + s + '" does not match for tags with ID: "' + e.ID + '"'), this._badValueForSameId = s; break } e = a(new pr({}), n, e) } if (this.attr = e, t ? (this._startDate = t._startDate, this._cue = t._cue, this._endDate = t._endDate, this._dateAtEnd = t._dateAtEnd) : this._startDate = new Date(e["START-DATE"]), "END-DATE"in this.attr) { var o = (null == t ? void 0 : t.endDate) || new Date(this.attr["END-DATE"]); A(o.getTime()) && (this._endDate = o) } } ), [{ key: "id", get: function() { return this.attr.ID } }, { key: "class", get: function() { return this.attr.CLASS } }, { key: "cue", get: function() { var e = this._cue; return void 0 === e ? this._cue = this.attr.enumeratedStringList(this.attr.CUE ? "CUE" : "X-CUE", { pre: !1, post: !1, once: !1 }) : e } }, { key: "startTime", get: function() { var e = this.tagAnchor; return null === e || null === e.programDateTime ? (Y.warn('Expected tagAnchor Fragment with PDT set for DateRange "' + this.id + '": ' + e), NaN) : e.start + (this.startDate.getTime() - e.programDateTime) / 1e3 } }, { key: "startDate", get: function() { return this._startDate } }, { key: "endDate", get: function() { var e = this._endDate || this._dateAtEnd; if (e) return e; var t = this.duration; return null !== t ? this._dateAtEnd = new Date(this._startDate.getTime() + 1e3 * t) : null } }, { key: "duration", get: function() { if ("DURATION"in this.attr) { var e = this.attr.decimalFloatingPoint("DURATION"); if (A(e)) return e } else if (this._endDate) return (this._endDate.getTime() - this._startDate.getTime()) / 1e3; return null } }, { key: "plannedDuration", get: function() { return "PLANNED-DURATION"in this.attr ? this.attr.decimalFloatingPoint("PLANNED-DURATION") : null } }, { key: "endOnNext", get: function() { return this.attr.bool("END-ON-NEXT") } }, { key: "isInterstitial", get: function() { return "com.apple.hls.interstitial" === this.class } }, { key: "isValid", get: function() { return !!this.id && !this._badValueForSameId && A(this.startDate.getTime()) && (null === this.duration || this.duration >= 0) && (!this.endOnNext || !!this.class) && (!this.attr.CUE || !this.cue.pre && !this.cue.post || this.cue.pre !== this.cue.post) && (!this.isInterstitial || "X-ASSET-URI"in this.attr || "X-ASSET-LIST"in this.attr) } }]) }() , Tr = function() { function e(e) { this.PTSKnown = !1, this.alignedSliding = !1, this.averagetargetduration = void 0, this.endCC = 0, this.endSN = 0, this.fragments = void 0, this.fragmentHint = void 0, this.partList = null, this.dateRanges = void 0, this.dateRangeTagCount = 0, this.live = !0, this.requestScheduled = -1, this.ageHeader = 0, this.advancedDateTime = void 0, this.updated = !0, this.advanced = !0, this.misses = 0, this.startCC = 0, this.startSN = 0, this.startTimeOffset = null, this.targetduration = 0, this.totalduration = 0, this.type = null, this.url = void 0, this.m3u8 = "", this.version = null, this.canBlockReload = !1, this.canSkipUntil = 0, this.canSkipDateRanges = !1, this.skippedSegments = 0, this.recentlyRemovedDateranges = void 0, this.partHoldBack = 0, this.holdBack = 0, this.partTarget = 0, this.preloadHint = void 0, this.renditionReports = void 0, this.tuneInGoal = 0, this.deltaUpdateFailed = void 0, this.driftStartTime = 0, this.driftEndTime = 0, this.driftStart = 0, this.driftEnd = 0, this.encryptedFragments = void 0, this.playlistParsingError = null, this.variableList = null, this.hasVariableRefs = !1, this.appliedTimelineOffset = void 0, this.fragments = [], this.encryptedFragments = [], this.dateRanges = {}, this.url = e } var t = e.prototype; return t.reloaded = function(e) { if (!e) return this.advanced = !0, void (this.updated = !0); var t = this.lastPartSn - e.lastPartSn , r = this.lastPartIndex - e.lastPartIndex; this.updated = this.endSN !== e.endSN || !!r || !!t || !this.live, this.advanced = this.endSN > e.endSN || t > 0 || 0 === t && r > 0, this.updated || this.advanced ? this.misses = Math.floor(.6 * e.misses) : this.misses = e.misses + 1 } , t.hasKey = function(e) { return this.encryptedFragments.some((function(t) { var r = t.decryptdata; return r || (t.setKeyFormat(e.keyFormat), r = t.decryptdata), !!r && e.matches(r) } )) } , i(e, [{ key: "hasProgramDateTime", get: function() { return !!this.fragments.length && A(this.fragments[this.fragments.length - 1].programDateTime) } }, { key: "levelTargetDuration", get: function() { return this.averagetargetduration || this.targetduration || 10 } }, { key: "drift", get: function() { var e = this.driftEndTime - this.driftStartTime; return e > 0 ? 1e3 * (this.driftEnd - this.driftStart) / e : 1 } }, { key: "edge", get: function() { return this.partEnd || this.fragmentEnd } }, { key: "partEnd", get: function() { var e; return null != (e = this.partList) && e.length ? this.partList[this.partList.length - 1].end : this.fragmentEnd } }, { key: "fragmentEnd", get: function() { return this.fragments.length ? this.fragments[this.fragments.length - 1].end : 0 } }, { key: "fragmentStart", get: function() { return this.fragments.length ? this.fragments[0].start : 0 } }, { key: "age", get: function() { return this.advancedDateTime ? Math.max(Date.now() - this.advancedDateTime, 0) / 1e3 : 0 } }, { key: "lastPartIndex", get: function() { var e; return null != (e = this.partList) && e.length ? this.partList[this.partList.length - 1].index : -1 } }, { key: "maxPartIndex", get: function() { var e = this.partList; if (e) { var t = this.lastPartIndex; if (-1 !== t) { for (var r = e.length; r--; ) if (e[r].index > t) return e[r].index; return t } } return 0 } }, { key: "lastPartSn", get: function() { var e; return null != (e = this.partList) && e.length ? this.partList[this.partList.length - 1].fragment.sn : this.endSN } }, { key: "expired", get: function() { if (this.live && this.age && this.misses < 3) { var e = this.partEnd - this.fragmentStart; return this.age > Math.max(e, this.totalduration) + this.levelTargetDuration } return !1 } }]) }(); function Sr(e, t) { return e.length === t.length && !e.some((function(e, r) { return e !== t[r] } )) } function Ar(e, t) { return !e && !t || !(!e || !t) && Sr(e, t) } function Lr(e) { return "AES-128" === e || "AES-256" === e || "AES-256-CTR" === e } function Ir(e) { switch (e) { case "AES-128": case "AES-256": return Qt; case "AES-256-CTR": return zt; default: throw new Error("invalid full segment method " + e) } } function Rr(e) { return Uint8Array.from(atob(e), (function(e) { return e.charCodeAt(0) } )) } function kr(e) { return Uint8Array.from(unescape(encodeURIComponent(e)), (function(e) { return e.charCodeAt(0) } )) } function br(e) { var t = function(e, t, r) { var i = e[t]; e[t] = e[r], e[r] = i }; t(e, 0, 3), t(e, 1, 2), t(e, 4, 5), t(e, 6, 7) } function Dr(e) { var t, r, i = e.split(":"), n = null; if ("data" === i[0] && 2 === i.length) { var a = i[1].split(";") , s = a[a.length - 1].split(","); if (2 === s.length) { var o = "base64" === s[0] , l = s[1]; o ? (a.splice(-1, 1), n = Rr(l)) : (t = kr(l).subarray(0, 16), (r = new Uint8Array(16)).set(t, 16 - t.length), n = r) } } return n } var _r = "undefined" != typeof self ? self : void 0 , Pr = { CLEARKEY: "org.w3.clearkey", FAIRPLAY: "com.apple.fps", PLAYREADY: "com.microsoft.playready", WIDEVINE: "com.widevine.alpha" } , Cr = "org.w3.clearkey" , wr = "com.apple.streamingkeydelivery" , Or = "com.microsoft.playready" , xr = "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"; function Mr(e) { switch (e) { case wr: return Pr.FAIRPLAY; case Or: return Pr.PLAYREADY; case xr: return Pr.WIDEVINE; case Cr: return Pr.CLEARKEY } } function Fr(e) { switch (e) { case Pr.FAIRPLAY: return wr; case Pr.PLAYREADY: return Or; case Pr.WIDEVINE: return xr; case Pr.CLEARKEY: return Cr } } function Nr(e) { var t = e.drmSystems , r = e.widevineLicenseUrl , i = t ? [Pr.FAIRPLAY, Pr.WIDEVINE, Pr.PLAYREADY, Pr.CLEARKEY].filter((function(e) { return !!t[e] } )) : []; return !i[Pr.WIDEVINE] && r && i.push(Pr.WIDEVINE), i } var Ur, Br = null != _r && null != (Ur = _r.navigator) && Ur.requestMediaKeySystemAccess ? self.navigator.requestMediaKeySystemAccess.bind(self.navigator) : null, Gr = {}, Kr = function() { function e(e, t, r, i, n, a) { void 0 === i && (i = [1]), void 0 === n && (n = null), this.uri = void 0, this.method = void 0, this.keyFormat = void 0, this.keyFormatVersions = void 0, this.encrypted = void 0, this.isCommonEncryption = void 0, this.iv = null, this.key = null, this.keyId = null, this.pssh = null, this.method = e, this.uri = t, this.keyFormat = r, this.keyFormatVersions = i, this.iv = n, this.encrypted = !!e && "NONE" !== e, this.isCommonEncryption = this.encrypted && !Lr(e), null != a && a.startsWith("0x") && (this.keyId = new Uint8Array(Q(a))) } e.clearKeyUriToKeyIdMap = function() { Gr = {} } , e.setKeyIdForUri = function(e, t) { Gr[e] = t } ; var t = e.prototype; return t.matches = function(e) { return e.uri === this.uri && e.method === this.method && e.encrypted === this.encrypted && e.keyFormat === this.keyFormat && Sr(e.keyFormatVersions, this.keyFormatVersions) && Ar(e.iv, this.iv) && Ar(e.keyId, this.keyId) } , t.isSupported = function() { if (this.method) { if (Lr(this.method) || "NONE" === this.method) return !0; if ("identity" === this.keyFormat) return "SAMPLE-AES" === this.method; switch (this.keyFormat) { case wr: case xr: case Or: case Cr: return -1 !== ["SAMPLE-AES", "SAMPLE-AES-CENC", "SAMPLE-AES-CTR"].indexOf(this.method) } } return !1 } , t.getDecryptData = function(t) { if (!this.encrypted || !this.uri) return null; if (Lr(this.method)) { var r = this.iv; return r || ("number" != typeof t && (Y.warn('missing IV for initialization segment with method="' + this.method + '" - compliance issue'), t = 0), r = function(e) { for (var t = new Uint8Array(16), r = 12; r < 16; r++) t[r] = e >> 8 * (15 - r) & 255; return t }(t)), new e(this.method,this.uri,"identity",this.keyFormatVersions,r) } if (this.pssh && this.keyId) return this; var i = Dr(this.uri); if (i) switch (this.keyFormat) { case xr: if (this.pssh = i, !this.keyId) { var n = function(e) { var t = []; if (e instanceof ArrayBuffer) for (var r = e.byteLength, i = 0; i + 32 < r; ) { var n = _e(new DataView(e,i)); t.push(n), i += n.size } return t }(i.buffer); if (n.length) { var a, s = n[0]; this.keyId = null != (a = s.kids) && a.length ? s.kids[0] : null } } if (!this.keyId) { var o = i.length - 22; this.keyId = i.subarray(o, o + 16) } break; case Or: var l = new Uint8Array([154, 4, 240, 121, 152, 64, 66, 134, 171, 146, 230, 91, 224, 136, 95, 149]); this.pssh = De(l, 0, i), this.keyId = function(e) { var t = new Uint16Array(e.buffer,e.byteOffset,e.byteLength / 2) , r = String.fromCharCode.apply(null, Array.from(t)) , i = r.substring(r.indexOf("<"), r.length) , n = (new DOMParser).parseFromString(i, "text/xml").getElementsByTagName("KID")[0]; if (n) { var a = n.childNodes[0] ? n.childNodes[0].nodeValue : n.getAttribute("VALUE"); if (a) { var s = Rr(a).subarray(0, 16); return br(s), s } } return null }(i); break; default: var u = i.subarray(0, 16); if (16 !== u.length) { var d = new Uint8Array(16); d.set(u, 16 - u.length), u = d } this.keyId = u } if (!this.keyId || 16 !== this.keyId.byteLength) { var h = Gr[this.uri]; if (!h) { var f = Object.keys(Gr).length % Number.MAX_SAFE_INTEGER; h = new Uint8Array(16), new DataView(h.buffer,12,4).setUint32(0, f), e.setKeyIdForUri(this.uri, h) } this.keyId = h } return this } , e }(), Vr = /#EXT-X-STREAM-INF:([^\r\n]*)(?:[\r\n](?:#[^\r\n]*)?)*([^\r\n]+)|#EXT-X-(SESSION-DATA|SESSION-KEY|DEFINE|CONTENT-STEERING|START):([^\r\n]*)[\r\n]+/g, Hr = /#EXT-X-MEDIA:(.*)/g, Yr = /^#EXT(?:INF|-X-TARGETDURATION):/m, Wr = new RegExp([/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source, /(?!#) *(\S[^\r\n]*)/.source, /#.*/.source].join("|"),"g"), jr = new RegExp([/#EXT-X-(PROGRAM-DATE-TIME|BYTERANGE|DATERANGE|DEFINE|KEY|MAP|PART|PART-INF|PLAYLIST-TYPE|PRELOAD-HINT|RENDITION-REPORT|SERVER-CONTROL|SKIP|START):(.+)/.source, /#EXT-X-(BITRATE|DISCONTINUITY-SEQUENCE|MEDIA-SEQUENCE|TARGETDURATION|VERSION): *(\d+)/.source, /#EXT-X-(DISCONTINUITY|ENDLIST|GAP|INDEPENDENT-SEGMENTS)/.source, /(#)([^:]*):(.*)/.source, /(#)(.*)(?:.*)\r?\n?/.source].join("|")), qr = function() { function e() {} return e.findGroup = function(e, t) { for (var r = 0; r < e.length; r++) { var i = e[r]; if (i.id === t) return i } } , e.resolve = function(e, t) { return S.buildAbsoluteURL(t, e, { alwaysNormalize: !0 }) } , e.isMediaPlaylist = function(e) { return Yr.test(e) } , e.parseMasterPlaylist = function(t, r) { var i, n = { contentSteering: null, levels: [], playlistParsingError: null, sessionData: null, sessionKeys: null, startTimeOffset: null, variableList: null, hasVariableRefs: hr(t) }, a = []; if (Vr.lastIndex = 0, !t.startsWith("#EXTM3U")) return n.playlistParsingError = new Error("no EXTM3U delimiter"), n; for (; null != (i = Vr.exec(t)); ) if (i[1]) { var s, o = new pr(i[1],n), l = fr(n, i[2]), u = { attrs: o, bitrate: o.decimalInteger("BANDWIDTH") || o.decimalInteger("AVERAGE-BANDWIDTH"), name: o.NAME, url: e.resolve(l, r) }, d = o.decimalResolution("RESOLUTION"); d && (u.width = d.width, u.height = d.height), Zr(o.CODECS, u); var h = o["SUPPLEMENTAL-CODECS"]; h && (u.supplemental = {}, Zr(h, u.supplemental)), null != (s = u.unknownCodecs) && s.length || a.push(u), n.levels.push(u) } else if (i[3]) { var f = i[3] , c = i[4]; switch (f) { case "SESSION-DATA": var g = new pr(c,n) , v = g["DATA-ID"]; v && (null === n.sessionData && (n.sessionData = {}), n.sessionData[v] = g); break; case "SESSION-KEY": var m = zr(c, r, n); m.encrypted && m.isSupported() ? (null === n.sessionKeys && (n.sessionKeys = []), n.sessionKeys.push(m)) : Y.warn('[Keys] Ignoring invalid EXT-X-SESSION-KEY tag: "' + c + '"'); break; case "DEFINE": cr(n, new pr(c,n), r); break; case "CONTENT-STEERING": var p = new pr(c,n); n.contentSteering = { uri: e.resolve(p["SERVER-URI"], r), pathwayId: p["PATHWAY-ID"] || "." }; break; case "START": n.startTimeOffset = $r(c) } } var y = a.length > 0 && a.length < n.levels.length; return n.levels = y ? a : n.levels, 0 === n.levels.length && (n.playlistParsingError = new Error("no levels found in manifest")), n } , e.parseMasterPlaylistMedia = function(t, r, i) { var n, a = {}, s = i.levels, o = { AUDIO: s.map((function(e) { return { id: e.attrs.AUDIO, audioCodec: e.audioCodec } } )), SUBTITLES: s.map((function(e) { return { id: e.attrs.SUBTITLES, textCodec: e.textCodec } } )), "CLOSED-CAPTIONS": [] }, l = 0; for (Hr.lastIndex = 0; null !== (n = Hr.exec(t)); ) { var u = new pr(n[1],i) , d = u.TYPE; if (d) { var h = o[d] , f = a[d] || []; a[d] = f; var c = u.LANGUAGE , g = u["ASSOC-LANGUAGE"] , v = u.CHANNELS , m = u.CHARACTERISTICS , p = u["INSTREAM-ID"] , y = { attrs: u, bitrate: 0, id: l++, groupId: u["GROUP-ID"] || "", name: u.NAME || c || "", type: d, default: u.bool("DEFAULT"), autoselect: u.bool("AUTOSELECT"), forced: u.bool("FORCED"), lang: c, url: u.URI ? e.resolve(u.URI, r) : "" }; if (g && (y.assocLang = g), v && (y.channels = v), m && (y.characteristics = m), p && (y.instreamId = p), null != h && h.length) { var E = e.findGroup(h, y.groupId) || h[0]; Jr(y, E, "audioCodec"), Jr(y, E, "textCodec") } f.push(y) } } return a } , e.parseLevelPlaylist = function(e, t, r, i, n, s) { var o, l, u, d, h, f = { url: t }, c = new Tr(t), g = c.fragments, v = [], m = null, p = 0, y = 0, E = 0, T = 0, S = 0, L = null, I = new re(i,f), R = -1, k = !1, b = null; if (Wr.lastIndex = 0, c.m3u8 = e, c.hasVariableRefs = hr(e), "#EXTM3U" !== (null == (o = Wr.exec(e)) ? void 0 : o[0])) return c.playlistParsingError = new Error("Missing format identifier #EXTM3U"), c; for (; null !== (l = Wr.exec(e)); ) { k && (k = !1, (I = new re(i,f)).playlistOffset = E, I.setStart(E), I.sn = p, I.cc = T, S && (I.bitrate = S), I.level = r, m && (I.initSegment = m, m.rawProgramDateTime && (I.rawProgramDateTime = m.rawProgramDateTime, m.rawProgramDateTime = null), b && (I.setByteRange(b), b = null))); var D = l[1]; if (D) { I.duration = parseFloat(D); var _ = (" " + l[2]).slice(1); I.title = _ || null, I.tagList.push(_ ? ["INF", D, _] : ["INF", D]) } else if (l[3]) { if (A(I.duration)) { I.playlistOffset = E, I.setStart(E), d && ri(I, d, c), I.sn = p, I.level = r, I.cc = T, g.push(I); var P = (" " + l[3]).slice(1); I.relurl = fr(c, P), ei(I, L, v), L = I, E += I.duration, p++, y = 0, k = !0 } } else { if (!(l = l[0].match(jr))) { Y.warn("No matches on slow regex match for level playlist!"); continue } for (u = 1; u < l.length && void 0 === l[u]; u++) ; var C = (" " + l[u]).slice(1) , w = (" " + l[u + 1]).slice(1) , O = l[u + 2] ? (" " + l[u + 2]).slice(1) : null; switch (C) { case "BYTERANGE": L ? I.setByteRange(w, L) : I.setByteRange(w); break; case "PROGRAM-DATE-TIME": I.rawProgramDateTime = w, I.tagList.push(["PROGRAM-DATE-TIME", w]), -1 === R && (R = g.length); break; case "PLAYLIST-TYPE": c.type && ii(c, C, l), c.type = w.toUpperCase(); break; case "MEDIA-SEQUENCE": 0 !== c.startSN ? ii(c, C, l) : g.length > 0 && ni(c, C, l), p = c.startSN = parseInt(w); break; case "SKIP": c.skippedSegments && ii(c, C, l); var x = new pr(w,c) , M = x.decimalInteger("SKIPPED-SEGMENTS"); if (A(M)) { c.skippedSegments += M; for (var F = M; F--; ) g.push(null); p += M } var N = x.enumeratedString("RECENTLY-REMOVED-DATERANGES"); N && (c.recentlyRemovedDateranges = (c.recentlyRemovedDateranges || []).concat(N.split("\t"))); break; case "TARGETDURATION": 0 !== c.targetduration && ii(c, C, l), c.targetduration = Math.max(parseInt(w), 1); break; case "VERSION": null !== c.version && ii(c, C, l), c.version = parseInt(w); break; case "INDEPENDENT-SEGMENTS": break; case "ENDLIST": c.live || ii(c, C, l), c.live = !1; break; case "#": (w || O) && I.tagList.push(O ? [w, O] : [w]); break; case "DISCONTINUITY": T++, I.tagList.push(["DIS"]); break; case "GAP": I.gap = !0, I.tagList.push([C]); break; case "BITRATE": I.tagList.push([C, w]), S = 1e3 * parseInt(w), A(S) ? I.bitrate = S : S = 0; break; case "DATERANGE": var U = new pr(w,c) , B = new Er(U,c.dateRanges[U.ID],c.dateRangeTagCount); c.dateRangeTagCount++, B.isValid || c.skippedSegments ? c.dateRanges[B.id] = B : Y.warn('Ignoring invalid DATERANGE tag: "' + w + '"'), I.tagList.push(["EXT-X-DATERANGE", w]); break; case "DEFINE": var G = new pr(w,c); "IMPORT"in G ? gr(c, G, s) : cr(c, G, t); break; case "DISCONTINUITY-SEQUENCE": 0 !== c.startCC ? ii(c, C, l) : g.length > 0 && ni(c, C, l), c.startCC = T = parseInt(w); break; case "KEY": var K = zr(w, t, c); if (K.isSupported()) { if ("NONE" === K.method) { d = void 0; break } d || (d = {}); var V = d[K.keyFormat]; null != V && V.matches(K) || (V && (d = a({}, d)), d[K.keyFormat] = K) } else Y.warn('[Keys] Ignoring unsupported EXT-X-KEY tag: "' + w + '"'); break; case "START": c.startTimeOffset = $r(w); break; case "MAP": var H = new pr(w,c); if (I.duration) { var W = new re(i,f); ti(W, H, r, d), m = W, I.initSegment = m, m.rawProgramDateTime && !I.rawProgramDateTime && (I.rawProgramDateTime = m.rawProgramDateTime) } else { var j = I.byteRangeEndOffset; if (j) { var q = I.byteRangeStartOffset; b = j - q + "@" + q } else b = null; ti(I, H, r, d), m = I, k = !0 } m.cc = T; break; case "SERVER-CONTROL": h && ii(c, C, l), h = new pr(w), c.canBlockReload = h.bool("CAN-BLOCK-RELOAD"), c.canSkipUntil = h.optionalFloat("CAN-SKIP-UNTIL", 0), c.canSkipDateRanges = c.canSkipUntil > 0 && h.bool("CAN-SKIP-DATERANGES"), c.partHoldBack = h.optionalFloat("PART-HOLD-BACK", 0), c.holdBack = h.optionalFloat("HOLD-BACK", 0); break; case "PART-INF": c.partTarget && ii(c, C, l); var X = new pr(w); c.partTarget = X.decimalFloatingPoint("PART-TARGET"); break; case "PART": var Q = c.partList; Q || (Q = c.partList = []); var z = y > 0 ? Q[Q.length - 1] : void 0 , $ = y++ , Z = new pr(w,c) , J = new ie(Z,I,f,$,z); Q.push(J), I.duration += J.duration; break; case "PRELOAD-HINT": var ee = new pr(w,c); c.preloadHint = ee; break; case "RENDITION-REPORT": var te = new pr(w,c); c.renditionReports = c.renditionReports || [], c.renditionReports.push(te); break; default: Y.warn("line parsed but not handled: " + l) } } } L && !L.relurl ? (g.pop(), E -= L.duration, c.partList && (c.fragmentHint = L)) : c.partList && (ei(I, L, v), I.cc = T, c.fragmentHint = I, d && ri(I, d, c)), c.targetduration || (c.playlistParsingError = new Error("Missing Target Duration")); var ne = g.length , ae = g[0] , se = g[ne - 1]; if ((E += c.skippedSegments * c.targetduration) > 0 && ne && se) { c.averagetargetduration = E / ne; var oe = se.sn; c.endSN = "initSegment" !== oe ? oe : 0, c.live || (se.endList = !0), R > 0 && (function(e, t) { for (var r = e[t], i = t; i--; ) { var n = e[i]; if (!n) return; n.programDateTime = r.programDateTime - 1e3 * n.duration, r = n } }(g, R), ae && v.unshift(ae)) } return c.fragmentHint && (E += c.fragmentHint.duration), c.totalduration = E, v.length && c.dateRangeTagCount && ae && Xr(v, c), c.endCC = T, c } , e }(); function Xr(e, t) { var r = e.length; if (!r) { if (!t.hasProgramDateTime) return; var i = t.fragments[t.fragments.length - 1]; e.push(i), r++ } for (var n = e[r - 1], a = t.live ? 1 / 0 : t.totalduration, s = Object.keys(t.dateRanges), o = s.length; o--; ) { var l = t.dateRanges[s[o]] , u = l.startDate.getTime(); l.tagAnchor = n.ref; for (var d = r; d--; ) { var h; if ((null == (h = e[d]) ? void 0 : h.sn) < t.startSN) break; var f = Qr(t, u, e, d, a); if (-1 !== f) { l.tagAnchor = t.fragments[f].ref; break } } } } function Qr(e, t, r, i, n) { var a = r[i]; if (a) { var s, o = a.programDateTime; if ((t >= o || 0 === i) && t <= o + 1e3 * (((null == (s = r[i + 1]) ? void 0 : s.start) || n) - a.start)) { var l = r[i].sn - e.startSN; if (l < 0) return -1; var u = e.fragments; if (u.length > r.length) for (var d = (r[i + 1] || u[u.length - 1]).sn - e.startSN; d > l; d--) { var h = u[d].programDateTime; if (t >= h && t < h + 1e3 * u[d].duration) return d } return l } } return -1 } function zr(e, t, r) { var i, n, a = new pr(e,r), s = null != (i = a.METHOD) ? i : "", o = a.URI, l = a.hexadecimalInteger("IV"), u = a.KEYFORMATVERSIONS, d = null != (n = a.KEYFORMAT) ? n : "identity"; o && a.IV && !l && Y.error("Invalid IV: " + a.IV); var h = o ? qr.resolve(o, t) : "" , f = (u || "1").split("/").map(Number).filter(Number.isFinite); return new Kr(s,h,d,f,l,a.KEYID) } function $r(e) { var t = new pr(e).decimalFloatingPoint("TIME-OFFSET"); return A(t) ? t : null } function Zr(e, t) { var r = (e || "").split(/[ ,]+/).filter((function(e) { return e } )); ["video", "audio", "text"].forEach((function(e) { var i = r.filter((function(t) { return we(t, e) } )); i.length && (t[e + "Codec"] = i.map((function(e) { return e.split("/")[0] } )).join(","), r = r.filter((function(e) { return -1 === i.indexOf(e) } ))) } )), t.unknownCodecs = r } function Jr(e, t, r) { var i = t[r]; i && (e[r] = i) } function ei(e, t, r) { e.rawProgramDateTime ? r.push(e) : null != t && t.programDateTime && (e.programDateTime = t.endProgramDateTime) } function ti(e, t, r, i) { e.relurl = t.URI, t.BYTERANGE && e.setByteRange(t.BYTERANGE), e.level = r, e.sn = "initSegment", i && (e.levelkeys = i), e.initSegment = null } function ri(e, t, r) { e.levelkeys = t; var i = r.encryptedFragments; i.length && i[i.length - 1].levelkeys === t || !Object.keys(t).some((function(e) { return t[e].isCommonEncryption } )) || i.push(e) } function ii(e, t, r) { e.playlistParsingError = new Error("#EXT-X-" + t + " must not appear more than once (" + r[0] + ")") } function ni(e, t, r) { e.playlistParsingError = new Error("#EXT-X-" + t + " must appear before the first Media Segment (" + r[0] + ")") } function ai(e, t) { var r = t.startPTS; if (A(r)) { var i, n = 0; t.sn > e.sn ? (n = r - e.start, i = e) : (n = e.start - r, i = t), i.duration !== n && i.setDuration(n) } else t.sn > e.sn ? e.cc === t.cc && e.minEndPTS ? t.setStart(e.start + (e.minEndPTS - e.start)) : t.setStart(e.start + e.duration) : t.setStart(Math.max(e.start - t.duration, 0)) } function si(e, t, r, i, n, a, s) { i - r <= 0 && (s.warn("Fragment should have a positive duration", t), i = r + t.duration, a = n + t.duration); var o = r , l = i , u = t.startPTS , d = t.endPTS; if (A(u)) { var h = Math.abs(u - r); e && h > e.totalduration ? s.warn("media timestamps and playlist times differ by " + h + "s for level " + t.level + " " + e.url) : A(t.deltaPTS) ? t.deltaPTS = Math.max(h, t.deltaPTS) : t.deltaPTS = h, o = Math.max(r, u), r = Math.min(r, u), n = void 0 !== t.startDTS ? Math.min(n, t.startDTS) : n, l = Math.min(i, d), i = Math.max(i, d), a = void 0 !== t.endDTS ? Math.max(a, t.endDTS) : a } var f = r - t.start; 0 !== t.start && t.setStart(r), t.setDuration(i - t.start), t.startPTS = r, t.maxStartPTS = o, t.startDTS = n, t.endPTS = i, t.minEndPTS = l, t.endDTS = a; var c, g = t.sn; if (!e || g < e.startSN || g > e.endSN) return 0; var v = g - e.startSN , m = e.fragments; for (m[v] = t, c = v; c > 0; c--) ai(m[c], m[c - 1]); for (c = v; c < m.length - 1; c++) ai(m[c], m[c + 1]); return e.fragmentHint && ai(m[m.length - 1], e.fragmentHint), e.PTSKnown = e.alignedSliding = !0, f } function oi(e, t, r) { if (e !== t) { for (var i, n = null, s = e.fragments, o = s.length - 1; o >= 0; o--) { var l = s[o].initSegment; if (l) { n = l; break } } e.fragmentHint && delete e.fragmentHint.endPTS, function(e, t, r) { for (var i = t.skippedSegments, n = Math.max(e.startSN, t.startSN) - t.startSN, a = (e.fragmentHint ? 1 : 0) + (i ? t.endSN : Math.min(e.endSN, t.endSN)) - t.startSN, s = t.startSN - e.startSN, o = t.fragmentHint ? t.fragments.concat(t.fragmentHint) : t.fragments, l = e.fragmentHint ? e.fragments.concat(e.fragmentHint) : e.fragments, u = n; u <= a; u++) { var d = l[s + u] , h = o[u]; if (i && !h && d && (h = t.fragments[u] = d), d && h) { r(d, h, u, o); var f = d.relurl , c = h.relurl; if (f && mi(f, c)) return void (t.playlistParsingError = li("media sequence mismatch " + h.sn + ":", e, t, 0, h)); if (d.cc !== h.cc) return void (t.playlistParsingError = li("discontinuity sequence mismatch (" + d.cc + "!=" + h.cc + ")", e, t, 0, h)) } } }(e, t, (function(e, r, a, s) { if ((!t.startCC || t.skippedSegments) && r.cc !== e.cc) { for (var o = e.cc - r.cc, l = a; l < s.length; l++) s[l].cc += o; t.endCC = s[s.length - 1].cc } A(e.startPTS) && A(e.endPTS) && (r.setStart(r.startPTS = e.startPTS), r.startDTS = e.startDTS, r.maxStartPTS = e.maxStartPTS, r.endPTS = e.endPTS, r.endDTS = e.endDTS, r.minEndPTS = e.minEndPTS, r.setDuration(e.endPTS - e.startPTS), r.duration && (i = r), t.PTSKnown = t.alignedSliding = !0), e.hasStreams && (r.elementaryStreams = e.elementaryStreams), r.loader = e.loader, e.hasStats && (r.stats = e.stats), e.initSegment && (r.initSegment = e.initSegment, n = e.initSegment) } )); var u = t.fragments , d = t.fragmentHint ? u.concat(t.fragmentHint) : u; if (n && d.forEach((function(e) { var t; !e || e.initSegment && e.initSegment.relurl !== (null == (t = n) ? void 0 : t.relurl) || (e.initSegment = n) } )), t.skippedSegments) { if (t.deltaUpdateFailed = u.some((function(e) { return !e } )), t.deltaUpdateFailed) { r.warn("[level-helper] Previous playlist missing segments skipped in delta playlist"); for (var h = t.skippedSegments; h--; ) u.shift(); t.startSN = u[0].sn } else { t.canSkipDateRanges && (t.dateRanges = function(e, t, r) { var i = t.dateRanges , n = t.recentlyRemovedDateranges , s = a({}, e); n && n.forEach((function(e) { delete s[e] } )); var o = Object.keys(s).length; return o ? (Object.keys(i).forEach((function(e) { var t = s[e] , n = new Er(i[e].attr,t); n.isValid ? (s[e] = n, t || (n.tagOrder += o)) : r.warn('Ignoring invalid Playlist Delta Update DATERANGE tag: "' + lt(i[e].attr) + '"') } )), s) : i }(e.dateRanges, t, r)); var f = e.fragments.filter((function(e) { return e.rawProgramDateTime } )); if (e.hasProgramDateTime && !t.hasProgramDateTime) for (var c = 1; c < d.length; c++) null === d[c].programDateTime && ei(d[c], d[c - 1], f); Xr(f, t) } t.endCC = u[u.length - 1].cc } if (!t.startCC) { var g, v = fi(e, t.startSN - 1); t.startCC = null != (g = null == v ? void 0 : v.cc) ? g : u[0].cc } !function(e, t, r) { if (e && t) for (var i = 0, n = 0, a = e.length; n <= a; n++) { var s = e[n] , o = t[n + i]; s && o && s.index === o.index && s.fragment.sn === o.fragment.sn ? r(s, o) : i-- } }(e.partList, t.partList, (function(e, t) { t.elementaryStreams = e.elementaryStreams, t.stats = e.stats } )), i ? si(t, i, i.startPTS, i.endPTS, i.startDTS, i.endDTS, r) : ui(e, t), u.length && (t.totalduration = t.edge - u[0].start), t.driftStartTime = e.driftStartTime, t.driftStart = e.driftStart; var m = t.advancedDateTime; if (t.advanced && m) { var p = t.edge; t.driftStart || (t.driftStartTime = m, t.driftStart = p), t.driftEndTime = m, t.driftEnd = p } else t.driftEndTime = e.driftEndTime, t.driftEnd = e.driftEnd, t.advancedDateTime = e.advancedDateTime; -1 === t.requestScheduled && (t.requestScheduled = e.requestScheduled) } } function li(e, t, r, i, n) { return new Error(e + " " + n.url + "\nPlaylist starting @" + t.startSN + "\n" + t.m3u8 + "\n\nPlaylist starting @" + r.startSN + "\n" + r.m3u8) } function ui(e, t, r) { void 0 === r && (r = !0); var i = t.startSN + t.skippedSegments - e.startSN , n = e.fragments , a = i >= 0 , s = 0; if (a && i < n.length) s = n[i].start; else if (a && t.startSN === e.endSN + 1) s = e.fragmentEnd; else if (a && r) s = e.fragmentStart + i * t.levelTargetDuration; else { if (t.skippedSegments || 0 !== t.fragmentStart) return; s = e.fragmentStart } di(t, s) } function di(e, t) { if (t) { for (var r = e.fragments, i = e.skippedSegments; i < r.length; i++) r[i].addStart(t); e.fragmentHint && e.fragmentHint.addStart(t) } } function hi(e, t) { void 0 === t && (t = 1 / 0); var r = 1e3 * e.targetduration; if (e.updated) { var i = e.fragments; if (i.length && 4 * r > t) { var n = 1e3 * i[i.length - 1].duration; n < r && (r = n) } } else r /= 2; return Math.round(r) } function fi(e, t, r) { if (!e) return null; var i = e.fragments[t - e.startSN]; return i || ((i = e.fragmentHint) && i.sn === t ? i : t < e.startSN && r && r.sn === t ? r : null) } function ci(e, t, r) { return e ? gi(e.partList, t, r) : null } function gi(e, t, r) { if (e) for (var i = e.length; i--; ) { var n = e[i]; if (n.index === r && n.fragment.sn === t) return n } return null } function vi(e) { e.forEach((function(e, t) { var r; null == (r = e.details) || r.fragments.forEach((function(e) { e.level = t, e.initSegment && (e.initSegment.level = t) } )) } )) } function mi(e, t) { return !(e === t || !t) && pi(e) !== pi(t) } function pi(e) { return e.replace(/\?[^?]*$/, "") } function yi(e, t) { for (var r = 0, i = e.length; r < i; r++) { var n; if ((null == (n = e[r]) ? void 0 : n.cc) === t) return e[r] } return null } function Ei(e, t) { var r = e.start + t; e.startPTS = r, e.setStart(r), e.endPTS = r + e.duration } function Ti(e, t) { for (var r = t.fragments, i = 0, n = r.length; i < n; i++) Ei(r[i], e); t.fragmentHint && Ei(t.fragmentHint, e), t.alignedSliding = !0 } function Si(e, t) { if (function(e, t) { return !!(e && t.startCC < e.endCC && t.endCC > e.startCC) }(t, e)) { var r = Math.min(t.endCC, e.endCC) , i = yi(t.fragments, r) , n = yi(e.fragments, r); i && n && (Y.log("Aligning playlist at start of dicontinuity sequence " + r), Ti(i.start - n.start, e)) } } function Ai(e, t) { if (e.hasProgramDateTime && t.hasProgramDateTime) { var r = e.fragments , i = t.fragments; if (r.length && i.length) { var n, a, s = Math.min(t.endCC, e.endCC); t.startCC < s && e.startCC < s && (n = yi(i, s), a = yi(r, s)), n && a || (a = yi(r, (n = i[Math.floor(i.length / 2)]).cc) || r[Math.floor(r.length / 2)]); var o = n.programDateTime , l = a.programDateTime; o && l && Ti((l - o) / 1e3 - (a.start - n.start), e) } } } function Li(e, t, r) { Ii(e, t, r), e.addEventListener(t, r) } function Ii(e, t, r) { e.removeEventListener(t, r) } var Ri = function(e) { for (var t = "", r = e.length, i = 0; i < r; i++) t += "[" + e.start(i).toFixed(3) + "-" + e.end(i).toFixed(3) + "]"; return t } , ki = { STOPPED: "STOPPED", IDLE: "IDLE", KEY_LOADING: "KEY_LOADING", FRAG_LOADING: "FRAG_LOADING", FRAG_LOADING_WAITING_RETRY: "FRAG_LOADING_WAITING_RETRY", WAITING_TRACK: "WAITING_TRACK", PARSING: "PARSING", PARSED: "PARSED", ENDED: "ENDED", ERROR: "ERROR", WAITING_INIT_PTS: "WAITING_INIT_PTS", WAITING_LEVEL: "WAITING_LEVEL" } , bi = function(e) { function t(t, r, i, n, a) { var s; return (s = e.call(this, n, t.logger) || this).hls = void 0, s.fragPrevious = null, s.fragCurrent = null, s.fragmentTracker = void 0, s.transmuxer = null, s._state = ki.STOPPED, s.playlistType = void 0, s.media = null, s.mediaBuffer = null, s.config = void 0, s.bitrateTest = !1, s.lastCurrentTime = 0, s.nextLoadPosition = 0, s.startPosition = 0, s.startTimeOffset = null, s.retryDate = 0, s.levels = null, s.fragmentLoader = void 0, s.keyLoader = void 0, s.levelLastLoaded = null, s.startFragRequested = !1, s.decrypter = void 0, s.initPTS = [], s.buffering = !0, s.loadingParts = !1, s.loopSn = void 0, s.onMediaSeeking = function() { var e = s , t = e.config , r = e.fragCurrent , i = e.media , n = e.mediaBuffer , a = e.state , o = i ? i.currentTime : 0 , l = ur.bufferInfo(n || i, o, t.maxBufferHole) , u = !l.len; if (s.log("Media seeking to " + (A(o) ? o.toFixed(3) : o) + ", state: " + a + ", " + (u ? "out of" : "in") + " buffer"), s.state === ki.ENDED) s.resetLoadingState(); else if (r) { var d = t.maxFragLookUpTolerance , h = r.start - d , f = r.start + r.duration + d; if (u || f < l.start || h > l.end) { var c = o > f; (o < h || c) && (c && r.loader && (s.log("Cancelling fragment load for seek (sn: " + r.sn + ")"), r.abortRequests(), s.resetLoadingState()), s.fragPrevious = null) } } if (i && (s.fragmentTracker.removeFragmentsInRange(o, 1 / 0, s.playlistType, !0), o > s.lastCurrentTime && (s.lastCurrentTime = o), !s.loadingParts)) { var g = Math.max(l.end, o) , v = s.shouldLoadParts(s.getLevelDetails(), g); v && (s.log("LL-Part loading ON after seeking to " + o.toFixed(2) + " with buffer @" + g.toFixed(2)), s.loadingParts = v) } s.hls.hasEnoughToStart || (s.log("Setting " + (u ? "startPosition" : "nextLoadPosition") + " to " + o + " for seek without enough to start"), s.nextLoadPosition = o, u && (s.startPosition = o)), u && s.state === ki.IDLE && s.tickImmediate() } , s.onMediaEnded = function() { s.log("setting startPosition to 0 because media ended"), s.startPosition = s.lastCurrentTime = 0 } , s.playlistType = a, s.hls = t, s.fragmentLoader = new rr(t.config), s.keyLoader = i, s.fragmentTracker = r, s.config = t.config, s.decrypter = new er(t.config), s } o(t, e); var r = t.prototype; return r.registerListeners = function() { var e = this.hls; e.on(b.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(b.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(b.MANIFEST_LOADING, this.onManifestLoading, this), e.on(b.MANIFEST_LOADED, this.onManifestLoaded, this), e.on(b.ERROR, this.onError, this) } , r.unregisterListeners = function() { var e = this.hls; e.off(b.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(b.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(b.MANIFEST_LOADING, this.onManifestLoading, this), e.off(b.MANIFEST_LOADED, this.onManifestLoaded, this), e.off(b.ERROR, this.onError, this) } , r.doTick = function() { this.onTickEnd() } , r.onTickEnd = function() {} , r.startLoad = function(e) {} , r.stopLoad = function() { if (this.state !== ki.STOPPED) { this.fragmentLoader.abort(), this.keyLoader.abort(this.playlistType); var e = this.fragCurrent; null != e && e.loader && (e.abortRequests(), this.fragmentTracker.removeFragment(e)), this.resetTransmuxer(), this.fragCurrent = null, this.fragPrevious = null, this.clearInterval(), this.clearNextTick(), this.state = ki.STOPPED } } , r.pauseBuffering = function() { this.buffering = !1 } , r.resumeBuffering = function() { this.buffering = !0 } , r._streamEnded = function(e, t) { if (t.live || !this.media) return !1; var r = e.end || 0 , i = this.config.timelineOffset || 0; if (r <= i) return !1; var n = e.buffered; this.config.maxBufferHole && n && n.length > 1 && (e = ur.bufferedInfo(n, e.start, 0)); var a = e.nextStart; if (a && a > i && a < t.edge) return !1; if (this.media.currentTime < e.start) return !1; var s = t.partList; if (null != s && s.length) { var o = s[s.length - 1]; return ur.isBuffered(this.media, o.start + o.duration / 2) } var l = t.fragments[t.fragments.length - 1].type; return this.fragmentTracker.isEndListAppended(l) } , r.getLevelDetails = function() { if (this.levels && null !== this.levelLastLoaded) return this.levelLastLoaded.details } , r.onMediaAttached = function(e, t) { var r = this.media = this.mediaBuffer = t.media; Li(r, "seeking", this.onMediaSeeking), Li(r, "ended", this.onMediaEnded); var i = this.config; this.levels && i.autoStartLoad && this.state === ki.STOPPED && this.startLoad(i.startPosition) } , r.onMediaDetaching = function(e, t) { var r = !!t.transferMedia , i = this.media; if (null !== i) { if (i.ended && (this.log("MSE detaching and video ended, reset startPosition"), this.startPosition = this.lastCurrentTime = 0), Ii(i, "seeking", this.onMediaSeeking), Ii(i, "ended", this.onMediaEnded), this.keyLoader && !r && this.keyLoader.detach(), this.media = this.mediaBuffer = null, this.loopSn = void 0, r) return this.resetLoadingState(), void this.resetTransmuxer(); this.loadingParts = !1, this.fragmentTracker.removeAllFragments(), this.stopLoad() } } , r.onManifestLoading = function() { this.initPTS = [], this.levels = this.levelLastLoaded = this.fragCurrent = null, this.lastCurrentTime = this.startPosition = 0, this.startFragRequested = !1 } , r.onError = function(e, t) {} , r.onManifestLoaded = function(e, t) { this.startTimeOffset = t.startTimeOffset } , r.onHandlerDestroying = function() { this.stopLoad(), this.transmuxer && (this.transmuxer.destroy(), this.transmuxer = null), e.prototype.onHandlerDestroying.call(this), this.hls = this.onMediaSeeking = this.onMediaEnded = null } , r.onHandlerDestroyed = function() { this.state = ki.STOPPED, this.fragmentLoader && this.fragmentLoader.destroy(), this.keyLoader && this.keyLoader.destroy(), this.decrypter && this.decrypter.destroy(), this.hls = this.log = this.warn = this.decrypter = this.keyLoader = this.fragmentLoader = this.fragmentTracker = null, e.prototype.onHandlerDestroyed.call(this) } , r.loadFragment = function(e, t, r) { this.startFragRequested = !0, this._loadFragForPlayback(e, t, r) } , r._loadFragForPlayback = function(e, t, r) { var i = this; this._doFragLoad(e, t, r, (function(e) { var t = e.frag; if (i.fragContextChanged(t)) return i.warn(t.type + " sn: " + t.sn + (e.part ? " part: " + e.part.index : "") + " of " + i.fragInfo(t, !1, e.part) + ") was dropped during download."), void i.fragmentTracker.removeFragment(t); t.stats.chunkCount++, i._handleFragmentLoadProgress(e) } )).then((function(e) { if (e) { var t = i.state , r = e.frag; i.fragContextChanged(r) ? (t === ki.FRAG_LOADING || !i.fragCurrent && t === ki.PARSING) && (i.fragmentTracker.removeFragment(r), i.state = ki.IDLE) : ("payload"in e && (i.log("Loaded " + r.type + " sn: " + r.sn + " of " + i.playlistLabel() + " " + r.level), i.hls.trigger(b.FRAG_LOADED, e)), i._handleFragmentLoadComplete(e)) } } )).catch((function(t) { i.state !== ki.STOPPED && i.state !== ki.ERROR && (i.warn("Frag error: " + ((null == t ? void 0 : t.message) || t)), i.resetFragmentLoading(e)) } )) } , r.clearTrackerIfNeeded = function(e) { var t, r = this.fragmentTracker; if (r.getState(e) === Vt) { var i = e.type , n = this.getFwdBufferInfo(this.mediaBuffer, i) , a = Math.max(e.duration, n ? n.len : this.config.maxBufferLength) , s = this.backtrackFragment; (1 == (s ? e.sn - s.sn : 0) || this.reduceMaxBufferLength(a, e.duration)) && r.removeFragment(e) } else 0 === (null == (t = this.mediaBuffer) ? void 0 : t.buffered.length) ? r.removeAllFragments() : r.hasParts(e.type) && (r.detectPartialFragments({ frag: e, part: null, stats: e.stats, id: e.type }), r.getState(e) === Ht && r.removeFragment(e)) } , r.checkLiveUpdate = function(e) { if (e.updated && !e.live) { var t = e.fragments[e.fragments.length - 1]; this.fragmentTracker.detectPartialFragments({ frag: t, part: null, stats: t.stats, id: t.type }) } e.fragments[0] || (e.deltaUpdateFailed = !0) } , r.waitForLive = function(e) { var t = e.details; return (null == t ? void 0 : t.live) && "EVENT" !== t.type && (this.levelLastLoaded !== e || t.expired) } , r.flushMainBuffer = function(e, t, r) { if (void 0 === r && (r = null), e - t) { var i = { startOffset: e, endOffset: t, type: r }; this.hls.trigger(b.BUFFER_FLUSHING, i) } } , r._loadInitSegment = function(e, t) { var r = this; this._doFragLoad(e, t).then((function(e) { var t = null == e ? void 0 : e.frag; if (!t || r.fragContextChanged(t) || !r.levels) throw new Error("init load aborted"); return e } )).then((function(e) { var t = r.hls , i = e.frag , n = e.payload , a = i.decryptdata; if (n && n.byteLength > 0 && null != a && a.key && a.iv && Lr(a.method)) { var s = self.performance.now(); return r.decrypter.decrypt(new Uint8Array(n), a.key.buffer, a.iv.buffer, Ir(a.method)).catch((function(e) { throw t.trigger(b.ERROR, { type: R.MEDIA_ERROR, details: k.FRAG_DECRYPT_ERROR, fatal: !1, error: e, reason: e.message, frag: i }), e } )).then((function(n) { var a = self.performance.now(); return t.trigger(b.FRAG_DECRYPTED, { frag: i, payload: n, stats: { tstart: s, tdecrypt: a } }), e.payload = n, r.completeInitSegmentLoad(e) } )) } return r.completeInitSegmentLoad(e) } )).catch((function(t) { r.state !== ki.STOPPED && r.state !== ki.ERROR && (r.warn(t), r.resetFragmentLoading(e)) } )) } , r.completeInitSegmentLoad = function(e) { if (!this.levels) throw new Error("init load aborted, missing levels"); var t = e.frag.stats; this.state !== ki.STOPPED && (this.state = ki.IDLE), e.frag.data = new Uint8Array(e.payload), t.parsing.start = t.buffering.start = self.performance.now(), t.parsing.end = t.buffering.end = self.performance.now(), this.tick() } , r.unhandledEncryptionError = function(e, t) { var r, i, n = e.tracks; if (n && !t.encrypted && (null != (r = n.audio) && r.encrypted || null != (i = n.video) && i.encrypted) && (!this.config.emeEnabled || !this.keyLoader.emeController)) { var a = this.media , s = new Error("Encrypted track with no key in " + this.fragInfo(t) + " (media " + (a ? "attached mediaKeys: " + a.mediaKeys : "detached") + ")"); return this.warn(s.message), !(!a || a.mediaKeys) && (this.hls.trigger(b.ERROR, { type: R.KEY_SYSTEM_ERROR, details: k.KEY_SYSTEM_NO_KEYS, fatal: !1, error: s, frag: t }), this.resetTransmuxer(), !0) } return !1 } , r.fragContextChanged = function(e) { var t = this.fragCurrent; return !e || !t || e.sn !== t.sn || e.level !== t.level } , r.fragBufferedComplete = function(e, t) { var r = this.mediaBuffer ? this.mediaBuffer : this.media; if (this.log("Buffered " + e.type + " sn: " + e.sn + (t ? " part: " + t.index : "") + " of " + this.fragInfo(e, !1, t) + " > buffer:" + (r ? Ri(ur.getBuffered(r)) : "(detached)") + ")"), te(e)) { var i; if (e.type !== x) { var n = e.elementaryStreams; if (!Object.keys(n).some((function(e) { return !!n[e] } ))) return void (this.state = ki.IDLE) } var a = null == (i = this.levels) ? void 0 : i[e.level]; null != a && a.fragmentError && (this.log("Resetting level fragment error count of " + a.fragmentError + " on frag buffered"), a.fragmentError = 0) } this.state = ki.IDLE } , r._handleFragmentLoadComplete = function(e) { var t = this.transmuxer; if (t) { var r = e.frag , i = e.part , n = e.partsLoaded , a = !n || 0 === n.length || n.some((function(e) { return !e } )) , s = new or(r.level,r.sn,r.stats.chunkCount + 1,0,i ? i.index : -1,!a); t.flush(s) } } , r._handleFragmentLoadProgress = function(e) {} , r._doFragLoad = function(e, t, r, i) { var n, a = this; void 0 === r && (r = null), this.fragCurrent = e; var s = t.details; if (!this.levels || !s) throw new Error("frag load aborted, missing level" + (s ? "" : " detail") + "s"); var o = null; if (!e.encrypted || null != (n = e.decryptdata) && n.key) e.encrypted || (o = this.keyLoader.loadClear(e, s.encryptedFragments, this.startFragRequested)) && this.log("[eme] blocking frag load until media-keys acquired"); else if (this.log("Loading key for " + e.sn + " of [" + s.startSN + "-" + s.endSN + "], " + this.playlistLabel() + " " + e.level), this.state = ki.KEY_LOADING, this.fragCurrent = e, o = this.keyLoader.load(e).then((function(e) { if (!a.fragContextChanged(e.frag)) return a.hls.trigger(b.KEY_LOADED, e), a.state === ki.KEY_LOADING && (a.state = ki.IDLE), e } )), this.hls.trigger(b.KEY_LOADING, { frag: e }), null === this.fragCurrent) return this.log("context changed in KEY_LOADING"), Promise.resolve(null); var l, u = this.fragPrevious; if (te(e) && (!u || e.sn !== u.sn)) { var d = this.shouldLoadParts(t.details, e.end); d !== this.loadingParts && (this.log("LL-Part loading " + (d ? "ON" : "OFF") + " loading sn " + (null == u ? void 0 : u.sn) + "->" + e.sn), this.loadingParts = d) } if (r = Math.max(e.start, r || 0), this.loadingParts && te(e)) { var h = s.partList; if (h && i) { r > s.fragmentEnd && s.fragmentHint && (e = s.fragmentHint); var f = this.getNextPart(h, e, r); if (f > -1) { var c, g = h[f]; return e = this.fragCurrent = g.fragment, this.log("Loading " + e.type + " sn: " + e.sn + " part: " + g.index + " (" + f + "/" + (h.length - 1) + ") of " + this.fragInfo(e, !1, g) + ") cc: " + e.cc + " [" + s.startSN + "-" + s.endSN + "], target: " + parseFloat(r.toFixed(3))), this.nextLoadPosition = g.start + g.duration, this.state = ki.FRAG_LOADING, c = o ? o.then((function(r) { return !r || a.fragContextChanged(r.frag) ? null : a.doFragPartsLoad(e, g, t, i) } )).catch((function(e) { return a.handleFragLoadError(e) } )) : this.doFragPartsLoad(e, g, t, i).catch((function(e) { return a.handleFragLoadError(e) } )), this.hls.trigger(b.FRAG_LOADING, { frag: e, part: g, targetBufferTime: r }), null === this.fragCurrent ? Promise.reject(new Error("frag load aborted, context changed in FRAG_LOADING parts")) : c } if (!e.url || this.loadedEndOfParts(h, r)) return Promise.resolve(null) } } if (te(e) && this.loadingParts) this.log("LL-Part loading OFF after next part miss @" + r.toFixed(2) + " Check buffer at sn: " + e.sn + " loaded parts: " + (null == (l = s.partList) ? void 0 : l.filter((function(e) { return e.loaded } )).map((function(e) { return "[" + e.start + "-" + e.end + "]" } )))), this.loadingParts = !1; else if (!e.url) return Promise.resolve(null); this.log("Loading " + e.type + " sn: " + e.sn + " of " + this.fragInfo(e, !1) + ") cc: " + e.cc + " [" + s.startSN + "-" + s.endSN + "], target: " + parseFloat(r.toFixed(3))), A(e.sn) && !this.bitrateTest && (this.nextLoadPosition = e.start + e.duration), this.state = ki.FRAG_LOADING; var v, m = this.config.progressive; return v = m && o ? o.then((function(t) { return !t || a.fragContextChanged(t.frag) ? null : a.fragmentLoader.load(e, i) } )).catch((function(e) { return a.handleFragLoadError(e) } )) : Promise.all([this.fragmentLoader.load(e, m ? i : void 0), o]).then((function(e) { var t = e[0]; return !m && i && i(t), t } )).catch((function(e) { return a.handleFragLoadError(e) } )), this.hls.trigger(b.FRAG_LOADING, { frag: e, targetBufferTime: r }), null === this.fragCurrent ? Promise.reject(new Error("frag load aborted, context changed in FRAG_LOADING")) : v } , r.doFragPartsLoad = function(e, t, r, i) { var n = this; return new Promise((function(a, s) { var o, l = [], u = null == (o = r.details) ? void 0 : o.partList, d = function(t) { n.fragmentLoader.loadPart(e, t, i).then((function(i) { l[t.index] = i; var s = i.part; n.hls.trigger(b.FRAG_LOADED, i); var o = ci(r.details, e.sn, t.index + 1) || gi(u, e.sn, t.index + 1); if (!o) return a({ frag: e, part: s, partsLoaded: l }); d(o) } )).catch(s) }; d(t) } )) } , r.handleFragLoadError = function(e) { if ("data"in e) { var t = e.data; t.frag && t.details === k.INTERNAL_ABORTED ? this.handleFragLoadAborted(t.frag, t.part) : t.frag && t.type === R.KEY_SYSTEM_ERROR ? (t.frag.abortRequests(), this.resetStartWhenNotLoaded(), this.resetFragmentLoading(t.frag)) : this.hls.trigger(b.ERROR, t) } else this.hls.trigger(b.ERROR, { type: R.OTHER_ERROR, details: k.INTERNAL_EXCEPTION, err: e, error: e, fatal: !0 }); return null } , r._handleTransmuxerFlush = function(e) { var t = this.getCurrentContext(e); if (t && this.state === ki.PARSING) { var r = t.frag , i = t.part , n = t.level , a = self.performance.now(); r.stats.parsing.end = a, i && (i.stats.parsing.end = a); var s = this.getLevelDetails() , o = s && r.sn > s.endSN || this.shouldLoadParts(s, r.end); o !== this.loadingParts && (this.log("LL-Part loading " + (o ? "ON" : "OFF") + " after parsing segment ending @" + r.end.toFixed(2)), this.loadingParts = o), this.updateLevelTiming(r, i, n, e.partial) } else this.fragCurrent || this.state === ki.STOPPED || this.state === ki.ERROR || (this.state = ki.IDLE) } , r.shouldLoadParts = function(e, t) { if (this.config.lowLatencyMode) { if (!e) return this.loadingParts; if (e.partList) { var r, i, n = e.partList[0]; if (n.fragment.type === x) return !1; if (t >= n.end + ((null == (r = e.fragmentHint) ? void 0 : r.duration) || 0) && (this.hls.hasEnoughToStart ? (null == (i = this.media) ? void 0 : i.currentTime) || this.lastCurrentTime : this.getLoadPosition()) > n.start - n.fragment.duration) return !0 } } return !1 } , r.getCurrentContext = function(e) { var t = this.levels , r = this.fragCurrent , i = e.level , n = e.sn , a = e.part; if (null == t || !t[i]) return this.warn("Levels object was unset while buffering fragment " + n + " of " + this.playlistLabel() + " " + i + ". The current chunk will not be buffered."), null; var s = t[i] , o = s.details , l = a > -1 ? ci(o, n, a) : null , u = l ? l.fragment : fi(o, n, r); return u ? (r && r !== u && (u.stats = r.stats), { frag: u, part: l, level: s }) : null } , r.bufferFragmentData = function(e, t, r, i, n) { if (this.state === ki.PARSING) { var a = e.data1 , s = e.data2 , o = a; if (s && (o = Ae(a, s)), o.length) { var l = this.initPTS[t.cc] , u = l ? -l.baseTime / l.timescale : void 0 , d = { type: e.type, frag: t, part: r, chunkMeta: i, offset: u, parent: t.type, data: o }; if (this.hls.trigger(b.BUFFER_APPENDING, d), e.dropped && e.independent && !r) { if (n) return; this.flushBufferGap(t) } } } } , r.flushBufferGap = function(e) { var t = this.media; if (t) if (ur.isBuffered(t, t.currentTime)) { var r = t.currentTime , i = ur.bufferInfo(t, r, 0) , n = e.duration , a = Math.min(2 * this.config.maxFragLookUpTolerance, .25 * n) , s = Math.max(Math.min(e.start - a, i.end - a), r + a); e.start - s > a && this.flushMainBuffer(s, e.start) } else this.flushMainBuffer(0, e.start) } , r.getFwdBufferInfo = function(e, t) { var r, i = this.getLoadPosition(); if (!A(i)) return null; var n = this.lastCurrentTime > i || null != (r = this.media) && r.paused ? 0 : this.config.maxBufferHole; return this.getFwdBufferInfoAtPos(e, i, t, n) } , r.getFwdBufferInfoAtPos = function(e, t, r, i) { var n = ur.bufferInfo(e, t, i); if (0 === n.len && void 0 !== n.nextStart) { var a = this.fragmentTracker.getBufferedFrag(t, r); if (a && (n.nextStart <= a.end || a.gap)) { var s = Math.max(Math.min(n.nextStart, a.end) - t, i); return ur.bufferInfo(e, t, s) } } return n } , r.getMaxBufferLength = function(e) { var t, r = this.config; return t = e ? Math.max(8 * r.maxBufferSize / e, r.maxBufferLength) : r.maxBufferLength, Math.min(t, r.maxMaxBufferLength) } , r.reduceMaxBufferLength = function(e, t) { var r = this.config , i = Math.max(Math.min(e - t, r.maxBufferLength), t) , n = Math.max(e - 3 * t, r.maxMaxBufferLength / 2, i); return n >= i && (r.maxMaxBufferLength = n, this.warn("Reduce max buffer length to " + n + "s"), !0) } , r.getAppendedFrag = function(e, t) { void 0 === t && (t = w); var r = this.fragmentTracker ? this.fragmentTracker.getAppendedFrag(e, t) : null; return r && "fragment"in r ? r.fragment : r } , r.getNextFragment = function(e, t) { var r = t.fragments , i = r.length; if (!i) return null; var n = this.config , a = r[0].start , s = n.lowLatencyMode && !!t.partList , o = null; if (t.live) { var l = n.initialLiveManifestSize; if (i < l) return this.warn("Not enough fragments to start playback (have: " + i + ", need: " + l + ")"), null; if (!t.PTSKnown && !this.startFragRequested && -1 === this.startPosition || e < a) { var u; s && !this.loadingParts && (this.log("LL-Part loading ON for initial live fragment"), this.loadingParts = !0), o = this.getInitialLiveFragment(t); var d = this.hls.startPosition , h = this.hls.liveSyncPosition , f = o ? (-1 !== d && d >= a ? d : h) || o.start : e; this.log("Setting startPosition to " + f + " to match start frag at live edge. mainStart: " + d + " liveSyncPosition: " + h + " frag.start: " + (null == (u = o) ? void 0 : u.start)), this.startPosition = this.nextLoadPosition = f } } else e <= a && (o = r[0]); if (!o) { var c = this.loadingParts ? t.partEnd : t.fragmentEnd; o = this.getFragmentAtPosition(e, c, t) } var g = this.filterReplacedPrimary(o, t); if (!g && o) { var v = o.sn - t.startSN; g = this.filterReplacedPrimary(r[v + 1] || null, t) } return this.mapToInitFragWhenRequired(g) } , r.isLoopLoading = function(e, t) { var r = this.fragmentTracker.getState(e); return (r === Yt || r === Ht && !!e.gap) && this.nextLoadPosition > t } , r.getNextFragmentLoopLoading = function(e, t, r, i, n) { var a = null; if (e.gap && (a = this.getNextFragment(this.nextLoadPosition, t)) && !a.gap && r.nextStart) { var s = this.getFwdBufferInfoAtPos(this.mediaBuffer ? this.mediaBuffer : this.media, r.nextStart, i, 0); if (null !== s && r.len + s.len >= n) { var o = a.sn; return this.loopSn !== o && (this.log('buffer full after gaps in "' + i + '" playlist starting at sn: ' + o), this.loopSn = o), null } } return this.loopSn = void 0, a } , r.filterReplacedPrimary = function(e, t) { if (!e) return e; if (Di(this.config) && e.type !== x) { var r = this.hls.interstitialsManager , i = null == r ? void 0 : r.bufferingItem; if (i) { var n = i.event; if (n) { if (n.appendInPlace || Math.abs(e.start - i.start) > 1 || 0 === i.start) return null } else { if (e.end <= i.start && !1 === (null == t ? void 0 : t.live)) return null; if (e.start > i.end && i.nextEvent && (i.nextEvent.appendInPlace || e.start - i.end > 1)) return null } } var a = null == r ? void 0 : r.playerQueue; if (a) for (var s = a.length; s--; ) { var o = a[s].interstitial; if (o.appendInPlace && e.start >= o.startTime && e.end <= o.resumeTime) return null } } return e } , r.mapToInitFragWhenRequired = function(e) { return null == e || !e.initSegment || e.initSegment.data || this.bitrateTest ? e : e.initSegment } , r.getNextPart = function(e, t, r) { for (var i = -1, n = !1, a = !0, s = 0, o = e.length; s < o; s++) { var l = e[s]; if (a = a && !l.independent, i > -1 && r < l.start) break; var u = l.loaded; u ? i = -1 : (n || (l.independent || a) && l.fragment === t) && (l.fragment !== t && this.warn("Need buffer at " + r + " but next unloaded part starts at " + l.start), i = s), n = u } return i } , r.loadedEndOfParts = function(e, t) { for (var r, i = e.length; i--; ) { if (!(r = e[i]).loaded) return !1; if (t > r.start) return !0 } return !1 } , r.getInitialLiveFragment = function(e) { var t = e.fragments , r = this.fragPrevious , i = null; if (r) { if (e.hasProgramDateTime && (this.log("Live playlist, switching playlist, load frag with same PDT: " + r.programDateTime), i = function(e, t, r) { if (null === t || !Array.isArray(e) || !e.length || !A(t)) return null; if (t < (e[0].programDateTime || 0)) return null; if (t >= (e[e.length - 1].endProgramDateTime || 0)) return null; for (var i = 0; i < e.length; ++i) { var n = e[i]; if (St(t, r, n)) return n } return null }(t, r.endProgramDateTime, this.config.maxFragLookUpTolerance)), !i) { var n = r.sn + 1; if (n >= e.startSN && n <= e.endSN) { var a = t[n - e.startSN]; r.cc === a.cc && (i = a, this.log("Live playlist, switching playlist, load frag with next SN: " + i.sn)) } i || (i = At(e, r.cc, r.end)) && this.log("Live playlist, switching playlist, load frag with same CC: " + i.sn) } } else { var s = this.hls.liveSyncPosition; null !== s && (i = this.getFragmentAtPosition(s, this.bitrateTest ? e.fragmentEnd : e.edge, e)) } return i } , r.getFragmentAtPosition = function(e, t, r) { var i, n, a = this.config, s = this.fragPrevious, o = r.fragments, l = r.endSN, u = r.fragmentHint, d = a.maxFragLookUpTolerance, h = r.partList, f = !!(this.loadingParts && null != h && h.length && u); if (f && !this.bitrateTest && h[h.length - 1].fragment.sn === u.sn && (o = o.concat(u), l = u.sn), i = e < t ? Et(s, o, e, e < this.lastCurrentTime || e > t - d || null != (n = this.media) && n.paused || !this.startFragRequested ? 0 : d) : o[o.length - 1]) { var c = i.sn - r.startSN , g = this.fragmentTracker.getState(i); if ((g === Yt || g === Ht && i.gap) && (s = i), s && i.sn === s.sn && (!f || h[0].fragment.sn > i.sn || !r.live) && i.level === s.level) { var v = o[c + 1]; i = i.sn < l && this.fragmentTracker.getState(v) !== Yt ? v : null } } return i } , r.alignPlaylists = function(e, t, r) { var i = e.fragments.length; if (!i) return this.warn("No fragments in live playlist"), 0; var n = e.fragmentStart , a = !t , s = e.alignedSliding && A(n); if (a || !s && !n) { !function(e, t) { e && (Si(t, e), t.alignedSliding || Ai(t, e), t.alignedSliding || t.skippedSegments || ui(e, t, !1)) }(r, e); var o = e.fragmentStart; return this.log("Live playlist sliding: " + o.toFixed(2) + " start-sn: " + (t ? t.startSN : "na") + "->" + e.startSN + " fragments: " + i), o } return n } , r.waitForCdnTuneIn = function(e) { return e.live && e.canBlockReload && e.partTarget && e.tuneInGoal > Math.max(e.partHoldBack, 3 * e.partTarget) } , r.setStartPosition = function(e, t) { var r = this.startPosition; r < t && (r = -1); var i = this.timelineOffset; if (-1 === r) { var n = null !== this.startTimeOffset , a = n ? this.startTimeOffset : e.startTimeOffset; null !== a && A(a) ? (r = t + a, a < 0 && (r += e.edge), r = Math.min(Math.max(t, r), t + e.totalduration), this.log("Setting startPosition to " + r + " for start time offset " + a + " found in " + (n ? "multivariant" : "media") + " playlist"), this.startPosition = r) : e.live ? (r = this.hls.liveSyncPosition || t, this.log("Setting startPosition to -1 to start at live edge " + r), this.startPosition = -1) : (this.log("setting startPosition to 0 by default"), this.startPosition = r = 0), this.lastCurrentTime = r + i } this.nextLoadPosition = r + i } , r.getLoadPosition = function() { var e, t = this.media, r = 0; return null != (e = this.hls) && e.hasEnoughToStart && t ? r = t.currentTime : this.nextLoadPosition >= 0 && (r = this.nextLoadPosition), r } , r.handleFragLoadAborted = function(e, t) { this.transmuxer && e.type === this.playlistType && te(e) && e.stats.aborted && (this.log("Fragment " + e.sn + (t ? " part " + t.index : "") + " of " + this.playlistLabel() + " " + e.level + " was aborted"), this.resetFragmentLoading(e)) } , r.resetFragmentLoading = function(e) { this.fragCurrent && (this.fragContextChanged(e) || this.state === ki.FRAG_LOADING_WAITING_RETRY) || (this.state = ki.IDLE) } , r.onFragmentOrKeyLoadError = function(e, t) { var r; if (t.chunkMeta && !t.frag) { var i = this.getCurrentContext(t.chunkMeta); i && (t.frag = i.frag) } var n = t.frag; if (n && n.type === e && this.levels) if (this.fragContextChanged(n)) { var a; this.warn("Frag load error must match current frag to retry " + n.url + " > " + (null == (a = this.fragCurrent) ? void 0 : a.url)) } else { var s = t.details === k.FRAG_GAP; s && this.fragmentTracker.fragBuffered(n, !0); var o = t.errorAction; if (o) { var l = o.action , u = o.flags , d = o.retryCount , h = void 0 === d ? 0 : d , f = o.retryConfig , c = !!f , g = c && l === xt , v = c && !o.resolved && u === Ft , m = null == (r = this.hls.latestLevelDetails) ? void 0 : r.live; if (!g && v && te(n) && !n.endList && m && !Rt(t)) this.resetFragmentErrors(e), this.treatAsGap(n), o.resolved = !0; else if ((g || v) && h < f.maxNumRetry) { var p, y = Pt(null == (p = t.response) ? void 0 : p.code), E = bt(f, h); if (this.resetStartWhenNotLoaded(), this.retryDate = self.performance.now() + E, this.state = ki.FRAG_LOADING_WAITING_RETRY, o.resolved = !0, y) return this.log("Waiting for connection (offline)"), this.retryDate = 1 / 0, void (t.reason = "offline"); this.warn("Fragment " + n.sn + " of " + e + " " + n.level + " errored with " + t.details + ", retrying loading " + (h + 1) + "/" + f.maxNumRetry + " in " + E + "ms") } else if (f) { if (this.resetFragmentErrors(e), !(h < f.maxNumRetry)) return void this.warn(t.details + " reached or exceeded max retry (" + h + ")"); s || l === Ot || (o.resolved = !0) } else this.state = l === wt ? ki.WAITING_LEVEL : ki.ERROR; this.tickImmediate() } else this.state = ki.ERROR } } , r.checkRetryDate = function() { var e = self.performance.now() , t = this.retryDate , r = t === 1 / 0; (!t || e >= t || r && !Pt(0)) && (r && this.log("Connection restored (online)"), this.resetStartWhenNotLoaded(), this.state = ki.IDLE) } , r.reduceLengthAndFlushBuffer = function(e) { if (this.state === ki.PARSING || this.state === ki.PARSED) { var t = e.frag , r = e.parent , i = this.getFwdBufferInfo(this.mediaBuffer, r) , n = i && i.len > .5; n && this.reduceMaxBufferLength(i.len, (null == t ? void 0 : t.duration) || 10); var a = !n; return a && this.warn("Buffer full error while media.currentTime (" + this.getLoadPosition() + ") is not buffered, flush " + r + " buffer"), t && (this.fragmentTracker.removeFragment(t), this.nextLoadPosition = t.start), this.resetLoadingState(), a } return !1 } , r.resetFragmentErrors = function(e) { e === O && (this.fragCurrent = null), this.hls.hasEnoughToStart || (this.startFragRequested = !1), this.state !== ki.STOPPED && (this.state = ki.IDLE) } , r.afterBufferFlushed = function(e, t, r) { if (e) { var i = ur.getBuffered(e); this.fragmentTracker.detectEvictedFragments(t, i, r), this.state === ki.ENDED && this.resetLoadingState() } } , r.resetLoadingState = function() { this.log("Reset loading state"), this.fragCurrent = null, this.fragPrevious = null, this.state !== ki.STOPPED && (this.state = ki.IDLE) } , r.resetStartWhenNotLoaded = function() { if (!this.hls.hasEnoughToStart) { this.startFragRequested = !1; var e = this.levelLastLoaded , t = e ? e.details : null; null != t && t.live ? (this.log("resetting startPosition for live start"), this.startPosition = -1, this.setStartPosition(t, t.fragmentStart), this.resetLoadingState()) : this.nextLoadPosition = this.startPosition } } , r.resetWhenMissingContext = function(e) { this.log("Loading context changed while buffering sn " + e.sn + " of " + this.playlistLabel() + " " + (-1 === e.level ? "" : e.level) + ". This chunk will not be buffered."), this.removeUnbufferedFrags(), this.resetStartWhenNotLoaded(), this.resetLoadingState() } , r.removeUnbufferedFrags = function(e) { void 0 === e && (e = 0), this.fragmentTracker.removeFragmentsInRange(e, 1 / 0, this.playlistType, !1, !0) } , r.updateLevelTiming = function(e, t, r, i) { var n = this , a = r.details; if (a) { var s; if (!Object.keys(e.elementaryStreams).reduce((function(t, s) { var o = e.elementaryStreams[s]; if (o) { var l = o.endPTS - o.startPTS; if (l <= 0) return n.warn("Could not parse fragment " + e.sn + " " + s + " duration reliably (" + l + ")"), t || !1; var u = i ? 0 : si(a, e, o.startPTS, o.endPTS, o.startDTS, o.endDTS, n); return n.hls.trigger(b.LEVEL_PTS_UPDATED, { details: a, level: r, drift: u, type: s, frag: e, start: o.startPTS, end: o.endPTS }), !0 } return t } ), !1) && (0 === r.fragmentError && this.treatAsGap(e, r), null === (null == (s = this.transmuxer) ? void 0 : s.error))) { var o = new Error("Found no media in fragment " + e.sn + " of " + this.playlistLabel() + " " + e.level + " resetting transmuxer to fallback to playlist timing"); if (this.warn(o.message), this.hls.trigger(b.ERROR, { type: R.MEDIA_ERROR, details: k.FRAG_PARSING_ERROR, fatal: !1, error: o, frag: e, reason: "Found no media in msn " + e.sn + " of " + this.playlistLabel() + ' "' + r.url + '"' }), !this.hls) return; this.resetTransmuxer() } this.state = ki.PARSED, this.log("Parsed " + e.type + " sn: " + e.sn + (t ? " part: " + t.index : "") + " of " + this.fragInfo(e, !1, t) + ")"), this.hls.trigger(b.FRAG_PARSED, { frag: e, part: t }) } else this.warn("level.details undefined") } , r.playlistLabel = function() { return this.playlistType === w ? "level" : "track" } , r.fragInfo = function(e, t, r) { var i, n; return void 0 === t && (t = !0), this.playlistLabel() + " " + e.level + " (" + (r ? "part" : "frag") + ":[" + (null != (i = t && !r ? e.startPTS : (r || e).start) ? i : NaN).toFixed(3) + "-" + (null != (n = t && !r ? e.endPTS : (r || e).end) ? n : NaN).toFixed(3) + "]" + (r && "main" === e.type ? "INDEPENDENT=" + (r.independent ? "YES" : "NO") : "") } , r.treatAsGap = function(e, t) { t && t.fragmentError++, e.gap = !0, this.fragmentTracker.removeFragment(e), this.fragmentTracker.fragBuffered(e, !0) } , r.resetTransmuxer = function() { var e; null == (e = this.transmuxer) || e.reset() } , r.recoverWorkerError = function(e) { "demuxerWorker" === e.event && (this.fragmentTracker.removeAllFragments(), this.transmuxer && (this.transmuxer.destroy(), this.transmuxer = null), this.resetStartWhenNotLoaded(), this.resetLoadingState()) } , i(t, [{ key: "startPositionValue", get: function() { var e = this.nextLoadPosition , t = this.startPosition; return -1 === t && e ? e : t } }, { key: "bufferingEnabled", get: function() { return this.buffering } }, { key: "inFlightFrag", get: function() { return { frag: this.fragCurrent, state: this.state } } }, { key: "timelineOffset", get: function() { var e, t = this.config.timelineOffset; return t ? (null == (e = this.getLevelDetails()) ? void 0 : e.appliedTimelineOffset) || t : 0 } }, { key: "primaryPrefetch", get: function() { var e; return !(!Di(this.config) || !(null == (e = this.hls.interstitialsManager) || null == (e = e.playingItem) ? void 0 : e.event)) } }, { key: "state", get: function() { return this._state }, set: function(e) { var t = this._state; t !== e && (this._state = e, this.log(t + "->" + e)) } }]) }(sr); function Di(e) { return !!e.interstitialsController && !1 !== e.enableInterstitialPlayback } var _i = function() { function e() { this.chunks = [], this.dataLength = 0 } var t = e.prototype; return t.push = function(e) { this.chunks.push(e), this.dataLength += e.length } , t.flush = function() { var e, t = this.chunks, r = this.dataLength; return t.length ? (e = 1 === t.length ? t[0] : function(e, t) { for (var r = new Uint8Array(t), i = 0, n = 0; n < e.length; n++) { var a = e[n]; r.set(a, i), i += a.length } return r }(t, r), this.reset(), e) : new Uint8Array(0) } , t.reset = function() { this.chunks.length = 0, this.dataLength = 0 } , e }(); function Pi(e, t) { return t + 10 <= e.length && 51 === e[t] && 68 === e[t + 1] && 73 === e[t + 2] && e[t + 3] < 255 && e[t + 4] < 255 && e[t + 6] < 128 && e[t + 7] < 128 && e[t + 8] < 128 && e[t + 9] < 128 } function Ci(e, t) { return t + 10 <= e.length && 73 === e[t] && 68 === e[t + 1] && 51 === e[t + 2] && e[t + 3] < 255 && e[t + 4] < 255 && e[t + 6] < 128 && e[t + 7] < 128 && e[t + 8] < 128 && e[t + 9] < 128 } function wi(e, t) { var r = 0; return r = (127 & e[t]) << 21, r |= (127 & e[t + 1]) << 14, r |= (127 & e[t + 2]) << 7, r |= 127 & e[t + 3] } function Oi(e, t) { for (var r = t, i = 0; Ci(e, t); ) i += 10, i += wi(e, t + 6), Pi(e, t + 10) && (i += 10), t += i; if (i > 0) return e.subarray(r, r + i) } function xi(e, t) { return 255 === e[t] && 240 == (246 & e[t + 1]) } function Mi(e, t) { return 1 & e[t + 1] ? 7 : 9 } function Fi(e, t) { return (3 & e[t + 3]) << 11 | e[t + 4] << 3 | (224 & e[t + 5]) >>> 5 } function Ni(e, t) { return t + 1 < e.length && xi(e, t) } function Ui(e, t) { if (Ni(e, t)) { var r = Mi(e, t); if (t + r >= e.length) return !1; var i = Fi(e, t); if (i <= r) return !1; var n = t + i; return n === e.length || Ni(e, n) } return !1 } function Bi(e, t, r, i, n) { if (!e.samplerate) { var s = function(e, t, r, i) { var n = t[r + 2] , a = n >> 2 & 15; if (!(a > 12)) { var s = 1 + (n >> 6 & 3) , o = t[r + 3] >> 6 & 3 | (1 & n) << 2 , l = "mp4a.40." + s , u = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350][a] , d = a; 5 !== s && 29 !== s || (d -= 3); var h = [s << 3 | (14 & d) >> 1, (1 & d) << 7 | o << 3]; return Y.log("manifest codec:" + i + ", parsed codec:" + l + ", channels:" + o + ", rate:" + u + " (ADTS object type:" + s + " sampling index:" + a + ")"), { config: h, samplerate: u, channelCount: o, codec: l, parsedCodec: l, manifestCodec: i } } var f = new Error("invalid ADTS sampling index:" + a); e.emit(b.ERROR, b.ERROR, { type: R.MEDIA_ERROR, details: k.FRAG_PARSING_ERROR, fatal: !0, error: f, reason: f.message }) }(t, r, i, n); if (!s) return; a(e, s) } } function Gi(e) { return 9216e4 / e } function Ki(e, t, r, i, n) { var a, s = i + n * Gi(e.samplerate), o = function(e, t) { var r = Mi(e, t); if (t + r <= e.length) { var i = Fi(e, t) - r; if (i > 0) return { headerLength: r, frameLength: i } } }(t, r); if (o) { var l = o.frameLength , u = o.headerLength , d = u + l , h = Math.max(0, r + d - t.length); h ? (a = new Uint8Array(d - u)).set(t.subarray(r + u, t.length), 0) : a = t.subarray(r + u, r + d); var f = { unit: a, pts: s }; return h || e.samples.push(f), { sample: f, length: d, missing: h } } var c = t.length - r; return (a = new Uint8Array(c)).set(t.subarray(r, t.length), 0), { sample: { unit: a, pts: s }, length: c, missing: -1 } } function Vi(e, t) { return Ci(e, t) && wi(e, t + 6) + 10 <= e.length - t } function Hi(e, t, r) { return void 0 === t && (t = 0), void 0 === r && (r = 1 / 0), function(e, t, r, i) { var n = function(e) { return e instanceof ArrayBuffer ? e : e.buffer }(e) , a = 1; "BYTES_PER_ELEMENT"in i && (a = i.BYTES_PER_ELEMENT); var s, o = (s = e) && s.buffer instanceof ArrayBuffer && void 0 !== s.byteLength && void 0 !== s.byteOffset ? e.byteOffset : 0, l = (o + e.byteLength) / a, u = (o + t) / a, d = Math.floor(Math.max(0, Math.min(u, l))), h = Math.floor(Math.min(d + Math.max(r, 0), l)); return new i(n,d,h - d) }(e, t, r, Uint8Array) } function Yi(e) { var t = { key: e.type, description: "", data: "", mimeType: null, pictureType: null }; if (!(e.size < 2)) if (3 === e.data[0]) { var r = e.data.subarray(1).indexOf(0); if (-1 !== r) { var i = q(Hi(e.data, 1, r)) , n = e.data[2 + r] , a = e.data.subarray(3 + r).indexOf(0); if (-1 !== a) { var s, o = q(Hi(e.data, 3 + r, a)); return s = "--\x3e" === i ? q(Hi(e.data, 4 + r + a)) : function(e) { return e instanceof ArrayBuffer ? e : 0 == e.byteOffset && e.byteLength == e.buffer.byteLength ? e.buffer : new Uint8Array(e).buffer }(e.data.subarray(4 + r + a)), t.mimeType = i, t.pictureType = n, t.description = o, t.data = s, t } } } else console.log("Ignore frame with unrecognized character encoding") } function Wi(e) { return "PRIV" === e.type ? function(e) { if (!(e.size < 2)) { var t = q(e.data, !0) , r = new Uint8Array(e.data.subarray(t.length + 1)); return { key: e.type, info: t, data: r.buffer } } }(e) : "W" === e.type[0] ? function(e) { if ("WXXX" === e.type) { if (e.size < 2) return; var t = 1 , r = q(e.data.subarray(t), !0); t += r.length + 1; var i = q(e.data.subarray(t)); return { key: e.type, info: r, data: i } } var n = q(e.data); return { key: e.type, info: "", data: n } }(e) : "APIC" === e.type ? Yi(e) : function(e) { if (!(e.size < 2)) { if ("TXXX" === e.type) { var t = 1 , r = q(e.data.subarray(t), !0); t += r.length + 1; var i = q(e.data.subarray(t)); return { key: e.type, info: r, data: i } } var n = q(e.data.subarray(1)); return { key: e.type, info: "", data: n } } }(e) } function ji(e) { var t = String.fromCharCode(e[0], e[1], e[2], e[3]) , r = wi(e, 4); return { type: t, size: r, data: e.subarray(10, 10 + r) } } var qi = 10 , Xi = 10; function Qi(e) { for (var t = 0, r = []; Ci(e, t); ) { var i = wi(e, t + 6); e[t + 5] >> 6 & 1 && (t += qi); for (var n = (t += qi) + i; t + Xi < n; ) { var a = ji(e.subarray(t)) , s = Wi(a); s && r.push(s), t += a.size + qi } Pi(e, t) && (t += qi) } return r } function zi(e) { return e && "PRIV" === e.key && "com.apple.streaming.transportStreamTimestamp" === e.info } function $i(e) { if (8 === e.data.byteLength) { var t = new Uint8Array(e.data) , r = 1 & t[3] , i = (t[4] << 23) + (t[5] << 15) + (t[6] << 7) + t[7]; return i /= 45, r && (i += 47721858.84), Math.round(i) } } function Zi(e) { for (var t = Qi(e), r = 0; r < t.length; r++) { var i = t[r]; if (zi(i)) return $i(i) } } var Ji = function(e) { return e.audioId3 = "org.id3", e.dateRange = "com.apple.quicktime.HLS", e.emsg = "https://aomedia.org/emsg/ID3", e.misbklv = "urn:misb:KLV:bin:1910.1", e }({}); function en(e, t) { return void 0 === e && (e = ""), void 0 === t && (t = 9e4), { type: e, id: -1, pid: -1, inputTimeScale: t, sequenceNumber: -1, samples: [], dropped: 0 } } var tn = function() { function e() { this._audioTrack = void 0, this._id3Track = void 0, this.frameIndex = 0, this.cachedData = null, this.basePTS = null, this.initPTS = null, this.lastPTS = null } var t = e.prototype; return t.resetInitSegment = function(e, t, r, i) { this._id3Track = { type: "id3", id: 3, pid: -1, inputTimeScale: 9e4, sequenceNumber: 0, samples: [], dropped: 0 } } , t.resetTimeStamp = function(e) { this.initPTS = e, this.resetContiguity() } , t.resetContiguity = function() { this.basePTS = null, this.lastPTS = null, this.frameIndex = 0 } , t.canParse = function(e, t) { return !1 } , t.appendFrame = function(e, t, r) {} , t.demux = function(e, t) { this.cachedData && (e = Ae(this.cachedData, e), this.cachedData = null); var r, i = Oi(e, 0), n = i ? i.length : 0, a = this._audioTrack, s = this._id3Track, o = i ? Zi(i) : void 0, l = e.length; for ((null === this.basePTS || 0 === this.frameIndex && A(o)) && (this.basePTS = rn(o, t, this.initPTS), this.lastPTS = this.basePTS), null === this.lastPTS && (this.lastPTS = this.basePTS), i && i.length > 0 && s.samples.push({ pts: this.lastPTS, dts: this.lastPTS, data: i, type: Ji.audioId3, duration: Number.POSITIVE_INFINITY }); n < l; ) { if (this.canParse(e, n)) { var u = this.appendFrame(a, e, n); u ? (this.frameIndex++, this.lastPTS = u.sample.pts, r = n += u.length) : n = l } else Vi(e, n) ? (i = Oi(e, n), s.samples.push({ pts: this.lastPTS, dts: this.lastPTS, data: i, type: Ji.audioId3, duration: Number.POSITIVE_INFINITY }), r = n += i.length) : n++; if (n === l && r !== l) { var d = e.slice(r); this.cachedData ? this.cachedData = Ae(this.cachedData, d) : this.cachedData = d } } return { audioTrack: a, videoTrack: en(), id3Track: s, textTrack: en() } } , t.demuxSampleAes = function(e, t, r) { return Promise.reject(new Error("[" + this + "] This demuxer does not support Sample-AES decryption")) } , t.flush = function(e) { var t = this.cachedData; return t && (this.cachedData = null, this.demux(t, 0)), { audioTrack: this._audioTrack, videoTrack: en(), id3Track: this._id3Track, textTrack: en() } } , t.destroy = function() { this.cachedData = null, this._audioTrack = this._id3Track = void 0 } , e }() , rn = function(e, t, r) { return A(e) ? 90 * e : 9e4 * t + (r ? 9e4 * r.baseTime / r.timescale : 0) } , nn = null , an = [32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160] , sn = [44100, 48e3, 32e3, 22050, 24e3, 16e3, 11025, 12e3, 8e3] , on = [[0, 72, 144, 12], [0, 0, 0, 0], [0, 72, 144, 12], [0, 144, 144, 12]] , ln = [0, 1, 1, 4]; function un(e, t, r, i, n) { if (!(r + 24 > t.length)) { var a = dn(t, r); if (a && r + a.frameLength <= t.length) { var s = i + n * (9e4 * a.samplesPerFrame / a.sampleRate) , o = { unit: t.subarray(r, r + a.frameLength), pts: s, dts: s }; return e.config = [], e.channelCount = a.channelCount, e.samplerate = a.sampleRate, e.samples.push(o), { sample: o, length: a.frameLength, missing: 0 } } } } function dn(e, t) { var r = e[t + 1] >> 3 & 3 , i = e[t + 1] >> 1 & 3 , n = e[t + 2] >> 4 & 15 , a = e[t + 2] >> 2 & 3; if (1 !== r && 0 !== n && 15 !== n && 3 !== a) { var s = e[t + 2] >> 1 & 1 , o = e[t + 3] >> 6 , l = 1e3 * an[14 * (3 === r ? 3 - i : 3 === i ? 3 : 4) + n - 1] , u = sn[3 * (3 === r ? 0 : 2 === r ? 1 : 2) + a] , d = 3 === o ? 1 : 2 , h = on[r][i] , f = ln[i] , c = 8 * h * f , g = Math.floor(h * l / u + s) * f; if (null === nn) { var v = (navigator.userAgent || "").match(/Chrome\/(\d+)/i); nn = v ? parseInt(v[1]) : 0 } return !!nn && nn <= 87 && 2 === i && l >= 224e3 && 0 === o && (e[t + 3] = 128 | e[t + 3]), { sampleRate: u, channelCount: d, frameLength: g, samplesPerFrame: c } } } function hn(e, t) { return 255 === e[t] && 224 == (224 & e[t + 1]) && 0 != (6 & e[t + 1]) } function fn(e, t) { return t + 1 < e.length && hn(e, t) } function cn(e, t) { if (t + 1 < e.length && hn(e, t)) { var r = dn(e, t) , i = 4; null != r && r.frameLength && (i = r.frameLength); var n = t + i; return n === e.length || fn(e, n) } return !1 } var gn = function(e) { function t(t, r) { var i; return (i = e.call(this) || this).observer = void 0, i.config = void 0, i.observer = t, i.config = r, i } o(t, e); var r = t.prototype; return r.resetInitSegment = function(t, r, i, n) { e.prototype.resetInitSegment.call(this, t, r, i, n), this._audioTrack = { container: "audio/adts", type: "audio", id: 2, pid: -1, sequenceNumber: 0, segmentCodec: "aac", samples: [], manifestCodec: r, duration: n, inputTimeScale: 9e4, dropped: 0 } } , t.probe = function(e, t) { if (!e) return !1; var r = Oi(e, 0) , i = (null == r ? void 0 : r.length) || 0; if (cn(e, i)) return !1; for (var n = e.length; i < n; i++) if (Ui(e, i)) return t.log("ADTS sync word found !"), !0; return !1 } , r.canParse = function(e, t) { return function(e, t) { return function(e, t) { return t + 5 < e.length }(e, t) && xi(e, t) && Fi(e, t) <= e.length - t }(e, t) } , r.appendFrame = function(e, t, r) { Bi(e, this.observer, t, r, e.manifestCodec); var i = Ki(e, t, r, this.basePTS, this.frameIndex); if (i && 0 === i.missing) return i } , t }(tn) , vn = function(e, t) { var r = 0 , i = 5; t += i; for (var n = new Uint32Array(1), a = new Uint32Array(1), s = new Uint8Array(1); i > 0; ) { s[0] = e[t]; var o = Math.min(i, 8) , l = 8 - o; a[0] = 4278190080 >>> 24 + l << l, n[0] = (s[0] & a[0]) >> l, r = r ? r << o | n[0] : n[0], t += 1, i -= o } return r } , mn = function(e) { function t(t) { var r; return (r = e.call(this) || this).observer = void 0, r.observer = t, r } o(t, e); var r = t.prototype; return r.resetInitSegment = function(t, r, i, n) { e.prototype.resetInitSegment.call(this, t, r, i, n), this._audioTrack = { container: "audio/ac-3", type: "audio", id: 2, pid: -1, sequenceNumber: 0, segmentCodec: "ac3", samples: [], manifestCodec: r, duration: n, inputTimeScale: 9e4, dropped: 0 } } , r.canParse = function(e, t) { return t + 64 < e.length } , r.appendFrame = function(e, t, r) { var i = pn(e, t, r, this.basePTS, this.frameIndex); if (-1 !== i) return { sample: e.samples[e.samples.length - 1], length: i, missing: 0 } } , t.probe = function(e) { if (!e) return !1; var t = Oi(e, 0); if (!t) return !1; var r = t.length; return 11 === e[r] && 119 === e[r + 1] && void 0 !== Zi(t) && vn(e, r) < 16 } , t }(tn); function pn(e, t, r, i, n) { if (r + 8 > t.length) return -1; if (11 !== t[r] || 119 !== t[r + 1]) return -1; var a = t[r + 4] >> 6; if (a >= 3) return -1; var s = [48e3, 44100, 32e3][a] , o = 63 & t[r + 4] , l = 2 * [64, 69, 96, 64, 70, 96, 80, 87, 120, 80, 88, 120, 96, 104, 144, 96, 105, 144, 112, 121, 168, 112, 122, 168, 128, 139, 192, 128, 140, 192, 160, 174, 240, 160, 175, 240, 192, 208, 288, 192, 209, 288, 224, 243, 336, 224, 244, 336, 256, 278, 384, 256, 279, 384, 320, 348, 480, 320, 349, 480, 384, 417, 576, 384, 418, 576, 448, 487, 672, 448, 488, 672, 512, 557, 768, 512, 558, 768, 640, 696, 960, 640, 697, 960, 768, 835, 1152, 768, 836, 1152, 896, 975, 1344, 896, 976, 1344, 1024, 1114, 1536, 1024, 1115, 1536, 1152, 1253, 1728, 1152, 1254, 1728, 1280, 1393, 1920, 1280, 1394, 1920][3 * o + a]; if (r + l > t.length) return -1; var u = t[r + 6] >> 5 , d = 0; 2 === u ? d += 2 : (1 & u && 1 !== u && (d += 2), 4 & u && (d += 2)); var h = (t[r + 6] << 8 | t[r + 7]) >> 12 - d & 1 , f = [2, 1, 2, 3, 3, 4, 4, 5][u] + h , c = t[r + 5] >> 3 , g = 7 & t[r + 5] , v = new Uint8Array([a << 6 | c << 1 | g >> 2, (3 & g) << 6 | u << 3 | h << 2 | o >> 4, o << 4 & 224]) , m = i + n * (1536 / s * 9e4) , p = t.subarray(r, r + l); return e.config = v, e.channelCount = f, e.samplerate = s, e.samples.push({ unit: p, pts: m }), l } var yn = function(e) { function t() { return e.apply(this, arguments) || this } o(t, e); var r = t.prototype; return r.resetInitSegment = function(t, r, i, n) { e.prototype.resetInitSegment.call(this, t, r, i, n), this._audioTrack = { container: "audio/mpeg", type: "audio", id: 2, pid: -1, sequenceNumber: 0, segmentCodec: "mp3", samples: [], manifestCodec: r, duration: n, inputTimeScale: 9e4, dropped: 0 } } , t.probe = function(e) { if (!e) return !1; var t = Oi(e, 0) , r = (null == t ? void 0 : t.length) || 0; if (t && 11 === e[r] && 119 === e[r + 1] && void 0 !== Zi(t) && vn(e, r) <= 16) return !1; for (var i = e.length; r < i; r++) if (cn(e, r)) return Y.log("MPEG Audio sync word found !"), !0; return !1 } , r.canParse = function(e, t) { return function(e, t) { return hn(e, t) && 4 <= e.length - t }(e, t) } , r.appendFrame = function(e, t, r) { if (null !== this.basePTS) return un(e, t, r, this.basePTS, this.frameIndex) } , t }(tn) , En = /\/emsg[-/]ID3/i , Tn = function() { function e(e, t) { this.remainderData = null, this.timeOffset = 0, this.config = void 0, this.videoTrack = void 0, this.audioTrack = void 0, this.id3Track = void 0, this.txtTrack = void 0, this.config = t } var t = e.prototype; return t.resetTimeStamp = function() {} , t.resetInitSegment = function(e, t, r, i) { var n = this.videoTrack = en("video", 1) , a = this.audioTrack = en("audio", 1) , s = this.txtTrack = en("text", 1); if (this.id3Track = en("id3", 1), this.timeOffset = 0, null != e && e.byteLength) { var o = ve(e); if (o.video) { var l = o.video , u = l.id , d = l.timescale , h = l.codec , f = l.supplemental; n.id = u, n.timescale = s.timescale = d, n.codec = h, n.supplemental = f } if (o.audio) { var c = o.audio , g = c.id , v = c.timescale , m = c.codec; a.id = g, a.timescale = v, a.codec = m } s.id = oe.text, n.sampleDuration = 0, n.duration = a.duration = i } } , t.resetContiguity = function() { this.remainderData = null } , e.probe = function(e) { return function(e) { for (var t = e.byteLength, r = 0; r < t; ) { var i = de(e, r); if (i > 8 && 109 === e[r + 4] && 111 === e[r + 5] && 111 === e[r + 6] && 102 === e[r + 7]) return !0; r = i > 1 ? r + i : t } return !1 }(e) } , t.demux = function(e, t) { this.timeOffset = t; var r = e , i = this.videoTrack , n = this.txtTrack; if (this.config.progressive) { this.remainderData && (r = Ae(this.remainderData, e)); var a = function(e) { var t = { valid: null, remainder: null } , r = ce(e, ["moof"]); if (r.length < 2) return t.remainder = e, t; var i = r[r.length - 1]; return t.valid = e.slice(0, i.byteOffset - 8), t.remainder = e.slice(i.byteOffset - 8), t }(r); this.remainderData = a.remainder, i.samples = a.valid || new Uint8Array } else i.samples = r; var s = this.extractID3Track(i, t); return n.samples = Le(t, i), { videoTrack: i, audioTrack: this.audioTrack, id3Track: s, textTrack: this.txtTrack } } , t.flush = function() { var e = this.timeOffset , t = this.videoTrack , r = this.txtTrack; t.samples = this.remainderData || new Uint8Array, this.remainderData = null; var i = this.extractID3Track(t, this.timeOffset); return r.samples = Le(e, t), { videoTrack: t, audioTrack: en(), id3Track: i, textTrack: en() } } , t.extractID3Track = function(e, t) { var r = this , i = this.id3Track; if (e.samples.length) { var n = ce(e.samples, ["emsg"]); n && n.forEach((function(e) { var n = function(e) { var t = e[0] , r = "" , i = "" , n = 0 , a = 0 , s = 0 , o = 0 , l = 0 , u = 0; if (0 === t) { for (; "\0" !== le(e.subarray(u, u + 1)); ) r += le(e.subarray(u, u + 1)), u += 1; for (r += le(e.subarray(u, u + 1)), u += 1; "\0" !== le(e.subarray(u, u + 1)); ) i += le(e.subarray(u, u + 1)), u += 1; i += le(e.subarray(u, u + 1)), u += 1, n = de(e, 12), a = de(e, 16), o = de(e, 20), l = de(e, 24), u = 28 } else if (1 === t) { n = de(e, u += 4); var d = de(e, u += 4) , h = de(e, u += 4); for (u += 4, s = Math.pow(2, 32) * d + h, L(s) || (s = Number.MAX_SAFE_INTEGER, Y.warn("Presentation time exceeds safe integer limit and wrapped to max safe integer in parsing emsg box")), o = de(e, u), l = de(e, u += 4), u += 4; "\0" !== le(e.subarray(u, u + 1)); ) r += le(e.subarray(u, u + 1)), u += 1; for (r += le(e.subarray(u, u + 1)), u += 1; "\0" !== le(e.subarray(u, u + 1)); ) i += le(e.subarray(u, u + 1)), u += 1; i += le(e.subarray(u, u + 1)), u += 1 } return { schemeIdUri: r, value: i, timeScale: n, presentationTime: s, presentationTimeDelta: a, eventDuration: o, id: l, payload: e.subarray(u, e.byteLength) } }(e); if (En.test(n.schemeIdUri)) { var a = Sn(n, t) , s = 4294967295 === n.eventDuration ? Number.POSITIVE_INFINITY : n.eventDuration / n.timeScale; s <= .001 && (s = Number.POSITIVE_INFINITY); var o = n.payload; i.samples.push({ data: o, len: o.byteLength, dts: a, pts: a, type: Ji.emsg, duration: s }) } else if (r.config.enableEmsgKLVMetadata && n.schemeIdUri.startsWith("urn:misb:KLV:bin:1910.1")) { var l = Sn(n, t); i.samples.push({ data: n.payload, len: n.payload.byteLength, dts: l, pts: l, type: Ji.misbklv, duration: Number.POSITIVE_INFINITY }) } } )) } return i } , t.demuxSampleAes = function(e, t, r) { return Promise.reject(new Error("The MP4 demuxer does not support SAMPLE-AES decryption")) } , t.destroy = function() { this.config = null, this.remainderData = null, this.videoTrack = this.audioTrack = this.id3Track = this.txtTrack = void 0 } , e }(); function Sn(e, t) { return A(e.presentationTime) ? e.presentationTime / e.timeScale : t + e.presentationTimeDelta / e.timeScale } var An = function() { function e(e, t, r) { this.keyData = void 0, this.decrypter = void 0, this.keyData = r, this.decrypter = new er(t,{ removePKCS7Padding: !1 }) } var t = e.prototype; return t.decryptBuffer = function(e) { return this.decrypter.decrypt(e, this.keyData.key.buffer, this.keyData.iv.buffer, Qt) } , t.decryptAacSample = function(e, t, r) { var i = this , n = e[t].unit; if (!(n.length <= 16)) { var a = n.subarray(16, n.length - n.length % 16) , s = a.buffer.slice(a.byteOffset, a.byteOffset + a.length); this.decryptBuffer(s).then((function(a) { var s = new Uint8Array(a); n.set(s, 16), i.decrypter.isSync() || i.decryptAacSamples(e, t + 1, r) } )).catch(r) } } , t.decryptAacSamples = function(e, t, r) { for (; ; t++) { if (t >= e.length) return void r(); if (!(e[t].unit.length < 32 || (this.decryptAacSample(e, t, r), this.decrypter.isSync()))) return } } , t.getAvcEncryptedData = function(e) { for (var t = 16 * Math.floor((e.length - 48) / 160) + 16, r = new Int8Array(t), i = 0, n = 32; n < e.length - 16; n += 160, i += 16) r.set(e.subarray(n, n + 16), i); return r } , t.getAvcDecryptedUnit = function(e, t) { for (var r = new Uint8Array(t), i = 0, n = 32; n < e.length - 16; n += 160, i += 16) e.set(r.subarray(i, i + 16), n); return e } , t.decryptAvcSample = function(e, t, r, i, n) { var a = this , s = be(n.data) , o = this.getAvcEncryptedData(s); this.decryptBuffer(o.buffer).then((function(o) { n.data = a.getAvcDecryptedUnit(s, o), a.decrypter.isSync() || a.decryptAvcSamples(e, t, r + 1, i) } )).catch(i) } , t.decryptAvcSamples = function(e, t, r, i) { if (e instanceof Uint8Array) throw new Error("Cannot decrypt samples of type Uint8Array"); for (; ; t++, r = 0) { if (t >= e.length) return void i(); for (var n = e[t].units; !(r >= n.length); r++) { var a = n[r]; if (!(a.data.length <= 48 || 1 !== a.type && 5 !== a.type || (this.decryptAvcSample(e, t, r, i, a), this.decrypter.isSync()))) return } } } , e }() , Ln = function() { function e() { this.VideoSample = null } var t = e.prototype; return t.createVideoSample = function(e, t, r) { return { key: e, frame: !1, pts: t, dts: r, units: [], length: 0 } } , t.getLastNalUnit = function(e) { var t, r, i = this.VideoSample; if (i && 0 !== i.units.length || (i = e[e.length - 1]), null != (t = i) && t.units) { var n = i.units; r = n[n.length - 1] } return r } , t.pushAccessUnit = function(e, t) { if (e.units.length && e.frame) { if (void 0 === e.pts) { var r = t.samples , i = r.length; if (!i) return void t.dropped++; var n = r[i - 1]; e.pts = n.pts, e.dts = n.dts } t.samples.push(e) } } , t.parseNALu = function(e, t, r) { var i, n, a = t.byteLength, s = e.naluState || 0, o = s, l = [], u = 0, d = -1, h = 0; for (-1 === s && (d = 0, h = this.getNALuType(t, 0), s = 0, u = 1); u < a; ) if (i = t[u++], s) if (1 !== s) if (i) if (1 === i) { if (n = u - s - 1, d >= 0) { var f = { data: t.subarray(d, n), type: h }; l.push(f) } else { var c = this.getLastNalUnit(e.samples); c && (o && u <= 4 - o && c.state && (c.data = c.data.subarray(0, c.data.byteLength - o)), n > 0 && (c.data = Ae(c.data, t.subarray(0, n)), c.state = 0)) } u < a ? (d = u, h = this.getNALuType(t, u), s = 0) : s = -1 } else s = 0; else s = 3; else s = i ? 0 : 2; else s = i ? 0 : 1; if (d >= 0 && s >= 0) { var g = { data: t.subarray(d, a), type: h, state: s }; l.push(g) } if (0 === l.length) { var v = this.getLastNalUnit(e.samples); v && (v.data = Ae(v.data, t)) } return e.naluState = s, l } , e }() , In = function() { function e(e) { this.data = void 0, this.bytesAvailable = void 0, this.word = void 0, this.bitsAvailable = void 0, this.data = e, this.bytesAvailable = e.byteLength, this.word = 0, this.bitsAvailable = 0 } var t = e.prototype; return t.loadWord = function() { var e = this.data , t = this.bytesAvailable , r = e.byteLength - t , i = new Uint8Array(4) , n = Math.min(4, t); if (0 === n) throw new Error("no bytes available"); i.set(e.subarray(r, r + n)), this.word = new DataView(i.buffer).getUint32(0), this.bitsAvailable = 8 * n, this.bytesAvailable -= n } , t.skipBits = function(e) { var t; e = Math.min(e, 8 * this.bytesAvailable + this.bitsAvailable), this.bitsAvailable > e ? (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) , r = this.word >>> 32 - t; if (e > 32 && Y.error("Cannot read more than 32 bits at a time"), this.bitsAvailable -= t, this.bitsAvailable > 0) this.word <<= t; else { if (!(this.bytesAvailable > 0)) throw new Error("no bits available"); this.loadWord() } return (t = e - t) > 0 && this.bitsAvailable ? r << t | this.readBits(t) : r } , t.skipLZ = function() { var e; for (e = 0; e < this.bitsAvailable; ++e) if (0 != (this.word & 2147483648 >>> 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) } , e }() , Rn = function(e) { function t() { return e.apply(this, arguments) || this } o(t, e); var r = t.prototype; return r.parsePES = function(e, t, r, i) { var n, a = this, s = this.parseNALu(e, r.data, i), o = this.VideoSample, l = !1; r.data = null, o && s.length && !e.audFound && (this.pushAccessUnit(o, e), o = this.VideoSample = this.createVideoSample(!1, r.pts, r.dts)), s.forEach((function(i) { var s, u; switch (i.type) { case 1: var d = !1; n = !0; var h, f = i.data; if (l && f.length > 4) { var c = a.readSliceType(f); 2 !== c && 4 !== c && 7 !== c && 9 !== c || (d = !0) } d && null != (h = o) && h.frame && !o.key && (a.pushAccessUnit(o, e), o = a.VideoSample = null), o || (o = a.VideoSample = a.createVideoSample(!0, r.pts, r.dts)), o.frame = !0, o.key = d; break; case 5: n = !0, null != (s = o) && s.frame && !o.key && (a.pushAccessUnit(o, e), o = a.VideoSample = null), o || (o = a.VideoSample = a.createVideoSample(!0, r.pts, r.dts)), o.key = !0, o.frame = !0; break; case 6: n = !0, ke(i.data, 1, r.pts, t.samples); break; case 7: var g, v; n = !0, l = !0; var m = i.data , p = a.readSPS(m); if (!e.sps || e.width !== p.width || e.height !== p.height || (null == (g = e.pixelRatio) ? void 0 : g[0]) !== p.pixelRatio[0] || (null == (v = e.pixelRatio) ? void 0 : v[1]) !== p.pixelRatio[1]) { e.width = p.width, e.height = p.height, e.pixelRatio = p.pixelRatio, e.sps = [m]; for (var y = m.subarray(1, 4), E = "avc1.", T = 0; T < 3; T++) { var S = y[T].toString(16); S.length < 2 && (S = "0" + S), E += S } e.codec = E } break; case 8: n = !0, e.pps = [i.data]; break; case 9: n = !0, e.audFound = !0, null != (u = o) && u.frame && (a.pushAccessUnit(o, e), o = null), o || (o = a.VideoSample = a.createVideoSample(!1, r.pts, r.dts)); break; case 12: n = !0; break; default: n = !1 } o && n && o.units.push(i) } )), i && o && (this.pushAccessUnit(o, e), this.VideoSample = null) } , r.getNALuType = function(e, t) { return 31 & e[t] } , r.readSliceType = function(e) { var t = new In(e); return t.readUByte(), t.readUEG(), t.readUEG() } , r.skipScalingList = function(e, t) { for (var r = 8, i = 8, n = 0; n < e; n++) 0 !== i && (i = (r + t.readEG() + 256) % 256), r = 0 === i ? r : i } , r.readSPS = function(e) { var t, r, i, n = new In(e), a = 0, s = 0, o = 0, l = 0, u = n.readUByte.bind(n), d = n.readBits.bind(n), h = n.readUEG.bind(n), f = n.readBoolean.bind(n), c = n.skipBits.bind(n), g = n.skipEG.bind(n), v = n.skipUEG.bind(n), m = this.skipScalingList.bind(this); u(); var p = u(); if (d(5), c(3), u(), v(), 100 === p || 110 === p || 122 === p || 244 === p || 44 === p || 83 === p || 86 === p || 118 === p || 128 === p) { var y = h(); if (3 === y && c(1), v(), v(), c(1), f()) for (r = 3 !== y ? 8 : 12, i = 0; i < r; i++) f() && m(i < 6 ? 16 : 64, n) } v(); var E = h(); if (0 === E) h(); else if (1 === E) for (c(1), g(), g(), t = h(), i = 0; i < t; i++) g(); v(), c(1); var T = h() , S = h() , A = d(1); 0 === A && c(1), c(1), f() && (a = h(), s = h(), o = h(), l = h()); var L = [1, 1]; if (f() && f()) switch (u()) { case 1: L = [1, 1]; break; case 2: L = [12, 11]; break; case 3: L = [10, 11]; break; case 4: L = [16, 11]; break; case 5: L = [40, 33]; break; case 6: L = [24, 11]; break; case 7: L = [20, 11]; break; case 8: L = [32, 11]; break; case 9: L = [80, 33]; break; case 10: L = [18, 11]; break; case 11: L = [15, 11]; break; case 12: L = [64, 33]; break; case 13: L = [160, 99]; break; case 14: L = [4, 3]; break; case 15: L = [3, 2]; break; case 16: L = [2, 1]; break; case 255: L = [u() << 8 | u(), u() << 8 | u()] } return { width: Math.ceil(16 * (T + 1) - 2 * a - 2 * s), height: (2 - A) * (S + 1) * 16 - (A ? 2 : 4) * (o + l), pixelRatio: L } } , t }(Ln) , kn = function(e) { function t() { for (var t, r = arguments.length, i = new Array(r), n = 0; n < r; n++) i[n] = arguments[n]; return (t = e.call.apply(e, [this].concat(i)) || this).initVPS = null, t } o(t, e); var r = t.prototype; return r.parsePES = function(e, t, r, i) { var n, s = this, o = this.parseNALu(e, r.data, i), l = this.VideoSample, u = !1; r.data = null, l && o.length && !e.audFound && (this.pushAccessUnit(l, e), l = this.VideoSample = this.createVideoSample(!1, r.pts, r.dts)), o.forEach((function(i) { var o, d; switch (i.type) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: l || (l = s.VideoSample = s.createVideoSample(!1, r.pts, r.dts)), l.frame = !0, n = !0; break; case 16: case 17: case 18: case 21: var h; n = !0, u && null != (h = l) && h.frame && !l.key && (s.pushAccessUnit(l, e), l = s.VideoSample = null), l || (l = s.VideoSample = s.createVideoSample(!0, r.pts, r.dts)), l.key = !0, l.frame = !0; break; case 19: case 20: n = !0, null != (o = l) && o.frame && !l.key && (s.pushAccessUnit(l, e), l = s.VideoSample = null), l || (l = s.VideoSample = s.createVideoSample(!0, r.pts, r.dts)), l.key = !0, l.frame = !0; break; case 39: n = !0, ke(i.data, 2, r.pts, t.samples); break; case 32: n = !0, e.vps || ("object" != typeof e.params && (e.params = {}), e.params = a(e.params, s.readVPS(i.data)), s.initVPS = i.data), e.vps = [i.data]; break; case 33: if (n = !0, u = !0, void 0 === e.vps || e.vps[0] === s.initVPS || void 0 === e.sps || s.matchSPS(e.sps[0], i.data) || (s.initVPS = e.vps[0], e.sps = e.pps = void 0), !e.sps) { var f = s.readSPS(i.data); for (var c in e.width = f.width, e.height = f.height, e.pixelRatio = f.pixelRatio, e.codec = f.codecString, e.sps = [], "object" != typeof e.params && (e.params = {}), f.params) e.params[c] = f.params[c] } s.pushParameterSet(e.sps, i.data, e.vps), l || (l = s.VideoSample = s.createVideoSample(!0, r.pts, r.dts)), l.key = !0; break; case 34: if (n = !0, "object" == typeof e.params) { if (!e.pps) { e.pps = []; var g = s.readPPS(i.data); for (var v in g) e.params[v] = g[v] } s.pushParameterSet(e.pps, i.data, e.vps) } break; case 35: n = !0, e.audFound = !0, null != (d = l) && d.frame && (s.pushAccessUnit(l, e), l = null), l || (l = s.VideoSample = s.createVideoSample(!1, r.pts, r.dts)); break; default: n = !1 } l && n && l.units.push(i) } )), i && l && (this.pushAccessUnit(l, e), this.VideoSample = null) } , r.pushParameterSet = function(e, t, r) { (r && r[0] === this.initVPS || !r && !e.length) && e.push(t) } , r.getNALuType = function(e, t) { return (126 & e[t]) >>> 1 } , r.ebsp2rbsp = function(e) { for (var t = new Uint8Array(e.byteLength), r = 0, i = 0; i < e.byteLength; i++) i >= 2 && 3 === e[i] && 0 === e[i - 1] && 0 === e[i - 2] || (t[r] = e[i], r++); return new Uint8Array(t.buffer,0,r) } , r.pushAccessUnit = function(t, r) { e.prototype.pushAccessUnit.call(this, t, r), this.initVPS && (this.initVPS = null) } , r.readVPS = function(e) { var t = new In(e); return t.readUByte(), t.readUByte(), t.readBits(4), t.skipBits(2), t.readBits(6), { numTemporalLayers: t.readBits(3) + 1, temporalIdNested: t.readBoolean() } } , r.readSPS = function(e) { var t = new In(this.ebsp2rbsp(e)); t.readUByte(), t.readUByte(), t.readBits(4); var r = t.readBits(3); t.readBoolean(); for (var i = t.readBits(2), n = t.readBoolean(), a = t.readBits(5), s = t.readUByte(), o = t.readUByte(), l = t.readUByte(), u = t.readUByte(), d = t.readUByte(), h = t.readUByte(), f = t.readUByte(), c = t.readUByte(), g = t.readUByte(), v = t.readUByte(), m = t.readUByte(), p = [], y = [], E = 0; E < r; E++) p.push(t.readBoolean()), y.push(t.readBoolean()); if (r > 0) for (var T = r; T < 8; T++) t.readBits(2); for (var S = 0; S < r; S++) p[S] && (t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte()), y[S] && t.readUByte(); t.readUEG(); var A = t.readUEG(); 3 == A && t.skipBits(1); var L = t.readUEG() , I = t.readUEG() , R = t.readBoolean() , k = 0 , b = 0 , D = 0 , _ = 0; R && (k += t.readUEG(), b += t.readUEG(), D += t.readUEG(), _ += t.readUEG()); for (var P = t.readUEG(), C = t.readUEG(), w = t.readUEG(), O = t.readBoolean() ? 0 : r; O <= r; O++) t.skipUEG(), t.skipUEG(), t.skipUEG(); if (t.skipUEG(), t.skipUEG(), t.skipUEG(), t.skipUEG(), t.skipUEG(), t.skipUEG(), t.readBoolean() && t.readBoolean()) for (var x = 0; x < 4; x++) for (var M = 0; M < (3 === x ? 2 : 6); M++) if (t.readBoolean()) { var F = Math.min(64, 1 << 4 + (x << 1)); x > 1 && t.readEG(); for (var N = 0; N < F; N++) t.readEG() } else t.readUEG(); t.readBoolean(), t.readBoolean(), t.readBoolean() && (t.readUByte(), t.skipUEG(), t.skipUEG(), t.readBoolean()); for (var U = t.readUEG(), B = 0, G = 0; G < U; G++) { var K = !1; if (0 !== G && (K = t.readBoolean()), K) { G === U && t.readUEG(), t.readBoolean(), t.readUEG(); for (var V = 0, H = 0; H <= B; H++) { var Y = t.readBoolean() , W = !1; Y || (W = t.readBoolean()), (Y || W) && V++ } B = V } else { var j = t.readUEG() , q = t.readUEG(); B = j + q; for (var X = 0; X < j; X++) t.readUEG(), t.readBoolean(); for (var Q = 0; Q < q; Q++) t.readUEG(), t.readBoolean() } } if (t.readBoolean()) for (var z = t.readUEG(), $ = 0; $ < z; $++) { for (var Z = 0; Z < w + 4; Z++) t.readBits(1); t.readBits(1) } var J = 0 , ee = 1 , te = 1 , re = !0 , ie = 1 , ne = 0; if (t.readBoolean(), t.readBoolean(), t.readBoolean()) { if (t.readBoolean()) { var ae = t.readUByte(); ae > 0 && ae < 16 ? (ee = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2][ae - 1], te = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1][ae - 1]) : 255 === ae && (ee = t.readBits(16), te = t.readBits(16)) } if (t.readBoolean() && t.readBoolean(), t.readBoolean() && (t.readBits(3), t.readBoolean(), t.readBoolean() && (t.readUByte(), t.readUByte(), t.readUByte())), t.readBoolean() && (t.readUEG(), t.readUEG()), t.readBoolean(), t.readBoolean(), t.readBoolean(), t.readBoolean() && (t.skipUEG(), t.skipUEG(), t.skipUEG(), t.skipUEG()), t.readBoolean() && (ie = t.readBits(32), ne = t.readBits(32), t.readBoolean() && t.readUEG(), t.readBoolean())) { var se = t.readBoolean() , oe = t.readBoolean() , le = !1; (se || oe) && ((le = t.readBoolean()) && (t.readUByte(), t.readBits(5), t.readBoolean(), t.readBits(5)), t.readBits(4), t.readBits(4), le && t.readBits(4), t.readBits(5), t.readBits(5), t.readBits(5)); for (var ue = 0; ue <= r; ue++) { var de = !1; (re = t.readBoolean()) || t.readBoolean() ? t.readEG() : de = t.readBoolean(); var he = de ? 1 : t.readUEG() + 1; if (se) for (var fe = 0; fe < he; fe++) t.readUEG(), t.readUEG(), le && (t.readUEG(), t.readUEG()), t.skipBits(1); if (oe) for (var ce = 0; ce < he; ce++) t.readUEG(), t.readUEG(), le && (t.readUEG(), t.readUEG()), t.skipBits(1) } } t.readBoolean() && (t.readBoolean(), t.readBoolean(), t.readBoolean(), J = t.readUEG()) } var ge = L , ve = I; if (R) { var me = 1 , pe = 1; 1 === A ? me = pe = 2 : 2 == A && (me = 2), ge = L - me * b - me * k, ve = I - pe * _ - pe * D } for (var ye = i ? ["A", "B", "C"][i] : "", Ee = s << 24 | o << 16 | l << 8 | u, Te = 0, Se = 0; Se < 32; Se++) Te = (Te | (Ee >> Se & 1) << 31 - Se) >>> 0; var Ae = Te.toString(16); return 1 === a && "2" === Ae && (Ae = "6"), { codecString: "hvc1." + ye + a + "." + Ae + "." + (n ? "H" : "L") + m + ".B0", params: { general_tier_flag: n, general_profile_idc: a, general_profile_space: i, general_profile_compatibility_flags: [s, o, l, u], general_constraint_indicator_flags: [d, h, f, c, g, v], general_level_idc: m, bit_depth: P + 8, bit_depth_luma_minus8: P, bit_depth_chroma_minus8: C, min_spatial_segmentation_idc: J, chroma_format_idc: A, frame_rate: { fixed: re, fps: ne / ie } }, width: ge, height: ve, pixelRatio: [ee, te] } } , r.readPPS = function(e) { var t = new In(this.ebsp2rbsp(e)); t.readUByte(), t.readUByte(), t.skipUEG(), t.skipUEG(), t.skipBits(2), t.skipBits(3), t.skipBits(2), t.skipUEG(), t.skipUEG(), t.skipEG(), t.skipBits(2), t.readBoolean() && t.skipUEG(), t.skipEG(), t.skipEG(), t.skipBits(4); var r = t.readBoolean() , i = t.readBoolean() , n = 1; return i && r ? n = 0 : i ? n = 3 : r && (n = 2), { parallelismType: n } } , r.matchSPS = function(e, t) { return String.fromCharCode.apply(null, e).substr(3) === String.fromCharCode.apply(null, t).substr(3) } , t }(Ln) , bn = 188 , Dn = function() { function e(e, t, r, i) { this.logger = void 0, this.observer = void 0, this.config = void 0, this.typeSupported = void 0, this.sampleAes = null, this.pmtParsed = !1, this.audioCodec = void 0, this.videoCodec = void 0, this._pmtId = -1, this._videoTrack = void 0, this._audioTrack = void 0, this._id3Track = void 0, this._txtTrack = void 0, this.aacOverFlow = null, this.remainderData = null, this.videoParser = void 0, this.observer = e, this.config = t, this.typeSupported = r, this.logger = i, this.videoParser = null } e.probe = function(t, r) { var i = e.syncOffset(t); return i > 0 && r.warn("MPEG2-TS detected but first sync word found @ offset " + i), -1 !== i } , e.syncOffset = function(e) { for (var t = e.length, r = Math.min(940, t - bn) + 1, i = 0; i < r; ) { for (var n = !1, a = -1, s = 0, o = i; o < t; o += bn) { if (71 !== e[o] || t - o !== bn && 71 !== e[o + bn]) { if (s) return -1; break } if (s++, -1 === a && 0 !== (a = o) && (r = Math.min(a + 18612, e.length - bn) + 1), n || (n = 0 === _n(e, o)), n && s > 1 && (0 === a && s > 2 || o + bn > r)) return a } i++ } return -1 } , e.createTrack = function(e, t) { return { container: "video" === e || "audio" === e ? "video/mp2t" : void 0, type: e, id: oe[e], pid: -1, inputTimeScale: 9e4, sequenceNumber: 0, samples: [], dropped: 0, duration: "audio" === e ? t : void 0 } } ; var t = e.prototype; return t.resetInitSegment = function(t, r, i, n) { this.pmtParsed = !1, this._pmtId = -1, this._videoTrack = e.createTrack("video"), this._videoTrack.duration = n, this._audioTrack = e.createTrack("audio", n), this._id3Track = e.createTrack("id3"), this._txtTrack = e.createTrack("text"), this._audioTrack.segmentCodec = "aac", this.videoParser = null, this.aacOverFlow = null, this.remainderData = null, this.audioCodec = r, this.videoCodec = i } , t.resetTimeStamp = function() {} , t.resetContiguity = function() { var e = this._audioTrack , t = this._videoTrack , r = this._id3Track; e && (e.pesData = null), t && (t.pesData = null), r && (r.pesData = null), this.aacOverFlow = null, this.remainderData = null } , t.demux = function(t, r, i, n) { var a; void 0 === i && (i = !1), void 0 === n && (n = !1), i || (this.sampleAes = null); var s = this._videoTrack , o = this._audioTrack , l = this._id3Track , u = this._txtTrack , d = s.pid , h = s.pesData , f = o.pid , c = l.pid , g = o.pesData , v = l.pesData , m = null , p = this.pmtParsed , y = this._pmtId , E = t.length; if (this.remainderData && (E = (t = Ae(this.remainderData, t)).length, this.remainderData = null), E < bn && !n) return this.remainderData = t, { audioTrack: o, videoTrack: s, id3Track: l, textTrack: u }; var T = Math.max(0, e.syncOffset(t)); (E -= (E - T) % bn) < t.byteLength && !n && (this.remainderData = new Uint8Array(t.buffer,E,t.buffer.byteLength - E)); for (var S = 0, A = T; A < E; A += bn) if (71 === t[A]) { var L = !!(64 & t[A + 1]) , I = _n(t, A) , R = void 0; if ((48 & t[A + 3]) >> 4 > 1) { if ((R = A + 5 + t[A + 4]) === A + bn) continue } else R = A + 4; switch (I) { case d: L && (h && (a = xn(h, this.logger)) && (this.readyVideoParser(s.segmentCodec), null !== this.videoParser && this.videoParser.parsePES(s, u, a, !1)), h = { data: [], size: 0 }), h && (h.data.push(t.subarray(R, A + bn)), h.size += A + bn - R); break; case f: if (L) { if (g && (a = xn(g, this.logger))) switch (o.segmentCodec) { case "aac": this.parseAACPES(o, a); break; case "mp3": this.parseMPEGPES(o, a); break; case "ac3": this.parseAC3PES(o, a) } g = { data: [], size: 0 } } g && (g.data.push(t.subarray(R, A + bn)), g.size += A + bn - R); break; case c: L && (v && (a = xn(v, this.logger)) && this.parseID3PES(l, a), v = { data: [], size: 0 }), v && (v.data.push(t.subarray(R, A + bn)), v.size += A + bn - R); break; case 0: L && (R += t[R] + 1), y = this._pmtId = Pn(t, R); break; case y: L && (R += t[R] + 1); var k = Cn(t, R, this.typeSupported, i, this.observer, this.logger); (d = k.videoPid) > 0 && (s.pid = d, s.segmentCodec = k.segmentVideoCodec), (f = k.audioPid) > 0 && (o.pid = f, o.segmentCodec = k.segmentAudioCodec), (c = k.id3Pid) > 0 && (l.pid = c), null === m || p || (this.logger.warn("MPEG-TS PMT found at " + A + " after unknown PID '" + m + "'. Backtracking to sync byte @" + T + " to parse all TS packets."), m = null, A = T - 188), p = this.pmtParsed = !0; break; case 17: case 8191: break; default: m = I } } else S++; S > 0 && wn(this.observer, new Error("Found " + S + " TS packet/s that do not start with 0x47"), void 0, this.logger), s.pesData = h, o.pesData = g, l.pesData = v; var b = { audioTrack: o, videoTrack: s, id3Track: l, textTrack: u }; return n && this.extractRemainingSamples(b), b } , t.flush = function() { var e, t = this.remainderData; return this.remainderData = null, e = t ? this.demux(t, -1, !1, !0) : { videoTrack: this._videoTrack, audioTrack: this._audioTrack, id3Track: this._id3Track, textTrack: this._txtTrack }, this.extractRemainingSamples(e), this.sampleAes ? this.decrypt(e, this.sampleAes) : e } , t.extractRemainingSamples = function(e) { var t, r = e.audioTrack, i = e.videoTrack, n = e.id3Track, a = e.textTrack, s = i.pesData, o = r.pesData, l = n.pesData; if (s && (t = xn(s, this.logger)) ? (this.readyVideoParser(i.segmentCodec), null !== this.videoParser && (this.videoParser.parsePES(i, a, t, !0), i.pesData = null)) : i.pesData = s, o && (t = xn(o, this.logger))) { switch (r.segmentCodec) { case "aac": this.parseAACPES(r, t); break; case "mp3": this.parseMPEGPES(r, t); break; case "ac3": this.parseAC3PES(r, t) } r.pesData = null } else null != o && o.size && this.logger.log("last AAC PES packet truncated,might overlap between fragments"), r.pesData = o; l && (t = xn(l, this.logger)) ? (this.parseID3PES(n, t), n.pesData = null) : n.pesData = l } , t.demuxSampleAes = function(e, t, r) { var i = this.demux(e, r, !0, !this.config.progressive) , n = this.sampleAes = new An(this.observer,this.config,t); return this.decrypt(i, n) } , t.readyVideoParser = function(e) { null === this.videoParser && ("avc" === e ? this.videoParser = new Rn : "hevc" === e && (this.videoParser = new kn)) } , t.decrypt = function(e, t) { return new Promise((function(r) { var i = e.audioTrack , n = e.videoTrack; i.samples && "aac" === i.segmentCodec ? t.decryptAacSamples(i.samples, 0, (function() { n.samples ? t.decryptAvcSamples(n.samples, 0, 0, (function() { r(e) } )) : r(e) } )) : n.samples && t.decryptAvcSamples(n.samples, 0, 0, (function() { r(e) } )) } )) } , t.destroy = function() { this.observer && this.observer.removeAllListeners(), this.config = this.logger = this.observer = null, this.aacOverFlow = this.videoParser = this.remainderData = this.sampleAes = null, this._videoTrack = this._audioTrack = this._id3Track = this._txtTrack = void 0 } , t.parseAACPES = function(e, t) { var r, i, n, a = 0, s = this.aacOverFlow, o = t.data; if (s) { this.aacOverFlow = null; var l = s.missing , u = s.sample.unit.byteLength; if (-1 === l) o = Ae(s.sample.unit, o); else { var d = u - l; s.sample.unit.set(o.subarray(0, l), d), e.samples.push(s.sample), a = s.missing } } for (r = a, i = o.length; r < i - 1 && !Ni(o, r); r++) ; if (r !== a) { var h, f = r < i - 1; if (h = f ? "AAC PES did not start with ADTS header,offset:" + r : "No ADTS header found in AAC PES", wn(this.observer, new Error(h), f, this.logger), !f) return } if (Bi(e, this.observer, o, r, this.audioCodec), void 0 !== t.pts) n = t.pts; else { if (!s) return void this.logger.warn("[tsdemuxer]: AAC PES unknown PTS"); var c = Gi(e.samplerate); n = s.sample.pts + c } for (var g, v = 0; r < i; ) { if (r += (g = Ki(e, o, r, n, v)).length, g.missing) { this.aacOverFlow = g; break } for (v++; r < i - 1 && !Ni(o, r); r++) ; } } , t.parseMPEGPES = function(e, t) { var r = t.data , i = r.length , n = 0 , a = 0 , s = t.pts; if (void 0 !== s) for (; a < i; ) if (fn(r, a)) { var o = un(e, r, a, s, n); if (!o) break; a += o.length, n++ } else a++; else this.logger.warn("[tsdemuxer]: MPEG PES unknown PTS") } , t.parseAC3PES = function(e, t) { var r = t.data , i = t.pts; if (void 0 !== i) for (var n, a = r.length, s = 0, o = 0; o < a && (n = pn(e, r, o, i, s++)) > 0; ) o += n; else this.logger.warn("[tsdemuxer]: AC3 PES unknown PTS") } , t.parseID3PES = function(e, t) { if (void 0 !== t.pts) { var r = a({}, t, { type: this._videoTrack ? Ji.emsg : Ji.audioId3, duration: Number.POSITIVE_INFINITY }); e.samples.push(r) } else this.logger.warn("[tsdemuxer]: ID3 PES unknown PTS") } , e }(); function _n(e, t) { return ((31 & e[t + 1]) << 8) + e[t + 2] } function Pn(e, t) { return (31 & e[t + 10]) << 8 | e[t + 11] } function Cn(e, t, r, i, n, a) { var s = { audioPid: -1, videoPid: -1, id3Pid: -1, segmentVideoCodec: "avc", segmentAudioCodec: "aac" } , o = t + 3 + ((15 & e[t + 1]) << 8 | e[t + 2]) - 4; for (t += 12 + ((15 & e[t + 10]) << 8 | e[t + 11]); t < o; ) { var l = _n(e, t) , u = (15 & e[t + 3]) << 8 | e[t + 4]; switch (e[t]) { case 207: if (!i) { On("ADTS AAC", a); break } case 15: -1 === s.audioPid && (s.audioPid = l); break; case 21: -1 === s.id3Pid && (s.id3Pid = l); break; case 219: if (!i) { On("H.264", a); break } case 27: -1 === s.videoPid && (s.videoPid = l); break; case 3: case 4: r.mpeg || r.mp3 ? -1 === s.audioPid && (s.audioPid = l, s.segmentAudioCodec = "mp3") : a.log("MPEG audio found, not supported in this browser"); break; case 193: if (!i) { On("AC-3", a); break } case 129: r.ac3 ? -1 === s.audioPid && (s.audioPid = l, s.segmentAudioCodec = "ac3") : a.log("AC-3 audio found, not supported in this browser"); break; case 6: if (-1 === s.audioPid && u > 0) for (var d = t + 5, h = u; h > 2; ) { 106 === e[d] && (!0 !== r.ac3 ? a.log("AC-3 audio found, not supported in this browser for now") : (s.audioPid = l, s.segmentAudioCodec = "ac3")); var f = e[d + 1] + 2; d += f, h -= f } break; case 194: case 135: return wn(n, new Error("Unsupported EC-3 in M2TS found"), void 0, a), s; case 36: -1 === s.videoPid && (s.videoPid = l, s.segmentVideoCodec = "hevc", a.log("HEVC in M2TS found")) } t += u + 5 } return s } function wn(e, t, r, i) { i.warn("parsing error: " + t.message), e.emit(b.ERROR, b.ERROR, { type: R.MEDIA_ERROR, details: k.FRAG_PARSING_ERROR, fatal: !1, levelRetry: r, error: t, reason: t.message }) } function On(e, t) { t.log(e + " with AES-128-CBC encryption found in unencrypted stream") } function xn(e, t) { var r, i, n, a, s, o = 0, l = e.data; if (!e || 0 === e.size) return null; for (; l[0].length < 19 && l.length > 1; ) l[0] = Ae(l[0], l[1]), l.splice(1, 1); if (1 === ((r = l[0])[0] << 16) + (r[1] << 8) + r[2]) { if ((i = (r[4] << 8) + r[5]) && i > e.size - 6) return null; var u = r[7]; 192 & u && (a = 536870912 * (14 & r[9]) + 4194304 * (255 & r[10]) + 16384 * (254 & r[11]) + 128 * (255 & r[12]) + (254 & r[13]) / 2, 64 & u ? a - (s = 536870912 * (14 & r[14]) + 4194304 * (255 & r[15]) + 16384 * (254 & r[16]) + 128 * (255 & r[17]) + (254 & r[18]) / 2) > 54e5 && (t.warn(Math.round((a - s) / 9e4) + "s delta between PTS and DTS, align them"), a = s) : s = a); var d = (n = r[8]) + 9; if (e.size <= d) return null; e.size -= d; for (var h = new Uint8Array(e.size), f = 0, c = l.length; f < c; f++) { var g = (r = l[f]).byteLength; if (d) { if (d > g) { d -= g; continue } r = r.subarray(d), g -= d, d = 0 } h.set(r, o), o += g } return i && (i -= n + 3), { data: h, pts: a, dts: s, len: i } } return null } var Mn = function() { function e() {} return e.getSilentFrame = function(e, t) { if ("mp4a.40.2" === e) { if (1 === t) return new Uint8Array([0, 200, 0, 128, 35, 128]); if (2 === t) return new Uint8Array([33, 0, 73, 144, 2, 25, 0, 35, 128]); if (3 === t) return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 142]); if (4 === t) return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 128, 44, 128, 8, 2, 56]); if (5 === t) return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 130, 48, 4, 153, 0, 33, 144, 2, 56]); if (6 === t) return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 130, 48, 4, 153, 0, 33, 144, 2, 0, 178, 0, 32, 8, 224]) } else { if (1 === t) return new Uint8Array([1, 64, 34, 128, 163, 78, 230, 128, 186, 8, 0, 0, 0, 28, 6, 241, 193, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94]); if (2 === t) return new Uint8Array([1, 64, 34, 128, 163, 94, 230, 128, 186, 8, 0, 0, 0, 0, 149, 0, 6, 241, 161, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94]); if (3 === t) return new Uint8Array([1, 64, 34, 128, 163, 94, 230, 128, 186, 8, 0, 0, 0, 0, 149, 0, 6, 241, 161, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94]) } } , e }() , Fn = Math.pow(2, 32) - 1 , Nn = function() { function e() {} return e.init = function() { var t; for (t in e.types = { avc1: [], avcC: [], hvc1: [], hvcC: [], btrt: [], dinf: [], dref: [], esds: [], ftyp: [], hdlr: [], mdat: [], mdhd: [], mdia: [], mfhd: [], minf: [], moof: [], moov: [], mp4a: [], ".mp3": [], dac3: [], "ac-3": [], mvex: [], mvhd: [], pasp: [], sdtp: [], stbl: [], stco: [], stsc: [], stsd: [], stsz: [], stts: [], tfdt: [], tfhd: [], traf: [], trak: [], trun: [], trex: [], tkhd: [], vmhd: [], smhd: [] }, e.types) e.types.hasOwnProperty(t) && (e.types[t] = [t.charCodeAt(0), t.charCodeAt(1), t.charCodeAt(2), t.charCodeAt(3)]); var r = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 118, 105, 100, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 105, 100, 101, 111, 72, 97, 110, 100, 108, 101, 114, 0]) , i = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 115, 111, 117, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 111, 117, 110, 100, 72, 97, 110, 100, 108, 101, 114, 0]); e.HDLR_TYPES = { video: r, audio: i }; var n = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 117, 114, 108, 32, 0, 0, 0, 1]) , a = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0]); e.STTS = e.STSC = e.STCO = a, e.STSZ = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), e.VMHD = new Uint8Array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]), e.SMHD = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 0]), e.STSD = new Uint8Array([0, 0, 0, 0, 0, 0, 0, 1]); var s = new Uint8Array([105, 115, 111, 109]) , o = new Uint8Array([97, 118, 99, 49]) , l = new Uint8Array([0, 0, 0, 1]); e.FTYP = e.box(e.types.ftyp, s, l, s, o), e.DINF = e.box(e.types.dinf, e.box(e.types.dref, n)) } , e.box = function(e) { for (var t = 8, r = arguments.length, i = new Array(r > 1 ? r - 1 : 0), n = 1; n < r; n++) i[n - 1] = arguments[n]; for (var a = i.length, s = a; a--; ) t += i[a].byteLength; var o = new Uint8Array(t); for (o[0] = t >> 24 & 255, o[1] = t >> 16 & 255, o[2] = t >> 8 & 255, o[3] = 255 & t, o.set(e, 4), a = 0, t = 8; a < s; a++) o.set(i[a], t), t += i[a].byteLength; return o } , e.hdlr = function(t) { return e.box(e.types.hdlr, e.HDLR_TYPES[t]) } , e.mdat = function(t) { return e.box(e.types.mdat, t) } , e.mdhd = function(t, r) { r *= t; var i = Math.floor(r / (Fn + 1)) , n = Math.floor(r % (Fn + 1)); return e.box(e.types.mdhd, 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, n >> 24, n >> 16 & 255, n >> 8 & 255, 255 & n, 85, 196, 0, 0])) } , e.mdia = function(t) { return e.box(e.types.mdia, e.mdhd(t.timescale || 0, t.duration || 0), 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, r, i) { return e.box(e.types.moof, e.mfhd(t), e.traf(i, r)) } , e.moov = function(t) { for (var r = t.length, i = []; r--; ) i[r] = e.trak(t[r]); return e.box.apply(null, [e.types.moov, e.mvhd(t[0].timescale || 0, t[0].duration || 0)].concat(i).concat(e.mvex(t))) } , e.mvex = function(t) { for (var r = t.length, i = []; r--; ) i[r] = e.trex(t[r]); return e.box.apply(null, [e.types.mvex].concat(i)) } , e.mvhd = function(t, r) { r *= t; var i = Math.floor(r / (Fn + 1)) , n = Math.floor(r % (Fn + 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, n >> 24, n >> 16 & 255, n >> 8 & 255, 255 & n, 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 r, i, n = t.samples || [], a = new Uint8Array(4 + n.length); for (r = 0; r < n.length; r++) i = n[r].flags, a[r + 4] = i.dependsOn << 4 | i.isDependedOn << 2 | i.hasRedundancy; return e.box(e.types.sdtp, a) } , e.stbl = function(t) { return e.box(e.types.stbl, e.stsd(t), e.box(e.types.stts, e.STTS), e.box(e.types.stsc, e.STSC), e.box(e.types.stsz, e.STSZ), e.box(e.types.stco, e.STCO)) } , e.avc1 = function(t) { var r, i, n, a = [], s = []; for (r = 0; r < t.sps.length; r++) n = (i = t.sps[r]).byteLength, a.push(n >>> 8 & 255), a.push(255 & n), a = a.concat(Array.prototype.slice.call(i)); for (r = 0; r < t.pps.length; r++) n = (i = t.pps[r]).byteLength, s.push(n >>> 8 & 255), s.push(255 & n), s = s.concat(Array.prototype.slice.call(i)); var o = 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(s))) , l = t.width , u = t.height , d = t.pixelRatio[0] , h = 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]), o, 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([d >> 24, d >> 16 & 255, d >> 8 & 255, 255 & d, h >> 24, h >> 16 & 255, h >> 8 & 255, 255 & h]))) } , e.esds = function(e) { var t = e.config; return new Uint8Array([0, 0, 0, 0, 3, 25, 0, 1, 0, 4, 17, 64, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 2].concat(t, [6, 1, 2])) } , e.audioStsd = function(e) { var t = e.samplerate || 0; return new Uint8Array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, e.channelCount || 0, 0, 16, 0, 0, 0, 0, t >> 8 & 255, 255 & t, 0, 0]) } , e.mp4a = function(t) { return e.box(e.types.mp4a, e.audioStsd(t), e.box(e.types.esds, e.esds(t))) } , e.mp3 = function(t) { return e.box(e.types[".mp3"], e.audioStsd(t)) } , e.ac3 = function(t) { return e.box(e.types["ac-3"], e.audioStsd(t), e.box(e.types.dac3, t.config)) } , e.stsd = function(t) { var r = t.segmentCodec; if ("audio" === t.type) { if ("aac" === r) return e.box(e.types.stsd, e.STSD, e.mp4a(t)); if ("ac3" === r && t.config) return e.box(e.types.stsd, e.STSD, e.ac3(t)); if ("mp3" === r && "mp3" === t.codec) return e.box(e.types.stsd, e.STSD, e.mp3(t)) } else { if (!t.pps || !t.sps) throw new Error("video track missing pps or sps"); if ("avc" === r) return e.box(e.types.stsd, e.STSD, e.avc1(t)); if ("hevc" === r && t.vps) return e.box(e.types.stsd, e.STSD, e.hvc1(t)) } throw new Error("unsupported " + t.type + " segment codec (" + r + "/" + t.codec + ")") } , e.tkhd = function(t) { var r = t.id , i = (t.duration || 0) * (t.timescale || 0) , n = t.width || 0 , a = t.height || 0 , s = Math.floor(i / (Fn + 1)) , o = Math.floor(i % (Fn + 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, r >> 24 & 255, r >> 16 & 255, r >> 8 & 255, 255 & r, 0, 0, 0, 0, s >> 24, s >> 16 & 255, s >> 8 & 255, 255 & s, o >> 24, o >> 16 & 255, o >> 8 & 255, 255 & o, 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, n >> 8 & 255, 255 & n, 0, 0, a >> 8 & 255, 255 & a, 0, 0])) } , e.traf = function(t, r) { var i = e.sdtp(t) , n = t.id , a = Math.floor(r / (Fn + 1)) , s = Math.floor(r % (Fn + 1)); return e.box(e.types.traf, e.box(e.types.tfhd, new Uint8Array([0, 0, 0, 0, n >> 24, n >> 16 & 255, n >> 8 & 255, 255 & n])), e.box(e.types.tfdt, new Uint8Array([1, 0, 0, 0, a >> 24, a >> 16 & 255, a >> 8 & 255, 255 & a, s >> 24, s >> 16 & 255, s >> 8 & 255, 255 & s])), 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 r = t.id; return e.box(e.types.trex, new Uint8Array([0, 0, 0, 0, r >> 24, r >> 16 & 255, r >> 8 & 255, 255 & r, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1])) } , e.trun = function(t, r) { var i, n, a, s, o, l, u = t.samples || [], d = u.length, h = 12 + 16 * d, f = new Uint8Array(h); for (r += 8 + h, f.set(["video" === t.type ? 1 : 0, 0, 15, 1, d >>> 24 & 255, d >>> 16 & 255, d >>> 8 & 255, 255 & d, r >>> 24 & 255, r >>> 16 & 255, r >>> 8 & 255, 255 & r], 0), i = 0; i < d; i++) a = (n = u[i]).duration, s = n.size, o = n.flags, l = n.cts, f.set([a >>> 24 & 255, a >>> 16 & 255, a >>> 8 & 255, 255 & a, s >>> 24 & 255, s >>> 16 & 255, s >>> 8 & 255, 255 & s, o.isLeading << 2 | o.dependsOn, o.isDependedOn << 6 | o.hasRedundancy << 4 | o.paddingValue << 1 | o.isNonSync, 61440 & o.degradPrio, 15 & o.degradPrio, l >>> 24 & 255, l >>> 16 & 255, l >>> 8 & 255, 255 & l], 12 + 16 * i); return e.box(e.types.trun, f) } , e.initSegment = function(t) { e.types || e.init(); var r = e.moov(t); return Ae(e.FTYP, r) } , e.hvc1 = function(t) { for (var r = t.params, i = [t.vps, t.sps, t.pps], n = new Uint8Array([1, r.general_profile_space << 6 | (r.general_tier_flag ? 32 : 0) | r.general_profile_idc, r.general_profile_compatibility_flags[0], r.general_profile_compatibility_flags[1], r.general_profile_compatibility_flags[2], r.general_profile_compatibility_flags[3], r.general_constraint_indicator_flags[0], r.general_constraint_indicator_flags[1], r.general_constraint_indicator_flags[2], r.general_constraint_indicator_flags[3], r.general_constraint_indicator_flags[4], r.general_constraint_indicator_flags[5], r.general_level_idc, 240 | r.min_spatial_segmentation_idc >> 8, 255 & r.min_spatial_segmentation_idc, 252 | r.parallelismType, 252 | r.chroma_format_idc, 248 | r.bit_depth_luma_minus8, 248 | r.bit_depth_chroma_minus8, 0, parseInt(r.frame_rate.fps), 3 | r.temporal_id_nested << 2 | r.num_temporal_layers << 3 | (r.frame_rate.fixed ? 64 : 0), i.length]), a = n.length, s = 0; s < i.length; s += 1) { a += 3; for (var o = 0; o < i[s].length; o += 1) a += 2 + i[s][o].length } var l = new Uint8Array(a); l.set(n, 0), a = n.length; for (var u = i.length - 1, d = 0; d < i.length; d += 1) { l.set(new Uint8Array([32 + d | (d === u ? 128 : 0), 0, i[d].length]), a), a += 3; for (var h = 0; h < i[d].length; h += 1) l.set(new Uint8Array([i[d][h].length >> 8, 255 & i[d][h].length]), a), a += 2, l.set(i[d][h], a), a += i[d][h].length } var f = e.box(e.types.hvcC, l) , c = t.width , g = t.height , v = t.pixelRatio[0] , m = t.pixelRatio[1]; return e.box(e.types.hvc1, 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, c >> 8 & 255, 255 & c, g >> 8 & 255, 255 & g, 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]), f, 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([v >> 24, v >> 16 & 255, v >> 8 & 255, 255 & v, m >> 24, m >> 16 & 255, m >> 8 & 255, 255 & m]))) } , e }(); Nn.types = void 0, Nn.HDLR_TYPES = void 0, Nn.STTS = void 0, Nn.STSC = void 0, Nn.STCO = void 0, Nn.STSZ = void 0, Nn.VMHD = void 0, Nn.SMHD = void 0, Nn.STSD = void 0, Nn.FTYP = void 0, Nn.DINF = void 0; var Un = 9e4; function Bn(e, t, r, i) { void 0 === r && (r = 1), void 0 === i && (i = !1); var n = e * t * r; return i ? Math.round(n) : n } function Gn(e, t) { return Bn(e, 1e3, 1 / Un, t) } var Kn = null , Vn = null; function Hn(e, t, r, i) { return { duration: t, size: r, cts: i, flags: { isLeading: 0, isDependedOn: 0, hasRedundancy: 0, degradPrio: 0, dependsOn: e ? 2 : 1, isNonSync: e ? 0 : 1 } } } var Yn = function(e) { function t(t, r, i, n) { var a; if ((a = e.call(this, "mp4-remuxer", n) || this).observer = void 0, a.config = void 0, a.typeSupported = void 0, a.ISGenerated = !1, a._initPTS = null, a._initDTS = null, a.nextVideoTs = null, a.nextAudioTs = null, a.videoSampleDuration = null, a.isAudioContiguous = !1, a.isVideoContiguous = !1, a.videoTrackConfig = void 0, a.observer = t, a.config = r, a.typeSupported = i, a.ISGenerated = !1, null === Kn) { var s = (navigator.userAgent || "").match(/Chrome\/(\d+)/i); Kn = s ? parseInt(s[1]) : 0 } if (null === Vn) { var o = navigator.userAgent.match(/Safari\/(\d+)/i); Vn = o ? parseInt(o[1]) : 0 } return a } o(t, e); var r = t.prototype; return r.destroy = function() { this.config = this.videoTrackConfig = this._initPTS = this._initDTS = null } , r.resetTimeStamp = function(e) { this.log("initPTS & initDTS reset"), this._initPTS = this._initDTS = e } , r.resetNextTimestamp = function() { this.log("reset next timestamp"), this.isVideoContiguous = !1, this.isAudioContiguous = !1 } , r.resetInitSegment = function() { this.log("ISGenerated flag reset"), this.ISGenerated = !1, this.videoTrackConfig = void 0 } , r.getVideoStartPts = function(e) { var t = !1 , r = e[0].pts , i = e.reduce((function(e, i) { var n = i.pts , a = n - e; return a < -4294967296 && (t = !0, a = (n = Wn(n, r)) - e), a > 0 ? e : n } ), r); return t && this.debug("PTS rollover detected"), i } , r.remux = function(e, t, r, i, n, a, s, o) { var l, u, d, h, f, c, g = n, v = n, m = e.pid > -1, p = t.pid > -1, y = t.samples.length, E = e.samples.length > 0, T = s && y > 0 || y > 1; if ((!m || E) && (!p || T) || this.ISGenerated || s) { if (this.ISGenerated) { var S, A, L, I, R = this.videoTrackConfig; (R && (t.width !== R.width || t.height !== R.height || (null == (S = t.pixelRatio) ? void 0 : S[0]) !== (null == (A = R.pixelRatio) ? void 0 : A[0]) || (null == (L = t.pixelRatio) ? void 0 : L[1]) !== (null == (I = R.pixelRatio) ? void 0 : I[1])) || !R && T || null === this.nextAudioTs && E) && this.resetInitSegment() } this.ISGenerated || (d = this.generateIS(e, t, n, a)); var k, b = this.isVideoContiguous, D = -1; if (T && (D = function(e) { for (var t = 0; t < e.length; t++) if (e[t].key) return t; return -1 }(t.samples), !b && this.config.forceKeyFrameOnDiscontinuity)) if (c = !0, D > 0) { this.warn("Dropped " + D + " out of " + y + " video samples due to a missing keyframe"); var _ = this.getVideoStartPts(t.samples); t.samples = t.samples.slice(D), t.dropped += D, k = v += (t.samples[0].pts - _) / t.inputTimeScale } else -1 === D && (this.warn("No keyframe found out of " + y + " video samples"), c = !1); if (this.ISGenerated) { if (E && T) { var P = this.getVideoStartPts(t.samples) , C = (Wn(e.samples[0].pts, P) - P) / t.inputTimeScale; g += Math.max(0, C), v += Math.max(0, -C) } if (E) { if (e.samplerate || (this.warn("regenerate InitSegment as audio detected"), d = this.generateIS(e, t, n, a)), u = this.remuxAudio(e, g, this.isAudioContiguous, a, p || T || o === O ? v : void 0), T) { var w = u ? u.endPTS - u.startPTS : 0; t.inputTimeScale || (this.warn("regenerate InitSegment as video detected"), d = this.generateIS(e, t, n, a)), l = this.remuxVideo(t, v, b, w) } } else T && (l = this.remuxVideo(t, v, b, 0)); l && (l.firstKeyFrame = D, l.independent = -1 !== D, l.firstKeyFramePTS = k) } } return this.ISGenerated && this._initPTS && this._initDTS && (r.samples.length && (f = jn(r, n, this._initPTS, this._initDTS)), i.samples.length && (h = qn(i, n, this._initPTS))), { audio: u, video: l, initSegment: d, independent: c, text: h, id3: f } } , r.generateIS = function(e, t, r, i) { var n, a, s, o = e.samples, l = t.samples, u = this.typeSupported, d = {}, h = this._initPTS, f = !h || i, c = "audio/mp4", g = -1; if (f && (n = a = 1 / 0), e.config && o.length) { switch (e.timescale = e.samplerate, e.segmentCodec) { case "mp3": u.mpeg ? (c = "audio/mpeg", e.codec = "") : u.mp3 && (e.codec = "mp3"); break; case "ac3": e.codec = "ac-3" } d.audio = { id: "audio", container: c, codec: e.codec, initSegment: "mp3" === e.segmentCodec && u.mpeg ? new Uint8Array(0) : Nn.initSegment([e]), metadata: { channelCount: e.channelCount } }, f && (g = e.id, s = e.inputTimeScale, h && s === h.timescale ? f = !1 : n = a = o[0].pts - Math.round(s * r)) } if (t.sps && t.pps && l.length) { if (t.timescale = t.inputTimeScale, d.video = { id: "main", container: "video/mp4", codec: t.codec, initSegment: Nn.initSegment([t]), metadata: { width: t.width, height: t.height } }, f) if (g = t.id, s = t.inputTimeScale, h && s === h.timescale) f = !1; else { var v = this.getVideoStartPts(l) , m = Math.round(s * r); a = Math.min(a, Wn(l[0].dts, v) - m), n = Math.min(n, v - m) } this.videoTrackConfig = { width: t.width, height: t.height, pixelRatio: t.pixelRatio } } if (Object.keys(d).length) return this.ISGenerated = !0, f ? (h && this.warn("Timestamps at playlist time: " + (i ? "" : "~") + r + " " + n / s + " != initPTS: " + h.baseTime / h.timescale + " (" + h.baseTime + "/" + h.timescale + ") trackId: " + h.trackId), this.log("Found initPTS at playlist time: " + r + " offset: " + n / s + " (" + n + "/" + s + ") trackId: " + g), this._initPTS = { baseTime: n, timescale: s, trackId: g }, this._initDTS = { baseTime: a, timescale: s, trackId: g }) : n = s = void 0, { tracks: d, initPTS: n, timescale: s, trackId: g } } , r.remuxVideo = function(e, t, r, i) { var n, s, o = e.inputTimeScale, l = e.samples, u = [], d = l.length, h = this._initPTS, f = h.baseTime * o / h.timescale, c = this.nextVideoTs, g = 8, v = this.videoSampleDuration, m = Number.POSITIVE_INFINITY, p = Number.NEGATIVE_INFINITY, y = !1; if (!r || null === c) { var E = f + t * o , T = l[0].pts - Wn(l[0].dts, l[0].pts); Kn && null !== c && Math.abs(E - T - (c + f)) < 15e3 ? r = !0 : c = E - T - f } for (var S = c + f, A = 0; A < d; A++) { var L = l[A]; L.pts = Wn(L.pts, S), L.dts = Wn(L.dts, S), L.dts < l[A > 0 ? A - 1 : A].dts && (y = !0) } y && l.sort((function(e, t) { var r = e.dts - t.dts , i = e.pts - t.pts; return r || i } )), n = l[0].dts; var I = (s = l[l.length - 1].dts) - n , D = I ? Math.round(I / (d - 1)) : v || e.inputTimeScale / 30; if (r) { var _ = n - S , P = _ > D , C = _ < -1; if ((P || C) && (P ? this.warn((e.segmentCodec || "").toUpperCase() + ": " + Gn(_, !0) + " ms (" + _ + "dts) hole between fragments detected at " + t.toFixed(3)) : this.warn((e.segmentCodec || "").toUpperCase() + ": " + Gn(-_, !0) + " ms (" + _ + "dts) overlapping between fragments detected at " + t.toFixed(3)), !C || S >= l[0].pts || Kn)) { n = S; var w = l[0].pts - _; if (P) l[0].dts = n, l[0].pts = w; else for (var O = !0, x = 0; x < l.length && !(l[x].dts > w && O); x++) { var M = l[x].pts; if (l[x].dts -= _, l[x].pts -= _, x < l.length - 1) { var F = l[x + 1].pts; O = F <= l[x].pts == F <= M } } this.log("Video: Initial PTS/DTS adjusted: " + Gn(w, !0) + "/" + Gn(n, !0) + ", delta: " + Gn(_, !0) + " ms") } } for (var N = 0, U = 0, B = n = Math.max(0, n), G = 0; G < d; G++) { for (var K = l[G], V = K.units, H = V.length, Y = 0, W = 0; W < H; W++) Y += V[W].data.length; U += Y, N += H, K.length = Y, K.dts < B ? (K.dts = B, B += D / 4 | 0 || 1) : B = K.dts, m = Math.min(K.pts, m), p = Math.max(K.pts, p) } s = l[d - 1].dts; var j, q = U + 4 * N + 8; try { j = new Uint8Array(q) } catch (e) { return void this.observer.emit(b.ERROR, b.ERROR, { type: R.MUX_ERROR, details: k.REMUX_ALLOC_ERROR, fatal: !1, error: e, bytes: q, reason: "fail allocating video mdat " + q }) } var X = new DataView(j.buffer); X.setUint32(0, q), j.set(Nn.types.mdat, 4); for (var Q = !1, z = Number.POSITIVE_INFINITY, $ = Number.POSITIVE_INFINITY, Z = Number.NEGATIVE_INFINITY, J = Number.NEGATIVE_INFINITY, ee = 0; ee < d; ee++) { for (var te = l[ee], re = te.units, ie = 0, ne = 0, ae = re.length; ne < ae; ne++) { var se = re[ne] , oe = se.data , le = se.data.byteLength; X.setUint32(g, le), g += 4, j.set(oe, g), g += le, ie += 4 + le } var ue = void 0; if (ee < d - 1) v = l[ee + 1].dts - te.dts, ue = l[ee + 1].pts - te.pts; else { var de = this.config , he = ee > 0 ? te.dts - l[ee - 1].dts : D; if (ue = ee > 0 ? te.pts - l[ee - 1].pts : D, de.stretchShortVideoTrack && null !== this.nextAudioTs) { var fe = Math.floor(de.maxBufferHole * o) , ce = (i ? m + i * o : this.nextAudioTs + f) - te.pts; ce > fe ? ((v = ce - he) < 0 ? v = he : Q = !0, this.log("It is approximately " + ce / 90 + " ms to the next segment; using duration " + v / 90 + " ms for the last video frame.")) : v = he } else v = he } var ge = Math.round(te.pts - te.dts); z = Math.min(z, v), Z = Math.max(Z, v), $ = Math.min($, ue), J = Math.max(J, ue), u.push(Hn(te.key, v, ie, ge)) } if (u.length) if (Kn) { if (Kn < 70) { var ve = u[0].flags; ve.dependsOn = 2, ve.isNonSync = 0 } } else if (Vn && J - $ < Z - z && D / Z < .025 && 0 === u[0].cts) { this.warn("Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration."); for (var me = n, pe = 0, ye = u.length; pe < ye; pe++) { var Ee = me + u[pe].duration , Te = me + u[pe].cts; if (pe < ye - 1) { var Se = Ee + u[pe + 1].cts; u[pe].duration = Se - Te } else u[pe].duration = pe ? u[pe - 1].duration : D; u[pe].cts = 0, me = Ee } } var Ae = s + (v = Q || !v ? D : v); this.nextVideoTs = c = Ae - f, this.videoSampleDuration = v, this.isVideoContiguous = !0; var Le = { data1: Nn.moof(e.sequenceNumber++, n, a(e, { samples: u })), data2: j, startPTS: (m - f) / o, endPTS: (p + v - f) / o, startDTS: (n - f) / o, endDTS: c / o, type: "video", hasAudio: !1, hasVideo: !0, nb: u.length, dropped: e.dropped }; return e.samples = [], e.dropped = 0, Le } , r.getSamplesPerFrame = function(e) { switch (e.segmentCodec) { case "mp3": return 1152; case "ac3": return 1536; default: return 1024 } } , r.remuxAudio = function(e, t, r, i, n) { var s = e.inputTimeScale , o = s / (e.samplerate ? e.samplerate : s) , l = this.getSamplesPerFrame(e) , u = l * o , d = this._initPTS , h = "mp3" === e.segmentCodec && this.typeSupported.mpeg , f = [] , c = void 0 !== n , g = e.samples , v = h ? 0 : 8 , m = this.nextAudioTs || -1 , p = d.baseTime * s / d.timescale , y = p + t * s; if (this.isAudioContiguous = r = r || g.length && m > 0 && (i && Math.abs(y - (m + p)) < 9e3 || Math.abs(Wn(g[0].pts, y) - (m + p)) < 20 * u), g.forEach((function(e) { e.pts = Wn(e.pts, y) } )), !r || m < 0) { if (g = g.filter((function(e) { return e.pts >= 0 } )), !g.length) return; m = 0 === n ? 0 : i && !c ? Math.max(0, y - p) : g[0].pts - p } if ("aac" === e.segmentCodec) for (var E = this.config.maxAudioFramesDrift, T = 0, S = m + p; T < g.length; T++) { var A = g[T] , L = A.pts , I = L - S , D = Math.abs(1e3 * I / s); if (I <= -E * u && c) 0 === T && (this.warn("Audio frame @ " + (L / s).toFixed(3) + "s overlaps marker by " + Math.round(1e3 * I / s) + " ms."), this.nextAudioTs = m = L - p, S = L); else if (I >= E * u && D < 1e4 && c) { var _ = Math.round(I / u); for (S = L - _ * u; S < 0 && _ && u; ) _--, S += u; 0 === T && (this.nextAudioTs = m = S - p), this.warn("Injecting " + _ + " audio frames @ " + ((S - p) / s).toFixed(3) + "s due to " + Math.round(1e3 * I / s) + " ms gap."); for (var P = 0; P < _; P++) { var C = Mn.getSilentFrame(e.parsedCodec || e.manifestCodec || e.codec, e.channelCount); C || (this.log("Unable to get silent frame for given audio codec; duplicating last frame instead."), C = A.unit.subarray()), g.splice(T, 0, { unit: C, pts: S }), S += u, T++ } } A.pts = S, S += u } for (var w, O = null, x = null, M = 0, F = g.length; F--; ) M += g[F].unit.byteLength; for (var N = 0, U = g.length; N < U; N++) { var B = g[N] , G = B.unit , K = B.pts; if (null !== x) f[N - 1].duration = Math.round((K - x) / o); else { if (r && "aac" === e.segmentCodec && (K = m + p), O = K, !(M > 0)) return; M += v; try { w = new Uint8Array(M) } catch (e) { return void this.observer.emit(b.ERROR, b.ERROR, { type: R.MUX_ERROR, details: k.REMUX_ALLOC_ERROR, fatal: !1, error: e, bytes: M, reason: "fail allocating audio mdat " + M }) } h || (new DataView(w.buffer).setUint32(0, M), w.set(Nn.types.mdat, 4)) } w.set(G, v); var V = G.byteLength; v += V, f.push(Hn(!0, l, V, 0)), x = K } var H = f.length; if (H) { var Y = f[f.length - 1]; m = x - p, this.nextAudioTs = m + o * Y.duration; var W = h ? new Uint8Array(0) : Nn.moof(e.sequenceNumber++, O / o, a({}, e, { samples: f })); e.samples = []; var j = (O - p) / s , q = m / s , X = { data1: W, data2: w, startPTS: j, endPTS: q, startDTS: j, endDTS: q, type: "audio", hasAudio: !0, hasVideo: !1, nb: H }; return this.isAudioContiguous = !0, X } } , t }(N); function Wn(e, t) { var r; if (null === t) return e; for (r = t < e ? -8589934592 : 8589934592; Math.abs(e - t) > 4294967296; ) e += r; return e } function jn(e, t, r, i) { var n = e.samples.length; if (n) { for (var a = e.inputTimeScale, s = 0; s < n; s++) { var o = e.samples[s]; o.pts = Wn(o.pts - r.baseTime * a / r.timescale, t * a) / a, o.dts = Wn(o.dts - i.baseTime * a / i.timescale, t * a) / a } var l = e.samples; return e.samples = [], { samples: l } } } function qn(e, t, r) { var i = e.samples.length; if (i) { for (var n = e.inputTimeScale, a = 0; a < i; a++) { var s = e.samples[a]; s.pts = Wn(s.pts - r.baseTime * n / r.timescale, t * n) / n } e.samples.sort((function(e, t) { return e.pts - t.pts } )); var o = e.samples; return e.samples = [], { samples: o } } } var Xn, Qn = function(e) { function t(t, r, i, n) { var a; return (a = e.call(this, "passthrough-remuxer", n) || this).emitInitSegment = !1, a.audioCodec = void 0, a.videoCodec = void 0, a.initData = void 0, a.initPTS = null, a.initTracks = void 0, a.lastEndTime = null, a.isVideoContiguous = !1, a } o(t, e); var r = t.prototype; return r.destroy = function() {} , r.resetTimeStamp = function(e) { this.lastEndTime = null; var t = this.initPTS; t && e && t.baseTime === e.baseTime && t.timescale === e.timescale || (this.initPTS = e) } , r.resetNextTimestamp = function() { this.isVideoContiguous = !1, this.lastEndTime = null } , r.resetInitSegment = function(e, t, r, i) { this.audioCodec = t, this.videoCodec = r, this.generateInitSegment(e, i), this.emitInitSegment = !0 } , r.generateInitSegment = function(e, t) { var r = this.audioCodec , i = this.videoCodec; if (null == e || !e.byteLength) return this.initTracks = void 0, void (this.initData = void 0); var n = this.initData = ve(e) , a = n.audio , s = n.video; if (t) !function(e, t) { if (e && t) { var r = t.keyId; r && t.isCommonEncryption && ce(e, ["moov", "trak"]).forEach((function(e) { var t = ce(e, ["mdia", "minf", "stbl", "stsd"])[0].subarray(8) , i = ce(t, ["enca"]) , n = i.length > 0; n || (i = ce(t, ["encv"])), i.forEach((function(e) { ce(n ? e.subarray(28) : e.subarray(78), ["sinf"]).forEach((function(e) { var t = Se(e); if (t) { var i = t.subarray(8, 24); i.some((function(e) { return 0 !== e } )) || (Y.log("[eme] Patching keyId in 'enc" + (n ? "a" : "v") + ">sinf>>tenc' box: " + X(i) + " -> " + X(r)), t.set(r, 8)) } } )) } )) } )) } }(e, t); else { var o = a || s; null != o && o.encrypted && this.warn('Init segment with encrypted track with has no key ("' + o.codec + '")!') } a && (r = $n(a, $, this)), s && (i = $n(s, Z, this)); var l = {}; a && s ? l.audiovideo = { container: "video/mp4", codec: r + "," + i, supplemental: s.supplemental, encrypted: s.encrypted, initSegment: e, id: "main" } : a ? l.audio = { container: "audio/mp4", codec: r, encrypted: a.encrypted, initSegment: e, id: "audio" } : s ? l.video = { container: "video/mp4", codec: i, supplemental: s.supplemental, encrypted: s.encrypted, initSegment: e, id: "main" } : this.warn("initSegment does not contain moov or trak boxes."), this.initTracks = l } , r.remux = function(e, t, r, i, n, a) { var s, o, l = this.initPTS, u = this.lastEndTime, d = { audio: void 0, video: void 0, text: i, id3: r, initSegment: void 0 }; A(u) || (u = this.lastEndTime = n || 0); var h = t.samples; if (!h.length) return d; var f = { initPTS: void 0, timescale: void 0, trackId: void 0 } , c = this.initData; if (null != (s = c) && s.length || (this.generateInitSegment(h), c = this.initData), null == (o = c) || !o.length) return this.warn("Failed to generate initSegment."), d; this.emitInitSegment && (f.tracks = this.initTracks, this.emitInitSegment = !1); var g = function(e, t, r) { for (var i = {}, n = ce(e, ["moof", "traf"]), a = 0; a < n.length; a++) { var s = n[a] , o = ce(s, ["tfhd"])[0] , l = de(o, 4) , u = t[l]; if (u) { i[l] || (i[l] = { start: NaN, duration: 0, sampleCount: 0, timescale: u.timescale, type: u.type }); var d = i[l] , h = ce(s, ["tfdt"])[0]; if (h) { var f = h[0] , c = de(h, 4); 1 === f && (c === ae ? r.warn("[mp4-demuxer]: Ignoring assumed invalid signed 64-bit track fragment decode time") : (c *= ae + 1, c += de(h, 8))), A(c) && (!A(d.start) || c < d.start) && (d.start = c) } var g = u.default , v = de(o, 0) | (null == g ? void 0 : g.flags) , m = (null == g ? void 0 : g.duration) || 0; 8 & v && (m = de(o, 2 & v ? 12 : 8)); for (var p = ce(s, ["trun"]), y = d.start || 0, E = 0, T = m, S = 0; S < p.length; S++) { var L = p[S] , I = de(L, 4) , R = d.sampleCount; d.sampleCount += I; var k = 1 & L[3] , b = 4 & L[3] , D = 1 & L[2] , _ = 2 & L[2] , P = 4 & L[2] , C = 8 & L[2] , w = 8 , O = I; for (k && (w += 4), b && I && (1 & L[w + 1] || void 0 !== d.keyFrameIndex || (d.keyFrameIndex = R), w += 4, D ? (T = de(L, w), w += 4) : T = m, _ && (w += 4), C && (w += 4), y += T, E += T, O--); O--; ) D ? (T = de(L, w), w += 4) : T = m, _ && (w += 4), P && (1 & L[w + 1] || void 0 === d.keyFrameIndex && (d.keyFrameIndex = d.sampleCount - (O + 1), d.keyFrameStart = y), w += 4), C && (w += 4), y += T, E += T; !E && m && (E += m * I) } d.duration += E } } if (!Object.keys(i).some((function(e) { return i[e].duration } ))) { for (var x = 1 / 0, M = 0, F = ce(e, ["sidx"]), N = 0; N < F.length; N++) { var U = ge(F[N]); if (null != U && U.references) { x = Math.min(x, U.earliestPresentationTime / U.timescale); var B = U.references.reduce((function(e, t) { return e + t.info.duration || 0 } ), 0); M = Math.max(M, B + U.earliestPresentationTime / U.timescale) } } M && A(M) && Object.keys(i).forEach((function(e) { i[e].duration || (i[e].duration = M * i[e].timescale - i[e].start) } )) } return i }(h, c, this) , v = c.audio ? g[c.audio.id] : null , m = c.video ? g[c.video.id] : null , p = zn(m, 1 / 0) , y = zn(v, 1 / 0) , E = zn(m, 0, !0) , T = zn(v, 0, !0) , S = n , L = 0 , I = v && (!m || !l && y < p || l && l.trackId === c.audio.id) , R = I ? v : m; if (R) { var k = R.timescale , b = R.start - n * k , D = I ? c.audio.id : c.video.id; S = R.start / k, L = I ? T - y : E - p, !a && l || !function(e, t, r, i) { if (null === e) return !0; var n = Math.max(i, 1) , a = t - e.baseTime / e.timescale; return Math.abs(a - r) > n }(l, S, n, L) && k === l.timescale || (l && this.warn("Timestamps at playlist time: " + (a ? "" : "~") + n + " " + b / k + " != initPTS: " + l.baseTime / l.timescale + " (" + l.baseTime + "/" + l.timescale + ") trackId: " + l.trackId), this.log("Found initPTS at playlist time: " + n + " offset: " + (S - n) + " (" + b + "/" + k + ") trackId: " + D), l = null, f.initPTS = b, f.timescale = k, f.trackId = D) } else this.warn("No audio or video samples found for initPTS at playlist time: " + n); l ? (f.initPTS = l.baseTime, f.timescale = l.timescale, f.trackId = l.trackId) : (f.timescale && void 0 !== f.trackId && void 0 !== f.initPTS || (this.warn("Could not set initPTS"), f.initPTS = S, f.timescale = 1, f.trackId = -1), this.initPTS = l = { baseTime: f.initPTS, timescale: f.timescale, trackId: f.trackId }); var _ = S - l.baseTime / l.timescale , P = _ + L; L > 0 ? this.lastEndTime = P : (this.warn("Duration parsed from mp4 should be greater than zero"), this.resetNextTimestamp()); var C = !!c.audio , w = !!c.video , O = ""; C && (O += "audio"), w && (O += "video"); var x = { data1: h, startPTS: _, startDTS: _, endPTS: P, endDTS: P, type: O, hasAudio: C, hasVideo: w, nb: 1, dropped: 0, encrypted: !!c.audio && c.audio.encrypted || !!c.video && c.video.encrypted }; d.audio = C && !w ? x : void 0, d.video = w ? x : void 0; var M = null == m ? void 0 : m.sampleCount; if (M) { var F = m.keyFrameIndex , N = -1 !== F; x.nb = M, x.dropped = 0 === F || this.isVideoContiguous ? 0 : N ? F : M, x.independent = N, x.firstKeyFrame = F, N && m.keyFrameStart && (x.firstKeyFramePTS = (m.keyFrameStart - l.baseTime) / l.timescale), this.isVideoContiguous || (d.independent = N), this.isVideoContiguous || (this.isVideoContiguous = N), x.dropped && this.warn("fmp4 does not start with IDR: firstIDR " + F + "/" + M + " dropped: " + x.dropped + " start: " + (x.firstKeyFramePTS || "NA")) } return d.initSegment = f, d.id3 = jn(r, n, l, l), i.samples.length && (d.text = qn(i, n, l)), d } , t }(N); function zn(e, t, r) { return void 0 === r && (r = !1), void 0 !== (null == e ? void 0 : e.start) ? (e.start + (r ? e.duration : 0)) / e.timescale : t } function $n(e, t, r) { var i = e.codec; return i && i.length > 4 ? i : t === $ ? "ec-3" === i || "ac-3" === i || "alac" === i ? i : "fLaC" === i || "Opus" === i ? Ge(i, !1) : (r.warn('Unhandled audio codec "' + i + '" in mp4 MAP'), i || "mp4a") : (r.warn('Unhandled video codec "' + i + '" in mp4 MAP'), i || "avc1") } try { Xn = self.performance.now.bind(self.performance) } catch (e) { Xn = Date.now } var Zn = [{ demux: Tn, remux: Qn }, { demux: Dn, remux: Yn }, { demux: gn, remux: Yn }, { demux: yn, remux: Yn }]; Zn.splice(2, 0, { demux: mn, remux: Yn }); var Jn = function() { function e(e, t, r, i, n, a) { this.asyncResult = !1, this.logger = void 0, this.observer = void 0, this.typeSupported = void 0, this.config = void 0, this.id = void 0, this.demuxer = void 0, this.remuxer = void 0, this.decrypter = void 0, this.probe = void 0, this.decryptionPromise = null, this.transmuxConfig = void 0, this.currentTransmuxState = void 0, this.observer = e, this.typeSupported = t, this.config = r, this.id = n, this.logger = a } var t = e.prototype; return t.configure = function(e) { this.transmuxConfig = e, this.decrypter && this.decrypter.reset() } , t.push = function(e, t, r, i) { var n = this , a = r.transmuxing; a.executeStart = Xn(); var s = new Uint8Array(e) , o = this.currentTransmuxState , l = this.transmuxConfig; i && (this.currentTransmuxState = i); var u = i || o , d = u.contiguous , h = u.discontinuity , f = u.trackSwitch , c = u.accurateTimeOffset , g = u.timeOffset , v = u.initSegmentChange , m = l.audioCodec , p = l.videoCodec , y = l.defaultInitPts , E = l.duration , T = l.initSegmentData , S = function(e, t) { var r = null; return e.byteLength > 0 && null != (null == t ? void 0 : t.key) && null !== t.iv && null != t.method && (r = t), r }(s, t); if (S && Lr(S.method)) { var A = this.getDecrypter() , L = Ir(S.method); if (!A.isSync()) return this.asyncResult = !0, this.decryptionPromise = A.webCryptoDecrypt(s, S.key.buffer, S.iv.buffer, L).then((function(e) { var t = n.push(e, null, r); return n.decryptionPromise = null, t } )), this.decryptionPromise; var I = A.softwareDecrypt(s, S.key.buffer, S.iv.buffer, L); if (r.part > -1) { var D = A.flush(); I = D ? D.buffer : D } if (!I) return a.executeEnd = Xn(), ea(r); s = new Uint8Array(I) } var _ = this.needsProbing(h, f); if (_) { var P = this.configureTransmuxer(s); if (P) return this.logger.warn("[transmuxer] " + P.message), this.observer.emit(b.ERROR, b.ERROR, { type: R.MEDIA_ERROR, details: k.FRAG_PARSING_ERROR, fatal: !1, error: P, reason: P.message }), a.executeEnd = Xn(), ea(r) } (h || f || v || _) && this.resetInitSegment(T, m, p, E, t), (h || v || _) && this.resetInitialTimestamp(y), d || this.resetContiguity(); var C = this.transmux(s, S, g, c, r); this.asyncResult = ta(C); var w = this.currentTransmuxState; return w.contiguous = !0, w.discontinuity = !1, w.trackSwitch = !1, a.executeEnd = Xn(), C } , t.flush = function(e) { var t = this , r = e.transmuxing; r.executeStart = Xn(); var i = this.decrypter , n = this.currentTransmuxState , a = this.decryptionPromise; if (a) return this.asyncResult = !0, a.then((function() { return t.flush(e) } )); var s = [] , o = n.timeOffset; if (i) { var l = i.flush(); l && s.push(this.push(l.buffer, null, e)) } var u = this.demuxer , d = this.remuxer; if (!u || !d) { r.executeEnd = Xn(); var h = [ea(e)]; return this.asyncResult ? Promise.resolve(h) : h } var f = u.flush(o); return ta(f) ? (this.asyncResult = !0, f.then((function(r) { return t.flushRemux(s, r, e), s } ))) : (this.flushRemux(s, f, e), this.asyncResult ? Promise.resolve(s) : s) } , t.flushRemux = function(e, t, r) { var i = t.audioTrack , n = t.videoTrack , a = t.id3Track , s = t.textTrack , o = this.currentTransmuxState , l = o.accurateTimeOffset , u = o.timeOffset; this.logger.log("[transmuxer.ts]: Flushed " + this.id + " sn: " + r.sn + (r.part > -1 ? " part: " + r.part : "") + " of " + (this.id === w ? "level" : "track") + " " + r.level); var d = this.remuxer.remux(i, n, a, s, u, l, !0, this.id); e.push({ remuxResult: d, chunkMeta: r }), r.transmuxing.executeEnd = Xn() } , t.resetInitialTimestamp = function(e) { var t = this.demuxer , r = this.remuxer; t && r && (t.resetTimeStamp(e), r.resetTimeStamp(e)) } , t.resetContiguity = function() { var e = this.demuxer , t = this.remuxer; e && t && (e.resetContiguity(), t.resetNextTimestamp()) } , t.resetInitSegment = function(e, t, r, i, n) { var a = this.demuxer , s = this.remuxer; a && s && (a.resetInitSegment(e, t, r, i), s.resetInitSegment(e, t, r, n)) } , t.destroy = function() { this.demuxer && (this.demuxer.destroy(), this.demuxer = void 0), this.remuxer && (this.remuxer.destroy(), this.remuxer = void 0) } , t.transmux = function(e, t, r, i, n) { return t && "SAMPLE-AES" === t.method ? this.transmuxSampleAes(e, t, r, i, n) : this.transmuxUnencrypted(e, r, i, n) } , t.transmuxUnencrypted = function(e, t, r, i) { var n = this.demuxer.demux(e, t, !1, !this.config.progressive) , a = n.audioTrack , s = n.videoTrack , o = n.id3Track , l = n.textTrack; return { remuxResult: this.remuxer.remux(a, s, o, l, t, r, !1, this.id), chunkMeta: i } } , t.transmuxSampleAes = function(e, t, r, i, n) { var a = this; return this.demuxer.demuxSampleAes(e, t, r).then((function(e) { return { remuxResult: a.remuxer.remux(e.audioTrack, e.videoTrack, e.id3Track, e.textTrack, r, i, !1, a.id), chunkMeta: n } } )) } , t.configureTransmuxer = function(e) { for (var t, r = this.config, i = this.observer, n = this.typeSupported, a = 0, s = Zn.length; a < s; a++) { var o; if (null != (o = Zn[a].demux) && o.probe(e, this.logger)) { t = Zn[a]; break } } if (!t) return new Error("Failed to find demuxer by probing fragment data"); var l = this.demuxer , u = this.remuxer , d = t.remux , h = t.demux; u && u instanceof d || (this.remuxer = new d(i,r,n,this.logger)), l && l instanceof h || (this.demuxer = new h(i,r,n,this.logger), this.probe = h.probe) } , t.needsProbing = function(e, t) { return !this.demuxer || !this.remuxer || e || t } , t.getDecrypter = function() { var e = this.decrypter; return e || (e = this.decrypter = new er(this.config)), e } , e }() , ea = function(e) { return { remuxResult: {}, chunkMeta: e } }; function ta(e) { return "then"in e && e.then instanceof Function } var ra = function(e, t, r, i, n) { this.audioCodec = void 0, this.videoCodec = void 0, this.initSegmentData = void 0, this.duration = void 0, this.defaultInitPts = void 0, this.audioCodec = e, this.videoCodec = t, this.initSegmentData = r, this.duration = i, this.defaultInitPts = n || null } , ia = function(e, t, r, i, n, a) { this.discontinuity = void 0, this.contiguous = void 0, this.accurateTimeOffset = void 0, this.trackSwitch = void 0, this.timeOffset = void 0, this.initSegmentChange = void 0, this.discontinuity = e, this.contiguous = t, this.accurateTimeOffset = r, this.trackSwitch = i, this.timeOffset = n, this.initSegmentChange = a } , na = []; function aa(e, t, r) { if (!((i = t.remuxResult).audio || i.video || i.text || i.id3 || i.initSegment)) return !1; var i, n = [], a = t.remuxResult, s = a.audio, o = a.video; return s && sa(n, s), o && sa(n, o), e.postMessage({ event: "transmuxComplete", data: t, instanceNo: r }, n), !0 } function sa(e, t) { t.data1 && e.push(t.data1.buffer), t.data2 && e.push(t.data2.buffer) } function oa(e, t, r, i) { t.reduce((function(t, r) { return aa(e, r, i) || t } ), !1) || e.postMessage({ event: "transmuxComplete", data: t[0], instanceNo: i }), e.postMessage({ event: "flush", data: r, instanceNo: i }) } function la(e, t, r) { self.postMessage({ event: e, data: t, instanceNo: r }) } void 0 !== t && t && self.addEventListener("message", (function(e) { var t = e.data , r = t.instanceNo; if (void 0 !== r) { var i = na[r]; if ("reset" === t.cmd && (delete na[t.resetNo], i && i.destroy(), t.cmd = "init"), "init" === t.cmd) { var n = JSON.parse(t.config) , a = new E; a.on(b.FRAG_DECRYPTED, la), a.on(b.ERROR, la); var s = H(n.debug, t.id); return function(e, t) { var r = function(r) { e[r] = function() { var e = Array.prototype.join.call(arguments, " "); la("workerLog", { logType: r, message: e }, t) } }; for (var i in e) r(i) }(s, r), na[r] = new Jn(a,t.typeSupported,n,"",t.id,s), void la("init", null, r) } if (i) switch (t.cmd) { case "configure": i.configure(t.config); break; case "demux": var o = i.push(t.data, t.decryptdata, t.chunkMeta, t.state); ta(o) ? o.then((function(e) { aa(self, e, r) } )).catch((function(e) { la(b.ERROR, { instanceNo: r, type: R.MEDIA_ERROR, details: k.FRAG_PARSING_ERROR, chunkMeta: t.chunkMeta, fatal: !1, error: e, err: e, reason: "transmuxer-worker push error" }, r) } )) : aa(self, o, r); break; case "flush": var l = t.chunkMeta , u = i.flush(l); ta(u) ? u.then((function(e) { oa(self, e, l, r) } )).catch((function(e) { la(b.ERROR, { type: R.MEDIA_ERROR, details: k.FRAG_PARSING_ERROR, chunkMeta: t.chunkMeta, fatal: !1, error: e, err: e, reason: "transmuxer-worker flush error" }, r) } )) : oa(self, u, l, r) } } } )); var ua = "1.6.12" , da = {} , ha = 0 , fa = function() { function t(t, r, i, n) { var a = this; this.error = null, this.hls = void 0, this.id = void 0, this.instanceNo = ha++, this.observer = void 0, this.frag = null, this.part = null, this.useWorker = void 0, this.workerContext = null, this.transmuxer = null, this.onTransmuxComplete = void 0, this.onFlush = void 0, this.onWorkerMessage = function(e) { var t = e.data , r = a.hls; if (r && null != t && t.event && t.instanceNo === a.instanceNo) switch (t.event) { case "init": var i, n = null == (i = a.workerContext) ? void 0 : i.objectURL; n && self.URL.revokeObjectURL(n); break; case "transmuxComplete": a.handleTransmuxComplete(t.data); break; case "flush": a.onFlush(t.data); break; case "workerLog": r.logger[t.data.logType] && r.logger[t.data.logType](t.data.message); break; default: t.data = t.data || {}, t.data.frag = a.frag, t.data.part = a.part, t.data.id = a.id, r.trigger(t.event, t.data) } } , this.onWorkerError = function(e) { if (a.hls) { var t = new Error(e.message + " (" + e.filename + ":" + e.lineno + ")"); a.hls.config.enableWorker = !1, a.hls.logger.warn('Error in "' + a.id + '" Web Worker, fallback to inline'), a.hls.trigger(b.ERROR, { type: R.OTHER_ERROR, details: k.INTERNAL_EXCEPTION, fatal: !1, event: "demuxerWorker", error: t }) } } ; var s = t.config; this.hls = t, this.id = r, this.useWorker = !!s.enableWorker, this.onTransmuxComplete = i, this.onFlush = n; var o = function(e, t) { (t = t || {}).frag = a.frag || void 0, e === b.ERROR && (t.parent = a.id, t.part = a.part, a.error = t.error), a.hls.trigger(e, t) }; this.observer = new E, this.observer.on(b.FRAG_DECRYPTED, o), this.observer.on(b.ERROR, o); var l = Ye(s.preferManagedMediaSource); if (this.useWorker && "undefined" != typeof Worker) { var u = this.hls.logger; s.workerPath; try { s.workerPath ? (u.log("loading Web Worker " + s.workerPath + ' for "' + r + '"'), this.workerContext = function(e) { var t = da[e]; if (t) return t.clientCount++, t; var r = new self.URL(e,self.location.href).href , i = { worker: new self.Worker(r), scriptURL: r, clientCount: 1 }; return da[e] = i, i }(s.workerPath)) : (u.log('injecting Web Worker for "' + r + '"'), this.workerContext = function() { var t = da[ua]; if (t) return t.clientCount++, t; var r = new self.Blob(["var exports={};var module={exports:exports};function define(f){f()};define.amd=true;(" + e.toString() + ")(true);"],{ type: "text/javascript" }) , i = self.URL.createObjectURL(r) , n = { worker: new self.Worker(i), objectURL: i, clientCount: 1 }; return da[ua] = n, n }()); var d = this.workerContext.worker; d.addEventListener("message", this.onWorkerMessage), d.addEventListener("error", this.onWorkerError), d.postMessage({ instanceNo: this.instanceNo, cmd: "init", typeSupported: l, id: r, config: lt(s) }) } catch (e) { u.warn('Error setting up "' + r + '" Web Worker, fallback to inline', e), this.terminateWorker(), this.error = null, this.transmuxer = new Jn(this.observer,l,s,"",r,t.logger) } } else this.transmuxer = new Jn(this.observer,l,s,"",r,t.logger) } var r = t.prototype; return r.reset = function() { if (this.frag = null, this.part = null, this.workerContext) { var e = this.instanceNo; this.instanceNo = ha++; var t = this.hls.config , r = Ye(t.preferManagedMediaSource); this.workerContext.worker.postMessage({ instanceNo: this.instanceNo, cmd: "reset", resetNo: e, typeSupported: r, id: this.id, config: lt(t) }) } } , r.terminateWorker = function() { if (this.workerContext) { var e = this.workerContext.worker; this.workerContext = null, e.removeEventListener("message", this.onWorkerMessage), e.removeEventListener("error", this.onWorkerError), function(e) { var t = da[e || ua]; if (t && 1 == t.clientCount--) { var r = t.worker , i = t.objectURL; delete da[e || ua], i && self.URL.revokeObjectURL(i), r.terminate() } }(this.hls.config.workerPath) } } , r.destroy = function() { if (this.workerContext) this.terminateWorker(), this.onWorkerMessage = this.onWorkerError = null; else { var e = this.transmuxer; e && (e.destroy(), this.transmuxer = null) } var t = this.observer; t && t.removeAllListeners(), this.frag = null, this.part = null, this.observer = null, this.hls = null } , r.push = function(e, t, r, i, n, a, s, o, l, u) { var d, h, f = this; l.transmuxing.start = self.performance.now(); var c = this.instanceNo , g = this.transmuxer , v = a ? a.start : n.start , m = n.decryptdata , p = this.frag , y = !(p && n.cc === p.cc) , E = !(p && l.level === p.level) , T = p ? l.sn - p.sn : -1 , S = this.part ? l.part - this.part.index : -1 , A = 0 === T && l.id > 1 && l.id === (null == p ? void 0 : p.stats.chunkCount) , L = !E && (1 === T || 0 === T && (1 === S || A && S <= 0)) , I = self.performance.now(); (E || T || 0 === n.stats.parsing.start) && (n.stats.parsing.start = I), !a || !S && L || (a.stats.parsing.start = I); var R = !(p && (null == (d = n.initSegment) ? void 0 : d.url) === (null == (h = p.initSegment) ? void 0 : h.url)) , k = new ia(y,L,o,E,v,R); if (!L || y || R) { this.hls.logger.log("[transmuxer-interface]: Starting new transmux session for " + n.type + " sn: " + l.sn + (l.part > -1 ? " part: " + l.part : "") + " " + (this.id === w ? "level" : "track") + ": " + l.level + " id: " + l.id + "\n discontinuity: " + y + "\n trackSwitch: " + E + "\n contiguous: " + L + "\n accurateTimeOffset: " + o + "\n timeOffset: " + v + "\n initSegmentChange: " + R); var b = new ra(r,i,t,s,u); this.configureTransmuxer(b) } if (this.frag = n, this.part = a, this.workerContext) this.workerContext.worker.postMessage({ instanceNo: c, cmd: "demux", data: e, decryptdata: m, chunkMeta: l, state: k }, e instanceof ArrayBuffer ? [e] : []); else if (g) { var D = g.push(e, m, l, k); ta(D) ? D.then((function(e) { f.handleTransmuxComplete(e) } )).catch((function(e) { f.transmuxerError(e, l, "transmuxer-interface push error") } )) : this.handleTransmuxComplete(D) } } , r.flush = function(e) { var t = this; e.transmuxing.start = self.performance.now(); var r = this.instanceNo , i = this.transmuxer; if (this.workerContext) this.workerContext.worker.postMessage({ instanceNo: r, cmd: "flush", chunkMeta: e }); else if (i) { var n = i.flush(e); ta(n) ? n.then((function(r) { t.handleFlushResult(r, e) } )).catch((function(r) { t.transmuxerError(r, e, "transmuxer-interface flush error") } )) : this.handleFlushResult(n, e) } } , r.transmuxerError = function(e, t, r) { this.hls && (this.error = e, this.hls.trigger(b.ERROR, { type: R.MEDIA_ERROR, details: k.FRAG_PARSING_ERROR, chunkMeta: t, frag: this.frag || void 0, part: this.part || void 0, fatal: !1, error: e, err: e, reason: r })) } , r.handleFlushResult = function(e, t) { var r = this; e.forEach((function(e) { r.handleTransmuxComplete(e) } )), this.onFlush(t) } , r.configureTransmuxer = function(e) { var t = this.instanceNo , r = this.transmuxer; this.workerContext ? this.workerContext.worker.postMessage({ instanceNo: t, cmd: "configure", config: e }) : r && r.configure(e) } , r.handleTransmuxComplete = function(e) { e.chunkMeta.transmuxing.end = self.performance.now(), this.onTransmuxComplete(e) } , t }() , ca = function(e) { function t(t, r, i) { var n; return (n = e.call(this, t, r, i, "audio-stream-controller", O) || this).mainAnchor = null, n.mainFragLoading = null, n.audioOnly = !1, n.bufferedTrack = null, n.switchingTrack = null, n.trackId = -1, n.waitingData = null, n.mainDetails = null, n.flushing = !1, n.bufferFlushed = !1, n.cachedTrackLoadedData = null, n.registerListeners(), n } o(t, e); var r = t.prototype; return r.onHandlerDestroying = function() { this.unregisterListeners(), e.prototype.onHandlerDestroying.call(this), this.resetItem() } , r.resetItem = function() { this.mainDetails = this.mainAnchor = this.mainFragLoading = this.bufferedTrack = this.switchingTrack = this.waitingData = this.cachedTrackLoadedData = null } , r.registerListeners = function() { e.prototype.registerListeners.call(this); var t = this.hls; t.on(b.LEVEL_LOADED, this.onLevelLoaded, this), t.on(b.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this), t.on(b.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), t.on(b.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this), t.on(b.BUFFER_RESET, this.onBufferReset, this), t.on(b.BUFFER_CREATED, this.onBufferCreated, this), t.on(b.BUFFER_FLUSHING, this.onBufferFlushing, this), t.on(b.BUFFER_FLUSHED, this.onBufferFlushed, this), t.on(b.INIT_PTS_FOUND, this.onInitPtsFound, this), t.on(b.FRAG_LOADING, this.onFragLoading, this), t.on(b.FRAG_BUFFERED, this.onFragBuffered, this) } , r.unregisterListeners = function() { var t = this.hls; t && (e.prototype.unregisterListeners.call(this), t.off(b.LEVEL_LOADED, this.onLevelLoaded, this), t.off(b.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this), t.off(b.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), t.off(b.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this), t.off(b.BUFFER_RESET, this.onBufferReset, this), t.off(b.BUFFER_CREATED, this.onBufferCreated, this), t.off(b.BUFFER_FLUSHING, this.onBufferFlushing, this), t.off(b.BUFFER_FLUSHED, this.onBufferFlushed, this), t.off(b.INIT_PTS_FOUND, this.onInitPtsFound, this), t.off(b.FRAG_LOADING, this.onFragLoading, this), t.off(b.FRAG_BUFFERED, this.onFragBuffered, this)) } , r.onInitPtsFound = function(e, t) { var r = t.frag , i = t.id , n = t.initPTS , a = t.timescale , s = t.trackId; if (i === w) { var o = r.cc , l = this.fragCurrent; if (this.initPTS[o] = { baseTime: n, timescale: a, trackId: s }, this.log("InitPTS for cc: " + o + " found from main: " + n / a + " (" + n + "/" + a + ") trackId: " + s), this.mainAnchor = r, this.state === ki.WAITING_INIT_PTS) { var u = this.waitingData; (!u && !this.loadingParts || u && u.frag.cc !== o) && this.syncWithAnchor(r, null == u ? void 0 : u.frag) } else !this.hls.hasEnoughToStart && l && l.cc !== o ? (l.abortRequests(), this.syncWithAnchor(r, l)) : this.state === ki.IDLE && this.tick() } } , r.getLoadPosition = function() { return !this.startFragRequested && this.nextLoadPosition >= 0 ? this.nextLoadPosition : e.prototype.getLoadPosition.call(this) } , r.syncWithAnchor = function(e, t) { var r, i = (null == (r = this.mainFragLoading) ? void 0 : r.frag) || null; if (!t || (null == i ? void 0 : i.cc) !== t.cc) { var n = (i || e).cc , a = At(this.getLevelDetails(), n, this.getLoadPosition()); a && (this.log("Syncing with main frag at " + a.start + " cc " + a.cc), this.startFragRequested = !1, this.nextLoadPosition = a.start, this.resetLoadingState(), this.state === ki.IDLE && this.doTickIdle()) } } , r.startLoad = function(e, t) { if (!this.levels) return this.startPosition = e, void (this.state = ki.STOPPED); var r = this.lastCurrentTime; this.stopLoad(), this.setInterval(100), r > 0 && -1 === e ? (this.log("Override startPosition with lastCurrentTime @" + r.toFixed(3)), e = r, this.state = ki.IDLE) : this.state = ki.WAITING_TRACK, this.nextLoadPosition = this.lastCurrentTime = e + this.timelineOffset, this.startPosition = t ? -1 : e, this.tick() } , r.doTick = function() { switch (this.state) { case ki.IDLE: this.doTickIdle(); break; case ki.WAITING_TRACK: var t = this.levels , r = this.trackId , i = null == t ? void 0 : t[r] , n = null == i ? void 0 : i.details; if (n && !this.waitForLive(i)) { if (this.waitForCdnTuneIn(n)) break; this.state = ki.WAITING_INIT_PTS } break; case ki.FRAG_LOADING_WAITING_RETRY: this.checkRetryDate(); break; case ki.WAITING_INIT_PTS: var a = this.waitingData; if (a) { var s = a.frag , o = a.part , l = a.cache , u = a.complete , d = this.mainAnchor; if (void 0 !== this.initPTS[s.cc]) { this.waitingData = null, this.state = ki.FRAG_LOADING; var h = { frag: s, part: o, payload: l.flush().buffer, networkDetails: null }; this._handleFragmentLoadProgress(h), u && e.prototype._handleFragmentLoadComplete.call(this, h) } else d && d.cc !== a.frag.cc && this.syncWithAnchor(d, a.frag) } else this.state = ki.IDLE } this.onTickEnd() } , r.resetLoadingState = function() { var t = this.waitingData; t && (this.fragmentTracker.removeFragment(t.frag), this.waitingData = null), e.prototype.resetLoadingState.call(this) } , r.onTickEnd = function() { var e = this.media; null != e && e.readyState && (this.lastCurrentTime = e.currentTime) } , r.doTickIdle = function() { var e, t = this.hls, r = this.levels, i = this.media, n = this.trackId, a = t.config; if (this.buffering && (i || this.primaryPrefetch || !this.startFragRequested && a.startFragPrefetch) && null != r && r[n]) { var s = r[n] , o = s.details; if (!o || this.waitForLive(s) || this.waitForCdnTuneIn(o)) return this.state = ki.WAITING_TRACK, void (this.startFragRequested = !1); var l = this.mediaBuffer ? this.mediaBuffer : this.media; this.bufferFlushed && l && (this.bufferFlushed = !1, this.afterBufferFlushed(l, $, O)); var u = this.getFwdBufferInfo(l, O); if (null !== u) { if (!this.switchingTrack && this._streamEnded(u, o)) return t.trigger(b.BUFFER_EOS, { type: "audio" }), void (this.state = ki.ENDED); var d = u.len , h = t.maxBufferLength , f = o.fragments , c = f[0].start , g = this.getLoadPosition() , v = this.flushing ? g : u.end; if (this.switchingTrack && i) { var m = g; o.PTSKnown && m < c && (u.end > c || u.nextStart) && (this.log("Alt audio track ahead of main track, seek to start of alt audio track"), i.currentTime = c + .05) } if (!(d >= h && !this.switchingTrack && v < f[f.length - 1].start)) { var p = this.getNextFragment(v, o); if (p && this.isLoopLoading(p, v) && (p = this.getNextFragmentLoopLoading(p, o, u, w, h)), p) { var y = (null == (e = this.mainFragLoading) ? void 0 : e.frag) || null; if (!this.audioOnly && this.startFragRequested && y && te(p) && !p.endList && (!o.live || !this.loadingParts && v < this.hls.liveSyncPosition) && (this.fragmentTracker.getState(y) === Yt && (this.mainFragLoading = y = null), y && te(y))) { if (p.start > y.end) { var E = this.fragmentTracker.getFragAtPos(v, w); E && E.end > y.end && (y = E, this.mainFragLoading = { frag: E, targetBufferTime: null }) } if (p.start > y.end) return } this.loadFragment(p, s, v) } else this.bufferFlushed = !0 } } } } , r.onMediaDetaching = function(t, r) { this.bufferFlushed = this.flushing = !1, e.prototype.onMediaDetaching.call(this, t, r) } , r.onAudioTracksUpdated = function(e, t) { var r = t.audioTracks; this.resetTransmuxer(), this.levels = r.map((function(e) { return new at(e) } )) } , r.onAudioTrackSwitching = function(e, t) { var r = !!t.url; this.trackId = t.id; var i = this.fragCurrent; i && (i.abortRequests(), this.removeUnbufferedFrags(i.start)), this.resetLoadingState(), r ? (this.switchingTrack = t, this.flushAudioIfNeeded(t), this.state !== ki.STOPPED && (this.setInterval(100), this.state = ki.IDLE, this.tick())) : (this.resetTransmuxer(), this.switchingTrack = null, this.bufferedTrack = t, this.clearInterval()) } , r.onManifestLoading = function() { e.prototype.onManifestLoading.call(this), this.bufferFlushed = this.flushing = this.audioOnly = !1, this.resetItem(), this.trackId = -1 } , r.onLevelLoaded = function(e, t) { this.mainDetails = t.details; var r = this.cachedTrackLoadedData; r && (this.cachedTrackLoadedData = null, this.onAudioTrackLoaded(b.AUDIO_TRACK_LOADED, r)) } , r.onAudioTrackLoaded = function(e, t) { var r, i = this.levels, n = t.details, a = t.id, s = t.groupId, o = t.track; if (i) { var l = this.mainDetails; if (!l || n.endCC > l.endCC || l.expired) return this.cachedTrackLoadedData = t, void (this.state !== ki.STOPPED && (this.state = ki.WAITING_TRACK)); this.cachedTrackLoadedData = null, this.log("Audio track " + a + ' "' + o.name + '" of "' + s + '" loaded [' + n.startSN + "," + n.endSN + "]" + (n.lastPartSn ? "[part-" + n.lastPartSn + "-" + n.lastPartIndex + "]" : "") + ",duration:" + n.totalduration); var u = i[a] , d = 0; if (n.live || null != (r = u.details) && r.live) { if (this.checkLiveUpdate(n), n.deltaUpdateFailed) return; var h; u.details && (d = this.alignPlaylists(n, u.details, null == (h = this.levelLastLoaded) ? void 0 : h.details)), n.alignedSliding || (Si(n, l), n.alignedSliding || Ai(n, l), d = n.fragmentStart) } u.details = n, this.levelLastLoaded = u, this.startFragRequested || this.setStartPosition(l, d), this.hls.trigger(b.AUDIO_TRACK_UPDATED, { details: n, id: a, groupId: t.groupId }), this.state !== ki.WAITING_TRACK || this.waitForCdnTuneIn(n) || (this.state = ki.IDLE), this.tick() } else this.warn("Audio tracks reset while loading track " + a + ' "' + o.name + '" of "' + s + '"') } , r._handleFragmentLoadProgress = function(e) { var t, r = e.frag, i = e.part, n = e.payload, a = this.config, s = this.trackId, o = this.levels; if (o) { var l = o[s]; if (l) { var u = l.details; if (!u) return this.warn("Audio track details undefined on fragment load progress"), void this.removeUnbufferedFrags(r.start); var d = a.defaultAudioCodec || l.audioCodec || "mp4a.40.2" , h = this.transmuxer; h || (h = this.transmuxer = new fa(this.hls,O,this._handleTransmuxComplete.bind(this),this._handleTransmuxerFlush.bind(this))); var f = this.initPTS[r.cc] , c = null == (t = r.initSegment) ? void 0 : t.data; if (void 0 !== f) { var g = i ? i.index : -1 , v = -1 !== g , m = new or(r.level,r.sn,r.stats.chunkCount,n.byteLength,g,v); h.push(n, c, d, "", r, i, u.totalduration, !1, m, f) } else this.log("Unknown video PTS for cc " + r.cc + ", waiting for video PTS before demuxing audio frag " + r.sn + " of [" + u.startSN + " ," + u.endSN + "],track " + s), (this.waitingData = this.waitingData || { frag: r, part: i, cache: new _i, complete: !1 }).cache.push(new Uint8Array(n)), this.state !== ki.STOPPED && (this.state = ki.WAITING_INIT_PTS) } else this.warn("Audio track is undefined on fragment load progress") } else this.warn("Audio tracks were reset while fragment load was in progress. Fragment " + r.sn + " of level " + r.level + " will not be buffered") } , r._handleFragmentLoadComplete = function(t) { this.waitingData ? this.waitingData.complete = !0 : e.prototype._handleFragmentLoadComplete.call(this, t) } , r.onBufferReset = function() { this.mediaBuffer = null } , r.onBufferCreated = function(e, t) { this.bufferFlushed = this.flushing = !1; var r = t.tracks.audio; r && (this.mediaBuffer = r.buffer || null) } , r.onFragLoading = function(e, t) { !this.audioOnly && t.frag.type === w && te(t.frag) && (this.mainFragLoading = t, this.state === ki.IDLE && this.tick()) } , r.onFragBuffered = function(e, t) { var r = t.frag , i = t.part; if (r.type === O) if (this.fragContextChanged(r)) this.warn("Fragment " + r.sn + (i ? " p: " + i.index : "") + " of level " + r.level + " finished buffering, but was aborted. state: " + this.state + ", audioSwitch: " + (this.switchingTrack ? this.switchingTrack.name : "false")); else { if (te(r)) { this.fragPrevious = r; var n = this.switchingTrack; n && (this.bufferedTrack = n, this.switchingTrack = null, this.hls.trigger(b.AUDIO_TRACK_SWITCHED, d({}, n))) } this.fragBufferedComplete(r, i), this.media && this.tick() } else this.audioOnly || r.type !== w || r.elementaryStreams.video || r.elementaryStreams.audiovideo || (this.audioOnly = !0, this.mainFragLoading = null) } , r.onError = function(t, r) { var i; if (r.fatal) this.state = ki.ERROR; else switch (r.details) { case k.FRAG_GAP: case k.FRAG_PARSING_ERROR: case k.FRAG_DECRYPT_ERROR: case k.FRAG_LOAD_ERROR: case k.FRAG_LOAD_TIMEOUT: case k.KEY_LOAD_ERROR: case k.KEY_LOAD_TIMEOUT: this.onFragmentOrKeyLoadError(O, r); break; case k.AUDIO_TRACK_LOAD_ERROR: case k.AUDIO_TRACK_LOAD_TIMEOUT: case k.LEVEL_PARSING_ERROR: r.levelRetry || this.state !== ki.WAITING_TRACK || (null == (i = r.context) ? void 0 : i.type) !== P || (this.state = ki.IDLE); break; case k.BUFFER_ADD_CODEC_ERROR: case k.BUFFER_APPEND_ERROR: if ("audio" !== r.parent) return; this.reduceLengthAndFlushBuffer(r) || this.resetLoadingState(); break; case k.BUFFER_FULL_ERROR: if ("audio" !== r.parent) return; this.reduceLengthAndFlushBuffer(r) && (this.bufferedTrack = null, e.prototype.flushMainBuffer.call(this, 0, Number.POSITIVE_INFINITY, "audio")); break; case k.INTERNAL_EXCEPTION: this.recoverWorkerError(r) } } , r.onBufferFlushing = function(e, t) { t.type !== Z && (this.flushing = !0) } , r.onBufferFlushed = function(e, t) { var r = t.type; if (r !== Z) { this.flushing = !1, this.bufferFlushed = !0, this.state === ki.ENDED && (this.state = ki.IDLE); var i = this.mediaBuffer || this.media; i && (this.afterBufferFlushed(i, r, O), this.tick()) } } , r._handleTransmuxComplete = function(e) { var t, r = "audio", i = this.hls, n = e.remuxResult, s = e.chunkMeta, o = this.getCurrentContext(s); if (o) { var l = o.frag , u = o.part , d = o.level , h = d.details , f = n.audio , c = n.text , g = n.id3 , v = n.initSegment; if (!this.fragContextChanged(l) && h) { if (this.state = ki.PARSING, this.switchingTrack && f && this.completeAudioSwitch(this.switchingTrack), null != v && v.tracks) { var m = l.initSegment || l; if (this.unhandledEncryptionError(v, l)) return; this._bufferInitSegment(d, v.tracks, m, s), i.trigger(b.FRAG_PARSING_INIT_SEGMENT, { frag: m, id: r, tracks: v.tracks }) } if (f) { var p = f.startPTS , y = f.endPTS , E = f.startDTS , T = f.endDTS; u && (u.elementaryStreams[$] = { startPTS: p, endPTS: y, startDTS: E, endDTS: T }), l.setElementaryStreamInfo($, p, y, E, T), this.bufferFragmentData(f, l, u, s) } if (null != g && null != (t = g.samples) && t.length) { var S = a({ id: r, frag: l, details: h }, g); i.trigger(b.FRAG_PARSING_METADATA, S) } if (c) { var A = a({ id: r, frag: l, details: h }, c); i.trigger(b.FRAG_PARSING_USERDATA, A) } } else this.fragmentTracker.removeFragment(l) } else this.resetWhenMissingContext(s) } , r._bufferInitSegment = function(e, t, r, i) { if (this.state === ki.PARSING && (t.video && delete t.video, t.audiovideo && delete t.audiovideo, t.audio)) { var n = t.audio; n.id = O; var a = e.audioCodec; this.log("Init audio buffer, container:" + n.container + ", codecs[level/parsed]=[" + a + "/" + n.codec + "]"), a && 1 === a.split(",").length && (n.levelCodec = a), this.hls.trigger(b.BUFFER_CODECS, t); var s = n.initSegment; if (null != s && s.byteLength) { var o = { type: "audio", frag: r, part: null, chunkMeta: i, parent: r.type, data: s }; this.hls.trigger(b.BUFFER_APPENDING, o) } this.tickImmediate() } } , r.loadFragment = function(t, r, i) { var n, a = this.fragmentTracker.getState(t); if (this.switchingTrack || a === Kt || a === Ht) if (te(t)) if (null != (n = r.details) && n.live && !this.initPTS[t.cc]) { this.log("Waiting for video PTS in continuity counter " + t.cc + " of live stream before loading audio fragment " + t.sn + " of level " + this.trackId), this.state = ki.WAITING_INIT_PTS; var s = this.mainDetails; s && s.fragmentStart !== r.details.fragmentStart && Ai(r.details, s) } else e.prototype.loadFragment.call(this, t, r, i); else this._loadInitSegment(t, r); else this.clearTrackerIfNeeded(t) } , r.flushAudioIfNeeded = function(t) { if (this.media && this.bufferedTrack) { var r = this.bufferedTrack; ct({ name: r.name, lang: r.lang, assocLang: r.assocLang, characteristics: r.characteristics, audioCodec: r.audioCodec, channels: r.channels }, t, gt) || (mt(t.url, this.hls) ? (this.log("Switching audio track : flushing all audio"), e.prototype.flushMainBuffer.call(this, 0, Number.POSITIVE_INFINITY, "audio"), this.bufferedTrack = null) : this.bufferedTrack = t) } } , r.completeAudioSwitch = function(e) { var t = this.hls; this.flushAudioIfNeeded(e), this.bufferedTrack = e, this.switchingTrack = null, t.trigger(b.AUDIO_TRACK_SWITCHED, d({}, e)) } , t }(bi) , ga = function(e) { function t(t, r) { var i; return (i = e.call(this, r, t.logger) || this).hls = void 0, i.canLoad = !1, i.timer = -1, i.hls = t, i } o(t, e); var r = t.prototype; return r.destroy = function() { this.clearTimer(), this.hls = this.log = this.warn = null } , r.clearTimer = function() { -1 !== this.timer && (self.clearTimeout(this.timer), this.timer = -1) } , r.startLoad = function() { this.canLoad = !0, this.loadPlaylist() } , r.stopLoad = function() { this.canLoad = !1, this.clearTimer() } , r.switchParams = function(e, t, r) { var i = null == t ? void 0 : t.renditionReports; if (i) { for (var n = -1, a = 0; a < i.length; a++) { var s = i[a] , o = void 0; try { o = new self.URL(s.URI,t.url).href } catch (e) { this.warn("Could not construct new URL for Rendition Report: " + e), o = s.URI || "" } if (o === e) { n = a; break } o === e.substring(0, o.length) && (n = a) } if (-1 !== n) { var l = i[n] , u = parseInt(l["LAST-MSN"]) || t.lastPartSn , d = parseInt(l["LAST-PART"]) || t.lastPartIndex; if (this.hls.config.lowLatencyMode) { var h = Math.min(t.age - t.partTarget, t.targetduration); d >= 0 && h > t.partTarget && (d += 1) } var f = r && it(r); return new nt(u,d >= 0 ? d : void 0,f) } } } , r.loadPlaylist = function(e) { this.clearTimer() } , r.loadingPlaylist = function(e, t) { this.clearTimer() } , r.shouldLoadPlaylist = function(e) { return this.canLoad && !!e && !!e.url && (!e.details || e.details.live) } , r.getUrlWithDirectives = function(e, t) { if (t) try { return t.addDirectives(e) } catch (e) { this.warn("Could not construct new URL with HLS Delivery Directives: " + e) } return e } , r.playlistLoaded = function(e, t, r) { var i = t.details , n = t.stats , a = self.performance.now() , s = n.loading.first ? Math.max(0, a - n.loading.first) : 0; i.advancedDateTime = Date.now() - s; var o = this.hls.config.timelineOffset; if (o !== i.appliedTimelineOffset) { var l = Math.max(o || 0, 0); i.appliedTimelineOffset = l, i.fragments.forEach((function(e) { e.setStart(e.playlistOffset + l) } )) } if (i.live || null != r && r.live) { var u = "levelInfo"in t ? t.levelInfo : t.track; if (i.reloaded(r), r && i.fragments.length > 0) { oi(r, i, this); var d = i.playlistParsingError; if (d) { this.warn(d); var h = this.hls; if (!h.config.ignorePlaylistParsingErrors) { var f, c = t.networkDetails; return void h.trigger(b.ERROR, { type: R.NETWORK_ERROR, details: k.LEVEL_PARSING_ERROR, fatal: !1, url: i.url, error: d, reason: d.message, level: t.level || void 0, parent: null == (f = i.fragments[0]) ? void 0 : f.type, networkDetails: c, stats: n }) } i.playlistParsingError = null } } -1 === i.requestScheduled && (i.requestScheduled = n.loading.start); var g, v = this.hls.mainForwardBufferInfo, m = v ? v.end - v.len : 0, p = hi(i, 1e3 * (i.edge - m)); if (i.requestScheduled + p < a ? i.requestScheduled = a : i.requestScheduled += p, this.log("live playlist " + e + " " + (i.advanced ? "REFRESHED " + i.lastPartSn + "-" + i.lastPartIndex : i.updated ? "UPDATED" : "MISSED")), !this.canLoad || !i.live) return; var y = void 0 , E = void 0; if (i.canBlockReload && i.endSN && i.advanced) { var T = this.hls.config.lowLatencyMode , S = i.lastPartSn , A = i.endSN , L = i.lastPartIndex , I = S === A; -1 !== L ? I ? (y = A + 1, E = T ? 0 : L) : (y = S, E = T ? L + 1 : i.maxPartIndex) : y = A + 1; var D = i.age , _ = D + i.ageHeader , P = Math.min(_ - i.partTarget, 1.5 * i.targetduration); if (P > 0) { if (_ > 3 * i.targetduration) this.log("Playlist last advanced " + D.toFixed(2) + "s ago. Omitting segment and part directives."), y = void 0, E = void 0; else if (null != r && r.tuneInGoal && _ - i.partTarget > r.tuneInGoal) this.warn("CDN Tune-in goal increased from: " + r.tuneInGoal + " to: " + P + " with playlist age: " + i.age), P = 0; else { var C = Math.floor(P / i.targetduration); y += C, void 0 !== E && (E += Math.round(P % i.targetduration / i.partTarget)), this.log("CDN Tune-in age: " + i.ageHeader + "s last advanced " + D.toFixed(2) + "s goal: " + P + " skip sn " + C + " to part " + E) } i.tuneInGoal = P } if (g = this.getDeliveryDirectives(i, t.deliveryDirectives, y, E), T || !I) return i.requestScheduled = a, void this.loadingPlaylist(u, g) } else (i.canBlockReload || i.canSkipUntil) && (g = this.getDeliveryDirectives(i, t.deliveryDirectives, y, E)); g && void 0 !== y && i.canBlockReload && (i.requestScheduled = n.loading.first + Math.max(p - 2 * s, p / 2)), this.scheduleLoading(u, g, i) } else this.clearTimer() } , r.scheduleLoading = function(e, t, r) { var i = this , n = r || e.details; if (n) { var a = self.performance.now() , s = n.requestScheduled; if (a >= s) this.loadingPlaylist(e, t); else { var o = s - a; this.log("reload live playlist " + (e.name || e.bitrate + "bps") + " in " + Math.round(o) + " ms"), this.clearTimer(), this.timer = self.setTimeout((function() { return i.loadingPlaylist(e, t) } ), o) } } else this.loadingPlaylist(e, t) } , r.getDeliveryDirectives = function(e, t, r, i) { var n = it(e); return null != t && t.skip && e.deltaUpdateFailed && (r = t.msn, i = t.part, n = et), new nt(r,i,n) } , r.checkRetry = function(e) { var t = this , r = e.details , i = Lt(e) , n = e.errorAction , a = n || {} , s = a.action , o = a.retryCount , l = void 0 === o ? 0 : o , u = a.retryConfig , d = !!n && !!u && (s === xt || !n.resolved && s === wt); if (d) { var h; if (l >= u.maxNumRetry) return !1; if (i && null != (h = e.context) && h.deliveryDirectives) this.warn("Retrying playlist loading " + (l + 1) + "/" + u.maxNumRetry + ' after "' + r + '" without delivery-directives'), this.loadPlaylist(); else { var f = bt(u, l); this.clearTimer(), this.timer = self.setTimeout((function() { return t.loadPlaylist() } ), f), this.warn("Retrying playlist loading " + (l + 1) + "/" + u.maxNumRetry + ' after "' + r + '" in ' + f + "ms") } e.levelRetry = !0, n.resolved = !0 } return d } , t }(N); function va(e, t) { if (e.length !== t.length) return !1; for (var r = 0; r < e.length; r++) if (!ma(e[r].attrs, t[r].attrs)) return !1; return !0 } function ma(e, t, r) { var i = e["STABLE-RENDITION-ID"]; return i && !r ? i === t["STABLE-RENDITION-ID"] : !(r || ["LANGUAGE", "NAME", "CHARACTERISTICS", "AUTOSELECT", "DEFAULT", "FORCED", "ASSOC-LANGUAGE"]).some((function(r) { return e[r] !== t[r] } )) } function pa(e, t) { return t.label.toLowerCase() === e.name.toLowerCase() && (!t.language || t.language.toLowerCase() === (e.lang || "").toLowerCase()) } var ya = function(e) { function t(t) { var r; return (r = e.call(this, t, "audio-track-controller") || this).tracks = [], r.groupIds = null, r.tracksInGroup = [], r.trackId = -1, r.currentTrack = null, r.selectDefaultTrack = !0, r.registerListeners(), r } o(t, e); var r = t.prototype; return r.registerListeners = function() { var e = this.hls; e.on(b.MANIFEST_LOADING, this.onManifestLoading, this), e.on(b.MANIFEST_PARSED, this.onManifestParsed, this), e.on(b.LEVEL_LOADING, this.onLevelLoading, this), e.on(b.LEVEL_SWITCHING, this.onLevelSwitching, this), e.on(b.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this), e.on(b.ERROR, this.onError, this) } , r.unregisterListeners = function() { var e = this.hls; e.off(b.MANIFEST_LOADING, this.onManifestLoading, this), e.off(b.MANIFEST_PARSED, this.onManifestParsed, this), e.off(b.LEVEL_LOADING, this.onLevelLoading, this), e.off(b.LEVEL_SWITCHING, this.onLevelSwitching, this), e.off(b.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this), e.off(b.ERROR, this.onError, this) } , r.destroy = function() { this.unregisterListeners(), this.tracks.length = 0, this.tracksInGroup.length = 0, this.currentTrack = null, e.prototype.destroy.call(this) } , r.onManifestLoading = function() { this.tracks = [], this.tracksInGroup = [], this.groupIds = null, this.currentTrack = null, this.trackId = -1, this.selectDefaultTrack = !0 } , r.onManifestParsed = function(e, t) { this.tracks = t.audioTracks || [] } , r.onAudioTrackLoaded = function(e, t) { var r = t.id , i = t.groupId , n = t.details , a = this.tracksInGroup[r]; if (a && a.groupId === i) { var s = a.details; a.details = t.details, this.log("Audio track " + r + ' "' + a.name + '" lang:' + a.lang + " group:" + i + " loaded [" + n.startSN + "-" + n.endSN + "]"), r === this.trackId && this.playlistLoaded(r, t, s) } else this.warn("Audio track with id:" + r + " and group:" + i + " not found in active group " + (null == a ? void 0 : a.groupId)) } , r.onLevelLoading = function(e, t) { this.switchLevel(t.level) } , r.onLevelSwitching = function(e, t) { this.switchLevel(t.level) } , r.switchLevel = function(e) { var t = this.hls.levels[e]; if (t) { var r = t.audioGroups || null , i = this.groupIds , n = this.currentTrack; if (!r || (null == i ? void 0 : i.length) !== (null == r ? void 0 : r.length) || null != r && r.some((function(e) { return -1 === (null == i ? void 0 : i.indexOf(e)) } ))) { this.groupIds = r, this.trackId = -1, this.currentTrack = null; var a = this.tracks.filter((function(e) { return !r || -1 !== r.indexOf(e.groupId) } )); if (a.length) this.selectDefaultTrack && !a.some((function(e) { return e.default } )) && (this.selectDefaultTrack = !1), a.forEach((function(e, t) { e.id = t } )); else if (!n && !this.tracksInGroup.length) return; this.tracksInGroup = a; var s = this.hls.config.audioPreference; if (!n && s) { var o = ft(s, a, gt); if (o > -1) n = a[o]; else { var l = ft(s, this.tracks); n = this.tracks[l] } } var u = this.findTrackId(n); -1 === u && n && (u = this.findTrackId(null)); var d = { audioTracks: a }; this.log("Updating audio tracks, " + a.length + " track(s) found in group(s): " + (null == r ? void 0 : r.join(","))), this.hls.trigger(b.AUDIO_TRACKS_UPDATED, d); var h = this.trackId; if (-1 !== u && -1 === h) this.setAudioTrack(u); else if (a.length && -1 === h) { var f, c = new Error("No audio track selected for current audio group-ID(s): " + (null == (f = this.groupIds) ? void 0 : f.join(",")) + " track count: " + a.length); this.warn(c.message), this.hls.trigger(b.ERROR, { type: R.MEDIA_ERROR, details: k.AUDIO_TRACK_LOAD_ERROR, fatal: !0, error: c }) } } } } , r.onError = function(e, t) { !t.fatal && t.context && (t.context.type !== P || t.context.id !== this.trackId || this.groupIds && -1 === this.groupIds.indexOf(t.context.groupId) || this.checkRetry(t)) } , r.setAudioOption = function(e) { var t = this.hls; if (t.config.audioPreference = e, e) { var r = this.allAudioTracks; if (this.selectDefaultTrack = !1, r.length) { var i = this.currentTrack; if (i && ct(e, i, gt)) return i; var n = ft(e, this.tracksInGroup, gt); if (n > -1) { var a = this.tracksInGroup[n]; return this.setAudioTrack(n), a } if (i) { var s = t.loadLevel; -1 === s && (s = t.firstAutoLevel); var o = function(e, t, r, i, n) { var a = t[i] , s = t.reduce((function(e, t, r) { var i = t.uri; return (e[i] || (e[i] = [])).push(r), e } ), {})[a.uri]; s.length > 1 && (i = Math.max.apply(Math, s)); var o = a.videoRange , l = a.frameRate , u = a.codecSet.substring(0, 4) , d = vt(t, i, (function(t) { if (t.videoRange !== o || t.frameRate !== l || t.codecSet.substring(0, 4) !== u) return !1; var i = t.audioGroups , a = r.filter((function(e) { return !i || -1 !== i.indexOf(e.groupId) } )); return ft(e, a, n) > -1 } )); return d > -1 ? d : vt(t, i, (function(t) { var i = t.audioGroups , a = r.filter((function(e) { return !i || -1 !== i.indexOf(e.groupId) } )); return ft(e, a, n) > -1 } )) }(e, t.levels, r, s, gt); if (-1 === o) return null; t.nextLoadLevel = o } if (e.channels || e.audioCodec) { var l = ft(e, r); if (l > -1) return r[l] } } } return null } , r.setAudioTrack = function(e) { var t = this.tracksInGroup; if (e < 0 || e >= t.length) this.warn("Invalid audio track id: " + e); else { this.selectDefaultTrack = !1; var r = this.currentTrack , i = t[e] , n = i.details && !i.details.live; if (!(e === this.trackId && i === r && n || (this.log("Switching to audio-track " + e + ' "' + i.name + '" lang:' + i.lang + " group:" + i.groupId + " channels:" + i.channels), this.trackId = e, this.currentTrack = i, this.hls.trigger(b.AUDIO_TRACK_SWITCHING, d({}, i)), n))) { var a = this.switchParams(i.url, null == r ? void 0 : r.details, i.details); this.loadPlaylist(a) } } } , r.findTrackId = function(e) { for (var t = this.tracksInGroup, r = 0; r < t.length; r++) { var i = t[r]; if ((!this.selectDefaultTrack || i.default) && (!e || ct(e, i, gt))) return r } if (e) { for (var n = e.name, a = e.lang, s = e.assocLang, o = e.characteristics, l = e.audioCodec, u = e.channels, d = 0; d < t.length; d++) if (ct({ name: n, lang: a, assocLang: s, characteristics: o, audioCodec: l, channels: u }, t[d], gt)) return d; for (var h = 0; h < t.length; h++) { var f = t[h]; if (ma(e.attrs, f.attrs, ["LANGUAGE", "ASSOC-LANGUAGE", "CHARACTERISTICS"])) return h } for (var c = 0; c < t.length; c++) { var g = t[c]; if (ma(e.attrs, g.attrs, ["LANGUAGE"])) return c } } return -1 } , r.loadPlaylist = function(t) { e.prototype.loadPlaylist.call(this); var r = this.currentTrack; this.shouldLoadPlaylist(r) && mt(r.url, this.hls) && this.scheduleLoading(r, t) } , r.loadingPlaylist = function(t, r) { e.prototype.loadingPlaylist.call(this, t, r); var i = t.id , n = t.groupId , a = this.getUrlWithDirectives(t.url, r) , s = t.details , o = null == s ? void 0 : s.age; this.log("Loading audio-track " + i + ' "' + t.name + '" lang:' + t.lang + " group:" + n + (void 0 !== (null == r ? void 0 : r.msn) ? " at sn " + r.msn + " part " + r.part : "") + (o && s.live ? " age " + o.toFixed(1) + (s.type && " " + s.type || "") : "") + " " + a), this.hls.trigger(b.AUDIO_TRACK_LOADING, { url: a, id: i, groupId: n, deliveryDirectives: r || null, track: t }) } , i(t, [{ key: "allAudioTracks", get: function() { return this.tracks } }, { key: "audioTracks", get: function() { return this.tracksInGroup } }, { key: "audioTrack", get: function() { return this.trackId }, set: function(e) { this.selectDefaultTrack = !1, this.setAudioTrack(e) } }]) }(ga) , Ea = function() { function e(e) { this.tracks = void 0, this.queues = { video: [], audio: [], audiovideo: [] }, this.tracks = e } var t = e.prototype; return t.destroy = function() { this.tracks = this.queues = null } , t.append = function(e, t, r) { if (null !== this.queues && null !== this.tracks) { var i = this.queues[t]; i.push(e), 1 !== i.length || r || this.executeNext(t) } } , t.appendBlocker = function(e) { var t = this; return new Promise((function(r) { var i = { label: "async-blocker", execute: r, onStart: function() {}, onComplete: function() {}, onError: function() {} }; t.append(i, e) } )) } , t.prependBlocker = function(e) { var t = this; return new Promise((function(r) { if (t.queues) { var i = { label: "async-blocker-prepend", execute: r, onStart: function() {}, onComplete: function() {}, onError: function() {} }; t.queues[e].unshift(i) } } )) } , t.removeBlockers = function() { null !== this.queues && [this.queues.video, this.queues.audio, this.queues.audiovideo].forEach((function(e) { var t, r = null == (t = e[0]) ? void 0 : t.label; "async-blocker" !== r && "async-blocker-prepend" !== r || (e[0].execute(), e.splice(0, 1)) } )) } , t.unblockAudio = function(e) { null !== this.queues && this.queues.audio[0] === e && this.shiftAndExecuteNext("audio") } , t.executeNext = function(e) { if (null !== this.queues && null !== this.tracks) { var t = this.queues[e]; if (t.length) { var r = t[0]; try { r.execute() } catch (t) { var i; if (r.onError(t), null === this.queues || null === this.tracks) return; var n = null == (i = this.tracks[e]) ? void 0 : i.buffer; null != n && n.updating || this.shiftAndExecuteNext(e) } } } } , t.shiftAndExecuteNext = function(e) { null !== this.queues && (this.queues[e].shift(), this.executeNext(e)) } , t.current = function(e) { var t; return (null == (t = this.queues) ? void 0 : t[e][0]) || null } , t.toString = function() { var e = this.queues , t = this.tracks; return null === e || null === t ? "" : "\n" + this.list("video") + "\n" + this.list("audio") + "\n" + this.list("audiovideo") + "}" } , t.list = function(e) { var t, r; return null != (t = this.queues) && t[e] || null != (r = this.tracks) && r[e] ? e + ": (" + this.listSbInfo(e) + ") " + this.listOps(e) : "" } , t.listSbInfo = function(e) { var t, r = null == (t = this.tracks) ? void 0 : t[e], i = null == r ? void 0 : r.buffer; return i ? "SourceBuffer" + (i.updating ? " updating" : "") + (r.ended ? " ended" : "") + (r.ending ? " ending" : "") : "none" } , t.listOps = function(e) { var t; return (null == (t = this.queues) ? void 0 : t[e].map((function(e) { return e.label } )).join(", ")) || "" } , e }() , Ta = /(avc[1234]|hvc1|hev1|dvh[1e]|vp09|av01)(?:\.[^.,]+)+/ , Sa = "HlsJsTrackRemovedError" , Aa = function(e) { function t(t) { var r; return (r = e.call(this, t) || this).name = Sa, r } return o(t, e), t }(c(Error)) , La = function(e) { function t(t, r) { var i, n; return (i = e.call(this, "buffer-controller", t.logger) || this).hls = void 0, i.fragmentTracker = void 0, i.details = null, i._objectUrl = null, i.operationQueue = null, i.bufferCodecEventsTotal = 0, i.media = null, i.mediaSource = null, i.lastMpegAudioChunk = null, i.blockedAudioAppend = null, i.lastVideoAppendEnd = 0, i.appendSource = void 0, i.transferData = void 0, i.overrides = void 0, i.appendErrors = { audio: 0, video: 0, audiovideo: 0 }, i.tracks = {}, i.sourceBuffers = [[null, null], [null, null]], i._onEndStreaming = function(e) { var t; i.hls && "open" === (null == (t = i.mediaSource) ? void 0 : t.readyState) && i.hls.pauseBuffering() } , i._onStartStreaming = function(e) { i.hls && i.hls.resumeBuffering() } , i._onMediaSourceOpen = function(e) { var t = i , r = t.media , n = t.mediaSource; e && i.log("Media source opened"), r && n && (n.removeEventListener("sourceopen", i._onMediaSourceOpen), r.removeEventListener("emptied", i._onMediaEmptied), i.updateDuration(), i.hls.trigger(b.MEDIA_ATTACHED, { media: r, mediaSource: n }), null !== i.mediaSource && i.checkPendingTracks()) } , i._onMediaSourceClose = function() { i.log("Media source closed") } , i._onMediaSourceEnded = function() { i.log("Media source ended") } , i._onMediaEmptied = function() { var e = i , t = e.mediaSrc , r = e._objectUrl; t !== r && i.error("Media element src was set while attaching MediaSource (" + r + " > " + t + ")") } , i.hls = t, i.fragmentTracker = r, i.appendSource = (n = W(t.config.preferManagedMediaSource), "undefined" != typeof self && n === self.ManagedMediaSource), i.initTracks(), i.registerListeners(), i } o(t, e); var r = t.prototype; return r.hasSourceTypes = function() { return Object.keys(this.tracks).length > 0 } , r.destroy = function() { this.unregisterListeners(), this.details = null, this.lastMpegAudioChunk = this.blockedAudioAppend = null, this.transferData = this.overrides = void 0, this.operationQueue && (this.operationQueue.destroy(), this.operationQueue = null), this.hls = this.fragmentTracker = null, this._onMediaSourceOpen = this._onMediaSourceClose = null, this._onMediaSourceEnded = null, this._onStartStreaming = this._onEndStreaming = null } , r.registerListeners = function() { var e = this.hls; e.on(b.MEDIA_ATTACHING, this.onMediaAttaching, this), e.on(b.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(b.MANIFEST_LOADING, this.onManifestLoading, this), e.on(b.MANIFEST_PARSED, this.onManifestParsed, this), e.on(b.BUFFER_RESET, this.onBufferReset, this), e.on(b.BUFFER_APPENDING, this.onBufferAppending, this), e.on(b.BUFFER_CODECS, this.onBufferCodecs, this), e.on(b.BUFFER_EOS, this.onBufferEos, this), e.on(b.BUFFER_FLUSHING, this.onBufferFlushing, this), e.on(b.LEVEL_UPDATED, this.onLevelUpdated, this), e.on(b.FRAG_PARSED, this.onFragParsed, this), e.on(b.FRAG_CHANGED, this.onFragChanged, this), e.on(b.ERROR, this.onError, this) } , r.unregisterListeners = function() { var e = this.hls; e.off(b.MEDIA_ATTACHING, this.onMediaAttaching, this), e.off(b.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(b.MANIFEST_LOADING, this.onManifestLoading, this), e.off(b.MANIFEST_PARSED, this.onManifestParsed, this), e.off(b.BUFFER_RESET, this.onBufferReset, this), e.off(b.BUFFER_APPENDING, this.onBufferAppending, this), e.off(b.BUFFER_CODECS, this.onBufferCodecs, this), e.off(b.BUFFER_EOS, this.onBufferEos, this), e.off(b.BUFFER_FLUSHING, this.onBufferFlushing, this), e.off(b.LEVEL_UPDATED, this.onLevelUpdated, this), e.off(b.FRAG_PARSED, this.onFragParsed, this), e.off(b.FRAG_CHANGED, this.onFragChanged, this), e.off(b.ERROR, this.onError, this) } , r.transferMedia = function() { var e = this , t = this.media , r = this.mediaSource; if (!t) return null; var i = {}; if (this.operationQueue) { var n = this.isUpdating(); n || this.operationQueue.removeBlockers(); var s = this.isQueued(); (n || s) && this.warn("Transfering MediaSource with" + (s ? " operations in queue" : "") + (n ? " updating SourceBuffer(s)" : "") + " " + this.operationQueue), this.operationQueue.destroy() } var o = this.transferData; return !this.sourceBufferCount && o && o.mediaSource === r ? a(i, o.tracks) : this.sourceBuffers.forEach((function(t) { var r = t[0]; r && (i[r] = a({}, e.tracks[r]), e.removeBuffer(r)), t[0] = t[1] = null } )), { media: t, mediaSource: r, tracks: i } } , r.initTracks = function() { this.sourceBuffers = [[null, null], [null, null]], this.tracks = {}, this.resetQueue(), this.resetAppendErrors(), this.lastMpegAudioChunk = this.blockedAudioAppend = null, this.lastVideoAppendEnd = 0 } , r.onManifestLoading = function() { this.bufferCodecEventsTotal = 0, this.details = null } , r.onManifestParsed = function(e, t) { var r, i = 2; (t.audio && !t.video || !t.altAudio) && (i = 1), this.bufferCodecEventsTotal = i, this.log(i + " bufferCodec event(s) expected."), null != (r = this.transferData) && r.mediaSource && this.sourceBufferCount && i && this.bufferCreated() } , r.onMediaAttaching = function(e, t) { var r = this.media = t.media; this.transferData = this.overrides = void 0; var i = W(this.appendSource); if (i) { var n = !!t.mediaSource; (n || t.overrides) && (this.transferData = t, this.overrides = t.overrides); var a = this.mediaSource = t.mediaSource || new i; if (this.assignMediaSource(a), n) this._objectUrl = r.src, this.attachTransferred(); else { var s = this._objectUrl = self.URL.createObjectURL(a); if (this.appendSource) try { r.removeAttribute("src"); var o = self.ManagedMediaSource; r.disableRemotePlayback = r.disableRemotePlayback || o && a instanceof o, Ia(r), function(e, t) { var r = self.document.createElement("source"); r.type = "video/mp4", r.src = t, e.appendChild(r) }(r, s), r.load() } catch (e) { r.src = s } else r.src = s } r.addEventListener("emptied", this._onMediaEmptied) } } , r.assignMediaSource = function(e) { var t, r; this.log(((null == (t = this.transferData) ? void 0 : t.mediaSource) === e ? "transferred" : "created") + " media source: " + (null == (r = e.constructor) ? void 0 : r.name)), e.addEventListener("sourceopen", this._onMediaSourceOpen), e.addEventListener("sourceended", this._onMediaSourceEnded), e.addEventListener("sourceclose", this._onMediaSourceClose), this.appendSource && (e.addEventListener("startstreaming", this._onStartStreaming), e.addEventListener("endstreaming", this._onEndStreaming)) } , r.attachTransferred = function() { var e = this , t = this.media , r = this.transferData; if (r && t) { var i = this.tracks , n = r.tracks , a = n ? Object.keys(n) : null , s = a ? a.length : 0 , o = function() { Promise.resolve().then((function() { e.media && e.mediaSourceOpenOrEnded && e._onMediaSourceOpen() } )) }; if (n && a && s) { if (!this.tracksReady) return this.hls.config.startFragPrefetch = !0, void this.log("attachTransferred: waiting for SourceBuffer track info"); if (this.log("attachTransferred: (bufferCodecEventsTotal " + this.bufferCodecEventsTotal + ")\nrequired tracks: " + lt(i, (function(e, t) { return "initSegment" === e ? void 0 : t } )) + ";\ntransfer tracks: " + lt(n, (function(e, t) { return "initSegment" === e ? void 0 : t } )) + "}"), !j(n, i)) { r.mediaSource = null, r.tracks = void 0; var l = t.currentTime , u = this.details , d = Math.max(l, (null == u ? void 0 : u.fragments[0].start) || 0); return d - l > 1 ? void this.log("attachTransferred: waiting for playback to reach new tracks start time " + l + " -> " + d) : (this.warn('attachTransferred: resetting MediaSource for incompatible tracks ("' + Object.keys(n) + '"->"' + Object.keys(i) + '") start time: ' + d + " currentTime: " + l), this.onMediaDetaching(b.MEDIA_DETACHING, {}), this.onMediaAttaching(b.MEDIA_ATTACHING, r), void (t.currentTime = d)) } this.transferData = void 0, a.forEach((function(t) { var r = t , i = n[r]; if (i) { var a = i.buffer; if (a) { var s = e.fragmentTracker , o = i.id; if (s.hasFragments(o) || s.hasParts(o)) { var l = ur.getBuffered(a); s.detectEvictedFragments(r, l, o, null, !0) } var u = Ra(r) , d = [r, a]; e.sourceBuffers[u] = d, a.updating && e.operationQueue && e.operationQueue.prependBlocker(r), e.trackSourceBuffer(r, i) } } } )), o(), this.bufferCreated() } else this.log("attachTransferred: MediaSource w/o SourceBuffers"), o() } } , r.onMediaDetaching = function(e, t) { var r = this , i = !!t.transferMedia; this.transferData = this.overrides = void 0; var n = this.media , a = this.mediaSource , s = this._objectUrl; if (a) { if (this.log("media source " + (i ? "transferring" : "detaching")), i) this.sourceBuffers.forEach((function(e) { var t = e[0]; t && r.removeBuffer(t) } )), this.resetQueue(); else { if (this.mediaSourceOpenOrEnded) { var o = "open" === a.readyState; try { for (var l = a.sourceBuffers, u = l.length; u--; ) o && l[u].abort(), a.removeSourceBuffer(l[u]); o && a.endOfStream() } catch (e) { this.warn("onMediaDetaching: " + e.message + " while calling endOfStream") } } this.sourceBufferCount && this.onBufferReset() } a.removeEventListener("sourceopen", this._onMediaSourceOpen), a.removeEventListener("sourceended", this._onMediaSourceEnded), a.removeEventListener("sourceclose", this._onMediaSourceClose), this.appendSource && (a.removeEventListener("startstreaming", this._onStartStreaming), a.removeEventListener("endstreaming", this._onEndStreaming)), this.mediaSource = null, this._objectUrl = null } n && (n.removeEventListener("emptied", this._onMediaEmptied), i || (s && self.URL.revokeObjectURL(s), this.mediaSrc === s ? (n.removeAttribute("src"), this.appendSource && Ia(n), n.load()) : this.warn("media|source.src was changed by a third party - skip cleanup")), this.media = null), this.hls.trigger(b.MEDIA_DETACHED, t) } , r.onBufferReset = function() { var e = this; this.sourceBuffers.forEach((function(t) { var r = t[0]; r && e.resetBuffer(r) } )), this.initTracks() } , r.resetBuffer = function(e) { var t, r = null == (t = this.tracks[e]) ? void 0 : t.buffer; if (this.removeBuffer(e), r) try { var i; null != (i = this.mediaSource) && i.sourceBuffers.length && this.mediaSource.removeSourceBuffer(r) } catch (t) { this.warn("onBufferReset " + e, t) } delete this.tracks[e] } , r.removeBuffer = function(e) { this.removeBufferListeners(e), this.sourceBuffers[Ra(e)] = [null, null]; var t = this.tracks[e]; t && (t.buffer = void 0) } , r.resetQueue = function() { this.operationQueue && this.operationQueue.destroy(), this.operationQueue = new Ea(this.tracks) } , r.onBufferCodecs = function(e, t) { var r, i = this, n = this.tracks, a = Object.keys(t); this.log('BUFFER_CODECS: "' + a + '" (current SB count ' + this.sourceBufferCount + ")"); var s = "audiovideo"in t && (n.audio || n.video) || n.audiovideo && ("audio"in t || "video"in t) , o = !s && this.sourceBufferCount && this.media && a.some((function(e) { return !n[e] } )); s || o ? this.warn('Unsupported transition between "' + Object.keys(n) + '" and "' + a + '" SourceBuffers') : (a.forEach((function(e) { var r, a, s = t[e], o = s.id, l = s.codec, u = s.levelCodec, d = s.container, h = s.metadata, f = s.supplemental, c = n[e], g = null == (r = i.transferData) || null == (r = r.tracks) ? void 0 : r[e], v = null != g && g.buffer ? g : c, m = (null == v ? void 0 : v.pendingCodec) || (null == v ? void 0 : v.codec), p = null == v ? void 0 : v.levelCodec; c || (c = n[e] = { buffer: void 0, listeners: [], codec: l, supplemental: f, container: d, levelCodec: u, metadata: h, id: o }); var y = Ke(m, p) , E = null == y ? void 0 : y.replace(Ta, "$1") , T = Ke(l, u) , S = null == (a = T) ? void 0 : a.replace(Ta, "$1"); T && y && E !== S && ("audio" === e.slice(0, 5) && (T = Ge(T, i.appendSource)), i.log("switching codec " + m + " to " + T), T !== (c.pendingCodec || c.codec) && (c.pendingCodec = T), c.container = d, i.appendChangeType(e, d, T)) } )), (this.tracksReady || this.sourceBufferCount) && (t.tracks = this.sourceBufferTracks), this.sourceBufferCount || (this.bufferCodecEventsTotal > 1 && !this.tracks.video && !t.video && "main" === (null == (r = t.audio) ? void 0 : r.id) && (this.log("Main audio-only"), this.bufferCodecEventsTotal = 1), this.mediaSourceOpenOrEnded && this.checkPendingTracks())) } , r.appendChangeType = function(e, t, r) { var i = this , n = t + ";codecs=" + r , a = { label: "change-type=" + n, execute: function() { var a = i.tracks[e]; if (a) { var s = a.buffer; null != s && s.changeType && (i.log("changing " + e + " sourceBuffer type to " + n), s.changeType(n), a.codec = r, a.container = t) } i.shiftAndExecuteNext(e) }, onStart: function() {}, onComplete: function() {}, onError: function(t) { i.warn("Failed to change " + e + " SourceBuffer type", t) } }; this.append(a, e, this.isPending(this.tracks[e])) } , r.blockAudio = function(e) { var t, r = this, i = e.start, n = i + .05 * e.duration; if (!0 !== (null == (t = this.fragmentTracker.getAppendedFrag(i, w)) ? void 0 : t.gap)) { var a = { label: "block-audio", execute: function() { var e, t = r.tracks.video; (r.lastVideoAppendEnd > n || null != t && t.buffer && ur.isBuffered(t.buffer, n) || !0 === (null == (e = r.fragmentTracker.getAppendedFrag(n, w)) ? void 0 : e.gap)) && (r.blockedAudioAppend = null, r.shiftAndExecuteNext("audio")) }, onStart: function() {}, onComplete: function() {}, onError: function(e) { r.warn("Error executing block-audio operation", e) } }; this.blockedAudioAppend = { op: a, frag: e }, this.append(a, "audio", !0) } } , r.unblockAudio = function() { var e = this.blockedAudioAppend , t = this.operationQueue; e && t && (this.blockedAudioAppend = null, t.unblockAudio(e.op)) } , r.onBufferAppending = function(e, t) { var r = this , i = this.tracks , n = t.data , a = t.type , s = t.parent , o = t.frag , l = t.part , u = t.chunkMeta , d = t.offset , h = u.buffering[a] , f = o.sn , c = o.cc , g = self.performance.now(); h.start = g; var v = o.stats.buffering , m = l ? l.stats.buffering : null; 0 === v.start && (v.start = g), m && 0 === m.start && (m.start = g); var p = i.audio , y = !1; "audio" === a && "audio/mpeg" === (null == p ? void 0 : p.container) && (y = !this.lastMpegAudioChunk || 1 === u.id || this.lastMpegAudioChunk.sn !== u.sn, this.lastMpegAudioChunk = u); var E = i.video , T = null == E ? void 0 : E.buffer; if (T && "initSegment" !== f) { var S = l || o , L = this.blockedAudioAppend; if ("audio" !== a || "main" === s || this.blockedAudioAppend || E.ending || E.ended) { if ("video" === a) { var I = S.end; if (L) { var D = L.frag.start; (I > D || I < this.lastVideoAppendEnd || ur.isBuffered(T, D)) && this.unblockAudio() } this.lastVideoAppendEnd = I } } else { var _ = S.start + .05 * S.duration , P = T.buffered , C = this.currentOp("video"); P.length || C ? !C && !ur.isBuffered(T, _) && this.lastVideoAppendEnd < _ && this.blockAudio(S) : this.blockAudio(S) } } var O = (l || o).start , x = { label: "append-" + a, execute: function() { var e; h.executeStart = self.performance.now(); var t = null == (e = r.tracks[a]) ? void 0 : e.buffer; t && (y ? r.updateTimestampOffset(t, O, .1, a, f, c) : void 0 !== d && A(d) && r.updateTimestampOffset(t, d, 1e-6, a, f, c)), r.appendExecutor(n, a) }, onStart: function() {}, onComplete: function() { var e = self.performance.now(); h.executeEnd = h.end = e, 0 === v.first && (v.first = e), m && 0 === m.first && (m.first = e); var t = {}; r.sourceBuffers.forEach((function(e) { var r = e[0] , i = e[1]; r && (t[r] = ur.getBuffered(i)) } )), r.appendErrors[a] = 0, "audio" === a || "video" === a ? r.appendErrors.audiovideo = 0 : (r.appendErrors.audio = 0, r.appendErrors.video = 0), r.hls.trigger(b.BUFFER_APPENDED, { type: a, frag: o, part: l, chunkMeta: u, parent: o.type, timeRanges: t }) }, onError: function(e) { var t, i = { type: R.MEDIA_ERROR, parent: o.type, details: k.BUFFER_APPEND_ERROR, sourceBufferName: a, frag: o, part: l, chunkMeta: u, error: e, err: e, fatal: !1 }, n = null == (t = r.media) ? void 0 : t.error; if (e.code === DOMException.QUOTA_EXCEEDED_ERR || "QuotaExceededError" == e.name || "quota"in e) i.details = k.BUFFER_FULL_ERROR; else if (e.code === DOMException.INVALID_STATE_ERR && r.mediaSourceOpenOrEnded && !n) i.errorAction = Gt(!0); else if (e.name === Sa && 0 === r.sourceBufferCount) i.errorAction = Gt(!0); else { var s = ++r.appendErrors[a]; r.warn("Failed " + s + "/" + r.hls.config.appendErrorMaxRetry + ' times to append segment in "' + a + '" sourceBuffer (' + (n || "no media error") + ")"), (s >= r.hls.config.appendErrorMaxRetry || n) && (i.fatal = !0) } r.hls.trigger(b.ERROR, i) } }; this.log('queuing "' + a + '" append sn: ' + f + (l ? " p: " + l.index : "") + " of " + (o.type === w ? "level" : "track") + " " + o.level + " cc: " + c), this.append(x, a, this.isPending(this.tracks[a])) } , r.getFlushOp = function(e, t, r) { var i = this; return this.log('queuing "' + e + '" remove ' + t + "-" + r), { label: "remove", execute: function() { i.removeExecutor(e, t, r) }, onStart: function() {}, onComplete: function() { i.hls.trigger(b.BUFFER_FLUSHED, { type: e }) }, onError: function(n) { i.warn("Failed to remove " + t + "-" + r + ' from "' + e + '" SourceBuffer', n) } } } , r.onBufferFlushing = function(e, t) { var r = this , i = t.type , n = t.startOffset , a = t.endOffset; i ? this.append(this.getFlushOp(i, n, a), i) : this.sourceBuffers.forEach((function(e) { var t = e[0]; t && r.append(r.getFlushOp(t, n, a), t) } )) } , r.onFragParsed = function(e, t) { var r = this , i = t.frag , n = t.part , a = [] , s = n ? n.elementaryStreams : i.elementaryStreams; s[J] ? a.push("audiovideo") : (s[$] && a.push("audio"), s[Z] && a.push("video")), 0 === a.length && this.warn("Fragments must have at least one ElementaryStreamType set. type: " + i.type + " level: " + i.level + " sn: " + i.sn), this.blockBuffers((function() { var e = self.performance.now(); i.stats.buffering.end = e, n && (n.stats.buffering.end = e); var t = n ? n.stats : i.stats; r.hls.trigger(b.FRAG_BUFFERED, { frag: i, part: n, stats: t, id: i.type }) } ), a).catch((function(e) { r.warn("Fragment buffered callback " + e), r.stepOperationQueue(r.sourceBufferTypes) } )) } , r.onFragChanged = function(e, t) { this.trimBuffers() } , r.onBufferEos = function(e, t) { var r, i = this; this.sourceBuffers.forEach((function(e) { var r = e[0]; if (r) { var n = i.tracks[r]; t.type && t.type !== r || (n.ending = !0, n.ended || (n.ended = !0, i.log(r + " buffer reached EOS"))) } } )); var n = !1 !== (null == (r = this.overrides) ? void 0 : r.endOfStream); this.sourceBufferCount > 0 && !this.sourceBuffers.some((function(e) { var t, r = e[0]; return r && !(null != (t = i.tracks[r]) && t.ended) } )) ? n ? (this.log("Queueing EOS"), this.blockUntilOpen((function() { i.tracksEnded(); var e = i.mediaSource; e && "open" === e.readyState ? (i.log("Calling mediaSource.endOfStream()"), e.endOfStream(), i.hls.trigger(b.BUFFERED_TO_END, void 0)) : e && i.log("Could not call mediaSource.endOfStream(). mediaSource.readyState: " + e.readyState) } ))) : (this.tracksEnded(), this.hls.trigger(b.BUFFERED_TO_END, void 0)) : "video" === t.type && this.unblockAudio() } , r.tracksEnded = function() { var e = this; this.sourceBuffers.forEach((function(t) { var r = t[0]; if (null !== r) { var i = e.tracks[r]; i && (i.ending = !1) } } )) } , r.onLevelUpdated = function(e, t) { var r = t.details; r.fragments.length && (this.details = r, this.updateDuration()) } , r.updateDuration = function() { var e = this; this.blockUntilOpen((function() { var t = e.getDurationAndRange(); t && e.updateMediaSource(t) } )) } , r.onError = function(e, t) { if (t.details === k.BUFFER_APPEND_ERROR && t.frag) { var r, i = null == (r = t.errorAction) ? void 0 : r.nextAutoLevel; A(i) && i !== t.frag.level && this.resetAppendErrors() } } , r.resetAppendErrors = function() { this.appendErrors = { audio: 0, video: 0, audiovideo: 0 } } , r.trimBuffers = function() { var e = this.hls , t = this.details , r = this.media; if (r && null !== t && this.sourceBufferCount) { var i = e.config , n = r.currentTime , a = t.levelTargetDuration , s = t.live && null !== i.liveBackBufferLength ? i.liveBackBufferLength : i.backBufferLength; if (A(s) && s >= 0) { var o = Math.max(s, a) , l = Math.floor(n / a) * a - o; this.flushBackBuffer(n, a, l) } var u = i.frontBufferFlushThreshold; if (A(u) && u > 0) { var d = Math.max(i.maxBufferLength, u) , h = Math.max(d, a) , f = Math.floor(n / a) * a + h; this.flushFrontBuffer(n, a, f) } } } , r.flushBackBuffer = function(e, t, r) { var i = this; this.sourceBuffers.forEach((function(e) { var t = e[0] , n = e[1]; if (n) { var a = ur.getBuffered(n); if (a.length > 0 && r > a.start(0)) { var s; i.hls.trigger(b.BACK_BUFFER_REACHED, { bufferEnd: r }); var o = i.tracks[t]; if (null != (s = i.details) && s.live) i.hls.trigger(b.LIVE_BACK_BUFFER_REACHED, { bufferEnd: r }); else if (null != o && o.ended) return void i.log("Cannot flush " + t + " back buffer while SourceBuffer is in ended state"); i.hls.trigger(b.BUFFER_FLUSHING, { startOffset: 0, endOffset: r, type: t }) } } } )) } , r.flushFrontBuffer = function(e, t, r) { var i = this; this.sourceBuffers.forEach((function(t) { var n = t[0] , a = t[1]; if (a) { var s = ur.getBuffered(a) , o = s.length; if (o < 2) return; var l = s.start(o - 1) , u = s.end(o - 1); if (r > l || e >= l && e <= u) return; i.hls.trigger(b.BUFFER_FLUSHING, { startOffset: l, endOffset: 1 / 0, type: n }) } } )) } , r.getDurationAndRange = function() { var e, t = this.details, r = this.mediaSource; if (!t || !this.media || "open" !== (null == r ? void 0 : r.readyState)) return null; var i = t.edge; if (t.live && this.hls.config.liveDurationInfinity) { if (t.fragments.length && r.setLiveSeekableRange) { var n = Math.max(0, t.fragmentStart); return { duration: 1 / 0, start: n, end: Math.max(n, i) } } return { duration: 1 / 0 } } var a = null == (e = this.overrides) ? void 0 : e.duration; if (a) return A(a) ? { duration: a } : null; var s = this.media.duration; return i > (A(r.duration) ? r.duration : 0) && i > s || !A(s) ? { duration: i } : null } , r.updateMediaSource = function(e) { var t = e.duration , r = e.start , i = e.end , n = this.mediaSource; this.media && n && "open" === n.readyState && (n.duration !== t && (A(t) && this.log("Updating MediaSource duration to " + t.toFixed(3)), n.duration = t), void 0 !== r && void 0 !== i && (this.log("MediaSource duration is set to " + n.duration + ". Setting seekable range to " + r + "-" + i + "."), n.setLiveSeekableRange(r, i))) } , r.checkPendingTracks = function() { var e = this.bufferCodecEventsTotal , t = this.pendingTrackCount , r = this.tracks; if (this.log("checkPendingTracks (pending: " + t + " codec events expected: " + e + ") " + lt(r)), this.tracksReady) { var i, n = null == (i = this.transferData) ? void 0 : i.tracks; n && Object.keys(n).length ? this.attachTransferred() : this.createSourceBuffers() } } , r.bufferCreated = function() { var e = this; if (this.sourceBufferCount) { var t = {}; this.sourceBuffers.forEach((function(r) { var i = r[0] , n = r[1]; if (i) { var a = e.tracks[i]; t[i] = { buffer: n, container: a.container, codec: a.codec, supplemental: a.supplemental, levelCodec: a.levelCodec, id: a.id, metadata: a.metadata } } } )), this.hls.trigger(b.BUFFER_CREATED, { tracks: t }), this.log("SourceBuffers created. Running queue: " + this.operationQueue), this.sourceBuffers.forEach((function(t) { var r = t[0]; e.executeNext(r) } )) } else { var r = new Error("could not create source buffer for media codec(s)"); this.hls.trigger(b.ERROR, { type: R.MEDIA_ERROR, details: k.BUFFER_INCOMPATIBLE_CODECS_ERROR, fatal: !0, error: r, reason: r.message }) } } , r.createSourceBuffers = function() { var e = this.tracks , t = this.sourceBuffers , r = this.mediaSource; if (!r) throw new Error("createSourceBuffers called when mediaSource was null"); for (var i in e) { var n = i , a = e[n]; if (this.isPending(a)) { var s = this.getTrackCodec(a, n) , o = a.container + ";codecs=" + s; a.codec = s, this.log("creating sourceBuffer(" + o + ")" + (this.currentOp(n) ? " Queued" : "") + " " + lt(a)); try { var l = r.addSourceBuffer(o) , u = Ra(n) , d = [n, l]; t[u] = d, a.buffer = l } catch (e) { var h; return this.error("error while trying to add sourceBuffer: " + e.message), this.shiftAndExecuteNext(n), null == (h = this.operationQueue) || h.removeBlockers(), delete this.tracks[n], void this.hls.trigger(b.ERROR, { type: R.MEDIA_ERROR, details: k.BUFFER_ADD_CODEC_ERROR, fatal: !1, error: e, sourceBufferName: n, mimeType: o, parent: a.id }) } this.trackSourceBuffer(n, a) } } this.bufferCreated() } , r.getTrackCodec = function(e, t) { var r = e.supplemental , i = e.codec; r && ("video" === t || "audiovideo" === t) && Oe(r, "video") && (i = function(e, t) { var r = []; if (e) for (var i = e.split(","), n = 0; n < i.length; n++) we(i[n], "video") || r.push(i[n]); return t && r.push(t), r.join(",") }(i, r)); var n = Ke(i, e.levelCodec); return n ? "audio" === t.slice(0, 5) ? Ge(n, this.appendSource) : n : "" } , r.trackSourceBuffer = function(e, t) { var r = this , i = t.buffer; if (i) { var n = this.getTrackCodec(t, e); this.tracks[e] = { buffer: i, codec: n, container: t.container, levelCodec: t.levelCodec, supplemental: t.supplemental, metadata: t.metadata, id: t.id, listeners: [] }, this.removeBufferListeners(e), this.addBufferListener(e, "updatestart", this.onSBUpdateStart), this.addBufferListener(e, "updateend", this.onSBUpdateEnd), this.addBufferListener(e, "error", this.onSBUpdateError), this.appendSource && this.addBufferListener(e, "bufferedchange", (function(e, t) { var i = t.removedRanges; null != i && i.length && r.hls.trigger(b.BUFFER_FLUSHED, { type: e }) } )) } } , r.onSBUpdateStart = function(e) { var t = this.currentOp(e); t && t.onStart() } , r.onSBUpdateEnd = function(e) { var t; if ("closed" !== (null == (t = this.mediaSource) ? void 0 : t.readyState)) { var r = this.currentOp(e); r && (r.onComplete(), this.shiftAndExecuteNext(e)) } else this.resetBuffer(e) } , r.onSBUpdateError = function(e, t) { var r, i = new Error(e + " SourceBuffer error. MediaSource readyState: " + (null == (r = this.mediaSource) ? void 0 : r.readyState)); this.error("" + i, t), this.hls.trigger(b.ERROR, { type: R.MEDIA_ERROR, details: k.BUFFER_APPENDING_ERROR, sourceBufferName: e, error: i, fatal: !1 }); var n = this.currentOp(e); n && n.onError(i) } , r.updateTimestampOffset = function(e, t, r, i, n, a) { var s = t - e.timestampOffset; Math.abs(s) >= r && (this.log("Updating " + i + " SourceBuffer timestampOffset to " + t + " (sn: " + n + " cc: " + a + ")"), e.timestampOffset = t) } , r.removeExecutor = function(e, t, r) { var i = this.media , n = this.mediaSource , a = this.tracks[e] , s = null == a ? void 0 : a.buffer; if (!i || !n || !s) return this.warn("Attempting to remove from the " + e + " SourceBuffer, but it does not exist"), void this.shiftAndExecuteNext(e); var o = A(i.duration) ? i.duration : 1 / 0 , l = A(n.duration) ? n.duration : 1 / 0 , u = Math.max(0, t) , d = Math.min(r, o, l); d > u && (!a.ending || a.ended) ? (a.ended = !1, this.log("Removing [" + u + "," + d + "] from the " + e + " SourceBuffer"), s.remove(u, d)) : this.shiftAndExecuteNext(e) } , r.appendExecutor = function(e, t) { var r = this.tracks[t] , i = null == r ? void 0 : r.buffer; if (!i) throw new Aa("Attempting to append to the " + t + " SourceBuffer, but it does not exist"); r.ending = !1, r.ended = !1, i.appendBuffer(e) } , r.blockUntilOpen = function(e) { var t = this; if (this.isUpdating() || this.isQueued()) this.blockBuffers(e).catch((function(e) { t.warn("SourceBuffer blocked callback " + e), t.stepOperationQueue(t.sourceBufferTypes) } )); else try { e() } catch (e) { this.warn("Callback run without blocking " + this.operationQueue + " " + e) } } , r.isUpdating = function() { return this.sourceBuffers.some((function(e) { var t = e[0] , r = e[1]; return t && r.updating } )) } , r.isQueued = function() { var e = this; return this.sourceBuffers.some((function(t) { var r = t[0]; return r && !!e.currentOp(r) } )) } , r.isPending = function(e) { return !!e && !e.buffer } , r.blockBuffers = function(e, t) { var r = this; if (void 0 === t && (t = this.sourceBufferTypes), !t.length) return this.log("Blocking operation requested, but no SourceBuffers exist"), Promise.resolve().then(e); var i = this.operationQueue , n = t.map((function(e) { return r.appendBlocker(e) } )); return t.length > 1 && !!this.blockedAudioAppend && this.unblockAudio(), Promise.all(n).then((function(t) { i === r.operationQueue && (e(), r.stepOperationQueue(r.sourceBufferTypes)) } )) } , r.stepOperationQueue = function(e) { var t = this; e.forEach((function(e) { var r, i = null == (r = t.tracks[e]) ? void 0 : r.buffer; i && !i.updating && t.shiftAndExecuteNext(e) } )) } , r.append = function(e, t, r) { this.operationQueue && this.operationQueue.append(e, t, r) } , r.appendBlocker = function(e) { if (this.operationQueue) return this.operationQueue.appendBlocker(e) } , r.currentOp = function(e) { return this.operationQueue ? this.operationQueue.current(e) : null } , r.executeNext = function(e) { e && this.operationQueue && this.operationQueue.executeNext(e) } , r.shiftAndExecuteNext = function(e) { this.operationQueue && this.operationQueue.shiftAndExecuteNext(e) } , r.addBufferListener = function(e, t, r) { var i = this.tracks[e]; if (i) { var n = i.buffer; if (n) { var a = r.bind(this, e); i.listeners.push({ event: t, listener: a }), n.addEventListener(t, a) } } } , r.removeBufferListeners = function(e) { var t = this.tracks[e]; if (t) { var r = t.buffer; r && (t.listeners.forEach((function(e) { r.removeEventListener(e.event, e.listener) } )), t.listeners.length = 0) } } , i(t, [{ key: "mediaSourceOpenOrEnded", get: function() { var e, t = null == (e = this.mediaSource) ? void 0 : e.readyState; return "open" === t || "ended" === t } }, { key: "sourceBufferTracks", get: function() { var e = this; return Object.keys(this.tracks).reduce((function(t, r) { var i = e.tracks[r]; return t[r] = { id: i.id, container: i.container, codec: i.codec, levelCodec: i.levelCodec }, t } ), {}) } }, { key: "bufferedToEnd", get: function() { var e = this; return this.sourceBufferCount > 0 && !this.sourceBuffers.some((function(t) { var r = t[0]; if (r) { var i = e.tracks[r]; if (i) return !i.ended || i.ending } return !1 } )) } }, { key: "tracksReady", get: function() { var e = this.pendingTrackCount; return e > 0 && (e >= this.bufferCodecEventsTotal || this.isPending(this.tracks.audiovideo)) } }, { key: "mediaSrc", get: function() { var e, t, r = (null == (e = this.media) || null == (t = e.querySelector) ? void 0 : t.call(e, "source")) || this.media; return null == r ? void 0 : r.src } }, { key: "pendingTrackCount", get: function() { var e = this; return Object.keys(this.tracks).reduce((function(t, r) { return t + (e.isPending(e.tracks[r]) ? 1 : 0) } ), 0) } }, { key: "sourceBufferCount", get: function() { return this.sourceBuffers.reduce((function(e, t) { return e + (t[0] ? 1 : 0) } ), 0) } }, { key: "sourceBufferTypes", get: function() { return this.sourceBuffers.map((function(e) { return e[0] } )).filter((function(e) { return !!e } )) } }]) }(N); function Ia(e) { var t = e.querySelectorAll("source"); [].slice.call(t).forEach((function(t) { e.removeChild(t) } )) } function Ra(e) { return "audio" === e ? 1 : 0 } var ka = function() { function e(e) { this.hls = void 0, this.autoLevelCapping = void 0, this.firstLevel = void 0, this.media = void 0, this.restrictedLevels = void 0, this.timer = void 0, this.clientRect = void 0, this.streamController = void 0, this.hls = e, this.autoLevelCapping = Number.POSITIVE_INFINITY, this.firstLevel = -1, this.media = null, this.restrictedLevels = [], this.timer = void 0, this.clientRect = null, this.registerListeners() } var t = e.prototype; return t.setStreamController = function(e) { this.streamController = e } , t.destroy = function() { this.hls && this.unregisterListener(), this.timer && this.stopCapping(), this.media = null, this.clientRect = null, this.hls = this.streamController = null } , t.registerListeners = function() { var e = this.hls; e.on(b.FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this), e.on(b.MEDIA_ATTACHING, this.onMediaAttaching, this), e.on(b.MANIFEST_PARSED, this.onManifestParsed, this), e.on(b.LEVELS_UPDATED, this.onLevelsUpdated, this), e.on(b.BUFFER_CODECS, this.onBufferCodecs, this), e.on(b.MEDIA_DETACHING, this.onMediaDetaching, this) } , t.unregisterListener = function() { var e = this.hls; e.off(b.FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this), e.off(b.MEDIA_ATTACHING, this.onMediaAttaching, this), e.off(b.MANIFEST_PARSED, this.onManifestParsed, this), e.off(b.LEVELS_UPDATED, this.onLevelsUpdated, this), e.off(b.BUFFER_CODECS, this.onBufferCodecs, this), e.off(b.MEDIA_DETACHING, this.onMediaDetaching, this) } , t.onFpsDropLevelCapping = function(e, t) { var r = this.hls.levels[t.droppedLevel]; this.isLevelAllowed(r) && this.restrictedLevels.push({ bitrate: r.bitrate, height: r.height, width: r.width }) } , t.onMediaAttaching = function(e, t) { this.media = t.media instanceof HTMLVideoElement ? t.media : null, this.clientRect = null, this.timer && this.hls.levels.length && this.detectPlayerSize() } , t.onManifestParsed = function(e, t) { var r = this.hls; this.restrictedLevels = [], this.firstLevel = t.firstLevel, r.config.capLevelToPlayerSize && t.video && this.startCapping() } , t.onLevelsUpdated = function(e, t) { this.timer && A(this.autoLevelCapping) && this.detectPlayerSize() } , t.onBufferCodecs = function(e, t) { this.hls.config.capLevelToPlayerSize && t.video && this.startCapping() } , t.onMediaDetaching = function() { this.stopCapping(), this.media = null } , t.detectPlayerSize = function() { if (this.media) { if (this.mediaHeight <= 0 || this.mediaWidth <= 0) return void (this.clientRect = null); var e = this.hls.levels; if (e.length) { var t = this.hls , r = this.getMaxLevel(e.length - 1); r !== this.autoLevelCapping && t.logger.log("Setting autoLevelCapping to " + r + ": " + e[r].height + "p@" + e[r].bitrate + " for media " + this.mediaWidth + "x" + this.mediaHeight), t.autoLevelCapping = r, t.autoLevelEnabled && t.autoLevelCapping > this.autoLevelCapping && this.streamController && this.streamController.nextLevelSwitch(), this.autoLevelCapping = t.autoLevelCapping } } } , t.getMaxLevel = function(t) { var r = this , i = this.hls.levels; if (!i.length) return -1; var n = i.filter((function(e, i) { return r.isLevelAllowed(e) && i <= t } )); return this.clientRect = null, e.getMaxLevelByMediaSize(n, this.mediaWidth, this.mediaHeight) } , t.startCapping = function() { this.timer || (this.autoLevelCapping = Number.POSITIVE_INFINITY, self.clearInterval(this.timer), this.timer = self.setInterval(this.detectPlayerSize.bind(this), 1e3), this.detectPlayerSize()) } , t.stopCapping = function() { this.restrictedLevels = [], this.firstLevel = -1, this.autoLevelCapping = Number.POSITIVE_INFINITY, this.timer && (self.clearInterval(this.timer), this.timer = void 0) } , t.getDimensions = function() { if (this.clientRect) return this.clientRect; var e = this.media , t = { width: 0, height: 0 }; if (e) { var r = e.getBoundingClientRect(); t.width = r.width, t.height = r.height, t.width || t.height || (t.width = r.right - r.left || e.width || 0, t.height = r.bottom - r.top || e.height || 0) } return this.clientRect = t, t } , t.isLevelAllowed = function(e) { return !this.restrictedLevels.some((function(t) { return e.bitrate === t.bitrate && e.width === t.width && e.height === t.height } )) } , e.getMaxLevelByMediaSize = function(e, t, r) { if (null == e || !e.length) return -1; for (var i, n, a = e.length - 1, s = Math.max(t, r), o = 0; o < e.length; o += 1) { var l = e[o]; if ((l.width >= s || l.height >= s) && (i = l, !(n = e[o + 1]) || i.width !== n.width || i.height !== n.height)) { a = o; break } } return a } , i(e, [{ key: "mediaWidth", get: function() { return this.getDimensions().width * this.contentScaleFactor } }, { key: "mediaHeight", get: function() { return this.getDimensions().height * this.contentScaleFactor } }, { key: "contentScaleFactor", get: function() { var e = 1; if (!this.hls.config.ignoreDevicePixelRatio) try { e = self.devicePixelRatio } catch (e) {} return Math.min(e, this.hls.config.maxDevicePixelRatio) } }]) }() , ba = { MANIFEST: "m", AUDIO: "a", VIDEO: "v", MUXED: "av", INIT: "i", CAPTION: "c", TIMED_TEXT: "tt", KEY: "k", OTHER: "o" } , Da = { HLS: "h" } , _a = function e(t, r) { Array.isArray(t) && (t = t.map((function(t) { return t instanceof e ? t : new e(t) } ))), this.value = t, this.params = r } , Pa = "Dict"; function Ca(e, t, r, i) { return new Error("failed to " + e + ' "' + (n = t, (Array.isArray(n) ? JSON.stringify(n) : n instanceof Map ? "Map{}" : n instanceof Set ? "Set{}" : "object" == typeof n ? JSON.stringify(n) : String(n)) + '" as ') + r,{ cause: i }); var n } function wa(e, t, r) { return Ca("serialize", e, t, r) } var Oa = function(e) { this.description = e } , xa = "Bare Item" , Ma = "Boolean" , Fa = "Byte Sequence"; function Na(e) { if (!1 === ArrayBuffer.isView(e)) throw wa(e, Fa); return ":" + (t = e, btoa(String.fromCharCode.apply(String, t)) + ":"); var t } var Ua = "Integer"; function Ba(e) { if (function(e) { return e < -999999999999999 || 999999999999999 < e }(e)) throw wa(e, Ua); return e.toString() } function Ga(e, t) { if (e < 0) return -Ga(-e, t); var r = Math.pow(10, t); if (Math.abs(e * r % 1 - .5) < Number.EPSILON) { var i = Math.floor(e * r); return (i % 2 == 0 ? i : i + 1) / r } return Math.round(e * r) / r } var Ka = "Decimal"; function Va(e) { var t = Ga(e, 3); if (Math.floor(Math.abs(t)).toString().length > 12) throw wa(e, Ka); var r = t.toString(); return r.includes(".") ? r : r + ".0" } var Ha = "String" , Ya = /[\x00-\x1f\x7f]+/ , Wa = "Token"; function ja(e) { var t, r = (t = e).description || t.toString().slice(7, -1); if (!1 === /^([a-zA-Z*])([!#$%&'*+\-.^_`|~\w:/]*)$/.test(r)) throw wa(r, Wa); return r } function qa(e) { switch (typeof e) { case "number": if (!A(e)) throw wa(e, xa); return Number.isInteger(e) ? Ba(e) : Va(e); case "string": return function(e) { if (Ya.test(e)) throw wa(e, Ha); return '"' + e.replace(/\\/g, "\\\\").replace(/"/g, '\\"') + '"' }(e); case "symbol": return ja(e); case "boolean": return function(e) { if ("boolean" != typeof e) throw wa(e, Ma); return e ? "?1" : "?0" }(e); case "object": if (e instanceof Date) return function(e) { return "@" + Ba(e.getTime() / 1e3) }(e); if (e instanceof Uint8Array) return Na(e); if (e instanceof Oa) return ja(e); default: throw wa(e, xa) } } var Xa = "Key"; function Qa(e) { if (!1 === /^[a-z*][a-z0-9\-_.*]*$/.test(e)) throw wa(e, Xa); return e } function za(e) { return null == e ? "" : Object.entries(e).map((function(e) { var t = e[0] , r = e[1]; return !0 === r ? ";" + Qa(t) : ";" + Qa(t) + "=" + qa(r) } )).join("") } function $a(e) { return e instanceof _a ? "" + qa(e.value) + za(e.params) : qa(e) } function Za(e, t) { if (void 0 === t && (t = { whitespace: !0 }), "object" != typeof e || null == e) throw wa(e, Pa); var r = e instanceof Map ? e.entries() : Object.entries(e) , i = (null == t ? void 0 : t.whitespace) ? " " : ""; return Array.from(r).map((function(e) { var t = e[0] , r = e[1]; r instanceof _a == 0 && (r = new _a(r)); var i, n = Qa(t); return !0 === r.value ? n += za(r.params) : (n += "=", Array.isArray(r.value) ? n += "(" + (i = r).value.map($a).join(" ") + ")" + za(i.params) : n += $a(r)), n } )).join("," + i) } function Ja(e, t) { return Za(e, t) } var es = "CMCD-Object" , ts = "CMCD-Request" , rs = "CMCD-Session" , is = "CMCD-Status" , ns = { br: es, ab: es, d: es, ot: es, tb: es, tpb: es, lb: es, tab: es, lab: es, url: es, pb: ts, bl: ts, tbl: ts, dl: ts, ltc: ts, mtp: ts, nor: ts, nrr: ts, rc: ts, sn: ts, sta: ts, su: ts, ttfb: ts, ttfbb: ts, ttlb: ts, cmsdd: ts, cmsds: ts, smrt: ts, df: ts, cs: ts, ts: ts, cid: rs, pr: rs, sf: rs, sid: rs, st: rs, v: rs, msd: rs, bs: is, bsd: is, cdn: is, rtp: is, bg: is, pt: is, ec: is, e: is } , as = { REQUEST: ts }; function ss(e, t) { var r = {}; if (!e) return r; var i, n = Object.keys(e), a = t ? (i = t, Object.keys(i).reduce((function(e, t) { var r; return null === (r = i[t]) || void 0 === r || r.forEach((function(r) { return e[r] = t } )), e } ), {})) : {}; return n.reduce((function(t, r) { var i, n = ns[r] || a[r] || as.REQUEST; return (null !== (i = t[n]) && void 0 !== i ? i : t[n] = {})[r] = e[r], t } ), r) } var os = "event" , ls = function(e) { return Math.round(e) } , us = function(e, t) { return Array.isArray(e) ? e.map((function(e) { return us(e, t) } )) : e instanceof _a && "string" == typeof e.value ? new _a(us(e.value, t),e.params) : (t.baseUrl && (e = function(e, t) { var r = new URL(e) , i = new URL(t); if (r.origin !== i.origin) return e; for (var n = r.pathname.split("/").slice(1), a = i.pathname.split("/").slice(1, -1); n[0] === a[0]; ) n.shift(), a.shift(); for (; a.length; ) a.shift(), n.unshift(".."); return n.join("/") + r.search + r.hash }(e, t.baseUrl)), 1 === t.version ? encodeURIComponent(e) : e) } , ds = function(e) { return 100 * ls(e / 100) } , hs = { br: ls, d: ls, bl: ds, dl: ds, mtp: ds, nor: function(e, t) { var r = e; return t.version >= 2 && (e instanceof _a && "string" == typeof e.value ? r = new _a([e]) : "string" == typeof e && (r = [e])), us(r, t) }, rtp: ds, tb: ls } , fs = "request" , cs = "response" , gs = ["ab", "bg", "bl", "br", "bs", "bsd", "cdn", "cid", "cs", "df", "ec", "lab", "lb", "ltc", "msd", "mtp", "pb", "pr", "pt", "sf", "sid", "sn", "st", "sta", "tab", "tb", "tbl", "tpb", "ts", "v"] , vs = ["e"] , ms = /^[a-zA-Z0-9-.]+-[a-zA-Z0-9-.]+$/; function ps(e) { return ms.test(e) } var ys, Es = ["d", "dl", "nor", "ot", "rtp", "su"], Ts = ["cmsdd", "cmsds", "rc", "smrt", "ttfb", "ttfbb", "ttlb", "url"], Ss = ["bl", "br", "bs", "cid", "d", "dl", "mtp", "nor", "nrr", "ot", "pr", "rtp", "sf", "sid", "st", "su", "tb", "v"]; function As(e) { return Ss.includes(e) || ps(e) } var Ls = ((ys = {})[cs] = function(e) { return gs.includes(e) || Es.includes(e) || Ts.includes(e) || ps(e) } , ys[os] = function(e) { return gs.includes(e) || vs.includes(e) || ps(e) } , ys[fs] = function(e) { return gs.includes(e) || Es.includes(e) || ps(e) } , ys); function Is(e, t) { void 0 === t && (t = {}); var r = {}; if (null == e || "object" != typeof e) return r; var i = t.version || e.v || 1 , n = t.reportingMode || fs , s = 1 === i ? As : Ls[n] , o = Object.keys(e).filter(s) , l = t.filter; "function" == typeof l && (o = o.filter(l)); var u = n === cs || n === os; u && !o.includes("ts") && o.push("ts"), i > 1 && !o.includes("v") && o.push("v"); var d = a({}, hs, t.formatters) , h = { version: i, reportingMode: n, baseUrl: t.baseUrl }; return o.sort().forEach((function(t) { var n = e[t] , a = d[t]; if ("function" == typeof a && (n = a(n, h)), "v" === t) { if (1 === i) return; n = i } "pr" == t && 1 === n || (u && "ts" === t && !A(n) && (n = Date.now()), function(e) { return "number" == typeof e ? A(e) : null != e && "" !== e && !1 !== e }(n) && (function(e) { return ["ot", "sf", "st", "e", "sta"].includes(e) }(t) && "string" == typeof n && (n = new Oa(n)), r[t] = n)) } )), r } function Rs(e, t, r) { return a(e, function(e, t) { void 0 === t && (t = {}); var r = {}; if (!e) return r; var i = ss(Is(e, t), null == t ? void 0 : t.customHeaderMap); return Object.entries(i).reduce((function(e, t) { var r = t[0] , i = Ja(t[1], { whitespace: !1 }); return i && (e[r] = i), e } ), r) }(t, r)) } var ks = "CMCD"; function bs(e, t) { if (void 0 === t && (t = {}), !e) return ""; var r = function(e, t) { return void 0 === t && (t = {}), e ? Ja(Is(e, t), { whitespace: !1 }) : "" }(e, t); return encodeURIComponent(r) } var Ds = /CMCD=[^&#]+/; function _s(e, t, r) { var i = function(e, t) { if (void 0 === t && (t = {}), !e) return ""; var r = bs(e, t); return ks + "=" + r }(t, r); if (!i) return e; if (Ds.test(e)) return e.replace(Ds, i); var n = e.includes("?") ? "&" : "?"; return "" + e + n + i } var Ps = function() { function e(e) { var t = this; this.hls = void 0, this.config = void 0, this.media = void 0, this.sid = void 0, this.cid = void 0, this.useHeaders = !1, this.includeKeys = void 0, this.initialized = !1, this.starved = !1, this.buffering = !0, this.audioBuffer = void 0, this.videoBuffer = void 0, this.onWaiting = function() { t.initialized && (t.starved = !0), t.buffering = !0 } , this.onPlaying = function() { t.initialized || (t.initialized = !0), t.buffering = !1 } , this.applyPlaylistData = function(e) { try { t.apply(e, { ot: ba.MANIFEST, su: !t.initialized }) } catch (e) { t.hls.logger.warn("Could not generate manifest CMCD data.", e) } } , this.applyFragmentData = function(e) { try { var r = e.frag , i = e.part , n = t.hls.levels[r.level] , a = t.getObjectType(r) , s = { d: 1e3 * (i || r).duration, ot: a }; a !== ba.VIDEO && a !== ba.AUDIO && a != ba.MUXED || (s.br = n.bitrate / 1e3, s.tb = t.getTopBandwidth(a) / 1e3, s.bl = t.getBufferLength(a)); var o = i ? t.getNextPart(i) : t.getNextFrag(r); null != o && o.url && o.url !== r.url && (s.nor = o.url), t.apply(e, s) } catch (e) { t.hls.logger.warn("Could not generate segment CMCD data.", e) } } , this.hls = e; var r = this.config = e.config , i = r.cmcd; null != i && (r.pLoader = this.createPlaylistLoader(), r.fLoader = this.createFragmentLoader(), this.sid = i.sessionId || e.sessionId, this.cid = i.contentId, this.useHeaders = !0 === i.useHeaders, this.includeKeys = i.includeKeys, this.registerListeners()) } var t = e.prototype; return t.registerListeners = function() { var e = this.hls; e.on(b.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(b.MEDIA_DETACHED, this.onMediaDetached, this), e.on(b.BUFFER_CREATED, this.onBufferCreated, this) } , t.unregisterListeners = function() { var e = this.hls; e.off(b.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(b.MEDIA_DETACHED, this.onMediaDetached, this), e.off(b.BUFFER_CREATED, this.onBufferCreated, this) } , t.destroy = function() { this.unregisterListeners(), this.onMediaDetached(), this.hls = this.config = this.audioBuffer = this.videoBuffer = null, this.onWaiting = this.onPlaying = this.media = null } , t.onMediaAttached = function(e, t) { this.media = t.media, this.media.addEventListener("waiting", this.onWaiting), this.media.addEventListener("playing", this.onPlaying) } , t.onMediaDetached = function() { this.media && (this.media.removeEventListener("waiting", this.onWaiting), this.media.removeEventListener("playing", this.onPlaying), this.media = null) } , t.onBufferCreated = function(e, t) { var r, i; this.audioBuffer = null == (r = t.tracks.audio) ? void 0 : r.buffer, this.videoBuffer = null == (i = t.tracks.video) ? void 0 : i.buffer } , t.createData = function() { var e; return { v: 1, sf: Da.HLS, sid: this.sid, cid: this.cid, pr: null == (e = this.media) ? void 0 : e.playbackRate, mtp: this.hls.bandwidthEstimate / 1e3 } } , t.apply = function(e, t) { void 0 === t && (t = {}), a(t, this.createData()); var r = t.ot === ba.INIT || t.ot === ba.VIDEO || t.ot === ba.MUXED; this.starved && r && (t.bs = !0, t.su = !0, this.starved = !1), null == t.su && (t.su = this.buffering); var i = this.includeKeys; i && (t = Object.keys(t).reduce((function(e, r) { return i.includes(r) && (e[r] = t[r]), e } ), {})); var n = { baseUrl: e.url }; this.useHeaders ? (e.headers || (e.headers = {}), Rs(e.headers, t, n)) : e.url = _s(e.url, t, n) } , t.getNextFrag = function(e) { var t, r = null == (t = this.hls.levels[e.level]) ? void 0 : t.details; if (r) { var i = e.sn - r.startSN; return r.fragments[i + 1] } } , t.getNextPart = function(e) { var t, r = e.index, i = e.fragment, n = null == (t = this.hls.levels[i.level]) || null == (t = t.details) ? void 0 : t.partList; if (n) for (var a = i.sn, s = n.length - 1; s >= 0; s--) { var o = n[s]; if (o.index === r && o.fragment.sn === a) return n[s + 1] } } , t.getObjectType = function(e) { var t = e.type; return "subtitle" === t ? ba.TIMED_TEXT : "initSegment" === e.sn ? ba.INIT : "audio" === t ? ba.AUDIO : "main" === t ? this.hls.audioTracks.length ? ba.VIDEO : ba.MUXED : void 0 } , t.getTopBandwidth = function(e) { var t, r = 0, i = this.hls; if (e === ba.AUDIO) t = i.audioTracks; else { var n = i.maxAutoLevel , a = n > -1 ? n + 1 : i.levels.length; t = i.levels.slice(0, a) } return t.forEach((function(e) { e.bitrate > r && (r = e.bitrate) } )), r > 0 ? r : NaN } , t.getBufferLength = function(e) { var t = this.media , r = e === ba.AUDIO ? this.audioBuffer : this.videoBuffer; return r && t ? 1e3 * ur.bufferInfo(r, t.currentTime, this.config.maxBufferHole).len : NaN } , t.createPlaylistLoader = function() { var e = this.config.pLoader , t = this.applyPlaylistData , r = e || this.config.loader; return function() { function e(e) { this.loader = void 0, this.loader = new r(e) } var n = e.prototype; return n.destroy = function() { this.loader.destroy() } , n.abort = function() { this.loader.abort() } , n.load = function(e, r, i) { t(e), this.loader.load(e, r, i) } , i(e, [{ key: "stats", get: function() { return this.loader.stats } }, { key: "context", get: function() { return this.loader.context } }]) }() } , t.createFragmentLoader = function() { var e = this.config.fLoader , t = this.applyFragmentData , r = e || this.config.loader; return function() { function e(e) { this.loader = void 0, this.loader = new r(e) } var n = e.prototype; return n.destroy = function() { this.loader.destroy() } , n.abort = function() { this.loader.abort() } , n.load = function(e, r, i) { t(e), this.loader.load(e, r, i) } , i(e, [{ key: "stats", get: function() { return this.loader.stats } }, { key: "context", get: function() { return this.loader.context } }]) }() } , e }() , Cs = function(e) { function t(t) { var r; return (r = e.call(this, "content-steering", t.logger) || this).hls = void 0, r.loader = null, r.uri = null, r.pathwayId = ".", r._pathwayPriority = null, r.timeToLoad = 300, r.reloadTimer = -1, r.updated = 0, r.started = !1, r.enabled = !0, r.levels = null, r.audioTracks = null, r.subtitleTracks = null, r.penalizedPathways = {}, r.hls = t, r.registerListeners(), r } o(t, e); var r = t.prototype; return r.registerListeners = function() { var e = this.hls; e.on(b.MANIFEST_LOADING, this.onManifestLoading, this), e.on(b.MANIFEST_LOADED, this.onManifestLoaded, this), e.on(b.MANIFEST_PARSED, this.onManifestParsed, this), e.on(b.ERROR, this.onError, this) } , r.unregisterListeners = function() { var e = this.hls; e && (e.off(b.MANIFEST_LOADING, this.onManifestLoading, this), e.off(b.MANIFEST_LOADED, this.onManifestLoaded, this), e.off(b.MANIFEST_PARSED, this.onManifestParsed, this), e.off(b.ERROR, this.onError, this)) } , r.pathways = function() { return (this.levels || []).reduce((function(e, t) { return -1 === e.indexOf(t.pathwayId) && e.push(t.pathwayId), e } ), []) } , r.startLoad = function() { if (this.started = !0, this.clearTimeout(), this.enabled && this.uri) { if (this.updated) { var e = 1e3 * this.timeToLoad - (performance.now() - this.updated); if (e > 0) return void this.scheduleRefresh(this.uri, e) } this.loadSteeringManifest(this.uri) } } , r.stopLoad = function() { this.started = !1, this.loader && (this.loader.destroy(), this.loader = null), this.clearTimeout() } , r.clearTimeout = function() { -1 !== this.reloadTimer && (self.clearTimeout(this.reloadTimer), this.reloadTimer = -1) } , r.destroy = function() { this.unregisterListeners(), this.stopLoad(), this.hls = null, this.levels = this.audioTracks = this.subtitleTracks = null } , r.removeLevel = function(e) { var t = this.levels; t && (this.levels = t.filter((function(t) { return t !== e } ))) } , r.onManifestLoading = function() { this.stopLoad(), this.enabled = !0, this.timeToLoad = 300, this.updated = 0, this.uri = null, this.pathwayId = ".", this.levels = this.audioTracks = this.subtitleTracks = null } , r.onManifestLoaded = function(e, t) { var r = t.contentSteering; null !== r && (this.pathwayId = r.pathwayId, this.uri = r.uri, this.started && this.startLoad()) } , r.onManifestParsed = function(e, t) { this.audioTracks = t.audioTracks, this.subtitleTracks = t.subtitleTracks } , r.onError = function(e, t) { var r = t.errorAction; if ((null == r ? void 0 : r.action) === wt && r.flags === Ft) { var i = this.levels , n = this._pathwayPriority , a = this.pathwayId; if (t.context) { var s = t.context , o = s.groupId , l = s.pathwayId , u = s.type; o && i ? a = this.getPathwayForGroupId(o, u, a) : l && (a = l) } a in this.penalizedPathways || (this.penalizedPathways[a] = performance.now()), !n && i && (n = this.pathways()), n && n.length > 1 && (this.updatePathwayPriority(n), r.resolved = this.pathwayId !== a), t.details !== k.BUFFER_APPEND_ERROR || t.fatal ? r.resolved || this.warn("Could not resolve " + t.details + ' ("' + t.error.message + '") with content-steering for Pathway: ' + a + " levels: " + (i ? i.length : i) + " priorities: " + lt(n) + " penalized: " + lt(this.penalizedPathways)) : r.resolved = !0 } } , r.filterParsedLevels = function(e) { this.levels = e; var t = this.getLevelsForPathway(this.pathwayId); if (0 === t.length) { var r = e[0].pathwayId; this.log("No levels found in Pathway " + this.pathwayId + '. Setting initial Pathway to "' + r + '"'), t = this.getLevelsForPathway(r), this.pathwayId = r } return t.length !== e.length && this.log("Found " + t.length + "/" + e.length + ' levels in Pathway "' + this.pathwayId + '"'), t } , r.getLevelsForPathway = function(e) { return null === this.levels ? [] : this.levels.filter((function(t) { return e === t.pathwayId } )) } , r.updatePathwayPriority = function(e) { var t; this._pathwayPriority = e; var r = this.penalizedPathways , i = performance.now(); Object.keys(r).forEach((function(e) { i - r[e] > 3e5 && delete r[e] } )); for (var n = 0; n < e.length; n++) { var a = e[n]; if (!(a in r)) { if (a === this.pathwayId) return; var s = this.hls.nextLoadLevel , o = this.hls.levels[s]; if ((t = this.getLevelsForPathway(a)).length > 0) { this.log('Setting Pathway to "' + a + '"'), this.pathwayId = a, vi(t), this.hls.trigger(b.LEVELS_UPDATED, { levels: t }); var l = this.hls.levels[s]; o && l && this.levels && (l.attrs["STABLE-VARIANT-ID"] !== o.attrs["STABLE-VARIANT-ID"] && l.bitrate !== o.bitrate && this.log("Unstable Pathways change from bitrate " + o.bitrate + " to " + l.bitrate), this.hls.nextLoadLevel = s); break } } } } , r.getPathwayForGroupId = function(e, t, r) { for (var i = this.getLevelsForPathway(r).concat(this.levels || []), n = 0; n < i.length; n++) if (t === P && i[n].hasAudioGroup(e) || t === C && i[n].hasSubtitleGroup(e)) return i[n].pathwayId; return r } , r.clonePathways = function(e) { var t = this , r = this.levels; if (r) { var i = {} , n = {}; e.forEach((function(e) { var a = e.ID , s = e["BASE-ID"] , o = e["URI-REPLACEMENT"]; if (!r.some((function(e) { return e.pathwayId === a } ))) { var l = t.getLevelsForPathway(s).map((function(e) { var t = new pr(e.attrs); t["PATHWAY-ID"] = a; var r = t.AUDIO && t.AUDIO + "_clone_" + a , s = t.SUBTITLES && t.SUBTITLES + "_clone_" + a; r && (i[t.AUDIO] = r, t.AUDIO = r), s && (n[t.SUBTITLES] = s, t.SUBTITLES = s); var l = Os(e.uri, t["STABLE-VARIANT-ID"], "PER-VARIANT-URIS", o) , u = new at({ attrs: t, audioCodec: e.audioCodec, bitrate: e.bitrate, height: e.height, name: e.name, url: l, videoCodec: e.videoCodec, width: e.width }); if (e.audioGroups) for (var d = 1; d < e.audioGroups.length; d++) u.addGroupId("audio", e.audioGroups[d] + "_clone_" + a); if (e.subtitleGroups) for (var h = 1; h < e.subtitleGroups.length; h++) u.addGroupId("text", e.subtitleGroups[h] + "_clone_" + a); return u } )); r.push.apply(r, l), ws(t.audioTracks, i, o, a), ws(t.subtitleTracks, n, o, a) } } )) } } , r.loadSteeringManifest = function(e) { var t, r = this, i = this.hls.config, n = i.loader; this.loader && this.loader.destroy(), this.loader = new n(i); try { t = new self.URL(e) } catch (t) { return this.enabled = !1, void this.log("Failed to parse Steering Manifest URI: " + e) } if ("data:" !== t.protocol) { var a = 0 | (this.hls.bandwidthEstimate || i.abrEwmaDefaultEstimate); t.searchParams.set("_HLS_pathway", this.pathwayId), t.searchParams.set("_HLS_throughput", "" + a) } var s = { responseType: "json", url: t.href } , o = i.steeringManifestLoadPolicy.default , l = o.errorRetry || o.timeoutRetry || {} , u = { loadPolicy: o, timeout: o.maxLoadTimeMs, maxRetry: l.maxNumRetry || 0, retryDelay: l.retryDelayMs || 0, maxRetryDelay: l.maxRetryDelayMs || 0 } , d = { onSuccess: function(e, i, n, a) { r.log('Loaded steering manifest: "' + t + '"'); var s = e.data; if (1 === (null == s ? void 0 : s.VERSION)) { r.updated = performance.now(), r.timeToLoad = s.TTL; var o = s["RELOAD-URI"] , l = s["PATHWAY-CLONES"] , u = s["PATHWAY-PRIORITY"]; if (o) try { r.uri = new self.URL(o,t).href } catch (e) { return r.enabled = !1, void r.log("Failed to parse Steering Manifest RELOAD-URI: " + o) } r.scheduleRefresh(r.uri || n.url), l && r.clonePathways(l); var d = { steeringManifest: s, url: t.toString() }; r.hls.trigger(b.STEERING_MANIFEST_LOADED, d), u && r.updatePathwayPriority(u) } else r.log("Steering VERSION " + s.VERSION + " not supported!") }, onError: function(e, t, i, n) { if (r.log("Error loading steering manifest: " + e.code + " " + e.text + " (" + t.url + ")"), r.stopLoad(), 410 === e.code) return r.enabled = !1, void r.log("Steering manifest " + t.url + " no longer available"); var a = 1e3 * r.timeToLoad; if (429 !== e.code) r.scheduleRefresh(r.uri || t.url, a); else { var s = r.loader; if ("function" == typeof (null == s ? void 0 : s.getResponseHeader)) { var o = s.getResponseHeader("Retry-After"); o && (a = 1e3 * parseFloat(o)) } r.log("Steering manifest " + t.url + " rate limited") } }, onTimeout: function(e, t, i) { r.log("Timeout loading steering manifest (" + t.url + ")"), r.scheduleRefresh(r.uri || t.url) } }; this.log("Requesting steering manifest: " + t), this.loader.load(s, u, d) } , r.scheduleRefresh = function(e, t) { var r = this; void 0 === t && (t = 1e3 * this.timeToLoad), this.clearTimeout(), this.reloadTimer = self.setTimeout((function() { var t, i = null == (t = r.hls) ? void 0 : t.media; !i || i.ended ? r.scheduleRefresh(e, 1e3 * r.timeToLoad) : r.loadSteeringManifest(e) } ), t) } , i(t, [{ key: "pathwayPriority", get: function() { return this._pathwayPriority }, set: function(e) { this.updatePathwayPriority(e) } }]) }(N); function ws(e, t, r, i) { e && Object.keys(t).forEach((function(n) { var s = e.filter((function(e) { return e.groupId === n } )).map((function(e) { var s = a({}, e); return s.details = void 0, s.attrs = new pr(s.attrs), s.url = s.attrs.URI = Os(e.url, e.attrs["STABLE-RENDITION-ID"], "PER-RENDITION-URIS", r), s.groupId = s.attrs["GROUP-ID"] = t[n], s.attrs["PATHWAY-ID"] = i, s } )); e.push.apply(e, s) } )) } function Os(e, t, r, i) { var n, a = i.HOST, s = i.PARAMS, o = i[r]; t && (n = null == o ? void 0 : o[t]) && (e = n); var l = new self.URL(e); return a && !n && (l.host = a), s && Object.keys(s).sort().forEach((function(e) { e && l.searchParams.set(e, s[e]) } )), l.href } var xs = function(e) { function t(r) { var i; return (i = e.call(this, "eme", r.logger) || this).hls = void 0, i.config = void 0, i.media = null, i.keyFormatPromise = null, i.keySystemAccessPromises = {}, i._requestLicenseFailureCount = 0, i.mediaKeySessions = [], i.keyIdToKeySessionPromise = {}, i.mediaKeys = null, i.setMediaKeysQueue = t.CDMCleanupPromise ? [t.CDMCleanupPromise] : [], i.bannedKeyIds = {}, i.onMediaEncrypted = function(e) { var t = e.initDataType , r = e.initData , n = '"' + e.type + '" event: init data type: "' + t + '"'; if (i.debug(n), null !== r) { if (!i.keyFormatPromise) { var a = Object.keys(i.keySystemAccessPromises); a.length || (a = Nr(i.config)); var s = a.map(Fr).filter((function(e) { return !!e } )); i.keyFormatPromise = i.getKeyFormatPromise(s) } i.keyFormatPromise.then((function(a) { var s = Mr(a); if ("sinf" === t && s === Pr.FAIRPLAY) { var o; try { var l = le(new Uint8Array(r)) , u = Se(Rr(JSON.parse(l).sinf)); if (!u) throw new Error("'schm' box missing or not cbcs/cenc with schi > tenc"); o = new Uint8Array(u.subarray(8, 24)) } catch (e) { return void i.warn(n + " Failed to parse sinf: " + e) } for (var d, h = X(o), f = i, c = f.keyIdToKeySessionPromise, g = f.mediaKeySessions, v = c[h], m = function() { var e = g[p] , n = e.decryptdata; if (!n.keyId) return 0; var a = X(n.keyId); return Sr(o, n.keyId) || -1 !== n.uri.replace(/-/g, "").indexOf(h) ? (v = c[a]) ? (n.pssh || (delete c[a], n.pssh = new Uint8Array(r), n.keyId = o, (v = c[h] = v.then((function() { return i.generateRequestWithPreferredKeySession(e, t, r, "encrypted-event-key-match") } ))).catch((function(e) { return i.handleError(e) } ))), 1) : 0 : void 0 }, p = 0; p < g.length && (0 === (d = m()) || 1 !== d); p++) ; v || i.handleError(new Error("Key ID " + h + " not encountered in playlist. Key-system sessions " + g.length + ".")) } else i.log('Ignoring "' + e.type + '" event with init data type: "' + t + '" for selected key-system ' + s) } )).catch((function(e) { return i.handleError(e) } )) } } , i.onWaitingForKey = function(e) { i.log('"' + e.type + '" event') } , i.hls = r, i.config = r.config, i.registerListeners(), i } o(t, e); var r = t.prototype; return r.destroy = function() { this.onDestroying(), this.onMediaDetached(); var e = this.config; e.requestMediaKeySystemAccessFunc = null, e.licenseXhrSetup = e.licenseResponseCallback = void 0, e.drmSystems = e.drmSystemOptions = {}, this.hls = this.config = this.keyIdToKeySessionPromise = null, this.onMediaEncrypted = this.onWaitingForKey = null } , r.registerListeners = function() { this.hls.on(b.MEDIA_ATTACHED, this.onMediaAttached, this), this.hls.on(b.MEDIA_DETACHED, this.onMediaDetached, this), this.hls.on(b.MANIFEST_LOADING, this.onManifestLoading, this), this.hls.on(b.MANIFEST_LOADED, this.onManifestLoaded, this), this.hls.on(b.DESTROYING, this.onDestroying, this) } , r.unregisterListeners = function() { this.hls.off(b.MEDIA_ATTACHED, this.onMediaAttached, this), this.hls.off(b.MEDIA_DETACHED, this.onMediaDetached, this), this.hls.off(b.MANIFEST_LOADING, this.onManifestLoading, this), this.hls.off(b.MANIFEST_LOADED, this.onManifestLoaded, this), this.hls.off(b.DESTROYING, this.onDestroying, this) } , r.getLicenseServerUrl = function(e) { var t = this.config , r = t.drmSystems , i = t.widevineLicenseUrl , n = null == r ? void 0 : r[e]; return n ? n.licenseUrl : e === Pr.WIDEVINE && i ? i : void 0 } , r.getLicenseServerUrlOrThrow = function(e) { var t = this.getLicenseServerUrl(e); if (void 0 === t) throw new Error('no license server URL configured for key-system "' + e + '"'); return t } , r.getServerCertificateUrl = function(e) { var t = this.config.drmSystems , r = null == t ? void 0 : t[e]; if (r) return r.serverCertificateUrl; this.log('No Server Certificate in config.drmSystems["' + e + '"]') } , r.attemptKeySystemAccess = function(e) { var t = this , r = this.hls.levels , i = function(e, t, r) { return !!e && r.indexOf(e) === t } , n = r.map((function(e) { return e.audioCodec } )).filter(i) , a = r.map((function(e) { return e.videoCodec } )).filter(i); return n.length + a.length === 0 && a.push("avc1.42e01e"), new Promise((function(r, i) { var s = function(e) { var o = e.shift(); t.getMediaKeysPromise(o, n, a).then((function(e) { return r({ keySystem: o, mediaKeys: e }) } )).catch((function(t) { e.length ? s(e) : i(t instanceof Ns ? t : new Ns({ type: R.KEY_SYSTEM_ERROR, details: k.KEY_SYSTEM_NO_ACCESS, error: t, fatal: !0 },t.message)) } )) }; s(e) } )) } , r.requestMediaKeySystemAccess = function(e, t) { var r = this.config.requestMediaKeySystemAccessFunc; if ("function" != typeof r) { var i = "Configured requestMediaKeySystemAccess is not a function " + r; return null === Br && "http:" === self.location.protocol && (i = "navigator.requestMediaKeySystemAccess is not available over insecure protocol " + location.protocol), Promise.reject(new Error(i)) } return r(e, t) } , r.getMediaKeysPromise = function(e, t, r) { var i, n = this, a = function(e, t, r, i) { var n; switch (e) { case Pr.FAIRPLAY: n = ["cenc", "sinf"]; break; case Pr.WIDEVINE: case Pr.PLAYREADY: n = ["cenc"]; break; case Pr.CLEARKEY: n = ["cenc", "keyids"]; break; default: throw new Error("Unknown key-system: " + e) } return function(e, t, r, i) { return [{ initDataTypes: e, persistentState: i.persistentState || "optional", distinctiveIdentifier: i.distinctiveIdentifier || "optional", sessionTypes: i.sessionTypes || [i.sessionType || "temporary"], audioCapabilities: t.map((function(e) { return { contentType: "audio/mp4; codecs=" + e, robustness: i.audioRobustness || "", encryptionScheme: i.audioEncryptionScheme || null } } )), videoCapabilities: r.map((function(e) { return { contentType: "video/mp4; codecs=" + e, robustness: i.videoRobustness || "", encryptionScheme: i.videoEncryptionScheme || null } } )) }] }(n, t, r, i) }(e, t, r, this.config.drmSystemOptions || {}), s = this.keySystemAccessPromises[e], o = null == (i = s) ? void 0 : i.keySystemAccess; if (!o) { this.log('Requesting encrypted media "' + e + '" key-system access with config: ' + lt(a)), o = this.requestMediaKeySystemAccess(e, a); var l = s = this.keySystemAccessPromises[e] = { keySystemAccess: o }; return o.catch((function(t) { n.log('Failed to obtain access to key-system "' + e + '": ' + t) } )), o.then((function(t) { n.log('Access for key-system "' + t.keySystem + '" obtained'); var r = n.fetchServerCertificate(e); n.log('Create media-keys for "' + e + '"'); var i = l.mediaKeys = t.createMediaKeys().then((function(t) { return n.log('Media-keys created for "' + e + '"'), l.hasMediaKeys = !0, r.then((function(r) { return r ? n.setMediaKeysServerCertificate(t, e, r) : t } )) } )); return i.catch((function(t) { n.error('Failed to create media-keys for "' + e + '"}: ' + t) } )), i } )) } return o.then((function() { return s.mediaKeys } )) } , r.createMediaKeySessionContext = function(e) { var t = e.decryptdata , r = e.keySystem , i = e.mediaKeys; this.log('Creating key-system session "' + r + '" keyId: ' + X(t.keyId || []) + " keyUri: " + t.uri); var n = i.createSession() , a = { decryptdata: t, keySystem: r, mediaKeys: i, mediaKeysSession: n, keyStatus: "status-pending" }; return this.mediaKeySessions.push(a), a } , r.renewKeySession = function(e) { var t = e.decryptdata; if (t.pssh) { var r = this.createMediaKeySessionContext(e) , i = Ms(t); this.keyIdToKeySessionPromise[i] = this.generateRequestWithPreferredKeySession(r, "cenc", t.pssh.buffer, "expired") } else this.warn("Could not renew expired session. Missing pssh initData."); this.removeSession(e) } , r.updateKeySession = function(e, t) { var r = e.mediaKeysSession; return this.log('Updating key-session "' + r.sessionId + '" for keyId ' + X(e.decryptdata.keyId || []) + "\n } (data length: " + t.byteLength + ")"), r.update(t) } , r.getSelectedKeySystemFormats = function() { var e = this; return Object.keys(this.keySystemAccessPromises).map((function(t) { return { keySystem: t, hasMediaKeys: e.keySystemAccessPromises[t].hasMediaKeys } } )).filter((function(e) { return !!e.hasMediaKeys } )).map((function(e) { return Fr(e.keySystem) } )).filter((function(e) { return !!e } )) } , r.getKeySystemAccess = function(e) { var t = this; return this.getKeySystemSelectionPromise(e).then((function(e) { var r = e.keySystem , i = e.mediaKeys; return t.attemptSetMediaKeys(r, i) } )) } , r.selectKeySystem = function(e) { var t = this; return new Promise((function(r, i) { t.getKeySystemSelectionPromise(e).then((function(e) { var t = e.keySystem , n = Fr(t); n ? r(n) : i(new Error('Unable to find format for key-system "' + t + '"')) } )).catch(i) } )) } , r.selectKeySystemFormat = function(e) { var t = Object.keys(e.levelkeys || {}); return this.keyFormatPromise || (this.log("Selecting key-system from fragment (sn: " + e.sn + " " + e.type + ": " + e.level + ") key formats " + t.join(", ")), this.keyFormatPromise = this.getKeyFormatPromise(t)), this.keyFormatPromise } , r.getKeyFormatPromise = function(e) { var t = Nr(this.config) , r = e.map(Mr).filter((function(e) { return !!e && -1 !== t.indexOf(e) } )); return this.selectKeySystem(r) } , r.getKeyStatus = function(e) { for (var t = this.mediaKeySessions, r = 0; r < t.length; r++) { var i = Fs(e, t[r]); if (i) return i } } , r.loadKey = function(e) { var t = this , r = e.keyInfo.decryptdata , i = Ms(r) , n = this.bannedKeyIds[i]; if (n || "internal-error" === this.getKeyStatus(r)) { var a = Us(n || "internal-error", r); return this.handleError(a, e.frag), Promise.reject(a) } var s = "(keyId: " + i + ' format: "' + r.keyFormat + '" method: ' + r.method + " uri: " + r.uri + ")"; this.log("Starting session for key " + s); var o = this.keyIdToKeySessionPromise[i]; if (!o) { var l = this.getKeySystemForKeyPromise(r).then((function(i) { var n = i.keySystem , a = i.mediaKeys; return t.throwIfDestroyed(), t.log("Handle encrypted media sn: " + e.frag.sn + " " + e.frag.type + ": " + e.frag.level + " using key " + s), t.attemptSetMediaKeys(n, a).then((function() { return t.throwIfDestroyed(), t.createMediaKeySessionContext({ keySystem: n, mediaKeys: a, decryptdata: r }) } )) } )).then((function(e) { var i = r.pssh ? r.pssh.buffer : null; return t.generateRequestWithPreferredKeySession(e, "cenc", i, "playlist-key") } )); return l.catch((function(r) { return t.handleError(r, e.frag) } )), this.keyIdToKeySessionPromise[i] = l, l } return o.catch((function(i) { if (i instanceof Ns) { var n = d({}, i.data); "internal-error" === t.getKeyStatus(r) && (n.decryptdata = r); var a = new Ns(n,i.message); t.handleError(a, e.frag) } } )), o } , r.throwIfDestroyed = function(e) { if (!this.hls) throw new Error("invalid state") } , r.handleError = function(e, t) { if (this.hls) if (e instanceof Ns) { t && (e.data.frag = t); var r = e.data.decryptdata; this.error(e.message + (r ? " (" + X(r.keyId || []) + ")" : "")), this.hls.trigger(b.ERROR, e.data) } else this.error(e.message), this.hls.trigger(b.ERROR, { type: R.KEY_SYSTEM_ERROR, details: k.KEY_SYSTEM_NO_KEYS, error: e, fatal: !0 }) } , r.getKeySystemForKeyPromise = function(e) { var t = Ms(e) , r = this.keyIdToKeySessionPromise[t]; if (!r) { var i = Mr(e.keyFormat) , n = i ? [i] : Nr(this.config); return this.attemptKeySystemAccess(n) } return r } , r.getKeySystemSelectionPromise = function(e) { if (e.length || (e = Nr(this.config)), 0 === e.length) throw new Ns({ type: R.KEY_SYSTEM_ERROR, details: k.KEY_SYSTEM_NO_CONFIGURED_LICENSE, fatal: !0 },"Missing key-system license configuration options " + lt({ drmSystems: this.config.drmSystems })); return this.attemptKeySystemAccess(e) } , r.attemptSetMediaKeys = function(e, t) { var r = this; if (this.mediaKeys === t) return Promise.resolve(); var i = this.setMediaKeysQueue.slice(); this.log('Setting media-keys for "' + e + '"'); var n = Promise.all(i).then((function() { if (!r.media) throw r.mediaKeys = null, new Error("Attempted to set mediaKeys without media element attached"); return r.media.setMediaKeys(t) } )); return this.mediaKeys = t, this.setMediaKeysQueue.push(n), n.then((function() { r.log('Media-keys set for "' + e + '"'), i.push(n), r.setMediaKeysQueue = r.setMediaKeysQueue.filter((function(e) { return -1 === i.indexOf(e) } )) } )) } , r.generateRequestWithPreferredKeySession = function(e, t, r, i) { var n, a = this, s = null == (n = this.config.drmSystems) || null == (n = n[e.keySystem]) ? void 0 : n.generateRequest; if (s) try { var o = s.call(this.hls, t, r, e); if (!o) throw new Error("Invalid response from configured generateRequest filter"); t = o.initDataType, r = o.initData ? o.initData : null, e.decryptdata.pssh = r ? new Uint8Array(r) : null } catch (e) { if (this.warn(e.message), this.hls && this.hls.config.debug) throw e } if (null === r) return this.log('Skipping key-session request for "' + i + '" (no initData)'), Promise.resolve(e); var l = Ms(e.decryptdata) , u = e.decryptdata.uri; this.log('Generating key-session request for "' + i + '" keyId: ' + l + " URI: " + u + " (init data type: " + t + " length: " + r.byteLength + ")"); var d = new E , h = e._onmessage = function(t) { var r = e.mediaKeysSession; if (r) { var i = t.messageType , n = t.message; a.log('"' + i + '" message event for session "' + r.sessionId + '" message size: ' + n.byteLength), "license-request" === i || "license-renewal" === i ? a.renewLicense(e, n).catch((function(e) { d.eventNames().length ? d.emit("error", e) : a.handleError(e) } )) : "license-release" === i ? e.keySystem === Pr.FAIRPLAY && a.updateKeySession(e, kr("acknowledged")).then((function() { return a.removeSession(e) } )).catch((function(e) { return a.handleError(e) } )) : a.warn('unhandled media key message type "' + i + '"') } else d.emit("error", new Error("invalid state")) } , f = function(e, t) { var r; t.keyStatus = e, e.startsWith("usable") ? d.emit("resolved") : "internal-error" === e || "output-restricted" === e || "output-downscaled" === e ? r = Us(e, t.decryptdata) : "expired" === e ? r = new Error("key expired (keyId: " + l + ")") : "released" === e ? r = new Error("key released") : "status-pending" === e || a.warn('unhandled key status change "' + e + '" (keyId: ' + l + ")"), r && (d.eventNames().length ? d.emit("error", r) : a.handleError(r)) } , c = e._onkeystatuseschange = function(t) { if (e.mediaKeysSession) { var r = a.getKeyStatuses(e); if (Object.keys(r).some((function(e) { return "status-pending" !== r[e] } ))) { if ("expired" === r[l]) return a.log("Expired key " + lt(r) + ' in key-session "' + e.mediaKeysSession.sessionId + '"'), void a.renewKeySession(e); var i, n = r[l]; if (n) f(n, e); else e.keyStatusTimeouts || (e.keyStatusTimeouts = {}), (i = e.keyStatusTimeouts)[l] || (i[l] = self.setTimeout((function() { if (e.mediaKeysSession && a.mediaKeys) { var t = a.getKeyStatus(e.decryptdata); if (t && "status-pending" !== t) return a.log("No status for keyId " + l + ' in key-session "' + e.mediaKeysSession.sessionId + '". Using session key-status ' + t + " from other session."), f(t, e); a.log("key status for " + l + ' in key-session "' + e.mediaKeysSession.sessionId + '" timed out after 0ms'), f(n = "internal-error", e) } } ), 0)), a.log("No status for keyId " + l + " (" + lt(r) + ").") } } else d.emit("error", new Error("invalid state")) } ; Li(e.mediaKeysSession, "message", h), Li(e.mediaKeysSession, "keystatuseschange", c); var g = new Promise((function(e, t) { d.on("error", t), d.on("resolved", e) } )); return e.mediaKeysSession.generateRequest(t, r).then((function() { a.log('Request generated for key-session "' + e.mediaKeysSession.sessionId + '" keyId: ' + l + " URI: " + u) } )).catch((function(t) { throw new Ns({ type: R.KEY_SYSTEM_ERROR, details: k.KEY_SYSTEM_NO_SESSION, error: t, decryptdata: e.decryptdata, fatal: !1 },"Error generating key-session request: " + t) } )).then((function() { return g } )).catch((function(t) { return d.removeAllListeners(), a.removeSession(e).then((function() { throw t } )) } )).then((function() { return d.removeAllListeners(), e } )) } , r.getKeyStatuses = function(e) { var t = this , r = {}; return e.mediaKeysSession.keyStatuses.forEach((function(i, n) { if ("string" == typeof n && "object" == typeof i) { var a = n; n = i, i = a } var s = "buffer"in n ? new Uint8Array(n.buffer,n.byteOffset,n.byteLength) : new Uint8Array(n); e.keySystem === Pr.PLAYREADY && 16 === s.length && br(s); var o = X(s); "internal-error" === i && (t.bannedKeyIds[o] = i), t.log('key status change "' + i + '" for keyStatuses keyId: ' + o + ' key-session "' + e.mediaKeysSession.sessionId + '"'), r[o] = i } )), r } , r.fetchServerCertificate = function(e) { var t = this.config , r = new (0, t.loader)(t) , i = this.getServerCertificateUrl(e); return i ? (this.log('Fetching server certificate for "' + e + '"'), new Promise((function(n, a) { var s = { responseType: "arraybuffer", url: i } , o = t.certLoadPolicy.default , l = { loadPolicy: o, timeout: o.maxLoadTimeMs, maxRetry: 0, retryDelay: 0, maxRetryDelay: 0 } , u = { onSuccess: function(e, t, r, i) { n(e.data) }, onError: function(t, r, n, o) { a(new Ns({ type: R.KEY_SYSTEM_ERROR, details: k.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED, fatal: !0, networkDetails: n, response: d({ url: s.url, data: void 0 }, t) },'"' + e + '" certificate request failed (' + i + "). Status: " + t.code + " (" + t.text + ")")) }, onTimeout: function(t, r, n) { a(new Ns({ type: R.KEY_SYSTEM_ERROR, details: k.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED, fatal: !0, networkDetails: n, response: { url: s.url, data: void 0 } },'"' + e + '" certificate request timed out (' + i + ")")) }, onAbort: function(e, t, r) { a(new Error("aborted")) } }; r.load(s, l, u) } ))) : Promise.resolve() } , r.setMediaKeysServerCertificate = function(e, t, r) { var i = this; return new Promise((function(n, a) { e.setServerCertificate(r).then((function(a) { i.log("setServerCertificate " + (a ? "success" : "not supported by CDM") + " (" + r.byteLength + ') on "' + t + '"'), n(e) } )).catch((function(e) { a(new Ns({ type: R.KEY_SYSTEM_ERROR, details: k.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED, error: e, fatal: !0 },e.message)) } )) } )) } , r.renewLicense = function(e, t) { var r = this; return this.requestLicense(e, new Uint8Array(t)).then((function(t) { return r.updateKeySession(e, new Uint8Array(t)).catch((function(t) { throw new Ns({ type: R.KEY_SYSTEM_ERROR, details: k.KEY_SYSTEM_SESSION_UPDATE_FAILED, decryptdata: e.decryptdata, error: t, fatal: !1 },t.message) } )) } )) } , r.unpackPlayReadyKeyMessage = function(e, t) { var r = String.fromCharCode.apply(null, new Uint16Array(t.buffer)); if (!r.includes("PlayReadyKeyMessage")) return e.setRequestHeader("Content-Type", "text/xml; charset=utf-8"), t; var i = (new DOMParser).parseFromString(r, "application/xml") , n = i.querySelectorAll("HttpHeader"); if (n.length > 0) for (var a, s = 0, o = n.length; s < o; s++) { var l, u, d = null == (l = (a = n[s]).querySelector("name")) ? void 0 : l.textContent, h = null == (u = a.querySelector("value")) ? void 0 : u.textContent; d && h && e.setRequestHeader(d, h) } var f = i.querySelector("Challenge") , c = null == f ? void 0 : f.textContent; if (!c) throw new Error("Cannot find in key message"); return kr(atob(c)) } , r.setupLicenseXHR = function(e, t, r, i) { var n = this , a = this.config.licenseXhrSetup; return a ? Promise.resolve().then((function() { if (!r.decryptdata) throw new Error("Key removed"); return a.call(n.hls, e, t, r, i) } )).catch((function(s) { if (!r.decryptdata) throw s; return e.open("POST", t, !0), a.call(n.hls, e, t, r, i) } )).then((function(r) { return e.readyState || e.open("POST", t, !0), { xhr: e, licenseChallenge: r || i } } )) : (e.open("POST", t, !0), Promise.resolve({ xhr: e, licenseChallenge: i })) } , r.requestLicense = function(e, t) { var r = this , i = this.config.keyLoadPolicy.default; return new Promise((function(n, a) { var s = r.getLicenseServerUrlOrThrow(e.keySystem); r.log("Sending license request to URL: " + s); var o = new XMLHttpRequest; o.responseType = "arraybuffer", o.onreadystatechange = function() { if (!r.hls || !e.mediaKeysSession) return a(new Error("invalid state")); if (4 === o.readyState) if (200 === o.status) { r._requestLicenseFailureCount = 0; var l = o.response; r.log("License received " + (l instanceof ArrayBuffer ? l.byteLength : l)); var u = r.config.licenseResponseCallback; if (u) try { l = u.call(r.hls, o, s, e) } catch (e) { r.error(e) } n(l) } else { var d = i.errorRetry , h = d ? d.maxNumRetry : 0; if (r._requestLicenseFailureCount++, r._requestLicenseFailureCount > h || o.status >= 400 && o.status < 500) a(new Ns({ type: R.KEY_SYSTEM_ERROR, details: k.KEY_SYSTEM_LICENSE_REQUEST_FAILED, decryptdata: e.decryptdata, fatal: !0, networkDetails: o, response: { url: s, data: void 0, code: o.status, text: o.statusText } },"License Request XHR failed (" + s + "). Status: " + o.status + " (" + o.statusText + ")")); else { var f = h - r._requestLicenseFailureCount + 1; r.warn("Retrying license request, " + f + " attempts left"), r.requestLicense(e, t).then(n, a) } } } , e.licenseXhr && e.licenseXhr.readyState !== XMLHttpRequest.DONE && e.licenseXhr.abort(), e.licenseXhr = o, r.setupLicenseXHR(o, s, e, t).then((function(t) { var i = t.xhr , n = t.licenseChallenge; e.keySystem == Pr.PLAYREADY && (n = r.unpackPlayReadyKeyMessage(i, n)), i.send(n) } )).catch(a) } )) } , r.onDestroying = function() { this.unregisterListeners(), this._clear() } , r.onMediaAttached = function(e, t) { if (this.config.emeEnabled) { var r = t.media; this.media = r, Li(r, "encrypted", this.onMediaEncrypted), Li(r, "waitingforkey", this.onWaitingForKey) } } , r.onMediaDetached = function() { var e = this.media; e && (Ii(e, "encrypted", this.onMediaEncrypted), Ii(e, "waitingforkey", this.onWaitingForKey), this.media = null, this.mediaKeys = null) } , r._clear = function() { var e, r = this; if (this._requestLicenseFailureCount = 0, this.keyIdToKeySessionPromise = {}, this.bannedKeyIds = {}, this.mediaKeys || this.mediaKeySessions.length) { var i = this.media , n = this.mediaKeySessions.slice(); this.mediaKeySessions = [], this.mediaKeys = null, Kr.clearKeyUriToKeyIdMap(); var a = n.length; t.CDMCleanupPromise = Promise.all(n.map((function(e) { return r.removeSession(e) } )).concat((null == i || null == (e = i.setMediaKeys(null)) ? void 0 : e.catch((function(e) { r.log("Could not clear media keys: " + e), r.hls && r.hls.trigger(b.ERROR, { type: R.OTHER_ERROR, details: k.KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR, fatal: !1, error: new Error("Could not clear media keys: " + e) }) } ))) || Promise.resolve())).catch((function(e) { r.log("Could not close sessions and clear media keys: " + e), r.hls && r.hls.trigger(b.ERROR, { type: R.OTHER_ERROR, details: k.KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR, fatal: !1, error: new Error("Could not close sessions and clear media keys: " + e) }) } )).then((function() { a && r.log("finished closing key sessions and clearing media keys") } )) } } , r.onManifestLoading = function() { this.keyFormatPromise = null, this.bannedKeyIds = {} } , r.onManifestLoaded = function(e, t) { var r = t.sessionKeys; if (r && this.config.emeEnabled && !this.keyFormatPromise) { var i = r.reduce((function(e, t) { return -1 === e.indexOf(t.keyFormat) && e.push(t.keyFormat), e } ), []); this.log("Selecting key-system from session-keys " + i.join(", ")), this.keyFormatPromise = this.getKeyFormatPromise(i) } } , r.removeSession = function(e) { var t = this , r = e.mediaKeysSession , i = e.licenseXhr , n = e.decryptdata; if (r) { this.log('Remove licenses and keys and close session "' + r.sessionId + '" keyId: ' + X((null == n ? void 0 : n.keyId) || [])), e._onmessage && (r.removeEventListener("message", e._onmessage), e._onmessage = void 0), e._onkeystatuseschange && (r.removeEventListener("keystatuseschange", e._onkeystatuseschange), e._onkeystatuseschange = void 0), i && i.readyState !== XMLHttpRequest.DONE && i.abort(), e.mediaKeysSession = e.decryptdata = e.licenseXhr = void 0; var a = this.mediaKeySessions.indexOf(e); a > -1 && this.mediaKeySessions.splice(a, 1); var s = e.keyStatusTimeouts; s && Object.keys(s).forEach((function(e) { return self.clearTimeout(s[e]) } )); var o = function(e) { var t; return !(!e || "persistent-license" !== e.sessionType && (null == (t = e.sessionTypes) || !t.some((function(e) { return "persistent-license" === e } )))) }(this.config.drmSystemOptions) ? new Promise((function(e, t) { self.setTimeout((function() { return t(new Error("MediaKeySession.remove() timeout")) } ), 8e3), r.remove().then(e).catch(t) } )) : Promise.resolve(); return o.catch((function(e) { t.log("Could not remove session: " + e), t.hls && t.hls.trigger(b.ERROR, { type: R.OTHER_ERROR, details: k.KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR, fatal: !1, error: new Error("Could not remove session: " + e) }) } )).then((function() { return r.close() } )).catch((function(e) { t.log("Could not close session: " + e), t.hls && t.hls.trigger(b.ERROR, { type: R.OTHER_ERROR, details: k.KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR, fatal: !1, error: new Error("Could not close session: " + e) }) } )) } return Promise.resolve() } , t }(N); function Ms(e) { if (!e) throw new Error("Could not read keyId of undefined decryptdata"); if (null === e.keyId) throw new Error("keyId is null"); return X(e.keyId) } function Fs(e, t) { return e.keyId && t.mediaKeysSession.keyStatuses.has(e.keyId) ? t.mediaKeysSession.keyStatuses.get(e.keyId) : e.matches(t.decryptdata) ? t.keyStatus : void 0 } xs.CDMCleanupPromise = void 0; var Ns = function(e) { function t(t, r) { var i; return (i = e.call(this, r) || this).data = void 0, t.error || (t.error = new Error(r)), i.data = t, t.err = t.error, i } return o(t, e), t }(c(Error)); function Us(e, t) { var r = "output-restricted" === e , i = r ? k.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED : k.KEY_SYSTEM_STATUS_INTERNAL_ERROR; return new Ns({ type: R.KEY_SYSTEM_ERROR, details: i, fatal: !1, decryptdata: t },r ? "HDCP level output restricted" : 'key status changed to "' + e + '"') } var Bs = function() { function e(e) { this.hls = void 0, this.isVideoPlaybackQualityAvailable = !1, this.timer = void 0, this.media = null, this.lastTime = void 0, this.lastDroppedFrames = 0, this.lastDecodedFrames = 0, this.streamController = void 0, this.hls = e, this.registerListeners() } var t = e.prototype; return t.setStreamController = function(e) { this.streamController = e } , t.registerListeners = function() { this.hls.on(b.MEDIA_ATTACHING, this.onMediaAttaching, this), this.hls.on(b.MEDIA_DETACHING, this.onMediaDetaching, this) } , t.unregisterListeners = function() { this.hls.off(b.MEDIA_ATTACHING, this.onMediaAttaching, this), this.hls.off(b.MEDIA_DETACHING, this.onMediaDetaching, this) } , t.destroy = function() { this.timer && clearInterval(this.timer), this.unregisterListeners(), this.isVideoPlaybackQualityAvailable = !1, this.media = null } , t.onMediaAttaching = function(e, t) { var r = this.hls.config; if (r.capLevelOnFPSDrop) { var i = t.media instanceof self.HTMLVideoElement ? t.media : null; this.media = i, i && "function" == typeof i.getVideoPlaybackQuality && (this.isVideoPlaybackQualityAvailable = !0), self.clearInterval(this.timer), this.timer = self.setInterval(this.checkFPSInterval.bind(this), r.fpsDroppedMonitoringPeriod) } } , t.onMediaDetaching = function() { this.media = null } , t.checkFPS = function(e, t, r) { var i = performance.now(); if (t) { if (this.lastTime) { var n = i - this.lastTime , a = r - this.lastDroppedFrames , s = t - this.lastDecodedFrames , o = 1e3 * a / n , l = this.hls; if (l.trigger(b.FPS_DROP, { currentDropped: a, currentDecoded: s, totalDroppedFrames: r }), o > 0 && a > l.config.fpsDroppedMonitoringThreshold * s) { var u = l.currentLevel; l.logger.warn("drop FPS ratio greater than max allowed value for currentLevel: " + u), u > 0 && (-1 === l.autoLevelCapping || l.autoLevelCapping >= u) && (u -= 1, l.trigger(b.FPS_DROP_LEVEL_CAPPING, { level: u, droppedLevel: l.currentLevel }), l.autoLevelCapping = u, this.streamController.nextLevelSwitch()) } } this.lastTime = i, this.lastDroppedFrames = r, this.lastDecodedFrames = t } } , t.checkFPSInterval = function() { var e = this.media; if (e) if (this.isVideoPlaybackQualityAvailable) { var t = e.getVideoPlaybackQuality(); this.checkFPS(e, t.totalVideoFrames, t.droppedVideoFrames) } else this.checkFPS(e, e.webkitDecodedFrameCount, e.webkitDroppedFrameCount) } , e }(); function Gs(e) { for (var t = 5381, r = e.length; r; ) t = 33 * t ^ e.charCodeAt(--r); return (t >>> 0).toString() } var Ks = .025 , Vs = function(e) { return e[e.Point = 0] = "Point", e[e.Range = 1] = "Range", e }({}); function Hs(e, t, r) { return e.identifier + "-" + (r + 1) + "-" + Gs(t) } var Ys = function() { function e(e, t) { this.base = void 0, this._duration = null, this._timelineStart = null, this.appendInPlaceDisabled = void 0, this.appendInPlaceStarted = void 0, this.dateRange = void 0, this.hasPlayed = !1, this.cumulativeDuration = 0, this.resumeOffset = NaN, this.playoutLimit = NaN, this.restrictions = { skip: !1, jump: !1 }, this.snapOptions = { out: !1, in: !1 }, this.assetList = [], this.assetListLoader = void 0, this.assetListResponse = null, this.resumeAnchor = void 0, this.error = void 0, this.resetOnResume = void 0, this.base = t, this.dateRange = e, this.setDateRange(e) } var t = e.prototype; return t.setDateRange = function(e) { this.dateRange = e, this.resumeOffset = e.attr.optionalFloat("X-RESUME-OFFSET", this.resumeOffset), this.playoutLimit = e.attr.optionalFloat("X-PLAYOUT-LIMIT", this.playoutLimit), this.restrictions = e.attr.enumeratedStringList("X-RESTRICT", this.restrictions), this.snapOptions = e.attr.enumeratedStringList("X-SNAP", this.snapOptions) } , t.reset = function() { var e; this.appendInPlaceStarted = !1, null == (e = this.assetListLoader) || e.destroy(), this.assetListLoader = void 0, this.supplementsPrimary || (this.assetListResponse = null, this.assetList = [], this._duration = null) } , t.isAssetPastPlayoutLimit = function(e) { var t; if (e > 0 && e >= this.assetList.length) return !0; var r = this.playoutLimit; return !(e <= 0 || isNaN(r)) && (0 === r || ((null == (t = this.assetList[e]) ? void 0 : t.startOffset) || 0) > r) } , t.findAssetIndex = function(e) { return this.assetList.indexOf(e) } , t.toString = function() { return '["' + (e = this).identifier + '" ' + (e.cue.pre ? "
" : e.cue.post ? "" : "") + e.timelineStart.toFixed(2) + "-" + e.resumeTime.toFixed(2) + "]";
                var e
            }
            ,
            i(e, [{
                key: "identifier",
                get: function() {
                    return this.dateRange.id
                }
            }, {
                key: "startDate",
                get: function() {
                    return this.dateRange.startDate
                }
            }, {
                key: "startTime",
                get: function() {
                    var e = this.dateRange.startTime;
                    if (this.snapOptions.out) {
                        var t = this.dateRange.tagAnchor;
                        if (t)
                            return Ws(e, t)
                    }
                    return e
                }
            }, {
                key: "startOffset",
                get: function() {
                    return this.cue.pre ? 0 : this.startTime
                }
            }, {
                key: "startIsAligned",
                get: function() {
                    if (0 === this.startTime || this.snapOptions.out)
                        return !0;
                    var e = this.dateRange.tagAnchor;
                    if (e) {
                        var t = this.dateRange.startTime;
                        return t - Ws(t, e) < .1
                    }
                    return !1
                }
            }, {
                key: "resumptionOffset",
                get: function() {
                    var e = this.resumeOffset
                      , t = A(e) ? e : this.duration;
                    return this.cumulativeDuration + t
                }
            }, {
                key: "resumeTime",
                get: function() {
                    var e = this.startOffset + this.resumptionOffset;
                    if (this.snapOptions.in) {
                        var t = this.resumeAnchor;
                        if (t)
                            return Ws(e, t)
                    }
                    return e
                }
            }, {
                key: "appendInPlace",
                get: function() {
                    return !!this.appendInPlaceStarted || !this.appendInPlaceDisabled && !(this.cue.once || this.cue.pre || !this.startIsAligned || !(isNaN(this.playoutLimit) && isNaN(this.resumeOffset) || this.resumeOffset && this.duration && Math.abs(this.resumeOffset - this.duration) < Ks))
                },
                set: function(e) {
                    this.appendInPlaceStarted ? this.resetOnResume = !e : this.appendInPlaceDisabled = !e
                }
            }, {
                key: "timelineStart",
                get: function() {
                    return null !== this._timelineStart ? this._timelineStart : this.startTime
                },
                set: function(e) {
                    this._timelineStart = e
                }
            }, {
                key: "duration",
                get: function() {
                    var e, t = this.playoutLimit;
                    return e = null !== this._duration ? this._duration : this.dateRange.duration ? this.dateRange.duration : this.dateRange.plannedDuration || 0,
                    !isNaN(t) && t < e && (e = t),
                    e
                },
                set: function(e) {
                    this._duration = e
                }
            }, {
                key: "cue",
                get: function() {
                    return this.dateRange.cue
                }
            }, {
                key: "timelineOccupancy",
                get: function() {
                    return "RANGE" === this.dateRange.attr["X-TIMELINE-OCCUPIES"] ? Vs.Range : Vs.Point
                }
            }, {
                key: "supplementsPrimary",
                get: function() {
                    return "PRIMARY" === this.dateRange.attr["X-TIMELINE-STYLE"]
                }
            }, {
                key: "contentMayVary",
                get: function() {
                    return "NO" !== this.dateRange.attr["X-CONTENT-MAY-VARY"]
                }
            }, {
                key: "assetUrl",
                get: function() {
                    return this.dateRange.attr["X-ASSET-URI"]
                }
            }, {
                key: "assetListUrl",
                get: function() {
                    return this.dateRange.attr["X-ASSET-LIST"]
                }
            }, {
                key: "baseUrl",
                get: function() {
                    return this.base.url
                }
            }, {
                key: "assetListLoaded",
                get: function() {
                    return this.assetList.length > 0 || null !== this.assetListResponse
                }
            }])
        }();
        function Ws(e, t) {
            return e - t.start < t.duration / 2 && !(Math.abs(e - (t.start + t.duration)) < Ks) ? t.start : t.start + t.duration
        }
        function js(e, t, r) {
            var i = new self.URL(e,r);
            return "data:" !== i.protocol && i.searchParams.set("_HLS_primary_id", t),
            i
        }
        function qs(e, t) {
            for (; null != (r = e.assetList[++t]) && r.error; )
                var r;
            return t
        }
        function Xs(e) {
            var t = e.timelineStart
              , r = e.duration || 0;
            return '["' + e.identifier + '" ' + t.toFixed(2) + "-" + (t + r).toFixed(2) + "]"
        }
        var Qs = function() {
            function e(e, t, r, i) {
                var n = this;
                this.hls = void 0,
                this.interstitial = void 0,
                this.assetItem = void 0,
                this.tracks = null,
                this.hasDetails = !1,
                this.mediaAttached = null,
                this._currentTime = void 0,
                this._bufferedEosTime = void 0,
                this.checkPlayout = function() {
                    n.reachedPlayout(n.currentTime) && n.hls && n.hls.trigger(b.PLAYOUT_LIMIT_REACHED, {})
                }
                ;
                var a = this.hls = new e(t);
                this.interstitial = r,
                this.assetItem = i;
                var s = function() {
                    n.hasDetails = !0
                };
                a.once(b.LEVEL_LOADED, s),
                a.once(b.AUDIO_TRACK_LOADED, s),
                a.once(b.SUBTITLE_TRACK_LOADED, s),
                a.on(b.MEDIA_ATTACHING, (function(e, t) {
                    var r = t.media;
                    n.removeMediaListeners(),
                    n.mediaAttached = r,
                    n.interstitial.playoutLimit && (r.addEventListener("timeupdate", n.checkPlayout),
                    n.appendInPlace && a.on(b.BUFFER_APPENDED, (function() {
                        var e = n.bufferedEnd;
                        n.reachedPlayout(e) && (n._bufferedEosTime = e,
                        a.trigger(b.BUFFERED_TO_END, void 0))
                    }
                    )))
                }
                ))
            }
            var t = e.prototype;
            return t.loadSource = function() {
                var e = this.hls;
                if (e)
                    if (e.url)
                        e.levels.length && !e.started && e.startLoad(-1, !0);
                    else {
                        var t = this.assetItem.uri;
                        try {
                            t = js(t, e.config.primarySessionId || "").href
                        } catch (e) {}
                        e.loadSource(t)
                    }
            }
            ,
            t.bufferedInPlaceToEnd = function(e) {
                var t;
                if (!this.appendInPlace)
                    return !1;
                if (null != (t = this.hls) && t.bufferedToEnd)
                    return !0;
                if (!e)
                    return !1;
                var r = Math.min(this._bufferedEosTime || 1 / 0, this.duration)
                  , i = this.timelineOffset
                  , n = ur.bufferInfo(e, i, 0);
                return this.getAssetTime(n.end) >= r - .02
            }
            ,
            t.reachedPlayout = function(e) {
                var t = this.interstitial.playoutLimit;
                return this.startOffset + e >= t
            }
            ,
            t.getAssetTime = function(e) {
                var t = this.timelineOffset
                  , r = this.duration;
                return Math.min(Math.max(0, e - t), r)
            }
            ,
            t.removeMediaListeners = function() {
                var e = this.mediaAttached;
                e && (this._currentTime = e.currentTime,
                this.bufferSnapShot(),
                e.removeEventListener("timeupdate", this.checkPlayout))
            }
            ,
            t.bufferSnapShot = function() {
                var e;
                this.mediaAttached && null != (e = this.hls) && e.bufferedToEnd && (this._bufferedEosTime = this.bufferedEnd)
            }
            ,
            t.destroy = function() {
                this.removeMediaListeners(),
                this.hls && this.hls.destroy(),
                this.hls = null,
                this.tracks = this.mediaAttached = this.checkPlayout = null
            }
            ,
            t.attachMedia = function(e) {
                var t;
                this.loadSource(),
                null == (t = this.hls) || t.attachMedia(e)
            }
            ,
            t.detachMedia = function() {
                var e;
                this.removeMediaListeners(),
                this.mediaAttached = null,
                null == (e = this.hls) || e.detachMedia()
            }
            ,
            t.resumeBuffering = function() {
                var e;
                null == (e = this.hls) || e.resumeBuffering()
            }
            ,
            t.pauseBuffering = function() {
                var e;
                null == (e = this.hls) || e.pauseBuffering()
            }
            ,
            t.transferMedia = function() {
                var e;
                return this.bufferSnapShot(),
                (null == (e = this.hls) ? void 0 : e.transferMedia()) || null
            }
            ,
            t.resetDetails = function() {
                var e = this.hls;
                if (e && this.hasDetails) {
                    e.stopLoad();
                    var t = function(e) {
                        return delete e.details
                    };
                    e.levels.forEach(t),
                    e.allAudioTracks.forEach(t),
                    e.allSubtitleTracks.forEach(t),
                    this.hasDetails = !1
                }
            }
            ,
            t.on = function(e, t, r) {
                var i;
                null == (i = this.hls) || i.on(e, t)
            }
            ,
            t.once = function(e, t, r) {
                var i;
                null == (i = this.hls) || i.once(e, t)
            }
            ,
            t.off = function(e, t, r) {
                var i;
                null == (i = this.hls) || i.off(e, t)
            }
            ,
            t.toString = function() {
                var e;
                return "HlsAssetPlayer: " + Xs(this.assetItem) + " " + (null == (e = this.hls) ? void 0 : e.sessionId) + " " + (this.appendInPlace ? "append-in-place" : "")
            }
            ,
            i(e, [{
                key: "appendInPlace",
                get: function() {
                    return this.interstitial.appendInPlace
                }
            }, {
                key: "destroyed",
                get: function() {
                    var e;
                    return !(null != (e = this.hls) && e.userConfig)
                }
            }, {
                key: "assetId",
                get: function() {
                    return this.assetItem.identifier
                }
            }, {
                key: "interstitialId",
                get: function() {
                    return this.assetItem.parentIdentifier
                }
            }, {
                key: "media",
                get: function() {
                    var e;
                    return (null == (e = this.hls) ? void 0 : e.media) || null
                }
            }, {
                key: "bufferedEnd",
                get: function() {
                    var e = this.media || this.mediaAttached;
                    if (!e)
                        return this._bufferedEosTime ? this._bufferedEosTime : this.currentTime;
                    var t = ur.bufferInfo(e, e.currentTime, .001);
                    return this.getAssetTime(t.end)
                }
            }, {
                key: "currentTime",
                get: function() {
                    var e = this.media || this.mediaAttached;
                    return e ? this.getAssetTime(e.currentTime) : this._currentTime || 0
                }
            }, {
                key: "duration",
                get: function() {
                    var e = this.assetItem.duration;
                    if (!e)
                        return 0;
                    var t = this.interstitial.playoutLimit;
                    if (t) {
                        var r = t - this.startOffset;
                        if (r > 0 && r < e)
                            return r
                    }
                    return e
                }
            }, {
                key: "remaining",
                get: function() {
                    var e = this.duration;
                    return e ? Math.max(0, e - this.currentTime) : 0
                }
            }, {
                key: "startOffset",
                get: function() {
                    return this.assetItem.startOffset
                }
            }, {
                key: "timelineOffset",
                get: function() {
                    var e;
                    return (null == (e = this.hls) ? void 0 : e.config.timelineOffset) || 0
                },
                set: function(e) {
                    var t = this.timelineOffset;
                    if (e !== t) {
                        var r = e - t;
                        if (Math.abs(r) > 1 / 9e4 && this.hls) {
                            if (this.hasDetails)
                                throw new Error("Cannot set timelineOffset after playlists are loaded");
                            this.hls.config.timelineOffset = e
                        }
                    }
                }
            }])
        }()
          , zs = function(e) {
            function t(t, r) {
                var i;
                return (i = e.call(this, "interstitials-sched", r) || this).onScheduleUpdate = void 0,
                i.eventMap = {},
                i.events = null,
                i.items = null,
                i.durations = {
                    primary: 0,
                    playout: 0,
                    integrated: 0
                },
                i.onScheduleUpdate = t,
                i
            }
            o(t, e);
            var r = t.prototype;
            return r.destroy = function() {
                this.reset(),
                this.onScheduleUpdate = null
            }
            ,
            r.reset = function() {
                this.eventMap = {},
                this.setDurations(0, 0, 0),
                this.events && this.events.forEach((function(e) {
                    return e.reset()
                }
                )),
                this.events = this.items = null
            }
            ,
            r.resetErrorsInRange = function(e, t) {
                return this.events ? this.events.reduce((function(r, i) {
                    return e <= i.startOffset && t > i.startOffset ? (delete i.error,
                    r + 1) : r
                }
                ), 0) : 0
            }
            ,
            r.getEvent = function(e) {
                return e && this.eventMap[e] || null
            }
            ,
            r.hasEvent = function(e) {
                return e in this.eventMap
            }
            ,
            r.findItemIndex = function(e, t) {
                if (e.event)
                    return this.findEventIndex(e.event.identifier);
                var r = -1;
                e.nextEvent ? r = this.findEventIndex(e.nextEvent.identifier) - 1 : e.previousEvent && (r = this.findEventIndex(e.previousEvent.identifier) + 1);
                var i = this.items;
                if (i)
                    for (i[r] || (void 0 === t && (t = e.start),
                    r = this.findItemIndexAtTime(t)); r >= 0 && null != (n = i[r]) && n.event; ) {
                        var n;
                        r--
                    }
                return r
            }
            ,
            r.findItemIndexAtTime = function(e, t) {
                var r = this.items;
                if (r)
                    for (var i = 0; i < r.length; i++) {
                        var n = r[i];
                        if (t && "primary" !== t && (n = n[t]),
                        e === n.start || e > n.start && e < n.end)
                            return i
                    }
                return -1
            }
            ,
            r.findJumpRestrictedIndex = function(e, t) {
                var r = this.items;
                if (r)
                    for (var i = e; i <= t && r[i]; i++) {
                        var n = r[i].event;
                        if (null != n && n.restrictions.jump && !n.appendInPlace)
                            return i
                    }
                return -1
            }
            ,
            r.findEventIndex = function(e) {
                var t = this.items;
                if (t)
                    for (var r = t.length; r--; ) {
                        var i;
                        if ((null == (i = t[r].event) ? void 0 : i.identifier) === e)
                            return r
                    }
                return -1
            }
            ,
            r.findAssetIndex = function(e, t) {
                var r = e.assetList
                  , i = r.length;
                if (i > 1)
                    for (var n = 0; n < i; n++) {
                        var a = r[n];
                        if (!a.error) {
                            var s = a.timelineStart;
                            if (t === s || t > s && (t < s + (a.duration || 0) || n === i - 1))
                                return n
                        }
                    }
                return 0
            }
            ,
            r.parseInterstitialDateRanges = function(e, t) {
                var r = this
                  , i = e.main.details
                  , n = i.dateRanges
                  , a = this.events
                  , s = this.parseDateRanges(n, {
                    url: i.url
                }, t)
                  , o = Object.keys(n)
                  , l = a ? a.filter((function(e) {
                    return !o.includes(e.identifier)
                }
                )) : [];
                s.length && s.sort((function(e, t) {
                    var r = e.cue.pre
                      , i = e.cue.post
                      , n = t.cue.pre
                      , a = t.cue.post;
                    if (r && !n)
                        return -1;
                    if (n && !r)
                        return 1;
                    if (i && !a)
                        return 1;
                    if (a && !i)
                        return -1;
                    if (!(r || n || i || a)) {
                        var s = e.startTime
                          , o = t.startTime;
                        if (s !== o)
                            return s - o
                    }
                    return e.dateRange.tagOrder - t.dateRange.tagOrder
                }
                )),
                this.events = s,
                l.forEach((function(e) {
                    r.removeEvent(e)
                }
                )),
                this.updateSchedule(e, l)
            }
            ,
            r.updateSchedule = function(e, t, r) {
                void 0 === t && (t = []),
                void 0 === r && (r = !1);
                var i = this.events || [];
                if (i.length || t.length || this.length < 2) {
                    var n = this.items
                      , a = this.parseSchedule(i, e);
                    (r || t.length || (null == n ? void 0 : n.length) !== a.length || a.some((function(e, t) {
                        return Math.abs(e.playout.start - n[t].playout.start) > .005 || Math.abs(e.playout.end - n[t].playout.end) > .005
                    }
                    ))) && (this.items = a,
                    this.onScheduleUpdate(t, n))
                }
            }
            ,
            r.parseDateRanges = function(e, t, r) {
                for (var i = [], n = Object.keys(e), a = 0; a < n.length; a++) {
                    var s = n[a]
                      , o = e[s];
                    if (o.isInterstitial) {
                        var l = this.eventMap[s];
                        l ? l.setDateRange(o) : (l = new Ys(o,t),
                        this.eventMap[s] = l,
                        !1 === r && (l.appendInPlace = r)),
                        i.push(l)
                    }
                }
                return i
            }
            ,
            r.parseSchedule = function(e, t) {
                var r = []
                  , i = t.main.details
                  , n = i.live ? 1 / 0 : i.edge
                  , a = 0;
                if ((e = e.filter((function(e) {
                    return !(e.error || e.cue.once && e.hasPlayed)
                }
                ))).length) {
                    this.resolveOffsets(e, t);
                    var s = 0
                      , o = 0;
                    if (e.forEach((function(t, i) {
                        var l = t.cue.pre
                          , u = t.cue.post
                          , d = e[i - 1] || null
                          , h = t.appendInPlace
                          , f = u ? n : t.startOffset
                          , c = t.duration
                          , g = t.timelineOccupancy === Vs.Range ? c : 0
                          , v = t.resumptionOffset
                          , m = (null == d ? void 0 : d.startTime) === f
                          , p = f + t.cumulativeDuration
                          , y = h ? p + c : f + v;
                        if (l || !u && f <= 0) {
                            var E = o;
                            o += g,
                            t.timelineStart = p;
                            var T = a;
                            a += c,
                            r.push({
                                event: t,
                                start: p,
                                end: y,
                                playout: {
                                    start: T,
                                    end: a
                                },
                                integrated: {
                                    start: E,
                                    end: o
                                }
                            })
                        } else {
                            if (!(f <= n))
                                return;
                            if (!m) {
                                var S = f - s;
                                if (S > .033) {
                                    var A = s
                                      , L = o;
                                    o += S;
                                    var I = a;
                                    a += S;
                                    var R = {
                                        previousEvent: e[i - 1] || null,
                                        nextEvent: t,
                                        start: A,
                                        end: A + S,
                                        playout: {
                                            start: I,
                                            end: a
                                        },
                                        integrated: {
                                            start: L,
                                            end: o
                                        }
                                    };
                                    r.push(R)
                                } else
                                    S > 0 && d && (d.cumulativeDuration += S,
                                    r[r.length - 1].end = f)
                            }
                            u && (y = p),
                            t.timelineStart = p;
                            var k = o;
                            o += g;
                            var b = a;
                            a += c,
                            r.push({
                                event: t,
                                start: p,
                                end: y,
                                playout: {
                                    start: b,
                                    end: a
                                },
                                integrated: {
                                    start: k,
                                    end: o
                                }
                            })
                        }
                        var D = t.resumeTime;
                        s = u || D > n ? n : D
                    }
                    )),
                    s < n) {
                        var l, u = s, d = o, h = n - s;
                        o += h;
                        var f = a;
                        a += h,
                        r.push({
                            previousEvent: (null == (l = r[r.length - 1]) ? void 0 : l.event) || null,
                            nextEvent: null,
                            start: s,
                            end: u + h,
                            playout: {
                                start: f,
                                end: a
                            },
                            integrated: {
                                start: d,
                                end: o
                            }
                        })
                    }
                    this.setDurations(n, a, o)
                } else
                    r.push({
                        previousEvent: null,
                        nextEvent: null,
                        start: 0,
                        end: n,
                        playout: {
                            start: 0,
                            end: n
                        },
                        integrated: {
                            start: 0,
                            end: n
                        }
                    }),
                    this.setDurations(n, n, n);
                return r
            }
            ,
            r.setDurations = function(e, t, r) {
                this.durations = {
                    primary: e,
                    playout: t,
                    integrated: r
                }
            }
            ,
            r.resolveOffsets = function(e, t) {
                var r = this
                  , i = t.main.details
                  , n = i.live ? 1 / 0 : i.edge
                  , a = 0
                  , s = -1;
                e.forEach((function(o, l) {
                    var u = o.cue.pre
                      , d = o.cue.post
                      , h = u ? 0 : d ? n : o.startTime;
                    r.updateAssetDurations(o),
                    s === h ? o.cumulativeDuration = a : (a = 0,
                    s = h),
                    !d && o.snapOptions.in && (o.resumeAnchor = Et(null, i.fragments, o.startOffset + o.resumptionOffset, 0, 0) || void 0),
                    o.appendInPlace && !o.appendInPlaceStarted && (r.primaryCanResumeInPlaceAt(o, t) || (o.appendInPlace = !1)),
                    !o.appendInPlace && l + 1 < e.length && e[l + 1].startTime - e[l].resumeTime < .033 && (e[l + 1].appendInPlace = !1,
                    e[l + 1].appendInPlace && r.warn("Could not change append strategy for abutting event " + o));
                    var f = A(o.resumeOffset) ? o.resumeOffset : o.duration;
                    a += f
                }
                ))
            }
            ,
            r.primaryCanResumeInPlaceAt = function(e, t) {
                var r = this
                  , i = e.resumeTime
                  , n = e.startTime + e.resumptionOffset;
                return Math.abs(i - n) > Ks ? (this.log('"' + e.identifier + '" resumption ' + i + " not aligned with estimated timeline end " + n),
                !1) : !Object.keys(t).some((function(n) {
                    var a = t[n].details
                      , s = a.edge;
                    if (i >= s)
                        return r.log('"' + e.identifier + '" resumption ' + i + " past " + n + " playlist end " + s),
                        !1;
                    var o = Et(null, a.fragments, i);
                    if (!o)
                        return r.log('"' + e.identifier + '" resumption ' + i + " does not align with any fragments in " + n + " playlist (" + a.fragStart + "-" + a.fragmentEnd + ")"),
                        !0;
                    var l = "audio" === n ? .175 : 0;
                    return !(Math.abs(o.start - i) < Ks + l || Math.abs(o.end - i) < Ks + l || (r.log('"' + e.identifier + '" resumption ' + i + " not aligned with " + n + " fragment bounds (" + o.start + "-" + o.end + " sn: " + o.sn + " cc: " + o.cc + ")"),
                    0))
                }
                ))
            }
            ,
            r.updateAssetDurations = function(e) {
                if (e.assetListLoaded) {
                    for (var t = e.timelineStart, r = 0, i = !1, n = !1, a = 0; a < e.assetList.length; a++) {
                        var s = e.assetList[a]
                          , o = t + r;
                        s.startOffset = r,
                        s.timelineStart = o,
                        i || (i = null === s.duration),
                        n || (n = !!s.error),
                        r += s.error ? 0 : s.duration || 0
                    }
                    e.duration = i && !n ? Math.max(r, e.duration) : r
                }
            }
            ,
            r.removeEvent = function(e) {
                e.reset(),
                delete this.eventMap[e.identifier]
            }
            ,
            i(t, [{
                key: "duration",
                get: function() {
                    var e = this.items;
                    return e ? e[e.length - 1].end : 0
                }
            }, {
                key: "length",
                get: function() {
                    return this.items ? this.items.length : 0
                }
            }, {
                key: "assetIdAtEnd",
                get: function() {
                    var e, t = null == (e = this.items) || null == (e = e[this.length - 1]) ? void 0 : e.event;
                    if (t) {
                        var r = t.assetList
                          , i = r[r.length - 1];
                        if (i)
                            return i.identifier
                    }
                    return null
                }
            }])
        }(N);
        function $s(e) {
            return "[" + (e.event ? '"' + e.event.identifier + '"' : "primary") + ": " + e.start.toFixed(2) + "-" + e.end.toFixed(2) + "]"
        }
        var Zs = function() {
            function e(e) {
                this.hls = void 0,
                this.hls = e
            }
            var t = e.prototype;
            return t.destroy = function() {
                this.hls = null
            }
            ,
            t.loadAssetList = function(e, t) {
                var r, i = this, n = e.assetListUrl;
                try {
                    r = js(n, this.hls.sessionId, e.baseUrl)
                } catch (t) {
                    var a = this.assignAssetListError(e, k.ASSET_LIST_LOAD_ERROR, t, n);
                    return void this.hls.trigger(b.ERROR, a)
                }
                t && "data:" !== r.protocol && r.searchParams.set("_HLS_start_offset", "" + t);
                var s = this.hls.config
                  , o = new (0,
                s.loader)(s)
                  , l = {
                    responseType: "json",
                    url: r.href
                }
                  , u = s.interstitialAssetListLoadPolicy.default
                  , d = {
                    loadPolicy: u,
                    timeout: u.maxLoadTimeMs,
                    maxRetry: 0,
                    retryDelay: 0,
                    maxRetryDelay: 0
                }
                  , h = {
                    onSuccess: function(t, r, n, a) {
                        var s = t.data
                          , o = null == s ? void 0 : s.ASSETS;
                        if (Array.isArray(o))
                            e.assetListResponse = s,
                            i.hls.trigger(b.ASSET_LIST_LOADED, {
                                event: e,
                                assetListResponse: s,
                                networkDetails: a
                            });
                        else {
                            var l = i.assignAssetListError(e, k.ASSET_LIST_PARSING_ERROR, new Error("Invalid interstitial asset list"), n.url, r, a);
                            i.hls.trigger(b.ERROR, l)
                        }
                    },
                    onError: function(t, r, n, a) {
                        var s = i.assignAssetListError(e, k.ASSET_LIST_LOAD_ERROR, new Error("Error loading X-ASSET-LIST: HTTP status " + t.code + " " + t.text + " (" + r.url + ")"), r.url, a, n);
                        i.hls.trigger(b.ERROR, s)
                    },
                    onTimeout: function(t, r, n) {
                        var a = i.assignAssetListError(e, k.ASSET_LIST_LOAD_TIMEOUT, new Error("Timeout loading X-ASSET-LIST (" + r.url + ")"), r.url, t, n);
                        i.hls.trigger(b.ERROR, a)
                    }
                };
                return o.load(l, d, h),
                this.hls.trigger(b.ASSET_LIST_LOADING, {
                    event: e
                }),
                o
            }
            ,
            t.assignAssetListError = function(e, t, r, i, n, a) {
                return e.error = r,
                {
                    type: R.NETWORK_ERROR,
                    details: t,
                    fatal: !1,
                    interstitial: e,
                    url: i,
                    error: r,
                    networkDetails: a,
                    stats: n
                }
            }
            ,
            e
        }();
        function Js(e) {
            null == e || e.play().catch((function() {}
            ))
        }
        function eo(e, t) {
            return "[" + e + "] Advancing timeline position to " + t
        }
        var to = function(e) {
            function t(t, r) {
                var i;
                return (i = e.call(this, "interstitials", t.logger) || this).HlsPlayerClass = void 0,
                i.hls = void 0,
                i.assetListLoader = void 0,
                i.mediaSelection = null,
                i.altSelection = null,
                i.media = null,
                i.detachedData = null,
                i.requiredTracks = null,
                i.manager = null,
                i.playerQueue = [],
                i.bufferedPos = -1,
                i.timelinePos = -1,
                i.schedule = void 0,
                i.playingItem = null,
                i.bufferingItem = null,
                i.waitingItem = null,
                i.endedItem = null,
                i.playingAsset = null,
                i.endedAsset = null,
                i.bufferingAsset = null,
                i.shouldPlay = !1,
                i.onPlay = function() {
                    i.shouldPlay = !0
                }
                ,
                i.onPause = function() {
                    i.shouldPlay = !1
                }
                ,
                i.onSeeking = function() {
                    var e = i.currentTime;
                    if (void 0 !== e && !i.playbackDisabled && i.schedule) {
                        var t = e - i.timelinePos;
                        if (!(Math.abs(t) < 1 / 7056e5)) {
                            var r = t <= -.01;
                            i.timelinePos = e,
                            i.bufferedPos = e;
                            var n = i.playingItem;
                            if (n)
                                if (r && i.schedule.resetErrorsInRange(e, e - t) && i.updateSchedule(!0),
                                i.checkBuffer(),
                                r && e < n.start || e >= n.end) {
                                    var a, s = i.findItemIndex(n), o = i.schedule.findItemIndexAtTime(e);
                                    if (-1 === o && (o = s + (r ? -1 : 1),
                                    i.log("seeked " + (r ? "back " : "") + "to position not covered by schedule " + e + " (resolving from " + s + " to " + o + ")")),
                                    !i.isInterstitial(n) && null != (a = i.media) && a.paused && (i.shouldPlay = !1),
                                    !r && o > s) {
                                        var l = i.schedule.findJumpRestrictedIndex(s + 1, o);
                                        if (l > s)
                                            return void i.setSchedulePosition(l)
                                    }
                                    i.setSchedulePosition(o)
                                } else {
                                    var u = i.playingAsset;
                                    if (u) {
                                        var d, h = u.timelineStart, f = u.duration || 0;
                                        (r && e < h || e >= h + f) && (null != (d = n.event) && d.appendInPlace && (i.clearInterstitial(n.event, n),
                                        i.flushFrontBuffer(e)),
                                        i.setScheduleToAssetAtTime(e, u))
                                    } else if (i.playingLastItem && i.isInterstitial(n)) {
                                        var c = n.event.assetList[0];
                                        c && (i.endedItem = i.playingItem,
                                        i.playingItem = null,
                                        i.setScheduleToAssetAtTime(e, c))
                                    }
                                }
                            else
                                i.checkBuffer()
                        }
                    }
                }
                ,
                i.onTimeupdate = function() {
                    var e = i.currentTime;
                    if (void 0 !== e && !i.playbackDisabled && e > i.timelinePos) {
                        i.timelinePos = e,
                        e > i.bufferedPos && i.checkBuffer();
                        var t = i.playingItem;
                        if (t && !i.playingLastItem) {
                            if (e >= t.end) {
                                i.timelinePos = t.end;
                                var r = i.findItemIndex(t);
                                i.setSchedulePosition(r + 1)
                            }
                            var n = i.playingAsset;
                            n && e >= n.timelineStart + (n.duration || 0) && i.setScheduleToAssetAtTime(e, n)
                        }
                    }
                }
                ,
                i.onScheduleUpdate = function(e, t) {
                    var r = i.schedule;
                    if (r) {
                        var n = i.playingItem
                          , a = r.events || []
                          , s = r.items || []
                          , o = r.durations
                          , l = e.map((function(e) {
                            return e.identifier
                        }
                        ))
                          , u = !(!a.length && !l.length);
                        (u || t) && i.log("INTERSTITIALS_UPDATED (" + a.length + "): " + a + "\nSchedule: " + s.map((function(e) {
                            return $s(e)
                        }
                        )) + " pos: " + i.timelinePos),
                        l.length && i.log("Removed events " + l);
                        var d = null
                          , h = null;
                        n && (d = i.updateItem(n, i.timelinePos),
                        i.itemsMatch(n, d) ? i.playingItem = d : i.waitingItem = i.endedItem = null),
                        i.waitingItem = i.updateItem(i.waitingItem),
                        i.endedItem = i.updateItem(i.endedItem);
                        var f = i.bufferingItem;
                        if (f && (h = i.updateItem(f, i.bufferedPos),
                        i.itemsMatch(f, h) ? i.bufferingItem = h : f.event && (i.bufferingItem = i.playingItem,
                        i.clearInterstitial(f.event, null))),
                        e.forEach((function(e) {
                            e.assetList.forEach((function(e) {
                                i.clearAssetPlayer(e.identifier, null)
                            }
                            ))
                        }
                        )),
                        i.playerQueue.forEach((function(e) {
                            if (e.interstitial.appendInPlace) {
                                var t = e.assetItem.timelineStart
                                  , r = e.timelineOffset - t;
                                if (r)
                                    try {
                                        e.timelineOffset = t
                                    } catch (n) {
                                        Math.abs(r) > Ks && i.warn(n + ' ("' + e.assetId + '" ' + e.timelineOffset + "->" + t + ")")
                                    }
                            }
                        }
                        )),
                        u || t) {
                            if (i.hls.trigger(b.INTERSTITIALS_UPDATED, {
                                events: a.slice(0),
                                schedule: s.slice(0),
                                durations: o,
                                removedIds: l
                            }),
                            i.isInterstitial(n) && l.includes(n.event.identifier))
                                return i.warn('Interstitial "' + n.event.identifier + '" removed while playing'),
                                void i.primaryFallback(n.event);
                            n && i.trimInPlace(d, n),
                            f && h !== d && i.trimInPlace(h, f),
                            i.checkBuffer()
                        }
                    }
                }
                ,
                i.hls = t,
                i.HlsPlayerClass = r,
                i.assetListLoader = new Zs(t),
                i.schedule = new zs(i.onScheduleUpdate,t.logger),
                i.registerListeners(),
                i
            }
            o(t, e);
            var r = t.prototype;
            return r.registerListeners = function() {
                var e = this.hls;
                e && (e.on(b.MEDIA_ATTACHING, this.onMediaAttaching, this),
                e.on(b.MEDIA_ATTACHED, this.onMediaAttached, this),
                e.on(b.MEDIA_DETACHING, this.onMediaDetaching, this),
                e.on(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.on(b.LEVEL_UPDATED, this.onLevelUpdated, this),
                e.on(b.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this),
                e.on(b.AUDIO_TRACK_UPDATED, this.onAudioTrackUpdated, this),
                e.on(b.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this),
                e.on(b.SUBTITLE_TRACK_UPDATED, this.onSubtitleTrackUpdated, this),
                e.on(b.EVENT_CUE_ENTER, this.onInterstitialCueEnter, this),
                e.on(b.ASSET_LIST_LOADED, this.onAssetListLoaded, this),
                e.on(b.BUFFER_APPENDED, this.onBufferAppended, this),
                e.on(b.BUFFER_FLUSHED, this.onBufferFlushed, this),
                e.on(b.BUFFERED_TO_END, this.onBufferedToEnd, this),
                e.on(b.MEDIA_ENDED, this.onMediaEnded, this),
                e.on(b.ERROR, this.onError, this),
                e.on(b.DESTROYING, this.onDestroying, this))
            }
            ,
            r.unregisterListeners = function() {
                var e = this.hls;
                e && (e.off(b.MEDIA_ATTACHING, this.onMediaAttaching, this),
                e.off(b.MEDIA_ATTACHED, this.onMediaAttached, this),
                e.off(b.MEDIA_DETACHING, this.onMediaDetaching, this),
                e.off(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.off(b.LEVEL_UPDATED, this.onLevelUpdated, this),
                e.off(b.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this),
                e.off(b.AUDIO_TRACK_UPDATED, this.onAudioTrackUpdated, this),
                e.off(b.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this),
                e.off(b.SUBTITLE_TRACK_UPDATED, this.onSubtitleTrackUpdated, this),
                e.off(b.EVENT_CUE_ENTER, this.onInterstitialCueEnter, this),
                e.off(b.ASSET_LIST_LOADED, this.onAssetListLoaded, this),
                e.off(b.BUFFER_CODECS, this.onBufferCodecs, this),
                e.off(b.BUFFER_APPENDED, this.onBufferAppended, this),
                e.off(b.BUFFER_FLUSHED, this.onBufferFlushed, this),
                e.off(b.BUFFERED_TO_END, this.onBufferedToEnd, this),
                e.off(b.MEDIA_ENDED, this.onMediaEnded, this),
                e.off(b.ERROR, this.onError, this),
                e.off(b.DESTROYING, this.onDestroying, this))
            }
            ,
            r.startLoad = function() {
                this.resumeBuffering()
            }
            ,
            r.stopLoad = function() {
                this.pauseBuffering()
            }
            ,
            r.resumeBuffering = function() {
                var e;
                null == (e = this.getBufferingPlayer()) || e.resumeBuffering()
            }
            ,
            r.pauseBuffering = function() {
                var e;
                null == (e = this.getBufferingPlayer()) || e.pauseBuffering()
            }
            ,
            r.destroy = function() {
                this.unregisterListeners(),
                this.stopLoad(),
                this.assetListLoader && this.assetListLoader.destroy(),
                this.emptyPlayerQueue(),
                this.clearScheduleState(),
                this.schedule && this.schedule.destroy(),
                this.media = this.detachedData = this.mediaSelection = this.requiredTracks = this.altSelection = this.schedule = this.manager = null,
                this.hls = this.HlsPlayerClass = this.log = null,
                this.assetListLoader = null,
                this.onPlay = this.onPause = this.onSeeking = this.onTimeupdate = null,
                this.onScheduleUpdate = null
            }
            ,
            r.onDestroying = function() {
                var e = this.primaryMedia || this.media;
                e && this.removeMediaListeners(e)
            }
            ,
            r.removeMediaListeners = function(e) {
                Ii(e, "play", this.onPlay),
                Ii(e, "pause", this.onPause),
                Ii(e, "seeking", this.onSeeking),
                Ii(e, "timeupdate", this.onTimeupdate)
            }
            ,
            r.onMediaAttaching = function(e, t) {
                var r = this.media = t.media;
                Li(r, "seeking", this.onSeeking),
                Li(r, "timeupdate", this.onTimeupdate),
                Li(r, "play", this.onPlay),
                Li(r, "pause", this.onPause)
            }
            ,
            r.onMediaAttached = function(e, t) {
                var r = this.effectivePlayingItem
                  , i = this.detachedData;
                if (this.detachedData = null,
                null === r)
                    this.checkStart();
                else if (!i) {
                    this.clearScheduleState();
                    var n = this.findItemIndex(r);
                    this.setSchedulePosition(n)
                }
            }
            ,
            r.clearScheduleState = function() {
                this.log("clear schedule state"),
                this.playingItem = this.bufferingItem = this.waitingItem = this.endedItem = this.playingAsset = this.endedAsset = this.bufferingAsset = null
            }
            ,
            r.onMediaDetaching = function(e, t) {
                var r = !!t.transferMedia
                  , i = this.media;
                if (this.media = null,
                !r && (i && this.removeMediaListeners(i),
                this.detachedData)) {
                    var n = this.getBufferingPlayer();
                    n && (this.log("Removing schedule state for detachedData and " + n),
                    this.playingAsset = this.endedAsset = this.bufferingAsset = this.bufferingItem = this.waitingItem = this.detachedData = null,
                    n.detachMedia()),
                    this.shouldPlay = !1
                }
            }
            ,
            r.isInterstitial = function(e) {
                return !(null == e || !e.event)
            }
            ,
            r.retreiveMediaSource = function(e, t) {
                var r = this.getAssetPlayer(e);
                r && this.transferMediaFromPlayer(r, t)
            }
            ,
            r.transferMediaFromPlayer = function(e, t) {
                var r = e.interstitial.appendInPlace
                  , i = e.media;
                if (r && i === this.primaryMedia) {
                    if (this.bufferingAsset = null,
                    (!t || this.isInterstitial(t) && !t.event.appendInPlace) && t && i)
                        return void (this.detachedData = {
                            media: i
                        });
                    var n = e.transferMedia();
                    this.log("transfer MediaSource from " + e + " " + lt(n)),
                    this.detachedData = n
                } else
                    t && i && (this.shouldPlay || (this.shouldPlay = !i.paused))
            }
            ,
            r.transferMediaTo = function(e, t) {
                var r, i, n = this;
                if (e.media !== t) {
                    var a, s = null, o = this.hls, l = e !== o, u = l && e.interstitial.appendInPlace, d = null == (r = this.detachedData) ? void 0 : r.mediaSource;
                    if (o.media)
                        u && (s = o.transferMedia(),
                        this.detachedData = s),
                        a = "Primary";
                    else if (d) {
                        var h = this.getBufferingPlayer();
                        h ? (s = h.transferMedia(),
                        a = "" + h) : a = "detached MediaSource"
                    } else
                        a = "detached media";
                    if (!s)
                        if (d)
                            s = this.detachedData,
                            this.log("using detachedData: MediaSource " + lt(s));
                        else if (!this.detachedData || o.media === t) {
                            var f = this.playerQueue;
                            f.length > 1 && f.forEach((function(e) {
                                if (l && e.interstitial.appendInPlace !== u) {
                                    var t = e.interstitial;
                                    n.clearInterstitial(e.interstitial, null),
                                    t.appendInPlace = !1,
                                    t.appendInPlace && n.warn("Could not change append strategy for queued assets " + t)
                                }
                            }
                            )),
                            this.hls.detachMedia(),
                            this.detachedData = {
                                media: t
                            }
                        }
                    var c = s && "mediaSource"in s && "closed" !== (null == (i = s.mediaSource) ? void 0 : i.readyState)
                      , g = c && s ? s : t;
                    this.log((c ? "transfering MediaSource" : "attaching media") + " to " + (l ? e : "Primary") + " from " + a + " (media.currentTime: " + t.currentTime + ")");
                    var v = this.schedule;
                    if (g === s && v) {
                        var m = l && e.assetId === v.assetIdAtEnd;
                        g.overrides = {
                            duration: v.duration,
                            endOfStream: !l || m,
                            cueRemoval: !l
                        }
                    }
                    e.attachMedia(g)
                }
            }
            ,
            r.onInterstitialCueEnter = function() {
                this.onTimeupdate()
            }
            ,
            r.checkStart = function() {
                var e = this.schedule
                  , t = null == e ? void 0 : e.events;
                if (t && !this.playbackDisabled && this.media) {
                    -1 === this.bufferedPos && (this.bufferedPos = 0);
                    var r = this.timelinePos
                      , i = this.effectivePlayingItem;
                    if (-1 === r) {
                        var n = this.hls.startPosition;
                        if (this.log(eo("checkStart", n)),
                        this.timelinePos = n,
                        t.length && t[0].cue.pre) {
                            var a = e.findEventIndex(t[0].identifier);
                            this.setSchedulePosition(a)
                        } else if (n >= 0 || !this.primaryLive) {
                            var s = this.timelinePos = n > 0 ? n : 0
                              , o = e.findItemIndexAtTime(s);
                            this.setSchedulePosition(o)
                        }
                    } else if (i && !this.playingItem) {
                        var l = e.findItemIndex(i);
                        this.setSchedulePosition(l)
                    }
                }
            }
            ,
            r.advanceAssetBuffering = function(e, t) {
                var r = e.event
                  , i = r.findAssetIndex(t)
                  , n = qs(r, i);
                if (r.isAssetPastPlayoutLimit(n)) {
                    if (this.schedule) {
                        var a, s = null == (a = this.schedule.items) ? void 0 : a[this.findItemIndex(e) + 1];
                        s && this.bufferedToItem(s)
                    }
                } else
                    this.bufferedToEvent(e, n)
            }
            ,
            r.advanceAfterAssetEnded = function(e, t, r) {
                var i = qs(e, r);
                if (e.isAssetPastPlayoutLimit(i)) {
                    if (this.schedule) {
                        var n = this.schedule.items;
                        if (n) {
                            var a = t + 1;
                            if (a >= n.length)
                                return void this.setSchedulePosition(-1);
                            var s = e.resumeTime;
                            this.timelinePos < s && (this.log(eo("advanceAfterAssetEnded", s)),
                            this.timelinePos = s,
                            e.appendInPlace && this.advanceInPlace(s),
                            this.checkBuffer(this.bufferedPos < s)),
                            this.setSchedulePosition(a)
                        }
                    }
                } else {
                    if (e.appendInPlace) {
                        var o = e.assetList[i];
                        o && this.advanceInPlace(o.timelineStart)
                    }
                    this.setSchedulePosition(t, i)
                }
            }
            ,
            r.setScheduleToAssetAtTime = function(e, t) {
                var r = this.schedule;
                if (r) {
                    var i = t.parentIdentifier
                      , n = r.getEvent(i);
                    if (n) {
                        var a = r.findEventIndex(i)
                          , s = r.findAssetIndex(n, e);
                        this.advanceAfterAssetEnded(n, a, s - 1)
                    }
                }
            }
            ,
            r.setSchedulePosition = function(e, t) {
                var r, i = null == (r = this.schedule) ? void 0 : r.items;
                if (i && !this.playbackDisabled) {
                    var n = e >= 0 ? i[e] : null;
                    this.log("setSchedulePosition " + e + ", " + t + " (" + (n ? $s(n) : n) + ") pos: " + this.timelinePos);
                    var a = this.waitingItem || this.playingItem
                      , s = this.playingLastItem;
                    if (this.isInterstitial(a)) {
                        var o = a.event
                          , l = this.playingAsset
                          , u = null == l ? void 0 : l.identifier
                          , d = u ? this.getAssetPlayer(u) : null;
                        if (d && u && (!this.eventItemsMatch(a, n) || void 0 !== t && u !== o.assetList[t].identifier)) {
                            var h, f = o.findAssetIndex(l);
                            if (this.log("INTERSTITIAL_ASSET_ENDED " + (f + 1) + "/" + o.assetList.length + " " + Xs(l)),
                            this.endedAsset = l,
                            this.playingAsset = null,
                            this.hls.trigger(b.INTERSTITIAL_ASSET_ENDED, {
                                asset: l,
                                assetListIndex: f,
                                event: o,
                                schedule: i.slice(0),
                                scheduleIndex: e,
                                player: d
                            }),
                            a !== this.playingItem)
                                return void (this.itemsMatch(a, this.playingItem) && !this.playingAsset && this.advanceAfterAssetEnded(o, this.findItemIndex(this.playingItem), f));
                            this.retreiveMediaSource(u, n),
                            !d.media || null != (h = this.detachedData) && h.mediaSource || d.detachMedia()
                        }
                        if (!this.eventItemsMatch(a, n) && (this.endedItem = a,
                        this.playingItem = null,
                        this.log("INTERSTITIAL_ENDED " + o + " " + $s(a)),
                        o.hasPlayed = !0,
                        this.hls.trigger(b.INTERSTITIAL_ENDED, {
                            event: o,
                            schedule: i.slice(0),
                            scheduleIndex: e
                        }),
                        o.cue.once)) {
                            var c;
                            this.updateSchedule();
                            var g = null == (c = this.schedule) ? void 0 : c.items;
                            if (n && g) {
                                var v = this.findItemIndex(n);
                                this.advanceSchedule(v, g, t, a, s)
                            }
                            return
                        }
                    }
                    this.advanceSchedule(e, i, t, a, s)
                }
            }
            ,
            r.advanceSchedule = function(e, t, r, i, n) {
                var a = this
                  , s = this.schedule;
                if (s) {
                    var o = t[e] || null
                      , l = this.primaryMedia
                      , u = this.playerQueue;
                    if (u.length && u.forEach((function(t) {
                        var r = t.interstitial
                          , i = s.findEventIndex(r.identifier);
                        (i < e || i > e + 1) && a.clearInterstitial(r, o)
                    }
                    )),
                    this.isInterstitial(o)) {
                        this.timelinePos = Math.min(Math.max(this.timelinePos, o.start), o.end);
                        var d = o.event;
                        if (void 0 === r) {
                            var h = qs(d, (r = s.findAssetIndex(d, this.timelinePos)) - 1);
                            if (d.isAssetPastPlayoutLimit(h) || d.appendInPlace && this.timelinePos === o.end)
                                return void this.advanceAfterAssetEnded(d, e, r);
                            r = h
                        }
                        var f = this.waitingItem;
                        this.assetsBuffered(o, l) || this.setBufferingItem(o);
                        var c = this.preloadAssets(d, r);
                        if (this.eventItemsMatch(o, f || i) || (this.waitingItem = o,
                        this.log("INTERSTITIAL_STARTED " + $s(o) + " " + (d.appendInPlace ? "append in place" : "")),
                        this.hls.trigger(b.INTERSTITIAL_STARTED, {
                            event: d,
                            schedule: t.slice(0),
                            scheduleIndex: e
                        })),
                        !d.assetListLoaded)
                            return void this.log("Waiting for ASSET-LIST to complete loading " + d);
                        if (d.assetListLoader && (d.assetListLoader.destroy(),
                        d.assetListLoader = void 0),
                        !l)
                            return void this.log("Waiting for attachMedia to start Interstitial " + d);
                        this.waitingItem = this.endedItem = null,
                        this.playingItem = o;
                        var g = d.assetList[r];
                        if (!g)
                            return void this.advanceAfterAssetEnded(d, e, r || 0);
                        if (c || (c = this.getAssetPlayer(g.identifier)),
                        null === c || c.destroyed) {
                            var v = d.assetList.length;
                            this.warn("asset " + (r + 1) + "/" + v + " player destroyed " + d),
                            (c = this.createAssetPlayer(d, g, r)).loadSource()
                        }
                        if (!this.eventItemsMatch(o, this.bufferingItem) && d.appendInPlace && this.isAssetBuffered(g))
                            return;
                        this.startAssetPlayer(c, r, t, e, l),
                        this.shouldPlay && Js(c.media)
                    } else
                        o ? (this.resumePrimary(o, e, i),
                        this.shouldPlay && Js(this.hls.media)) : n && this.isInterstitial(i) && (this.endedItem = null,
                        this.playingItem = i,
                        i.event.appendInPlace || this.attachPrimary(s.durations.primary, null))
                }
            }
            ,
            r.resumePrimary = function(e, t, r) {
                var i, n;
                if (this.playingItem = e,
                this.playingAsset = this.endedAsset = null,
                this.waitingItem = this.endedItem = null,
                this.bufferedToItem(e),
                this.log("resuming " + $s(e)),
                null == (i = this.detachedData) || !i.mediaSource) {
                    var a = this.timelinePos;
                    (a < e.start || a >= e.end) && (a = this.getPrimaryResumption(e, t),
                    this.log(eo("resumePrimary", a)),
                    this.timelinePos = a),
                    this.attachPrimary(a, e)
                }
                if (r) {
                    var s = null == (n = this.schedule) ? void 0 : n.items;
                    s && (this.log("INTERSTITIALS_PRIMARY_RESUMED " + $s(e)),
                    this.hls.trigger(b.INTERSTITIALS_PRIMARY_RESUMED, {
                        schedule: s.slice(0),
                        scheduleIndex: t
                    }),
                    this.checkBuffer())
                }
            }
            ,
            r.getPrimaryResumption = function(e, t) {
                var r = e.start;
                if (this.primaryLive) {
                    var i = this.primaryDetails;
                    if (0 === t)
                        return this.hls.startPosition;
                    if (i && (r < i.fragmentStart || r > i.edge))
                        return this.hls.liveSyncPosition || -1
                }
                return r
            }
            ,
            r.isAssetBuffered = function(e) {
                var t = this.getAssetPlayer(e.identifier);
                return null != t && t.hls ? t.hls.bufferedToEnd : ur.bufferInfo(this.primaryMedia, this.timelinePos, 0).end + 1 >= e.timelineStart + (e.duration || 0)
            }
            ,
            r.attachPrimary = function(e, t, r) {
                t ? this.setBufferingItem(t) : this.bufferingItem = this.playingItem,
                this.bufferingAsset = null;
                var i = this.primaryMedia;
                if (i) {
                    var n = this.hls;
                    n.media ? this.checkBuffer() : (this.transferMediaTo(n, i),
                    r && this.startLoadingPrimaryAt(e, r)),
                    r || (this.log(eo("attachPrimary", e)),
                    this.timelinePos = e,
                    this.startLoadingPrimaryAt(e, r))
                }
            }
            ,
            r.startLoadingPrimaryAt = function(e, t) {
                var r, i = this.hls;
                !i.loadingEnabled || !i.media || Math.abs(((null == (r = i.mainForwardBufferInfo) ? void 0 : r.start) || i.media.currentTime) - e) > .5 ? i.startLoad(e, t) : i.bufferingEnabled || i.resumeBuffering()
            }
            ,
            r.onManifestLoading = function() {
                var e;
                this.stopLoad(),
                null == (e = this.schedule) || e.reset(),
                this.emptyPlayerQueue(),
                this.clearScheduleState(),
                this.shouldPlay = !1,
                this.bufferedPos = this.timelinePos = -1,
                this.mediaSelection = this.altSelection = this.manager = this.requiredTracks = null,
                this.hls.off(b.BUFFER_CODECS, this.onBufferCodecs, this),
                this.hls.on(b.BUFFER_CODECS, this.onBufferCodecs, this)
            }
            ,
            r.onLevelUpdated = function(e, t) {
                if (-1 !== t.level && this.schedule) {
                    var r = this.hls.levels[t.level];
                    if (r.details) {
                        var i = d(d({}, this.mediaSelection || this.altSelection), {}, {
                            main: r
                        });
                        this.mediaSelection = i,
                        this.schedule.parseInterstitialDateRanges(i, this.hls.config.interstitialAppendInPlace),
                        !this.effectivePlayingItem && this.schedule.items && this.checkStart()
                    }
                }
            }
            ,
            r.onAudioTrackUpdated = function(e, t) {
                var r = this.hls.audioTracks[t.id]
                  , i = this.mediaSelection;
                if (i) {
                    var n = d(d({}, i), {}, {
                        audio: r
                    });
                    this.mediaSelection = n
                } else
                    this.altSelection = d(d({}, this.altSelection), {}, {
                        audio: r
                    })
            }
            ,
            r.onSubtitleTrackUpdated = function(e, t) {
                var r = this.hls.subtitleTracks[t.id]
                  , i = this.mediaSelection;
                if (i) {
                    var n = d(d({}, i), {}, {
                        subtitles: r
                    });
                    this.mediaSelection = n
                } else
                    this.altSelection = d(d({}, this.altSelection), {}, {
                        subtitles: r
                    })
            }
            ,
            r.onAudioTrackSwitching = function(e, t) {
                var r = ht(t);
                this.playerQueue.forEach((function(e) {
                    var i = e.hls;
                    return i && (i.setAudioOption(t) || i.setAudioOption(r))
                }
                ))
            }
            ,
            r.onSubtitleTrackSwitch = function(e, t) {
                var r = ht(t);
                this.playerQueue.forEach((function(e) {
                    var i = e.hls;
                    return i && (i.setSubtitleOption(t) || -1 !== t.id && i.setSubtitleOption(r))
                }
                ))
            }
            ,
            r.onBufferCodecs = function(e, t) {
                var r = t.tracks;
                r && (this.requiredTracks = r)
            }
            ,
            r.onBufferAppended = function(e, t) {
                this.checkBuffer()
            }
            ,
            r.onBufferFlushed = function(e, t) {
                var r = this.playingItem;
                if (r && !this.itemsMatch(r, this.bufferingItem) && !this.isInterstitial(r)) {
                    var i = this.timelinePos;
                    this.bufferedPos = i,
                    this.checkBuffer()
                }
            }
            ,
            r.onBufferedToEnd = function(e) {
                if (this.schedule) {
                    var t = this.schedule.events;
                    if (this.bufferedPos < Number.MAX_VALUE && t) {
                        for (var r = 0; r < t.length; r++) {
                            var i = t[r];
                            if (i.cue.post) {
                                var n, a = this.schedule.findEventIndex(i.identifier), s = null == (n = this.schedule.items) ? void 0 : n[a];
                                this.isInterstitial(s) && this.eventItemsMatch(s, this.bufferingItem) && this.bufferedToItem(s, 0);
                                break
                            }
                        }
                        this.bufferedPos = Number.MAX_VALUE
                    }
                }
            }
            ,
            r.onMediaEnded = function(e) {
                var t = this.playingItem;
                if (!this.playingLastItem && t) {
                    var r = this.findItemIndex(t);
                    this.setSchedulePosition(r + 1)
                } else
                    this.shouldPlay = !1
            }
            ,
            r.updateItem = function(e, t) {
                var r, i = null == (r = this.schedule) ? void 0 : r.items;
                return e && i && i[this.findItemIndex(e, t)] || null
            }
            ,
            r.trimInPlace = function(e, t) {
                var r = this;
                if (this.isInterstitial(e) && e.event.appendInPlace && t.end - e.end > .25) {
                    e.event.assetList.forEach((function(t, i) {
                        e.event.isAssetPastPlayoutLimit(i) && r.clearAssetPlayer(t.identifier, null)
                    }
                    ));
                    var i = e.end + .25
                      , n = ur.bufferInfo(this.primaryMedia, i, 0);
                    (n.end > i || (n.nextStart || 0) > i) && (this.log("trim buffered interstitial " + $s(e) + " (was " + $s(t) + ")"),
                    this.attachPrimary(i, null, !0),
                    this.flushFrontBuffer(i))
                }
            }
            ,
            r.itemsMatch = function(e, t) {
                return !!t && (e === t || e.event && t.event && this.eventItemsMatch(e, t) || !e.event && !t.event && this.findItemIndex(e) === this.findItemIndex(t))
            }
            ,
            r.eventItemsMatch = function(e, t) {
                var r;
                return !!t && (e === t || e.event.identifier === (null == (r = t.event) ? void 0 : r.identifier))
            }
            ,
            r.findItemIndex = function(e, t) {
                return e && this.schedule ? this.schedule.findItemIndex(e, t) : -1
            }
            ,
            r.updateSchedule = function(e) {
                var t;
                void 0 === e && (e = !1);
                var r = this.mediaSelection;
                r && (null == (t = this.schedule) || t.updateSchedule(r, [], e))
            }
            ,
            r.checkBuffer = function(e) {
                var t, r = null == (t = this.schedule) ? void 0 : t.items;
                if (r) {
                    var i = ur.bufferInfo(this.primaryMedia, this.timelinePos, 0);
                    e && (this.bufferedPos = this.timelinePos),
                    e || (e = i.len < 1),
                    this.updateBufferedPos(i.end, r, e)
                }
            }
            ,
            r.updateBufferedPos = function(e, t, r) {
                var i = this.schedule
                  , n = this.bufferingItem;
                if (!(this.bufferedPos > e) && i)
                    if (1 === t.length && this.itemsMatch(t[0], n))
                        this.bufferedPos = e;
                    else {
                        var a = this.playingItem
                          , s = this.findItemIndex(a)
                          , o = i.findItemIndexAtTime(e);
                        if (this.bufferedPos < e) {
                            var l, u = this.findItemIndex(n), d = Math.min(u + 1, t.length - 1), h = t[d];
                            if ((-1 === o && n && e >= n.end || null != (l = h.event) && l.appendInPlace && e + .01 >= h.start) && (o = d),
                            this.isInterstitial(n)) {
                                var f = n.event;
                                if (d - s > 1 && !1 === f.appendInPlace)
                                    return;
                                if (0 === f.assetList.length && f.assetListLoader)
                                    return
                            }
                            if (this.bufferedPos = e,
                            o > u && o > s)
                                this.bufferedToItem(h);
                            else {
                                var c = this.primaryDetails;
                                this.primaryLive && c && e > c.edge - c.targetduration && h.start < c.edge + this.hls.config.interstitialLiveLookAhead && this.isInterstitial(h) && this.preloadAssets(h.event, 0)
                            }
                        } else
                            r && a && !this.itemsMatch(a, n) && (o === s ? this.bufferedToItem(a) : o === s + 1 && this.bufferedToItem(t[o]))
                    }
            }
            ,
            r.assetsBuffered = function(e, t) {
                var r = this;
                return 0 !== e.event.assetList.length && !e.event.assetList.some((function(e) {
                    var i = r.getAssetPlayer(e.identifier);
                    return !(null != i && i.bufferedInPlaceToEnd(t))
                }
                ))
            }
            ,
            r.setBufferingItem = function(e) {
                var t = this
                  , r = this.bufferingItem
                  , i = this.schedule;
                if (!this.itemsMatch(e, r) && i) {
                    var n = i.items
                      , a = i.events;
                    if (!n || !a)
                        return r;
                    var s = this.isInterstitial(e)
                      , o = this.getBufferingPlayer();
                    this.bufferingItem = e,
                    this.bufferedPos = Math.max(e.start, Math.min(e.end, this.timelinePos));
                    var l = o ? o.remaining : r ? r.end - this.timelinePos : 0;
                    if (this.log("INTERSTITIALS_BUFFERED_TO_BOUNDARY " + $s(e) + (r ? " (" + l.toFixed(2) + " remaining)" : "")),
                    !this.playbackDisabled)
                        if (s) {
                            var u = i.findAssetIndex(e.event, this.bufferedPos);
                            e.event.assetList.forEach((function(e, r) {
                                var i = t.getAssetPlayer(e.identifier);
                                i && (r === u && i.loadSource(),
                                i.resumeBuffering())
                            }
                            ))
                        } else
                            this.hls.resumeBuffering(),
                            this.playerQueue.forEach((function(e) {
                                return e.pauseBuffering()
                            }
                            ));
                    this.hls.trigger(b.INTERSTITIALS_BUFFERED_TO_BOUNDARY, {
                        events: a.slice(0),
                        schedule: n.slice(0),
                        bufferingIndex: this.findItemIndex(e),
                        playingIndex: this.findItemIndex(this.playingItem)
                    })
                } else
                    this.bufferingItem !== e && (this.bufferingItem = e);
                return r
            }
            ,
            r.bufferedToItem = function(e, t) {
                void 0 === t && (t = 0);
                var r = this.setBufferingItem(e);
                if (!this.playbackDisabled)
                    if (this.isInterstitial(e))
                        this.bufferedToEvent(e, t);
                    else if (null !== r) {
                        this.bufferingAsset = null;
                        var i = this.detachedData;
                        i && i.mediaSource ? this.attachPrimary(e.start, e, !0) : this.preloadPrimary(e)
                    }
            }
            ,
            r.preloadPrimary = function(e) {
                var t = this.findItemIndex(e)
                  , r = this.getPrimaryResumption(e, t);
                this.startLoadingPrimaryAt(r)
            }
            ,
            r.bufferedToEvent = function(e, t) {
                var r = e.event
                  , i = 0 === r.assetList.length && !r.assetListLoader
                  , n = r.cue.once;
                if (i || !n) {
                    var a = this.preloadAssets(r, t);
                    if (null != a && a.interstitial.appendInPlace) {
                        var s = this.primaryMedia;
                        s && this.bufferAssetPlayer(a, s)
                    }
                }
            }
            ,
            r.preloadAssets = function(e, t) {
                var r = e.assetUrl
                  , i = e.assetList.length
                  , n = 0 === i && !e.assetListLoader
                  , a = e.cue.once;
                if (n) {
                    var s, o = e.timelineStart;
                    if (e.appendInPlace) {
                        var l, u = this.playingItem;
                        this.isInterstitial(u) || (null == u || null == (l = u.nextEvent) ? void 0 : l.identifier) !== e.identifier || this.flushFrontBuffer(o + .25)
                    }
                    var d = 0;
                    if (!this.playingItem && this.primaryLive && -1 === (d = this.hls.startPosition) && (d = this.hls.liveSyncPosition || 0),
                    d && !e.cue.pre && !e.cue.post) {
                        var h = d - o;
                        h > 0 && (s = Math.round(1e3 * h) / 1e3)
                    }
                    if (this.log("Load interstitial asset " + (t + 1) + "/" + (r ? 1 : i) + " " + e + (s ? " live-start: " + d + " start-offset: " + s : "")),
                    r)
                        return this.createAsset(e, 0, 0, o, e.duration, r);
                    var f = this.assetListLoader.loadAssetList(e, s);
                    f && (e.assetListLoader = f)
                } else if (!a && i) {
                    for (var c = t; c < i; c++) {
                        var g = e.assetList[c]
                          , v = this.getAssetPlayerQueueIndex(g.identifier);
                        -1 !== v && !this.playerQueue[v].destroyed || g.error || this.createAssetPlayer(e, g, c)
                    }
                    var m = e.assetList[t];
                    if (m) {
                        var p = this.getAssetPlayer(m.identifier);
                        return p && p.loadSource(),
                        p
                    }
                }
                return null
            }
            ,
            r.flushFrontBuffer = function(e) {
                var t = this
                  , r = this.requiredTracks;
                r && (this.log("Removing front buffer starting at " + e),
                Object.keys(r).forEach((function(r) {
                    t.hls.trigger(b.BUFFER_FLUSHING, {
                        startOffset: e,
                        endOffset: 1 / 0,
                        type: r
                    })
                }
                )))
            }
            ,
            r.getAssetPlayerQueueIndex = function(e) {
                for (var t = this.playerQueue, r = 0; r < t.length; r++)
                    if (e === t[r].assetId)
                        return r;
                return -1
            }
            ,
            r.getAssetPlayer = function(e) {
                var t = this.getAssetPlayerQueueIndex(e);
                return this.playerQueue[t] || null
            }
            ,
            r.getBufferingPlayer = function() {
                var e = this.playerQueue
                  , t = this.primaryMedia;
                if (t)
                    for (var r = 0; r < e.length; r++)
                        if (e[r].media === t)
                            return e[r];
                return null
            }
            ,
            r.createAsset = function(e, t, r, i, n, a) {
                var s = {
                    parentIdentifier: e.identifier,
                    identifier: Hs(e, a, t),
                    duration: n,
                    startOffset: r,
                    timelineStart: i,
                    uri: a
                };
                return this.createAssetPlayer(e, s, t)
            }
            ,
            r.createAssetPlayer = function(e, t, r) {
                var i = this
                  , n = this.hls
                  , s = n.userConfig
                  , o = s.videoPreference
                  , l = n.loadLevelObj || n.levels[n.currentLevel];
                (o || l) && (o = a({}, o),
                l.videoCodec && (o.videoCodec = l.videoCodec),
                l.videoRange && (o.allowedVideoRanges = [l.videoRange]));
                var u = n.audioTracks[n.audioTrack]
                  , h = n.subtitleTracks[n.subtitleTrack]
                  , f = 0;
                if (this.primaryLive || e.appendInPlace) {
                    var c = this.timelinePos - t.timelineStart;
                    if (c > 1) {
                        var g = t.duration;
                        g && c < g && (f = c)
                    }
                }
                var v = t.identifier
                  , m = d(d({}, s), {}, {
                    maxMaxBufferLength: Math.min(180, n.config.maxMaxBufferLength),
                    autoStartLoad: !0,
                    startFragPrefetch: !0,
                    primarySessionId: n.sessionId,
                    assetPlayerId: v,
                    abrEwmaDefaultEstimate: n.bandwidthEstimate,
                    interstitialsController: void 0,
                    startPosition: f,
                    liveDurationInfinity: !1,
                    testBandwidth: !1,
                    videoPreference: o,
                    audioPreference: u || s.audioPreference,
                    subtitlePreference: h || s.subtitlePreference
                });
                e.appendInPlace && (e.appendInPlaceStarted = !0,
                t.timelineStart && (m.timelineOffset = t.timelineStart));
                var p = m.cmcd;
                null != p && p.sessionId && p.contentId && (m.cmcd = a({}, p, {
                    contentId: Gs(t.uri)
                })),
                this.getAssetPlayer(v) && this.warn("Duplicate date range identifier " + e + " and asset " + v);
                var y = new Qs(this.HlsPlayerClass,m,e,t);
                this.playerQueue.push(y),
                e.assetList[r] = t;
                var E = !0
                  , T = function(n) {
                    if (n.live) {
                        var a, s = new Error("Interstitials MUST be VOD assets " + e), o = {
                            fatal: !0,
                            type: R.OTHER_ERROR,
                            details: k.INTERSTITIAL_ASSET_ITEM_ERROR,
                            error: s
                        }, l = (null == (a = i.schedule) ? void 0 : a.findEventIndex(e.identifier)) || -1;
                        i.handleAssetItemError(o, e, l, r, s.message)
                    } else {
                        var u = n.edge - n.fragmentStart
                          , d = t.duration;
                        (E || null === d || u > d) && (E = !1,
                        i.log('Interstitial asset "' + v + '" duration change ' + d + " > " + u),
                        t.duration = u,
                        i.updateSchedule())
                    }
                };
                y.on(b.LEVEL_UPDATED, (function(e, t) {
                    var r = t.details;
                    return T(r)
                }
                )),
                y.on(b.LEVEL_PTS_UPDATED, (function(e, t) {
                    var r = t.details;
                    return T(r)
                }
                )),
                y.on(b.EVENT_CUE_ENTER, (function() {
                    return i.onInterstitialCueEnter()
                }
                ));
                var S = function(e, t) {
                    var r = i.getAssetPlayer(v);
                    if (r && t.tracks) {
                        r.off(b.BUFFER_CODECS, S),
                        r.tracks = t.tracks;
                        var n = i.primaryMedia;
                        i.bufferingAsset === r.assetItem && n && !r.media && i.bufferAssetPlayer(r, n)
                    }
                };
                y.on(b.BUFFER_CODECS, S),
                y.on(b.BUFFERED_TO_END, (function() {
                    var r, n = i.getAssetPlayer(v);
                    if (i.log("buffered to end of asset " + n),
                    n && i.schedule) {
                        var a = i.schedule.findEventIndex(e.identifier)
                          , s = null == (r = i.schedule.items) ? void 0 : r[a];
                        i.isInterstitial(s) && i.advanceAssetBuffering(s, t)
                    }
                }
                ));
                var A = function(t) {
                    return function() {
                        if (i.getAssetPlayer(v) && i.schedule) {
                            i.shouldPlay = !0;
                            var r = i.schedule.findEventIndex(e.identifier);
                            i.advanceAfterAssetEnded(e, r, t)
                        }
                    }
                };
                return y.once(b.MEDIA_ENDED, A(r)),
                y.once(b.PLAYOUT_LIMIT_REACHED, A(1 / 0)),
                y.on(b.ERROR, (function(t, n) {
                    if (i.schedule) {
                        var a = i.getAssetPlayer(v);
                        if (n.details === k.BUFFER_STALLED_ERROR)
                            return null != a && a.appendInPlace ? void i.handleInPlaceStall(e) : (i.onTimeupdate(),
                            void i.checkBuffer(!0));
                        i.handleAssetItemError(n, e, i.schedule.findEventIndex(e.identifier), r, "Asset player error " + n.error + " " + e)
                    }
                }
                )),
                y.on(b.DESTROYING, (function() {
                    if (i.getAssetPlayer(v) && i.schedule) {
                        var t = new Error("Asset player destroyed unexpectedly " + v)
                          , n = {
                            fatal: !0,
                            type: R.OTHER_ERROR,
                            details: k.INTERSTITIAL_ASSET_ITEM_ERROR,
                            error: t
                        };
                        i.handleAssetItemError(n, e, i.schedule.findEventIndex(e.identifier), r, t.message)
                    }
                }
                )),
                this.log("INTERSTITIAL_ASSET_PLAYER_CREATED " + Xs(t)),
                this.hls.trigger(b.INTERSTITIAL_ASSET_PLAYER_CREATED, {
                    asset: t,
                    assetListIndex: r,
                    event: e,
                    player: y
                }),
                y
            }
            ,
            r.clearInterstitial = function(e, t) {
                var r = this;
                e.assetList.forEach((function(e) {
                    r.clearAssetPlayer(e.identifier, t)
                }
                )),
                e.reset()
            }
            ,
            r.resetAssetPlayer = function(e) {
                var t = this.getAssetPlayerQueueIndex(e);
                if (-1 !== t) {
                    this.log('reset asset player "' + e + '" after error');
                    var r = this.playerQueue[t];
                    this.transferMediaFromPlayer(r, null),
                    r.resetDetails()
                }
            }
            ,
            r.clearAssetPlayer = function(e, t) {
                var r = this.getAssetPlayerQueueIndex(e);
                if (-1 !== r) {
                    var i = this.playerQueue[r];
                    this.log("clear " + i + " toSegment: " + (t ? $s(t) : t)),
                    this.transferMediaFromPlayer(i, t),
                    this.playerQueue.splice(r, 1),
                    i.destroy()
                }
            }
            ,
            r.emptyPlayerQueue = function() {
                for (var e; e = this.playerQueue.pop(); )
                    e.destroy();
                this.playerQueue = []
            }
            ,
            r.startAssetPlayer = function(e, t, r, i, n) {
                var a = e.interstitial
                  , s = e.assetItem
                  , o = e.assetId
                  , l = a.assetList.length
                  , u = this.playingAsset;
                this.endedAsset = null,
                this.playingAsset = s,
                u && u.identifier === o || (u && (this.clearAssetPlayer(u.identifier, r[i]),
                delete u.error),
                this.log("INTERSTITIAL_ASSET_STARTED " + (t + 1) + "/" + l + " " + Xs(s)),
                this.hls.trigger(b.INTERSTITIAL_ASSET_STARTED, {
                    asset: s,
                    assetListIndex: t,
                    event: a,
                    schedule: r.slice(0),
                    scheduleIndex: i,
                    player: e
                })),
                this.bufferAssetPlayer(e, n)
            }
            ,
            r.bufferAssetPlayer = function(e, t) {
                var r, i;
                if (this.schedule) {
                    var n = e.interstitial
                      , a = e.assetItem
                      , s = this.schedule.findEventIndex(n.identifier)
                      , o = null == (r = this.schedule.items) ? void 0 : r[s];
                    if (o) {
                        e.loadSource(),
                        this.setBufferingItem(o),
                        this.bufferingAsset = a;
                        var l = this.getBufferingPlayer();
                        if (l !== e) {
                            var u = n.appendInPlace;
                            if (!u || !1 !== (null == l ? void 0 : l.interstitial.appendInPlace)) {
                                var d = (null == l ? void 0 : l.tracks) || (null == (i = this.detachedData) ? void 0 : i.tracks) || this.requiredTracks;
                                if (u && a !== this.playingAsset) {
                                    if (!e.tracks)
                                        return void this.log("Waiting for track info before buffering " + e);
                                    if (d && !j(d, e.tracks)) {
                                        var h = new Error("Asset " + Xs(a) + " SourceBuffer tracks ('" + Object.keys(e.tracks) + "') are not compatible with primary content tracks ('" + Object.keys(d) + "')")
                                          , f = {
                                            fatal: !0,
                                            type: R.OTHER_ERROR,
                                            details: k.INTERSTITIAL_ASSET_ITEM_ERROR,
                                            error: h
                                        }
                                          , c = n.findAssetIndex(a);
                                        return void this.handleAssetItemError(f, n, s, c, h.message)
                                    }
                                }
                                this.transferMediaTo(e, t)
                            }
                        }
                    }
                }
            }
            ,
            r.handleInPlaceStall = function(e) {
                var t = this.schedule
                  , r = this.primaryMedia;
                if (t && r) {
                    var i = r.currentTime
                      , n = t.findAssetIndex(e, i)
                      , a = e.assetList[n];
                    if (a) {
                        var s = this.getAssetPlayer(a.identifier);
                        if (s) {
                            var o = s.currentTime || i - a.timelineStart
                              , l = s.duration - o;
                            if (this.warn("Stalled at " + o + " of " + (o + l) + " in " + s + " " + e + " (media.currentTime: " + i + ")"),
                            o && (l / r.playbackRate < .5 || s.bufferedInPlaceToEnd(r)) && s.hls) {
                                var u = t.findEventIndex(e.identifier);
                                this.advanceAfterAssetEnded(e, u, n)
                            }
                        }
                    }
                }
            }
            ,
            r.advanceInPlace = function(e) {
                var t = this.primaryMedia;
                t && t.currentTime < e && (t.currentTime = e)
            }
            ,
            r.handleAssetItemError = function(e, t, r, i, n) {
                if (e.details !== k.BUFFER_STALLED_ERROR) {
                    var s = t.assetList[i] || null;
                    if (this.warn("INTERSTITIAL_ASSET_ERROR " + (s ? Xs(s) : s) + " " + e.error),
                    this.schedule) {
                        var o = (null == s ? void 0 : s.identifier) || ""
                          , l = this.getAssetPlayerQueueIndex(o)
                          , u = this.playerQueue[l] || null
                          , d = this.schedule.items
                          , h = a({}, e, {
                            fatal: !1,
                            errorAction: Gt(!0),
                            asset: s,
                            assetListIndex: i,
                            event: t,
                            schedule: d,
                            scheduleIndex: r,
                            player: u
                        });
                        if (this.hls.trigger(b.INTERSTITIAL_ASSET_ERROR, h),
                        e.fatal) {
                            var f = this.playingAsset
                              , c = this.bufferingAsset
                              , g = new Error(n);
                            if (s && (this.clearAssetPlayer(o, null),
                            s.error = g),
                            t.assetList.some((function(e) {
                                return !e.error
                            }
                            )))
                                for (var v = i; v < t.assetList.length; v++)
                                    this.resetAssetPlayer(t.assetList[v].identifier);
                            else
                                t.error = g;
                            this.updateSchedule(!0),
                            t.error ? this.primaryFallback(t) : f && f.identifier === o ? this.advanceAfterAssetEnded(t, r, i) : c && c.identifier === o && this.isInterstitial(this.bufferingItem) && this.advanceAssetBuffering(this.bufferingItem, c)
                        }
                    }
                }
            }
            ,
            r.primaryFallback = function(e) {
                var t = e.timelineStart
                  , r = this.effectivePlayingItem;
                if (r) {
                    this.log('Fallback to primary from event "' + e.identifier + '" start: ' + t + " pos: " + this.timelinePos + " playing: " + $s(r) + " error: " + e.error);
                    var i = this.timelinePos;
                    -1 === i && (i = this.hls.startPosition);
                    var n = this.updateItem(r, i);
                    if (this.itemsMatch(r, n) && this.clearInterstitial(e, null),
                    e.appendInPlace && (this.attachPrimary(t, null),
                    this.flushFrontBuffer(t)),
                    !this.schedule)
                        return;
                    var a = this.schedule.findItemIndexAtTime(i);
                    this.setSchedulePosition(a)
                } else
                    this.checkStart()
            }
            ,
            r.onAssetListLoaded = function(e, t) {
                var r, i, n = this, a = t.event, s = a.identifier, o = t.assetListResponse.ASSETS;
                if (null != (r = this.schedule) && r.hasEvent(s)) {
                    var l = a.timelineStart
                      , u = a.duration
                      , d = 0;
                    o.forEach((function(e, t) {
                        var r = parseFloat(e.DURATION);
                        n.createAsset(a, t, d, l + d, r, e.URI),
                        d += r
                    }
                    )),
                    a.duration = d,
                    this.log("Loaded asset-list with duration: " + d + " (was: " + u + ") " + a);
                    var h = this.waitingItem
                      , f = (null == h ? void 0 : h.event.identifier) === s;
                    this.updateSchedule();
                    var c = null == (i = this.bufferingItem) ? void 0 : i.event;
                    if (f) {
                        var g, v = this.schedule.findEventIndex(s), m = null == (g = this.schedule.items) ? void 0 : g[v];
                        if (m) {
                            if (!this.playingItem && this.timelinePos > m.end && this.schedule.findItemIndexAtTime(this.timelinePos) !== v)
                                return a.error = new Error("Interstitial no longer within playback range " + this.timelinePos + " " + a),
                                this.updateSchedule(!0),
                                void this.primaryFallback(a);
                            this.setBufferingItem(m)
                        }
                        this.setSchedulePosition(v)
                    } else if ((null == c ? void 0 : c.identifier) === s) {
                        var p = a.assetList[0];
                        if (p) {
                            var y = this.getAssetPlayer(p.identifier);
                            if (c.appendInPlace) {
                                var E = this.primaryMedia;
                                y && E && this.bufferAssetPlayer(y, E)
                            } else
                                y && y.loadSource()
                        }
                    }
                }
            }
            ,
            r.onError = function(e, t) {
                if (this.schedule)
                    switch (t.details) {
                    case k.ASSET_LIST_PARSING_ERROR:
                    case k.ASSET_LIST_LOAD_ERROR:
                    case k.ASSET_LIST_LOAD_TIMEOUT:
                        var r = t.interstitial;
                        r && (this.updateSchedule(!0),
                        this.primaryFallback(r));
                        break;
                    case k.BUFFER_STALLED_ERROR:
                        var i = this.endedItem || this.waitingItem || this.playingItem;
                        if (this.isInterstitial(i) && i.event.appendInPlace)
                            return void this.handleInPlaceStall(i.event);
                        this.log("Primary player stall @" + this.timelinePos + " bufferedPos: " + this.bufferedPos),
                        this.onTimeupdate(),
                        this.checkBuffer(!0)
                    }
            }
            ,
            i(t, [{
                key: "interstitialsManager",
                get: function() {
                    if (!this.hls)
                        return null;
                    if (this.manager)
                        return this.manager;
                    var e = this
                      , t = function() {
                        return e.bufferingItem || e.waitingItem
                    }
                      , r = function(t) {
                        return t ? e.getAssetPlayer(t.identifier) : t
                    }
                      , i = function(t, i, a, s, o) {
                        if (t) {
                            var l = t[i].start
                              , u = t.event;
                            if (u) {
                                if ("playout" === i || u.timelineOccupancy !== Vs.Point) {
                                    var d = r(a);
                                    (null == d ? void 0 : d.interstitial) === u && (l += d.assetItem.startOffset + d[o])
                                }
                            } else
                                l += ("bufferedPos" === s ? n() : e[s]) - t.start;
                            return l
                        }
                        return 0
                    }
                      , n = function() {
                        var t = e.bufferedPos;
                        return t === Number.MAX_VALUE ? a("primary") : Math.max(t, 0)
                    }
                      , a = function(t) {
                        var r, i;
                        return null != (r = e.primaryDetails) && r.live ? e.primaryDetails.edge : (null == (i = e.schedule) ? void 0 : i.durations[t]) || 0
                    }
                      , s = function(t, n) {
                        var a, s, o = e.effectivePlayingItem;
                        if ((null == o || null == (a = o.event) || !a.restrictions.skip) && e.schedule) {
                            e.log("seek to " + t + ' "' + n + '"');
                            var l = e.effectivePlayingItem
                              , u = e.schedule.findItemIndexAtTime(t, n)
                              , d = null == (s = e.schedule.items) ? void 0 : s[u]
                              , h = e.getBufferingPlayer()
                              , f = null == h ? void 0 : h.interstitial
                              , c = null == f ? void 0 : f.appendInPlace
                              , g = l && e.itemsMatch(l, d);
                            if (l && (c || g)) {
                                var v = r(e.playingAsset)
                                  , m = (null == v ? void 0 : v.media) || e.primaryMedia;
                                if (m) {
                                    var p = "primary" === n ? m.currentTime : i(l, n, e.playingAsset, "timelinePos", "currentTime")
                                      , y = t - p
                                      , E = (c ? p : m.currentTime) + y;
                                    if (E >= 0 && (!v || c || E <= v.duration))
                                        return void (m.currentTime = E)
                                }
                            }
                            if (d) {
                                var T = t;
                                if ("primary" !== n) {
                                    var S = t - d[n].start;
                                    T = d.start + S
                                }
                                var A = !e.isInterstitial(d);
                                if (e.isInterstitial(l) && !l.event.appendInPlace || !A && !d.event.appendInPlace) {
                                    if (l) {
                                        var L = e.findItemIndex(l);
                                        if (u > L) {
                                            var I = e.schedule.findJumpRestrictedIndex(L + 1, u);
                                            if (I > L)
                                                return void e.setSchedulePosition(I)
                                        }
                                        var R = 0;
                                        if (A)
                                            e.timelinePos = T,
                                            e.checkBuffer();
                                        else
                                            for (var k = d.event.assetList, b = t - (d[n] || d).start, D = k.length; D--; ) {
                                                var _ = k[D];
                                                if (_.duration && b >= _.startOffset && b < _.startOffset + _.duration) {
                                                    R = D;
                                                    break
                                                }
                                            }
                                        e.setSchedulePosition(u, R)
                                    }
                                } else {
                                    var P = e.media || (c ? null == h ? void 0 : h.media : null);
                                    P && (P.currentTime = T)
                                }
                            }
                        }
                    }
                      , o = function() {
                        var r = e.effectivePlayingItem;
                        if (e.isInterstitial(r))
                            return r;
                        var i = t();
                        return e.isInterstitial(i) ? i : null
                    }
                      , l = {
                        get bufferedEnd() {
                            var r, n = t(), a = e.bufferingItem;
                            return a && a === n && (i(a, "playout", e.bufferingAsset, "bufferedPos", "bufferedEnd") - a.playout.start || (null == (r = e.bufferingAsset) ? void 0 : r.startOffset)) || 0
                        },
                        get currentTime() {
                            var t = o()
                              , r = e.effectivePlayingItem;
                            return r && r === t ? i(r, "playout", e.effectivePlayingAsset, "timelinePos", "currentTime") - r.playout.start : 0
                        },
                        set currentTime(t) {
                            var r = o()
                              , i = e.effectivePlayingItem;
                            i && i === r && s(t + i.playout.start, "playout")
                        },
                        get duration() {
                            var e = o();
                            return e ? e.playout.end - e.playout.start : 0
                        },
                        get assetPlayers() {
                            var t, r = null == (t = o()) ? void 0 : t.event.assetList;
                            return r ? r.map((function(t) {
                                return e.getAssetPlayer(t.identifier)
                            }
                            )) : []
                        },
                        get playingIndex() {
                            var t, r = null == (t = o()) ? void 0 : t.event;
                            return r && e.effectivePlayingAsset ? r.findAssetIndex(e.effectivePlayingAsset) : -1
                        },
                        get scheduleItem() {
                            return o()
                        }
                    };
                    return this.manager = {
                        get events() {
                            var t;
                            return (null == (t = e.schedule) || null == (t = t.events) ? void 0 : t.slice(0)) || []
                        },
                        get schedule() {
                            var t;
                            return (null == (t = e.schedule) || null == (t = t.items) ? void 0 : t.slice(0)) || []
                        },
                        get interstitialPlayer() {
                            return o() ? l : null
                        },
                        get playerQueue() {
                            return e.playerQueue.slice(0)
                        },
                        get bufferingAsset() {
                            return e.bufferingAsset
                        },
                        get bufferingItem() {
                            return t()
                        },
                        get bufferingIndex() {
                            var r = t();
                            return e.findItemIndex(r)
                        },
                        get playingAsset() {
                            return e.effectivePlayingAsset
                        },
                        get playingItem() {
                            return e.effectivePlayingItem
                        },
                        get playingIndex() {
                            var t = e.effectivePlayingItem;
                            return e.findItemIndex(t)
                        },
                        primary: {
                            get bufferedEnd() {
                                return n()
                            },
                            get currentTime() {
                                var t = e.timelinePos;
                                return t > 0 ? t : 0
                            },
                            set currentTime(e) {
                                s(e, "primary")
                            },
                            get duration() {
                                return a("primary")
                            },
                            get seekableStart() {
                                var t;
                                return (null == (t = e.primaryDetails) ? void 0 : t.fragmentStart) || 0
                            }
                        },
                        integrated: {
                            get bufferedEnd() {
                                return i(t(), "integrated", e.bufferingAsset, "bufferedPos", "bufferedEnd")
                            },
                            get currentTime() {
                                return i(e.effectivePlayingItem, "integrated", e.effectivePlayingAsset, "timelinePos", "currentTime")
                            },
                            set currentTime(e) {
                                s(e, "integrated")
                            },
                            get duration() {
                                return a("integrated")
                            },
                            get seekableStart() {
                                var t;
                                return function(t, r) {
                                    var i;
                                    if (0 !== t && "primary" !== r && null != (i = e.schedule) && i.length) {
                                        var n, a = e.schedule.findItemIndexAtTime(t), s = null == (n = e.schedule.items) ? void 0 : n[a];
                                        if (s)
                                            return t + (s[r].start - s.start)
                                    }
                                    return t
                                }((null == (t = e.primaryDetails) ? void 0 : t.fragmentStart) || 0, "integrated")
                            }
                        },
                        skip: function() {
                            var t = e.effectivePlayingItem
                              , r = null == t ? void 0 : t.event;
                            if (r && !r.restrictions.skip) {
                                var i = e.findItemIndex(t);
                                if (r.appendInPlace) {
                                    var n = t.playout.start + t.event.duration;
                                    s(n + .001, "playout")
                                } else
                                    e.advanceAfterAssetEnded(r, i, 1 / 0)
                            }
                        }
                    }
                }
            }, {
                key: "effectivePlayingItem",
                get: function() {
                    return this.waitingItem || this.playingItem || this.endedItem
                }
            }, {
                key: "effectivePlayingAsset",
                get: function() {
                    return this.playingAsset || this.endedAsset
                }
            }, {
                key: "playingLastItem",
                get: function() {
                    var e, t = this.playingItem, r = null == (e = this.schedule) ? void 0 : e.items;
                    return !!(this.playbackStarted && t && r) && this.findItemIndex(t) === r.length - 1
                }
            }, {
                key: "playbackStarted",
                get: function() {
                    return null !== this.effectivePlayingItem
                }
            }, {
                key: "currentTime",
                get: function() {
                    var e, t;
                    if (null !== this.mediaSelection) {
                        var r = this.waitingItem || this.playingItem;
                        if (!this.isInterstitial(r) || r.event.appendInPlace) {
                            var i = this.media;
                            !i && null != (e = this.bufferingItem) && null != (e = e.event) && e.appendInPlace && (i = this.primaryMedia);
                            var n = null == (t = i) ? void 0 : t.currentTime;
                            if (void 0 !== n && A(n))
                                return n
                        }
                    }
                }
            }, {
                key: "primaryMedia",
                get: function() {
                    var e;
                    return this.media || (null == (e = this.detachedData) ? void 0 : e.media) || null
                }
            }, {
                key: "playbackDisabled",
                get: function() {
                    return !1 === this.hls.config.enableInterstitialPlayback
                }
            }, {
                key: "primaryDetails",
                get: function() {
                    var e;
                    return null == (e = this.mediaSelection) ? void 0 : e.main.details
                }
            }, {
                key: "primaryLive",
                get: function() {
                    var e;
                    return !(null == (e = this.primaryDetails) || !e.live)
                }
            }])
        }(N)
          , ro = function(e) {
            function t(t, r, i) {
                var n;
                return (n = e.call(this, t, r, i, "subtitle-stream-controller", x) || this).currentTrackId = -1,
                n.tracksBuffered = [],
                n.mainDetails = null,
                n.registerListeners(),
                n
            }
            o(t, e);
            var r = t.prototype;
            return r.onHandlerDestroying = function() {
                this.unregisterListeners(),
                e.prototype.onHandlerDestroying.call(this),
                this.mainDetails = null
            }
            ,
            r.registerListeners = function() {
                e.prototype.registerListeners.call(this);
                var t = this.hls;
                t.on(b.LEVEL_LOADED, this.onLevelLoaded, this),
                t.on(b.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this),
                t.on(b.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this),
                t.on(b.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this),
                t.on(b.SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this),
                t.on(b.BUFFER_FLUSHING, this.onBufferFlushing, this)
            }
            ,
            r.unregisterListeners = function() {
                e.prototype.unregisterListeners.call(this);
                var t = this.hls;
                t.off(b.LEVEL_LOADED, this.onLevelLoaded, this),
                t.off(b.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this),
                t.off(b.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this),
                t.off(b.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this),
                t.off(b.SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this),
                t.off(b.BUFFER_FLUSHING, this.onBufferFlushing, this)
            }
            ,
            r.startLoad = function(e, t) {
                this.stopLoad(),
                this.state = ki.IDLE,
                this.setInterval(500),
                this.nextLoadPosition = this.lastCurrentTime = e + this.timelineOffset,
                this.startPosition = t ? -1 : e,
                this.tick()
            }
            ,
            r.onManifestLoading = function() {
                e.prototype.onManifestLoading.call(this),
                this.mainDetails = null
            }
            ,
            r.onMediaDetaching = function(t, r) {
                this.tracksBuffered = [],
                e.prototype.onMediaDetaching.call(this, t, r)
            }
            ,
            r.onLevelLoaded = function(e, t) {
                this.mainDetails = t.details
            }
            ,
            r.onSubtitleFragProcessed = function(e, t) {
                var r = t.frag
                  , i = t.success;
                if (this.fragContextChanged(r) || (te(r) && (this.fragPrevious = r),
                this.state = ki.IDLE),
                i) {
                    var n = this.tracksBuffered[this.currentTrackId];
                    if (n) {
                        for (var a, s = r.start, o = 0; o < n.length; o++)
                            if (s >= n[o].start && s <= n[o].end) {
                                a = n[o];
                                break
                            }
                        var l = r.start + r.duration;
                        a ? a.end = l : (a = {
                            start: s,
                            end: l
                        },
                        n.push(a)),
                        this.fragmentTracker.fragBuffered(r),
                        this.fragBufferedComplete(r, null),
                        this.media && this.tick()
                    }
                }
            }
            ,
            r.onBufferFlushing = function(e, t) {
                var r = t.startOffset
                  , i = t.endOffset;
                if (0 === r && i !== Number.POSITIVE_INFINITY) {
                    var n = i - 1;
                    if (n <= 0)
                        return;
                    t.endOffsetSubtitles = Math.max(0, n),
                    this.tracksBuffered.forEach((function(e) {
                        for (var t = 0; t < e.length; )
                            if (e[t].end <= n)
                                e.shift();
                            else {
                                if (!(e[t].start < n))
                                    break;
                                e[t].start = n,
                                t++
                            }
                    }
                    )),
                    this.fragmentTracker.removeFragmentsInRange(r, n, x)
                }
            }
            ,
            r.onError = function(e, t) {
                var r = t.frag;
                (null == r ? void 0 : r.type) === x && (t.details === k.FRAG_GAP && this.fragmentTracker.fragBuffered(r, !0),
                this.fragCurrent && this.fragCurrent.abortRequests(),
                this.state !== ki.STOPPED && (this.state = ki.IDLE))
            }
            ,
            r.onSubtitleTracksUpdated = function(e, t) {
                var r = this
                  , i = t.subtitleTracks;
                this.levels && va(this.levels, i) ? this.levels = i.map((function(e) {
                    return new at(e)
                }
                )) : (this.tracksBuffered = [],
                this.levels = i.map((function(e) {
                    var t = new at(e);
                    return r.tracksBuffered[t.id] = [],
                    t
                }
                )),
                this.fragmentTracker.removeFragmentsInRange(0, Number.POSITIVE_INFINITY, x),
                this.fragPrevious = null,
                this.mediaBuffer = null)
            }
            ,
            r.onSubtitleTrackSwitch = function(e, t) {
                var r;
                if (this.currentTrackId = t.id,
                null != (r = this.levels) && r.length && -1 !== this.currentTrackId) {
                    var i = this.levels[this.currentTrackId];
                    null != i && i.details ? this.mediaBuffer = this.mediaBufferTimeRanges : this.mediaBuffer = null,
                    i && this.state !== ki.STOPPED && this.setInterval(500)
                } else
                    this.clearInterval()
            }
            ,
            r.onSubtitleTrackLoaded = function(e, t) {
                var r, i = this.currentTrackId, n = this.levels, a = t.details, s = t.id;
                if (n) {
                    var o = n[s];
                    if (!(s >= n.length) && o) {
                        this.log("Subtitle track " + s + " loaded [" + a.startSN + "," + a.endSN + "]" + (a.lastPartSn ? "[part-" + a.lastPartSn + "-" + a.lastPartIndex + "]" : "") + ",duration:" + a.totalduration),
                        this.mediaBuffer = this.mediaBufferTimeRanges;
                        var l = 0;
                        if (a.live || null != (r = o.details) && r.live) {
                            if (a.deltaUpdateFailed)
                                return;
                            var u = this.mainDetails;
                            if (!u)
                                return void (this.startFragRequested = !1);
                            var d, h = u.fragments[0];
                            o.details ? 0 === (l = this.alignPlaylists(a, o.details, null == (d = this.levelLastLoaded) ? void 0 : d.details)) && h && di(a, l = h.start) : a.hasProgramDateTime && u.hasProgramDateTime ? (Ai(a, u),
                            l = a.fragmentStart) : h && di(a, l = h.start),
                            u && !this.startFragRequested && this.setStartPosition(u, l)
                        }
                        o.details = a,
                        this.levelLastLoaded = o,
                        s === i && (this.hls.trigger(b.SUBTITLE_TRACK_UPDATED, {
                            details: a,
                            id: s,
                            groupId: t.groupId
                        }),
                        this.tick(),
                        a.live && !this.fragCurrent && this.media && this.state === ki.IDLE && (Et(null, a.fragments, this.media.currentTime, 0) || (this.warn("Subtitle playlist not aligned with playback"),
                        o.details = void 0)))
                    }
                } else
                    this.warn("Subtitle tracks were reset while loading level " + s)
            }
            ,
            r._handleFragmentLoadComplete = function(e) {
                var t = this
                  , r = e.frag
                  , i = e.payload
                  , n = r.decryptdata
                  , a = this.hls;
                if (!this.fragContextChanged(r) && i && i.byteLength > 0 && null != n && n.key && n.iv && Lr(n.method)) {
                    var s = performance.now();
                    this.decrypter.decrypt(new Uint8Array(i), n.key.buffer, n.iv.buffer, Ir(n.method)).catch((function(e) {
                        throw a.trigger(b.ERROR, {
                            type: R.MEDIA_ERROR,
                            details: k.FRAG_DECRYPT_ERROR,
                            fatal: !1,
                            error: e,
                            reason: e.message,
                            frag: r
                        }),
                        e
                    }
                    )).then((function(e) {
                        var t = performance.now();
                        a.trigger(b.FRAG_DECRYPTED, {
                            frag: r,
                            payload: e,
                            stats: {
                                tstart: s,
                                tdecrypt: t
                            }
                        })
                    }
                    )).catch((function(e) {
                        t.warn(e.name + ": " + e.message),
                        t.state = ki.IDLE
                    }
                    ))
                }
            }
            ,
            r.doTick = function() {
                if (this.media) {
                    if (this.state === ki.IDLE) {
                        var e = this.currentTrackId
                          , t = this.levels
                          , r = null == t ? void 0 : t[e];
                        if (!r || !t.length || !r.details)
                            return;
                        if (this.waitForLive(r))
                            return;
                        var i = this.config
                          , n = this.getLoadPosition()
                          , a = ur.bufferedInfo(this.tracksBuffered[this.currentTrackId] || [], n, i.maxBufferHole)
                          , s = a.end
                          , o = a.len
                          , l = r.details;
                        if (o > this.hls.maxBufferLength + l.levelTargetDuration)
                            return;
                        var u = l.fragments
                          , d = u.length
                          , h = l.edge
                          , f = null
                          , c = this.fragPrevious;
                        if (s < h) {
                            var g = i.maxFragLookUpTolerance
                              , v = s > h - g ? 0 : g;
                            !(f = Et(c, u, Math.max(u[0].start, s), v)) && c && c.start < u[0].start && (f = u[0])
                        } else
                            f = u[d - 1];
                        if (!(f = this.filterReplacedPrimary(f, r.details)))
                            return;
                        var m = u[f.sn - l.startSN - 1];
                        if (m && m.cc === f.cc && this.fragmentTracker.getState(m) === Kt && (f = m),
                        this.fragmentTracker.getState(f) === Kt) {
                            var p = this.mapToInitFragWhenRequired(f);
                            p && this.loadFragment(p, r, s)
                        }
                    }
                } else
                    this.state = ki.IDLE
            }
            ,
            r.loadFragment = function(t, r, i) {
                te(t) ? e.prototype.loadFragment.call(this, t, r, i) : this._loadInitSegment(t, r)
            }
            ,
            i(t, [{
                key: "mediaBufferTimeRanges",
                get: function() {
                    return new io(this.tracksBuffered[this.currentTrackId] || [])
                }
            }])
        }(bi)
          , io = function(e) {
            this.buffered = void 0;
            var t = function(t, r, i) {
                if ((r >>>= 0) > i - 1)
                    throw new DOMException("Failed to execute '" + t + "' on 'TimeRanges': The index provided (" + r + ") is greater than the maximum bound (" + i + ")");
                return e[r][t]
            };
            this.buffered = {
                get length() {
                    return e.length
                },
                end: function(r) {
                    return t("end", r, e.length)
                },
                start: function(r) {
                    return t("start", r, e.length)
                }
            }
        };
        function no(e, t) {
            var r;
            try {
                r = new Event("addtrack")
            } catch (e) {
                (r = document.createEvent("Event")).initEvent("addtrack", !1, !1)
            }
            r.track = e,
            t.dispatchEvent(r)
        }
        function ao(e, t) {
            var r = e.mode;
            if ("disabled" === r && (e.mode = "hidden"),
            e.cues && !e.cues.getCueById(t.id))
                try {
                    if (e.addCue(t),
                    !e.cues.getCueById(t.id))
                        throw new Error("addCue is failed for: " + t)
                } catch (r) {
                    Y.debug("[texttrack-utils]: " + r);
                    try {
                        var i = new self.TextTrackCue(t.startTime,t.endTime,t.text);
                        i.id = t.id,
                        e.addCue(i)
                    } catch (e) {
                        Y.debug("[texttrack-utils]: Legacy TextTrackCue fallback failed: " + e)
                    }
                }
            "disabled" === r && (e.mode = r)
        }
        function so(e, t) {
            var r = e.mode;
            if ("disabled" === r && (e.mode = "hidden"),
            e.cues)
                for (var i = e.cues.length; i--; )
                    t && e.cues[i].removeEventListener("enter", t),
                    e.removeCue(e.cues[i]);
            "disabled" === r && (e.mode = r)
        }
        function oo(e, t, r, i) {
            var n = e.mode;
            if ("disabled" === n && (e.mode = "hidden"),
            e.cues && e.cues.length > 0)
                for (var a = function(e, t, r) {
                    var i = []
                      , n = function(e, t) {
                        if (t <= e[0].startTime)
                            return 0;
                        var r = e.length - 1;
                        if (t > e[r].endTime)
                            return -1;
                        for (var i, n = 0, a = r; n <= a; )
                            if (t < e[i = Math.floor((a + n) / 2)].startTime)
                                a = i - 1;
                            else {
                                if (!(t > e[i].startTime && n < r))
                                    return i;
                                n = i + 1
                            }
                        return e[n].startTime - t < t - e[a].startTime ? n : a
                    }(e, t);
                    if (n > -1)
                        for (var a = n, s = e.length; a < s; a++) {
                            var o = e[a];
                            if (o.startTime >= t && o.endTime <= r)
                                i.push(o);
                            else if (o.startTime > r)
                                return i
                        }
                    return i
                }(e.cues, t, r), s = 0; s < a.length; s++)
                    i && !i(a[s]) || e.removeCue(a[s]);
            "disabled" === n && (e.mode = n)
        }
        function lo(e) {
            for (var t = [], r = 0; r < e.length; r++) {
                var i = e[r];
                "subtitles" !== i.kind && "captions" !== i.kind || !i.label || t.push(e[r])
            }
            return t
        }
        var uo = function(e) {
            function t(t) {
                var r;
                return (r = e.call(this, t, "subtitle-track-controller") || this).media = null,
                r.tracks = [],
                r.groupIds = null,
                r.tracksInGroup = [],
                r.trackId = -1,
                r.currentTrack = null,
                r.selectDefaultTrack = !0,
                r.queuedDefaultTrack = -1,
                r.useTextTrackPolling = !1,
                r.subtitlePollingInterval = -1,
                r._subtitleDisplay = !0,
                r.asyncPollTrackChange = function() {
                    return r.pollTrackChange(0)
                }
                ,
                r.onTextTracksChanged = function() {
                    if (r.useTextTrackPolling || self.clearInterval(r.subtitlePollingInterval),
                    r.media && r.hls.config.renderTextTracksNatively) {
                        for (var e = null, t = lo(r.media.textTracks), i = 0; i < t.length; i++)
                            if ("hidden" === t[i].mode)
                                e = t[i];
                            else if ("showing" === t[i].mode) {
                                e = t[i];
                                break
                            }
                        var n = r.findTrackForTextTrack(e);
                        r.subtitleTrack !== n && r.setSubtitleTrack(n)
                    }
                }
                ,
                r.registerListeners(),
                r
            }
            o(t, e);
            var r = t.prototype;
            return r.destroy = function() {
                this.unregisterListeners(),
                this.tracks.length = 0,
                this.tracksInGroup.length = 0,
                this.currentTrack = null,
                this.onTextTracksChanged = this.asyncPollTrackChange = null,
                e.prototype.destroy.call(this)
            }
            ,
            r.registerListeners = function() {
                var e = this.hls;
                e.on(b.MEDIA_ATTACHED, this.onMediaAttached, this),
                e.on(b.MEDIA_DETACHING, this.onMediaDetaching, this),
                e.on(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.on(b.MANIFEST_PARSED, this.onManifestParsed, this),
                e.on(b.LEVEL_LOADING, this.onLevelLoading, this),
                e.on(b.LEVEL_SWITCHING, this.onLevelSwitching, this),
                e.on(b.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this),
                e.on(b.ERROR, this.onError, this)
            }
            ,
            r.unregisterListeners = function() {
                var e = this.hls;
                e.off(b.MEDIA_ATTACHED, this.onMediaAttached, this),
                e.off(b.MEDIA_DETACHING, this.onMediaDetaching, this),
                e.off(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.off(b.MANIFEST_PARSED, this.onManifestParsed, this),
                e.off(b.LEVEL_LOADING, this.onLevelLoading, this),
                e.off(b.LEVEL_SWITCHING, this.onLevelSwitching, this),
                e.off(b.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this),
                e.off(b.ERROR, this.onError, this)
            }
            ,
            r.onMediaAttached = function(e, t) {
                this.media = t.media,
                this.media && (this.queuedDefaultTrack > -1 && (this.subtitleTrack = this.queuedDefaultTrack,
                this.queuedDefaultTrack = -1),
                this.useTextTrackPolling = !(this.media.textTracks && "onchange"in this.media.textTracks),
                this.useTextTrackPolling ? this.pollTrackChange(500) : this.media.textTracks.addEventListener("change", this.asyncPollTrackChange))
            }
            ,
            r.pollTrackChange = function(e) {
                self.clearInterval(this.subtitlePollingInterval),
                this.subtitlePollingInterval = self.setInterval(this.onTextTracksChanged, e)
            }
            ,
            r.onMediaDetaching = function(e, t) {
                var r = this.media;
                if (r) {
                    var i = !!t.transferMedia;
                    self.clearInterval(this.subtitlePollingInterval),
                    this.useTextTrackPolling || r.textTracks.removeEventListener("change", this.asyncPollTrackChange),
                    this.trackId > -1 && (this.queuedDefaultTrack = this.trackId),
                    this.subtitleTrack = -1,
                    this.media = null,
                    i || lo(r.textTracks).forEach((function(e) {
                        so(e)
                    }
                    ))
                }
            }
            ,
            r.onManifestLoading = function() {
                this.tracks = [],
                this.groupIds = null,
                this.tracksInGroup = [],
                this.trackId = -1,
                this.currentTrack = null,
                this.selectDefaultTrack = !0
            }
            ,
            r.onManifestParsed = function(e, t) {
                this.tracks = t.subtitleTracks
            }
            ,
            r.onSubtitleTrackLoaded = function(e, t) {
                var r = t.id
                  , i = t.groupId
                  , n = t.details
                  , a = this.tracksInGroup[r];
                if (a && a.groupId === i) {
                    var s = a.details;
                    a.details = t.details,
                    this.log("Subtitle track " + r + ' "' + a.name + '" lang:' + a.lang + " group:" + i + " loaded [" + n.startSN + "-" + n.endSN + "]"),
                    r === this.trackId && this.playlistLoaded(r, t, s)
                } else
                    this.warn("Subtitle track with id:" + r + " and group:" + i + " not found in active group " + (null == a ? void 0 : a.groupId))
            }
            ,
            r.onLevelLoading = function(e, t) {
                this.switchLevel(t.level)
            }
            ,
            r.onLevelSwitching = function(e, t) {
                this.switchLevel(t.level)
            }
            ,
            r.switchLevel = function(e) {
                var t = this.hls.levels[e];
                if (t) {
                    var r = t.subtitleGroups || null
                      , i = this.groupIds
                      , n = this.currentTrack;
                    if (!r || (null == i ? void 0 : i.length) !== (null == r ? void 0 : r.length) || null != r && r.some((function(e) {
                        return -1 === (null == i ? void 0 : i.indexOf(e))
                    }
                    ))) {
                        this.groupIds = r,
                        this.trackId = -1,
                        this.currentTrack = null;
                        var a = this.tracks.filter((function(e) {
                            return !r || -1 !== r.indexOf(e.groupId)
                        }
                        ));
                        if (a.length)
                            this.selectDefaultTrack && !a.some((function(e) {
                                return e.default
                            }
                            )) && (this.selectDefaultTrack = !1),
                            a.forEach((function(e, t) {
                                e.id = t
                            }
                            ));
                        else if (!n && !this.tracksInGroup.length)
                            return;
                        this.tracksInGroup = a;
                        var s = this.hls.config.subtitlePreference;
                        if (!n && s) {
                            this.selectDefaultTrack = !1;
                            var o = ft(s, a);
                            if (o > -1)
                                n = a[o];
                            else {
                                var l = ft(s, this.tracks);
                                n = this.tracks[l]
                            }
                        }
                        var u = this.findTrackId(n);
                        -1 === u && n && (u = this.findTrackId(null));
                        var d = {
                            subtitleTracks: a
                        };
                        this.log("Updating subtitle tracks, " + a.length + ' track(s) found in "' + (null == r ? void 0 : r.join(",")) + '" group-id'),
                        this.hls.trigger(b.SUBTITLE_TRACKS_UPDATED, d),
                        -1 !== u && -1 === this.trackId && this.setSubtitleTrack(u)
                    }
                }
            }
            ,
            r.findTrackId = function(e) {
                for (var t = this.tracksInGroup, r = this.selectDefaultTrack, i = 0; i < t.length; i++) {
                    var n = t[i];
                    if ((!r || n.default) && (r || e) && (!e || ct(n, e)))
                        return i
                }
                if (e) {
                    for (var a = 0; a < t.length; a++) {
                        var s = t[a];
                        if (ma(e.attrs, s.attrs, ["LANGUAGE", "ASSOC-LANGUAGE", "CHARACTERISTICS"]))
                            return a
                    }
                    for (var o = 0; o < t.length; o++) {
                        var l = t[o];
                        if (ma(e.attrs, l.attrs, ["LANGUAGE"]))
                            return o
                    }
                }
                return -1
            }
            ,
            r.findTrackForTextTrack = function(e) {
                if (e)
                    for (var t = this.tracksInGroup, r = 0; r < t.length; r++)
                        if (pa(t[r], e))
                            return r;
                return -1
            }
            ,
            r.onError = function(e, t) {
                !t.fatal && t.context && (t.context.type !== C || t.context.id !== this.trackId || this.groupIds && -1 === this.groupIds.indexOf(t.context.groupId) || this.checkRetry(t))
            }
            ,
            r.setSubtitleOption = function(e) {
                if (this.hls.config.subtitlePreference = e,
                e) {
                    if (-1 === e.id)
                        return this.setSubtitleTrack(-1),
                        null;
                    var t = this.allSubtitleTracks;
                    if (this.selectDefaultTrack = !1,
                    t.length) {
                        var r = this.currentTrack;
                        if (r && ct(e, r))
                            return r;
                        var i = ft(e, this.tracksInGroup);
                        if (i > -1) {
                            var n = this.tracksInGroup[i];
                            return this.setSubtitleTrack(i),
                            n
                        }
                        if (r)
                            return null;
                        var a = ft(e, t);
                        if (a > -1)
                            return t[a]
                    }
                }
                return null
            }
            ,
            r.loadPlaylist = function(t) {
                e.prototype.loadPlaylist.call(this),
                this.shouldLoadPlaylist(this.currentTrack) && this.scheduleLoading(this.currentTrack, t)
            }
            ,
            r.loadingPlaylist = function(t, r) {
                e.prototype.loadingPlaylist.call(this, t, r);
                var i = t.id
                  , n = t.groupId
                  , a = this.getUrlWithDirectives(t.url, r)
                  , s = t.details
                  , o = null == s ? void 0 : s.age;
                this.log("Loading subtitle " + i + ' "' + t.name + '" lang:' + t.lang + " group:" + n + (void 0 !== (null == r ? void 0 : r.msn) ? " at sn " + r.msn + " part " + r.part : "") + (o && s.live ? " age " + o.toFixed(1) + (s.type && " " + s.type || "") : "") + " " + a),
                this.hls.trigger(b.SUBTITLE_TRACK_LOADING, {
                    url: a,
                    id: i,
                    groupId: n,
                    deliveryDirectives: r || null,
                    track: t
                })
            }
            ,
            r.toggleTrackModes = function() {
                var e = this.media;
                if (e) {
                    var t, r = lo(e.textTracks), i = this.currentTrack;
                    if (i && ((t = r.filter((function(e) {
                        return pa(i, e)
                    }
                    ))[0]) || this.warn('Unable to find subtitle TextTrack with name "' + i.name + '" and language "' + i.lang + '"')),
                    [].slice.call(r).forEach((function(e) {
                        "disabled" !== e.mode && e !== t && (e.mode = "disabled")
                    }
                    )),
                    t) {
                        var n = this.subtitleDisplay ? "showing" : "hidden";
                        t.mode !== n && (t.mode = n)
                    }
                }
            }
            ,
            r.setSubtitleTrack = function(e) {
                var t = this.tracksInGroup;
                if (this.media)
                    if (e < -1 || e >= t.length || !A(e))
                        this.warn("Invalid subtitle track id: " + e);
                    else {
                        this.selectDefaultTrack = !1;
                        var r = this.currentTrack
                          , i = t[e] || null;
                        if (this.trackId = e,
                        this.currentTrack = i,
                        this.toggleTrackModes(),
                        i) {
                            var n = !!i.details && !i.details.live;
                            if (e !== this.trackId || i !== r || !n) {
                                this.log("Switching to subtitle-track " + e + (i ? ' "' + i.name + '" lang:' + i.lang + " group:" + i.groupId : ""));
                                var a = i.id
                                  , s = i.groupId
                                  , o = void 0 === s ? "" : s
                                  , l = i.name
                                  , u = i.type
                                  , d = i.url;
                                this.hls.trigger(b.SUBTITLE_TRACK_SWITCH, {
                                    id: a,
                                    groupId: o,
                                    name: l,
                                    type: u,
                                    url: d
                                });
                                var h = this.switchParams(i.url, null == r ? void 0 : r.details, i.details);
                                this.loadPlaylist(h)
                            }
                        } else
                            this.hls.trigger(b.SUBTITLE_TRACK_SWITCH, {
                                id: e
                            })
                    }
                else
                    this.queuedDefaultTrack = e
            }
            ,
            i(t, [{
                key: "subtitleDisplay",
                get: function() {
                    return this._subtitleDisplay
                },
                set: function(e) {
                    this._subtitleDisplay = e,
                    this.trackId > -1 && this.toggleTrackModes()
                }
            }, {
                key: "allSubtitleTracks",
                get: function() {
                    return this.tracks
                }
            }, {
                key: "subtitleTracks",
                get: function() {
                    return this.tracksInGroup
                }
            }, {
                key: "subtitleTrack",
                get: function() {
                    return this.trackId
                },
                set: function(e) {
                    this.selectDefaultTrack = !1,
                    this.setSubtitleTrack(e)
                }
            }])
        }(ga)
          , ho = {
            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
        }
          , fo = function(e) {
            return String.fromCharCode(ho[e] || e)
        }
          , co = 15
          , go = 100
          , vo = {
            17: 1,
            18: 3,
            21: 5,
            22: 7,
            23: 9,
            16: 11,
            19: 12,
            20: 14
        }
          , mo = {
            17: 2,
            18: 4,
            21: 6,
            22: 8,
            23: 10,
            19: 13,
            20: 15
        }
          , po = {
            25: 1,
            26: 3,
            29: 5,
            30: 7,
            31: 9,
            24: 11,
            27: 12,
            28: 14
        }
          , yo = {
            25: 2,
            26: 4,
            29: 6,
            30: 8,
            31: 10,
            27: 13,
            28: 15
        }
          , Eo = ["white", "green", "blue", "cyan", "red", "yellow", "magenta", "black", "transparent"]
          , To = function() {
            function e() {
                this.time = null,
                this.verboseLevel = 0
            }
            return e.prototype.log = function(e, t) {
                if (this.verboseLevel >= e) {
                    var r = "function" == typeof t ? t() : t;
                    Y.log(this.time + " [" + e + "] " + r)
                }
            }
            ,
            e
        }()
          , So = function(e) {
            for (var t = [], r = 0; r < e.length; r++)
                t.push(e[r].toString(16));
            return t
        }
          , Ao = function() {
            function e() {
                this.foreground = "white",
                this.underline = !1,
                this.italics = !1,
                this.background = "black",
                this.flash = !1
            }
            var t = e.prototype;
            return t.reset = function() {
                this.foreground = "white",
                this.underline = !1,
                this.italics = !1,
                this.background = "black",
                this.flash = !1
            }
            ,
            t.setStyles = function(e) {
                for (var t = ["foreground", "underline", "italics", "background", "flash"], r = 0; r < t.length; r++) {
                    var i = t[r];
                    e.hasOwnProperty(i) && (this[i] = e[i])
                }
            }
            ,
            t.isDefault = function() {
                return "white" === this.foreground && !this.underline && !this.italics && "black" === this.background && !this.flash
            }
            ,
            t.equals = function(e) {
                return this.foreground === e.foreground && this.underline === e.underline && this.italics === e.italics && this.background === e.background && this.flash === e.flash
            }
            ,
            t.copy = function(e) {
                this.foreground = e.foreground,
                this.underline = e.underline,
                this.italics = e.italics,
                this.background = e.background,
                this.flash = e.flash
            }
            ,
            t.toString = function() {
                return "color=" + this.foreground + ", underline=" + this.underline + ", italics=" + this.italics + ", background=" + this.background + ", flash=" + this.flash
            }
            ,
            e
        }()
          , Lo = function() {
            function e() {
                this.uchar = " ",
                this.penState = new Ao
            }
            var t = e.prototype;
            return t.reset = function() {
                this.uchar = " ",
                this.penState.reset()
            }
            ,
            t.setChar = function(e, t) {
                this.uchar = e,
                this.penState.copy(t)
            }
            ,
            t.setPenState = function(e) {
                this.penState.copy(e)
            }
            ,
            t.equals = function(e) {
                return this.uchar === e.uchar && this.penState.equals(e.penState)
            }
            ,
            t.copy = function(e) {
                this.uchar = e.uchar,
                this.penState.copy(e.penState)
            }
            ,
            t.isEmpty = function() {
                return " " === this.uchar && this.penState.isDefault()
            }
            ,
            e
        }()
          , Io = function() {
            function e(e) {
                this.chars = [],
                this.pos = 0,
                this.currPenState = new Ao,
                this.cueStartTime = null,
                this.logger = void 0;
                for (var t = 0; t < go; t++)
                    this.chars.push(new Lo);
                this.logger = e
            }
            var t = e.prototype;
            return t.equals = function(e) {
                for (var t = 0; t < go; t++)
                    if (!this.chars[t].equals(e.chars[t]))
                        return !1;
                return !0
            }
            ,
            t.copy = function(e) {
                for (var t = 0; t < go; t++)
                    this.chars[t].copy(e.chars[t])
            }
            ,
            t.isEmpty = function() {
                for (var e = !0, t = 0; t < go; t++)
                    if (!this.chars[t].isEmpty()) {
                        e = !1;
                        break
                    }
                return e
            }
            ,
            t.setCursor = function(e) {
                this.pos !== e && (this.pos = e),
                this.pos < 0 ? (this.logger.log(3, "Negative cursor position " + this.pos),
                this.pos = 0) : this.pos > go && (this.logger.log(3, "Too large cursor position " + this.pos),
                this.pos = go)
            }
            ,
            t.moveCursor = function(e) {
                var t = this.pos + e;
                if (e > 1)
                    for (var r = this.pos + 1; r < t + 1; r++)
                        this.chars[r].setPenState(this.currPenState);
                this.setCursor(t)
            }
            ,
            t.backSpace = function() {
                this.moveCursor(-1),
                this.chars[this.pos].setChar(" ", this.currPenState)
            }
            ,
            t.insertChar = function(e) {
                var t = this;
                e >= 144 && this.backSpace();
                var r = fo(e);
                this.pos >= go ? this.logger.log(0, (function() {
                    return "Cannot insert " + e.toString(16) + " (" + r + ") at position " + t.pos + ". Skipping it!"
                }
                )) : (this.chars[this.pos].setChar(r, this.currPenState),
                this.moveCursor(1))
            }
            ,
            t.clearFromPos = function(e) {
                var t;
                for (t = e; t < go; 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, r = 0; r < go; r++) {
                    var i = this.chars[r].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
        }()
          , Ro = function() {
            function e(e) {
                this.rows = [],
                this.currRow = 14,
                this.nrRollUpRows = null,
                this.lastOutputScreen = null,
                this.logger = void 0;
                for (var t = 0; t < co; t++)
                    this.rows.push(new Io(e));
                this.logger = e
            }
            var t = e.prototype;
            return t.reset = function() {
                for (var e = 0; e < co; e++)
                    this.rows[e].clear();
                this.currRow = 14
            }
            ,
            t.equals = function(e) {
                for (var t = !0, r = 0; r < co; r++)
                    if (!this.rows[r].equals(e.rows[r])) {
                        t = !1;
                        break
                    }
                return t
            }
            ,
            t.copy = function(e) {
                for (var t = 0; t < co; t++)
                    this.rows[t].copy(e.rows[t])
            }
            ,
            t.isEmpty = function() {
                for (var e = !0, t = 0; t < co; 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) {
                this.logger.log(2, "setCursor: " + e),
                this.rows[this.currRow].setCursor(e)
            }
            ,
            t.setPAC = function(e) {
                this.logger.log(2, (function() {
                    return "pacData = " + lt(e)
                }
                ));
                var t = e.row - 1;
                if (this.nrRollUpRows && t < this.nrRollUpRows - 1 && (t = this.nrRollUpRows - 1),
                this.nrRollUpRows && this.currRow !== t) {
                    for (var r = 0; r < co; r++)
                        this.rows[r].clear();
                    var i = this.currRow + 1 - this.nrRollUpRows
                      , n = this.lastOutputScreen;
                    if (n) {
                        var a = n.rows[i].cueStartTime
                          , s = this.logger.time;
                        if (null !== a && null !== s && a < s)
                            for (var o = 0; o < this.nrRollUpRows; o++)
                                this.rows[t - this.nrRollUpRows + o + 1].copy(n.rows[i + o])
                    }
                }
                this.currRow = t;
                var l = this.rows[this.currRow];
                if (null !== e.indent) {
                    var u = e.indent
                      , d = Math.max(u - 1, 0);
                    l.setCursor(e.indent),
                    e.color = l.chars[d].penState.foreground
                }
                var h = {
                    foreground: e.color,
                    underline: e.underline,
                    italics: e.italics,
                    background: "black",
                    flash: !1
                };
                this.setPen(h)
            }
            ,
            t.setBkgData = function(e) {
                this.logger.log(2, (function() {
                    return "bkgData = " + lt(e)
                }
                )),
                this.backSpace(),
                this.setPen(e),
                this.insertChar(32)
            }
            ,
            t.setRollUpRows = function(e) {
                this.nrRollUpRows = e
            }
            ,
            t.rollUp = function() {
                var e = this;
                if (null !== this.nrRollUpRows) {
                    this.logger.log(1, (function() {
                        return e.getDisplayText()
                    }
                    ));
                    var t = this.currRow + 1 - this.nrRollUpRows
                      , r = this.rows.splice(t, 1)[0];
                    r.clear(),
                    this.rows.splice(this.currRow, 0, r),
                    this.logger.log(2, "Rolling up")
                } else
                    this.logger.log(3, "roll_up but nrRollUpRows not set yet")
            }
            ,
            t.getDisplayText = function(e) {
                e = e || !1;
                for (var t = [], r = "", i = -1, n = 0; n < co; n++) {
                    var a = this.rows[n].getTextString();
                    a && (i = n + 1,
                    e ? t.push("Row " + i + ": '" + a + "'") : t.push(a.trim()))
                }
                return t.length > 0 && (r = e ? "[" + t.join(" | ") + "]" : t.join("\n")),
                r
            }
            ,
            t.getTextAndFormat = function() {
                return this.rows
            }
            ,
            e
        }()
          , ko = function() {
            function e(e, t, r) {
                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.logger = void 0,
                this.chNr = e,
                this.outputFilter = t,
                this.mode = null,
                this.verbose = 0,
                this.displayedMemory = new Ro(r),
                this.nonDisplayedMemory = new Ro(r),
                this.lastOutputScreen = new Ro(r),
                this.currRollUpRow = this.displayedMemory.rows[14],
                this.writeScreen = this.displayedMemory,
                this.mode = null,
                this.cueStartTime = null,
                this.logger = r
            }
            var t = e.prototype;
            return t.reset = function() {
                this.mode = null,
                this.displayedMemory.reset(),
                this.nonDisplayedMemory.reset(),
                this.lastOutputScreen.reset(),
                this.outputFilter.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,
                this.logger.log(2, (function() {
                    return "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 = this, r = 0; r < e.length; r++)
                    this.writeScreen.insertChar(e[r]);
                var i = this.writeScreen === this.displayedMemory ? "DISP" : "NON_DISP";
                this.logger.log(2, (function() {
                    return i + ": " + t.writeScreen.getDisplayText(!0)
                }
                )),
                "MODE_PAINT-ON" !== this.mode && "MODE_ROLL-UP" !== this.mode || (this.logger.log(1, (function() {
                    return "DISPLAYED: " + t.displayedMemory.getDisplayText(!0)
                }
                )),
                this.outputDataUpdate())
            }
            ,
            t.ccRCL = function() {
                this.logger.log(2, "RCL - Resume Caption Loading"),
                this.setMode("MODE_POP-ON")
            }
            ,
            t.ccBS = function() {
                this.logger.log(2, "BS - BackSpace"),
                "MODE_TEXT" !== this.mode && (this.writeScreen.backSpace(),
                this.writeScreen === this.displayedMemory && this.outputDataUpdate())
            }
            ,
            t.ccAOF = function() {}
            ,
            t.ccAON = function() {}
            ,
            t.ccDER = function() {
                this.logger.log(2, "DER- Delete to End of Row"),
                this.writeScreen.clearToEndOfRow(),
                this.outputDataUpdate()
            }
            ,
            t.ccRU = function(e) {
                this.logger.log(2, "RU(" + e + ") - Roll Up"),
                this.writeScreen = this.displayedMemory,
                this.setMode("MODE_ROLL-UP"),
                this.writeScreen.setRollUpRows(e)
            }
            ,
            t.ccFON = function() {
                this.logger.log(2, "FON - Flash On"),
                this.writeScreen.setPen({
                    flash: !0
                })
            }
            ,
            t.ccRDC = function() {
                this.logger.log(2, "RDC - Resume Direct Captioning"),
                this.setMode("MODE_PAINT-ON")
            }
            ,
            t.ccTR = function() {
                this.logger.log(2, "TR"),
                this.setMode("MODE_TEXT")
            }
            ,
            t.ccRTD = function() {
                this.logger.log(2, "RTD"),
                this.setMode("MODE_TEXT")
            }
            ,
            t.ccEDM = function() {
                this.logger.log(2, "EDM - Erase Displayed Memory"),
                this.displayedMemory.reset(),
                this.outputDataUpdate(!0)
            }
            ,
            t.ccCR = function() {
                this.logger.log(2, "CR - Carriage Return"),
                this.writeScreen.rollUp(),
                this.outputDataUpdate(!0)
            }
            ,
            t.ccENM = function() {
                this.logger.log(2, "ENM - Erase Non-displayed Memory"),
                this.nonDisplayedMemory.reset()
            }
            ,
            t.ccEOC = function() {
                var e = this;
                if (this.logger.log(2, "EOC - End Of Caption"),
                "MODE_POP-ON" === this.mode) {
                    var t = this.displayedMemory;
                    this.displayedMemory = this.nonDisplayedMemory,
                    this.nonDisplayedMemory = t,
                    this.writeScreen = this.nonDisplayedMemory,
                    this.logger.log(1, (function() {
                        return "DISP: " + e.displayedMemory.getDisplayText()
                    }
                    ))
                }
                this.outputDataUpdate(!0)
            }
            ,
            t.ccTO = function(e) {
                this.logger.log(2, "TO(" + e + ") - Tab Offset"),
                this.writeScreen.moveCursor(e)
            }
            ,
            t.ccMIDROW = function(e) {
                var t = {
                    flash: !1
                };
                if (t.underline = e % 2 == 1,
                t.italics = e >= 46,
                t.italics)
                    t.foreground = "white";
                else {
                    var r = Math.floor(e / 2) - 16;
                    t.foreground = ["white", "green", "blue", "cyan", "red", "yellow", "magenta"][r]
                }
                this.logger.log(2, "MIDROW: " + lt(t)),
                this.writeScreen.setPen(t)
            }
            ,
            t.outputDataUpdate = function(e) {
                void 0 === e && (e = !1);
                var t = this.logger.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
        }()
          , bo = function() {
            function e(e, t, r) {
                this.channels = void 0,
                this.currentChannel = 0,
                this.cmdHistory = {
                    a: null,
                    b: null
                },
                this.logger = void 0;
                var i = this.logger = new To;
                this.channels = [null, new ko(e,t,i), new ko(e + 1,r,i)]
            }
            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 r = this;
                this.logger.time = e;
                for (var i = function(e) {
                    var i = 127 & t[e]
                      , n = 127 & t[e + 1]
                      , a = !1
                      , s = null;
                    if (0 === i && 0 === n)
                        return 0;
                    r.logger.log(3, (function() {
                        return "[" + So([t[e], t[e + 1]]) + "] -> (" + So([i, n]) + ")"
                    }
                    ));
                    var o = r.cmdHistory;
                    if (i >= 16 && i <= 31) {
                        if (function(e, t, r) {
                            return r.a === e && r.b === t
                        }(i, n, o))
                            return Do(null, null, o),
                            r.logger.log(3, (function() {
                                return "Repeated command (" + So([i, n]) + ") is dropped"
                            }
                            )),
                            0;
                        Do(i, n, r.cmdHistory),
                        (a = r.parseCmd(i, n)) || (a = r.parseMidrow(i, n)),
                        a || (a = r.parsePAC(i, n)),
                        a || (a = r.parseBackgroundAttributes(i, n))
                    } else
                        Do(null, null, o);
                    if (!a && (s = r.parseChars(i, n))) {
                        var l = r.currentChannel;
                        l && l > 0 ? r.channels[l].insertChars(s) : r.logger.log(2, "No channel found yet. TEXT-MODE?")
                    }
                    a || s || r.logger.log(2, (function() {
                        return "Couldn't parse cleaned data " + So([i, n]) + " orig: " + So([t[e], t[e + 1]])
                    }
                    ))
                }, n = 0; n < t.length; n += 2)
                    i(n)
            }
            ,
            t.parseCmd = function(e, t) {
                if (!((20 === e || 28 === e || 21 === e || 29 === e) && t >= 32 && t <= 47 || (23 === e || 31 === e) && t >= 33 && t <= 35))
                    return !1;
                var r = 20 === e || 21 === e || 23 === e ? 1 : 2
                  , i = this.channels[r];
                return 20 === e || 21 === e || 28 === e || 29 === 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.currentChannel = r,
                !0
            }
            ,
            t.parseMidrow = function(e, t) {
                var r = 0;
                if ((17 === e || 25 === e) && t >= 32 && t <= 47) {
                    if ((r = 17 === e ? 1 : 2) !== this.currentChannel)
                        return this.logger.log(0, "Mismatch channel in midrow parsing"),
                        !1;
                    var i = this.channels[r];
                    return !!i && (i.ccMIDROW(t),
                    this.logger.log(3, (function() {
                        return "MIDROW (" + So([e, t]) + ")"
                    }
                    )),
                    !0)
                }
                return !1
            }
            ,
            t.parsePAC = function(e, t) {
                var r;
                if (!((e >= 17 && e <= 23 || e >= 25 && e <= 31) && t >= 64 && t <= 127 || (16 === e || 24 === e) && t >= 64 && t <= 95))
                    return !1;
                var i = e <= 23 ? 1 : 2;
                r = t >= 64 && t <= 95 ? 1 === i ? vo[e] : po[e] : 1 === i ? mo[e] : yo[e];
                var n = this.channels[i];
                return !!n && (n.setPAC(this.interpretPAC(r, t)),
                this.currentChannel = i,
                !0)
            }
            ,
            t.interpretPAC = function(e, t) {
                var r, i = {
                    color: null,
                    italics: !1,
                    indent: null,
                    underline: !1,
                    row: e
                };
                return r = t > 95 ? t - 96 : t - 64,
                i.underline = 1 == (1 & r),
                r <= 13 ? i.color = ["white", "green", "blue", "cyan", "red", "yellow", "magenta", "white"][Math.floor(r / 2)] : r <= 15 ? (i.italics = !0,
                i.color = "white") : i.indent = 4 * Math.floor((r - 16) / 2),
                i
            }
            ,
            t.parseChars = function(e, t) {
                var r, i, n = null, a = null;
                return e >= 25 ? (r = 2,
                a = e - 8) : (r = 1,
                a = e),
                a >= 17 && a <= 19 ? (i = 17 === a ? t + 80 : 18 === a ? t + 112 : t + 144,
                this.logger.log(2, (function() {
                    return "Special char '" + fo(i) + "' in channel " + r
                }
                )),
                n = [i]) : e >= 32 && e <= 127 && (n = 0 === t ? [e] : [e, t]),
                n && this.logger.log(3, (function() {
                    return "Char codes =  " + So(n).join(",")
                }
                )),
                n
            }
            ,
            t.parseBackgroundAttributes = function(e, t) {
                var r;
                if (!((16 === e || 24 === e) && t >= 32 && t <= 47 || (23 === e || 31 === e) && t >= 45 && t <= 47))
                    return !1;
                var i = {};
                16 === e || 24 === e ? (r = Math.floor((t - 32) / 2),
                i.background = Eo[r],
                t % 2 == 1 && (i.background = i.background + "_semi")) : 45 === t ? i.background = "transparent" : (i.foreground = "black",
                47 === t && (i.underline = !0));
                var n = e <= 23 ? 1 : 2;
                return this.channels[n].setBkgData(i),
                !0
            }
            ,
            t.reset = function() {
                for (var e = 0; e < Object.keys(this.channels).length; e++) {
                    var t = this.channels[e];
                    t && t.reset()
                }
                Do(null, null, this.cmdHistory)
            }
            ,
            t.cueSplitAtTime = function(e) {
                for (var t = 0; t < this.channels.length; t++) {
                    var r = this.channels[t];
                    r && r.cueSplitAtTime(e)
                }
            }
            ,
            e
        }();
        function Do(e, t, r) {
            r.a = e,
            r.b = t
        }
        var _o = function() {
            if (null != _r && _r.VTTCue)
                return self.VTTCue;
            var e = ["", "lr", "rl"]
              , t = ["start", "middle", "end", "left", "right"];
            function r(e, t) {
                if ("string" != typeof t)
                    return !1;
                if (!Array.isArray(e))
                    return !1;
                var r = t.toLowerCase();
                return !!~e.indexOf(r) && r
            }
            function i(e) {
                return r(t, e)
            }
            function n(e) {
                for (var t = arguments.length, r = new Array(t > 1 ? t - 1 : 0), i = 1; i < t; i++)
                    r[i - 1] = arguments[i];
                for (var n = 1; n < arguments.length; n++) {
                    var a = arguments[n];
                    for (var s in a)
                        e[s] = a[s]
                }
                return e
            }
            function a(t, a, s) {
                var o = this
                  , l = {
                    enumerable: !0
                };
                o.hasBeenReset = !1;
                var u = ""
                  , d = !1
                  , h = t
                  , f = a
                  , c = s
                  , g = null
                  , v = ""
                  , m = !0
                  , p = "auto"
                  , y = "start"
                  , E = 50
                  , T = "middle"
                  , S = 50
                  , A = "middle";
                Object.defineProperty(o, "id", n({}, l, {
                    get: function() {
                        return u
                    },
                    set: function(e) {
                        u = "" + e
                    }
                })),
                Object.defineProperty(o, "pauseOnExit", n({}, l, {
                    get: function() {
                        return d
                    },
                    set: function(e) {
                        d = !!e
                    }
                })),
                Object.defineProperty(o, "startTime", n({}, l, {
                    get: function() {
                        return h
                    },
                    set: function(e) {
                        if ("number" != typeof e)
                            throw new TypeError("Start time must be set to a number.");
                        h = e,
                        this.hasBeenReset = !0
                    }
                })),
                Object.defineProperty(o, "endTime", n({}, l, {
                    get: function() {
                        return f
                    },
                    set: function(e) {
                        if ("number" != typeof e)
                            throw new TypeError("End time must be set to a number.");
                        f = e,
                        this.hasBeenReset = !0
                    }
                })),
                Object.defineProperty(o, "text", n({}, l, {
                    get: function() {
                        return c
                    },
                    set: function(e) {
                        c = "" + e,
                        this.hasBeenReset = !0
                    }
                })),
                Object.defineProperty(o, "region", n({}, l, {
                    get: function() {
                        return g
                    },
                    set: function(e) {
                        g = e,
                        this.hasBeenReset = !0
                    }
                })),
                Object.defineProperty(o, "vertical", n({}, l, {
                    get: function() {
                        return v
                    },
                    set: function(t) {
                        var i = function(t) {
                            return r(e, t)
                        }(t);
                        if (!1 === i)
                            throw new SyntaxError("An invalid or illegal string was specified.");
                        v = i,
                        this.hasBeenReset = !0
                    }
                })),
                Object.defineProperty(o, "snapToLines", n({}, l, {
                    get: function() {
                        return m
                    },
                    set: function(e) {
                        m = !!e,
                        this.hasBeenReset = !0
                    }
                })),
                Object.defineProperty(o, "line", n({}, l, {
                    get: function() {
                        return p
                    },
                    set: function(e) {
                        if ("number" != typeof e && "auto" !== e)
                            throw new SyntaxError("An invalid number or illegal string was specified.");
                        p = e,
                        this.hasBeenReset = !0
                    }
                })),
                Object.defineProperty(o, "lineAlign", n({}, l, {
                    get: function() {
                        return y
                    },
                    set: function(e) {
                        var t = i(e);
                        if (!t)
                            throw new SyntaxError("An invalid or illegal string was specified.");
                        y = t,
                        this.hasBeenReset = !0
                    }
                })),
                Object.defineProperty(o, "position", n({}, l, {
                    get: function() {
                        return E
                    },
                    set: function(e) {
                        if (e < 0 || e > 100)
                            throw new Error("Position must be between 0 and 100.");
                        E = e,
                        this.hasBeenReset = !0
                    }
                })),
                Object.defineProperty(o, "positionAlign", n({}, l, {
                    get: function() {
                        return T
                    },
                    set: function(e) {
                        var t = i(e);
                        if (!t)
                            throw new SyntaxError("An invalid or illegal string was specified.");
                        T = t,
                        this.hasBeenReset = !0
                    }
                })),
                Object.defineProperty(o, "size", n({}, l, {
                    get: function() {
                        return S
                    },
                    set: function(e) {
                        if (e < 0 || e > 100)
                            throw new Error("Size must be between 0 and 100.");
                        S = e,
                        this.hasBeenReset = !0
                    }
                })),
                Object.defineProperty(o, "align", n({}, l, {
                    get: function() {
                        return A
                    },
                    set: function(e) {
                        var t = i(e);
                        if (!t)
                            throw new SyntaxError("An invalid or illegal string was specified.");
                        A = t,
                        this.hasBeenReset = !0
                    }
                })),
                o.displayState = void 0
            }
            return a.prototype.getCueAsHTML = function() {
                return self.WebVTT.convertCueToDOMTree(self, this.text)
            }
            ,
            a
        }()
          , Po = function() {
            function e() {}
            return e.prototype.decode = function(e, t) {
                if (!e)
                    return "";
                if ("string" != typeof e)
                    throw new Error("Error - expected string data.");
                return decodeURIComponent(encodeURIComponent(e))
            }
            ,
            e
        }();
        function Co(e) {
            function t(e, t, r, i) {
                return 3600 * (0 | e) + 60 * (0 | t) + (0 | r) + parseFloat(i || 0)
            }
            var r = e.match(/^(?:(\d+):)?(\d{2}):(\d{2})(\.\d+)?/);
            return r ? parseFloat(r[2]) > 59 ? t(r[2], r[3], 0, r[4]) : t(r[1], r[2], r[3], r[4]) : null
        }
        var wo = function() {
            function e() {
                this.values = Object.create(null)
            }
            var t = e.prototype;
            return t.set = function(e, t) {
                this.get(e) || "" === t || (this.values[e] = t)
            }
            ,
            t.get = function(e, t, r) {
                return r ? this.has(e) ? this.values[e] : t[r] : this.has(e) ? this.values[e] : t
            }
            ,
            t.has = function(e) {
                return e in this.values
            }
            ,
            t.alt = function(e, t, r) {
                for (var i = 0; i < r.length; ++i)
                    if (t === r[i]) {
                        this.set(e, t);
                        break
                    }
            }
            ,
            t.integer = function(e, t) {
                /^-?\d+$/.test(t) && this.set(e, parseInt(t, 10))
            }
            ,
            t.percent = function(e, t) {
                if (/^([\d]{1,3})(\.[\d]*)?%$/.test(t)) {
                    var r = parseFloat(t);
                    if (r >= 0 && r <= 100)
                        return this.set(e, r),
                        !0
                }
                return !1
            }
            ,
            e
        }();
        function Oo(e, t, r, i) {
            var n = i ? e.split(i) : [e];
            for (var a in n)
                if ("string" == typeof n[a]) {
                    var s = n[a].split(r);
                    2 === s.length && t(s[0], s[1])
                }
        }
        var xo = new _o(0,0,"")
          , Mo = "middle" === xo.align ? "middle" : "center";
        function Fo(e, t, r) {
            var i = e;
            function n() {
                var t = Co(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 = n(),
            a(),
            "--\x3e" !== e.slice(0, 3))
                throw new Error("Malformed time stamp (time stamps must be separated by '--\x3e'): " + i);
            e = e.slice(3),
            a(),
            t.endTime = n(),
            a(),
            function(e, t) {
                var i = new wo;
                Oo(e, (function(e, t) {
                    var n;
                    switch (e) {
                    case "region":
                        for (var a = r.length - 1; a >= 0; a--)
                            if (r[a].id === t) {
                                i.set(e, r[a].region);
                                break
                            }
                        break;
                    case "vertical":
                        i.alt(e, t, ["rl", "lr"]);
                        break;
                    case "line":
                        n = t.split(","),
                        i.integer(e, n[0]),
                        i.percent(e, n[0]) && i.set("snapToLines", !1),
                        i.alt(e, n[0], ["auto"]),
                        2 === n.length && i.alt("lineAlign", n[1], ["start", Mo, "end"]);
                        break;
                    case "position":
                        n = t.split(","),
                        i.percent(e, n[0]),
                        2 === n.length && i.alt("positionAlign", n[1], ["start", Mo, "end", "line-left", "line-right", "auto"]);
                        break;
                    case "size":
                        i.percent(e, t);
                        break;
                    case "align":
                        i.alt(e, t, ["start", Mo, "end", "left", "right"])
                    }
                }
                ), /:/, /\s/),
                t.region = i.get("region", null),
                t.vertical = i.get("vertical", "");
                var n = i.get("line", "auto");
                "auto" === n && -1 === xo.line && (n = -1),
                t.line = n,
                t.lineAlign = i.get("lineAlign", "start"),
                t.snapToLines = i.get("snapToLines", !0),
                t.size = i.get("size", 100),
                t.align = i.get("align", Mo);
                var a = i.get("position", "auto");
                "auto" === a && 50 === xo.position && (a = "start" === t.align || "left" === t.align ? 0 : "end" === t.align || "right" === t.align ? 100 : 50),
                t.position = a
            }(e, t)
        }
        function No(e) {
            return e.replace(//gi, "\n")
        }
        var Uo = function() {
            function e() {
                this.state = "INITIAL",
                this.buffer = "",
                this.decoder = new Po,
                this.regionList = [],
                this.cue = null,
                this.oncue = void 0,
                this.onparsingerror = void 0,
                this.onflush = void 0
            }
            var t = e.prototype;
            return t.parse = function(e) {
                var t = this;
                function r() {
                    var e = t.buffer
                      , r = 0;
                    for (e = No(e); r < e.length && "\r" !== e[r] && "\n" !== e[r]; )
                        ++r;
                    var i = e.slice(0, r);
                    return "\r" === e[r] && ++r,
                    "\n" === e[r] && ++r,
                    t.buffer = e.slice(r),
                    i
                }
                e && (t.buffer += t.decoder.decode(e, {
                    stream: !0
                }));
                try {
                    var i = "";
                    if ("INITIAL" === t.state) {
                        if (!/\r\n|\n/.test(t.buffer))
                            return this;
                        var n = (i = r()).match(/^()?WEBVTT([ \t].*)?$/);
                        if (null == n || !n[0])
                            throw new Error("Malformed WebVTT signature.");
                        t.state = "HEADER"
                    }
                    for (var a = !1; t.buffer; ) {
                        if (!/\r\n|\n/.test(t.buffer))
                            return this;
                        switch (a ? a = !1 : i = r(),
                        t.state) {
                        case "HEADER":
                            /:/.test(i) ? Oo(i, (function(e, t) {}
                            ), /:/) : i || (t.state = "ID");
                            continue;
                        case "NOTE":
                            i || (t.state = "ID");
                            continue;
                        case "ID":
                            if (/^NOTE($|[ \t])/.test(i)) {
                                t.state = "NOTE";
                                break
                            }
                            if (!i)
                                continue;
                            if (t.cue = new _o(0,0,""),
                            t.state = "CUE",
                            -1 === i.indexOf("--\x3e")) {
                                t.cue.id = i;
                                continue
                            }
                        case "CUE":
                            if (!t.cue) {
                                t.state = "BADCUE";
                                continue
                            }
                            try {
                                Fo(i, t.cue, t.regionList)
                            } catch (e) {
                                t.cue = null,
                                t.state = "BADCUE";
                                continue
                            }
                            t.state = "CUETEXT";
                            continue;
                        case "CUETEXT":
                            var s = -1 !== i.indexOf("--\x3e");
                            if (!i || s && (a = !0)) {
                                t.oncue && t.cue && t.oncue(t.cue),
                                t.cue = null,
                                t.state = "ID";
                                continue
                            }
                            if (null === t.cue)
                                continue;
                            t.cue.text && (t.cue.text += "\n"),
                            t.cue.text += i;
                            continue;
                        case "BADCUE":
                            i || (t.state = "ID")
                        }
                    }
                } catch (e) {
                    "CUETEXT" === t.state && t.cue && t.oncue && t.oncue(t.cue),
                    t.cue = null,
                    t.state = "INITIAL" === t.state ? "BADWEBVTT" : "BADCUE"
                }
                return this
            }
            ,
            t.flush = function() {
                var e = this;
                try {
                    if ((e.cue || "HEADER" === e.state) && (e.buffer += "\n\n",
                    e.parse()),
                    "INITIAL" === e.state || "BADWEBVTT" === e.state)
                        throw new Error("Malformed WebVTT signature.")
                } catch (t) {
                    e.onparsingerror && e.onparsingerror(t)
                }
                return e.onflush && e.onflush(),
                this
            }
            ,
            e
        }()
          , Bo = /\r\n|\n\r|\n|\r/g
          , Go = function(e, t, r) {
            return void 0 === r && (r = 0),
            e.slice(r, r + t.length) === t
        };
        function Ko(e, t, r) {
            return Gs(e.toString()) + Gs(t.toString()) + Gs(r)
        }
        function Vo(e, t, r, i, n, a, s) {
            var o, l, u, d = new Uo, h = q(new Uint8Array(e)).trim().replace(Bo, "\n").split("\n"), f = [], c = t ? (o = t.baseTime,
            void 0 === (l = t.timescale) && (l = 1),
            Bn(o, Un, 1 / l)) : 0, g = "00:00.000", v = 0, m = 0, p = !0;
            d.oncue = function(e) {
                var a = r[i]
                  , s = r.ccOffset
                  , o = (v - c) / 9e4;
                if (null != a && a.new && (void 0 !== m ? s = r.ccOffset = a.start : function(e, t, r) {
                    var i = e[t]
                      , n = e[i.prevCC];
                    if (!n || !n.new && i.new)
                        return e.ccOffset = e.presentationOffset = i.start,
                        void (i.new = !1);
                    for (; null != (a = n) && a.new; ) {
                        var a;
                        e.ccOffset += i.start - n.start,
                        i.new = !1,
                        n = e[(i = n).prevCC]
                    }
                    e.presentationOffset = r
                }(r, i, o)),
                o) {
                    if (!t)
                        return void (u = new Error("Missing initPTS for VTT MPEGTS"));
                    s = o - r.presentationOffset
                }
                var l = e.endTime - e.startTime
                  , d = Wn(9e4 * (e.startTime + s - m), 9e4 * n) / 9e4;
                e.startTime = Math.max(d, 0),
                e.endTime = Math.max(d + l, 0);
                var h = e.text.trim();
                e.text = decodeURIComponent(encodeURIComponent(h)),
                e.id || (e.id = Ko(e.startTime, e.endTime, h)),
                e.endTime > 0 && f.push(e)
            }
            ,
            d.onparsingerror = function(e) {
                u = e
            }
            ,
            d.onflush = function() {
                u ? s(u) : a(f)
            }
            ,
            h.forEach((function(e) {
                if (p) {
                    if (Go(e, "X-TIMESTAMP-MAP=")) {
                        p = !1,
                        e.slice(16).split(",").forEach((function(e) {
                            Go(e, "LOCAL:") ? g = e.slice(6) : Go(e, "MPEGTS:") && (v = parseInt(e.slice(7)))
                        }
                        ));
                        try {
                            m = function(e) {
                                var t = parseInt(e.slice(-3))
                                  , r = parseInt(e.slice(-6, -4))
                                  , i = parseInt(e.slice(-9, -7))
                                  , n = e.length > 9 ? parseInt(e.substring(0, e.indexOf(":"))) : 0;
                                if (!(A(t) && A(r) && A(i) && A(n)))
                                    throw Error("Malformed X-TIMESTAMP-MAP: Local:" + e);
                                return t += 1e3 * r,
                                (t += 6e4 * i) + 36e5 * n
                            }(g) / 1e3
                        } catch (e) {
                            u = e
                        }
                        return
                    }
                    "" === e && (p = !1)
                }
                d.parse(e + "\n")
            }
            )),
            d.flush()
        }
        var Ho = "stpp.ttml.im1t"
          , Yo = /^(\d{2,}):(\d{2}):(\d{2}):(\d{2})\.?(\d+)?$/
          , Wo = /^(\d*(?:\.\d*)?)(h|m|s|ms|f|t)$/
          , jo = {
            left: "start",
            center: "center",
            right: "end",
            start: "start",
            end: "end"
        };
        function qo(e, t, r, i) {
            var n = ce(new Uint8Array(e), ["mdat"]);
            if (0 !== n.length) {
                var s, o, l, u, d = n.map((function(e) {
                    return q(e)
                }
                )), h = (s = t.baseTime,
                o = 1,
                void 0 === (l = t.timescale) && (l = 1),
                void 0 === u && (u = !1),
                Bn(s, o, 1 / l, u));
                try {
                    d.forEach((function(e) {
                        return r(function(e, t) {
                            var r = (new DOMParser).parseFromString(e, "text/xml")
                              , i = r.getElementsByTagName("tt")[0];
                            if (!i)
                                throw new Error("Invalid ttml");
                            var n = {
                                frameRate: 30,
                                subFrameRate: 1,
                                frameRateMultiplier: 0,
                                tickRate: 0
                            }
                              , s = Object.keys(n).reduce((function(e, t) {
                                return e[t] = i.getAttribute("ttp:" + t) || n[t],
                                e
                            }
                            ), {})
                              , o = "preserve" !== i.getAttribute("xml:space")
                              , l = Qo(Xo(i, "styling", "style"))
                              , u = Qo(Xo(i, "layout", "region"))
                              , d = Xo(i, "body", "[begin]");
                            return [].map.call(d, (function(e) {
                                var r = zo(e, o);
                                if (!r || !e.hasAttribute("begin"))
                                    return null;
                                var i = Jo(e.getAttribute("begin"), s)
                                  , n = Jo(e.getAttribute("dur"), s)
                                  , d = Jo(e.getAttribute("end"), s);
                                if (null === i)
                                    throw Zo(e);
                                if (null === d) {
                                    if (null === n)
                                        throw Zo(e);
                                    d = i + n
                                }
                                var h = new _o(i - t,d - t,r);
                                h.id = Ko(h.startTime, h.endTime, h.text);
                                var f = function(e, t, r) {
                                    var i = "http://www.w3.org/ns/ttml#styling"
                                      , n = null
                                      , a = ["displayAlign", "textAlign", "color", "backgroundColor", "fontSize", "fontFamily"]
                                      , s = null != e && e.hasAttribute("style") ? e.getAttribute("style") : null;
                                    return s && r.hasOwnProperty(s) && (n = r[s]),
                                    a.reduce((function(r, a) {
                                        var s = $o(t, i, a) || $o(e, i, a) || $o(n, i, a);
                                        return s && (r[a] = s),
                                        r
                                    }
                                    ), {})
                                }(u[e.getAttribute("region")], l[e.getAttribute("style")], l)
                                  , c = f.textAlign;
                                if (c) {
                                    var g = jo[c];
                                    g && (h.lineAlign = g),
                                    h.align = c
                                }
                                return a(h, f),
                                h
                            }
                            )).filter((function(e) {
                                return null !== e
                            }
                            ))
                        }(e, h))
                    }
                    ))
                } catch (e) {
                    i(e)
                }
            } else
                i(new Error("Could not parse IMSC1 mdat"))
        }
        function Xo(e, t, r) {
            var i = e.getElementsByTagName(t)[0];
            return i ? [].slice.call(i.querySelectorAll(r)) : []
        }
        function Qo(e) {
            return e.reduce((function(e, t) {
                var r = t.getAttribute("xml:id");
                return r && (e[r] = t),
                e
            }
            ), {})
        }
        function zo(e, t) {
            return [].slice.call(e.childNodes).reduce((function(e, r, i) {
                var n;
                return "br" === r.nodeName && i ? e + "\n" : null != (n = r.childNodes) && n.length ? zo(r, t) : t ? e + r.textContent.trim().replace(/\s+/g, " ") : e + r.textContent
            }
            ), "")
        }
        function $o(e, t, r) {
            return e && e.hasAttributeNS(t, r) ? e.getAttributeNS(t, r) : null
        }
        function Zo(e) {
            return new Error("Could not parse ttml timestamp " + e)
        }
        function Jo(e, t) {
            if (!e)
                return null;
            var r = Co(e);
            return null === r && (Yo.test(e) ? r = function(e, t) {
                var r = Yo.exec(e)
                  , i = (0 | r[4]) + (0 | r[5]) / t.subFrameRate;
                return 3600 * (0 | r[1]) + 60 * (0 | r[2]) + (0 | r[3]) + i / t.frameRate
            }(e, t) : Wo.test(e) && (r = function(e, t) {
                var r = Wo.exec(e)
                  , i = Number(r[1]);
                switch (r[2]) {
                case "h":
                    return 3600 * i;
                case "m":
                    return 60 * i;
                case "ms":
                    return 1e3 * i;
                case "f":
                    return i / t.frameRate;
                case "t":
                    return i / t.tickRate
                }
                return i
            }(e, t))),
            r
        }
        var el = function() {
            function e(e, t) {
                this.timelineController = void 0,
                this.cueRanges = [],
                this.trackName = void 0,
                this.startTime = null,
                this.endTime = null,
                this.screen = null,
                this.timelineController = e,
                this.trackName = t
            }
            var t = e.prototype;
            return t.dispatchCue = function() {
                null !== this.startTime && (this.timelineController.addCues(this.trackName, this.startTime, this.endTime, this.screen, this.cueRanges),
                this.startTime = null)
            }
            ,
            t.newCue = function(e, t, r) {
                (null === this.startTime || this.startTime > e) && (this.startTime = e),
                this.endTime = t,
                this.screen = r,
                this.timelineController.createCaptionsTrack(this.trackName)
            }
            ,
            t.reset = function() {
                this.cueRanges = [],
                this.startTime = null
            }
            ,
            e
        }()
          , tl = function() {
            function e(e) {
                this.hls = void 0,
                this.media = null,
                this.config = void 0,
                this.enabled = !0,
                this.Cues = void 0,
                this.textTracks = [],
                this.tracks = [],
                this.initPTS = [],
                this.unparsedVttFrags = [],
                this.captionsTracks = {},
                this.nonNativeCaptionsTracks = {},
                this.cea608Parser1 = void 0,
                this.cea608Parser2 = void 0,
                this.lastCc = -1,
                this.lastSn = -1,
                this.lastPartIndex = -1,
                this.prevCC = -1,
                this.vttCCs = {
                    ccOffset: 0,
                    presentationOffset: 0,
                    0: {
                        start: 0,
                        prevCC: -1,
                        new: !0
                    }
                },
                this.captionsProperties = void 0,
                this.hls = e,
                this.config = e.config,
                this.Cues = e.config.cueHandler,
                this.captionsProperties = {
                    textTrack1: {
                        label: this.config.captionsTextTrack1Label,
                        languageCode: this.config.captionsTextTrack1LanguageCode
                    },
                    textTrack2: {
                        label: this.config.captionsTextTrack2Label,
                        languageCode: this.config.captionsTextTrack2LanguageCode
                    },
                    textTrack3: {
                        label: this.config.captionsTextTrack3Label,
                        languageCode: this.config.captionsTextTrack3LanguageCode
                    },
                    textTrack4: {
                        label: this.config.captionsTextTrack4Label,
                        languageCode: this.config.captionsTextTrack4LanguageCode
                    }
                },
                e.on(b.MEDIA_ATTACHING, this.onMediaAttaching, this),
                e.on(b.MEDIA_DETACHING, this.onMediaDetaching, this),
                e.on(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.on(b.MANIFEST_LOADED, this.onManifestLoaded, this),
                e.on(b.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this),
                e.on(b.FRAG_LOADING, this.onFragLoading, this),
                e.on(b.FRAG_LOADED, this.onFragLoaded, this),
                e.on(b.FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this),
                e.on(b.FRAG_DECRYPTED, this.onFragDecrypted, this),
                e.on(b.INIT_PTS_FOUND, this.onInitPtsFound, this),
                e.on(b.SUBTITLE_TRACKS_CLEARED, this.onSubtitleTracksCleared, this),
                e.on(b.BUFFER_FLUSHING, this.onBufferFlushing, this)
            }
            var t = e.prototype;
            return t.destroy = function() {
                var e = this.hls;
                e.off(b.MEDIA_ATTACHING, this.onMediaAttaching, this),
                e.off(b.MEDIA_DETACHING, this.onMediaDetaching, this),
                e.off(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.off(b.MANIFEST_LOADED, this.onManifestLoaded, this),
                e.off(b.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this),
                e.off(b.FRAG_LOADING, this.onFragLoading, this),
                e.off(b.FRAG_LOADED, this.onFragLoaded, this),
                e.off(b.FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this),
                e.off(b.FRAG_DECRYPTED, this.onFragDecrypted, this),
                e.off(b.INIT_PTS_FOUND, this.onInitPtsFound, this),
                e.off(b.SUBTITLE_TRACKS_CLEARED, this.onSubtitleTracksCleared, this),
                e.off(b.BUFFER_FLUSHING, this.onBufferFlushing, this),
                this.hls = this.config = this.media = null,
                this.cea608Parser1 = this.cea608Parser2 = void 0
            }
            ,
            t.initCea608Parsers = function() {
                var e = new el(this,"textTrack1")
                  , t = new el(this,"textTrack2")
                  , r = new el(this,"textTrack3")
                  , i = new el(this,"textTrack4");
                this.cea608Parser1 = new bo(1,e,t),
                this.cea608Parser2 = new bo(3,r,i)
            }
            ,
            t.addCues = function(e, t, r, i, n) {
                for (var a, s, o, l, u = !1, d = n.length; d--; ) {
                    var h = n[d]
                      , f = (a = h[0],
                    s = h[1],
                    o = t,
                    l = r,
                    Math.min(s, l) - Math.max(a, o));
                    if (f >= 0 && (h[0] = Math.min(h[0], t),
                    h[1] = Math.max(h[1], r),
                    u = !0,
                    f / (r - t) > .5))
                        return
                }
                if (u || n.push([t, r]),
                this.config.renderTextTracksNatively) {
                    var c = this.captionsTracks[e];
                    this.Cues.newCue(c, t, r, i)
                } else {
                    var g = this.Cues.newCue(null, t, r, i);
                    this.hls.trigger(b.CUES_PARSED, {
                        type: "captions",
                        cues: g,
                        track: e
                    })
                }
            }
            ,
            t.onInitPtsFound = function(e, t) {
                var r = this
                  , i = t.frag
                  , n = t.id
                  , a = t.initPTS
                  , s = t.timescale
                  , o = t.trackId
                  , l = this.unparsedVttFrags;
                n === w && (this.initPTS[i.cc] = {
                    baseTime: a,
                    timescale: s,
                    trackId: o
                }),
                l.length && (this.unparsedVttFrags = [],
                l.forEach((function(e) {
                    r.initPTS[e.frag.cc] ? r.onFragLoaded(b.FRAG_LOADED, e) : r.hls.trigger(b.SUBTITLE_FRAG_PROCESSED, {
                        success: !1,
                        frag: e.frag,
                        error: new Error("Subtitle discontinuity domain does not match main")
                    })
                }
                )))
            }
            ,
            t.getExistingTrack = function(e, t) {
                var r = this.media;
                if (r)
                    for (var i = 0; i < r.textTracks.length; i++) {
                        var n = r.textTracks[i];
                        if (il(n, {
                            name: e,
                            lang: t,
                            characteristics: "transcribes-spoken-dialog,describes-music-and-sound"
                        }))
                            return n
                    }
                return null
            }
            ,
            t.createCaptionsTrack = function(e) {
                this.config.renderTextTracksNatively ? this.createNativeTrack(e) : this.createNonNativeTrack(e)
            }
            ,
            t.createNativeTrack = function(e) {
                if (!this.captionsTracks[e]) {
                    var t = this.captionsProperties
                      , r = this.captionsTracks
                      , i = this.media
                      , n = t[e]
                      , a = n.label
                      , s = n.languageCode
                      , o = this.getExistingTrack(a, s);
                    if (o)
                        r[e] = o,
                        so(r[e]),
                        no(r[e], i);
                    else {
                        var l = this.createTextTrack("captions", a, s);
                        l && (l[e] = !0,
                        r[e] = l)
                    }
                }
            }
            ,
            t.createNonNativeTrack = function(e) {
                if (!this.nonNativeCaptionsTracks[e]) {
                    var t = this.captionsProperties[e];
                    if (t) {
                        var r = {
                            _id: e,
                            label: t.label,
                            kind: "captions",
                            default: !!t.media && !!t.media.default,
                            closedCaptions: t.media
                        };
                        this.nonNativeCaptionsTracks[e] = r,
                        this.hls.trigger(b.NON_NATIVE_TEXT_TRACKS_FOUND, {
                            tracks: [r]
                        })
                    }
                }
            }
            ,
            t.createTextTrack = function(e, t, r) {
                var i = this.media;
                if (i)
                    return i.addTextTrack(e, t, r)
            }
            ,
            t.onMediaAttaching = function(e, t) {
                this.media = t.media,
                t.mediaSource || this._cleanTracks()
            }
            ,
            t.onMediaDetaching = function(e, t) {
                var r = !!t.transferMedia;
                if (this.media = null,
                !r) {
                    var i = this.captionsTracks;
                    Object.keys(i).forEach((function(e) {
                        so(i[e]),
                        delete i[e]
                    }
                    )),
                    this.nonNativeCaptionsTracks = {}
                }
            }
            ,
            t.onManifestLoading = function() {
                this.lastCc = -1,
                this.lastSn = -1,
                this.lastPartIndex = -1,
                this.prevCC = -1,
                this.vttCCs = {
                    ccOffset: 0,
                    presentationOffset: 0,
                    0: {
                        start: 0,
                        prevCC: -1,
                        new: !0
                    }
                },
                this._cleanTracks(),
                this.tracks = [],
                this.captionsTracks = {},
                this.nonNativeCaptionsTracks = {},
                this.textTracks = [],
                this.unparsedVttFrags = [],
                this.initPTS = [],
                this.cea608Parser1 && this.cea608Parser2 && (this.cea608Parser1.reset(),
                this.cea608Parser2.reset())
            }
            ,
            t._cleanTracks = function() {
                var e = this.media;
                if (e) {
                    var t = e.textTracks;
                    if (t)
                        for (var r = 0; r < t.length; r++)
                            so(t[r])
                }
            }
            ,
            t.onSubtitleTracksUpdated = function(e, t) {
                var r = this
                  , i = t.subtitleTracks || []
                  , n = i.some((function(e) {
                    return e.textCodec === Ho
                }
                ));
                if (this.config.enableWebVTT || n && this.config.enableIMSC1) {
                    if (va(this.tracks, i))
                        return void (this.tracks = i);
                    if (this.textTracks = [],
                    this.tracks = i,
                    this.config.renderTextTracksNatively) {
                        var a = this.media
                          , s = a ? lo(a.textTracks) : null;
                        if (this.tracks.forEach((function(e, t) {
                            var i;
                            if (s) {
                                for (var n = null, a = 0; a < s.length; a++)
                                    if (s[a] && il(s[a], e)) {
                                        n = s[a],
                                        s[a] = null;
                                        break
                                    }
                                n && (i = n)
                            }
                            if (i)
                                so(i);
                            else {
                                var o = rl(e);
                                (i = r.createTextTrack(o, e.name, e.lang)) && (i.mode = "disabled")
                            }
                            i && r.textTracks.push(i)
                        }
                        )),
                        null != s && s.length) {
                            var o = s.filter((function(e) {
                                return null !== e
                            }
                            )).map((function(e) {
                                return e.label
                            }
                            ));
                            o.length && this.hls.logger.warn("Media element contains unused subtitle tracks: " + o.join(", ") + ". Replace media element for each source to clear TextTracks and captions menu.")
                        }
                    } else if (this.tracks.length) {
                        var l = this.tracks.map((function(e) {
                            return {
                                label: e.name,
                                kind: e.type.toLowerCase(),
                                default: e.default,
                                subtitleTrack: e
                            }
                        }
                        ));
                        this.hls.trigger(b.NON_NATIVE_TEXT_TRACKS_FOUND, {
                            tracks: l
                        })
                    }
                }
            }
            ,
            t.onManifestLoaded = function(e, t) {
                var r = this;
                this.config.enableCEA708Captions && t.captions && t.captions.forEach((function(e) {
                    var t = /(?:CC|SERVICE)([1-4])/.exec(e.instreamId);
                    if (t) {
                        var i = "textTrack" + t[1]
                          , n = r.captionsProperties[i];
                        n && (n.label = e.name,
                        e.lang && (n.languageCode = e.lang),
                        n.media = e)
                    }
                }
                ))
            }
            ,
            t.closedCaptionsForLevel = function(e) {
                var t = this.hls.levels[e.level];
                return null == t ? void 0 : t.attrs["CLOSED-CAPTIONS"]
            }
            ,
            t.onFragLoading = function(e, t) {
                if (this.enabled && t.frag.type === w) {
                    var r, i, n = this.cea608Parser1, a = this.cea608Parser2, s = this.lastSn, o = t.frag, l = o.cc, u = o.sn, d = null != (r = null == (i = t.part) ? void 0 : i.index) ? r : -1;
                    n && a && (u !== s + 1 || u === s && d !== this.lastPartIndex + 1 || l !== this.lastCc) && (n.reset(),
                    a.reset()),
                    this.lastCc = l,
                    this.lastSn = u,
                    this.lastPartIndex = d
                }
            }
            ,
            t.onFragLoaded = function(e, t) {
                var r = t.frag
                  , i = t.payload;
                if (r.type === x)
                    if (i.byteLength) {
                        var n = r.decryptdata
                          , a = "stats"in t;
                        if (null == n || !n.encrypted || a) {
                            var s = this.tracks[r.level]
                              , o = this.vttCCs;
                            o[r.cc] || (o[r.cc] = {
                                start: r.start,
                                prevCC: this.prevCC,
                                new: !0
                            },
                            this.prevCC = r.cc),
                            s && s.textCodec === Ho ? this._parseIMSC1(r, i) : this._parseVTTs(t)
                        }
                    } else
                        this.hls.trigger(b.SUBTITLE_FRAG_PROCESSED, {
                            success: !1,
                            frag: r,
                            error: new Error("Empty subtitle payload")
                        })
            }
            ,
            t._parseIMSC1 = function(e, t) {
                var r = this
                  , i = this.hls;
                qo(t, this.initPTS[e.cc], (function(t) {
                    r._appendCues(t, e.level),
                    i.trigger(b.SUBTITLE_FRAG_PROCESSED, {
                        success: !0,
                        frag: e
                    })
                }
                ), (function(t) {
                    i.logger.log("Failed to parse IMSC1: " + t),
                    i.trigger(b.SUBTITLE_FRAG_PROCESSED, {
                        success: !1,
                        frag: e,
                        error: t
                    })
                }
                ))
            }
            ,
            t._parseVTTs = function(e) {
                var t, r = this, i = e.frag, n = e.payload, a = this.initPTS, s = this.unparsedVttFrags, o = a.length - 1;
                if (a[i.cc] || -1 !== o) {
                    var l = this.hls;
                    Vo(null != (t = i.initSegment) && t.data ? Ae(i.initSegment.data, new Uint8Array(n)).buffer : n, this.initPTS[i.cc], this.vttCCs, i.cc, i.start, (function(e) {
                        r._appendCues(e, i.level),
                        l.trigger(b.SUBTITLE_FRAG_PROCESSED, {
                            success: !0,
                            frag: i
                        })
                    }
                    ), (function(t) {
                        var a = "Missing initPTS for VTT MPEGTS" === t.message;
                        a ? s.push(e) : r._fallbackToIMSC1(i, n),
                        l.logger.log("Failed to parse VTT cue: " + t),
                        a && o > i.cc || l.trigger(b.SUBTITLE_FRAG_PROCESSED, {
                            success: !1,
                            frag: i,
                            error: t
                        })
                    }
                    ))
                } else
                    s.push(e)
            }
            ,
            t._fallbackToIMSC1 = function(e, t) {
                var r = this
                  , i = this.tracks[e.level];
                i.textCodec || qo(t, this.initPTS[e.cc], (function() {
                    i.textCodec = Ho,
                    r._parseIMSC1(e, t)
                }
                ), (function() {
                    i.textCodec = "wvtt"
                }
                ))
            }
            ,
            t._appendCues = function(e, t) {
                var r = this.hls;
                if (this.config.renderTextTracksNatively) {
                    var i = this.textTracks[t];
                    if (!i || "disabled" === i.mode)
                        return;
                    e.forEach((function(e) {
                        return ao(i, e)
                    }
                    ))
                } else {
                    var n = this.tracks[t];
                    if (!n)
                        return;
                    var a = n.default ? "default" : "subtitles" + t;
                    r.trigger(b.CUES_PARSED, {
                        type: "subtitles",
                        cues: e,
                        track: a
                    })
                }
            }
            ,
            t.onFragDecrypted = function(e, t) {
                t.frag.type === x && this.onFragLoaded(b.FRAG_LOADED, t)
            }
            ,
            t.onSubtitleTracksCleared = function() {
                this.tracks = [],
                this.captionsTracks = {}
            }
            ,
            t.onFragParsingUserdata = function(e, t) {
                if (this.enabled && this.config.enableCEA708Captions) {
                    var r = t.frag
                      , i = t.samples;
                    if (r.type !== w || "NONE" !== this.closedCaptionsForLevel(r))
                        for (var n = 0; n < i.length; n++) {
                            var a = i[n].bytes;
                            if (a) {
                                this.cea608Parser1 || this.initCea608Parsers();
                                var s = this.extractCea608Data(a);
                                this.cea608Parser1.addData(i[n].pts, s[0]),
                                this.cea608Parser2.addData(i[n].pts, s[1])
                            }
                        }
                }
            }
            ,
            t.onBufferFlushing = function(e, t) {
                var r = t.startOffset
                  , i = t.endOffset
                  , n = t.endOffsetSubtitles
                  , a = t.type
                  , s = this.media;
                if (s && !(s.currentTime < i)) {
                    if (!a || "video" === a) {
                        var o = this.captionsTracks;
                        Object.keys(o).forEach((function(e) {
                            return oo(o[e], r, i)
                        }
                        ))
                    }
                    if (this.config.renderTextTracksNatively && 0 === r && void 0 !== n) {
                        var l = this.textTracks;
                        Object.keys(l).forEach((function(e) {
                            return oo(l[e], r, n)
                        }
                        ))
                    }
                }
            }
            ,
            t.extractCea608Data = function(e) {
                for (var t = [[], []], r = 31 & e[0], i = 2, n = 0; n < r; n++) {
                    var a = e[i++]
                      , s = 127 & e[i++]
                      , o = 127 & e[i++];
                    if ((0 !== s || 0 !== o) && 0 != (4 & a)) {
                        var l = 3 & a;
                        0 !== l && 1 !== l || (t[l].push(s),
                        t[l].push(o))
                    }
                }
                return t
            }
            ,
            e
        }();
        function rl(e) {
            return e.characteristics && /transcribes-spoken-dialog/gi.test(e.characteristics) && /describes-music-and-sound/gi.test(e.characteristics) ? "captions" : "subtitles"
        }
        function il(e, t) {
            return !!e && e.kind === rl(t) && pa(t, e)
        }
        var nl = /\s/
          , al = {
            newCue: function(e, t, r, i) {
                for (var n, a, s, o, l, u = [], d = self.VTTCue || self.TextTrackCue, h = 0; h < i.rows.length; h++)
                    if (s = !0,
                    o = 0,
                    l = "",
                    !(n = i.rows[h]).isEmpty()) {
                        for (var f, c = 0; c < n.chars.length; c++)
                            nl.test(n.chars[c].uchar) && s ? o++ : (l += n.chars[c].uchar,
                            s = !1);
                        n.cueStartTime = t,
                        t === r && (r += 1e-4),
                        o >= 16 ? o-- : o++;
                        var g = No(l.trim())
                          , v = Ko(t, r, g);
                        null != e && null != (f = e.cues) && f.getCueById(v) || ((a = new d(t,r,g)).id = v,
                        a.line = h + 1,
                        a.align = "left",
                        a.position = 10 + Math.min(80, 10 * Math.floor(8 * o / 32)),
                        u.push(a))
                    }
                return e && u.length && (u.sort((function(e, t) {
                    return "auto" === e.line || "auto" === t.line ? 0 : e.line > 8 && t.line > 8 ? t.line - e.line : e.line - t.line
                }
                )),
                u.forEach((function(t) {
                    return ao(e, t)
                }
                ))),
                u
            }
        }
          , sl = /(\d+)-(\d+)\/(\d+)/
          , ol = function() {
            function e(e) {
                this.fetchSetup = void 0,
                this.requestTimeout = void 0,
                this.request = null,
                this.response = null,
                this.controller = void 0,
                this.context = null,
                this.config = null,
                this.callbacks = null,
                this.stats = void 0,
                this.loader = null,
                this.fetchSetup = e.fetchSetup || ll,
                this.controller = new self.AbortController,
                this.stats = new z
            }
            var t = e.prototype;
            return t.destroy = function() {
                this.loader = this.callbacks = this.context = this.config = this.request = null,
                this.abortInternal(),
                this.response = null,
                this.fetchSetup = this.controller = this.stats = null
            }
            ,
            t.abortInternal = function() {
                this.controller && !this.stats.loading.end && (this.stats.aborted = !0,
                this.controller.abort())
            }
            ,
            t.abort = function() {
                var e;
                this.abortInternal(),
                null != (e = this.callbacks) && e.onAbort && this.callbacks.onAbort(this.stats, this.context, this.response)
            }
            ,
            t.load = function(e, t, r) {
                var i = this
                  , n = this.stats;
                if (n.loading.start)
                    throw new Error("Loader can only be used once.");
                n.loading.start = self.performance.now();
                var s = function(e, t) {
                    var r = {
                        method: "GET",
                        mode: "cors",
                        credentials: "same-origin",
                        signal: t,
                        headers: new self.Headers(a({}, e.headers))
                    };
                    return e.rangeEnd && r.headers.set("Range", "bytes=" + e.rangeStart + "-" + String(e.rangeEnd - 1)),
                    r
                }(e, this.controller.signal)
                  , o = "arraybuffer" === e.responseType
                  , l = o ? "byteLength" : "length"
                  , u = t.loadPolicy
                  , d = u.maxTimeToFirstByteMs
                  , h = u.maxLoadTimeMs;
                this.context = e,
                this.config = t,
                this.callbacks = r,
                this.request = this.fetchSetup(e, s),
                self.clearTimeout(this.requestTimeout),
                t.timeout = d && A(d) ? d : h,
                this.requestTimeout = self.setTimeout((function() {
                    i.callbacks && (i.abortInternal(),
                    i.callbacks.onTimeout(n, e, i.response))
                }
                ), t.timeout),
                (ta(this.request) ? this.request.then(self.fetch) : self.fetch(this.request)).then((function(r) {
                    var a;
                    i.response = i.loader = r;
                    var s = Math.max(self.performance.now(), n.loading.start);
                    if (self.clearTimeout(i.requestTimeout),
                    t.timeout = h,
                    i.requestTimeout = self.setTimeout((function() {
                        i.callbacks && (i.abortInternal(),
                        i.callbacks.onTimeout(n, e, i.response))
                    }
                    ), h - (s - n.loading.start)),
                    !r.ok) {
                        var l = r.status
                          , u = r.statusText;
                        throw new ul(u || "fetch, bad network response",l,r)
                    }
                    n.loading.first = s,
                    n.total = function(e) {
                        var t = e.get("Content-Range");
                        if (t) {
                            var r = function(e) {
                                var t = sl.exec(e);
                                if (t)
                                    return parseInt(t[2]) - parseInt(t[1]) + 1
                            }(t);
                            if (A(r))
                                return r
                        }
                        var i = e.get("Content-Length");
                        if (i)
                            return parseInt(i)
                    }(r.headers) || n.total;
                    var d = null == (a = i.callbacks) ? void 0 : a.onProgress;
                    return d && A(t.highWaterMark) ? i.loadProgressively(r, n, e, t.highWaterMark, d) : o ? r.arrayBuffer() : "json" === e.responseType ? r.json() : r.text()
                }
                )).then((function(r) {
                    var a, s, o = i.response;
                    if (!o)
                        throw new Error("loader destroyed");
                    self.clearTimeout(i.requestTimeout),
                    n.loading.end = Math.max(self.performance.now(), n.loading.first);
                    var u = r[l];
                    u && (n.loaded = n.total = u);
                    var d = {
                        url: o.url,
                        data: r,
                        code: o.status
                    }
                      , h = null == (a = i.callbacks) ? void 0 : a.onProgress;
                    h && !A(t.highWaterMark) && h(n, e, r, o),
                    null == (s = i.callbacks) || s.onSuccess(d, n, e, o)
                }
                )).catch((function(t) {
                    var r;
                    if (self.clearTimeout(i.requestTimeout),
                    !n.aborted) {
                        var a = t && t.code || 0
                          , s = t ? t.message : null;
                        null == (r = i.callbacks) || r.onError({
                            code: a,
                            text: s
                        }, e, t ? t.details : null, n)
                    }
                }
                ))
            }
            ,
            t.getCacheAge = function() {
                var e = null;
                if (this.response) {
                    var t = this.response.headers.get("age");
                    e = t ? parseFloat(t) : null
                }
                return e
            }
            ,
            t.getResponseHeader = function(e) {
                return this.response ? this.response.headers.get(e) : null
            }
            ,
            t.loadProgressively = function(e, t, r, i, n) {
                void 0 === i && (i = 0);
                var a = new _i
                  , s = e.body.getReader()
                  , o = function() {
                    return s.read().then((function(s) {
                        if (s.done)
                            return a.dataLength && n(t, r, a.flush().buffer, e),
                            Promise.resolve(new ArrayBuffer(0));
                        var l = s.value
                          , u = l.length;
                        return t.loaded += u,
                        u < i || a.dataLength ? (a.push(l),
                        a.dataLength >= i && n(t, r, a.flush().buffer, e)) : n(t, r, l.buffer, e),
                        o()
                    }
                    )).catch((function() {
                        return Promise.reject()
                    }
                    ))
                };
                return o()
            }
            ,
            e
        }();
        function ll(e, t) {
            return new self.Request(e.url,t)
        }
        var ul = function(e) {
            function t(t, r, i) {
                var n;
                return (n = e.call(this, t) || this).code = void 0,
                n.details = void 0,
                n.code = r,
                n.details = i,
                n
            }
            return o(t, e),
            t
        }(c(Error))
          , dl = /^age:\s*[\d.]+\s*$/im
          , hl = function() {
            function e(e) {
                this.xhrSetup = void 0,
                this.requestTimeout = void 0,
                this.retryTimeout = void 0,
                this.retryDelay = void 0,
                this.config = null,
                this.callbacks = null,
                this.context = null,
                this.loader = null,
                this.stats = void 0,
                this.xhrSetup = e && e.xhrSetup || null,
                this.stats = new z,
                this.retryDelay = 0
            }
            var t = e.prototype;
            return t.destroy = function() {
                this.callbacks = null,
                this.abortInternal(),
                this.loader = null,
                this.config = null,
                this.context = null,
                this.xhrSetup = null
            }
            ,
            t.abortInternal = function() {
                var e = this.loader;
                self.clearTimeout(this.requestTimeout),
                self.clearTimeout(this.retryTimeout),
                e && (e.onreadystatechange = null,
                e.onprogress = null,
                4 !== e.readyState && (this.stats.aborted = !0,
                e.abort()))
            }
            ,
            t.abort = function() {
                var e;
                this.abortInternal(),
                null != (e = this.callbacks) && e.onAbort && this.callbacks.onAbort(this.stats, this.context, this.loader)
            }
            ,
            t.load = function(e, t, r) {
                if (this.stats.loading.start)
                    throw new Error("Loader can only be used once.");
                this.stats.loading.start = self.performance.now(),
                this.context = e,
                this.config = t,
                this.callbacks = r,
                this.loadInternal()
            }
            ,
            t.loadInternal = function() {
                var e = this
                  , t = this.config
                  , r = this.context;
                if (t && r) {
                    var i = this.loader = new self.XMLHttpRequest
                      , n = this.stats;
                    n.loading.first = 0,
                    n.loaded = 0,
                    n.aborted = !1;
                    var a = this.xhrSetup;
                    a ? Promise.resolve().then((function() {
                        if (e.loader === i && !e.stats.aborted)
                            return a(i, r.url)
                    }
                    )).catch((function(t) {
                        if (e.loader === i && !e.stats.aborted)
                            return i.open("GET", r.url, !0),
                            a(i, r.url)
                    }
                    )).then((function() {
                        e.loader !== i || e.stats.aborted || e.openAndSendXhr(i, r, t)
                    }
                    )).catch((function(t) {
                        var a;
                        null == (a = e.callbacks) || a.onError({
                            code: i.status,
                            text: t.message
                        }, r, i, n)
                    }
                    )) : this.openAndSendXhr(i, r, t)
                }
            }
            ,
            t.openAndSendXhr = function(e, t, r) {
                e.readyState || e.open("GET", t.url, !0);
                var i = t.headers
                  , n = r.loadPolicy
                  , a = n.maxTimeToFirstByteMs
                  , s = n.maxLoadTimeMs;
                if (i)
                    for (var o in i)
                        e.setRequestHeader(o, i[o]);
                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,
                self.clearTimeout(this.requestTimeout),
                r.timeout = a && A(a) ? a : s,
                this.requestTimeout = self.setTimeout(this.loadtimeout.bind(this), r.timeout),
                e.send()
            }
            ,
            t.readystatechange = function() {
                var e = this.context
                  , t = this.loader
                  , r = this.stats;
                if (e && t) {
                    var i = t.readyState
                      , n = this.config;
                    if (!r.aborted && i >= 2 && (0 === r.loading.first && (r.loading.first = Math.max(self.performance.now(), r.loading.start),
                    n.timeout !== n.loadPolicy.maxLoadTimeMs && (self.clearTimeout(this.requestTimeout),
                    n.timeout = n.loadPolicy.maxLoadTimeMs,
                    this.requestTimeout = self.setTimeout(this.loadtimeout.bind(this), n.loadPolicy.maxLoadTimeMs - (r.loading.first - r.loading.start)))),
                    4 === i)) {
                        self.clearTimeout(this.requestTimeout),
                        t.onreadystatechange = null,
                        t.onprogress = null;
                        var a = t.status
                          , s = "text" === t.responseType ? t.responseText : null;
                        if (a >= 200 && a < 300) {
                            var o = null != s ? s : t.response;
                            if (null != o) {
                                var l, u;
                                r.loading.end = Math.max(self.performance.now(), r.loading.first);
                                var d = "arraybuffer" === t.responseType ? o.byteLength : o.length;
                                r.loaded = r.total = d,
                                r.bwEstimate = 8e3 * r.total / (r.loading.end - r.loading.first);
                                var h = null == (l = this.callbacks) ? void 0 : l.onProgress;
                                h && h(r, e, o, t);
                                var f = {
                                    url: t.responseURL,
                                    data: o,
                                    code: a
                                };
                                return void (null == (u = this.callbacks) || u.onSuccess(f, r, e, t))
                            }
                        }
                        var c, g = n.loadPolicy.errorRetry;
                        _t(g, r.retry, !1, {
                            url: e.url,
                            data: void 0,
                            code: a
                        }) ? this.retry(g) : (Y.error(a + " while loading " + e.url),
                        null == (c = this.callbacks) || c.onError({
                            code: a,
                            text: t.statusText
                        }, e, t, r))
                    }
                }
            }
            ,
            t.loadtimeout = function() {
                if (this.config) {
                    var e = this.config.loadPolicy.timeoutRetry;
                    if (_t(e, this.stats.retry, !0))
                        this.retry(e);
                    else {
                        var t;
                        Y.warn("timeout while loading " + (null == (t = this.context) ? void 0 : t.url));
                        var r = this.callbacks;
                        r && (this.abortInternal(),
                        r.onTimeout(this.stats, this.context, this.loader))
                    }
                }
            }
            ,
            t.retry = function(e) {
                var t = this.context
                  , r = this.stats;
                this.retryDelay = bt(e, r.retry),
                r.retry++,
                Y.warn((status ? "HTTP Status " + status : "Timeout") + " while loading " + (null == t ? void 0 : t.url) + ", retrying " + r.retry + "/" + e.maxNumRetry + " in " + this.retryDelay + "ms"),
                this.abortInternal(),
                this.loader = null,
                self.clearTimeout(this.retryTimeout),
                this.retryTimeout = self.setTimeout(this.loadInternal.bind(this), this.retryDelay)
            }
            ,
            t.loadprogress = function(e) {
                var t = this.stats;
                t.loaded = e.loaded,
                e.lengthComputable && (t.total = e.total)
            }
            ,
            t.getCacheAge = function() {
                var e = null;
                if (this.loader && dl.test(this.loader.getAllResponseHeaders())) {
                    var t = this.loader.getResponseHeader("age");
                    e = t ? parseFloat(t) : null
                }
                return e
            }
            ,
            t.getResponseHeader = function(e) {
                return this.loader && new RegExp("^" + e + ":\\s*[\\d.]+\\s*$","im").test(this.loader.getAllResponseHeaders()) ? this.loader.getResponseHeader(e) : null
            }
            ,
            e
        }()
          , fl = d(d({
            autoStartLoad: !0,
            startPosition: -1,
            defaultAudioCodec: void 0,
            debug: !1,
            capLevelOnFPSDrop: !1,
            capLevelToPlayerSize: !1,
            ignoreDevicePixelRatio: !1,
            maxDevicePixelRatio: Number.POSITIVE_INFINITY,
            preferManagedMediaSource: !0,
            initialLiveManifestSize: 1,
            maxBufferLength: 30,
            backBufferLength: 1 / 0,
            frontBufferFlushThreshold: 1 / 0,
            startOnSegmentBoundary: !1,
            maxBufferSize: 6e7,
            maxFragLookUpTolerance: .25,
            maxBufferHole: .1,
            detectStallWithCurrentTimeMs: 1250,
            highBufferWatchdogPeriod: 2,
            nudgeOffset: .1,
            nudgeMaxRetry: 3,
            nudgeOnVideoHole: !0,
            liveSyncMode: "edge",
            liveSyncDurationCount: 3,
            liveSyncOnStallIncrease: 1,
            liveMaxLatencyDurationCount: 1 / 0,
            liveSyncDuration: void 0,
            liveMaxLatencyDuration: void 0,
            maxLiveSyncPlaybackRate: 1,
            liveDurationInfinity: !1,
            liveBackBufferLength: null,
            maxMaxBufferLength: 600,
            enableWorker: !0,
            workerPath: null,
            enableSoftwareAES: !0,
            startLevel: void 0,
            startFragPrefetch: !1,
            fpsDroppedMonitoringPeriod: 5e3,
            fpsDroppedMonitoringThreshold: .2,
            appendErrorMaxRetry: 3,
            ignorePlaylistParsingErrors: !1,
            loader: hl,
            fLoader: void 0,
            pLoader: void 0,
            xhrSetup: void 0,
            licenseXhrSetup: void 0,
            licenseResponseCallback: void 0,
            abrController: pt,
            bufferController: La,
            capLevelController: ka,
            errorController: Bt,
            fpsController: Bs,
            stretchShortVideoTrack: !1,
            maxAudioFramesDrift: 1,
            forceKeyFrameOnDiscontinuity: !0,
            abrEwmaFastLive: 3,
            abrEwmaSlowLive: 9,
            abrEwmaFastVoD: 3,
            abrEwmaSlowVoD: 9,
            abrEwmaDefaultEstimate: 5e5,
            abrEwmaDefaultEstimateMax: 5e6,
            abrBandWidthFactor: .95,
            abrBandWidthUpFactor: .7,
            abrMaxWithRealBitrate: !1,
            maxStarvationDelay: 4,
            maxLoadingDelay: 4,
            minAutoBitrate: 0,
            emeEnabled: !1,
            widevineLicenseUrl: void 0,
            drmSystems: {},
            drmSystemOptions: {},
            requestMediaKeySystemAccessFunc: Br,
            requireKeySystemAccessOnStart: !1,
            testBandwidth: !0,
            progressive: !1,
            lowLatencyMode: !0,
            cmcd: void 0,
            enableDateRangeMetadataCues: !0,
            enableEmsgMetadataCues: !0,
            enableEmsgKLVMetadata: !1,
            enableID3MetadataCues: !0,
            enableInterstitialPlayback: !0,
            interstitialAppendInPlace: !0,
            interstitialLiveLookAhead: 10,
            useMediaCapabilities: !0,
            preserveManualLevelOnError: !1,
            certLoadPolicy: {
                default: {
                    maxTimeToFirstByteMs: 8e3,
                    maxLoadTimeMs: 2e4,
                    timeoutRetry: null,
                    errorRetry: null
                }
            },
            keyLoadPolicy: {
                default: {
                    maxTimeToFirstByteMs: 8e3,
                    maxLoadTimeMs: 2e4,
                    timeoutRetry: {
                        maxNumRetry: 1,
                        retryDelayMs: 1e3,
                        maxRetryDelayMs: 2e4,
                        backoff: "linear"
                    },
                    errorRetry: {
                        maxNumRetry: 8,
                        retryDelayMs: 1e3,
                        maxRetryDelayMs: 2e4,
                        backoff: "linear"
                    }
                }
            },
            manifestLoadPolicy: {
                default: {
                    maxTimeToFirstByteMs: 1 / 0,
                    maxLoadTimeMs: 2e4,
                    timeoutRetry: {
                        maxNumRetry: 2,
                        retryDelayMs: 0,
                        maxRetryDelayMs: 0
                    },
                    errorRetry: {
                        maxNumRetry: 1,
                        retryDelayMs: 1e3,
                        maxRetryDelayMs: 8e3
                    }
                }
            },
            playlistLoadPolicy: {
                default: {
                    maxTimeToFirstByteMs: 1e4,
                    maxLoadTimeMs: 2e4,
                    timeoutRetry: {
                        maxNumRetry: 2,
                        retryDelayMs: 0,
                        maxRetryDelayMs: 0
                    },
                    errorRetry: {
                        maxNumRetry: 2,
                        retryDelayMs: 1e3,
                        maxRetryDelayMs: 8e3
                    }
                }
            },
            fragLoadPolicy: {
                default: {
                    maxTimeToFirstByteMs: 1e4,
                    maxLoadTimeMs: 12e4,
                    timeoutRetry: {
                        maxNumRetry: 4,
                        retryDelayMs: 0,
                        maxRetryDelayMs: 0
                    },
                    errorRetry: {
                        maxNumRetry: 6,
                        retryDelayMs: 1e3,
                        maxRetryDelayMs: 8e3
                    }
                }
            },
            steeringManifestLoadPolicy: {
                default: {
                    maxTimeToFirstByteMs: 1e4,
                    maxLoadTimeMs: 2e4,
                    timeoutRetry: {
                        maxNumRetry: 2,
                        retryDelayMs: 0,
                        maxRetryDelayMs: 0
                    },
                    errorRetry: {
                        maxNumRetry: 1,
                        retryDelayMs: 1e3,
                        maxRetryDelayMs: 8e3
                    }
                }
            },
            interstitialAssetListLoadPolicy: {
                default: {
                    maxTimeToFirstByteMs: 1e4,
                    maxLoadTimeMs: 3e4,
                    timeoutRetry: {
                        maxNumRetry: 0,
                        retryDelayMs: 0,
                        maxRetryDelayMs: 0
                    },
                    errorRetry: {
                        maxNumRetry: 0,
                        retryDelayMs: 1e3,
                        maxRetryDelayMs: 8e3
                    }
                }
            },
            manifestLoadingTimeOut: 1e4,
            manifestLoadingMaxRetry: 1,
            manifestLoadingRetryDelay: 1e3,
            manifestLoadingMaxRetryTimeout: 64e3,
            levelLoadingTimeOut: 1e4,
            levelLoadingMaxRetry: 4,
            levelLoadingRetryDelay: 1e3,
            levelLoadingMaxRetryTimeout: 64e3,
            fragLoadingTimeOut: 2e4,
            fragLoadingMaxRetry: 6,
            fragLoadingRetryDelay: 1e3,
            fragLoadingMaxRetryTimeout: 64e3
        }, {
            cueHandler: al,
            enableWebVTT: !0,
            enableIMSC1: !0,
            enableCEA708Captions: !0,
            captionsTextTrack1Label: "English",
            captionsTextTrack1LanguageCode: "en",
            captionsTextTrack2Label: "Spanish",
            captionsTextTrack2LanguageCode: "es",
            captionsTextTrack3Label: "Unknown CC",
            captionsTextTrack3LanguageCode: "",
            captionsTextTrack4Label: "Unknown CC",
            captionsTextTrack4LanguageCode: "",
            renderTextTracksNatively: !0
        }), {}, {
            subtitleStreamController: ro,
            subtitleTrackController: uo,
            timelineController: tl,
            audioStreamController: ca,
            audioTrackController: ya,
            emeController: xs,
            cmcdController: Ps,
            contentSteeringController: Cs,
            interstitialsController: to
        });
        function cl(e) {
            return e && "object" == typeof e ? Array.isArray(e) ? e.map(cl) : Object.keys(e).reduce((function(t, r) {
                return t[r] = cl(e[r]),
                t
            }
            ), {}) : e
        }
        function gl(e, t) {
            var r = e.loader;
            r !== ol && r !== hl ? (t.log("[config]: Custom loader detected, cannot enable progressive streaming"),
            e.progressive = !1) : function() {
                if (self.fetch && self.AbortController && self.ReadableStream && self.Request)
                    try {
                        return new self.ReadableStream({}),
                        !0
                    } catch (e) {}
                return !1
            }() && (e.loader = ol,
            e.progressive = !0,
            e.enableSoftwareAES = !0,
            t.log("[config]: Progressive streaming enabled, using FetchLoader"))
        }
        var vl = function(e) {
            function t(t, r) {
                var i;
                return (i = e.call(this, "gap-controller", t.logger) || this).hls = void 0,
                i.fragmentTracker = void 0,
                i.media = null,
                i.mediaSource = void 0,
                i.nudgeRetry = 0,
                i.stallReported = !1,
                i.stalled = null,
                i.moved = !1,
                i.seeking = !1,
                i.buffered = {},
                i.lastCurrentTime = 0,
                i.ended = 0,
                i.waiting = 0,
                i.onMediaPlaying = function() {
                    i.ended = 0,
                    i.waiting = 0
                }
                ,
                i.onMediaWaiting = function() {
                    var e;
                    null != (e = i.media) && e.seeking || (i.waiting = self.performance.now(),
                    i.tick())
                }
                ,
                i.onMediaEnded = function() {
                    var e;
                    i.hls && (i.ended = (null == (e = i.media) ? void 0 : e.currentTime) || 1,
                    i.hls.trigger(b.MEDIA_ENDED, {
                        stalled: !1
                    }))
                }
                ,
                i.hls = t,
                i.fragmentTracker = r,
                i.registerListeners(),
                i
            }
            o(t, e);
            var r = t.prototype;
            return r.registerListeners = function() {
                var e = this.hls;
                e && (e.on(b.MEDIA_ATTACHED, this.onMediaAttached, this),
                e.on(b.MEDIA_DETACHING, this.onMediaDetaching, this),
                e.on(b.BUFFER_APPENDED, this.onBufferAppended, this))
            }
            ,
            r.unregisterListeners = function() {
                var e = this.hls;
                e && (e.off(b.MEDIA_ATTACHED, this.onMediaAttached, this),
                e.off(b.MEDIA_DETACHING, this.onMediaDetaching, this),
                e.off(b.BUFFER_APPENDED, this.onBufferAppended, this))
            }
            ,
            r.destroy = function() {
                e.prototype.destroy.call(this),
                this.unregisterListeners(),
                this.media = this.hls = this.fragmentTracker = null,
                this.mediaSource = void 0
            }
            ,
            r.onMediaAttached = function(e, t) {
                this.setInterval(100),
                this.mediaSource = t.mediaSource;
                var r = this.media = t.media;
                Li(r, "playing", this.onMediaPlaying),
                Li(r, "waiting", this.onMediaWaiting),
                Li(r, "ended", this.onMediaEnded)
            }
            ,
            r.onMediaDetaching = function(e, t) {
                this.clearInterval();
                var r = this.media;
                r && (Ii(r, "playing", this.onMediaPlaying),
                Ii(r, "waiting", this.onMediaWaiting),
                Ii(r, "ended", this.onMediaEnded),
                this.media = null),
                this.mediaSource = void 0
            }
            ,
            r.onBufferAppended = function(e, t) {
                this.buffered = t.timeRanges
            }
            ,
            r.tick = function() {
                var e;
                if (null != (e = this.media) && e.readyState && this.hasBuffered) {
                    var t = this.media.currentTime;
                    this.poll(t, this.lastCurrentTime),
                    this.lastCurrentTime = t
                }
            }
            ,
            r.poll = function(e, t) {
                var r, i, n = null == (r = this.hls) ? void 0 : r.config;
                if (n) {
                    var a = this.media;
                    if (a) {
                        var s = a.seeking
                          , o = this.seeking && !s
                          , l = !this.seeking && s
                          , u = a.paused && !s || a.ended || 0 === a.playbackRate;
                        if (this.seeking = s,
                        e !== t)
                            return t && (this.ended = 0),
                            this.moved = !0,
                            s || (this.nudgeRetry = 0,
                            n.nudgeOnVideoHole && !u && e > t && this.nudgeOnVideoHole(e, t)),
                            void (0 === this.waiting && this.stallResolved(e));
                        if (l || o)
                            o && this.stallResolved(e);
                        else {
                            if (u)
                                return this.nudgeRetry = 0,
                                this.stallResolved(e),
                                void (!this.ended && a.ended && this.hls && (this.ended = e || 1,
                                this.hls.trigger(b.MEDIA_ENDED, {
                                    stalled: !1
                                })));
                            if (ur.getBuffered(a).length) {
                                var d = ur.bufferInfo(a, e, 0)
                                  , h = d.nextStart || 0
                                  , f = this.fragmentTracker;
                                if (s && f && this.hls) {
                                    var c = ml(this.hls.inFlightFragments, e)
                                      , g = d.len > 2
                                      , v = !h || c || h - e > 2 && !f.getPartialFragment(e);
                                    if (g || v)
                                        return;
                                    this.moved = !1
                                }
                                var m = null == (i = this.hls) ? void 0 : i.latestLevelDetails;
                                if (!this.moved && null !== this.stalled && f) {
                                    if (!(d.len > 0 || h))
                                        return;
                                    var p = Math.max(h, d.start || 0) - e
                                      , y = null != m && m.live ? 2 * m.targetduration : 2
                                      , E = yl(e, f);
                                    if (p > 0 && (p <= y || E))
                                        return void (a.paused || this._trySkipBufferHole(E))
                                }
                                var T = n.detectStallWithCurrentTimeMs
                                  , S = self.performance.now()
                                  , A = this.waiting
                                  , L = this.stalled;
                                if (null === L) {
                                    if (!(A > 0 && S - A < T))
                                        return void (this.stalled = S);
                                    L = this.stalled = A
                                }
                                var I = S - L;
                                if (!s && (I >= T || A) && this.hls) {
                                    var R;
                                    if ("ended" === (null == (R = this.mediaSource) ? void 0 : R.readyState) && (null == m || !m.live) && Math.abs(e - ((null == m ? void 0 : m.edge) || 0)) < 1) {
                                        if (this.ended)
                                            return;
                                        return this.ended = e || 1,
                                        void this.hls.trigger(b.MEDIA_ENDED, {
                                            stalled: !0
                                        })
                                    }
                                    if (this._reportStall(d),
                                    !this.media || !this.hls)
                                        return
                                }
                                var k = ur.bufferInfo(a, e, n.maxBufferHole);
                                this._tryFixBufferStall(k, I, e)
                            } else
                                this.nudgeRetry = 0
                        }
                    }
                }
            }
            ,
            r.stallResolved = function(e) {
                var t = this.stalled;
                if (t && this.hls && (this.stalled = null,
                this.stallReported)) {
                    var r = self.performance.now() - t;
                    this.log("playback not stuck anymore @" + e + ", after " + Math.round(r) + "ms"),
                    this.stallReported = !1,
                    this.waiting = 0,
                    this.hls.trigger(b.STALL_RESOLVED, {})
                }
            }
            ,
            r.nudgeOnVideoHole = function(e, t) {
                var r, i = this.buffered.video;
                if (this.hls && this.media && this.fragmentTracker && null != (r = this.buffered.audio) && r.length && i && i.length > 1 && e > i.end(0)) {
                    var n = ur.bufferedInfo(ur.timeRangesToArray(this.buffered.audio), e, 0);
                    if (n.len > 1 && t >= n.start) {
                        var a = ur.timeRangesToArray(i)
                          , s = ur.bufferedInfo(a, t, 0).bufferedIndex;
                        if (s > -1 && s < a.length - 1) {
                            var o = ur.bufferedInfo(a, e, 0).bufferedIndex
                              , l = a[s].end
                              , u = a[s + 1].start;
                            if ((-1 === o || o > s) && u - l < 1 && e - l < 2) {
                                var d = new Error("nudging playhead to flush pipeline after video hole. currentTime: " + e + " hole: " + l + " -> " + u + " buffered index: " + o);
                                this.warn(d.message),
                                this.media.currentTime += 1e-6;
                                var h = yl(e, this.fragmentTracker);
                                h && "fragment"in h ? h = h.fragment : h || (h = void 0);
                                var f = ur.bufferInfo(this.media, e, 0);
                                this.hls.trigger(b.ERROR, {
                                    type: R.MEDIA_ERROR,
                                    details: k.BUFFER_SEEK_OVER_HOLE,
                                    fatal: !1,
                                    error: d,
                                    reason: d.message,
                                    frag: h,
                                    buffer: f.len,
                                    bufferInfo: f
                                })
                            }
                        }
                    }
                }
            }
            ,
            r._tryFixBufferStall = function(e, t, r) {
                var i, n, a = this.fragmentTracker, s = this.media, o = null == (i = this.hls) ? void 0 : i.config;
                if (s && a && o) {
                    var l = null == (n = this.hls) ? void 0 : n.latestLevelDetails
                      , u = yl(r, a);
                    if ((u || null != l && l.live && r < l.fragmentStart) && (this._trySkipBufferHole(u) || !this.media))
                        return;
                    var d = e.buffered
                      , h = this.adjacentTraversal(e, r);
                    (d && d.length > 1 && e.len > o.maxBufferHole || e.nextStart && (e.nextStart - r < o.maxBufferHole || h)) && (t > 1e3 * o.highBufferWatchdogPeriod || this.waiting) && (this.warn("Trying to nudge playhead over buffer-hole"),
                    this._tryNudgeBuffer(e))
                }
            }
            ,
            r.adjacentTraversal = function(e, t) {
                var r = this.fragmentTracker
                  , i = e.nextStart;
                if (r && i) {
                    var n = r.getFragAtPos(t, w)
                      , a = r.getFragAtPos(i, w);
                    if (n && a)
                        return a.sn - n.sn < 2
                }
                return !1
            }
            ,
            r._reportStall = function(e) {
                var t = this.hls
                  , r = this.media
                  , i = this.stallReported
                  , n = this.stalled;
                if (!i && null !== n && r && t) {
                    this.stallReported = !0;
                    var a = new Error("Playback stalling at @" + r.currentTime + " due to low buffer (" + lt(e) + ")");
                    this.warn(a.message),
                    t.trigger(b.ERROR, {
                        type: R.MEDIA_ERROR,
                        details: k.BUFFER_STALLED_ERROR,
                        fatal: !1,
                        error: a,
                        buffer: e.len,
                        bufferInfo: e,
                        stalled: {
                            start: n
                        }
                    })
                }
            }
            ,
            r._trySkipBufferHole = function(e) {
                var t, r = this.fragmentTracker, i = this.media, n = null == (t = this.hls) ? void 0 : t.config;
                if (!i || !r || !n)
                    return 0;
                var a = i.currentTime
                  , s = ur.bufferInfo(i, a, 0)
                  , o = a < s.start ? s.start : s.nextStart;
                if (o && this.hls) {
                    var l = s.len <= n.maxBufferHole
                      , u = s.len > 0 && s.len < 1 && i.readyState < 3
                      , d = o - a;
                    if (d > 0 && (l || u)) {
                        if (d > n.maxBufferHole) {
                            var h = !1;
                            if (0 === a) {
                                var f = r.getAppendedFrag(0, w);
                                f && o < f.end && (h = !0)
                            }
                            if (!h && e) {
                                var c;
                                if (null == (c = this.hls.loadLevelObj) || !c.details)
                                    return 0;
                                if (ml(this.hls.inFlightFragments, o))
                                    return 0;
                                for (var g = !1, v = e.end; v < o; ) {
                                    var m = yl(v, r);
                                    if (!m) {
                                        g = !0;
                                        break
                                    }
                                    v += m.duration
                                }
                                if (g)
                                    return 0
                            }
                        }
                        var p = Math.max(o + .05, a + .1);
                        if (this.warn("skipping hole, adjusting currentTime from " + a + " to " + p),
                        this.moved = !0,
                        i.currentTime = p,
                        null == e || !e.gap) {
                            var y = new Error("fragment loaded with buffer holes, seeking from " + a + " to " + p)
                              , E = {
                                type: R.MEDIA_ERROR,
                                details: k.BUFFER_SEEK_OVER_HOLE,
                                fatal: !1,
                                error: y,
                                reason: y.message,
                                buffer: s.len,
                                bufferInfo: s
                            };
                            e && ("fragment"in e ? E.part = e : E.frag = e),
                            this.hls.trigger(b.ERROR, E)
                        }
                        return p
                    }
                }
                return 0
            }
            ,
            r._tryNudgeBuffer = function(e) {
                var t = this.hls
                  , r = this.media
                  , i = this.nudgeRetry
                  , n = null == t ? void 0 : t.config;
                if (!r || !n)
                    return 0;
                var a = r.currentTime;
                if (this.nudgeRetry++,
                i < n.nudgeMaxRetry) {
                    var s = a + (i + 1) * n.nudgeOffset
                      , o = new Error("Nudging 'currentTime' from " + a + " to " + s);
                    this.warn(o.message),
                    r.currentTime = s,
                    t.trigger(b.ERROR, {
                        type: R.MEDIA_ERROR,
                        details: k.BUFFER_NUDGE_ON_STALL,
                        error: o,
                        fatal: !1,
                        buffer: e.len,
                        bufferInfo: e
                    })
                } else {
                    var l = new Error("Playhead still not moving while enough data buffered @" + a + " after " + n.nudgeMaxRetry + " nudges");
                    this.error(l.message),
                    t.trigger(b.ERROR, {
                        type: R.MEDIA_ERROR,
                        details: k.BUFFER_STALLED_ERROR,
                        error: l,
                        fatal: !0,
                        buffer: e.len,
                        bufferInfo: e
                    })
                }
            }
            ,
            i(t, [{
                key: "hasBuffered",
                get: function() {
                    return Object.keys(this.buffered).length > 0
                }
            }])
        }(sr);
        function ml(e, t) {
            var r = pl(e.main);
            if (r && r.start <= t)
                return r;
            var i = pl(e.audio);
            return i && i.start <= t ? i : null
        }
        function pl(e) {
            if (!e)
                return null;
            switch (e.state) {
            case ki.IDLE:
            case ki.STOPPED:
            case ki.ENDED:
            case ki.ERROR:
                return null
            }
            return e.frag
        }
        function yl(e, t) {
            return t.getAppendedFrag(e, w) || t.getPartialFragment(e)
        }
        function El() {
            if ("undefined" != typeof self)
                return self.VTTCue || self.TextTrackCue
        }
        function Tl(e, t, r, i, n) {
            var a = new e(t,r,"");
            try {
                a.value = i,
                n && (a.type = n)
            } catch (s) {
                a = new e(t,r,lt(n ? d({
                    type: n
                }, i) : i))
            }
            return a
        }
        var Sl = function() {
            var e = El();
            try {
                e && new e(0,Number.POSITIVE_INFINITY,"")
            } catch (e) {
                return Number.MAX_VALUE
            }
            return Number.POSITIVE_INFINITY
        }()
          , Al = function() {
            function e(e) {
                var t = this;
                this.hls = void 0,
                this.id3Track = null,
                this.media = null,
                this.dateRangeCuesAppended = {},
                this.removeCues = !0,
                this.assetCue = void 0,
                this.onEventCueEnter = function() {
                    t.hls && t.hls.trigger(b.EVENT_CUE_ENTER, {})
                }
                ,
                this.hls = e,
                this._registerListeners()
            }
            var t = e.prototype;
            return t.destroy = function() {
                this._unregisterListeners(),
                this.id3Track = null,
                this.media = null,
                this.dateRangeCuesAppended = {},
                this.hls = this.onEventCueEnter = null
            }
            ,
            t._registerListeners = function() {
                var e = this.hls;
                e && (e.on(b.MEDIA_ATTACHING, this.onMediaAttaching, this),
                e.on(b.MEDIA_ATTACHED, this.onMediaAttached, this),
                e.on(b.MEDIA_DETACHING, this.onMediaDetaching, this),
                e.on(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.on(b.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this),
                e.on(b.BUFFER_FLUSHING, this.onBufferFlushing, this),
                e.on(b.LEVEL_UPDATED, this.onLevelUpdated, this),
                e.on(b.LEVEL_PTS_UPDATED, this.onLevelPtsUpdated, this))
            }
            ,
            t._unregisterListeners = function() {
                var e = this.hls;
                e && (e.off(b.MEDIA_ATTACHING, this.onMediaAttaching, this),
                e.off(b.MEDIA_ATTACHED, this.onMediaAttached, this),
                e.off(b.MEDIA_DETACHING, this.onMediaDetaching, this),
                e.off(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.off(b.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this),
                e.off(b.BUFFER_FLUSHING, this.onBufferFlushing, this),
                e.off(b.LEVEL_UPDATED, this.onLevelUpdated, this),
                e.off(b.LEVEL_PTS_UPDATED, this.onLevelPtsUpdated, this))
            }
            ,
            t.onMediaAttaching = function(e, t) {
                var r;
                this.media = t.media,
                !1 === (null == (r = t.overrides) ? void 0 : r.cueRemoval) && (this.removeCues = !1)
            }
            ,
            t.onMediaAttached = function() {
                var e, t = null == (e = this.hls) ? void 0 : e.latestLevelDetails;
                t && this.updateDateRangeCues(t)
            }
            ,
            t.onMediaDetaching = function(e, t) {
                this.media = null,
                t.transferMedia || (this.id3Track && (this.removeCues && so(this.id3Track, this.onEventCueEnter),
                this.id3Track = null),
                this.dateRangeCuesAppended = {})
            }
            ,
            t.onManifestLoading = function() {
                this.dateRangeCuesAppended = {}
            }
            ,
            t.createTrack = function(e) {
                var t = this.getID3Track(e.textTracks);
                return t.mode = "hidden",
                t
            }
            ,
            t.getID3Track = function(e) {
                if (this.media) {
                    for (var t = 0; t < e.length; t++) {
                        var r = e[t];
                        if ("metadata" === r.kind && "id3" === r.label)
                            return no(r, this.media),
                            r
                    }
                    return this.media.addTextTrack("metadata", "id3")
                }
            }
            ,
            t.onFragParsingMetadata = function(e, t) {
                if (this.media && this.hls) {
                    var r = this.hls.config
                      , i = r.enableEmsgMetadataCues
                      , n = r.enableID3MetadataCues;
                    if (i || n) {
                        var a = t.samples;
                        this.id3Track || (this.id3Track = this.createTrack(this.media));
                        var s = El();
                        if (s)
                            for (var o = 0; o < a.length; o++) {
                                var l = a[o].type;
                                if ((l !== Ji.emsg || i) && n) {
                                    var u = Qi(a[o].data)
                                      , d = a[o].pts
                                      , h = d + a[o].duration;
                                    h > Sl && (h = Sl),
                                    h - d <= 0 && (h = d + .25);
                                    for (var f = 0; f < u.length; f++) {
                                        var c = u[f];
                                        if (!zi(c)) {
                                            this.updateId3CueEnds(d, l);
                                            var g = Tl(s, d, h, c, l);
                                            g && this.id3Track.addCue(g)
                                        }
                                    }
                                }
                            }
                    }
                }
            }
            ,
            t.updateId3CueEnds = function(e, t) {
                var r, i = null == (r = this.id3Track) ? void 0 : r.cues;
                if (i)
                    for (var n = i.length; n--; ) {
                        var a = i[n];
                        a.type === t && a.startTime < e && a.endTime === Sl && (a.endTime = e)
                    }
            }
            ,
            t.onBufferFlushing = function(e, t) {
                var r = t.startOffset
                  , i = t.endOffset
                  , n = t.type
                  , a = this.id3Track
                  , s = this.hls;
                if (s) {
                    var o = s.config
                      , l = o.enableEmsgMetadataCues
                      , u = o.enableID3MetadataCues;
                    a && (l || u) && oo(a, r, i, "audio" === n ? function(e) {
                        return e.type === Ji.audioId3 && u
                    }
                    : "video" === n ? function(e) {
                        return e.type === Ji.emsg && l
                    }
                    : function(e) {
                        return e.type === Ji.audioId3 && u || e.type === Ji.emsg && l
                    }
                    )
                }
            }
            ,
            t.onLevelUpdated = function(e, t) {
                var r = t.details;
                this.updateDateRangeCues(r, !0)
            }
            ,
            t.onLevelPtsUpdated = function(e, t) {
                Math.abs(t.drift) > .01 && this.updateDateRangeCues(t.details)
            }
            ,
            t.updateDateRangeCues = function(e, t) {
                var r = this;
                if (this.hls && this.media) {
                    var i = this.hls.config
                      , n = i.assetPlayerId
                      , a = i.timelineOffset
                      , s = i.enableDateRangeMetadataCues
                      , o = i.interstitialsController;
                    if (s) {
                        var l = El();
                        if (n && a && !o) {
                            var u = e.fragmentStart
                              , d = e.fragmentEnd
                              , h = this.assetCue;
                            h ? (h.startTime = u,
                            h.endTime = d) : l && (h = this.assetCue = Tl(l, u, d, {
                                assetPlayerId: this.hls.config.assetPlayerId
                            }, "hlsjs.interstitial.asset")) && (h.id = n,
                            this.id3Track || (this.id3Track = this.createTrack(this.media)),
                            this.id3Track.addCue(h),
                            h.addEventListener("enter", this.onEventCueEnter))
                        }
                        if (e.hasProgramDateTime) {
                            var f, c = this.id3Track, g = e.dateRanges, v = Object.keys(g), m = this.dateRangeCuesAppended;
                            if (c && t)
                                if (null != (f = c.cues) && f.length)
                                    for (var p = Object.keys(m).filter((function(e) {
                                        return !v.includes(e)
                                    }
                                    )), y = function() {
                                        var e, t = p[E], i = null == (e = m[t]) ? void 0 : e.cues;
                                        delete m[t],
                                        i && Object.keys(i).forEach((function(e) {
                                            var t = i[e];
                                            if (t) {
                                                t.removeEventListener("enter", r.onEventCueEnter);
                                                try {
                                                    c.removeCue(t)
                                                } catch (e) {}
                                            }
                                        }
                                        ))
                                    }, E = p.length; E--; )
                                        y();
                                else
                                    m = this.dateRangeCuesAppended = {};
                            var T = e.fragments[e.fragments.length - 1];
                            if (0 !== v.length && A(null == T ? void 0 : T.programDateTime)) {
                                this.id3Track || (this.id3Track = this.createTrack(this.media));
                                for (var S = function() {
                                    var e = v[L]
                                      , t = g[e]
                                      , i = t.startTime
                                      , n = m[e]
                                      , a = (null == n ? void 0 : n.cues) || {}
                                      , s = (null == n ? void 0 : n.durationKnown) || !1
                                      , u = Sl
                                      , d = t.duration;
                                    if (t.endDate && null !== d)
                                        u = i + d,
                                        s = !0;
                                    else if (t.endOnNext && !s) {
                                        var h = v.reduce((function(e, r) {
                                            if (r !== t.id) {
                                                var i = g[r];
                                                if (i.class === t.class && i.startDate > t.startDate && (!e || t.startDate < e.startDate))
                                                    return i
                                            }
                                            return e
                                        }
                                        ), null);
                                        h && (u = h.startTime,
                                        s = !0)
                                    }
                                    for (var f, c = Object.keys(t.attr), p = 0; p < c.length; p++) {
                                        var y = c[p];
                                        if ("ID" !== (f = y) && "CLASS" !== f && "CUE" !== f && "START-DATE" !== f && "DURATION" !== f && "END-DATE" !== f && "END-ON-NEXT" !== f) {
                                            var E = a[y];
                                            if (E)
                                                !s || null != n && n.durationKnown ? Math.abs(E.startTime - i) > .01 && (E.startTime = i,
                                                E.endTime = u) : E.endTime = u;
                                            else if (l) {
                                                var T = t.attr[y];
                                                yr(y) && (T = Q(T));
                                                var S = Tl(l, i, u, {
                                                    key: y,
                                                    data: T
                                                }, Ji.dateRange);
                                                S && (S.id = e,
                                                r.id3Track.addCue(S),
                                                a[y] = S,
                                                o && ("X-ASSET-LIST" !== y && "X-ASSET-URL" !== y || S.addEventListener("enter", r.onEventCueEnter)))
                                            }
                                        }
                                    }
                                    m[e] = {
                                        cues: a,
                                        dateRange: t,
                                        durationKnown: s
                                    }
                                }, L = 0; L < v.length; L++)
                                    S()
                            }
                        }
                    }
                }
            }
            ,
            e
        }()
          , Ll = function() {
            function e(e) {
                var t = this;
                this.hls = void 0,
                this.config = void 0,
                this.media = null,
                this.currentTime = 0,
                this.stallCount = 0,
                this._latency = null,
                this._targetLatencyUpdated = !1,
                this.onTimeupdate = function() {
                    var e = t.media
                      , r = t.levelDetails;
                    if (e && r) {
                        t.currentTime = e.currentTime;
                        var i = t.computeLatency();
                        if (null !== i) {
                            t._latency = i;
                            var n = t.config
                              , a = n.lowLatencyMode
                              , s = n.maxLiveSyncPlaybackRate;
                            if (a && 1 !== s && r.live) {
                                var o = t.targetLatency;
                                if (null !== o) {
                                    var l = i - o;
                                    if (l < Math.min(t.maxLatency, o + r.targetduration) && l > .05 && t.forwardBufferLength > 1) {
                                        var u = Math.min(2, Math.max(1, s))
                                          , d = Math.round(2 / (1 + Math.exp(-.75 * l - t.edgeStalled)) * 20) / 20
                                          , h = Math.min(u, Math.max(1, d));
                                        t.changeMediaPlaybackRate(e, h)
                                    } else
                                        1 !== e.playbackRate && 0 !== e.playbackRate && t.changeMediaPlaybackRate(e, 1)
                                }
                            }
                        }
                    }
                }
                ,
                this.hls = e,
                this.config = e.config,
                this.registerListeners()
            }
            var t = e.prototype;
            return t.destroy = function() {
                this.unregisterListeners(),
                this.onMediaDetaching(),
                this.hls = null
            }
            ,
            t.registerListeners = function() {
                var e = this.hls;
                e && (e.on(b.MEDIA_ATTACHED, this.onMediaAttached, this),
                e.on(b.MEDIA_DETACHING, this.onMediaDetaching, this),
                e.on(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.on(b.LEVEL_UPDATED, this.onLevelUpdated, this),
                e.on(b.ERROR, this.onError, this))
            }
            ,
            t.unregisterListeners = function() {
                var e = this.hls;
                e && (e.off(b.MEDIA_ATTACHED, this.onMediaAttached, this),
                e.off(b.MEDIA_DETACHING, this.onMediaDetaching, this),
                e.off(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.off(b.LEVEL_UPDATED, this.onLevelUpdated, this),
                e.off(b.ERROR, this.onError, this))
            }
            ,
            t.onMediaAttached = function(e, t) {
                this.media = t.media,
                this.media.addEventListener("timeupdate", this.onTimeupdate)
            }
            ,
            t.onMediaDetaching = function() {
                this.media && (this.media.removeEventListener("timeupdate", this.onTimeupdate),
                this.media = null)
            }
            ,
            t.onManifestLoading = function() {
                this._latency = null,
                this.stallCount = 0
            }
            ,
            t.onLevelUpdated = function(e, t) {
                var r = t.details;
                r.advanced && this.onTimeupdate(),
                !r.live && this.media && this.media.removeEventListener("timeupdate", this.onTimeupdate)
            }
            ,
            t.onError = function(e, t) {
                var r;
                t.details === k.BUFFER_STALLED_ERROR && (this.stallCount++,
                this.hls && null != (r = this.levelDetails) && r.live && this.hls.logger.warn("[latency-controller]: Stall detected, adjusting target latency"))
            }
            ,
            t.changeMediaPlaybackRate = function(e, t) {
                var r, i;
                e.playbackRate !== t && (null == (r = this.hls) || r.logger.debug("[latency-controller]: latency=" + this.latency.toFixed(3) + ", targetLatency=" + (null == (i = this.targetLatency) ? void 0 : i.toFixed(3)) + ", forwardBufferLength=" + this.forwardBufferLength.toFixed(3) + ": adjusting playback rate from " + e.playbackRate + " to " + t),
                e.playbackRate = t)
            }
            ,
            t.estimateLiveEdge = function() {
                var e = this.levelDetails;
                return null === e ? null : e.edge + e.age
            }
            ,
            t.computeLatency = function() {
                var e = this.estimateLiveEdge();
                return null === e ? null : e - this.currentTime
            }
            ,
            i(e, [{
                key: "levelDetails",
                get: function() {
                    var e;
                    return (null == (e = this.hls) ? void 0 : e.latestLevelDetails) || null
                }
            }, {
                key: "latency",
                get: function() {
                    return this._latency || 0
                }
            }, {
                key: "maxLatency",
                get: function() {
                    var e = this.config;
                    if (void 0 !== e.liveMaxLatencyDuration)
                        return e.liveMaxLatencyDuration;
                    var t = this.levelDetails;
                    return t ? e.liveMaxLatencyDurationCount * t.targetduration : 0
                }
            }, {
                key: "targetLatency",
                get: function() {
                    var e = this.levelDetails;
                    if (null === e || null === this.hls)
                        return null;
                    var t = e.holdBack
                      , r = e.partHoldBack
                      , i = e.targetduration
                      , n = this.config
                      , a = n.liveSyncDuration
                      , s = n.liveSyncDurationCount
                      , o = n.lowLatencyMode
                      , l = this.hls.userConfig
                      , u = o && r || t;
                    (this._targetLatencyUpdated || l.liveSyncDuration || l.liveSyncDurationCount || 0 === u) && (u = void 0 !== a ? a : s * i);
                    var d = i;
                    return u + Math.min(this.stallCount * this.config.liveSyncOnStallIncrease, d)
                },
                set: function(e) {
                    this.stallCount = 0,
                    this.config.liveSyncDuration = e,
                    this._targetLatencyUpdated = !0
                }
            }, {
                key: "liveSyncPosition",
                get: function() {
                    var e = this.estimateLiveEdge()
                      , t = this.targetLatency;
                    if (null === e || null === t)
                        return null;
                    var r = this.levelDetails;
                    if (null === r)
                        return null;
                    var i = r.edge
                      , n = e - t - this.edgeStalled
                      , a = i - r.totalduration
                      , s = i - (this.config.lowLatencyMode && r.partTarget || r.targetduration);
                    return Math.min(Math.max(a, n), s)
                }
            }, {
                key: "drift",
                get: function() {
                    var e = this.levelDetails;
                    return null === e ? 1 : e.drift
                }
            }, {
                key: "edgeStalled",
                get: function() {
                    var e = this.levelDetails;
                    if (null === e)
                        return 0;
                    var t = 3 * (this.config.lowLatencyMode && e.partTarget || e.targetduration);
                    return Math.max(e.age - t, 0)
                }
            }, {
                key: "forwardBufferLength",
                get: function() {
                    var e = this.media
                      , t = this.levelDetails;
                    if (!e || !t)
                        return 0;
                    var r = e.buffered.length;
                    return (r ? e.buffered.end(r - 1) : t.edge) - this.currentTime
                }
            }])
        }()
          , Il = function(e) {
            function t(t, r) {
                var i;
                return (i = e.call(this, t, "level-controller") || this)._levels = [],
                i._firstLevel = -1,
                i._maxAutoLevel = -1,
                i._startLevel = void 0,
                i.currentLevel = null,
                i.currentLevelIndex = -1,
                i.manualLevelIndex = -1,
                i.steering = void 0,
                i.onParsedComplete = void 0,
                i.steering = r,
                i._registerListeners(),
                i
            }
            o(t, e);
            var r = t.prototype;
            return r._registerListeners = function() {
                var e = this.hls;
                e.on(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.on(b.MANIFEST_LOADED, this.onManifestLoaded, this),
                e.on(b.LEVEL_LOADED, this.onLevelLoaded, this),
                e.on(b.LEVELS_UPDATED, this.onLevelsUpdated, this),
                e.on(b.FRAG_BUFFERED, this.onFragBuffered, this),
                e.on(b.ERROR, this.onError, this)
            }
            ,
            r._unregisterListeners = function() {
                var e = this.hls;
                e.off(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.off(b.MANIFEST_LOADED, this.onManifestLoaded, this),
                e.off(b.LEVEL_LOADED, this.onLevelLoaded, this),
                e.off(b.LEVELS_UPDATED, this.onLevelsUpdated, this),
                e.off(b.FRAG_BUFFERED, this.onFragBuffered, this),
                e.off(b.ERROR, this.onError, this)
            }
            ,
            r.destroy = function() {
                this._unregisterListeners(),
                this.steering = null,
                this.resetLevels(),
                e.prototype.destroy.call(this)
            }
            ,
            r.stopLoad = function() {
                this._levels.forEach((function(e) {
                    e.loadError = 0,
                    e.fragmentError = 0
                }
                )),
                e.prototype.stopLoad.call(this)
            }
            ,
            r.resetLevels = function() {
                this._startLevel = void 0,
                this.manualLevelIndex = -1,
                this.currentLevelIndex = -1,
                this.currentLevel = null,
                this._levels = [],
                this._maxAutoLevel = -1
            }
            ,
            r.onManifestLoading = function(e, t) {
                this.resetLevels()
            }
            ,
            r.onManifestLoaded = function(e, t) {
                var r = this
                  , i = this.hls.config.preferManagedMediaSource
                  , n = []
                  , a = {}
                  , s = {}
                  , o = !1
                  , l = !1
                  , u = !1;
                t.levels.forEach((function(e) {
                    var t = e.attrs
                      , d = e.audioCodec
                      , h = e.videoCodec;
                    d && (e.audioCodec = d = Ge(d, i) || void 0),
                    h && (h = e.videoCodec = function(e) {
                        for (var t = e.split(","), r = 0; r < t.length; r++) {
                            var i = t[r].split(".");
                            i.length > 2 && "avc1" === i[0] && (t[r] = "avc1." + parseInt(i[1]).toString(16) + ("000" + parseInt(i[2]).toString(16)).slice(-4))
                        }
                        return t.join(",")
                    }(h));
                    var f = e.width
                      , c = e.height
                      , g = e.unknownCodecs
                      , v = (null == g ? void 0 : g.length) || 0;
                    if (o || (o = !(!f || !c)),
                    l || (l = !!h),
                    u || (u = !!d),
                    v || d && !r.isAudioSupported(d) || h && !r.isVideoSupported(h))
                        r.log('Some or all CODECS not supported "' + t.CODECS + '"');
                    else {
                        var m = t.CODECS
                          , p = t["FRAME-RATE"]
                          , y = t["HDCP-LEVEL"]
                          , E = t["PATHWAY-ID"]
                          , T = t.RESOLUTION
                          , S = t["VIDEO-RANGE"]
                          , A = (E || ".") + "-" + e.bitrate + "-" + T + "-" + p + "-" + m + "-" + S + "-" + y;
                        if (a[A])
                            if (a[A].uri === e.url || e.attrs["PATHWAY-ID"])
                                a[A].addGroupId("audio", t.AUDIO),
                                a[A].addGroupId("text", t.SUBTITLES);
                            else {
                                var L = s[A] += 1;
                                e.attrs["PATHWAY-ID"] = new Array(L + 1).join(".");
                                var I = r.createLevel(e);
                                a[A] = I,
                                n.push(I)
                            }
                        else {
                            var R = r.createLevel(e);
                            a[A] = R,
                            s[A] = 1,
                            n.push(R)
                        }
                    }
                }
                )),
                this.filterAndSortMediaOptions(n, t, o, l, u)
            }
            ,
            r.createLevel = function(e) {
                var t = new at(e)
                  , r = e.supplemental;
                if (null != r && r.videoCodec && !this.isVideoSupported(r.videoCodec)) {
                    var i = new Error('SUPPLEMENTAL-CODECS not supported "' + r.videoCodec + '"');
                    this.log(i.message),
                    t.supportedResult = Xe(i, [])
                }
                return t
            }
            ,
            r.isAudioSupported = function(e) {
                return Oe(e, "audio", this.hls.config.preferManagedMediaSource)
            }
            ,
            r.isVideoSupported = function(e) {
                return Oe(e, "video", this.hls.config.preferManagedMediaSource)
            }
            ,
            r.filterAndSortMediaOptions = function(e, t, r, i, n) {
                var a, s = this, o = [], l = [], u = e, d = (null == (a = t.stats) ? void 0 : a.parsing) || {};
                if ((r || i) && n && (u = u.filter((function(e) {
                    var t, r = e.videoCodec, i = e.videoRange, n = e.width, a = e.height;
                    return (!!r || !(!n || !a)) && !!(t = i) && Je.indexOf(t) > -1
                }
                ))),
                0 === u.length)
                    return Promise.resolve().then((function() {
                        if (s.hls) {
                            var e = "no level with compatible codecs found in manifest"
                              , r = e;
                            t.levels.length && (r = "one or more CODECS in variant not supported: " + lt(t.levels.map((function(e) {
                                return e.attrs.CODECS
                            }
                            )).filter((function(e, t, r) {
                                return r.indexOf(e) === t
                            }
                            ))),
                            s.warn(r),
                            e += " (" + r + ")");
                            var i = new Error(e);
                            s.hls.trigger(b.ERROR, {
                                type: R.MEDIA_ERROR,
                                details: k.MANIFEST_INCOMPATIBLE_CODECS_ERROR,
                                fatal: !0,
                                url: t.url,
                                error: i,
                                reason: r
                            })
                        }
                    }
                    )),
                    void (d.end = performance.now());
                t.audioTracks && Rl(o = t.audioTracks.filter((function(e) {
                    return !e.audioCodec || s.isAudioSupported(e.audioCodec)
                }
                ))),
                t.subtitles && Rl(l = t.subtitles);
                var h = u.slice(0);
                u.sort((function(e, t) {
                    if (e.attrs["HDCP-LEVEL"] !== t.attrs["HDCP-LEVEL"])
                        return (e.attrs["HDCP-LEVEL"] || "") > (t.attrs["HDCP-LEVEL"] || "") ? 1 : -1;
                    if (r && e.height !== t.height)
                        return e.height - t.height;
                    if (e.frameRate !== t.frameRate)
                        return e.frameRate - t.frameRate;
                    if (e.videoRange !== t.videoRange)
                        return Je.indexOf(e.videoRange) - Je.indexOf(t.videoRange);
                    if (e.videoCodec !== t.videoCodec) {
                        var i = Fe(e.videoCodec)
                          , n = Fe(t.videoCodec);
                        if (i !== n)
                            return n - i
                    }
                    if (e.uri === t.uri && e.codecSet !== t.codecSet) {
                        var a = Ne(e.codecSet)
                          , s = Ne(t.codecSet);
                        if (a !== s)
                            return s - a
                    }
                    return e.averageBitrate !== t.averageBitrate ? e.averageBitrate - t.averageBitrate : 0
                }
                ));
                var f = h[0];
                if (this.steering && (u = this.steering.filterParsedLevels(u)).length !== h.length)
                    for (var c = 0; c < h.length; c++)
                        if (h[c].pathwayId === u[0].pathwayId) {
                            f = h[c];
                            break
                        }
                this._levels = u;
                for (var g = 0; g < u.length; g++)
                    if (u[g] === f) {
                        var v;
                        this._firstLevel = g;
                        var m = f.bitrate
                          , p = this.hls.bandwidthEstimate;
                        if (this.log("manifest loaded, " + u.length + " level(s) found, first bitrate: " + m),
                        void 0 === (null == (v = this.hls.userConfig) ? void 0 : v.abrEwmaDefaultEstimate)) {
                            var y = Math.min(m, this.hls.config.abrEwmaDefaultEstimateMax);
                            y > p && p === this.hls.abrEwmaDefaultEstimate && (this.hls.bandwidthEstimate = y)
                        }
                        break
                    }
                var E = n && !i
                  , T = this.hls.config
                  , S = !(!T.audioStreamController || !T.audioTrackController)
                  , A = {
                    levels: u,
                    audioTracks: o,
                    subtitleTracks: l,
                    sessionData: t.sessionData,
                    sessionKeys: t.sessionKeys,
                    firstLevel: this._firstLevel,
                    stats: t.stats,
                    audio: n,
                    video: i,
                    altAudio: S && !E && o.some((function(e) {
                        return !!e.url
                    }
                    ))
                };
                d.end = performance.now(),
                this.hls.trigger(b.MANIFEST_PARSED, A)
            }
            ,
            r.onError = function(e, t) {
                !t.fatal && t.context && t.context.type === _ && t.context.level === this.level && this.checkRetry(t)
            }
            ,
            r.onFragBuffered = function(e, t) {
                var r = t.frag;
                if (void 0 !== r && r.type === w) {
                    var i = r.elementaryStreams;
                    if (!Object.keys(i).some((function(e) {
                        return !!i[e]
                    }
                    )))
                        return;
                    var n = this._levels[r.level];
                    null != n && n.loadError && (this.log("Resetting level error count of " + n.loadError + " on frag buffered"),
                    n.loadError = 0)
                }
            }
            ,
            r.onLevelLoaded = function(e, t) {
                var r, i, n = t.level, a = t.details, s = t.levelInfo;
                if (!s)
                    return this.warn("Invalid level index " + n),
                    void (null != (i = t.deliveryDirectives) && i.skip && (a.deltaUpdateFailed = !0));
                if (s === this.currentLevel || t.withoutMultiVariant) {
                    0 === s.fragmentError && (s.loadError = 0);
                    var o = s.details;
                    o === t.details && o.advanced && (o = void 0),
                    this.playlistLoaded(n, t, o)
                } else
                    null != (r = t.deliveryDirectives) && r.skip && (a.deltaUpdateFailed = !0)
            }
            ,
            r.loadPlaylist = function(t) {
                e.prototype.loadPlaylist.call(this),
                this.shouldLoadPlaylist(this.currentLevel) && this.scheduleLoading(this.currentLevel, t)
            }
            ,
            r.loadingPlaylist = function(t, r) {
                e.prototype.loadingPlaylist.call(this, t, r);
                var i = this.getUrlWithDirectives(t.uri, r)
                  , n = this.currentLevelIndex
                  , a = t.attrs["PATHWAY-ID"]
                  , s = t.details
                  , o = null == s ? void 0 : s.age;
                this.log("Loading level index " + n + (void 0 !== (null == r ? void 0 : r.msn) ? " at sn " + r.msn + " part " + r.part : "") + (a ? " Pathway " + a : "") + (o && s.live ? " age " + o.toFixed(1) + (s.type && " " + s.type || "") : "") + " " + i),
                this.hls.trigger(b.LEVEL_LOADING, {
                    url: i,
                    level: n,
                    levelInfo: t,
                    pathwayId: t.attrs["PATHWAY-ID"],
                    id: 0,
                    deliveryDirectives: r || null
                })
            }
            ,
            r.removeLevel = function(e) {
                var t, r = this;
                if (1 !== this._levels.length) {
                    var i = this._levels.filter((function(t, i) {
                        return i !== e || (r.steering && r.steering.removeLevel(t),
                        t === r.currentLevel && (r.currentLevel = null,
                        r.currentLevelIndex = -1,
                        t.details && t.details.fragments.forEach((function(e) {
                            return e.level = -1
                        }
                        ))),
                        !1)
                    }
                    ));
                    vi(i),
                    this._levels = i,
                    this.currentLevelIndex > -1 && null != (t = this.currentLevel) && t.details && (this.currentLevelIndex = this.currentLevel.details.fragments[0].level),
                    this.manualLevelIndex > -1 && (this.manualLevelIndex = this.currentLevelIndex);
                    var n = i.length - 1;
                    this._firstLevel = Math.min(this._firstLevel, n),
                    this._startLevel && (this._startLevel = Math.min(this._startLevel, n)),
                    this.hls.trigger(b.LEVELS_UPDATED, {
                        levels: i
                    })
                }
            }
            ,
            r.onLevelsUpdated = function(e, t) {
                var r = t.levels;
                this._levels = r
            }
            ,
            r.checkMaxAutoUpdated = function() {
                var e = this.hls
                  , t = e.autoLevelCapping
                  , r = e.maxAutoLevel
                  , i = e.maxHdcpLevel;
                this._maxAutoLevel !== r && (this._maxAutoLevel = r,
                this.hls.trigger(b.MAX_AUTO_LEVEL_UPDATED, {
                    autoLevelCapping: t,
                    levels: this.levels,
                    maxAutoLevel: r,
                    minAutoLevel: this.hls.minAutoLevel,
                    maxHdcpLevel: i
                }))
            }
            ,
            i(t, [{
                key: "levels",
                get: function() {
                    return 0 === this._levels.length ? null : this._levels
                }
            }, {
                key: "loadLevelObj",
                get: function() {
                    return this.currentLevel
                }
            }, {
                key: "level",
                get: function() {
                    return this.currentLevelIndex
                },
                set: function(e) {
                    var t = this._levels;
                    if (0 !== t.length) {
                        if (e < 0 || e >= t.length) {
                            var r = new Error("invalid level idx")
                              , i = e < 0;
                            if (this.hls.trigger(b.ERROR, {
                                type: R.OTHER_ERROR,
                                details: k.LEVEL_SWITCH_ERROR,
                                level: e,
                                fatal: i,
                                error: r,
                                reason: r.message
                            }),
                            i)
                                return;
                            e = Math.min(e, t.length - 1)
                        }
                        var n = this.currentLevelIndex
                          , a = this.currentLevel
                          , s = a ? a.attrs["PATHWAY-ID"] : void 0
                          , o = t[e]
                          , l = o.attrs["PATHWAY-ID"];
                        if (this.currentLevelIndex = e,
                        this.currentLevel = o,
                        n !== e || !a || s !== l) {
                            this.log("Switching to level " + e + " (" + (o.height ? o.height + "p " : "") + (o.videoRange ? o.videoRange + " " : "") + (o.codecSet ? o.codecSet + " " : "") + "@" + o.bitrate + ")" + (l ? " with Pathway " + l : "") + " from level " + n + (s ? " with Pathway " + s : ""));
                            var u = {
                                level: e,
                                attrs: o.attrs,
                                details: o.details,
                                bitrate: o.bitrate,
                                averageBitrate: o.averageBitrate,
                                maxBitrate: o.maxBitrate,
                                realBitrate: o.realBitrate,
                                width: o.width,
                                height: o.height,
                                codecSet: o.codecSet,
                                audioCodec: o.audioCodec,
                                videoCodec: o.videoCodec,
                                audioGroups: o.audioGroups,
                                subtitleGroups: o.subtitleGroups,
                                loaded: o.loaded,
                                loadError: o.loadError,
                                fragmentError: o.fragmentError,
                                name: o.name,
                                id: o.id,
                                uri: o.uri,
                                url: o.url,
                                urlId: 0,
                                audioGroupIds: o.audioGroupIds,
                                textGroupIds: o.textGroupIds
                            };
                            this.hls.trigger(b.LEVEL_SWITCHING, u);
                            var d = o.details;
                            if (!d || d.live) {
                                var h = this.switchParams(o.uri, null == a ? void 0 : a.details, d);
                                this.loadPlaylist(h)
                            }
                        }
                    }
                }
            }, {
                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.hls.firstAutoLevel
                    }
                    return this._startLevel
                },
                set: function(e) {
                    this._startLevel = e
                }
            }, {
                key: "pathways",
                get: function() {
                    return this.steering ? this.steering.pathways() : []
                }
            }, {
                key: "pathwayPriority",
                get: function() {
                    return this.steering ? this.steering.pathwayPriority : null
                },
                set: function(e) {
                    if (this.steering) {
                        var t = this.steering.pathways()
                          , r = e.filter((function(e) {
                            return -1 !== t.indexOf(e)
                        }
                        ));
                        if (e.length < 1)
                            return void this.warn("pathwayPriority " + e + " should contain at least one pathway from list: " + t);
                        this.steering.pathwayPriority = r
                    }
                }
            }, {
                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)
                }
            }])
        }(ga);
        function Rl(e) {
            var t = {};
            e.forEach((function(e) {
                var r = e.groupId || "";
                e.id = t[r] = t[r] || 0,
                t[r]++
            }
            ))
        }
        function kl() {
            return self.SourceBuffer || self.WebKitSourceBuffer
        }
        function bl() {
            if (!W())
                return !1;
            var e = kl();
            return !e || e.prototype && "function" == typeof e.prototype.appendBuffer && "function" == typeof e.prototype.remove
        }
        var Dl = function(e) {
            function t(t, r, i) {
                var n;
                return (n = e.call(this, t, r, i, "stream-controller", w) || this).audioCodecSwap = !1,
                n.level = -1,
                n._forceStartLoad = !1,
                n._hasEnoughToStart = !1,
                n.altAudio = 0,
                n.audioOnly = !1,
                n.fragPlaying = null,
                n.fragLastKbps = 0,
                n.couldBacktrack = !1,
                n.backtrackFragment = null,
                n.audioCodecSwitch = !1,
                n.videoBuffer = null,
                n.onMediaPlaying = function() {
                    n.tick()
                }
                ,
                n.onMediaSeeked = function() {
                    var e = n.media
                      , t = e ? e.currentTime : null;
                    if (null !== t && A(t) && (n.log("Media seeked to " + t.toFixed(3)),
                    n.getBufferedFrag(t))) {
                        var r = n.getFwdBufferInfoAtPos(e, t, w, 0);
                        null !== r && 0 !== r.len ? n.tick() : n.warn("Main forward buffer length at " + t + ' on "seeked" event ' + (r ? r.len : "empty") + ")")
                    }
                }
                ,
                n.registerListeners(),
                n
            }
            o(t, e);
            var r = t.prototype;
            return r.registerListeners = function() {
                e.prototype.registerListeners.call(this);
                var t = this.hls;
                t.on(b.MANIFEST_PARSED, this.onManifestParsed, this),
                t.on(b.LEVEL_LOADING, this.onLevelLoading, this),
                t.on(b.LEVEL_LOADED, this.onLevelLoaded, this),
                t.on(b.FRAG_LOAD_EMERGENCY_ABORTED, this.onFragLoadEmergencyAborted, this),
                t.on(b.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this),
                t.on(b.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this),
                t.on(b.BUFFER_CREATED, this.onBufferCreated, this),
                t.on(b.BUFFER_FLUSHED, this.onBufferFlushed, this),
                t.on(b.LEVELS_UPDATED, this.onLevelsUpdated, this),
                t.on(b.FRAG_BUFFERED, this.onFragBuffered, this)
            }
            ,
            r.unregisterListeners = function() {
                e.prototype.unregisterListeners.call(this);
                var t = this.hls;
                t.off(b.MANIFEST_PARSED, this.onManifestParsed, this),
                t.off(b.LEVEL_LOADED, this.onLevelLoaded, this),
                t.off(b.FRAG_LOAD_EMERGENCY_ABORTED, this.onFragLoadEmergencyAborted, this),
                t.off(b.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this),
                t.off(b.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this),
                t.off(b.BUFFER_CREATED, this.onBufferCreated, this),
                t.off(b.BUFFER_FLUSHED, this.onBufferFlushed, this),
                t.off(b.LEVELS_UPDATED, this.onLevelsUpdated, this),
                t.off(b.FRAG_BUFFERED, this.onFragBuffered, this)
            }
            ,
            r.onHandlerDestroying = function() {
                this.onMediaPlaying = this.onMediaSeeked = null,
                this.unregisterListeners(),
                e.prototype.onHandlerDestroying.call(this)
            }
            ,
            r.startLoad = function(e, t) {
                if (this.levels) {
                    var r = this.lastCurrentTime
                      , i = this.hls;
                    if (this.stopLoad(),
                    this.setInterval(100),
                    this.level = -1,
                    !this.startFragRequested) {
                        var n = i.startLevel;
                        -1 === n && (i.config.testBandwidth && this.levels.length > 1 ? (n = 0,
                        this.bitrateTest = !0) : n = i.firstAutoLevel),
                        i.nextLoadLevel = n,
                        this.level = i.loadLevel,
                        this._hasEnoughToStart = !!t
                    }
                    r > 0 && -1 === e && !t && (this.log("Override startPosition with lastCurrentTime @" + r.toFixed(3)),
                    e = r),
                    this.state = ki.IDLE,
                    this.nextLoadPosition = this.lastCurrentTime = e + this.timelineOffset,
                    this.startPosition = t ? -1 : e,
                    this.tick()
                } else
                    this._forceStartLoad = !0,
                    this.state = ki.STOPPED
            }
            ,
            r.stopLoad = function() {
                this._forceStartLoad = !1,
                e.prototype.stopLoad.call(this)
            }
            ,
            r.doTick = function() {
                switch (this.state) {
                case ki.WAITING_LEVEL:
                    var e = this.levels
                      , t = this.level
                      , r = null == e ? void 0 : e[t]
                      , i = null == r ? void 0 : r.details;
                    if (i && (!i.live || this.levelLastLoaded === r && !this.waitForLive(r))) {
                        if (this.waitForCdnTuneIn(i))
                            break;
                        this.state = ki.IDLE;
                        break
                    }
                    if (this.hls.nextLoadLevel !== this.level) {
                        this.state = ki.IDLE;
                        break
                    }
                    break;
                case ki.FRAG_LOADING_WAITING_RETRY:
                    this.checkRetryDate()
                }
                this.state === ki.IDLE && this.doTickIdle(),
                this.onTickEnd()
            }
            ,
            r.onTickEnd = function() {
                var t;
                e.prototype.onTickEnd.call(this),
                null != (t = this.media) && t.readyState && !1 === this.media.seeking && (this.lastCurrentTime = this.media.currentTime),
                this.checkFragmentChanged()
            }
            ,
            r.doTickIdle = function() {
                var e = this.hls
                  , t = this.levelLastLoaded
                  , r = this.levels
                  , i = this.media;
                if (null !== t && (i || this.primaryPrefetch || !this.startFragRequested && e.config.startFragPrefetch) && (!this.altAudio || !this.audioOnly)) {
                    var n = this.buffering ? e.nextLoadLevel : e.loadLevel;
                    if (null != r && r[n]) {
                        var a = r[n]
                          , s = this.getMainFwdBufferInfo();
                        if (null !== s) {
                            var o = this.getLevelDetails();
                            if (o && this._streamEnded(s, o)) {
                                var l = {};
                                return 2 === this.altAudio && (l.type = "video"),
                                this.hls.trigger(b.BUFFER_EOS, l),
                                void (this.state = ki.ENDED)
                            }
                            if (this.buffering) {
                                e.loadLevel !== n && -1 === e.manualLevel && this.log("Adapting to level " + n + " from level " + this.level),
                                this.level = e.nextLoadLevel = n;
                                var u = a.details;
                                if (!u || this.state === ki.WAITING_LEVEL || this.waitForLive(a))
                                    return this.level = n,
                                    this.state = ki.WAITING_LEVEL,
                                    void (this.startFragRequested = !1);
                                var d = s.len
                                  , h = this.getMaxBufferLength(a.maxBitrate);
                                if (!(d >= h)) {
                                    this.backtrackFragment && this.backtrackFragment.start > s.end && (this.backtrackFragment = null);
                                    var f = this.backtrackFragment ? this.backtrackFragment.start : s.end
                                      , c = this.getNextFragment(f, u);
                                    if (this.couldBacktrack && !this.fragPrevious && c && te(c) && this.fragmentTracker.getState(c) !== Yt) {
                                        var g, v = (null != (g = this.backtrackFragment) ? g : c).sn - u.startSN, m = u.fragments[v - 1];
                                        m && c.cc === m.cc && (c = m,
                                        this.fragmentTracker.removeFragment(m))
                                    } else
                                        this.backtrackFragment && s.len && (this.backtrackFragment = null);
                                    if (c && this.isLoopLoading(c, f)) {
                                        if (!c.gap) {
                                            var p = this.audioOnly && !this.altAudio ? $ : Z
                                              , y = (p === Z ? this.videoBuffer : this.mediaBuffer) || this.media;
                                            y && this.afterBufferFlushed(y, p, w)
                                        }
                                        c = this.getNextFragmentLoopLoading(c, u, s, w, h)
                                    }
                                    c && (!c.initSegment || c.initSegment.data || this.bitrateTest || (c = c.initSegment),
                                    this.loadFragment(c, a, f))
                                }
                            }
                        }
                    }
                }
            }
            ,
            r.loadFragment = function(t, r, i) {
                var n = this.fragmentTracker.getState(t);
                n === Kt || n === Ht ? te(t) ? this.bitrateTest ? (this.log("Fragment " + t.sn + " of level " + t.level + " is being downloaded to test bitrate and will not be buffered"),
                this._loadBitrateTestFrag(t, r)) : e.prototype.loadFragment.call(this, t, r, i) : this._loadInitSegment(t, r) : this.clearTrackerIfNeeded(t)
            }
            ,
            r.getBufferedFrag = function(e) {
                return this.fragmentTracker.getBufferedFrag(e, w)
            }
            ,
            r.followingBufferedFrag = function(e) {
                return e ? this.getBufferedFrag(e.end + .5) : null
            }
            ,
            r.immediateLevelSwitch = function() {
                this.abortCurrentFrag(),
                this.flushMainBuffer(0, Number.POSITIVE_INFINITY)
            }
            ,
            r.nextLevelSwitch = function() {
                var e = this.levels
                  , t = this.media;
                if (null != t && t.readyState) {
                    var r, i = this.getAppendedFrag(t.currentTime);
                    i && i.start > 1 && this.flushMainBuffer(0, i.start - 1);
                    var n = this.getLevelDetails();
                    if (null != n && n.live) {
                        var a = this.getMainFwdBufferInfo();
                        if (!a || a.len < 2 * n.targetduration)
                            return
                    }
                    if (!t.paused && e) {
                        var s = e[this.hls.nextLoadLevel]
                          , o = this.fragLastKbps;
                        r = o && this.fragCurrent ? this.fragCurrent.duration * s.maxBitrate / (1e3 * o) + 1 : 0
                    } else
                        r = 0;
                    var l = this.getBufferedFrag(t.currentTime + r);
                    if (l) {
                        var u = this.followingBufferedFrag(l);
                        if (u) {
                            this.abortCurrentFrag();
                            var d = u.maxStartPTS ? u.maxStartPTS : u.start
                              , h = u.duration
                              , f = Math.max(l.end, d + Math.min(Math.max(h - this.config.maxFragLookUpTolerance, h * (this.couldBacktrack ? .5 : .125)), h * (this.couldBacktrack ? .75 : .25)));
                            this.flushMainBuffer(f, Number.POSITIVE_INFINITY)
                        }
                    }
                }
            }
            ,
            r.abortCurrentFrag = function() {
                var e = this.fragCurrent;
                switch (this.fragCurrent = null,
                this.backtrackFragment = null,
                e && (e.abortRequests(),
                this.fragmentTracker.removeFragment(e)),
                this.state) {
                case ki.KEY_LOADING:
                case ki.FRAG_LOADING:
                case ki.FRAG_LOADING_WAITING_RETRY:
                case ki.PARSING:
                case ki.PARSED:
                    this.state = ki.IDLE
                }
                this.nextLoadPosition = this.getLoadPosition()
            }
            ,
            r.flushMainBuffer = function(t, r) {
                e.prototype.flushMainBuffer.call(this, t, r, 2 === this.altAudio ? "video" : null)
            }
            ,
            r.onMediaAttached = function(t, r) {
                e.prototype.onMediaAttached.call(this, t, r);
                var i = r.media;
                Li(i, "playing", this.onMediaPlaying),
                Li(i, "seeked", this.onMediaSeeked)
            }
            ,
            r.onMediaDetaching = function(t, r) {
                var i = this.media;
                i && (Ii(i, "playing", this.onMediaPlaying),
                Ii(i, "seeked", this.onMediaSeeked)),
                this.videoBuffer = null,
                this.fragPlaying = null,
                e.prototype.onMediaDetaching.call(this, t, r),
                r.transferMedia || (this._hasEnoughToStart = !1)
            }
            ,
            r.onManifestLoading = function() {
                e.prototype.onManifestLoading.call(this),
                this.log("Trigger BUFFER_RESET"),
                this.hls.trigger(b.BUFFER_RESET, void 0),
                this.couldBacktrack = !1,
                this.fragLastKbps = 0,
                this.fragPlaying = this.backtrackFragment = null,
                this.altAudio = 0,
                this.audioOnly = !1
            }
            ,
            r.onManifestParsed = function(e, t) {
                for (var r, i, n = !1, a = !1, s = 0; s < t.levels.length; s++) {
                    var o = t.levels[s].audioCodec;
                    o && (n = n || -1 !== o.indexOf("mp4a.40.2"),
                    a = a || -1 !== o.indexOf("mp4a.40.5"))
                }
                this.audioCodecSwitch = n && a && !("function" == typeof (null == (i = kl()) || null == (r = i.prototype) ? void 0 : r.changeType)),
                this.audioCodecSwitch && this.log("Both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),
                this.levels = t.levels,
                this.startFragRequested = !1
            }
            ,
            r.onLevelLoading = function(e, t) {
                if (this.levels && this.state === ki.IDLE) {
                    var r = t.levelInfo;
                    (!r.details || r.details.live && (this.levelLastLoaded !== r || r.details.expired) || this.waitForCdnTuneIn(r.details)) && (this.state = ki.WAITING_LEVEL)
                }
            }
            ,
            r.onLevelLoaded = function(e, t) {
                var r, i = this.levels, n = this.startFragRequested, a = t.level, s = t.details, o = s.totalduration;
                if (i) {
                    this.log("Level " + a + " loaded [" + s.startSN + "," + s.endSN + "]" + (s.lastPartSn ? "[part-" + s.lastPartSn + "-" + s.lastPartIndex + "]" : "") + ", cc [" + s.startCC + ", " + s.endCC + "] duration:" + o);
                    var l = t.levelInfo
                      , u = this.fragCurrent;
                    !u || this.state !== ki.FRAG_LOADING && this.state !== ki.FRAG_LOADING_WAITING_RETRY || u.level !== t.level && u.loader && this.abortCurrentFrag();
                    var d = 0;
                    if (s.live || null != (r = l.details) && r.live) {
                        var h;
                        if (this.checkLiveUpdate(s),
                        s.deltaUpdateFailed)
                            return;
                        d = this.alignPlaylists(s, l.details, null == (h = this.levelLastLoaded) ? void 0 : h.details)
                    }
                    if (l.details = s,
                    this.levelLastLoaded = l,
                    n || this.setStartPosition(s, d),
                    this.hls.trigger(b.LEVEL_UPDATED, {
                        details: s,
                        level: a
                    }),
                    this.state === ki.WAITING_LEVEL) {
                        if (this.waitForCdnTuneIn(s))
                            return;
                        this.state = ki.IDLE
                    }
                    n && s.live && this.synchronizeToLiveEdge(s),
                    this.tick()
                } else
                    this.warn("Levels were reset while loading level " + a)
            }
            ,
            r.synchronizeToLiveEdge = function(e) {
                var t = this.config
                  , r = this.media;
                if (r) {
                    var i = this.hls.liveSyncPosition
                      , n = this.getLoadPosition()
                      , a = e.fragmentStart
                      , s = e.edge
                      , o = n >= a - t.maxFragLookUpTolerance && n <= s;
                    if (null !== i && r.duration > i && (n < i || !o)) {
                        var l = void 0 !== t.liveMaxLatencyDuration ? t.liveMaxLatencyDuration : t.liveMaxLatencyDurationCount * e.targetduration;
                        if ((!o && r.readyState < 4 || n < s - l) && (this._hasEnoughToStart || (this.nextLoadPosition = i),
                        r.readyState))
                            if (this.warn("Playback: " + n.toFixed(3) + " is located too far from the end of live sliding playlist: " + s + ", reset currentTime to : " + i.toFixed(3)),
                            "buffered" === this.config.liveSyncMode) {
                                var u, d = ur.bufferInfo(r, i, 0);
                                if (null == (u = d.buffered) || !u.length)
                                    return void (r.currentTime = i);
                                if (d.start <= n)
                                    return void (r.currentTime = i);
                                var h = ur.bufferedInfo(d.buffered, n, 0).nextStart;
                                h && (r.currentTime = h)
                            } else
                                r.currentTime = i
                    }
                }
            }
            ,
            r._handleFragmentLoadProgress = function(e) {
                var t, r = e.frag, i = e.part, n = e.payload, a = this.levels;
                if (a) {
                    var s = a[r.level];
                    if (s) {
                        var o = s.details;
                        if (!o)
                            return this.warn("Dropping fragment " + r.sn + " of level " + r.level + " after level details were reset"),
                            void this.fragmentTracker.removeFragment(r);
                        var l = s.videoCodec
                          , u = o.PTSKnown || !o.live
                          , d = null == (t = r.initSegment) ? void 0 : t.data
                          , h = this._getAudioCodec(s)
                          , f = this.transmuxer = this.transmuxer || new fa(this.hls,w,this._handleTransmuxComplete.bind(this),this._handleTransmuxerFlush.bind(this))
                          , c = i ? i.index : -1
                          , g = -1 !== c
                          , v = new or(r.level,r.sn,r.stats.chunkCount,n.byteLength,c,g)
                          , m = this.initPTS[r.cc];
                        f.push(n, d, h, l, r, i, o.totalduration, u, v, m)
                    } else
                        this.warn("Level " + r.level + " not found on progress")
                } else
                    this.warn("Levels were reset while fragment load was in progress. Fragment " + r.sn + " of level " + r.level + " will not be buffered")
            }
            ,
            r.onAudioTrackSwitching = function(e, t) {
                var r = this
                  , i = this.hls
                  , n = 2 === this.altAudio;
                if (mt(t.url, i))
                    this.altAudio = 1;
                else {
                    if (this.mediaBuffer !== this.media) {
                        this.log("Switching on main audio, use media.buffered to schedule main fragment loading"),
                        this.mediaBuffer = this.media;
                        var a = this.fragCurrent;
                        a && (this.log("Switching to main audio track, cancel main fragment load"),
                        a.abortRequests(),
                        this.fragmentTracker.removeFragment(a)),
                        this.resetTransmuxer(),
                        this.resetLoadingState()
                    } else
                        this.audioOnly && this.resetTransmuxer();
                    if (n)
                        return this.fragmentTracker.removeAllFragments(),
                        i.once(b.BUFFER_FLUSHED, (function() {
                            r.hls && r.hls.trigger(b.AUDIO_TRACK_SWITCHED, t)
                        }
                        )),
                        void i.trigger(b.BUFFER_FLUSHING, {
                            startOffset: 0,
                            endOffset: Number.POSITIVE_INFINITY,
                            type: null
                        });
                    i.trigger(b.AUDIO_TRACK_SWITCHED, t)
                }
            }
            ,
            r.onAudioTrackSwitched = function(e, t) {
                var r = mt(t.url, this.hls);
                if (r) {
                    var i = this.videoBuffer;
                    i && this.mediaBuffer !== i && (this.log("Switching on alternate audio, use video.buffered to schedule main fragment loading"),
                    this.mediaBuffer = i)
                }
                this.altAudio = r ? 2 : 0,
                this.tick()
            }
            ,
            r.onBufferCreated = function(e, t) {
                var r, i, n = t.tracks, a = !1;
                for (var s in n) {
                    var o = n[s];
                    if ("main" === o.id) {
                        if (i = s,
                        r = o,
                        "video" === s) {
                            var l = n[s];
                            l && (this.videoBuffer = l.buffer)
                        }
                    } else
                        a = !0
                }
                a && r ? (this.log("Alternate track found, use " + i + ".buffered to schedule main fragment loading"),
                this.mediaBuffer = r.buffer) : this.mediaBuffer = this.media
            }
            ,
            r.onFragBuffered = function(e, t) {
                var r = t.frag
                  , i = t.part
                  , n = r.type === w;
                if (n) {
                    if (this.fragContextChanged(r))
                        return this.warn("Fragment " + r.sn + (i ? " p: " + i.index : "") + " of level " + r.level + " finished buffering, but was aborted. state: " + this.state),
                        void (this.state === ki.PARSED && (this.state = ki.IDLE));
                    var a = i ? i.stats : r.stats;
                    this.fragLastKbps = Math.round(8 * a.total / (a.buffering.end - a.loading.first)),
                    te(r) && (this.fragPrevious = r),
                    this.fragBufferedComplete(r, i)
                }
                var s = this.media;
                s && (!this._hasEnoughToStart && ur.getBuffered(s).length && (this._hasEnoughToStart = !0,
                this.seekToStartPos()),
                n && this.tick())
            }
            ,
            r.onError = function(e, t) {
                var r;
                if (t.fatal)
                    this.state = ki.ERROR;
                else
                    switch (t.details) {
                    case k.FRAG_GAP:
                    case k.FRAG_PARSING_ERROR:
                    case k.FRAG_DECRYPT_ERROR:
                    case k.FRAG_LOAD_ERROR:
                    case k.FRAG_LOAD_TIMEOUT:
                    case k.KEY_LOAD_ERROR:
                    case k.KEY_LOAD_TIMEOUT:
                        this.onFragmentOrKeyLoadError(w, t);
                        break;
                    case k.LEVEL_LOAD_ERROR:
                    case k.LEVEL_LOAD_TIMEOUT:
                    case k.LEVEL_PARSING_ERROR:
                        t.levelRetry || this.state !== ki.WAITING_LEVEL || (null == (r = t.context) ? void 0 : r.type) !== _ || (this.state = ki.IDLE);
                        break;
                    case k.BUFFER_ADD_CODEC_ERROR:
                    case k.BUFFER_APPEND_ERROR:
                        if ("main" !== t.parent)
                            return;
                        this.reduceLengthAndFlushBuffer(t) && this.resetLoadingState();
                        break;
                    case k.BUFFER_FULL_ERROR:
                        if ("main" !== t.parent)
                            return;
                        this.reduceLengthAndFlushBuffer(t) && (!this.config.interstitialsController && this.config.assetPlayerId ? this._hasEnoughToStart = !0 : this.flushMainBuffer(0, Number.POSITIVE_INFINITY));
                        break;
                    case k.INTERNAL_EXCEPTION:
                        this.recoverWorkerError(t)
                    }
            }
            ,
            r.onFragLoadEmergencyAborted = function() {
                this.state = ki.IDLE,
                this._hasEnoughToStart || (this.startFragRequested = !1,
                this.nextLoadPosition = this.lastCurrentTime),
                this.tickImmediate()
            }
            ,
            r.onBufferFlushed = function(e, t) {
                var r = t.type;
                if (r !== $ || !this.altAudio) {
                    var i = (r === Z ? this.videoBuffer : this.mediaBuffer) || this.media;
                    i && (this.afterBufferFlushed(i, r, w),
                    this.tick())
                }
            }
            ,
            r.onLevelsUpdated = function(e, t) {
                this.level > -1 && this.fragCurrent && (this.level = this.fragCurrent.level,
                -1 === this.level && this.resetWhenMissingContext(this.fragCurrent)),
                this.levels = t.levels
            }
            ,
            r.swapAudioCodec = function() {
                this.audioCodecSwap = !this.audioCodecSwap
            }
            ,
            r.seekToStartPos = function() {
                var e = this.media;
                if (e) {
                    var t = e.currentTime
                      , r = this.startPosition;
                    if (r >= 0 && t < r) {
                        if (e.seeking)
                            return void this.log("could not seek to " + r + ", already seeking at " + t);
                        var i = this.timelineOffset;
                        i && r && (r += i);
                        var n = this.getLevelDetails()
                          , a = ur.getBuffered(e)
                          , s = a.length ? a.start(0) : 0
                          , o = s - r
                          , l = Math.max(this.config.maxBufferHole, this.config.maxFragLookUpTolerance);
                        (this.config.startOnSegmentBoundary || o > 0 && (o < l || this.loadingParts && o < 2 * ((null == n ? void 0 : n.partTarget) || 0))) && (this.log("adjusting start position by " + o + " to match buffer start"),
                        r += o,
                        this.startPosition = r),
                        t < r && (this.log("seek to target start position " + r + " from current time " + t + " buffer start " + s),
                        e.currentTime = r)
                    }
                }
            }
            ,
            r._getAudioCodec = function(e) {
                var t = this.config.defaultAudioCodec || e.audioCodec;
                return this.audioCodecSwap && t && (this.log("Swapping audio codec"),
                t = -1 !== t.indexOf("mp4a.40.5") ? "mp4a.40.2" : "mp4a.40.5"),
                t
            }
            ,
            r._loadBitrateTestFrag = function(e, t) {
                var r = this;
                e.bitrateTest = !0,
                this._doFragLoad(e, t).then((function(e) {
                    var i = r.hls
                      , n = null == e ? void 0 : e.frag;
                    if (n && !r.fragContextChanged(n)) {
                        t.fragmentError = 0,
                        r.state = ki.IDLE,
                        r.startFragRequested = !1,
                        r.bitrateTest = !1;
                        var a = n.stats;
                        a.parsing.start = a.parsing.end = a.buffering.start = a.buffering.end = self.performance.now(),
                        i.trigger(b.FRAG_LOADED, e),
                        n.bitrateTest = !1
                    }
                }
                )).catch((function(t) {
                    r.state !== ki.STOPPED && r.state !== ki.ERROR && (r.warn(t),
                    r.resetFragmentLoading(e))
                }
                ))
            }
            ,
            r._handleTransmuxComplete = function(e) {
                var t = this.playlistType
                  , r = this.hls
                  , i = e.remuxResult
                  , n = e.chunkMeta
                  , a = this.getCurrentContext(n);
                if (a) {
                    var s = a.frag
                      , o = a.part
                      , l = a.level
                      , u = i.video
                      , d = i.text
                      , h = i.id3
                      , f = i.initSegment
                      , c = l.details
                      , g = this.altAudio ? void 0 : i.audio;
                    if (this.fragContextChanged(s))
                        this.fragmentTracker.removeFragment(s);
                    else {
                        if (this.state = ki.PARSING,
                        f) {
                            var v = f.tracks;
                            if (v) {
                                var m = s.initSegment || s;
                                if (this.unhandledEncryptionError(f, s))
                                    return;
                                this._bufferInitSegment(l, v, m, n),
                                r.trigger(b.FRAG_PARSING_INIT_SEGMENT, {
                                    frag: m,
                                    id: t,
                                    tracks: v
                                })
                            }
                            var p = f.initPTS
                              , y = f.timescale
                              , E = this.initPTS[s.cc];
                            if (A(p) && (!E || E.baseTime !== p || E.timescale !== y)) {
                                var T = f.trackId;
                                this.initPTS[s.cc] = {
                                    baseTime: p,
                                    timescale: y,
                                    trackId: T
                                },
                                r.trigger(b.INIT_PTS_FOUND, {
                                    frag: s,
                                    id: t,
                                    initPTS: p,
                                    timescale: y,
                                    trackId: T
                                })
                            }
                        }
                        if (u && c) {
                            g && "audiovideo" === u.type && this.logMuxedErr(s);
                            var S = c.fragments[s.sn - 1 - c.startSN]
                              , L = s.sn === c.startSN
                              , I = !S || s.cc > S.cc;
                            if (!1 !== i.independent) {
                                var R = u.startPTS
                                  , k = u.endPTS
                                  , D = u.startDTS
                                  , _ = u.endDTS;
                                if (o)
                                    o.elementaryStreams[u.type] = {
                                        startPTS: R,
                                        endPTS: k,
                                        startDTS: D,
                                        endDTS: _
                                    };
                                else if (u.firstKeyFrame && u.independent && 1 === n.id && !I && (this.couldBacktrack = !0),
                                u.dropped && u.independent) {
                                    var P = this.getMainFwdBufferInfo()
                                      , C = (P ? P.end : this.getLoadPosition()) + this.config.maxBufferHole
                                      , w = u.firstKeyFramePTS ? u.firstKeyFramePTS : R;
                                    if (!L && C < w - this.config.maxBufferHole && !I)
                                        return void this.backtrack(s);
                                    I && (s.gap = !0),
                                    s.setElementaryStreamInfo(u.type, s.start, k, s.start, _, !0)
                                } else
                                    L && R - (c.appliedTimelineOffset || 0) > 2 && (s.gap = !0);
                                s.setElementaryStreamInfo(u.type, R, k, D, _),
                                this.backtrackFragment && (this.backtrackFragment = s),
                                this.bufferFragmentData(u, s, o, n, L || I)
                            } else {
                                if (!L && !I)
                                    return void this.backtrack(s);
                                s.gap = !0
                            }
                        }
                        if (g) {
                            var O = g.startPTS
                              , x = g.endPTS
                              , M = g.startDTS
                              , F = g.endDTS;
                            o && (o.elementaryStreams[$] = {
                                startPTS: O,
                                endPTS: x,
                                startDTS: M,
                                endDTS: F
                            }),
                            s.setElementaryStreamInfo($, O, x, M, F),
                            this.bufferFragmentData(g, s, o, n)
                        }
                        if (c && null != h && h.samples.length) {
                            var N = {
                                id: t,
                                frag: s,
                                details: c,
                                samples: h.samples
                            };
                            r.trigger(b.FRAG_PARSING_METADATA, N)
                        }
                        if (c && d) {
                            var U = {
                                id: t,
                                frag: s,
                                details: c,
                                samples: d.samples
                            };
                            r.trigger(b.FRAG_PARSING_USERDATA, U)
                        }
                    }
                } else
                    this.resetWhenMissingContext(n)
            }
            ,
            r.logMuxedErr = function(e) {
                this.warn((te(e) ? "Media" : "Init") + " segment with muxed audiovideo where only video expected: " + e.url)
            }
            ,
            r._bufferInitSegment = function(e, t, r, i) {
                var n = this;
                if (this.state === ki.PARSING) {
                    this.audioOnly = !!t.audio && !t.video,
                    this.altAudio && !this.audioOnly && (delete t.audio,
                    t.audiovideo && this.logMuxedErr(r));
                    var a = t.audio
                      , s = t.video
                      , o = t.audiovideo;
                    if (a) {
                        var l = e.audioCodec
                          , u = Ke(a.codec, l);
                        "mp4a" === u && (u = "mp4a.40.5");
                        var d = navigator.userAgent.toLowerCase();
                        if (this.audioCodecSwitch) {
                            u && (u = -1 !== u.indexOf("mp4a.40.5") ? "mp4a.40.2" : "mp4a.40.5");
                            var h = a.metadata;
                            h && "channelCount"in h && 1 !== (h.channelCount || 1) && -1 === d.indexOf("firefox") && (u = "mp4a.40.5")
                        }
                        u && -1 !== u.indexOf("mp4a.40.5") && -1 !== d.indexOf("android") && "audio/mpeg" !== a.container && (u = "mp4a.40.2",
                        this.log("Android: force audio codec to " + u)),
                        l && l !== u && this.log('Swapping manifest audio codec "' + l + '" for "' + u + '"'),
                        a.levelCodec = u,
                        a.id = w,
                        this.log("Init audio buffer, container:" + a.container + ", codecs[selected/level/parsed]=[" + (u || "") + "/" + (l || "") + "/" + a.codec + "]"),
                        delete t.audiovideo
                    }
                    if (s) {
                        s.levelCodec = e.videoCodec,
                        s.id = w;
                        var f = s.codec;
                        if (4 === (null == f ? void 0 : f.length))
                            switch (f) {
                            case "hvc1":
                            case "hev1":
                                s.codec = "hvc1.1.6.L120.90";
                                break;
                            case "av01":
                                s.codec = "av01.0.04M.08";
                                break;
                            case "avc1":
                                s.codec = "avc1.42e01e"
                            }
                        this.log("Init video buffer, container:" + s.container + ", codecs[level/parsed]=[" + (e.videoCodec || "") + "/" + f + "]" + (s.codec !== f ? " parsed-corrected=" + s.codec : "") + (s.supplemental ? " supplemental=" + s.supplemental : "")),
                        delete t.audiovideo
                    }
                    o && (this.log("Init audiovideo buffer, container:" + o.container + ", codecs[level/parsed]=[" + e.codecs + "/" + o.codec + "]"),
                    delete t.video,
                    delete t.audio);
                    var c = Object.keys(t);
                    if (c.length) {
                        if (this.hls.trigger(b.BUFFER_CODECS, t),
                        !this.hls)
                            return;
                        c.forEach((function(e) {
                            var a = t[e].initSegment;
                            null != a && a.byteLength && n.hls.trigger(b.BUFFER_APPENDING, {
                                type: e,
                                data: a,
                                frag: r,
                                part: null,
                                chunkMeta: i,
                                parent: r.type
                            })
                        }
                        ))
                    }
                    this.tickImmediate()
                }
            }
            ,
            r.getMainFwdBufferInfo = function() {
                var e = this.mediaBuffer && 2 === this.altAudio ? this.mediaBuffer : this.media;
                return this.getFwdBufferInfo(e, w)
            }
            ,
            r.backtrack = function(e) {
                this.couldBacktrack = !0,
                this.backtrackFragment = e,
                this.resetTransmuxer(),
                this.flushBufferGap(e),
                this.fragmentTracker.removeFragment(e),
                this.fragPrevious = null,
                this.nextLoadPosition = e.start,
                this.state = ki.IDLE
            }
            ,
            r.checkFragmentChanged = function() {
                var e = this.media
                  , t = null;
                if (e && e.readyState > 1 && !1 === e.seeking) {
                    var r = e.currentTime;
                    if (ur.isBuffered(e, r) ? t = this.getAppendedFrag(r) : ur.isBuffered(e, r + .1) && (t = this.getAppendedFrag(r + .1)),
                    t) {
                        this.backtrackFragment = null;
                        var i = this.fragPlaying
                          , n = t.level;
                        i && t.sn === i.sn && i.level === n || (this.fragPlaying = t,
                        this.hls.trigger(b.FRAG_CHANGED, {
                            frag: t
                        }),
                        i && i.level === n || this.hls.trigger(b.LEVEL_SWITCHED, {
                            level: n
                        }))
                    }
                }
            }
            ,
            i(t, [{
                key: "hasEnoughToStart",
                get: function() {
                    return this._hasEnoughToStart
                }
            }, {
                key: "maxBufferLength",
                get: function() {
                    var e = this.levels
                      , t = this.level
                      , r = null == e ? void 0 : e[t];
                    return r ? this.getMaxBufferLength(r.maxBitrate) : this.config.maxBufferLength
                }
            }, {
                key: "nextLevel",
                get: function() {
                    var e = this.nextBufferedFrag;
                    return e ? e.level : -1
                }
            }, {
                key: "currentFrag",
                get: function() {
                    var e;
                    if (this.fragPlaying)
                        return this.fragPlaying;
                    var t = (null == (e = this.media) ? void 0 : e.currentTime) || this.lastCurrentTime;
                    return A(t) ? this.getAppendedFrag(t) : null
                }
            }, {
                key: "currentProgramDateTime",
                get: function() {
                    var e, t = (null == (e = this.media) ? void 0 : e.currentTime) || this.lastCurrentTime;
                    if (A(t)) {
                        var r = this.getLevelDetails()
                          , i = this.currentFrag || (r ? Et(null, r.fragments, t) : null);
                        if (i) {
                            var n = i.programDateTime;
                            if (null !== n) {
                                var a = n + 1e3 * (t - i.start);
                                return new Date(a)
                            }
                        }
                    }
                    return null
                }
            }, {
                key: "currentLevel",
                get: function() {
                    var e = this.currentFrag;
                    return e ? e.level : -1
                }
            }, {
                key: "nextBufferedFrag",
                get: function() {
                    var e = this.currentFrag;
                    return e ? this.followingBufferedFrag(e) : null
                }
            }, {
                key: "forceStartLoad",
                get: function() {
                    return this._forceStartLoad
                }
            }])
        }(bi)
          , _l = function(e) {
            function t(t, r) {
                var i;
                return (i = e.call(this, "key-loader", r) || this).config = void 0,
                i.keyIdToKeyInfo = {},
                i.emeController = null,
                i.config = t,
                i
            }
            o(t, e);
            var r = t.prototype;
            return r.abort = function(e) {
                for (var t in this.keyIdToKeyInfo) {
                    var r = this.keyIdToKeyInfo[t].loader;
                    if (r) {
                        var i;
                        if (e && e !== (null == (i = r.context) ? void 0 : i.frag.type))
                            return;
                        r.abort()
                    }
                }
            }
            ,
            r.detach = function() {
                for (var e in this.keyIdToKeyInfo) {
                    var t = this.keyIdToKeyInfo[e];
                    (t.mediaKeySessionContext || t.decryptdata.isCommonEncryption) && delete this.keyIdToKeyInfo[e]
                }
            }
            ,
            r.destroy = function() {
                for (var e in this.detach(),
                this.keyIdToKeyInfo) {
                    var t = this.keyIdToKeyInfo[e].loader;
                    t && t.destroy()
                }
                this.keyIdToKeyInfo = {}
            }
            ,
            r.createKeyLoadError = function(e, t, r, i, n) {
                return void 0 === t && (t = k.KEY_LOAD_ERROR),
                new ar({
                    type: R.NETWORK_ERROR,
                    details: t,
                    fatal: !1,
                    frag: e,
                    response: n,
                    error: r,
                    networkDetails: i
                })
            }
            ,
            r.loadClear = function(e, t, r) {
                var i = this;
                if (this.emeController && this.config.emeEnabled && !this.emeController.getSelectedKeySystemFormats().length) {
                    if (t.length)
                        for (var n, a = function() {
                            var n = t[s];
                            if (e.cc <= n.cc && (!te(e) || !te(n) || e.sn < n.sn) || !r && s == o - 1)
                                return {
                                    v: i.emeController.selectKeySystemFormat(n).then((function(e) {
                                        if (i.emeController) {
                                            n.setKeyFormat(e);
                                            var t = Mr(e);
                                            return t ? i.emeController.getKeySystemAccess([t]) : void 0
                                        }
                                    }
                                    ))
                                }
                        }, s = 0, o = t.length; s < o; s++)
                            if (n = a())
                                return n.v;
                    if (this.config.requireKeySystemAccessOnStart) {
                        var l = Nr(this.config);
                        if (l.length)
                            return this.emeController.getKeySystemAccess(l)
                    }
                }
                return null
            }
            ,
            r.load = function(e) {
                var t = this;
                return !e.decryptdata && e.encrypted && this.emeController && this.config.emeEnabled ? this.emeController.selectKeySystemFormat(e).then((function(r) {
                    return t.loadInternal(e, r)
                }
                )) : this.loadInternal(e)
            }
            ,
            r.loadInternal = function(e, t) {
                var r, i;
                t && e.setKeyFormat(t);
                var n = e.decryptdata;
                if (!n) {
                    var a = new Error(t ? "Expected frag.decryptdata to be defined after setting format " + t : "Missing decryption data on fragment in onKeyLoading (emeEnabled with controller: " + (this.emeController && this.config.emeEnabled) + ")");
                    return Promise.reject(this.createKeyLoadError(e, k.KEY_LOAD_ERROR, a))
                }
                var s = n.uri;
                if (!s)
                    return Promise.reject(this.createKeyLoadError(e, k.KEY_LOAD_ERROR, new Error('Invalid key URI: "' + s + '"')));
                var o = Pl(n)
                  , l = this.keyIdToKeyInfo[o];
                if (null != (r = l) && r.decryptdata.key)
                    return n.key = l.decryptdata.key,
                    Promise.resolve({
                        frag: e,
                        keyInfo: l
                    });
                if (this.emeController && null != (i = l) && i.keyLoadPromise)
                    switch (this.emeController.getKeyStatus(l.decryptdata)) {
                    case "usable":
                    case "usable-in-future":
                        return l.keyLoadPromise.then((function(t) {
                            var r = t.keyInfo;
                            return n.key = r.decryptdata.key,
                            {
                                frag: e,
                                keyInfo: r
                            }
                        }
                        ))
                    }
                switch (this.log((this.keyIdToKeyInfo[o] ? "Rel" : "L") + "oading" + (n.keyId ? " keyId: " + X(n.keyId) : "") + " URI: " + n.uri + " from " + e.type + " " + e.level),
                l = this.keyIdToKeyInfo[o] = {
                    decryptdata: n,
                    keyLoadPromise: null,
                    loader: null,
                    mediaKeySessionContext: null
                },
                n.method) {
                case "SAMPLE-AES":
                case "SAMPLE-AES-CENC":
                case "SAMPLE-AES-CTR":
                    return "identity" === n.keyFormat ? this.loadKeyHTTP(l, e) : this.loadKeyEME(l, e);
                case "AES-128":
                case "AES-256":
                case "AES-256-CTR":
                    return this.loadKeyHTTP(l, e);
                default:
                    return Promise.reject(this.createKeyLoadError(e, k.KEY_LOAD_ERROR, new Error('Key supplied with unsupported METHOD: "' + n.method + '"')))
                }
            }
            ,
            r.loadKeyEME = function(e, t) {
                var r = {
                    frag: t,
                    keyInfo: e
                };
                if (this.emeController && this.config.emeEnabled) {
                    var i = this.emeController.loadKey(r);
                    return (e.keyLoadPromise = i.then((function(t) {
                        return e.mediaKeySessionContext = t,
                        r
                    }
                    ))).catch((function(r) {
                        throw e.keyLoadPromise = null,
                        "data"in r && (r.data.frag = t),
                        r
                    }
                    ))
                }
                return Promise.resolve(r)
            }
            ,
            r.loadKeyHTTP = function(e, t) {
                var r = this
                  , i = this.config
                  , n = new (0,
                i.loader)(i);
                return t.keyLoader = e.loader = n,
                e.keyLoadPromise = new Promise((function(a, s) {
                    var o = {
                        keyInfo: e,
                        frag: t,
                        responseType: "arraybuffer",
                        url: e.decryptdata.uri
                    }
                      , l = i.keyLoadPolicy.default
                      , u = {
                        loadPolicy: l,
                        timeout: l.maxLoadTimeMs,
                        maxRetry: 0,
                        retryDelay: 0,
                        maxRetryDelay: 0
                    }
                      , h = {
                        onSuccess: function(e, t, i, n) {
                            var o = i.frag
                              , l = i.keyInfo
                              , u = Pl(l.decryptdata);
                            if (!o.decryptdata || l !== r.keyIdToKeyInfo[u])
                                return s(r.createKeyLoadError(o, k.KEY_LOAD_ERROR, new Error("after key load, decryptdata unset or changed"), n));
                            l.decryptdata.key = o.decryptdata.key = new Uint8Array(e.data),
                            o.keyLoader = null,
                            l.loader = null,
                            a({
                                frag: o,
                                keyInfo: l
                            })
                        },
                        onError: function(e, i, n, a) {
                            r.resetLoader(i),
                            s(r.createKeyLoadError(t, k.KEY_LOAD_ERROR, new Error("HTTP Error " + e.code + " loading key " + e.text), n, d({
                                url: o.url,
                                data: void 0
                            }, e)))
                        },
                        onTimeout: function(e, i, n) {
                            r.resetLoader(i),
                            s(r.createKeyLoadError(t, k.KEY_LOAD_TIMEOUT, new Error("key loading timed out"), n))
                        },
                        onAbort: function(e, i, n) {
                            r.resetLoader(i),
                            s(r.createKeyLoadError(t, k.INTERNAL_ABORTED, new Error("key loading aborted"), n))
                        }
                    };
                    n.load(o, u, h)
                }
                ))
            }
            ,
            r.resetLoader = function(e) {
                var t = e.frag
                  , r = e.keyInfo
                  , i = e.url
                  , n = r.loader;
                t.keyLoader === n && (t.keyLoader = null,
                r.loader = null);
                var a = Pl(r.decryptdata) || i;
                delete this.keyIdToKeyInfo[a],
                n && n.destroy()
            }
            ,
            t
        }(N);
        function Pl(e) {
            if (e.keyFormat !== wr) {
                var t = e.keyId;
                if (t)
                    return X(t)
            }
            return e.uri
        }
        function Cl(e) {
            switch (e.type) {
            case P:
                return O;
            case C:
                return x;
            default:
                return w
            }
        }
        function wl(e, t) {
            var r = e.url;
            return void 0 !== r && 0 !== r.indexOf("data:") || (r = t.url),
            r
        }
        var Ol = function() {
            function e(e) {
                this.hls = void 0,
                this.loaders = Object.create(null),
                this.variableList = null,
                this.onManifestLoaded = this.checkAutostartLoad,
                this.hls = e,
                this.registerListeners()
            }
            var t = e.prototype;
            return t.startLoad = function(e) {}
            ,
            t.stopLoad = function() {
                this.destroyInternalLoaders()
            }
            ,
            t.registerListeners = function() {
                var e = this.hls;
                e.on(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.on(b.LEVEL_LOADING, this.onLevelLoading, this),
                e.on(b.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this),
                e.on(b.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this),
                e.on(b.LEVELS_UPDATED, this.onLevelsUpdated, this)
            }
            ,
            t.unregisterListeners = function() {
                var e = this.hls;
                e.off(b.MANIFEST_LOADING, this.onManifestLoading, this),
                e.off(b.LEVEL_LOADING, this.onLevelLoading, this),
                e.off(b.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this),
                e.off(b.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this),
                e.off(b.LEVELS_UPDATED, this.onLevelsUpdated, this)
            }
            ,
            t.createInternalLoader = function(e) {
                var t = this.hls.config
                  , r = t.pLoader
                  , i = t.loader
                  , n = new (r || i)(t);
                return this.loaders[e.type] = n,
                n
            }
            ,
            t.getInternalLoader = function(e) {
                return this.loaders[e.type]
            }
            ,
            t.resetInternalLoader = function(e) {
                this.loaders[e] && delete this.loaders[e]
            }
            ,
            t.destroyInternalLoaders = function() {
                for (var e in this.loaders) {
                    var t = this.loaders[e];
                    t && t.destroy(),
                    this.resetInternalLoader(e)
                }
            }
            ,
            t.destroy = function() {
                this.variableList = null,
                this.unregisterListeners(),
                this.destroyInternalLoaders()
            }
            ,
            t.onManifestLoading = function(e, t) {
                var r = t.url;
                this.variableList = null,
                this.load({
                    id: null,
                    level: 0,
                    responseType: "text",
                    type: D,
                    url: r,
                    deliveryDirectives: null,
                    levelOrTrack: null
                })
            }
            ,
            t.onLevelLoading = function(e, t) {
                var r = t.id
                  , i = t.level
                  , n = t.pathwayId
                  , a = t.url
                  , s = t.deliveryDirectives
                  , o = t.levelInfo;
                this.load({
                    id: r,
                    level: i,
                    pathwayId: n,
                    responseType: "text",
                    type: _,
                    url: a,
                    deliveryDirectives: s,
                    levelOrTrack: o
                })
            }
            ,
            t.onAudioTrackLoading = function(e, t) {
                var r = t.id
                  , i = t.groupId
                  , n = t.url
                  , a = t.deliveryDirectives
                  , s = t.track;
                this.load({
                    id: r,
                    groupId: i,
                    level: null,
                    responseType: "text",
                    type: P,
                    url: n,
                    deliveryDirectives: a,
                    levelOrTrack: s
                })
            }
            ,
            t.onSubtitleTrackLoading = function(e, t) {
                var r = t.id
                  , i = t.groupId
                  , n = t.url
                  , a = t.deliveryDirectives
                  , s = t.track;
                this.load({
                    id: r,
                    groupId: i,
                    level: null,
                    responseType: "text",
                    type: C,
                    url: n,
                    deliveryDirectives: a,
                    levelOrTrack: s
                })
            }
            ,
            t.onLevelsUpdated = function(e, t) {
                var r = this.loaders[_];
                if (r) {
                    var i = r.context;
                    i && !t.levels.some((function(e) {
                        return e === i.levelOrTrack
                    }
                    )) && (r.abort(),
                    delete this.loaders[_])
                }
            }
            ,
            t.load = function(e) {
                var t, r, i, n = this, s = this.hls.config, o = this.getInternalLoader(e);
                if (o) {
                    var l = this.hls.logger
                      , u = o.context;
                    if (u && u.levelOrTrack === e.levelOrTrack && (u.url === e.url || u.deliveryDirectives && !e.deliveryDirectives))
                        return void (u.url === e.url ? l.log("[playlist-loader]: ignore " + e.url + " ongoing request") : l.log("[playlist-loader]: ignore " + e.url + " in favor of " + u.url));
                    l.log("[playlist-loader]: aborting previous loader for type: " + e.type),
                    o.abort()
                }
                if (r = e.type === D ? s.manifestLoadPolicy.default : a({}, s.playlistLoadPolicy.default, {
                    timeoutRetry: null,
                    errorRetry: null
                }),
                o = this.createInternalLoader(e),
                A(null == (t = e.deliveryDirectives) ? void 0 : t.part) && (e.type === _ && null !== e.level ? i = this.hls.levels[e.level].details : e.type === P && null !== e.id ? i = this.hls.audioTracks[e.id].details : e.type === C && null !== e.id && (i = this.hls.subtitleTracks[e.id].details),
                i)) {
                    var d = i.partTarget
                      , h = i.targetduration;
                    if (d && h) {
                        var f = 1e3 * Math.max(3 * d, .8 * h);
                        r = a({}, r, {
                            maxTimeToFirstByteMs: Math.min(f, r.maxTimeToFirstByteMs),
                            maxLoadTimeMs: Math.min(f, r.maxTimeToFirstByteMs)
                        })
                    }
                }
                var c = r.errorRetry || r.timeoutRetry || {}
                  , g = {
                    loadPolicy: r,
                    timeout: r.maxLoadTimeMs,
                    maxRetry: c.maxNumRetry || 0,
                    retryDelay: c.retryDelayMs || 0,
                    maxRetryDelay: c.maxRetryDelayMs || 0
                }
                  , v = {
                    onSuccess: function(e, t, r, i) {
                        var a = n.getInternalLoader(r);
                        n.resetInternalLoader(r.type);
                        var s = e.data;
                        t.parsing.start = performance.now(),
                        qr.isMediaPlaylist(s) || r.type !== D ? n.handleTrackOrLevelPlaylist(e, t, r, i || null, a) : n.handleMasterPlaylist(e, t, r, i)
                    },
                    onError: function(e, t, r, i) {
                        n.handleNetworkError(t, r, !1, e, i)
                    },
                    onTimeout: function(e, t, r) {
                        n.handleNetworkError(t, r, !0, void 0, e)
                    }
                };
                o.load(e, g, v)
            }
            ,
            t.checkAutostartLoad = function() {
                if (this.hls) {
                    var e = this.hls
                      , t = e.config
                      , r = t.autoStartLoad
                      , i = t.startPosition
                      , n = e.forceStartLoad;
                    (r || n) && (this.hls.logger.log((r ? "auto" : "force") + " startLoad with configured startPosition " + i),
                    this.hls.startLoad(i))
                }
            }
            ,
            t.handleMasterPlaylist = function(e, t, r, i) {
                var n = this
                  , a = this.hls
                  , s = e.data
                  , o = wl(e, r)
                  , l = qr.parseMasterPlaylist(s, o);
                if (l.playlistParsingError)
                    return t.parsing.end = performance.now(),
                    void this.handleManifestParsingError(e, r, l.playlistParsingError, i, t);
                var u = l.contentSteering
                  , d = l.levels
                  , h = l.sessionData
                  , f = l.sessionKeys
                  , c = l.startTimeOffset
                  , g = l.variableList;
                this.variableList = g,
                d.forEach((function(e) {
                    var t = e.unknownCodecs;
                    if (t)
                        for (var r = n.hls.config.preferManagedMediaSource, i = e.audioCodec, a = e.videoCodec, s = t.length; s--; ) {
                            var o = t[s];
                            Oe(o, "audio", r) ? (e.audioCodec = i = i ? i + "," + o : o,
                            Ce.audio[i.substring(0, 4)] = 2,
                            t.splice(s, 1)) : Oe(o, "video", r) && (e.videoCodec = a = a ? a + "," + o : o,
                            Ce.video[a.substring(0, 4)] = 2,
                            t.splice(s, 1))
                        }
                }
                ));
                var v = qr.parseMasterPlaylistMedia(s, o, l)
                  , m = v.AUDIO
                  , p = void 0 === m ? [] : m
                  , y = v.SUBTITLES
                  , E = v["CLOSED-CAPTIONS"];
                p.length && (p.some((function(e) {
                    return !e.url
                }
                )) || !d[0].audioCodec || d[0].attrs.AUDIO || (this.hls.logger.log("[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one"),
                p.unshift({
                    type: "main",
                    name: "main",
                    groupId: "main",
                    default: !1,
                    autoselect: !1,
                    forced: !1,
                    id: -1,
                    attrs: new pr({}),
                    bitrate: 0,
                    url: ""
                }))),
                a.trigger(b.MANIFEST_LOADED, {
                    levels: d,
                    audioTracks: p,
                    subtitles: y,
                    captions: E,
                    contentSteering: u,
                    url: o,
                    stats: t,
                    networkDetails: i,
                    sessionData: h,
                    sessionKeys: f,
                    startTimeOffset: c,
                    variableList: g
                })
            }
            ,
            t.handleTrackOrLevelPlaylist = function(e, t, r, i, n) {
                var a = this.hls
                  , s = r.id
                  , o = r.level
                  , l = r.type
                  , u = wl(e, r)
                  , d = A(o) ? o : A(s) ? s : 0
                  , h = Cl(r)
                  , f = qr.parseLevelPlaylist(e.data, u, d, h, 0, this.variableList);
                if (l === D) {
                    var c = {
                        attrs: new pr({}),
                        bitrate: 0,
                        details: f,
                        name: "",
                        url: u
                    };
                    f.requestScheduled = t.loading.start + hi(f, 0),
                    a.trigger(b.MANIFEST_LOADED, {
                        levels: [c],
                        audioTracks: [],
                        url: u,
                        stats: t,
                        networkDetails: i,
                        sessionData: null,
                        sessionKeys: null,
                        contentSteering: null,
                        startTimeOffset: null,
                        variableList: null
                    })
                }
                t.parsing.end = performance.now(),
                r.levelDetails = f,
                this.handlePlaylistLoaded(f, e, t, r, i, n)
            }
            ,
            t.handleManifestParsingError = function(e, t, r, i, n) {
                this.hls.trigger(b.ERROR, {
                    type: R.NETWORK_ERROR,
                    details: k.MANIFEST_PARSING_ERROR,
                    fatal: t.type === D,
                    url: e.url,
                    err: r,
                    error: r,
                    reason: r.message,
                    response: e,
                    context: t,
                    networkDetails: i,
                    stats: n
                })
            }
            ,
            t.handleNetworkError = function(e, t, r, i, n) {
                void 0 === r && (r = !1);
                var a = "A network " + (r ? "timeout" : "error" + (i ? " (status " + i.code + ")" : "")) + " occurred while loading " + e.type;
                e.type === _ ? a += ": " + e.level + " id: " + e.id : e.type !== P && e.type !== C || (a += " id: " + e.id + ' group-id: "' + e.groupId + '"');
                var s = new Error(a);
                this.hls.logger.warn("[playlist-loader]: " + a);
                var o = k.UNKNOWN
                  , l = !1
                  , u = this.getInternalLoader(e);
                switch (e.type) {
                case D:
                    o = r ? k.MANIFEST_LOAD_TIMEOUT : k.MANIFEST_LOAD_ERROR,
                    l = !0;
                    break;
                case _:
                    o = r ? k.LEVEL_LOAD_TIMEOUT : k.LEVEL_LOAD_ERROR,
                    l = !1;
                    break;
                case P:
                    o = r ? k.AUDIO_TRACK_LOAD_TIMEOUT : k.AUDIO_TRACK_LOAD_ERROR,
                    l = !1;
                    break;
                case C:
                    o = r ? k.SUBTITLE_TRACK_LOAD_TIMEOUT : k.SUBTITLE_LOAD_ERROR,
                    l = !1
                }
                u && this.resetInternalLoader(e.type);
                var h = {
                    type: R.NETWORK_ERROR,
                    details: o,
                    fatal: l,
                    url: e.url,
                    loader: u,
                    context: e,
                    error: s,
                    networkDetails: t,
                    stats: n
                };
                if (i) {
                    var f = (null == t ? void 0 : t.url) || e.url;
                    h.response = d({
                        url: f,
                        data: void 0
                    }, i)
                }
                this.hls.trigger(b.ERROR, h)
            }
            ,
            t.handlePlaylistLoaded = function(e, t, r, i, n, a) {
                var s = this.hls
                  , o = i.type
                  , l = i.level
                  , u = i.levelOrTrack
                  , d = i.id
                  , h = i.groupId
                  , f = i.deliveryDirectives
                  , c = wl(t, i)
                  , g = Cl(i)
                  , v = "number" == typeof i.level && g === w ? l : void 0
                  , m = e.playlistParsingError;
                if (m) {
                    if (this.hls.logger.warn(m + " " + e.url),
                    !s.config.ignorePlaylistParsingErrors)
                        return void s.trigger(b.ERROR, {
                            type: R.NETWORK_ERROR,
                            details: k.LEVEL_PARSING_ERROR,
                            fatal: !1,
                            url: c,
                            error: m,
                            reason: m.message,
                            response: t,
                            context: i,
                            level: v,
                            parent: g,
                            networkDetails: n,
                            stats: r
                        });
                    e.playlistParsingError = null
                }
                if (e.fragments.length)
                    switch (e.live && a && (a.getCacheAge && (e.ageHeader = a.getCacheAge() || 0),
                    a.getCacheAge && !isNaN(e.ageHeader) || (e.ageHeader = 0)),
                    o) {
                    case D:
                    case _:
                        if (v)
                            if (u) {
                                if (u !== s.levels[v]) {
                                    var p = s.levels.indexOf(u);
                                    p > -1 && (v = p)
                                }
                            } else
                                v = 0;
                        s.trigger(b.LEVEL_LOADED, {
                            details: e,
                            levelInfo: u || s.levels[0],
                            level: v || 0,
                            id: d || 0,
                            stats: r,
                            networkDetails: n,
                            deliveryDirectives: f,
                            withoutMultiVariant: o === D
                        });
                        break;
                    case P:
                        s.trigger(b.AUDIO_TRACK_LOADED, {
                            details: e,
                            track: u,
                            id: d || 0,
                            groupId: h || "",
                            stats: r,
                            networkDetails: n,
                            deliveryDirectives: f
                        });
                        break;
                    case C:
                        s.trigger(b.SUBTITLE_TRACK_LOADED, {
                            details: e,
                            track: u,
                            id: d || 0,
                            groupId: h || "",
                            stats: r,
                            networkDetails: n,
                            deliveryDirectives: f
                        })
                    }
                else {
                    var y = e.playlistParsingError = new Error("No Segments found in Playlist");
                    s.trigger(b.ERROR, {
                        type: R.NETWORK_ERROR,
                        details: k.LEVEL_EMPTY_ERROR,
                        fatal: !1,
                        url: c,
                        error: y,
                        reason: y.message,
                        response: t,
                        context: i,
                        level: v,
                        parent: g,
                        networkDetails: n,
                        stats: r
                    })
                }
            }
            ,
            e
        }()
          , xl = function() {
            function e(t) {
                void 0 === t && (t = {}),
                this.config = void 0,
                this.userConfig = void 0,
                this.logger = void 0,
                this.coreComponents = void 0,
                this.networkControllers = void 0,
                this._emitter = new E,
                this._autoLevelCapping = -1,
                this._maxHdcpLevel = null,
                this.abrController = void 0,
                this.bufferController = void 0,
                this.capLevelController = void 0,
                this.latencyController = void 0,
                this.levelController = void 0,
                this.streamController = void 0,
                this.audioStreamController = void 0,
                this.subtititleStreamController = void 0,
                this.audioTrackController = void 0,
                this.subtitleTrackController = void 0,
                this.interstitialsController = void 0,
                this.gapController = void 0,
                this.emeController = void 0,
                this.cmcdController = void 0,
                this._media = null,
                this._url = null,
                this._sessionId = void 0,
                this.triggeringException = void 0,
                this.started = !1;
                var r = this.logger = H(t.debug || !1, "Hls instance", t.assetPlayerId)
                  , i = this.config = function(e, t, r) {
                    if ((t.liveSyncDurationCount || t.liveMaxLatencyDurationCount) && (t.liveSyncDuration || t.liveMaxLatencyDuration))
                        throw new Error("Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration");
                    if (void 0 !== t.liveMaxLatencyDurationCount && (void 0 === t.liveSyncDurationCount || t.liveMaxLatencyDurationCount <= t.liveSyncDurationCount))
                        throw new Error('Illegal hls.js config: "liveMaxLatencyDurationCount" must be greater than "liveSyncDurationCount"');
                    if (void 0 !== t.liveMaxLatencyDuration && (void 0 === t.liveSyncDuration || t.liveMaxLatencyDuration <= t.liveSyncDuration))
                        throw new Error('Illegal hls.js config: "liveMaxLatencyDuration" must be greater than "liveSyncDuration"');
                    var i = cl(e)
                      , n = ["TimeOut", "MaxRetry", "RetryDelay", "MaxRetryTimeout"];
                    return ["manifest", "level", "frag"].forEach((function(e) {
                        var a = ("level" === e ? "playlist" : e) + "LoadPolicy"
                          , s = void 0 === t[a]
                          , o = [];
                        n.forEach((function(r) {
                            var n = e + "Loading" + r
                              , l = t[n];
                            if (void 0 !== l && s) {
                                o.push(n);
                                var u = i[a].default;
                                switch (t[a] = {
                                    default: u
                                },
                                r) {
                                case "TimeOut":
                                    u.maxLoadTimeMs = l,
                                    u.maxTimeToFirstByteMs = l;
                                    break;
                                case "MaxRetry":
                                    u.errorRetry.maxNumRetry = l,
                                    u.timeoutRetry.maxNumRetry = l;
                                    break;
                                case "RetryDelay":
                                    u.errorRetry.retryDelayMs = l,
                                    u.timeoutRetry.retryDelayMs = l;
                                    break;
                                case "MaxRetryTimeout":
                                    u.errorRetry.maxRetryDelayMs = l,
                                    u.timeoutRetry.maxRetryDelayMs = l
                                }
                            }
                        }
                        )),
                        o.length && r.warn('hls.js config: "' + o.join('", "') + '" setting(s) are deprecated, use "' + a + '": ' + lt(t[a]))
                    }
                    )),
                    d(d({}, i), t)
                }(e.DefaultConfig, t, r);
                this.userConfig = t,
                i.progressive && gl(i, r);
                var n = i.abrController
                  , a = i.bufferController
                  , s = i.capLevelController
                  , o = i.errorController
                  , l = i.fpsController
                  , u = new o(this)
                  , h = this.abrController = new n(this)
                  , f = new Wt(this)
                  , c = i.interstitialsController
                  , g = c ? this.interstitialsController = new c(this,e) : null
                  , v = this.bufferController = new a(this,f)
                  , m = this.capLevelController = new s(this)
                  , p = new l(this)
                  , y = new Ol(this)
                  , T = i.contentSteeringController
                  , S = T ? new T(this) : null
                  , A = this.levelController = new Il(this,S)
                  , L = new Al(this)
                  , I = new _l(this.config,this.logger)
                  , R = this.streamController = new Dl(this,f,I)
                  , k = this.gapController = new vl(this,f);
                m.setStreamController(R),
                p.setStreamController(R);
                var D = [y, A, R];
                g && D.splice(1, 0, g),
                S && D.splice(1, 0, S),
                this.networkControllers = D;
                var _ = [h, v, k, m, p, L, f];
                this.audioTrackController = this.createController(i.audioTrackController, D);
                var P = i.audioStreamController;
                P && D.push(this.audioStreamController = new P(this,f,I)),
                this.subtitleTrackController = this.createController(i.subtitleTrackController, D);
                var C = i.subtitleStreamController;
                C && D.push(this.subtititleStreamController = new C(this,f,I)),
                this.createController(i.timelineController, _),
                I.emeController = this.emeController = this.createController(i.emeController, _),
                this.cmcdController = this.createController(i.cmcdController, _),
                this.latencyController = this.createController(Ll, _),
                this.coreComponents = _,
                D.push(u);
                var w = u.onErrorOut;
                "function" == typeof w && this.on(b.ERROR, w, u),
                this.on(b.MANIFEST_LOADED, y.onManifestLoaded, y)
            }
            e.isMSESupported = function() {
                return bl()
            }
            ,
            e.isSupported = function() {
                return function() {
                    if (!bl())
                        return !1;
                    var e = W();
                    return "function" == typeof (null == e ? void 0 : e.isTypeSupported) && (["avc1.42E01E,mp4a.40.2", "av01.0.01M.08", "vp09.00.50.08"].some((function(t) {
                        return e.isTypeSupported(Me(t, "video"))
                    }
                    )) || ["mp4a.40.2", "fLaC"].some((function(t) {
                        return e.isTypeSupported(Me(t, "audio"))
                    }
                    )))
                }()
            }
            ,
            e.getMediaSource = function() {
                return W()
            }
            ;
            var t = e.prototype;
            return t.createController = function(e, t) {
                if (e) {
                    var r = new e(this);
                    return t && t.push(r),
                    r
                }
                return null
            }
            ,
            t.on = function(e, t, r) {
                void 0 === r && (r = this),
                this._emitter.on(e, t, r)
            }
            ,
            t.once = function(e, t, r) {
                void 0 === r && (r = this),
                this._emitter.once(e, t, r)
            }
            ,
            t.removeAllListeners = function(e) {
                this._emitter.removeAllListeners(e)
            }
            ,
            t.off = function(e, t, r, i) {
                void 0 === r && (r = this),
                this._emitter.off(e, t, r, i)
            }
            ,
            t.listeners = function(e) {
                return this._emitter.listeners(e)
            }
            ,
            t.emit = function(e, t, r) {
                return this._emitter.emit(e, t, r)
            }
            ,
            t.trigger = function(e, t) {
                if (this.config.debug)
                    return this.emit(e, e, t);
                try {
                    return this.emit(e, e, t)
                } catch (t) {
                    if (this.logger.error("An internal error happened while handling event " + e + '. Error message: "' + t.message + '". Here is a stacktrace:', t),
                    !this.triggeringException) {
                        this.triggeringException = !0;
                        var r = e === b.ERROR;
                        this.trigger(b.ERROR, {
                            type: R.OTHER_ERROR,
                            details: k.INTERNAL_EXCEPTION,
                            fatal: r,
                            event: e,
                            error: t
                        }),
                        this.triggeringException = !1
                    }
                }
                return !1
            }
            ,
            t.listenerCount = function(e) {
                return this._emitter.listenerCount(e)
            }
            ,
            t.destroy = function() {
                this.logger.log("destroy"),
                this.trigger(b.DESTROYING, void 0),
                this.detachMedia(),
                this.removeAllListeners(),
                this._autoLevelCapping = -1,
                this._url = null,
                this.networkControllers.forEach((function(e) {
                    return e.destroy()
                }
                )),
                this.networkControllers.length = 0,
                this.coreComponents.forEach((function(e) {
                    return e.destroy()
                }
                )),
                this.coreComponents.length = 0;
                var e = this.config;
                e.xhrSetup = e.fetchSetup = void 0,
                this.userConfig = null
            }
            ,
            t.attachMedia = function(e) {
                if (!e || "media"in e && !e.media) {
                    var t = new Error("attachMedia failed: invalid argument (" + e + ")");
                    this.trigger(b.ERROR, {
                        type: R.OTHER_ERROR,
                        details: k.ATTACH_MEDIA_ERROR,
                        fatal: !0,
                        error: t
                    })
                } else {
                    this.logger.log("attachMedia"),
                    this._media && (this.logger.warn("media must be detached before attaching"),
                    this.detachMedia());
                    var r = "media"in e
                      , i = r ? e.media : e
                      , n = r ? e : {
                        media: i
                    };
                    this._media = i,
                    this.trigger(b.MEDIA_ATTACHING, n)
                }
            }
            ,
            t.detachMedia = function() {
                this.logger.log("detachMedia"),
                this.trigger(b.MEDIA_DETACHING, {}),
                this._media = null
            }
            ,
            t.transferMedia = function() {
                this._media = null;
                var e = this.bufferController.transferMedia();
                return this.trigger(b.MEDIA_DETACHING, {
                    transferMedia: e
                }),
                e
            }
            ,
            t.loadSource = function(e) {
                this.stopLoad();
                var t = this.media
                  , r = this._url
                  , i = this._url = S.buildAbsoluteURL(self.location.href, e, {
                    alwaysNormalize: !0
                });
                this._autoLevelCapping = -1,
                this._maxHdcpLevel = null,
                this.logger.log("loadSource:" + i),
                t && r && (r !== i || this.bufferController.hasSourceTypes()) && (this.detachMedia(),
                this.attachMedia(t)),
                this.trigger(b.MANIFEST_LOADING, {
                    url: e
                })
            }
            ,
            t.startLoad = function(e, t) {
                void 0 === e && (e = -1),
                this.logger.log("startLoad(" + e + (t ? ", " : "") + ")"),
                this.started = !0,
                this.resumeBuffering();
                for (var r = 0; r < this.networkControllers.length && (this.networkControllers[r].startLoad(e, t),
                this.started && this.networkControllers); r++)
                    ;
            }
            ,
            t.stopLoad = function() {
                this.logger.log("stopLoad"),
                this.started = !1;
                for (var e = 0; e < this.networkControllers.length && (this.networkControllers[e].stopLoad(),
                !this.started && this.networkControllers); e++)
                    ;
            }
            ,
            t.resumeBuffering = function() {
                this.bufferingEnabled || (this.logger.log("resume buffering"),
                this.networkControllers.forEach((function(e) {
                    e.resumeBuffering && e.resumeBuffering()
                }
                )))
            }
            ,
            t.pauseBuffering = function() {
                this.bufferingEnabled && (this.logger.log("pause buffering"),
                this.networkControllers.forEach((function(e) {
                    e.pauseBuffering && e.pauseBuffering()
                }
                )))
            }
            ,
            t.swapAudioCodec = function() {
                this.logger.log("swapAudioCodec"),
                this.streamController.swapAudioCodec()
            }
            ,
            t.recoverMediaError = function() {
                this.logger.log("recoverMediaError");
                var e = this._media
                  , t = null == e ? void 0 : e.currentTime;
                this.detachMedia(),
                e && (this.attachMedia(e),
                t && this.startLoad(t))
            }
            ,
            t.removeLevel = function(e) {
                this.levelController.removeLevel(e)
            }
            ,
            t.setAudioOption = function(e) {
                var t;
                return (null == (t = this.audioTrackController) ? void 0 : t.setAudioOption(e)) || null
            }
            ,
            t.setSubtitleOption = function(e) {
                var t;
                return (null == (t = this.subtitleTrackController) ? void 0 : t.setSubtitleOption(e)) || null
            }
            ,
            t.getMediaDecodingInfo = function(e, t) {
                return void 0 === t && (t = this.allAudioTracks),
                Qe(e, dt(t), navigator.mediaCapabilities)
            }
            ,
            i(e, [{
                key: "url",
                get: function() {
                    return this._url
                }
            }, {
                key: "hasEnoughToStart",
                get: function() {
                    return this.streamController.hasEnoughToStart
                }
            }, {
                key: "startPosition",
                get: function() {
                    return this.streamController.startPositionValue
                }
            }, {
                key: "loadingEnabled",
                get: function() {
                    return this.started
                }
            }, {
                key: "bufferingEnabled",
                get: function() {
                    return this.streamController.bufferingEnabled
                }
            }, {
                key: "inFlightFragments",
                get: function() {
                    var e, t = ((e = {})[w] = this.streamController.inFlightFrag,
                    e);
                    return this.audioStreamController && (t[O] = this.audioStreamController.inFlightFrag),
                    this.subtititleStreamController && (t[x] = this.subtititleStreamController.inFlightFrag),
                    t
                }
            }, {
                key: "sessionId",
                get: function() {
                    var e = this._sessionId;
                    return e || (e = this._sessionId = function() {
                        try {
                            return crypto.randomUUID()
                        } catch (i) {
                            try {
                                var e = URL.createObjectURL(new Blob)
                                  , t = e.toString();
                                return URL.revokeObjectURL(e),
                                t.slice(t.lastIndexOf("/") + 1)
                            } catch (e) {
                                var r = (new Date).getTime();
                                return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (function(e) {
                                    var t = (r + 16 * Math.random()) % 16 | 0;
                                    return r = Math.floor(r / 16),
                                    ("x" == e ? t : 3 & t | 8).toString(16)
                                }
                                ))
                            }
                        }
                    }()),
                    e
                }
            }, {
                key: "levels",
                get: function() {
                    var e = this.levelController.levels;
                    return e || []
                }
            }, {
                key: "latestLevelDetails",
                get: function() {
                    return this.streamController.getLevelDetails() || null
                }
            }, {
                key: "loadLevelObj",
                get: function() {
                    return this.levelController.loadLevelObj
                }
            }, {
                key: "currentLevel",
                get: function() {
                    return this.streamController.currentLevel
                },
                set: function(e) {
                    this.logger.log("set currentLevel:" + e),
                    this.levelController.manualLevel = e,
                    this.streamController.immediateLevelSwitch()
                }
            }, {
                key: "nextLevel",
                get: function() {
                    return this.streamController.nextLevel
                },
                set: function(e) {
                    this.logger.log("set nextLevel:" + e),
                    this.levelController.manualLevel = e,
                    this.streamController.nextLevelSwitch()
                }
            }, {
                key: "loadLevel",
                get: function() {
                    return this.levelController.level
                },
                set: function(e) {
                    this.logger.log("set loadLevel:" + e),
                    this.levelController.manualLevel = e
                }
            }, {
                key: "nextLoadLevel",
                get: function() {
                    return this.levelController.nextLoadLevel
                },
                set: function(e) {
                    this.levelController.nextLoadLevel = e
                }
            }, {
                key: "firstLevel",
                get: function() {
                    return Math.max(this.levelController.firstLevel, this.minAutoLevel)
                },
                set: function(e) {
                    this.logger.log("set firstLevel:" + e),
                    this.levelController.firstLevel = e
                }
            }, {
                key: "startLevel",
                get: function() {
                    var e = this.levelController.startLevel;
                    return -1 === e && this.abrController.forcedAutoLevel > -1 ? this.abrController.forcedAutoLevel : e
                },
                set: function(e) {
                    this.logger.log("set startLevel:" + e),
                    -1 !== e && (e = Math.max(e, this.minAutoLevel)),
                    this.levelController.startLevel = e
                }
            }, {
                key: "capLevelToPlayerSize",
                get: function() {
                    return this.config.capLevelToPlayerSize
                },
                set: function(e) {
                    var t = !!e;
                    t !== this.config.capLevelToPlayerSize && (t ? this.capLevelController.startCapping() : (this.capLevelController.stopCapping(),
                    this.autoLevelCapping = -1,
                    this.streamController.nextLevelSwitch()),
                    this.config.capLevelToPlayerSize = t)
                }
            }, {
                key: "autoLevelCapping",
                get: function() {
                    return this._autoLevelCapping
                },
                set: function(e) {
                    this._autoLevelCapping !== e && (this.logger.log("set autoLevelCapping:" + e),
                    this._autoLevelCapping = e,
                    this.levelController.checkMaxAutoUpdated())
                }
            }, {
                key: "bandwidthEstimate",
                get: function() {
                    var e = this.abrController.bwEstimator;
                    return e ? e.getEstimate() : NaN
                },
                set: function(e) {
                    this.abrController.resetEstimator(e)
                }
            }, {
                key: "abrEwmaDefaultEstimate",
                get: function() {
                    var e = this.abrController.bwEstimator;
                    return e ? e.defaultEstimate : NaN
                }
            }, {
                key: "ttfbEstimate",
                get: function() {
                    var e = this.abrController.bwEstimator;
                    return e ? e.getEstimateTTFB() : NaN
                }
            }, {
                key: "maxHdcpLevel",
                get: function() {
                    return this._maxHdcpLevel
                },
                set: function(e) {
                    (function(e) {
                        return Ze.indexOf(e) > -1
                    }
                    )(e) && this._maxHdcpLevel !== e && (this._maxHdcpLevel = e,
                    this.levelController.checkMaxAutoUpdated())
                }
            }, {
                key: "autoLevelEnabled",
                get: function() {
                    return -1 === this.levelController.manualLevel
                }
            }, {
                key: "manualLevel",
                get: function() {
                    return this.levelController.manualLevel
                }
            }, {
                key: "minAutoLevel",
                get: function() {
                    var e = this.levels
                      , t = this.config.minAutoBitrate;
                    if (!e)
                        return 0;
                    for (var r = e.length, i = 0; i < r; i++)
                        if (e[i].maxBitrate >= t)
                            return i;
                    return 0
                }
            }, {
                key: "maxAutoLevel",
                get: function() {
                    var e, t = this.levels, r = this.autoLevelCapping, i = this.maxHdcpLevel;
                    if (e = -1 === r && null != t && t.length ? t.length - 1 : r,
                    i)
                        for (var n = e; n--; ) {
                            var a = t[n].attrs["HDCP-LEVEL"];
                            if (a && a <= i)
                                return n
                        }
                    return e
                }
            }, {
                key: "firstAutoLevel",
                get: function() {
                    return this.abrController.firstAutoLevel
                }
            }, {
                key: "nextAutoLevel",
                get: function() {
                    return this.abrController.nextAutoLevel
                },
                set: function(e) {
                    this.abrController.nextAutoLevel = e
                }
            }, {
                key: "playingDate",
                get: function() {
                    return this.streamController.currentProgramDateTime
                }
            }, {
                key: "mainForwardBufferInfo",
                get: function() {
                    return this.streamController.getMainFwdBufferInfo()
                }
            }, {
                key: "maxBufferLength",
                get: function() {
                    return this.streamController.maxBufferLength
                }
            }, {
                key: "allAudioTracks",
                get: function() {
                    var e = this.audioTrackController;
                    return e ? e.allAudioTracks : []
                }
            }, {
                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: "allSubtitleTracks",
                get: function() {
                    var e = this.subtitleTrackController;
                    return e ? e.allSubtitleTracks : []
                }
            }, {
                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: "media",
                get: function() {
                    return this._media
                }
            }, {
                key: "subtitleDisplay",
                get: function() {
                    var e = this.subtitleTrackController;
                    return !!e && e.subtitleDisplay
                },
                set: function(e) {
                    var t = this.subtitleTrackController;
                    t && (t.subtitleDisplay = e)
                }
            }, {
                key: "lowLatencyMode",
                get: function() {
                    return this.config.lowLatencyMode
                },
                set: function(e) {
                    this.config.lowLatencyMode = e
                }
            }, {
                key: "liveSyncPosition",
                get: function() {
                    return this.latencyController.liveSyncPosition
                }
            }, {
                key: "latency",
                get: function() {
                    return this.latencyController.latency
                }
            }, {
                key: "maxLatency",
                get: function() {
                    return this.latencyController.maxLatency
                }
            }, {
                key: "targetLatency",
                get: function() {
                    return this.latencyController.targetLatency
                },
                set: function(e) {
                    this.latencyController.targetLatency = e
                }
            }, {
                key: "drift",
                get: function() {
                    return this.latencyController.drift
                }
            }, {
                key: "forceStartLoad",
                get: function() {
                    return this.streamController.forceStartLoad
                }
            }, {
                key: "pathways",
                get: function() {
                    return this.levelController.pathways
                }
            }, {
                key: "pathwayPriority",
                get: function() {
                    return this.levelController.pathwayPriority
                },
                set: function(e) {
                    this.levelController.pathwayPriority = e
                }
            }, {
                key: "bufferedToEnd",
                get: function() {
                    var e;
                    return !(null == (e = this.bufferController) || !e.bufferedToEnd)
                }
            }, {
                key: "interstitialsManager",
                get: function() {
                    var e;
                    return (null == (e = this.interstitialsController) ? void 0 : e.interstitialsManager) || null
                }
            }], [{
                key: "version",
                get: function() {
                    return ua
                }
            }, {
                key: "Events",
                get: function() {
                    return b
                }
            }, {
                key: "MetadataSchema",
                get: function() {
                    return Ji
                }
            }, {
                key: "ErrorTypes",
                get: function() {
                    return R
                }
            }, {
                key: "ErrorDetails",
                get: function() {
                    return k
                }
            }, {
                key: "DefaultConfig",
                get: function() {
                    return e.defaultConfig ? e.defaultConfig : fl
                },
                set: function(t) {
                    e.defaultConfig = t
                }
            }])
        }();
        return xl.defaultConfig = void 0,
        xl
    }
    ,
    "object" == typeof exports && "undefined" != typeof module ? module.exports = i() : "function" == typeof define && define.amd ? define(i) : (r = "undefined" != typeof globalThis ? globalThis : r || self).Hls = i()
}(!1);
//# sourceMappingURL=hls.min.js.map