2025-09-10 13:07:46 +08:00

26175 lines
1.1 MiB

!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 ? "<removed>" : 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 ? "<destroyed>" : "\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 <Challenge> 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 ? "<pre>" : e.cue.post ? "<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(/<br(?: \/)?>/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 ? ", <skip seek to start>" : "") + ")"),
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