{"version":3,"file":"VideoJS-BYV5WChK.js","sources":["../../../node_modules/reading-time-estimator/dist/reading-time-estimator.js","../../../node_modules/global/window.js","../../../node_modules/global/document.js","../../../node_modules/is-function/index.js","../../../node_modules/@videojs/xhr/lib/interceptors.js","../../../node_modules/@videojs/xhr/lib/retry.js","../../../node_modules/@videojs/xhr/lib/http-handler.js","../../../node_modules/@videojs/xhr/lib/index.js","../../../node_modules/videojs-vtt.js/lib/vtt.js","../../../node_modules/videojs-vtt.js/lib/vttcue.js","../../../node_modules/videojs-vtt.js/lib/vttregion.js","../../../node_modules/videojs-vtt.js/lib/browser-index.js","../../../node_modules/@videojs/vhs-utils/es/resolve-url.js","../../../node_modules/@videojs/vhs-utils/es/stream.js","../../../node_modules/@videojs/vhs-utils/es/decode-b64-to-uint8-array.js","../../../node_modules/m3u8-parser/dist/m3u8-parser.es.js","../../../node_modules/@videojs/vhs-utils/es/codecs.js","../../../node_modules/@videojs/vhs-utils/es/media-types.js","../../../node_modules/@videojs/vhs-utils/es/byte-helpers.js","../../../node_modules/@videojs/vhs-utils/es/media-groups.js","../../../node_modules/@xmldom/xmldom/lib/conventions.js","../../../node_modules/@xmldom/xmldom/lib/dom.js","../../../node_modules/@xmldom/xmldom/lib/entities.js","../../../node_modules/@xmldom/xmldom/lib/sax.js","../../../node_modules/@xmldom/xmldom/lib/dom-parser.js","../../../node_modules/@xmldom/xmldom/lib/index.js","../../../node_modules/mpd-parser/dist/mpd-parser.es.js","../../../node_modules/mux.js/lib/utils/numbers.js","../../../node_modules/mux.js/lib/tools/parse-sidx.js","../../../node_modules/@videojs/vhs-utils/es/id3-helpers.js","../../../node_modules/@videojs/vhs-utils/es/mp4-helpers.js","../../../node_modules/@videojs/vhs-utils/es/ebml-helpers.js","../../../node_modules/@videojs/vhs-utils/es/nal-helpers.js","../../../node_modules/@videojs/vhs-utils/es/containers.js","../../../node_modules/mux.js/lib/utils/clock.js","../../../node_modules/video.js/dist/video.es.js","../../../app/components/VideoJS.tsx"],"sourcesContent":["const i = {\n less: \"less than a minute read\",\n default: \"min read\"\n}, o = {\n less: \"moins d'une minute de lecture\",\n default: \"min de lecture\"\n}, l = {\n less: \"menos de un minuto leyendo\",\n default: \"min de lectura\"\n}, d = {\n less: \"小于一分钟\",\n default: \"分钟\"\n}, r = {\n less: \"1分未満の読み取り\",\n default: \"最小読み取り\"\n}, c = {\n less: \"weniger als eine Minute Lesezeit\",\n default: \"Min. Lesezeit\"\n}, m = {\n less: \"menos de um minuto de leitura\",\n default: \"minutos de leitura\"\n}, f = {\n less: \"bir dakikadan az okuma süresi\",\n default: \"dakika okuma süresi\"\n}, p = {\n less: \"timp de citire mai puțin de un minut\",\n default: \"min. timp de lectură\"\n}, g = {\n less: \"এক মিনিটের কম সময়ে পড়ুন\",\n default: \"সর্বনিম্ন সময়ে পড়ুন\"\n}, k = {\n less: \"menej ako minúta čítania\",\n default: \"min čítania\"\n}, h = {\n less: \"méně než minuta čtení\",\n default: \"min čtení\"\n}, b = {\n en: i,\n fr: o,\n es: l,\n cn: d,\n ja: r,\n de: c,\n \"pt-br\": m,\n tr: f,\n ro: p,\n bn: g,\n sk: k,\n cs: h\n}, w = [\n \"en\",\n \"fr\",\n \"es\",\n \"cn\",\n \"ja\",\n \"de\",\n \"pt-br\",\n \"tr\",\n \"ro\",\n \"bn\",\n \"sk\",\n \"cs\"\n], L = (e) => (e.match(/[\\w|\\d|\\s|,|.|\\u00C0-\\u024F|\\u4E00-\\u9FA5|\\u3041-\\u309F]+/giu) ?? []).flatMap((s) => s.match(/[\\u4E00-\\u9FA5]/gu) ?? s), M = (e) => L(e).reduce((t, s) => t + (s.trim().length ? s.trim().split(/\\s+/u).length : 0), 0), F = (e) => e < 1 + Number.EPSILON, j = (e, t = \"en\") => b[t][e ? \"less\" : \"default\"], z = (e, t = 300, s = \"en\") => {\n const u = M(e), n = Math.round(u / t), a = F(n);\n return {\n minutes: n,\n words: u,\n text: `${a ? \"\" : `${n} `}${j(a, s)}`\n };\n};\nexport {\n z as readingTime,\n w as supportedLanguages\n};\n","var win;\n\nif (typeof window !== \"undefined\") {\n win = window;\n} else if (typeof global !== \"undefined\") {\n win = global;\n} else if (typeof self !== \"undefined\"){\n win = self;\n} else {\n win = {};\n}\n\nmodule.exports = win;\n","var topLevel = typeof global !== 'undefined' ? global :\n typeof window !== 'undefined' ? window : {}\nvar minDoc = require('min-document');\n\nvar doccy;\n\nif (typeof document !== 'undefined') {\n doccy = document;\n} else {\n doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];\n\n if (!doccy) {\n doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;\n }\n}\n\nmodule.exports = doccy;\n","module.exports = isFunction\n\nvar toString = Object.prototype.toString\n\nfunction isFunction (fn) {\n if (!fn) {\n return false\n }\n var string = toString.call(fn)\n return string === '[object Function]' ||\n (typeof fn === 'function' && string !== '[object RegExp]') ||\n (typeof window !== 'undefined' &&\n // IE8 and below\n (fn === window.setTimeout ||\n fn === window.alert ||\n fn === window.confirm ||\n fn === window.prompt))\n};\n","\"use strict\";\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nvar InterceptorsStorage = /*#__PURE__*/function () {\n function InterceptorsStorage() {\n this.typeToInterceptorsMap_ = new Map();\n this.enabled_ = false;\n }\n\n var _proto = InterceptorsStorage.prototype;\n\n _proto.getIsEnabled = function getIsEnabled() {\n return this.enabled_;\n };\n\n _proto.enable = function enable() {\n this.enabled_ = true;\n };\n\n _proto.disable = function disable() {\n this.enabled_ = false;\n };\n\n _proto.reset = function reset() {\n this.typeToInterceptorsMap_ = new Map();\n this.enabled_ = false;\n };\n\n _proto.addInterceptor = function addInterceptor(type, interceptor) {\n if (!this.typeToInterceptorsMap_.has(type)) {\n this.typeToInterceptorsMap_.set(type, new Set());\n }\n\n var interceptorsSet = this.typeToInterceptorsMap_.get(type);\n\n if (interceptorsSet.has(interceptor)) {\n // already have this interceptor\n return false;\n }\n\n interceptorsSet.add(interceptor);\n return true;\n };\n\n _proto.removeInterceptor = function removeInterceptor(type, interceptor) {\n var interceptorsSet = this.typeToInterceptorsMap_.get(type);\n\n if (interceptorsSet && interceptorsSet.has(interceptor)) {\n interceptorsSet.delete(interceptor);\n return true;\n }\n\n return false;\n };\n\n _proto.clearInterceptorsByType = function clearInterceptorsByType(type) {\n var interceptorsSet = this.typeToInterceptorsMap_.get(type);\n\n if (!interceptorsSet) {\n return false;\n }\n\n this.typeToInterceptorsMap_.delete(type);\n this.typeToInterceptorsMap_.set(type, new Set());\n return true;\n };\n\n _proto.clear = function clear() {\n if (!this.typeToInterceptorsMap_.size) {\n return false;\n }\n\n this.typeToInterceptorsMap_ = new Map();\n return true;\n };\n\n _proto.getForType = function getForType(type) {\n return this.typeToInterceptorsMap_.get(type) || new Set();\n };\n\n _proto.execute = function execute(type, payload) {\n var interceptors = this.getForType(type);\n\n for (var _iterator = _createForOfIteratorHelperLoose(interceptors), _step; !(_step = _iterator()).done;) {\n var interceptor = _step.value;\n\n try {\n payload = interceptor(payload);\n } catch (e) {//ignore\n }\n }\n\n return payload;\n };\n\n return InterceptorsStorage;\n}();\n\nmodule.exports = InterceptorsStorage;","\"use strict\";\n\nvar RetryManager = /*#__PURE__*/function () {\n function RetryManager() {\n this.maxAttempts_ = 1;\n this.delayFactor_ = 0.1;\n this.fuzzFactor_ = 0.1;\n this.initialDelay_ = 1000;\n this.enabled_ = false;\n }\n\n var _proto = RetryManager.prototype;\n\n _proto.getIsEnabled = function getIsEnabled() {\n return this.enabled_;\n };\n\n _proto.enable = function enable() {\n this.enabled_ = true;\n };\n\n _proto.disable = function disable() {\n this.enabled_ = false;\n };\n\n _proto.reset = function reset() {\n this.maxAttempts_ = 1;\n this.delayFactor_ = 0.1;\n this.fuzzFactor_ = 0.1;\n this.initialDelay_ = 1000;\n this.enabled_ = false;\n };\n\n _proto.getMaxAttempts = function getMaxAttempts() {\n return this.maxAttempts_;\n };\n\n _proto.setMaxAttempts = function setMaxAttempts(maxAttempts) {\n this.maxAttempts_ = maxAttempts;\n };\n\n _proto.getDelayFactor = function getDelayFactor() {\n return this.delayFactor_;\n };\n\n _proto.setDelayFactor = function setDelayFactor(delayFactor) {\n this.delayFactor_ = delayFactor;\n };\n\n _proto.getFuzzFactor = function getFuzzFactor() {\n return this.fuzzFactor_;\n };\n\n _proto.setFuzzFactor = function setFuzzFactor(fuzzFactor) {\n this.fuzzFactor_ = fuzzFactor;\n };\n\n _proto.getInitialDelay = function getInitialDelay() {\n return this.initialDelay_;\n };\n\n _proto.setInitialDelay = function setInitialDelay(initialDelay) {\n this.initialDelay_ = initialDelay;\n };\n\n _proto.createRetry = function createRetry(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n maxAttempts = _ref.maxAttempts,\n delayFactor = _ref.delayFactor,\n fuzzFactor = _ref.fuzzFactor,\n initialDelay = _ref.initialDelay;\n\n return new Retry({\n maxAttempts: maxAttempts || this.maxAttempts_,\n delayFactor: delayFactor || this.delayFactor_,\n fuzzFactor: fuzzFactor || this.fuzzFactor_,\n initialDelay: initialDelay || this.initialDelay_\n });\n };\n\n return RetryManager;\n}();\n\nvar Retry = /*#__PURE__*/function () {\n function Retry(options) {\n this.maxAttempts_ = options.maxAttempts;\n this.delayFactor_ = options.delayFactor;\n this.fuzzFactor_ = options.fuzzFactor;\n this.currentDelay_ = options.initialDelay;\n this.currentAttempt_ = 1;\n }\n\n var _proto2 = Retry.prototype;\n\n _proto2.moveToNextAttempt = function moveToNextAttempt() {\n this.currentAttempt_++;\n var delayDelta = this.currentDelay_ * this.delayFactor_;\n this.currentDelay_ = this.currentDelay_ + delayDelta;\n };\n\n _proto2.shouldRetry = function shouldRetry() {\n return this.currentAttempt_ < this.maxAttempts_;\n };\n\n _proto2.getCurrentDelay = function getCurrentDelay() {\n return this.currentDelay_;\n };\n\n _proto2.getCurrentMinPossibleDelay = function getCurrentMinPossibleDelay() {\n return (1 - this.fuzzFactor_) * this.currentDelay_;\n };\n\n _proto2.getCurrentMaxPossibleDelay = function getCurrentMaxPossibleDelay() {\n return (1 + this.fuzzFactor_) * this.currentDelay_;\n }\n /**\n * For example fuzzFactor is 0.1\n * This means ±10% deviation\n * So if we have delay as 1000\n * This function can generate any value from 900 to 1100\n */\n ;\n\n _proto2.getCurrentFuzzedDelay = function getCurrentFuzzedDelay() {\n var lowValue = this.getCurrentMinPossibleDelay();\n var highValue = this.getCurrentMaxPossibleDelay();\n return lowValue + Math.random() * (highValue - lowValue);\n };\n\n return Retry;\n}();\n\nmodule.exports = RetryManager;","\"use strict\";\n\nvar window = require('global/window');\n\nvar httpResponseHandler = function httpResponseHandler(callback, decodeResponseBody) {\n if (decodeResponseBody === void 0) {\n decodeResponseBody = false;\n }\n\n return function (err, response, responseBody) {\n // if the XHR failed, return that error\n if (err) {\n callback(err);\n return;\n } // if the HTTP status code is 4xx or 5xx, the request also failed\n\n\n if (response.statusCode >= 400 && response.statusCode <= 599) {\n var cause = responseBody;\n\n if (decodeResponseBody) {\n if (window.TextDecoder) {\n var charset = getCharset(response.headers && response.headers['content-type']);\n\n try {\n cause = new TextDecoder(charset).decode(responseBody);\n } catch (e) {}\n } else {\n cause = String.fromCharCode.apply(null, new Uint8Array(responseBody));\n }\n }\n\n callback({\n cause: cause\n });\n return;\n } // otherwise, request succeeded\n\n\n callback(null, responseBody);\n };\n};\n\nfunction getCharset(contentTypeHeader) {\n if (contentTypeHeader === void 0) {\n contentTypeHeader = '';\n }\n\n return contentTypeHeader.toLowerCase().split(';').reduce(function (charset, contentType) {\n var _contentType$split = contentType.split('='),\n type = _contentType$split[0],\n value = _contentType$split[1];\n\n if (type.trim() === 'charset') {\n return value.trim();\n }\n\n return charset;\n }, 'utf-8');\n}\n\nmodule.exports = httpResponseHandler;","\"use strict\";\n\nvar window = require(\"global/window\");\n\nvar _extends = require(\"@babel/runtime/helpers/extends\");\n\nvar isFunction = require('is-function');\n\nvar InterceptorsStorage = require('./interceptors.js');\n\nvar RetryManager = require(\"./retry.js\");\n\ncreateXHR.httpHandler = require('./http-handler.js');\ncreateXHR.requestInterceptorsStorage = new InterceptorsStorage();\ncreateXHR.responseInterceptorsStorage = new InterceptorsStorage();\ncreateXHR.retryManager = new RetryManager();\n/**\n * @license\n * slighly modified parse-headers 2.0.2 \n * Copyright (c) 2014 David Björklund\n * Available under the MIT license\n * \n */\n\nvar parseHeaders = function parseHeaders(headers) {\n var result = {};\n\n if (!headers) {\n return result;\n }\n\n headers.trim().split('\\n').forEach(function (row) {\n var index = row.indexOf(':');\n var key = row.slice(0, index).trim().toLowerCase();\n var value = row.slice(index + 1).trim();\n\n if (typeof result[key] === 'undefined') {\n result[key] = value;\n } else if (Array.isArray(result[key])) {\n result[key].push(value);\n } else {\n result[key] = [result[key], value];\n }\n });\n return result;\n};\n\nmodule.exports = createXHR; // Allow use of default import syntax in TypeScript\n\nmodule.exports.default = createXHR;\ncreateXHR.XMLHttpRequest = window.XMLHttpRequest || noop;\ncreateXHR.XDomainRequest = \"withCredentials\" in new createXHR.XMLHttpRequest() ? createXHR.XMLHttpRequest : window.XDomainRequest;\nforEachArray([\"get\", \"put\", \"post\", \"patch\", \"head\", \"delete\"], function (method) {\n createXHR[method === \"delete\" ? \"del\" : method] = function (uri, options, callback) {\n options = initParams(uri, options, callback);\n options.method = method.toUpperCase();\n return _createXHR(options);\n };\n});\n\nfunction forEachArray(array, iterator) {\n for (var i = 0; i < array.length; i++) {\n iterator(array[i]);\n }\n}\n\nfunction isEmpty(obj) {\n for (var i in obj) {\n if (obj.hasOwnProperty(i)) return false;\n }\n\n return true;\n}\n\nfunction initParams(uri, options, callback) {\n var params = uri;\n\n if (isFunction(options)) {\n callback = options;\n\n if (typeof uri === \"string\") {\n params = {\n uri: uri\n };\n }\n } else {\n params = _extends({}, options, {\n uri: uri\n });\n }\n\n params.callback = callback;\n return params;\n}\n\nfunction createXHR(uri, options, callback) {\n options = initParams(uri, options, callback);\n return _createXHR(options);\n}\n\nfunction _createXHR(options) {\n if (typeof options.callback === \"undefined\") {\n throw new Error(\"callback argument missing\");\n } // call all registered request interceptors for a given request type:\n\n\n if (options.requestType && createXHR.requestInterceptorsStorage.getIsEnabled()) {\n var requestInterceptorPayload = {\n uri: options.uri || options.url,\n headers: options.headers || {},\n body: options.body,\n metadata: options.metadata || {},\n retry: options.retry,\n timeout: options.timeout\n };\n var updatedPayload = createXHR.requestInterceptorsStorage.execute(options.requestType, requestInterceptorPayload);\n options.uri = updatedPayload.uri;\n options.headers = updatedPayload.headers;\n options.body = updatedPayload.body;\n options.metadata = updatedPayload.metadata;\n options.retry = updatedPayload.retry;\n options.timeout = updatedPayload.timeout;\n }\n\n var called = false;\n\n var callback = function cbOnce(err, response, body) {\n if (!called) {\n called = true;\n options.callback(err, response, body);\n }\n };\n\n function readystatechange() {\n // do not call load 2 times when response interceptors are enabled\n // why do we even need this 2nd load?\n if (xhr.readyState === 4 && !createXHR.responseInterceptorsStorage.getIsEnabled()) {\n setTimeout(loadFunc, 0);\n }\n }\n\n function getBody() {\n // Chrome with requestType=blob throws errors arround when even testing access to responseText\n var body = undefined;\n\n if (xhr.response) {\n body = xhr.response;\n } else {\n body = xhr.responseText || getXml(xhr);\n }\n\n if (isJson) {\n try {\n body = JSON.parse(body);\n } catch (e) {}\n }\n\n return body;\n }\n\n function errorFunc(evt) {\n clearTimeout(timeoutTimer);\n clearTimeout(options.retryTimeout);\n\n if (!(evt instanceof Error)) {\n evt = new Error(\"\" + (evt || \"Unknown XMLHttpRequest Error\"));\n }\n\n evt.statusCode = 0; // we would like to retry on error:\n\n if (!aborted && createXHR.retryManager.getIsEnabled() && options.retry && options.retry.shouldRetry()) {\n options.retryTimeout = setTimeout(function () {\n options.retry.moveToNextAttempt(); // we want to re-use the same options and the same xhr object:\n\n options.xhr = xhr;\n\n _createXHR(options);\n }, options.retry.getCurrentFuzzedDelay());\n return;\n } // call all registered response interceptors for a given request type:\n\n\n if (options.requestType && createXHR.responseInterceptorsStorage.getIsEnabled()) {\n var responseInterceptorPayload = {\n headers: failureResponse.headers || {},\n body: failureResponse.body,\n responseUrl: xhr.responseURL,\n responseType: xhr.responseType\n };\n\n var _updatedPayload = createXHR.responseInterceptorsStorage.execute(options.requestType, responseInterceptorPayload);\n\n failureResponse.body = _updatedPayload.body;\n failureResponse.headers = _updatedPayload.headers;\n }\n\n return callback(evt, failureResponse);\n } // will load the data & process the response in a special response object\n\n\n function loadFunc() {\n if (aborted) return;\n var status;\n clearTimeout(timeoutTimer);\n clearTimeout(options.retryTimeout);\n\n if (options.useXDR && xhr.status === undefined) {\n //IE8 CORS GET successful response doesn't have a status field, but body is fine\n status = 200;\n } else {\n status = xhr.status === 1223 ? 204 : xhr.status;\n }\n\n var response = failureResponse;\n var err = null;\n\n if (status !== 0) {\n response = {\n body: getBody(),\n statusCode: status,\n method: method,\n headers: {},\n url: uri,\n rawRequest: xhr\n };\n\n if (xhr.getAllResponseHeaders) {\n //remember xhr can in fact be XDR for CORS in IE\n response.headers = parseHeaders(xhr.getAllResponseHeaders());\n }\n } else {\n err = new Error(\"Internal XMLHttpRequest Error\");\n } // call all registered response interceptors for a given request type:\n\n\n if (options.requestType && createXHR.responseInterceptorsStorage.getIsEnabled()) {\n var responseInterceptorPayload = {\n headers: response.headers || {},\n body: response.body,\n responseUrl: xhr.responseURL,\n responseType: xhr.responseType\n };\n\n var _updatedPayload2 = createXHR.responseInterceptorsStorage.execute(options.requestType, responseInterceptorPayload);\n\n response.body = _updatedPayload2.body;\n response.headers = _updatedPayload2.headers;\n }\n\n return callback(err, response, response.body);\n }\n\n var xhr = options.xhr || null;\n\n if (!xhr) {\n if (options.cors || options.useXDR) {\n xhr = new createXHR.XDomainRequest();\n } else {\n xhr = new createXHR.XMLHttpRequest();\n }\n }\n\n var key;\n var aborted;\n var uri = xhr.url = options.uri || options.url;\n var method = xhr.method = options.method || \"GET\";\n var body = options.body || options.data;\n var headers = xhr.headers = options.headers || {};\n var sync = !!options.sync;\n var isJson = false;\n var timeoutTimer;\n var failureResponse = {\n body: undefined,\n headers: {},\n statusCode: 0,\n method: method,\n url: uri,\n rawRequest: xhr\n };\n\n if (\"json\" in options && options.json !== false) {\n isJson = true;\n headers[\"accept\"] || headers[\"Accept\"] || (headers[\"Accept\"] = \"application/json\"); //Don't override existing accept header declared by user\n\n if (method !== \"GET\" && method !== \"HEAD\") {\n headers[\"content-type\"] || headers[\"Content-Type\"] || (headers[\"Content-Type\"] = \"application/json\"); //Don't override existing accept header declared by user\n\n body = JSON.stringify(options.json === true ? body : options.json);\n }\n }\n\n xhr.onreadystatechange = readystatechange;\n xhr.onload = loadFunc;\n xhr.onerror = errorFunc; // IE9 must have onprogress be set to a unique function.\n\n xhr.onprogress = function () {// IE must die\n };\n\n xhr.onabort = function () {\n aborted = true;\n clearTimeout(options.retryTimeout);\n };\n\n xhr.ontimeout = errorFunc;\n xhr.open(method, uri, !sync, options.username, options.password); //has to be after open\n\n if (!sync) {\n xhr.withCredentials = !!options.withCredentials;\n } // Cannot set timeout with sync request\n // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly\n // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent\n\n\n if (!sync && options.timeout > 0) {\n timeoutTimer = setTimeout(function () {\n if (aborted) return;\n aborted = true; //IE9 may still call readystatechange\n\n xhr.abort(\"timeout\");\n var e = new Error(\"XMLHttpRequest timeout\");\n e.code = \"ETIMEDOUT\";\n errorFunc(e);\n }, options.timeout);\n }\n\n if (xhr.setRequestHeader) {\n for (key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n } else if (options.headers && !isEmpty(options.headers)) {\n throw new Error(\"Headers cannot be set on an XDomainRequest object\");\n }\n\n if (\"responseType\" in options) {\n xhr.responseType = options.responseType;\n }\n\n if (\"beforeSend\" in options && typeof options.beforeSend === \"function\") {\n options.beforeSend(xhr);\n } // Microsoft Edge browser sends \"undefined\" when send is called with undefined value.\n // XMLHttpRequest spec says to pass null as body to indicate no body\n // See https://github.com/naugtur/xhr/issues/100.\n\n\n xhr.send(body || null);\n return xhr;\n}\n\nfunction getXml(xhr) {\n // xhr.responseXML will throw Exception \"InvalidStateError\" or \"DOMException\"\n // See https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseXML.\n try {\n if (xhr.responseType === \"document\") {\n return xhr.responseXML;\n }\n\n var firefoxBugTakenEffect = xhr.responseXML && xhr.responseXML.documentElement.nodeName === \"parsererror\";\n\n if (xhr.responseType === \"\" && !firefoxBugTakenEffect) {\n return xhr.responseXML;\n }\n } catch (e) {}\n\n return null;\n}\n\nfunction noop() {}","/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\nvar document = require('global/document');\n\nvar _objCreate = Object.create || (function() {\n function F() {}\n return function(o) {\n if (arguments.length !== 1) {\n throw new Error('Object.create shim only accepts one parameter.');\n }\n F.prototype = o;\n return new F();\n };\n})();\n\n// Creates a new ParserError object from an errorData object. The errorData\n// object should have default code and message properties. The default message\n// property can be overriden by passing in a message parameter.\n// See ParsingError.Errors below for acceptable errors.\nfunction ParsingError(errorData, message) {\n this.name = \"ParsingError\";\n this.code = errorData.code;\n this.message = message || errorData.message;\n}\nParsingError.prototype = _objCreate(Error.prototype);\nParsingError.prototype.constructor = ParsingError;\n\n// ParsingError metadata for acceptable ParsingErrors.\nParsingError.Errors = {\n BadSignature: {\n code: 0,\n message: \"Malformed WebVTT signature.\"\n },\n BadTimeStamp: {\n code: 1,\n message: \"Malformed time stamp.\"\n }\n};\n\n// Try to parse input as a time stamp.\nfunction parseTimeStamp(input) {\n\n function computeSeconds(h, m, s, f) {\n return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + (f | 0) / 1000;\n }\n\n var m = input.match(/^(\\d+):(\\d{1,2})(:\\d{1,2})?\\.(\\d{3})/);\n if (!m) {\n return null;\n }\n\n if (m[3]) {\n // Timestamp takes the form of [hours]:[minutes]:[seconds].[milliseconds]\n return computeSeconds(m[1], m[2], m[3].replace(\":\", \"\"), m[4]);\n } else if (m[1] > 59) {\n // Timestamp takes the form of [hours]:[minutes].[milliseconds]\n // First position is hours as it's over 59.\n return computeSeconds(m[1], m[2], 0, m[4]);\n } else {\n // Timestamp takes the form of [minutes]:[seconds].[milliseconds]\n return computeSeconds(0, m[1], m[2], m[4]);\n }\n}\n\n// A settings object holds key/value pairs and will ignore anything but the first\n// assignment to a specific key.\nfunction Settings() {\n this.values = _objCreate(null);\n}\n\nSettings.prototype = {\n // Only accept the first assignment to any key.\n set: function(k, v) {\n if (!this.get(k) && v !== \"\") {\n this.values[k] = v;\n }\n },\n // Return the value for a key, or a default value.\n // If 'defaultKey' is passed then 'dflt' is assumed to be an object with\n // a number of possible default values as properties where 'defaultKey' is\n // the key of the property that will be chosen; otherwise it's assumed to be\n // a single value.\n get: function(k, dflt, defaultKey) {\n if (defaultKey) {\n return this.has(k) ? this.values[k] : dflt[defaultKey];\n }\n return this.has(k) ? this.values[k] : dflt;\n },\n // Check whether we have a value for a key.\n has: function(k) {\n return k in this.values;\n },\n // Accept a setting if its one of the given alternatives.\n alt: function(k, v, a) {\n for (var n = 0; n < a.length; ++n) {\n if (v === a[n]) {\n this.set(k, v);\n break;\n }\n }\n },\n // Accept a setting if its a valid (signed) integer.\n integer: function(k, v) {\n if (/^-?\\d+$/.test(v)) { // integer\n this.set(k, parseInt(v, 10));\n }\n },\n // Accept a setting if its a valid percentage.\n percent: function(k, v) {\n var m;\n if ((m = v.match(/^([\\d]{1,3})(\\.[\\d]*)?%$/))) {\n v = parseFloat(v);\n if (v >= 0 && v <= 100) {\n this.set(k, v);\n return true;\n }\n }\n return false;\n }\n};\n\n// Helper function to parse input into groups separated by 'groupDelim', and\n// interprete each group as a key/value pair separated by 'keyValueDelim'.\nfunction parseOptions(input, callback, keyValueDelim, groupDelim) {\n var groups = groupDelim ? input.split(groupDelim) : [input];\n for (var i in groups) {\n if (typeof groups[i] !== \"string\") {\n continue;\n }\n var kv = groups[i].split(keyValueDelim);\n if (kv.length !== 2) {\n continue;\n }\n var k = kv[0].trim();\n var v = kv[1].trim();\n callback(k, v);\n }\n}\n\nfunction parseCue(input, cue, regionList) {\n // Remember the original input if we need to throw an error.\n var oInput = input;\n // 4.1 WebVTT timestamp\n function consumeTimeStamp() {\n var ts = parseTimeStamp(input);\n if (ts === null) {\n throw new ParsingError(ParsingError.Errors.BadTimeStamp,\n \"Malformed timestamp: \" + oInput);\n }\n // Remove time stamp from input.\n input = input.replace(/^[^\\sa-zA-Z-]+/, \"\");\n return ts;\n }\n\n // 4.4.2 WebVTT cue settings\n function consumeCueSettings(input, cue) {\n var settings = new Settings();\n\n parseOptions(input, function (k, v) {\n switch (k) {\n case \"region\":\n // Find the last region we parsed with the same region id.\n for (var i = regionList.length - 1; i >= 0; i--) {\n if (regionList[i].id === v) {\n settings.set(k, regionList[i].region);\n break;\n }\n }\n break;\n case \"vertical\":\n settings.alt(k, v, [\"rl\", \"lr\"]);\n break;\n case \"line\":\n var vals = v.split(\",\"),\n vals0 = vals[0];\n settings.integer(k, vals0);\n settings.percent(k, vals0) ? settings.set(\"snapToLines\", false) : null;\n settings.alt(k, vals0, [\"auto\"]);\n if (vals.length === 2) {\n settings.alt(\"lineAlign\", vals[1], [\"start\", \"center\", \"end\"]);\n }\n break;\n case \"position\":\n vals = v.split(\",\");\n settings.percent(k, vals[0]);\n if (vals.length === 2) {\n settings.alt(\"positionAlign\", vals[1], [\"start\", \"center\", \"end\"]);\n }\n break;\n case \"size\":\n settings.percent(k, v);\n break;\n case \"align\":\n settings.alt(k, v, [\"start\", \"center\", \"end\", \"left\", \"right\"]);\n break;\n }\n }, /:/, /\\s/);\n\n // Apply default values for any missing fields.\n cue.region = settings.get(\"region\", null);\n cue.vertical = settings.get(\"vertical\", \"\");\n try {\n cue.line = settings.get(\"line\", \"auto\");\n } catch (e) {}\n cue.lineAlign = settings.get(\"lineAlign\", \"start\");\n cue.snapToLines = settings.get(\"snapToLines\", true);\n cue.size = settings.get(\"size\", 100);\n // Safari still uses the old middle value and won't accept center\n try {\n cue.align = settings.get(\"align\", \"center\");\n } catch (e) {\n cue.align = settings.get(\"align\", \"middle\");\n }\n try {\n cue.position = settings.get(\"position\", \"auto\");\n } catch (e) {\n cue.position = settings.get(\"position\", {\n start: 0,\n left: 0,\n center: 50,\n middle: 50,\n end: 100,\n right: 100\n }, cue.align);\n }\n\n\n cue.positionAlign = settings.get(\"positionAlign\", {\n start: \"start\",\n left: \"start\",\n center: \"center\",\n middle: \"center\",\n end: \"end\",\n right: \"end\"\n }, cue.align);\n }\n\n function skipWhitespace() {\n input = input.replace(/^\\s+/, \"\");\n }\n\n // 4.1 WebVTT cue timings.\n skipWhitespace();\n cue.startTime = consumeTimeStamp(); // (1) collect cue start time\n skipWhitespace();\n if (input.substr(0, 3) !== \"-->\") { // (3) next characters must match \"-->\"\n throw new ParsingError(ParsingError.Errors.BadTimeStamp,\n \"Malformed time stamp (time stamps must be separated by '-->'): \" +\n oInput);\n }\n input = input.substr(3);\n skipWhitespace();\n cue.endTime = consumeTimeStamp(); // (5) collect cue end time\n\n // 4.1 WebVTT cue settings list.\n skipWhitespace();\n consumeCueSettings(input, cue);\n}\n\n// When evaluating this file as part of a Webpack bundle for server\n// side rendering, `document` is an empty object.\nvar TEXTAREA_ELEMENT = document.createElement && document.createElement(\"textarea\");\n\nvar TAG_NAME = {\n c: \"span\",\n i: \"i\",\n b: \"b\",\n u: \"u\",\n ruby: \"ruby\",\n rt: \"rt\",\n v: \"span\",\n lang: \"span\"\n};\n\n// 5.1 default text color\n// 5.2 default text background color is equivalent to text color with bg_ prefix\nvar DEFAULT_COLOR_CLASS = {\n white: 'rgba(255,255,255,1)',\n lime: 'rgba(0,255,0,1)',\n cyan: 'rgba(0,255,255,1)',\n red: 'rgba(255,0,0,1)',\n yellow: 'rgba(255,255,0,1)',\n magenta: 'rgba(255,0,255,1)',\n blue: 'rgba(0,0,255,1)',\n black: 'rgba(0,0,0,1)'\n};\n\nvar TAG_ANNOTATION = {\n v: \"title\",\n lang: \"lang\"\n};\n\nvar NEEDS_PARENT = {\n rt: \"ruby\"\n};\n\n// Parse content into a document fragment.\nfunction parseContent(window, input) {\n function nextToken() {\n // Check for end-of-string.\n if (!input) {\n return null;\n }\n\n // Consume 'n' characters from the input.\n function consume(result) {\n input = input.substr(result.length);\n return result;\n }\n\n var m = input.match(/^([^<]*)(<[^>]*>?)?/);\n // If there is some text before the next tag, return it, otherwise return\n // the tag.\n return consume(m[1] ? m[1] : m[2]);\n }\n\n function unescape(s) {\n TEXTAREA_ELEMENT.innerHTML = s;\n s = TEXTAREA_ELEMENT.textContent;\n TEXTAREA_ELEMENT.textContent = \"\";\n return s;\n }\n\n function shouldAdd(current, element) {\n return !NEEDS_PARENT[element.localName] ||\n NEEDS_PARENT[element.localName] === current.localName;\n }\n\n // Create an element for this tag.\n function createElement(type, annotation) {\n var tagName = TAG_NAME[type];\n if (!tagName) {\n return null;\n }\n var element = window.document.createElement(tagName);\n var name = TAG_ANNOTATION[type];\n if (name && annotation) {\n element[name] = annotation.trim();\n }\n return element;\n }\n\n var rootDiv = window.document.createElement(\"div\"),\n current = rootDiv,\n t,\n tagStack = [];\n\n while ((t = nextToken()) !== null) {\n if (t[0] === '<') {\n if (t[1] === \"/\") {\n // If the closing tag matches, move back up to the parent node.\n if (tagStack.length &&\n tagStack[tagStack.length - 1] === t.substr(2).replace(\">\", \"\")) {\n tagStack.pop();\n current = current.parentNode;\n }\n // Otherwise just ignore the end tag.\n continue;\n }\n var ts = parseTimeStamp(t.substr(1, t.length - 2));\n var node;\n if (ts) {\n // Timestamps are lead nodes as well.\n node = window.document.createProcessingInstruction(\"timestamp\", ts);\n current.appendChild(node);\n continue;\n }\n var m = t.match(/^<([^.\\s/0-9>]+)(\\.[^\\s\\\\>]+)?([^>\\\\]+)?(\\\\?)>?$/);\n // If we can't parse the tag, skip to the next tag.\n if (!m) {\n continue;\n }\n // Try to construct an element, and ignore the tag if we couldn't.\n node = createElement(m[1], m[3]);\n if (!node) {\n continue;\n }\n // Determine if the tag should be added based on the context of where it\n // is placed in the cuetext.\n if (!shouldAdd(current, node)) {\n continue;\n }\n // Set the class list (as a list of classes, separated by space).\n if (m[2]) {\n var classes = m[2].split('.');\n\n classes.forEach(function(cl) {\n var bgColor = /^bg_/.test(cl);\n // slice out `bg_` if it's a background color\n var colorName = bgColor ? cl.slice(3) : cl;\n\n if (DEFAULT_COLOR_CLASS.hasOwnProperty(colorName)) {\n var propName = bgColor ? 'background-color' : 'color';\n var propValue = DEFAULT_COLOR_CLASS[colorName];\n\n node.style[propName] = propValue;\n }\n });\n\n node.className = classes.join(' ');\n }\n // Append the node to the current node, and enter the scope of the new\n // node.\n tagStack.push(m[1]);\n current.appendChild(node);\n current = node;\n continue;\n }\n\n // Text nodes are leaf nodes.\n current.appendChild(window.document.createTextNode(unescape(t)));\n }\n\n return rootDiv;\n}\n\n// This is a list of all the Unicode characters that have a strong\n// right-to-left category. What this means is that these characters are\n// written right-to-left for sure. It was generated by pulling all the strong\n// right-to-left characters out of the Unicode data table. That table can\n// found at: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\nvar strongRTLRanges = [[0x5be, 0x5be], [0x5c0, 0x5c0], [0x5c3, 0x5c3], [0x5c6, 0x5c6],\n [0x5d0, 0x5ea], [0x5f0, 0x5f4], [0x608, 0x608], [0x60b, 0x60b], [0x60d, 0x60d],\n [0x61b, 0x61b], [0x61e, 0x64a], [0x66d, 0x66f], [0x671, 0x6d5], [0x6e5, 0x6e6],\n [0x6ee, 0x6ef], [0x6fa, 0x70d], [0x70f, 0x710], [0x712, 0x72f], [0x74d, 0x7a5],\n [0x7b1, 0x7b1], [0x7c0, 0x7ea], [0x7f4, 0x7f5], [0x7fa, 0x7fa], [0x800, 0x815],\n [0x81a, 0x81a], [0x824, 0x824], [0x828, 0x828], [0x830, 0x83e], [0x840, 0x858],\n [0x85e, 0x85e], [0x8a0, 0x8a0], [0x8a2, 0x8ac], [0x200f, 0x200f],\n [0xfb1d, 0xfb1d], [0xfb1f, 0xfb28], [0xfb2a, 0xfb36], [0xfb38, 0xfb3c],\n [0xfb3e, 0xfb3e], [0xfb40, 0xfb41], [0xfb43, 0xfb44], [0xfb46, 0xfbc1],\n [0xfbd3, 0xfd3d], [0xfd50, 0xfd8f], [0xfd92, 0xfdc7], [0xfdf0, 0xfdfc],\n [0xfe70, 0xfe74], [0xfe76, 0xfefc], [0x10800, 0x10805], [0x10808, 0x10808],\n [0x1080a, 0x10835], [0x10837, 0x10838], [0x1083c, 0x1083c], [0x1083f, 0x10855],\n [0x10857, 0x1085f], [0x10900, 0x1091b], [0x10920, 0x10939], [0x1093f, 0x1093f],\n [0x10980, 0x109b7], [0x109be, 0x109bf], [0x10a00, 0x10a00], [0x10a10, 0x10a13],\n [0x10a15, 0x10a17], [0x10a19, 0x10a33], [0x10a40, 0x10a47], [0x10a50, 0x10a58],\n [0x10a60, 0x10a7f], [0x10b00, 0x10b35], [0x10b40, 0x10b55], [0x10b58, 0x10b72],\n [0x10b78, 0x10b7f], [0x10c00, 0x10c48], [0x1ee00, 0x1ee03], [0x1ee05, 0x1ee1f],\n [0x1ee21, 0x1ee22], [0x1ee24, 0x1ee24], [0x1ee27, 0x1ee27], [0x1ee29, 0x1ee32],\n [0x1ee34, 0x1ee37], [0x1ee39, 0x1ee39], [0x1ee3b, 0x1ee3b], [0x1ee42, 0x1ee42],\n [0x1ee47, 0x1ee47], [0x1ee49, 0x1ee49], [0x1ee4b, 0x1ee4b], [0x1ee4d, 0x1ee4f],\n [0x1ee51, 0x1ee52], [0x1ee54, 0x1ee54], [0x1ee57, 0x1ee57], [0x1ee59, 0x1ee59],\n [0x1ee5b, 0x1ee5b], [0x1ee5d, 0x1ee5d], [0x1ee5f, 0x1ee5f], [0x1ee61, 0x1ee62],\n [0x1ee64, 0x1ee64], [0x1ee67, 0x1ee6a], [0x1ee6c, 0x1ee72], [0x1ee74, 0x1ee77],\n [0x1ee79, 0x1ee7c], [0x1ee7e, 0x1ee7e], [0x1ee80, 0x1ee89], [0x1ee8b, 0x1ee9b],\n [0x1eea1, 0x1eea3], [0x1eea5, 0x1eea9], [0x1eeab, 0x1eebb], [0x10fffd, 0x10fffd]];\n\nfunction isStrongRTLChar(charCode) {\n for (var i = 0; i < strongRTLRanges.length; i++) {\n var currentRange = strongRTLRanges[i];\n if (charCode >= currentRange[0] && charCode <= currentRange[1]) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction determineBidi(cueDiv) {\n var nodeStack = [],\n text = \"\",\n charCode;\n\n if (!cueDiv || !cueDiv.childNodes) {\n return \"ltr\";\n }\n\n function pushNodes(nodeStack, node) {\n for (var i = node.childNodes.length - 1; i >= 0; i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n\n function nextTextNode(nodeStack) {\n if (!nodeStack || !nodeStack.length) {\n return null;\n }\n\n var node = nodeStack.pop(),\n text = node.textContent || node.innerText;\n if (text) {\n // TODO: This should match all unicode type B characters (paragraph\n // separator characters). See issue #115.\n var m = text.match(/^.*(\\n|\\r)/);\n if (m) {\n nodeStack.length = 0;\n return m[0];\n }\n return text;\n }\n if (node.tagName === \"ruby\") {\n return nextTextNode(nodeStack);\n }\n if (node.childNodes) {\n pushNodes(nodeStack, node);\n return nextTextNode(nodeStack);\n }\n }\n\n pushNodes(nodeStack, cueDiv);\n while ((text = nextTextNode(nodeStack))) {\n for (var i = 0; i < text.length; i++) {\n charCode = text.charCodeAt(i);\n if (isStrongRTLChar(charCode)) {\n return \"rtl\";\n }\n }\n }\n return \"ltr\";\n}\n\nfunction computeLinePos(cue) {\n if (typeof cue.line === \"number\" &&\n (cue.snapToLines || (cue.line >= 0 && cue.line <= 100))) {\n return cue.line;\n }\n if (!cue.track || !cue.track.textTrackList ||\n !cue.track.textTrackList.mediaElement) {\n return -1;\n }\n var track = cue.track,\n trackList = track.textTrackList,\n count = 0;\n for (var i = 0; i < trackList.length && trackList[i] !== track; i++) {\n if (trackList[i].mode === \"showing\") {\n count++;\n }\n }\n return ++count * -1;\n}\n\nfunction StyleBox() {\n}\n\n// Apply styles to a div. If there is no div passed then it defaults to the\n// div on 'this'.\nStyleBox.prototype.applyStyles = function(styles, div) {\n div = div || this.div;\n for (var prop in styles) {\n if (styles.hasOwnProperty(prop)) {\n div.style[prop] = styles[prop];\n }\n }\n};\n\nStyleBox.prototype.formatStyle = function(val, unit) {\n return val === 0 ? 0 : val + unit;\n};\n\n// Constructs the computed display state of the cue (a div). Places the div\n// into the overlay which should be a block level element (usually a div).\nfunction CueStyleBox(window, cue, styleOptions) {\n StyleBox.call(this);\n this.cue = cue;\n\n // Parse our cue's text into a DOM tree rooted at 'cueDiv'. This div will\n // have inline positioning and will function as the cue background box.\n this.cueDiv = parseContent(window, cue.text);\n var styles = {\n color: \"rgba(255, 255, 255, 1)\",\n backgroundColor: \"rgba(0, 0, 0, 0.8)\",\n position: \"relative\",\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n display: \"inline\",\n writingMode: cue.vertical === \"\" ? \"horizontal-tb\"\n : cue.vertical === \"lr\" ? \"vertical-lr\"\n : \"vertical-rl\",\n unicodeBidi: \"plaintext\"\n };\n\n this.applyStyles(styles, this.cueDiv);\n\n // Create an absolutely positioned div that will be used to position the cue\n // div. Note, all WebVTT cue-setting alignments are equivalent to the CSS\n // mirrors of them except middle instead of center on Safari.\n this.div = window.document.createElement(\"div\");\n styles = {\n direction: determineBidi(this.cueDiv),\n writingMode: cue.vertical === \"\" ? \"horizontal-tb\"\n : cue.vertical === \"lr\" ? \"vertical-lr\"\n : \"vertical-rl\",\n unicodeBidi: \"plaintext\",\n textAlign: cue.align === \"middle\" ? \"center\" : cue.align,\n font: styleOptions.font,\n whiteSpace: \"pre-line\",\n position: \"absolute\"\n };\n\n this.applyStyles(styles);\n this.div.appendChild(this.cueDiv);\n\n // Calculate the distance from the reference edge of the viewport to the text\n // position of the cue box. The reference edge will be resolved later when\n // the box orientation styles are applied.\n var textPos = 0;\n switch (cue.positionAlign) {\n case \"start\":\n case \"line-left\":\n textPos = cue.position;\n break;\n case \"center\":\n textPos = cue.position - (cue.size / 2);\n break;\n case \"end\":\n case \"line-right\":\n textPos = cue.position - cue.size;\n break;\n }\n\n // Horizontal box orientation; textPos is the distance from the left edge of the\n // area to the left edge of the box and cue.size is the distance extending to\n // the right from there.\n if (cue.vertical === \"\") {\n this.applyStyles({\n left: this.formatStyle(textPos, \"%\"),\n width: this.formatStyle(cue.size, \"%\")\n });\n // Vertical box orientation; textPos is the distance from the top edge of the\n // area to the top edge of the box and cue.size is the height extending\n // downwards from there.\n } else {\n this.applyStyles({\n top: this.formatStyle(textPos, \"%\"),\n height: this.formatStyle(cue.size, \"%\")\n });\n }\n\n this.move = function(box) {\n this.applyStyles({\n top: this.formatStyle(box.top, \"px\"),\n bottom: this.formatStyle(box.bottom, \"px\"),\n left: this.formatStyle(box.left, \"px\"),\n right: this.formatStyle(box.right, \"px\"),\n height: this.formatStyle(box.height, \"px\"),\n width: this.formatStyle(box.width, \"px\")\n });\n };\n}\nCueStyleBox.prototype = _objCreate(StyleBox.prototype);\nCueStyleBox.prototype.constructor = CueStyleBox;\n\n// Represents the co-ordinates of an Element in a way that we can easily\n// compute things with such as if it overlaps or intersects with another Element.\n// Can initialize it with either a StyleBox or another BoxPosition.\nfunction BoxPosition(obj) {\n // Either a BoxPosition was passed in and we need to copy it, or a StyleBox\n // was passed in and we need to copy the results of 'getBoundingClientRect'\n // as the object returned is readonly. All co-ordinate values are in reference\n // to the viewport origin (top left).\n var lh, height, width, top;\n if (obj.div) {\n height = obj.div.offsetHeight;\n width = obj.div.offsetWidth;\n top = obj.div.offsetTop;\n\n var rects = (rects = obj.div.childNodes) && (rects = rects[0]) &&\n rects.getClientRects && rects.getClientRects();\n obj = obj.div.getBoundingClientRect();\n // In certain cases the outter div will be slightly larger then the sum of\n // the inner div's lines. This could be due to bold text, etc, on some platforms.\n // In this case we should get the average line height and use that. This will\n // result in the desired behaviour.\n lh = rects ? Math.max((rects[0] && rects[0].height) || 0, obj.height / rects.length)\n : 0;\n\n }\n this.left = obj.left;\n this.right = obj.right;\n this.top = obj.top || top;\n this.height = obj.height || height;\n this.bottom = obj.bottom || (top + (obj.height || height));\n this.width = obj.width || width;\n this.lineHeight = lh !== undefined ? lh : obj.lineHeight;\n}\n\n// Move the box along a particular axis. Optionally pass in an amount to move\n// the box. If no amount is passed then the default is the line height of the\n// box.\nBoxPosition.prototype.move = function(axis, toMove) {\n toMove = toMove !== undefined ? toMove : this.lineHeight;\n switch (axis) {\n case \"+x\":\n this.left += toMove;\n this.right += toMove;\n break;\n case \"-x\":\n this.left -= toMove;\n this.right -= toMove;\n break;\n case \"+y\":\n this.top += toMove;\n this.bottom += toMove;\n break;\n case \"-y\":\n this.top -= toMove;\n this.bottom -= toMove;\n break;\n }\n};\n\n// Check if this box overlaps another box, b2.\nBoxPosition.prototype.overlaps = function(b2) {\n return this.left < b2.right &&\n this.right > b2.left &&\n this.top < b2.bottom &&\n this.bottom > b2.top;\n};\n\n// Check if this box overlaps any other boxes in boxes.\nBoxPosition.prototype.overlapsAny = function(boxes) {\n for (var i = 0; i < boxes.length; i++) {\n if (this.overlaps(boxes[i])) {\n return true;\n }\n }\n return false;\n};\n\n// Check if this box is within another box.\nBoxPosition.prototype.within = function(container) {\n return this.top >= container.top &&\n this.bottom <= container.bottom &&\n this.left >= container.left &&\n this.right <= container.right;\n};\n\n// Check if this box is entirely within the container or it is overlapping\n// on the edge opposite of the axis direction passed. For example, if \"+x\" is\n// passed and the box is overlapping on the left edge of the container, then\n// return true.\nBoxPosition.prototype.overlapsOppositeAxis = function(container, axis) {\n switch (axis) {\n case \"+x\":\n return this.left < container.left;\n case \"-x\":\n return this.right > container.right;\n case \"+y\":\n return this.top < container.top;\n case \"-y\":\n return this.bottom > container.bottom;\n }\n};\n\n// Find the percentage of the area that this box is overlapping with another\n// box.\nBoxPosition.prototype.intersectPercentage = function(b2) {\n var x = Math.max(0, Math.min(this.right, b2.right) - Math.max(this.left, b2.left)),\n y = Math.max(0, Math.min(this.bottom, b2.bottom) - Math.max(this.top, b2.top)),\n intersectArea = x * y;\n return intersectArea / (this.height * this.width);\n};\n\n// Convert the positions from this box to CSS compatible positions using\n// the reference container's positions. This has to be done because this\n// box's positions are in reference to the viewport origin, whereas, CSS\n// values are in referecne to their respective edges.\nBoxPosition.prototype.toCSSCompatValues = function(reference) {\n return {\n top: this.top - reference.top,\n bottom: reference.bottom - this.bottom,\n left: this.left - reference.left,\n right: reference.right - this.right,\n height: this.height,\n width: this.width\n };\n};\n\n// Get an object that represents the box's position without anything extra.\n// Can pass a StyleBox, HTMLElement, or another BoxPositon.\nBoxPosition.getSimpleBoxPosition = function(obj) {\n var height = obj.div ? obj.div.offsetHeight : obj.tagName ? obj.offsetHeight : 0;\n var width = obj.div ? obj.div.offsetWidth : obj.tagName ? obj.offsetWidth : 0;\n var top = obj.div ? obj.div.offsetTop : obj.tagName ? obj.offsetTop : 0;\n\n obj = obj.div ? obj.div.getBoundingClientRect() :\n obj.tagName ? obj.getBoundingClientRect() : obj;\n var ret = {\n left: obj.left,\n right: obj.right,\n top: obj.top || top,\n height: obj.height || height,\n bottom: obj.bottom || (top + (obj.height || height)),\n width: obj.width || width\n };\n return ret;\n};\n\n// Move a StyleBox to its specified, or next best, position. The containerBox\n// is the box that contains the StyleBox, such as a div. boxPositions are\n// a list of other boxes that the styleBox can't overlap with.\nfunction moveBoxToLinePosition(window, styleBox, containerBox, boxPositions) {\n\n // Find the best position for a cue box, b, on the video. The axis parameter\n // is a list of axis, the order of which, it will move the box along. For example:\n // Passing [\"+x\", \"-x\"] will move the box first along the x axis in the positive\n // direction. If it doesn't find a good position for it there it will then move\n // it along the x axis in the negative direction.\n function findBestPosition(b, axis) {\n var bestPosition,\n specifiedPosition = new BoxPosition(b),\n percentage = 1; // Highest possible so the first thing we get is better.\n\n for (var i = 0; i < axis.length; i++) {\n while (b.overlapsOppositeAxis(containerBox, axis[i]) ||\n (b.within(containerBox) && b.overlapsAny(boxPositions))) {\n b.move(axis[i]);\n }\n // We found a spot where we aren't overlapping anything. This is our\n // best position.\n if (b.within(containerBox)) {\n return b;\n }\n var p = b.intersectPercentage(containerBox);\n // If we're outside the container box less then we were on our last try\n // then remember this position as the best position.\n if (percentage > p) {\n bestPosition = new BoxPosition(b);\n percentage = p;\n }\n // Reset the box position to the specified position.\n b = new BoxPosition(specifiedPosition);\n }\n return bestPosition || specifiedPosition;\n }\n\n var boxPosition = new BoxPosition(styleBox),\n cue = styleBox.cue,\n linePos = computeLinePos(cue),\n axis = [];\n\n // If we have a line number to align the cue to.\n if (cue.snapToLines) {\n var size;\n switch (cue.vertical) {\n case \"\":\n axis = [ \"+y\", \"-y\" ];\n size = \"height\";\n break;\n case \"rl\":\n axis = [ \"+x\", \"-x\" ];\n size = \"width\";\n break;\n case \"lr\":\n axis = [ \"-x\", \"+x\" ];\n size = \"width\";\n break;\n }\n\n var step = boxPosition.lineHeight,\n position = step * Math.round(linePos),\n maxPosition = containerBox[size] + step,\n initialAxis = axis[0];\n\n // If the specified intial position is greater then the max position then\n // clamp the box to the amount of steps it would take for the box to\n // reach the max position.\n if (Math.abs(position) > maxPosition) {\n position = position < 0 ? -1 : 1;\n position *= Math.ceil(maxPosition / step) * step;\n }\n\n // If computed line position returns negative then line numbers are\n // relative to the bottom of the video instead of the top. Therefore, we\n // need to increase our initial position by the length or width of the\n // video, depending on the writing direction, and reverse our axis directions.\n if (linePos < 0) {\n position += cue.vertical === \"\" ? containerBox.height : containerBox.width;\n axis = axis.reverse();\n }\n\n // Move the box to the specified position. This may not be its best\n // position.\n boxPosition.move(initialAxis, position);\n\n } else {\n // If we have a percentage line value for the cue.\n var calculatedPercentage = (boxPosition.lineHeight / containerBox.height) * 100;\n\n switch (cue.lineAlign) {\n case \"center\":\n linePos -= (calculatedPercentage / 2);\n break;\n case \"end\":\n linePos -= calculatedPercentage;\n break;\n }\n\n // Apply initial line position to the cue box.\n switch (cue.vertical) {\n case \"\":\n styleBox.applyStyles({\n top: styleBox.formatStyle(linePos, \"%\")\n });\n break;\n case \"rl\":\n styleBox.applyStyles({\n left: styleBox.formatStyle(linePos, \"%\")\n });\n break;\n case \"lr\":\n styleBox.applyStyles({\n right: styleBox.formatStyle(linePos, \"%\")\n });\n break;\n }\n\n axis = [ \"+y\", \"-x\", \"+x\", \"-y\" ];\n\n // Get the box position again after we've applied the specified positioning\n // to it.\n boxPosition = new BoxPosition(styleBox);\n }\n\n var bestPosition = findBestPosition(boxPosition, axis);\n styleBox.move(bestPosition.toCSSCompatValues(containerBox));\n}\n\nfunction WebVTT() {\n // Nothing\n}\n\n// Helper to allow strings to be decoded instead of the default binary utf8 data.\nWebVTT.StringDecoder = function() {\n return {\n decode: function(data) {\n if (!data) {\n return \"\";\n }\n if (typeof data !== \"string\") {\n throw new Error(\"Error - expected string data.\");\n }\n return decodeURIComponent(encodeURIComponent(data));\n }\n };\n};\n\nWebVTT.convertCueToDOMTree = function(window, cuetext) {\n if (!window || !cuetext) {\n return null;\n }\n return parseContent(window, cuetext);\n};\n\nvar FONT_SIZE_PERCENT = 0.05;\nvar FONT_STYLE = \"sans-serif\";\nvar CUE_BACKGROUND_PADDING = \"1.5%\";\n\n// Runs the processing model over the cues and regions passed to it.\n// @param overlay A block level element (usually a div) that the computed cues\n// and regions will be placed into.\nWebVTT.processCues = function(window, cues, overlay) {\n if (!window || !cues || !overlay) {\n return null;\n }\n\n // Remove all previous children.\n while (overlay.firstChild) {\n overlay.removeChild(overlay.firstChild);\n }\n\n var paddedOverlay = window.document.createElement(\"div\");\n paddedOverlay.style.position = \"absolute\";\n paddedOverlay.style.left = \"0\";\n paddedOverlay.style.right = \"0\";\n paddedOverlay.style.top = \"0\";\n paddedOverlay.style.bottom = \"0\";\n paddedOverlay.style.margin = CUE_BACKGROUND_PADDING;\n overlay.appendChild(paddedOverlay);\n\n // Determine if we need to compute the display states of the cues. This could\n // be the case if a cue's state has been changed since the last computation or\n // if it has not been computed yet.\n function shouldCompute(cues) {\n for (var i = 0; i < cues.length; i++) {\n if (cues[i].hasBeenReset || !cues[i].displayState) {\n return true;\n }\n }\n return false;\n }\n\n // We don't need to recompute the cues' display states. Just reuse them.\n if (!shouldCompute(cues)) {\n for (var i = 0; i < cues.length; i++) {\n paddedOverlay.appendChild(cues[i].displayState);\n }\n return;\n }\n\n var boxPositions = [],\n containerBox = BoxPosition.getSimpleBoxPosition(paddedOverlay),\n fontSize = Math.round(containerBox.height * FONT_SIZE_PERCENT * 100) / 100;\n var styleOptions = {\n font: fontSize + \"px \" + FONT_STYLE\n };\n\n (function() {\n var styleBox, cue;\n\n for (var i = 0; i < cues.length; i++) {\n cue = cues[i];\n\n // Compute the intial position and styles of the cue div.\n styleBox = new CueStyleBox(window, cue, styleOptions);\n paddedOverlay.appendChild(styleBox.div);\n\n // Move the cue div to it's correct line position.\n moveBoxToLinePosition(window, styleBox, containerBox, boxPositions);\n\n // Remember the computed div so that we don't have to recompute it later\n // if we don't have too.\n cue.displayState = styleBox.div;\n\n boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox));\n }\n })();\n};\n\nWebVTT.Parser = function(window, vttjs, decoder) {\n if (!decoder) {\n decoder = vttjs;\n vttjs = {};\n }\n if (!vttjs) {\n vttjs = {};\n }\n\n this.window = window;\n this.vttjs = vttjs;\n this.state = \"INITIAL\";\n this.buffer = \"\";\n this.decoder = decoder || new TextDecoder(\"utf8\");\n this.regionList = [];\n};\n\nWebVTT.Parser.prototype = {\n // If the error is a ParsingError then report it to the consumer if\n // possible. If it's not a ParsingError then throw it like normal.\n reportOrThrowError: function(e) {\n if (e instanceof ParsingError) {\n this.onparsingerror && this.onparsingerror(e);\n } else {\n throw e;\n }\n },\n parse: function (data) {\n var self = this;\n\n // If there is no data then we won't decode it, but will just try to parse\n // whatever is in buffer already. This may occur in circumstances, for\n // example when flush() is called.\n if (data) {\n // Try to decode the data that we received.\n self.buffer += self.decoder.decode(data, {stream: true});\n }\n\n function collectNextLine() {\n var buffer = self.buffer;\n var pos = 0;\n while (pos < buffer.length && buffer[pos] !== '\\r' && buffer[pos] !== '\\n') {\n ++pos;\n }\n var line = buffer.substr(0, pos);\n // Advance the buffer early in case we fail below.\n if (buffer[pos] === '\\r') {\n ++pos;\n }\n if (buffer[pos] === '\\n') {\n ++pos;\n }\n self.buffer = buffer.substr(pos);\n return line;\n }\n\n // 3.4 WebVTT region and WebVTT region settings syntax\n function parseRegion(input) {\n var settings = new Settings();\n\n parseOptions(input, function (k, v) {\n switch (k) {\n case \"id\":\n settings.set(k, v);\n break;\n case \"width\":\n settings.percent(k, v);\n break;\n case \"lines\":\n settings.integer(k, v);\n break;\n case \"regionanchor\":\n case \"viewportanchor\":\n var xy = v.split(',');\n if (xy.length !== 2) {\n break;\n }\n // We have to make sure both x and y parse, so use a temporary\n // settings object here.\n var anchor = new Settings();\n anchor.percent(\"x\", xy[0]);\n anchor.percent(\"y\", xy[1]);\n if (!anchor.has(\"x\") || !anchor.has(\"y\")) {\n break;\n }\n settings.set(k + \"X\", anchor.get(\"x\"));\n settings.set(k + \"Y\", anchor.get(\"y\"));\n break;\n case \"scroll\":\n settings.alt(k, v, [\"up\"]);\n break;\n }\n }, /=/, /\\s/);\n\n // Create the region, using default values for any values that were not\n // specified.\n if (settings.has(\"id\")) {\n var region = new (self.vttjs.VTTRegion || self.window.VTTRegion)();\n region.width = settings.get(\"width\", 100);\n region.lines = settings.get(\"lines\", 3);\n region.regionAnchorX = settings.get(\"regionanchorX\", 0);\n region.regionAnchorY = settings.get(\"regionanchorY\", 100);\n region.viewportAnchorX = settings.get(\"viewportanchorX\", 0);\n region.viewportAnchorY = settings.get(\"viewportanchorY\", 100);\n region.scroll = settings.get(\"scroll\", \"\");\n // Register the region.\n self.onregion && self.onregion(region);\n // Remember the VTTRegion for later in case we parse any VTTCues that\n // reference it.\n self.regionList.push({\n id: settings.get(\"id\"),\n region: region\n });\n }\n }\n\n // draft-pantos-http-live-streaming-20\n // https://tools.ietf.org/html/draft-pantos-http-live-streaming-20#section-3.5\n // 3.5 WebVTT\n function parseTimestampMap(input) {\n var settings = new Settings();\n\n parseOptions(input, function(k, v) {\n switch(k) {\n case \"MPEGT\":\n settings.integer(k + 'S', v);\n break;\n case \"LOCA\":\n settings.set(k + 'L', parseTimeStamp(v));\n break;\n }\n }, /[^\\d]:/, /,/);\n\n self.ontimestampmap && self.ontimestampmap({\n \"MPEGTS\": settings.get(\"MPEGTS\"),\n \"LOCAL\": settings.get(\"LOCAL\")\n });\n }\n\n // 3.2 WebVTT metadata header syntax\n function parseHeader(input) {\n if (input.match(/X-TIMESTAMP-MAP/)) {\n // This line contains HLS X-TIMESTAMP-MAP metadata\n parseOptions(input, function(k, v) {\n switch(k) {\n case \"X-TIMESTAMP-MAP\":\n parseTimestampMap(v);\n break;\n }\n }, /=/);\n } else {\n parseOptions(input, function (k, v) {\n switch (k) {\n case \"Region\":\n // 3.3 WebVTT region metadata header syntax\n parseRegion(v);\n break;\n }\n }, /:/);\n }\n\n }\n\n // 5.1 WebVTT file parsing.\n try {\n var line;\n if (self.state === \"INITIAL\") {\n // We can't start parsing until we have the first line.\n if (!/\\r\\n|\\n/.test(self.buffer)) {\n return this;\n }\n\n line = collectNextLine();\n\n var m = line.match(/^WEBVTT([ \\t].*)?$/);\n if (!m || !m[0]) {\n throw new ParsingError(ParsingError.Errors.BadSignature);\n }\n\n self.state = \"HEADER\";\n }\n\n var alreadyCollectedLine = false;\n while (self.buffer) {\n // We can't parse a line until we have the full line.\n if (!/\\r\\n|\\n/.test(self.buffer)) {\n return this;\n }\n\n if (!alreadyCollectedLine) {\n line = collectNextLine();\n } else {\n alreadyCollectedLine = false;\n }\n\n switch (self.state) {\n case \"HEADER\":\n // 13-18 - Allow a header (metadata) under the WEBVTT line.\n if (/:/.test(line)) {\n parseHeader(line);\n } else if (!line) {\n // An empty line terminates the header and starts the body (cues).\n self.state = \"ID\";\n }\n continue;\n case \"NOTE\":\n // Ignore NOTE blocks.\n if (!line) {\n self.state = \"ID\";\n }\n continue;\n case \"ID\":\n // Check for the start of NOTE blocks.\n if (/^NOTE($|[ \\t])/.test(line)) {\n self.state = \"NOTE\";\n break;\n }\n // 19-29 - Allow any number of line terminators, then initialize new cue values.\n if (!line) {\n continue;\n }\n self.cue = new (self.vttjs.VTTCue || self.window.VTTCue)(0, 0, \"\");\n // Safari still uses the old middle value and won't accept center\n try {\n self.cue.align = \"center\";\n } catch (e) {\n self.cue.align = \"middle\";\n }\n self.state = \"CUE\";\n // 30-39 - Check if self line contains an optional identifier or timing data.\n if (line.indexOf(\"-->\") === -1) {\n self.cue.id = line;\n continue;\n }\n // Process line as start of a cue.\n /*falls through*/\n case \"CUE\":\n // 40 - Collect cue timings and settings.\n try {\n parseCue(line, self.cue, self.regionList);\n } catch (e) {\n self.reportOrThrowError(e);\n // In case of an error ignore rest of the cue.\n self.cue = null;\n self.state = \"BADCUE\";\n continue;\n }\n self.state = \"CUETEXT\";\n continue;\n case \"CUETEXT\":\n var hasSubstring = line.indexOf(\"-->\") !== -1;\n // 34 - If we have an empty line then report the cue.\n // 35 - If we have the special substring '-->' then report the cue,\n // but do not collect the line as we need to process the current\n // one as a new cue.\n if (!line || hasSubstring && (alreadyCollectedLine = true)) {\n // We are done parsing self cue.\n self.oncue && self.oncue(self.cue);\n self.cue = null;\n self.state = \"ID\";\n continue;\n }\n if (self.cue.text) {\n self.cue.text += \"\\n\";\n }\n self.cue.text += line.replace(/\\u2028/g, '\\n').replace(/u2029/g, '\\n');\n continue;\n case \"BADCUE\": // BADCUE\n // 54-62 - Collect and discard the remaining cue.\n if (!line) {\n self.state = \"ID\";\n }\n continue;\n }\n }\n } catch (e) {\n self.reportOrThrowError(e);\n\n // If we are currently parsing a cue, report what we have.\n if (self.state === \"CUETEXT\" && self.cue && self.oncue) {\n self.oncue(self.cue);\n }\n self.cue = null;\n // Enter BADWEBVTT state if header was not parsed correctly otherwise\n // another exception occurred so enter BADCUE state.\n self.state = self.state === \"INITIAL\" ? \"BADWEBVTT\" : \"BADCUE\";\n }\n return this;\n },\n flush: function () {\n var self = this;\n try {\n // Finish decoding the stream.\n self.buffer += self.decoder.decode();\n // Synthesize the end of the current cue or region.\n if (self.cue || self.state === \"HEADER\") {\n self.buffer += \"\\n\\n\";\n self.parse();\n }\n // If we've flushed, parsed, and we're still on the INITIAL state then\n // that means we don't have enough of the stream to parse the first\n // line.\n if (self.state === \"INITIAL\") {\n throw new ParsingError(ParsingError.Errors.BadSignature);\n }\n } catch(e) {\n self.reportOrThrowError(e);\n }\n self.onflush && self.onflush();\n return this;\n }\n};\n\nmodule.exports = WebVTT;\n","/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar autoKeyword = \"auto\";\nvar directionSetting = {\n \"\": 1,\n \"lr\": 1,\n \"rl\": 1\n};\nvar alignSetting = {\n \"start\": 1,\n \"center\": 1,\n \"end\": 1,\n \"left\": 1,\n \"right\": 1,\n \"auto\": 1,\n \"line-left\": 1,\n \"line-right\": 1\n};\n\nfunction findDirectionSetting(value) {\n if (typeof value !== \"string\") {\n return false;\n }\n var dir = directionSetting[value.toLowerCase()];\n return dir ? value.toLowerCase() : false;\n}\n\nfunction findAlignSetting(value) {\n if (typeof value !== \"string\") {\n return false;\n }\n var align = alignSetting[value.toLowerCase()];\n return align ? value.toLowerCase() : false;\n}\n\nfunction VTTCue(startTime, endTime, text) {\n /**\n * Shim implementation specific properties. These properties are not in\n * the spec.\n */\n\n // Lets us know when the VTTCue's data has changed in such a way that we need\n // to recompute its display state. This lets us compute its display state\n // lazily.\n this.hasBeenReset = false;\n\n /**\n * VTTCue and TextTrackCue properties\n * http://dev.w3.org/html5/webvtt/#vttcue-interface\n */\n\n var _id = \"\";\n var _pauseOnExit = false;\n var _startTime = startTime;\n var _endTime = endTime;\n var _text = text;\n var _region = null;\n var _vertical = \"\";\n var _snapToLines = true;\n var _line = \"auto\";\n var _lineAlign = \"start\";\n var _position = \"auto\";\n var _positionAlign = \"auto\";\n var _size = 100;\n var _align = \"center\";\n\n Object.defineProperties(this, {\n \"id\": {\n enumerable: true,\n get: function() {\n return _id;\n },\n set: function(value) {\n _id = \"\" + value;\n }\n },\n\n \"pauseOnExit\": {\n enumerable: true,\n get: function() {\n return _pauseOnExit;\n },\n set: function(value) {\n _pauseOnExit = !!value;\n }\n },\n\n \"startTime\": {\n enumerable: true,\n get: function() {\n return _startTime;\n },\n set: function(value) {\n if (typeof value !== \"number\") {\n throw new TypeError(\"Start time must be set to a number.\");\n }\n _startTime = value;\n this.hasBeenReset = true;\n }\n },\n\n \"endTime\": {\n enumerable: true,\n get: function() {\n return _endTime;\n },\n set: function(value) {\n if (typeof value !== \"number\") {\n throw new TypeError(\"End time must be set to a number.\");\n }\n _endTime = value;\n this.hasBeenReset = true;\n }\n },\n\n \"text\": {\n enumerable: true,\n get: function() {\n return _text;\n },\n set: function(value) {\n _text = \"\" + value;\n this.hasBeenReset = true;\n }\n },\n\n \"region\": {\n enumerable: true,\n get: function() {\n return _region;\n },\n set: function(value) {\n _region = value;\n this.hasBeenReset = true;\n }\n },\n\n \"vertical\": {\n enumerable: true,\n get: function() {\n return _vertical;\n },\n set: function(value) {\n var setting = findDirectionSetting(value);\n // Have to check for false because the setting an be an empty string.\n if (setting === false) {\n throw new SyntaxError(\"Vertical: an invalid or illegal direction string was specified.\");\n }\n _vertical = setting;\n this.hasBeenReset = true;\n }\n },\n\n \"snapToLines\": {\n enumerable: true,\n get: function() {\n return _snapToLines;\n },\n set: function(value) {\n _snapToLines = !!value;\n this.hasBeenReset = true;\n }\n },\n\n \"line\": {\n enumerable: true,\n get: function() {\n return _line;\n },\n set: function(value) {\n if (typeof value !== \"number\" && value !== autoKeyword) {\n throw new SyntaxError(\"Line: an invalid number or illegal string was specified.\");\n }\n _line = value;\n this.hasBeenReset = true;\n }\n },\n\n \"lineAlign\": {\n enumerable: true,\n get: function() {\n return _lineAlign;\n },\n set: function(value) {\n var setting = findAlignSetting(value);\n if (!setting) {\n console.warn(\"lineAlign: an invalid or illegal string was specified.\");\n } else {\n _lineAlign = setting;\n this.hasBeenReset = true;\n }\n }\n },\n\n \"position\": {\n enumerable: true,\n get: function() {\n return _position;\n },\n set: function(value) {\n if (value < 0 || value > 100) {\n throw new Error(\"Position must be between 0 and 100.\");\n }\n _position = value;\n this.hasBeenReset = true;\n }\n },\n\n \"positionAlign\": {\n enumerable: true,\n get: function() {\n return _positionAlign;\n },\n set: function(value) {\n var setting = findAlignSetting(value);\n if (!setting) {\n console.warn(\"positionAlign: an invalid or illegal string was specified.\");\n } else {\n _positionAlign = setting;\n this.hasBeenReset = true;\n }\n }\n },\n\n \"size\": {\n enumerable: true,\n get: function() {\n return _size;\n },\n set: function(value) {\n if (value < 0 || value > 100) {\n throw new Error(\"Size must be between 0 and 100.\");\n }\n _size = value;\n this.hasBeenReset = true;\n }\n },\n\n \"align\": {\n enumerable: true,\n get: function() {\n return _align;\n },\n set: function(value) {\n var setting = findAlignSetting(value);\n if (!setting) {\n throw new SyntaxError(\"align: an invalid or illegal alignment string was specified.\");\n }\n _align = setting;\n this.hasBeenReset = true;\n }\n }\n });\n\n /**\n * Other spec defined properties\n */\n\n // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#text-track-cue-display-state\n this.displayState = undefined;\n}\n\n/**\n * VTTCue methods\n */\n\nVTTCue.prototype.getCueAsHTML = function() {\n // Assume WebVTT.convertCueToDOMTree is on the global.\n return WebVTT.convertCueToDOMTree(window, this.text);\n};\n\nmodule.exports = VTTCue;\n","/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar scrollSetting = {\n \"\": true,\n \"up\": true\n};\n\nfunction findScrollSetting(value) {\n if (typeof value !== \"string\") {\n return false;\n }\n var scroll = scrollSetting[value.toLowerCase()];\n return scroll ? value.toLowerCase() : false;\n}\n\nfunction isValidPercentValue(value) {\n return typeof value === \"number\" && (value >= 0 && value <= 100);\n}\n\n// VTTRegion shim http://dev.w3.org/html5/webvtt/#vttregion-interface\nfunction VTTRegion() {\n var _width = 100;\n var _lines = 3;\n var _regionAnchorX = 0;\n var _regionAnchorY = 100;\n var _viewportAnchorX = 0;\n var _viewportAnchorY = 100;\n var _scroll = \"\";\n\n Object.defineProperties(this, {\n \"width\": {\n enumerable: true,\n get: function() {\n return _width;\n },\n set: function(value) {\n if (!isValidPercentValue(value)) {\n throw new Error(\"Width must be between 0 and 100.\");\n }\n _width = value;\n }\n },\n \"lines\": {\n enumerable: true,\n get: function() {\n return _lines;\n },\n set: function(value) {\n if (typeof value !== \"number\") {\n throw new TypeError(\"Lines must be set to a number.\");\n }\n _lines = value;\n }\n },\n \"regionAnchorY\": {\n enumerable: true,\n get: function() {\n return _regionAnchorY;\n },\n set: function(value) {\n if (!isValidPercentValue(value)) {\n throw new Error(\"RegionAnchorX must be between 0 and 100.\");\n }\n _regionAnchorY = value;\n }\n },\n \"regionAnchorX\": {\n enumerable: true,\n get: function() {\n return _regionAnchorX;\n },\n set: function(value) {\n if(!isValidPercentValue(value)) {\n throw new Error(\"RegionAnchorY must be between 0 and 100.\");\n }\n _regionAnchorX = value;\n }\n },\n \"viewportAnchorY\": {\n enumerable: true,\n get: function() {\n return _viewportAnchorY;\n },\n set: function(value) {\n if (!isValidPercentValue(value)) {\n throw new Error(\"ViewportAnchorY must be between 0 and 100.\");\n }\n _viewportAnchorY = value;\n }\n },\n \"viewportAnchorX\": {\n enumerable: true,\n get: function() {\n return _viewportAnchorX;\n },\n set: function(value) {\n if (!isValidPercentValue(value)) {\n throw new Error(\"ViewportAnchorX must be between 0 and 100.\");\n }\n _viewportAnchorX = value;\n }\n },\n \"scroll\": {\n enumerable: true,\n get: function() {\n return _scroll;\n },\n set: function(value) {\n var setting = findScrollSetting(value);\n // Have to check for false as an empty string is a legal value.\n if (setting === false) {\n console.warn(\"Scroll: an invalid or illegal string was specified.\");\n } else {\n _scroll = setting;\n }\n }\n }\n });\n}\n\nmodule.exports = VTTRegion;\n","/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Default exports for Node. Export the extended versions of VTTCue and\n// VTTRegion in Node since we likely want the capability to convert back and\n// forth between JSON. If we don't then it's not that big of a deal since we're\n// off browser.\n\nvar window = require('global/window');\n\nvar vttjs = module.exports = {\n WebVTT: require(\"./vtt.js\"),\n VTTCue: require(\"./vttcue.js\"),\n VTTRegion: require(\"./vttregion.js\")\n};\n\nwindow.vttjs = vttjs;\nwindow.WebVTT = vttjs.WebVTT;\n\nvar cueShim = vttjs.VTTCue;\nvar regionShim = vttjs.VTTRegion;\nvar nativeVTTCue = window.VTTCue;\nvar nativeVTTRegion = window.VTTRegion;\n\nvttjs.shim = function() {\n window.VTTCue = cueShim;\n window.VTTRegion = regionShim;\n};\n\nvttjs.restore = function() {\n window.VTTCue = nativeVTTCue;\n window.VTTRegion = nativeVTTRegion;\n};\n\nif (!window.VTTCue) {\n vttjs.shim();\n}\n","import window from 'global/window';\nvar DEFAULT_LOCATION = 'https://example.com';\n\nvar resolveUrl = function resolveUrl(baseUrl, relativeUrl) {\n // return early if we don't need to resolve\n if (/^[a-z]+:/i.test(relativeUrl)) {\n return relativeUrl;\n } // if baseUrl is a data URI, ignore it and resolve everything relative to window.location\n\n\n if (/^data:/.test(baseUrl)) {\n baseUrl = window.location && window.location.href || '';\n }\n\n var protocolLess = /^\\/\\//.test(baseUrl); // remove location if window.location isn't available (i.e. we're in node)\n // and if baseUrl isn't an absolute url\n\n var removeLocation = !window.location && !/\\/\\//i.test(baseUrl); // if the base URL is relative then combine with the current location\n\n baseUrl = new window.URL(baseUrl, window.location || DEFAULT_LOCATION);\n var newUrl = new URL(relativeUrl, baseUrl); // if we're a protocol-less url, remove the protocol\n // and if we're location-less, remove the location\n // otherwise, return the url unmodified\n\n if (removeLocation) {\n return newUrl.href.slice(DEFAULT_LOCATION.length);\n } else if (protocolLess) {\n return newUrl.href.slice(newUrl.protocol.length);\n }\n\n return newUrl.href;\n};\n\nexport default resolveUrl;","/**\n * @file stream.js\n */\n\n/**\n * A lightweight readable stream implemention that handles event dispatching.\n *\n * @class Stream\n */\nvar Stream = /*#__PURE__*/function () {\n function Stream() {\n this.listeners = {};\n }\n /**\n * Add a listener for a specified event type.\n *\n * @param {string} type the event name\n * @param {Function} listener the callback to be invoked when an event of\n * the specified type occurs\n */\n\n\n var _proto = Stream.prototype;\n\n _proto.on = function on(type, listener) {\n if (!this.listeners[type]) {\n this.listeners[type] = [];\n }\n\n this.listeners[type].push(listener);\n }\n /**\n * Remove a listener for a specified event type.\n *\n * @param {string} type the event name\n * @param {Function} listener a function previously registered for this\n * type of event through `on`\n * @return {boolean} if we could turn it off or not\n */\n ;\n\n _proto.off = function off(type, listener) {\n if (!this.listeners[type]) {\n return false;\n }\n\n var index = this.listeners[type].indexOf(listener); // TODO: which is better?\n // In Video.js we slice listener functions\n // on trigger so that it does not mess up the order\n // while we loop through.\n //\n // Here we slice on off so that the loop in trigger\n // can continue using it's old reference to loop without\n // messing up the order.\n\n this.listeners[type] = this.listeners[type].slice(0);\n this.listeners[type].splice(index, 1);\n return index > -1;\n }\n /**\n * Trigger an event of the specified type on this stream. Any additional\n * arguments to this function are passed as parameters to event listeners.\n *\n * @param {string} type the event name\n */\n ;\n\n _proto.trigger = function trigger(type) {\n var callbacks = this.listeners[type];\n\n if (!callbacks) {\n return;\n } // Slicing the arguments on every invocation of this method\n // can add a significant amount of overhead. Avoid the\n // intermediate object creation for the common case of a\n // single callback argument\n\n\n if (arguments.length === 2) {\n var length = callbacks.length;\n\n for (var i = 0; i < length; ++i) {\n callbacks[i].call(this, arguments[1]);\n }\n } else {\n var args = Array.prototype.slice.call(arguments, 1);\n var _length = callbacks.length;\n\n for (var _i = 0; _i < _length; ++_i) {\n callbacks[_i].apply(this, args);\n }\n }\n }\n /**\n * Destroys the stream and cleans up.\n */\n ;\n\n _proto.dispose = function dispose() {\n this.listeners = {};\n }\n /**\n * Forwards all `data` events on this stream to the destination stream. The\n * destination stream should provide a method `push` to receive the data\n * events as they arrive.\n *\n * @param {Stream} destination the stream that will receive all `data` events\n * @see http://nodejs.org/api/stream.html#stream_readable_pipe_destination_options\n */\n ;\n\n _proto.pipe = function pipe(destination) {\n this.on('data', function (data) {\n destination.push(data);\n });\n };\n\n return Stream;\n}();\n\nexport { Stream as default };","import window from 'global/window';\n\nvar atob = function atob(s) {\n return window.atob ? window.atob(s) : Buffer.from(s, 'base64').toString('binary');\n};\n\nexport default function decodeB64ToUint8Array(b64Text) {\n var decodedString = atob(b64Text);\n var array = new Uint8Array(decodedString.length);\n\n for (var i = 0; i < decodedString.length; i++) {\n array[i] = decodedString.charCodeAt(i);\n }\n\n return array;\n}","/*! @name m3u8-parser @version 7.2.0 @license Apache-2.0 */\nimport Stream from '@videojs/vhs-utils/es/stream.js';\nimport _extends from '@babel/runtime/helpers/extends';\nimport decodeB64ToUint8Array from '@videojs/vhs-utils/es/decode-b64-to-uint8-array.js';\n\n/**\n * @file m3u8/line-stream.js\n */\n/**\n * A stream that buffers string input and generates a `data` event for each\n * line.\n *\n * @class LineStream\n * @extends Stream\n */\n\nclass LineStream extends Stream {\n constructor() {\n super();\n this.buffer = '';\n }\n /**\n * Add new data to be parsed.\n *\n * @param {string} data the text to process\n */\n\n\n push(data) {\n let nextNewline;\n this.buffer += data;\n nextNewline = this.buffer.indexOf('\\n');\n\n for (; nextNewline > -1; nextNewline = this.buffer.indexOf('\\n')) {\n this.trigger('data', this.buffer.substring(0, nextNewline));\n this.buffer = this.buffer.substring(nextNewline + 1);\n }\n }\n\n}\n\nconst TAB = String.fromCharCode(0x09);\n\nconst parseByterange = function (byterangeString) {\n // optionally match and capture 0+ digits before `@`\n // optionally match and capture 0+ digits after `@`\n const match = /([0-9.]*)?@?([0-9.]*)?/.exec(byterangeString || '');\n const result = {};\n\n if (match[1]) {\n result.length = parseInt(match[1], 10);\n }\n\n if (match[2]) {\n result.offset = parseInt(match[2], 10);\n }\n\n return result;\n};\n/**\n * \"forgiving\" attribute list psuedo-grammar:\n * attributes -> keyvalue (',' keyvalue)*\n * keyvalue -> key '=' value\n * key -> [^=]*\n * value -> '\"' [^\"]* '\"' | [^,]*\n */\n\n\nconst attributeSeparator = function () {\n const key = '[^=]*';\n const value = '\"[^\"]*\"|[^,]*';\n const keyvalue = '(?:' + key + ')=(?:' + value + ')';\n return new RegExp('(?:^|,)(' + keyvalue + ')');\n};\n/**\n * Parse attributes from a line given the separator\n *\n * @param {string} attributes the attribute line to parse\n */\n\n\nconst parseAttributes = function (attributes) {\n const result = {};\n\n if (!attributes) {\n return result;\n } // split the string using attributes as the separator\n\n\n const attrs = attributes.split(attributeSeparator());\n let i = attrs.length;\n let attr;\n\n while (i--) {\n // filter out unmatched portions of the string\n if (attrs[i] === '') {\n continue;\n } // split the key and value\n\n\n attr = /([^=]*)=(.*)/.exec(attrs[i]).slice(1); // trim whitespace and remove optional quotes around the value\n\n attr[0] = attr[0].replace(/^\\s+|\\s+$/g, '');\n attr[1] = attr[1].replace(/^\\s+|\\s+$/g, '');\n attr[1] = attr[1].replace(/^['\"](.*)['\"]$/g, '$1');\n result[attr[0]] = attr[1];\n }\n\n return result;\n};\n/**\n * Converts a string into a resolution object\n *\n * @param {string} resolution a string such as 3840x2160\n *\n * @return {Object} An object representing the resolution\n *\n */\n\n\nconst parseResolution = resolution => {\n const split = resolution.split('x');\n const result = {};\n\n if (split[0]) {\n result.width = parseInt(split[0], 10);\n }\n\n if (split[1]) {\n result.height = parseInt(split[1], 10);\n }\n\n return result;\n};\n/**\n * A line-level M3U8 parser event stream. It expects to receive input one\n * line at a time and performs a context-free parse of its contents. A stream\n * interpretation of a manifest can be useful if the manifest is expected to\n * be too large to fit comfortably into memory or the entirety of the input\n * is not immediately available. Otherwise, it's probably much easier to work\n * with a regular `Parser` object.\n *\n * Produces `data` events with an object that captures the parser's\n * interpretation of the input. That object has a property `tag` that is one\n * of `uri`, `comment`, or `tag`. URIs only have a single additional\n * property, `line`, which captures the entirety of the input without\n * interpretation. Comments similarly have a single additional property\n * `text` which is the input without the leading `#`.\n *\n * Tags always have a property `tagType` which is the lower-cased version of\n * the M3U8 directive without the `#EXT` or `#EXT-X-` prefix. For instance,\n * `#EXT-X-MEDIA-SEQUENCE` becomes `media-sequence` when parsed. Unrecognized\n * tags are given the tag type `unknown` and a single additional property\n * `data` with the remainder of the input.\n *\n * @class ParseStream\n * @extends Stream\n */\n\n\nclass ParseStream extends Stream {\n constructor() {\n super();\n this.customParsers = [];\n this.tagMappers = [];\n }\n /**\n * Parses an additional line of input.\n *\n * @param {string} line a single line of an M3U8 file to parse\n */\n\n\n push(line) {\n let match;\n let event; // strip whitespace\n\n line = line.trim();\n\n if (line.length === 0) {\n // ignore empty lines\n return;\n } // URIs\n\n\n if (line[0] !== '#') {\n this.trigger('data', {\n type: 'uri',\n uri: line\n });\n return;\n } // map tags\n\n\n const newLines = this.tagMappers.reduce((acc, mapper) => {\n const mappedLine = mapper(line); // skip if unchanged\n\n if (mappedLine === line) {\n return acc;\n }\n\n return acc.concat([mappedLine]);\n }, [line]);\n newLines.forEach(newLine => {\n for (let i = 0; i < this.customParsers.length; i++) {\n if (this.customParsers[i].call(this, newLine)) {\n return;\n }\n } // Comments\n\n\n if (newLine.indexOf('#EXT') !== 0) {\n this.trigger('data', {\n type: 'comment',\n text: newLine.slice(1)\n });\n return;\n } // strip off any carriage returns here so the regex matching\n // doesn't have to account for them.\n\n\n newLine = newLine.replace('\\r', ''); // Tags\n\n match = /^#EXTM3U/.exec(newLine);\n\n if (match) {\n this.trigger('data', {\n type: 'tag',\n tagType: 'm3u'\n });\n return;\n }\n\n match = /^#EXTINF:([0-9\\.]*)?,?(.*)?$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'inf'\n };\n\n if (match[1]) {\n event.duration = parseFloat(match[1]);\n }\n\n if (match[2]) {\n event.title = match[2];\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-TARGETDURATION:([0-9.]*)?/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'targetduration'\n };\n\n if (match[1]) {\n event.duration = parseInt(match[1], 10);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-VERSION:([0-9.]*)?/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'version'\n };\n\n if (match[1]) {\n event.version = parseInt(match[1], 10);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-MEDIA-SEQUENCE:(\\-?[0-9.]*)?/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'media-sequence'\n };\n\n if (match[1]) {\n event.number = parseInt(match[1], 10);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-DISCONTINUITY-SEQUENCE:(\\-?[0-9.]*)?/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'discontinuity-sequence'\n };\n\n if (match[1]) {\n event.number = parseInt(match[1], 10);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-PLAYLIST-TYPE:(.*)?$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'playlist-type'\n };\n\n if (match[1]) {\n event.playlistType = match[1];\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-BYTERANGE:(.*)?$/.exec(newLine);\n\n if (match) {\n event = _extends(parseByterange(match[1]), {\n type: 'tag',\n tagType: 'byterange'\n });\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-ALLOW-CACHE:(YES|NO)?/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'allow-cache'\n };\n\n if (match[1]) {\n event.allowed = !/NO/.test(match[1]);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-MAP:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'map'\n };\n\n if (match[1]) {\n const attributes = parseAttributes(match[1]);\n\n if (attributes.URI) {\n event.uri = attributes.URI;\n }\n\n if (attributes.BYTERANGE) {\n event.byterange = parseByterange(attributes.BYTERANGE);\n }\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-STREAM-INF:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'stream-inf'\n };\n\n if (match[1]) {\n event.attributes = parseAttributes(match[1]);\n\n if (event.attributes.RESOLUTION) {\n event.attributes.RESOLUTION = parseResolution(event.attributes.RESOLUTION);\n }\n\n if (event.attributes.BANDWIDTH) {\n event.attributes.BANDWIDTH = parseInt(event.attributes.BANDWIDTH, 10);\n }\n\n if (event.attributes['FRAME-RATE']) {\n event.attributes['FRAME-RATE'] = parseFloat(event.attributes['FRAME-RATE']);\n }\n\n if (event.attributes['PROGRAM-ID']) {\n event.attributes['PROGRAM-ID'] = parseInt(event.attributes['PROGRAM-ID'], 10);\n }\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-MEDIA:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'media'\n };\n\n if (match[1]) {\n event.attributes = parseAttributes(match[1]);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-ENDLIST/.exec(newLine);\n\n if (match) {\n this.trigger('data', {\n type: 'tag',\n tagType: 'endlist'\n });\n return;\n }\n\n match = /^#EXT-X-DISCONTINUITY/.exec(newLine);\n\n if (match) {\n this.trigger('data', {\n type: 'tag',\n tagType: 'discontinuity'\n });\n return;\n }\n\n match = /^#EXT-X-PROGRAM-DATE-TIME:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'program-date-time'\n };\n\n if (match[1]) {\n event.dateTimeString = match[1];\n event.dateTimeObject = new Date(match[1]);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-KEY:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'key'\n };\n\n if (match[1]) {\n event.attributes = parseAttributes(match[1]); // parse the IV string into a Uint32Array\n\n if (event.attributes.IV) {\n if (event.attributes.IV.substring(0, 2).toLowerCase() === '0x') {\n event.attributes.IV = event.attributes.IV.substring(2);\n }\n\n event.attributes.IV = event.attributes.IV.match(/.{8}/g);\n event.attributes.IV[0] = parseInt(event.attributes.IV[0], 16);\n event.attributes.IV[1] = parseInt(event.attributes.IV[1], 16);\n event.attributes.IV[2] = parseInt(event.attributes.IV[2], 16);\n event.attributes.IV[3] = parseInt(event.attributes.IV[3], 16);\n event.attributes.IV = new Uint32Array(event.attributes.IV);\n }\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-START:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'start'\n };\n\n if (match[1]) {\n event.attributes = parseAttributes(match[1]);\n event.attributes['TIME-OFFSET'] = parseFloat(event.attributes['TIME-OFFSET']);\n event.attributes.PRECISE = /YES/.test(event.attributes.PRECISE);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-CUE-OUT-CONT:(.*)?$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'cue-out-cont'\n };\n\n if (match[1]) {\n event.data = match[1];\n } else {\n event.data = '';\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-CUE-OUT:(.*)?$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'cue-out'\n };\n\n if (match[1]) {\n event.data = match[1];\n } else {\n event.data = '';\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-CUE-IN:?(.*)?$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'cue-in'\n };\n\n if (match[1]) {\n event.data = match[1];\n } else {\n event.data = '';\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-SKIP:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'skip'\n };\n event.attributes = parseAttributes(match[1]);\n\n if (event.attributes.hasOwnProperty('SKIPPED-SEGMENTS')) {\n event.attributes['SKIPPED-SEGMENTS'] = parseInt(event.attributes['SKIPPED-SEGMENTS'], 10);\n }\n\n if (event.attributes.hasOwnProperty('RECENTLY-REMOVED-DATERANGES')) {\n event.attributes['RECENTLY-REMOVED-DATERANGES'] = event.attributes['RECENTLY-REMOVED-DATERANGES'].split(TAB);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-PART:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'part'\n };\n event.attributes = parseAttributes(match[1]);\n ['DURATION'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = parseFloat(event.attributes[key]);\n }\n });\n ['INDEPENDENT', 'GAP'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = /YES/.test(event.attributes[key]);\n }\n });\n\n if (event.attributes.hasOwnProperty('BYTERANGE')) {\n event.attributes.byterange = parseByterange(event.attributes.BYTERANGE);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-SERVER-CONTROL:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'server-control'\n };\n event.attributes = parseAttributes(match[1]);\n ['CAN-SKIP-UNTIL', 'PART-HOLD-BACK', 'HOLD-BACK'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = parseFloat(event.attributes[key]);\n }\n });\n ['CAN-SKIP-DATERANGES', 'CAN-BLOCK-RELOAD'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = /YES/.test(event.attributes[key]);\n }\n });\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-PART-INF:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'part-inf'\n };\n event.attributes = parseAttributes(match[1]);\n ['PART-TARGET'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = parseFloat(event.attributes[key]);\n }\n });\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-PRELOAD-HINT:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'preload-hint'\n };\n event.attributes = parseAttributes(match[1]);\n ['BYTERANGE-START', 'BYTERANGE-LENGTH'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = parseInt(event.attributes[key], 10);\n const subkey = key === 'BYTERANGE-LENGTH' ? 'length' : 'offset';\n event.attributes.byterange = event.attributes.byterange || {};\n event.attributes.byterange[subkey] = event.attributes[key]; // only keep the parsed byterange object.\n\n delete event.attributes[key];\n }\n });\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-RENDITION-REPORT:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'rendition-report'\n };\n event.attributes = parseAttributes(match[1]);\n ['LAST-MSN', 'LAST-PART'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = parseInt(event.attributes[key], 10);\n }\n });\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-DATERANGE:(.*)$/.exec(newLine);\n\n if (match && match[1]) {\n event = {\n type: 'tag',\n tagType: 'daterange'\n };\n event.attributes = parseAttributes(match[1]);\n ['ID', 'CLASS'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = String(event.attributes[key]);\n }\n });\n ['START-DATE', 'END-DATE'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = new Date(event.attributes[key]);\n }\n });\n ['DURATION', 'PLANNED-DURATION'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = parseFloat(event.attributes[key]);\n }\n });\n ['END-ON-NEXT'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = /YES/i.test(event.attributes[key]);\n }\n });\n ['SCTE35-CMD', ' SCTE35-OUT', 'SCTE35-IN'].forEach(function (key) {\n if (event.attributes.hasOwnProperty(key)) {\n event.attributes[key] = event.attributes[key].toString(16);\n }\n });\n const clientAttributePattern = /^X-([A-Z]+-)+[A-Z]+$/;\n\n for (const key in event.attributes) {\n if (!clientAttributePattern.test(key)) {\n continue;\n }\n\n const isHexaDecimal = /[0-9A-Fa-f]{6}/g.test(event.attributes[key]);\n const isDecimalFloating = /^\\d+(\\.\\d+)?$/.test(event.attributes[key]);\n event.attributes[key] = isHexaDecimal ? event.attributes[key].toString(16) : isDecimalFloating ? parseFloat(event.attributes[key]) : String(event.attributes[key]);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-INDEPENDENT-SEGMENTS/.exec(newLine);\n\n if (match) {\n this.trigger('data', {\n type: 'tag',\n tagType: 'independent-segments'\n });\n return;\n }\n\n match = /^#EXT-X-I-FRAMES-ONLY/.exec(newLine);\n\n if (match) {\n this.trigger('data', {\n type: 'tag',\n tagType: 'i-frames-only'\n });\n return;\n }\n\n match = /^#EXT-X-CONTENT-STEERING:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'content-steering'\n };\n event.attributes = parseAttributes(match[1]);\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-I-FRAME-STREAM-INF:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'i-frame-playlist'\n };\n event.attributes = parseAttributes(match[1]);\n\n if (event.attributes.URI) {\n event.uri = event.attributes.URI;\n }\n\n if (event.attributes.BANDWIDTH) {\n event.attributes.BANDWIDTH = parseInt(event.attributes.BANDWIDTH, 10);\n }\n\n if (event.attributes.RESOLUTION) {\n event.attributes.RESOLUTION = parseResolution(event.attributes.RESOLUTION);\n }\n\n if (event.attributes['AVERAGE-BANDWIDTH']) {\n event.attributes['AVERAGE-BANDWIDTH'] = parseInt(event.attributes['AVERAGE-BANDWIDTH'], 10);\n }\n\n if (event.attributes['FRAME-RATE']) {\n event.attributes['FRAME-RATE'] = parseFloat(event.attributes['FRAME-RATE']);\n }\n\n this.trigger('data', event);\n return;\n }\n\n match = /^#EXT-X-DEFINE:(.*)$/.exec(newLine);\n\n if (match) {\n event = {\n type: 'tag',\n tagType: 'define'\n };\n event.attributes = parseAttributes(match[1]);\n this.trigger('data', event);\n return;\n } // unknown tag type\n\n\n this.trigger('data', {\n type: 'tag',\n data: newLine.slice(4)\n });\n });\n }\n /**\n * Add a parser for custom headers\n *\n * @param {Object} options a map of options for the added parser\n * @param {RegExp} options.expression a regular expression to match the custom header\n * @param {string} options.customType the custom type to register to the output\n * @param {Function} [options.dataParser] function to parse the line into an object\n * @param {boolean} [options.segment] should tag data be attached to the segment object\n */\n\n\n addParser({\n expression,\n customType,\n dataParser,\n segment\n }) {\n if (typeof dataParser !== 'function') {\n dataParser = line => line;\n }\n\n this.customParsers.push(line => {\n const match = expression.exec(line);\n\n if (match) {\n this.trigger('data', {\n type: 'custom',\n data: dataParser(line),\n customType,\n segment\n });\n return true;\n }\n });\n }\n /**\n * Add a custom header mapper\n *\n * @param {Object} options\n * @param {RegExp} options.expression a regular expression to match the custom header\n * @param {Function} options.map function to translate tag into a different tag\n */\n\n\n addTagMapper({\n expression,\n map\n }) {\n const mapFn = line => {\n if (expression.test(line)) {\n return map(line);\n }\n\n return line;\n };\n\n this.tagMappers.push(mapFn);\n }\n\n}\n\nconst camelCase = str => str.toLowerCase().replace(/-(\\w)/g, a => a[1].toUpperCase());\n\nconst camelCaseKeys = function (attributes) {\n const result = {};\n Object.keys(attributes).forEach(function (key) {\n result[camelCase(key)] = attributes[key];\n });\n return result;\n}; // set SERVER-CONTROL hold back based upon targetDuration and partTargetDuration\n// we need this helper because defaults are based upon targetDuration and\n// partTargetDuration being set, but they may not be if SERVER-CONTROL appears before\n// target durations are set.\n\n\nconst setHoldBack = function (manifest) {\n const {\n serverControl,\n targetDuration,\n partTargetDuration\n } = manifest;\n\n if (!serverControl) {\n return;\n }\n\n const tag = '#EXT-X-SERVER-CONTROL';\n const hb = 'holdBack';\n const phb = 'partHoldBack';\n const minTargetDuration = targetDuration && targetDuration * 3;\n const minPartDuration = partTargetDuration && partTargetDuration * 2;\n\n if (targetDuration && !serverControl.hasOwnProperty(hb)) {\n serverControl[hb] = minTargetDuration;\n this.trigger('info', {\n message: `${tag} defaulting HOLD-BACK to targetDuration * 3 (${minTargetDuration}).`\n });\n }\n\n if (minTargetDuration && serverControl[hb] < minTargetDuration) {\n this.trigger('warn', {\n message: `${tag} clamping HOLD-BACK (${serverControl[hb]}) to targetDuration * 3 (${minTargetDuration})`\n });\n serverControl[hb] = minTargetDuration;\n } // default no part hold back to part target duration * 3\n\n\n if (partTargetDuration && !serverControl.hasOwnProperty(phb)) {\n serverControl[phb] = partTargetDuration * 3;\n this.trigger('info', {\n message: `${tag} defaulting PART-HOLD-BACK to partTargetDuration * 3 (${serverControl[phb]}).`\n });\n } // if part hold back is too small default it to part target duration * 2\n\n\n if (partTargetDuration && serverControl[phb] < minPartDuration) {\n this.trigger('warn', {\n message: `${tag} clamping PART-HOLD-BACK (${serverControl[phb]}) to partTargetDuration * 2 (${minPartDuration}).`\n });\n serverControl[phb] = minPartDuration;\n }\n};\n/**\n * A parser for M3U8 files. The current interpretation of the input is\n * exposed as a property `manifest` on parser objects. It's just two lines to\n * create and parse a manifest once you have the contents available as a string:\n *\n * ```js\n * var parser = new m3u8.Parser();\n * parser.push(xhr.responseText);\n * ```\n *\n * New input can later be applied to update the manifest object by calling\n * `push` again.\n *\n * The parser attempts to create a usable manifest object even if the\n * underlying input is somewhat nonsensical. It emits `info` and `warning`\n * events during the parse if it encounters input that seems invalid or\n * requires some property of the manifest object to be defaulted.\n *\n * @class Parser\n * @param {Object} [opts] Options for the constructor, needed for substitutions\n * @param {string} [opts.uri] URL to check for query params\n * @param {Object} [opts.mainDefinitions] Definitions on main playlist that can be imported\n * @extends Stream\n */\n\n\nclass Parser extends Stream {\n constructor(opts = {}) {\n super();\n this.lineStream = new LineStream();\n this.parseStream = new ParseStream();\n this.lineStream.pipe(this.parseStream);\n this.mainDefinitions = opts.mainDefinitions || {};\n this.params = new URL(opts.uri, 'https://a.com').searchParams;\n this.lastProgramDateTime = null;\n /* eslint-disable consistent-this */\n\n const self = this;\n /* eslint-enable consistent-this */\n\n const uris = [];\n let currentUri = {}; // if specified, the active EXT-X-MAP definition\n\n let currentMap; // if specified, the active decryption key\n\n let key;\n let hasParts = false;\n\n const noop = function () {};\n\n const defaultMediaGroups = {\n 'AUDIO': {},\n 'VIDEO': {},\n 'CLOSED-CAPTIONS': {},\n 'SUBTITLES': {}\n }; // This is the Widevine UUID from DASH IF IOP. The same exact string is\n // used in MPDs with Widevine encrypted streams.\n\n const widevineUuid = 'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed'; // group segments into numbered timelines delineated by discontinuities\n\n let currentTimeline = 0; // the manifest is empty until the parse stream begins delivering data\n\n this.manifest = {\n allowCache: true,\n discontinuityStarts: [],\n dateRanges: [],\n iFramePlaylists: [],\n segments: []\n }; // keep track of the last seen segment's byte range end, as segments are not required\n // to provide the offset, in which case it defaults to the next byte after the\n // previous segment\n\n let lastByterangeEnd = 0; // keep track of the last seen part's byte range end.\n\n let lastPartByterangeEnd = 0;\n const dateRangeTags = {};\n this.on('end', () => {\n // only add preloadSegment if we don't yet have a uri for it.\n // and we actually have parts/preloadHints\n if (currentUri.uri || !currentUri.parts && !currentUri.preloadHints) {\n return;\n }\n\n if (!currentUri.map && currentMap) {\n currentUri.map = currentMap;\n }\n\n if (!currentUri.key && key) {\n currentUri.key = key;\n }\n\n if (!currentUri.timeline && typeof currentTimeline === 'number') {\n currentUri.timeline = currentTimeline;\n }\n\n this.manifest.preloadSegment = currentUri;\n }); // update the manifest with the m3u8 entry from the parse stream\n\n this.parseStream.on('data', function (entry) {\n let mediaGroup;\n let rendition; // Replace variables in uris and attributes as defined in #EXT-X-DEFINE tags\n\n if (self.manifest.definitions) {\n for (const def in self.manifest.definitions) {\n if (entry.uri) {\n entry.uri = entry.uri.replace(`{$${def}}`, self.manifest.definitions[def]);\n }\n\n if (entry.attributes) {\n for (const attr in entry.attributes) {\n if (typeof entry.attributes[attr] === 'string') {\n entry.attributes[attr] = entry.attributes[attr].replace(`{$${def}}`, self.manifest.definitions[def]);\n }\n }\n }\n }\n }\n\n ({\n tag() {\n // switch based on the tag type\n (({\n version() {\n if (entry.version) {\n this.manifest.version = entry.version;\n }\n },\n\n 'allow-cache'() {\n this.manifest.allowCache = entry.allowed;\n\n if (!('allowed' in entry)) {\n this.trigger('info', {\n message: 'defaulting allowCache to YES'\n });\n this.manifest.allowCache = true;\n }\n },\n\n byterange() {\n const byterange = {};\n\n if ('length' in entry) {\n currentUri.byterange = byterange;\n byterange.length = entry.length;\n\n if (!('offset' in entry)) {\n /*\n * From the latest spec (as of this writing):\n * https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-4.3.2.2\n *\n * Same text since EXT-X-BYTERANGE's introduction in draft 7:\n * https://tools.ietf.org/html/draft-pantos-http-live-streaming-07#section-3.3.1)\n *\n * \"If o [offset] is not present, the sub-range begins at the next byte\n * following the sub-range of the previous media segment.\"\n */\n entry.offset = lastByterangeEnd;\n }\n }\n\n if ('offset' in entry) {\n currentUri.byterange = byterange;\n byterange.offset = entry.offset;\n }\n\n lastByterangeEnd = byterange.offset + byterange.length;\n },\n\n endlist() {\n this.manifest.endList = true;\n },\n\n inf() {\n if (!('mediaSequence' in this.manifest)) {\n this.manifest.mediaSequence = 0;\n this.trigger('info', {\n message: 'defaulting media sequence to zero'\n });\n }\n\n if (!('discontinuitySequence' in this.manifest)) {\n this.manifest.discontinuitySequence = 0;\n this.trigger('info', {\n message: 'defaulting discontinuity sequence to zero'\n });\n }\n\n if (entry.title) {\n currentUri.title = entry.title;\n }\n\n if (entry.duration > 0) {\n currentUri.duration = entry.duration;\n }\n\n if (entry.duration === 0) {\n currentUri.duration = 0.01;\n this.trigger('info', {\n message: 'updating zero segment duration to a small value'\n });\n }\n\n this.manifest.segments = uris;\n },\n\n key() {\n if (!entry.attributes) {\n this.trigger('warn', {\n message: 'ignoring key declaration without attribute list'\n });\n return;\n } // clear the active encryption key\n\n\n if (entry.attributes.METHOD === 'NONE') {\n key = null;\n return;\n }\n\n if (!entry.attributes.URI) {\n this.trigger('warn', {\n message: 'ignoring key declaration without URI'\n });\n return;\n }\n\n if (entry.attributes.KEYFORMAT === 'com.apple.streamingkeydelivery') {\n this.manifest.contentProtection = this.manifest.contentProtection || {}; // TODO: add full support for this.\n\n this.manifest.contentProtection['com.apple.fps.1_0'] = {\n attributes: entry.attributes\n };\n return;\n }\n\n if (entry.attributes.KEYFORMAT === 'com.microsoft.playready') {\n this.manifest.contentProtection = this.manifest.contentProtection || {}; // TODO: add full support for this.\n\n this.manifest.contentProtection['com.microsoft.playready'] = {\n uri: entry.attributes.URI\n };\n return;\n } // check if the content is encrypted for Widevine\n // Widevine/HLS spec: https://storage.googleapis.com/wvdocs/Widevine_DRM_HLS.pdf\n\n\n if (entry.attributes.KEYFORMAT === widevineUuid) {\n const VALID_METHODS = ['SAMPLE-AES', 'SAMPLE-AES-CTR', 'SAMPLE-AES-CENC'];\n\n if (VALID_METHODS.indexOf(entry.attributes.METHOD) === -1) {\n this.trigger('warn', {\n message: 'invalid key method provided for Widevine'\n });\n return;\n }\n\n if (entry.attributes.METHOD === 'SAMPLE-AES-CENC') {\n this.trigger('warn', {\n message: 'SAMPLE-AES-CENC is deprecated, please use SAMPLE-AES-CTR instead'\n });\n }\n\n if (entry.attributes.URI.substring(0, 23) !== 'data:text/plain;base64,') {\n this.trigger('warn', {\n message: 'invalid key URI provided for Widevine'\n });\n return;\n }\n\n if (!(entry.attributes.KEYID && entry.attributes.KEYID.substring(0, 2) === '0x')) {\n this.trigger('warn', {\n message: 'invalid key ID provided for Widevine'\n });\n return;\n } // if Widevine key attributes are valid, store them as `contentProtection`\n // on the manifest to emulate Widevine tag structure in a DASH mpd\n\n\n this.manifest.contentProtection = this.manifest.contentProtection || {};\n this.manifest.contentProtection['com.widevine.alpha'] = {\n attributes: {\n schemeIdUri: entry.attributes.KEYFORMAT,\n // remove '0x' from the key id string\n keyId: entry.attributes.KEYID.substring(2)\n },\n // decode the base64-encoded PSSH box\n pssh: decodeB64ToUint8Array(entry.attributes.URI.split(',')[1])\n };\n return;\n }\n\n if (!entry.attributes.METHOD) {\n this.trigger('warn', {\n message: 'defaulting key method to AES-128'\n });\n } // setup an encryption key for upcoming segments\n\n\n key = {\n method: entry.attributes.METHOD || 'AES-128',\n uri: entry.attributes.URI\n };\n\n if (typeof entry.attributes.IV !== 'undefined') {\n key.iv = entry.attributes.IV;\n }\n },\n\n 'media-sequence'() {\n if (!isFinite(entry.number)) {\n this.trigger('warn', {\n message: 'ignoring invalid media sequence: ' + entry.number\n });\n return;\n }\n\n this.manifest.mediaSequence = entry.number;\n },\n\n 'discontinuity-sequence'() {\n if (!isFinite(entry.number)) {\n this.trigger('warn', {\n message: 'ignoring invalid discontinuity sequence: ' + entry.number\n });\n return;\n }\n\n this.manifest.discontinuitySequence = entry.number;\n currentTimeline = entry.number;\n },\n\n 'playlist-type'() {\n if (!/VOD|EVENT/.test(entry.playlistType)) {\n this.trigger('warn', {\n message: 'ignoring unknown playlist type: ' + entry.playlist\n });\n return;\n }\n\n this.manifest.playlistType = entry.playlistType;\n },\n\n map() {\n currentMap = {};\n\n if (entry.uri) {\n currentMap.uri = entry.uri;\n }\n\n if (entry.byterange) {\n currentMap.byterange = entry.byterange;\n }\n\n if (key) {\n currentMap.key = key;\n }\n },\n\n 'stream-inf'() {\n this.manifest.playlists = uris;\n this.manifest.mediaGroups = this.manifest.mediaGroups || defaultMediaGroups;\n\n if (!entry.attributes) {\n this.trigger('warn', {\n message: 'ignoring empty stream-inf attributes'\n });\n return;\n }\n\n if (!currentUri.attributes) {\n currentUri.attributes = {};\n }\n\n _extends(currentUri.attributes, entry.attributes);\n },\n\n media() {\n this.manifest.mediaGroups = this.manifest.mediaGroups || defaultMediaGroups;\n\n if (!(entry.attributes && entry.attributes.TYPE && entry.attributes['GROUP-ID'] && entry.attributes.NAME)) {\n this.trigger('warn', {\n message: 'ignoring incomplete or missing media group'\n });\n return;\n } // find the media group, creating defaults as necessary\n\n\n const mediaGroupType = this.manifest.mediaGroups[entry.attributes.TYPE];\n mediaGroupType[entry.attributes['GROUP-ID']] = mediaGroupType[entry.attributes['GROUP-ID']] || {};\n mediaGroup = mediaGroupType[entry.attributes['GROUP-ID']]; // collect the rendition metadata\n\n rendition = {\n default: /yes/i.test(entry.attributes.DEFAULT)\n };\n\n if (rendition.default) {\n rendition.autoselect = true;\n } else {\n rendition.autoselect = /yes/i.test(entry.attributes.AUTOSELECT);\n }\n\n if (entry.attributes.LANGUAGE) {\n rendition.language = entry.attributes.LANGUAGE;\n }\n\n if (entry.attributes.URI) {\n rendition.uri = entry.attributes.URI;\n }\n\n if (entry.attributes['INSTREAM-ID']) {\n rendition.instreamId = entry.attributes['INSTREAM-ID'];\n }\n\n if (entry.attributes.CHARACTERISTICS) {\n rendition.characteristics = entry.attributes.CHARACTERISTICS;\n }\n\n if (entry.attributes.FORCED) {\n rendition.forced = /yes/i.test(entry.attributes.FORCED);\n } // insert the new rendition\n\n\n mediaGroup[entry.attributes.NAME] = rendition;\n },\n\n discontinuity() {\n currentTimeline += 1;\n currentUri.discontinuity = true;\n this.manifest.discontinuityStarts.push(uris.length);\n },\n\n 'program-date-time'() {\n if (typeof this.manifest.dateTimeString === 'undefined') {\n // PROGRAM-DATE-TIME is a media-segment tag, but for backwards\n // compatibility, we add the first occurence of the PROGRAM-DATE-TIME tag\n // to the manifest object\n // TODO: Consider removing this in future major version\n this.manifest.dateTimeString = entry.dateTimeString;\n this.manifest.dateTimeObject = entry.dateTimeObject;\n }\n\n currentUri.dateTimeString = entry.dateTimeString;\n currentUri.dateTimeObject = entry.dateTimeObject;\n const {\n lastProgramDateTime\n } = this;\n this.lastProgramDateTime = new Date(entry.dateTimeString).getTime(); // We should extrapolate Program Date Time backward only during first program date time occurrence.\n // Once we have at least one program date time point, we can always extrapolate it forward using lastProgramDateTime reference.\n\n if (lastProgramDateTime === null) {\n // Extrapolate Program Date Time backward\n // Since it is first program date time occurrence we're assuming that\n // all this.manifest.segments have no program date time info\n this.manifest.segments.reduceRight((programDateTime, segment) => {\n segment.programDateTime = programDateTime - segment.duration * 1000;\n return segment.programDateTime;\n }, this.lastProgramDateTime);\n }\n },\n\n targetduration() {\n if (!isFinite(entry.duration) || entry.duration < 0) {\n this.trigger('warn', {\n message: 'ignoring invalid target duration: ' + entry.duration\n });\n return;\n }\n\n this.manifest.targetDuration = entry.duration;\n setHoldBack.call(this, this.manifest);\n },\n\n start() {\n if (!entry.attributes || isNaN(entry.attributes['TIME-OFFSET'])) {\n this.trigger('warn', {\n message: 'ignoring start declaration without appropriate attribute list'\n });\n return;\n }\n\n this.manifest.start = {\n timeOffset: entry.attributes['TIME-OFFSET'],\n precise: entry.attributes.PRECISE\n };\n },\n\n 'cue-out'() {\n currentUri.cueOut = entry.data;\n },\n\n 'cue-out-cont'() {\n currentUri.cueOutCont = entry.data;\n },\n\n 'cue-in'() {\n currentUri.cueIn = entry.data;\n },\n\n 'skip'() {\n this.manifest.skip = camelCaseKeys(entry.attributes);\n this.warnOnMissingAttributes_('#EXT-X-SKIP', entry.attributes, ['SKIPPED-SEGMENTS']);\n },\n\n 'part'() {\n hasParts = true; // parts are always specifed before a segment\n\n const segmentIndex = this.manifest.segments.length;\n const part = camelCaseKeys(entry.attributes);\n currentUri.parts = currentUri.parts || [];\n currentUri.parts.push(part);\n\n if (part.byterange) {\n if (!part.byterange.hasOwnProperty('offset')) {\n part.byterange.offset = lastPartByterangeEnd;\n }\n\n lastPartByterangeEnd = part.byterange.offset + part.byterange.length;\n }\n\n const partIndex = currentUri.parts.length - 1;\n this.warnOnMissingAttributes_(`#EXT-X-PART #${partIndex} for segment #${segmentIndex}`, entry.attributes, ['URI', 'DURATION']);\n\n if (this.manifest.renditionReports) {\n this.manifest.renditionReports.forEach((r, i) => {\n if (!r.hasOwnProperty('lastPart')) {\n this.trigger('warn', {\n message: `#EXT-X-RENDITION-REPORT #${i} lacks required attribute(s): LAST-PART`\n });\n }\n });\n }\n },\n\n 'server-control'() {\n const attrs = this.manifest.serverControl = camelCaseKeys(entry.attributes);\n\n if (!attrs.hasOwnProperty('canBlockReload')) {\n attrs.canBlockReload = false;\n this.trigger('info', {\n message: '#EXT-X-SERVER-CONTROL defaulting CAN-BLOCK-RELOAD to false'\n });\n }\n\n setHoldBack.call(this, this.manifest);\n\n if (attrs.canSkipDateranges && !attrs.hasOwnProperty('canSkipUntil')) {\n this.trigger('warn', {\n message: '#EXT-X-SERVER-CONTROL lacks required attribute CAN-SKIP-UNTIL which is required when CAN-SKIP-DATERANGES is set'\n });\n }\n },\n\n 'preload-hint'() {\n // parts are always specifed before a segment\n const segmentIndex = this.manifest.segments.length;\n const hint = camelCaseKeys(entry.attributes);\n const isPart = hint.type && hint.type === 'PART';\n currentUri.preloadHints = currentUri.preloadHints || [];\n currentUri.preloadHints.push(hint);\n\n if (hint.byterange) {\n if (!hint.byterange.hasOwnProperty('offset')) {\n // use last part byterange end or zero if not a part.\n hint.byterange.offset = isPart ? lastPartByterangeEnd : 0;\n\n if (isPart) {\n lastPartByterangeEnd = hint.byterange.offset + hint.byterange.length;\n }\n }\n }\n\n const index = currentUri.preloadHints.length - 1;\n this.warnOnMissingAttributes_(`#EXT-X-PRELOAD-HINT #${index} for segment #${segmentIndex}`, entry.attributes, ['TYPE', 'URI']);\n\n if (!hint.type) {\n return;\n } // search through all preload hints except for the current one for\n // a duplicate type.\n\n\n for (let i = 0; i < currentUri.preloadHints.length - 1; i++) {\n const otherHint = currentUri.preloadHints[i];\n\n if (!otherHint.type) {\n continue;\n }\n\n if (otherHint.type === hint.type) {\n this.trigger('warn', {\n message: `#EXT-X-PRELOAD-HINT #${index} for segment #${segmentIndex} has the same TYPE ${hint.type} as preload hint #${i}`\n });\n }\n }\n },\n\n 'rendition-report'() {\n const report = camelCaseKeys(entry.attributes);\n this.manifest.renditionReports = this.manifest.renditionReports || [];\n this.manifest.renditionReports.push(report);\n const index = this.manifest.renditionReports.length - 1;\n const required = ['LAST-MSN', 'URI'];\n\n if (hasParts) {\n required.push('LAST-PART');\n }\n\n this.warnOnMissingAttributes_(`#EXT-X-RENDITION-REPORT #${index}`, entry.attributes, required);\n },\n\n 'part-inf'() {\n this.manifest.partInf = camelCaseKeys(entry.attributes);\n this.warnOnMissingAttributes_('#EXT-X-PART-INF', entry.attributes, ['PART-TARGET']);\n\n if (this.manifest.partInf.partTarget) {\n this.manifest.partTargetDuration = this.manifest.partInf.partTarget;\n }\n\n setHoldBack.call(this, this.manifest);\n },\n\n 'daterange'() {\n this.manifest.dateRanges.push(camelCaseKeys(entry.attributes));\n const index = this.manifest.dateRanges.length - 1;\n this.warnOnMissingAttributes_(`#EXT-X-DATERANGE #${index}`, entry.attributes, ['ID', 'START-DATE']);\n const dateRange = this.manifest.dateRanges[index];\n\n if (dateRange.endDate && dateRange.startDate && new Date(dateRange.endDate) < new Date(dateRange.startDate)) {\n this.trigger('warn', {\n message: 'EXT-X-DATERANGE END-DATE must be equal to or later than the value of the START-DATE'\n });\n }\n\n if (dateRange.duration && dateRange.duration < 0) {\n this.trigger('warn', {\n message: 'EXT-X-DATERANGE DURATION must not be negative'\n });\n }\n\n if (dateRange.plannedDuration && dateRange.plannedDuration < 0) {\n this.trigger('warn', {\n message: 'EXT-X-DATERANGE PLANNED-DURATION must not be negative'\n });\n }\n\n const endOnNextYes = !!dateRange.endOnNext;\n\n if (endOnNextYes && !dateRange.class) {\n this.trigger('warn', {\n message: 'EXT-X-DATERANGE with an END-ON-NEXT=YES attribute must have a CLASS attribute'\n });\n }\n\n if (endOnNextYes && (dateRange.duration || dateRange.endDate)) {\n this.trigger('warn', {\n message: 'EXT-X-DATERANGE with an END-ON-NEXT=YES attribute must not contain DURATION or END-DATE attributes'\n });\n }\n\n if (dateRange.duration && dateRange.endDate) {\n const startDate = dateRange.startDate;\n const newDateInSeconds = startDate.getTime() + dateRange.duration * 1000;\n this.manifest.dateRanges[index].endDate = new Date(newDateInSeconds);\n }\n\n if (!dateRangeTags[dateRange.id]) {\n dateRangeTags[dateRange.id] = dateRange;\n } else {\n for (const attribute in dateRangeTags[dateRange.id]) {\n if (!!dateRange[attribute] && JSON.stringify(dateRangeTags[dateRange.id][attribute]) !== JSON.stringify(dateRange[attribute])) {\n this.trigger('warn', {\n message: 'EXT-X-DATERANGE tags with the same ID in a playlist must have the same attributes values'\n });\n break;\n }\n } // if tags with the same ID do not have conflicting attributes, merge them\n\n\n const dateRangeWithSameId = this.manifest.dateRanges.findIndex(dateRangeToFind => dateRangeToFind.id === dateRange.id);\n this.manifest.dateRanges[dateRangeWithSameId] = _extends(this.manifest.dateRanges[dateRangeWithSameId], dateRange);\n dateRangeTags[dateRange.id] = _extends(dateRangeTags[dateRange.id], dateRange); // after merging, delete the duplicate dateRange that was added last\n\n this.manifest.dateRanges.pop();\n }\n },\n\n 'independent-segments'() {\n this.manifest.independentSegments = true;\n },\n\n 'i-frames-only'() {\n this.manifest.iFramesOnly = true;\n this.requiredCompatibilityversion(this.manifest.version, 4);\n },\n\n 'content-steering'() {\n this.manifest.contentSteering = camelCaseKeys(entry.attributes);\n this.warnOnMissingAttributes_('#EXT-X-CONTENT-STEERING', entry.attributes, ['SERVER-URI']);\n },\n\n /** @this {Parser} */\n define() {\n this.manifest.definitions = this.manifest.definitions || {};\n\n const addDef = (n, v) => {\n if (n in this.manifest.definitions) {\n // An EXT-X-DEFINE tag MUST NOT specify the same Variable Name as any other\n // EXT-X-DEFINE tag in the same Playlist. Parsers that encounter duplicate\n // Variable Name declarations MUST fail to parse the Playlist.\n this.trigger('error', {\n message: `EXT-X-DEFINE: Duplicate name ${n}`\n });\n return;\n }\n\n this.manifest.definitions[n] = v;\n };\n\n if ('QUERYPARAM' in entry.attributes) {\n if ('NAME' in entry.attributes || 'IMPORT' in entry.attributes) {\n // An EXT-X-DEFINE tag MUST contain either a NAME, an IMPORT, or a\n // QUERYPARAM attribute, but only one of the three. Otherwise, the\n // client MUST fail to parse the Playlist.\n this.trigger('error', {\n message: 'EXT-X-DEFINE: Invalid attributes'\n });\n return;\n }\n\n const val = this.params.get(entry.attributes.QUERYPARAM);\n\n if (!val) {\n // If the QUERYPARAM attribute value does not match any query parameter in\n // the URI or the matching parameter has no associated value, the parser\n // MUST fail to parse the Playlist. If more than one parameter matches,\n // any of the associated values MAY be used.\n this.trigger('error', {\n message: `EXT-X-DEFINE: No query param ${entry.attributes.QUERYPARAM}`\n });\n return;\n }\n\n addDef(entry.attributes.QUERYPARAM, decodeURIComponent(val));\n return;\n }\n\n if ('NAME' in entry.attributes) {\n if ('IMPORT' in entry.attributes) {\n // An EXT-X-DEFINE tag MUST contain either a NAME, an IMPORT, or a\n // QUERYPARAM attribute, but only one of the three. Otherwise, the\n // client MUST fail to parse the Playlist.\n this.trigger('error', {\n message: 'EXT-X-DEFINE: Invalid attributes'\n });\n return;\n }\n\n if (!('VALUE' in entry.attributes) || typeof entry.attributes.VALUE !== 'string') {\n // This attribute is REQUIRED if the EXT-X-DEFINE tag has a NAME attribute.\n // The quoted-string MAY be empty.\n this.trigger('error', {\n message: `EXT-X-DEFINE: No value for ${entry.attributes.NAME}`\n });\n return;\n }\n\n addDef(entry.attributes.NAME, entry.attributes.VALUE);\n return;\n }\n\n if ('IMPORT' in entry.attributes) {\n if (!this.mainDefinitions[entry.attributes.IMPORT]) {\n // Covers two conditions, as mainDefinitions will always be empty on main\n //\n // EXT-X-DEFINE tags containing the IMPORT attribute MUST NOT occur in\n // Multivariant Playlists; they are only allowed in Media Playlists.\n //\n // If the IMPORT attribute value does not match any Variable Name in the\n // Multivariant Playlist, or if the Media Playlist loaded from a\n // Multivariant Playlist, the parser MUST fail the Playlist.\n this.trigger('error', {\n message: `EXT-X-DEFINE: No value ${entry.attributes.IMPORT} to import, or IMPORT used on main playlist`\n });\n return;\n }\n\n addDef(entry.attributes.IMPORT, this.mainDefinitions[entry.attributes.IMPORT]);\n return;\n } // An EXT-X-DEFINE tag MUST contain either a NAME, an IMPORT, or a QUERYPARAM\n // attribute, but only one of the three. Otherwise, the client MUST fail to\n // parse the Playlist.\n\n\n this.trigger('error', {\n message: 'EXT-X-DEFINE: No attribute'\n });\n },\n\n 'i-frame-playlist'() {\n this.manifest.iFramePlaylists.push({\n attributes: entry.attributes,\n uri: entry.uri,\n timeline: currentTimeline\n });\n this.warnOnMissingAttributes_('#EXT-X-I-FRAME-STREAM-INF', entry.attributes, ['BANDWIDTH', 'URI']);\n }\n\n })[entry.tagType] || noop).call(self);\n },\n\n uri() {\n currentUri.uri = entry.uri;\n uris.push(currentUri); // if no explicit duration was declared, use the target duration\n\n if (this.manifest.targetDuration && !('duration' in currentUri)) {\n this.trigger('warn', {\n message: 'defaulting segment duration to the target duration'\n });\n currentUri.duration = this.manifest.targetDuration;\n } // annotate with encryption information, if necessary\n\n\n if (key) {\n currentUri.key = key;\n }\n\n currentUri.timeline = currentTimeline; // annotate with initialization segment information, if necessary\n\n if (currentMap) {\n currentUri.map = currentMap;\n } // reset the last byterange end as it needs to be 0 between parts\n\n\n lastPartByterangeEnd = 0; // Once we have at least one program date time we can always extrapolate it forward\n\n if (this.lastProgramDateTime !== null) {\n currentUri.programDateTime = this.lastProgramDateTime;\n this.lastProgramDateTime += currentUri.duration * 1000;\n } // prepare for the next URI\n\n\n currentUri = {};\n },\n\n comment() {// comments are not important for playback\n },\n\n custom() {\n // if this is segment-level data attach the output to the segment\n if (entry.segment) {\n currentUri.custom = currentUri.custom || {};\n currentUri.custom[entry.customType] = entry.data; // if this is manifest-level data attach to the top level manifest object\n } else {\n this.manifest.custom = this.manifest.custom || {};\n this.manifest.custom[entry.customType] = entry.data;\n }\n }\n\n })[entry.type].call(self);\n });\n }\n\n requiredCompatibilityversion(currentVersion, targetVersion) {\n if (currentVersion < targetVersion || !currentVersion) {\n this.trigger('warn', {\n message: `manifest must be at least version ${targetVersion}`\n });\n }\n }\n\n warnOnMissingAttributes_(identifier, attributes, required) {\n const missing = [];\n required.forEach(function (key) {\n if (!attributes.hasOwnProperty(key)) {\n missing.push(key);\n }\n });\n\n if (missing.length) {\n this.trigger('warn', {\n message: `${identifier} lacks required attribute(s): ${missing.join(', ')}`\n });\n }\n }\n /**\n * Parse the input string and update the manifest object.\n *\n * @param {string} chunk a potentially incomplete portion of the manifest\n */\n\n\n push(chunk) {\n this.lineStream.push(chunk);\n }\n /**\n * Flush any remaining input. This can be handy if the last line of an M3U8\n * manifest did not contain a trailing newline but the file has been\n * completely received.\n */\n\n\n end() {\n // flush any buffered input\n this.lineStream.push('\\n');\n\n if (this.manifest.dateRanges.length && this.lastProgramDateTime === null) {\n this.trigger('warn', {\n message: 'A playlist with EXT-X-DATERANGE tag must contain atleast one EXT-X-PROGRAM-DATE-TIME tag'\n });\n }\n\n this.lastProgramDateTime = null;\n this.trigger('end');\n }\n /**\n * Add an additional parser for non-standard tags\n *\n * @param {Object} options a map of options for the added parser\n * @param {RegExp} options.expression a regular expression to match the custom header\n * @param {string} options.customType the custom type to register to the output\n * @param {Function} [options.dataParser] function to parse the line into an object\n * @param {boolean} [options.segment] should tag data be attached to the segment object\n */\n\n\n addParser(options) {\n this.parseStream.addParser(options);\n }\n /**\n * Add a custom header mapper\n *\n * @param {Object} options\n * @param {RegExp} options.expression a regular expression to match the custom header\n * @param {Function} options.map function to translate tag into a different tag\n */\n\n\n addTagMapper(options) {\n this.parseStream.addTagMapper(options);\n }\n\n}\n\nexport { LineStream, ParseStream, Parser };\n","import window from 'global/window';\nvar regexs = {\n // to determine mime types\n mp4: /^(av0?1|avc0?[1234]|vp0?9|flac|opus|mp3|mp4a|mp4v|stpp.ttml.im1t)/,\n webm: /^(vp0?[89]|av0?1|opus|vorbis)/,\n ogg: /^(vp0?[89]|theora|flac|opus|vorbis)/,\n // to determine if a codec is audio or video\n video: /^(av0?1|avc0?[1234]|vp0?[89]|hvc1|hev1|theora|mp4v)/,\n audio: /^(mp4a|flac|vorbis|opus|ac-[34]|ec-3|alac|mp3|speex|aac)/,\n text: /^(stpp.ttml.im1t)/,\n // mux.js support regex\n muxerVideo: /^(avc0?1)/,\n muxerAudio: /^(mp4a)/,\n // match nothing as muxer does not support text right now.\n // there cannot never be a character before the start of a string\n // so this matches nothing.\n muxerText: /a^/\n};\nvar mediaTypes = ['video', 'audio', 'text'];\nvar upperMediaTypes = ['Video', 'Audio', 'Text'];\n/**\n * Replace the old apple-style `avc1.
.
` codec string with the standard\n * `avc1.`\n *\n * @param {string} codec\n * Codec string to translate\n * @return {string}\n * The translated codec string\n */\n\nexport var translateLegacyCodec = function translateLegacyCodec(codec) {\n if (!codec) {\n return codec;\n }\n\n return codec.replace(/avc1\\.(\\d+)\\.(\\d+)/i, function (orig, profile, avcLevel) {\n var profileHex = ('00' + Number(profile).toString(16)).slice(-2);\n var avcLevelHex = ('00' + Number(avcLevel).toString(16)).slice(-2);\n return 'avc1.' + profileHex + '00' + avcLevelHex;\n });\n};\n/**\n * Replace the old apple-style `avc1.
.
` codec strings with the standard\n * `avc1.`\n *\n * @param {string[]} codecs\n * An array of codec strings to translate\n * @return {string[]}\n * The translated array of codec strings\n */\n\nexport var translateLegacyCodecs = function translateLegacyCodecs(codecs) {\n return codecs.map(translateLegacyCodec);\n};\n/**\n * Replace codecs in the codec string with the old apple-style `avc1.
.
` to the\n * standard `avc1.`.\n *\n * @param {string} codecString\n * The codec string\n * @return {string}\n * The codec string with old apple-style codecs replaced\n *\n * @private\n */\n\nexport var mapLegacyAvcCodecs = function mapLegacyAvcCodecs(codecString) {\n return codecString.replace(/avc1\\.(\\d+)\\.(\\d+)/i, function (match) {\n return translateLegacyCodecs([match])[0];\n });\n};\n/**\n * @typedef {Object} ParsedCodecInfo\n * @property {number} codecCount\n * Number of codecs parsed\n * @property {string} [videoCodec]\n * Parsed video codec (if found)\n * @property {string} [videoObjectTypeIndicator]\n * Video object type indicator (if found)\n * @property {string|null} audioProfile\n * Audio profile\n */\n\n/**\n * Parses a codec string to retrieve the number of codecs specified, the video codec and\n * object type indicator, and the audio profile.\n *\n * @param {string} [codecString]\n * The codec string to parse\n * @return {ParsedCodecInfo}\n * Parsed codec info\n */\n\nexport var parseCodecs = function parseCodecs(codecString) {\n if (codecString === void 0) {\n codecString = '';\n }\n\n var codecs = codecString.split(',');\n var result = [];\n codecs.forEach(function (codec) {\n codec = codec.trim();\n var codecType;\n mediaTypes.forEach(function (name) {\n var match = regexs[name].exec(codec.toLowerCase());\n\n if (!match || match.length <= 1) {\n return;\n }\n\n codecType = name; // maintain codec case\n\n var type = codec.substring(0, match[1].length);\n var details = codec.replace(type, '');\n result.push({\n type: type,\n details: details,\n mediaType: name\n });\n });\n\n if (!codecType) {\n result.push({\n type: codec,\n details: '',\n mediaType: 'unknown'\n });\n }\n });\n return result;\n};\n/**\n * Returns a ParsedCodecInfo object for the default alternate audio playlist if there is\n * a default alternate audio playlist for the provided audio group.\n *\n * @param {Object} master\n * The master playlist\n * @param {string} audioGroupId\n * ID of the audio group for which to find the default codec info\n * @return {ParsedCodecInfo}\n * Parsed codec info\n */\n\nexport var codecsFromDefault = function codecsFromDefault(master, audioGroupId) {\n if (!master.mediaGroups.AUDIO || !audioGroupId) {\n return null;\n }\n\n var audioGroup = master.mediaGroups.AUDIO[audioGroupId];\n\n if (!audioGroup) {\n return null;\n }\n\n for (var name in audioGroup) {\n var audioType = audioGroup[name];\n\n if (audioType.default && audioType.playlists) {\n // codec should be the same for all playlists within the audio type\n return parseCodecs(audioType.playlists[0].attributes.CODECS);\n }\n }\n\n return null;\n};\nexport var isVideoCodec = function isVideoCodec(codec) {\n if (codec === void 0) {\n codec = '';\n }\n\n return regexs.video.test(codec.trim().toLowerCase());\n};\nexport var isAudioCodec = function isAudioCodec(codec) {\n if (codec === void 0) {\n codec = '';\n }\n\n return regexs.audio.test(codec.trim().toLowerCase());\n};\nexport var isTextCodec = function isTextCodec(codec) {\n if (codec === void 0) {\n codec = '';\n }\n\n return regexs.text.test(codec.trim().toLowerCase());\n};\nexport var getMimeForCodec = function getMimeForCodec(codecString) {\n if (!codecString || typeof codecString !== 'string') {\n return;\n }\n\n var codecs = codecString.toLowerCase().split(',').map(function (c) {\n return translateLegacyCodec(c.trim());\n }); // default to video type\n\n var type = 'video'; // only change to audio type if the only codec we have is\n // audio\n\n if (codecs.length === 1 && isAudioCodec(codecs[0])) {\n type = 'audio';\n } else if (codecs.length === 1 && isTextCodec(codecs[0])) {\n // text uses application/ for now\n type = 'application';\n } // default the container to mp4\n\n\n var container = 'mp4'; // every codec must be able to go into the container\n // for that container to be the correct one\n\n if (codecs.every(function (c) {\n return regexs.mp4.test(c);\n })) {\n container = 'mp4';\n } else if (codecs.every(function (c) {\n return regexs.webm.test(c);\n })) {\n container = 'webm';\n } else if (codecs.every(function (c) {\n return regexs.ogg.test(c);\n })) {\n container = 'ogg';\n }\n\n return type + \"/\" + container + \";codecs=\\\"\" + codecString + \"\\\"\";\n};\n/**\n * Tests whether the codec is supported by MediaSource. Optionally also tests ManagedMediaSource.\n *\n * @param {string} codecString\n * Codec to test\n * @param {boolean} [withMMS]\n * Whether to check if ManagedMediaSource supports it\n * @return {boolean}\n * Codec is supported\n */\n\nexport var browserSupportsCodec = function browserSupportsCodec(codecString, withMMS) {\n if (codecString === void 0) {\n codecString = '';\n }\n\n if (withMMS === void 0) {\n withMMS = false;\n }\n\n return window.MediaSource && window.MediaSource.isTypeSupported && window.MediaSource.isTypeSupported(getMimeForCodec(codecString)) || withMMS && window.ManagedMediaSource && window.ManagedMediaSource.isTypeSupported && window.ManagedMediaSource.isTypeSupported(getMimeForCodec(codecString)) || false;\n};\nexport var muxerSupportsCodec = function muxerSupportsCodec(codecString) {\n if (codecString === void 0) {\n codecString = '';\n }\n\n return codecString.toLowerCase().split(',').every(function (codec) {\n codec = codec.trim(); // any match is supported.\n\n for (var i = 0; i < upperMediaTypes.length; i++) {\n var type = upperMediaTypes[i];\n\n if (regexs[\"muxer\" + type].test(codec)) {\n return true;\n }\n }\n\n return false;\n });\n};\nexport var DEFAULT_AUDIO_CODEC = 'mp4a.40.2';\nexport var DEFAULT_VIDEO_CODEC = 'avc1.4d400d';","var MPEGURL_REGEX = /^(audio|video|application)\\/(x-|vnd\\.apple\\.)?mpegurl/i;\nvar DASH_REGEX = /^application\\/dash\\+xml/i;\n/**\n * Returns a string that describes the type of source based on a video source object's\n * media type.\n *\n * @see {@link https://dev.w3.org/html5/pf-summary/video.html#dom-source-type|Source Type}\n *\n * @param {string} type\n * Video source object media type\n * @return {('hls'|'dash'|'vhs-json'|null)}\n * VHS source type string\n */\n\nexport var simpleTypeFromSourceType = function simpleTypeFromSourceType(type) {\n if (MPEGURL_REGEX.test(type)) {\n return 'hls';\n }\n\n if (DASH_REGEX.test(type)) {\n return 'dash';\n } // Denotes the special case of a manifest object passed to http-streaming instead of a\n // source URL.\n //\n // See https://en.wikipedia.org/wiki/Media_type for details on specifying media types.\n //\n // In this case, vnd stands for vendor, video.js for the organization, VHS for this\n // project, and the +json suffix identifies the structure of the media type.\n\n\n if (type === 'application/vnd.videojs.vhs+json') {\n return 'vhs-json';\n }\n\n return null;\n};","import window from 'global/window'; // const log2 = Math.log2 ? Math.log2 : (x) => (Math.log(x) / Math.log(2));\n\nvar repeat = function repeat(str, len) {\n var acc = '';\n\n while (len--) {\n acc += str;\n }\n\n return acc;\n}; // count the number of bits it would take to represent a number\n// we used to do this with log2 but BigInt does not support builtin math\n// Math.ceil(log2(x));\n\n\nexport var countBits = function countBits(x) {\n return x.toString(2).length;\n}; // count the number of whole bytes it would take to represent a number\n\nexport var countBytes = function countBytes(x) {\n return Math.ceil(countBits(x) / 8);\n};\nexport var padStart = function padStart(b, len, str) {\n if (str === void 0) {\n str = ' ';\n }\n\n return (repeat(str, len) + b.toString()).slice(-len);\n};\nexport var isArrayBufferView = function isArrayBufferView(obj) {\n if (ArrayBuffer.isView === 'function') {\n return ArrayBuffer.isView(obj);\n }\n\n return obj && obj.buffer instanceof ArrayBuffer;\n};\nexport var isTypedArray = function isTypedArray(obj) {\n return isArrayBufferView(obj);\n};\nexport var toUint8 = function toUint8(bytes) {\n if (bytes instanceof Uint8Array) {\n return bytes;\n }\n\n if (!Array.isArray(bytes) && !isTypedArray(bytes) && !(bytes instanceof ArrayBuffer)) {\n // any non-number or NaN leads to empty uint8array\n // eslint-disable-next-line\n if (typeof bytes !== 'number' || typeof bytes === 'number' && bytes !== bytes) {\n bytes = 0;\n } else {\n bytes = [bytes];\n }\n }\n\n return new Uint8Array(bytes && bytes.buffer || bytes, bytes && bytes.byteOffset || 0, bytes && bytes.byteLength || 0);\n};\nexport var toHexString = function toHexString(bytes) {\n bytes = toUint8(bytes);\n var str = '';\n\n for (var i = 0; i < bytes.length; i++) {\n str += padStart(bytes[i].toString(16), 2, '0');\n }\n\n return str;\n};\nexport var toBinaryString = function toBinaryString(bytes) {\n bytes = toUint8(bytes);\n var str = '';\n\n for (var i = 0; i < bytes.length; i++) {\n str += padStart(bytes[i].toString(2), 8, '0');\n }\n\n return str;\n};\nvar BigInt = window.BigInt || Number;\nvar BYTE_TABLE = [BigInt('0x1'), BigInt('0x100'), BigInt('0x10000'), BigInt('0x1000000'), BigInt('0x100000000'), BigInt('0x10000000000'), BigInt('0x1000000000000'), BigInt('0x100000000000000'), BigInt('0x10000000000000000')];\nexport var ENDIANNESS = function () {\n var a = new Uint16Array([0xFFCC]);\n var b = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n\n if (b[0] === 0xFF) {\n return 'big';\n }\n\n if (b[0] === 0xCC) {\n return 'little';\n }\n\n return 'unknown';\n}();\nexport var IS_BIG_ENDIAN = ENDIANNESS === 'big';\nexport var IS_LITTLE_ENDIAN = ENDIANNESS === 'little';\nexport var bytesToNumber = function bytesToNumber(bytes, _temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n _ref$signed = _ref.signed,\n signed = _ref$signed === void 0 ? false : _ref$signed,\n _ref$le = _ref.le,\n le = _ref$le === void 0 ? false : _ref$le;\n\n bytes = toUint8(bytes);\n var fn = le ? 'reduce' : 'reduceRight';\n var obj = bytes[fn] ? bytes[fn] : Array.prototype[fn];\n var number = obj.call(bytes, function (total, byte, i) {\n var exponent = le ? i : Math.abs(i + 1 - bytes.length);\n return total + BigInt(byte) * BYTE_TABLE[exponent];\n }, BigInt(0));\n\n if (signed) {\n var max = BYTE_TABLE[bytes.length] / BigInt(2) - BigInt(1);\n number = BigInt(number);\n\n if (number > max) {\n number -= max;\n number -= max;\n number -= BigInt(2);\n }\n }\n\n return Number(number);\n};\nexport var numberToBytes = function numberToBytes(number, _temp2) {\n var _ref2 = _temp2 === void 0 ? {} : _temp2,\n _ref2$le = _ref2.le,\n le = _ref2$le === void 0 ? false : _ref2$le;\n\n // eslint-disable-next-line\n if (typeof number !== 'bigint' && typeof number !== 'number' || typeof number === 'number' && number !== number) {\n number = 0;\n }\n\n number = BigInt(number);\n var byteCount = countBytes(number);\n var bytes = new Uint8Array(new ArrayBuffer(byteCount));\n\n for (var i = 0; i < byteCount; i++) {\n var byteIndex = le ? i : Math.abs(i + 1 - bytes.length);\n bytes[byteIndex] = Number(number / BYTE_TABLE[i] & BigInt(0xFF));\n\n if (number < 0) {\n bytes[byteIndex] = Math.abs(~bytes[byteIndex]);\n bytes[byteIndex] -= i === 0 ? 1 : 2;\n }\n }\n\n return bytes;\n};\nexport var bytesToString = function bytesToString(bytes) {\n if (!bytes) {\n return '';\n } // TODO: should toUint8 handle cases where we only have 8 bytes\n // but report more since this is a Uint16+ Array?\n\n\n bytes = Array.prototype.slice.call(bytes);\n var string = String.fromCharCode.apply(null, toUint8(bytes));\n\n try {\n return decodeURIComponent(escape(string));\n } catch (e) {// if decodeURIComponent/escape fails, we are dealing with partial\n // or full non string data. Just return the potentially garbled string.\n }\n\n return string;\n};\nexport var stringToBytes = function stringToBytes(string, stringIsBytes) {\n if (typeof string !== 'string' && string && typeof string.toString === 'function') {\n string = string.toString();\n }\n\n if (typeof string !== 'string') {\n return new Uint8Array();\n } // If the string already is bytes, we don't have to do this\n // otherwise we do this so that we split multi length characters\n // into individual bytes\n\n\n if (!stringIsBytes) {\n string = unescape(encodeURIComponent(string));\n }\n\n var view = new Uint8Array(string.length);\n\n for (var i = 0; i < string.length; i++) {\n view[i] = string.charCodeAt(i);\n }\n\n return view;\n};\nexport var concatTypedArrays = function concatTypedArrays() {\n for (var _len = arguments.length, buffers = new Array(_len), _key = 0; _key < _len; _key++) {\n buffers[_key] = arguments[_key];\n }\n\n buffers = buffers.filter(function (b) {\n return b && (b.byteLength || b.length) && typeof b !== 'string';\n });\n\n if (buffers.length <= 1) {\n // for 0 length we will return empty uint8\n // for 1 length we return the first uint8\n return toUint8(buffers[0]);\n }\n\n var totalLen = buffers.reduce(function (total, buf, i) {\n return total + (buf.byteLength || buf.length);\n }, 0);\n var tempBuffer = new Uint8Array(totalLen);\n var offset = 0;\n buffers.forEach(function (buf) {\n buf = toUint8(buf);\n tempBuffer.set(buf, offset);\n offset += buf.byteLength;\n });\n return tempBuffer;\n};\n/**\n * Check if the bytes \"b\" are contained within bytes \"a\".\n *\n * @param {Uint8Array|Array} a\n * Bytes to check in\n *\n * @param {Uint8Array|Array} b\n * Bytes to check for\n *\n * @param {Object} options\n * options\n *\n * @param {Array|Uint8Array} [offset=0]\n * offset to use when looking at bytes in a\n *\n * @param {Array|Uint8Array} [mask=[]]\n * mask to use on bytes before comparison.\n *\n * @return {boolean}\n * If all bytes in b are inside of a, taking into account\n * bit masks.\n */\n\nexport var bytesMatch = function bytesMatch(a, b, _temp3) {\n var _ref3 = _temp3 === void 0 ? {} : _temp3,\n _ref3$offset = _ref3.offset,\n offset = _ref3$offset === void 0 ? 0 : _ref3$offset,\n _ref3$mask = _ref3.mask,\n mask = _ref3$mask === void 0 ? [] : _ref3$mask;\n\n a = toUint8(a);\n b = toUint8(b); // ie 11 does not support uint8 every\n\n var fn = b.every ? b.every : Array.prototype.every;\n return b.length && a.length - offset >= b.length && // ie 11 doesn't support every on uin8\n fn.call(b, function (bByte, i) {\n var aByte = mask[i] ? mask[i] & a[offset + i] : a[offset + i];\n return bByte === aByte;\n });\n};\nexport var sliceBytes = function sliceBytes(src, start, end) {\n if (Uint8Array.prototype.slice) {\n return Uint8Array.prototype.slice.call(src, start, end);\n }\n\n return new Uint8Array(Array.prototype.slice.call(src, start, end));\n};\nexport var reverseBytes = function reverseBytes(src) {\n if (src.reverse) {\n return src.reverse();\n }\n\n return Array.prototype.reverse.call(src);\n};","/**\n * Loops through all supported media groups in master and calls the provided\n * callback for each group\n *\n * @param {Object} master\n * The parsed master manifest object\n * @param {string[]} groups\n * The media groups to call the callback for\n * @param {Function} callback\n * Callback to call for each media group\n */\nexport var forEachMediaGroup = function forEachMediaGroup(master, groups, callback) {\n groups.forEach(function (mediaType) {\n for (var groupKey in master.mediaGroups[mediaType]) {\n for (var labelKey in master.mediaGroups[mediaType][groupKey]) {\n var mediaProperties = master.mediaGroups[mediaType][groupKey][labelKey];\n callback(mediaProperties, mediaType, groupKey, labelKey);\n }\n }\n });\n};","'use strict'\n\n/**\n * Ponyfill for `Array.prototype.find` which is only available in ES6 runtimes.\n *\n * Works with anything that has a `length` property and index access properties, including NodeList.\n *\n * @template {unknown} T\n * @param {Array | ({length:number, [number]: T})} list\n * @param {function (item: T, index: number, list:Array | ({length:number, [number]: T})):boolean} predicate\n * @param {Partial>?} ac `Array.prototype` by default,\n * \t\t\t\tallows injecting a custom implementation in tests\n * @returns {T | undefined}\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find\n * @see https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.find\n */\nfunction find(list, predicate, ac) {\n\tif (ac === undefined) {\n\t\tac = Array.prototype;\n\t}\n\tif (list && typeof ac.find === 'function') {\n\t\treturn ac.find.call(list, predicate);\n\t}\n\tfor (var i = 0; i < list.length; i++) {\n\t\tif (Object.prototype.hasOwnProperty.call(list, i)) {\n\t\t\tvar item = list[i];\n\t\t\tif (predicate.call(undefined, item, i, list)) {\n\t\t\t\treturn item;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * \"Shallow freezes\" an object to render it immutable.\n * Uses `Object.freeze` if available,\n * otherwise the immutability is only in the type.\n *\n * Is used to create \"enum like\" objects.\n *\n * @template T\n * @param {T} object the object to freeze\n * @param {Pick = Object} oc `Object` by default,\n * \t\t\t\tallows to inject custom object constructor for tests\n * @returns {Readonly}\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze\n */\nfunction freeze(object, oc) {\n\tif (oc === undefined) {\n\t\toc = Object\n\t}\n\treturn oc && typeof oc.freeze === 'function' ? oc.freeze(object) : object\n}\n\n/**\n * Since we can not rely on `Object.assign` we provide a simplified version\n * that is sufficient for our needs.\n *\n * @param {Object} target\n * @param {Object | null | undefined} source\n *\n * @returns {Object} target\n * @throws TypeError if target is not an object\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n * @see https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.assign\n */\nfunction assign(target, source) {\n\tif (target === null || typeof target !== 'object') {\n\t\tthrow new TypeError('target is not an object')\n\t}\n\tfor (var key in source) {\n\t\tif (Object.prototype.hasOwnProperty.call(source, key)) {\n\t\t\ttarget[key] = source[key]\n\t\t}\n\t}\n\treturn target\n}\n\n/**\n * All mime types that are allowed as input to `DOMParser.parseFromString`\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#Argument02 MDN\n * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#domparsersupportedtype WHATWG HTML Spec\n * @see DOMParser.prototype.parseFromString\n */\nvar MIME_TYPE = freeze({\n\t/**\n\t * `text/html`, the only mime type that triggers treating an XML document as HTML.\n\t *\n\t * @see DOMParser.SupportedType.isHTML\n\t * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/HTML Wikipedia\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN\n\t * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring WHATWG HTML Spec\n\t */\n\tHTML: 'text/html',\n\n\t/**\n\t * Helper method to check a mime type if it indicates an HTML document\n\t *\n\t * @param {string} [value]\n\t * @returns {boolean}\n\t *\n\t * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/HTML Wikipedia\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN\n\t * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring \t */\n\tisHTML: function (value) {\n\t\treturn value === MIME_TYPE.HTML\n\t},\n\n\t/**\n\t * `application/xml`, the standard mime type for XML documents.\n\t *\n\t * @see https://www.iana.org/assignments/media-types/application/xml IANA MimeType registration\n\t * @see https://tools.ietf.org/html/rfc7303#section-9.1 RFC 7303\n\t * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia\n\t */\n\tXML_APPLICATION: 'application/xml',\n\n\t/**\n\t * `text/html`, an alias for `application/xml`.\n\t *\n\t * @see https://tools.ietf.org/html/rfc7303#section-9.2 RFC 7303\n\t * @see https://www.iana.org/assignments/media-types/text/xml IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia\n\t */\n\tXML_TEXT: 'text/xml',\n\n\t/**\n\t * `application/xhtml+xml`, indicates an XML document that has the default HTML namespace,\n\t * but is parsed as an XML document.\n\t *\n\t * @see https://www.iana.org/assignments/media-types/application/xhtml+xml IANA MimeType registration\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument WHATWG DOM Spec\n\t * @see https://en.wikipedia.org/wiki/XHTML Wikipedia\n\t */\n\tXML_XHTML_APPLICATION: 'application/xhtml+xml',\n\n\t/**\n\t * `image/svg+xml`,\n\t *\n\t * @see https://www.iana.org/assignments/media-types/image/svg+xml IANA MimeType registration\n\t * @see https://www.w3.org/TR/SVG11/ W3C SVG 1.1\n\t * @see https://en.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia\n\t */\n\tXML_SVG_IMAGE: 'image/svg+xml',\n})\n\n/**\n * Namespaces that are used in this code base.\n *\n * @see http://www.w3.org/TR/REC-xml-names\n */\nvar NAMESPACE = freeze({\n\t/**\n\t * The XHTML namespace.\n\t *\n\t * @see http://www.w3.org/1999/xhtml\n\t */\n\tHTML: 'http://www.w3.org/1999/xhtml',\n\n\t/**\n\t * Checks if `uri` equals `NAMESPACE.HTML`.\n\t *\n\t * @param {string} [uri]\n\t *\n\t * @see NAMESPACE.HTML\n\t */\n\tisHTML: function (uri) {\n\t\treturn uri === NAMESPACE.HTML\n\t},\n\n\t/**\n\t * The SVG namespace.\n\t *\n\t * @see http://www.w3.org/2000/svg\n\t */\n\tSVG: 'http://www.w3.org/2000/svg',\n\n\t/**\n\t * The `xml:` namespace.\n\t *\n\t * @see http://www.w3.org/XML/1998/namespace\n\t */\n\tXML: 'http://www.w3.org/XML/1998/namespace',\n\n\t/**\n\t * The `xmlns:` namespace\n\t *\n\t * @see https://www.w3.org/2000/xmlns/\n\t */\n\tXMLNS: 'http://www.w3.org/2000/xmlns/',\n})\n\nexports.assign = assign;\nexports.find = find;\nexports.freeze = freeze;\nexports.MIME_TYPE = MIME_TYPE;\nexports.NAMESPACE = NAMESPACE;\n","var conventions = require(\"./conventions\");\n\nvar find = conventions.find;\nvar NAMESPACE = conventions.NAMESPACE;\n\n/**\n * A prerequisite for `[].filter`, to drop elements that are empty\n * @param {string} input\n * @returns {boolean}\n */\nfunction notEmptyString (input) {\n\treturn input !== ''\n}\n/**\n * @see https://infra.spec.whatwg.org/#split-on-ascii-whitespace\n * @see https://infra.spec.whatwg.org/#ascii-whitespace\n *\n * @param {string} input\n * @returns {string[]} (can be empty)\n */\nfunction splitOnASCIIWhitespace(input) {\n\t// U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, U+0020 SPACE\n\treturn input ? input.split(/[\\t\\n\\f\\r ]+/).filter(notEmptyString) : []\n}\n\n/**\n * Adds element as a key to current if it is not already present.\n *\n * @param {Record} current\n * @param {string} element\n * @returns {Record}\n */\nfunction orderedSetReducer (current, element) {\n\tif (!current.hasOwnProperty(element)) {\n\t\tcurrent[element] = true;\n\t}\n\treturn current;\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#ordered-set\n * @param {string} input\n * @returns {string[]}\n */\nfunction toOrderedSet(input) {\n\tif (!input) return [];\n\tvar list = splitOnASCIIWhitespace(input);\n\treturn Object.keys(list.reduce(orderedSetReducer, {}))\n}\n\n/**\n * Uses `list.indexOf` to implement something like `Array.prototype.includes`,\n * which we can not rely on being available.\n *\n * @param {any[]} list\n * @returns {function(any): boolean}\n */\nfunction arrayIncludes (list) {\n\treturn function(element) {\n\t\treturn list && list.indexOf(element) !== -1;\n\t}\n}\n\nfunction copy(src,dest){\n\tfor(var p in src){\n\t\tif (Object.prototype.hasOwnProperty.call(src, p)) {\n\t\t\tdest[p] = src[p];\n\t\t}\n\t}\n}\n\n/**\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*((?:.*\\{\\s*?[\\r\\n][\\s\\S]*?^})|\\S.*?(?=[;\\r\\n]));?\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*(\\S.*?(?=[;\\r\\n]));?\n */\nfunction _extends(Class,Super){\n\tvar pt = Class.prototype;\n\tif(!(pt instanceof Super)){\n\t\tfunction t(){};\n\t\tt.prototype = Super.prototype;\n\t\tt = new t();\n\t\tcopy(pt,t);\n\t\tClass.prototype = pt = t;\n\t}\n\tif(pt.constructor != Class){\n\t\tif(typeof Class != 'function'){\n\t\t\tconsole.error(\"unknown Class:\"+Class)\n\t\t}\n\t\tpt.constructor = Class\n\t}\n}\n\n// Node Types\nvar NodeType = {}\nvar ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;\nvar ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;\nvar TEXT_NODE = NodeType.TEXT_NODE = 3;\nvar CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;\nvar ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;\nvar ENTITY_NODE = NodeType.ENTITY_NODE = 6;\nvar PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;\nvar COMMENT_NODE = NodeType.COMMENT_NODE = 8;\nvar DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;\nvar DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;\nvar DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;\nvar NOTATION_NODE = NodeType.NOTATION_NODE = 12;\n\n// ExceptionCode\nvar ExceptionCode = {}\nvar ExceptionMessage = {};\nvar INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]=\"Index size error\"),1);\nvar DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]=\"DOMString size error\"),2);\nvar HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]=\"Hierarchy request error\"),3);\nvar WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]=\"Wrong document\"),4);\nvar INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]=\"Invalid character\"),5);\nvar NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]=\"No data allowed\"),6);\nvar NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]=\"No modification allowed\"),7);\nvar NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]=\"Not found\"),8);\nvar NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]=\"Not supported\"),9);\nvar INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]=\"Attribute in use\"),10);\n//level2\nvar INVALID_STATE_ERR \t= ExceptionCode.INVALID_STATE_ERR \t= ((ExceptionMessage[11]=\"Invalid state\"),11);\nvar SYNTAX_ERR \t= ExceptionCode.SYNTAX_ERR \t= ((ExceptionMessage[12]=\"Syntax error\"),12);\nvar INVALID_MODIFICATION_ERR \t= ExceptionCode.INVALID_MODIFICATION_ERR \t= ((ExceptionMessage[13]=\"Invalid modification\"),13);\nvar NAMESPACE_ERR \t= ExceptionCode.NAMESPACE_ERR \t= ((ExceptionMessage[14]=\"Invalid namespace\"),14);\nvar INVALID_ACCESS_ERR \t= ExceptionCode.INVALID_ACCESS_ERR \t= ((ExceptionMessage[15]=\"Invalid access\"),15);\n\n/**\n * DOM Level 2\n * Object DOMException\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html\n * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html\n */\nfunction DOMException(code, message) {\n\tif(message instanceof Error){\n\t\tvar error = message;\n\t}else{\n\t\terror = this;\n\t\tError.call(this, ExceptionMessage[code]);\n\t\tthis.message = ExceptionMessage[code];\n\t\tif(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);\n\t}\n\terror.code = code;\n\tif(message) this.message = this.message + \": \" + message;\n\treturn error;\n};\nDOMException.prototype = Error.prototype;\ncopy(ExceptionCode,DOMException)\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177\n * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.\n * The items in the NodeList are accessible via an integral index, starting from 0.\n */\nfunction NodeList() {\n};\nNodeList.prototype = {\n\t/**\n\t * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.\n\t * @standard level1\n\t */\n\tlength:0,\n\t/**\n\t * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.\n\t * @standard level1\n\t * @param index unsigned long\n\t * Index into the collection.\n\t * @return Node\n\t * \tThe node at the indexth position in the NodeList, or null if that is not a valid index.\n\t */\n\titem: function(index) {\n\t\treturn index >= 0 && index < this.length ? this[index] : null;\n\t},\n\ttoString:function(isHTML,nodeFilter){\n\t\tfor(var buf = [], i = 0;i=0){\n\t\tvar lastIndex = list.length-1\n\t\twhile(i0 || key == 'xmlns'){\n//\t\t\treturn null;\n//\t\t}\n\t\t//console.log()\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar attr = this[i];\n\t\t\t//console.log(attr.nodeName,key)\n\t\t\tif(attr.nodeName == key){\n\t\t\t\treturn attr;\n\t\t\t}\n\t\t}\n\t},\n\tsetNamedItem: function(attr) {\n\t\tvar el = attr.ownerElement;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\tvar oldAttr = this.getNamedItem(attr.nodeName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\t/* returns Node */\n\tsetNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR\n\t\tvar el = attr.ownerElement, oldAttr;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\toldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\n\t/* returns Node */\n\tremoveNamedItem: function(key) {\n\t\tvar attr = this.getNamedItem(key);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\n\n\t},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR\n\n\t//for level2\n\tremoveNamedItemNS:function(namespaceURI,localName){\n\t\tvar attr = this.getNamedItemNS(namespaceURI,localName);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t},\n\tgetNamedItemNS: function(namespaceURI, localName) {\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar node = this[i];\n\t\t\tif(node.localName == localName && node.namespaceURI == namespaceURI){\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n};\n\n/**\n * The DOMImplementation interface represents an object providing methods\n * which are not dependent on any particular document.\n * Such an object is returned by the `Document.implementation` property.\n *\n * __The individual methods describe the differences compared to the specs.__\n *\n * @constructor\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation MDN\n * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 DOM Level 1 Core (Initial)\n * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-102161490 DOM Level 2 Core\n * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-102161490 DOM Level 3 Core\n * @see https://dom.spec.whatwg.org/#domimplementation DOM Living Standard\n */\nfunction DOMImplementation() {\n}\n\nDOMImplementation.prototype = {\n\t/**\n\t * The DOMImplementation.hasFeature() method returns a Boolean flag indicating if a given feature is supported.\n\t * The different implementations fairly diverged in what kind of features were reported.\n\t * The latest version of the spec settled to force this method to always return true, where the functionality was accurate and in use.\n\t *\n\t * @deprecated It is deprecated and modern browsers return true in all cases.\n\t *\n\t * @param {string} feature\n\t * @param {string} [version]\n\t * @returns {boolean} always true\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/hasFeature MDN\n\t * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-5CED94D7 DOM Level 1 Core\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-hasfeature DOM Living Standard\n\t */\n\thasFeature: function(feature, version) {\n\t\t\treturn true;\n\t},\n\t/**\n\t * Creates an XML Document object of the specified type with its document element.\n\t *\n\t * __It behaves slightly different from the description in the living standard__:\n\t * - There is no interface/class `XMLDocument`, it returns a `Document` instance.\n\t * - `contentType`, `encoding`, `mode`, `origin`, `url` fields are currently not declared.\n\t * - this implementation is not validating names or qualified names\n\t * (when parsing XML strings, the SAX parser takes care of that)\n\t *\n\t * @param {string|null} namespaceURI\n\t * @param {string} qualifiedName\n\t * @param {DocumentType=null} doctype\n\t * @returns {Document}\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocument MDN\n\t * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocument DOM Level 2 Core (initial)\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument DOM Level 2 Core\n\t *\n\t * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract\n\t * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names\n\t * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names\n\t */\n\tcreateDocument: function(namespaceURI, qualifiedName, doctype){\n\t\tvar doc = new Document();\n\t\tdoc.implementation = this;\n\t\tdoc.childNodes = new NodeList();\n\t\tdoc.doctype = doctype || null;\n\t\tif (doctype){\n\t\t\tdoc.appendChild(doctype);\n\t\t}\n\t\tif (qualifiedName){\n\t\t\tvar root = doc.createElementNS(namespaceURI, qualifiedName);\n\t\t\tdoc.appendChild(root);\n\t\t}\n\t\treturn doc;\n\t},\n\t/**\n\t * Returns a doctype, with the given `qualifiedName`, `publicId`, and `systemId`.\n\t *\n\t * __This behavior is slightly different from the in the specs__:\n\t * - this implementation is not validating names or qualified names\n\t * (when parsing XML strings, the SAX parser takes care of that)\n\t *\n\t * @param {string} qualifiedName\n\t * @param {string} [publicId]\n\t * @param {string} [systemId]\n\t * @returns {DocumentType} which can either be used with `DOMImplementation.createDocument` upon document creation\n\t * \t\t\t\t or can be put into the document via methods like `Node.insertBefore()` or `Node.replaceChild()`\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocumentType MDN\n\t * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocType DOM Level 2 Core\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype DOM Living Standard\n\t *\n\t * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract\n\t * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names\n\t * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names\n\t */\n\tcreateDocumentType: function(qualifiedName, publicId, systemId){\n\t\tvar node = new DocumentType();\n\t\tnode.name = qualifiedName;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.publicId = publicId || '';\n\t\tnode.systemId = systemId || '';\n\n\t\treturn node;\n\t}\n};\n\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247\n */\n\nfunction Node() {\n};\n\nNode.prototype = {\n\tfirstChild : null,\n\tlastChild : null,\n\tpreviousSibling : null,\n\tnextSibling : null,\n\tattributes : null,\n\tparentNode : null,\n\tchildNodes : null,\n\townerDocument : null,\n\tnodeValue : null,\n\tnamespaceURI : null,\n\tprefix : null,\n\tlocalName : null,\n\t// Modified in DOM Level 2:\n\tinsertBefore:function(newChild, refChild){//raises\n\t\treturn _insertBefore(this,newChild,refChild);\n\t},\n\treplaceChild:function(newChild, oldChild){//raises\n\t\t_insertBefore(this, newChild,oldChild, assertPreReplacementValidityInDocument);\n\t\tif(oldChild){\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t},\n\tremoveChild:function(oldChild){\n\t\treturn _removeChild(this,oldChild);\n\t},\n\tappendChild:function(newChild){\n\t\treturn this.insertBefore(newChild,null);\n\t},\n\thasChildNodes:function(){\n\t\treturn this.firstChild != null;\n\t},\n\tcloneNode:function(deep){\n\t\treturn cloneNode(this.ownerDocument||this,this,deep);\n\t},\n\t// Modified in DOM Level 2:\n\tnormalize:function(){\n\t\tvar child = this.firstChild;\n\t\twhile(child){\n\t\t\tvar next = child.nextSibling;\n\t\t\tif(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){\n\t\t\t\tthis.removeChild(next);\n\t\t\t\tchild.appendData(next.data);\n\t\t\t}else{\n\t\t\t\tchild.normalize();\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t}\n\t},\n \t// Introduced in DOM Level 2:\n\tisSupported:function(feature, version){\n\t\treturn this.ownerDocument.implementation.hasFeature(feature,version);\n\t},\n // Introduced in DOM Level 2:\n hasAttributes:function(){\n \treturn this.attributes.length>0;\n },\n\t/**\n\t * Look up the prefix associated to the given namespace URI, starting from this node.\n\t * **The default namespace declarations are ignored by this method.**\n\t * See Namespace Prefix Lookup for details on the algorithm used by this method.\n\t *\n\t * _Note: The implementation seems to be incomplete when compared to the algorithm described in the specs._\n\t *\n\t * @param {string | null} namespaceURI\n\t * @returns {string | null}\n\t * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespacePrefix\n\t * @see https://www.w3.org/TR/DOM-Level-3-Core/namespaces-algorithms.html#lookupNamespacePrefixAlgo\n\t * @see https://dom.spec.whatwg.org/#dom-node-lookupprefix\n\t * @see https://github.com/xmldom/xmldom/issues/322\n\t */\n lookupPrefix:function(namespaceURI){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tfor(var n in map){\n\t\t\t\t\t\tif (Object.prototype.hasOwnProperty.call(map, n) && map[n] === namespaceURI) {\n\t\t\t\t\t\t\treturn n;\n\t\t\t\t\t\t}\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n lookupNamespaceURI:function(prefix){\n \tvar el = this;\n \twhile(el){\n \t\tvar map = el._nsMap;\n \t\t//console.dir(map)\n \t\tif(map){\n \t\t\tif(Object.prototype.hasOwnProperty.call(map, prefix)){\n \t\t\t\treturn map[prefix] ;\n \t\t\t}\n \t\t}\n \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n \t}\n \treturn null;\n },\n // Introduced in DOM Level 3:\n isDefaultNamespace:function(namespaceURI){\n \tvar prefix = this.lookupPrefix(namespaceURI);\n \treturn prefix == null;\n }\n};\n\n\nfunction _xmlEncoder(c){\n\treturn c == '<' && '<' ||\n c == '>' && '>' ||\n c == '&' && '&' ||\n c == '\"' && '"' ||\n '&#'+c.charCodeAt()+';'\n}\n\n\ncopy(NodeType,Node);\ncopy(NodeType,Node.prototype);\n\n/**\n * @param callback return true for continue,false for break\n * @return boolean true: break visit;\n */\nfunction _visitNode(node,callback){\n\tif(callback(node)){\n\t\treturn true;\n\t}\n\tif(node = node.firstChild){\n\t\tdo{\n\t\t\tif(_visitNode(node,callback)){return true}\n }while(node=node.nextSibling)\n }\n}\n\n\n\nfunction Document(){\n\tthis.ownerDocument = this;\n}\n\nfunction _onAddAttribute(doc,el,newAttr){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns === NAMESPACE.XMLNS){\n\t\t//update namespace\n\t\tel._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value\n\t}\n}\n\nfunction _onRemoveAttribute(doc,el,newAttr,remove){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns === NAMESPACE.XMLNS){\n\t\t//update namespace\n\t\tdelete el._nsMap[newAttr.prefix?newAttr.localName:'']\n\t}\n}\n\n/**\n * Updates `el.childNodes`, updating the indexed items and it's `length`.\n * Passing `newChild` means it will be appended.\n * Otherwise it's assumed that an item has been removed,\n * and `el.firstNode` and it's `.nextSibling` are used\n * to walk the current list of child nodes.\n *\n * @param {Document} doc\n * @param {Node} el\n * @param {Node} [newChild]\n * @private\n */\nfunction _onUpdateChild (doc, el, newChild) {\n\tif(doc && doc._inc){\n\t\tdoc._inc++;\n\t\t//update childNodes\n\t\tvar cs = el.childNodes;\n\t\tif (newChild) {\n\t\t\tcs[cs.length++] = newChild;\n\t\t} else {\n\t\t\tvar child = el.firstChild;\n\t\t\tvar i = 0;\n\t\t\twhile (child) {\n\t\t\t\tcs[i++] = child;\n\t\t\t\tchild = child.nextSibling;\n\t\t\t}\n\t\t\tcs.length = i;\n\t\t\tdelete cs[cs.length];\n\t\t}\n\t}\n}\n\n/**\n * Removes the connections between `parentNode` and `child`\n * and any existing `child.previousSibling` or `child.nextSibling`.\n *\n * @see https://github.com/xmldom/xmldom/issues/135\n * @see https://github.com/xmldom/xmldom/issues/145\n *\n * @param {Node} parentNode\n * @param {Node} child\n * @returns {Node} the child that was removed.\n * @private\n */\nfunction _removeChild (parentNode, child) {\n\tvar previous = child.previousSibling;\n\tvar next = child.nextSibling;\n\tif (previous) {\n\t\tprevious.nextSibling = next;\n\t} else {\n\t\tparentNode.firstChild = next;\n\t}\n\tif (next) {\n\t\tnext.previousSibling = previous;\n\t} else {\n\t\tparentNode.lastChild = previous;\n\t}\n\tchild.parentNode = null;\n\tchild.previousSibling = null;\n\tchild.nextSibling = null;\n\t_onUpdateChild(parentNode.ownerDocument, parentNode);\n\treturn child;\n}\n\n/**\n * Returns `true` if `node` can be a parent for insertion.\n * @param {Node} node\n * @returns {boolean}\n */\nfunction hasValidParentNodeType(node) {\n\treturn (\n\t\tnode &&\n\t\t(node.nodeType === Node.DOCUMENT_NODE || node.nodeType === Node.DOCUMENT_FRAGMENT_NODE || node.nodeType === Node.ELEMENT_NODE)\n\t);\n}\n\n/**\n * Returns `true` if `node` can be inserted according to it's `nodeType`.\n * @param {Node} node\n * @returns {boolean}\n */\nfunction hasInsertableNodeType(node) {\n\treturn (\n\t\tnode &&\n\t\t(isElementNode(node) ||\n\t\t\tisTextNode(node) ||\n\t\t\tisDocTypeNode(node) ||\n\t\t\tnode.nodeType === Node.DOCUMENT_FRAGMENT_NODE ||\n\t\t\tnode.nodeType === Node.COMMENT_NODE ||\n\t\t\tnode.nodeType === Node.PROCESSING_INSTRUCTION_NODE)\n\t);\n}\n\n/**\n * Returns true if `node` is a DOCTYPE node\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isDocTypeNode(node) {\n\treturn node && node.nodeType === Node.DOCUMENT_TYPE_NODE;\n}\n\n/**\n * Returns true if the node is an element\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isElementNode(node) {\n\treturn node && node.nodeType === Node.ELEMENT_NODE;\n}\n/**\n * Returns true if `node` is a text node\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isTextNode(node) {\n\treturn node && node.nodeType === Node.TEXT_NODE;\n}\n\n/**\n * Check if en element node can be inserted before `child`, or at the end if child is falsy,\n * according to the presence and position of a doctype node on the same level.\n *\n * @param {Document} doc The document node\n * @param {Node} child the node that would become the nextSibling if the element would be inserted\n * @returns {boolean} `true` if an element can be inserted before child\n * @private\n * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction isElementInsertionPossible(doc, child) {\n\tvar parentChildNodes = doc.childNodes || [];\n\tif (find(parentChildNodes, isElementNode) || isDocTypeNode(child)) {\n\t\treturn false;\n\t}\n\tvar docTypeNode = find(parentChildNodes, isDocTypeNode);\n\treturn !(child && docTypeNode && parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child));\n}\n\n/**\n * Check if en element node can be inserted before `child`, or at the end if child is falsy,\n * according to the presence and position of a doctype node on the same level.\n *\n * @param {Node} doc The document node\n * @param {Node} child the node that would become the nextSibling if the element would be inserted\n * @returns {boolean} `true` if an element can be inserted before child\n * @private\n * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction isElementReplacementPossible(doc, child) {\n\tvar parentChildNodes = doc.childNodes || [];\n\n\tfunction hasElementChildThatIsNotChild(node) {\n\t\treturn isElementNode(node) && node !== child;\n\t}\n\n\tif (find(parentChildNodes, hasElementChildThatIsNotChild)) {\n\t\treturn false;\n\t}\n\tvar docTypeNode = find(parentChildNodes, isDocTypeNode);\n\treturn !(child && docTypeNode && parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child));\n}\n\n/**\n * @private\n * Steps 1-5 of the checks before inserting and before replacing a child are the same.\n *\n * @param {Node} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node=} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreInsertionValidity1to5(parent, node, child) {\n\t// 1. If `parent` is not a Document, DocumentFragment, or Element node, then throw a \"HierarchyRequestError\" DOMException.\n\tif (!hasValidParentNodeType(parent)) {\n\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Unexpected parent node type ' + parent.nodeType);\n\t}\n\t// 2. If `node` is a host-including inclusive ancestor of `parent`, then throw a \"HierarchyRequestError\" DOMException.\n\t// not implemented!\n\t// 3. If `child` is non-null and its parent is not `parent`, then throw a \"NotFoundError\" DOMException.\n\tif (child && child.parentNode !== parent) {\n\t\tthrow new DOMException(NOT_FOUND_ERR, 'child not in parent');\n\t}\n\tif (\n\t\t// 4. If `node` is not a DocumentFragment, DocumentType, Element, or CharacterData node, then throw a \"HierarchyRequestError\" DOMException.\n\t\t!hasInsertableNodeType(node) ||\n\t\t// 5. If either `node` is a Text node and `parent` is a document,\n\t\t// the sax parser currently adds top level text nodes, this will be fixed in 0.9.0\n\t\t// || (node.nodeType === Node.TEXT_NODE && parent.nodeType === Node.DOCUMENT_NODE)\n\t\t// or `node` is a doctype and `parent` is not a document, then throw a \"HierarchyRequestError\" DOMException.\n\t\t(isDocTypeNode(node) && parent.nodeType !== Node.DOCUMENT_NODE)\n\t) {\n\t\tthrow new DOMException(\n\t\t\tHIERARCHY_REQUEST_ERR,\n\t\t\t'Unexpected node type ' + node.nodeType + ' for parent node type ' + parent.nodeType\n\t\t);\n\t}\n}\n\n/**\n * @private\n * Step 6 of the checks before inserting and before replacing a child are different.\n *\n * @param {Document} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node | undefined} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreInsertionValidityInDocument(parent, node, child) {\n\tvar parentChildNodes = parent.childNodes || [];\n\tvar nodeChildNodes = node.childNodes || [];\n\n\t// DocumentFragment\n\tif (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n\t\tvar nodeChildElements = nodeChildNodes.filter(isElementNode);\n\t\t// If node has more than one element child or has a Text node child.\n\t\tif (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'More than one element or text in fragment');\n\t\t}\n\t\t// Otherwise, if `node` has one element child and either `parent` has an element child,\n\t\t// `child` is a doctype, or `child` is non-null and a doctype is following `child`.\n\t\tif (nodeChildElements.length === 1 && !isElementInsertionPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Element in fragment can not be inserted before doctype');\n\t\t}\n\t}\n\t// Element\n\tif (isElementNode(node)) {\n\t\t// `parent` has an element child, `child` is a doctype,\n\t\t// or `child` is non-null and a doctype is following `child`.\n\t\tif (!isElementInsertionPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one element can be added and only after doctype');\n\t\t}\n\t}\n\t// DocumentType\n\tif (isDocTypeNode(node)) {\n\t\t// `parent` has a doctype child,\n\t\tif (find(parentChildNodes, isDocTypeNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one doctype is allowed');\n\t\t}\n\t\tvar parentElementChild = find(parentChildNodes, isElementNode);\n\t\t// `child` is non-null and an element is preceding `child`,\n\t\tif (child && parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can only be inserted before an element');\n\t\t}\n\t\t// or `child` is null and `parent` has an element child.\n\t\tif (!child && parentElementChild) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can not be appended since element is present');\n\t\t}\n\t}\n}\n\n/**\n * @private\n * Step 6 of the checks before inserting and before replacing a child are different.\n *\n * @param {Document} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node | undefined} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreReplacementValidityInDocument(parent, node, child) {\n\tvar parentChildNodes = parent.childNodes || [];\n\tvar nodeChildNodes = node.childNodes || [];\n\n\t// DocumentFragment\n\tif (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n\t\tvar nodeChildElements = nodeChildNodes.filter(isElementNode);\n\t\t// If `node` has more than one element child or has a Text node child.\n\t\tif (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'More than one element or text in fragment');\n\t\t}\n\t\t// Otherwise, if `node` has one element child and either `parent` has an element child that is not `child` or a doctype is following `child`.\n\t\tif (nodeChildElements.length === 1 && !isElementReplacementPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Element in fragment can not be inserted before doctype');\n\t\t}\n\t}\n\t// Element\n\tif (isElementNode(node)) {\n\t\t// `parent` has an element child that is not `child` or a doctype is following `child`.\n\t\tif (!isElementReplacementPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one element can be added and only after doctype');\n\t\t}\n\t}\n\t// DocumentType\n\tif (isDocTypeNode(node)) {\n\t\tfunction hasDoctypeChildThatIsNotChild(node) {\n\t\t\treturn isDocTypeNode(node) && node !== child;\n\t\t}\n\n\t\t// `parent` has a doctype child that is not `child`,\n\t\tif (find(parentChildNodes, hasDoctypeChildThatIsNotChild)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one doctype is allowed');\n\t\t}\n\t\tvar parentElementChild = find(parentChildNodes, isElementNode);\n\t\t// or an element is preceding `child`.\n\t\tif (child && parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can only be inserted before an element');\n\t\t}\n\t}\n}\n\n/**\n * @private\n * @param {Node} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node=} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction _insertBefore(parent, node, child, _inDocumentAssertion) {\n\t// To ensure pre-insertion validity of a node into a parent before a child, run these steps:\n\tassertPreInsertionValidity1to5(parent, node, child);\n\n\t// If parent is a document, and any of the statements below, switched on the interface node implements,\n\t// are true, then throw a \"HierarchyRequestError\" DOMException.\n\tif (parent.nodeType === Node.DOCUMENT_NODE) {\n\t\t(_inDocumentAssertion || assertPreInsertionValidityInDocument)(parent, node, child);\n\t}\n\n\tvar cp = node.parentNode;\n\tif(cp){\n\t\tcp.removeChild(node);//remove and update\n\t}\n\tif(node.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\tvar newFirst = node.firstChild;\n\t\tif (newFirst == null) {\n\t\t\treturn node;\n\t\t}\n\t\tvar newLast = node.lastChild;\n\t}else{\n\t\tnewFirst = newLast = node;\n\t}\n\tvar pre = child ? child.previousSibling : parent.lastChild;\n\n\tnewFirst.previousSibling = pre;\n\tnewLast.nextSibling = child;\n\n\n\tif(pre){\n\t\tpre.nextSibling = newFirst;\n\t}else{\n\t\tparent.firstChild = newFirst;\n\t}\n\tif(child == null){\n\t\tparent.lastChild = newLast;\n\t}else{\n\t\tchild.previousSibling = newLast;\n\t}\n\tdo{\n\t\tnewFirst.parentNode = parent;\n\t}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))\n\t_onUpdateChild(parent.ownerDocument||parent, parent);\n\t//console.log(parent.lastChild.nextSibling == null)\n\tif (node.nodeType == DOCUMENT_FRAGMENT_NODE) {\n\t\tnode.firstChild = node.lastChild = null;\n\t}\n\treturn node;\n}\n\n/**\n * Appends `newChild` to `parentNode`.\n * If `newChild` is already connected to a `parentNode` it is first removed from it.\n *\n * @see https://github.com/xmldom/xmldom/issues/135\n * @see https://github.com/xmldom/xmldom/issues/145\n * @param {Node} parentNode\n * @param {Node} newChild\n * @returns {Node}\n * @private\n */\nfunction _appendSingleChild (parentNode, newChild) {\n\tif (newChild.parentNode) {\n\t\tnewChild.parentNode.removeChild(newChild);\n\t}\n\tnewChild.parentNode = parentNode;\n\tnewChild.previousSibling = parentNode.lastChild;\n\tnewChild.nextSibling = null;\n\tif (newChild.previousSibling) {\n\t\tnewChild.previousSibling.nextSibling = newChild;\n\t} else {\n\t\tparentNode.firstChild = newChild;\n\t}\n\tparentNode.lastChild = newChild;\n\t_onUpdateChild(parentNode.ownerDocument, parentNode, newChild);\n\treturn newChild;\n}\n\nDocument.prototype = {\n\t//implementation : null,\n\tnodeName : '#document',\n\tnodeType : DOCUMENT_NODE,\n\t/**\n\t * The DocumentType node of the document.\n\t *\n\t * @readonly\n\t * @type DocumentType\n\t */\n\tdoctype : null,\n\tdocumentElement : null,\n\t_inc : 1,\n\n\tinsertBefore : function(newChild, refChild){//raises\n\t\tif(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){\n\t\t\tvar child = newChild.firstChild;\n\t\t\twhile(child){\n\t\t\t\tvar next = child.nextSibling;\n\t\t\t\tthis.insertBefore(child,refChild);\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t\treturn newChild;\n\t\t}\n\t\t_insertBefore(this, newChild, refChild);\n\t\tnewChild.ownerDocument = this;\n\t\tif (this.documentElement === null && newChild.nodeType === ELEMENT_NODE) {\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\n\t\treturn newChild;\n\t},\n\tremoveChild : function(oldChild){\n\t\tif(this.documentElement == oldChild){\n\t\t\tthis.documentElement = null;\n\t\t}\n\t\treturn _removeChild(this,oldChild);\n\t},\n\treplaceChild: function (newChild, oldChild) {\n\t\t//raises\n\t\t_insertBefore(this, newChild, oldChild, assertPreReplacementValidityInDocument);\n\t\tnewChild.ownerDocument = this;\n\t\tif (oldChild) {\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t\tif (isElementNode(newChild)) {\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\t},\n\t// Introduced in DOM Level 2:\n\timportNode : function(importedNode,deep){\n\t\treturn importNode(this,importedNode,deep);\n\t},\n\t// Introduced in DOM Level 2:\n\tgetElementById :\tfunction(id){\n\t\tvar rtv = null;\n\t\t_visitNode(this.documentElement,function(node){\n\t\t\tif(node.nodeType == ELEMENT_NODE){\n\t\t\t\tif(node.getAttribute('id') == id){\n\t\t\t\t\trtv = node;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\treturn rtv;\n\t},\n\n\t/**\n\t * The `getElementsByClassName` method of `Document` interface returns an array-like object\n\t * of all child elements which have **all** of the given class name(s).\n\t *\n\t * Returns an empty list if `classeNames` is an empty string or only contains HTML white space characters.\n\t *\n\t *\n\t * Warning: This is a live LiveNodeList.\n\t * Changes in the DOM will reflect in the array as the changes occur.\n\t * If an element selected by this array no longer qualifies for the selector,\n\t * it will automatically be removed. Be aware of this for iteration purposes.\n\t *\n\t * @param {string} classNames is a string representing the class name(s) to match; multiple class names are separated by (ASCII-)whitespace\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName\n\t * @see https://dom.spec.whatwg.org/#concept-getelementsbyclassname\n\t */\n\tgetElementsByClassName: function(classNames) {\n\t\tvar classNamesSet = toOrderedSet(classNames)\n\t\treturn new LiveNodeList(this, function(base) {\n\t\t\tvar ls = [];\n\t\t\tif (classNamesSet.length > 0) {\n\t\t\t\t_visitNode(base.documentElement, function(node) {\n\t\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE) {\n\t\t\t\t\t\tvar nodeClassNames = node.getAttribute('class')\n\t\t\t\t\t\t// can be null if the attribute does not exist\n\t\t\t\t\t\tif (nodeClassNames) {\n\t\t\t\t\t\t\t// before splitting and iterating just compare them for the most common case\n\t\t\t\t\t\t\tvar matches = classNames === nodeClassNames;\n\t\t\t\t\t\t\tif (!matches) {\n\t\t\t\t\t\t\t\tvar nodeClassNamesSet = toOrderedSet(nodeClassNames)\n\t\t\t\t\t\t\t\tmatches = classNamesSet.every(arrayIncludes(nodeClassNamesSet))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(matches) {\n\t\t\t\t\t\t\t\tls.push(node);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn ls;\n\t\t});\n\t},\n\n\t//document factory method:\n\tcreateElement :\tfunction(tagName){\n\t\tvar node = new Element();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = tagName;\n\t\tnode.tagName = tagName;\n\t\tnode.localName = tagName;\n\t\tnode.childNodes = new NodeList();\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\tcreateDocumentFragment :\tfunction(){\n\t\tvar node = new DocumentFragment();\n\t\tnode.ownerDocument = this;\n\t\tnode.childNodes = new NodeList();\n\t\treturn node;\n\t},\n\tcreateTextNode :\tfunction(data){\n\t\tvar node = new Text();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateComment :\tfunction(data){\n\t\tvar node = new Comment();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateCDATASection :\tfunction(data){\n\t\tvar node = new CDATASection();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateProcessingInstruction :\tfunction(target,data){\n\t\tvar node = new ProcessingInstruction();\n\t\tnode.ownerDocument = this;\n\t\tnode.tagName = node.nodeName = node.target = target;\n\t\tnode.nodeValue = node.data = data;\n\t\treturn node;\n\t},\n\tcreateAttribute :\tfunction(name){\n\t\tvar node = new Attr();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.name = name;\n\t\tnode.nodeName\t= name;\n\t\tnode.localName = name;\n\t\tnode.specified = true;\n\t\treturn node;\n\t},\n\tcreateEntityReference :\tfunction(name){\n\t\tvar node = new EntityReference();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.nodeName\t= name;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateElementNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Element();\n\t\tvar pl = qualifiedName.split(':');\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tnode.childNodes = new NodeList();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.tagName = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateAttributeNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Attr();\n\t\tvar pl = qualifiedName.split(':');\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.name = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tnode.specified = true;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\treturn node;\n\t}\n};\n_extends(Document,Node);\n\n\nfunction Element() {\n\tthis._nsMap = {};\n};\nElement.prototype = {\n\tnodeType : ELEMENT_NODE,\n\thasAttribute : function(name){\n\t\treturn this.getAttributeNode(name)!=null;\n\t},\n\tgetAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name);\n\t\treturn attr && attr.value || '';\n\t},\n\tgetAttributeNode : function(name){\n\t\treturn this.attributes.getNamedItem(name);\n\t},\n\tsetAttribute : function(name, value){\n\t\tvar attr = this.ownerDocument.createAttribute(name);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tremoveAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name)\n\t\tattr && this.removeAttributeNode(attr);\n\t},\n\n\t//four real opeartion method\n\tappendChild:function(newChild){\n\t\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\t\treturn this.insertBefore(newChild,null);\n\t\t}else{\n\t\t\treturn _appendSingleChild(this,newChild);\n\t\t}\n\t},\n\tsetAttributeNode : function(newAttr){\n\t\treturn this.attributes.setNamedItem(newAttr);\n\t},\n\tsetAttributeNodeNS : function(newAttr){\n\t\treturn this.attributes.setNamedItemNS(newAttr);\n\t},\n\tremoveAttributeNode : function(oldAttr){\n\t\t//console.log(this == oldAttr.ownerElement)\n\t\treturn this.attributes.removeNamedItem(oldAttr.nodeName);\n\t},\n\t//get real attribute name,and remove it by removeAttributeNode\n\tremoveAttributeNS : function(namespaceURI, localName){\n\t\tvar old = this.getAttributeNodeNS(namespaceURI, localName);\n\t\told && this.removeAttributeNode(old);\n\t},\n\n\thasAttributeNS : function(namespaceURI, localName){\n\t\treturn this.getAttributeNodeNS(namespaceURI, localName)!=null;\n\t},\n\tgetAttributeNS : function(namespaceURI, localName){\n\t\tvar attr = this.getAttributeNodeNS(namespaceURI, localName);\n\t\treturn attr && attr.value || '';\n\t},\n\tsetAttributeNS : function(namespaceURI, qualifiedName, value){\n\t\tvar attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tgetAttributeNodeNS : function(namespaceURI, localName){\n\t\treturn this.attributes.getNamedItemNS(namespaceURI, localName);\n\t},\n\n\tgetElementsByTagName : function(tagName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t});\n\t},\n\tgetElementsByTagNameNS : function(namespaceURI, localName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\n\t\t});\n\t}\n};\nDocument.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;\nDocument.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;\n\n\n_extends(Element,Node);\nfunction Attr() {\n};\nAttr.prototype.nodeType = ATTRIBUTE_NODE;\n_extends(Attr,Node);\n\n\nfunction CharacterData() {\n};\nCharacterData.prototype = {\n\tdata : '',\n\tsubstringData : function(offset, count) {\n\t\treturn this.data.substring(offset, offset+count);\n\t},\n\tappendData: function(text) {\n\t\ttext = this.data+text;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t},\n\tinsertData: function(offset,text) {\n\t\tthis.replaceData(offset,0,text);\n\n\t},\n\tappendChild:function(newChild){\n\t\tthrow new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])\n\t},\n\tdeleteData: function(offset, count) {\n\t\tthis.replaceData(offset,count,\"\");\n\t},\n\treplaceData: function(offset, count, text) {\n\t\tvar start = this.data.substring(0,offset);\n\t\tvar end = this.data.substring(offset+count);\n\t\ttext = start + text + end;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t}\n}\n_extends(CharacterData,Node);\nfunction Text() {\n};\nText.prototype = {\n\tnodeName : \"#text\",\n\tnodeType : TEXT_NODE,\n\tsplitText : function(offset) {\n\t\tvar text = this.data;\n\t\tvar newText = text.substring(offset);\n\t\ttext = text.substring(0, offset);\n\t\tthis.data = this.nodeValue = text;\n\t\tthis.length = text.length;\n\t\tvar newNode = this.ownerDocument.createTextNode(newText);\n\t\tif(this.parentNode){\n\t\t\tthis.parentNode.insertBefore(newNode, this.nextSibling);\n\t\t}\n\t\treturn newNode;\n\t}\n}\n_extends(Text,CharacterData);\nfunction Comment() {\n};\nComment.prototype = {\n\tnodeName : \"#comment\",\n\tnodeType : COMMENT_NODE\n}\n_extends(Comment,CharacterData);\n\nfunction CDATASection() {\n};\nCDATASection.prototype = {\n\tnodeName : \"#cdata-section\",\n\tnodeType : CDATA_SECTION_NODE\n}\n_extends(CDATASection,CharacterData);\n\n\nfunction DocumentType() {\n};\nDocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;\n_extends(DocumentType,Node);\n\nfunction Notation() {\n};\nNotation.prototype.nodeType = NOTATION_NODE;\n_extends(Notation,Node);\n\nfunction Entity() {\n};\nEntity.prototype.nodeType = ENTITY_NODE;\n_extends(Entity,Node);\n\nfunction EntityReference() {\n};\nEntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;\n_extends(EntityReference,Node);\n\nfunction DocumentFragment() {\n};\nDocumentFragment.prototype.nodeName =\t\"#document-fragment\";\nDocumentFragment.prototype.nodeType =\tDOCUMENT_FRAGMENT_NODE;\n_extends(DocumentFragment,Node);\n\n\nfunction ProcessingInstruction() {\n}\nProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;\n_extends(ProcessingInstruction,Node);\nfunction XMLSerializer(){}\nXMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){\n\treturn nodeSerializeToString.call(node,isHtml,nodeFilter);\n}\nNode.prototype.toString = nodeSerializeToString;\nfunction nodeSerializeToString(isHtml,nodeFilter){\n\tvar buf = [];\n\tvar refNode = this.nodeType == 9 && this.documentElement || this;\n\tvar prefix = refNode.prefix;\n\tvar uri = refNode.namespaceURI;\n\n\tif(uri && prefix == null){\n\t\t//console.log(prefix)\n\t\tvar prefix = refNode.lookupPrefix(uri);\n\t\tif(prefix == null){\n\t\t\t//isHTML = true;\n\t\t\tvar visibleNamespaces=[\n\t\t\t{namespace:uri,prefix:null}\n\t\t\t//{namespace:uri,prefix:''}\n\t\t\t]\n\t\t}\n\t}\n\tserializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);\n\t//console.log('###',this.nodeType,uri,prefix,buf.join(''))\n\treturn buf.join('');\n}\n\nfunction needNamespaceDefine(node, isHTML, visibleNamespaces) {\n\tvar prefix = node.prefix || '';\n\tvar uri = node.namespaceURI;\n\t// According to [Namespaces in XML 1.0](https://www.w3.org/TR/REC-xml-names/#ns-using) ,\n\t// and more specifically https://www.w3.org/TR/REC-xml-names/#nsc-NoPrefixUndecl :\n\t// > In a namespace declaration for a prefix [...], the attribute value MUST NOT be empty.\n\t// in a similar manner [Namespaces in XML 1.1](https://www.w3.org/TR/xml-names11/#ns-using)\n\t// and more specifically https://www.w3.org/TR/xml-names11/#nsc-NSDeclared :\n\t// > [...] Furthermore, the attribute value [...] must not be an empty string.\n\t// so serializing empty namespace value like xmlns:ds=\"\" would produce an invalid XML document.\n\tif (!uri) {\n\t\treturn false;\n\t}\n\tif (prefix === \"xml\" && uri === NAMESPACE.XML || uri === NAMESPACE.XMLNS) {\n\t\treturn false;\n\t}\n\n\tvar i = visibleNamespaces.length\n\twhile (i--) {\n\t\tvar ns = visibleNamespaces[i];\n\t\t// get namespace prefix\n\t\tif (ns.prefix === prefix) {\n\t\t\treturn ns.namespace !== uri;\n\t\t}\n\t}\n\treturn true;\n}\n/**\n * Well-formed constraint: No < in Attribute Values\n * > The replacement text of any entity referred to directly or indirectly\n * > in an attribute value must not contain a <.\n * @see https://www.w3.org/TR/xml11/#CleanAttrVals\n * @see https://www.w3.org/TR/xml11/#NT-AttValue\n *\n * Literal whitespace other than space that appear in attribute values\n * are serialized as their entity references, so they will be preserved.\n * (In contrast to whitespace literals in the input which are normalized to spaces)\n * @see https://www.w3.org/TR/xml11/#AVNormalize\n * @see https://w3c.github.io/DOM-Parsing/#serializing-an-element-s-attributes\n */\nfunction addSerializedAttribute(buf, qualifiedName, value) {\n\tbuf.push(' ', qualifiedName, '=\"', value.replace(/[<>&\"\\t\\n\\r]/g, _xmlEncoder), '\"')\n}\n\nfunction serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){\n\tif (!visibleNamespaces) {\n\t\tvisibleNamespaces = [];\n\t}\n\n\tif(nodeFilter){\n\t\tnode = nodeFilter(node);\n\t\tif(node){\n\t\t\tif(typeof node == 'string'){\n\t\t\t\tbuf.push(node);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}else{\n\t\t\treturn;\n\t\t}\n\t\t//buf.sort.apply(attrs, attributeSorter);\n\t}\n\n\tswitch(node.nodeType){\n\tcase ELEMENT_NODE:\n\t\tvar attrs = node.attributes;\n\t\tvar len = attrs.length;\n\t\tvar child = node.firstChild;\n\t\tvar nodeName = node.tagName;\n\n\t\tisHTML = NAMESPACE.isHTML(node.namespaceURI) || isHTML\n\n\t\tvar prefixedNodeName = nodeName\n\t\tif (!isHTML && !node.prefix && node.namespaceURI) {\n\t\t\tvar defaultNS\n\t\t\t// lookup current default ns from `xmlns` attribute\n\t\t\tfor (var ai = 0; ai < attrs.length; ai++) {\n\t\t\t\tif (attrs.item(ai).name === 'xmlns') {\n\t\t\t\t\tdefaultNS = attrs.item(ai).value\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!defaultNS) {\n\t\t\t\t// lookup current default ns in visibleNamespaces\n\t\t\t\tfor (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {\n\t\t\t\t\tvar namespace = visibleNamespaces[nsi]\n\t\t\t\t\tif (namespace.prefix === '' && namespace.namespace === node.namespaceURI) {\n\t\t\t\t\t\tdefaultNS = namespace.namespace\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (defaultNS !== node.namespaceURI) {\n\t\t\t\tfor (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {\n\t\t\t\t\tvar namespace = visibleNamespaces[nsi]\n\t\t\t\t\tif (namespace.namespace === node.namespaceURI) {\n\t\t\t\t\t\tif (namespace.prefix) {\n\t\t\t\t\t\t\tprefixedNodeName = namespace.prefix + ':' + nodeName\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbuf.push('<', prefixedNodeName);\n\n\t\tfor(var i=0;i');\n\t\t\t//if is cdata child node\n\t\t\tif(isHTML && /^script$/i.test(nodeName)){\n\t\t\t\twhile(child){\n\t\t\t\t\tif(child.data){\n\t\t\t\t\t\tbuf.push(child.data);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\t\t\t}\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}else\n\t\t\t{\n\t\t\t\twhile(child){\n\t\t\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuf.push('');\n\t\t}else{\n\t\t\tbuf.push('/>');\n\t\t}\n\t\t// remove added visible namespaces\n\t\t//visibleNamespaces.length = startVisibleNamespaces;\n\t\treturn;\n\tcase DOCUMENT_NODE:\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t\treturn;\n\tcase ATTRIBUTE_NODE:\n\t\treturn addSerializedAttribute(buf, node.name, node.value);\n\tcase TEXT_NODE:\n\t\t/**\n\t\t * The ampersand character (&) and the left angle bracket (<) must not appear in their literal form,\n\t\t * except when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section.\n\t\t * If they are needed elsewhere, they must be escaped using either numeric character references or the strings\n\t\t * `&` and `<` respectively.\n\t\t * The right angle bracket (>) may be represented using the string \" > \", and must, for compatibility,\n\t\t * be escaped using either `>` or a character reference when it appears in the string `]]>` in content,\n\t\t * when that string is not marking the end of a CDATA section.\n\t\t *\n\t\t * In the content of elements, character data is any string of characters\n\t\t * which does not contain the start-delimiter of any markup\n\t\t * and does not include the CDATA-section-close delimiter, `]]>`.\n\t\t *\n\t\t * @see https://www.w3.org/TR/xml/#NT-CharData\n\t\t * @see https://w3c.github.io/DOM-Parsing/#xml-serializing-a-text-node\n\t\t */\n\t\treturn buf.push(node.data\n\t\t\t.replace(/[<&>]/g,_xmlEncoder)\n\t\t);\n\tcase CDATA_SECTION_NODE:\n\t\treturn buf.push( '');\n\tcase COMMENT_NODE:\n\t\treturn buf.push( \"\");\n\tcase DOCUMENT_TYPE_NODE:\n\t\tvar pubid = node.publicId;\n\t\tvar sysid = node.systemId;\n\t\tbuf.push('');\n\t\t}else if(sysid && sysid!='.'){\n\t\t\tbuf.push(' SYSTEM ', sysid, '>');\n\t\t}else{\n\t\t\tvar sub = node.internalSubset;\n\t\t\tif(sub){\n\t\t\t\tbuf.push(\" [\",sub,\"]\");\n\t\t\t}\n\t\t\tbuf.push(\">\");\n\t\t}\n\t\treturn;\n\tcase PROCESSING_INSTRUCTION_NODE:\n\t\treturn buf.push( \"\");\n\tcase ENTITY_REFERENCE_NODE:\n\t\treturn buf.push( '&',node.nodeName,';');\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\tdefault:\n\t\tbuf.push('??',node.nodeName);\n\t}\n}\nfunction importNode(doc,node,deep){\n\tvar node2;\n\tswitch (node.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tnode2 = node.cloneNode(false);\n\t\tnode2.ownerDocument = doc;\n\t\t//var attrs = node2.attributes;\n\t\t//var len = attrs.length;\n\t\t//for(var i=0;i',\n\tlt: '<',\n\tquot: '\"',\n});\n\n/**\n * A map of all entities that are detected in an HTML document.\n * They contain all entries from `XML_ENTITIES`.\n *\n * @see XML_ENTITIES\n * @see DOMParser.parseFromString\n * @see DOMImplementation.prototype.createHTMLDocument\n * @see https://html.spec.whatwg.org/#named-character-references WHATWG HTML(5) Spec\n * @see https://html.spec.whatwg.org/entities.json JSON\n * @see https://www.w3.org/TR/xml-entity-names/ W3C XML Entity Names\n * @see https://www.w3.org/TR/html4/sgml/entities.html W3C HTML4/SGML\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML Wikipedia (HTML)\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Entities_representing_special_characters_in_XHTML Wikpedia (XHTML)\n */\nexports.HTML_ENTITIES = freeze({\n\tAacute: '\\u00C1',\n\taacute: '\\u00E1',\n\tAbreve: '\\u0102',\n\tabreve: '\\u0103',\n\tac: '\\u223E',\n\tacd: '\\u223F',\n\tacE: '\\u223E\\u0333',\n\tAcirc: '\\u00C2',\n\tacirc: '\\u00E2',\n\tacute: '\\u00B4',\n\tAcy: '\\u0410',\n\tacy: '\\u0430',\n\tAElig: '\\u00C6',\n\taelig: '\\u00E6',\n\taf: '\\u2061',\n\tAfr: '\\uD835\\uDD04',\n\tafr: '\\uD835\\uDD1E',\n\tAgrave: '\\u00C0',\n\tagrave: '\\u00E0',\n\talefsym: '\\u2135',\n\taleph: '\\u2135',\n\tAlpha: '\\u0391',\n\talpha: '\\u03B1',\n\tAmacr: '\\u0100',\n\tamacr: '\\u0101',\n\tamalg: '\\u2A3F',\n\tAMP: '\\u0026',\n\tamp: '\\u0026',\n\tAnd: '\\u2A53',\n\tand: '\\u2227',\n\tandand: '\\u2A55',\n\tandd: '\\u2A5C',\n\tandslope: '\\u2A58',\n\tandv: '\\u2A5A',\n\tang: '\\u2220',\n\tange: '\\u29A4',\n\tangle: '\\u2220',\n\tangmsd: '\\u2221',\n\tangmsdaa: '\\u29A8',\n\tangmsdab: '\\u29A9',\n\tangmsdac: '\\u29AA',\n\tangmsdad: '\\u29AB',\n\tangmsdae: '\\u29AC',\n\tangmsdaf: '\\u29AD',\n\tangmsdag: '\\u29AE',\n\tangmsdah: '\\u29AF',\n\tangrt: '\\u221F',\n\tangrtvb: '\\u22BE',\n\tangrtvbd: '\\u299D',\n\tangsph: '\\u2222',\n\tangst: '\\u00C5',\n\tangzarr: '\\u237C',\n\tAogon: '\\u0104',\n\taogon: '\\u0105',\n\tAopf: '\\uD835\\uDD38',\n\taopf: '\\uD835\\uDD52',\n\tap: '\\u2248',\n\tapacir: '\\u2A6F',\n\tapE: '\\u2A70',\n\tape: '\\u224A',\n\tapid: '\\u224B',\n\tapos: '\\u0027',\n\tApplyFunction: '\\u2061',\n\tapprox: '\\u2248',\n\tapproxeq: '\\u224A',\n\tAring: '\\u00C5',\n\taring: '\\u00E5',\n\tAscr: '\\uD835\\uDC9C',\n\tascr: '\\uD835\\uDCB6',\n\tAssign: '\\u2254',\n\tast: '\\u002A',\n\tasymp: '\\u2248',\n\tasympeq: '\\u224D',\n\tAtilde: '\\u00C3',\n\tatilde: '\\u00E3',\n\tAuml: '\\u00C4',\n\tauml: '\\u00E4',\n\tawconint: '\\u2233',\n\tawint: '\\u2A11',\n\tbackcong: '\\u224C',\n\tbackepsilon: '\\u03F6',\n\tbackprime: '\\u2035',\n\tbacksim: '\\u223D',\n\tbacksimeq: '\\u22CD',\n\tBackslash: '\\u2216',\n\tBarv: '\\u2AE7',\n\tbarvee: '\\u22BD',\n\tBarwed: '\\u2306',\n\tbarwed: '\\u2305',\n\tbarwedge: '\\u2305',\n\tbbrk: '\\u23B5',\n\tbbrktbrk: '\\u23B6',\n\tbcong: '\\u224C',\n\tBcy: '\\u0411',\n\tbcy: '\\u0431',\n\tbdquo: '\\u201E',\n\tbecaus: '\\u2235',\n\tBecause: '\\u2235',\n\tbecause: '\\u2235',\n\tbemptyv: '\\u29B0',\n\tbepsi: '\\u03F6',\n\tbernou: '\\u212C',\n\tBernoullis: '\\u212C',\n\tBeta: '\\u0392',\n\tbeta: '\\u03B2',\n\tbeth: '\\u2136',\n\tbetween: '\\u226C',\n\tBfr: '\\uD835\\uDD05',\n\tbfr: '\\uD835\\uDD1F',\n\tbigcap: '\\u22C2',\n\tbigcirc: '\\u25EF',\n\tbigcup: '\\u22C3',\n\tbigodot: '\\u2A00',\n\tbigoplus: '\\u2A01',\n\tbigotimes: '\\u2A02',\n\tbigsqcup: '\\u2A06',\n\tbigstar: '\\u2605',\n\tbigtriangledown: '\\u25BD',\n\tbigtriangleup: '\\u25B3',\n\tbiguplus: '\\u2A04',\n\tbigvee: '\\u22C1',\n\tbigwedge: '\\u22C0',\n\tbkarow: '\\u290D',\n\tblacklozenge: '\\u29EB',\n\tblacksquare: '\\u25AA',\n\tblacktriangle: '\\u25B4',\n\tblacktriangledown: '\\u25BE',\n\tblacktriangleleft: '\\u25C2',\n\tblacktriangleright: '\\u25B8',\n\tblank: '\\u2423',\n\tblk12: '\\u2592',\n\tblk14: '\\u2591',\n\tblk34: '\\u2593',\n\tblock: '\\u2588',\n\tbne: '\\u003D\\u20E5',\n\tbnequiv: '\\u2261\\u20E5',\n\tbNot: '\\u2AED',\n\tbnot: '\\u2310',\n\tBopf: '\\uD835\\uDD39',\n\tbopf: '\\uD835\\uDD53',\n\tbot: '\\u22A5',\n\tbottom: '\\u22A5',\n\tbowtie: '\\u22C8',\n\tboxbox: '\\u29C9',\n\tboxDL: '\\u2557',\n\tboxDl: '\\u2556',\n\tboxdL: '\\u2555',\n\tboxdl: '\\u2510',\n\tboxDR: '\\u2554',\n\tboxDr: '\\u2553',\n\tboxdR: '\\u2552',\n\tboxdr: '\\u250C',\n\tboxH: '\\u2550',\n\tboxh: '\\u2500',\n\tboxHD: '\\u2566',\n\tboxHd: '\\u2564',\n\tboxhD: '\\u2565',\n\tboxhd: '\\u252C',\n\tboxHU: '\\u2569',\n\tboxHu: '\\u2567',\n\tboxhU: '\\u2568',\n\tboxhu: '\\u2534',\n\tboxminus: '\\u229F',\n\tboxplus: '\\u229E',\n\tboxtimes: '\\u22A0',\n\tboxUL: '\\u255D',\n\tboxUl: '\\u255C',\n\tboxuL: '\\u255B',\n\tboxul: '\\u2518',\n\tboxUR: '\\u255A',\n\tboxUr: '\\u2559',\n\tboxuR: '\\u2558',\n\tboxur: '\\u2514',\n\tboxV: '\\u2551',\n\tboxv: '\\u2502',\n\tboxVH: '\\u256C',\n\tboxVh: '\\u256B',\n\tboxvH: '\\u256A',\n\tboxvh: '\\u253C',\n\tboxVL: '\\u2563',\n\tboxVl: '\\u2562',\n\tboxvL: '\\u2561',\n\tboxvl: '\\u2524',\n\tboxVR: '\\u2560',\n\tboxVr: '\\u255F',\n\tboxvR: '\\u255E',\n\tboxvr: '\\u251C',\n\tbprime: '\\u2035',\n\tBreve: '\\u02D8',\n\tbreve: '\\u02D8',\n\tbrvbar: '\\u00A6',\n\tBscr: '\\u212C',\n\tbscr: '\\uD835\\uDCB7',\n\tbsemi: '\\u204F',\n\tbsim: '\\u223D',\n\tbsime: '\\u22CD',\n\tbsol: '\\u005C',\n\tbsolb: '\\u29C5',\n\tbsolhsub: '\\u27C8',\n\tbull: '\\u2022',\n\tbullet: '\\u2022',\n\tbump: '\\u224E',\n\tbumpE: '\\u2AAE',\n\tbumpe: '\\u224F',\n\tBumpeq: '\\u224E',\n\tbumpeq: '\\u224F',\n\tCacute: '\\u0106',\n\tcacute: '\\u0107',\n\tCap: '\\u22D2',\n\tcap: '\\u2229',\n\tcapand: '\\u2A44',\n\tcapbrcup: '\\u2A49',\n\tcapcap: '\\u2A4B',\n\tcapcup: '\\u2A47',\n\tcapdot: '\\u2A40',\n\tCapitalDifferentialD: '\\u2145',\n\tcaps: '\\u2229\\uFE00',\n\tcaret: '\\u2041',\n\tcaron: '\\u02C7',\n\tCayleys: '\\u212D',\n\tccaps: '\\u2A4D',\n\tCcaron: '\\u010C',\n\tccaron: '\\u010D',\n\tCcedil: '\\u00C7',\n\tccedil: '\\u00E7',\n\tCcirc: '\\u0108',\n\tccirc: '\\u0109',\n\tCconint: '\\u2230',\n\tccups: '\\u2A4C',\n\tccupssm: '\\u2A50',\n\tCdot: '\\u010A',\n\tcdot: '\\u010B',\n\tcedil: '\\u00B8',\n\tCedilla: '\\u00B8',\n\tcemptyv: '\\u29B2',\n\tcent: '\\u00A2',\n\tCenterDot: '\\u00B7',\n\tcenterdot: '\\u00B7',\n\tCfr: '\\u212D',\n\tcfr: '\\uD835\\uDD20',\n\tCHcy: '\\u0427',\n\tchcy: '\\u0447',\n\tcheck: '\\u2713',\n\tcheckmark: '\\u2713',\n\tChi: '\\u03A7',\n\tchi: '\\u03C7',\n\tcir: '\\u25CB',\n\tcirc: '\\u02C6',\n\tcirceq: '\\u2257',\n\tcirclearrowleft: '\\u21BA',\n\tcirclearrowright: '\\u21BB',\n\tcircledast: '\\u229B',\n\tcircledcirc: '\\u229A',\n\tcircleddash: '\\u229D',\n\tCircleDot: '\\u2299',\n\tcircledR: '\\u00AE',\n\tcircledS: '\\u24C8',\n\tCircleMinus: '\\u2296',\n\tCirclePlus: '\\u2295',\n\tCircleTimes: '\\u2297',\n\tcirE: '\\u29C3',\n\tcire: '\\u2257',\n\tcirfnint: '\\u2A10',\n\tcirmid: '\\u2AEF',\n\tcirscir: '\\u29C2',\n\tClockwiseContourIntegral: '\\u2232',\n\tCloseCurlyDoubleQuote: '\\u201D',\n\tCloseCurlyQuote: '\\u2019',\n\tclubs: '\\u2663',\n\tclubsuit: '\\u2663',\n\tColon: '\\u2237',\n\tcolon: '\\u003A',\n\tColone: '\\u2A74',\n\tcolone: '\\u2254',\n\tcoloneq: '\\u2254',\n\tcomma: '\\u002C',\n\tcommat: '\\u0040',\n\tcomp: '\\u2201',\n\tcompfn: '\\u2218',\n\tcomplement: '\\u2201',\n\tcomplexes: '\\u2102',\n\tcong: '\\u2245',\n\tcongdot: '\\u2A6D',\n\tCongruent: '\\u2261',\n\tConint: '\\u222F',\n\tconint: '\\u222E',\n\tContourIntegral: '\\u222E',\n\tCopf: '\\u2102',\n\tcopf: '\\uD835\\uDD54',\n\tcoprod: '\\u2210',\n\tCoproduct: '\\u2210',\n\tCOPY: '\\u00A9',\n\tcopy: '\\u00A9',\n\tcopysr: '\\u2117',\n\tCounterClockwiseContourIntegral: '\\u2233',\n\tcrarr: '\\u21B5',\n\tCross: '\\u2A2F',\n\tcross: '\\u2717',\n\tCscr: '\\uD835\\uDC9E',\n\tcscr: '\\uD835\\uDCB8',\n\tcsub: '\\u2ACF',\n\tcsube: '\\u2AD1',\n\tcsup: '\\u2AD0',\n\tcsupe: '\\u2AD2',\n\tctdot: '\\u22EF',\n\tcudarrl: '\\u2938',\n\tcudarrr: '\\u2935',\n\tcuepr: '\\u22DE',\n\tcuesc: '\\u22DF',\n\tcularr: '\\u21B6',\n\tcularrp: '\\u293D',\n\tCup: '\\u22D3',\n\tcup: '\\u222A',\n\tcupbrcap: '\\u2A48',\n\tCupCap: '\\u224D',\n\tcupcap: '\\u2A46',\n\tcupcup: '\\u2A4A',\n\tcupdot: '\\u228D',\n\tcupor: '\\u2A45',\n\tcups: '\\u222A\\uFE00',\n\tcurarr: '\\u21B7',\n\tcurarrm: '\\u293C',\n\tcurlyeqprec: '\\u22DE',\n\tcurlyeqsucc: '\\u22DF',\n\tcurlyvee: '\\u22CE',\n\tcurlywedge: '\\u22CF',\n\tcurren: '\\u00A4',\n\tcurvearrowleft: '\\u21B6',\n\tcurvearrowright: '\\u21B7',\n\tcuvee: '\\u22CE',\n\tcuwed: '\\u22CF',\n\tcwconint: '\\u2232',\n\tcwint: '\\u2231',\n\tcylcty: '\\u232D',\n\tDagger: '\\u2021',\n\tdagger: '\\u2020',\n\tdaleth: '\\u2138',\n\tDarr: '\\u21A1',\n\tdArr: '\\u21D3',\n\tdarr: '\\u2193',\n\tdash: '\\u2010',\n\tDashv: '\\u2AE4',\n\tdashv: '\\u22A3',\n\tdbkarow: '\\u290F',\n\tdblac: '\\u02DD',\n\tDcaron: '\\u010E',\n\tdcaron: '\\u010F',\n\tDcy: '\\u0414',\n\tdcy: '\\u0434',\n\tDD: '\\u2145',\n\tdd: '\\u2146',\n\tddagger: '\\u2021',\n\tddarr: '\\u21CA',\n\tDDotrahd: '\\u2911',\n\tddotseq: '\\u2A77',\n\tdeg: '\\u00B0',\n\tDel: '\\u2207',\n\tDelta: '\\u0394',\n\tdelta: '\\u03B4',\n\tdemptyv: '\\u29B1',\n\tdfisht: '\\u297F',\n\tDfr: '\\uD835\\uDD07',\n\tdfr: '\\uD835\\uDD21',\n\tdHar: '\\u2965',\n\tdharl: '\\u21C3',\n\tdharr: '\\u21C2',\n\tDiacriticalAcute: '\\u00B4',\n\tDiacriticalDot: '\\u02D9',\n\tDiacriticalDoubleAcute: '\\u02DD',\n\tDiacriticalGrave: '\\u0060',\n\tDiacriticalTilde: '\\u02DC',\n\tdiam: '\\u22C4',\n\tDiamond: '\\u22C4',\n\tdiamond: '\\u22C4',\n\tdiamondsuit: '\\u2666',\n\tdiams: '\\u2666',\n\tdie: '\\u00A8',\n\tDifferentialD: '\\u2146',\n\tdigamma: '\\u03DD',\n\tdisin: '\\u22F2',\n\tdiv: '\\u00F7',\n\tdivide: '\\u00F7',\n\tdivideontimes: '\\u22C7',\n\tdivonx: '\\u22C7',\n\tDJcy: '\\u0402',\n\tdjcy: '\\u0452',\n\tdlcorn: '\\u231E',\n\tdlcrop: '\\u230D',\n\tdollar: '\\u0024',\n\tDopf: '\\uD835\\uDD3B',\n\tdopf: '\\uD835\\uDD55',\n\tDot: '\\u00A8',\n\tdot: '\\u02D9',\n\tDotDot: '\\u20DC',\n\tdoteq: '\\u2250',\n\tdoteqdot: '\\u2251',\n\tDotEqual: '\\u2250',\n\tdotminus: '\\u2238',\n\tdotplus: '\\u2214',\n\tdotsquare: '\\u22A1',\n\tdoublebarwedge: '\\u2306',\n\tDoubleContourIntegral: '\\u222F',\n\tDoubleDot: '\\u00A8',\n\tDoubleDownArrow: '\\u21D3',\n\tDoubleLeftArrow: '\\u21D0',\n\tDoubleLeftRightArrow: '\\u21D4',\n\tDoubleLeftTee: '\\u2AE4',\n\tDoubleLongLeftArrow: '\\u27F8',\n\tDoubleLongLeftRightArrow: '\\u27FA',\n\tDoubleLongRightArrow: '\\u27F9',\n\tDoubleRightArrow: '\\u21D2',\n\tDoubleRightTee: '\\u22A8',\n\tDoubleUpArrow: '\\u21D1',\n\tDoubleUpDownArrow: '\\u21D5',\n\tDoubleVerticalBar: '\\u2225',\n\tDownArrow: '\\u2193',\n\tDownarrow: '\\u21D3',\n\tdownarrow: '\\u2193',\n\tDownArrowBar: '\\u2913',\n\tDownArrowUpArrow: '\\u21F5',\n\tDownBreve: '\\u0311',\n\tdowndownarrows: '\\u21CA',\n\tdownharpoonleft: '\\u21C3',\n\tdownharpoonright: '\\u21C2',\n\tDownLeftRightVector: '\\u2950',\n\tDownLeftTeeVector: '\\u295E',\n\tDownLeftVector: '\\u21BD',\n\tDownLeftVectorBar: '\\u2956',\n\tDownRightTeeVector: '\\u295F',\n\tDownRightVector: '\\u21C1',\n\tDownRightVectorBar: '\\u2957',\n\tDownTee: '\\u22A4',\n\tDownTeeArrow: '\\u21A7',\n\tdrbkarow: '\\u2910',\n\tdrcorn: '\\u231F',\n\tdrcrop: '\\u230C',\n\tDscr: '\\uD835\\uDC9F',\n\tdscr: '\\uD835\\uDCB9',\n\tDScy: '\\u0405',\n\tdscy: '\\u0455',\n\tdsol: '\\u29F6',\n\tDstrok: '\\u0110',\n\tdstrok: '\\u0111',\n\tdtdot: '\\u22F1',\n\tdtri: '\\u25BF',\n\tdtrif: '\\u25BE',\n\tduarr: '\\u21F5',\n\tduhar: '\\u296F',\n\tdwangle: '\\u29A6',\n\tDZcy: '\\u040F',\n\tdzcy: '\\u045F',\n\tdzigrarr: '\\u27FF',\n\tEacute: '\\u00C9',\n\teacute: '\\u00E9',\n\teaster: '\\u2A6E',\n\tEcaron: '\\u011A',\n\tecaron: '\\u011B',\n\tecir: '\\u2256',\n\tEcirc: '\\u00CA',\n\tecirc: '\\u00EA',\n\tecolon: '\\u2255',\n\tEcy: '\\u042D',\n\tecy: '\\u044D',\n\teDDot: '\\u2A77',\n\tEdot: '\\u0116',\n\teDot: '\\u2251',\n\tedot: '\\u0117',\n\tee: '\\u2147',\n\tefDot: '\\u2252',\n\tEfr: '\\uD835\\uDD08',\n\tefr: '\\uD835\\uDD22',\n\teg: '\\u2A9A',\n\tEgrave: '\\u00C8',\n\tegrave: '\\u00E8',\n\tegs: '\\u2A96',\n\tegsdot: '\\u2A98',\n\tel: '\\u2A99',\n\tElement: '\\u2208',\n\telinters: '\\u23E7',\n\tell: '\\u2113',\n\tels: '\\u2A95',\n\telsdot: '\\u2A97',\n\tEmacr: '\\u0112',\n\temacr: '\\u0113',\n\tempty: '\\u2205',\n\temptyset: '\\u2205',\n\tEmptySmallSquare: '\\u25FB',\n\temptyv: '\\u2205',\n\tEmptyVerySmallSquare: '\\u25AB',\n\temsp: '\\u2003',\n\temsp13: '\\u2004',\n\temsp14: '\\u2005',\n\tENG: '\\u014A',\n\teng: '\\u014B',\n\tensp: '\\u2002',\n\tEogon: '\\u0118',\n\teogon: '\\u0119',\n\tEopf: '\\uD835\\uDD3C',\n\teopf: '\\uD835\\uDD56',\n\tepar: '\\u22D5',\n\teparsl: '\\u29E3',\n\teplus: '\\u2A71',\n\tepsi: '\\u03B5',\n\tEpsilon: '\\u0395',\n\tepsilon: '\\u03B5',\n\tepsiv: '\\u03F5',\n\teqcirc: '\\u2256',\n\teqcolon: '\\u2255',\n\teqsim: '\\u2242',\n\teqslantgtr: '\\u2A96',\n\teqslantless: '\\u2A95',\n\tEqual: '\\u2A75',\n\tequals: '\\u003D',\n\tEqualTilde: '\\u2242',\n\tequest: '\\u225F',\n\tEquilibrium: '\\u21CC',\n\tequiv: '\\u2261',\n\tequivDD: '\\u2A78',\n\teqvparsl: '\\u29E5',\n\terarr: '\\u2971',\n\terDot: '\\u2253',\n\tEscr: '\\u2130',\n\tescr: '\\u212F',\n\tesdot: '\\u2250',\n\tEsim: '\\u2A73',\n\tesim: '\\u2242',\n\tEta: '\\u0397',\n\teta: '\\u03B7',\n\tETH: '\\u00D0',\n\teth: '\\u00F0',\n\tEuml: '\\u00CB',\n\teuml: '\\u00EB',\n\teuro: '\\u20AC',\n\texcl: '\\u0021',\n\texist: '\\u2203',\n\tExists: '\\u2203',\n\texpectation: '\\u2130',\n\tExponentialE: '\\u2147',\n\texponentiale: '\\u2147',\n\tfallingdotseq: '\\u2252',\n\tFcy: '\\u0424',\n\tfcy: '\\u0444',\n\tfemale: '\\u2640',\n\tffilig: '\\uFB03',\n\tfflig: '\\uFB00',\n\tffllig: '\\uFB04',\n\tFfr: '\\uD835\\uDD09',\n\tffr: '\\uD835\\uDD23',\n\tfilig: '\\uFB01',\n\tFilledSmallSquare: '\\u25FC',\n\tFilledVerySmallSquare: '\\u25AA',\n\tfjlig: '\\u0066\\u006A',\n\tflat: '\\u266D',\n\tfllig: '\\uFB02',\n\tfltns: '\\u25B1',\n\tfnof: '\\u0192',\n\tFopf: '\\uD835\\uDD3D',\n\tfopf: '\\uD835\\uDD57',\n\tForAll: '\\u2200',\n\tforall: '\\u2200',\n\tfork: '\\u22D4',\n\tforkv: '\\u2AD9',\n\tFouriertrf: '\\u2131',\n\tfpartint: '\\u2A0D',\n\tfrac12: '\\u00BD',\n\tfrac13: '\\u2153',\n\tfrac14: '\\u00BC',\n\tfrac15: '\\u2155',\n\tfrac16: '\\u2159',\n\tfrac18: '\\u215B',\n\tfrac23: '\\u2154',\n\tfrac25: '\\u2156',\n\tfrac34: '\\u00BE',\n\tfrac35: '\\u2157',\n\tfrac38: '\\u215C',\n\tfrac45: '\\u2158',\n\tfrac56: '\\u215A',\n\tfrac58: '\\u215D',\n\tfrac78: '\\u215E',\n\tfrasl: '\\u2044',\n\tfrown: '\\u2322',\n\tFscr: '\\u2131',\n\tfscr: '\\uD835\\uDCBB',\n\tgacute: '\\u01F5',\n\tGamma: '\\u0393',\n\tgamma: '\\u03B3',\n\tGammad: '\\u03DC',\n\tgammad: '\\u03DD',\n\tgap: '\\u2A86',\n\tGbreve: '\\u011E',\n\tgbreve: '\\u011F',\n\tGcedil: '\\u0122',\n\tGcirc: '\\u011C',\n\tgcirc: '\\u011D',\n\tGcy: '\\u0413',\n\tgcy: '\\u0433',\n\tGdot: '\\u0120',\n\tgdot: '\\u0121',\n\tgE: '\\u2267',\n\tge: '\\u2265',\n\tgEl: '\\u2A8C',\n\tgel: '\\u22DB',\n\tgeq: '\\u2265',\n\tgeqq: '\\u2267',\n\tgeqslant: '\\u2A7E',\n\tges: '\\u2A7E',\n\tgescc: '\\u2AA9',\n\tgesdot: '\\u2A80',\n\tgesdoto: '\\u2A82',\n\tgesdotol: '\\u2A84',\n\tgesl: '\\u22DB\\uFE00',\n\tgesles: '\\u2A94',\n\tGfr: '\\uD835\\uDD0A',\n\tgfr: '\\uD835\\uDD24',\n\tGg: '\\u22D9',\n\tgg: '\\u226B',\n\tggg: '\\u22D9',\n\tgimel: '\\u2137',\n\tGJcy: '\\u0403',\n\tgjcy: '\\u0453',\n\tgl: '\\u2277',\n\tgla: '\\u2AA5',\n\tglE: '\\u2A92',\n\tglj: '\\u2AA4',\n\tgnap: '\\u2A8A',\n\tgnapprox: '\\u2A8A',\n\tgnE: '\\u2269',\n\tgne: '\\u2A88',\n\tgneq: '\\u2A88',\n\tgneqq: '\\u2269',\n\tgnsim: '\\u22E7',\n\tGopf: '\\uD835\\uDD3E',\n\tgopf: '\\uD835\\uDD58',\n\tgrave: '\\u0060',\n\tGreaterEqual: '\\u2265',\n\tGreaterEqualLess: '\\u22DB',\n\tGreaterFullEqual: '\\u2267',\n\tGreaterGreater: '\\u2AA2',\n\tGreaterLess: '\\u2277',\n\tGreaterSlantEqual: '\\u2A7E',\n\tGreaterTilde: '\\u2273',\n\tGscr: '\\uD835\\uDCA2',\n\tgscr: '\\u210A',\n\tgsim: '\\u2273',\n\tgsime: '\\u2A8E',\n\tgsiml: '\\u2A90',\n\tGt: '\\u226B',\n\tGT: '\\u003E',\n\tgt: '\\u003E',\n\tgtcc: '\\u2AA7',\n\tgtcir: '\\u2A7A',\n\tgtdot: '\\u22D7',\n\tgtlPar: '\\u2995',\n\tgtquest: '\\u2A7C',\n\tgtrapprox: '\\u2A86',\n\tgtrarr: '\\u2978',\n\tgtrdot: '\\u22D7',\n\tgtreqless: '\\u22DB',\n\tgtreqqless: '\\u2A8C',\n\tgtrless: '\\u2277',\n\tgtrsim: '\\u2273',\n\tgvertneqq: '\\u2269\\uFE00',\n\tgvnE: '\\u2269\\uFE00',\n\tHacek: '\\u02C7',\n\thairsp: '\\u200A',\n\thalf: '\\u00BD',\n\thamilt: '\\u210B',\n\tHARDcy: '\\u042A',\n\thardcy: '\\u044A',\n\thArr: '\\u21D4',\n\tharr: '\\u2194',\n\tharrcir: '\\u2948',\n\tharrw: '\\u21AD',\n\tHat: '\\u005E',\n\thbar: '\\u210F',\n\tHcirc: '\\u0124',\n\thcirc: '\\u0125',\n\thearts: '\\u2665',\n\theartsuit: '\\u2665',\n\thellip: '\\u2026',\n\thercon: '\\u22B9',\n\tHfr: '\\u210C',\n\thfr: '\\uD835\\uDD25',\n\tHilbertSpace: '\\u210B',\n\thksearow: '\\u2925',\n\thkswarow: '\\u2926',\n\thoarr: '\\u21FF',\n\thomtht: '\\u223B',\n\thookleftarrow: '\\u21A9',\n\thookrightarrow: '\\u21AA',\n\tHopf: '\\u210D',\n\thopf: '\\uD835\\uDD59',\n\thorbar: '\\u2015',\n\tHorizontalLine: '\\u2500',\n\tHscr: '\\u210B',\n\thscr: '\\uD835\\uDCBD',\n\thslash: '\\u210F',\n\tHstrok: '\\u0126',\n\thstrok: '\\u0127',\n\tHumpDownHump: '\\u224E',\n\tHumpEqual: '\\u224F',\n\thybull: '\\u2043',\n\thyphen: '\\u2010',\n\tIacute: '\\u00CD',\n\tiacute: '\\u00ED',\n\tic: '\\u2063',\n\tIcirc: '\\u00CE',\n\ticirc: '\\u00EE',\n\tIcy: '\\u0418',\n\ticy: '\\u0438',\n\tIdot: '\\u0130',\n\tIEcy: '\\u0415',\n\tiecy: '\\u0435',\n\tiexcl: '\\u00A1',\n\tiff: '\\u21D4',\n\tIfr: '\\u2111',\n\tifr: '\\uD835\\uDD26',\n\tIgrave: '\\u00CC',\n\tigrave: '\\u00EC',\n\tii: '\\u2148',\n\tiiiint: '\\u2A0C',\n\tiiint: '\\u222D',\n\tiinfin: '\\u29DC',\n\tiiota: '\\u2129',\n\tIJlig: '\\u0132',\n\tijlig: '\\u0133',\n\tIm: '\\u2111',\n\tImacr: '\\u012A',\n\timacr: '\\u012B',\n\timage: '\\u2111',\n\tImaginaryI: '\\u2148',\n\timagline: '\\u2110',\n\timagpart: '\\u2111',\n\timath: '\\u0131',\n\timof: '\\u22B7',\n\timped: '\\u01B5',\n\tImplies: '\\u21D2',\n\tin: '\\u2208',\n\tincare: '\\u2105',\n\tinfin: '\\u221E',\n\tinfintie: '\\u29DD',\n\tinodot: '\\u0131',\n\tInt: '\\u222C',\n\tint: '\\u222B',\n\tintcal: '\\u22BA',\n\tintegers: '\\u2124',\n\tIntegral: '\\u222B',\n\tintercal: '\\u22BA',\n\tIntersection: '\\u22C2',\n\tintlarhk: '\\u2A17',\n\tintprod: '\\u2A3C',\n\tInvisibleComma: '\\u2063',\n\tInvisibleTimes: '\\u2062',\n\tIOcy: '\\u0401',\n\tiocy: '\\u0451',\n\tIogon: '\\u012E',\n\tiogon: '\\u012F',\n\tIopf: '\\uD835\\uDD40',\n\tiopf: '\\uD835\\uDD5A',\n\tIota: '\\u0399',\n\tiota: '\\u03B9',\n\tiprod: '\\u2A3C',\n\tiquest: '\\u00BF',\n\tIscr: '\\u2110',\n\tiscr: '\\uD835\\uDCBE',\n\tisin: '\\u2208',\n\tisindot: '\\u22F5',\n\tisinE: '\\u22F9',\n\tisins: '\\u22F4',\n\tisinsv: '\\u22F3',\n\tisinv: '\\u2208',\n\tit: '\\u2062',\n\tItilde: '\\u0128',\n\titilde: '\\u0129',\n\tIukcy: '\\u0406',\n\tiukcy: '\\u0456',\n\tIuml: '\\u00CF',\n\tiuml: '\\u00EF',\n\tJcirc: '\\u0134',\n\tjcirc: '\\u0135',\n\tJcy: '\\u0419',\n\tjcy: '\\u0439',\n\tJfr: '\\uD835\\uDD0D',\n\tjfr: '\\uD835\\uDD27',\n\tjmath: '\\u0237',\n\tJopf: '\\uD835\\uDD41',\n\tjopf: '\\uD835\\uDD5B',\n\tJscr: '\\uD835\\uDCA5',\n\tjscr: '\\uD835\\uDCBF',\n\tJsercy: '\\u0408',\n\tjsercy: '\\u0458',\n\tJukcy: '\\u0404',\n\tjukcy: '\\u0454',\n\tKappa: '\\u039A',\n\tkappa: '\\u03BA',\n\tkappav: '\\u03F0',\n\tKcedil: '\\u0136',\n\tkcedil: '\\u0137',\n\tKcy: '\\u041A',\n\tkcy: '\\u043A',\n\tKfr: '\\uD835\\uDD0E',\n\tkfr: '\\uD835\\uDD28',\n\tkgreen: '\\u0138',\n\tKHcy: '\\u0425',\n\tkhcy: '\\u0445',\n\tKJcy: '\\u040C',\n\tkjcy: '\\u045C',\n\tKopf: '\\uD835\\uDD42',\n\tkopf: '\\uD835\\uDD5C',\n\tKscr: '\\uD835\\uDCA6',\n\tkscr: '\\uD835\\uDCC0',\n\tlAarr: '\\u21DA',\n\tLacute: '\\u0139',\n\tlacute: '\\u013A',\n\tlaemptyv: '\\u29B4',\n\tlagran: '\\u2112',\n\tLambda: '\\u039B',\n\tlambda: '\\u03BB',\n\tLang: '\\u27EA',\n\tlang: '\\u27E8',\n\tlangd: '\\u2991',\n\tlangle: '\\u27E8',\n\tlap: '\\u2A85',\n\tLaplacetrf: '\\u2112',\n\tlaquo: '\\u00AB',\n\tLarr: '\\u219E',\n\tlArr: '\\u21D0',\n\tlarr: '\\u2190',\n\tlarrb: '\\u21E4',\n\tlarrbfs: '\\u291F',\n\tlarrfs: '\\u291D',\n\tlarrhk: '\\u21A9',\n\tlarrlp: '\\u21AB',\n\tlarrpl: '\\u2939',\n\tlarrsim: '\\u2973',\n\tlarrtl: '\\u21A2',\n\tlat: '\\u2AAB',\n\tlAtail: '\\u291B',\n\tlatail: '\\u2919',\n\tlate: '\\u2AAD',\n\tlates: '\\u2AAD\\uFE00',\n\tlBarr: '\\u290E',\n\tlbarr: '\\u290C',\n\tlbbrk: '\\u2772',\n\tlbrace: '\\u007B',\n\tlbrack: '\\u005B',\n\tlbrke: '\\u298B',\n\tlbrksld: '\\u298F',\n\tlbrkslu: '\\u298D',\n\tLcaron: '\\u013D',\n\tlcaron: '\\u013E',\n\tLcedil: '\\u013B',\n\tlcedil: '\\u013C',\n\tlceil: '\\u2308',\n\tlcub: '\\u007B',\n\tLcy: '\\u041B',\n\tlcy: '\\u043B',\n\tldca: '\\u2936',\n\tldquo: '\\u201C',\n\tldquor: '\\u201E',\n\tldrdhar: '\\u2967',\n\tldrushar: '\\u294B',\n\tldsh: '\\u21B2',\n\tlE: '\\u2266',\n\tle: '\\u2264',\n\tLeftAngleBracket: '\\u27E8',\n\tLeftArrow: '\\u2190',\n\tLeftarrow: '\\u21D0',\n\tleftarrow: '\\u2190',\n\tLeftArrowBar: '\\u21E4',\n\tLeftArrowRightArrow: '\\u21C6',\n\tleftarrowtail: '\\u21A2',\n\tLeftCeiling: '\\u2308',\n\tLeftDoubleBracket: '\\u27E6',\n\tLeftDownTeeVector: '\\u2961',\n\tLeftDownVector: '\\u21C3',\n\tLeftDownVectorBar: '\\u2959',\n\tLeftFloor: '\\u230A',\n\tleftharpoondown: '\\u21BD',\n\tleftharpoonup: '\\u21BC',\n\tleftleftarrows: '\\u21C7',\n\tLeftRightArrow: '\\u2194',\n\tLeftrightarrow: '\\u21D4',\n\tleftrightarrow: '\\u2194',\n\tleftrightarrows: '\\u21C6',\n\tleftrightharpoons: '\\u21CB',\n\tleftrightsquigarrow: '\\u21AD',\n\tLeftRightVector: '\\u294E',\n\tLeftTee: '\\u22A3',\n\tLeftTeeArrow: '\\u21A4',\n\tLeftTeeVector: '\\u295A',\n\tleftthreetimes: '\\u22CB',\n\tLeftTriangle: '\\u22B2',\n\tLeftTriangleBar: '\\u29CF',\n\tLeftTriangleEqual: '\\u22B4',\n\tLeftUpDownVector: '\\u2951',\n\tLeftUpTeeVector: '\\u2960',\n\tLeftUpVector: '\\u21BF',\n\tLeftUpVectorBar: '\\u2958',\n\tLeftVector: '\\u21BC',\n\tLeftVectorBar: '\\u2952',\n\tlEg: '\\u2A8B',\n\tleg: '\\u22DA',\n\tleq: '\\u2264',\n\tleqq: '\\u2266',\n\tleqslant: '\\u2A7D',\n\tles: '\\u2A7D',\n\tlescc: '\\u2AA8',\n\tlesdot: '\\u2A7F',\n\tlesdoto: '\\u2A81',\n\tlesdotor: '\\u2A83',\n\tlesg: '\\u22DA\\uFE00',\n\tlesges: '\\u2A93',\n\tlessapprox: '\\u2A85',\n\tlessdot: '\\u22D6',\n\tlesseqgtr: '\\u22DA',\n\tlesseqqgtr: '\\u2A8B',\n\tLessEqualGreater: '\\u22DA',\n\tLessFullEqual: '\\u2266',\n\tLessGreater: '\\u2276',\n\tlessgtr: '\\u2276',\n\tLessLess: '\\u2AA1',\n\tlesssim: '\\u2272',\n\tLessSlantEqual: '\\u2A7D',\n\tLessTilde: '\\u2272',\n\tlfisht: '\\u297C',\n\tlfloor: '\\u230A',\n\tLfr: '\\uD835\\uDD0F',\n\tlfr: '\\uD835\\uDD29',\n\tlg: '\\u2276',\n\tlgE: '\\u2A91',\n\tlHar: '\\u2962',\n\tlhard: '\\u21BD',\n\tlharu: '\\u21BC',\n\tlharul: '\\u296A',\n\tlhblk: '\\u2584',\n\tLJcy: '\\u0409',\n\tljcy: '\\u0459',\n\tLl: '\\u22D8',\n\tll: '\\u226A',\n\tllarr: '\\u21C7',\n\tllcorner: '\\u231E',\n\tLleftarrow: '\\u21DA',\n\tllhard: '\\u296B',\n\tlltri: '\\u25FA',\n\tLmidot: '\\u013F',\n\tlmidot: '\\u0140',\n\tlmoust: '\\u23B0',\n\tlmoustache: '\\u23B0',\n\tlnap: '\\u2A89',\n\tlnapprox: '\\u2A89',\n\tlnE: '\\u2268',\n\tlne: '\\u2A87',\n\tlneq: '\\u2A87',\n\tlneqq: '\\u2268',\n\tlnsim: '\\u22E6',\n\tloang: '\\u27EC',\n\tloarr: '\\u21FD',\n\tlobrk: '\\u27E6',\n\tLongLeftArrow: '\\u27F5',\n\tLongleftarrow: '\\u27F8',\n\tlongleftarrow: '\\u27F5',\n\tLongLeftRightArrow: '\\u27F7',\n\tLongleftrightarrow: '\\u27FA',\n\tlongleftrightarrow: '\\u27F7',\n\tlongmapsto: '\\u27FC',\n\tLongRightArrow: '\\u27F6',\n\tLongrightarrow: '\\u27F9',\n\tlongrightarrow: '\\u27F6',\n\tlooparrowleft: '\\u21AB',\n\tlooparrowright: '\\u21AC',\n\tlopar: '\\u2985',\n\tLopf: '\\uD835\\uDD43',\n\tlopf: '\\uD835\\uDD5D',\n\tloplus: '\\u2A2D',\n\tlotimes: '\\u2A34',\n\tlowast: '\\u2217',\n\tlowbar: '\\u005F',\n\tLowerLeftArrow: '\\u2199',\n\tLowerRightArrow: '\\u2198',\n\tloz: '\\u25CA',\n\tlozenge: '\\u25CA',\n\tlozf: '\\u29EB',\n\tlpar: '\\u0028',\n\tlparlt: '\\u2993',\n\tlrarr: '\\u21C6',\n\tlrcorner: '\\u231F',\n\tlrhar: '\\u21CB',\n\tlrhard: '\\u296D',\n\tlrm: '\\u200E',\n\tlrtri: '\\u22BF',\n\tlsaquo: '\\u2039',\n\tLscr: '\\u2112',\n\tlscr: '\\uD835\\uDCC1',\n\tLsh: '\\u21B0',\n\tlsh: '\\u21B0',\n\tlsim: '\\u2272',\n\tlsime: '\\u2A8D',\n\tlsimg: '\\u2A8F',\n\tlsqb: '\\u005B',\n\tlsquo: '\\u2018',\n\tlsquor: '\\u201A',\n\tLstrok: '\\u0141',\n\tlstrok: '\\u0142',\n\tLt: '\\u226A',\n\tLT: '\\u003C',\n\tlt: '\\u003C',\n\tltcc: '\\u2AA6',\n\tltcir: '\\u2A79',\n\tltdot: '\\u22D6',\n\tlthree: '\\u22CB',\n\tltimes: '\\u22C9',\n\tltlarr: '\\u2976',\n\tltquest: '\\u2A7B',\n\tltri: '\\u25C3',\n\tltrie: '\\u22B4',\n\tltrif: '\\u25C2',\n\tltrPar: '\\u2996',\n\tlurdshar: '\\u294A',\n\tluruhar: '\\u2966',\n\tlvertneqq: '\\u2268\\uFE00',\n\tlvnE: '\\u2268\\uFE00',\n\tmacr: '\\u00AF',\n\tmale: '\\u2642',\n\tmalt: '\\u2720',\n\tmaltese: '\\u2720',\n\tMap: '\\u2905',\n\tmap: '\\u21A6',\n\tmapsto: '\\u21A6',\n\tmapstodown: '\\u21A7',\n\tmapstoleft: '\\u21A4',\n\tmapstoup: '\\u21A5',\n\tmarker: '\\u25AE',\n\tmcomma: '\\u2A29',\n\tMcy: '\\u041C',\n\tmcy: '\\u043C',\n\tmdash: '\\u2014',\n\tmDDot: '\\u223A',\n\tmeasuredangle: '\\u2221',\n\tMediumSpace: '\\u205F',\n\tMellintrf: '\\u2133',\n\tMfr: '\\uD835\\uDD10',\n\tmfr: '\\uD835\\uDD2A',\n\tmho: '\\u2127',\n\tmicro: '\\u00B5',\n\tmid: '\\u2223',\n\tmidast: '\\u002A',\n\tmidcir: '\\u2AF0',\n\tmiddot: '\\u00B7',\n\tminus: '\\u2212',\n\tminusb: '\\u229F',\n\tminusd: '\\u2238',\n\tminusdu: '\\u2A2A',\n\tMinusPlus: '\\u2213',\n\tmlcp: '\\u2ADB',\n\tmldr: '\\u2026',\n\tmnplus: '\\u2213',\n\tmodels: '\\u22A7',\n\tMopf: '\\uD835\\uDD44',\n\tmopf: '\\uD835\\uDD5E',\n\tmp: '\\u2213',\n\tMscr: '\\u2133',\n\tmscr: '\\uD835\\uDCC2',\n\tmstpos: '\\u223E',\n\tMu: '\\u039C',\n\tmu: '\\u03BC',\n\tmultimap: '\\u22B8',\n\tmumap: '\\u22B8',\n\tnabla: '\\u2207',\n\tNacute: '\\u0143',\n\tnacute: '\\u0144',\n\tnang: '\\u2220\\u20D2',\n\tnap: '\\u2249',\n\tnapE: '\\u2A70\\u0338',\n\tnapid: '\\u224B\\u0338',\n\tnapos: '\\u0149',\n\tnapprox: '\\u2249',\n\tnatur: '\\u266E',\n\tnatural: '\\u266E',\n\tnaturals: '\\u2115',\n\tnbsp: '\\u00A0',\n\tnbump: '\\u224E\\u0338',\n\tnbumpe: '\\u224F\\u0338',\n\tncap: '\\u2A43',\n\tNcaron: '\\u0147',\n\tncaron: '\\u0148',\n\tNcedil: '\\u0145',\n\tncedil: '\\u0146',\n\tncong: '\\u2247',\n\tncongdot: '\\u2A6D\\u0338',\n\tncup: '\\u2A42',\n\tNcy: '\\u041D',\n\tncy: '\\u043D',\n\tndash: '\\u2013',\n\tne: '\\u2260',\n\tnearhk: '\\u2924',\n\tneArr: '\\u21D7',\n\tnearr: '\\u2197',\n\tnearrow: '\\u2197',\n\tnedot: '\\u2250\\u0338',\n\tNegativeMediumSpace: '\\u200B',\n\tNegativeThickSpace: '\\u200B',\n\tNegativeThinSpace: '\\u200B',\n\tNegativeVeryThinSpace: '\\u200B',\n\tnequiv: '\\u2262',\n\tnesear: '\\u2928',\n\tnesim: '\\u2242\\u0338',\n\tNestedGreaterGreater: '\\u226B',\n\tNestedLessLess: '\\u226A',\n\tNewLine: '\\u000A',\n\tnexist: '\\u2204',\n\tnexists: '\\u2204',\n\tNfr: '\\uD835\\uDD11',\n\tnfr: '\\uD835\\uDD2B',\n\tngE: '\\u2267\\u0338',\n\tnge: '\\u2271',\n\tngeq: '\\u2271',\n\tngeqq: '\\u2267\\u0338',\n\tngeqslant: '\\u2A7E\\u0338',\n\tnges: '\\u2A7E\\u0338',\n\tnGg: '\\u22D9\\u0338',\n\tngsim: '\\u2275',\n\tnGt: '\\u226B\\u20D2',\n\tngt: '\\u226F',\n\tngtr: '\\u226F',\n\tnGtv: '\\u226B\\u0338',\n\tnhArr: '\\u21CE',\n\tnharr: '\\u21AE',\n\tnhpar: '\\u2AF2',\n\tni: '\\u220B',\n\tnis: '\\u22FC',\n\tnisd: '\\u22FA',\n\tniv: '\\u220B',\n\tNJcy: '\\u040A',\n\tnjcy: '\\u045A',\n\tnlArr: '\\u21CD',\n\tnlarr: '\\u219A',\n\tnldr: '\\u2025',\n\tnlE: '\\u2266\\u0338',\n\tnle: '\\u2270',\n\tnLeftarrow: '\\u21CD',\n\tnleftarrow: '\\u219A',\n\tnLeftrightarrow: '\\u21CE',\n\tnleftrightarrow: '\\u21AE',\n\tnleq: '\\u2270',\n\tnleqq: '\\u2266\\u0338',\n\tnleqslant: '\\u2A7D\\u0338',\n\tnles: '\\u2A7D\\u0338',\n\tnless: '\\u226E',\n\tnLl: '\\u22D8\\u0338',\n\tnlsim: '\\u2274',\n\tnLt: '\\u226A\\u20D2',\n\tnlt: '\\u226E',\n\tnltri: '\\u22EA',\n\tnltrie: '\\u22EC',\n\tnLtv: '\\u226A\\u0338',\n\tnmid: '\\u2224',\n\tNoBreak: '\\u2060',\n\tNonBreakingSpace: '\\u00A0',\n\tNopf: '\\u2115',\n\tnopf: '\\uD835\\uDD5F',\n\tNot: '\\u2AEC',\n\tnot: '\\u00AC',\n\tNotCongruent: '\\u2262',\n\tNotCupCap: '\\u226D',\n\tNotDoubleVerticalBar: '\\u2226',\n\tNotElement: '\\u2209',\n\tNotEqual: '\\u2260',\n\tNotEqualTilde: '\\u2242\\u0338',\n\tNotExists: '\\u2204',\n\tNotGreater: '\\u226F',\n\tNotGreaterEqual: '\\u2271',\n\tNotGreaterFullEqual: '\\u2267\\u0338',\n\tNotGreaterGreater: '\\u226B\\u0338',\n\tNotGreaterLess: '\\u2279',\n\tNotGreaterSlantEqual: '\\u2A7E\\u0338',\n\tNotGreaterTilde: '\\u2275',\n\tNotHumpDownHump: '\\u224E\\u0338',\n\tNotHumpEqual: '\\u224F\\u0338',\n\tnotin: '\\u2209',\n\tnotindot: '\\u22F5\\u0338',\n\tnotinE: '\\u22F9\\u0338',\n\tnotinva: '\\u2209',\n\tnotinvb: '\\u22F7',\n\tnotinvc: '\\u22F6',\n\tNotLeftTriangle: '\\u22EA',\n\tNotLeftTriangleBar: '\\u29CF\\u0338',\n\tNotLeftTriangleEqual: '\\u22EC',\n\tNotLess: '\\u226E',\n\tNotLessEqual: '\\u2270',\n\tNotLessGreater: '\\u2278',\n\tNotLessLess: '\\u226A\\u0338',\n\tNotLessSlantEqual: '\\u2A7D\\u0338',\n\tNotLessTilde: '\\u2274',\n\tNotNestedGreaterGreater: '\\u2AA2\\u0338',\n\tNotNestedLessLess: '\\u2AA1\\u0338',\n\tnotni: '\\u220C',\n\tnotniva: '\\u220C',\n\tnotnivb: '\\u22FE',\n\tnotnivc: '\\u22FD',\n\tNotPrecedes: '\\u2280',\n\tNotPrecedesEqual: '\\u2AAF\\u0338',\n\tNotPrecedesSlantEqual: '\\u22E0',\n\tNotReverseElement: '\\u220C',\n\tNotRightTriangle: '\\u22EB',\n\tNotRightTriangleBar: '\\u29D0\\u0338',\n\tNotRightTriangleEqual: '\\u22ED',\n\tNotSquareSubset: '\\u228F\\u0338',\n\tNotSquareSubsetEqual: '\\u22E2',\n\tNotSquareSuperset: '\\u2290\\u0338',\n\tNotSquareSupersetEqual: '\\u22E3',\n\tNotSubset: '\\u2282\\u20D2',\n\tNotSubsetEqual: '\\u2288',\n\tNotSucceeds: '\\u2281',\n\tNotSucceedsEqual: '\\u2AB0\\u0338',\n\tNotSucceedsSlantEqual: '\\u22E1',\n\tNotSucceedsTilde: '\\u227F\\u0338',\n\tNotSuperset: '\\u2283\\u20D2',\n\tNotSupersetEqual: '\\u2289',\n\tNotTilde: '\\u2241',\n\tNotTildeEqual: '\\u2244',\n\tNotTildeFullEqual: '\\u2247',\n\tNotTildeTilde: '\\u2249',\n\tNotVerticalBar: '\\u2224',\n\tnpar: '\\u2226',\n\tnparallel: '\\u2226',\n\tnparsl: '\\u2AFD\\u20E5',\n\tnpart: '\\u2202\\u0338',\n\tnpolint: '\\u2A14',\n\tnpr: '\\u2280',\n\tnprcue: '\\u22E0',\n\tnpre: '\\u2AAF\\u0338',\n\tnprec: '\\u2280',\n\tnpreceq: '\\u2AAF\\u0338',\n\tnrArr: '\\u21CF',\n\tnrarr: '\\u219B',\n\tnrarrc: '\\u2933\\u0338',\n\tnrarrw: '\\u219D\\u0338',\n\tnRightarrow: '\\u21CF',\n\tnrightarrow: '\\u219B',\n\tnrtri: '\\u22EB',\n\tnrtrie: '\\u22ED',\n\tnsc: '\\u2281',\n\tnsccue: '\\u22E1',\n\tnsce: '\\u2AB0\\u0338',\n\tNscr: '\\uD835\\uDCA9',\n\tnscr: '\\uD835\\uDCC3',\n\tnshortmid: '\\u2224',\n\tnshortparallel: '\\u2226',\n\tnsim: '\\u2241',\n\tnsime: '\\u2244',\n\tnsimeq: '\\u2244',\n\tnsmid: '\\u2224',\n\tnspar: '\\u2226',\n\tnsqsube: '\\u22E2',\n\tnsqsupe: '\\u22E3',\n\tnsub: '\\u2284',\n\tnsubE: '\\u2AC5\\u0338',\n\tnsube: '\\u2288',\n\tnsubset: '\\u2282\\u20D2',\n\tnsubseteq: '\\u2288',\n\tnsubseteqq: '\\u2AC5\\u0338',\n\tnsucc: '\\u2281',\n\tnsucceq: '\\u2AB0\\u0338',\n\tnsup: '\\u2285',\n\tnsupE: '\\u2AC6\\u0338',\n\tnsupe: '\\u2289',\n\tnsupset: '\\u2283\\u20D2',\n\tnsupseteq: '\\u2289',\n\tnsupseteqq: '\\u2AC6\\u0338',\n\tntgl: '\\u2279',\n\tNtilde: '\\u00D1',\n\tntilde: '\\u00F1',\n\tntlg: '\\u2278',\n\tntriangleleft: '\\u22EA',\n\tntrianglelefteq: '\\u22EC',\n\tntriangleright: '\\u22EB',\n\tntrianglerighteq: '\\u22ED',\n\tNu: '\\u039D',\n\tnu: '\\u03BD',\n\tnum: '\\u0023',\n\tnumero: '\\u2116',\n\tnumsp: '\\u2007',\n\tnvap: '\\u224D\\u20D2',\n\tnVDash: '\\u22AF',\n\tnVdash: '\\u22AE',\n\tnvDash: '\\u22AD',\n\tnvdash: '\\u22AC',\n\tnvge: '\\u2265\\u20D2',\n\tnvgt: '\\u003E\\u20D2',\n\tnvHarr: '\\u2904',\n\tnvinfin: '\\u29DE',\n\tnvlArr: '\\u2902',\n\tnvle: '\\u2264\\u20D2',\n\tnvlt: '\\u003C\\u20D2',\n\tnvltrie: '\\u22B4\\u20D2',\n\tnvrArr: '\\u2903',\n\tnvrtrie: '\\u22B5\\u20D2',\n\tnvsim: '\\u223C\\u20D2',\n\tnwarhk: '\\u2923',\n\tnwArr: '\\u21D6',\n\tnwarr: '\\u2196',\n\tnwarrow: '\\u2196',\n\tnwnear: '\\u2927',\n\tOacute: '\\u00D3',\n\toacute: '\\u00F3',\n\toast: '\\u229B',\n\tocir: '\\u229A',\n\tOcirc: '\\u00D4',\n\tocirc: '\\u00F4',\n\tOcy: '\\u041E',\n\tocy: '\\u043E',\n\todash: '\\u229D',\n\tOdblac: '\\u0150',\n\todblac: '\\u0151',\n\todiv: '\\u2A38',\n\todot: '\\u2299',\n\todsold: '\\u29BC',\n\tOElig: '\\u0152',\n\toelig: '\\u0153',\n\tofcir: '\\u29BF',\n\tOfr: '\\uD835\\uDD12',\n\tofr: '\\uD835\\uDD2C',\n\togon: '\\u02DB',\n\tOgrave: '\\u00D2',\n\tograve: '\\u00F2',\n\togt: '\\u29C1',\n\tohbar: '\\u29B5',\n\tohm: '\\u03A9',\n\toint: '\\u222E',\n\tolarr: '\\u21BA',\n\tolcir: '\\u29BE',\n\tolcross: '\\u29BB',\n\toline: '\\u203E',\n\tolt: '\\u29C0',\n\tOmacr: '\\u014C',\n\tomacr: '\\u014D',\n\tOmega: '\\u03A9',\n\tomega: '\\u03C9',\n\tOmicron: '\\u039F',\n\tomicron: '\\u03BF',\n\tomid: '\\u29B6',\n\tominus: '\\u2296',\n\tOopf: '\\uD835\\uDD46',\n\toopf: '\\uD835\\uDD60',\n\topar: '\\u29B7',\n\tOpenCurlyDoubleQuote: '\\u201C',\n\tOpenCurlyQuote: '\\u2018',\n\toperp: '\\u29B9',\n\toplus: '\\u2295',\n\tOr: '\\u2A54',\n\tor: '\\u2228',\n\torarr: '\\u21BB',\n\tord: '\\u2A5D',\n\torder: '\\u2134',\n\torderof: '\\u2134',\n\tordf: '\\u00AA',\n\tordm: '\\u00BA',\n\torigof: '\\u22B6',\n\toror: '\\u2A56',\n\torslope: '\\u2A57',\n\torv: '\\u2A5B',\n\toS: '\\u24C8',\n\tOscr: '\\uD835\\uDCAA',\n\toscr: '\\u2134',\n\tOslash: '\\u00D8',\n\toslash: '\\u00F8',\n\tosol: '\\u2298',\n\tOtilde: '\\u00D5',\n\totilde: '\\u00F5',\n\tOtimes: '\\u2A37',\n\totimes: '\\u2297',\n\totimesas: '\\u2A36',\n\tOuml: '\\u00D6',\n\touml: '\\u00F6',\n\tovbar: '\\u233D',\n\tOverBar: '\\u203E',\n\tOverBrace: '\\u23DE',\n\tOverBracket: '\\u23B4',\n\tOverParenthesis: '\\u23DC',\n\tpar: '\\u2225',\n\tpara: '\\u00B6',\n\tparallel: '\\u2225',\n\tparsim: '\\u2AF3',\n\tparsl: '\\u2AFD',\n\tpart: '\\u2202',\n\tPartialD: '\\u2202',\n\tPcy: '\\u041F',\n\tpcy: '\\u043F',\n\tpercnt: '\\u0025',\n\tperiod: '\\u002E',\n\tpermil: '\\u2030',\n\tperp: '\\u22A5',\n\tpertenk: '\\u2031',\n\tPfr: '\\uD835\\uDD13',\n\tpfr: '\\uD835\\uDD2D',\n\tPhi: '\\u03A6',\n\tphi: '\\u03C6',\n\tphiv: '\\u03D5',\n\tphmmat: '\\u2133',\n\tphone: '\\u260E',\n\tPi: '\\u03A0',\n\tpi: '\\u03C0',\n\tpitchfork: '\\u22D4',\n\tpiv: '\\u03D6',\n\tplanck: '\\u210F',\n\tplanckh: '\\u210E',\n\tplankv: '\\u210F',\n\tplus: '\\u002B',\n\tplusacir: '\\u2A23',\n\tplusb: '\\u229E',\n\tpluscir: '\\u2A22',\n\tplusdo: '\\u2214',\n\tplusdu: '\\u2A25',\n\tpluse: '\\u2A72',\n\tPlusMinus: '\\u00B1',\n\tplusmn: '\\u00B1',\n\tplussim: '\\u2A26',\n\tplustwo: '\\u2A27',\n\tpm: '\\u00B1',\n\tPoincareplane: '\\u210C',\n\tpointint: '\\u2A15',\n\tPopf: '\\u2119',\n\tpopf: '\\uD835\\uDD61',\n\tpound: '\\u00A3',\n\tPr: '\\u2ABB',\n\tpr: '\\u227A',\n\tprap: '\\u2AB7',\n\tprcue: '\\u227C',\n\tprE: '\\u2AB3',\n\tpre: '\\u2AAF',\n\tprec: '\\u227A',\n\tprecapprox: '\\u2AB7',\n\tpreccurlyeq: '\\u227C',\n\tPrecedes: '\\u227A',\n\tPrecedesEqual: '\\u2AAF',\n\tPrecedesSlantEqual: '\\u227C',\n\tPrecedesTilde: '\\u227E',\n\tpreceq: '\\u2AAF',\n\tprecnapprox: '\\u2AB9',\n\tprecneqq: '\\u2AB5',\n\tprecnsim: '\\u22E8',\n\tprecsim: '\\u227E',\n\tPrime: '\\u2033',\n\tprime: '\\u2032',\n\tprimes: '\\u2119',\n\tprnap: '\\u2AB9',\n\tprnE: '\\u2AB5',\n\tprnsim: '\\u22E8',\n\tprod: '\\u220F',\n\tProduct: '\\u220F',\n\tprofalar: '\\u232E',\n\tprofline: '\\u2312',\n\tprofsurf: '\\u2313',\n\tprop: '\\u221D',\n\tProportion: '\\u2237',\n\tProportional: '\\u221D',\n\tpropto: '\\u221D',\n\tprsim: '\\u227E',\n\tprurel: '\\u22B0',\n\tPscr: '\\uD835\\uDCAB',\n\tpscr: '\\uD835\\uDCC5',\n\tPsi: '\\u03A8',\n\tpsi: '\\u03C8',\n\tpuncsp: '\\u2008',\n\tQfr: '\\uD835\\uDD14',\n\tqfr: '\\uD835\\uDD2E',\n\tqint: '\\u2A0C',\n\tQopf: '\\u211A',\n\tqopf: '\\uD835\\uDD62',\n\tqprime: '\\u2057',\n\tQscr: '\\uD835\\uDCAC',\n\tqscr: '\\uD835\\uDCC6',\n\tquaternions: '\\u210D',\n\tquatint: '\\u2A16',\n\tquest: '\\u003F',\n\tquesteq: '\\u225F',\n\tQUOT: '\\u0022',\n\tquot: '\\u0022',\n\trAarr: '\\u21DB',\n\trace: '\\u223D\\u0331',\n\tRacute: '\\u0154',\n\tracute: '\\u0155',\n\tradic: '\\u221A',\n\traemptyv: '\\u29B3',\n\tRang: '\\u27EB',\n\trang: '\\u27E9',\n\trangd: '\\u2992',\n\trange: '\\u29A5',\n\trangle: '\\u27E9',\n\traquo: '\\u00BB',\n\tRarr: '\\u21A0',\n\trArr: '\\u21D2',\n\trarr: '\\u2192',\n\trarrap: '\\u2975',\n\trarrb: '\\u21E5',\n\trarrbfs: '\\u2920',\n\trarrc: '\\u2933',\n\trarrfs: '\\u291E',\n\trarrhk: '\\u21AA',\n\trarrlp: '\\u21AC',\n\trarrpl: '\\u2945',\n\trarrsim: '\\u2974',\n\tRarrtl: '\\u2916',\n\trarrtl: '\\u21A3',\n\trarrw: '\\u219D',\n\trAtail: '\\u291C',\n\tratail: '\\u291A',\n\tratio: '\\u2236',\n\trationals: '\\u211A',\n\tRBarr: '\\u2910',\n\trBarr: '\\u290F',\n\trbarr: '\\u290D',\n\trbbrk: '\\u2773',\n\trbrace: '\\u007D',\n\trbrack: '\\u005D',\n\trbrke: '\\u298C',\n\trbrksld: '\\u298E',\n\trbrkslu: '\\u2990',\n\tRcaron: '\\u0158',\n\trcaron: '\\u0159',\n\tRcedil: '\\u0156',\n\trcedil: '\\u0157',\n\trceil: '\\u2309',\n\trcub: '\\u007D',\n\tRcy: '\\u0420',\n\trcy: '\\u0440',\n\trdca: '\\u2937',\n\trdldhar: '\\u2969',\n\trdquo: '\\u201D',\n\trdquor: '\\u201D',\n\trdsh: '\\u21B3',\n\tRe: '\\u211C',\n\treal: '\\u211C',\n\trealine: '\\u211B',\n\trealpart: '\\u211C',\n\treals: '\\u211D',\n\trect: '\\u25AD',\n\tREG: '\\u00AE',\n\treg: '\\u00AE',\n\tReverseElement: '\\u220B',\n\tReverseEquilibrium: '\\u21CB',\n\tReverseUpEquilibrium: '\\u296F',\n\trfisht: '\\u297D',\n\trfloor: '\\u230B',\n\tRfr: '\\u211C',\n\trfr: '\\uD835\\uDD2F',\n\trHar: '\\u2964',\n\trhard: '\\u21C1',\n\trharu: '\\u21C0',\n\trharul: '\\u296C',\n\tRho: '\\u03A1',\n\trho: '\\u03C1',\n\trhov: '\\u03F1',\n\tRightAngleBracket: '\\u27E9',\n\tRightArrow: '\\u2192',\n\tRightarrow: '\\u21D2',\n\trightarrow: '\\u2192',\n\tRightArrowBar: '\\u21E5',\n\tRightArrowLeftArrow: '\\u21C4',\n\trightarrowtail: '\\u21A3',\n\tRightCeiling: '\\u2309',\n\tRightDoubleBracket: '\\u27E7',\n\tRightDownTeeVector: '\\u295D',\n\tRightDownVector: '\\u21C2',\n\tRightDownVectorBar: '\\u2955',\n\tRightFloor: '\\u230B',\n\trightharpoondown: '\\u21C1',\n\trightharpoonup: '\\u21C0',\n\trightleftarrows: '\\u21C4',\n\trightleftharpoons: '\\u21CC',\n\trightrightarrows: '\\u21C9',\n\trightsquigarrow: '\\u219D',\n\tRightTee: '\\u22A2',\n\tRightTeeArrow: '\\u21A6',\n\tRightTeeVector: '\\u295B',\n\trightthreetimes: '\\u22CC',\n\tRightTriangle: '\\u22B3',\n\tRightTriangleBar: '\\u29D0',\n\tRightTriangleEqual: '\\u22B5',\n\tRightUpDownVector: '\\u294F',\n\tRightUpTeeVector: '\\u295C',\n\tRightUpVector: '\\u21BE',\n\tRightUpVectorBar: '\\u2954',\n\tRightVector: '\\u21C0',\n\tRightVectorBar: '\\u2953',\n\tring: '\\u02DA',\n\trisingdotseq: '\\u2253',\n\trlarr: '\\u21C4',\n\trlhar: '\\u21CC',\n\trlm: '\\u200F',\n\trmoust: '\\u23B1',\n\trmoustache: '\\u23B1',\n\trnmid: '\\u2AEE',\n\troang: '\\u27ED',\n\troarr: '\\u21FE',\n\trobrk: '\\u27E7',\n\tropar: '\\u2986',\n\tRopf: '\\u211D',\n\tropf: '\\uD835\\uDD63',\n\troplus: '\\u2A2E',\n\trotimes: '\\u2A35',\n\tRoundImplies: '\\u2970',\n\trpar: '\\u0029',\n\trpargt: '\\u2994',\n\trppolint: '\\u2A12',\n\trrarr: '\\u21C9',\n\tRrightarrow: '\\u21DB',\n\trsaquo: '\\u203A',\n\tRscr: '\\u211B',\n\trscr: '\\uD835\\uDCC7',\n\tRsh: '\\u21B1',\n\trsh: '\\u21B1',\n\trsqb: '\\u005D',\n\trsquo: '\\u2019',\n\trsquor: '\\u2019',\n\trthree: '\\u22CC',\n\trtimes: '\\u22CA',\n\trtri: '\\u25B9',\n\trtrie: '\\u22B5',\n\trtrif: '\\u25B8',\n\trtriltri: '\\u29CE',\n\tRuleDelayed: '\\u29F4',\n\truluhar: '\\u2968',\n\trx: '\\u211E',\n\tSacute: '\\u015A',\n\tsacute: '\\u015B',\n\tsbquo: '\\u201A',\n\tSc: '\\u2ABC',\n\tsc: '\\u227B',\n\tscap: '\\u2AB8',\n\tScaron: '\\u0160',\n\tscaron: '\\u0161',\n\tsccue: '\\u227D',\n\tscE: '\\u2AB4',\n\tsce: '\\u2AB0',\n\tScedil: '\\u015E',\n\tscedil: '\\u015F',\n\tScirc: '\\u015C',\n\tscirc: '\\u015D',\n\tscnap: '\\u2ABA',\n\tscnE: '\\u2AB6',\n\tscnsim: '\\u22E9',\n\tscpolint: '\\u2A13',\n\tscsim: '\\u227F',\n\tScy: '\\u0421',\n\tscy: '\\u0441',\n\tsdot: '\\u22C5',\n\tsdotb: '\\u22A1',\n\tsdote: '\\u2A66',\n\tsearhk: '\\u2925',\n\tseArr: '\\u21D8',\n\tsearr: '\\u2198',\n\tsearrow: '\\u2198',\n\tsect: '\\u00A7',\n\tsemi: '\\u003B',\n\tseswar: '\\u2929',\n\tsetminus: '\\u2216',\n\tsetmn: '\\u2216',\n\tsext: '\\u2736',\n\tSfr: '\\uD835\\uDD16',\n\tsfr: '\\uD835\\uDD30',\n\tsfrown: '\\u2322',\n\tsharp: '\\u266F',\n\tSHCHcy: '\\u0429',\n\tshchcy: '\\u0449',\n\tSHcy: '\\u0428',\n\tshcy: '\\u0448',\n\tShortDownArrow: '\\u2193',\n\tShortLeftArrow: '\\u2190',\n\tshortmid: '\\u2223',\n\tshortparallel: '\\u2225',\n\tShortRightArrow: '\\u2192',\n\tShortUpArrow: '\\u2191',\n\tshy: '\\u00AD',\n\tSigma: '\\u03A3',\n\tsigma: '\\u03C3',\n\tsigmaf: '\\u03C2',\n\tsigmav: '\\u03C2',\n\tsim: '\\u223C',\n\tsimdot: '\\u2A6A',\n\tsime: '\\u2243',\n\tsimeq: '\\u2243',\n\tsimg: '\\u2A9E',\n\tsimgE: '\\u2AA0',\n\tsiml: '\\u2A9D',\n\tsimlE: '\\u2A9F',\n\tsimne: '\\u2246',\n\tsimplus: '\\u2A24',\n\tsimrarr: '\\u2972',\n\tslarr: '\\u2190',\n\tSmallCircle: '\\u2218',\n\tsmallsetminus: '\\u2216',\n\tsmashp: '\\u2A33',\n\tsmeparsl: '\\u29E4',\n\tsmid: '\\u2223',\n\tsmile: '\\u2323',\n\tsmt: '\\u2AAA',\n\tsmte: '\\u2AAC',\n\tsmtes: '\\u2AAC\\uFE00',\n\tSOFTcy: '\\u042C',\n\tsoftcy: '\\u044C',\n\tsol: '\\u002F',\n\tsolb: '\\u29C4',\n\tsolbar: '\\u233F',\n\tSopf: '\\uD835\\uDD4A',\n\tsopf: '\\uD835\\uDD64',\n\tspades: '\\u2660',\n\tspadesuit: '\\u2660',\n\tspar: '\\u2225',\n\tsqcap: '\\u2293',\n\tsqcaps: '\\u2293\\uFE00',\n\tsqcup: '\\u2294',\n\tsqcups: '\\u2294\\uFE00',\n\tSqrt: '\\u221A',\n\tsqsub: '\\u228F',\n\tsqsube: '\\u2291',\n\tsqsubset: '\\u228F',\n\tsqsubseteq: '\\u2291',\n\tsqsup: '\\u2290',\n\tsqsupe: '\\u2292',\n\tsqsupset: '\\u2290',\n\tsqsupseteq: '\\u2292',\n\tsqu: '\\u25A1',\n\tSquare: '\\u25A1',\n\tsquare: '\\u25A1',\n\tSquareIntersection: '\\u2293',\n\tSquareSubset: '\\u228F',\n\tSquareSubsetEqual: '\\u2291',\n\tSquareSuperset: '\\u2290',\n\tSquareSupersetEqual: '\\u2292',\n\tSquareUnion: '\\u2294',\n\tsquarf: '\\u25AA',\n\tsquf: '\\u25AA',\n\tsrarr: '\\u2192',\n\tSscr: '\\uD835\\uDCAE',\n\tsscr: '\\uD835\\uDCC8',\n\tssetmn: '\\u2216',\n\tssmile: '\\u2323',\n\tsstarf: '\\u22C6',\n\tStar: '\\u22C6',\n\tstar: '\\u2606',\n\tstarf: '\\u2605',\n\tstraightepsilon: '\\u03F5',\n\tstraightphi: '\\u03D5',\n\tstrns: '\\u00AF',\n\tSub: '\\u22D0',\n\tsub: '\\u2282',\n\tsubdot: '\\u2ABD',\n\tsubE: '\\u2AC5',\n\tsube: '\\u2286',\n\tsubedot: '\\u2AC3',\n\tsubmult: '\\u2AC1',\n\tsubnE: '\\u2ACB',\n\tsubne: '\\u228A',\n\tsubplus: '\\u2ABF',\n\tsubrarr: '\\u2979',\n\tSubset: '\\u22D0',\n\tsubset: '\\u2282',\n\tsubseteq: '\\u2286',\n\tsubseteqq: '\\u2AC5',\n\tSubsetEqual: '\\u2286',\n\tsubsetneq: '\\u228A',\n\tsubsetneqq: '\\u2ACB',\n\tsubsim: '\\u2AC7',\n\tsubsub: '\\u2AD5',\n\tsubsup: '\\u2AD3',\n\tsucc: '\\u227B',\n\tsuccapprox: '\\u2AB8',\n\tsucccurlyeq: '\\u227D',\n\tSucceeds: '\\u227B',\n\tSucceedsEqual: '\\u2AB0',\n\tSucceedsSlantEqual: '\\u227D',\n\tSucceedsTilde: '\\u227F',\n\tsucceq: '\\u2AB0',\n\tsuccnapprox: '\\u2ABA',\n\tsuccneqq: '\\u2AB6',\n\tsuccnsim: '\\u22E9',\n\tsuccsim: '\\u227F',\n\tSuchThat: '\\u220B',\n\tSum: '\\u2211',\n\tsum: '\\u2211',\n\tsung: '\\u266A',\n\tSup: '\\u22D1',\n\tsup: '\\u2283',\n\tsup1: '\\u00B9',\n\tsup2: '\\u00B2',\n\tsup3: '\\u00B3',\n\tsupdot: '\\u2ABE',\n\tsupdsub: '\\u2AD8',\n\tsupE: '\\u2AC6',\n\tsupe: '\\u2287',\n\tsupedot: '\\u2AC4',\n\tSuperset: '\\u2283',\n\tSupersetEqual: '\\u2287',\n\tsuphsol: '\\u27C9',\n\tsuphsub: '\\u2AD7',\n\tsuplarr: '\\u297B',\n\tsupmult: '\\u2AC2',\n\tsupnE: '\\u2ACC',\n\tsupne: '\\u228B',\n\tsupplus: '\\u2AC0',\n\tSupset: '\\u22D1',\n\tsupset: '\\u2283',\n\tsupseteq: '\\u2287',\n\tsupseteqq: '\\u2AC6',\n\tsupsetneq: '\\u228B',\n\tsupsetneqq: '\\u2ACC',\n\tsupsim: '\\u2AC8',\n\tsupsub: '\\u2AD4',\n\tsupsup: '\\u2AD6',\n\tswarhk: '\\u2926',\n\tswArr: '\\u21D9',\n\tswarr: '\\u2199',\n\tswarrow: '\\u2199',\n\tswnwar: '\\u292A',\n\tszlig: '\\u00DF',\n\tTab: '\\u0009',\n\ttarget: '\\u2316',\n\tTau: '\\u03A4',\n\ttau: '\\u03C4',\n\ttbrk: '\\u23B4',\n\tTcaron: '\\u0164',\n\ttcaron: '\\u0165',\n\tTcedil: '\\u0162',\n\ttcedil: '\\u0163',\n\tTcy: '\\u0422',\n\ttcy: '\\u0442',\n\ttdot: '\\u20DB',\n\ttelrec: '\\u2315',\n\tTfr: '\\uD835\\uDD17',\n\ttfr: '\\uD835\\uDD31',\n\tthere4: '\\u2234',\n\tTherefore: '\\u2234',\n\ttherefore: '\\u2234',\n\tTheta: '\\u0398',\n\ttheta: '\\u03B8',\n\tthetasym: '\\u03D1',\n\tthetav: '\\u03D1',\n\tthickapprox: '\\u2248',\n\tthicksim: '\\u223C',\n\tThickSpace: '\\u205F\\u200A',\n\tthinsp: '\\u2009',\n\tThinSpace: '\\u2009',\n\tthkap: '\\u2248',\n\tthksim: '\\u223C',\n\tTHORN: '\\u00DE',\n\tthorn: '\\u00FE',\n\tTilde: '\\u223C',\n\ttilde: '\\u02DC',\n\tTildeEqual: '\\u2243',\n\tTildeFullEqual: '\\u2245',\n\tTildeTilde: '\\u2248',\n\ttimes: '\\u00D7',\n\ttimesb: '\\u22A0',\n\ttimesbar: '\\u2A31',\n\ttimesd: '\\u2A30',\n\ttint: '\\u222D',\n\ttoea: '\\u2928',\n\ttop: '\\u22A4',\n\ttopbot: '\\u2336',\n\ttopcir: '\\u2AF1',\n\tTopf: '\\uD835\\uDD4B',\n\ttopf: '\\uD835\\uDD65',\n\ttopfork: '\\u2ADA',\n\ttosa: '\\u2929',\n\ttprime: '\\u2034',\n\tTRADE: '\\u2122',\n\ttrade: '\\u2122',\n\ttriangle: '\\u25B5',\n\ttriangledown: '\\u25BF',\n\ttriangleleft: '\\u25C3',\n\ttrianglelefteq: '\\u22B4',\n\ttriangleq: '\\u225C',\n\ttriangleright: '\\u25B9',\n\ttrianglerighteq: '\\u22B5',\n\ttridot: '\\u25EC',\n\ttrie: '\\u225C',\n\ttriminus: '\\u2A3A',\n\tTripleDot: '\\u20DB',\n\ttriplus: '\\u2A39',\n\ttrisb: '\\u29CD',\n\ttritime: '\\u2A3B',\n\ttrpezium: '\\u23E2',\n\tTscr: '\\uD835\\uDCAF',\n\ttscr: '\\uD835\\uDCC9',\n\tTScy: '\\u0426',\n\ttscy: '\\u0446',\n\tTSHcy: '\\u040B',\n\ttshcy: '\\u045B',\n\tTstrok: '\\u0166',\n\ttstrok: '\\u0167',\n\ttwixt: '\\u226C',\n\ttwoheadleftarrow: '\\u219E',\n\ttwoheadrightarrow: '\\u21A0',\n\tUacute: '\\u00DA',\n\tuacute: '\\u00FA',\n\tUarr: '\\u219F',\n\tuArr: '\\u21D1',\n\tuarr: '\\u2191',\n\tUarrocir: '\\u2949',\n\tUbrcy: '\\u040E',\n\tubrcy: '\\u045E',\n\tUbreve: '\\u016C',\n\tubreve: '\\u016D',\n\tUcirc: '\\u00DB',\n\tucirc: '\\u00FB',\n\tUcy: '\\u0423',\n\tucy: '\\u0443',\n\tudarr: '\\u21C5',\n\tUdblac: '\\u0170',\n\tudblac: '\\u0171',\n\tudhar: '\\u296E',\n\tufisht: '\\u297E',\n\tUfr: '\\uD835\\uDD18',\n\tufr: '\\uD835\\uDD32',\n\tUgrave: '\\u00D9',\n\tugrave: '\\u00F9',\n\tuHar: '\\u2963',\n\tuharl: '\\u21BF',\n\tuharr: '\\u21BE',\n\tuhblk: '\\u2580',\n\tulcorn: '\\u231C',\n\tulcorner: '\\u231C',\n\tulcrop: '\\u230F',\n\tultri: '\\u25F8',\n\tUmacr: '\\u016A',\n\tumacr: '\\u016B',\n\tuml: '\\u00A8',\n\tUnderBar: '\\u005F',\n\tUnderBrace: '\\u23DF',\n\tUnderBracket: '\\u23B5',\n\tUnderParenthesis: '\\u23DD',\n\tUnion: '\\u22C3',\n\tUnionPlus: '\\u228E',\n\tUogon: '\\u0172',\n\tuogon: '\\u0173',\n\tUopf: '\\uD835\\uDD4C',\n\tuopf: '\\uD835\\uDD66',\n\tUpArrow: '\\u2191',\n\tUparrow: '\\u21D1',\n\tuparrow: '\\u2191',\n\tUpArrowBar: '\\u2912',\n\tUpArrowDownArrow: '\\u21C5',\n\tUpDownArrow: '\\u2195',\n\tUpdownarrow: '\\u21D5',\n\tupdownarrow: '\\u2195',\n\tUpEquilibrium: '\\u296E',\n\tupharpoonleft: '\\u21BF',\n\tupharpoonright: '\\u21BE',\n\tuplus: '\\u228E',\n\tUpperLeftArrow: '\\u2196',\n\tUpperRightArrow: '\\u2197',\n\tUpsi: '\\u03D2',\n\tupsi: '\\u03C5',\n\tupsih: '\\u03D2',\n\tUpsilon: '\\u03A5',\n\tupsilon: '\\u03C5',\n\tUpTee: '\\u22A5',\n\tUpTeeArrow: '\\u21A5',\n\tupuparrows: '\\u21C8',\n\turcorn: '\\u231D',\n\turcorner: '\\u231D',\n\turcrop: '\\u230E',\n\tUring: '\\u016E',\n\turing: '\\u016F',\n\turtri: '\\u25F9',\n\tUscr: '\\uD835\\uDCB0',\n\tuscr: '\\uD835\\uDCCA',\n\tutdot: '\\u22F0',\n\tUtilde: '\\u0168',\n\tutilde: '\\u0169',\n\tutri: '\\u25B5',\n\tutrif: '\\u25B4',\n\tuuarr: '\\u21C8',\n\tUuml: '\\u00DC',\n\tuuml: '\\u00FC',\n\tuwangle: '\\u29A7',\n\tvangrt: '\\u299C',\n\tvarepsilon: '\\u03F5',\n\tvarkappa: '\\u03F0',\n\tvarnothing: '\\u2205',\n\tvarphi: '\\u03D5',\n\tvarpi: '\\u03D6',\n\tvarpropto: '\\u221D',\n\tvArr: '\\u21D5',\n\tvarr: '\\u2195',\n\tvarrho: '\\u03F1',\n\tvarsigma: '\\u03C2',\n\tvarsubsetneq: '\\u228A\\uFE00',\n\tvarsubsetneqq: '\\u2ACB\\uFE00',\n\tvarsupsetneq: '\\u228B\\uFE00',\n\tvarsupsetneqq: '\\u2ACC\\uFE00',\n\tvartheta: '\\u03D1',\n\tvartriangleleft: '\\u22B2',\n\tvartriangleright: '\\u22B3',\n\tVbar: '\\u2AEB',\n\tvBar: '\\u2AE8',\n\tvBarv: '\\u2AE9',\n\tVcy: '\\u0412',\n\tvcy: '\\u0432',\n\tVDash: '\\u22AB',\n\tVdash: '\\u22A9',\n\tvDash: '\\u22A8',\n\tvdash: '\\u22A2',\n\tVdashl: '\\u2AE6',\n\tVee: '\\u22C1',\n\tvee: '\\u2228',\n\tveebar: '\\u22BB',\n\tveeeq: '\\u225A',\n\tvellip: '\\u22EE',\n\tVerbar: '\\u2016',\n\tverbar: '\\u007C',\n\tVert: '\\u2016',\n\tvert: '\\u007C',\n\tVerticalBar: '\\u2223',\n\tVerticalLine: '\\u007C',\n\tVerticalSeparator: '\\u2758',\n\tVerticalTilde: '\\u2240',\n\tVeryThinSpace: '\\u200A',\n\tVfr: '\\uD835\\uDD19',\n\tvfr: '\\uD835\\uDD33',\n\tvltri: '\\u22B2',\n\tvnsub: '\\u2282\\u20D2',\n\tvnsup: '\\u2283\\u20D2',\n\tVopf: '\\uD835\\uDD4D',\n\tvopf: '\\uD835\\uDD67',\n\tvprop: '\\u221D',\n\tvrtri: '\\u22B3',\n\tVscr: '\\uD835\\uDCB1',\n\tvscr: '\\uD835\\uDCCB',\n\tvsubnE: '\\u2ACB\\uFE00',\n\tvsubne: '\\u228A\\uFE00',\n\tvsupnE: '\\u2ACC\\uFE00',\n\tvsupne: '\\u228B\\uFE00',\n\tVvdash: '\\u22AA',\n\tvzigzag: '\\u299A',\n\tWcirc: '\\u0174',\n\twcirc: '\\u0175',\n\twedbar: '\\u2A5F',\n\tWedge: '\\u22C0',\n\twedge: '\\u2227',\n\twedgeq: '\\u2259',\n\tweierp: '\\u2118',\n\tWfr: '\\uD835\\uDD1A',\n\twfr: '\\uD835\\uDD34',\n\tWopf: '\\uD835\\uDD4E',\n\twopf: '\\uD835\\uDD68',\n\twp: '\\u2118',\n\twr: '\\u2240',\n\twreath: '\\u2240',\n\tWscr: '\\uD835\\uDCB2',\n\twscr: '\\uD835\\uDCCC',\n\txcap: '\\u22C2',\n\txcirc: '\\u25EF',\n\txcup: '\\u22C3',\n\txdtri: '\\u25BD',\n\tXfr: '\\uD835\\uDD1B',\n\txfr: '\\uD835\\uDD35',\n\txhArr: '\\u27FA',\n\txharr: '\\u27F7',\n\tXi: '\\u039E',\n\txi: '\\u03BE',\n\txlArr: '\\u27F8',\n\txlarr: '\\u27F5',\n\txmap: '\\u27FC',\n\txnis: '\\u22FB',\n\txodot: '\\u2A00',\n\tXopf: '\\uD835\\uDD4F',\n\txopf: '\\uD835\\uDD69',\n\txoplus: '\\u2A01',\n\txotime: '\\u2A02',\n\txrArr: '\\u27F9',\n\txrarr: '\\u27F6',\n\tXscr: '\\uD835\\uDCB3',\n\txscr: '\\uD835\\uDCCD',\n\txsqcup: '\\u2A06',\n\txuplus: '\\u2A04',\n\txutri: '\\u25B3',\n\txvee: '\\u22C1',\n\txwedge: '\\u22C0',\n\tYacute: '\\u00DD',\n\tyacute: '\\u00FD',\n\tYAcy: '\\u042F',\n\tyacy: '\\u044F',\n\tYcirc: '\\u0176',\n\tycirc: '\\u0177',\n\tYcy: '\\u042B',\n\tycy: '\\u044B',\n\tyen: '\\u00A5',\n\tYfr: '\\uD835\\uDD1C',\n\tyfr: '\\uD835\\uDD36',\n\tYIcy: '\\u0407',\n\tyicy: '\\u0457',\n\tYopf: '\\uD835\\uDD50',\n\tyopf: '\\uD835\\uDD6A',\n\tYscr: '\\uD835\\uDCB4',\n\tyscr: '\\uD835\\uDCCE',\n\tYUcy: '\\u042E',\n\tyucy: '\\u044E',\n\tYuml: '\\u0178',\n\tyuml: '\\u00FF',\n\tZacute: '\\u0179',\n\tzacute: '\\u017A',\n\tZcaron: '\\u017D',\n\tzcaron: '\\u017E',\n\tZcy: '\\u0417',\n\tzcy: '\\u0437',\n\tZdot: '\\u017B',\n\tzdot: '\\u017C',\n\tzeetrf: '\\u2128',\n\tZeroWidthSpace: '\\u200B',\n\tZeta: '\\u0396',\n\tzeta: '\\u03B6',\n\tZfr: '\\u2128',\n\tzfr: '\\uD835\\uDD37',\n\tZHcy: '\\u0416',\n\tzhcy: '\\u0436',\n\tzigrarr: '\\u21DD',\n\tZopf: '\\u2124',\n\tzopf: '\\uD835\\uDD6B',\n\tZscr: '\\uD835\\uDCB5',\n\tzscr: '\\uD835\\uDCCF',\n\tzwj: '\\u200D',\n\tzwnj: '\\u200C',\n});\n\n/**\n * @deprecated use `HTML_ENTITIES` instead\n * @see HTML_ENTITIES\n */\nexports.entityMap = exports.HTML_ENTITIES;\n","var NAMESPACE = require(\"./conventions\").NAMESPACE;\n\n//[4] \tNameStartChar\t ::= \t\":\" | [A-Z] | \"_\" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\n//[4a] \tNameChar\t ::= \tNameStartChar | \"-\" | \".\" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]\n//[5] \tName\t ::= \tNameStartChar (NameChar)*\nvar nameStartChar = /[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]///\\u10000-\\uEFFFF\nvar nameChar = new RegExp(\"[\\\\-\\\\.0-9\"+nameStartChar.source.slice(1,-1)+\"\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]\");\nvar tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\\:'+nameStartChar.source+nameChar.source+'*)?$');\n//var tagNamePattern = /^[a-zA-Z_][\\w\\-\\.]*(?:\\:[a-zA-Z_][\\w\\-\\.]*)?$/\n//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')\n\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\nvar S_TAG = 0;//tag name offerring\nvar S_ATTR = 1;//attr name offerring\nvar S_ATTR_SPACE=2;//attr name end and space offer\nvar S_EQ = 3;//=space?\nvar S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)\nvar S_ATTR_END = 5;//attr value end and no space(quot end)\nvar S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)\nvar S_TAG_CLOSE = 7;//closed el\n\n/**\n * Creates an error that will not be caught by XMLReader aka the SAX parser.\n *\n * @param {string} message\n * @param {any?} locator Optional, can provide details about the location in the source\n * @constructor\n */\nfunction ParseError(message, locator) {\n\tthis.message = message\n\tthis.locator = locator\n\tif(Error.captureStackTrace) Error.captureStackTrace(this, ParseError);\n}\nParseError.prototype = new Error();\nParseError.prototype.name = ParseError.name\n\nfunction XMLReader(){\n\n}\n\nXMLReader.prototype = {\n\tparse:function(source,defaultNSMap,entityMap){\n\t\tvar domBuilder = this.domBuilder;\n\t\tdomBuilder.startDocument();\n\t\t_copy(defaultNSMap ,defaultNSMap = {})\n\t\tparse(source,defaultNSMap,entityMap,\n\t\t\t\tdomBuilder,this.errorHandler);\n\t\tdomBuilder.endDocument();\n\t}\n}\nfunction parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){\n\tfunction fixedFromCharCode(code) {\n\t\t// String.prototype.fromCharCode does not supports\n\t\t// > 2 bytes unicode chars directly\n\t\tif (code > 0xffff) {\n\t\t\tcode -= 0x10000;\n\t\t\tvar surrogate1 = 0xd800 + (code >> 10)\n\t\t\t\t, surrogate2 = 0xdc00 + (code & 0x3ff);\n\n\t\t\treturn String.fromCharCode(surrogate1, surrogate2);\n\t\t} else {\n\t\t\treturn String.fromCharCode(code);\n\t\t}\n\t}\n\tfunction entityReplacer(a){\n\t\tvar k = a.slice(1,-1);\n\t\tif (Object.hasOwnProperty.call(entityMap, k)) {\n\t\t\treturn entityMap[k];\n\t\t}else if(k.charAt(0) === '#'){\n\t\t\treturn fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))\n\t\t}else{\n\t\t\terrorHandler.error('entity not found:'+a);\n\t\t\treturn a;\n\t\t}\n\t}\n\tfunction appendText(end){//has some bugs\n\t\tif(end>start){\n\t\t\tvar xt = source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);\n\t\t\tlocator&&position(start);\n\t\t\tdomBuilder.characters(xt,0,end-start);\n\t\t\tstart = end\n\t\t}\n\t}\n\tfunction position(p,m){\n\t\twhile(p>=lineEnd && (m = linePattern.exec(source))){\n\t\t\tlineStart = m.index;\n\t\t\tlineEnd = lineStart + m[0].length;\n\t\t\tlocator.lineNumber++;\n\t\t\t//console.log('line++:',locator,startPos,endPos)\n\t\t}\n\t\tlocator.columnNumber = p-lineStart+1;\n\t}\n\tvar lineStart = 0;\n\tvar lineEnd = 0;\n\tvar linePattern = /.*(?:\\r\\n?|\\n)|.*$/g\n\tvar locator = domBuilder.locator;\n\n\tvar parseStack = [{currentNSMap:defaultNSMapCopy}]\n\tvar closeMap = {};\n\tvar start = 0;\n\twhile(true){\n\t\ttry{\n\t\t\tvar tagStart = source.indexOf('<',start);\n\t\t\tif(tagStart<0){\n\t\t\t\tif(!source.substr(start).match(/^\\s*$/)){\n\t\t\t\t\tvar doc = domBuilder.doc;\n\t \t\t\tvar text = doc.createTextNode(source.substr(start));\n\t \t\t\tdoc.appendChild(text);\n\t \t\t\tdomBuilder.currentElement = text;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(tagStart>start){\n\t\t\t\tappendText(tagStart);\n\t\t\t}\n\t\t\tswitch(source.charAt(tagStart+1)){\n\t\t\tcase '/':\n\t\t\t\tvar end = source.indexOf('>',tagStart+3);\n\t\t\t\tvar tagName = source.substring(tagStart + 2, end).replace(/[ \\t\\n\\r]+$/g, '');\n\t\t\t\tvar config = parseStack.pop();\n\t\t\t\tif(end<0){\n\n\t \t\ttagName = source.substring(tagStart+2).replace(/[\\s<].*/,'');\n\t \t\terrorHandler.error(\"end tag name: \"+tagName+' is not complete:'+config.tagName);\n\t \t\tend = tagStart+1+tagName.length;\n\t \t}else if(tagName.match(/\\s\n\t\t\t\tlocator&&position(tagStart);\n\t\t\t\tend = parseInstruction(source,tagStart,domBuilder);\n\t\t\t\tbreak;\n\t\t\tcase '!':// start){\n\t\t\tstart = end;\n\t\t}else{\n\t\t\t//TODO: 这里有可能sax回退,有位置错误风险\n\t\t\tappendText(Math.max(tagStart,start)+1);\n\t\t}\n\t}\n}\nfunction copyLocator(f,t){\n\tt.lineNumber = f.lineNumber;\n\tt.columnNumber = f.columnNumber;\n\treturn t;\n}\n\n/**\n * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);\n * @return end of the elementStartPart(end of elementEndPart for selfClosed el)\n */\nfunction parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){\n\n\t/**\n\t * @param {string} qname\n\t * @param {string} value\n\t * @param {number} startIndex\n\t */\n\tfunction addAttribute(qname, value, startIndex) {\n\t\tif (el.attributeNames.hasOwnProperty(qname)) {\n\t\t\terrorHandler.fatalError('Attribute ' + qname + ' redefined')\n\t\t}\n\t\tel.addValue(\n\t\t\tqname,\n\t\t\t// @see https://www.w3.org/TR/xml/#AVNormalize\n\t\t\t// since the xmldom sax parser does not \"interpret\" DTD the following is not implemented:\n\t\t\t// - recursive replacement of (DTD) entity references\n\t\t\t// - trimming and collapsing multiple spaces into a single one for attributes that are not of type CDATA\n\t\t\tvalue.replace(/[\\t\\n\\r]/g, ' ').replace(/&#?\\w+;/g, entityReplacer),\n\t\t\tstartIndex\n\t\t)\n\t}\n\tvar attrName;\n\tvar value;\n\tvar p = ++start;\n\tvar s = S_TAG;//status\n\twhile(true){\n\t\tvar c = source.charAt(p);\n\t\tswitch(c){\n\t\tcase '=':\n\t\t\tif(s === S_ATTR){//attrName\n\t\t\t\tattrName = source.slice(start,p);\n\t\t\t\ts = S_EQ;\n\t\t\t}else if(s === S_ATTR_SPACE){\n\t\t\t\ts = S_EQ;\n\t\t\t}else{\n\t\t\t\t//fatalError: equal must after attrName or space after attrName\n\t\t\t\tthrow new Error('attribute equal must after attrName'); // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '\\'':\n\t\tcase '\"':\n\t\t\tif(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE\n\t\t\t\t){//equal\n\t\t\t\tif(s === S_ATTR){\n\t\t\t\t\terrorHandler.warning('attribute value must after \"=\"')\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t}\n\t\t\t\tstart = p+1;\n\t\t\t\tp = source.indexOf(c,start)\n\t\t\t\tif(p>0){\n\t\t\t\t\tvalue = source.slice(start, p);\n\t\t\t\t\taddAttribute(attrName, value, start-1);\n\t\t\t\t\ts = S_ATTR_END;\n\t\t\t\t}else{\n\t\t\t\t\t//fatalError: no end quot match\n\t\t\t\t\tthrow new Error('attribute value no end \\''+c+'\\' match');\n\t\t\t\t}\n\t\t\t}else if(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\tvalue = source.slice(start, p);\n\t\t\t\taddAttribute(attrName, value, start);\n\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+')!!');\n\t\t\t\tstart = p+1;\n\t\t\t\ts = S_ATTR_END\n\t\t\t}else{\n\t\t\t\t//fatalError: no equal before\n\t\t\t\tthrow new Error('attribute value must after \"=\"'); // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '/':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\ts =S_TAG_CLOSE;\n\t\t\t\tel.closed = true;\n\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\tcase S_ATTR:\n\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_SPACE:\n\t\t\t\t\tel.closed = true;\n\t\t\t\tbreak;\n\t\t\t//case S_EQ:\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"attribute invalid close char('/')\") // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase ''://end document\n\t\t\terrorHandler.error('unexpected end of input');\n\t\t\tif(s == S_TAG){\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\t}\n\t\t\treturn p;\n\t\tcase '>':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\tbreak;//normal\n\t\t\tcase S_ATTR_NOQUOT_VALUE://Compatible state\n\t\t\tcase S_ATTR:\n\t\t\t\tvalue = source.slice(start,p);\n\t\t\t\tif(value.slice(-1) === '/'){\n\t\t\t\t\tel.closed = true;\n\t\t\t\t\tvalue = value.slice(0,-1)\n\t\t\t\t}\n\t\t\tcase S_ATTR_SPACE:\n\t\t\t\tif(s === S_ATTR_SPACE){\n\t\t\t\t\tvalue = attrName;\n\t\t\t\t}\n\t\t\t\tif(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!');\n\t\t\t\t\taddAttribute(attrName, value, start)\n\t\t\t\t}else{\n\t\t\t\t\tif(!NAMESPACE.isHTML(currentNSMap['']) || !value.match(/^(?:disabled|checked|selected)$/i)){\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')\n\t\t\t\t\t}\n\t\t\t\t\taddAttribute(value, value, start)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase S_EQ:\n\t\t\t\tthrow new Error('attribute value missed!!');\n\t\t\t}\n//\t\t\tconsole.log(tagName,tagNamePattern,tagNamePattern.test(tagName))\n\t\t\treturn p;\n\t\t/*xml space '\\x20' | #x9 | #xD | #xA; */\n\t\tcase '\\u0080':\n\t\t\tc = ' ';\n\t\tdefault:\n\t\t\tif(c<= ' '){//space\n\t\t\t\tswitch(s){\n\t\t\t\tcase S_TAG:\n\t\t\t\t\tel.setTagName(source.slice(start,p));//tagName\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR:\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t\ts = S_ATTR_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\t\t\tvar value = source.slice(start, p);\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\n\t\t\t\t\taddAttribute(attrName, value, start)\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\t//case S_TAG_SPACE:\n\t\t\t\t//case S_EQ:\n\t\t\t\t//case S_ATTR_SPACE:\n\t\t\t\t//\tvoid();break;\n\t\t\t\t//case S_TAG_CLOSE:\n\t\t\t\t\t//ignore warning\n\t\t\t\t}\n\t\t\t}else{//not space\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\n\t\t\t\tswitch(s){\n\t\t\t\t//case S_TAG:void();break;\n\t\t\t\t//case S_ATTR:void();break;\n\t\t\t\t//case S_ATTR_NOQUOT_VALUE:void();break;\n\t\t\t\tcase S_ATTR_SPACE:\n\t\t\t\t\tvar tagName = el.tagName;\n\t\t\t\t\tif (!NAMESPACE.isHTML(currentNSMap['']) || !attrName.match(/^(?:disabled|checked|selected)$/i)) {\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')\n\t\t\t\t\t}\n\t\t\t\t\taddAttribute(attrName, attrName, start);\n\t\t\t\t\tstart = p;\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\terrorHandler.warning('attribute space is required\"'+attrName+'\"!!')\n\t\t\t\tcase S_TAG_SPACE:\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_EQ:\n\t\t\t\t\ts = S_ATTR_NOQUOT_VALUE;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_TAG_CLOSE:\n\t\t\t\t\tthrow new Error(\"elements closed character '/' and '>' must be connected to\");\n\t\t\t\t}\n\t\t\t}\n\t\t}//end outer switch\n\t\t//console.log('p++',p)\n\t\tp++;\n\t}\n}\n/**\n * @return true if has new namespace define\n */\nfunction appendElement(el,domBuilder,currentNSMap){\n\tvar tagName = el.tagName;\n\tvar localNSMap = null;\n\t//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;\n\tvar i = el.length;\n\twhile(i--){\n\t\tvar a = el[i];\n\t\tvar qName = a.qName;\n\t\tvar value = a.value;\n\t\tvar nsp = qName.indexOf(':');\n\t\tif(nsp>0){\n\t\t\tvar prefix = a.prefix = qName.slice(0,nsp);\n\t\t\tvar localName = qName.slice(nsp+1);\n\t\t\tvar nsPrefix = prefix === 'xmlns' && localName\n\t\t}else{\n\t\t\tlocalName = qName;\n\t\t\tprefix = null\n\t\t\tnsPrefix = qName === 'xmlns' && ''\n\t\t}\n\t\t//can not set prefix,because prefix !== ''\n\t\ta.localName = localName ;\n\t\t//prefix == null for no ns prefix attribute\n\t\tif(nsPrefix !== false){//hack!!\n\t\t\tif(localNSMap == null){\n\t\t\t\tlocalNSMap = {}\n\t\t\t\t//console.log(currentNSMap,0)\n\t\t\t\t_copy(currentNSMap,currentNSMap={})\n\t\t\t\t//console.log(currentNSMap,1)\n\t\t\t}\n\t\t\tcurrentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;\n\t\t\ta.uri = NAMESPACE.XMLNS\n\t\t\tdomBuilder.startPrefixMapping(nsPrefix, value)\n\t\t}\n\t}\n\tvar i = el.length;\n\twhile(i--){\n\t\ta = el[i];\n\t\tvar prefix = a.prefix;\n\t\tif(prefix){//no prefix attribute has no namespace\n\t\t\tif(prefix === 'xml'){\n\t\t\t\ta.uri = NAMESPACE.XML;\n\t\t\t}if(prefix !== 'xmlns'){\n\t\t\t\ta.uri = currentNSMap[prefix || '']\n\n\t\t\t\t//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}\n\t\t\t}\n\t\t}\n\t}\n\tvar nsp = tagName.indexOf(':');\n\tif(nsp>0){\n\t\tprefix = el.prefix = tagName.slice(0,nsp);\n\t\tlocalName = el.localName = tagName.slice(nsp+1);\n\t}else{\n\t\tprefix = null;//important!!\n\t\tlocalName = el.localName = tagName;\n\t}\n\t//no prefix element has default namespace\n\tvar ns = el.uri = currentNSMap[prefix || ''];\n\tdomBuilder.startElement(ns,localName,tagName,el);\n\t//endPrefixMapping and startPrefixMapping have not any help for dom builder\n\t//localNSMap = null\n\tif(el.closed){\n\t\tdomBuilder.endElement(ns,localName,tagName);\n\t\tif(localNSMap){\n\t\t\tfor (prefix in localNSMap) {\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(localNSMap, prefix)) {\n\t\t\t\t\tdomBuilder.endPrefixMapping(prefix);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}else{\n\t\tel.currentNSMap = currentNSMap;\n\t\tel.localNSMap = localNSMap;\n\t\t//parseStack.push(el);\n\t\treturn true;\n\t}\n}\nfunction parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){\n\tif(/^(?:script|textarea)$/i.test(tagName)){\n\t\tvar elEndStart = source.indexOf('',elStartEnd);\n\t\tvar text = source.substring(elStartEnd+1,elEndStart);\n\t\tif(/[&<]/.test(text)){\n\t\t\tif(/^script$/i.test(tagName)){\n\t\t\t\t//if(!/\\]\\]>/.test(text)){\n\t\t\t\t\t//lexHandler.startCDATA();\n\t\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\t\t//lexHandler.endCDATA();\n\t\t\t\t\treturn elEndStart;\n\t\t\t\t//}\n\t\t\t}//}else{//text area\n\t\t\t\ttext = text.replace(/&#?\\w+;/g,entityReplacer);\n\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\treturn elEndStart;\n\t\t\t//}\n\n\t\t}\n\t}\n\treturn elStartEnd+1;\n}\nfunction fixSelfClosed(source,elStartEnd,tagName,closeMap){\n\t//if(tagName in closeMap){\n\tvar pos = closeMap[tagName];\n\tif(pos == null){\n\t\t//console.log(tagName)\n\t\tpos = source.lastIndexOf('')\n\t\tif(pos',start+4);\n\t\t\t//append comment source.substring(4,end)// ${end}. Duration (${end - start})\\n`;\n }\n return bufferedRangesStr;\n}\n\n/**\n * ranges\n *\n * Utilities for working with TimeRanges.\n *\n */\n\nconst TIME_FUDGE_FACTOR = 1 / 30; // Comparisons between time values such as current time and the end of the buffered range\n// can be misleading because of precision differences or when the current media has poorly\n// aligned audio and video, which can cause values to be slightly off from what you would\n// expect. This value is what we consider to be safe to use in such comparisons to account\n// for these scenarios.\n\nconst SAFE_TIME_DELTA = TIME_FUDGE_FACTOR * 3;\nconst filterRanges = function (timeRanges, predicate) {\n const results = [];\n let i;\n if (timeRanges && timeRanges.length) {\n // Search for ranges that match the predicate\n for (i = 0; i < timeRanges.length; i++) {\n if (predicate(timeRanges.start(i), timeRanges.end(i))) {\n results.push([timeRanges.start(i), timeRanges.end(i)]);\n }\n }\n }\n return createTimeRanges(results);\n};\n/**\n * Attempts to find the buffered TimeRange that contains the specified\n * time.\n *\n * @param {TimeRanges} buffered - the TimeRanges object to query\n * @param {number} time - the time to filter on.\n * @return {TimeRanges} a new TimeRanges object\n */\n\nconst findRange = function (buffered, time) {\n return filterRanges(buffered, function (start, end) {\n return start - SAFE_TIME_DELTA <= time && end + SAFE_TIME_DELTA >= time;\n });\n};\n/**\n * Returns the TimeRanges that begin later than the specified time.\n *\n * @param {TimeRanges} timeRanges - the TimeRanges object to query\n * @param {number} time - the time to filter on.\n * @return {TimeRanges} a new TimeRanges object.\n */\n\nconst findNextRange = function (timeRanges, time) {\n return filterRanges(timeRanges, function (start) {\n return start - TIME_FUDGE_FACTOR >= time;\n });\n};\n/**\n * Returns gaps within a list of TimeRanges\n *\n * @param {TimeRanges} buffered - the TimeRanges object\n * @return {TimeRanges} a TimeRanges object of gaps\n */\n\nconst findGaps = function (buffered) {\n if (buffered.length < 2) {\n return createTimeRanges();\n }\n const ranges = [];\n for (let i = 1; i < buffered.length; i++) {\n const start = buffered.end(i - 1);\n const end = buffered.start(i);\n ranges.push([start, end]);\n }\n return createTimeRanges(ranges);\n};\n/**\n * Calculate the intersection of two TimeRanges\n *\n * @param {TimeRanges} bufferA\n * @param {TimeRanges} bufferB\n * @return {TimeRanges} The interesection of `bufferA` with `bufferB`\n */\n\nconst bufferIntersection = function (bufferA, bufferB) {\n let start = null;\n let end = null;\n let arity = 0;\n const extents = [];\n const ranges = [];\n if (!bufferA || !bufferA.length || !bufferB || !bufferB.length) {\n return createTimeRanges();\n } // Handle the case where we have both buffers and create an\n // intersection of the two\n\n let count = bufferA.length; // A) Gather up all start and end times\n\n while (count--) {\n extents.push({\n time: bufferA.start(count),\n type: 'start'\n });\n extents.push({\n time: bufferA.end(count),\n type: 'end'\n });\n }\n count = bufferB.length;\n while (count--) {\n extents.push({\n time: bufferB.start(count),\n type: 'start'\n });\n extents.push({\n time: bufferB.end(count),\n type: 'end'\n });\n } // B) Sort them by time\n\n extents.sort(function (a, b) {\n return a.time - b.time;\n }); // C) Go along one by one incrementing arity for start and decrementing\n // arity for ends\n\n for (count = 0; count < extents.length; count++) {\n if (extents[count].type === 'start') {\n arity++; // D) If arity is ever incremented to 2 we are entering an\n // overlapping range\n\n if (arity === 2) {\n start = extents[count].time;\n }\n } else if (extents[count].type === 'end') {\n arity--; // E) If arity is ever decremented to 1 we leaving an\n // overlapping range\n\n if (arity === 1) {\n end = extents[count].time;\n }\n } // F) Record overlapping ranges\n\n if (start !== null && end !== null) {\n ranges.push([start, end]);\n start = null;\n end = null;\n }\n }\n return createTimeRanges(ranges);\n};\n/**\n * Gets a human readable string for a TimeRange\n *\n * @param {TimeRange} range\n * @return {string} a human readable string\n */\n\nconst printableRange = range => {\n const strArr = [];\n if (!range || !range.length) {\n return '';\n }\n for (let i = 0; i < range.length; i++) {\n strArr.push(range.start(i) + ' => ' + range.end(i));\n }\n return strArr.join(', ');\n};\n/**\n * Calculates the amount of time left in seconds until the player hits the end of the\n * buffer and causes a rebuffer\n *\n * @param {TimeRange} buffered\n * The state of the buffer\n * @param {Numnber} currentTime\n * The current time of the player\n * @param {number} playbackRate\n * The current playback rate of the player. Defaults to 1.\n * @return {number}\n * Time until the player has to start rebuffering in seconds.\n * @function timeUntilRebuffer\n */\n\nconst timeUntilRebuffer = function (buffered, currentTime, playbackRate = 1) {\n const bufferedEnd = buffered.length ? buffered.end(buffered.length - 1) : 0;\n return (bufferedEnd - currentTime) / playbackRate;\n};\n/**\n * Converts a TimeRanges object into an array representation\n *\n * @param {TimeRanges} timeRanges\n * @return {Array}\n */\n\nconst timeRangesToArray = timeRanges => {\n const timeRangesList = [];\n for (let i = 0; i < timeRanges.length; i++) {\n timeRangesList.push({\n start: timeRanges.start(i),\n end: timeRanges.end(i)\n });\n }\n return timeRangesList;\n};\n/**\n * Determines if two time range objects are different.\n *\n * @param {TimeRange} a\n * the first time range object to check\n *\n * @param {TimeRange} b\n * the second time range object to check\n *\n * @return {Boolean}\n * Whether the time range objects differ\n */\n\nconst isRangeDifferent = function (a, b) {\n // same object\n if (a === b) {\n return false;\n } // one or the other is undefined\n\n if (!a && b || !b && a) {\n return true;\n } // length is different\n\n if (a.length !== b.length) {\n return true;\n } // see if any start/end pair is different\n\n for (let i = 0; i < a.length; i++) {\n if (a.start(i) !== b.start(i) || a.end(i) !== b.end(i)) {\n return true;\n }\n } // if the length and every pair is the same\n // this is the same time range\n\n return false;\n};\nconst lastBufferedEnd = function (a) {\n if (!a || !a.length || !a.end) {\n return;\n }\n return a.end(a.length - 1);\n};\n/**\n * A utility function to add up the amount of time in a timeRange\n * after a specified startTime.\n * ie:[[0, 10], [20, 40], [50, 60]] with a startTime 0\n * would return 40 as there are 40s seconds after 0 in the timeRange\n *\n * @param {TimeRange} range\n * The range to check against\n * @param {number} startTime\n * The time in the time range that you should start counting from\n *\n * @return {number}\n * The number of seconds in the buffer passed the specified time.\n */\n\nconst timeAheadOf = function (range, startTime) {\n let time = 0;\n if (!range || !range.length) {\n return time;\n }\n for (let i = 0; i < range.length; i++) {\n const start = range.start(i);\n const end = range.end(i); // startTime is after this range entirely\n\n if (startTime > end) {\n continue;\n } // startTime is within this range\n\n if (startTime > start && startTime <= end) {\n time += end - startTime;\n continue;\n } // startTime is before this range.\n\n time += end - start;\n }\n return time;\n};\n\n/**\n * @file playlist.js\n *\n * Playlist related utilities.\n */\n/**\n * Get the duration of a segment, with special cases for\n * llhls segments that do not have a duration yet.\n *\n * @param {Object} playlist\n * the playlist that the segment belongs to.\n * @param {Object} segment\n * the segment to get a duration for.\n *\n * @return {number}\n * the segment duration\n */\n\nconst segmentDurationWithParts = (playlist, segment) => {\n // if this isn't a preload segment\n // then we will have a segment duration that is accurate.\n if (!segment.preload) {\n return segment.duration;\n } // otherwise we have to add up parts and preload hints\n // to get an up to date duration.\n\n let result = 0;\n (segment.parts || []).forEach(function (p) {\n result += p.duration;\n }); // for preload hints we have to use partTargetDuration\n // as they won't even have a duration yet.\n\n (segment.preloadHints || []).forEach(function (p) {\n if (p.type === 'PART') {\n result += playlist.partTargetDuration;\n }\n });\n return result;\n};\n/**\n * A function to get a combined list of parts and segments with durations\n * and indexes.\n *\n * @param {Playlist} playlist the playlist to get the list for.\n *\n * @return {Array} The part/segment list.\n */\n\nconst getPartsAndSegments = playlist => (playlist.segments || []).reduce((acc, segment, si) => {\n if (segment.parts) {\n segment.parts.forEach(function (part, pi) {\n acc.push({\n duration: part.duration,\n segmentIndex: si,\n partIndex: pi,\n part,\n segment\n });\n });\n } else {\n acc.push({\n duration: segment.duration,\n segmentIndex: si,\n partIndex: null,\n segment,\n part: null\n });\n }\n return acc;\n}, []);\nconst getLastParts = media => {\n const lastSegment = media.segments && media.segments.length && media.segments[media.segments.length - 1];\n return lastSegment && lastSegment.parts || [];\n};\nconst getKnownPartCount = ({\n preloadSegment\n}) => {\n if (!preloadSegment) {\n return;\n }\n const {\n parts,\n preloadHints\n } = preloadSegment;\n let partCount = (preloadHints || []).reduce((count, hint) => count + (hint.type === 'PART' ? 1 : 0), 0);\n partCount += parts && parts.length ? parts.length : 0;\n return partCount;\n};\n/**\n * Get the number of seconds to delay from the end of a\n * live playlist.\n *\n * @param {Playlist} main the main playlist\n * @param {Playlist} media the media playlist\n * @return {number} the hold back in seconds.\n */\n\nconst liveEdgeDelay = (main, media) => {\n if (media.endList) {\n return 0;\n } // dash suggestedPresentationDelay trumps everything\n\n if (main && main.suggestedPresentationDelay) {\n return main.suggestedPresentationDelay;\n }\n const hasParts = getLastParts(media).length > 0; // look for \"part\" delays from ll-hls first\n\n if (hasParts && media.serverControl && media.serverControl.partHoldBack) {\n return media.serverControl.partHoldBack;\n } else if (hasParts && media.partTargetDuration) {\n return media.partTargetDuration * 3; // finally look for full segment delays\n } else if (media.serverControl && media.serverControl.holdBack) {\n return media.serverControl.holdBack;\n } else if (media.targetDuration) {\n return media.targetDuration * 3;\n }\n return 0;\n};\n/**\n * walk backward until we find a duration we can use\n * or return a failure\n *\n * @param {Playlist} playlist the playlist to walk through\n * @param {Number} endSequence the mediaSequence to stop walking on\n */\n\nconst backwardDuration = function (playlist, endSequence) {\n let result = 0;\n let i = endSequence - playlist.mediaSequence; // if a start time is available for segment immediately following\n // the interval, use it\n\n let segment = playlist.segments[i]; // Walk backward until we find the latest segment with timeline\n // information that is earlier than endSequence\n\n if (segment) {\n if (typeof segment.start !== 'undefined') {\n return {\n result: segment.start,\n precise: true\n };\n }\n if (typeof segment.end !== 'undefined') {\n return {\n result: segment.end - segment.duration,\n precise: true\n };\n }\n }\n while (i--) {\n segment = playlist.segments[i];\n if (typeof segment.end !== 'undefined') {\n return {\n result: result + segment.end,\n precise: true\n };\n }\n result += segmentDurationWithParts(playlist, segment);\n if (typeof segment.start !== 'undefined') {\n return {\n result: result + segment.start,\n precise: true\n };\n }\n }\n return {\n result,\n precise: false\n };\n};\n/**\n * walk forward until we find a duration we can use\n * or return a failure\n *\n * @param {Playlist} playlist the playlist to walk through\n * @param {number} endSequence the mediaSequence to stop walking on\n */\n\nconst forwardDuration = function (playlist, endSequence) {\n let result = 0;\n let segment;\n let i = endSequence - playlist.mediaSequence; // Walk forward until we find the earliest segment with timeline\n // information\n\n for (; i < playlist.segments.length; i++) {\n segment = playlist.segments[i];\n if (typeof segment.start !== 'undefined') {\n return {\n result: segment.start - result,\n precise: true\n };\n }\n result += segmentDurationWithParts(playlist, segment);\n if (typeof segment.end !== 'undefined') {\n return {\n result: segment.end - result,\n precise: true\n };\n }\n } // indicate we didn't find a useful duration estimate\n\n return {\n result: -1,\n precise: false\n };\n};\n/**\n * Calculate the media duration from the segments associated with a\n * playlist. The duration of a subinterval of the available segments\n * may be calculated by specifying an end index.\n *\n * @param {Object} playlist a media playlist object\n * @param {number=} endSequence an exclusive upper boundary\n * for the playlist. Defaults to playlist length.\n * @param {number} expired the amount of time that has dropped\n * off the front of the playlist in a live scenario\n * @return {number} the duration between the first available segment\n * and end index.\n */\n\nconst intervalDuration = function (playlist, endSequence, expired) {\n if (typeof endSequence === 'undefined') {\n endSequence = playlist.mediaSequence + playlist.segments.length;\n }\n if (endSequence < playlist.mediaSequence) {\n return 0;\n } // do a backward walk to estimate the duration\n\n const backward = backwardDuration(playlist, endSequence);\n if (backward.precise) {\n // if we were able to base our duration estimate on timing\n // information provided directly from the Media Source, return\n // it\n return backward.result;\n } // walk forward to see if a precise duration estimate can be made\n // that way\n\n const forward = forwardDuration(playlist, endSequence);\n if (forward.precise) {\n // we found a segment that has been buffered and so it's\n // position is known precisely\n return forward.result;\n } // return the less-precise, playlist-based duration estimate\n\n return backward.result + expired;\n};\n/**\n * Calculates the duration of a playlist. If a start and end index\n * are specified, the duration will be for the subset of the media\n * timeline between those two indices. The total duration for live\n * playlists is always Infinity.\n *\n * @param {Object} playlist a media playlist object\n * @param {number=} endSequence an exclusive upper\n * boundary for the playlist. Defaults to the playlist media\n * sequence number plus its length.\n * @param {number=} expired the amount of time that has\n * dropped off the front of the playlist in a live scenario\n * @return {number} the duration between the start index and end\n * index.\n */\n\nconst duration = function (playlist, endSequence, expired) {\n if (!playlist) {\n return 0;\n }\n if (typeof expired !== 'number') {\n expired = 0;\n } // if a slice of the total duration is not requested, use\n // playlist-level duration indicators when they're present\n\n if (typeof endSequence === 'undefined') {\n // if present, use the duration specified in the playlist\n if (playlist.totalDuration) {\n return playlist.totalDuration;\n } // duration should be Infinity for live playlists\n\n if (!playlist.endList) {\n return window$1.Infinity;\n }\n } // calculate the total duration based on the segment durations\n\n return intervalDuration(playlist, endSequence, expired);\n};\n/**\n * Calculate the time between two indexes in the current playlist\n * neight the start- nor the end-index need to be within the current\n * playlist in which case, the targetDuration of the playlist is used\n * to approximate the durations of the segments\n *\n * @param {Array} options.durationList list to iterate over for durations.\n * @param {number} options.defaultDuration duration to use for elements before or after the durationList\n * @param {number} options.startIndex partsAndSegments index to start\n * @param {number} options.endIndex partsAndSegments index to end.\n * @return {number} the number of seconds between startIndex and endIndex\n */\n\nconst sumDurations = function ({\n defaultDuration,\n durationList,\n startIndex,\n endIndex\n}) {\n let durations = 0;\n if (startIndex > endIndex) {\n [startIndex, endIndex] = [endIndex, startIndex];\n }\n if (startIndex < 0) {\n for (let i = startIndex; i < Math.min(0, endIndex); i++) {\n durations += defaultDuration;\n }\n startIndex = 0;\n }\n for (let i = startIndex; i < endIndex; i++) {\n durations += durationList[i].duration;\n }\n return durations;\n};\n/**\n * Calculates the playlist end time\n *\n * @param {Object} playlist a media playlist object\n * @param {number=} expired the amount of time that has\n * dropped off the front of the playlist in a live scenario\n * @param {boolean|false} useSafeLiveEnd a boolean value indicating whether or not the\n * playlist end calculation should consider the safe live end\n * (truncate the playlist end by three segments). This is normally\n * used for calculating the end of the playlist's seekable range.\n * This takes into account the value of liveEdgePadding.\n * Setting liveEdgePadding to 0 is equivalent to setting this to false.\n * @param {number} liveEdgePadding a number indicating how far from the end of the playlist we should be in seconds.\n * If this is provided, it is used in the safe live end calculation.\n * Setting useSafeLiveEnd=false or liveEdgePadding=0 are equivalent.\n * Corresponds to suggestedPresentationDelay in DASH manifests.\n * @return {number} the end time of playlist\n * @function playlistEnd\n */\n\nconst playlistEnd = function (playlist, expired, useSafeLiveEnd, liveEdgePadding) {\n if (!playlist || !playlist.segments) {\n return null;\n }\n if (playlist.endList) {\n return duration(playlist);\n }\n if (expired === null) {\n return null;\n }\n expired = expired || 0;\n let lastSegmentEndTime = intervalDuration(playlist, playlist.mediaSequence + playlist.segments.length, expired);\n if (useSafeLiveEnd) {\n liveEdgePadding = typeof liveEdgePadding === 'number' ? liveEdgePadding : liveEdgeDelay(null, playlist);\n lastSegmentEndTime -= liveEdgePadding;\n } // don't return a time less than zero\n\n return Math.max(0, lastSegmentEndTime);\n};\n/**\n * Calculates the interval of time that is currently seekable in a\n * playlist. The returned time ranges are relative to the earliest\n * moment in the specified playlist that is still available. A full\n * seekable implementation for live streams would need to offset\n * these values by the duration of content that has expired from the\n * stream.\n *\n * @param {Object} playlist a media playlist object\n * dropped off the front of the playlist in a live scenario\n * @param {number=} expired the amount of time that has\n * dropped off the front of the playlist in a live scenario\n * @param {number} liveEdgePadding how far from the end of the playlist we should be in seconds.\n * Corresponds to suggestedPresentationDelay in DASH manifests.\n * @return {TimeRanges} the periods of time that are valid targets\n * for seeking\n */\n\nconst seekable = function (playlist, expired, liveEdgePadding) {\n const useSafeLiveEnd = true;\n const seekableStart = expired || 0;\n let seekableEnd = playlistEnd(playlist, expired, useSafeLiveEnd, liveEdgePadding);\n if (seekableEnd === null) {\n return createTimeRanges();\n } // Clamp seekable end since it can not be less than the seekable start\n\n if (seekableEnd < seekableStart) {\n seekableEnd = seekableStart;\n }\n return createTimeRanges(seekableStart, seekableEnd);\n};\n/**\n * Determine the index and estimated starting time of the segment that\n * contains a specified playback position in a media playlist.\n *\n * @param {Object} options.playlist the media playlist to query\n * @param {number} options.currentTime The number of seconds since the earliest\n * possible position to determine the containing segment for\n * @param {number} options.startTime the time when the segment/part starts\n * @param {number} options.startingSegmentIndex the segment index to start looking at.\n * @param {number?} [options.startingPartIndex] the part index to look at within the segment.\n *\n * @return {Object} an object with partIndex, segmentIndex, and startTime.\n */\n\nconst getMediaInfoForTime = function ({\n playlist,\n currentTime,\n startingSegmentIndex,\n startingPartIndex,\n startTime,\n exactManifestTimings\n}) {\n let time = currentTime - startTime;\n const partsAndSegments = getPartsAndSegments(playlist);\n let startIndex = 0;\n for (let i = 0; i < partsAndSegments.length; i++) {\n const partAndSegment = partsAndSegments[i];\n if (startingSegmentIndex !== partAndSegment.segmentIndex) {\n continue;\n } // skip this if part index does not match.\n\n if (typeof startingPartIndex === 'number' && typeof partAndSegment.partIndex === 'number' && startingPartIndex !== partAndSegment.partIndex) {\n continue;\n }\n startIndex = i;\n break;\n }\n if (time < 0) {\n // Walk backward from startIndex in the playlist, adding durations\n // until we find a segment that contains `time` and return it\n if (startIndex > 0) {\n for (let i = startIndex - 1; i >= 0; i--) {\n const partAndSegment = partsAndSegments[i];\n time += partAndSegment.duration;\n if (exactManifestTimings) {\n if (time < 0) {\n continue;\n }\n } else if (time + TIME_FUDGE_FACTOR <= 0) {\n continue;\n }\n return {\n partIndex: partAndSegment.partIndex,\n segmentIndex: partAndSegment.segmentIndex,\n startTime: startTime - sumDurations({\n defaultDuration: playlist.targetDuration,\n durationList: partsAndSegments,\n startIndex,\n endIndex: i\n })\n };\n }\n } // We were unable to find a good segment within the playlist\n // so select the first segment\n\n return {\n partIndex: partsAndSegments[0] && partsAndSegments[0].partIndex || null,\n segmentIndex: partsAndSegments[0] && partsAndSegments[0].segmentIndex || 0,\n startTime: currentTime\n };\n } // When startIndex is negative, we first walk forward to first segment\n // adding target durations. If we \"run out of time\" before getting to\n // the first segment, return the first segment\n\n if (startIndex < 0) {\n for (let i = startIndex; i < 0; i++) {\n time -= playlist.targetDuration;\n if (time < 0) {\n return {\n partIndex: partsAndSegments[0] && partsAndSegments[0].partIndex || null,\n segmentIndex: partsAndSegments[0] && partsAndSegments[0].segmentIndex || 0,\n startTime: currentTime\n };\n }\n }\n startIndex = 0;\n } // Walk forward from startIndex in the playlist, subtracting durations\n // until we find a segment that contains `time` and return it\n\n for (let i = startIndex; i < partsAndSegments.length; i++) {\n const partAndSegment = partsAndSegments[i];\n time -= partAndSegment.duration;\n const canUseFudgeFactor = partAndSegment.duration > TIME_FUDGE_FACTOR;\n const isExactlyAtTheEnd = time === 0;\n const isExtremelyCloseToTheEnd = canUseFudgeFactor && time + TIME_FUDGE_FACTOR >= 0;\n if (isExactlyAtTheEnd || isExtremelyCloseToTheEnd) {\n // 1) We are exactly at the end of the current segment.\n // 2) We are extremely close to the end of the current segment (The difference is less than 1 / 30).\n // We may encounter this situation when\n // we don't have exact match between segment duration info in the manifest and the actual duration of the segment\n // For example:\n // We appended 3 segments 10 seconds each, meaning we should have 30 sec buffered,\n // but we the actual buffered is 29.99999\n //\n // In both cases:\n // if we passed current time -> it means that we already played current segment\n // if we passed buffered.end -> it means that this segment is already loaded and buffered\n // we should select the next segment if we have one:\n if (i !== partsAndSegments.length - 1) {\n continue;\n }\n }\n if (exactManifestTimings) {\n if (time > 0) {\n continue;\n }\n } else if (time - TIME_FUDGE_FACTOR >= 0) {\n continue;\n }\n return {\n partIndex: partAndSegment.partIndex,\n segmentIndex: partAndSegment.segmentIndex,\n startTime: startTime + sumDurations({\n defaultDuration: playlist.targetDuration,\n durationList: partsAndSegments,\n startIndex,\n endIndex: i\n })\n };\n } // We are out of possible candidates so load the last one...\n\n return {\n segmentIndex: partsAndSegments[partsAndSegments.length - 1].segmentIndex,\n partIndex: partsAndSegments[partsAndSegments.length - 1].partIndex,\n startTime: currentTime\n };\n};\n/**\n * Check whether the playlist is excluded or not.\n *\n * @param {Object} playlist the media playlist object\n * @return {boolean} whether the playlist is excluded or not\n * @function isExcluded\n */\n\nconst isExcluded = function (playlist) {\n return playlist.excludeUntil && playlist.excludeUntil > Date.now();\n};\n/**\n * Check whether the playlist is compatible with current playback configuration or has\n * been excluded permanently for being incompatible.\n *\n * @param {Object} playlist the media playlist object\n * @return {boolean} whether the playlist is incompatible or not\n * @function isIncompatible\n */\n\nconst isIncompatible = function (playlist) {\n return playlist.excludeUntil && playlist.excludeUntil === Infinity;\n};\n/**\n * Check whether the playlist is enabled or not.\n *\n * @param {Object} playlist the media playlist object\n * @return {boolean} whether the playlist is enabled or not\n * @function isEnabled\n */\n\nconst isEnabled = function (playlist) {\n const excluded = isExcluded(playlist);\n return !playlist.disabled && !excluded;\n};\n/**\n * Check whether the playlist has been manually disabled through the representations api.\n *\n * @param {Object} playlist the media playlist object\n * @return {boolean} whether the playlist is disabled manually or not\n * @function isDisabled\n */\n\nconst isDisabled = function (playlist) {\n return playlist.disabled;\n};\n/**\n * Returns whether the current playlist is an AES encrypted HLS stream\n *\n * @return {boolean} true if it's an AES encrypted HLS stream\n */\n\nconst isAes = function (media) {\n for (let i = 0; i < media.segments.length; i++) {\n if (media.segments[i].key) {\n return true;\n }\n }\n return false;\n};\n/**\n * Checks if the playlist has a value for the specified attribute\n *\n * @param {string} attr\n * Attribute to check for\n * @param {Object} playlist\n * The media playlist object\n * @return {boolean}\n * Whether the playlist contains a value for the attribute or not\n * @function hasAttribute\n */\n\nconst hasAttribute = function (attr, playlist) {\n return playlist.attributes && playlist.attributes[attr];\n};\n/**\n * Estimates the time required to complete a segment download from the specified playlist\n *\n * @param {number} segmentDuration\n * Duration of requested segment\n * @param {number} bandwidth\n * Current measured bandwidth of the player\n * @param {Object} playlist\n * The media playlist object\n * @param {number=} bytesReceived\n * Number of bytes already received for the request. Defaults to 0\n * @return {number|NaN}\n * The estimated time to request the segment. NaN if bandwidth information for\n * the given playlist is unavailable\n * @function estimateSegmentRequestTime\n */\n\nconst estimateSegmentRequestTime = function (segmentDuration, bandwidth, playlist, bytesReceived = 0) {\n if (!hasAttribute('BANDWIDTH', playlist)) {\n return NaN;\n }\n const size = segmentDuration * playlist.attributes.BANDWIDTH;\n return (size - bytesReceived * 8) / bandwidth;\n};\n/*\n * Returns whether the current playlist is the lowest rendition\n *\n * @return {Boolean} true if on lowest rendition\n */\n\nconst isLowestEnabledRendition = (main, media) => {\n if (main.playlists.length === 1) {\n return true;\n }\n const currentBandwidth = media.attributes.BANDWIDTH || Number.MAX_VALUE;\n return main.playlists.filter(playlist => {\n if (!isEnabled(playlist)) {\n return false;\n }\n return (playlist.attributes.BANDWIDTH || 0) < currentBandwidth;\n }).length === 0;\n};\nconst playlistMatch = (a, b) => {\n // both playlits are null\n // or only one playlist is non-null\n // no match\n if (!a && !b || !a && b || a && !b) {\n return false;\n } // playlist objects are the same, match\n\n if (a === b) {\n return true;\n } // first try to use id as it should be the most\n // accurate\n\n if (a.id && b.id && a.id === b.id) {\n return true;\n } // next try to use reslovedUri as it should be the\n // second most accurate.\n\n if (a.resolvedUri && b.resolvedUri && a.resolvedUri === b.resolvedUri) {\n return true;\n } // finally try to use uri as it should be accurate\n // but might miss a few cases for relative uris\n\n if (a.uri && b.uri && a.uri === b.uri) {\n return true;\n }\n return false;\n};\nconst someAudioVariant = function (main, callback) {\n const AUDIO = main && main.mediaGroups && main.mediaGroups.AUDIO || {};\n let found = false;\n for (const groupName in AUDIO) {\n for (const label in AUDIO[groupName]) {\n found = callback(AUDIO[groupName][label]);\n if (found) {\n break;\n }\n }\n if (found) {\n break;\n }\n }\n return !!found;\n};\nconst isAudioOnly = main => {\n // we are audio only if we have no main playlists but do\n // have media group playlists.\n if (!main || !main.playlists || !main.playlists.length) {\n // without audio variants or playlists this\n // is not an audio only main.\n const found = someAudioVariant(main, variant => variant.playlists && variant.playlists.length || variant.uri);\n return found;\n } // if every playlist has only an audio codec it is audio only\n\n for (let i = 0; i < main.playlists.length; i++) {\n const playlist = main.playlists[i];\n const CODECS = playlist.attributes && playlist.attributes.CODECS; // all codecs are audio, this is an audio playlist.\n\n if (CODECS && CODECS.split(',').every(c => isAudioCodec(c))) {\n continue;\n } // playlist is in an audio group it is audio only\n\n const found = someAudioVariant(main, variant => playlistMatch(playlist, variant));\n if (found) {\n continue;\n } // if we make it here this playlist isn't audio and we\n // are not audio only\n\n return false;\n } // if we make it past every playlist without returning, then\n // this is an audio only playlist.\n\n return true;\n}; // exports\n\nvar Playlist = {\n liveEdgeDelay,\n duration,\n seekable,\n getMediaInfoForTime,\n isEnabled,\n isDisabled,\n isExcluded,\n isIncompatible,\n playlistEnd,\n isAes,\n hasAttribute,\n estimateSegmentRequestTime,\n isLowestEnabledRendition,\n isAudioOnly,\n playlistMatch,\n segmentDurationWithParts\n};\nconst {\n log\n} = videojs;\nconst createPlaylistID = (index, uri) => {\n return `${index}-${uri}`;\n}; // default function for creating a group id\n\nconst groupID = (type, group, label) => {\n return `placeholder-uri-${type}-${group}-${label}`;\n};\n/**\n * Parses a given m3u8 playlist\n *\n * @param {Function} [onwarn]\n * a function to call when the parser triggers a warning event.\n * @param {Function} [oninfo]\n * a function to call when the parser triggers an info event.\n * @param {string} manifestString\n * The downloaded manifest string\n * @param {Object[]} [customTagParsers]\n * An array of custom tag parsers for the m3u8-parser instance\n * @param {Object[]} [customTagMappers]\n * An array of custom tag mappers for the m3u8-parser instance\n * @param {boolean} [llhls]\n * Whether to keep ll-hls features in the manifest after parsing.\n * @return {Object}\n * The manifest object\n */\n\nconst parseManifest = ({\n onwarn,\n oninfo,\n manifestString,\n customTagParsers = [],\n customTagMappers = [],\n llhls\n}) => {\n const parser = new Parser();\n if (onwarn) {\n parser.on('warn', onwarn);\n }\n if (oninfo) {\n parser.on('info', oninfo);\n }\n customTagParsers.forEach(customParser => parser.addParser(customParser));\n customTagMappers.forEach(mapper => parser.addTagMapper(mapper));\n parser.push(manifestString);\n parser.end();\n const manifest = parser.manifest; // remove llhls features from the parsed manifest\n // if we don't want llhls support.\n\n if (!llhls) {\n ['preloadSegment', 'skip', 'serverControl', 'renditionReports', 'partInf', 'partTargetDuration'].forEach(function (k) {\n if (manifest.hasOwnProperty(k)) {\n delete manifest[k];\n }\n });\n if (manifest.segments) {\n manifest.segments.forEach(function (segment) {\n ['parts', 'preloadHints'].forEach(function (k) {\n if (segment.hasOwnProperty(k)) {\n delete segment[k];\n }\n });\n });\n }\n }\n if (!manifest.targetDuration) {\n let targetDuration = 10;\n if (manifest.segments && manifest.segments.length) {\n targetDuration = manifest.segments.reduce((acc, s) => Math.max(acc, s.duration), 0);\n }\n if (onwarn) {\n onwarn({\n message: `manifest has no targetDuration defaulting to ${targetDuration}`\n });\n }\n manifest.targetDuration = targetDuration;\n }\n const parts = getLastParts(manifest);\n if (parts.length && !manifest.partTargetDuration) {\n const partTargetDuration = parts.reduce((acc, p) => Math.max(acc, p.duration), 0);\n if (onwarn) {\n onwarn({\n message: `manifest has no partTargetDuration defaulting to ${partTargetDuration}`\n });\n log.error('LL-HLS manifest has parts but lacks required #EXT-X-PART-INF:PART-TARGET value. See https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-09#section-4.4.3.7. Playback is not guaranteed.');\n }\n manifest.partTargetDuration = partTargetDuration;\n }\n return manifest;\n};\n/**\n * Loops through all supported media groups in main and calls the provided\n * callback for each group\n *\n * @param {Object} main\n * The parsed main manifest object\n * @param {Function} callback\n * Callback to call for each media group\n */\n\nconst forEachMediaGroup = (main, callback) => {\n if (!main.mediaGroups) {\n return;\n }\n ['AUDIO', 'SUBTITLES'].forEach(mediaType => {\n if (!main.mediaGroups[mediaType]) {\n return;\n }\n for (const groupKey in main.mediaGroups[mediaType]) {\n for (const labelKey in main.mediaGroups[mediaType][groupKey]) {\n const mediaProperties = main.mediaGroups[mediaType][groupKey][labelKey];\n callback(mediaProperties, mediaType, groupKey, labelKey);\n }\n }\n });\n};\n/**\n * Adds properties and attributes to the playlist to keep consistent functionality for\n * playlists throughout VHS.\n *\n * @param {Object} config\n * Arguments object\n * @param {Object} config.playlist\n * The media playlist\n * @param {string} [config.uri]\n * The uri to the media playlist (if media playlist is not from within a main\n * playlist)\n * @param {string} id\n * ID to use for the playlist\n */\n\nconst setupMediaPlaylist = ({\n playlist,\n uri,\n id\n}) => {\n playlist.id = id;\n playlist.playlistErrors_ = 0;\n if (uri) {\n // For media playlists, m3u8-parser does not have access to a URI, as HLS media\n // playlists do not contain their own source URI, but one is needed for consistency in\n // VHS.\n playlist.uri = uri;\n } // For HLS main playlists, even though certain attributes MUST be defined, the\n // stream may still be played without them.\n // For HLS media playlists, m3u8-parser does not attach an attributes object to the\n // manifest.\n //\n // To avoid undefined reference errors through the project, and make the code easier\n // to write/read, add an empty attributes object for these cases.\n\n playlist.attributes = playlist.attributes || {};\n};\n/**\n * Adds ID, resolvedUri, and attributes properties to each playlist of the main, where\n * necessary. In addition, creates playlist IDs for each playlist and adds playlist ID to\n * playlist references to the playlists array.\n *\n * @param {Object} main\n * The main playlist\n */\n\nconst setupMediaPlaylists = main => {\n let i = main.playlists.length;\n while (i--) {\n const playlist = main.playlists[i];\n setupMediaPlaylist({\n playlist,\n id: createPlaylistID(i, playlist.uri)\n });\n playlist.resolvedUri = resolveUrl(main.uri, playlist.uri);\n main.playlists[playlist.id] = playlist; // URI reference added for backwards compatibility\n\n main.playlists[playlist.uri] = playlist; // Although the spec states an #EXT-X-STREAM-INF tag MUST have a BANDWIDTH attribute,\n // the stream can be played without it. Although an attributes property may have been\n // added to the playlist to prevent undefined references, issue a warning to fix the\n // manifest.\n\n if (!playlist.attributes.BANDWIDTH) {\n log.warn('Invalid playlist STREAM-INF detected. Missing BANDWIDTH attribute.');\n }\n }\n};\n/**\n * Adds resolvedUri properties to each media group.\n *\n * @param {Object} main\n * The main playlist\n */\n\nconst resolveMediaGroupUris = main => {\n forEachMediaGroup(main, properties => {\n if (properties.uri) {\n properties.resolvedUri = resolveUrl(main.uri, properties.uri);\n }\n });\n};\n/**\n * Creates a main playlist wrapper to insert a sole media playlist into.\n *\n * @param {Object} media\n * Media playlist\n * @param {string} uri\n * The media URI\n *\n * @return {Object}\n * main playlist\n */\n\nconst mainForMedia = (media, uri) => {\n const id = createPlaylistID(0, uri);\n const main = {\n mediaGroups: {\n 'AUDIO': {},\n 'VIDEO': {},\n 'CLOSED-CAPTIONS': {},\n 'SUBTITLES': {}\n },\n uri: window$1.location.href,\n resolvedUri: window$1.location.href,\n playlists: [{\n uri,\n id,\n resolvedUri: uri,\n // m3u8-parser does not attach an attributes property to media playlists so make\n // sure that the property is attached to avoid undefined reference errors\n attributes: {}\n }]\n }; // set up ID reference\n\n main.playlists[id] = main.playlists[0]; // URI reference added for backwards compatibility\n\n main.playlists[uri] = main.playlists[0];\n return main;\n};\n/**\n * Does an in-place update of the main manifest to add updated playlist URI references\n * as well as other properties needed by VHS that aren't included by the parser.\n *\n * @param {Object} main\n * main manifest object\n * @param {string} uri\n * The source URI\n * @param {function} createGroupID\n * A function to determine how to create the groupID for mediaGroups\n */\n\nconst addPropertiesToMain = (main, uri, createGroupID = groupID) => {\n main.uri = uri;\n for (let i = 0; i < main.playlists.length; i++) {\n if (!main.playlists[i].uri) {\n // Set up phony URIs for the playlists since playlists are referenced by their URIs\n // throughout VHS, but some formats (e.g., DASH) don't have external URIs\n // TODO: consider adding dummy URIs in mpd-parser\n const phonyUri = `placeholder-uri-${i}`;\n main.playlists[i].uri = phonyUri;\n }\n }\n const audioOnlyMain = isAudioOnly(main);\n forEachMediaGroup(main, (properties, mediaType, groupKey, labelKey) => {\n // add a playlist array under properties\n if (!properties.playlists || !properties.playlists.length) {\n // If the manifest is audio only and this media group does not have a uri, check\n // if the media group is located in the main list of playlists. If it is, don't add\n // placeholder properties as it shouldn't be considered an alternate audio track.\n if (audioOnlyMain && mediaType === 'AUDIO' && !properties.uri) {\n for (let i = 0; i < main.playlists.length; i++) {\n const p = main.playlists[i];\n if (p.attributes && p.attributes.AUDIO && p.attributes.AUDIO === groupKey) {\n return;\n }\n }\n }\n properties.playlists = [_extends({}, properties)];\n }\n properties.playlists.forEach(function (p, i) {\n const groupId = createGroupID(mediaType, groupKey, labelKey, p);\n const id = createPlaylistID(i, groupId);\n if (p.uri) {\n p.resolvedUri = p.resolvedUri || resolveUrl(main.uri, p.uri);\n } else {\n // DEPRECATED, this has been added to prevent a breaking change.\n // previously we only ever had a single media group playlist, so\n // we mark the first playlist uri without prepending the index as we used to\n // ideally we would do all of the playlists the same way.\n p.uri = i === 0 ? groupId : id; // don't resolve a placeholder uri to an absolute url, just use\n // the placeholder again\n\n p.resolvedUri = p.uri;\n }\n p.id = p.id || id; // add an empty attributes object, all playlists are\n // expected to have this.\n\n p.attributes = p.attributes || {}; // setup ID and URI references (URI for backwards compatibility)\n\n main.playlists[p.id] = p;\n main.playlists[p.uri] = p;\n });\n });\n setupMediaPlaylists(main);\n resolveMediaGroupUris(main);\n};\nclass DateRangesStorage {\n constructor() {\n this.offset_ = null;\n this.pendingDateRanges_ = new Map();\n this.processedDateRanges_ = new Map();\n }\n setOffset(segments = []) {\n // already set\n if (this.offset_ !== null) {\n return;\n } // no segment to process\n\n if (!segments.length) {\n return;\n }\n const [firstSegment] = segments; // no program date time\n\n if (firstSegment.programDateTime === undefined) {\n return;\n } // Set offset as ProgramDateTime for the very first segment of the very first playlist load:\n\n this.offset_ = firstSegment.programDateTime / 1000;\n }\n setPendingDateRanges(dateRanges = []) {\n if (!dateRanges.length) {\n return;\n }\n const [dateRange] = dateRanges;\n const startTime = dateRange.startDate.getTime();\n this.trimProcessedDateRanges_(startTime);\n this.pendingDateRanges_ = dateRanges.reduce((map, pendingDateRange) => {\n map.set(pendingDateRange.id, pendingDateRange);\n return map;\n }, new Map());\n }\n processDateRange(dateRange) {\n this.pendingDateRanges_.delete(dateRange.id);\n this.processedDateRanges_.set(dateRange.id, dateRange);\n }\n getDateRangesToProcess() {\n if (this.offset_ === null) {\n return [];\n }\n const dateRangeClasses = {};\n const dateRangesToProcess = [];\n this.pendingDateRanges_.forEach((dateRange, id) => {\n if (this.processedDateRanges_.has(id)) {\n return;\n }\n dateRange.startTime = dateRange.startDate.getTime() / 1000 - this.offset_;\n dateRange.processDateRange = () => this.processDateRange(dateRange);\n dateRangesToProcess.push(dateRange);\n if (!dateRange.class) {\n return;\n }\n if (dateRangeClasses[dateRange.class]) {\n const length = dateRangeClasses[dateRange.class].push(dateRange);\n dateRange.classListIndex = length - 1;\n } else {\n dateRangeClasses[dateRange.class] = [dateRange];\n dateRange.classListIndex = 0;\n }\n });\n for (const dateRange of dateRangesToProcess) {\n const classList = dateRangeClasses[dateRange.class] || [];\n if (dateRange.endDate) {\n dateRange.endTime = dateRange.endDate.getTime() / 1000 - this.offset_;\n } else if (dateRange.endOnNext && classList[dateRange.classListIndex + 1]) {\n dateRange.endTime = classList[dateRange.classListIndex + 1].startTime;\n } else if (dateRange.duration) {\n dateRange.endTime = dateRange.startTime + dateRange.duration;\n } else if (dateRange.plannedDuration) {\n dateRange.endTime = dateRange.startTime + dateRange.plannedDuration;\n } else {\n dateRange.endTime = dateRange.startTime;\n }\n }\n return dateRangesToProcess;\n }\n trimProcessedDateRanges_(startTime) {\n const copy = new Map(this.processedDateRanges_);\n copy.forEach((dateRange, id) => {\n if (dateRange.startDate.getTime() < startTime) {\n this.processedDateRanges_.delete(id);\n }\n });\n }\n}\nconst QUOTA_EXCEEDED_ERR = 22;\nconst getStreamingNetworkErrorMetadata = ({\n requestType,\n request,\n error,\n parseFailure\n}) => {\n const isBadStatus = request.status < 200 || request.status > 299;\n const isFailure = request.status >= 400 && request.status <= 499;\n const errorMetadata = {\n uri: request.uri,\n requestType\n };\n const isBadStatusOrParseFailure = isBadStatus && !isFailure || parseFailure;\n if (error && isFailure) {\n // copy original error and add to the metadata.\n errorMetadata.error = _extends({}, error);\n errorMetadata.errorType = videojs.Error.NetworkRequestFailed;\n } else if (request.aborted) {\n errorMetadata.errorType = videojs.Error.NetworkRequestAborted;\n } else if (request.timedout) {\n errorMetadata.erroType = videojs.Error.NetworkRequestTimeout;\n } else if (isBadStatusOrParseFailure) {\n const errorType = parseFailure ? videojs.Error.NetworkBodyParserFailed : videojs.Error.NetworkBadStatus;\n errorMetadata.errorType = errorType;\n errorMetadata.status = request.status;\n errorMetadata.headers = request.headers;\n }\n return errorMetadata;\n};\nconst {\n EventTarget: EventTarget$1\n} = videojs;\nconst addLLHLSQueryDirectives = (uri, media) => {\n if (media.endList || !media.serverControl) {\n return uri;\n }\n const parameters = {};\n if (media.serverControl.canBlockReload) {\n const {\n preloadSegment\n } = media; // next msn is a zero based value, length is not.\n\n let nextMSN = media.mediaSequence + media.segments.length; // If preload segment has parts then it is likely\n // that we are going to request a part of that preload segment.\n // the logic below is used to determine that.\n\n if (preloadSegment) {\n const parts = preloadSegment.parts || []; // _HLS_part is a zero based index\n\n const nextPart = getKnownPartCount(media) - 1; // if nextPart is > -1 and not equal to just the\n // length of parts, then we know we had part preload hints\n // and we need to add the _HLS_part= query\n\n if (nextPart > -1 && nextPart !== parts.length - 1) {\n // add existing parts to our preload hints\n // eslint-disable-next-line\n parameters._HLS_part = nextPart;\n } // this if statement makes sure that we request the msn\n // of the preload segment if:\n // 1. the preload segment had parts (and was not yet a full segment)\n // but was added to our segments array\n // 2. the preload segment had preload hints for parts that are not in\n // the manifest yet.\n // in all other cases we want the segment after the preload segment\n // which will be given by using media.segments.length because it is 1 based\n // rather than 0 based.\n\n if (nextPart > -1 || parts.length) {\n nextMSN--;\n }\n } // add _HLS_msn= in front of any _HLS_part query\n // eslint-disable-next-line\n\n parameters._HLS_msn = nextMSN;\n }\n if (media.serverControl && media.serverControl.canSkipUntil) {\n // add _HLS_skip= infront of all other queries.\n // eslint-disable-next-line\n parameters._HLS_skip = media.serverControl.canSkipDateranges ? 'v2' : 'YES';\n }\n if (Object.keys(parameters).length) {\n const parsedUri = new window$1.URL(uri);\n ['_HLS_skip', '_HLS_msn', '_HLS_part'].forEach(function (name) {\n if (!parameters.hasOwnProperty(name)) {\n return;\n }\n parsedUri.searchParams.set(name, parameters[name]);\n });\n uri = parsedUri.toString();\n }\n return uri;\n};\n/**\n * Returns a new segment object with properties and\n * the parts array merged.\n *\n * @param {Object} a the old segment\n * @param {Object} b the new segment\n *\n * @return {Object} the merged segment\n */\n\nconst updateSegment = (a, b) => {\n if (!a) {\n return b;\n }\n const result = merge(a, b); // if only the old segment has preload hints\n // and the new one does not, remove preload hints.\n\n if (a.preloadHints && !b.preloadHints) {\n delete result.preloadHints;\n } // if only the old segment has parts\n // then the parts are no longer valid\n\n if (a.parts && !b.parts) {\n delete result.parts; // if both segments have parts\n // copy part propeties from the old segment\n // to the new one.\n } else if (a.parts && b.parts) {\n for (let i = 0; i < b.parts.length; i++) {\n if (a.parts && a.parts[i]) {\n result.parts[i] = merge(a.parts[i], b.parts[i]);\n }\n }\n } // set skipped to false for segments that have\n // have had information merged from the old segment.\n\n if (!a.skipped && b.skipped) {\n result.skipped = false;\n } // set preload to false for segments that have\n // had information added in the new segment.\n\n if (a.preload && !b.preload) {\n result.preload = false;\n }\n return result;\n};\n/**\n * Returns a new array of segments that is the result of merging\n * properties from an older list of segments onto an updated\n * list. No properties on the updated playlist will be ovewritten.\n *\n * @param {Array} original the outdated list of segments\n * @param {Array} update the updated list of segments\n * @param {number=} offset the index of the first update\n * segment in the original segment list. For non-live playlists,\n * this should always be zero and does not need to be\n * specified. For live playlists, it should be the difference\n * between the media sequence numbers in the original and updated\n * playlists.\n * @return {Array} a list of merged segment objects\n */\n\nconst updateSegments = (original, update, offset) => {\n const oldSegments = original.slice();\n const newSegments = update.slice();\n offset = offset || 0;\n const result = [];\n let currentMap;\n for (let newIndex = 0; newIndex < newSegments.length; newIndex++) {\n const oldSegment = oldSegments[newIndex + offset];\n const newSegment = newSegments[newIndex];\n if (oldSegment) {\n currentMap = oldSegment.map || currentMap;\n result.push(updateSegment(oldSegment, newSegment));\n } else {\n // carry over map to new segment if it is missing\n if (currentMap && !newSegment.map) {\n newSegment.map = currentMap;\n }\n result.push(newSegment);\n }\n }\n return result;\n};\nconst resolveSegmentUris = (segment, baseUri) => {\n // preloadSegment will not have a uri at all\n // as the segment isn't actually in the manifest yet, only parts\n if (!segment.resolvedUri && segment.uri) {\n segment.resolvedUri = resolveUrl(baseUri, segment.uri);\n }\n if (segment.key && !segment.key.resolvedUri) {\n segment.key.resolvedUri = resolveUrl(baseUri, segment.key.uri);\n }\n if (segment.map && !segment.map.resolvedUri) {\n segment.map.resolvedUri = resolveUrl(baseUri, segment.map.uri);\n }\n if (segment.map && segment.map.key && !segment.map.key.resolvedUri) {\n segment.map.key.resolvedUri = resolveUrl(baseUri, segment.map.key.uri);\n }\n if (segment.parts && segment.parts.length) {\n segment.parts.forEach(p => {\n if (p.resolvedUri) {\n return;\n }\n p.resolvedUri = resolveUrl(baseUri, p.uri);\n });\n }\n if (segment.preloadHints && segment.preloadHints.length) {\n segment.preloadHints.forEach(p => {\n if (p.resolvedUri) {\n return;\n }\n p.resolvedUri = resolveUrl(baseUri, p.uri);\n });\n }\n};\nconst getAllSegments = function (media) {\n const segments = media.segments || [];\n const preloadSegment = media.preloadSegment; // a preloadSegment with only preloadHints is not currently\n // a usable segment, only include a preloadSegment that has\n // parts.\n\n if (preloadSegment && preloadSegment.parts && preloadSegment.parts.length) {\n // if preloadHints has a MAP that means that the\n // init segment is going to change. We cannot use any of the parts\n // from this preload segment.\n if (preloadSegment.preloadHints) {\n for (let i = 0; i < preloadSegment.preloadHints.length; i++) {\n if (preloadSegment.preloadHints[i].type === 'MAP') {\n return segments;\n }\n }\n } // set the duration for our preload segment to target duration.\n\n preloadSegment.duration = media.targetDuration;\n preloadSegment.preload = true;\n segments.push(preloadSegment);\n }\n return segments;\n}; // consider the playlist unchanged if the playlist object is the same or\n// the number of segments is equal, the media sequence number is unchanged,\n// and this playlist hasn't become the end of the playlist\n\nconst isPlaylistUnchanged = (a, b) => a === b || a.segments && b.segments && a.segments.length === b.segments.length && a.endList === b.endList && a.mediaSequence === b.mediaSequence && a.preloadSegment === b.preloadSegment;\n/**\n * Returns a new main playlist that is the result of merging an\n * updated media playlist into the original version. If the\n * updated media playlist does not match any of the playlist\n * entries in the original main playlist, null is returned.\n *\n * @param {Object} main a parsed main M3U8 object\n * @param {Object} media a parsed media M3U8 object\n * @return {Object} a new object that represents the original\n * main playlist with the updated media playlist merged in, or\n * null if the merge produced no change.\n */\n\nconst updateMain$1 = (main, newMedia, unchangedCheck = isPlaylistUnchanged) => {\n const result = merge(main, {});\n const oldMedia = result.playlists[newMedia.id];\n if (!oldMedia) {\n return null;\n }\n if (unchangedCheck(oldMedia, newMedia)) {\n return null;\n }\n newMedia.segments = getAllSegments(newMedia);\n const mergedPlaylist = merge(oldMedia, newMedia); // always use the new media's preload segment\n\n if (mergedPlaylist.preloadSegment && !newMedia.preloadSegment) {\n delete mergedPlaylist.preloadSegment;\n } // if the update could overlap existing segment information, merge the two segment lists\n\n if (oldMedia.segments) {\n if (newMedia.skip) {\n newMedia.segments = newMedia.segments || []; // add back in objects for skipped segments, so that we merge\n // old properties into the new segments\n\n for (let i = 0; i < newMedia.skip.skippedSegments; i++) {\n newMedia.segments.unshift({\n skipped: true\n });\n }\n }\n mergedPlaylist.segments = updateSegments(oldMedia.segments, newMedia.segments, newMedia.mediaSequence - oldMedia.mediaSequence);\n } // resolve any segment URIs to prevent us from having to do it later\n\n mergedPlaylist.segments.forEach(segment => {\n resolveSegmentUris(segment, mergedPlaylist.resolvedUri);\n }); // TODO Right now in the playlists array there are two references to each playlist, one\n // that is referenced by index, and one by URI. The index reference may no longer be\n // necessary.\n\n for (let i = 0; i < result.playlists.length; i++) {\n if (result.playlists[i].id === newMedia.id) {\n result.playlists[i] = mergedPlaylist;\n }\n }\n result.playlists[newMedia.id] = mergedPlaylist; // URI reference added for backwards compatibility\n\n result.playlists[newMedia.uri] = mergedPlaylist; // update media group playlist references.\n\n forEachMediaGroup(main, (properties, mediaType, groupKey, labelKey) => {\n if (!properties.playlists) {\n return;\n }\n for (let i = 0; i < properties.playlists.length; i++) {\n if (newMedia.id === properties.playlists[i].id) {\n properties.playlists[i] = mergedPlaylist;\n }\n }\n });\n return result;\n};\n/**\n * Calculates the time to wait before refreshing a live playlist\n *\n * @param {Object} media\n * The current media\n * @param {boolean} update\n * True if there were any updates from the last refresh, false otherwise\n * @return {number}\n * The time in ms to wait before refreshing the live playlist\n */\n\nconst refreshDelay = (media, update) => {\n const segments = media.segments || [];\n const lastSegment = segments[segments.length - 1];\n const lastPart = lastSegment && lastSegment.parts && lastSegment.parts[lastSegment.parts.length - 1];\n const lastDuration = lastPart && lastPart.duration || lastSegment && lastSegment.duration;\n if (update && lastDuration) {\n return lastDuration * 1000;\n } // if the playlist is unchanged since the last reload or last segment duration\n // cannot be determined, try again after half the target duration\n\n return (media.partTargetDuration || media.targetDuration || 10) * 500;\n};\nconst playlistMetadataPayload = (playlists, type, isLive) => {\n if (!playlists) {\n return;\n }\n const renditions = [];\n playlists.forEach(playlist => {\n // we need attributes to populate rendition data.\n if (!playlist.attributes) {\n return;\n }\n const {\n BANDWIDTH,\n RESOLUTION,\n CODECS\n } = playlist.attributes;\n renditions.push({\n id: playlist.id,\n bandwidth: BANDWIDTH,\n resolution: RESOLUTION,\n codecs: CODECS\n });\n });\n return {\n type,\n isLive,\n renditions\n };\n};\n/**\n * Load a playlist from a remote location\n *\n * @class PlaylistLoader\n * @extends Stream\n * @param {string|Object} src url or object of manifest\n * @param {boolean} withCredentials the withCredentials xhr option\n * @class\n */\n\nclass PlaylistLoader extends EventTarget$1 {\n constructor(src, vhs, options = {}) {\n super();\n if (!src) {\n throw new Error('A non-empty playlist URL or object is required');\n }\n this.logger_ = logger('PlaylistLoader');\n const {\n withCredentials = false\n } = options;\n this.src = src;\n this.vhs_ = vhs;\n this.withCredentials = withCredentials;\n this.addDateRangesToTextTrack_ = options.addDateRangesToTextTrack;\n const vhsOptions = vhs.options_;\n this.customTagParsers = vhsOptions && vhsOptions.customTagParsers || [];\n this.customTagMappers = vhsOptions && vhsOptions.customTagMappers || [];\n this.llhls = vhsOptions && vhsOptions.llhls;\n this.dateRangesStorage_ = new DateRangesStorage(); // initialize the loader state\n\n this.state = 'HAVE_NOTHING'; // live playlist staleness timeout\n\n this.handleMediaupdatetimeout_ = this.handleMediaupdatetimeout_.bind(this);\n this.on('mediaupdatetimeout', this.handleMediaupdatetimeout_);\n this.on('loadedplaylist', this.handleLoadedPlaylist_.bind(this));\n }\n handleLoadedPlaylist_() {\n const mediaPlaylist = this.media();\n if (!mediaPlaylist) {\n return;\n }\n this.dateRangesStorage_.setOffset(mediaPlaylist.segments);\n this.dateRangesStorage_.setPendingDateRanges(mediaPlaylist.dateRanges);\n const availableDateRanges = this.dateRangesStorage_.getDateRangesToProcess();\n if (!availableDateRanges.length || !this.addDateRangesToTextTrack_) {\n return;\n }\n this.addDateRangesToTextTrack_(availableDateRanges);\n }\n handleMediaupdatetimeout_() {\n if (this.state !== 'HAVE_METADATA') {\n // only refresh the media playlist if no other activity is going on\n return;\n }\n const media = this.media();\n let uri = resolveUrl(this.main.uri, media.uri);\n if (this.llhls) {\n uri = addLLHLSQueryDirectives(uri, media);\n }\n this.state = 'HAVE_CURRENT_METADATA';\n this.request = this.vhs_.xhr({\n uri,\n withCredentials: this.withCredentials,\n requestType: 'hls-playlist'\n }, (error, req) => {\n // disposed\n if (!this.request) {\n return;\n }\n if (error) {\n return this.playlistRequestError(this.request, this.media(), 'HAVE_METADATA');\n }\n this.haveMetadata({\n playlistString: this.request.responseText,\n url: this.media().uri,\n id: this.media().id\n });\n });\n }\n playlistRequestError(xhr, playlist, startingState) {\n const {\n uri,\n id\n } = playlist; // any in-flight request is now finished\n\n this.request = null;\n if (startingState) {\n this.state = startingState;\n }\n this.error = {\n playlist: this.main.playlists[id],\n status: xhr.status,\n message: `HLS playlist request error at URL: ${uri}.`,\n responseText: xhr.responseText,\n code: xhr.status >= 500 ? 4 : 2,\n metadata: getStreamingNetworkErrorMetadata({\n requestType: xhr.requestType,\n request: xhr,\n error: xhr.error\n })\n };\n this.trigger('error');\n }\n parseManifest_({\n url,\n manifestString\n }) {\n try {\n return parseManifest({\n onwarn: ({\n message\n }) => this.logger_(`m3u8-parser warn for ${url}: ${message}`),\n oninfo: ({\n message\n }) => this.logger_(`m3u8-parser info for ${url}: ${message}`),\n manifestString,\n customTagParsers: this.customTagParsers,\n customTagMappers: this.customTagMappers,\n llhls: this.llhls\n });\n } catch (error) {\n this.error = error;\n this.error.metadata = {\n errorType: videojs.Error.StreamingHlsPlaylistParserError,\n error\n };\n }\n }\n /**\n * Update the playlist loader's state in response to a new or updated playlist.\n *\n * @param {string} [playlistString]\n * Playlist string (if playlistObject is not provided)\n * @param {Object} [playlistObject]\n * Playlist object (if playlistString is not provided)\n * @param {string} url\n * URL of playlist\n * @param {string} id\n * ID to use for playlist\n */\n\n haveMetadata({\n playlistString,\n playlistObject,\n url,\n id\n }) {\n // any in-flight request is now finished\n this.request = null;\n this.state = 'HAVE_METADATA';\n const metadata = {\n playlistInfo: {\n type: 'media',\n uri: url\n }\n };\n this.trigger({\n type: 'playlistparsestart',\n metadata\n });\n const playlist = playlistObject || this.parseManifest_({\n url,\n manifestString: playlistString\n });\n playlist.lastRequest = Date.now();\n setupMediaPlaylist({\n playlist,\n uri: url,\n id\n }); // merge this playlist into the main manifest\n\n const update = updateMain$1(this.main, playlist);\n this.targetDuration = playlist.partTargetDuration || playlist.targetDuration;\n this.pendingMedia_ = null;\n if (update) {\n this.main = update;\n this.media_ = this.main.playlists[id];\n } else {\n this.trigger('playlistunchanged');\n }\n this.updateMediaUpdateTimeout_(refreshDelay(this.media(), !!update));\n metadata.parsedPlaylist = playlistMetadataPayload(this.main.playlists, metadata.playlistInfo.type, !this.media_.endList);\n this.trigger({\n type: 'playlistparsecomplete',\n metadata\n });\n this.trigger('loadedplaylist');\n }\n /**\n * Abort any outstanding work and clean up.\n */\n\n dispose() {\n this.trigger('dispose');\n this.stopRequest();\n window$1.clearTimeout(this.mediaUpdateTimeout);\n window$1.clearTimeout(this.finalRenditionTimeout);\n this.dateRangesStorage_ = new DateRangesStorage();\n this.off();\n }\n stopRequest() {\n if (this.request) {\n const oldRequest = this.request;\n this.request = null;\n oldRequest.onreadystatechange = null;\n oldRequest.abort();\n }\n }\n /**\n * When called without any arguments, returns the currently\n * active media playlist. When called with a single argument,\n * triggers the playlist loader to asynchronously switch to the\n * specified media playlist. Calling this method while the\n * loader is in the HAVE_NOTHING causes an error to be emitted\n * but otherwise has no effect.\n *\n * @param {Object=} playlist the parsed media playlist\n * object to switch to\n * @param {boolean=} shouldDelay whether we should delay the request by half target duration\n *\n * @return {Playlist} the current loaded media\n */\n\n media(playlist, shouldDelay) {\n // getter\n if (!playlist) {\n return this.media_;\n } // setter\n\n if (this.state === 'HAVE_NOTHING') {\n throw new Error('Cannot switch media playlist from ' + this.state);\n } // find the playlist object if the target playlist has been\n // specified by URI\n\n if (typeof playlist === 'string') {\n if (!this.main.playlists[playlist]) {\n throw new Error('Unknown playlist URI: ' + playlist);\n }\n playlist = this.main.playlists[playlist];\n }\n window$1.clearTimeout(this.finalRenditionTimeout);\n if (shouldDelay) {\n const delay = (playlist.partTargetDuration || playlist.targetDuration) / 2 * 1000 || 5 * 1000;\n this.finalRenditionTimeout = window$1.setTimeout(this.media.bind(this, playlist, false), delay);\n return;\n }\n const startingState = this.state;\n const mediaChange = !this.media_ || playlist.id !== this.media_.id;\n const mainPlaylistRef = this.main.playlists[playlist.id]; // switch to fully loaded playlists immediately\n\n if (mainPlaylistRef && mainPlaylistRef.endList ||\n // handle the case of a playlist object (e.g., if using vhs-json with a resolved\n // media playlist or, for the case of demuxed audio, a resolved audio media group)\n playlist.endList && playlist.segments.length) {\n // abort outstanding playlist requests\n if (this.request) {\n this.request.onreadystatechange = null;\n this.request.abort();\n this.request = null;\n }\n this.state = 'HAVE_METADATA';\n this.media_ = playlist; // trigger media change if the active media has been updated\n\n if (mediaChange) {\n this.trigger('mediachanging');\n if (startingState === 'HAVE_MAIN_MANIFEST') {\n // The initial playlist was a main manifest, and the first media selected was\n // also provided (in the form of a resolved playlist object) as part of the\n // source object (rather than just a URL). Therefore, since the media playlist\n // doesn't need to be requested, loadedmetadata won't trigger as part of the\n // normal flow, and needs an explicit trigger here.\n this.trigger('loadedmetadata');\n } else {\n this.trigger('mediachange');\n }\n }\n return;\n } // We update/set the timeout here so that live playlists\n // that are not a media change will \"start\" the loader as expected.\n // We expect that this function will start the media update timeout\n // cycle again. This also prevents a playlist switch failure from\n // causing us to stall during live.\n\n this.updateMediaUpdateTimeout_(refreshDelay(playlist, true)); // switching to the active playlist is a no-op\n\n if (!mediaChange) {\n return;\n }\n this.state = 'SWITCHING_MEDIA'; // there is already an outstanding playlist request\n\n if (this.request) {\n if (playlist.resolvedUri === this.request.url) {\n // requesting to switch to the same playlist multiple times\n // has no effect after the first\n return;\n }\n this.request.onreadystatechange = null;\n this.request.abort();\n this.request = null;\n } // request the new playlist\n\n if (this.media_) {\n this.trigger('mediachanging');\n }\n this.pendingMedia_ = playlist;\n const metadata = {\n playlistInfo: {\n type: 'media',\n uri: playlist.uri\n }\n };\n this.trigger({\n type: 'playlistrequeststart',\n metadata\n });\n this.request = this.vhs_.xhr({\n uri: playlist.resolvedUri,\n withCredentials: this.withCredentials,\n requestType: 'hls-playlist'\n }, (error, req) => {\n // disposed\n if (!this.request) {\n return;\n }\n playlist.lastRequest = Date.now();\n playlist.resolvedUri = resolveManifestRedirect(playlist.resolvedUri, req);\n if (error) {\n return this.playlistRequestError(this.request, playlist, startingState);\n }\n this.trigger({\n type: 'playlistrequestcomplete',\n metadata\n });\n this.haveMetadata({\n playlistString: req.responseText,\n url: playlist.uri,\n id: playlist.id\n }); // fire loadedmetadata the first time a media playlist is loaded\n\n if (startingState === 'HAVE_MAIN_MANIFEST') {\n this.trigger('loadedmetadata');\n } else {\n this.trigger('mediachange');\n }\n });\n }\n /**\n * pause loading of the playlist\n */\n\n pause() {\n if (this.mediaUpdateTimeout) {\n window$1.clearTimeout(this.mediaUpdateTimeout);\n this.mediaUpdateTimeout = null;\n }\n this.stopRequest();\n if (this.state === 'HAVE_NOTHING') {\n // If we pause the loader before any data has been retrieved, its as if we never\n // started, so reset to an unstarted state.\n this.started = false;\n } // Need to restore state now that no activity is happening\n\n if (this.state === 'SWITCHING_MEDIA') {\n // if the loader was in the process of switching media, it should either return to\n // HAVE_MAIN_MANIFEST or HAVE_METADATA depending on if the loader has loaded a media\n // playlist yet. This is determined by the existence of loader.media_\n if (this.media_) {\n this.state = 'HAVE_METADATA';\n } else {\n this.state = 'HAVE_MAIN_MANIFEST';\n }\n } else if (this.state === 'HAVE_CURRENT_METADATA') {\n this.state = 'HAVE_METADATA';\n }\n }\n /**\n * start loading of the playlist\n */\n\n load(shouldDelay) {\n if (this.mediaUpdateTimeout) {\n window$1.clearTimeout(this.mediaUpdateTimeout);\n this.mediaUpdateTimeout = null;\n }\n const media = this.media();\n if (shouldDelay) {\n const delay = media ? (media.partTargetDuration || media.targetDuration) / 2 * 1000 : 5 * 1000;\n this.mediaUpdateTimeout = window$1.setTimeout(() => {\n this.mediaUpdateTimeout = null;\n this.load();\n }, delay);\n return;\n }\n if (!this.started) {\n this.start();\n return;\n }\n if (media && !media.endList) {\n this.trigger('mediaupdatetimeout');\n } else {\n this.trigger('loadedplaylist');\n }\n }\n updateMediaUpdateTimeout_(delay) {\n if (this.mediaUpdateTimeout) {\n window$1.clearTimeout(this.mediaUpdateTimeout);\n this.mediaUpdateTimeout = null;\n } // we only have use mediaupdatetimeout for live playlists.\n\n if (!this.media() || this.media().endList) {\n return;\n }\n this.mediaUpdateTimeout = window$1.setTimeout(() => {\n this.mediaUpdateTimeout = null;\n this.trigger('mediaupdatetimeout');\n this.updateMediaUpdateTimeout_(delay);\n }, delay);\n }\n /**\n * start loading of the playlist\n */\n\n start() {\n this.started = true;\n if (typeof this.src === 'object') {\n // in the case of an entirely constructed manifest object (meaning there's no actual\n // manifest on a server), default the uri to the page's href\n if (!this.src.uri) {\n this.src.uri = window$1.location.href;\n } // resolvedUri is added on internally after the initial request. Since there's no\n // request for pre-resolved manifests, add on resolvedUri here.\n\n this.src.resolvedUri = this.src.uri; // Since a manifest object was passed in as the source (instead of a URL), the first\n // request can be skipped (since the top level of the manifest, at a minimum, is\n // already available as a parsed manifest object). However, if the manifest object\n // represents a main playlist, some media playlists may need to be resolved before\n // the starting segment list is available. Therefore, go directly to setup of the\n // initial playlist, and let the normal flow continue from there.\n //\n // Note that the call to setup is asynchronous, as other sections of VHS may assume\n // that the first request is asynchronous.\n\n setTimeout(() => {\n this.setupInitialPlaylist(this.src);\n }, 0);\n return;\n }\n const metadata = {\n playlistInfo: {\n type: 'multivariant',\n uri: this.src\n }\n };\n this.trigger({\n type: 'playlistrequeststart',\n metadata\n }); // request the specified URL\n\n this.request = this.vhs_.xhr({\n uri: this.src,\n withCredentials: this.withCredentials,\n requestType: 'hls-playlist'\n }, (error, req) => {\n // disposed\n if (!this.request) {\n return;\n } // clear the loader's request reference\n\n this.request = null;\n if (error) {\n this.error = {\n status: req.status,\n message: `HLS playlist request error at URL: ${this.src}.`,\n responseText: req.responseText,\n // MEDIA_ERR_NETWORK\n code: 2,\n metadata: getStreamingNetworkErrorMetadata({\n requestType: req.requestType,\n request: req,\n error\n })\n };\n if (this.state === 'HAVE_NOTHING') {\n this.started = false;\n }\n return this.trigger('error');\n }\n this.trigger({\n type: 'playlistrequestcomplete',\n metadata\n });\n this.src = resolveManifestRedirect(this.src, req);\n this.trigger({\n type: 'playlistparsestart',\n metadata\n });\n const manifest = this.parseManifest_({\n manifestString: req.responseText,\n url: this.src\n }); // we haven't loaded any variant playlists here so we default to false for isLive.\n\n metadata.parsedPlaylist = playlistMetadataPayload(manifest.playlists, metadata.playlistInfo.type, false);\n this.trigger({\n type: 'playlistparsecomplete',\n metadata\n });\n this.setupInitialPlaylist(manifest);\n });\n }\n srcUri() {\n return typeof this.src === 'string' ? this.src : this.src.uri;\n }\n /**\n * Given a manifest object that's either a main or media playlist, trigger the proper\n * events and set the state of the playlist loader.\n *\n * If the manifest object represents a main playlist, `loadedplaylist` will be\n * triggered to allow listeners to select a playlist. If none is selected, the loader\n * will default to the first one in the playlists array.\n *\n * If the manifest object represents a media playlist, `loadedplaylist` will be\n * triggered followed by `loadedmetadata`, as the only available playlist is loaded.\n *\n * In the case of a media playlist, a main playlist object wrapper with one playlist\n * will be created so that all logic can handle playlists in the same fashion (as an\n * assumed manifest object schema).\n *\n * @param {Object} manifest\n * The parsed manifest object\n */\n\n setupInitialPlaylist(manifest) {\n this.state = 'HAVE_MAIN_MANIFEST';\n if (manifest.playlists) {\n this.main = manifest;\n addPropertiesToMain(this.main, this.srcUri()); // If the initial main playlist has playlists wtih segments already resolved,\n // then resolve URIs in advance, as they are usually done after a playlist request,\n // which may not happen if the playlist is resolved.\n\n manifest.playlists.forEach(playlist => {\n playlist.segments = getAllSegments(playlist);\n playlist.segments.forEach(segment => {\n resolveSegmentUris(segment, playlist.resolvedUri);\n });\n });\n this.trigger('loadedplaylist');\n if (!this.request) {\n // no media playlist was specifically selected so start\n // from the first listed one\n this.media(this.main.playlists[0]);\n }\n return;\n } // In order to support media playlists passed in as vhs-json, the case where the uri\n // is not provided as part of the manifest should be considered, and an appropriate\n // default used.\n\n const uri = this.srcUri() || window$1.location.href;\n this.main = mainForMedia(manifest, uri);\n this.haveMetadata({\n playlistObject: manifest,\n url: uri,\n id: this.main.playlists[0].id\n });\n this.trigger('loadedmetadata');\n }\n /**\n * Updates or deletes a preexisting pathway clone.\n * Ensures that all playlists related to the old pathway clone are\n * either updated or deleted.\n *\n * @param {Object} clone On update, the pathway clone object for the newly updated pathway clone.\n * On delete, the old pathway clone object to be deleted.\n * @param {boolean} isUpdate True if the pathway is to be updated,\n * false if it is meant to be deleted.\n */\n\n updateOrDeleteClone(clone, isUpdate) {\n const main = this.main;\n const pathway = clone.ID;\n let i = main.playlists.length; // Iterate backwards through the playlist so we can remove playlists if necessary.\n\n while (i--) {\n const p = main.playlists[i];\n if (p.attributes['PATHWAY-ID'] === pathway) {\n const oldPlaylistUri = p.resolvedUri;\n const oldPlaylistId = p.id; // update the indexed playlist and add new playlists by ID and URI\n\n if (isUpdate) {\n const newPlaylistUri = this.createCloneURI_(p.resolvedUri, clone);\n const newPlaylistId = createPlaylistID(pathway, newPlaylistUri);\n const attributes = this.createCloneAttributes_(pathway, p.attributes);\n const updatedPlaylist = this.createClonePlaylist_(p, newPlaylistId, clone, attributes);\n main.playlists[i] = updatedPlaylist;\n main.playlists[newPlaylistId] = updatedPlaylist;\n main.playlists[newPlaylistUri] = updatedPlaylist;\n } else {\n // Remove the indexed playlist.\n main.playlists.splice(i, 1);\n } // Remove playlists by the old ID and URI.\n\n delete main.playlists[oldPlaylistId];\n delete main.playlists[oldPlaylistUri];\n }\n }\n this.updateOrDeleteCloneMedia(clone, isUpdate);\n }\n /**\n * Updates or deletes media data based on the pathway clone object.\n * Due to the complexity of the media groups and playlists, in all cases\n * we remove all of the old media groups and playlists.\n * On updates, we then create new media groups and playlists based on the\n * new pathway clone object.\n *\n * @param {Object} clone The pathway clone object for the newly updated pathway clone.\n * @param {boolean} isUpdate True if the pathway is to be updated,\n * false if it is meant to be deleted.\n */\n\n updateOrDeleteCloneMedia(clone, isUpdate) {\n const main = this.main;\n const id = clone.ID;\n ['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(mediaType => {\n if (!main.mediaGroups[mediaType] || !main.mediaGroups[mediaType][id]) {\n return;\n }\n for (const groupKey in main.mediaGroups[mediaType]) {\n // Remove all media playlists for the media group for this pathway clone.\n if (groupKey === id) {\n for (const labelKey in main.mediaGroups[mediaType][groupKey]) {\n const oldMedia = main.mediaGroups[mediaType][groupKey][labelKey];\n oldMedia.playlists.forEach((p, i) => {\n const oldMediaPlaylist = main.playlists[p.id];\n const oldPlaylistId = oldMediaPlaylist.id;\n const oldPlaylistUri = oldMediaPlaylist.resolvedUri;\n delete main.playlists[oldPlaylistId];\n delete main.playlists[oldPlaylistUri];\n });\n } // Delete the old media group.\n\n delete main.mediaGroups[mediaType][groupKey];\n }\n }\n }); // Create the new media groups and playlists if there is an update.\n\n if (isUpdate) {\n this.createClonedMediaGroups_(clone);\n }\n }\n /**\n * Given a pathway clone object, clones all necessary playlists.\n *\n * @param {Object} clone The pathway clone object.\n * @param {Object} basePlaylist The original playlist to clone from.\n */\n\n addClonePathway(clone, basePlaylist = {}) {\n const main = this.main;\n const index = main.playlists.length;\n const uri = this.createCloneURI_(basePlaylist.resolvedUri, clone);\n const playlistId = createPlaylistID(clone.ID, uri);\n const attributes = this.createCloneAttributes_(clone.ID, basePlaylist.attributes);\n const playlist = this.createClonePlaylist_(basePlaylist, playlistId, clone, attributes);\n main.playlists[index] = playlist; // add playlist by ID and URI\n\n main.playlists[playlistId] = playlist;\n main.playlists[uri] = playlist;\n this.createClonedMediaGroups_(clone);\n }\n /**\n * Given a pathway clone object we create clones of all media.\n * In this function, all necessary information and updated playlists\n * are added to the `mediaGroup` object.\n * Playlists are also added to the `playlists` array so the media groups\n * will be properly linked.\n *\n * @param {Object} clone The pathway clone object.\n */\n\n createClonedMediaGroups_(clone) {\n const id = clone.ID;\n const baseID = clone['BASE-ID'];\n const main = this.main;\n ['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(mediaType => {\n // If the media type doesn't exist, or there is already a clone, skip\n // to the next media type.\n if (!main.mediaGroups[mediaType] || main.mediaGroups[mediaType][id]) {\n return;\n }\n for (const groupKey in main.mediaGroups[mediaType]) {\n if (groupKey === baseID) {\n // Create the group.\n main.mediaGroups[mediaType][id] = {};\n } else {\n // There is no need to iterate over label keys in this case.\n continue;\n }\n for (const labelKey in main.mediaGroups[mediaType][groupKey]) {\n const oldMedia = main.mediaGroups[mediaType][groupKey][labelKey];\n main.mediaGroups[mediaType][id][labelKey] = _extends({}, oldMedia);\n const newMedia = main.mediaGroups[mediaType][id][labelKey]; // update URIs on the media\n\n const newUri = this.createCloneURI_(oldMedia.resolvedUri, clone);\n newMedia.resolvedUri = newUri;\n newMedia.uri = newUri; // Reset playlists in the new media group.\n\n newMedia.playlists = []; // Create new playlists in the newly cloned media group.\n\n oldMedia.playlists.forEach((p, i) => {\n const oldMediaPlaylist = main.playlists[p.id];\n const group = groupID(mediaType, id, labelKey);\n const newPlaylistID = createPlaylistID(id, group); // Check to see if it already exists\n\n if (oldMediaPlaylist && !main.playlists[newPlaylistID]) {\n const newMediaPlaylist = this.createClonePlaylist_(oldMediaPlaylist, newPlaylistID, clone);\n const newPlaylistUri = newMediaPlaylist.resolvedUri;\n main.playlists[newPlaylistID] = newMediaPlaylist;\n main.playlists[newPlaylistUri] = newMediaPlaylist;\n }\n newMedia.playlists[i] = this.createClonePlaylist_(p, newPlaylistID, clone);\n });\n }\n }\n });\n }\n /**\n * Using the original playlist to be cloned, and the pathway clone object\n * information, we create a new playlist.\n *\n * @param {Object} basePlaylist The original playlist to be cloned from.\n * @param {string} id The desired id of the newly cloned playlist.\n * @param {Object} clone The pathway clone object.\n * @param {Object} attributes An optional object to populate the `attributes` property in the playlist.\n *\n * @return {Object} The combined cloned playlist.\n */\n\n createClonePlaylist_(basePlaylist, id, clone, attributes) {\n const uri = this.createCloneURI_(basePlaylist.resolvedUri, clone);\n const newProps = {\n resolvedUri: uri,\n uri,\n id\n }; // Remove all segments from previous playlist in the clone.\n\n if (basePlaylist.segments) {\n newProps.segments = [];\n }\n if (attributes) {\n newProps.attributes = attributes;\n }\n return merge(basePlaylist, newProps);\n }\n /**\n * Generates an updated URI for a cloned pathway based on the original\n * pathway's URI and the paramaters from the pathway clone object in the\n * content steering server response.\n *\n * @param {string} baseUri URI to be updated in the cloned pathway.\n * @param {Object} clone The pathway clone object.\n *\n * @return {string} The updated URI for the cloned pathway.\n */\n\n createCloneURI_(baseURI, clone) {\n const uri = new URL(baseURI);\n uri.hostname = clone['URI-REPLACEMENT'].HOST;\n const params = clone['URI-REPLACEMENT'].PARAMS; // Add params to the cloned URL.\n\n for (const key of Object.keys(params)) {\n uri.searchParams.set(key, params[key]);\n }\n return uri.href;\n }\n /**\n * Helper function to create the attributes needed for the new clone.\n * This mainly adds the necessary media attributes.\n *\n * @param {string} id The pathway clone object ID.\n * @param {Object} oldAttributes The old attributes to compare to.\n * @return {Object} The new attributes to add to the playlist.\n */\n\n createCloneAttributes_(id, oldAttributes) {\n const attributes = {\n ['PATHWAY-ID']: id\n };\n ['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(mediaType => {\n if (oldAttributes[mediaType]) {\n attributes[mediaType] = id;\n }\n });\n return attributes;\n }\n /**\n * Returns the key ID set from a playlist\n *\n * @param {playlist} playlist to fetch the key ID set from.\n * @return a Set of 32 digit hex strings that represent the unique keyIds for that playlist.\n */\n\n getKeyIdSet(playlist) {\n if (playlist.contentProtection) {\n const keyIds = new Set();\n for (const keysystem in playlist.contentProtection) {\n const keyId = playlist.contentProtection[keysystem].attributes.keyId;\n if (keyId) {\n keyIds.add(keyId.toLowerCase());\n }\n }\n return keyIds;\n }\n }\n}\n\n/**\n * @file xhr.js\n */\n\nconst callbackWrapper = function (request, error, response, callback) {\n const reqResponse = request.responseType === 'arraybuffer' ? request.response : request.responseText;\n if (!error && reqResponse) {\n request.responseTime = Date.now();\n request.roundTripTime = request.responseTime - request.requestTime;\n request.bytesReceived = reqResponse.byteLength || reqResponse.length;\n if (!request.bandwidth) {\n request.bandwidth = Math.floor(request.bytesReceived / request.roundTripTime * 8 * 1000);\n }\n }\n if (response.headers) {\n request.responseHeaders = response.headers;\n } // videojs.xhr now uses a specific code on the error\n // object to signal that a request has timed out instead\n // of setting a boolean on the request object\n\n if (error && error.code === 'ETIMEDOUT') {\n request.timedout = true;\n } // videojs.xhr no longer considers status codes outside of 200 and 0\n // (for file uris) to be errors, but the old XHR did, so emulate that\n // behavior. Status 206 may be used in response to byterange requests.\n\n if (!error && !request.aborted && response.statusCode !== 200 && response.statusCode !== 206 && response.statusCode !== 0) {\n error = new Error('XHR Failed with a response of: ' + (request && (reqResponse || request.responseText)));\n }\n callback(error, request);\n};\n/**\n * Iterates over the request hooks Set and calls them in order\n *\n * @param {Set} hooks the hook Set to iterate over\n * @param {Object} options the request options to pass to the xhr wrapper\n * @return the callback hook function return value, the modified or new options Object.\n */\n\nconst callAllRequestHooks = (requestSet, options) => {\n if (!requestSet || !requestSet.size) {\n return;\n }\n let newOptions = options;\n requestSet.forEach(requestCallback => {\n newOptions = requestCallback(newOptions);\n });\n return newOptions;\n};\n/**\n * Iterates over the response hooks Set and calls them in order.\n *\n * @param {Set} hooks the hook Set to iterate over\n * @param {Object} request the xhr request object\n * @param {Object} error the xhr error object\n * @param {Object} response the xhr response object\n */\n\nconst callAllResponseHooks = (responseSet, request, error, response) => {\n if (!responseSet || !responseSet.size) {\n return;\n }\n responseSet.forEach(responseCallback => {\n responseCallback(request, error, response);\n });\n};\nconst xhrFactory = function () {\n const xhr = function XhrFunction(options, callback) {\n // Add a default timeout\n options = merge({\n timeout: 45e3\n }, options); // Allow an optional user-specified function to modify the option\n // object before we construct the xhr request\n // TODO: Remove beforeRequest in the next major release.\n\n const beforeRequest = XhrFunction.beforeRequest || videojs.Vhs.xhr.beforeRequest; // onRequest and onResponse hooks as a Set, at either the player or global level.\n // TODO: new Set added here for beforeRequest alias. Remove this when beforeRequest is removed.\n\n const _requestCallbackSet = XhrFunction._requestCallbackSet || videojs.Vhs.xhr._requestCallbackSet || new Set();\n const _responseCallbackSet = XhrFunction._responseCallbackSet || videojs.Vhs.xhr._responseCallbackSet;\n if (beforeRequest && typeof beforeRequest === 'function') {\n videojs.log.warn('beforeRequest is deprecated, use onRequest instead.');\n _requestCallbackSet.add(beforeRequest);\n } // Use the standard videojs.xhr() method unless `videojs.Vhs.xhr` has been overriden\n // TODO: switch back to videojs.Vhs.xhr.name === 'XhrFunction' when we drop IE11\n\n const xhrMethod = videojs.Vhs.xhr.original === true ? videojs.xhr : videojs.Vhs.xhr; // call all registered onRequest hooks, assign new options.\n\n const beforeRequestOptions = callAllRequestHooks(_requestCallbackSet, options); // Remove the beforeRequest function from the hooks set so stale beforeRequest functions are not called.\n\n _requestCallbackSet.delete(beforeRequest); // xhrMethod will call XMLHttpRequest.open and XMLHttpRequest.send\n\n const request = xhrMethod(beforeRequestOptions || options, function (error, response) {\n // call all registered onResponse hooks\n callAllResponseHooks(_responseCallbackSet, request, error, response);\n return callbackWrapper(request, error, response, callback);\n });\n const originalAbort = request.abort;\n request.abort = function () {\n request.aborted = true;\n return originalAbort.apply(request, arguments);\n };\n request.uri = options.uri;\n request.requestType = options.requestType;\n request.requestTime = Date.now();\n return request;\n };\n xhr.original = true;\n return xhr;\n};\n/**\n * Turns segment byterange into a string suitable for use in\n * HTTP Range requests\n *\n * @param {Object} byterange - an object with two values defining the start and end\n * of a byte-range\n */\n\nconst byterangeStr = function (byterange) {\n // `byterangeEnd` is one less than `offset + length` because the HTTP range\n // header uses inclusive ranges\n let byterangeEnd;\n const byterangeStart = byterange.offset;\n if (typeof byterange.offset === 'bigint' || typeof byterange.length === 'bigint') {\n byterangeEnd = window$1.BigInt(byterange.offset) + window$1.BigInt(byterange.length) - window$1.BigInt(1);\n } else {\n byterangeEnd = byterange.offset + byterange.length - 1;\n }\n return 'bytes=' + byterangeStart + '-' + byterangeEnd;\n};\n/**\n * Defines headers for use in the xhr request for a particular segment.\n *\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n */\n\nconst segmentXhrHeaders = function (segment) {\n const headers = {};\n if (segment.byterange) {\n headers.Range = byterangeStr(segment.byterange);\n }\n return headers;\n};\n\n/**\n * @file bin-utils.js\n */\n\n/**\n * convert a TimeRange to text\n *\n * @param {TimeRange} range the timerange to use for conversion\n * @param {number} i the iterator on the range to convert\n * @return {string} the range in string format\n */\n\nconst textRange = function (range, i) {\n return range.start(i) + '-' + range.end(i);\n};\n/**\n * format a number as hex string\n *\n * @param {number} e The number\n * @param {number} i the iterator\n * @return {string} the hex formatted number as a string\n */\n\nconst formatHexString = function (e, i) {\n const value = e.toString(16);\n return '00'.substring(0, 2 - value.length) + value + (i % 2 ? ' ' : '');\n};\nconst formatAsciiString = function (e) {\n if (e >= 0x20 && e < 0x7e) {\n return String.fromCharCode(e);\n }\n return '.';\n};\n/**\n * Creates an object for sending to a web worker modifying properties that are TypedArrays\n * into a new object with seperated properties for the buffer, byteOffset, and byteLength.\n *\n * @param {Object} message\n * Object of properties and values to send to the web worker\n * @return {Object}\n * Modified message with TypedArray values expanded\n * @function createTransferableMessage\n */\n\nconst createTransferableMessage = function (message) {\n const transferable = {};\n Object.keys(message).forEach(key => {\n const value = message[key];\n if (isArrayBufferView(value)) {\n transferable[key] = {\n bytes: value.buffer,\n byteOffset: value.byteOffset,\n byteLength: value.byteLength\n };\n } else {\n transferable[key] = value;\n }\n });\n return transferable;\n};\n/**\n * Returns a unique string identifier for a media initialization\n * segment.\n *\n * @param {Object} initSegment\n * the init segment object.\n *\n * @return {string} the generated init segment id\n */\n\nconst initSegmentId = function (initSegment) {\n const byterange = initSegment.byterange || {\n length: Infinity,\n offset: 0\n };\n return [byterange.length, byterange.offset, initSegment.resolvedUri].join(',');\n};\n/**\n * Returns a unique string identifier for a media segment key.\n *\n * @param {Object} key the encryption key\n * @return {string} the unique id for the media segment key.\n */\n\nconst segmentKeyId = function (key) {\n return key.resolvedUri;\n};\n/**\n * utils to help dump binary data to the console\n *\n * @param {Array|TypedArray} data\n * data to dump to a string\n *\n * @return {string} the data as a hex string.\n */\n\nconst hexDump = data => {\n const bytes = Array.prototype.slice.call(data);\n const step = 16;\n let result = '';\n let hex;\n let ascii;\n for (let j = 0; j < bytes.length / step; j++) {\n hex = bytes.slice(j * step, j * step + step).map(formatHexString).join('');\n ascii = bytes.slice(j * step, j * step + step).map(formatAsciiString).join('');\n result += hex + ' ' + ascii + '\\n';\n }\n return result;\n};\nconst tagDump = ({\n bytes\n}) => hexDump(bytes);\nconst textRanges = ranges => {\n let result = '';\n let i;\n for (i = 0; i < ranges.length; i++) {\n result += textRange(ranges, i) + ' ';\n }\n return result;\n};\nvar utils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n createTransferableMessage: createTransferableMessage,\n initSegmentId: initSegmentId,\n segmentKeyId: segmentKeyId,\n hexDump: hexDump,\n tagDump: tagDump,\n textRanges: textRanges\n});\n\n// TODO handle fmp4 case where the timing info is accurate and doesn't involve transmux\n// 25% was arbitrarily chosen, and may need to be refined over time.\n\nconst SEGMENT_END_FUDGE_PERCENT = 0.25;\n/**\n * Converts a player time (any time that can be gotten/set from player.currentTime(),\n * e.g., any time within player.seekable().start(0) to player.seekable().end(0)) to a\n * program time (any time referencing the real world (e.g., EXT-X-PROGRAM-DATE-TIME)).\n *\n * The containing segment is required as the EXT-X-PROGRAM-DATE-TIME serves as an \"anchor\n * point\" (a point where we have a mapping from program time to player time, with player\n * time being the post transmux start of the segment).\n *\n * For more details, see [this doc](../../docs/program-time-from-player-time.md).\n *\n * @param {number} playerTime the player time\n * @param {Object} segment the segment which contains the player time\n * @return {Date} program time\n */\n\nconst playerTimeToProgramTime = (playerTime, segment) => {\n if (!segment.dateTimeObject) {\n // Can't convert without an \"anchor point\" for the program time (i.e., a time that can\n // be used to map the start of a segment with a real world time).\n return null;\n }\n const transmuxerPrependedSeconds = segment.videoTimingInfo.transmuxerPrependedSeconds;\n const transmuxedStart = segment.videoTimingInfo.transmuxedPresentationStart; // get the start of the content from before old content is prepended\n\n const startOfSegment = transmuxedStart + transmuxerPrependedSeconds;\n const offsetFromSegmentStart = playerTime - startOfSegment;\n return new Date(segment.dateTimeObject.getTime() + offsetFromSegmentStart * 1000);\n};\nconst originalSegmentVideoDuration = videoTimingInfo => {\n return videoTimingInfo.transmuxedPresentationEnd - videoTimingInfo.transmuxedPresentationStart - videoTimingInfo.transmuxerPrependedSeconds;\n};\n/**\n * Finds a segment that contains the time requested given as an ISO-8601 string. The\n * returned segment might be an estimate or an accurate match.\n *\n * @param {string} programTime The ISO-8601 programTime to find a match for\n * @param {Object} playlist A playlist object to search within\n */\n\nconst findSegmentForProgramTime = (programTime, playlist) => {\n // Assumptions:\n // - verifyProgramDateTimeTags has already been run\n // - live streams have been started\n let dateTimeObject;\n try {\n dateTimeObject = new Date(programTime);\n } catch (e) {\n return null;\n }\n if (!playlist || !playlist.segments || playlist.segments.length === 0) {\n return null;\n }\n let segment = playlist.segments[0];\n if (dateTimeObject < new Date(segment.dateTimeObject)) {\n // Requested time is before stream start.\n return null;\n }\n for (let i = 0; i < playlist.segments.length - 1; i++) {\n segment = playlist.segments[i];\n const nextSegmentStart = new Date(playlist.segments[i + 1].dateTimeObject);\n if (dateTimeObject < nextSegmentStart) {\n break;\n }\n }\n const lastSegment = playlist.segments[playlist.segments.length - 1];\n const lastSegmentStart = lastSegment.dateTimeObject;\n const lastSegmentDuration = lastSegment.videoTimingInfo ? originalSegmentVideoDuration(lastSegment.videoTimingInfo) : lastSegment.duration + lastSegment.duration * SEGMENT_END_FUDGE_PERCENT;\n const lastSegmentEnd = new Date(lastSegmentStart.getTime() + lastSegmentDuration * 1000);\n if (dateTimeObject > lastSegmentEnd) {\n // Beyond the end of the stream, or our best guess of the end of the stream.\n return null;\n }\n if (dateTimeObject > new Date(lastSegmentStart)) {\n segment = lastSegment;\n }\n return {\n segment,\n estimatedStart: segment.videoTimingInfo ? segment.videoTimingInfo.transmuxedPresentationStart : Playlist.duration(playlist, playlist.mediaSequence + playlist.segments.indexOf(segment)),\n // Although, given that all segments have accurate date time objects, the segment\n // selected should be accurate, unless the video has been transmuxed at some point\n // (determined by the presence of the videoTimingInfo object), the segment's \"player\n // time\" (the start time in the player) can't be considered accurate.\n type: segment.videoTimingInfo ? 'accurate' : 'estimate'\n };\n};\n/**\n * Finds a segment that contains the given player time(in seconds).\n *\n * @param {number} time The player time to find a match for\n * @param {Object} playlist A playlist object to search within\n */\n\nconst findSegmentForPlayerTime = (time, playlist) => {\n // Assumptions:\n // - there will always be a segment.duration\n // - we can start from zero\n // - segments are in time order\n if (!playlist || !playlist.segments || playlist.segments.length === 0) {\n return null;\n }\n let segmentEnd = 0;\n let segment;\n for (let i = 0; i < playlist.segments.length; i++) {\n segment = playlist.segments[i]; // videoTimingInfo is set after the segment is downloaded and transmuxed, and\n // should contain the most accurate values we have for the segment's player times.\n //\n // Use the accurate transmuxedPresentationEnd value if it is available, otherwise fall\n // back to an estimate based on the manifest derived (inaccurate) segment.duration, to\n // calculate an end value.\n\n segmentEnd = segment.videoTimingInfo ? segment.videoTimingInfo.transmuxedPresentationEnd : segmentEnd + segment.duration;\n if (time <= segmentEnd) {\n break;\n }\n }\n const lastSegment = playlist.segments[playlist.segments.length - 1];\n if (lastSegment.videoTimingInfo && lastSegment.videoTimingInfo.transmuxedPresentationEnd < time) {\n // The time requested is beyond the stream end.\n return null;\n }\n if (time > segmentEnd) {\n // The time is within or beyond the last segment.\n //\n // Check to see if the time is beyond a reasonable guess of the end of the stream.\n if (time > segmentEnd + lastSegment.duration * SEGMENT_END_FUDGE_PERCENT) {\n // Technically, because the duration value is only an estimate, the time may still\n // exist in the last segment, however, there isn't enough information to make even\n // a reasonable estimate.\n return null;\n }\n segment = lastSegment;\n }\n return {\n segment,\n estimatedStart: segment.videoTimingInfo ? segment.videoTimingInfo.transmuxedPresentationStart : segmentEnd - segment.duration,\n // Because videoTimingInfo is only set after transmux, it is the only way to get\n // accurate timing values.\n type: segment.videoTimingInfo ? 'accurate' : 'estimate'\n };\n};\n/**\n * Gives the offset of the comparisonTimestamp from the programTime timestamp in seconds.\n * If the offset returned is positive, the programTime occurs after the\n * comparisonTimestamp.\n * If the offset is negative, the programTime occurs before the comparisonTimestamp.\n *\n * @param {string} comparisonTimeStamp An ISO-8601 timestamp to compare against\n * @param {string} programTime The programTime as an ISO-8601 string\n * @return {number} offset\n */\n\nconst getOffsetFromTimestamp = (comparisonTimeStamp, programTime) => {\n let segmentDateTime;\n let programDateTime;\n try {\n segmentDateTime = new Date(comparisonTimeStamp);\n programDateTime = new Date(programTime);\n } catch (e) {// TODO handle error\n }\n const segmentTimeEpoch = segmentDateTime.getTime();\n const programTimeEpoch = programDateTime.getTime();\n return (programTimeEpoch - segmentTimeEpoch) / 1000;\n};\n/**\n * Checks that all segments in this playlist have programDateTime tags.\n *\n * @param {Object} playlist A playlist object\n */\n\nconst verifyProgramDateTimeTags = playlist => {\n if (!playlist.segments || playlist.segments.length === 0) {\n return false;\n }\n for (let i = 0; i < playlist.segments.length; i++) {\n const segment = playlist.segments[i];\n if (!segment.dateTimeObject) {\n return false;\n }\n }\n return true;\n};\n/**\n * Returns the programTime of the media given a playlist and a playerTime.\n * The playlist must have programDateTime tags for a programDateTime tag to be returned.\n * If the segments containing the time requested have not been buffered yet, an estimate\n * may be returned to the callback.\n *\n * @param {Object} args\n * @param {Object} args.playlist A playlist object to search within\n * @param {number} time A playerTime in seconds\n * @param {Function} callback(err, programTime)\n * @return {string} err.message A detailed error message\n * @return {Object} programTime\n * @return {number} programTime.mediaSeconds The streamTime in seconds\n * @return {string} programTime.programDateTime The programTime as an ISO-8601 String\n */\n\nconst getProgramTime = ({\n playlist,\n time = undefined,\n callback\n}) => {\n if (!callback) {\n throw new Error('getProgramTime: callback must be provided');\n }\n if (!playlist || time === undefined) {\n return callback({\n message: 'getProgramTime: playlist and time must be provided'\n });\n }\n const matchedSegment = findSegmentForPlayerTime(time, playlist);\n if (!matchedSegment) {\n return callback({\n message: 'valid programTime was not found'\n });\n }\n if (matchedSegment.type === 'estimate') {\n return callback({\n message: 'Accurate programTime could not be determined.' + ' Please seek to e.seekTime and try again',\n seekTime: matchedSegment.estimatedStart\n });\n }\n const programTimeObject = {\n mediaSeconds: time\n };\n const programTime = playerTimeToProgramTime(time, matchedSegment.segment);\n if (programTime) {\n programTimeObject.programDateTime = programTime.toISOString();\n }\n return callback(null, programTimeObject);\n};\n/**\n * Seeks in the player to a time that matches the given programTime ISO-8601 string.\n *\n * @param {Object} args\n * @param {string} args.programTime A programTime to seek to as an ISO-8601 String\n * @param {Object} args.playlist A playlist to look within\n * @param {number} args.retryCount The number of times to try for an accurate seek. Default is 2.\n * @param {Function} args.seekTo A method to perform a seek\n * @param {boolean} args.pauseAfterSeek Whether to end in a paused state after seeking. Default is true.\n * @param {Object} args.tech The tech to seek on\n * @param {Function} args.callback(err, newTime) A callback to return the new time to\n * @return {string} err.message A detailed error message\n * @return {number} newTime The exact time that was seeked to in seconds\n */\n\nconst seekToProgramTime = ({\n programTime,\n playlist,\n retryCount = 2,\n seekTo,\n pauseAfterSeek = true,\n tech,\n callback\n}) => {\n if (!callback) {\n throw new Error('seekToProgramTime: callback must be provided');\n }\n if (typeof programTime === 'undefined' || !playlist || !seekTo) {\n return callback({\n message: 'seekToProgramTime: programTime, seekTo and playlist must be provided'\n });\n }\n if (!playlist.endList && !tech.hasStarted_) {\n return callback({\n message: 'player must be playing a live stream to start buffering'\n });\n }\n if (!verifyProgramDateTimeTags(playlist)) {\n return callback({\n message: 'programDateTime tags must be provided in the manifest ' + playlist.resolvedUri\n });\n }\n const matchedSegment = findSegmentForProgramTime(programTime, playlist); // no match\n\n if (!matchedSegment) {\n return callback({\n message: `${programTime} was not found in the stream`\n });\n }\n const segment = matchedSegment.segment;\n const mediaOffset = getOffsetFromTimestamp(segment.dateTimeObject, programTime);\n if (matchedSegment.type === 'estimate') {\n // we've run out of retries\n if (retryCount === 0) {\n return callback({\n message: `${programTime} is not buffered yet. Try again`\n });\n }\n seekTo(matchedSegment.estimatedStart + mediaOffset);\n tech.one('seeked', () => {\n seekToProgramTime({\n programTime,\n playlist,\n retryCount: retryCount - 1,\n seekTo,\n pauseAfterSeek,\n tech,\n callback\n });\n });\n return;\n } // Since the segment.start value is determined from the buffered end or ending time\n // of the prior segment, the seekToTime doesn't need to account for any transmuxer\n // modifications.\n\n const seekToTime = segment.start + mediaOffset;\n const seekedCallback = () => {\n return callback(null, tech.currentTime());\n }; // listen for seeked event\n\n tech.one('seeked', seekedCallback); // pause before seeking as video.js will restore this state\n\n if (pauseAfterSeek) {\n tech.pause();\n }\n seekTo(seekToTime);\n};\n\n// which will only happen if the request is complete.\n\nconst callbackOnCompleted = (request, cb) => {\n if (request.readyState === 4) {\n return cb();\n }\n return;\n};\nconst containerRequest = (uri, xhr, cb, requestType) => {\n let bytes = [];\n let id3Offset;\n let finished = false;\n const endRequestAndCallback = function (err, req, type, _bytes) {\n req.abort();\n finished = true;\n return cb(err, req, type, _bytes);\n };\n const progressListener = function (error, request) {\n if (finished) {\n return;\n }\n if (error) {\n error.metadata = getStreamingNetworkErrorMetadata({\n requestType,\n request,\n error\n });\n return endRequestAndCallback(error, request, '', bytes);\n } // grap the new part of content that was just downloaded\n\n const newPart = request.responseText.substring(bytes && bytes.byteLength || 0, request.responseText.length); // add that onto bytes\n\n bytes = concatTypedArrays(bytes, stringToBytes(newPart, true));\n id3Offset = id3Offset || getId3Offset(bytes); // we need at least 10 bytes to determine a type\n // or we need at least two bytes after an id3Offset\n\n if (bytes.length < 10 || id3Offset && bytes.length < id3Offset + 2) {\n return callbackOnCompleted(request, () => endRequestAndCallback(error, request, '', bytes));\n }\n const type = detectContainerForBytes(bytes); // if this looks like a ts segment but we don't have enough data\n // to see the second sync byte, wait until we have enough data\n // before declaring it ts\n\n if (type === 'ts' && bytes.length < 188) {\n return callbackOnCompleted(request, () => endRequestAndCallback(error, request, '', bytes));\n } // this may be an unsynced ts segment\n // wait for 376 bytes before detecting no container\n\n if (!type && bytes.length < 376) {\n return callbackOnCompleted(request, () => endRequestAndCallback(error, request, '', bytes));\n }\n return endRequestAndCallback(null, request, type, bytes);\n };\n const options = {\n uri,\n beforeSend(request) {\n // this forces the browser to pass the bytes to us unprocessed\n request.overrideMimeType('text/plain; charset=x-user-defined');\n request.addEventListener('progress', function ({\n total,\n loaded\n }) {\n return callbackWrapper(request, null, {\n statusCode: request.status\n }, progressListener);\n });\n }\n };\n const request = xhr(options, function (error, response) {\n return callbackWrapper(request, error, response, progressListener);\n });\n return request;\n};\nconst {\n EventTarget\n} = videojs;\nconst dashPlaylistUnchanged = function (a, b) {\n if (!isPlaylistUnchanged(a, b)) {\n return false;\n } // for dash the above check will often return true in scenarios where\n // the playlist actually has changed because mediaSequence isn't a\n // dash thing, and we often set it to 1. So if the playlists have the same amount\n // of segments we return true.\n // So for dash we need to make sure that the underlying segments are different.\n // if sidx changed then the playlists are different.\n\n if (a.sidx && b.sidx && (a.sidx.offset !== b.sidx.offset || a.sidx.length !== b.sidx.length)) {\n return false;\n } else if (!a.sidx && b.sidx || a.sidx && !b.sidx) {\n return false;\n } // one or the other does not have segments\n // there was a change.\n\n if (a.segments && !b.segments || !a.segments && b.segments) {\n return false;\n } // neither has segments nothing changed\n\n if (!a.segments && !b.segments) {\n return true;\n } // check segments themselves\n\n for (let i = 0; i < a.segments.length; i++) {\n const aSegment = a.segments[i];\n const bSegment = b.segments[i]; // if uris are different between segments there was a change\n\n if (aSegment.uri !== bSegment.uri) {\n return false;\n } // neither segment has a byterange, there will be no byterange change.\n\n if (!aSegment.byterange && !bSegment.byterange) {\n continue;\n }\n const aByterange = aSegment.byterange;\n const bByterange = bSegment.byterange; // if byterange only exists on one of the segments, there was a change.\n\n if (aByterange && !bByterange || !aByterange && bByterange) {\n return false;\n } // if both segments have byterange with different offsets, there was a change.\n\n if (aByterange.offset !== bByterange.offset || aByterange.length !== bByterange.length) {\n return false;\n }\n } // if everything was the same with segments, this is the same playlist.\n\n return true;\n};\n/**\n * Use the representation IDs from the mpd object to create groupIDs, the NAME is set to mandatory representation\n * ID in the parser. This allows for continuous playout across periods with the same representation IDs\n * (continuous periods as defined in DASH-IF 3.2.12). This is assumed in the mpd-parser as well. If we want to support\n * periods without continuous playback this function may need modification as well as the parser.\n */\n\nconst dashGroupId = (type, group, label, playlist) => {\n // If the manifest somehow does not have an ID (non-dash compliant), use the label.\n const playlistId = playlist.attributes.NAME || label;\n return `placeholder-uri-${type}-${group}-${playlistId}`;\n};\n/**\n * Parses the main XML string and updates playlist URI references.\n *\n * @param {Object} config\n * Object of arguments\n * @param {string} config.mainXml\n * The mpd XML\n * @param {string} config.srcUrl\n * The mpd URL\n * @param {Date} config.clientOffset\n * A time difference between server and client\n * @param {Object} config.sidxMapping\n * SIDX mappings for moof/mdat URIs and byte ranges\n * @return {Object}\n * The parsed mpd manifest object\n */\n\nconst parseMainXml = ({\n mainXml,\n srcUrl,\n clientOffset,\n sidxMapping,\n previousManifest\n}) => {\n const manifest = parse(mainXml, {\n manifestUri: srcUrl,\n clientOffset,\n sidxMapping,\n previousManifest\n });\n addPropertiesToMain(manifest, srcUrl, dashGroupId);\n return manifest;\n};\n/**\n * Removes any mediaGroup labels that no longer exist in the newMain\n *\n * @param {Object} update\n * The previous mpd object being updated\n * @param {Object} newMain\n * The new mpd object\n */\n\nconst removeOldMediaGroupLabels = (update, newMain) => {\n forEachMediaGroup(update, (properties, type, group, label) => {\n if (!newMain.mediaGroups[type][group] || !(label in newMain.mediaGroups[type][group])) {\n delete update.mediaGroups[type][group][label];\n }\n });\n};\n/**\n * Returns a new main manifest that is the result of merging an updated main manifest\n * into the original version.\n *\n * @param {Object} oldMain\n * The old parsed mpd object\n * @param {Object} newMain\n * The updated parsed mpd object\n * @return {Object}\n * A new object representing the original main manifest with the updated media\n * playlists merged in\n */\n\nconst updateMain = (oldMain, newMain, sidxMapping) => {\n let noChanges = true;\n let update = merge(oldMain, {\n // These are top level properties that can be updated\n duration: newMain.duration,\n minimumUpdatePeriod: newMain.minimumUpdatePeriod,\n timelineStarts: newMain.timelineStarts\n }); // First update the playlists in playlist list\n\n for (let i = 0; i < newMain.playlists.length; i++) {\n const playlist = newMain.playlists[i];\n if (playlist.sidx) {\n const sidxKey = generateSidxKey(playlist.sidx); // add sidx segments to the playlist if we have all the sidx info already\n\n if (sidxMapping && sidxMapping[sidxKey] && sidxMapping[sidxKey].sidx) {\n addSidxSegmentsToPlaylist(playlist, sidxMapping[sidxKey].sidx, playlist.sidx.resolvedUri);\n }\n }\n const playlistUpdate = updateMain$1(update, playlist, dashPlaylistUnchanged);\n if (playlistUpdate) {\n update = playlistUpdate;\n noChanges = false;\n }\n } // Then update media group playlists\n\n forEachMediaGroup(newMain, (properties, type, group, label) => {\n if (properties.playlists && properties.playlists.length) {\n const id = properties.playlists[0].id;\n const playlistUpdate = updateMain$1(update, properties.playlists[0], dashPlaylistUnchanged);\n if (playlistUpdate) {\n update = playlistUpdate; // add new mediaGroup label if it doesn't exist and assign the new mediaGroup.\n\n if (!(label in update.mediaGroups[type][group])) {\n update.mediaGroups[type][group][label] = properties;\n } // update the playlist reference within media groups\n\n update.mediaGroups[type][group][label].playlists[0] = update.playlists[id];\n noChanges = false;\n }\n }\n }); // remove mediaGroup labels and references that no longer exist in the newMain\n\n removeOldMediaGroupLabels(update, newMain);\n if (newMain.minimumUpdatePeriod !== oldMain.minimumUpdatePeriod) {\n noChanges = false;\n }\n if (noChanges) {\n return null;\n }\n return update;\n}; // SIDX should be equivalent if the URI and byteranges of the SIDX match.\n// If the SIDXs have maps, the two maps should match,\n// both `a` and `b` missing SIDXs is considered matching.\n// If `a` or `b` but not both have a map, they aren't matching.\n\nconst equivalentSidx = (a, b) => {\n const neitherMap = Boolean(!a.map && !b.map);\n const equivalentMap = neitherMap || Boolean(a.map && b.map && a.map.byterange.offset === b.map.byterange.offset && a.map.byterange.length === b.map.byterange.length);\n return equivalentMap && a.uri === b.uri && a.byterange.offset === b.byterange.offset && a.byterange.length === b.byterange.length;\n}; // exported for testing\n\nconst compareSidxEntry = (playlists, oldSidxMapping) => {\n const newSidxMapping = {};\n for (const id in playlists) {\n const playlist = playlists[id];\n const currentSidxInfo = playlist.sidx;\n if (currentSidxInfo) {\n const key = generateSidxKey(currentSidxInfo);\n if (!oldSidxMapping[key]) {\n break;\n }\n const savedSidxInfo = oldSidxMapping[key].sidxInfo;\n if (equivalentSidx(savedSidxInfo, currentSidxInfo)) {\n newSidxMapping[key] = oldSidxMapping[key];\n }\n }\n }\n return newSidxMapping;\n};\n/**\n * A function that filters out changed items as they need to be requested separately.\n *\n * The method is exported for testing\n *\n * @param {Object} main the parsed mpd XML returned via mpd-parser\n * @param {Object} oldSidxMapping the SIDX to compare against\n */\n\nconst filterChangedSidxMappings = (main, oldSidxMapping) => {\n const videoSidx = compareSidxEntry(main.playlists, oldSidxMapping);\n let mediaGroupSidx = videoSidx;\n forEachMediaGroup(main, (properties, mediaType, groupKey, labelKey) => {\n if (properties.playlists && properties.playlists.length) {\n const playlists = properties.playlists;\n mediaGroupSidx = merge(mediaGroupSidx, compareSidxEntry(playlists, oldSidxMapping));\n }\n });\n return mediaGroupSidx;\n};\nclass DashPlaylistLoader extends EventTarget {\n // DashPlaylistLoader must accept either a src url or a playlist because subsequent\n // playlist loader setups from media groups will expect to be able to pass a playlist\n // (since there aren't external URLs to media playlists with DASH)\n constructor(srcUrlOrPlaylist, vhs, options = {}, mainPlaylistLoader) {\n super();\n this.isPaused_ = true;\n this.mainPlaylistLoader_ = mainPlaylistLoader || this;\n if (!mainPlaylistLoader) {\n this.isMain_ = true;\n }\n const {\n withCredentials = false\n } = options;\n this.vhs_ = vhs;\n this.withCredentials = withCredentials;\n this.addMetadataToTextTrack = options.addMetadataToTextTrack;\n if (!srcUrlOrPlaylist) {\n throw new Error('A non-empty playlist URL or object is required');\n } // event naming?\n\n this.on('minimumUpdatePeriod', () => {\n this.refreshXml_();\n }); // live playlist staleness timeout\n\n this.on('mediaupdatetimeout', () => {\n this.refreshMedia_(this.media().id);\n });\n this.state = 'HAVE_NOTHING';\n this.loadedPlaylists_ = {};\n this.logger_ = logger('DashPlaylistLoader'); // initialize the loader state\n // The mainPlaylistLoader will be created with a string\n\n if (this.isMain_) {\n this.mainPlaylistLoader_.srcUrl = srcUrlOrPlaylist; // TODO: reset sidxMapping between period changes\n // once multi-period is refactored\n\n this.mainPlaylistLoader_.sidxMapping_ = {};\n } else {\n this.childPlaylist_ = srcUrlOrPlaylist;\n }\n }\n get isPaused() {\n return this.isPaused_;\n }\n requestErrored_(err, request, startingState) {\n // disposed\n if (!this.request) {\n return true;\n } // pending request is cleared\n\n this.request = null;\n if (err) {\n // use the provided error object or create one\n // based on the request/response\n this.error = typeof err === 'object' && !(err instanceof Error) ? err : {\n status: request.status,\n message: 'DASH request error at URL: ' + request.uri,\n response: request.response,\n // MEDIA_ERR_NETWORK\n code: 2,\n metadata: err.metadata\n };\n if (startingState) {\n this.state = startingState;\n }\n this.trigger('error');\n return true;\n }\n }\n /**\n * Verify that the container of the sidx segment can be parsed\n * and if it can, get and parse that segment.\n */\n\n addSidxSegments_(playlist, startingState, cb) {\n const sidxKey = playlist.sidx && generateSidxKey(playlist.sidx); // playlist lacks sidx or sidx segments were added to this playlist already.\n\n if (!playlist.sidx || !sidxKey || this.mainPlaylistLoader_.sidxMapping_[sidxKey]) {\n // keep this function async\n window$1.clearTimeout(this.mediaRequest_);\n this.mediaRequest_ = window$1.setTimeout(() => cb(false), 0);\n return;\n } // resolve the segment URL relative to the playlist\n\n const uri = resolveManifestRedirect(playlist.sidx.resolvedUri);\n const fin = (err, request) => {\n if (this.requestErrored_(err, request, startingState)) {\n return;\n }\n const sidxMapping = this.mainPlaylistLoader_.sidxMapping_;\n const {\n requestType\n } = request;\n let sidx;\n try {\n sidx = parseSidx(toUint8(request.response).subarray(8));\n } catch (e) {\n e.metadata = getStreamingNetworkErrorMetadata({\n requestType,\n request,\n parseFailure: true\n }); // sidx parsing failed.\n\n this.requestErrored_(e, request, startingState);\n return;\n }\n sidxMapping[sidxKey] = {\n sidxInfo: playlist.sidx,\n sidx\n };\n addSidxSegmentsToPlaylist(playlist, sidx, playlist.sidx.resolvedUri);\n return cb(true);\n };\n const REQUEST_TYPE = 'dash-sidx';\n this.request = containerRequest(uri, this.vhs_.xhr, (err, request, container, bytes) => {\n if (err) {\n return fin(err, request);\n }\n if (!container || container !== 'mp4') {\n const sidxContainer = container || 'unknown';\n return fin({\n status: request.status,\n message: `Unsupported ${sidxContainer} container type for sidx segment at URL: ${uri}`,\n // response is just bytes in this case\n // but we really don't want to return that.\n response: '',\n playlist,\n internal: true,\n playlistExclusionDuration: Infinity,\n // MEDIA_ERR_NETWORK\n code: 2\n }, request);\n } // if we already downloaded the sidx bytes in the container request, use them\n\n const {\n offset,\n length\n } = playlist.sidx.byterange;\n if (bytes.length >= length + offset) {\n return fin(err, {\n response: bytes.subarray(offset, offset + length),\n status: request.status,\n uri: request.uri\n });\n } // otherwise request sidx bytes\n\n this.request = this.vhs_.xhr({\n uri,\n responseType: 'arraybuffer',\n requestType: 'dash-sidx',\n headers: segmentXhrHeaders({\n byterange: playlist.sidx.byterange\n })\n }, fin);\n }, REQUEST_TYPE);\n }\n dispose() {\n this.isPaused_ = true;\n this.trigger('dispose');\n this.stopRequest();\n this.loadedPlaylists_ = {};\n window$1.clearTimeout(this.minimumUpdatePeriodTimeout_);\n window$1.clearTimeout(this.mediaRequest_);\n window$1.clearTimeout(this.mediaUpdateTimeout);\n this.mediaUpdateTimeout = null;\n this.mediaRequest_ = null;\n this.minimumUpdatePeriodTimeout_ = null;\n if (this.mainPlaylistLoader_.createMupOnMedia_) {\n this.off('loadedmetadata', this.mainPlaylistLoader_.createMupOnMedia_);\n this.mainPlaylistLoader_.createMupOnMedia_ = null;\n }\n this.off();\n }\n hasPendingRequest() {\n return this.request || this.mediaRequest_;\n }\n stopRequest() {\n if (this.request) {\n const oldRequest = this.request;\n this.request = null;\n oldRequest.onreadystatechange = null;\n oldRequest.abort();\n }\n }\n media(playlist) {\n // getter\n if (!playlist) {\n return this.media_;\n } // setter\n\n if (this.state === 'HAVE_NOTHING') {\n throw new Error('Cannot switch media playlist from ' + this.state);\n }\n const startingState = this.state; // find the playlist object if the target playlist has been specified by URI\n\n if (typeof playlist === 'string') {\n if (!this.mainPlaylistLoader_.main.playlists[playlist]) {\n throw new Error('Unknown playlist URI: ' + playlist);\n }\n playlist = this.mainPlaylistLoader_.main.playlists[playlist];\n }\n const mediaChange = !this.media_ || playlist.id !== this.media_.id; // switch to previously loaded playlists immediately\n\n if (mediaChange && this.loadedPlaylists_[playlist.id] && this.loadedPlaylists_[playlist.id].endList) {\n this.state = 'HAVE_METADATA';\n this.media_ = playlist; // trigger media change if the active media has been updated\n\n if (mediaChange) {\n this.trigger('mediachanging');\n this.trigger('mediachange');\n }\n return;\n } // switching to the active playlist is a no-op\n\n if (!mediaChange) {\n return;\n } // switching from an already loaded playlist\n\n if (this.media_) {\n this.trigger('mediachanging');\n }\n this.addSidxSegments_(playlist, startingState, sidxChanged => {\n // everything is ready just continue to haveMetadata\n this.haveMetadata({\n startingState,\n playlist\n });\n });\n }\n haveMetadata({\n startingState,\n playlist\n }) {\n this.state = 'HAVE_METADATA';\n this.loadedPlaylists_[playlist.id] = playlist;\n window$1.clearTimeout(this.mediaRequest_);\n this.mediaRequest_ = null; // This will trigger loadedplaylist\n\n this.refreshMedia_(playlist.id); // fire loadedmetadata the first time a media playlist is loaded\n // to resolve setup of media groups\n\n if (startingState === 'HAVE_MAIN_MANIFEST') {\n this.trigger('loadedmetadata');\n } else {\n // trigger media change if the active media has been updated\n this.trigger('mediachange');\n }\n }\n pause() {\n this.isPaused_ = true;\n if (this.mainPlaylistLoader_.createMupOnMedia_) {\n this.off('loadedmetadata', this.mainPlaylistLoader_.createMupOnMedia_);\n this.mainPlaylistLoader_.createMupOnMedia_ = null;\n }\n this.stopRequest();\n window$1.clearTimeout(this.mediaUpdateTimeout);\n this.mediaUpdateTimeout = null;\n if (this.isMain_) {\n window$1.clearTimeout(this.mainPlaylistLoader_.minimumUpdatePeriodTimeout_);\n this.mainPlaylistLoader_.minimumUpdatePeriodTimeout_ = null;\n }\n if (this.state === 'HAVE_NOTHING') {\n // If we pause the loader before any data has been retrieved, its as if we never\n // started, so reset to an unstarted state.\n this.started = false;\n }\n }\n load(isFinalRendition) {\n this.isPaused_ = false;\n window$1.clearTimeout(this.mediaUpdateTimeout);\n this.mediaUpdateTimeout = null;\n const media = this.media();\n if (isFinalRendition) {\n const delay = media ? media.targetDuration / 2 * 1000 : 5 * 1000;\n this.mediaUpdateTimeout = window$1.setTimeout(() => this.load(), delay);\n return;\n } // because the playlists are internal to the manifest, load should either load the\n // main manifest, or do nothing but trigger an event\n\n if (!this.started) {\n this.start();\n return;\n }\n if (media && !media.endList) {\n // Check to see if this is the main loader and the MUP was cleared (this happens\n // when the loader was paused). `media` should be set at this point since one is always\n // set during `start()`.\n if (this.isMain_ && !this.minimumUpdatePeriodTimeout_) {\n // Trigger minimumUpdatePeriod to refresh the main manifest\n this.trigger('minimumUpdatePeriod'); // Since there was no prior minimumUpdatePeriodTimeout it should be recreated\n\n this.updateMinimumUpdatePeriodTimeout_();\n }\n this.trigger('mediaupdatetimeout');\n } else {\n this.trigger('loadedplaylist');\n }\n }\n start() {\n this.started = true; // We don't need to request the main manifest again\n // Call this asynchronously to match the xhr request behavior below\n\n if (!this.isMain_) {\n window$1.clearTimeout(this.mediaRequest_);\n this.mediaRequest_ = window$1.setTimeout(() => this.haveMain_(), 0);\n return;\n }\n this.requestMain_((req, mainChanged) => {\n this.haveMain_();\n if (!this.hasPendingRequest() && !this.media_) {\n this.media(this.mainPlaylistLoader_.main.playlists[0]);\n }\n });\n }\n requestMain_(cb) {\n const metadata = {\n manifestInfo: {\n uri: this.mainPlaylistLoader_.srcUrl\n }\n };\n this.trigger({\n type: 'manifestrequeststart',\n metadata\n });\n this.request = this.vhs_.xhr({\n uri: this.mainPlaylistLoader_.srcUrl,\n withCredentials: this.withCredentials,\n requestType: 'dash-manifest'\n }, (error, req) => {\n if (error) {\n const {\n requestType\n } = req;\n error.metadata = getStreamingNetworkErrorMetadata({\n requestType,\n request: req,\n error\n });\n }\n if (this.requestErrored_(error, req)) {\n if (this.state === 'HAVE_NOTHING') {\n this.started = false;\n }\n return;\n }\n this.trigger({\n type: 'manifestrequestcomplete',\n metadata\n });\n const mainChanged = req.responseText !== this.mainPlaylistLoader_.mainXml_;\n this.mainPlaylistLoader_.mainXml_ = req.responseText;\n if (req.responseHeaders && req.responseHeaders.date) {\n this.mainLoaded_ = Date.parse(req.responseHeaders.date);\n } else {\n this.mainLoaded_ = Date.now();\n }\n this.mainPlaylistLoader_.srcUrl = resolveManifestRedirect(this.mainPlaylistLoader_.srcUrl, req);\n if (mainChanged) {\n this.handleMain_();\n this.syncClientServerClock_(() => {\n return cb(req, mainChanged);\n });\n return;\n }\n return cb(req, mainChanged);\n });\n }\n /**\n * Parses the main xml for UTCTiming node to sync the client clock to the server\n * clock. If the UTCTiming node requires a HEAD or GET request, that request is made.\n *\n * @param {Function} done\n * Function to call when clock sync has completed\n */\n\n syncClientServerClock_(done) {\n const utcTiming = parseUTCTiming(this.mainPlaylistLoader_.mainXml_); // No UTCTiming element found in the mpd. Use Date header from mpd request as the\n // server clock\n\n if (utcTiming === null) {\n this.mainPlaylistLoader_.clientOffset_ = this.mainLoaded_ - Date.now();\n return done();\n }\n if (utcTiming.method === 'DIRECT') {\n this.mainPlaylistLoader_.clientOffset_ = utcTiming.value - Date.now();\n return done();\n }\n this.request = this.vhs_.xhr({\n uri: resolveUrl(this.mainPlaylistLoader_.srcUrl, utcTiming.value),\n method: utcTiming.method,\n withCredentials: this.withCredentials,\n requestType: 'dash-clock-sync'\n }, (error, req) => {\n // disposed\n if (!this.request) {\n return;\n }\n if (error) {\n const {\n requestType\n } = req;\n this.error.metadata = getStreamingNetworkErrorMetadata({\n requestType,\n request: req,\n error\n }); // sync request failed, fall back to using date header from mpd\n // TODO: log warning\n\n this.mainPlaylistLoader_.clientOffset_ = this.mainLoaded_ - Date.now();\n return done();\n }\n let serverTime;\n if (utcTiming.method === 'HEAD') {\n if (!req.responseHeaders || !req.responseHeaders.date) {\n // expected date header not preset, fall back to using date header from mpd\n // TODO: log warning\n serverTime = this.mainLoaded_;\n } else {\n serverTime = Date.parse(req.responseHeaders.date);\n }\n } else {\n serverTime = Date.parse(req.responseText);\n }\n this.mainPlaylistLoader_.clientOffset_ = serverTime - Date.now();\n done();\n });\n }\n haveMain_() {\n this.state = 'HAVE_MAIN_MANIFEST';\n if (this.isMain_) {\n // We have the main playlist at this point, so\n // trigger this to allow PlaylistController\n // to make an initial playlist selection\n this.trigger('loadedplaylist');\n } else if (!this.media_) {\n // no media playlist was specifically selected so select\n // the one the child playlist loader was created with\n this.media(this.childPlaylist_);\n }\n }\n handleMain_() {\n // clear media request\n window$1.clearTimeout(this.mediaRequest_);\n this.mediaRequest_ = null;\n const oldMain = this.mainPlaylistLoader_.main;\n const metadata = {\n manifestInfo: {\n uri: this.mainPlaylistLoader_.srcUrl\n }\n };\n this.trigger({\n type: 'manifestparsestart',\n metadata\n });\n let newMain;\n try {\n newMain = parseMainXml({\n mainXml: this.mainPlaylistLoader_.mainXml_,\n srcUrl: this.mainPlaylistLoader_.srcUrl,\n clientOffset: this.mainPlaylistLoader_.clientOffset_,\n sidxMapping: this.mainPlaylistLoader_.sidxMapping_,\n previousManifest: oldMain\n });\n } catch (error) {\n this.error = error;\n this.error.metadata = {\n errorType: videojs.Error.StreamingDashManifestParserError,\n error\n };\n this.trigger('error');\n } // if we have an old main to compare the new main against\n\n if (oldMain) {\n newMain = updateMain(oldMain, newMain, this.mainPlaylistLoader_.sidxMapping_);\n } // only update main if we have a new main\n\n this.mainPlaylistLoader_.main = newMain ? newMain : oldMain;\n const location = this.mainPlaylistLoader_.main.locations && this.mainPlaylistLoader_.main.locations[0];\n if (location && location !== this.mainPlaylistLoader_.srcUrl) {\n this.mainPlaylistLoader_.srcUrl = location;\n }\n if (!oldMain || newMain && newMain.minimumUpdatePeriod !== oldMain.minimumUpdatePeriod) {\n this.updateMinimumUpdatePeriodTimeout_();\n }\n this.addEventStreamToMetadataTrack_(newMain);\n if (newMain) {\n const {\n duration,\n endList\n } = newMain;\n const renditions = [];\n newMain.playlists.forEach(playlist => {\n renditions.push({\n id: playlist.id,\n bandwidth: playlist.attributes.BANDWIDTH,\n resolution: playlist.attributes.RESOLUTION,\n codecs: playlist.attributes.CODECS\n });\n });\n const parsedManifest = {\n duration,\n isLive: !endList,\n renditions\n };\n metadata.parsedManifest = parsedManifest;\n this.trigger({\n type: 'manifestparsecomplete',\n metadata\n });\n }\n return Boolean(newMain);\n }\n updateMinimumUpdatePeriodTimeout_() {\n const mpl = this.mainPlaylistLoader_; // cancel any pending creation of mup on media\n // a new one will be added if needed.\n\n if (mpl.createMupOnMedia_) {\n mpl.off('loadedmetadata', mpl.createMupOnMedia_);\n mpl.createMupOnMedia_ = null;\n } // clear any pending timeouts\n\n if (mpl.minimumUpdatePeriodTimeout_) {\n window$1.clearTimeout(mpl.minimumUpdatePeriodTimeout_);\n mpl.minimumUpdatePeriodTimeout_ = null;\n }\n let mup = mpl.main && mpl.main.minimumUpdatePeriod; // If the minimumUpdatePeriod has a value of 0, that indicates that the current\n // MPD has no future validity, so a new one will need to be acquired when new\n // media segments are to be made available. Thus, we use the target duration\n // in this case\n\n if (mup === 0) {\n if (mpl.media()) {\n mup = mpl.media().targetDuration * 1000;\n } else {\n mpl.createMupOnMedia_ = mpl.updateMinimumUpdatePeriodTimeout_;\n mpl.one('loadedmetadata', mpl.createMupOnMedia_);\n }\n } // if minimumUpdatePeriod is invalid or <= zero, which\n // can happen when a live video becomes VOD. skip timeout\n // creation.\n\n if (typeof mup !== 'number' || mup <= 0) {\n if (mup < 0) {\n this.logger_(`found invalid minimumUpdatePeriod of ${mup}, not setting a timeout`);\n }\n return;\n }\n this.createMUPTimeout_(mup);\n }\n createMUPTimeout_(mup) {\n const mpl = this.mainPlaylistLoader_;\n mpl.minimumUpdatePeriodTimeout_ = window$1.setTimeout(() => {\n mpl.minimumUpdatePeriodTimeout_ = null;\n mpl.trigger('minimumUpdatePeriod');\n mpl.createMUPTimeout_(mup);\n }, mup);\n }\n /**\n * Sends request to refresh the main xml and updates the parsed main manifest\n */\n\n refreshXml_() {\n this.requestMain_((req, mainChanged) => {\n if (!mainChanged) {\n return;\n }\n if (this.media_) {\n this.media_ = this.mainPlaylistLoader_.main.playlists[this.media_.id];\n } // This will filter out updated sidx info from the mapping\n\n this.mainPlaylistLoader_.sidxMapping_ = filterChangedSidxMappings(this.mainPlaylistLoader_.main, this.mainPlaylistLoader_.sidxMapping_);\n this.addSidxSegments_(this.media(), this.state, sidxChanged => {\n // TODO: do we need to reload the current playlist?\n this.refreshMedia_(this.media().id);\n });\n });\n }\n /**\n * Refreshes the media playlist by re-parsing the main xml and updating playlist\n * references. If this is an alternate loader, the updated parsed manifest is retrieved\n * from the main loader.\n */\n\n refreshMedia_(mediaID) {\n if (!mediaID) {\n throw new Error('refreshMedia_ must take a media id');\n } // for main we have to reparse the main xml\n // to re-create segments based on current timing values\n // which may change media. We only skip updating the main manifest\n // if this is the first time this.media_ is being set.\n // as main was just parsed in that case.\n\n if (this.media_ && this.isMain_) {\n this.handleMain_();\n }\n const playlists = this.mainPlaylistLoader_.main.playlists;\n const mediaChanged = !this.media_ || this.media_ !== playlists[mediaID];\n if (mediaChanged) {\n this.media_ = playlists[mediaID];\n } else {\n this.trigger('playlistunchanged');\n }\n if (!this.mediaUpdateTimeout) {\n const createMediaUpdateTimeout = () => {\n if (this.media().endList) {\n return;\n }\n this.mediaUpdateTimeout = window$1.setTimeout(() => {\n this.trigger('mediaupdatetimeout');\n createMediaUpdateTimeout();\n }, refreshDelay(this.media(), Boolean(mediaChanged)));\n };\n createMediaUpdateTimeout();\n }\n this.trigger('loadedplaylist');\n }\n /**\n * Takes eventstream data from a parsed DASH manifest and adds it to the metadata text track.\n *\n * @param {manifest} newMain the newly parsed manifest\n */\n\n addEventStreamToMetadataTrack_(newMain) {\n // Only add new event stream metadata if we have a new manifest.\n if (newMain && this.mainPlaylistLoader_.main.eventStream) {\n // convert EventStream to ID3-like data.\n const metadataArray = this.mainPlaylistLoader_.main.eventStream.map(eventStreamNode => {\n return {\n cueTime: eventStreamNode.start,\n frames: [{\n data: eventStreamNode.messageData\n }]\n };\n });\n this.addMetadataToTextTrack('EventStream', metadataArray, this.mainPlaylistLoader_.main.duration);\n }\n }\n /**\n * Returns the key ID set from a playlist\n *\n * @param {playlist} playlist to fetch the key ID set from.\n * @return a Set of 32 digit hex strings that represent the unique keyIds for that playlist.\n */\n\n getKeyIdSet(playlist) {\n if (playlist.contentProtection) {\n const keyIds = new Set();\n for (const keysystem in playlist.contentProtection) {\n const defaultKID = playlist.contentProtection[keysystem].attributes['cenc:default_KID'];\n if (defaultKID) {\n // DASH keyIds are separated by dashes.\n keyIds.add(defaultKID.replace(/-/g, '').toLowerCase());\n }\n }\n return keyIds;\n }\n }\n}\nvar Config = {\n GOAL_BUFFER_LENGTH: 30,\n MAX_GOAL_BUFFER_LENGTH: 60,\n BACK_BUFFER_LENGTH: 30,\n GOAL_BUFFER_LENGTH_RATE: 1,\n // 0.5 MB/s\n INITIAL_BANDWIDTH: 4194304,\n // A fudge factor to apply to advertised playlist bitrates to account for\n // temporary flucations in client bandwidth\n BANDWIDTH_VARIANCE: 1.2,\n // How much of the buffer must be filled before we consider upswitching\n BUFFER_LOW_WATER_LINE: 0,\n MAX_BUFFER_LOW_WATER_LINE: 30,\n // TODO: Remove this when experimentalBufferBasedABR is removed\n EXPERIMENTAL_MAX_BUFFER_LOW_WATER_LINE: 16,\n BUFFER_LOW_WATER_LINE_RATE: 1,\n // If the buffer is greater than the high water line, we won't switch down\n BUFFER_HIGH_WATER_LINE: 30\n};\nconst stringToArrayBuffer = string => {\n const view = new Uint8Array(new ArrayBuffer(string.length));\n for (let i = 0; i < string.length; i++) {\n view[i] = string.charCodeAt(i);\n }\n return view.buffer;\n};\n\n/* global Blob, BlobBuilder, Worker */\n// unify worker interface\nconst browserWorkerPolyFill = function (workerObj) {\n // node only supports on/off\n workerObj.on = workerObj.addEventListener;\n workerObj.off = workerObj.removeEventListener;\n return workerObj;\n};\nconst createObjectURL = function (str) {\n try {\n return URL.createObjectURL(new Blob([str], {\n type: 'application/javascript'\n }));\n } catch (e) {\n const blob = new BlobBuilder();\n blob.append(str);\n return URL.createObjectURL(blob.getBlob());\n }\n};\nconst factory = function (code) {\n return function () {\n const objectUrl = createObjectURL(code);\n const worker = browserWorkerPolyFill(new Worker(objectUrl));\n worker.objURL = objectUrl;\n const terminate = worker.terminate;\n worker.on = worker.addEventListener;\n worker.off = worker.removeEventListener;\n worker.terminate = function () {\n URL.revokeObjectURL(objectUrl);\n return terminate.call(this);\n };\n return worker;\n };\n};\nconst transform = function (code) {\n return `var browserWorkerPolyFill = ${browserWorkerPolyFill.toString()};\\n` + 'browserWorkerPolyFill(self);\\n' + code;\n};\nconst getWorkerString = function (fn) {\n return fn.toString().replace(/^function.+?{/, '').slice(0, -1);\n};\n\n/* rollup-plugin-worker-factory start for worker!/home/runner/work/http-streaming/http-streaming/src/transmuxer-worker.js */\nconst workerCode$1 = transform(getWorkerString(function () {\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * A lightweight readable stream implemention that handles event dispatching.\n * Objects that inherit from streams should call init in their constructors.\n */\n\n var Stream$8 = function () {\n this.init = function () {\n var listeners = {};\n /**\n * Add a listener for a specified event type.\n * @param type {string} the event name\n * @param listener {function} the callback to be invoked when an event of\n * the specified type occurs\n */\n\n this.on = function (type, listener) {\n if (!listeners[type]) {\n listeners[type] = [];\n }\n listeners[type] = listeners[type].concat(listener);\n };\n /**\n * Remove a listener for a specified event type.\n * @param type {string} the event name\n * @param listener {function} a function previously registered for this\n * type of event through `on`\n */\n\n this.off = function (type, listener) {\n var index;\n if (!listeners[type]) {\n return false;\n }\n index = listeners[type].indexOf(listener);\n listeners[type] = listeners[type].slice();\n listeners[type].splice(index, 1);\n return index > -1;\n };\n /**\n * Trigger an event of the specified type on this stream. Any additional\n * arguments to this function are passed as parameters to event listeners.\n * @param type {string} the event name\n */\n\n this.trigger = function (type) {\n var callbacks, i, length, args;\n callbacks = listeners[type];\n if (!callbacks) {\n return;\n } // Slicing the arguments on every invocation of this method\n // can add a significant amount of overhead. Avoid the\n // intermediate object creation for the common case of a\n // single callback argument\n\n if (arguments.length === 2) {\n length = callbacks.length;\n for (i = 0; i < length; ++i) {\n callbacks[i].call(this, arguments[1]);\n }\n } else {\n args = [];\n i = arguments.length;\n for (i = 1; i < arguments.length; ++i) {\n args.push(arguments[i]);\n }\n length = callbacks.length;\n for (i = 0; i < length; ++i) {\n callbacks[i].apply(this, args);\n }\n }\n };\n /**\n * Destroys the stream and cleans up.\n */\n\n this.dispose = function () {\n listeners = {};\n };\n };\n };\n /**\n * Forwards all `data` events on this stream to the destination stream. The\n * destination stream should provide a method `push` to receive the data\n * events as they arrive.\n * @param destination {stream} the stream that will receive all `data` events\n * @param autoFlush {boolean} if false, we will not call `flush` on the destination\n * when the current stream emits a 'done' event\n * @see http://nodejs.org/api/stream.html#stream_readable_pipe_destination_options\n */\n\n Stream$8.prototype.pipe = function (destination) {\n this.on('data', function (data) {\n destination.push(data);\n });\n this.on('done', function (flushSource) {\n destination.flush(flushSource);\n });\n this.on('partialdone', function (flushSource) {\n destination.partialFlush(flushSource);\n });\n this.on('endedtimeline', function (flushSource) {\n destination.endTimeline(flushSource);\n });\n this.on('reset', function (flushSource) {\n destination.reset(flushSource);\n });\n return destination;\n }; // Default stream functions that are expected to be overridden to perform\n // actual work. These are provided by the prototype as a sort of no-op\n // implementation so that we don't have to check for their existence in the\n // `pipe` function above.\n\n Stream$8.prototype.push = function (data) {\n this.trigger('data', data);\n };\n Stream$8.prototype.flush = function (flushSource) {\n this.trigger('done', flushSource);\n };\n Stream$8.prototype.partialFlush = function (flushSource) {\n this.trigger('partialdone', flushSource);\n };\n Stream$8.prototype.endTimeline = function (flushSource) {\n this.trigger('endedtimeline', flushSource);\n };\n Stream$8.prototype.reset = function (flushSource) {\n this.trigger('reset', flushSource);\n };\n var stream = Stream$8;\n var MAX_UINT32$1 = Math.pow(2, 32);\n var getUint64$5 = function (uint8) {\n var dv = new DataView(uint8.buffer, uint8.byteOffset, uint8.byteLength);\n var value;\n if (dv.getBigUint64) {\n value = dv.getBigUint64(0);\n if (value < Number.MAX_SAFE_INTEGER) {\n return Number(value);\n }\n return value;\n }\n return dv.getUint32(0) * MAX_UINT32$1 + dv.getUint32(4);\n };\n var numbers = {\n getUint64: getUint64$5,\n MAX_UINT32: MAX_UINT32$1\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Functions that generate fragmented MP4s suitable for use with Media\n * Source Extensions.\n */\n\n var MAX_UINT32 = numbers.MAX_UINT32;\n var box, dinf, esds, ftyp, mdat, mfhd, minf, moof, moov, mvex, mvhd, trak, tkhd, mdia, mdhd, hdlr, sdtp, stbl, stsd, traf, trex, trun$1, types, MAJOR_BRAND, MINOR_VERSION, AVC1_BRAND, VIDEO_HDLR, AUDIO_HDLR, HDLR_TYPES, VMHD, SMHD, DREF, STCO, STSC, STSZ, STTS; // pre-calculate constants\n\n (function () {\n var i;\n types = {\n avc1: [],\n // codingname\n avcC: [],\n btrt: [],\n dinf: [],\n dref: [],\n esds: [],\n ftyp: [],\n hdlr: [],\n mdat: [],\n mdhd: [],\n mdia: [],\n mfhd: [],\n minf: [],\n moof: [],\n moov: [],\n mp4a: [],\n // codingname\n mvex: [],\n mvhd: [],\n pasp: [],\n sdtp: [],\n smhd: [],\n stbl: [],\n stco: [],\n stsc: [],\n stsd: [],\n stsz: [],\n stts: [],\n styp: [],\n tfdt: [],\n tfhd: [],\n traf: [],\n trak: [],\n trun: [],\n trex: [],\n tkhd: [],\n vmhd: []\n }; // In environments where Uint8Array is undefined (e.g., IE8), skip set up so that we\n // don't throw an error\n\n if (typeof Uint8Array === 'undefined') {\n return;\n }\n for (i in types) {\n if (types.hasOwnProperty(i)) {\n types[i] = [i.charCodeAt(0), i.charCodeAt(1), i.charCodeAt(2), i.charCodeAt(3)];\n }\n }\n MAJOR_BRAND = new Uint8Array(['i'.charCodeAt(0), 's'.charCodeAt(0), 'o'.charCodeAt(0), 'm'.charCodeAt(0)]);\n AVC1_BRAND = new Uint8Array(['a'.charCodeAt(0), 'v'.charCodeAt(0), 'c'.charCodeAt(0), '1'.charCodeAt(0)]);\n MINOR_VERSION = new Uint8Array([0, 0, 0, 1]);\n VIDEO_HDLR = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x00,\n // pre_defined\n 0x76, 0x69, 0x64, 0x65,\n // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x56, 0x69, 0x64, 0x65, 0x6f, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'VideoHandler'\n ]);\n AUDIO_HDLR = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x00,\n // pre_defined\n 0x73, 0x6f, 0x75, 0x6e,\n // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x00 // name: 'SoundHandler'\n ]);\n HDLR_TYPES = {\n video: VIDEO_HDLR,\n audio: AUDIO_HDLR\n };\n DREF = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x01,\n // entry_count\n 0x00, 0x00, 0x00, 0x0c,\n // entry_size\n 0x75, 0x72, 0x6c, 0x20,\n // 'url' type\n 0x00,\n // version 0\n 0x00, 0x00, 0x01 // entry_flags\n ]);\n SMHD = new Uint8Array([0x00,\n // version\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00,\n // balance, 0 means centered\n 0x00, 0x00 // reserved\n ]);\n STCO = new Uint8Array([0x00,\n // version\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ]);\n STSC = STCO;\n STSZ = new Uint8Array([0x00,\n // version\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x00,\n // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]);\n STTS = STCO;\n VMHD = new Uint8Array([0x00,\n // version\n 0x00, 0x00, 0x01,\n // flags\n 0x00, 0x00,\n // graphicsmode\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // opcolor\n ]);\n })();\n box = function (type) {\n var payload = [],\n size = 0,\n i,\n result,\n view;\n for (i = 1; i < arguments.length; i++) {\n payload.push(arguments[i]);\n }\n i = payload.length; // calculate the total size we need to allocate\n\n while (i--) {\n size += payload[i].byteLength;\n }\n result = new Uint8Array(size + 8);\n view = new DataView(result.buffer, result.byteOffset, result.byteLength);\n view.setUint32(0, result.byteLength);\n result.set(type, 4); // copy the payload into the result\n\n for (i = 0, size = 8; i < payload.length; i++) {\n result.set(payload[i], size);\n size += payload[i].byteLength;\n }\n return result;\n };\n dinf = function () {\n return box(types.dinf, box(types.dref, DREF));\n };\n esds = function (track) {\n return box(types.esds, new Uint8Array([0x00,\n // version\n 0x00, 0x00, 0x00,\n // flags\n // ES_Descriptor\n 0x03,\n // tag, ES_DescrTag\n 0x19,\n // length\n 0x00, 0x00,\n // ES_ID\n 0x00,\n // streamDependenceFlag, URL_flag, reserved, streamPriority\n // DecoderConfigDescriptor\n 0x04,\n // tag, DecoderConfigDescrTag\n 0x11,\n // length\n 0x40,\n // object type\n 0x15,\n // streamType\n 0x00, 0x06, 0x00,\n // bufferSizeDB\n 0x00, 0x00, 0xda, 0xc0,\n // maxBitrate\n 0x00, 0x00, 0xda, 0xc0,\n // avgBitrate\n // DecoderSpecificInfo\n 0x05,\n // tag, DecoderSpecificInfoTag\n 0x02,\n // length\n // ISO/IEC 14496-3, AudioSpecificConfig\n // for samplingFrequencyIndex see ISO/IEC 13818-7:2006, 8.1.3.2.2, Table 35\n track.audioobjecttype << 3 | track.samplingfrequencyindex >>> 1, track.samplingfrequencyindex << 7 | track.channelcount << 3, 0x06, 0x01, 0x02 // GASpecificConfig\n ]));\n };\n ftyp = function () {\n return box(types.ftyp, MAJOR_BRAND, MINOR_VERSION, MAJOR_BRAND, AVC1_BRAND);\n };\n hdlr = function (type) {\n return box(types.hdlr, HDLR_TYPES[type]);\n };\n mdat = function (data) {\n return box(types.mdat, data);\n };\n mdhd = function (track) {\n var result = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x02,\n // creation_time\n 0x00, 0x00, 0x00, 0x03,\n // modification_time\n 0x00, 0x01, 0x5f, 0x90,\n // timescale, 90,000 \"ticks\" per second\n track.duration >>> 24 & 0xFF, track.duration >>> 16 & 0xFF, track.duration >>> 8 & 0xFF, track.duration & 0xFF,\n // duration\n 0x55, 0xc4,\n // 'und' language (undetermined)\n 0x00, 0x00]); // Use the sample rate from the track metadata, when it is\n // defined. The sample rate can be parsed out of an ADTS header, for\n // instance.\n\n if (track.samplerate) {\n result[12] = track.samplerate >>> 24 & 0xFF;\n result[13] = track.samplerate >>> 16 & 0xFF;\n result[14] = track.samplerate >>> 8 & 0xFF;\n result[15] = track.samplerate & 0xFF;\n }\n return box(types.mdhd, result);\n };\n mdia = function (track) {\n return box(types.mdia, mdhd(track), hdlr(track.type), minf(track));\n };\n mfhd = function (sequenceNumber) {\n return box(types.mfhd, new Uint8Array([0x00, 0x00, 0x00, 0x00,\n // flags\n (sequenceNumber & 0xFF000000) >> 24, (sequenceNumber & 0xFF0000) >> 16, (sequenceNumber & 0xFF00) >> 8, sequenceNumber & 0xFF // sequence_number\n ]));\n };\n minf = function (track) {\n return box(types.minf, track.type === 'video' ? box(types.vmhd, VMHD) : box(types.smhd, SMHD), dinf(), stbl(track));\n };\n moof = function (sequenceNumber, tracks) {\n var trackFragments = [],\n i = tracks.length; // build traf boxes for each track fragment\n\n while (i--) {\n trackFragments[i] = traf(tracks[i]);\n }\n return box.apply(null, [types.moof, mfhd(sequenceNumber)].concat(trackFragments));\n };\n /**\n * Returns a movie box.\n * @param tracks {array} the tracks associated with this movie\n * @see ISO/IEC 14496-12:2012(E), section 8.2.1\n */\n\n moov = function (tracks) {\n var i = tracks.length,\n boxes = [];\n while (i--) {\n boxes[i] = trak(tracks[i]);\n }\n return box.apply(null, [types.moov, mvhd(0xffffffff)].concat(boxes).concat(mvex(tracks)));\n };\n mvex = function (tracks) {\n var i = tracks.length,\n boxes = [];\n while (i--) {\n boxes[i] = trex(tracks[i]);\n }\n return box.apply(null, [types.mvex].concat(boxes));\n };\n mvhd = function (duration) {\n var bytes = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x01,\n // creation_time\n 0x00, 0x00, 0x00, 0x02,\n // modification_time\n 0x00, 0x01, 0x5f, 0x90,\n // timescale, 90,000 \"ticks\" per second\n (duration & 0xFF000000) >> 24, (duration & 0xFF0000) >> 16, (duration & 0xFF00) >> 8, duration & 0xFF,\n // duration\n 0x00, 0x01, 0x00, 0x00,\n // 1.0 rate\n 0x01, 0x00,\n // 1.0 volume\n 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,\n // transformation: unity matrix\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n // pre_defined\n 0xff, 0xff, 0xff, 0xff // next_track_ID\n ]);\n return box(types.mvhd, bytes);\n };\n sdtp = function (track) {\n var samples = track.samples || [],\n bytes = new Uint8Array(4 + samples.length),\n flags,\n i; // leave the full box header (4 bytes) all zero\n // write the sample table\n\n for (i = 0; i < samples.length; i++) {\n flags = samples[i].flags;\n bytes[i + 4] = flags.dependsOn << 4 | flags.isDependedOn << 2 | flags.hasRedundancy;\n }\n return box(types.sdtp, bytes);\n };\n stbl = function (track) {\n return box(types.stbl, stsd(track), box(types.stts, STTS), box(types.stsc, STSC), box(types.stsz, STSZ), box(types.stco, STCO));\n };\n (function () {\n var videoSample, audioSample;\n stsd = function (track) {\n return box(types.stsd, new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n 0x00, 0x00, 0x00, 0x01]), track.type === 'video' ? videoSample(track) : audioSample(track));\n };\n videoSample = function (track) {\n var sps = track.sps || [],\n pps = track.pps || [],\n sequenceParameterSets = [],\n pictureParameterSets = [],\n i,\n avc1Box; // assemble the SPSs\n\n for (i = 0; i < sps.length; i++) {\n sequenceParameterSets.push((sps[i].byteLength & 0xFF00) >>> 8);\n sequenceParameterSets.push(sps[i].byteLength & 0xFF); // sequenceParameterSetLength\n\n sequenceParameterSets = sequenceParameterSets.concat(Array.prototype.slice.call(sps[i])); // SPS\n } // assemble the PPSs\n\n for (i = 0; i < pps.length; i++) {\n pictureParameterSets.push((pps[i].byteLength & 0xFF00) >>> 8);\n pictureParameterSets.push(pps[i].byteLength & 0xFF);\n pictureParameterSets = pictureParameterSets.concat(Array.prototype.slice.call(pps[i]));\n }\n avc1Box = [types.avc1, new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x01,\n // data_reference_index\n 0x00, 0x00,\n // pre_defined\n 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n // pre_defined\n (track.width & 0xff00) >> 8, track.width & 0xff,\n // width\n (track.height & 0xff00) >> 8, track.height & 0xff,\n // height\n 0x00, 0x48, 0x00, 0x00,\n // horizresolution\n 0x00, 0x48, 0x00, 0x00,\n // vertresolution\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x01,\n // frame_count\n 0x13, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x6a, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x2d, 0x68, 0x6c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n // compressorname\n 0x00, 0x18,\n // depth = 24\n 0x11, 0x11 // pre_defined = -1\n ]), box(types.avcC, new Uint8Array([0x01,\n // configurationVersion\n track.profileIdc,\n // AVCProfileIndication\n track.profileCompatibility,\n // profile_compatibility\n track.levelIdc,\n // AVCLevelIndication\n 0xff // lengthSizeMinusOne, hard-coded to 4 bytes\n ].concat([sps.length],\n // numOfSequenceParameterSets\n sequenceParameterSets,\n // \"SPS\"\n [pps.length],\n // numOfPictureParameterSets\n pictureParameterSets // \"PPS\"\n ))), box(types.btrt, new Uint8Array([0x00, 0x1c, 0x9c, 0x80,\n // bufferSizeDB\n 0x00, 0x2d, 0xc6, 0xc0,\n // maxBitrate\n 0x00, 0x2d, 0xc6, 0xc0 // avgBitrate\n ]))];\n if (track.sarRatio) {\n var hSpacing = track.sarRatio[0],\n vSpacing = track.sarRatio[1];\n avc1Box.push(box(types.pasp, new Uint8Array([(hSpacing & 0xFF000000) >> 24, (hSpacing & 0xFF0000) >> 16, (hSpacing & 0xFF00) >> 8, hSpacing & 0xFF, (vSpacing & 0xFF000000) >> 24, (vSpacing & 0xFF0000) >> 16, (vSpacing & 0xFF00) >> 8, vSpacing & 0xFF])));\n }\n return box.apply(null, avc1Box);\n };\n audioSample = function (track) {\n return box(types.mp4a, new Uint8Array([\n // SampleEntry, ISO/IEC 14496-12\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x01,\n // data_reference_index\n // AudioSampleEntry, ISO/IEC 14496-12\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n (track.channelcount & 0xff00) >> 8, track.channelcount & 0xff,\n // channelcount\n (track.samplesize & 0xff00) >> 8, track.samplesize & 0xff,\n // samplesize\n 0x00, 0x00,\n // pre_defined\n 0x00, 0x00,\n // reserved\n (track.samplerate & 0xff00) >> 8, track.samplerate & 0xff, 0x00, 0x00 // samplerate, 16.16\n // MP4AudioSampleEntry, ISO/IEC 14496-14\n ]), esds(track));\n };\n })();\n tkhd = function (track) {\n var result = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x07,\n // flags\n 0x00, 0x00, 0x00, 0x00,\n // creation_time\n 0x00, 0x00, 0x00, 0x00,\n // modification_time\n (track.id & 0xFF000000) >> 24, (track.id & 0xFF0000) >> 16, (track.id & 0xFF00) >> 8, track.id & 0xFF,\n // track_ID\n 0x00, 0x00, 0x00, 0x00,\n // reserved\n (track.duration & 0xFF000000) >> 24, (track.duration & 0xFF0000) >> 16, (track.duration & 0xFF00) >> 8, track.duration & 0xFF,\n // duration\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n // reserved\n 0x00, 0x00,\n // layer\n 0x00, 0x00,\n // alternate_group\n 0x01, 0x00,\n // non-audio track volume\n 0x00, 0x00,\n // reserved\n 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,\n // transformation: unity matrix\n (track.width & 0xFF00) >> 8, track.width & 0xFF, 0x00, 0x00,\n // width\n (track.height & 0xFF00) >> 8, track.height & 0xFF, 0x00, 0x00 // height\n ]);\n return box(types.tkhd, result);\n };\n /**\n * Generate a track fragment (traf) box. A traf box collects metadata\n * about tracks in a movie fragment (moof) box.\n */\n\n traf = function (track) {\n var trackFragmentHeader, trackFragmentDecodeTime, trackFragmentRun, sampleDependencyTable, dataOffset, upperWordBaseMediaDecodeTime, lowerWordBaseMediaDecodeTime;\n trackFragmentHeader = box(types.tfhd, new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x3a,\n // flags\n (track.id & 0xFF000000) >> 24, (track.id & 0xFF0000) >> 16, (track.id & 0xFF00) >> 8, track.id & 0xFF,\n // track_ID\n 0x00, 0x00, 0x00, 0x01,\n // sample_description_index\n 0x00, 0x00, 0x00, 0x00,\n // default_sample_duration\n 0x00, 0x00, 0x00, 0x00,\n // default_sample_size\n 0x00, 0x00, 0x00, 0x00 // default_sample_flags\n ]));\n upperWordBaseMediaDecodeTime = Math.floor(track.baseMediaDecodeTime / MAX_UINT32);\n lowerWordBaseMediaDecodeTime = Math.floor(track.baseMediaDecodeTime % MAX_UINT32);\n trackFragmentDecodeTime = box(types.tfdt, new Uint8Array([0x01,\n // version 1\n 0x00, 0x00, 0x00,\n // flags\n // baseMediaDecodeTime\n upperWordBaseMediaDecodeTime >>> 24 & 0xFF, upperWordBaseMediaDecodeTime >>> 16 & 0xFF, upperWordBaseMediaDecodeTime >>> 8 & 0xFF, upperWordBaseMediaDecodeTime & 0xFF, lowerWordBaseMediaDecodeTime >>> 24 & 0xFF, lowerWordBaseMediaDecodeTime >>> 16 & 0xFF, lowerWordBaseMediaDecodeTime >>> 8 & 0xFF, lowerWordBaseMediaDecodeTime & 0xFF])); // the data offset specifies the number of bytes from the start of\n // the containing moof to the first payload byte of the associated\n // mdat\n\n dataOffset = 32 +\n // tfhd\n 20 +\n // tfdt\n 8 +\n // traf header\n 16 +\n // mfhd\n 8 +\n // moof header\n 8; // mdat header\n // audio tracks require less metadata\n\n if (track.type === 'audio') {\n trackFragmentRun = trun$1(track, dataOffset);\n return box(types.traf, trackFragmentHeader, trackFragmentDecodeTime, trackFragmentRun);\n } // video tracks should contain an independent and disposable samples\n // box (sdtp)\n // generate one and adjust offsets to match\n\n sampleDependencyTable = sdtp(track);\n trackFragmentRun = trun$1(track, sampleDependencyTable.length + dataOffset);\n return box(types.traf, trackFragmentHeader, trackFragmentDecodeTime, trackFragmentRun, sampleDependencyTable);\n };\n /**\n * Generate a track box.\n * @param track {object} a track definition\n * @return {Uint8Array} the track box\n */\n\n trak = function (track) {\n track.duration = track.duration || 0xffffffff;\n return box(types.trak, tkhd(track), mdia(track));\n };\n trex = function (track) {\n var result = new Uint8Array([0x00,\n // version 0\n 0x00, 0x00, 0x00,\n // flags\n (track.id & 0xFF000000) >> 24, (track.id & 0xFF0000) >> 16, (track.id & 0xFF00) >> 8, track.id & 0xFF,\n // track_ID\n 0x00, 0x00, 0x00, 0x01,\n // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00,\n // default_sample_duration\n 0x00, 0x00, 0x00, 0x00,\n // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]); // the last two bytes of default_sample_flags is the sample\n // degradation priority, a hint about the importance of this sample\n // relative to others. Lower the degradation priority for all sample\n // types other than video.\n\n if (track.type !== 'video') {\n result[result.length - 1] = 0x00;\n }\n return box(types.trex, result);\n };\n (function () {\n var audioTrun, videoTrun, trunHeader; // This method assumes all samples are uniform. That is, if a\n // duration is present for the first sample, it will be present for\n // all subsequent samples.\n // see ISO/IEC 14496-12:2012, Section 8.8.8.1\n\n trunHeader = function (samples, offset) {\n var durationPresent = 0,\n sizePresent = 0,\n flagsPresent = 0,\n compositionTimeOffset = 0; // trun flag constants\n\n if (samples.length) {\n if (samples[0].duration !== undefined) {\n durationPresent = 0x1;\n }\n if (samples[0].size !== undefined) {\n sizePresent = 0x2;\n }\n if (samples[0].flags !== undefined) {\n flagsPresent = 0x4;\n }\n if (samples[0].compositionTimeOffset !== undefined) {\n compositionTimeOffset = 0x8;\n }\n }\n return [0x00,\n // version 0\n 0x00, durationPresent | sizePresent | flagsPresent | compositionTimeOffset, 0x01,\n // flags\n (samples.length & 0xFF000000) >>> 24, (samples.length & 0xFF0000) >>> 16, (samples.length & 0xFF00) >>> 8, samples.length & 0xFF,\n // sample_count\n (offset & 0xFF000000) >>> 24, (offset & 0xFF0000) >>> 16, (offset & 0xFF00) >>> 8, offset & 0xFF // data_offset\n ];\n };\n videoTrun = function (track, offset) {\n var bytesOffest, bytes, header, samples, sample, i;\n samples = track.samples || [];\n offset += 8 + 12 + 16 * samples.length;\n header = trunHeader(samples, offset);\n bytes = new Uint8Array(header.length + samples.length * 16);\n bytes.set(header);\n bytesOffest = header.length;\n for (i = 0; i < samples.length; i++) {\n sample = samples[i];\n bytes[bytesOffest++] = (sample.duration & 0xFF000000) >>> 24;\n bytes[bytesOffest++] = (sample.duration & 0xFF0000) >>> 16;\n bytes[bytesOffest++] = (sample.duration & 0xFF00) >>> 8;\n bytes[bytesOffest++] = sample.duration & 0xFF; // sample_duration\n\n bytes[bytesOffest++] = (sample.size & 0xFF000000) >>> 24;\n bytes[bytesOffest++] = (sample.size & 0xFF0000) >>> 16;\n bytes[bytesOffest++] = (sample.size & 0xFF00) >>> 8;\n bytes[bytesOffest++] = sample.size & 0xFF; // sample_size\n\n bytes[bytesOffest++] = sample.flags.isLeading << 2 | sample.flags.dependsOn;\n bytes[bytesOffest++] = sample.flags.isDependedOn << 6 | sample.flags.hasRedundancy << 4 | sample.flags.paddingValue << 1 | sample.flags.isNonSyncSample;\n bytes[bytesOffest++] = sample.flags.degradationPriority & 0xF0 << 8;\n bytes[bytesOffest++] = sample.flags.degradationPriority & 0x0F; // sample_flags\n\n bytes[bytesOffest++] = (sample.compositionTimeOffset & 0xFF000000) >>> 24;\n bytes[bytesOffest++] = (sample.compositionTimeOffset & 0xFF0000) >>> 16;\n bytes[bytesOffest++] = (sample.compositionTimeOffset & 0xFF00) >>> 8;\n bytes[bytesOffest++] = sample.compositionTimeOffset & 0xFF; // sample_composition_time_offset\n }\n return box(types.trun, bytes);\n };\n audioTrun = function (track, offset) {\n var bytes, bytesOffest, header, samples, sample, i;\n samples = track.samples || [];\n offset += 8 + 12 + 8 * samples.length;\n header = trunHeader(samples, offset);\n bytes = new Uint8Array(header.length + samples.length * 8);\n bytes.set(header);\n bytesOffest = header.length;\n for (i = 0; i < samples.length; i++) {\n sample = samples[i];\n bytes[bytesOffest++] = (sample.duration & 0xFF000000) >>> 24;\n bytes[bytesOffest++] = (sample.duration & 0xFF0000) >>> 16;\n bytes[bytesOffest++] = (sample.duration & 0xFF00) >>> 8;\n bytes[bytesOffest++] = sample.duration & 0xFF; // sample_duration\n\n bytes[bytesOffest++] = (sample.size & 0xFF000000) >>> 24;\n bytes[bytesOffest++] = (sample.size & 0xFF0000) >>> 16;\n bytes[bytesOffest++] = (sample.size & 0xFF00) >>> 8;\n bytes[bytesOffest++] = sample.size & 0xFF; // sample_size\n }\n return box(types.trun, bytes);\n };\n trun$1 = function (track, offset) {\n if (track.type === 'audio') {\n return audioTrun(track, offset);\n }\n return videoTrun(track, offset);\n };\n })();\n var mp4Generator = {\n ftyp: ftyp,\n mdat: mdat,\n moof: moof,\n moov: moov,\n initSegment: function (tracks) {\n var fileType = ftyp(),\n movie = moov(tracks),\n result;\n result = new Uint8Array(fileType.byteLength + movie.byteLength);\n result.set(fileType);\n result.set(movie, fileType.byteLength);\n return result;\n }\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n // composed of the nal units that make up that frame\n // Also keep track of cummulative data about the frame from the nal units such\n // as the frame duration, starting pts, etc.\n\n var groupNalsIntoFrames = function (nalUnits) {\n var i,\n currentNal,\n currentFrame = [],\n frames = []; // TODO added for LHLS, make sure this is OK\n\n frames.byteLength = 0;\n frames.nalCount = 0;\n frames.duration = 0;\n currentFrame.byteLength = 0;\n for (i = 0; i < nalUnits.length; i++) {\n currentNal = nalUnits[i]; // Split on 'aud'-type nal units\n\n if (currentNal.nalUnitType === 'access_unit_delimiter_rbsp') {\n // Since the very first nal unit is expected to be an AUD\n // only push to the frames array when currentFrame is not empty\n if (currentFrame.length) {\n currentFrame.duration = currentNal.dts - currentFrame.dts; // TODO added for LHLS, make sure this is OK\n\n frames.byteLength += currentFrame.byteLength;\n frames.nalCount += currentFrame.length;\n frames.duration += currentFrame.duration;\n frames.push(currentFrame);\n }\n currentFrame = [currentNal];\n currentFrame.byteLength = currentNal.data.byteLength;\n currentFrame.pts = currentNal.pts;\n currentFrame.dts = currentNal.dts;\n } else {\n // Specifically flag key frames for ease of use later\n if (currentNal.nalUnitType === 'slice_layer_without_partitioning_rbsp_idr') {\n currentFrame.keyFrame = true;\n }\n currentFrame.duration = currentNal.dts - currentFrame.dts;\n currentFrame.byteLength += currentNal.data.byteLength;\n currentFrame.push(currentNal);\n }\n } // For the last frame, use the duration of the previous frame if we\n // have nothing better to go on\n\n if (frames.length && (!currentFrame.duration || currentFrame.duration <= 0)) {\n currentFrame.duration = frames[frames.length - 1].duration;\n } // Push the final frame\n // TODO added for LHLS, make sure this is OK\n\n frames.byteLength += currentFrame.byteLength;\n frames.nalCount += currentFrame.length;\n frames.duration += currentFrame.duration;\n frames.push(currentFrame);\n return frames;\n }; // Convert an array of frames into an array of Gop with each Gop being composed\n // of the frames that make up that Gop\n // Also keep track of cummulative data about the Gop from the frames such as the\n // Gop duration, starting pts, etc.\n\n var groupFramesIntoGops = function (frames) {\n var i,\n currentFrame,\n currentGop = [],\n gops = []; // We must pre-set some of the values on the Gop since we\n // keep running totals of these values\n\n currentGop.byteLength = 0;\n currentGop.nalCount = 0;\n currentGop.duration = 0;\n currentGop.pts = frames[0].pts;\n currentGop.dts = frames[0].dts; // store some metadata about all the Gops\n\n gops.byteLength = 0;\n gops.nalCount = 0;\n gops.duration = 0;\n gops.pts = frames[0].pts;\n gops.dts = frames[0].dts;\n for (i = 0; i < frames.length; i++) {\n currentFrame = frames[i];\n if (currentFrame.keyFrame) {\n // Since the very first frame is expected to be an keyframe\n // only push to the gops array when currentGop is not empty\n if (currentGop.length) {\n gops.push(currentGop);\n gops.byteLength += currentGop.byteLength;\n gops.nalCount += currentGop.nalCount;\n gops.duration += currentGop.duration;\n }\n currentGop = [currentFrame];\n currentGop.nalCount = currentFrame.length;\n currentGop.byteLength = currentFrame.byteLength;\n currentGop.pts = currentFrame.pts;\n currentGop.dts = currentFrame.dts;\n currentGop.duration = currentFrame.duration;\n } else {\n currentGop.duration += currentFrame.duration;\n currentGop.nalCount += currentFrame.length;\n currentGop.byteLength += currentFrame.byteLength;\n currentGop.push(currentFrame);\n }\n }\n if (gops.length && currentGop.duration <= 0) {\n currentGop.duration = gops[gops.length - 1].duration;\n }\n gops.byteLength += currentGop.byteLength;\n gops.nalCount += currentGop.nalCount;\n gops.duration += currentGop.duration; // push the final Gop\n\n gops.push(currentGop);\n return gops;\n };\n /*\n * Search for the first keyframe in the GOPs and throw away all frames\n * until that keyframe. Then extend the duration of the pulled keyframe\n * and pull the PTS and DTS of the keyframe so that it covers the time\n * range of the frames that were disposed.\n *\n * @param {Array} gops video GOPs\n * @returns {Array} modified video GOPs\n */\n\n var extendFirstKeyFrame = function (gops) {\n var currentGop;\n if (!gops[0][0].keyFrame && gops.length > 1) {\n // Remove the first GOP\n currentGop = gops.shift();\n gops.byteLength -= currentGop.byteLength;\n gops.nalCount -= currentGop.nalCount; // Extend the first frame of what is now the\n // first gop to cover the time period of the\n // frames we just removed\n\n gops[0][0].dts = currentGop.dts;\n gops[0][0].pts = currentGop.pts;\n gops[0][0].duration += currentGop.duration;\n }\n return gops;\n };\n /**\n * Default sample object\n * see ISO/IEC 14496-12:2012, section 8.6.4.3\n */\n\n var createDefaultSample = function () {\n return {\n size: 0,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradationPriority: 0,\n isNonSyncSample: 1\n }\n };\n };\n /*\n * Collates information from a video frame into an object for eventual\n * entry into an MP4 sample table.\n *\n * @param {Object} frame the video frame\n * @param {Number} dataOffset the byte offset to position the sample\n * @return {Object} object containing sample table info for a frame\n */\n\n var sampleForFrame = function (frame, dataOffset) {\n var sample = createDefaultSample();\n sample.dataOffset = dataOffset;\n sample.compositionTimeOffset = frame.pts - frame.dts;\n sample.duration = frame.duration;\n sample.size = 4 * frame.length; // Space for nal unit size\n\n sample.size += frame.byteLength;\n if (frame.keyFrame) {\n sample.flags.dependsOn = 2;\n sample.flags.isNonSyncSample = 0;\n }\n return sample;\n }; // generate the track's sample table from an array of gops\n\n var generateSampleTable$1 = function (gops, baseDataOffset) {\n var h,\n i,\n sample,\n currentGop,\n currentFrame,\n dataOffset = baseDataOffset || 0,\n samples = [];\n for (h = 0; h < gops.length; h++) {\n currentGop = gops[h];\n for (i = 0; i < currentGop.length; i++) {\n currentFrame = currentGop[i];\n sample = sampleForFrame(currentFrame, dataOffset);\n dataOffset += sample.size;\n samples.push(sample);\n }\n }\n return samples;\n }; // generate the track's raw mdat data from an array of gops\n\n var concatenateNalData = function (gops) {\n var h,\n i,\n j,\n currentGop,\n currentFrame,\n currentNal,\n dataOffset = 0,\n nalsByteLength = gops.byteLength,\n numberOfNals = gops.nalCount,\n totalByteLength = nalsByteLength + 4 * numberOfNals,\n data = new Uint8Array(totalByteLength),\n view = new DataView(data.buffer); // For each Gop..\n\n for (h = 0; h < gops.length; h++) {\n currentGop = gops[h]; // For each Frame..\n\n for (i = 0; i < currentGop.length; i++) {\n currentFrame = currentGop[i]; // For each NAL..\n\n for (j = 0; j < currentFrame.length; j++) {\n currentNal = currentFrame[j];\n view.setUint32(dataOffset, currentNal.data.byteLength);\n dataOffset += 4;\n data.set(currentNal.data, dataOffset);\n dataOffset += currentNal.data.byteLength;\n }\n }\n }\n return data;\n }; // generate the track's sample table from a frame\n\n var generateSampleTableForFrame = function (frame, baseDataOffset) {\n var sample,\n dataOffset = baseDataOffset || 0,\n samples = [];\n sample = sampleForFrame(frame, dataOffset);\n samples.push(sample);\n return samples;\n }; // generate the track's raw mdat data from a frame\n\n var concatenateNalDataForFrame = function (frame) {\n var i,\n currentNal,\n dataOffset = 0,\n nalsByteLength = frame.byteLength,\n numberOfNals = frame.length,\n totalByteLength = nalsByteLength + 4 * numberOfNals,\n data = new Uint8Array(totalByteLength),\n view = new DataView(data.buffer); // For each NAL..\n\n for (i = 0; i < frame.length; i++) {\n currentNal = frame[i];\n view.setUint32(dataOffset, currentNal.data.byteLength);\n dataOffset += 4;\n data.set(currentNal.data, dataOffset);\n dataOffset += currentNal.data.byteLength;\n }\n return data;\n };\n var frameUtils$1 = {\n groupNalsIntoFrames: groupNalsIntoFrames,\n groupFramesIntoGops: groupFramesIntoGops,\n extendFirstKeyFrame: extendFirstKeyFrame,\n generateSampleTable: generateSampleTable$1,\n concatenateNalData: concatenateNalData,\n generateSampleTableForFrame: generateSampleTableForFrame,\n concatenateNalDataForFrame: concatenateNalDataForFrame\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var highPrefix = [33, 16, 5, 32, 164, 27];\n var lowPrefix = [33, 65, 108, 84, 1, 2, 4, 8, 168, 2, 4, 8, 17, 191, 252];\n var zeroFill = function (count) {\n var a = [];\n while (count--) {\n a.push(0);\n }\n return a;\n };\n var makeTable = function (metaTable) {\n return Object.keys(metaTable).reduce(function (obj, key) {\n obj[key] = new Uint8Array(metaTable[key].reduce(function (arr, part) {\n return arr.concat(part);\n }, []));\n return obj;\n }, {});\n };\n var silence;\n var silence_1 = function () {\n if (!silence) {\n // Frames-of-silence to use for filling in missing AAC frames\n var coneOfSilence = {\n 96000: [highPrefix, [227, 64], zeroFill(154), [56]],\n 88200: [highPrefix, [231], zeroFill(170), [56]],\n 64000: [highPrefix, [248, 192], zeroFill(240), [56]],\n 48000: [highPrefix, [255, 192], zeroFill(268), [55, 148, 128], zeroFill(54), [112]],\n 44100: [highPrefix, [255, 192], zeroFill(268), [55, 163, 128], zeroFill(84), [112]],\n 32000: [highPrefix, [255, 192], zeroFill(268), [55, 234], zeroFill(226), [112]],\n 24000: [highPrefix, [255, 192], zeroFill(268), [55, 255, 128], zeroFill(268), [111, 112], zeroFill(126), [224]],\n 16000: [highPrefix, [255, 192], zeroFill(268), [55, 255, 128], zeroFill(268), [111, 255], zeroFill(269), [223, 108], zeroFill(195), [1, 192]],\n 12000: [lowPrefix, zeroFill(268), [3, 127, 248], zeroFill(268), [6, 255, 240], zeroFill(268), [13, 255, 224], zeroFill(268), [27, 253, 128], zeroFill(259), [56]],\n 11025: [lowPrefix, zeroFill(268), [3, 127, 248], zeroFill(268), [6, 255, 240], zeroFill(268), [13, 255, 224], zeroFill(268), [27, 255, 192], zeroFill(268), [55, 175, 128], zeroFill(108), [112]],\n 8000: [lowPrefix, zeroFill(268), [3, 121, 16], zeroFill(47), [7]]\n };\n silence = makeTable(coneOfSilence);\n }\n return silence;\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var ONE_SECOND_IN_TS$4 = 90000,\n // 90kHz clock\n secondsToVideoTs,\n secondsToAudioTs,\n videoTsToSeconds,\n audioTsToSeconds,\n audioTsToVideoTs,\n videoTsToAudioTs,\n metadataTsToSeconds;\n secondsToVideoTs = function (seconds) {\n return seconds * ONE_SECOND_IN_TS$4;\n };\n secondsToAudioTs = function (seconds, sampleRate) {\n return seconds * sampleRate;\n };\n videoTsToSeconds = function (timestamp) {\n return timestamp / ONE_SECOND_IN_TS$4;\n };\n audioTsToSeconds = function (timestamp, sampleRate) {\n return timestamp / sampleRate;\n };\n audioTsToVideoTs = function (timestamp, sampleRate) {\n return secondsToVideoTs(audioTsToSeconds(timestamp, sampleRate));\n };\n videoTsToAudioTs = function (timestamp, sampleRate) {\n return secondsToAudioTs(videoTsToSeconds(timestamp), sampleRate);\n };\n /**\n * Adjust ID3 tag or caption timing information by the timeline pts values\n * (if keepOriginalTimestamps is false) and convert to seconds\n */\n\n metadataTsToSeconds = function (timestamp, timelineStartPts, keepOriginalTimestamps) {\n return videoTsToSeconds(keepOriginalTimestamps ? timestamp : timestamp - timelineStartPts);\n };\n var clock$2 = {\n ONE_SECOND_IN_TS: ONE_SECOND_IN_TS$4,\n secondsToVideoTs: secondsToVideoTs,\n secondsToAudioTs: secondsToAudioTs,\n videoTsToSeconds: videoTsToSeconds,\n audioTsToSeconds: audioTsToSeconds,\n audioTsToVideoTs: audioTsToVideoTs,\n videoTsToAudioTs: videoTsToAudioTs,\n metadataTsToSeconds: metadataTsToSeconds\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var coneOfSilence = silence_1;\n var clock$1 = clock$2;\n /**\n * Sum the `byteLength` properties of the data in each AAC frame\n */\n\n var sumFrameByteLengths = function (array) {\n var i,\n currentObj,\n sum = 0; // sum the byteLength's all each nal unit in the frame\n\n for (i = 0; i < array.length; i++) {\n currentObj = array[i];\n sum += currentObj.data.byteLength;\n }\n return sum;\n }; // Possibly pad (prefix) the audio track with silence if appending this track\n // would lead to the introduction of a gap in the audio buffer\n\n var prefixWithSilence = function (track, frames, audioAppendStartTs, videoBaseMediaDecodeTime) {\n var baseMediaDecodeTimeTs,\n frameDuration = 0,\n audioGapDuration = 0,\n audioFillFrameCount = 0,\n audioFillDuration = 0,\n silentFrame,\n i,\n firstFrame;\n if (!frames.length) {\n return;\n }\n baseMediaDecodeTimeTs = clock$1.audioTsToVideoTs(track.baseMediaDecodeTime, track.samplerate); // determine frame clock duration based on sample rate, round up to avoid overfills\n\n frameDuration = Math.ceil(clock$1.ONE_SECOND_IN_TS / (track.samplerate / 1024));\n if (audioAppendStartTs && videoBaseMediaDecodeTime) {\n // insert the shortest possible amount (audio gap or audio to video gap)\n audioGapDuration = baseMediaDecodeTimeTs - Math.max(audioAppendStartTs, videoBaseMediaDecodeTime); // number of full frames in the audio gap\n\n audioFillFrameCount = Math.floor(audioGapDuration / frameDuration);\n audioFillDuration = audioFillFrameCount * frameDuration;\n } // don't attempt to fill gaps smaller than a single frame or larger\n // than a half second\n\n if (audioFillFrameCount < 1 || audioFillDuration > clock$1.ONE_SECOND_IN_TS / 2) {\n return;\n }\n silentFrame = coneOfSilence()[track.samplerate];\n if (!silentFrame) {\n // we don't have a silent frame pregenerated for the sample rate, so use a frame\n // from the content instead\n silentFrame = frames[0].data;\n }\n for (i = 0; i < audioFillFrameCount; i++) {\n firstFrame = frames[0];\n frames.splice(0, 0, {\n data: silentFrame,\n dts: firstFrame.dts - frameDuration,\n pts: firstFrame.pts - frameDuration\n });\n }\n track.baseMediaDecodeTime -= Math.floor(clock$1.videoTsToAudioTs(audioFillDuration, track.samplerate));\n return audioFillDuration;\n }; // If the audio segment extends before the earliest allowed dts\n // value, remove AAC frames until starts at or after the earliest\n // allowed DTS so that we don't end up with a negative baseMedia-\n // DecodeTime for the audio track\n\n var trimAdtsFramesByEarliestDts = function (adtsFrames, track, earliestAllowedDts) {\n if (track.minSegmentDts >= earliestAllowedDts) {\n return adtsFrames;\n } // We will need to recalculate the earliest segment Dts\n\n track.minSegmentDts = Infinity;\n return adtsFrames.filter(function (currentFrame) {\n // If this is an allowed frame, keep it and record it's Dts\n if (currentFrame.dts >= earliestAllowedDts) {\n track.minSegmentDts = Math.min(track.minSegmentDts, currentFrame.dts);\n track.minSegmentPts = track.minSegmentDts;\n return true;\n } // Otherwise, discard it\n\n return false;\n });\n }; // generate the track's raw mdat data from an array of frames\n\n var generateSampleTable = function (frames) {\n var i,\n currentFrame,\n samples = [];\n for (i = 0; i < frames.length; i++) {\n currentFrame = frames[i];\n samples.push({\n size: currentFrame.data.byteLength,\n duration: 1024 // For AAC audio, all samples contain 1024 samples\n });\n }\n return samples;\n }; // generate the track's sample table from an array of frames\n\n var concatenateFrameData = function (frames) {\n var i,\n currentFrame,\n dataOffset = 0,\n data = new Uint8Array(sumFrameByteLengths(frames));\n for (i = 0; i < frames.length; i++) {\n currentFrame = frames[i];\n data.set(currentFrame.data, dataOffset);\n dataOffset += currentFrame.data.byteLength;\n }\n return data;\n };\n var audioFrameUtils$1 = {\n prefixWithSilence: prefixWithSilence,\n trimAdtsFramesByEarliestDts: trimAdtsFramesByEarliestDts,\n generateSampleTable: generateSampleTable,\n concatenateFrameData: concatenateFrameData\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var ONE_SECOND_IN_TS$3 = clock$2.ONE_SECOND_IN_TS;\n /**\n * Store information about the start and end of the track and the\n * duration for each frame/sample we process in order to calculate\n * the baseMediaDecodeTime\n */\n\n var collectDtsInfo = function (track, data) {\n if (typeof data.pts === 'number') {\n if (track.timelineStartInfo.pts === undefined) {\n track.timelineStartInfo.pts = data.pts;\n }\n if (track.minSegmentPts === undefined) {\n track.minSegmentPts = data.pts;\n } else {\n track.minSegmentPts = Math.min(track.minSegmentPts, data.pts);\n }\n if (track.maxSegmentPts === undefined) {\n track.maxSegmentPts = data.pts;\n } else {\n track.maxSegmentPts = Math.max(track.maxSegmentPts, data.pts);\n }\n }\n if (typeof data.dts === 'number') {\n if (track.timelineStartInfo.dts === undefined) {\n track.timelineStartInfo.dts = data.dts;\n }\n if (track.minSegmentDts === undefined) {\n track.minSegmentDts = data.dts;\n } else {\n track.minSegmentDts = Math.min(track.minSegmentDts, data.dts);\n }\n if (track.maxSegmentDts === undefined) {\n track.maxSegmentDts = data.dts;\n } else {\n track.maxSegmentDts = Math.max(track.maxSegmentDts, data.dts);\n }\n }\n };\n /**\n * Clear values used to calculate the baseMediaDecodeTime between\n * tracks\n */\n\n var clearDtsInfo = function (track) {\n delete track.minSegmentDts;\n delete track.maxSegmentDts;\n delete track.minSegmentPts;\n delete track.maxSegmentPts;\n };\n /**\n * Calculate the track's baseMediaDecodeTime based on the earliest\n * DTS the transmuxer has ever seen and the minimum DTS for the\n * current track\n * @param track {object} track metadata configuration\n * @param keepOriginalTimestamps {boolean} If true, keep the timestamps\n * in the source; false to adjust the first segment to start at 0.\n */\n\n var calculateTrackBaseMediaDecodeTime = function (track, keepOriginalTimestamps) {\n var baseMediaDecodeTime,\n scale,\n minSegmentDts = track.minSegmentDts; // Optionally adjust the time so the first segment starts at zero.\n\n if (!keepOriginalTimestamps) {\n minSegmentDts -= track.timelineStartInfo.dts;\n } // track.timelineStartInfo.baseMediaDecodeTime is the location, in time, where\n // we want the start of the first segment to be placed\n\n baseMediaDecodeTime = track.timelineStartInfo.baseMediaDecodeTime; // Add to that the distance this segment is from the very first\n\n baseMediaDecodeTime += minSegmentDts; // baseMediaDecodeTime must not become negative\n\n baseMediaDecodeTime = Math.max(0, baseMediaDecodeTime);\n if (track.type === 'audio') {\n // Audio has a different clock equal to the sampling_rate so we need to\n // scale the PTS values into the clock rate of the track\n scale = track.samplerate / ONE_SECOND_IN_TS$3;\n baseMediaDecodeTime *= scale;\n baseMediaDecodeTime = Math.floor(baseMediaDecodeTime);\n }\n return baseMediaDecodeTime;\n };\n var trackDecodeInfo$1 = {\n clearDtsInfo: clearDtsInfo,\n calculateTrackBaseMediaDecodeTime: calculateTrackBaseMediaDecodeTime,\n collectDtsInfo: collectDtsInfo\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Reads in-band caption information from a video elementary\n * stream. Captions must follow the CEA-708 standard for injection\n * into an MPEG-2 transport streams.\n * @see https://en.wikipedia.org/wiki/CEA-708\n * @see https://www.gpo.gov/fdsys/pkg/CFR-2007-title47-vol1/pdf/CFR-2007-title47-vol1-sec15-119.pdf\n */\n // payload type field to indicate how they are to be\n // interpreted. CEAS-708 caption content is always transmitted with\n // payload type 0x04.\n\n var USER_DATA_REGISTERED_ITU_T_T35 = 4,\n RBSP_TRAILING_BITS = 128;\n /**\n * Parse a supplemental enhancement information (SEI) NAL unit.\n * Stops parsing once a message of type ITU T T35 has been found.\n *\n * @param bytes {Uint8Array} the bytes of a SEI NAL unit\n * @return {object} the parsed SEI payload\n * @see Rec. ITU-T H.264, 7.3.2.3.1\n */\n\n var parseSei = function (bytes) {\n var i = 0,\n result = {\n payloadType: -1,\n payloadSize: 0\n },\n payloadType = 0,\n payloadSize = 0; // go through the sei_rbsp parsing each each individual sei_message\n\n while (i < bytes.byteLength) {\n // stop once we have hit the end of the sei_rbsp\n if (bytes[i] === RBSP_TRAILING_BITS) {\n break;\n } // Parse payload type\n\n while (bytes[i] === 0xFF) {\n payloadType += 255;\n i++;\n }\n payloadType += bytes[i++]; // Parse payload size\n\n while (bytes[i] === 0xFF) {\n payloadSize += 255;\n i++;\n }\n payloadSize += bytes[i++]; // this sei_message is a 608/708 caption so save it and break\n // there can only ever be one caption message in a frame's sei\n\n if (!result.payload && payloadType === USER_DATA_REGISTERED_ITU_T_T35) {\n var userIdentifier = String.fromCharCode(bytes[i + 3], bytes[i + 4], bytes[i + 5], bytes[i + 6]);\n if (userIdentifier === 'GA94') {\n result.payloadType = payloadType;\n result.payloadSize = payloadSize;\n result.payload = bytes.subarray(i, i + payloadSize);\n break;\n } else {\n result.payload = void 0;\n }\n } // skip the payload and parse the next message\n\n i += payloadSize;\n payloadType = 0;\n payloadSize = 0;\n }\n return result;\n }; // see ANSI/SCTE 128-1 (2013), section 8.1\n\n var parseUserData = function (sei) {\n // itu_t_t35_contry_code must be 181 (United States) for\n // captions\n if (sei.payload[0] !== 181) {\n return null;\n } // itu_t_t35_provider_code should be 49 (ATSC) for captions\n\n if ((sei.payload[1] << 8 | sei.payload[2]) !== 49) {\n return null;\n } // the user_identifier should be \"GA94\" to indicate ATSC1 data\n\n if (String.fromCharCode(sei.payload[3], sei.payload[4], sei.payload[5], sei.payload[6]) !== 'GA94') {\n return null;\n } // finally, user_data_type_code should be 0x03 for caption data\n\n if (sei.payload[7] !== 0x03) {\n return null;\n } // return the user_data_type_structure and strip the trailing\n // marker bits\n\n return sei.payload.subarray(8, sei.payload.length - 1);\n }; // see CEA-708-D, section 4.4\n\n var parseCaptionPackets = function (pts, userData) {\n var results = [],\n i,\n count,\n offset,\n data; // if this is just filler, return immediately\n\n if (!(userData[0] & 0x40)) {\n return results;\n } // parse out the cc_data_1 and cc_data_2 fields\n\n count = userData[0] & 0x1f;\n for (i = 0; i < count; i++) {\n offset = i * 3;\n data = {\n type: userData[offset + 2] & 0x03,\n pts: pts\n }; // capture cc data when cc_valid is 1\n\n if (userData[offset + 2] & 0x04) {\n data.ccData = userData[offset + 3] << 8 | userData[offset + 4];\n results.push(data);\n }\n }\n return results;\n };\n var discardEmulationPreventionBytes$1 = function (data) {\n var length = data.byteLength,\n emulationPreventionBytesPositions = [],\n i = 1,\n newLength,\n newData; // Find all `Emulation Prevention Bytes`\n\n while (i < length - 2) {\n if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 0x03) {\n emulationPreventionBytesPositions.push(i + 2);\n i += 2;\n } else {\n i++;\n }\n } // If no Emulation Prevention Bytes were found just return the original\n // array\n\n if (emulationPreventionBytesPositions.length === 0) {\n return data;\n } // Create a new array to hold the NAL unit data\n\n newLength = length - emulationPreventionBytesPositions.length;\n newData = new Uint8Array(newLength);\n var sourceIndex = 0;\n for (i = 0; i < newLength; sourceIndex++, i++) {\n if (sourceIndex === emulationPreventionBytesPositions[0]) {\n // Skip this byte\n sourceIndex++; // Remove this position index\n\n emulationPreventionBytesPositions.shift();\n }\n newData[i] = data[sourceIndex];\n }\n return newData;\n }; // exports\n\n var captionPacketParser = {\n parseSei: parseSei,\n parseUserData: parseUserData,\n parseCaptionPackets: parseCaptionPackets,\n discardEmulationPreventionBytes: discardEmulationPreventionBytes$1,\n USER_DATA_REGISTERED_ITU_T_T35: USER_DATA_REGISTERED_ITU_T_T35\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Reads in-band caption information from a video elementary\n * stream. Captions must follow the CEA-708 standard for injection\n * into an MPEG-2 transport streams.\n * @see https://en.wikipedia.org/wiki/CEA-708\n * @see https://www.gpo.gov/fdsys/pkg/CFR-2007-title47-vol1/pdf/CFR-2007-title47-vol1-sec15-119.pdf\n */\n // Link To Transport\n // -----------------\n\n var Stream$7 = stream;\n var cea708Parser = captionPacketParser;\n var CaptionStream$2 = function (options) {\n options = options || {};\n CaptionStream$2.prototype.init.call(this); // parse708captions flag, default to true\n\n this.parse708captions_ = typeof options.parse708captions === 'boolean' ? options.parse708captions : true;\n this.captionPackets_ = [];\n this.ccStreams_ = [new Cea608Stream(0, 0),\n // eslint-disable-line no-use-before-define\n new Cea608Stream(0, 1),\n // eslint-disable-line no-use-before-define\n new Cea608Stream(1, 0),\n // eslint-disable-line no-use-before-define\n new Cea608Stream(1, 1) // eslint-disable-line no-use-before-define\n ];\n if (this.parse708captions_) {\n this.cc708Stream_ = new Cea708Stream({\n captionServices: options.captionServices\n }); // eslint-disable-line no-use-before-define\n }\n this.reset(); // forward data and done events from CCs to this CaptionStream\n\n this.ccStreams_.forEach(function (cc) {\n cc.on('data', this.trigger.bind(this, 'data'));\n cc.on('partialdone', this.trigger.bind(this, 'partialdone'));\n cc.on('done', this.trigger.bind(this, 'done'));\n }, this);\n if (this.parse708captions_) {\n this.cc708Stream_.on('data', this.trigger.bind(this, 'data'));\n this.cc708Stream_.on('partialdone', this.trigger.bind(this, 'partialdone'));\n this.cc708Stream_.on('done', this.trigger.bind(this, 'done'));\n }\n };\n CaptionStream$2.prototype = new Stream$7();\n CaptionStream$2.prototype.push = function (event) {\n var sei, userData, newCaptionPackets; // only examine SEI NALs\n\n if (event.nalUnitType !== 'sei_rbsp') {\n return;\n } // parse the sei\n\n sei = cea708Parser.parseSei(event.escapedRBSP); // no payload data, skip\n\n if (!sei.payload) {\n return;\n } // ignore everything but user_data_registered_itu_t_t35\n\n if (sei.payloadType !== cea708Parser.USER_DATA_REGISTERED_ITU_T_T35) {\n return;\n } // parse out the user data payload\n\n userData = cea708Parser.parseUserData(sei); // ignore unrecognized userData\n\n if (!userData) {\n return;\n } // Sometimes, the same segment # will be downloaded twice. To stop the\n // caption data from being processed twice, we track the latest dts we've\n // received and ignore everything with a dts before that. However, since\n // data for a specific dts can be split across packets on either side of\n // a segment boundary, we need to make sure we *don't* ignore the packets\n // from the *next* segment that have dts === this.latestDts_. By constantly\n // tracking the number of packets received with dts === this.latestDts_, we\n // know how many should be ignored once we start receiving duplicates.\n\n if (event.dts < this.latestDts_) {\n // We've started getting older data, so set the flag.\n this.ignoreNextEqualDts_ = true;\n return;\n } else if (event.dts === this.latestDts_ && this.ignoreNextEqualDts_) {\n this.numSameDts_--;\n if (!this.numSameDts_) {\n // We've received the last duplicate packet, time to start processing again\n this.ignoreNextEqualDts_ = false;\n }\n return;\n } // parse out CC data packets and save them for later\n\n newCaptionPackets = cea708Parser.parseCaptionPackets(event.pts, userData);\n this.captionPackets_ = this.captionPackets_.concat(newCaptionPackets);\n if (this.latestDts_ !== event.dts) {\n this.numSameDts_ = 0;\n }\n this.numSameDts_++;\n this.latestDts_ = event.dts;\n };\n CaptionStream$2.prototype.flushCCStreams = function (flushType) {\n this.ccStreams_.forEach(function (cc) {\n return flushType === 'flush' ? cc.flush() : cc.partialFlush();\n }, this);\n };\n CaptionStream$2.prototype.flushStream = function (flushType) {\n // make sure we actually parsed captions before proceeding\n if (!this.captionPackets_.length) {\n this.flushCCStreams(flushType);\n return;\n } // In Chrome, the Array#sort function is not stable so add a\n // presortIndex that we can use to ensure we get a stable-sort\n\n this.captionPackets_.forEach(function (elem, idx) {\n elem.presortIndex = idx;\n }); // sort caption byte-pairs based on their PTS values\n\n this.captionPackets_.sort(function (a, b) {\n if (a.pts === b.pts) {\n return a.presortIndex - b.presortIndex;\n }\n return a.pts - b.pts;\n });\n this.captionPackets_.forEach(function (packet) {\n if (packet.type < 2) {\n // Dispatch packet to the right Cea608Stream\n this.dispatchCea608Packet(packet);\n } else {\n // Dispatch packet to the Cea708Stream\n this.dispatchCea708Packet(packet);\n }\n }, this);\n this.captionPackets_.length = 0;\n this.flushCCStreams(flushType);\n };\n CaptionStream$2.prototype.flush = function () {\n return this.flushStream('flush');\n }; // Only called if handling partial data\n\n CaptionStream$2.prototype.partialFlush = function () {\n return this.flushStream('partialFlush');\n };\n CaptionStream$2.prototype.reset = function () {\n this.latestDts_ = null;\n this.ignoreNextEqualDts_ = false;\n this.numSameDts_ = 0;\n this.activeCea608Channel_ = [null, null];\n this.ccStreams_.forEach(function (ccStream) {\n ccStream.reset();\n });\n }; // From the CEA-608 spec:\n\n /*\n * When XDS sub-packets are interleaved with other services, the end of each sub-packet shall be followed\n * by a control pair to change to a different service. When any of the control codes from 0x10 to 0x1F is\n * used to begin a control code pair, it indicates the return to captioning or Text data. The control code pair\n * and subsequent data should then be processed according to the FCC rules. It may be necessary for the\n * line 21 data encoder to automatically insert a control code pair (i.e. RCL, RU2, RU3, RU4, RDC, or RTD)\n * to switch to captioning or Text.\n */\n // With that in mind, we ignore any data between an XDS control code and a\n // subsequent closed-captioning control code.\n\n CaptionStream$2.prototype.dispatchCea608Packet = function (packet) {\n // NOTE: packet.type is the CEA608 field\n if (this.setsTextOrXDSActive(packet)) {\n this.activeCea608Channel_[packet.type] = null;\n } else if (this.setsChannel1Active(packet)) {\n this.activeCea608Channel_[packet.type] = 0;\n } else if (this.setsChannel2Active(packet)) {\n this.activeCea608Channel_[packet.type] = 1;\n }\n if (this.activeCea608Channel_[packet.type] === null) {\n // If we haven't received anything to set the active channel, or the\n // packets are Text/XDS data, discard the data; we don't want jumbled\n // captions\n return;\n }\n this.ccStreams_[(packet.type << 1) + this.activeCea608Channel_[packet.type]].push(packet);\n };\n CaptionStream$2.prototype.setsChannel1Active = function (packet) {\n return (packet.ccData & 0x7800) === 0x1000;\n };\n CaptionStream$2.prototype.setsChannel2Active = function (packet) {\n return (packet.ccData & 0x7800) === 0x1800;\n };\n CaptionStream$2.prototype.setsTextOrXDSActive = function (packet) {\n return (packet.ccData & 0x7100) === 0x0100 || (packet.ccData & 0x78fe) === 0x102a || (packet.ccData & 0x78fe) === 0x182a;\n };\n CaptionStream$2.prototype.dispatchCea708Packet = function (packet) {\n if (this.parse708captions_) {\n this.cc708Stream_.push(packet);\n }\n }; // ----------------------\n // Session to Application\n // ----------------------\n // This hash maps special and extended character codes to their\n // proper Unicode equivalent. The first one-byte key is just a\n // non-standard character code. The two-byte keys that follow are\n // the extended CEA708 character codes, along with the preceding\n // 0x10 extended character byte to distinguish these codes from\n // non-extended character codes. Every CEA708 character code that\n // is not in this object maps directly to a standard unicode\n // character code.\n // The transparent space and non-breaking transparent space are\n // technically not fully supported since there is no code to\n // make them transparent, so they have normal non-transparent\n // stand-ins.\n // The special closed caption (CC) character isn't a standard\n // unicode character, so a fairly similar unicode character was\n // chosen in it's place.\n\n var CHARACTER_TRANSLATION_708 = {\n 0x7f: 0x266a,\n // ♪\n 0x1020: 0x20,\n // Transparent Space\n 0x1021: 0xa0,\n // Nob-breaking Transparent Space\n 0x1025: 0x2026,\n // …\n 0x102a: 0x0160,\n // Š\n 0x102c: 0x0152,\n // Œ\n 0x1030: 0x2588,\n // █\n 0x1031: 0x2018,\n // ‘\n 0x1032: 0x2019,\n // ’\n 0x1033: 0x201c,\n // “\n 0x1034: 0x201d,\n // ”\n 0x1035: 0x2022,\n // •\n 0x1039: 0x2122,\n // ™\n 0x103a: 0x0161,\n // š\n 0x103c: 0x0153,\n // œ\n 0x103d: 0x2120,\n // ℠\n 0x103f: 0x0178,\n // Ÿ\n 0x1076: 0x215b,\n // ⅛\n 0x1077: 0x215c,\n // ⅜\n 0x1078: 0x215d,\n // ⅝\n 0x1079: 0x215e,\n // ⅞\n 0x107a: 0x23d0,\n // ⏐\n 0x107b: 0x23a4,\n // ⎤\n 0x107c: 0x23a3,\n // ⎣\n 0x107d: 0x23af,\n // ⎯\n 0x107e: 0x23a6,\n // ⎦\n 0x107f: 0x23a1,\n // ⎡\n 0x10a0: 0x3138 // ㄸ (CC char)\n };\n var get708CharFromCode = function (code) {\n var newCode = CHARACTER_TRANSLATION_708[code] || code;\n if (code & 0x1000 && code === newCode) {\n // Invalid extended code\n return '';\n }\n return String.fromCharCode(newCode);\n };\n var within708TextBlock = function (b) {\n return 0x20 <= b && b <= 0x7f || 0xa0 <= b && b <= 0xff;\n };\n var Cea708Window = function (windowNum) {\n this.windowNum = windowNum;\n this.reset();\n };\n Cea708Window.prototype.reset = function () {\n this.clearText();\n this.pendingNewLine = false;\n this.winAttr = {};\n this.penAttr = {};\n this.penLoc = {};\n this.penColor = {}; // These default values are arbitrary,\n // defineWindow will usually override them\n\n this.visible = 0;\n this.rowLock = 0;\n this.columnLock = 0;\n this.priority = 0;\n this.relativePositioning = 0;\n this.anchorVertical = 0;\n this.anchorHorizontal = 0;\n this.anchorPoint = 0;\n this.rowCount = 1;\n this.virtualRowCount = this.rowCount + 1;\n this.columnCount = 41;\n this.windowStyle = 0;\n this.penStyle = 0;\n };\n Cea708Window.prototype.getText = function () {\n return this.rows.join('\\n');\n };\n Cea708Window.prototype.clearText = function () {\n this.rows = [''];\n this.rowIdx = 0;\n };\n Cea708Window.prototype.newLine = function (pts) {\n if (this.rows.length >= this.virtualRowCount && typeof this.beforeRowOverflow === 'function') {\n this.beforeRowOverflow(pts);\n }\n if (this.rows.length > 0) {\n this.rows.push('');\n this.rowIdx++;\n } // Show all virtual rows since there's no visible scrolling\n\n while (this.rows.length > this.virtualRowCount) {\n this.rows.shift();\n this.rowIdx--;\n }\n };\n Cea708Window.prototype.isEmpty = function () {\n if (this.rows.length === 0) {\n return true;\n } else if (this.rows.length === 1) {\n return this.rows[0] === '';\n }\n return false;\n };\n Cea708Window.prototype.addText = function (text) {\n this.rows[this.rowIdx] += text;\n };\n Cea708Window.prototype.backspace = function () {\n if (!this.isEmpty()) {\n var row = this.rows[this.rowIdx];\n this.rows[this.rowIdx] = row.substr(0, row.length - 1);\n }\n };\n var Cea708Service = function (serviceNum, encoding, stream) {\n this.serviceNum = serviceNum;\n this.text = '';\n this.currentWindow = new Cea708Window(-1);\n this.windows = [];\n this.stream = stream; // Try to setup a TextDecoder if an `encoding` value was provided\n\n if (typeof encoding === 'string') {\n this.createTextDecoder(encoding);\n }\n };\n /**\n * Initialize service windows\n * Must be run before service use\n *\n * @param {Integer} pts PTS value\n * @param {Function} beforeRowOverflow Function to execute before row overflow of a window\n */\n\n Cea708Service.prototype.init = function (pts, beforeRowOverflow) {\n this.startPts = pts;\n for (var win = 0; win < 8; win++) {\n this.windows[win] = new Cea708Window(win);\n if (typeof beforeRowOverflow === 'function') {\n this.windows[win].beforeRowOverflow = beforeRowOverflow;\n }\n }\n };\n /**\n * Set current window of service to be affected by commands\n *\n * @param {Integer} windowNum Window number\n */\n\n Cea708Service.prototype.setCurrentWindow = function (windowNum) {\n this.currentWindow = this.windows[windowNum];\n };\n /**\n * Try to create a TextDecoder if it is natively supported\n */\n\n Cea708Service.prototype.createTextDecoder = function (encoding) {\n if (typeof TextDecoder === 'undefined') {\n this.stream.trigger('log', {\n level: 'warn',\n message: 'The `encoding` option is unsupported without TextDecoder support'\n });\n } else {\n try {\n this.textDecoder_ = new TextDecoder(encoding);\n } catch (error) {\n this.stream.trigger('log', {\n level: 'warn',\n message: 'TextDecoder could not be created with ' + encoding + ' encoding. ' + error\n });\n }\n }\n };\n var Cea708Stream = function (options) {\n options = options || {};\n Cea708Stream.prototype.init.call(this);\n var self = this;\n var captionServices = options.captionServices || {};\n var captionServiceEncodings = {};\n var serviceProps; // Get service encodings from captionServices option block\n\n Object.keys(captionServices).forEach(serviceName => {\n serviceProps = captionServices[serviceName];\n if (/^SERVICE/.test(serviceName)) {\n captionServiceEncodings[serviceName] = serviceProps.encoding;\n }\n });\n this.serviceEncodings = captionServiceEncodings;\n this.current708Packet = null;\n this.services = {};\n this.push = function (packet) {\n if (packet.type === 3) {\n // 708 packet start\n self.new708Packet();\n self.add708Bytes(packet);\n } else {\n if (self.current708Packet === null) {\n // This should only happen at the start of a file if there's no packet start.\n self.new708Packet();\n }\n self.add708Bytes(packet);\n }\n };\n };\n Cea708Stream.prototype = new Stream$7();\n /**\n * Push current 708 packet, create new 708 packet.\n */\n\n Cea708Stream.prototype.new708Packet = function () {\n if (this.current708Packet !== null) {\n this.push708Packet();\n }\n this.current708Packet = {\n data: [],\n ptsVals: []\n };\n };\n /**\n * Add pts and both bytes from packet into current 708 packet.\n */\n\n Cea708Stream.prototype.add708Bytes = function (packet) {\n var data = packet.ccData;\n var byte0 = data >>> 8;\n var byte1 = data & 0xff; // I would just keep a list of packets instead of bytes, but it isn't clear in the spec\n // that service blocks will always line up with byte pairs.\n\n this.current708Packet.ptsVals.push(packet.pts);\n this.current708Packet.data.push(byte0);\n this.current708Packet.data.push(byte1);\n };\n /**\n * Parse completed 708 packet into service blocks and push each service block.\n */\n\n Cea708Stream.prototype.push708Packet = function () {\n var packet708 = this.current708Packet;\n var packetData = packet708.data;\n var serviceNum = null;\n var blockSize = null;\n var i = 0;\n var b = packetData[i++];\n packet708.seq = b >> 6;\n packet708.sizeCode = b & 0x3f; // 0b00111111;\n\n for (; i < packetData.length; i++) {\n b = packetData[i++];\n serviceNum = b >> 5;\n blockSize = b & 0x1f; // 0b00011111\n\n if (serviceNum === 7 && blockSize > 0) {\n // Extended service num\n b = packetData[i++];\n serviceNum = b;\n }\n this.pushServiceBlock(serviceNum, i, blockSize);\n if (blockSize > 0) {\n i += blockSize - 1;\n }\n }\n };\n /**\n * Parse service block, execute commands, read text.\n *\n * Note: While many of these commands serve important purposes,\n * many others just parse out the parameters or attributes, but\n * nothing is done with them because this is not a full and complete\n * implementation of the entire 708 spec.\n *\n * @param {Integer} serviceNum Service number\n * @param {Integer} start Start index of the 708 packet data\n * @param {Integer} size Block size\n */\n\n Cea708Stream.prototype.pushServiceBlock = function (serviceNum, start, size) {\n var b;\n var i = start;\n var packetData = this.current708Packet.data;\n var service = this.services[serviceNum];\n if (!service) {\n service = this.initService(serviceNum, i);\n }\n for (; i < start + size && i < packetData.length; i++) {\n b = packetData[i];\n if (within708TextBlock(b)) {\n i = this.handleText(i, service);\n } else if (b === 0x18) {\n i = this.multiByteCharacter(i, service);\n } else if (b === 0x10) {\n i = this.extendedCommands(i, service);\n } else if (0x80 <= b && b <= 0x87) {\n i = this.setCurrentWindow(i, service);\n } else if (0x98 <= b && b <= 0x9f) {\n i = this.defineWindow(i, service);\n } else if (b === 0x88) {\n i = this.clearWindows(i, service);\n } else if (b === 0x8c) {\n i = this.deleteWindows(i, service);\n } else if (b === 0x89) {\n i = this.displayWindows(i, service);\n } else if (b === 0x8a) {\n i = this.hideWindows(i, service);\n } else if (b === 0x8b) {\n i = this.toggleWindows(i, service);\n } else if (b === 0x97) {\n i = this.setWindowAttributes(i, service);\n } else if (b === 0x90) {\n i = this.setPenAttributes(i, service);\n } else if (b === 0x91) {\n i = this.setPenColor(i, service);\n } else if (b === 0x92) {\n i = this.setPenLocation(i, service);\n } else if (b === 0x8f) {\n service = this.reset(i, service);\n } else if (b === 0x08) {\n // BS: Backspace\n service.currentWindow.backspace();\n } else if (b === 0x0c) {\n // FF: Form feed\n service.currentWindow.clearText();\n } else if (b === 0x0d) {\n // CR: Carriage return\n service.currentWindow.pendingNewLine = true;\n } else if (b === 0x0e) {\n // HCR: Horizontal carriage return\n service.currentWindow.clearText();\n } else if (b === 0x8d) {\n // DLY: Delay, nothing to do\n i++;\n } else ;\n }\n };\n /**\n * Execute an extended command\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.extendedCommands = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[++i];\n if (within708TextBlock(b)) {\n i = this.handleText(i, service, {\n isExtended: true\n });\n }\n return i;\n };\n /**\n * Get PTS value of a given byte index\n *\n * @param {Integer} byteIndex Index of the byte\n * @return {Integer} PTS\n */\n\n Cea708Stream.prototype.getPts = function (byteIndex) {\n // There's 1 pts value per 2 bytes\n return this.current708Packet.ptsVals[Math.floor(byteIndex / 2)];\n };\n /**\n * Initializes a service\n *\n * @param {Integer} serviceNum Service number\n * @return {Service} Initialized service object\n */\n\n Cea708Stream.prototype.initService = function (serviceNum, i) {\n var serviceName = 'SERVICE' + serviceNum;\n var self = this;\n var serviceName;\n var encoding;\n if (serviceName in this.serviceEncodings) {\n encoding = this.serviceEncodings[serviceName];\n }\n this.services[serviceNum] = new Cea708Service(serviceNum, encoding, self);\n this.services[serviceNum].init(this.getPts(i), function (pts) {\n self.flushDisplayed(pts, self.services[serviceNum]);\n });\n return this.services[serviceNum];\n };\n /**\n * Execute text writing to current window\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.handleText = function (i, service, options) {\n var isExtended = options && options.isExtended;\n var isMultiByte = options && options.isMultiByte;\n var packetData = this.current708Packet.data;\n var extended = isExtended ? 0x1000 : 0x0000;\n var currentByte = packetData[i];\n var nextByte = packetData[i + 1];\n var win = service.currentWindow;\n var char;\n var charCodeArray; // Converts an array of bytes to a unicode hex string.\n\n function toHexString(byteArray) {\n return byteArray.map(byte => {\n return ('0' + (byte & 0xFF).toString(16)).slice(-2);\n }).join('');\n }\n if (isMultiByte) {\n charCodeArray = [currentByte, nextByte];\n i++;\n } else {\n charCodeArray = [currentByte];\n } // Use the TextDecoder if one was created for this service\n\n if (service.textDecoder_ && !isExtended) {\n char = service.textDecoder_.decode(new Uint8Array(charCodeArray));\n } else {\n // We assume any multi-byte char without a decoder is unicode.\n if (isMultiByte) {\n const unicode = toHexString(charCodeArray); // Takes a unicode hex string and creates a single character.\n\n char = String.fromCharCode(parseInt(unicode, 16));\n } else {\n char = get708CharFromCode(extended | currentByte);\n }\n }\n if (win.pendingNewLine && !win.isEmpty()) {\n win.newLine(this.getPts(i));\n }\n win.pendingNewLine = false;\n win.addText(char);\n return i;\n };\n /**\n * Handle decoding of multibyte character\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.multiByteCharacter = function (i, service) {\n var packetData = this.current708Packet.data;\n var firstByte = packetData[i + 1];\n var secondByte = packetData[i + 2];\n if (within708TextBlock(firstByte) && within708TextBlock(secondByte)) {\n i = this.handleText(++i, service, {\n isMultiByte: true\n });\n }\n return i;\n };\n /**\n * Parse and execute the CW# command.\n *\n * Set the current window.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.setCurrentWindow = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[i];\n var windowNum = b & 0x07;\n service.setCurrentWindow(windowNum);\n return i;\n };\n /**\n * Parse and execute the DF# command.\n *\n * Define a window and set it as the current window.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.defineWindow = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[i];\n var windowNum = b & 0x07;\n service.setCurrentWindow(windowNum);\n var win = service.currentWindow;\n b = packetData[++i];\n win.visible = (b & 0x20) >> 5; // v\n\n win.rowLock = (b & 0x10) >> 4; // rl\n\n win.columnLock = (b & 0x08) >> 3; // cl\n\n win.priority = b & 0x07; // p\n\n b = packetData[++i];\n win.relativePositioning = (b & 0x80) >> 7; // rp\n\n win.anchorVertical = b & 0x7f; // av\n\n b = packetData[++i];\n win.anchorHorizontal = b; // ah\n\n b = packetData[++i];\n win.anchorPoint = (b & 0xf0) >> 4; // ap\n\n win.rowCount = b & 0x0f; // rc\n\n b = packetData[++i];\n win.columnCount = b & 0x3f; // cc\n\n b = packetData[++i];\n win.windowStyle = (b & 0x38) >> 3; // ws\n\n win.penStyle = b & 0x07; // ps\n // The spec says there are (rowCount+1) \"virtual rows\"\n\n win.virtualRowCount = win.rowCount + 1;\n return i;\n };\n /**\n * Parse and execute the SWA command.\n *\n * Set attributes of the current window.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.setWindowAttributes = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[i];\n var winAttr = service.currentWindow.winAttr;\n b = packetData[++i];\n winAttr.fillOpacity = (b & 0xc0) >> 6; // fo\n\n winAttr.fillRed = (b & 0x30) >> 4; // fr\n\n winAttr.fillGreen = (b & 0x0c) >> 2; // fg\n\n winAttr.fillBlue = b & 0x03; // fb\n\n b = packetData[++i];\n winAttr.borderType = (b & 0xc0) >> 6; // bt\n\n winAttr.borderRed = (b & 0x30) >> 4; // br\n\n winAttr.borderGreen = (b & 0x0c) >> 2; // bg\n\n winAttr.borderBlue = b & 0x03; // bb\n\n b = packetData[++i];\n winAttr.borderType += (b & 0x80) >> 5; // bt\n\n winAttr.wordWrap = (b & 0x40) >> 6; // ww\n\n winAttr.printDirection = (b & 0x30) >> 4; // pd\n\n winAttr.scrollDirection = (b & 0x0c) >> 2; // sd\n\n winAttr.justify = b & 0x03; // j\n\n b = packetData[++i];\n winAttr.effectSpeed = (b & 0xf0) >> 4; // es\n\n winAttr.effectDirection = (b & 0x0c) >> 2; // ed\n\n winAttr.displayEffect = b & 0x03; // de\n\n return i;\n };\n /**\n * Gather text from all displayed windows and push a caption to output.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n */\n\n Cea708Stream.prototype.flushDisplayed = function (pts, service) {\n var displayedText = []; // TODO: Positioning not supported, displaying multiple windows will not necessarily\n // display text in the correct order, but sample files so far have not shown any issue.\n\n for (var winId = 0; winId < 8; winId++) {\n if (service.windows[winId].visible && !service.windows[winId].isEmpty()) {\n displayedText.push(service.windows[winId].getText());\n }\n }\n service.endPts = pts;\n service.text = displayedText.join('\\n\\n');\n this.pushCaption(service);\n service.startPts = pts;\n };\n /**\n * Push a caption to output if the caption contains text.\n *\n * @param {Service} service The service object to be affected\n */\n\n Cea708Stream.prototype.pushCaption = function (service) {\n if (service.text !== '') {\n this.trigger('data', {\n startPts: service.startPts,\n endPts: service.endPts,\n text: service.text,\n stream: 'cc708_' + service.serviceNum\n });\n service.text = '';\n service.startPts = service.endPts;\n }\n };\n /**\n * Parse and execute the DSW command.\n *\n * Set visible property of windows based on the parsed bitmask.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.displayWindows = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[++i];\n var pts = this.getPts(i);\n this.flushDisplayed(pts, service);\n for (var winId = 0; winId < 8; winId++) {\n if (b & 0x01 << winId) {\n service.windows[winId].visible = 1;\n }\n }\n return i;\n };\n /**\n * Parse and execute the HDW command.\n *\n * Set visible property of windows based on the parsed bitmask.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.hideWindows = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[++i];\n var pts = this.getPts(i);\n this.flushDisplayed(pts, service);\n for (var winId = 0; winId < 8; winId++) {\n if (b & 0x01 << winId) {\n service.windows[winId].visible = 0;\n }\n }\n return i;\n };\n /**\n * Parse and execute the TGW command.\n *\n * Set visible property of windows based on the parsed bitmask.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.toggleWindows = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[++i];\n var pts = this.getPts(i);\n this.flushDisplayed(pts, service);\n for (var winId = 0; winId < 8; winId++) {\n if (b & 0x01 << winId) {\n service.windows[winId].visible ^= 1;\n }\n }\n return i;\n };\n /**\n * Parse and execute the CLW command.\n *\n * Clear text of windows based on the parsed bitmask.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.clearWindows = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[++i];\n var pts = this.getPts(i);\n this.flushDisplayed(pts, service);\n for (var winId = 0; winId < 8; winId++) {\n if (b & 0x01 << winId) {\n service.windows[winId].clearText();\n }\n }\n return i;\n };\n /**\n * Parse and execute the DLW command.\n *\n * Re-initialize windows based on the parsed bitmask.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.deleteWindows = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[++i];\n var pts = this.getPts(i);\n this.flushDisplayed(pts, service);\n for (var winId = 0; winId < 8; winId++) {\n if (b & 0x01 << winId) {\n service.windows[winId].reset();\n }\n }\n return i;\n };\n /**\n * Parse and execute the SPA command.\n *\n * Set pen attributes of the current window.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.setPenAttributes = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[i];\n var penAttr = service.currentWindow.penAttr;\n b = packetData[++i];\n penAttr.textTag = (b & 0xf0) >> 4; // tt\n\n penAttr.offset = (b & 0x0c) >> 2; // o\n\n penAttr.penSize = b & 0x03; // s\n\n b = packetData[++i];\n penAttr.italics = (b & 0x80) >> 7; // i\n\n penAttr.underline = (b & 0x40) >> 6; // u\n\n penAttr.edgeType = (b & 0x38) >> 3; // et\n\n penAttr.fontStyle = b & 0x07; // fs\n\n return i;\n };\n /**\n * Parse and execute the SPC command.\n *\n * Set pen color of the current window.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.setPenColor = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[i];\n var penColor = service.currentWindow.penColor;\n b = packetData[++i];\n penColor.fgOpacity = (b & 0xc0) >> 6; // fo\n\n penColor.fgRed = (b & 0x30) >> 4; // fr\n\n penColor.fgGreen = (b & 0x0c) >> 2; // fg\n\n penColor.fgBlue = b & 0x03; // fb\n\n b = packetData[++i];\n penColor.bgOpacity = (b & 0xc0) >> 6; // bo\n\n penColor.bgRed = (b & 0x30) >> 4; // br\n\n penColor.bgGreen = (b & 0x0c) >> 2; // bg\n\n penColor.bgBlue = b & 0x03; // bb\n\n b = packetData[++i];\n penColor.edgeRed = (b & 0x30) >> 4; // er\n\n penColor.edgeGreen = (b & 0x0c) >> 2; // eg\n\n penColor.edgeBlue = b & 0x03; // eb\n\n return i;\n };\n /**\n * Parse and execute the SPL command.\n *\n * Set pen location of the current window.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Integer} New index after parsing\n */\n\n Cea708Stream.prototype.setPenLocation = function (i, service) {\n var packetData = this.current708Packet.data;\n var b = packetData[i];\n var penLoc = service.currentWindow.penLoc; // Positioning isn't really supported at the moment, so this essentially just inserts a linebreak\n\n service.currentWindow.pendingNewLine = true;\n b = packetData[++i];\n penLoc.row = b & 0x0f; // r\n\n b = packetData[++i];\n penLoc.column = b & 0x3f; // c\n\n return i;\n };\n /**\n * Execute the RST command.\n *\n * Reset service to a clean slate. Re-initialize.\n *\n * @param {Integer} i Current index in the 708 packet\n * @param {Service} service The service object to be affected\n * @return {Service} Re-initialized service\n */\n\n Cea708Stream.prototype.reset = function (i, service) {\n var pts = this.getPts(i);\n this.flushDisplayed(pts, service);\n return this.initService(service.serviceNum, i);\n }; // This hash maps non-ASCII, special, and extended character codes to their\n // proper Unicode equivalent. The first keys that are only a single byte\n // are the non-standard ASCII characters, which simply map the CEA608 byte\n // to the standard ASCII/Unicode. The two-byte keys that follow are the CEA608\n // character codes, but have their MSB bitmasked with 0x03 so that a lookup\n // can be performed regardless of the field and data channel on which the\n // character code was received.\n\n var CHARACTER_TRANSLATION = {\n 0x2a: 0xe1,\n // á\n 0x5c: 0xe9,\n // é\n 0x5e: 0xed,\n // í\n 0x5f: 0xf3,\n // ó\n 0x60: 0xfa,\n // ú\n 0x7b: 0xe7,\n // ç\n 0x7c: 0xf7,\n // ÷\n 0x7d: 0xd1,\n // Ñ\n 0x7e: 0xf1,\n // ñ\n 0x7f: 0x2588,\n // █\n 0x0130: 0xae,\n // ®\n 0x0131: 0xb0,\n // °\n 0x0132: 0xbd,\n // ½\n 0x0133: 0xbf,\n // ¿\n 0x0134: 0x2122,\n // ™\n 0x0135: 0xa2,\n // ¢\n 0x0136: 0xa3,\n // £\n 0x0137: 0x266a,\n // ♪\n 0x0138: 0xe0,\n // à\n 0x0139: 0xa0,\n //\n 0x013a: 0xe8,\n // è\n 0x013b: 0xe2,\n // â\n 0x013c: 0xea,\n // ê\n 0x013d: 0xee,\n // î\n 0x013e: 0xf4,\n // ô\n 0x013f: 0xfb,\n // û\n 0x0220: 0xc1,\n // Á\n 0x0221: 0xc9,\n // É\n 0x0222: 0xd3,\n // Ó\n 0x0223: 0xda,\n // Ú\n 0x0224: 0xdc,\n // Ü\n 0x0225: 0xfc,\n // ü\n 0x0226: 0x2018,\n // ‘\n 0x0227: 0xa1,\n // ¡\n 0x0228: 0x2a,\n // *\n 0x0229: 0x27,\n // '\n 0x022a: 0x2014,\n // —\n 0x022b: 0xa9,\n // ©\n 0x022c: 0x2120,\n // ℠\n 0x022d: 0x2022,\n // •\n 0x022e: 0x201c,\n // “\n 0x022f: 0x201d,\n // ”\n 0x0230: 0xc0,\n // À\n 0x0231: 0xc2,\n // Â\n 0x0232: 0xc7,\n // Ç\n 0x0233: 0xc8,\n // È\n 0x0234: 0xca,\n // Ê\n 0x0235: 0xcb,\n // Ë\n 0x0236: 0xeb,\n // ë\n 0x0237: 0xce,\n // Î\n 0x0238: 0xcf,\n // Ï\n 0x0239: 0xef,\n // ï\n 0x023a: 0xd4,\n // Ô\n 0x023b: 0xd9,\n // Ù\n 0x023c: 0xf9,\n // ù\n 0x023d: 0xdb,\n // Û\n 0x023e: 0xab,\n // «\n 0x023f: 0xbb,\n // »\n 0x0320: 0xc3,\n // Ã\n 0x0321: 0xe3,\n // ã\n 0x0322: 0xcd,\n // Í\n 0x0323: 0xcc,\n // Ì\n 0x0324: 0xec,\n // ì\n 0x0325: 0xd2,\n // Ò\n 0x0326: 0xf2,\n // ò\n 0x0327: 0xd5,\n // Õ\n 0x0328: 0xf5,\n // õ\n 0x0329: 0x7b,\n // {\n 0x032a: 0x7d,\n // }\n 0x032b: 0x5c,\n // \\\n 0x032c: 0x5e,\n // ^\n 0x032d: 0x5f,\n // _\n 0x032e: 0x7c,\n // |\n 0x032f: 0x7e,\n // ~\n 0x0330: 0xc4,\n // Ä\n 0x0331: 0xe4,\n // ä\n 0x0332: 0xd6,\n // Ö\n 0x0333: 0xf6,\n // ö\n 0x0334: 0xdf,\n // ß\n 0x0335: 0xa5,\n // ¥\n 0x0336: 0xa4,\n // ¤\n 0x0337: 0x2502,\n // │\n 0x0338: 0xc5,\n // Å\n 0x0339: 0xe5,\n // å\n 0x033a: 0xd8,\n // Ø\n 0x033b: 0xf8,\n // ø\n 0x033c: 0x250c,\n // ┌\n 0x033d: 0x2510,\n // ┐\n 0x033e: 0x2514,\n // └\n 0x033f: 0x2518 // ┘\n };\n var getCharFromCode = function (code) {\n if (code === null) {\n return '';\n }\n code = CHARACTER_TRANSLATION[code] || code;\n return String.fromCharCode(code);\n }; // the index of the last row in a CEA-608 display buffer\n\n var BOTTOM_ROW = 14; // This array is used for mapping PACs -> row #, since there's no way of\n // getting it through bit logic.\n\n var ROWS = [0x1100, 0x1120, 0x1200, 0x1220, 0x1500, 0x1520, 0x1600, 0x1620, 0x1700, 0x1720, 0x1000, 0x1300, 0x1320, 0x1400, 0x1420]; // CEA-608 captions are rendered onto a 34x15 matrix of character\n // cells. The \"bottom\" row is the last element in the outer array.\n // We keep track of positioning information as we go by storing the\n // number of indentations and the tab offset in this buffer.\n\n var createDisplayBuffer = function () {\n var result = [],\n i = BOTTOM_ROW + 1;\n while (i--) {\n result.push({\n text: '',\n indent: 0,\n offset: 0\n });\n }\n return result;\n };\n var Cea608Stream = function (field, dataChannel) {\n Cea608Stream.prototype.init.call(this);\n this.field_ = field || 0;\n this.dataChannel_ = dataChannel || 0;\n this.name_ = 'CC' + ((this.field_ << 1 | this.dataChannel_) + 1);\n this.setConstants();\n this.reset();\n this.push = function (packet) {\n var data, swap, char0, char1, text; // remove the parity bits\n\n data = packet.ccData & 0x7f7f; // ignore duplicate control codes; the spec demands they're sent twice\n\n if (data === this.lastControlCode_) {\n this.lastControlCode_ = null;\n return;\n } // Store control codes\n\n if ((data & 0xf000) === 0x1000) {\n this.lastControlCode_ = data;\n } else if (data !== this.PADDING_) {\n this.lastControlCode_ = null;\n }\n char0 = data >>> 8;\n char1 = data & 0xff;\n if (data === this.PADDING_) {\n return;\n } else if (data === this.RESUME_CAPTION_LOADING_) {\n this.mode_ = 'popOn';\n } else if (data === this.END_OF_CAPTION_) {\n // If an EOC is received while in paint-on mode, the displayed caption\n // text should be swapped to non-displayed memory as if it was a pop-on\n // caption. Because of that, we should explicitly switch back to pop-on\n // mode\n this.mode_ = 'popOn';\n this.clearFormatting(packet.pts); // if a caption was being displayed, it's gone now\n\n this.flushDisplayed(packet.pts); // flip memory\n\n swap = this.displayed_;\n this.displayed_ = this.nonDisplayed_;\n this.nonDisplayed_ = swap; // start measuring the time to display the caption\n\n this.startPts_ = packet.pts;\n } else if (data === this.ROLL_UP_2_ROWS_) {\n this.rollUpRows_ = 2;\n this.setRollUp(packet.pts);\n } else if (data === this.ROLL_UP_3_ROWS_) {\n this.rollUpRows_ = 3;\n this.setRollUp(packet.pts);\n } else if (data === this.ROLL_UP_4_ROWS_) {\n this.rollUpRows_ = 4;\n this.setRollUp(packet.pts);\n } else if (data === this.CARRIAGE_RETURN_) {\n this.clearFormatting(packet.pts);\n this.flushDisplayed(packet.pts);\n this.shiftRowsUp_();\n this.startPts_ = packet.pts;\n } else if (data === this.BACKSPACE_) {\n if (this.mode_ === 'popOn') {\n this.nonDisplayed_[this.row_].text = this.nonDisplayed_[this.row_].text.slice(0, -1);\n } else {\n this.displayed_[this.row_].text = this.displayed_[this.row_].text.slice(0, -1);\n }\n } else if (data === this.ERASE_DISPLAYED_MEMORY_) {\n this.flushDisplayed(packet.pts);\n this.displayed_ = createDisplayBuffer();\n } else if (data === this.ERASE_NON_DISPLAYED_MEMORY_) {\n this.nonDisplayed_ = createDisplayBuffer();\n } else if (data === this.RESUME_DIRECT_CAPTIONING_) {\n if (this.mode_ !== 'paintOn') {\n // NOTE: This should be removed when proper caption positioning is\n // implemented\n this.flushDisplayed(packet.pts);\n this.displayed_ = createDisplayBuffer();\n }\n this.mode_ = 'paintOn';\n this.startPts_ = packet.pts; // Append special characters to caption text\n } else if (this.isSpecialCharacter(char0, char1)) {\n // Bitmask char0 so that we can apply character transformations\n // regardless of field and data channel.\n // Then byte-shift to the left and OR with char1 so we can pass the\n // entire character code to `getCharFromCode`.\n char0 = (char0 & 0x03) << 8;\n text = getCharFromCode(char0 | char1);\n this[this.mode_](packet.pts, text);\n this.column_++; // Append extended characters to caption text\n } else if (this.isExtCharacter(char0, char1)) {\n // Extended characters always follow their \"non-extended\" equivalents.\n // IE if a \"è\" is desired, you'll always receive \"eè\"; non-compliant\n // decoders are supposed to drop the \"è\", while compliant decoders\n // backspace the \"e\" and insert \"è\".\n // Delete the previous character\n if (this.mode_ === 'popOn') {\n this.nonDisplayed_[this.row_].text = this.nonDisplayed_[this.row_].text.slice(0, -1);\n } else {\n this.displayed_[this.row_].text = this.displayed_[this.row_].text.slice(0, -1);\n } // Bitmask char0 so that we can apply character transformations\n // regardless of field and data channel.\n // Then byte-shift to the left and OR with char1 so we can pass the\n // entire character code to `getCharFromCode`.\n\n char0 = (char0 & 0x03) << 8;\n text = getCharFromCode(char0 | char1);\n this[this.mode_](packet.pts, text);\n this.column_++; // Process mid-row codes\n } else if (this.isMidRowCode(char0, char1)) {\n // Attributes are not additive, so clear all formatting\n this.clearFormatting(packet.pts); // According to the standard, mid-row codes\n // should be replaced with spaces, so add one now\n\n this[this.mode_](packet.pts, ' ');\n this.column_++;\n if ((char1 & 0xe) === 0xe) {\n this.addFormatting(packet.pts, ['i']);\n }\n if ((char1 & 0x1) === 0x1) {\n this.addFormatting(packet.pts, ['u']);\n } // Detect offset control codes and adjust cursor\n } else if (this.isOffsetControlCode(char0, char1)) {\n // Cursor position is set by indent PAC (see below) in 4-column\n // increments, with an additional offset code of 1-3 to reach any\n // of the 32 columns specified by CEA-608. So all we need to do\n // here is increment the column cursor by the given offset.\n const offset = char1 & 0x03; // For an offest value 1-3, set the offset for that caption\n // in the non-displayed array.\n\n this.nonDisplayed_[this.row_].offset = offset;\n this.column_ += offset; // Detect PACs (Preamble Address Codes)\n } else if (this.isPAC(char0, char1)) {\n // There's no logic for PAC -> row mapping, so we have to just\n // find the row code in an array and use its index :(\n var row = ROWS.indexOf(data & 0x1f20); // Configure the caption window if we're in roll-up mode\n\n if (this.mode_ === 'rollUp') {\n // This implies that the base row is incorrectly set.\n // As per the recommendation in CEA-608(Base Row Implementation), defer to the number\n // of roll-up rows set.\n if (row - this.rollUpRows_ + 1 < 0) {\n row = this.rollUpRows_ - 1;\n }\n this.setRollUp(packet.pts, row);\n } // Ensure the row is between 0 and 14, otherwise use the most\n // recent or default row.\n\n if (row !== this.row_ && row >= 0 && row <= 14) {\n // formatting is only persistent for current row\n this.clearFormatting(packet.pts);\n this.row_ = row;\n } // All PACs can apply underline, so detect and apply\n // (All odd-numbered second bytes set underline)\n\n if (char1 & 0x1 && this.formatting_.indexOf('u') === -1) {\n this.addFormatting(packet.pts, ['u']);\n }\n if ((data & 0x10) === 0x10) {\n // We've got an indent level code. Each successive even number\n // increments the column cursor by 4, so we can get the desired\n // column position by bit-shifting to the right (to get n/2)\n // and multiplying by 4.\n const indentations = (data & 0xe) >> 1;\n this.column_ = indentations * 4; // add to the number of indentations for positioning\n\n this.nonDisplayed_[this.row_].indent += indentations;\n }\n if (this.isColorPAC(char1)) {\n // it's a color code, though we only support white, which\n // can be either normal or italicized. white italics can be\n // either 0x4e or 0x6e depending on the row, so we just\n // bitwise-and with 0xe to see if italics should be turned on\n if ((char1 & 0xe) === 0xe) {\n this.addFormatting(packet.pts, ['i']);\n }\n } // We have a normal character in char0, and possibly one in char1\n } else if (this.isNormalChar(char0)) {\n if (char1 === 0x00) {\n char1 = null;\n }\n text = getCharFromCode(char0);\n text += getCharFromCode(char1);\n this[this.mode_](packet.pts, text);\n this.column_ += text.length;\n } // finish data processing\n };\n };\n Cea608Stream.prototype = new Stream$7(); // Trigger a cue point that captures the current state of the\n // display buffer\n\n Cea608Stream.prototype.flushDisplayed = function (pts) {\n const logWarning = index => {\n this.trigger('log', {\n level: 'warn',\n message: 'Skipping a malformed 608 caption at index ' + index + '.'\n });\n };\n const content = [];\n this.displayed_.forEach((row, i) => {\n if (row && row.text && row.text.length) {\n try {\n // remove spaces from the start and end of the string\n row.text = row.text.trim();\n } catch (e) {\n // Ordinarily, this shouldn't happen. However, caption\n // parsing errors should not throw exceptions and\n // break playback.\n logWarning(i);\n } // See the below link for more details on the following fields:\n // https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/608toVTT.html#positioning-in-cea-608\n\n if (row.text.length) {\n content.push({\n // The text to be displayed in the caption from this specific row, with whitespace removed.\n text: row.text,\n // Value between 1 and 15 representing the PAC row used to calculate line height.\n line: i + 1,\n // A number representing the indent position by percentage (CEA-608 PAC indent code).\n // The value will be a number between 10 and 80. Offset is used to add an aditional\n // value to the position if necessary.\n position: 10 + Math.min(70, row.indent * 10) + row.offset * 2.5\n });\n }\n } else if (row === undefined || row === null) {\n logWarning(i);\n }\n });\n if (content.length) {\n this.trigger('data', {\n startPts: this.startPts_,\n endPts: pts,\n content,\n stream: this.name_\n });\n }\n };\n /**\n * Zero out the data, used for startup and on seek\n */\n\n Cea608Stream.prototype.reset = function () {\n this.mode_ = 'popOn'; // When in roll-up mode, the index of the last row that will\n // actually display captions. If a caption is shifted to a row\n // with a lower index than this, it is cleared from the display\n // buffer\n\n this.topRow_ = 0;\n this.startPts_ = 0;\n this.displayed_ = createDisplayBuffer();\n this.nonDisplayed_ = createDisplayBuffer();\n this.lastControlCode_ = null; // Track row and column for proper line-breaking and spacing\n\n this.column_ = 0;\n this.row_ = BOTTOM_ROW;\n this.rollUpRows_ = 2; // This variable holds currently-applied formatting\n\n this.formatting_ = [];\n };\n /**\n * Sets up control code and related constants for this instance\n */\n\n Cea608Stream.prototype.setConstants = function () {\n // The following attributes have these uses:\n // ext_ : char0 for mid-row codes, and the base for extended\n // chars (ext_+0, ext_+1, and ext_+2 are char0s for\n // extended codes)\n // control_: char0 for control codes, except byte-shifted to the\n // left so that we can do this.control_ | CONTROL_CODE\n // offset_: char0 for tab offset codes\n //\n // It's also worth noting that control codes, and _only_ control codes,\n // differ between field 1 and field2. Field 2 control codes are always\n // their field 1 value plus 1. That's why there's the \"| field\" on the\n // control value.\n if (this.dataChannel_ === 0) {\n this.BASE_ = 0x10;\n this.EXT_ = 0x11;\n this.CONTROL_ = (0x14 | this.field_) << 8;\n this.OFFSET_ = 0x17;\n } else if (this.dataChannel_ === 1) {\n this.BASE_ = 0x18;\n this.EXT_ = 0x19;\n this.CONTROL_ = (0x1c | this.field_) << 8;\n this.OFFSET_ = 0x1f;\n } // Constants for the LSByte command codes recognized by Cea608Stream. This\n // list is not exhaustive. For a more comprehensive listing and semantics see\n // http://www.gpo.gov/fdsys/pkg/CFR-2010-title47-vol1/pdf/CFR-2010-title47-vol1-sec15-119.pdf\n // Padding\n\n this.PADDING_ = 0x0000; // Pop-on Mode\n\n this.RESUME_CAPTION_LOADING_ = this.CONTROL_ | 0x20;\n this.END_OF_CAPTION_ = this.CONTROL_ | 0x2f; // Roll-up Mode\n\n this.ROLL_UP_2_ROWS_ = this.CONTROL_ | 0x25;\n this.ROLL_UP_3_ROWS_ = this.CONTROL_ | 0x26;\n this.ROLL_UP_4_ROWS_ = this.CONTROL_ | 0x27;\n this.CARRIAGE_RETURN_ = this.CONTROL_ | 0x2d; // paint-on mode\n\n this.RESUME_DIRECT_CAPTIONING_ = this.CONTROL_ | 0x29; // Erasure\n\n this.BACKSPACE_ = this.CONTROL_ | 0x21;\n this.ERASE_DISPLAYED_MEMORY_ = this.CONTROL_ | 0x2c;\n this.ERASE_NON_DISPLAYED_MEMORY_ = this.CONTROL_ | 0x2e;\n };\n /**\n * Detects if the 2-byte packet data is a special character\n *\n * Special characters have a second byte in the range 0x30 to 0x3f,\n * with the first byte being 0x11 (for data channel 1) or 0x19 (for\n * data channel 2).\n *\n * @param {Integer} char0 The first byte\n * @param {Integer} char1 The second byte\n * @return {Boolean} Whether the 2 bytes are an special character\n */\n\n Cea608Stream.prototype.isSpecialCharacter = function (char0, char1) {\n return char0 === this.EXT_ && char1 >= 0x30 && char1 <= 0x3f;\n };\n /**\n * Detects if the 2-byte packet data is an extended character\n *\n * Extended characters have a second byte in the range 0x20 to 0x3f,\n * with the first byte being 0x12 or 0x13 (for data channel 1) or\n * 0x1a or 0x1b (for data channel 2).\n *\n * @param {Integer} char0 The first byte\n * @param {Integer} char1 The second byte\n * @return {Boolean} Whether the 2 bytes are an extended character\n */\n\n Cea608Stream.prototype.isExtCharacter = function (char0, char1) {\n return (char0 === this.EXT_ + 1 || char0 === this.EXT_ + 2) && char1 >= 0x20 && char1 <= 0x3f;\n };\n /**\n * Detects if the 2-byte packet is a mid-row code\n *\n * Mid-row codes have a second byte in the range 0x20 to 0x2f, with\n * the first byte being 0x11 (for data channel 1) or 0x19 (for data\n * channel 2).\n *\n * @param {Integer} char0 The first byte\n * @param {Integer} char1 The second byte\n * @return {Boolean} Whether the 2 bytes are a mid-row code\n */\n\n Cea608Stream.prototype.isMidRowCode = function (char0, char1) {\n return char0 === this.EXT_ && char1 >= 0x20 && char1 <= 0x2f;\n };\n /**\n * Detects if the 2-byte packet is an offset control code\n *\n * Offset control codes have a second byte in the range 0x21 to 0x23,\n * with the first byte being 0x17 (for data channel 1) or 0x1f (for\n * data channel 2).\n *\n * @param {Integer} char0 The first byte\n * @param {Integer} char1 The second byte\n * @return {Boolean} Whether the 2 bytes are an offset control code\n */\n\n Cea608Stream.prototype.isOffsetControlCode = function (char0, char1) {\n return char0 === this.OFFSET_ && char1 >= 0x21 && char1 <= 0x23;\n };\n /**\n * Detects if the 2-byte packet is a Preamble Address Code\n *\n * PACs have a first byte in the range 0x10 to 0x17 (for data channel 1)\n * or 0x18 to 0x1f (for data channel 2), with the second byte in the\n * range 0x40 to 0x7f.\n *\n * @param {Integer} char0 The first byte\n * @param {Integer} char1 The second byte\n * @return {Boolean} Whether the 2 bytes are a PAC\n */\n\n Cea608Stream.prototype.isPAC = function (char0, char1) {\n return char0 >= this.BASE_ && char0 < this.BASE_ + 8 && char1 >= 0x40 && char1 <= 0x7f;\n };\n /**\n * Detects if a packet's second byte is in the range of a PAC color code\n *\n * PAC color codes have the second byte be in the range 0x40 to 0x4f, or\n * 0x60 to 0x6f.\n *\n * @param {Integer} char1 The second byte\n * @return {Boolean} Whether the byte is a color PAC\n */\n\n Cea608Stream.prototype.isColorPAC = function (char1) {\n return char1 >= 0x40 && char1 <= 0x4f || char1 >= 0x60 && char1 <= 0x7f;\n };\n /**\n * Detects if a single byte is in the range of a normal character\n *\n * Normal text bytes are in the range 0x20 to 0x7f.\n *\n * @param {Integer} char The byte\n * @return {Boolean} Whether the byte is a normal character\n */\n\n Cea608Stream.prototype.isNormalChar = function (char) {\n return char >= 0x20 && char <= 0x7f;\n };\n /**\n * Configures roll-up\n *\n * @param {Integer} pts Current PTS\n * @param {Integer} newBaseRow Used by PACs to slide the current window to\n * a new position\n */\n\n Cea608Stream.prototype.setRollUp = function (pts, newBaseRow) {\n // Reset the base row to the bottom row when switching modes\n if (this.mode_ !== 'rollUp') {\n this.row_ = BOTTOM_ROW;\n this.mode_ = 'rollUp'; // Spec says to wipe memories when switching to roll-up\n\n this.flushDisplayed(pts);\n this.nonDisplayed_ = createDisplayBuffer();\n this.displayed_ = createDisplayBuffer();\n }\n if (newBaseRow !== undefined && newBaseRow !== this.row_) {\n // move currently displayed captions (up or down) to the new base row\n for (var i = 0; i < this.rollUpRows_; i++) {\n this.displayed_[newBaseRow - i] = this.displayed_[this.row_ - i];\n this.displayed_[this.row_ - i] = {\n text: '',\n indent: 0,\n offset: 0\n };\n }\n }\n if (newBaseRow === undefined) {\n newBaseRow = this.row_;\n }\n this.topRow_ = newBaseRow - this.rollUpRows_ + 1;\n }; // Adds the opening HTML tag for the passed character to the caption text,\n // and keeps track of it for later closing\n\n Cea608Stream.prototype.addFormatting = function (pts, format) {\n this.formatting_ = this.formatting_.concat(format);\n var text = format.reduce(function (text, format) {\n return text + '<' + format + '>';\n }, '');\n this[this.mode_](pts, text);\n }; // Adds HTML closing tags for current formatting to caption text and\n // clears remembered formatting\n\n Cea608Stream.prototype.clearFormatting = function (pts) {\n if (!this.formatting_.length) {\n return;\n }\n var text = this.formatting_.reverse().reduce(function (text, format) {\n return text + '';\n }, '');\n this.formatting_ = [];\n this[this.mode_](pts, text);\n }; // Mode Implementations\n\n Cea608Stream.prototype.popOn = function (pts, text) {\n var baseRow = this.nonDisplayed_[this.row_].text; // buffer characters\n\n baseRow += text;\n this.nonDisplayed_[this.row_].text = baseRow;\n };\n Cea608Stream.prototype.rollUp = function (pts, text) {\n var baseRow = this.displayed_[this.row_].text;\n baseRow += text;\n this.displayed_[this.row_].text = baseRow;\n };\n Cea608Stream.prototype.shiftRowsUp_ = function () {\n var i; // clear out inactive rows\n\n for (i = 0; i < this.topRow_; i++) {\n this.displayed_[i] = {\n text: '',\n indent: 0,\n offset: 0\n };\n }\n for (i = this.row_ + 1; i < BOTTOM_ROW + 1; i++) {\n this.displayed_[i] = {\n text: '',\n indent: 0,\n offset: 0\n };\n } // shift displayed rows up\n\n for (i = this.topRow_; i < this.row_; i++) {\n this.displayed_[i] = this.displayed_[i + 1];\n } // clear out the bottom row\n\n this.displayed_[this.row_] = {\n text: '',\n indent: 0,\n offset: 0\n };\n };\n Cea608Stream.prototype.paintOn = function (pts, text) {\n var baseRow = this.displayed_[this.row_].text;\n baseRow += text;\n this.displayed_[this.row_].text = baseRow;\n }; // exports\n\n var captionStream = {\n CaptionStream: CaptionStream$2,\n Cea608Stream: Cea608Stream,\n Cea708Stream: Cea708Stream\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var streamTypes = {\n H264_STREAM_TYPE: 0x1B,\n ADTS_STREAM_TYPE: 0x0F,\n METADATA_STREAM_TYPE: 0x15\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Accepts program elementary stream (PES) data events and corrects\n * decode and presentation time stamps to account for a rollover\n * of the 33 bit value.\n */\n\n var Stream$6 = stream;\n var MAX_TS = 8589934592;\n var RO_THRESH = 4294967296;\n var TYPE_SHARED = 'shared';\n var handleRollover$1 = function (value, reference) {\n var direction = 1;\n if (value > reference) {\n // If the current timestamp value is greater than our reference timestamp and we detect a\n // timestamp rollover, this means the roll over is happening in the opposite direction.\n // Example scenario: Enter a long stream/video just after a rollover occurred. The reference\n // point will be set to a small number, e.g. 1. The user then seeks backwards over the\n // rollover point. In loading this segment, the timestamp values will be very large,\n // e.g. 2^33 - 1. Since this comes before the data we loaded previously, we want to adjust\n // the time stamp to be `value - 2^33`.\n direction = -1;\n } // Note: A seek forwards or back that is greater than the RO_THRESH (2^32, ~13 hours) will\n // cause an incorrect adjustment.\n\n while (Math.abs(reference - value) > RO_THRESH) {\n value += direction * MAX_TS;\n }\n return value;\n };\n var TimestampRolloverStream$1 = function (type) {\n var lastDTS, referenceDTS;\n TimestampRolloverStream$1.prototype.init.call(this); // The \"shared\" type is used in cases where a stream will contain muxed\n // video and audio. We could use `undefined` here, but having a string\n // makes debugging a little clearer.\n\n this.type_ = type || TYPE_SHARED;\n this.push = function (data) {\n /**\n * Rollover stream expects data from elementary stream.\n * Elementary stream can push forward 2 types of data\n * - Parsed Video/Audio/Timed-metadata PES (packetized elementary stream) packets\n * - Tracks metadata from PMT (Program Map Table)\n * Rollover stream expects pts/dts info to be available, since it stores lastDTS\n * We should ignore non-PES packets since they may override lastDTS to undefined.\n * lastDTS is important to signal the next segments\n * about rollover from the previous segments.\n */\n if (data.type === 'metadata') {\n this.trigger('data', data);\n return;\n } // Any \"shared\" rollover streams will accept _all_ data. Otherwise,\n // streams will only accept data that matches their type.\n\n if (this.type_ !== TYPE_SHARED && data.type !== this.type_) {\n return;\n }\n if (referenceDTS === undefined) {\n referenceDTS = data.dts;\n }\n data.dts = handleRollover$1(data.dts, referenceDTS);\n data.pts = handleRollover$1(data.pts, referenceDTS);\n lastDTS = data.dts;\n this.trigger('data', data);\n };\n this.flush = function () {\n referenceDTS = lastDTS;\n this.trigger('done');\n };\n this.endTimeline = function () {\n this.flush();\n this.trigger('endedtimeline');\n };\n this.discontinuity = function () {\n referenceDTS = void 0;\n lastDTS = void 0;\n };\n this.reset = function () {\n this.discontinuity();\n this.trigger('reset');\n };\n };\n TimestampRolloverStream$1.prototype = new Stream$6();\n var timestampRolloverStream = {\n TimestampRolloverStream: TimestampRolloverStream$1,\n handleRollover: handleRollover$1\n }; // Once IE11 support is dropped, this function should be removed.\n\n var typedArrayIndexOf$1 = (typedArray, element, fromIndex) => {\n if (!typedArray) {\n return -1;\n }\n var currentIndex = fromIndex;\n for (; currentIndex < typedArray.length; currentIndex++) {\n if (typedArray[currentIndex] === element) {\n return currentIndex;\n }\n }\n return -1;\n };\n var typedArray = {\n typedArrayIndexOf: typedArrayIndexOf$1\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Tools for parsing ID3 frame data\n * @see http://id3.org/id3v2.3.0\n */\n\n var typedArrayIndexOf = typedArray.typedArrayIndexOf,\n // Frames that allow different types of text encoding contain a text\n // encoding description byte [ID3v2.4.0 section 4.]\n textEncodingDescriptionByte = {\n Iso88591: 0x00,\n // ISO-8859-1, terminated with \\0.\n Utf16: 0x01,\n // UTF-16 encoded Unicode BOM, terminated with \\0\\0\n Utf16be: 0x02,\n // UTF-16BE encoded Unicode, without BOM, terminated with \\0\\0\n Utf8: 0x03 // UTF-8 encoded Unicode, terminated with \\0\n },\n // return a percent-encoded representation of the specified byte range\n // @see http://en.wikipedia.org/wiki/Percent-encoding \n percentEncode$1 = function (bytes, start, end) {\n var i,\n result = '';\n for (i = start; i < end; i++) {\n result += '%' + ('00' + bytes[i].toString(16)).slice(-2);\n }\n return result;\n },\n // return the string representation of the specified byte range,\n // interpreted as UTf-8.\n parseUtf8 = function (bytes, start, end) {\n return decodeURIComponent(percentEncode$1(bytes, start, end));\n },\n // return the string representation of the specified byte range,\n // interpreted as ISO-8859-1.\n parseIso88591$1 = function (bytes, start, end) {\n return unescape(percentEncode$1(bytes, start, end)); // jshint ignore:line\n },\n parseSyncSafeInteger$1 = function (data) {\n return data[0] << 21 | data[1] << 14 | data[2] << 7 | data[3];\n },\n frameParsers = {\n 'APIC': function (frame) {\n var i = 1,\n mimeTypeEndIndex,\n descriptionEndIndex,\n LINK_MIME_TYPE = '-->';\n if (frame.data[0] !== textEncodingDescriptionByte.Utf8) {\n // ignore frames with unrecognized character encodings\n return;\n } // parsing fields [ID3v2.4.0 section 4.14.]\n\n mimeTypeEndIndex = typedArrayIndexOf(frame.data, 0, i);\n if (mimeTypeEndIndex < 0) {\n // malformed frame\n return;\n } // parsing Mime type field (terminated with \\0)\n\n frame.mimeType = parseIso88591$1(frame.data, i, mimeTypeEndIndex);\n i = mimeTypeEndIndex + 1; // parsing 1-byte Picture Type field\n\n frame.pictureType = frame.data[i];\n i++;\n descriptionEndIndex = typedArrayIndexOf(frame.data, 0, i);\n if (descriptionEndIndex < 0) {\n // malformed frame\n return;\n } // parsing Description field (terminated with \\0)\n\n frame.description = parseUtf8(frame.data, i, descriptionEndIndex);\n i = descriptionEndIndex + 1;\n if (frame.mimeType === LINK_MIME_TYPE) {\n // parsing Picture Data field as URL (always represented as ISO-8859-1 [ID3v2.4.0 section 4.])\n frame.url = parseIso88591$1(frame.data, i, frame.data.length);\n } else {\n // parsing Picture Data field as binary data\n frame.pictureData = frame.data.subarray(i, frame.data.length);\n }\n },\n 'T*': function (frame) {\n if (frame.data[0] !== textEncodingDescriptionByte.Utf8) {\n // ignore frames with unrecognized character encodings\n return;\n } // parse text field, do not include null terminator in the frame value\n // frames that allow different types of encoding contain terminated text [ID3v2.4.0 section 4.]\n\n frame.value = parseUtf8(frame.data, 1, frame.data.length).replace(/\\0*$/, ''); // text information frames supports multiple strings, stored as a terminator separated list [ID3v2.4.0 section 4.2.]\n\n frame.values = frame.value.split('\\0');\n },\n 'TXXX': function (frame) {\n var descriptionEndIndex;\n if (frame.data[0] !== textEncodingDescriptionByte.Utf8) {\n // ignore frames with unrecognized character encodings\n return;\n }\n descriptionEndIndex = typedArrayIndexOf(frame.data, 0, 1);\n if (descriptionEndIndex === -1) {\n return;\n } // parse the text fields\n\n frame.description = parseUtf8(frame.data, 1, descriptionEndIndex); // do not include the null terminator in the tag value\n // frames that allow different types of encoding contain terminated text\n // [ID3v2.4.0 section 4.]\n\n frame.value = parseUtf8(frame.data, descriptionEndIndex + 1, frame.data.length).replace(/\\0*$/, '');\n frame.data = frame.value;\n },\n 'W*': function (frame) {\n // parse URL field; URL fields are always represented as ISO-8859-1 [ID3v2.4.0 section 4.]\n // if the value is followed by a string termination all the following information should be ignored [ID3v2.4.0 section 4.3]\n frame.url = parseIso88591$1(frame.data, 0, frame.data.length).replace(/\\0.*$/, '');\n },\n 'WXXX': function (frame) {\n var descriptionEndIndex;\n if (frame.data[0] !== textEncodingDescriptionByte.Utf8) {\n // ignore frames with unrecognized character encodings\n return;\n }\n descriptionEndIndex = typedArrayIndexOf(frame.data, 0, 1);\n if (descriptionEndIndex === -1) {\n return;\n } // parse the description and URL fields\n\n frame.description = parseUtf8(frame.data, 1, descriptionEndIndex); // URL fields are always represented as ISO-8859-1 [ID3v2.4.0 section 4.]\n // if the value is followed by a string termination all the following information\n // should be ignored [ID3v2.4.0 section 4.3]\n\n frame.url = parseIso88591$1(frame.data, descriptionEndIndex + 1, frame.data.length).replace(/\\0.*$/, '');\n },\n 'PRIV': function (frame) {\n var i;\n for (i = 0; i < frame.data.length; i++) {\n if (frame.data[i] === 0) {\n // parse the description and URL fields\n frame.owner = parseIso88591$1(frame.data, 0, i);\n break;\n }\n }\n frame.privateData = frame.data.subarray(i + 1);\n frame.data = frame.privateData;\n }\n };\n var parseId3Frames$1 = function (data) {\n var frameSize,\n frameHeader,\n frameStart = 10,\n tagSize = 0,\n frames = []; // If we don't have enough data for a header, 10 bytes, \n // or 'ID3' in the first 3 bytes this is not a valid ID3 tag.\n\n if (data.length < 10 || data[0] !== 'I'.charCodeAt(0) || data[1] !== 'D'.charCodeAt(0) || data[2] !== '3'.charCodeAt(0)) {\n return;\n } // the frame size is transmitted as a 28-bit integer in the\n // last four bytes of the ID3 header.\n // The most significant bit of each byte is dropped and the\n // results concatenated to recover the actual value.\n\n tagSize = parseSyncSafeInteger$1(data.subarray(6, 10)); // ID3 reports the tag size excluding the header but it's more\n // convenient for our comparisons to include it\n\n tagSize += 10; // check bit 6 of byte 5 for the extended header flag.\n\n var hasExtendedHeader = data[5] & 0x40;\n if (hasExtendedHeader) {\n // advance the frame start past the extended header\n frameStart += 4; // header size field\n\n frameStart += parseSyncSafeInteger$1(data.subarray(10, 14));\n tagSize -= parseSyncSafeInteger$1(data.subarray(16, 20)); // clip any padding off the end\n } // parse one or more ID3 frames\n // http://id3.org/id3v2.3.0#ID3v2_frame_overview\n\n do {\n // determine the number of bytes in this frame\n frameSize = parseSyncSafeInteger$1(data.subarray(frameStart + 4, frameStart + 8));\n if (frameSize < 1) {\n break;\n }\n frameHeader = String.fromCharCode(data[frameStart], data[frameStart + 1], data[frameStart + 2], data[frameStart + 3]);\n var frame = {\n id: frameHeader,\n data: data.subarray(frameStart + 10, frameStart + frameSize + 10)\n };\n frame.key = frame.id; // parse frame values\n\n if (frameParsers[frame.id]) {\n // use frame specific parser\n frameParsers[frame.id](frame);\n } else if (frame.id[0] === 'T') {\n // use text frame generic parser\n frameParsers['T*'](frame);\n } else if (frame.id[0] === 'W') {\n // use URL link frame generic parser\n frameParsers['W*'](frame);\n }\n frames.push(frame);\n frameStart += 10; // advance past the frame header\n\n frameStart += frameSize; // advance past the frame body\n } while (frameStart < tagSize);\n return frames;\n };\n var parseId3 = {\n parseId3Frames: parseId3Frames$1,\n parseSyncSafeInteger: parseSyncSafeInteger$1,\n frameParsers: frameParsers\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Accepts program elementary stream (PES) data events and parses out\n * ID3 metadata from them, if present.\n * @see http://id3.org/id3v2.3.0\n */\n\n var Stream$5 = stream,\n StreamTypes$3 = streamTypes,\n id3 = parseId3,\n MetadataStream;\n MetadataStream = function (options) {\n var settings = {\n // the bytes of the program-level descriptor field in MP2T\n // see ISO/IEC 13818-1:2013 (E), section 2.6 \"Program and\n // program element descriptors\"\n descriptor: options && options.descriptor\n },\n // the total size in bytes of the ID3 tag being parsed\n tagSize = 0,\n // tag data that is not complete enough to be parsed\n buffer = [],\n // the total number of bytes currently in the buffer\n bufferSize = 0,\n i;\n MetadataStream.prototype.init.call(this); // calculate the text track in-band metadata track dispatch type\n // https://html.spec.whatwg.org/multipage/embedded-content.html#steps-to-expose-a-media-resource-specific-text-track\n\n this.dispatchType = StreamTypes$3.METADATA_STREAM_TYPE.toString(16);\n if (settings.descriptor) {\n for (i = 0; i < settings.descriptor.length; i++) {\n this.dispatchType += ('00' + settings.descriptor[i].toString(16)).slice(-2);\n }\n }\n this.push = function (chunk) {\n var tag, frameStart, frameSize, frame, i, frameHeader;\n if (chunk.type !== 'timed-metadata') {\n return;\n } // if data_alignment_indicator is set in the PES header,\n // we must have the start of a new ID3 tag. Assume anything\n // remaining in the buffer was malformed and throw it out\n\n if (chunk.dataAlignmentIndicator) {\n bufferSize = 0;\n buffer.length = 0;\n } // ignore events that don't look like ID3 data\n\n if (buffer.length === 0 && (chunk.data.length < 10 || chunk.data[0] !== 'I'.charCodeAt(0) || chunk.data[1] !== 'D'.charCodeAt(0) || chunk.data[2] !== '3'.charCodeAt(0))) {\n this.trigger('log', {\n level: 'warn',\n message: 'Skipping unrecognized metadata packet'\n });\n return;\n } // add this chunk to the data we've collected so far\n\n buffer.push(chunk);\n bufferSize += chunk.data.byteLength; // grab the size of the entire frame from the ID3 header\n\n if (buffer.length === 1) {\n // the frame size is transmitted as a 28-bit integer in the\n // last four bytes of the ID3 header.\n // The most significant bit of each byte is dropped and the\n // results concatenated to recover the actual value.\n tagSize = id3.parseSyncSafeInteger(chunk.data.subarray(6, 10)); // ID3 reports the tag size excluding the header but it's more\n // convenient for our comparisons to include it\n\n tagSize += 10;\n } // if the entire frame has not arrived, wait for more data\n\n if (bufferSize < tagSize) {\n return;\n } // collect the entire frame so it can be parsed\n\n tag = {\n data: new Uint8Array(tagSize),\n frames: [],\n pts: buffer[0].pts,\n dts: buffer[0].dts\n };\n for (i = 0; i < tagSize;) {\n tag.data.set(buffer[0].data.subarray(0, tagSize - i), i);\n i += buffer[0].data.byteLength;\n bufferSize -= buffer[0].data.byteLength;\n buffer.shift();\n } // find the start of the first frame and the end of the tag\n\n frameStart = 10;\n if (tag.data[5] & 0x40) {\n // advance the frame start past the extended header\n frameStart += 4; // header size field\n\n frameStart += id3.parseSyncSafeInteger(tag.data.subarray(10, 14)); // clip any padding off the end\n\n tagSize -= id3.parseSyncSafeInteger(tag.data.subarray(16, 20));\n } // parse one or more ID3 frames\n // http://id3.org/id3v2.3.0#ID3v2_frame_overview\n\n do {\n // determine the number of bytes in this frame\n frameSize = id3.parseSyncSafeInteger(tag.data.subarray(frameStart + 4, frameStart + 8));\n if (frameSize < 1) {\n this.trigger('log', {\n level: 'warn',\n message: 'Malformed ID3 frame encountered. Skipping remaining metadata parsing.'\n }); // If the frame is malformed, don't parse any further frames but allow previous valid parsed frames\n // to be sent along.\n\n break;\n }\n frameHeader = String.fromCharCode(tag.data[frameStart], tag.data[frameStart + 1], tag.data[frameStart + 2], tag.data[frameStart + 3]);\n frame = {\n id: frameHeader,\n data: tag.data.subarray(frameStart + 10, frameStart + frameSize + 10)\n };\n frame.key = frame.id; // parse frame values\n\n if (id3.frameParsers[frame.id]) {\n // use frame specific parser\n id3.frameParsers[frame.id](frame);\n } else if (frame.id[0] === 'T') {\n // use text frame generic parser\n id3.frameParsers['T*'](frame);\n } else if (frame.id[0] === 'W') {\n // use URL link frame generic parser\n id3.frameParsers['W*'](frame);\n } // handle the special PRIV frame used to indicate the start\n // time for raw AAC data\n\n if (frame.owner === 'com.apple.streaming.transportStreamTimestamp') {\n var d = frame.data,\n size = (d[3] & 0x01) << 30 | d[4] << 22 | d[5] << 14 | d[6] << 6 | d[7] >>> 2;\n size *= 4;\n size += d[7] & 0x03;\n frame.timeStamp = size; // in raw AAC, all subsequent data will be timestamped based\n // on the value of this frame\n // we couldn't have known the appropriate pts and dts before\n // parsing this ID3 tag so set those values now\n\n if (tag.pts === undefined && tag.dts === undefined) {\n tag.pts = frame.timeStamp;\n tag.dts = frame.timeStamp;\n }\n this.trigger('timestamp', frame);\n }\n tag.frames.push(frame);\n frameStart += 10; // advance past the frame header\n\n frameStart += frameSize; // advance past the frame body\n } while (frameStart < tagSize);\n this.trigger('data', tag);\n };\n };\n MetadataStream.prototype = new Stream$5();\n var metadataStream = MetadataStream;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * A stream-based mp2t to mp4 converter. This utility can be used to\n * deliver mp4s to a SourceBuffer on platforms that support native\n * Media Source Extensions.\n */\n\n var Stream$4 = stream,\n CaptionStream$1 = captionStream,\n StreamTypes$2 = streamTypes,\n TimestampRolloverStream = timestampRolloverStream.TimestampRolloverStream; // object types\n\n var TransportPacketStream, TransportParseStream, ElementaryStream; // constants\n\n var MP2T_PACKET_LENGTH$1 = 188,\n // bytes\n SYNC_BYTE$1 = 0x47;\n /**\n * Splits an incoming stream of binary data into MPEG-2 Transport\n * Stream packets.\n */\n\n TransportPacketStream = function () {\n var buffer = new Uint8Array(MP2T_PACKET_LENGTH$1),\n bytesInBuffer = 0;\n TransportPacketStream.prototype.init.call(this); // Deliver new bytes to the stream.\n\n /**\n * Split a stream of data into M2TS packets\n **/\n\n this.push = function (bytes) {\n var startIndex = 0,\n endIndex = MP2T_PACKET_LENGTH$1,\n everything; // If there are bytes remaining from the last segment, prepend them to the\n // bytes that were pushed in\n\n if (bytesInBuffer) {\n everything = new Uint8Array(bytes.byteLength + bytesInBuffer);\n everything.set(buffer.subarray(0, bytesInBuffer));\n everything.set(bytes, bytesInBuffer);\n bytesInBuffer = 0;\n } else {\n everything = bytes;\n } // While we have enough data for a packet\n\n while (endIndex < everything.byteLength) {\n // Look for a pair of start and end sync bytes in the data..\n if (everything[startIndex] === SYNC_BYTE$1 && everything[endIndex] === SYNC_BYTE$1) {\n // We found a packet so emit it and jump one whole packet forward in\n // the stream\n this.trigger('data', everything.subarray(startIndex, endIndex));\n startIndex += MP2T_PACKET_LENGTH$1;\n endIndex += MP2T_PACKET_LENGTH$1;\n continue;\n } // If we get here, we have somehow become de-synchronized and we need to step\n // forward one byte at a time until we find a pair of sync bytes that denote\n // a packet\n\n startIndex++;\n endIndex++;\n } // If there was some data left over at the end of the segment that couldn't\n // possibly be a whole packet, keep it because it might be the start of a packet\n // that continues in the next segment\n\n if (startIndex < everything.byteLength) {\n buffer.set(everything.subarray(startIndex), 0);\n bytesInBuffer = everything.byteLength - startIndex;\n }\n };\n /**\n * Passes identified M2TS packets to the TransportParseStream to be parsed\n **/\n\n this.flush = function () {\n // If the buffer contains a whole packet when we are being flushed, emit it\n // and empty the buffer. Otherwise hold onto the data because it may be\n // important for decoding the next segment\n if (bytesInBuffer === MP2T_PACKET_LENGTH$1 && buffer[0] === SYNC_BYTE$1) {\n this.trigger('data', buffer);\n bytesInBuffer = 0;\n }\n this.trigger('done');\n };\n this.endTimeline = function () {\n this.flush();\n this.trigger('endedtimeline');\n };\n this.reset = function () {\n bytesInBuffer = 0;\n this.trigger('reset');\n };\n };\n TransportPacketStream.prototype = new Stream$4();\n /**\n * Accepts an MP2T TransportPacketStream and emits data events with parsed\n * forms of the individual transport stream packets.\n */\n\n TransportParseStream = function () {\n var parsePsi, parsePat, parsePmt, self;\n TransportParseStream.prototype.init.call(this);\n self = this;\n this.packetsWaitingForPmt = [];\n this.programMapTable = undefined;\n parsePsi = function (payload, psi) {\n var offset = 0; // PSI packets may be split into multiple sections and those\n // sections may be split into multiple packets. If a PSI\n // section starts in this packet, the payload_unit_start_indicator\n // will be true and the first byte of the payload will indicate\n // the offset from the current position to the start of the\n // section.\n\n if (psi.payloadUnitStartIndicator) {\n offset += payload[offset] + 1;\n }\n if (psi.type === 'pat') {\n parsePat(payload.subarray(offset), psi);\n } else {\n parsePmt(payload.subarray(offset), psi);\n }\n };\n parsePat = function (payload, pat) {\n pat.section_number = payload[7]; // eslint-disable-line camelcase\n\n pat.last_section_number = payload[8]; // eslint-disable-line camelcase\n // skip the PSI header and parse the first PMT entry\n\n self.pmtPid = (payload[10] & 0x1F) << 8 | payload[11];\n pat.pmtPid = self.pmtPid;\n };\n /**\n * Parse out the relevant fields of a Program Map Table (PMT).\n * @param payload {Uint8Array} the PMT-specific portion of an MP2T\n * packet. The first byte in this array should be the table_id\n * field.\n * @param pmt {object} the object that should be decorated with\n * fields parsed from the PMT.\n */\n\n parsePmt = function (payload, pmt) {\n var sectionLength, tableEnd, programInfoLength, offset; // PMTs can be sent ahead of the time when they should actually\n // take effect. We don't believe this should ever be the case\n // for HLS but we'll ignore \"forward\" PMT declarations if we see\n // them. Future PMT declarations have the current_next_indicator\n // set to zero.\n\n if (!(payload[5] & 0x01)) {\n return;\n } // overwrite any existing program map table\n\n self.programMapTable = {\n video: null,\n audio: null,\n 'timed-metadata': {}\n }; // the mapping table ends at the end of the current section\n\n sectionLength = (payload[1] & 0x0f) << 8 | payload[2];\n tableEnd = 3 + sectionLength - 4; // to determine where the table is, we have to figure out how\n // long the program info descriptors are\n\n programInfoLength = (payload[10] & 0x0f) << 8 | payload[11]; // advance the offset to the first entry in the mapping table\n\n offset = 12 + programInfoLength;\n while (offset < tableEnd) {\n var streamType = payload[offset];\n var pid = (payload[offset + 1] & 0x1F) << 8 | payload[offset + 2]; // only map a single elementary_pid for audio and video stream types\n // TODO: should this be done for metadata too? for now maintain behavior of\n // multiple metadata streams\n\n if (streamType === StreamTypes$2.H264_STREAM_TYPE && self.programMapTable.video === null) {\n self.programMapTable.video = pid;\n } else if (streamType === StreamTypes$2.ADTS_STREAM_TYPE && self.programMapTable.audio === null) {\n self.programMapTable.audio = pid;\n } else if (streamType === StreamTypes$2.METADATA_STREAM_TYPE) {\n // map pid to stream type for metadata streams\n self.programMapTable['timed-metadata'][pid] = streamType;\n } // move to the next table entry\n // skip past the elementary stream descriptors, if present\n\n offset += ((payload[offset + 3] & 0x0F) << 8 | payload[offset + 4]) + 5;\n } // record the map on the packet as well\n\n pmt.programMapTable = self.programMapTable;\n };\n /**\n * Deliver a new MP2T packet to the next stream in the pipeline.\n */\n\n this.push = function (packet) {\n var result = {},\n offset = 4;\n result.payloadUnitStartIndicator = !!(packet[1] & 0x40); // pid is a 13-bit field starting at the last bit of packet[1]\n\n result.pid = packet[1] & 0x1f;\n result.pid <<= 8;\n result.pid |= packet[2]; // if an adaption field is present, its length is specified by the\n // fifth byte of the TS packet header. The adaptation field is\n // used to add stuffing to PES packets that don't fill a complete\n // TS packet, and to specify some forms of timing and control data\n // that we do not currently use.\n\n if ((packet[3] & 0x30) >>> 4 > 0x01) {\n offset += packet[offset] + 1;\n } // parse the rest of the packet based on the type\n\n if (result.pid === 0) {\n result.type = 'pat';\n parsePsi(packet.subarray(offset), result);\n this.trigger('data', result);\n } else if (result.pid === this.pmtPid) {\n result.type = 'pmt';\n parsePsi(packet.subarray(offset), result);\n this.trigger('data', result); // if there are any packets waiting for a PMT to be found, process them now\n\n while (this.packetsWaitingForPmt.length) {\n this.processPes_.apply(this, this.packetsWaitingForPmt.shift());\n }\n } else if (this.programMapTable === undefined) {\n // When we have not seen a PMT yet, defer further processing of\n // PES packets until one has been parsed\n this.packetsWaitingForPmt.push([packet, offset, result]);\n } else {\n this.processPes_(packet, offset, result);\n }\n };\n this.processPes_ = function (packet, offset, result) {\n // set the appropriate stream type\n if (result.pid === this.programMapTable.video) {\n result.streamType = StreamTypes$2.H264_STREAM_TYPE;\n } else if (result.pid === this.programMapTable.audio) {\n result.streamType = StreamTypes$2.ADTS_STREAM_TYPE;\n } else {\n // if not video or audio, it is timed-metadata or unknown\n // if unknown, streamType will be undefined\n result.streamType = this.programMapTable['timed-metadata'][result.pid];\n }\n result.type = 'pes';\n result.data = packet.subarray(offset);\n this.trigger('data', result);\n };\n };\n TransportParseStream.prototype = new Stream$4();\n TransportParseStream.STREAM_TYPES = {\n h264: 0x1b,\n adts: 0x0f\n };\n /**\n * Reconsistutes program elementary stream (PES) packets from parsed\n * transport stream packets. That is, if you pipe an\n * mp2t.TransportParseStream into a mp2t.ElementaryStream, the output\n * events will be events which capture the bytes for individual PES\n * packets plus relevant metadata that has been extracted from the\n * container.\n */\n\n ElementaryStream = function () {\n var self = this,\n segmentHadPmt = false,\n // PES packet fragments\n video = {\n data: [],\n size: 0\n },\n audio = {\n data: [],\n size: 0\n },\n timedMetadata = {\n data: [],\n size: 0\n },\n programMapTable,\n parsePes = function (payload, pes) {\n var ptsDtsFlags;\n const startPrefix = payload[0] << 16 | payload[1] << 8 | payload[2]; // default to an empty array\n\n pes.data = new Uint8Array(); // In certain live streams, the start of a TS fragment has ts packets\n // that are frame data that is continuing from the previous fragment. This\n // is to check that the pes data is the start of a new pes payload\n\n if (startPrefix !== 1) {\n return;\n } // get the packet length, this will be 0 for video\n\n pes.packetLength = 6 + (payload[4] << 8 | payload[5]); // find out if this packets starts a new keyframe\n\n pes.dataAlignmentIndicator = (payload[6] & 0x04) !== 0; // PES packets may be annotated with a PTS value, or a PTS value\n // and a DTS value. Determine what combination of values is\n // available to work with.\n\n ptsDtsFlags = payload[7]; // PTS and DTS are normally stored as a 33-bit number. Javascript\n // performs all bitwise operations on 32-bit integers but javascript\n // supports a much greater range (52-bits) of integer using standard\n // mathematical operations.\n // We construct a 31-bit value using bitwise operators over the 31\n // most significant bits and then multiply by 4 (equal to a left-shift\n // of 2) before we add the final 2 least significant bits of the\n // timestamp (equal to an OR.)\n\n if (ptsDtsFlags & 0xC0) {\n // the PTS and DTS are not written out directly. For information\n // on how they are encoded, see\n // http://dvd.sourceforge.net/dvdinfo/pes-hdr.html\n pes.pts = (payload[9] & 0x0E) << 27 | (payload[10] & 0xFF) << 20 | (payload[11] & 0xFE) << 12 | (payload[12] & 0xFF) << 5 | (payload[13] & 0xFE) >>> 3;\n pes.pts *= 4; // Left shift by 2\n\n pes.pts += (payload[13] & 0x06) >>> 1; // OR by the two LSBs\n\n pes.dts = pes.pts;\n if (ptsDtsFlags & 0x40) {\n pes.dts = (payload[14] & 0x0E) << 27 | (payload[15] & 0xFF) << 20 | (payload[16] & 0xFE) << 12 | (payload[17] & 0xFF) << 5 | (payload[18] & 0xFE) >>> 3;\n pes.dts *= 4; // Left shift by 2\n\n pes.dts += (payload[18] & 0x06) >>> 1; // OR by the two LSBs\n }\n } // the data section starts immediately after the PES header.\n // pes_header_data_length specifies the number of header bytes\n // that follow the last byte of the field.\n\n pes.data = payload.subarray(9 + payload[8]);\n },\n /**\n * Pass completely parsed PES packets to the next stream in the pipeline\n **/\n flushStream = function (stream, type, forceFlush) {\n var packetData = new Uint8Array(stream.size),\n event = {\n type: type\n },\n i = 0,\n offset = 0,\n packetFlushable = false,\n fragment; // do nothing if there is not enough buffered data for a complete\n // PES header\n\n if (!stream.data.length || stream.size < 9) {\n return;\n }\n event.trackId = stream.data[0].pid; // reassemble the packet\n\n for (i = 0; i < stream.data.length; i++) {\n fragment = stream.data[i];\n packetData.set(fragment.data, offset);\n offset += fragment.data.byteLength;\n } // parse assembled packet's PES header\n\n parsePes(packetData, event); // non-video PES packets MUST have a non-zero PES_packet_length\n // check that there is enough stream data to fill the packet\n\n packetFlushable = type === 'video' || event.packetLength <= stream.size; // flush pending packets if the conditions are right\n\n if (forceFlush || packetFlushable) {\n stream.size = 0;\n stream.data.length = 0;\n } // only emit packets that are complete. this is to avoid assembling\n // incomplete PES packets due to poor segmentation\n\n if (packetFlushable) {\n self.trigger('data', event);\n }\n };\n ElementaryStream.prototype.init.call(this);\n /**\n * Identifies M2TS packet types and parses PES packets using metadata\n * parsed from the PMT\n **/\n\n this.push = function (data) {\n ({\n pat: function () {// we have to wait for the PMT to arrive as well before we\n // have any meaningful metadata\n },\n pes: function () {\n var stream, streamType;\n switch (data.streamType) {\n case StreamTypes$2.H264_STREAM_TYPE:\n stream = video;\n streamType = 'video';\n break;\n case StreamTypes$2.ADTS_STREAM_TYPE:\n stream = audio;\n streamType = 'audio';\n break;\n case StreamTypes$2.METADATA_STREAM_TYPE:\n stream = timedMetadata;\n streamType = 'timed-metadata';\n break;\n default:\n // ignore unknown stream types\n return;\n } // if a new packet is starting, we can flush the completed\n // packet\n\n if (data.payloadUnitStartIndicator) {\n flushStream(stream, streamType, true);\n } // buffer this fragment until we are sure we've received the\n // complete payload\n\n stream.data.push(data);\n stream.size += data.data.byteLength;\n },\n pmt: function () {\n var event = {\n type: 'metadata',\n tracks: []\n };\n programMapTable = data.programMapTable; // translate audio and video streams to tracks\n\n if (programMapTable.video !== null) {\n event.tracks.push({\n timelineStartInfo: {\n baseMediaDecodeTime: 0\n },\n id: +programMapTable.video,\n codec: 'avc',\n type: 'video'\n });\n }\n if (programMapTable.audio !== null) {\n event.tracks.push({\n timelineStartInfo: {\n baseMediaDecodeTime: 0\n },\n id: +programMapTable.audio,\n codec: 'adts',\n type: 'audio'\n });\n }\n segmentHadPmt = true;\n self.trigger('data', event);\n }\n })[data.type]();\n };\n this.reset = function () {\n video.size = 0;\n video.data.length = 0;\n audio.size = 0;\n audio.data.length = 0;\n this.trigger('reset');\n };\n /**\n * Flush any remaining input. Video PES packets may be of variable\n * length. Normally, the start of a new video packet can trigger the\n * finalization of the previous packet. That is not possible if no\n * more video is forthcoming, however. In that case, some other\n * mechanism (like the end of the file) has to be employed. When it is\n * clear that no additional data is forthcoming, calling this method\n * will flush the buffered packets.\n */\n\n this.flushStreams_ = function () {\n // !!THIS ORDER IS IMPORTANT!!\n // video first then audio\n flushStream(video, 'video');\n flushStream(audio, 'audio');\n flushStream(timedMetadata, 'timed-metadata');\n };\n this.flush = function () {\n // if on flush we haven't had a pmt emitted\n // and we have a pmt to emit. emit the pmt\n // so that we trigger a trackinfo downstream.\n if (!segmentHadPmt && programMapTable) {\n var pmt = {\n type: 'metadata',\n tracks: []\n }; // translate audio and video streams to tracks\n\n if (programMapTable.video !== null) {\n pmt.tracks.push({\n timelineStartInfo: {\n baseMediaDecodeTime: 0\n },\n id: +programMapTable.video,\n codec: 'avc',\n type: 'video'\n });\n }\n if (programMapTable.audio !== null) {\n pmt.tracks.push({\n timelineStartInfo: {\n baseMediaDecodeTime: 0\n },\n id: +programMapTable.audio,\n codec: 'adts',\n type: 'audio'\n });\n }\n self.trigger('data', pmt);\n }\n segmentHadPmt = false;\n this.flushStreams_();\n this.trigger('done');\n };\n };\n ElementaryStream.prototype = new Stream$4();\n var m2ts$1 = {\n PAT_PID: 0x0000,\n MP2T_PACKET_LENGTH: MP2T_PACKET_LENGTH$1,\n TransportPacketStream: TransportPacketStream,\n TransportParseStream: TransportParseStream,\n ElementaryStream: ElementaryStream,\n TimestampRolloverStream: TimestampRolloverStream,\n CaptionStream: CaptionStream$1.CaptionStream,\n Cea608Stream: CaptionStream$1.Cea608Stream,\n Cea708Stream: CaptionStream$1.Cea708Stream,\n MetadataStream: metadataStream\n };\n for (var type in StreamTypes$2) {\n if (StreamTypes$2.hasOwnProperty(type)) {\n m2ts$1[type] = StreamTypes$2[type];\n }\n }\n var m2ts_1 = m2ts$1;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var Stream$3 = stream;\n var ONE_SECOND_IN_TS$2 = clock$2.ONE_SECOND_IN_TS;\n var AdtsStream$1;\n var ADTS_SAMPLING_FREQUENCIES$1 = [96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350];\n /*\n * Accepts a ElementaryStream and emits data events with parsed\n * AAC Audio Frames of the individual packets. Input audio in ADTS\n * format is unpacked and re-emitted as AAC frames.\n *\n * @see http://wiki.multimedia.cx/index.php?title=ADTS\n * @see http://wiki.multimedia.cx/?title=Understanding_AAC\n */\n\n AdtsStream$1 = function (handlePartialSegments) {\n var buffer,\n frameNum = 0;\n AdtsStream$1.prototype.init.call(this);\n this.skipWarn_ = function (start, end) {\n this.trigger('log', {\n level: 'warn',\n message: `adts skiping bytes ${start} to ${end} in frame ${frameNum} outside syncword`\n });\n };\n this.push = function (packet) {\n var i = 0,\n frameLength,\n protectionSkipBytes,\n oldBuffer,\n sampleCount,\n adtsFrameDuration;\n if (!handlePartialSegments) {\n frameNum = 0;\n }\n if (packet.type !== 'audio') {\n // ignore non-audio data\n return;\n } // Prepend any data in the buffer to the input data so that we can parse\n // aac frames the cross a PES packet boundary\n\n if (buffer && buffer.length) {\n oldBuffer = buffer;\n buffer = new Uint8Array(oldBuffer.byteLength + packet.data.byteLength);\n buffer.set(oldBuffer);\n buffer.set(packet.data, oldBuffer.byteLength);\n } else {\n buffer = packet.data;\n } // unpack any ADTS frames which have been fully received\n // for details on the ADTS header, see http://wiki.multimedia.cx/index.php?title=ADTS\n\n var skip; // We use i + 7 here because we want to be able to parse the entire header.\n // If we don't have enough bytes to do that, then we definitely won't have a full frame.\n\n while (i + 7 < buffer.length) {\n // Look for the start of an ADTS header..\n if (buffer[i] !== 0xFF || (buffer[i + 1] & 0xF6) !== 0xF0) {\n if (typeof skip !== 'number') {\n skip = i;\n } // If a valid header was not found, jump one forward and attempt to\n // find a valid ADTS header starting at the next byte\n\n i++;\n continue;\n }\n if (typeof skip === 'number') {\n this.skipWarn_(skip, i);\n skip = null;\n } // The protection skip bit tells us if we have 2 bytes of CRC data at the\n // end of the ADTS header\n\n protectionSkipBytes = (~buffer[i + 1] & 0x01) * 2; // Frame length is a 13 bit integer starting 16 bits from the\n // end of the sync sequence\n // NOTE: frame length includes the size of the header\n\n frameLength = (buffer[i + 3] & 0x03) << 11 | buffer[i + 4] << 3 | (buffer[i + 5] & 0xe0) >> 5;\n sampleCount = ((buffer[i + 6] & 0x03) + 1) * 1024;\n adtsFrameDuration = sampleCount * ONE_SECOND_IN_TS$2 / ADTS_SAMPLING_FREQUENCIES$1[(buffer[i + 2] & 0x3c) >>> 2]; // If we don't have enough data to actually finish this ADTS frame,\n // then we have to wait for more data\n\n if (buffer.byteLength - i < frameLength) {\n break;\n } // Otherwise, deliver the complete AAC frame\n\n this.trigger('data', {\n pts: packet.pts + frameNum * adtsFrameDuration,\n dts: packet.dts + frameNum * adtsFrameDuration,\n sampleCount: sampleCount,\n audioobjecttype: (buffer[i + 2] >>> 6 & 0x03) + 1,\n channelcount: (buffer[i + 2] & 1) << 2 | (buffer[i + 3] & 0xc0) >>> 6,\n samplerate: ADTS_SAMPLING_FREQUENCIES$1[(buffer[i + 2] & 0x3c) >>> 2],\n samplingfrequencyindex: (buffer[i + 2] & 0x3c) >>> 2,\n // assume ISO/IEC 14496-12 AudioSampleEntry default of 16\n samplesize: 16,\n // data is the frame without it's header\n data: buffer.subarray(i + 7 + protectionSkipBytes, i + frameLength)\n });\n frameNum++;\n i += frameLength;\n }\n if (typeof skip === 'number') {\n this.skipWarn_(skip, i);\n skip = null;\n } // remove processed bytes from the buffer.\n\n buffer = buffer.subarray(i);\n };\n this.flush = function () {\n frameNum = 0;\n this.trigger('done');\n };\n this.reset = function () {\n buffer = void 0;\n this.trigger('reset');\n };\n this.endTimeline = function () {\n buffer = void 0;\n this.trigger('endedtimeline');\n };\n };\n AdtsStream$1.prototype = new Stream$3();\n var adts = AdtsStream$1;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var ExpGolomb$1;\n /**\n * Parser for exponential Golomb codes, a variable-bitwidth number encoding\n * scheme used by h264.\n */\n\n ExpGolomb$1 = function (workingData) {\n var\n // the number of bytes left to examine in workingData\n workingBytesAvailable = workingData.byteLength,\n // the current word being examined\n workingWord = 0,\n // :uint\n // the number of bits left to examine in the current word\n workingBitsAvailable = 0; // :uint;\n // ():uint\n\n this.length = function () {\n return 8 * workingBytesAvailable;\n }; // ():uint\n\n this.bitsAvailable = function () {\n return 8 * workingBytesAvailable + workingBitsAvailable;\n }; // ():void\n\n this.loadWord = function () {\n var position = workingData.byteLength - workingBytesAvailable,\n workingBytes = new Uint8Array(4),\n availableBytes = Math.min(4, workingBytesAvailable);\n if (availableBytes === 0) {\n throw new Error('no bytes available');\n }\n workingBytes.set(workingData.subarray(position, position + availableBytes));\n workingWord = new DataView(workingBytes.buffer).getUint32(0); // track the amount of workingData that has been processed\n\n workingBitsAvailable = availableBytes * 8;\n workingBytesAvailable -= availableBytes;\n }; // (count:int):void\n\n this.skipBits = function (count) {\n var skipBytes; // :int\n\n if (workingBitsAvailable > count) {\n workingWord <<= count;\n workingBitsAvailable -= count;\n } else {\n count -= workingBitsAvailable;\n skipBytes = Math.floor(count / 8);\n count -= skipBytes * 8;\n workingBytesAvailable -= skipBytes;\n this.loadWord();\n workingWord <<= count;\n workingBitsAvailable -= count;\n }\n }; // (size:int):uint\n\n this.readBits = function (size) {\n var bits = Math.min(workingBitsAvailable, size),\n // :uint\n valu = workingWord >>> 32 - bits; // :uint\n // if size > 31, handle error\n\n workingBitsAvailable -= bits;\n if (workingBitsAvailable > 0) {\n workingWord <<= bits;\n } else if (workingBytesAvailable > 0) {\n this.loadWord();\n }\n bits = size - bits;\n if (bits > 0) {\n return valu << bits | this.readBits(bits);\n }\n return valu;\n }; // ():uint\n\n this.skipLeadingZeros = function () {\n var leadingZeroCount; // :uint\n\n for (leadingZeroCount = 0; leadingZeroCount < workingBitsAvailable; ++leadingZeroCount) {\n if ((workingWord & 0x80000000 >>> leadingZeroCount) !== 0) {\n // the first bit of working word is 1\n workingWord <<= leadingZeroCount;\n workingBitsAvailable -= leadingZeroCount;\n return leadingZeroCount;\n }\n } // we exhausted workingWord and still have not found a 1\n\n this.loadWord();\n return leadingZeroCount + this.skipLeadingZeros();\n }; // ():void\n\n this.skipUnsignedExpGolomb = function () {\n this.skipBits(1 + this.skipLeadingZeros());\n }; // ():void\n\n this.skipExpGolomb = function () {\n this.skipBits(1 + this.skipLeadingZeros());\n }; // ():uint\n\n this.readUnsignedExpGolomb = function () {\n var clz = this.skipLeadingZeros(); // :uint\n\n return this.readBits(clz + 1) - 1;\n }; // ():int\n\n this.readExpGolomb = function () {\n var valu = this.readUnsignedExpGolomb(); // :int\n\n if (0x01 & valu) {\n // the number is odd if the low order bit is set\n return 1 + valu >>> 1; // add 1 to make it even, and divide by 2\n }\n return -1 * (valu >>> 1); // divide by two then make it negative\n }; // Some convenience functions\n // :Boolean\n\n this.readBoolean = function () {\n return this.readBits(1) === 1;\n }; // ():int\n\n this.readUnsignedByte = function () {\n return this.readBits(8);\n };\n this.loadWord();\n };\n var expGolomb = ExpGolomb$1;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var Stream$2 = stream;\n var ExpGolomb = expGolomb;\n var H264Stream$1, NalByteStream;\n var PROFILES_WITH_OPTIONAL_SPS_DATA;\n /**\n * Accepts a NAL unit byte stream and unpacks the embedded NAL units.\n */\n\n NalByteStream = function () {\n var syncPoint = 0,\n i,\n buffer;\n NalByteStream.prototype.init.call(this);\n /*\n * Scans a byte stream and triggers a data event with the NAL units found.\n * @param {Object} data Event received from H264Stream\n * @param {Uint8Array} data.data The h264 byte stream to be scanned\n *\n * @see H264Stream.push\n */\n\n this.push = function (data) {\n var swapBuffer;\n if (!buffer) {\n buffer = data.data;\n } else {\n swapBuffer = new Uint8Array(buffer.byteLength + data.data.byteLength);\n swapBuffer.set(buffer);\n swapBuffer.set(data.data, buffer.byteLength);\n buffer = swapBuffer;\n }\n var len = buffer.byteLength; // Rec. ITU-T H.264, Annex B\n // scan for NAL unit boundaries\n // a match looks like this:\n // 0 0 1 .. NAL .. 0 0 1\n // ^ sync point ^ i\n // or this:\n // 0 0 1 .. NAL .. 0 0 0\n // ^ sync point ^ i\n // advance the sync point to a NAL start, if necessary\n\n for (; syncPoint < len - 3; syncPoint++) {\n if (buffer[syncPoint + 2] === 1) {\n // the sync point is properly aligned\n i = syncPoint + 5;\n break;\n }\n }\n while (i < len) {\n // look at the current byte to determine if we've hit the end of\n // a NAL unit boundary\n switch (buffer[i]) {\n case 0:\n // skip past non-sync sequences\n if (buffer[i - 1] !== 0) {\n i += 2;\n break;\n } else if (buffer[i - 2] !== 0) {\n i++;\n break;\n } // deliver the NAL unit if it isn't empty\n\n if (syncPoint + 3 !== i - 2) {\n this.trigger('data', buffer.subarray(syncPoint + 3, i - 2));\n } // drop trailing zeroes\n\n do {\n i++;\n } while (buffer[i] !== 1 && i < len);\n syncPoint = i - 2;\n i += 3;\n break;\n case 1:\n // skip past non-sync sequences\n if (buffer[i - 1] !== 0 || buffer[i - 2] !== 0) {\n i += 3;\n break;\n } // deliver the NAL unit\n\n this.trigger('data', buffer.subarray(syncPoint + 3, i - 2));\n syncPoint = i - 2;\n i += 3;\n break;\n default:\n // the current byte isn't a one or zero, so it cannot be part\n // of a sync sequence\n i += 3;\n break;\n }\n } // filter out the NAL units that were delivered\n\n buffer = buffer.subarray(syncPoint);\n i -= syncPoint;\n syncPoint = 0;\n };\n this.reset = function () {\n buffer = null;\n syncPoint = 0;\n this.trigger('reset');\n };\n this.flush = function () {\n // deliver the last buffered NAL unit\n if (buffer && buffer.byteLength > 3) {\n this.trigger('data', buffer.subarray(syncPoint + 3));\n } // reset the stream state\n\n buffer = null;\n syncPoint = 0;\n this.trigger('done');\n };\n this.endTimeline = function () {\n this.flush();\n this.trigger('endedtimeline');\n };\n };\n NalByteStream.prototype = new Stream$2(); // values of profile_idc that indicate additional fields are included in the SPS\n // see Recommendation ITU-T H.264 (4/2013),\n // 7.3.2.1.1 Sequence parameter set data syntax\n\n PROFILES_WITH_OPTIONAL_SPS_DATA = {\n 100: true,\n 110: true,\n 122: true,\n 244: true,\n 44: true,\n 83: true,\n 86: true,\n 118: true,\n 128: true,\n // TODO: the three profiles below don't\n // appear to have sps data in the specificiation anymore?\n 138: true,\n 139: true,\n 134: true\n };\n /**\n * Accepts input from a ElementaryStream and produces H.264 NAL unit data\n * events.\n */\n\n H264Stream$1 = function () {\n var nalByteStream = new NalByteStream(),\n self,\n trackId,\n currentPts,\n currentDts,\n discardEmulationPreventionBytes,\n readSequenceParameterSet,\n skipScalingList;\n H264Stream$1.prototype.init.call(this);\n self = this;\n /*\n * Pushes a packet from a stream onto the NalByteStream\n *\n * @param {Object} packet - A packet received from a stream\n * @param {Uint8Array} packet.data - The raw bytes of the packet\n * @param {Number} packet.dts - Decode timestamp of the packet\n * @param {Number} packet.pts - Presentation timestamp of the packet\n * @param {Number} packet.trackId - The id of the h264 track this packet came from\n * @param {('video'|'audio')} packet.type - The type of packet\n *\n */\n\n this.push = function (packet) {\n if (packet.type !== 'video') {\n return;\n }\n trackId = packet.trackId;\n currentPts = packet.pts;\n currentDts = packet.dts;\n nalByteStream.push(packet);\n };\n /*\n * Identify NAL unit types and pass on the NALU, trackId, presentation and decode timestamps\n * for the NALUs to the next stream component.\n * Also, preprocess caption and sequence parameter NALUs.\n *\n * @param {Uint8Array} data - A NAL unit identified by `NalByteStream.push`\n * @see NalByteStream.push\n */\n\n nalByteStream.on('data', function (data) {\n var event = {\n trackId: trackId,\n pts: currentPts,\n dts: currentDts,\n data: data,\n nalUnitTypeCode: data[0] & 0x1f\n };\n switch (event.nalUnitTypeCode) {\n case 0x05:\n event.nalUnitType = 'slice_layer_without_partitioning_rbsp_idr';\n break;\n case 0x06:\n event.nalUnitType = 'sei_rbsp';\n event.escapedRBSP = discardEmulationPreventionBytes(data.subarray(1));\n break;\n case 0x07:\n event.nalUnitType = 'seq_parameter_set_rbsp';\n event.escapedRBSP = discardEmulationPreventionBytes(data.subarray(1));\n event.config = readSequenceParameterSet(event.escapedRBSP);\n break;\n case 0x08:\n event.nalUnitType = 'pic_parameter_set_rbsp';\n break;\n case 0x09:\n event.nalUnitType = 'access_unit_delimiter_rbsp';\n break;\n } // This triggers data on the H264Stream\n\n self.trigger('data', event);\n });\n nalByteStream.on('done', function () {\n self.trigger('done');\n });\n nalByteStream.on('partialdone', function () {\n self.trigger('partialdone');\n });\n nalByteStream.on('reset', function () {\n self.trigger('reset');\n });\n nalByteStream.on('endedtimeline', function () {\n self.trigger('endedtimeline');\n });\n this.flush = function () {\n nalByteStream.flush();\n };\n this.partialFlush = function () {\n nalByteStream.partialFlush();\n };\n this.reset = function () {\n nalByteStream.reset();\n };\n this.endTimeline = function () {\n nalByteStream.endTimeline();\n };\n /**\n * Advance the ExpGolomb decoder past a scaling list. The scaling\n * list is optionally transmitted as part of a sequence parameter\n * set and is not relevant to transmuxing.\n * @param count {number} the number of entries in this scaling list\n * @param expGolombDecoder {object} an ExpGolomb pointed to the\n * start of a scaling list\n * @see Recommendation ITU-T H.264, Section 7.3.2.1.1.1\n */\n\n skipScalingList = function (count, expGolombDecoder) {\n var lastScale = 8,\n nextScale = 8,\n j,\n deltaScale;\n for (j = 0; j < count; j++) {\n if (nextScale !== 0) {\n deltaScale = expGolombDecoder.readExpGolomb();\n nextScale = (lastScale + deltaScale + 256) % 256;\n }\n lastScale = nextScale === 0 ? lastScale : nextScale;\n }\n };\n /**\n * Expunge any \"Emulation Prevention\" bytes from a \"Raw Byte\n * Sequence Payload\"\n * @param data {Uint8Array} the bytes of a RBSP from a NAL\n * unit\n * @return {Uint8Array} the RBSP without any Emulation\n * Prevention Bytes\n */\n\n discardEmulationPreventionBytes = function (data) {\n var length = data.byteLength,\n emulationPreventionBytesPositions = [],\n i = 1,\n newLength,\n newData; // Find all `Emulation Prevention Bytes`\n\n while (i < length - 2) {\n if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 0x03) {\n emulationPreventionBytesPositions.push(i + 2);\n i += 2;\n } else {\n i++;\n }\n } // If no Emulation Prevention Bytes were found just return the original\n // array\n\n if (emulationPreventionBytesPositions.length === 0) {\n return data;\n } // Create a new array to hold the NAL unit data\n\n newLength = length - emulationPreventionBytesPositions.length;\n newData = new Uint8Array(newLength);\n var sourceIndex = 0;\n for (i = 0; i < newLength; sourceIndex++, i++) {\n if (sourceIndex === emulationPreventionBytesPositions[0]) {\n // Skip this byte\n sourceIndex++; // Remove this position index\n\n emulationPreventionBytesPositions.shift();\n }\n newData[i] = data[sourceIndex];\n }\n return newData;\n };\n /**\n * Read a sequence parameter set and return some interesting video\n * properties. A sequence parameter set is the H264 metadata that\n * describes the properties of upcoming video frames.\n * @param data {Uint8Array} the bytes of a sequence parameter set\n * @return {object} an object with configuration parsed from the\n * sequence parameter set, including the dimensions of the\n * associated video frames.\n */\n\n readSequenceParameterSet = function (data) {\n var frameCropLeftOffset = 0,\n frameCropRightOffset = 0,\n frameCropTopOffset = 0,\n frameCropBottomOffset = 0,\n expGolombDecoder,\n profileIdc,\n levelIdc,\n profileCompatibility,\n chromaFormatIdc,\n picOrderCntType,\n numRefFramesInPicOrderCntCycle,\n picWidthInMbsMinus1,\n picHeightInMapUnitsMinus1,\n frameMbsOnlyFlag,\n scalingListCount,\n sarRatio = [1, 1],\n aspectRatioIdc,\n i;\n expGolombDecoder = new ExpGolomb(data);\n profileIdc = expGolombDecoder.readUnsignedByte(); // profile_idc\n\n profileCompatibility = expGolombDecoder.readUnsignedByte(); // constraint_set[0-5]_flag\n\n levelIdc = expGolombDecoder.readUnsignedByte(); // level_idc u(8)\n\n expGolombDecoder.skipUnsignedExpGolomb(); // seq_parameter_set_id\n // some profiles have more optional data we don't need\n\n if (PROFILES_WITH_OPTIONAL_SPS_DATA[profileIdc]) {\n chromaFormatIdc = expGolombDecoder.readUnsignedExpGolomb();\n if (chromaFormatIdc === 3) {\n expGolombDecoder.skipBits(1); // separate_colour_plane_flag\n }\n expGolombDecoder.skipUnsignedExpGolomb(); // bit_depth_luma_minus8\n\n expGolombDecoder.skipUnsignedExpGolomb(); // bit_depth_chroma_minus8\n\n expGolombDecoder.skipBits(1); // qpprime_y_zero_transform_bypass_flag\n\n if (expGolombDecoder.readBoolean()) {\n // seq_scaling_matrix_present_flag\n scalingListCount = chromaFormatIdc !== 3 ? 8 : 12;\n for (i = 0; i < scalingListCount; i++) {\n if (expGolombDecoder.readBoolean()) {\n // seq_scaling_list_present_flag[ i ]\n if (i < 6) {\n skipScalingList(16, expGolombDecoder);\n } else {\n skipScalingList(64, expGolombDecoder);\n }\n }\n }\n }\n }\n expGolombDecoder.skipUnsignedExpGolomb(); // log2_max_frame_num_minus4\n\n picOrderCntType = expGolombDecoder.readUnsignedExpGolomb();\n if (picOrderCntType === 0) {\n expGolombDecoder.readUnsignedExpGolomb(); // log2_max_pic_order_cnt_lsb_minus4\n } else if (picOrderCntType === 1) {\n expGolombDecoder.skipBits(1); // delta_pic_order_always_zero_flag\n\n expGolombDecoder.skipExpGolomb(); // offset_for_non_ref_pic\n\n expGolombDecoder.skipExpGolomb(); // offset_for_top_to_bottom_field\n\n numRefFramesInPicOrderCntCycle = expGolombDecoder.readUnsignedExpGolomb();\n for (i = 0; i < numRefFramesInPicOrderCntCycle; i++) {\n expGolombDecoder.skipExpGolomb(); // offset_for_ref_frame[ i ]\n }\n }\n expGolombDecoder.skipUnsignedExpGolomb(); // max_num_ref_frames\n\n expGolombDecoder.skipBits(1); // gaps_in_frame_num_value_allowed_flag\n\n picWidthInMbsMinus1 = expGolombDecoder.readUnsignedExpGolomb();\n picHeightInMapUnitsMinus1 = expGolombDecoder.readUnsignedExpGolomb();\n frameMbsOnlyFlag = expGolombDecoder.readBits(1);\n if (frameMbsOnlyFlag === 0) {\n expGolombDecoder.skipBits(1); // mb_adaptive_frame_field_flag\n }\n expGolombDecoder.skipBits(1); // direct_8x8_inference_flag\n\n if (expGolombDecoder.readBoolean()) {\n // frame_cropping_flag\n frameCropLeftOffset = expGolombDecoder.readUnsignedExpGolomb();\n frameCropRightOffset = expGolombDecoder.readUnsignedExpGolomb();\n frameCropTopOffset = expGolombDecoder.readUnsignedExpGolomb();\n frameCropBottomOffset = expGolombDecoder.readUnsignedExpGolomb();\n }\n if (expGolombDecoder.readBoolean()) {\n // vui_parameters_present_flag\n if (expGolombDecoder.readBoolean()) {\n // aspect_ratio_info_present_flag\n aspectRatioIdc = expGolombDecoder.readUnsignedByte();\n switch (aspectRatioIdc) {\n case 1:\n sarRatio = [1, 1];\n break;\n case 2:\n sarRatio = [12, 11];\n break;\n case 3:\n sarRatio = [10, 11];\n break;\n case 4:\n sarRatio = [16, 11];\n break;\n case 5:\n sarRatio = [40, 33];\n break;\n case 6:\n sarRatio = [24, 11];\n break;\n case 7:\n sarRatio = [20, 11];\n break;\n case 8:\n sarRatio = [32, 11];\n break;\n case 9:\n sarRatio = [80, 33];\n break;\n case 10:\n sarRatio = [18, 11];\n break;\n case 11:\n sarRatio = [15, 11];\n break;\n case 12:\n sarRatio = [64, 33];\n break;\n case 13:\n sarRatio = [160, 99];\n break;\n case 14:\n sarRatio = [4, 3];\n break;\n case 15:\n sarRatio = [3, 2];\n break;\n case 16:\n sarRatio = [2, 1];\n break;\n case 255:\n {\n sarRatio = [expGolombDecoder.readUnsignedByte() << 8 | expGolombDecoder.readUnsignedByte(), expGolombDecoder.readUnsignedByte() << 8 | expGolombDecoder.readUnsignedByte()];\n break;\n }\n }\n if (sarRatio) {\n sarRatio[0] / sarRatio[1];\n }\n }\n }\n return {\n profileIdc: profileIdc,\n levelIdc: levelIdc,\n profileCompatibility: profileCompatibility,\n width: (picWidthInMbsMinus1 + 1) * 16 - frameCropLeftOffset * 2 - frameCropRightOffset * 2,\n height: (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16 - frameCropTopOffset * 2 - frameCropBottomOffset * 2,\n // sar is sample aspect ratio\n sarRatio: sarRatio\n };\n };\n };\n H264Stream$1.prototype = new Stream$2();\n var h264 = {\n H264Stream: H264Stream$1,\n NalByteStream: NalByteStream\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Utilities to detect basic properties and metadata about Aac data.\n */\n\n var ADTS_SAMPLING_FREQUENCIES = [96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350];\n var parseId3TagSize = function (header, byteIndex) {\n var returnSize = header[byteIndex + 6] << 21 | header[byteIndex + 7] << 14 | header[byteIndex + 8] << 7 | header[byteIndex + 9],\n flags = header[byteIndex + 5],\n footerPresent = (flags & 16) >> 4; // if we get a negative returnSize clamp it to 0\n\n returnSize = returnSize >= 0 ? returnSize : 0;\n if (footerPresent) {\n return returnSize + 20;\n }\n return returnSize + 10;\n };\n var getId3Offset = function (data, offset) {\n if (data.length - offset < 10 || data[offset] !== 'I'.charCodeAt(0) || data[offset + 1] !== 'D'.charCodeAt(0) || data[offset + 2] !== '3'.charCodeAt(0)) {\n return offset;\n }\n offset += parseId3TagSize(data, offset);\n return getId3Offset(data, offset);\n }; // TODO: use vhs-utils\n\n var isLikelyAacData$1 = function (data) {\n var offset = getId3Offset(data, 0);\n return data.length >= offset + 2 && (data[offset] & 0xFF) === 0xFF && (data[offset + 1] & 0xF0) === 0xF0 &&\n // verify that the 2 layer bits are 0, aka this\n // is not mp3 data but aac data.\n (data[offset + 1] & 0x16) === 0x10;\n };\n var parseSyncSafeInteger = function (data) {\n return data[0] << 21 | data[1] << 14 | data[2] << 7 | data[3];\n }; // return a percent-encoded representation of the specified byte range\n // @see http://en.wikipedia.org/wiki/Percent-encoding\n\n var percentEncode = function (bytes, start, end) {\n var i,\n result = '';\n for (i = start; i < end; i++) {\n result += '%' + ('00' + bytes[i].toString(16)).slice(-2);\n }\n return result;\n }; // return the string representation of the specified byte range,\n // interpreted as ISO-8859-1.\n\n var parseIso88591 = function (bytes, start, end) {\n return unescape(percentEncode(bytes, start, end)); // jshint ignore:line\n };\n var parseAdtsSize = function (header, byteIndex) {\n var lowThree = (header[byteIndex + 5] & 0xE0) >> 5,\n middle = header[byteIndex + 4] << 3,\n highTwo = header[byteIndex + 3] & 0x3 << 11;\n return highTwo | middle | lowThree;\n };\n var parseType$5 = function (header, byteIndex) {\n if (header[byteIndex] === 'I'.charCodeAt(0) && header[byteIndex + 1] === 'D'.charCodeAt(0) && header[byteIndex + 2] === '3'.charCodeAt(0)) {\n return 'timed-metadata';\n } else if (header[byteIndex] & 0xff === 0xff && (header[byteIndex + 1] & 0xf0) === 0xf0) {\n return 'audio';\n }\n return null;\n };\n var parseSampleRate = function (packet) {\n var i = 0;\n while (i + 5 < packet.length) {\n if (packet[i] !== 0xFF || (packet[i + 1] & 0xF6) !== 0xF0) {\n // If a valid header was not found, jump one forward and attempt to\n // find a valid ADTS header starting at the next byte\n i++;\n continue;\n }\n return ADTS_SAMPLING_FREQUENCIES[(packet[i + 2] & 0x3c) >>> 2];\n }\n return null;\n };\n var parseAacTimestamp = function (packet) {\n var frameStart, frameSize, frame, frameHeader; // find the start of the first frame and the end of the tag\n\n frameStart = 10;\n if (packet[5] & 0x40) {\n // advance the frame start past the extended header\n frameStart += 4; // header size field\n\n frameStart += parseSyncSafeInteger(packet.subarray(10, 14));\n } // parse one or more ID3 frames\n // http://id3.org/id3v2.3.0#ID3v2_frame_overview\n\n do {\n // determine the number of bytes in this frame\n frameSize = parseSyncSafeInteger(packet.subarray(frameStart + 4, frameStart + 8));\n if (frameSize < 1) {\n return null;\n }\n frameHeader = String.fromCharCode(packet[frameStart], packet[frameStart + 1], packet[frameStart + 2], packet[frameStart + 3]);\n if (frameHeader === 'PRIV') {\n frame = packet.subarray(frameStart + 10, frameStart + frameSize + 10);\n for (var i = 0; i < frame.byteLength; i++) {\n if (frame[i] === 0) {\n var owner = parseIso88591(frame, 0, i);\n if (owner === 'com.apple.streaming.transportStreamTimestamp') {\n var d = frame.subarray(i + 1);\n var size = (d[3] & 0x01) << 30 | d[4] << 22 | d[5] << 14 | d[6] << 6 | d[7] >>> 2;\n size *= 4;\n size += d[7] & 0x03;\n return size;\n }\n break;\n }\n }\n }\n frameStart += 10; // advance past the frame header\n\n frameStart += frameSize; // advance past the frame body\n } while (frameStart < packet.byteLength);\n return null;\n };\n var utils = {\n isLikelyAacData: isLikelyAacData$1,\n parseId3TagSize: parseId3TagSize,\n parseAdtsSize: parseAdtsSize,\n parseType: parseType$5,\n parseSampleRate: parseSampleRate,\n parseAacTimestamp: parseAacTimestamp\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * A stream-based aac to mp4 converter. This utility can be used to\n * deliver mp4s to a SourceBuffer on platforms that support native\n * Media Source Extensions.\n */\n\n var Stream$1 = stream;\n var aacUtils = utils; // Constants\n\n var AacStream$1;\n /**\n * Splits an incoming stream of binary data into ADTS and ID3 Frames.\n */\n\n AacStream$1 = function () {\n var everything = new Uint8Array(),\n timeStamp = 0;\n AacStream$1.prototype.init.call(this);\n this.setTimestamp = function (timestamp) {\n timeStamp = timestamp;\n };\n this.push = function (bytes) {\n var frameSize = 0,\n byteIndex = 0,\n bytesLeft,\n chunk,\n packet,\n tempLength; // If there are bytes remaining from the last segment, prepend them to the\n // bytes that were pushed in\n\n if (everything.length) {\n tempLength = everything.length;\n everything = new Uint8Array(bytes.byteLength + tempLength);\n everything.set(everything.subarray(0, tempLength));\n everything.set(bytes, tempLength);\n } else {\n everything = bytes;\n }\n while (everything.length - byteIndex >= 3) {\n if (everything[byteIndex] === 'I'.charCodeAt(0) && everything[byteIndex + 1] === 'D'.charCodeAt(0) && everything[byteIndex + 2] === '3'.charCodeAt(0)) {\n // Exit early because we don't have enough to parse\n // the ID3 tag header\n if (everything.length - byteIndex < 10) {\n break;\n } // check framesize\n\n frameSize = aacUtils.parseId3TagSize(everything, byteIndex); // Exit early if we don't have enough in the buffer\n // to emit a full packet\n // Add to byteIndex to support multiple ID3 tags in sequence\n\n if (byteIndex + frameSize > everything.length) {\n break;\n }\n chunk = {\n type: 'timed-metadata',\n data: everything.subarray(byteIndex, byteIndex + frameSize)\n };\n this.trigger('data', chunk);\n byteIndex += frameSize;\n continue;\n } else if ((everything[byteIndex] & 0xff) === 0xff && (everything[byteIndex + 1] & 0xf0) === 0xf0) {\n // Exit early because we don't have enough to parse\n // the ADTS frame header\n if (everything.length - byteIndex < 7) {\n break;\n }\n frameSize = aacUtils.parseAdtsSize(everything, byteIndex); // Exit early if we don't have enough in the buffer\n // to emit a full packet\n\n if (byteIndex + frameSize > everything.length) {\n break;\n }\n packet = {\n type: 'audio',\n data: everything.subarray(byteIndex, byteIndex + frameSize),\n pts: timeStamp,\n dts: timeStamp\n };\n this.trigger('data', packet);\n byteIndex += frameSize;\n continue;\n }\n byteIndex++;\n }\n bytesLeft = everything.length - byteIndex;\n if (bytesLeft > 0) {\n everything = everything.subarray(byteIndex);\n } else {\n everything = new Uint8Array();\n }\n };\n this.reset = function () {\n everything = new Uint8Array();\n this.trigger('reset');\n };\n this.endTimeline = function () {\n everything = new Uint8Array();\n this.trigger('endedtimeline');\n };\n };\n AacStream$1.prototype = new Stream$1();\n var aac = AacStream$1;\n var AUDIO_PROPERTIES$1 = ['audioobjecttype', 'channelcount', 'samplerate', 'samplingfrequencyindex', 'samplesize'];\n var audioProperties = AUDIO_PROPERTIES$1;\n var VIDEO_PROPERTIES$1 = ['width', 'height', 'profileIdc', 'levelIdc', 'profileCompatibility', 'sarRatio'];\n var videoProperties = VIDEO_PROPERTIES$1;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * A stream-based mp2t to mp4 converter. This utility can be used to\n * deliver mp4s to a SourceBuffer on platforms that support native\n * Media Source Extensions.\n */\n\n var Stream = stream;\n var mp4 = mp4Generator;\n var frameUtils = frameUtils$1;\n var audioFrameUtils = audioFrameUtils$1;\n var trackDecodeInfo = trackDecodeInfo$1;\n var m2ts = m2ts_1;\n var clock = clock$2;\n var AdtsStream = adts;\n var H264Stream = h264.H264Stream;\n var AacStream = aac;\n var isLikelyAacData = utils.isLikelyAacData;\n var ONE_SECOND_IN_TS$1 = clock$2.ONE_SECOND_IN_TS;\n var AUDIO_PROPERTIES = audioProperties;\n var VIDEO_PROPERTIES = videoProperties; // object types\n\n var VideoSegmentStream, AudioSegmentStream, Transmuxer, CoalesceStream;\n var retriggerForStream = function (key, event) {\n event.stream = key;\n this.trigger('log', event);\n };\n var addPipelineLogRetriggers = function (transmuxer, pipeline) {\n var keys = Object.keys(pipeline);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i]; // skip non-stream keys and headOfPipeline\n // which is just a duplicate\n\n if (key === 'headOfPipeline' || !pipeline[key].on) {\n continue;\n }\n pipeline[key].on('log', retriggerForStream.bind(transmuxer, key));\n }\n };\n /**\n * Compare two arrays (even typed) for same-ness\n */\n\n var arrayEquals = function (a, b) {\n var i;\n if (a.length !== b.length) {\n return false;\n } // compare the value of each element in the array\n\n for (i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n };\n var generateSegmentTimingInfo = function (baseMediaDecodeTime, startDts, startPts, endDts, endPts, prependedContentDuration) {\n var ptsOffsetFromDts = startPts - startDts,\n decodeDuration = endDts - startDts,\n presentationDuration = endPts - startPts; // The PTS and DTS values are based on the actual stream times from the segment,\n // however, the player time values will reflect a start from the baseMediaDecodeTime.\n // In order to provide relevant values for the player times, base timing info on the\n // baseMediaDecodeTime and the DTS and PTS durations of the segment.\n\n return {\n start: {\n dts: baseMediaDecodeTime,\n pts: baseMediaDecodeTime + ptsOffsetFromDts\n },\n end: {\n dts: baseMediaDecodeTime + decodeDuration,\n pts: baseMediaDecodeTime + presentationDuration\n },\n prependedContentDuration: prependedContentDuration,\n baseMediaDecodeTime: baseMediaDecodeTime\n };\n };\n /**\n * Constructs a single-track, ISO BMFF media segment from AAC data\n * events. The output of this stream can be fed to a SourceBuffer\n * configured with a suitable initialization segment.\n * @param track {object} track metadata configuration\n * @param options {object} transmuxer options object\n * @param options.keepOriginalTimestamps {boolean} If true, keep the timestamps\n * in the source; false to adjust the first segment to start at 0.\n */\n\n AudioSegmentStream = function (track, options) {\n var adtsFrames = [],\n sequenceNumber,\n earliestAllowedDts = 0,\n audioAppendStartTs = 0,\n videoBaseMediaDecodeTime = Infinity;\n options = options || {};\n sequenceNumber = options.firstSequenceNumber || 0;\n AudioSegmentStream.prototype.init.call(this);\n this.push = function (data) {\n trackDecodeInfo.collectDtsInfo(track, data);\n if (track) {\n AUDIO_PROPERTIES.forEach(function (prop) {\n track[prop] = data[prop];\n });\n } // buffer audio data until end() is called\n\n adtsFrames.push(data);\n };\n this.setEarliestDts = function (earliestDts) {\n earliestAllowedDts = earliestDts;\n };\n this.setVideoBaseMediaDecodeTime = function (baseMediaDecodeTime) {\n videoBaseMediaDecodeTime = baseMediaDecodeTime;\n };\n this.setAudioAppendStart = function (timestamp) {\n audioAppendStartTs = timestamp;\n };\n this.flush = function () {\n var frames, moof, mdat, boxes, frameDuration, segmentDuration, videoClockCyclesOfSilencePrefixed; // return early if no audio data has been observed\n\n if (adtsFrames.length === 0) {\n this.trigger('done', 'AudioSegmentStream');\n return;\n }\n frames = audioFrameUtils.trimAdtsFramesByEarliestDts(adtsFrames, track, earliestAllowedDts);\n track.baseMediaDecodeTime = trackDecodeInfo.calculateTrackBaseMediaDecodeTime(track, options.keepOriginalTimestamps); // amount of audio filled but the value is in video clock rather than audio clock\n\n videoClockCyclesOfSilencePrefixed = audioFrameUtils.prefixWithSilence(track, frames, audioAppendStartTs, videoBaseMediaDecodeTime); // we have to build the index from byte locations to\n // samples (that is, adts frames) in the audio data\n\n track.samples = audioFrameUtils.generateSampleTable(frames); // concatenate the audio data to constuct the mdat\n\n mdat = mp4.mdat(audioFrameUtils.concatenateFrameData(frames));\n adtsFrames = [];\n moof = mp4.moof(sequenceNumber, [track]);\n boxes = new Uint8Array(moof.byteLength + mdat.byteLength); // bump the sequence number for next time\n\n sequenceNumber++;\n boxes.set(moof);\n boxes.set(mdat, moof.byteLength);\n trackDecodeInfo.clearDtsInfo(track);\n frameDuration = Math.ceil(ONE_SECOND_IN_TS$1 * 1024 / track.samplerate); // TODO this check was added to maintain backwards compatibility (particularly with\n // tests) on adding the timingInfo event. However, it seems unlikely that there's a\n // valid use-case where an init segment/data should be triggered without associated\n // frames. Leaving for now, but should be looked into.\n\n if (frames.length) {\n segmentDuration = frames.length * frameDuration;\n this.trigger('segmentTimingInfo', generateSegmentTimingInfo(\n // The audio track's baseMediaDecodeTime is in audio clock cycles, but the\n // frame info is in video clock cycles. Convert to match expectation of\n // listeners (that all timestamps will be based on video clock cycles).\n clock.audioTsToVideoTs(track.baseMediaDecodeTime, track.samplerate),\n // frame times are already in video clock, as is segment duration\n frames[0].dts, frames[0].pts, frames[0].dts + segmentDuration, frames[0].pts + segmentDuration, videoClockCyclesOfSilencePrefixed || 0));\n this.trigger('timingInfo', {\n start: frames[0].pts,\n end: frames[0].pts + segmentDuration\n });\n }\n this.trigger('data', {\n track: track,\n boxes: boxes\n });\n this.trigger('done', 'AudioSegmentStream');\n };\n this.reset = function () {\n trackDecodeInfo.clearDtsInfo(track);\n adtsFrames = [];\n this.trigger('reset');\n };\n };\n AudioSegmentStream.prototype = new Stream();\n /**\n * Constructs a single-track, ISO BMFF media segment from H264 data\n * events. The output of this stream can be fed to a SourceBuffer\n * configured with a suitable initialization segment.\n * @param track {object} track metadata configuration\n * @param options {object} transmuxer options object\n * @param options.alignGopsAtEnd {boolean} If true, start from the end of the\n * gopsToAlignWith list when attempting to align gop pts\n * @param options.keepOriginalTimestamps {boolean} If true, keep the timestamps\n * in the source; false to adjust the first segment to start at 0.\n */\n\n VideoSegmentStream = function (track, options) {\n var sequenceNumber,\n nalUnits = [],\n gopsToAlignWith = [],\n config,\n pps;\n options = options || {};\n sequenceNumber = options.firstSequenceNumber || 0;\n VideoSegmentStream.prototype.init.call(this);\n delete track.minPTS;\n this.gopCache_ = [];\n /**\n * Constructs a ISO BMFF segment given H264 nalUnits\n * @param {Object} nalUnit A data event representing a nalUnit\n * @param {String} nalUnit.nalUnitType\n * @param {Object} nalUnit.config Properties for a mp4 track\n * @param {Uint8Array} nalUnit.data The nalUnit bytes\n * @see lib/codecs/h264.js\n **/\n\n this.push = function (nalUnit) {\n trackDecodeInfo.collectDtsInfo(track, nalUnit); // record the track config\n\n if (nalUnit.nalUnitType === 'seq_parameter_set_rbsp' && !config) {\n config = nalUnit.config;\n track.sps = [nalUnit.data];\n VIDEO_PROPERTIES.forEach(function (prop) {\n track[prop] = config[prop];\n }, this);\n }\n if (nalUnit.nalUnitType === 'pic_parameter_set_rbsp' && !pps) {\n pps = nalUnit.data;\n track.pps = [nalUnit.data];\n } // buffer video until flush() is called\n\n nalUnits.push(nalUnit);\n };\n /**\n * Pass constructed ISO BMFF track and boxes on to the\n * next stream in the pipeline\n **/\n\n this.flush = function () {\n var frames,\n gopForFusion,\n gops,\n moof,\n mdat,\n boxes,\n prependedContentDuration = 0,\n firstGop,\n lastGop; // Throw away nalUnits at the start of the byte stream until\n // we find the first AUD\n\n while (nalUnits.length) {\n if (nalUnits[0].nalUnitType === 'access_unit_delimiter_rbsp') {\n break;\n }\n nalUnits.shift();\n } // Return early if no video data has been observed\n\n if (nalUnits.length === 0) {\n this.resetStream_();\n this.trigger('done', 'VideoSegmentStream');\n return;\n } // Organize the raw nal-units into arrays that represent\n // higher-level constructs such as frames and gops\n // (group-of-pictures)\n\n frames = frameUtils.groupNalsIntoFrames(nalUnits);\n gops = frameUtils.groupFramesIntoGops(frames); // If the first frame of this fragment is not a keyframe we have\n // a problem since MSE (on Chrome) requires a leading keyframe.\n //\n // We have two approaches to repairing this situation:\n // 1) GOP-FUSION:\n // This is where we keep track of the GOPS (group-of-pictures)\n // from previous fragments and attempt to find one that we can\n // prepend to the current fragment in order to create a valid\n // fragment.\n // 2) KEYFRAME-PULLING:\n // Here we search for the first keyframe in the fragment and\n // throw away all the frames between the start of the fragment\n // and that keyframe. We then extend the duration and pull the\n // PTS of the keyframe forward so that it covers the time range\n // of the frames that were disposed of.\n //\n // #1 is far prefereable over #2 which can cause \"stuttering\" but\n // requires more things to be just right.\n\n if (!gops[0][0].keyFrame) {\n // Search for a gop for fusion from our gopCache\n gopForFusion = this.getGopForFusion_(nalUnits[0], track);\n if (gopForFusion) {\n // in order to provide more accurate timing information about the segment, save\n // the number of seconds prepended to the original segment due to GOP fusion\n prependedContentDuration = gopForFusion.duration;\n gops.unshift(gopForFusion); // Adjust Gops' metadata to account for the inclusion of the\n // new gop at the beginning\n\n gops.byteLength += gopForFusion.byteLength;\n gops.nalCount += gopForFusion.nalCount;\n gops.pts = gopForFusion.pts;\n gops.dts = gopForFusion.dts;\n gops.duration += gopForFusion.duration;\n } else {\n // If we didn't find a candidate gop fall back to keyframe-pulling\n gops = frameUtils.extendFirstKeyFrame(gops);\n }\n } // Trim gops to align with gopsToAlignWith\n\n if (gopsToAlignWith.length) {\n var alignedGops;\n if (options.alignGopsAtEnd) {\n alignedGops = this.alignGopsAtEnd_(gops);\n } else {\n alignedGops = this.alignGopsAtStart_(gops);\n }\n if (!alignedGops) {\n // save all the nals in the last GOP into the gop cache\n this.gopCache_.unshift({\n gop: gops.pop(),\n pps: track.pps,\n sps: track.sps\n }); // Keep a maximum of 6 GOPs in the cache\n\n this.gopCache_.length = Math.min(6, this.gopCache_.length); // Clear nalUnits\n\n nalUnits = []; // return early no gops can be aligned with desired gopsToAlignWith\n\n this.resetStream_();\n this.trigger('done', 'VideoSegmentStream');\n return;\n } // Some gops were trimmed. clear dts info so minSegmentDts and pts are correct\n // when recalculated before sending off to CoalesceStream\n\n trackDecodeInfo.clearDtsInfo(track);\n gops = alignedGops;\n }\n trackDecodeInfo.collectDtsInfo(track, gops); // First, we have to build the index from byte locations to\n // samples (that is, frames) in the video data\n\n track.samples = frameUtils.generateSampleTable(gops); // Concatenate the video data and construct the mdat\n\n mdat = mp4.mdat(frameUtils.concatenateNalData(gops));\n track.baseMediaDecodeTime = trackDecodeInfo.calculateTrackBaseMediaDecodeTime(track, options.keepOriginalTimestamps);\n this.trigger('processedGopsInfo', gops.map(function (gop) {\n return {\n pts: gop.pts,\n dts: gop.dts,\n byteLength: gop.byteLength\n };\n }));\n firstGop = gops[0];\n lastGop = gops[gops.length - 1];\n this.trigger('segmentTimingInfo', generateSegmentTimingInfo(track.baseMediaDecodeTime, firstGop.dts, firstGop.pts, lastGop.dts + lastGop.duration, lastGop.pts + lastGop.duration, prependedContentDuration));\n this.trigger('timingInfo', {\n start: gops[0].pts,\n end: gops[gops.length - 1].pts + gops[gops.length - 1].duration\n }); // save all the nals in the last GOP into the gop cache\n\n this.gopCache_.unshift({\n gop: gops.pop(),\n pps: track.pps,\n sps: track.sps\n }); // Keep a maximum of 6 GOPs in the cache\n\n this.gopCache_.length = Math.min(6, this.gopCache_.length); // Clear nalUnits\n\n nalUnits = [];\n this.trigger('baseMediaDecodeTime', track.baseMediaDecodeTime);\n this.trigger('timelineStartInfo', track.timelineStartInfo);\n moof = mp4.moof(sequenceNumber, [track]); // it would be great to allocate this array up front instead of\n // throwing away hundreds of media segment fragments\n\n boxes = new Uint8Array(moof.byteLength + mdat.byteLength); // Bump the sequence number for next time\n\n sequenceNumber++;\n boxes.set(moof);\n boxes.set(mdat, moof.byteLength);\n this.trigger('data', {\n track: track,\n boxes: boxes\n });\n this.resetStream_(); // Continue with the flush process now\n\n this.trigger('done', 'VideoSegmentStream');\n };\n this.reset = function () {\n this.resetStream_();\n nalUnits = [];\n this.gopCache_.length = 0;\n gopsToAlignWith.length = 0;\n this.trigger('reset');\n };\n this.resetStream_ = function () {\n trackDecodeInfo.clearDtsInfo(track); // reset config and pps because they may differ across segments\n // for instance, when we are rendition switching\n\n config = undefined;\n pps = undefined;\n }; // Search for a candidate Gop for gop-fusion from the gop cache and\n // return it or return null if no good candidate was found\n\n this.getGopForFusion_ = function (nalUnit) {\n var halfSecond = 45000,\n // Half-a-second in a 90khz clock\n allowableOverlap = 10000,\n // About 3 frames @ 30fps\n nearestDistance = Infinity,\n dtsDistance,\n nearestGopObj,\n currentGop,\n currentGopObj,\n i; // Search for the GOP nearest to the beginning of this nal unit\n\n for (i = 0; i < this.gopCache_.length; i++) {\n currentGopObj = this.gopCache_[i];\n currentGop = currentGopObj.gop; // Reject Gops with different SPS or PPS\n\n if (!(track.pps && arrayEquals(track.pps[0], currentGopObj.pps[0])) || !(track.sps && arrayEquals(track.sps[0], currentGopObj.sps[0]))) {\n continue;\n } // Reject Gops that would require a negative baseMediaDecodeTime\n\n if (currentGop.dts < track.timelineStartInfo.dts) {\n continue;\n } // The distance between the end of the gop and the start of the nalUnit\n\n dtsDistance = nalUnit.dts - currentGop.dts - currentGop.duration; // Only consider GOPS that start before the nal unit and end within\n // a half-second of the nal unit\n\n if (dtsDistance >= -allowableOverlap && dtsDistance <= halfSecond) {\n // Always use the closest GOP we found if there is more than\n // one candidate\n if (!nearestGopObj || nearestDistance > dtsDistance) {\n nearestGopObj = currentGopObj;\n nearestDistance = dtsDistance;\n }\n }\n }\n if (nearestGopObj) {\n return nearestGopObj.gop;\n }\n return null;\n }; // trim gop list to the first gop found that has a matching pts with a gop in the list\n // of gopsToAlignWith starting from the START of the list\n\n this.alignGopsAtStart_ = function (gops) {\n var alignIndex, gopIndex, align, gop, byteLength, nalCount, duration, alignedGops;\n byteLength = gops.byteLength;\n nalCount = gops.nalCount;\n duration = gops.duration;\n alignIndex = gopIndex = 0;\n while (alignIndex < gopsToAlignWith.length && gopIndex < gops.length) {\n align = gopsToAlignWith[alignIndex];\n gop = gops[gopIndex];\n if (align.pts === gop.pts) {\n break;\n }\n if (gop.pts > align.pts) {\n // this current gop starts after the current gop we want to align on, so increment\n // align index\n alignIndex++;\n continue;\n } // current gop starts before the current gop we want to align on. so increment gop\n // index\n\n gopIndex++;\n byteLength -= gop.byteLength;\n nalCount -= gop.nalCount;\n duration -= gop.duration;\n }\n if (gopIndex === 0) {\n // no gops to trim\n return gops;\n }\n if (gopIndex === gops.length) {\n // all gops trimmed, skip appending all gops\n return null;\n }\n alignedGops = gops.slice(gopIndex);\n alignedGops.byteLength = byteLength;\n alignedGops.duration = duration;\n alignedGops.nalCount = nalCount;\n alignedGops.pts = alignedGops[0].pts;\n alignedGops.dts = alignedGops[0].dts;\n return alignedGops;\n }; // trim gop list to the first gop found that has a matching pts with a gop in the list\n // of gopsToAlignWith starting from the END of the list\n\n this.alignGopsAtEnd_ = function (gops) {\n var alignIndex, gopIndex, align, gop, alignEndIndex, matchFound;\n alignIndex = gopsToAlignWith.length - 1;\n gopIndex = gops.length - 1;\n alignEndIndex = null;\n matchFound = false;\n while (alignIndex >= 0 && gopIndex >= 0) {\n align = gopsToAlignWith[alignIndex];\n gop = gops[gopIndex];\n if (align.pts === gop.pts) {\n matchFound = true;\n break;\n }\n if (align.pts > gop.pts) {\n alignIndex--;\n continue;\n }\n if (alignIndex === gopsToAlignWith.length - 1) {\n // gop.pts is greater than the last alignment candidate. If no match is found\n // by the end of this loop, we still want to append gops that come after this\n // point\n alignEndIndex = gopIndex;\n }\n gopIndex--;\n }\n if (!matchFound && alignEndIndex === null) {\n return null;\n }\n var trimIndex;\n if (matchFound) {\n trimIndex = gopIndex;\n } else {\n trimIndex = alignEndIndex;\n }\n if (trimIndex === 0) {\n return gops;\n }\n var alignedGops = gops.slice(trimIndex);\n var metadata = alignedGops.reduce(function (total, gop) {\n total.byteLength += gop.byteLength;\n total.duration += gop.duration;\n total.nalCount += gop.nalCount;\n return total;\n }, {\n byteLength: 0,\n duration: 0,\n nalCount: 0\n });\n alignedGops.byteLength = metadata.byteLength;\n alignedGops.duration = metadata.duration;\n alignedGops.nalCount = metadata.nalCount;\n alignedGops.pts = alignedGops[0].pts;\n alignedGops.dts = alignedGops[0].dts;\n return alignedGops;\n };\n this.alignGopsWith = function (newGopsToAlignWith) {\n gopsToAlignWith = newGopsToAlignWith;\n };\n };\n VideoSegmentStream.prototype = new Stream();\n /**\n * A Stream that can combine multiple streams (ie. audio & video)\n * into a single output segment for MSE. Also supports audio-only\n * and video-only streams.\n * @param options {object} transmuxer options object\n * @param options.keepOriginalTimestamps {boolean} If true, keep the timestamps\n * in the source; false to adjust the first segment to start at media timeline start.\n */\n\n CoalesceStream = function (options, metadataStream) {\n // Number of Tracks per output segment\n // If greater than 1, we combine multiple\n // tracks into a single segment\n this.numberOfTracks = 0;\n this.metadataStream = metadataStream;\n options = options || {};\n if (typeof options.remux !== 'undefined') {\n this.remuxTracks = !!options.remux;\n } else {\n this.remuxTracks = true;\n }\n if (typeof options.keepOriginalTimestamps === 'boolean') {\n this.keepOriginalTimestamps = options.keepOriginalTimestamps;\n } else {\n this.keepOriginalTimestamps = false;\n }\n this.pendingTracks = [];\n this.videoTrack = null;\n this.pendingBoxes = [];\n this.pendingCaptions = [];\n this.pendingMetadata = [];\n this.pendingBytes = 0;\n this.emittedTracks = 0;\n CoalesceStream.prototype.init.call(this); // Take output from multiple\n\n this.push = function (output) {\n // buffer incoming captions until the associated video segment\n // finishes\n if (output.content || output.text) {\n return this.pendingCaptions.push(output);\n } // buffer incoming id3 tags until the final flush\n\n if (output.frames) {\n return this.pendingMetadata.push(output);\n } // Add this track to the list of pending tracks and store\n // important information required for the construction of\n // the final segment\n\n this.pendingTracks.push(output.track);\n this.pendingBytes += output.boxes.byteLength; // TODO: is there an issue for this against chrome?\n // We unshift audio and push video because\n // as of Chrome 75 when switching from\n // one init segment to another if the video\n // mdat does not appear after the audio mdat\n // only audio will play for the duration of our transmux.\n\n if (output.track.type === 'video') {\n this.videoTrack = output.track;\n this.pendingBoxes.push(output.boxes);\n }\n if (output.track.type === 'audio') {\n this.audioTrack = output.track;\n this.pendingBoxes.unshift(output.boxes);\n }\n };\n };\n CoalesceStream.prototype = new Stream();\n CoalesceStream.prototype.flush = function (flushSource) {\n var offset = 0,\n event = {\n captions: [],\n captionStreams: {},\n metadata: [],\n info: {}\n },\n caption,\n id3,\n initSegment,\n timelineStartPts = 0,\n i;\n if (this.pendingTracks.length < this.numberOfTracks) {\n if (flushSource !== 'VideoSegmentStream' && flushSource !== 'AudioSegmentStream') {\n // Return because we haven't received a flush from a data-generating\n // portion of the segment (meaning that we have only recieved meta-data\n // or captions.)\n return;\n } else if (this.remuxTracks) {\n // Return until we have enough tracks from the pipeline to remux (if we\n // are remuxing audio and video into a single MP4)\n return;\n } else if (this.pendingTracks.length === 0) {\n // In the case where we receive a flush without any data having been\n // received we consider it an emitted track for the purposes of coalescing\n // `done` events.\n // We do this for the case where there is an audio and video track in the\n // segment but no audio data. (seen in several playlists with alternate\n // audio tracks and no audio present in the main TS segments.)\n this.emittedTracks++;\n if (this.emittedTracks >= this.numberOfTracks) {\n this.trigger('done');\n this.emittedTracks = 0;\n }\n return;\n }\n }\n if (this.videoTrack) {\n timelineStartPts = this.videoTrack.timelineStartInfo.pts;\n VIDEO_PROPERTIES.forEach(function (prop) {\n event.info[prop] = this.videoTrack[prop];\n }, this);\n } else if (this.audioTrack) {\n timelineStartPts = this.audioTrack.timelineStartInfo.pts;\n AUDIO_PROPERTIES.forEach(function (prop) {\n event.info[prop] = this.audioTrack[prop];\n }, this);\n }\n if (this.videoTrack || this.audioTrack) {\n if (this.pendingTracks.length === 1) {\n event.type = this.pendingTracks[0].type;\n } else {\n event.type = 'combined';\n }\n this.emittedTracks += this.pendingTracks.length;\n initSegment = mp4.initSegment(this.pendingTracks); // Create a new typed array to hold the init segment\n\n event.initSegment = new Uint8Array(initSegment.byteLength); // Create an init segment containing a moov\n // and track definitions\n\n event.initSegment.set(initSegment); // Create a new typed array to hold the moof+mdats\n\n event.data = new Uint8Array(this.pendingBytes); // Append each moof+mdat (one per track) together\n\n for (i = 0; i < this.pendingBoxes.length; i++) {\n event.data.set(this.pendingBoxes[i], offset);\n offset += this.pendingBoxes[i].byteLength;\n } // Translate caption PTS times into second offsets to match the\n // video timeline for the segment, and add track info\n\n for (i = 0; i < this.pendingCaptions.length; i++) {\n caption = this.pendingCaptions[i];\n caption.startTime = clock.metadataTsToSeconds(caption.startPts, timelineStartPts, this.keepOriginalTimestamps);\n caption.endTime = clock.metadataTsToSeconds(caption.endPts, timelineStartPts, this.keepOriginalTimestamps);\n event.captionStreams[caption.stream] = true;\n event.captions.push(caption);\n } // Translate ID3 frame PTS times into second offsets to match the\n // video timeline for the segment\n\n for (i = 0; i < this.pendingMetadata.length; i++) {\n id3 = this.pendingMetadata[i];\n id3.cueTime = clock.metadataTsToSeconds(id3.pts, timelineStartPts, this.keepOriginalTimestamps);\n event.metadata.push(id3);\n } // We add this to every single emitted segment even though we only need\n // it for the first\n\n event.metadata.dispatchType = this.metadataStream.dispatchType; // Reset stream state\n\n this.pendingTracks.length = 0;\n this.videoTrack = null;\n this.pendingBoxes.length = 0;\n this.pendingCaptions.length = 0;\n this.pendingBytes = 0;\n this.pendingMetadata.length = 0; // Emit the built segment\n // We include captions and ID3 tags for backwards compatibility,\n // ideally we should send only video and audio in the data event\n\n this.trigger('data', event); // Emit each caption to the outside world\n // Ideally, this would happen immediately on parsing captions,\n // but we need to ensure that video data is sent back first\n // so that caption timing can be adjusted to match video timing\n\n for (i = 0; i < event.captions.length; i++) {\n caption = event.captions[i];\n this.trigger('caption', caption);\n } // Emit each id3 tag to the outside world\n // Ideally, this would happen immediately on parsing the tag,\n // but we need to ensure that video data is sent back first\n // so that ID3 frame timing can be adjusted to match video timing\n\n for (i = 0; i < event.metadata.length; i++) {\n id3 = event.metadata[i];\n this.trigger('id3Frame', id3);\n }\n } // Only emit `done` if all tracks have been flushed and emitted\n\n if (this.emittedTracks >= this.numberOfTracks) {\n this.trigger('done');\n this.emittedTracks = 0;\n }\n };\n CoalesceStream.prototype.setRemux = function (val) {\n this.remuxTracks = val;\n };\n /**\n * A Stream that expects MP2T binary data as input and produces\n * corresponding media segments, suitable for use with Media Source\n * Extension (MSE) implementations that support the ISO BMFF byte\n * stream format, like Chrome.\n */\n\n Transmuxer = function (options) {\n var self = this,\n hasFlushed = true,\n videoTrack,\n audioTrack;\n Transmuxer.prototype.init.call(this);\n options = options || {};\n this.baseMediaDecodeTime = options.baseMediaDecodeTime || 0;\n this.transmuxPipeline_ = {};\n this.setupAacPipeline = function () {\n var pipeline = {};\n this.transmuxPipeline_ = pipeline;\n pipeline.type = 'aac';\n pipeline.metadataStream = new m2ts.MetadataStream(); // set up the parsing pipeline\n\n pipeline.aacStream = new AacStream();\n pipeline.audioTimestampRolloverStream = new m2ts.TimestampRolloverStream('audio');\n pipeline.timedMetadataTimestampRolloverStream = new m2ts.TimestampRolloverStream('timed-metadata');\n pipeline.adtsStream = new AdtsStream();\n pipeline.coalesceStream = new CoalesceStream(options, pipeline.metadataStream);\n pipeline.headOfPipeline = pipeline.aacStream;\n pipeline.aacStream.pipe(pipeline.audioTimestampRolloverStream).pipe(pipeline.adtsStream);\n pipeline.aacStream.pipe(pipeline.timedMetadataTimestampRolloverStream).pipe(pipeline.metadataStream).pipe(pipeline.coalesceStream);\n pipeline.metadataStream.on('timestamp', function (frame) {\n pipeline.aacStream.setTimestamp(frame.timeStamp);\n });\n pipeline.aacStream.on('data', function (data) {\n if (data.type !== 'timed-metadata' && data.type !== 'audio' || pipeline.audioSegmentStream) {\n return;\n }\n audioTrack = audioTrack || {\n timelineStartInfo: {\n baseMediaDecodeTime: self.baseMediaDecodeTime\n },\n codec: 'adts',\n type: 'audio'\n }; // hook up the audio segment stream to the first track with aac data\n\n pipeline.coalesceStream.numberOfTracks++;\n pipeline.audioSegmentStream = new AudioSegmentStream(audioTrack, options);\n pipeline.audioSegmentStream.on('log', self.getLogTrigger_('audioSegmentStream'));\n pipeline.audioSegmentStream.on('timingInfo', self.trigger.bind(self, 'audioTimingInfo')); // Set up the final part of the audio pipeline\n\n pipeline.adtsStream.pipe(pipeline.audioSegmentStream).pipe(pipeline.coalesceStream); // emit pmt info\n\n self.trigger('trackinfo', {\n hasAudio: !!audioTrack,\n hasVideo: !!videoTrack\n });\n }); // Re-emit any data coming from the coalesce stream to the outside world\n\n pipeline.coalesceStream.on('data', this.trigger.bind(this, 'data')); // Let the consumer know we have finished flushing the entire pipeline\n\n pipeline.coalesceStream.on('done', this.trigger.bind(this, 'done'));\n addPipelineLogRetriggers(this, pipeline);\n };\n this.setupTsPipeline = function () {\n var pipeline = {};\n this.transmuxPipeline_ = pipeline;\n pipeline.type = 'ts';\n pipeline.metadataStream = new m2ts.MetadataStream(); // set up the parsing pipeline\n\n pipeline.packetStream = new m2ts.TransportPacketStream();\n pipeline.parseStream = new m2ts.TransportParseStream();\n pipeline.elementaryStream = new m2ts.ElementaryStream();\n pipeline.timestampRolloverStream = new m2ts.TimestampRolloverStream();\n pipeline.adtsStream = new AdtsStream();\n pipeline.h264Stream = new H264Stream();\n pipeline.captionStream = new m2ts.CaptionStream(options);\n pipeline.coalesceStream = new CoalesceStream(options, pipeline.metadataStream);\n pipeline.headOfPipeline = pipeline.packetStream; // disassemble MPEG2-TS packets into elementary streams\n\n pipeline.packetStream.pipe(pipeline.parseStream).pipe(pipeline.elementaryStream).pipe(pipeline.timestampRolloverStream); // !!THIS ORDER IS IMPORTANT!!\n // demux the streams\n\n pipeline.timestampRolloverStream.pipe(pipeline.h264Stream);\n pipeline.timestampRolloverStream.pipe(pipeline.adtsStream);\n pipeline.timestampRolloverStream.pipe(pipeline.metadataStream).pipe(pipeline.coalesceStream); // Hook up CEA-608/708 caption stream\n\n pipeline.h264Stream.pipe(pipeline.captionStream).pipe(pipeline.coalesceStream);\n pipeline.elementaryStream.on('data', function (data) {\n var i;\n if (data.type === 'metadata') {\n i = data.tracks.length; // scan the tracks listed in the metadata\n\n while (i--) {\n if (!videoTrack && data.tracks[i].type === 'video') {\n videoTrack = data.tracks[i];\n videoTrack.timelineStartInfo.baseMediaDecodeTime = self.baseMediaDecodeTime;\n } else if (!audioTrack && data.tracks[i].type === 'audio') {\n audioTrack = data.tracks[i];\n audioTrack.timelineStartInfo.baseMediaDecodeTime = self.baseMediaDecodeTime;\n }\n } // hook up the video segment stream to the first track with h264 data\n\n if (videoTrack && !pipeline.videoSegmentStream) {\n pipeline.coalesceStream.numberOfTracks++;\n pipeline.videoSegmentStream = new VideoSegmentStream(videoTrack, options);\n pipeline.videoSegmentStream.on('log', self.getLogTrigger_('videoSegmentStream'));\n pipeline.videoSegmentStream.on('timelineStartInfo', function (timelineStartInfo) {\n // When video emits timelineStartInfo data after a flush, we forward that\n // info to the AudioSegmentStream, if it exists, because video timeline\n // data takes precedence. Do not do this if keepOriginalTimestamps is set,\n // because this is a particularly subtle form of timestamp alteration.\n if (audioTrack && !options.keepOriginalTimestamps) {\n audioTrack.timelineStartInfo = timelineStartInfo; // On the first segment we trim AAC frames that exist before the\n // very earliest DTS we have seen in video because Chrome will\n // interpret any video track with a baseMediaDecodeTime that is\n // non-zero as a gap.\n\n pipeline.audioSegmentStream.setEarliestDts(timelineStartInfo.dts - self.baseMediaDecodeTime);\n }\n });\n pipeline.videoSegmentStream.on('processedGopsInfo', self.trigger.bind(self, 'gopInfo'));\n pipeline.videoSegmentStream.on('segmentTimingInfo', self.trigger.bind(self, 'videoSegmentTimingInfo'));\n pipeline.videoSegmentStream.on('baseMediaDecodeTime', function (baseMediaDecodeTime) {\n if (audioTrack) {\n pipeline.audioSegmentStream.setVideoBaseMediaDecodeTime(baseMediaDecodeTime);\n }\n });\n pipeline.videoSegmentStream.on('timingInfo', self.trigger.bind(self, 'videoTimingInfo')); // Set up the final part of the video pipeline\n\n pipeline.h264Stream.pipe(pipeline.videoSegmentStream).pipe(pipeline.coalesceStream);\n }\n if (audioTrack && !pipeline.audioSegmentStream) {\n // hook up the audio segment stream to the first track with aac data\n pipeline.coalesceStream.numberOfTracks++;\n pipeline.audioSegmentStream = new AudioSegmentStream(audioTrack, options);\n pipeline.audioSegmentStream.on('log', self.getLogTrigger_('audioSegmentStream'));\n pipeline.audioSegmentStream.on('timingInfo', self.trigger.bind(self, 'audioTimingInfo'));\n pipeline.audioSegmentStream.on('segmentTimingInfo', self.trigger.bind(self, 'audioSegmentTimingInfo')); // Set up the final part of the audio pipeline\n\n pipeline.adtsStream.pipe(pipeline.audioSegmentStream).pipe(pipeline.coalesceStream);\n } // emit pmt info\n\n self.trigger('trackinfo', {\n hasAudio: !!audioTrack,\n hasVideo: !!videoTrack\n });\n }\n }); // Re-emit any data coming from the coalesce stream to the outside world\n\n pipeline.coalesceStream.on('data', this.trigger.bind(this, 'data'));\n pipeline.coalesceStream.on('id3Frame', function (id3Frame) {\n id3Frame.dispatchType = pipeline.metadataStream.dispatchType;\n self.trigger('id3Frame', id3Frame);\n });\n pipeline.coalesceStream.on('caption', this.trigger.bind(this, 'caption')); // Let the consumer know we have finished flushing the entire pipeline\n\n pipeline.coalesceStream.on('done', this.trigger.bind(this, 'done'));\n addPipelineLogRetriggers(this, pipeline);\n }; // hook up the segment streams once track metadata is delivered\n\n this.setBaseMediaDecodeTime = function (baseMediaDecodeTime) {\n var pipeline = this.transmuxPipeline_;\n if (!options.keepOriginalTimestamps) {\n this.baseMediaDecodeTime = baseMediaDecodeTime;\n }\n if (audioTrack) {\n audioTrack.timelineStartInfo.dts = undefined;\n audioTrack.timelineStartInfo.pts = undefined;\n trackDecodeInfo.clearDtsInfo(audioTrack);\n if (pipeline.audioTimestampRolloverStream) {\n pipeline.audioTimestampRolloverStream.discontinuity();\n }\n }\n if (videoTrack) {\n if (pipeline.videoSegmentStream) {\n pipeline.videoSegmentStream.gopCache_ = [];\n }\n videoTrack.timelineStartInfo.dts = undefined;\n videoTrack.timelineStartInfo.pts = undefined;\n trackDecodeInfo.clearDtsInfo(videoTrack);\n pipeline.captionStream.reset();\n }\n if (pipeline.timestampRolloverStream) {\n pipeline.timestampRolloverStream.discontinuity();\n }\n };\n this.setAudioAppendStart = function (timestamp) {\n if (audioTrack) {\n this.transmuxPipeline_.audioSegmentStream.setAudioAppendStart(timestamp);\n }\n };\n this.setRemux = function (val) {\n var pipeline = this.transmuxPipeline_;\n options.remux = val;\n if (pipeline && pipeline.coalesceStream) {\n pipeline.coalesceStream.setRemux(val);\n }\n };\n this.alignGopsWith = function (gopsToAlignWith) {\n if (videoTrack && this.transmuxPipeline_.videoSegmentStream) {\n this.transmuxPipeline_.videoSegmentStream.alignGopsWith(gopsToAlignWith);\n }\n };\n this.getLogTrigger_ = function (key) {\n var self = this;\n return function (event) {\n event.stream = key;\n self.trigger('log', event);\n };\n }; // feed incoming data to the front of the parsing pipeline\n\n this.push = function (data) {\n if (hasFlushed) {\n var isAac = isLikelyAacData(data);\n if (isAac && this.transmuxPipeline_.type !== 'aac') {\n this.setupAacPipeline();\n } else if (!isAac && this.transmuxPipeline_.type !== 'ts') {\n this.setupTsPipeline();\n }\n hasFlushed = false;\n }\n this.transmuxPipeline_.headOfPipeline.push(data);\n }; // flush any buffered data\n\n this.flush = function () {\n hasFlushed = true; // Start at the top of the pipeline and flush all pending work\n\n this.transmuxPipeline_.headOfPipeline.flush();\n };\n this.endTimeline = function () {\n this.transmuxPipeline_.headOfPipeline.endTimeline();\n };\n this.reset = function () {\n if (this.transmuxPipeline_.headOfPipeline) {\n this.transmuxPipeline_.headOfPipeline.reset();\n }\n }; // Caption data has to be reset when seeking outside buffered range\n\n this.resetCaptions = function () {\n if (this.transmuxPipeline_.captionStream) {\n this.transmuxPipeline_.captionStream.reset();\n }\n };\n };\n Transmuxer.prototype = new Stream();\n var transmuxer = {\n Transmuxer: Transmuxer,\n VideoSegmentStream: VideoSegmentStream,\n AudioSegmentStream: AudioSegmentStream,\n AUDIO_PROPERTIES: AUDIO_PROPERTIES,\n VIDEO_PROPERTIES: VIDEO_PROPERTIES,\n // exported for testing\n generateSegmentTimingInfo: generateSegmentTimingInfo\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n */\n\n var toUnsigned$3 = function (value) {\n return value >>> 0;\n };\n var toHexString$1 = function (value) {\n return ('00' + value.toString(16)).slice(-2);\n };\n var bin = {\n toUnsigned: toUnsigned$3,\n toHexString: toHexString$1\n };\n var parseType$4 = function (buffer) {\n var result = '';\n result += String.fromCharCode(buffer[0]);\n result += String.fromCharCode(buffer[1]);\n result += String.fromCharCode(buffer[2]);\n result += String.fromCharCode(buffer[3]);\n return result;\n };\n var parseType_1 = parseType$4;\n var toUnsigned$2 = bin.toUnsigned;\n var parseType$3 = parseType_1;\n var findBox$5 = function (data, path) {\n var results = [],\n i,\n size,\n type,\n end,\n subresults;\n if (!path.length) {\n // short-circuit the search for empty paths\n return null;\n }\n for (i = 0; i < data.byteLength;) {\n size = toUnsigned$2(data[i] << 24 | data[i + 1] << 16 | data[i + 2] << 8 | data[i + 3]);\n type = parseType$3(data.subarray(i + 4, i + 8));\n end = size > 1 ? i + size : data.byteLength;\n if (type === path[0]) {\n if (path.length === 1) {\n // this is the end of the path and we've found the box we were\n // looking for\n results.push(data.subarray(i + 8, end));\n } else {\n // recursively search for the next box along the path\n subresults = findBox$5(data.subarray(i + 8, end), path.slice(1));\n if (subresults.length) {\n results = results.concat(subresults);\n }\n }\n }\n i = end;\n } // we've finished searching all of data\n\n return results;\n };\n var findBox_1 = findBox$5;\n var toUnsigned$1 = bin.toUnsigned;\n var getUint64$4 = numbers.getUint64;\n var tfdt = function (data) {\n var result = {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4))\n };\n if (result.version === 1) {\n result.baseMediaDecodeTime = getUint64$4(data.subarray(4));\n } else {\n result.baseMediaDecodeTime = toUnsigned$1(data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]);\n }\n return result;\n };\n var parseTfdt$3 = tfdt;\n var tfhd = function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n trackId: view.getUint32(4)\n },\n baseDataOffsetPresent = result.flags[2] & 0x01,\n sampleDescriptionIndexPresent = result.flags[2] & 0x02,\n defaultSampleDurationPresent = result.flags[2] & 0x08,\n defaultSampleSizePresent = result.flags[2] & 0x10,\n defaultSampleFlagsPresent = result.flags[2] & 0x20,\n durationIsEmpty = result.flags[0] & 0x010000,\n defaultBaseIsMoof = result.flags[0] & 0x020000,\n i;\n i = 8;\n if (baseDataOffsetPresent) {\n i += 4; // truncate top 4 bytes\n // FIXME: should we read the full 64 bits?\n\n result.baseDataOffset = view.getUint32(12);\n i += 4;\n }\n if (sampleDescriptionIndexPresent) {\n result.sampleDescriptionIndex = view.getUint32(i);\n i += 4;\n }\n if (defaultSampleDurationPresent) {\n result.defaultSampleDuration = view.getUint32(i);\n i += 4;\n }\n if (defaultSampleSizePresent) {\n result.defaultSampleSize = view.getUint32(i);\n i += 4;\n }\n if (defaultSampleFlagsPresent) {\n result.defaultSampleFlags = view.getUint32(i);\n }\n if (durationIsEmpty) {\n result.durationIsEmpty = true;\n }\n if (!baseDataOffsetPresent && defaultBaseIsMoof) {\n result.baseDataOffsetIsMoof = true;\n }\n return result;\n };\n var parseTfhd$2 = tfhd;\n var getUint64$3 = numbers.getUint64;\n var parseSidx = function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n references: [],\n referenceId: view.getUint32(4),\n timescale: view.getUint32(8)\n },\n i = 12;\n if (result.version === 0) {\n result.earliestPresentationTime = view.getUint32(i);\n result.firstOffset = view.getUint32(i + 4);\n i += 8;\n } else {\n // read 64 bits\n result.earliestPresentationTime = getUint64$3(data.subarray(i));\n result.firstOffset = getUint64$3(data.subarray(i + 8));\n i += 16;\n }\n i += 2; // reserved\n\n var referenceCount = view.getUint16(i);\n i += 2; // start of references\n\n for (; referenceCount > 0; i += 12, referenceCount--) {\n result.references.push({\n referenceType: (data[i] & 0x80) >>> 7,\n referencedSize: view.getUint32(i) & 0x7FFFFFFF,\n subsegmentDuration: view.getUint32(i + 4),\n startsWithSap: !!(data[i + 8] & 0x80),\n sapType: (data[i + 8] & 0x70) >>> 4,\n sapDeltaTime: view.getUint32(i + 8) & 0x0FFFFFFF\n });\n }\n return result;\n };\n var parseSidx_1 = parseSidx;\n var parseSampleFlags$1 = function (flags) {\n return {\n isLeading: (flags[0] & 0x0c) >>> 2,\n dependsOn: flags[0] & 0x03,\n isDependedOn: (flags[1] & 0xc0) >>> 6,\n hasRedundancy: (flags[1] & 0x30) >>> 4,\n paddingValue: (flags[1] & 0x0e) >>> 1,\n isNonSyncSample: flags[1] & 0x01,\n degradationPriority: flags[2] << 8 | flags[3]\n };\n };\n var parseSampleFlags_1 = parseSampleFlags$1;\n var parseSampleFlags = parseSampleFlags_1;\n var trun = function (data) {\n var result = {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n samples: []\n },\n view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n // Flag interpretation\n dataOffsetPresent = result.flags[2] & 0x01,\n // compare with 2nd byte of 0x1\n firstSampleFlagsPresent = result.flags[2] & 0x04,\n // compare with 2nd byte of 0x4\n sampleDurationPresent = result.flags[1] & 0x01,\n // compare with 2nd byte of 0x100\n sampleSizePresent = result.flags[1] & 0x02,\n // compare with 2nd byte of 0x200\n sampleFlagsPresent = result.flags[1] & 0x04,\n // compare with 2nd byte of 0x400\n sampleCompositionTimeOffsetPresent = result.flags[1] & 0x08,\n // compare with 2nd byte of 0x800\n sampleCount = view.getUint32(4),\n offset = 8,\n sample;\n if (dataOffsetPresent) {\n // 32 bit signed integer\n result.dataOffset = view.getInt32(offset);\n offset += 4;\n } // Overrides the flags for the first sample only. The order of\n // optional values will be: duration, size, compositionTimeOffset\n\n if (firstSampleFlagsPresent && sampleCount) {\n sample = {\n flags: parseSampleFlags(data.subarray(offset, offset + 4))\n };\n offset += 4;\n if (sampleDurationPresent) {\n sample.duration = view.getUint32(offset);\n offset += 4;\n }\n if (sampleSizePresent) {\n sample.size = view.getUint32(offset);\n offset += 4;\n }\n if (sampleCompositionTimeOffsetPresent) {\n if (result.version === 1) {\n sample.compositionTimeOffset = view.getInt32(offset);\n } else {\n sample.compositionTimeOffset = view.getUint32(offset);\n }\n offset += 4;\n }\n result.samples.push(sample);\n sampleCount--;\n }\n while (sampleCount--) {\n sample = {};\n if (sampleDurationPresent) {\n sample.duration = view.getUint32(offset);\n offset += 4;\n }\n if (sampleSizePresent) {\n sample.size = view.getUint32(offset);\n offset += 4;\n }\n if (sampleFlagsPresent) {\n sample.flags = parseSampleFlags(data.subarray(offset, offset + 4));\n offset += 4;\n }\n if (sampleCompositionTimeOffsetPresent) {\n if (result.version === 1) {\n sample.compositionTimeOffset = view.getInt32(offset);\n } else {\n sample.compositionTimeOffset = view.getUint32(offset);\n }\n offset += 4;\n }\n result.samples.push(sample);\n }\n return result;\n };\n var parseTrun$2 = trun;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Parse the internal MP4 structure into an equivalent javascript\n * object.\n */\n\n var numberHelpers = numbers;\n var getUint64$2 = numberHelpers.getUint64;\n var inspectMp4,\n textifyMp4,\n parseMp4Date = function (seconds) {\n return new Date(seconds * 1000 - 2082844800000);\n },\n parseType$2 = parseType_1,\n findBox$4 = findBox_1,\n nalParse = function (avcStream) {\n var avcView = new DataView(avcStream.buffer, avcStream.byteOffset, avcStream.byteLength),\n result = [],\n i,\n length;\n for (i = 0; i + 4 < avcStream.length; i += length) {\n length = avcView.getUint32(i);\n i += 4; // bail if this doesn't appear to be an H264 stream\n\n if (length <= 0) {\n result.push('MALFORMED DATA');\n continue;\n }\n switch (avcStream[i] & 0x1F) {\n case 0x01:\n result.push('slice_layer_without_partitioning_rbsp');\n break;\n case 0x05:\n result.push('slice_layer_without_partitioning_rbsp_idr');\n break;\n case 0x06:\n result.push('sei_rbsp');\n break;\n case 0x07:\n result.push('seq_parameter_set_rbsp');\n break;\n case 0x08:\n result.push('pic_parameter_set_rbsp');\n break;\n case 0x09:\n result.push('access_unit_delimiter_rbsp');\n break;\n default:\n result.push('UNKNOWN NAL - ' + avcStream[i] & 0x1F);\n break;\n }\n }\n return result;\n },\n // registry of handlers for individual mp4 box types\n parse = {\n // codingname, not a first-class box type. stsd entries share the\n // same format as real boxes so the parsing infrastructure can be\n // shared\n avc1: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n return {\n dataReferenceIndex: view.getUint16(6),\n width: view.getUint16(24),\n height: view.getUint16(26),\n horizresolution: view.getUint16(28) + view.getUint16(30) / 16,\n vertresolution: view.getUint16(32) + view.getUint16(34) / 16,\n frameCount: view.getUint16(40),\n depth: view.getUint16(74),\n config: inspectMp4(data.subarray(78, data.byteLength))\n };\n },\n avcC: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n configurationVersion: data[0],\n avcProfileIndication: data[1],\n profileCompatibility: data[2],\n avcLevelIndication: data[3],\n lengthSizeMinusOne: data[4] & 0x03,\n sps: [],\n pps: []\n },\n numOfSequenceParameterSets = data[5] & 0x1f,\n numOfPictureParameterSets,\n nalSize,\n offset,\n i; // iterate past any SPSs\n\n offset = 6;\n for (i = 0; i < numOfSequenceParameterSets; i++) {\n nalSize = view.getUint16(offset);\n offset += 2;\n result.sps.push(new Uint8Array(data.subarray(offset, offset + nalSize)));\n offset += nalSize;\n } // iterate past any PPSs\n\n numOfPictureParameterSets = data[offset];\n offset++;\n for (i = 0; i < numOfPictureParameterSets; i++) {\n nalSize = view.getUint16(offset);\n offset += 2;\n result.pps.push(new Uint8Array(data.subarray(offset, offset + nalSize)));\n offset += nalSize;\n }\n return result;\n },\n btrt: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n return {\n bufferSizeDB: view.getUint32(0),\n maxBitrate: view.getUint32(4),\n avgBitrate: view.getUint32(8)\n };\n },\n edts: function edts(data) {\n return {\n boxes: inspectMp4(data)\n };\n },\n elst: function elst(data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n version: view.getUint8(0),\n flags: new Uint8Array(data.subarray(1, 4)),\n edits: []\n },\n entryCount = view.getUint32(4),\n i;\n for (i = 8; entryCount; entryCount--) {\n if (result.version === 0) {\n result.edits.push({\n segmentDuration: view.getUint32(i),\n mediaTime: view.getInt32(i + 4),\n mediaRate: view.getUint16(i + 8) + view.getUint16(i + 10) / (256 * 256)\n });\n i += 12;\n } else {\n result.edits.push({\n segmentDuration: getUint64$2(data.subarray(i)),\n mediaTime: getUint64$2(data.subarray(i + 8)),\n mediaRate: view.getUint16(i + 16) + view.getUint16(i + 18) / (256 * 256)\n });\n i += 20;\n }\n }\n return result;\n },\n esds: function (data) {\n return {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n esId: data[6] << 8 | data[7],\n streamPriority: data[8] & 0x1f,\n decoderConfig: {\n objectProfileIndication: data[11],\n streamType: data[12] >>> 2 & 0x3f,\n bufferSize: data[13] << 16 | data[14] << 8 | data[15],\n maxBitrate: data[16] << 24 | data[17] << 16 | data[18] << 8 | data[19],\n avgBitrate: data[20] << 24 | data[21] << 16 | data[22] << 8 | data[23],\n decoderConfigDescriptor: {\n tag: data[24],\n length: data[25],\n audioObjectType: data[26] >>> 3 & 0x1f,\n samplingFrequencyIndex: (data[26] & 0x07) << 1 | data[27] >>> 7 & 0x01,\n channelConfiguration: data[27] >>> 3 & 0x0f\n }\n }\n };\n },\n ftyp: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n majorBrand: parseType$2(data.subarray(0, 4)),\n minorVersion: view.getUint32(4),\n compatibleBrands: []\n },\n i = 8;\n while (i < data.byteLength) {\n result.compatibleBrands.push(parseType$2(data.subarray(i, i + 4)));\n i += 4;\n }\n return result;\n },\n dinf: function (data) {\n return {\n boxes: inspectMp4(data)\n };\n },\n dref: function (data) {\n return {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n dataReferences: inspectMp4(data.subarray(8))\n };\n },\n hdlr: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n version: view.getUint8(0),\n flags: new Uint8Array(data.subarray(1, 4)),\n handlerType: parseType$2(data.subarray(8, 12)),\n name: ''\n },\n i = 8; // parse out the name field\n\n for (i = 24; i < data.byteLength; i++) {\n if (data[i] === 0x00) {\n // the name field is null-terminated\n i++;\n break;\n }\n result.name += String.fromCharCode(data[i]);\n } // decode UTF-8 to javascript's internal representation\n // see http://ecmanaut.blogspot.com/2006/07/encoding-decoding-utf8-in-javascript.html\n\n result.name = decodeURIComponent(escape(result.name));\n return result;\n },\n mdat: function (data) {\n return {\n byteLength: data.byteLength,\n nals: nalParse(data)\n };\n },\n mdhd: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n i = 4,\n language,\n result = {\n version: view.getUint8(0),\n flags: new Uint8Array(data.subarray(1, 4)),\n language: ''\n };\n if (result.version === 1) {\n i += 4;\n result.creationTime = parseMp4Date(view.getUint32(i)); // truncating top 4 bytes\n\n i += 8;\n result.modificationTime = parseMp4Date(view.getUint32(i)); // truncating top 4 bytes\n\n i += 4;\n result.timescale = view.getUint32(i);\n i += 8;\n result.duration = view.getUint32(i); // truncating top 4 bytes\n } else {\n result.creationTime = parseMp4Date(view.getUint32(i));\n i += 4;\n result.modificationTime = parseMp4Date(view.getUint32(i));\n i += 4;\n result.timescale = view.getUint32(i);\n i += 4;\n result.duration = view.getUint32(i);\n }\n i += 4; // language is stored as an ISO-639-2/T code in an array of three 5-bit fields\n // each field is the packed difference between its ASCII value and 0x60\n\n language = view.getUint16(i);\n result.language += String.fromCharCode((language >> 10) + 0x60);\n result.language += String.fromCharCode(((language & 0x03e0) >> 5) + 0x60);\n result.language += String.fromCharCode((language & 0x1f) + 0x60);\n return result;\n },\n mdia: function (data) {\n return {\n boxes: inspectMp4(data)\n };\n },\n mfhd: function (data) {\n return {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n sequenceNumber: data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]\n };\n },\n minf: function (data) {\n return {\n boxes: inspectMp4(data)\n };\n },\n // codingname, not a first-class box type. stsd entries share the\n // same format as real boxes so the parsing infrastructure can be\n // shared\n mp4a: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n // 6 bytes reserved\n dataReferenceIndex: view.getUint16(6),\n // 4 + 4 bytes reserved\n channelcount: view.getUint16(16),\n samplesize: view.getUint16(18),\n // 2 bytes pre_defined\n // 2 bytes reserved\n samplerate: view.getUint16(24) + view.getUint16(26) / 65536\n }; // if there are more bytes to process, assume this is an ISO/IEC\n // 14496-14 MP4AudioSampleEntry and parse the ESDBox\n\n if (data.byteLength > 28) {\n result.streamDescriptor = inspectMp4(data.subarray(28))[0];\n }\n return result;\n },\n moof: function (data) {\n return {\n boxes: inspectMp4(data)\n };\n },\n moov: function (data) {\n return {\n boxes: inspectMp4(data)\n };\n },\n mvex: function (data) {\n return {\n boxes: inspectMp4(data)\n };\n },\n mvhd: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n i = 4,\n result = {\n version: view.getUint8(0),\n flags: new Uint8Array(data.subarray(1, 4))\n };\n if (result.version === 1) {\n i += 4;\n result.creationTime = parseMp4Date(view.getUint32(i)); // truncating top 4 bytes\n\n i += 8;\n result.modificationTime = parseMp4Date(view.getUint32(i)); // truncating top 4 bytes\n\n i += 4;\n result.timescale = view.getUint32(i);\n i += 8;\n result.duration = view.getUint32(i); // truncating top 4 bytes\n } else {\n result.creationTime = parseMp4Date(view.getUint32(i));\n i += 4;\n result.modificationTime = parseMp4Date(view.getUint32(i));\n i += 4;\n result.timescale = view.getUint32(i);\n i += 4;\n result.duration = view.getUint32(i);\n }\n i += 4; // convert fixed-point, base 16 back to a number\n\n result.rate = view.getUint16(i) + view.getUint16(i + 2) / 16;\n i += 4;\n result.volume = view.getUint8(i) + view.getUint8(i + 1) / 8;\n i += 2;\n i += 2;\n i += 2 * 4;\n result.matrix = new Uint32Array(data.subarray(i, i + 9 * 4));\n i += 9 * 4;\n i += 6 * 4;\n result.nextTrackId = view.getUint32(i);\n return result;\n },\n pdin: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n return {\n version: view.getUint8(0),\n flags: new Uint8Array(data.subarray(1, 4)),\n rate: view.getUint32(4),\n initialDelay: view.getUint32(8)\n };\n },\n sdtp: function (data) {\n var result = {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n samples: []\n },\n i;\n for (i = 4; i < data.byteLength; i++) {\n result.samples.push({\n dependsOn: (data[i] & 0x30) >> 4,\n isDependedOn: (data[i] & 0x0c) >> 2,\n hasRedundancy: data[i] & 0x03\n });\n }\n return result;\n },\n sidx: parseSidx_1,\n smhd: function (data) {\n return {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n balance: data[4] + data[5] / 256\n };\n },\n stbl: function (data) {\n return {\n boxes: inspectMp4(data)\n };\n },\n ctts: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n version: view.getUint8(0),\n flags: new Uint8Array(data.subarray(1, 4)),\n compositionOffsets: []\n },\n entryCount = view.getUint32(4),\n i;\n for (i = 8; entryCount; i += 8, entryCount--) {\n result.compositionOffsets.push({\n sampleCount: view.getUint32(i),\n sampleOffset: view[result.version === 0 ? 'getUint32' : 'getInt32'](i + 4)\n });\n }\n return result;\n },\n stss: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n version: view.getUint8(0),\n flags: new Uint8Array(data.subarray(1, 4)),\n syncSamples: []\n },\n entryCount = view.getUint32(4),\n i;\n for (i = 8; entryCount; i += 4, entryCount--) {\n result.syncSamples.push(view.getUint32(i));\n }\n return result;\n },\n stco: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n chunkOffsets: []\n },\n entryCount = view.getUint32(4),\n i;\n for (i = 8; entryCount; i += 4, entryCount--) {\n result.chunkOffsets.push(view.getUint32(i));\n }\n return result;\n },\n stsc: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n entryCount = view.getUint32(4),\n result = {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n sampleToChunks: []\n },\n i;\n for (i = 8; entryCount; i += 12, entryCount--) {\n result.sampleToChunks.push({\n firstChunk: view.getUint32(i),\n samplesPerChunk: view.getUint32(i + 4),\n sampleDescriptionIndex: view.getUint32(i + 8)\n });\n }\n return result;\n },\n stsd: function (data) {\n return {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n sampleDescriptions: inspectMp4(data.subarray(8))\n };\n },\n stsz: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n sampleSize: view.getUint32(4),\n entries: []\n },\n i;\n for (i = 12; i < data.byteLength; i += 4) {\n result.entries.push(view.getUint32(i));\n }\n return result;\n },\n stts: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n result = {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n timeToSamples: []\n },\n entryCount = view.getUint32(4),\n i;\n for (i = 8; entryCount; i += 8, entryCount--) {\n result.timeToSamples.push({\n sampleCount: view.getUint32(i),\n sampleDelta: view.getUint32(i + 4)\n });\n }\n return result;\n },\n styp: function (data) {\n return parse.ftyp(data);\n },\n tfdt: parseTfdt$3,\n tfhd: parseTfhd$2,\n tkhd: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength),\n i = 4,\n result = {\n version: view.getUint8(0),\n flags: new Uint8Array(data.subarray(1, 4))\n };\n if (result.version === 1) {\n i += 4;\n result.creationTime = parseMp4Date(view.getUint32(i)); // truncating top 4 bytes\n\n i += 8;\n result.modificationTime = parseMp4Date(view.getUint32(i)); // truncating top 4 bytes\n\n i += 4;\n result.trackId = view.getUint32(i);\n i += 4;\n i += 8;\n result.duration = view.getUint32(i); // truncating top 4 bytes\n } else {\n result.creationTime = parseMp4Date(view.getUint32(i));\n i += 4;\n result.modificationTime = parseMp4Date(view.getUint32(i));\n i += 4;\n result.trackId = view.getUint32(i);\n i += 4;\n i += 4;\n result.duration = view.getUint32(i);\n }\n i += 4;\n i += 2 * 4;\n result.layer = view.getUint16(i);\n i += 2;\n result.alternateGroup = view.getUint16(i);\n i += 2; // convert fixed-point, base 16 back to a number\n\n result.volume = view.getUint8(i) + view.getUint8(i + 1) / 8;\n i += 2;\n i += 2;\n result.matrix = new Uint32Array(data.subarray(i, i + 9 * 4));\n i += 9 * 4;\n result.width = view.getUint16(i) + view.getUint16(i + 2) / 65536;\n i += 4;\n result.height = view.getUint16(i) + view.getUint16(i + 2) / 65536;\n return result;\n },\n traf: function (data) {\n return {\n boxes: inspectMp4(data)\n };\n },\n trak: function (data) {\n return {\n boxes: inspectMp4(data)\n };\n },\n trex: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n return {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n trackId: view.getUint32(4),\n defaultSampleDescriptionIndex: view.getUint32(8),\n defaultSampleDuration: view.getUint32(12),\n defaultSampleSize: view.getUint32(16),\n sampleDependsOn: data[20] & 0x03,\n sampleIsDependedOn: (data[21] & 0xc0) >> 6,\n sampleHasRedundancy: (data[21] & 0x30) >> 4,\n samplePaddingValue: (data[21] & 0x0e) >> 1,\n sampleIsDifferenceSample: !!(data[21] & 0x01),\n sampleDegradationPriority: view.getUint16(22)\n };\n },\n trun: parseTrun$2,\n 'url ': function (data) {\n return {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4))\n };\n },\n vmhd: function (data) {\n var view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n return {\n version: data[0],\n flags: new Uint8Array(data.subarray(1, 4)),\n graphicsmode: view.getUint16(4),\n opcolor: new Uint16Array([view.getUint16(6), view.getUint16(8), view.getUint16(10)])\n };\n }\n };\n /**\n * Return a javascript array of box objects parsed from an ISO base\n * media file.\n * @param data {Uint8Array} the binary data of the media to be inspected\n * @return {array} a javascript array of potentially nested box objects\n */\n\n inspectMp4 = function (data) {\n var i = 0,\n result = [],\n view,\n size,\n type,\n end,\n box; // Convert data from Uint8Array to ArrayBuffer, to follow Dataview API\n\n var ab = new ArrayBuffer(data.length);\n var v = new Uint8Array(ab);\n for (var z = 0; z < data.length; ++z) {\n v[z] = data[z];\n }\n view = new DataView(ab);\n while (i < data.byteLength) {\n // parse box data\n size = view.getUint32(i);\n type = parseType$2(data.subarray(i + 4, i + 8));\n end = size > 1 ? i + size : data.byteLength; // parse type-specific data\n\n box = (parse[type] || function (data) {\n return {\n data: data\n };\n })(data.subarray(i + 8, end));\n box.size = size;\n box.type = type; // store this box and move to the next\n\n result.push(box);\n i = end;\n }\n return result;\n };\n /**\n * Returns a textual representation of the javascript represtentation\n * of an MP4 file. You can use it as an alternative to\n * JSON.stringify() to compare inspected MP4s.\n * @param inspectedMp4 {array} the parsed array of boxes in an MP4\n * file\n * @param depth {number} (optional) the number of ancestor boxes of\n * the elements of inspectedMp4. Assumed to be zero if unspecified.\n * @return {string} a text representation of the parsed MP4\n */\n\n textifyMp4 = function (inspectedMp4, depth) {\n var indent;\n depth = depth || 0;\n indent = new Array(depth * 2 + 1).join(' '); // iterate over all the boxes\n\n return inspectedMp4.map(function (box, index) {\n // list the box type first at the current indentation level\n return indent + box.type + '\\n' +\n // the type is already included and handle child boxes separately\n Object.keys(box).filter(function (key) {\n return key !== 'type' && key !== 'boxes'; // output all the box properties\n }).map(function (key) {\n var prefix = indent + ' ' + key + ': ',\n value = box[key]; // print out raw bytes as hexademical\n\n if (value instanceof Uint8Array || value instanceof Uint32Array) {\n var bytes = Array.prototype.slice.call(new Uint8Array(value.buffer, value.byteOffset, value.byteLength)).map(function (byte) {\n return ' ' + ('00' + byte.toString(16)).slice(-2);\n }).join('').match(/.{1,24}/g);\n if (!bytes) {\n return prefix + '<>';\n }\n if (bytes.length === 1) {\n return prefix + '<' + bytes.join('').slice(1) + '>';\n }\n return prefix + '<\\n' + bytes.map(function (line) {\n return indent + ' ' + line;\n }).join('\\n') + '\\n' + indent + ' >';\n } // stringify generic objects\n\n return prefix + JSON.stringify(value, null, 2).split('\\n').map(function (line, index) {\n if (index === 0) {\n return line;\n }\n return indent + ' ' + line;\n }).join('\\n');\n }).join('\\n') + (\n // recursively textify the child boxes\n box.boxes ? '\\n' + textifyMp4(box.boxes, depth + 1) : '');\n }).join('\\n');\n };\n var mp4Inspector = {\n inspect: inspectMp4,\n textify: textifyMp4,\n parseType: parseType$2,\n findBox: findBox$4,\n parseTraf: parse.traf,\n parseTfdt: parse.tfdt,\n parseHdlr: parse.hdlr,\n parseTfhd: parse.tfhd,\n parseTrun: parse.trun,\n parseSidx: parse.sidx\n };\n /**\n * Returns the first string in the data array ending with a null char '\\0'\n * @param {UInt8} data \n * @returns the string with the null char\n */\n\n var uint8ToCString$1 = function (data) {\n var index = 0;\n var curChar = String.fromCharCode(data[index]);\n var retString = '';\n while (curChar !== '\\0') {\n retString += curChar;\n index++;\n curChar = String.fromCharCode(data[index]);\n } // Add nullChar\n\n retString += curChar;\n return retString;\n };\n var string = {\n uint8ToCString: uint8ToCString$1\n };\n var uint8ToCString = string.uint8ToCString;\n var getUint64$1 = numbers.getUint64;\n /**\n * Based on: ISO/IEC 23009 Section: 5.10.3.3\n * References:\n * https://dashif-documents.azurewebsites.net/Events/master/event.html#emsg-format\n * https://aomediacodec.github.io/id3-emsg/\n * \n * Takes emsg box data as a uint8 array and returns a emsg box object\n * @param {UInt8Array} boxData data from emsg box\n * @returns A parsed emsg box object\n */\n\n var parseEmsgBox = function (boxData) {\n // version + flags\n var offset = 4;\n var version = boxData[0];\n var scheme_id_uri, value, timescale, presentation_time, presentation_time_delta, event_duration, id, message_data;\n if (version === 0) {\n scheme_id_uri = uint8ToCString(boxData.subarray(offset));\n offset += scheme_id_uri.length;\n value = uint8ToCString(boxData.subarray(offset));\n offset += value.length;\n var dv = new DataView(boxData.buffer);\n timescale = dv.getUint32(offset);\n offset += 4;\n presentation_time_delta = dv.getUint32(offset);\n offset += 4;\n event_duration = dv.getUint32(offset);\n offset += 4;\n id = dv.getUint32(offset);\n offset += 4;\n } else if (version === 1) {\n var dv = new DataView(boxData.buffer);\n timescale = dv.getUint32(offset);\n offset += 4;\n presentation_time = getUint64$1(boxData.subarray(offset));\n offset += 8;\n event_duration = dv.getUint32(offset);\n offset += 4;\n id = dv.getUint32(offset);\n offset += 4;\n scheme_id_uri = uint8ToCString(boxData.subarray(offset));\n offset += scheme_id_uri.length;\n value = uint8ToCString(boxData.subarray(offset));\n offset += value.length;\n }\n message_data = new Uint8Array(boxData.subarray(offset, boxData.byteLength));\n var emsgBox = {\n scheme_id_uri,\n value,\n // if timescale is undefined or 0 set to 1 \n timescale: timescale ? timescale : 1,\n presentation_time,\n presentation_time_delta,\n event_duration,\n id,\n message_data\n };\n return isValidEmsgBox(version, emsgBox) ? emsgBox : undefined;\n };\n /**\n * Scales a presentation time or time delta with an offset with a provided timescale\n * @param {number} presentationTime \n * @param {number} timescale \n * @param {number} timeDelta \n * @param {number} offset \n * @returns the scaled time as a number\n */\n\n var scaleTime = function (presentationTime, timescale, timeDelta, offset) {\n return presentationTime || presentationTime === 0 ? presentationTime / timescale : offset + timeDelta / timescale;\n };\n /**\n * Checks the emsg box data for validity based on the version\n * @param {number} version of the emsg box to validate\n * @param {Object} emsg the emsg data to validate\n * @returns if the box is valid as a boolean\n */\n\n var isValidEmsgBox = function (version, emsg) {\n var hasScheme = emsg.scheme_id_uri !== '\\0';\n var isValidV0Box = version === 0 && isDefined(emsg.presentation_time_delta) && hasScheme;\n var isValidV1Box = version === 1 && isDefined(emsg.presentation_time) && hasScheme; // Only valid versions of emsg are 0 and 1\n\n return !(version > 1) && isValidV0Box || isValidV1Box;\n }; // Utility function to check if an object is defined\n\n var isDefined = function (data) {\n return data !== undefined || data !== null;\n };\n var emsg$1 = {\n parseEmsgBox: parseEmsgBox,\n scaleTime: scaleTime\n };\n var win;\n if (typeof window !== \"undefined\") {\n win = window;\n } else if (typeof commonjsGlobal !== \"undefined\") {\n win = commonjsGlobal;\n } else if (typeof self !== \"undefined\") {\n win = self;\n } else {\n win = {};\n }\n var window_1 = win;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Utilities to detect basic properties and metadata about MP4s.\n */\n\n var toUnsigned = bin.toUnsigned;\n var toHexString = bin.toHexString;\n var findBox$3 = findBox_1;\n var parseType$1 = parseType_1;\n var emsg = emsg$1;\n var parseTfhd$1 = parseTfhd$2;\n var parseTrun$1 = parseTrun$2;\n var parseTfdt$2 = parseTfdt$3;\n var getUint64 = numbers.getUint64;\n var timescale, startTime, compositionStartTime, getVideoTrackIds, getTracks, getTimescaleFromMediaHeader$1, getEmsgID3;\n var window$2 = window_1;\n var parseId3Frames = parseId3.parseId3Frames;\n /**\n * Parses an MP4 initialization segment and extracts the timescale\n * values for any declared tracks. Timescale values indicate the\n * number of clock ticks per second to assume for time-based values\n * elsewhere in the MP4.\n *\n * To determine the start time of an MP4, you need two pieces of\n * information: the timescale unit and the earliest base media decode\n * time. Multiple timescales can be specified within an MP4 but the\n * base media decode time is always expressed in the timescale from\n * the media header box for the track:\n * ```\n * moov > trak > mdia > mdhd.timescale\n * ```\n * @param init {Uint8Array} the bytes of the init segment\n * @return {object} a hash of track ids to timescale values or null if\n * the init segment is malformed.\n */\n\n timescale = function (init) {\n var result = {},\n traks = findBox$3(init, ['moov', 'trak']); // mdhd timescale\n\n return traks.reduce(function (result, trak) {\n var tkhd, version, index, id, mdhd;\n tkhd = findBox$3(trak, ['tkhd'])[0];\n if (!tkhd) {\n return null;\n }\n version = tkhd[0];\n index = version === 0 ? 12 : 20;\n id = toUnsigned(tkhd[index] << 24 | tkhd[index + 1] << 16 | tkhd[index + 2] << 8 | tkhd[index + 3]);\n mdhd = findBox$3(trak, ['mdia', 'mdhd'])[0];\n if (!mdhd) {\n return null;\n }\n version = mdhd[0];\n index = version === 0 ? 12 : 20;\n result[id] = toUnsigned(mdhd[index] << 24 | mdhd[index + 1] << 16 | mdhd[index + 2] << 8 | mdhd[index + 3]);\n return result;\n }, result);\n };\n /**\n * Determine the base media decode start time, in seconds, for an MP4\n * fragment. If multiple fragments are specified, the earliest time is\n * returned.\n *\n * The base media decode time can be parsed from track fragment\n * metadata:\n * ```\n * moof > traf > tfdt.baseMediaDecodeTime\n * ```\n * It requires the timescale value from the mdhd to interpret.\n *\n * @param timescale {object} a hash of track ids to timescale values.\n * @return {number} the earliest base media decode start time for the\n * fragment, in seconds\n */\n\n startTime = function (timescale, fragment) {\n var trafs; // we need info from two childrend of each track fragment box\n\n trafs = findBox$3(fragment, ['moof', 'traf']); // determine the start times for each track\n\n var lowestTime = trafs.reduce(function (acc, traf) {\n var tfhd = findBox$3(traf, ['tfhd'])[0]; // get the track id from the tfhd\n\n var id = toUnsigned(tfhd[4] << 24 | tfhd[5] << 16 | tfhd[6] << 8 | tfhd[7]); // assume a 90kHz clock if no timescale was specified\n\n var scale = timescale[id] || 90e3; // get the base media decode time from the tfdt\n\n var tfdt = findBox$3(traf, ['tfdt'])[0];\n var dv = new DataView(tfdt.buffer, tfdt.byteOffset, tfdt.byteLength);\n var baseTime; // version 1 is 64 bit\n\n if (tfdt[0] === 1) {\n baseTime = getUint64(tfdt.subarray(4, 12));\n } else {\n baseTime = dv.getUint32(4);\n } // convert base time to seconds if it is a valid number.\n\n let seconds;\n if (typeof baseTime === 'bigint') {\n seconds = baseTime / window$2.BigInt(scale);\n } else if (typeof baseTime === 'number' && !isNaN(baseTime)) {\n seconds = baseTime / scale;\n }\n if (seconds < Number.MAX_SAFE_INTEGER) {\n seconds = Number(seconds);\n }\n if (seconds < acc) {\n acc = seconds;\n }\n return acc;\n }, Infinity);\n return typeof lowestTime === 'bigint' || isFinite(lowestTime) ? lowestTime : 0;\n };\n /**\n * Determine the composition start, in seconds, for an MP4\n * fragment.\n *\n * The composition start time of a fragment can be calculated using the base\n * media decode time, composition time offset, and timescale, as follows:\n *\n * compositionStartTime = (baseMediaDecodeTime + compositionTimeOffset) / timescale\n *\n * All of the aforementioned information is contained within a media fragment's\n * `traf` box, except for timescale info, which comes from the initialization\n * segment, so a track id (also contained within a `traf`) is also necessary to\n * associate it with a timescale\n *\n *\n * @param timescales {object} - a hash of track ids to timescale values.\n * @param fragment {Unit8Array} - the bytes of a media segment\n * @return {number} the composition start time for the fragment, in seconds\n **/\n\n compositionStartTime = function (timescales, fragment) {\n var trafBoxes = findBox$3(fragment, ['moof', 'traf']);\n var baseMediaDecodeTime = 0;\n var compositionTimeOffset = 0;\n var trackId;\n if (trafBoxes && trafBoxes.length) {\n // The spec states that track run samples contained within a `traf` box are contiguous, but\n // it does not explicitly state whether the `traf` boxes themselves are contiguous.\n // We will assume that they are, so we only need the first to calculate start time.\n var tfhd = findBox$3(trafBoxes[0], ['tfhd'])[0];\n var trun = findBox$3(trafBoxes[0], ['trun'])[0];\n var tfdt = findBox$3(trafBoxes[0], ['tfdt'])[0];\n if (tfhd) {\n var parsedTfhd = parseTfhd$1(tfhd);\n trackId = parsedTfhd.trackId;\n }\n if (tfdt) {\n var parsedTfdt = parseTfdt$2(tfdt);\n baseMediaDecodeTime = parsedTfdt.baseMediaDecodeTime;\n }\n if (trun) {\n var parsedTrun = parseTrun$1(trun);\n if (parsedTrun.samples && parsedTrun.samples.length) {\n compositionTimeOffset = parsedTrun.samples[0].compositionTimeOffset || 0;\n }\n }\n } // Get timescale for this specific track. Assume a 90kHz clock if no timescale was\n // specified.\n\n var timescale = timescales[trackId] || 90e3; // return the composition start time, in seconds\n\n if (typeof baseMediaDecodeTime === 'bigint') {\n compositionTimeOffset = window$2.BigInt(compositionTimeOffset);\n timescale = window$2.BigInt(timescale);\n }\n var result = (baseMediaDecodeTime + compositionTimeOffset) / timescale;\n if (typeof result === 'bigint' && result < Number.MAX_SAFE_INTEGER) {\n result = Number(result);\n }\n return result;\n };\n /**\n * Find the trackIds of the video tracks in this source.\n * Found by parsing the Handler Reference and Track Header Boxes:\n * moov > trak > mdia > hdlr\n * moov > trak > tkhd\n *\n * @param {Uint8Array} init - The bytes of the init segment for this source\n * @return {Number[]} A list of trackIds\n *\n * @see ISO-BMFF-12/2015, Section 8.4.3\n **/\n\n getVideoTrackIds = function (init) {\n var traks = findBox$3(init, ['moov', 'trak']);\n var videoTrackIds = [];\n traks.forEach(function (trak) {\n var hdlrs = findBox$3(trak, ['mdia', 'hdlr']);\n var tkhds = findBox$3(trak, ['tkhd']);\n hdlrs.forEach(function (hdlr, index) {\n var handlerType = parseType$1(hdlr.subarray(8, 12));\n var tkhd = tkhds[index];\n var view;\n var version;\n var trackId;\n if (handlerType === 'vide') {\n view = new DataView(tkhd.buffer, tkhd.byteOffset, tkhd.byteLength);\n version = view.getUint8(0);\n trackId = version === 0 ? view.getUint32(12) : view.getUint32(20);\n videoTrackIds.push(trackId);\n }\n });\n });\n return videoTrackIds;\n };\n getTimescaleFromMediaHeader$1 = function (mdhd) {\n // mdhd is a FullBox, meaning it will have its own version as the first byte\n var version = mdhd[0];\n var index = version === 0 ? 12 : 20;\n return toUnsigned(mdhd[index] << 24 | mdhd[index + 1] << 16 | mdhd[index + 2] << 8 | mdhd[index + 3]);\n };\n /**\n * Get all the video, audio, and hint tracks from a non fragmented\n * mp4 segment\n */\n\n getTracks = function (init) {\n var traks = findBox$3(init, ['moov', 'trak']);\n var tracks = [];\n traks.forEach(function (trak) {\n var track = {};\n var tkhd = findBox$3(trak, ['tkhd'])[0];\n var view, tkhdVersion; // id\n\n if (tkhd) {\n view = new DataView(tkhd.buffer, tkhd.byteOffset, tkhd.byteLength);\n tkhdVersion = view.getUint8(0);\n track.id = tkhdVersion === 0 ? view.getUint32(12) : view.getUint32(20);\n }\n var hdlr = findBox$3(trak, ['mdia', 'hdlr'])[0]; // type\n\n if (hdlr) {\n var type = parseType$1(hdlr.subarray(8, 12));\n if (type === 'vide') {\n track.type = 'video';\n } else if (type === 'soun') {\n track.type = 'audio';\n } else {\n track.type = type;\n }\n } // codec\n\n var stsd = findBox$3(trak, ['mdia', 'minf', 'stbl', 'stsd'])[0];\n if (stsd) {\n var sampleDescriptions = stsd.subarray(8); // gives the codec type string\n\n track.codec = parseType$1(sampleDescriptions.subarray(4, 8));\n var codecBox = findBox$3(sampleDescriptions, [track.codec])[0];\n var codecConfig, codecConfigType;\n if (codecBox) {\n // https://tools.ietf.org/html/rfc6381#section-3.3\n if (/^[asm]vc[1-9]$/i.test(track.codec)) {\n // we don't need anything but the \"config\" parameter of the\n // avc1 codecBox\n codecConfig = codecBox.subarray(78);\n codecConfigType = parseType$1(codecConfig.subarray(4, 8));\n if (codecConfigType === 'avcC' && codecConfig.length > 11) {\n track.codec += '.'; // left padded with zeroes for single digit hex\n // profile idc\n\n track.codec += toHexString(codecConfig[9]); // the byte containing the constraint_set flags\n\n track.codec += toHexString(codecConfig[10]); // level idc\n\n track.codec += toHexString(codecConfig[11]);\n } else {\n // TODO: show a warning that we couldn't parse the codec\n // and are using the default\n track.codec = 'avc1.4d400d';\n }\n } else if (/^mp4[a,v]$/i.test(track.codec)) {\n // we do not need anything but the streamDescriptor of the mp4a codecBox\n codecConfig = codecBox.subarray(28);\n codecConfigType = parseType$1(codecConfig.subarray(4, 8));\n if (codecConfigType === 'esds' && codecConfig.length > 20 && codecConfig[19] !== 0) {\n track.codec += '.' + toHexString(codecConfig[19]); // this value is only a single digit\n\n track.codec += '.' + toHexString(codecConfig[20] >>> 2 & 0x3f).replace(/^0/, '');\n } else {\n // TODO: show a warning that we couldn't parse the codec\n // and are using the default\n track.codec = 'mp4a.40.2';\n }\n } else {\n // flac, opus, etc\n track.codec = track.codec.toLowerCase();\n }\n }\n }\n var mdhd = findBox$3(trak, ['mdia', 'mdhd'])[0];\n if (mdhd) {\n track.timescale = getTimescaleFromMediaHeader$1(mdhd);\n }\n tracks.push(track);\n });\n return tracks;\n };\n /**\n * Returns an array of emsg ID3 data from the provided segmentData.\n * An offset can also be provided as the Latest Arrival Time to calculate \n * the Event Start Time of v0 EMSG boxes. \n * See: https://dashif-documents.azurewebsites.net/Events/master/event.html#Inband-event-timing\n * \n * @param {Uint8Array} segmentData the segment byte array.\n * @param {number} offset the segment start time or Latest Arrival Time, \n * @return {Object[]} an array of ID3 parsed from EMSG boxes\n */\n\n getEmsgID3 = function (segmentData, offset = 0) {\n var emsgBoxes = findBox$3(segmentData, ['emsg']);\n return emsgBoxes.map(data => {\n var parsedBox = emsg.parseEmsgBox(new Uint8Array(data));\n var parsedId3Frames = parseId3Frames(parsedBox.message_data);\n return {\n cueTime: emsg.scaleTime(parsedBox.presentation_time, parsedBox.timescale, parsedBox.presentation_time_delta, offset),\n duration: emsg.scaleTime(parsedBox.event_duration, parsedBox.timescale),\n frames: parsedId3Frames\n };\n });\n };\n var probe$2 = {\n // export mp4 inspector's findBox and parseType for backwards compatibility\n findBox: findBox$3,\n parseType: parseType$1,\n timescale: timescale,\n startTime: startTime,\n compositionStartTime: compositionStartTime,\n videoTrackIds: getVideoTrackIds,\n tracks: getTracks,\n getTimescaleFromMediaHeader: getTimescaleFromMediaHeader$1,\n getEmsgID3: getEmsgID3\n };\n const {\n parseTrun\n } = mp4Inspector;\n const {\n findBox: findBox$2\n } = probe$2;\n var window$1 = window_1;\n /**\n * Utility function for parsing data from mdat boxes.\n * @param {Array} segment the segment data to create mdat/traf pairs from.\n * @returns mdat and traf boxes paired up for easier parsing.\n */\n\n var getMdatTrafPairs$2 = function (segment) {\n var trafs = findBox$2(segment, ['moof', 'traf']);\n var mdats = findBox$2(segment, ['mdat']);\n var mdatTrafPairs = []; // Pair up each traf with a mdat as moofs and mdats are in pairs\n\n mdats.forEach(function (mdat, index) {\n var matchingTraf = trafs[index];\n mdatTrafPairs.push({\n mdat: mdat,\n traf: matchingTraf\n });\n });\n return mdatTrafPairs;\n };\n /**\n * Parses sample information out of Track Run Boxes and calculates\n * the absolute presentation and decode timestamps of each sample.\n *\n * @param {Array} truns - The Trun Run boxes to be parsed\n * @param {Number|BigInt} baseMediaDecodeTime - base media decode time from tfdt\n @see ISO-BMFF-12/2015, Section 8.8.12\n * @param {Object} tfhd - The parsed Track Fragment Header\n * @see inspect.parseTfhd\n * @return {Object[]} the parsed samples\n *\n * @see ISO-BMFF-12/2015, Section 8.8.8\n **/\n\n var parseSamples$2 = function (truns, baseMediaDecodeTime, tfhd) {\n var currentDts = baseMediaDecodeTime;\n var defaultSampleDuration = tfhd.defaultSampleDuration || 0;\n var defaultSampleSize = tfhd.defaultSampleSize || 0;\n var trackId = tfhd.trackId;\n var allSamples = [];\n truns.forEach(function (trun) {\n // Note: We currently do not parse the sample table as well\n // as the trun. It's possible some sources will require this.\n // moov > trak > mdia > minf > stbl\n var trackRun = parseTrun(trun);\n var samples = trackRun.samples;\n samples.forEach(function (sample) {\n if (sample.duration === undefined) {\n sample.duration = defaultSampleDuration;\n }\n if (sample.size === undefined) {\n sample.size = defaultSampleSize;\n }\n sample.trackId = trackId;\n sample.dts = currentDts;\n if (sample.compositionTimeOffset === undefined) {\n sample.compositionTimeOffset = 0;\n }\n if (typeof currentDts === 'bigint') {\n sample.pts = currentDts + window$1.BigInt(sample.compositionTimeOffset);\n currentDts += window$1.BigInt(sample.duration);\n } else {\n sample.pts = currentDts + sample.compositionTimeOffset;\n currentDts += sample.duration;\n }\n });\n allSamples = allSamples.concat(samples);\n });\n return allSamples;\n };\n var samples = {\n getMdatTrafPairs: getMdatTrafPairs$2,\n parseSamples: parseSamples$2\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Reads in-band CEA-708 captions out of FMP4 segments.\n * @see https://en.wikipedia.org/wiki/CEA-708\n */\n\n var discardEmulationPreventionBytes = captionPacketParser.discardEmulationPreventionBytes;\n var CaptionStream = captionStream.CaptionStream;\n var findBox$1 = findBox_1;\n var parseTfdt$1 = parseTfdt$3;\n var parseTfhd = parseTfhd$2;\n var {\n getMdatTrafPairs: getMdatTrafPairs$1,\n parseSamples: parseSamples$1\n } = samples;\n /**\n * Maps an offset in the mdat to a sample based on the the size of the samples.\n * Assumes that `parseSamples` has been called first.\n *\n * @param {Number} offset - The offset into the mdat\n * @param {Object[]} samples - An array of samples, parsed using `parseSamples`\n * @return {?Object} The matching sample, or null if no match was found.\n *\n * @see ISO-BMFF-12/2015, Section 8.8.8\n **/\n\n var mapToSample = function (offset, samples) {\n var approximateOffset = offset;\n for (var i = 0; i < samples.length; i++) {\n var sample = samples[i];\n if (approximateOffset < sample.size) {\n return sample;\n }\n approximateOffset -= sample.size;\n }\n return null;\n };\n /**\n * Finds SEI nal units contained in a Media Data Box.\n * Assumes that `parseSamples` has been called first.\n *\n * @param {Uint8Array} avcStream - The bytes of the mdat\n * @param {Object[]} samples - The samples parsed out by `parseSamples`\n * @param {Number} trackId - The trackId of this video track\n * @return {Object[]} seiNals - the parsed SEI NALUs found.\n * The contents of the seiNal should match what is expected by\n * CaptionStream.push (nalUnitType, size, data, escapedRBSP, pts, dts)\n *\n * @see ISO-BMFF-12/2015, Section 8.1.1\n * @see Rec. ITU-T H.264, 7.3.2.3.1\n **/\n\n var findSeiNals = function (avcStream, samples, trackId) {\n var avcView = new DataView(avcStream.buffer, avcStream.byteOffset, avcStream.byteLength),\n result = {\n logs: [],\n seiNals: []\n },\n seiNal,\n i,\n length,\n lastMatchedSample;\n for (i = 0; i + 4 < avcStream.length; i += length) {\n length = avcView.getUint32(i);\n i += 4; // Bail if this doesn't appear to be an H264 stream\n\n if (length <= 0) {\n continue;\n }\n switch (avcStream[i] & 0x1F) {\n case 0x06:\n var data = avcStream.subarray(i + 1, i + 1 + length);\n var matchingSample = mapToSample(i, samples);\n seiNal = {\n nalUnitType: 'sei_rbsp',\n size: length,\n data: data,\n escapedRBSP: discardEmulationPreventionBytes(data),\n trackId: trackId\n };\n if (matchingSample) {\n seiNal.pts = matchingSample.pts;\n seiNal.dts = matchingSample.dts;\n lastMatchedSample = matchingSample;\n } else if (lastMatchedSample) {\n // If a matching sample cannot be found, use the last\n // sample's values as they should be as close as possible\n seiNal.pts = lastMatchedSample.pts;\n seiNal.dts = lastMatchedSample.dts;\n } else {\n result.logs.push({\n level: 'warn',\n message: 'We\\'ve encountered a nal unit without data at ' + i + ' for trackId ' + trackId + '. See mux.js#223.'\n });\n break;\n }\n result.seiNals.push(seiNal);\n break;\n }\n }\n return result;\n };\n /**\n * Parses out caption nals from an FMP4 segment's video tracks.\n *\n * @param {Uint8Array} segment - The bytes of a single segment\n * @param {Number} videoTrackId - The trackId of a video track in the segment\n * @return {Object.} A mapping of video trackId to\n * a list of seiNals found in that track\n **/\n\n var parseCaptionNals = function (segment, videoTrackId) {\n var captionNals = {};\n var mdatTrafPairs = getMdatTrafPairs$1(segment);\n mdatTrafPairs.forEach(function (pair) {\n var mdat = pair.mdat;\n var traf = pair.traf;\n var tfhd = findBox$1(traf, ['tfhd']); // Exactly 1 tfhd per traf\n\n var headerInfo = parseTfhd(tfhd[0]);\n var trackId = headerInfo.trackId;\n var tfdt = findBox$1(traf, ['tfdt']); // Either 0 or 1 tfdt per traf\n\n var baseMediaDecodeTime = tfdt.length > 0 ? parseTfdt$1(tfdt[0]).baseMediaDecodeTime : 0;\n var truns = findBox$1(traf, ['trun']);\n var samples;\n var result; // Only parse video data for the chosen video track\n\n if (videoTrackId === trackId && truns.length > 0) {\n samples = parseSamples$1(truns, baseMediaDecodeTime, headerInfo);\n result = findSeiNals(mdat, samples, trackId);\n if (!captionNals[trackId]) {\n captionNals[trackId] = {\n seiNals: [],\n logs: []\n };\n }\n captionNals[trackId].seiNals = captionNals[trackId].seiNals.concat(result.seiNals);\n captionNals[trackId].logs = captionNals[trackId].logs.concat(result.logs);\n }\n });\n return captionNals;\n };\n /**\n * Parses out inband captions from an MP4 container and returns\n * caption objects that can be used by WebVTT and the TextTrack API.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/VTTCue\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TextTrack\n * Assumes that `probe.getVideoTrackIds` and `probe.timescale` have been called first\n *\n * @param {Uint8Array} segment - The fmp4 segment containing embedded captions\n * @param {Number} trackId - The id of the video track to parse\n * @param {Number} timescale - The timescale for the video track from the init segment\n *\n * @return {?Object[]} parsedCaptions - A list of captions or null if no video tracks\n * @return {Number} parsedCaptions[].startTime - The time to show the caption in seconds\n * @return {Number} parsedCaptions[].endTime - The time to stop showing the caption in seconds\n * @return {Object[]} parsedCaptions[].content - A list of individual caption segments\n * @return {String} parsedCaptions[].content.text - The visible content of the caption segment\n * @return {Number} parsedCaptions[].content.line - The line height from 1-15 for positioning of the caption segment\n * @return {Number} parsedCaptions[].content.position - The column indent percentage for cue positioning from 10-80\n **/\n\n var parseEmbeddedCaptions = function (segment, trackId, timescale) {\n var captionNals; // the ISO-BMFF spec says that trackId can't be zero, but there's some broken content out there\n\n if (trackId === null) {\n return null;\n }\n captionNals = parseCaptionNals(segment, trackId);\n var trackNals = captionNals[trackId] || {};\n return {\n seiNals: trackNals.seiNals,\n logs: trackNals.logs,\n timescale: timescale\n };\n };\n /**\n * Converts SEI NALUs into captions that can be used by video.js\n **/\n\n var CaptionParser = function () {\n var isInitialized = false;\n var captionStream; // Stores segments seen before trackId and timescale are set\n\n var segmentCache; // Stores video track ID of the track being parsed\n\n var trackId; // Stores the timescale of the track being parsed\n\n var timescale; // Stores captions parsed so far\n\n var parsedCaptions; // Stores whether we are receiving partial data or not\n\n var parsingPartial;\n /**\n * A method to indicate whether a CaptionParser has been initalized\n * @returns {Boolean}\n **/\n\n this.isInitialized = function () {\n return isInitialized;\n };\n /**\n * Initializes the underlying CaptionStream, SEI NAL parsing\n * and management, and caption collection\n **/\n\n this.init = function (options) {\n captionStream = new CaptionStream();\n isInitialized = true;\n parsingPartial = options ? options.isPartial : false; // Collect dispatched captions\n\n captionStream.on('data', function (event) {\n // Convert to seconds in the source's timescale\n event.startTime = event.startPts / timescale;\n event.endTime = event.endPts / timescale;\n parsedCaptions.captions.push(event);\n parsedCaptions.captionStreams[event.stream] = true;\n });\n captionStream.on('log', function (log) {\n parsedCaptions.logs.push(log);\n });\n };\n /**\n * Determines if a new video track will be selected\n * or if the timescale changed\n * @return {Boolean}\n **/\n\n this.isNewInit = function (videoTrackIds, timescales) {\n if (videoTrackIds && videoTrackIds.length === 0 || timescales && typeof timescales === 'object' && Object.keys(timescales).length === 0) {\n return false;\n }\n return trackId !== videoTrackIds[0] || timescale !== timescales[trackId];\n };\n /**\n * Parses out SEI captions and interacts with underlying\n * CaptionStream to return dispatched captions\n *\n * @param {Uint8Array} segment - The fmp4 segment containing embedded captions\n * @param {Number[]} videoTrackIds - A list of video tracks found in the init segment\n * @param {Object.} timescales - The timescales found in the init segment\n * @see parseEmbeddedCaptions\n * @see m2ts/caption-stream.js\n **/\n\n this.parse = function (segment, videoTrackIds, timescales) {\n var parsedData;\n if (!this.isInitialized()) {\n return null; // This is not likely to be a video segment\n } else if (!videoTrackIds || !timescales) {\n return null;\n } else if (this.isNewInit(videoTrackIds, timescales)) {\n // Use the first video track only as there is no\n // mechanism to switch to other video tracks\n trackId = videoTrackIds[0];\n timescale = timescales[trackId]; // If an init segment has not been seen yet, hold onto segment\n // data until we have one.\n // the ISO-BMFF spec says that trackId can't be zero, but there's some broken content out there\n } else if (trackId === null || !timescale) {\n segmentCache.push(segment);\n return null;\n } // Now that a timescale and trackId is set, parse cached segments\n\n while (segmentCache.length > 0) {\n var cachedSegment = segmentCache.shift();\n this.parse(cachedSegment, videoTrackIds, timescales);\n }\n parsedData = parseEmbeddedCaptions(segment, trackId, timescale);\n if (parsedData && parsedData.logs) {\n parsedCaptions.logs = parsedCaptions.logs.concat(parsedData.logs);\n }\n if (parsedData === null || !parsedData.seiNals) {\n if (parsedCaptions.logs.length) {\n return {\n logs: parsedCaptions.logs,\n captions: [],\n captionStreams: []\n };\n }\n return null;\n }\n this.pushNals(parsedData.seiNals); // Force the parsed captions to be dispatched\n\n this.flushStream();\n return parsedCaptions;\n };\n /**\n * Pushes SEI NALUs onto CaptionStream\n * @param {Object[]} nals - A list of SEI nals parsed using `parseCaptionNals`\n * Assumes that `parseCaptionNals` has been called first\n * @see m2ts/caption-stream.js\n **/\n\n this.pushNals = function (nals) {\n if (!this.isInitialized() || !nals || nals.length === 0) {\n return null;\n }\n nals.forEach(function (nal) {\n captionStream.push(nal);\n });\n };\n /**\n * Flushes underlying CaptionStream to dispatch processed, displayable captions\n * @see m2ts/caption-stream.js\n **/\n\n this.flushStream = function () {\n if (!this.isInitialized()) {\n return null;\n }\n if (!parsingPartial) {\n captionStream.flush();\n } else {\n captionStream.partialFlush();\n }\n };\n /**\n * Reset caption buckets for new data\n **/\n\n this.clearParsedCaptions = function () {\n parsedCaptions.captions = [];\n parsedCaptions.captionStreams = {};\n parsedCaptions.logs = [];\n };\n /**\n * Resets underlying CaptionStream\n * @see m2ts/caption-stream.js\n **/\n\n this.resetCaptionStream = function () {\n if (!this.isInitialized()) {\n return null;\n }\n captionStream.reset();\n };\n /**\n * Convenience method to clear all captions flushed from the\n * CaptionStream and still being parsed\n * @see m2ts/caption-stream.js\n **/\n\n this.clearAllCaptions = function () {\n this.clearParsedCaptions();\n this.resetCaptionStream();\n };\n /**\n * Reset caption parser\n **/\n\n this.reset = function () {\n segmentCache = [];\n trackId = null;\n timescale = null;\n if (!parsedCaptions) {\n parsedCaptions = {\n captions: [],\n // CC1, CC2, CC3, CC4\n captionStreams: {},\n logs: []\n };\n } else {\n this.clearParsedCaptions();\n }\n this.resetCaptionStream();\n };\n this.reset();\n };\n var captionParser = CaptionParser;\n const {\n parseTfdt\n } = mp4Inspector;\n const findBox = findBox_1;\n const {\n getTimescaleFromMediaHeader\n } = probe$2;\n const {\n parseSamples,\n getMdatTrafPairs\n } = samples;\n /**\n * Module for parsing WebVTT text and styles from FMP4 segments.\n * Based on the ISO/IEC 14496-30.\n */\n\n const WebVttParser = function () {\n // default timescale to 90k\n let timescale = 90e3;\n /**\n * Parses the timescale from the init segment.\n * @param {Array} segment The initialization segment to parse the timescale from.\n */\n\n this.init = function (segment) {\n // We just need the timescale from the init segment.\n const mdhd = findBox(segment, ['moov', 'trak', 'mdia', 'mdhd'])[0];\n if (mdhd) {\n timescale = getTimescaleFromMediaHeader(mdhd);\n }\n };\n /**\n * Parses a WebVTT FMP4 segment.\n * @param {Array} segment The content segment to parse the WebVTT cues from.\n * @returns The WebVTT cue text, styling, and timing info as an array of cue objects.\n */\n\n this.parseSegment = function (segment) {\n const vttCues = [];\n const mdatTrafPairs = getMdatTrafPairs(segment);\n let baseMediaDecodeTime = 0;\n mdatTrafPairs.forEach(function (pair) {\n const mdatBox = pair.mdat;\n const trafBox = pair.traf; // zero or one.\n\n const tfdtBox = findBox(trafBox, ['tfdt'])[0]; // zero or one.\n\n const tfhdBox = findBox(trafBox, ['tfhd'])[0]; // zero or more.\n\n const trunBoxes = findBox(trafBox, ['trun']);\n if (tfdtBox) {\n const tfdt = parseTfdt(tfdtBox);\n baseMediaDecodeTime = tfdt.baseMediaDecodeTime;\n }\n if (trunBoxes.length && tfhdBox) {\n const samples = parseSamples(trunBoxes, baseMediaDecodeTime, tfhdBox);\n let mdatOffset = 0;\n samples.forEach(function (sample) {\n // decode utf8 payload\n const UTF_8 = 'utf-8';\n const textDecoder = new TextDecoder(UTF_8); // extract sample data from the mdat box.\n // WebVTT Sample format:\n // Exactly one VTTEmptyCueBox box\n // OR one or more VTTCueBox boxes.\n\n const sampleData = mdatBox.slice(mdatOffset, mdatOffset + sample.size); // single vtte box.\n\n const vtteBox = findBox(sampleData, ['vtte'])[0]; // empty box\n\n if (vtteBox) {\n mdatOffset += sample.size;\n return;\n } // TODO: Support 'vtta' boxes.\n // VTTAdditionalTextBoxes can be interleaved between VTTCueBoxes.\n\n const vttcBoxes = findBox(sampleData, ['vttc']);\n vttcBoxes.forEach(function (vttcBox) {\n // mandatory payload box.\n const paylBox = findBox(vttcBox, ['payl'])[0]; // optional settings box\n\n const sttgBox = findBox(vttcBox, ['sttg'])[0];\n const start = sample.pts / timescale;\n const end = (sample.pts + sample.duration) / timescale;\n let cueText, settings; // contains cue text.\n\n if (paylBox) {\n try {\n cueText = textDecoder.decode(paylBox);\n } catch (e) {\n console.error(e);\n }\n } // settings box contains styling.\n\n if (sttgBox) {\n try {\n settings = textDecoder.decode(sttgBox);\n } catch (e) {\n console.error(e);\n }\n }\n if (sample.duration && cueText) {\n vttCues.push({\n cueText,\n start,\n end,\n settings\n });\n }\n });\n mdatOffset += sample.size;\n });\n }\n });\n return vttCues;\n };\n };\n var webvttParser = WebVttParser;\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Utilities to detect basic properties and metadata about TS Segments.\n */\n\n var StreamTypes$1 = streamTypes;\n var parsePid = function (packet) {\n var pid = packet[1] & 0x1f;\n pid <<= 8;\n pid |= packet[2];\n return pid;\n };\n var parsePayloadUnitStartIndicator = function (packet) {\n return !!(packet[1] & 0x40);\n };\n var parseAdaptionField = function (packet) {\n var offset = 0; // if an adaption field is present, its length is specified by the\n // fifth byte of the TS packet header. The adaptation field is\n // used to add stuffing to PES packets that don't fill a complete\n // TS packet, and to specify some forms of timing and control data\n // that we do not currently use.\n\n if ((packet[3] & 0x30) >>> 4 > 0x01) {\n offset += packet[4] + 1;\n }\n return offset;\n };\n var parseType = function (packet, pmtPid) {\n var pid = parsePid(packet);\n if (pid === 0) {\n return 'pat';\n } else if (pid === pmtPid) {\n return 'pmt';\n } else if (pmtPid) {\n return 'pes';\n }\n return null;\n };\n var parsePat = function (packet) {\n var pusi = parsePayloadUnitStartIndicator(packet);\n var offset = 4 + parseAdaptionField(packet);\n if (pusi) {\n offset += packet[offset] + 1;\n }\n return (packet[offset + 10] & 0x1f) << 8 | packet[offset + 11];\n };\n var parsePmt = function (packet) {\n var programMapTable = {};\n var pusi = parsePayloadUnitStartIndicator(packet);\n var payloadOffset = 4 + parseAdaptionField(packet);\n if (pusi) {\n payloadOffset += packet[payloadOffset] + 1;\n } // PMTs can be sent ahead of the time when they should actually\n // take effect. We don't believe this should ever be the case\n // for HLS but we'll ignore \"forward\" PMT declarations if we see\n // them. Future PMT declarations have the current_next_indicator\n // set to zero.\n\n if (!(packet[payloadOffset + 5] & 0x01)) {\n return;\n }\n var sectionLength, tableEnd, programInfoLength; // the mapping table ends at the end of the current section\n\n sectionLength = (packet[payloadOffset + 1] & 0x0f) << 8 | packet[payloadOffset + 2];\n tableEnd = 3 + sectionLength - 4; // to determine where the table is, we have to figure out how\n // long the program info descriptors are\n\n programInfoLength = (packet[payloadOffset + 10] & 0x0f) << 8 | packet[payloadOffset + 11]; // advance the offset to the first entry in the mapping table\n\n var offset = 12 + programInfoLength;\n while (offset < tableEnd) {\n var i = payloadOffset + offset; // add an entry that maps the elementary_pid to the stream_type\n\n programMapTable[(packet[i + 1] & 0x1F) << 8 | packet[i + 2]] = packet[i]; // move to the next table entry\n // skip past the elementary stream descriptors, if present\n\n offset += ((packet[i + 3] & 0x0F) << 8 | packet[i + 4]) + 5;\n }\n return programMapTable;\n };\n var parsePesType = function (packet, programMapTable) {\n var pid = parsePid(packet);\n var type = programMapTable[pid];\n switch (type) {\n case StreamTypes$1.H264_STREAM_TYPE:\n return 'video';\n case StreamTypes$1.ADTS_STREAM_TYPE:\n return 'audio';\n case StreamTypes$1.METADATA_STREAM_TYPE:\n return 'timed-metadata';\n default:\n return null;\n }\n };\n var parsePesTime = function (packet) {\n var pusi = parsePayloadUnitStartIndicator(packet);\n if (!pusi) {\n return null;\n }\n var offset = 4 + parseAdaptionField(packet);\n if (offset >= packet.byteLength) {\n // From the H 222.0 MPEG-TS spec\n // \"For transport stream packets carrying PES packets, stuffing is needed when there\n // is insufficient PES packet data to completely fill the transport stream packet\n // payload bytes. Stuffing is accomplished by defining an adaptation field longer than\n // the sum of the lengths of the data elements in it, so that the payload bytes\n // remaining after the adaptation field exactly accommodates the available PES packet\n // data.\"\n //\n // If the offset is >= the length of the packet, then the packet contains no data\n // and instead is just adaption field stuffing bytes\n return null;\n }\n var pes = null;\n var ptsDtsFlags; // PES packets may be annotated with a PTS value, or a PTS value\n // and a DTS value. Determine what combination of values is\n // available to work with.\n\n ptsDtsFlags = packet[offset + 7]; // PTS and DTS are normally stored as a 33-bit number. Javascript\n // performs all bitwise operations on 32-bit integers but javascript\n // supports a much greater range (52-bits) of integer using standard\n // mathematical operations.\n // We construct a 31-bit value using bitwise operators over the 31\n // most significant bits and then multiply by 4 (equal to a left-shift\n // of 2) before we add the final 2 least significant bits of the\n // timestamp (equal to an OR.)\n\n if (ptsDtsFlags & 0xC0) {\n pes = {}; // the PTS and DTS are not written out directly. For information\n // on how they are encoded, see\n // http://dvd.sourceforge.net/dvdinfo/pes-hdr.html\n\n pes.pts = (packet[offset + 9] & 0x0E) << 27 | (packet[offset + 10] & 0xFF) << 20 | (packet[offset + 11] & 0xFE) << 12 | (packet[offset + 12] & 0xFF) << 5 | (packet[offset + 13] & 0xFE) >>> 3;\n pes.pts *= 4; // Left shift by 2\n\n pes.pts += (packet[offset + 13] & 0x06) >>> 1; // OR by the two LSBs\n\n pes.dts = pes.pts;\n if (ptsDtsFlags & 0x40) {\n pes.dts = (packet[offset + 14] & 0x0E) << 27 | (packet[offset + 15] & 0xFF) << 20 | (packet[offset + 16] & 0xFE) << 12 | (packet[offset + 17] & 0xFF) << 5 | (packet[offset + 18] & 0xFE) >>> 3;\n pes.dts *= 4; // Left shift by 2\n\n pes.dts += (packet[offset + 18] & 0x06) >>> 1; // OR by the two LSBs\n }\n }\n return pes;\n };\n var parseNalUnitType = function (type) {\n switch (type) {\n case 0x05:\n return 'slice_layer_without_partitioning_rbsp_idr';\n case 0x06:\n return 'sei_rbsp';\n case 0x07:\n return 'seq_parameter_set_rbsp';\n case 0x08:\n return 'pic_parameter_set_rbsp';\n case 0x09:\n return 'access_unit_delimiter_rbsp';\n default:\n return null;\n }\n };\n var videoPacketContainsKeyFrame = function (packet) {\n var offset = 4 + parseAdaptionField(packet);\n var frameBuffer = packet.subarray(offset);\n var frameI = 0;\n var frameSyncPoint = 0;\n var foundKeyFrame = false;\n var nalType; // advance the sync point to a NAL start, if necessary\n\n for (; frameSyncPoint < frameBuffer.byteLength - 3; frameSyncPoint++) {\n if (frameBuffer[frameSyncPoint + 2] === 1) {\n // the sync point is properly aligned\n frameI = frameSyncPoint + 5;\n break;\n }\n }\n while (frameI < frameBuffer.byteLength) {\n // look at the current byte to determine if we've hit the end of\n // a NAL unit boundary\n switch (frameBuffer[frameI]) {\n case 0:\n // skip past non-sync sequences\n if (frameBuffer[frameI - 1] !== 0) {\n frameI += 2;\n break;\n } else if (frameBuffer[frameI - 2] !== 0) {\n frameI++;\n break;\n }\n if (frameSyncPoint + 3 !== frameI - 2) {\n nalType = parseNalUnitType(frameBuffer[frameSyncPoint + 3] & 0x1f);\n if (nalType === 'slice_layer_without_partitioning_rbsp_idr') {\n foundKeyFrame = true;\n }\n } // drop trailing zeroes\n\n do {\n frameI++;\n } while (frameBuffer[frameI] !== 1 && frameI < frameBuffer.length);\n frameSyncPoint = frameI - 2;\n frameI += 3;\n break;\n case 1:\n // skip past non-sync sequences\n if (frameBuffer[frameI - 1] !== 0 || frameBuffer[frameI - 2] !== 0) {\n frameI += 3;\n break;\n }\n nalType = parseNalUnitType(frameBuffer[frameSyncPoint + 3] & 0x1f);\n if (nalType === 'slice_layer_without_partitioning_rbsp_idr') {\n foundKeyFrame = true;\n }\n frameSyncPoint = frameI - 2;\n frameI += 3;\n break;\n default:\n // the current byte isn't a one or zero, so it cannot be part\n // of a sync sequence\n frameI += 3;\n break;\n }\n }\n frameBuffer = frameBuffer.subarray(frameSyncPoint);\n frameI -= frameSyncPoint;\n frameSyncPoint = 0; // parse the final nal\n\n if (frameBuffer && frameBuffer.byteLength > 3) {\n nalType = parseNalUnitType(frameBuffer[frameSyncPoint + 3] & 0x1f);\n if (nalType === 'slice_layer_without_partitioning_rbsp_idr') {\n foundKeyFrame = true;\n }\n }\n return foundKeyFrame;\n };\n var probe$1 = {\n parseType: parseType,\n parsePat: parsePat,\n parsePmt: parsePmt,\n parsePayloadUnitStartIndicator: parsePayloadUnitStartIndicator,\n parsePesType: parsePesType,\n parsePesTime: parsePesTime,\n videoPacketContainsKeyFrame: videoPacketContainsKeyFrame\n };\n /**\n * mux.js\n *\n * Copyright (c) Brightcove\n * Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE\n *\n * Parse mpeg2 transport stream packets to extract basic timing information\n */\n\n var StreamTypes = streamTypes;\n var handleRollover = timestampRolloverStream.handleRollover;\n var probe = {};\n probe.ts = probe$1;\n probe.aac = utils;\n var ONE_SECOND_IN_TS = clock$2.ONE_SECOND_IN_TS;\n var MP2T_PACKET_LENGTH = 188,\n // bytes\n SYNC_BYTE = 0x47;\n /**\n * walks through segment data looking for pat and pmt packets to parse out\n * program map table information\n */\n\n var parsePsi_ = function (bytes, pmt) {\n var startIndex = 0,\n endIndex = MP2T_PACKET_LENGTH,\n packet,\n type;\n while (endIndex < bytes.byteLength) {\n // Look for a pair of start and end sync bytes in the data..\n if (bytes[startIndex] === SYNC_BYTE && bytes[endIndex] === SYNC_BYTE) {\n // We found a packet\n packet = bytes.subarray(startIndex, endIndex);\n type = probe.ts.parseType(packet, pmt.pid);\n switch (type) {\n case 'pat':\n pmt.pid = probe.ts.parsePat(packet);\n break;\n case 'pmt':\n var table = probe.ts.parsePmt(packet);\n pmt.table = pmt.table || {};\n Object.keys(table).forEach(function (key) {\n pmt.table[key] = table[key];\n });\n break;\n }\n startIndex += MP2T_PACKET_LENGTH;\n endIndex += MP2T_PACKET_LENGTH;\n continue;\n } // If we get here, we have somehow become de-synchronized and we need to step\n // forward one byte at a time until we find a pair of sync bytes that denote\n // a packet\n\n startIndex++;\n endIndex++;\n }\n };\n /**\n * walks through the segment data from the start and end to get timing information\n * for the first and last audio pes packets\n */\n\n var parseAudioPes_ = function (bytes, pmt, result) {\n var startIndex = 0,\n endIndex = MP2T_PACKET_LENGTH,\n packet,\n type,\n pesType,\n pusi,\n parsed;\n var endLoop = false; // Start walking from start of segment to get first audio packet\n\n while (endIndex <= bytes.byteLength) {\n // Look for a pair of start and end sync bytes in the data..\n if (bytes[startIndex] === SYNC_BYTE && (bytes[endIndex] === SYNC_BYTE || endIndex === bytes.byteLength)) {\n // We found a packet\n packet = bytes.subarray(startIndex, endIndex);\n type = probe.ts.parseType(packet, pmt.pid);\n switch (type) {\n case 'pes':\n pesType = probe.ts.parsePesType(packet, pmt.table);\n pusi = probe.ts.parsePayloadUnitStartIndicator(packet);\n if (pesType === 'audio' && pusi) {\n parsed = probe.ts.parsePesTime(packet);\n if (parsed) {\n parsed.type = 'audio';\n result.audio.push(parsed);\n endLoop = true;\n }\n }\n break;\n }\n if (endLoop) {\n break;\n }\n startIndex += MP2T_PACKET_LENGTH;\n endIndex += MP2T_PACKET_LENGTH;\n continue;\n } // If we get here, we have somehow become de-synchronized and we need to step\n // forward one byte at a time until we find a pair of sync bytes that denote\n // a packet\n\n startIndex++;\n endIndex++;\n } // Start walking from end of segment to get last audio packet\n\n endIndex = bytes.byteLength;\n startIndex = endIndex - MP2T_PACKET_LENGTH;\n endLoop = false;\n while (startIndex >= 0) {\n // Look for a pair of start and end sync bytes in the data..\n if (bytes[startIndex] === SYNC_BYTE && (bytes[endIndex] === SYNC_BYTE || endIndex === bytes.byteLength)) {\n // We found a packet\n packet = bytes.subarray(startIndex, endIndex);\n type = probe.ts.parseType(packet, pmt.pid);\n switch (type) {\n case 'pes':\n pesType = probe.ts.parsePesType(packet, pmt.table);\n pusi = probe.ts.parsePayloadUnitStartIndicator(packet);\n if (pesType === 'audio' && pusi) {\n parsed = probe.ts.parsePesTime(packet);\n if (parsed) {\n parsed.type = 'audio';\n result.audio.push(parsed);\n endLoop = true;\n }\n }\n break;\n }\n if (endLoop) {\n break;\n }\n startIndex -= MP2T_PACKET_LENGTH;\n endIndex -= MP2T_PACKET_LENGTH;\n continue;\n } // If we get here, we have somehow become de-synchronized and we need to step\n // forward one byte at a time until we find a pair of sync bytes that denote\n // a packet\n\n startIndex--;\n endIndex--;\n }\n };\n /**\n * walks through the segment data from the start and end to get timing information\n * for the first and last video pes packets as well as timing information for the first\n * key frame.\n */\n\n var parseVideoPes_ = function (bytes, pmt, result) {\n var startIndex = 0,\n endIndex = MP2T_PACKET_LENGTH,\n packet,\n type,\n pesType,\n pusi,\n parsed,\n frame,\n i,\n pes;\n var endLoop = false;\n var currentFrame = {\n data: [],\n size: 0\n }; // Start walking from start of segment to get first video packet\n\n while (endIndex < bytes.byteLength) {\n // Look for a pair of start and end sync bytes in the data..\n if (bytes[startIndex] === SYNC_BYTE && bytes[endIndex] === SYNC_BYTE) {\n // We found a packet\n packet = bytes.subarray(startIndex, endIndex);\n type = probe.ts.parseType(packet, pmt.pid);\n switch (type) {\n case 'pes':\n pesType = probe.ts.parsePesType(packet, pmt.table);\n pusi = probe.ts.parsePayloadUnitStartIndicator(packet);\n if (pesType === 'video') {\n if (pusi && !endLoop) {\n parsed = probe.ts.parsePesTime(packet);\n if (parsed) {\n parsed.type = 'video';\n result.video.push(parsed);\n endLoop = true;\n }\n }\n if (!result.firstKeyFrame) {\n if (pusi) {\n if (currentFrame.size !== 0) {\n frame = new Uint8Array(currentFrame.size);\n i = 0;\n while (currentFrame.data.length) {\n pes = currentFrame.data.shift();\n frame.set(pes, i);\n i += pes.byteLength;\n }\n if (probe.ts.videoPacketContainsKeyFrame(frame)) {\n var firstKeyFrame = probe.ts.parsePesTime(frame); // PTS/DTS may not be available. Simply *not* setting\n // the keyframe seems to work fine with HLS playback\n // and definitely preferable to a crash with TypeError...\n\n if (firstKeyFrame) {\n result.firstKeyFrame = firstKeyFrame;\n result.firstKeyFrame.type = 'video';\n } else {\n // eslint-disable-next-line\n console.warn('Failed to extract PTS/DTS from PES at first keyframe. ' + 'This could be an unusual TS segment, or else mux.js did not ' + 'parse your TS segment correctly. If you know your TS ' + 'segments do contain PTS/DTS on keyframes please file a bug ' + 'report! You can try ffprobe to double check for yourself.');\n }\n }\n currentFrame.size = 0;\n }\n }\n currentFrame.data.push(packet);\n currentFrame.size += packet.byteLength;\n }\n }\n break;\n }\n if (endLoop && result.firstKeyFrame) {\n break;\n }\n startIndex += MP2T_PACKET_LENGTH;\n endIndex += MP2T_PACKET_LENGTH;\n continue;\n } // If we get here, we have somehow become de-synchronized and we need to step\n // forward one byte at a time until we find a pair of sync bytes that denote\n // a packet\n\n startIndex++;\n endIndex++;\n } // Start walking from end of segment to get last video packet\n\n endIndex = bytes.byteLength;\n startIndex = endIndex - MP2T_PACKET_LENGTH;\n endLoop = false;\n while (startIndex >= 0) {\n // Look for a pair of start and end sync bytes in the data..\n if (bytes[startIndex] === SYNC_BYTE && bytes[endIndex] === SYNC_BYTE) {\n // We found a packet\n packet = bytes.subarray(startIndex, endIndex);\n type = probe.ts.parseType(packet, pmt.pid);\n switch (type) {\n case 'pes':\n pesType = probe.ts.parsePesType(packet, pmt.table);\n pusi = probe.ts.parsePayloadUnitStartIndicator(packet);\n if (pesType === 'video' && pusi) {\n parsed = probe.ts.parsePesTime(packet);\n if (parsed) {\n parsed.type = 'video';\n result.video.push(parsed);\n endLoop = true;\n }\n }\n break;\n }\n if (endLoop) {\n break;\n }\n startIndex -= MP2T_PACKET_LENGTH;\n endIndex -= MP2T_PACKET_LENGTH;\n continue;\n } // If we get here, we have somehow become de-synchronized and we need to step\n // forward one byte at a time until we find a pair of sync bytes that denote\n // a packet\n\n startIndex--;\n endIndex--;\n }\n };\n /**\n * Adjusts the timestamp information for the segment to account for\n * rollover and convert to seconds based on pes packet timescale (90khz clock)\n */\n\n var adjustTimestamp_ = function (segmentInfo, baseTimestamp) {\n if (segmentInfo.audio && segmentInfo.audio.length) {\n var audioBaseTimestamp = baseTimestamp;\n if (typeof audioBaseTimestamp === 'undefined' || isNaN(audioBaseTimestamp)) {\n audioBaseTimestamp = segmentInfo.audio[0].dts;\n }\n segmentInfo.audio.forEach(function (info) {\n info.dts = handleRollover(info.dts, audioBaseTimestamp);\n info.pts = handleRollover(info.pts, audioBaseTimestamp); // time in seconds\n\n info.dtsTime = info.dts / ONE_SECOND_IN_TS;\n info.ptsTime = info.pts / ONE_SECOND_IN_TS;\n });\n }\n if (segmentInfo.video && segmentInfo.video.length) {\n var videoBaseTimestamp = baseTimestamp;\n if (typeof videoBaseTimestamp === 'undefined' || isNaN(videoBaseTimestamp)) {\n videoBaseTimestamp = segmentInfo.video[0].dts;\n }\n segmentInfo.video.forEach(function (info) {\n info.dts = handleRollover(info.dts, videoBaseTimestamp);\n info.pts = handleRollover(info.pts, videoBaseTimestamp); // time in seconds\n\n info.dtsTime = info.dts / ONE_SECOND_IN_TS;\n info.ptsTime = info.pts / ONE_SECOND_IN_TS;\n });\n if (segmentInfo.firstKeyFrame) {\n var frame = segmentInfo.firstKeyFrame;\n frame.dts = handleRollover(frame.dts, videoBaseTimestamp);\n frame.pts = handleRollover(frame.pts, videoBaseTimestamp); // time in seconds\n\n frame.dtsTime = frame.dts / ONE_SECOND_IN_TS;\n frame.ptsTime = frame.pts / ONE_SECOND_IN_TS;\n }\n }\n };\n /**\n * inspects the aac data stream for start and end time information\n */\n\n var inspectAac_ = function (bytes) {\n var endLoop = false,\n audioCount = 0,\n sampleRate = null,\n timestamp = null,\n frameSize = 0,\n byteIndex = 0,\n packet;\n while (bytes.length - byteIndex >= 3) {\n var type = probe.aac.parseType(bytes, byteIndex);\n switch (type) {\n case 'timed-metadata':\n // Exit early because we don't have enough to parse\n // the ID3 tag header\n if (bytes.length - byteIndex < 10) {\n endLoop = true;\n break;\n }\n frameSize = probe.aac.parseId3TagSize(bytes, byteIndex); // Exit early if we don't have enough in the buffer\n // to emit a full packet\n\n if (frameSize > bytes.length) {\n endLoop = true;\n break;\n }\n if (timestamp === null) {\n packet = bytes.subarray(byteIndex, byteIndex + frameSize);\n timestamp = probe.aac.parseAacTimestamp(packet);\n }\n byteIndex += frameSize;\n break;\n case 'audio':\n // Exit early because we don't have enough to parse\n // the ADTS frame header\n if (bytes.length - byteIndex < 7) {\n endLoop = true;\n break;\n }\n frameSize = probe.aac.parseAdtsSize(bytes, byteIndex); // Exit early if we don't have enough in the buffer\n // to emit a full packet\n\n if (frameSize > bytes.length) {\n endLoop = true;\n break;\n }\n if (sampleRate === null) {\n packet = bytes.subarray(byteIndex, byteIndex + frameSize);\n sampleRate = probe.aac.parseSampleRate(packet);\n }\n audioCount++;\n byteIndex += frameSize;\n break;\n default:\n byteIndex++;\n break;\n }\n if (endLoop) {\n return null;\n }\n }\n if (sampleRate === null || timestamp === null) {\n return null;\n }\n var audioTimescale = ONE_SECOND_IN_TS / sampleRate;\n var result = {\n audio: [{\n type: 'audio',\n dts: timestamp,\n pts: timestamp\n }, {\n type: 'audio',\n dts: timestamp + audioCount * 1024 * audioTimescale,\n pts: timestamp + audioCount * 1024 * audioTimescale\n }]\n };\n return result;\n };\n /**\n * inspects the transport stream segment data for start and end time information\n * of the audio and video tracks (when present) as well as the first key frame's\n * start time.\n */\n\n var inspectTs_ = function (bytes) {\n var pmt = {\n pid: null,\n table: null\n };\n var result = {};\n parsePsi_(bytes, pmt);\n for (var pid in pmt.table) {\n if (pmt.table.hasOwnProperty(pid)) {\n var type = pmt.table[pid];\n switch (type) {\n case StreamTypes.H264_STREAM_TYPE:\n result.video = [];\n parseVideoPes_(bytes, pmt, result);\n if (result.video.length === 0) {\n delete result.video;\n }\n break;\n case StreamTypes.ADTS_STREAM_TYPE:\n result.audio = [];\n parseAudioPes_(bytes, pmt, result);\n if (result.audio.length === 0) {\n delete result.audio;\n }\n break;\n }\n }\n }\n return result;\n };\n /**\n * Inspects segment byte data and returns an object with start and end timing information\n *\n * @param {Uint8Array} bytes The segment byte data\n * @param {Number} baseTimestamp Relative reference timestamp used when adjusting frame\n * timestamps for rollover. This value must be in 90khz clock.\n * @return {Object} Object containing start and end frame timing info of segment.\n */\n\n var inspect = function (bytes, baseTimestamp) {\n var isAacData = probe.aac.isLikelyAacData(bytes);\n var result;\n if (isAacData) {\n result = inspectAac_(bytes);\n } else {\n result = inspectTs_(bytes);\n }\n if (!result || !result.audio && !result.video) {\n return null;\n }\n adjustTimestamp_(result, baseTimestamp);\n return result;\n };\n var tsInspector = {\n inspect: inspect,\n parseAudioPes_: parseAudioPes_\n };\n /* global self */\n\n /**\n * Re-emits transmuxer events by converting them into messages to the\n * world outside the worker.\n *\n * @param {Object} transmuxer the transmuxer to wire events on\n * @private\n */\n\n const wireTransmuxerEvents = function (self, transmuxer) {\n transmuxer.on('data', function (segment) {\n // transfer ownership of the underlying ArrayBuffer\n // instead of doing a copy to save memory\n // ArrayBuffers are transferable but generic TypedArrays are not\n // @link https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers#Passing_data_by_transferring_ownership_(transferable_objects)\n const initArray = segment.initSegment;\n segment.initSegment = {\n data: initArray.buffer,\n byteOffset: initArray.byteOffset,\n byteLength: initArray.byteLength\n };\n const typedArray = segment.data;\n segment.data = typedArray.buffer;\n self.postMessage({\n action: 'data',\n segment,\n byteOffset: typedArray.byteOffset,\n byteLength: typedArray.byteLength\n }, [segment.data]);\n });\n transmuxer.on('done', function (data) {\n self.postMessage({\n action: 'done'\n });\n });\n transmuxer.on('gopInfo', function (gopInfo) {\n self.postMessage({\n action: 'gopInfo',\n gopInfo\n });\n });\n transmuxer.on('videoSegmentTimingInfo', function (timingInfo) {\n const videoSegmentTimingInfo = {\n start: {\n decode: clock$2.videoTsToSeconds(timingInfo.start.dts),\n presentation: clock$2.videoTsToSeconds(timingInfo.start.pts)\n },\n end: {\n decode: clock$2.videoTsToSeconds(timingInfo.end.dts),\n presentation: clock$2.videoTsToSeconds(timingInfo.end.pts)\n },\n baseMediaDecodeTime: clock$2.videoTsToSeconds(timingInfo.baseMediaDecodeTime)\n };\n if (timingInfo.prependedContentDuration) {\n videoSegmentTimingInfo.prependedContentDuration = clock$2.videoTsToSeconds(timingInfo.prependedContentDuration);\n }\n self.postMessage({\n action: 'videoSegmentTimingInfo',\n videoSegmentTimingInfo\n });\n });\n transmuxer.on('audioSegmentTimingInfo', function (timingInfo) {\n // Note that all times for [audio/video]SegmentTimingInfo events are in video clock\n const audioSegmentTimingInfo = {\n start: {\n decode: clock$2.videoTsToSeconds(timingInfo.start.dts),\n presentation: clock$2.videoTsToSeconds(timingInfo.start.pts)\n },\n end: {\n decode: clock$2.videoTsToSeconds(timingInfo.end.dts),\n presentation: clock$2.videoTsToSeconds(timingInfo.end.pts)\n },\n baseMediaDecodeTime: clock$2.videoTsToSeconds(timingInfo.baseMediaDecodeTime)\n };\n if (timingInfo.prependedContentDuration) {\n audioSegmentTimingInfo.prependedContentDuration = clock$2.videoTsToSeconds(timingInfo.prependedContentDuration);\n }\n self.postMessage({\n action: 'audioSegmentTimingInfo',\n audioSegmentTimingInfo\n });\n });\n transmuxer.on('id3Frame', function (id3Frame) {\n self.postMessage({\n action: 'id3Frame',\n id3Frame\n });\n });\n transmuxer.on('caption', function (caption) {\n self.postMessage({\n action: 'caption',\n caption\n });\n });\n transmuxer.on('trackinfo', function (trackInfo) {\n self.postMessage({\n action: 'trackinfo',\n trackInfo\n });\n });\n transmuxer.on('audioTimingInfo', function (audioTimingInfo) {\n // convert to video TS since we prioritize video time over audio\n self.postMessage({\n action: 'audioTimingInfo',\n audioTimingInfo: {\n start: clock$2.videoTsToSeconds(audioTimingInfo.start),\n end: clock$2.videoTsToSeconds(audioTimingInfo.end)\n }\n });\n });\n transmuxer.on('videoTimingInfo', function (videoTimingInfo) {\n self.postMessage({\n action: 'videoTimingInfo',\n videoTimingInfo: {\n start: clock$2.videoTsToSeconds(videoTimingInfo.start),\n end: clock$2.videoTsToSeconds(videoTimingInfo.end)\n }\n });\n });\n transmuxer.on('log', function (log) {\n self.postMessage({\n action: 'log',\n log\n });\n });\n };\n /**\n * All incoming messages route through this hash. If no function exists\n * to handle an incoming message, then we ignore the message.\n *\n * @class MessageHandlers\n * @param {Object} options the options to initialize with\n */\n\n class MessageHandlers {\n constructor(self, options) {\n this.options = options || {};\n this.self = self;\n this.init();\n }\n /**\n * initialize our web worker and wire all the events.\n */\n\n init() {\n if (this.transmuxer) {\n this.transmuxer.dispose();\n }\n this.transmuxer = new transmuxer.Transmuxer(this.options);\n wireTransmuxerEvents(this.self, this.transmuxer);\n }\n pushMp4Captions(data) {\n if (!this.captionParser) {\n this.captionParser = new captionParser();\n this.captionParser.init();\n }\n const segment = new Uint8Array(data.data, data.byteOffset, data.byteLength);\n const parsed = this.captionParser.parse(segment, data.trackIds, data.timescales);\n this.self.postMessage({\n action: 'mp4Captions',\n captions: parsed && parsed.captions || [],\n logs: parsed && parsed.logs || [],\n data: segment.buffer\n }, [segment.buffer]);\n }\n /**\n * Initializes the WebVttParser and passes the init segment.\n *\n * @param {Uint8Array} data mp4 boxed WebVTT init segment data\n */\n\n initMp4WebVttParser(data) {\n if (!this.webVttParser) {\n this.webVttParser = new webvttParser();\n }\n const segment = new Uint8Array(data.data, data.byteOffset, data.byteLength); // Set the timescale for the parser.\n // This can be called repeatedly in order to set and re-set the timescale.\n\n this.webVttParser.init(segment);\n }\n /**\n * Parse an mp4 encapsulated WebVTT segment and return an array of cues.\n *\n * @param {Uint8Array} data a text/webvtt segment\n * @return {Object[]} an array of parsed cue objects\n */\n\n getMp4WebVttText(data) {\n if (!this.webVttParser) {\n // timescale might not be set yet if the parser is created before an init segment is passed.\n // default timescale is 90k.\n this.webVttParser = new webvttParser();\n }\n const segment = new Uint8Array(data.data, data.byteOffset, data.byteLength);\n const parsed = this.webVttParser.parseSegment(segment);\n this.self.postMessage({\n action: 'getMp4WebVttText',\n mp4VttCues: parsed || [],\n data: segment.buffer\n }, [segment.buffer]);\n }\n probeMp4StartTime({\n timescales,\n data\n }) {\n const startTime = probe$2.startTime(timescales, data);\n this.self.postMessage({\n action: 'probeMp4StartTime',\n startTime,\n data\n }, [data.buffer]);\n }\n probeMp4Tracks({\n data\n }) {\n const tracks = probe$2.tracks(data);\n this.self.postMessage({\n action: 'probeMp4Tracks',\n tracks,\n data\n }, [data.buffer]);\n }\n /**\n * Probes an mp4 segment for EMSG boxes containing ID3 data.\n * https://aomediacodec.github.io/id3-emsg/\n *\n * @param {Uint8Array} data segment data\n * @param {number} offset segment start time\n * @return {Object[]} an array of ID3 frames\n */\n\n probeEmsgID3({\n data,\n offset\n }) {\n const id3Frames = probe$2.getEmsgID3(data, offset);\n this.self.postMessage({\n action: 'probeEmsgID3',\n id3Frames,\n emsgData: data\n }, [data.buffer]);\n }\n /**\n * Probe an mpeg2-ts segment to determine the start time of the segment in it's\n * internal \"media time,\" as well as whether it contains video and/or audio.\n *\n * @private\n * @param {Uint8Array} bytes - segment bytes\n * @param {number} baseStartTime\n * Relative reference timestamp used when adjusting frame timestamps for rollover.\n * This value should be in seconds, as it's converted to a 90khz clock within the\n * function body.\n * @return {Object} The start time of the current segment in \"media time\" as well as\n * whether it contains video and/or audio\n */\n\n probeTs({\n data,\n baseStartTime\n }) {\n const tsStartTime = typeof baseStartTime === 'number' && !isNaN(baseStartTime) ? baseStartTime * clock$2.ONE_SECOND_IN_TS : void 0;\n const timeInfo = tsInspector.inspect(data, tsStartTime);\n let result = null;\n if (timeInfo) {\n result = {\n // each type's time info comes back as an array of 2 times, start and end\n hasVideo: timeInfo.video && timeInfo.video.length === 2 || false,\n hasAudio: timeInfo.audio && timeInfo.audio.length === 2 || false\n };\n if (result.hasVideo) {\n result.videoStart = timeInfo.video[0].ptsTime;\n }\n if (result.hasAudio) {\n result.audioStart = timeInfo.audio[0].ptsTime;\n }\n }\n this.self.postMessage({\n action: 'probeTs',\n result,\n data\n }, [data.buffer]);\n }\n clearAllMp4Captions() {\n if (this.captionParser) {\n this.captionParser.clearAllCaptions();\n }\n }\n clearParsedMp4Captions() {\n if (this.captionParser) {\n this.captionParser.clearParsedCaptions();\n }\n }\n /**\n * Adds data (a ts segment) to the start of the transmuxer pipeline for\n * processing.\n *\n * @param {ArrayBuffer} data data to push into the muxer\n */\n\n push(data) {\n // Cast array buffer to correct type for transmuxer\n const segment = new Uint8Array(data.data, data.byteOffset, data.byteLength);\n this.transmuxer.push(segment);\n }\n /**\n * Recreate the transmuxer so that the next segment added via `push`\n * start with a fresh transmuxer.\n */\n\n reset() {\n this.transmuxer.reset();\n }\n /**\n * Set the value that will be used as the `baseMediaDecodeTime` time for the\n * next segment pushed in. Subsequent segments will have their `baseMediaDecodeTime`\n * set relative to the first based on the PTS values.\n *\n * @param {Object} data used to set the timestamp offset in the muxer\n */\n\n setTimestampOffset(data) {\n const timestampOffset = data.timestampOffset || 0;\n this.transmuxer.setBaseMediaDecodeTime(Math.round(clock$2.secondsToVideoTs(timestampOffset)));\n }\n setAudioAppendStart(data) {\n this.transmuxer.setAudioAppendStart(Math.ceil(clock$2.secondsToVideoTs(data.appendStart)));\n }\n setRemux(data) {\n this.transmuxer.setRemux(data.remux);\n }\n /**\n * Forces the pipeline to finish processing the last segment and emit it's\n * results.\n *\n * @param {Object} data event data, not really used\n */\n\n flush(data) {\n this.transmuxer.flush(); // transmuxed done action is fired after both audio/video pipelines are flushed\n\n self.postMessage({\n action: 'done',\n type: 'transmuxed'\n });\n }\n endTimeline() {\n this.transmuxer.endTimeline(); // transmuxed endedtimeline action is fired after both audio/video pipelines end their\n // timelines\n\n self.postMessage({\n action: 'endedtimeline',\n type: 'transmuxed'\n });\n }\n alignGopsWith(data) {\n this.transmuxer.alignGopsWith(data.gopsToAlignWith.slice());\n }\n }\n /**\n * Our web worker interface so that things can talk to mux.js\n * that will be running in a web worker. the scope is passed to this by\n * webworkify.\n *\n * @param {Object} self the scope for the web worker\n */\n\n self.onmessage = function (event) {\n if (event.data.action === 'init' && event.data.options) {\n this.messageHandlers = new MessageHandlers(self, event.data.options);\n return;\n }\n if (!this.messageHandlers) {\n this.messageHandlers = new MessageHandlers(self);\n }\n if (event.data && event.data.action && event.data.action !== 'init') {\n if (this.messageHandlers[event.data.action]) {\n this.messageHandlers[event.data.action](event.data);\n }\n }\n };\n}));\nvar TransmuxWorker = factory(workerCode$1);\n/* rollup-plugin-worker-factory end for worker!/home/runner/work/http-streaming/http-streaming/src/transmuxer-worker.js */\n\nconst handleData_ = (event, transmuxedData, callback) => {\n const {\n type,\n initSegment,\n captions,\n captionStreams,\n metadata,\n videoFrameDtsTime,\n videoFramePtsTime\n } = event.data.segment;\n transmuxedData.buffer.push({\n captions,\n captionStreams,\n metadata\n });\n const boxes = event.data.segment.boxes || {\n data: event.data.segment.data\n };\n const result = {\n type,\n // cast ArrayBuffer to TypedArray\n data: new Uint8Array(boxes.data, boxes.data.byteOffset, boxes.data.byteLength),\n initSegment: new Uint8Array(initSegment.data, initSegment.byteOffset, initSegment.byteLength)\n };\n if (typeof videoFrameDtsTime !== 'undefined') {\n result.videoFrameDtsTime = videoFrameDtsTime;\n }\n if (typeof videoFramePtsTime !== 'undefined') {\n result.videoFramePtsTime = videoFramePtsTime;\n }\n callback(result);\n};\nconst handleDone_ = ({\n transmuxedData,\n callback\n}) => {\n // Previously we only returned data on data events,\n // not on done events. Clear out the buffer to keep that consistent.\n transmuxedData.buffer = []; // all buffers should have been flushed from the muxer, so start processing anything we\n // have received\n\n callback(transmuxedData);\n};\nconst handleGopInfo_ = (event, transmuxedData) => {\n transmuxedData.gopInfo = event.data.gopInfo;\n};\nconst processTransmux = options => {\n const {\n transmuxer,\n bytes,\n audioAppendStart,\n gopsToAlignWith,\n remux,\n onData,\n onTrackInfo,\n onAudioTimingInfo,\n onVideoTimingInfo,\n onVideoSegmentTimingInfo,\n onAudioSegmentTimingInfo,\n onId3,\n onCaptions,\n onDone,\n onEndedTimeline,\n onTransmuxerLog,\n isEndOfTimeline,\n segment,\n triggerSegmentEventFn\n } = options;\n const transmuxedData = {\n buffer: []\n };\n let waitForEndedTimelineEvent = isEndOfTimeline;\n const handleMessage = event => {\n if (transmuxer.currentTransmux !== options) {\n // disposed\n return;\n }\n if (event.data.action === 'data') {\n handleData_(event, transmuxedData, onData);\n }\n if (event.data.action === 'trackinfo') {\n onTrackInfo(event.data.trackInfo);\n }\n if (event.data.action === 'gopInfo') {\n handleGopInfo_(event, transmuxedData);\n }\n if (event.data.action === 'audioTimingInfo') {\n onAudioTimingInfo(event.data.audioTimingInfo);\n }\n if (event.data.action === 'videoTimingInfo') {\n onVideoTimingInfo(event.data.videoTimingInfo);\n }\n if (event.data.action === 'videoSegmentTimingInfo') {\n onVideoSegmentTimingInfo(event.data.videoSegmentTimingInfo);\n }\n if (event.data.action === 'audioSegmentTimingInfo') {\n onAudioSegmentTimingInfo(event.data.audioSegmentTimingInfo);\n }\n if (event.data.action === 'id3Frame') {\n onId3([event.data.id3Frame], event.data.id3Frame.dispatchType);\n }\n if (event.data.action === 'caption') {\n onCaptions(event.data.caption);\n }\n if (event.data.action === 'endedtimeline') {\n waitForEndedTimelineEvent = false;\n onEndedTimeline();\n }\n if (event.data.action === 'log') {\n onTransmuxerLog(event.data.log);\n } // wait for the transmuxed event since we may have audio and video\n\n if (event.data.type !== 'transmuxed') {\n return;\n } // If the \"endedtimeline\" event has not yet fired, and this segment represents the end\n // of a timeline, that means there may still be data events before the segment\n // processing can be considerred complete. In that case, the final event should be\n // an \"endedtimeline\" event with the type \"transmuxed.\"\n\n if (waitForEndedTimelineEvent) {\n return;\n }\n transmuxer.onmessage = null;\n handleDone_({\n transmuxedData,\n callback: onDone\n });\n /* eslint-disable no-use-before-define */\n\n dequeue(transmuxer);\n /* eslint-enable */\n };\n const handleError = () => {\n const error = {\n message: 'Received an error message from the transmuxer worker',\n metadata: {\n errorType: videojs.Error.StreamingFailedToTransmuxSegment,\n segmentInfo: segmentInfoPayload({\n segment\n })\n }\n };\n onDone(null, error);\n };\n transmuxer.onmessage = handleMessage;\n transmuxer.onerror = handleError;\n if (audioAppendStart) {\n transmuxer.postMessage({\n action: 'setAudioAppendStart',\n appendStart: audioAppendStart\n });\n } // allow empty arrays to be passed to clear out GOPs\n\n if (Array.isArray(gopsToAlignWith)) {\n transmuxer.postMessage({\n action: 'alignGopsWith',\n gopsToAlignWith\n });\n }\n if (typeof remux !== 'undefined') {\n transmuxer.postMessage({\n action: 'setRemux',\n remux\n });\n }\n if (bytes.byteLength) {\n const buffer = bytes instanceof ArrayBuffer ? bytes : bytes.buffer;\n const byteOffset = bytes instanceof ArrayBuffer ? 0 : bytes.byteOffset;\n triggerSegmentEventFn({\n type: 'segmenttransmuxingstart',\n segment\n });\n transmuxer.postMessage({\n action: 'push',\n // Send the typed-array of data as an ArrayBuffer so that\n // it can be sent as a \"Transferable\" and avoid the costly\n // memory copy\n data: buffer,\n // To recreate the original typed-array, we need information\n // about what portion of the ArrayBuffer it was a view into\n byteOffset,\n byteLength: bytes.byteLength\n }, [buffer]);\n }\n if (isEndOfTimeline) {\n transmuxer.postMessage({\n action: 'endTimeline'\n });\n } // even if we didn't push any bytes, we have to make sure we flush in case we reached\n // the end of the segment\n\n transmuxer.postMessage({\n action: 'flush'\n });\n};\nconst dequeue = transmuxer => {\n transmuxer.currentTransmux = null;\n if (transmuxer.transmuxQueue.length) {\n transmuxer.currentTransmux = transmuxer.transmuxQueue.shift();\n if (typeof transmuxer.currentTransmux === 'function') {\n transmuxer.currentTransmux();\n } else {\n processTransmux(transmuxer.currentTransmux);\n }\n }\n};\nconst processAction = (transmuxer, action) => {\n transmuxer.postMessage({\n action\n });\n dequeue(transmuxer);\n};\nconst enqueueAction = (action, transmuxer) => {\n if (!transmuxer.currentTransmux) {\n transmuxer.currentTransmux = action;\n processAction(transmuxer, action);\n return;\n }\n transmuxer.transmuxQueue.push(processAction.bind(null, transmuxer, action));\n};\nconst reset = transmuxer => {\n enqueueAction('reset', transmuxer);\n};\nconst endTimeline = transmuxer => {\n enqueueAction('endTimeline', transmuxer);\n};\nconst transmux = options => {\n if (!options.transmuxer.currentTransmux) {\n options.transmuxer.currentTransmux = options;\n processTransmux(options);\n return;\n }\n options.transmuxer.transmuxQueue.push(options);\n};\nconst createTransmuxer = options => {\n const transmuxer = new TransmuxWorker();\n transmuxer.currentTransmux = null;\n transmuxer.transmuxQueue = [];\n const term = transmuxer.terminate;\n transmuxer.terminate = () => {\n transmuxer.currentTransmux = null;\n transmuxer.transmuxQueue.length = 0;\n return term.call(transmuxer);\n };\n transmuxer.postMessage({\n action: 'init',\n options\n });\n return transmuxer;\n};\nvar segmentTransmuxer = {\n reset,\n endTimeline,\n transmux,\n createTransmuxer\n};\nconst workerCallback = function (options) {\n const transmuxer = options.transmuxer;\n const endAction = options.endAction || options.action;\n const callback = options.callback;\n const message = _extends({}, options, {\n endAction: null,\n transmuxer: null,\n callback: null\n });\n const listenForEndEvent = event => {\n if (event.data.action !== endAction) {\n return;\n }\n transmuxer.removeEventListener('message', listenForEndEvent); // transfer ownership of bytes back to us.\n\n if (event.data.data) {\n event.data.data = new Uint8Array(event.data.data, options.byteOffset || 0, options.byteLength || event.data.data.byteLength);\n if (options.data) {\n options.data = event.data.data;\n }\n }\n callback(event.data);\n };\n transmuxer.addEventListener('message', listenForEndEvent);\n if (options.data) {\n const isArrayBuffer = options.data instanceof ArrayBuffer;\n message.byteOffset = isArrayBuffer ? 0 : options.data.byteOffset;\n message.byteLength = options.data.byteLength;\n const transfers = [isArrayBuffer ? options.data : options.data.buffer];\n transmuxer.postMessage(message, transfers);\n } else {\n transmuxer.postMessage(message);\n }\n};\nconst REQUEST_ERRORS = {\n FAILURE: 2,\n TIMEOUT: -101,\n ABORTED: -102\n};\nconst WEB_VTT_CODEC = 'wvtt';\n/**\n * Abort all requests\n *\n * @param {Object} activeXhrs - an object that tracks all XHR requests\n */\n\nconst abortAll = activeXhrs => {\n activeXhrs.forEach(xhr => {\n xhr.abort();\n });\n};\n/**\n * Gather important bandwidth stats once a request has completed\n *\n * @param {Object} request - the XHR request from which to gather stats\n */\n\nconst getRequestStats = request => {\n return {\n bandwidth: request.bandwidth,\n bytesReceived: request.bytesReceived || 0,\n roundTripTime: request.roundTripTime || 0\n };\n};\n/**\n * If possible gather bandwidth stats as a request is in\n * progress\n *\n * @param {Event} progressEvent - an event object from an XHR's progress event\n */\n\nconst getProgressStats = progressEvent => {\n const request = progressEvent.target;\n const roundTripTime = Date.now() - request.requestTime;\n const stats = {\n bandwidth: Infinity,\n bytesReceived: 0,\n roundTripTime: roundTripTime || 0\n };\n stats.bytesReceived = progressEvent.loaded; // This can result in Infinity if stats.roundTripTime is 0 but that is ok\n // because we should only use bandwidth stats on progress to determine when\n // abort a request early due to insufficient bandwidth\n\n stats.bandwidth = Math.floor(stats.bytesReceived / stats.roundTripTime * 8 * 1000);\n return stats;\n};\n/**\n * Handle all error conditions in one place and return an object\n * with all the information\n *\n * @param {Error|null} error - if non-null signals an error occured with the XHR\n * @param {Object} request - the XHR request that possibly generated the error\n */\n\nconst handleErrors = (error, request) => {\n const {\n requestType\n } = request;\n const metadata = getStreamingNetworkErrorMetadata({\n requestType,\n request,\n error\n });\n if (request.timedout) {\n return {\n status: request.status,\n message: 'HLS request timed-out at URL: ' + request.uri,\n code: REQUEST_ERRORS.TIMEOUT,\n xhr: request,\n metadata\n };\n }\n if (request.aborted) {\n return {\n status: request.status,\n message: 'HLS request aborted at URL: ' + request.uri,\n code: REQUEST_ERRORS.ABORTED,\n xhr: request,\n metadata\n };\n }\n if (error) {\n return {\n status: request.status,\n message: 'HLS request errored at URL: ' + request.uri,\n code: REQUEST_ERRORS.FAILURE,\n xhr: request,\n metadata\n };\n }\n if (request.responseType === 'arraybuffer' && request.response.byteLength === 0) {\n return {\n status: request.status,\n message: 'Empty HLS response at URL: ' + request.uri,\n code: REQUEST_ERRORS.FAILURE,\n xhr: request,\n metadata\n };\n }\n return null;\n};\n/**\n * Handle responses for key data and convert the key data to the correct format\n * for the decryption step later\n *\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n * @param {Array} objects - objects to add the key bytes to.\n * @param {Function} finishProcessingFn - a callback to execute to continue processing\n * this request\n */\n\nconst handleKeyResponse = (segment, objects, finishProcessingFn, triggerSegmentEventFn) => (error, request) => {\n const response = request.response;\n const errorObj = handleErrors(error, request);\n if (errorObj) {\n return finishProcessingFn(errorObj, segment);\n }\n if (response.byteLength !== 16) {\n return finishProcessingFn({\n status: request.status,\n message: 'Invalid HLS key at URL: ' + request.uri,\n code: REQUEST_ERRORS.FAILURE,\n xhr: request\n }, segment);\n }\n const view = new DataView(response);\n const bytes = new Uint32Array([view.getUint32(0), view.getUint32(4), view.getUint32(8), view.getUint32(12)]);\n for (let i = 0; i < objects.length; i++) {\n objects[i].bytes = bytes;\n }\n const keyInfo = {\n uri: request.uri\n };\n triggerSegmentEventFn({\n type: 'segmentkeyloadcomplete',\n segment,\n keyInfo\n });\n return finishProcessingFn(null, segment);\n};\n/**\n * Processes an mp4 init segment depending on the codec through the transmuxer.\n *\n * @param {Object} segment init segment to process\n * @param {string} codec the codec of the text segments\n */\n\nconst initMp4Text = (segment, codec) => {\n if (codec === WEB_VTT_CODEC) {\n segment.transmuxer.postMessage({\n action: 'initMp4WebVttParser',\n data: segment.map.bytes\n });\n }\n};\n/**\n * Parses an mp4 text segment with the transmuxer and calls the doneFn from\n * the segment loader.\n *\n * @param {Object} segment the text segment to parse\n * @param {string} codec the codec of the text segment\n * @param {Function} doneFn the doneFn passed from the segment loader\n */\n\nconst parseMp4TextSegment = (segment, codec, doneFn) => {\n if (codec === WEB_VTT_CODEC) {\n workerCallback({\n action: 'getMp4WebVttText',\n data: segment.bytes,\n transmuxer: segment.transmuxer,\n callback: ({\n data,\n mp4VttCues\n }) => {\n segment.bytes = data;\n doneFn(null, segment, {\n mp4VttCues\n });\n }\n });\n }\n};\nconst parseInitSegment = (segment, callback) => {\n const type = detectContainerForBytes(segment.map.bytes); // TODO: We should also handle ts init segments here, but we\n // only know how to parse mp4 init segments at the moment\n\n if (type !== 'mp4') {\n const uri = segment.map.resolvedUri || segment.map.uri;\n const mediaType = type || 'unknown';\n return callback({\n internal: true,\n message: `Found unsupported ${mediaType} container for initialization segment at URL: ${uri}`,\n code: REQUEST_ERRORS.FAILURE,\n metadata: {\n mediaType\n }\n });\n }\n workerCallback({\n action: 'probeMp4Tracks',\n data: segment.map.bytes,\n transmuxer: segment.transmuxer,\n callback: ({\n tracks,\n data\n }) => {\n // transfer bytes back to us\n segment.map.bytes = data;\n tracks.forEach(function (track) {\n segment.map.tracks = segment.map.tracks || {}; // only support one track of each type for now\n\n if (segment.map.tracks[track.type]) {\n return;\n }\n segment.map.tracks[track.type] = track;\n if (typeof track.id === 'number' && track.timescale) {\n segment.map.timescales = segment.map.timescales || {};\n segment.map.timescales[track.id] = track.timescale;\n }\n if (track.type === 'text') {\n initMp4Text(segment, track.codec);\n }\n });\n return callback(null);\n }\n });\n};\n/**\n * Handle init-segment responses\n *\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n * @param {Function} finishProcessingFn - a callback to execute to continue processing\n * this request\n */\n\nconst handleInitSegmentResponse = ({\n segment,\n finishProcessingFn,\n triggerSegmentEventFn\n}) => (error, request) => {\n const errorObj = handleErrors(error, request);\n if (errorObj) {\n return finishProcessingFn(errorObj, segment);\n }\n const bytes = new Uint8Array(request.response);\n triggerSegmentEventFn({\n type: 'segmentloaded',\n segment\n }); // init segment is encypted, we will have to wait\n // until the key request is done to decrypt.\n\n if (segment.map.key) {\n segment.map.encryptedBytes = bytes;\n return finishProcessingFn(null, segment);\n }\n segment.map.bytes = bytes;\n parseInitSegment(segment, function (parseError) {\n if (parseError) {\n parseError.xhr = request;\n parseError.status = request.status;\n return finishProcessingFn(parseError, segment);\n }\n finishProcessingFn(null, segment);\n });\n};\n/**\n * Response handler for segment-requests being sure to set the correct\n * property depending on whether the segment is encryped or not\n * Also records and keeps track of stats that are used for ABR purposes\n *\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n * @param {Function} finishProcessingFn - a callback to execute to continue processing\n * this request\n */\n\nconst handleSegmentResponse = ({\n segment,\n finishProcessingFn,\n responseType,\n triggerSegmentEventFn\n}) => (error, request) => {\n const errorObj = handleErrors(error, request);\n if (errorObj) {\n return finishProcessingFn(errorObj, segment);\n }\n triggerSegmentEventFn({\n type: 'segmentloaded',\n segment\n });\n const newBytes =\n // although responseText \"should\" exist, this guard serves to prevent an error being\n // thrown for two primary cases:\n // 1. the mime type override stops working, or is not implemented for a specific\n // browser\n // 2. when using mock XHR libraries like sinon that do not allow the override behavior\n responseType === 'arraybuffer' || !request.responseText ? request.response : stringToArrayBuffer(request.responseText.substring(segment.lastReachedChar || 0));\n segment.stats = getRequestStats(request);\n if (segment.key) {\n segment.encryptedBytes = new Uint8Array(newBytes);\n } else {\n segment.bytes = new Uint8Array(newBytes);\n }\n return finishProcessingFn(null, segment);\n};\nconst transmuxAndNotify = ({\n segment,\n bytes,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n}) => {\n const fmp4Tracks = segment.map && segment.map.tracks || {};\n const isMuxed = Boolean(fmp4Tracks.audio && fmp4Tracks.video); // Keep references to each function so we can null them out after we're done with them.\n // One reason for this is that in the case of full segments, we want to trust start\n // times from the probe, rather than the transmuxer.\n\n let audioStartFn = timingInfoFn.bind(null, segment, 'audio', 'start');\n const audioEndFn = timingInfoFn.bind(null, segment, 'audio', 'end');\n let videoStartFn = timingInfoFn.bind(null, segment, 'video', 'start');\n const videoEndFn = timingInfoFn.bind(null, segment, 'video', 'end');\n const finish = () => transmux({\n bytes,\n transmuxer: segment.transmuxer,\n audioAppendStart: segment.audioAppendStart,\n gopsToAlignWith: segment.gopsToAlignWith,\n remux: isMuxed,\n onData: result => {\n result.type = result.type === 'combined' ? 'video' : result.type;\n dataFn(segment, result);\n },\n onTrackInfo: trackInfo => {\n if (trackInfoFn) {\n if (isMuxed) {\n trackInfo.isMuxed = true;\n }\n trackInfoFn(segment, trackInfo);\n }\n },\n onAudioTimingInfo: audioTimingInfo => {\n // we only want the first start value we encounter\n if (audioStartFn && typeof audioTimingInfo.start !== 'undefined') {\n audioStartFn(audioTimingInfo.start);\n audioStartFn = null;\n } // we want to continually update the end time\n\n if (audioEndFn && typeof audioTimingInfo.end !== 'undefined') {\n audioEndFn(audioTimingInfo.end);\n }\n },\n onVideoTimingInfo: videoTimingInfo => {\n // we only want the first start value we encounter\n if (videoStartFn && typeof videoTimingInfo.start !== 'undefined') {\n videoStartFn(videoTimingInfo.start);\n videoStartFn = null;\n } // we want to continually update the end time\n\n if (videoEndFn && typeof videoTimingInfo.end !== 'undefined') {\n videoEndFn(videoTimingInfo.end);\n }\n },\n onVideoSegmentTimingInfo: videoSegmentTimingInfo => {\n const timingInfo = {\n pts: {\n start: videoSegmentTimingInfo.start.presentation,\n end: videoSegmentTimingInfo.end.presentation\n },\n dts: {\n start: videoSegmentTimingInfo.start.decode,\n end: videoSegmentTimingInfo.end.decode\n }\n };\n triggerSegmentEventFn({\n type: 'segmenttransmuxingtiminginfoavailable',\n segment,\n timingInfo\n });\n videoSegmentTimingInfoFn(videoSegmentTimingInfo);\n },\n onAudioSegmentTimingInfo: audioSegmentTimingInfo => {\n const timingInfo = {\n pts: {\n start: audioSegmentTimingInfo.start.pts,\n end: audioSegmentTimingInfo.end.pts\n },\n dts: {\n start: audioSegmentTimingInfo.start.dts,\n end: audioSegmentTimingInfo.end.dts\n }\n };\n triggerSegmentEventFn({\n type: 'segmenttransmuxingtiminginfoavailable',\n segment,\n timingInfo\n });\n audioSegmentTimingInfoFn(audioSegmentTimingInfo);\n },\n onId3: (id3Frames, dispatchType) => {\n id3Fn(segment, id3Frames, dispatchType);\n },\n onCaptions: captions => {\n captionsFn(segment, [captions]);\n },\n isEndOfTimeline,\n onEndedTimeline: () => {\n endedTimelineFn();\n },\n onTransmuxerLog,\n onDone: (result, error) => {\n if (!doneFn) {\n return;\n }\n result.type = result.type === 'combined' ? 'video' : result.type;\n triggerSegmentEventFn({\n type: 'segmenttransmuxingcomplete',\n segment\n });\n doneFn(error, segment, result);\n },\n segment,\n triggerSegmentEventFn\n }); // In the transmuxer, we don't yet have the ability to extract a \"proper\" start time.\n // Meaning cached frame data may corrupt our notion of where this segment\n // really starts. To get around this, probe for the info needed.\n\n workerCallback({\n action: 'probeTs',\n transmuxer: segment.transmuxer,\n data: bytes,\n baseStartTime: segment.baseStartTime,\n callback: data => {\n segment.bytes = bytes = data.data;\n const probeResult = data.result;\n if (probeResult) {\n trackInfoFn(segment, {\n hasAudio: probeResult.hasAudio,\n hasVideo: probeResult.hasVideo,\n isMuxed\n });\n trackInfoFn = null;\n }\n finish();\n }\n });\n};\nconst handleSegmentBytes = ({\n segment,\n bytes,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n}) => {\n let bytesAsUint8Array = new Uint8Array(bytes); // TODO:\n // We should have a handler that fetches the number of bytes required\n // to check if something is fmp4. This will allow us to save bandwidth\n // because we can only exclude a playlist and abort requests\n // by codec after trackinfo triggers.\n\n if (isLikelyFmp4MediaSegment(bytesAsUint8Array)) {\n segment.isFmp4 = true;\n const {\n tracks\n } = segment.map;\n const isMp4TextSegment = tracks.text && (!tracks.audio || !tracks.video);\n if (isMp4TextSegment) {\n dataFn(segment, {\n data: bytesAsUint8Array,\n type: 'text'\n });\n parseMp4TextSegment(segment, tracks.text.codec, doneFn);\n return;\n }\n const trackInfo = {\n isFmp4: true,\n hasVideo: !!tracks.video,\n hasAudio: !!tracks.audio\n }; // if we have a audio track, with a codec that is not set to\n // encrypted audio\n\n if (tracks.audio && tracks.audio.codec && tracks.audio.codec !== 'enca') {\n trackInfo.audioCodec = tracks.audio.codec;\n } // if we have a video track, with a codec that is not set to\n // encrypted video\n\n if (tracks.video && tracks.video.codec && tracks.video.codec !== 'encv') {\n trackInfo.videoCodec = tracks.video.codec;\n }\n if (tracks.video && tracks.audio) {\n trackInfo.isMuxed = true;\n } // since we don't support appending fmp4 data on progress, we know we have the full\n // segment here\n\n trackInfoFn(segment, trackInfo); // The probe doesn't provide the segment end time, so only callback with the start\n // time. The end time can be roughly calculated by the receiver using the duration.\n //\n // Note that the start time returned by the probe reflects the baseMediaDecodeTime, as\n // that is the true start of the segment (where the playback engine should begin\n // decoding).\n\n const finishLoading = (captions, id3Frames) => {\n // if the track still has audio at this point it is only possible\n // for it to be audio only. See `tracks.video && tracks.audio` if statement\n // above.\n // we make sure to use segment.bytes here as that\n dataFn(segment, {\n data: bytesAsUint8Array,\n type: trackInfo.hasAudio && !trackInfo.isMuxed ? 'audio' : 'video'\n });\n if (id3Frames && id3Frames.length) {\n id3Fn(segment, id3Frames);\n }\n if (captions && captions.length) {\n captionsFn(segment, captions);\n }\n doneFn(null, segment, {});\n };\n workerCallback({\n action: 'probeMp4StartTime',\n timescales: segment.map.timescales,\n data: bytesAsUint8Array,\n transmuxer: segment.transmuxer,\n callback: ({\n data,\n startTime\n }) => {\n // transfer bytes back to us\n bytes = data.buffer;\n segment.bytes = bytesAsUint8Array = data;\n if (trackInfo.hasAudio && !trackInfo.isMuxed) {\n timingInfoFn(segment, 'audio', 'start', startTime);\n }\n if (trackInfo.hasVideo) {\n timingInfoFn(segment, 'video', 'start', startTime);\n }\n workerCallback({\n action: 'probeEmsgID3',\n data: bytesAsUint8Array,\n transmuxer: segment.transmuxer,\n offset: startTime,\n callback: ({\n emsgData,\n id3Frames\n }) => {\n // transfer bytes back to us\n bytes = emsgData.buffer;\n segment.bytes = bytesAsUint8Array = emsgData; // Run through the CaptionParser in case there are captions.\n // Initialize CaptionParser if it hasn't been yet\n\n if (!tracks.video || !emsgData.byteLength || !segment.transmuxer) {\n finishLoading(undefined, id3Frames);\n return;\n }\n workerCallback({\n action: 'pushMp4Captions',\n endAction: 'mp4Captions',\n transmuxer: segment.transmuxer,\n data: bytesAsUint8Array,\n timescales: segment.map.timescales,\n trackIds: [tracks.video.id],\n callback: message => {\n // transfer bytes back to us\n bytes = message.data.buffer;\n segment.bytes = bytesAsUint8Array = message.data;\n message.logs.forEach(function (log) {\n onTransmuxerLog(merge(log, {\n stream: 'mp4CaptionParser'\n }));\n });\n finishLoading(message.captions, id3Frames);\n }\n });\n }\n });\n }\n });\n return;\n } // VTT or other segments that don't need processing\n\n if (!segment.transmuxer) {\n doneFn(null, segment, {});\n return;\n }\n if (typeof segment.container === 'undefined') {\n segment.container = detectContainerForBytes(bytesAsUint8Array);\n }\n if (segment.container !== 'ts' && segment.container !== 'aac') {\n trackInfoFn(segment, {\n hasAudio: false,\n hasVideo: false\n });\n doneFn(null, segment, {});\n return;\n } // ts or aac\n\n transmuxAndNotify({\n segment,\n bytes,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n });\n};\nconst decrypt = function ({\n id,\n key,\n encryptedBytes,\n decryptionWorker,\n segment,\n doneFn\n}, callback) {\n const decryptionHandler = event => {\n if (event.data.source === id) {\n decryptionWorker.removeEventListener('message', decryptionHandler);\n const decrypted = event.data.decrypted;\n callback(new Uint8Array(decrypted.bytes, decrypted.byteOffset, decrypted.byteLength));\n }\n };\n decryptionWorker.onerror = () => {\n const message = 'An error occurred in the decryption worker';\n const segmentInfo = segmentInfoPayload({\n segment\n });\n const decryptError = {\n message,\n metadata: {\n error: new Error(message),\n errorType: videojs.Error.StreamingFailedToDecryptSegment,\n segmentInfo,\n keyInfo: {\n uri: segment.key.resolvedUri || segment.map.key.resolvedUri\n }\n }\n };\n doneFn(decryptError, segment);\n };\n decryptionWorker.addEventListener('message', decryptionHandler);\n let keyBytes;\n if (key.bytes.slice) {\n keyBytes = key.bytes.slice();\n } else {\n keyBytes = new Uint32Array(Array.prototype.slice.call(key.bytes));\n } // incrementally decrypt the bytes\n\n decryptionWorker.postMessage(createTransferableMessage({\n source: id,\n encrypted: encryptedBytes,\n key: keyBytes,\n iv: key.iv\n }), [encryptedBytes.buffer, keyBytes.buffer]);\n};\n/**\n * Decrypt the segment via the decryption web worker\n *\n * @param {WebWorker} decryptionWorker - a WebWorker interface to AES-128 decryption\n * routines\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n * @param {Function} trackInfoFn - a callback that receives track info\n * @param {Function} timingInfoFn - a callback that receives timing info\n * @param {Function} videoSegmentTimingInfoFn\n * a callback that receives video timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {Function} audioSegmentTimingInfoFn\n * a callback that receives audio timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {boolean} isEndOfTimeline\n * true if this segment represents the last segment in a timeline\n * @param {Function} endedTimelineFn\n * a callback made when a timeline is ended, will only be called if\n * isEndOfTimeline is true\n * @param {Function} dataFn - a callback that is executed when segment bytes are available\n * and ready to use\n * @param {Function} doneFn - a callback that is executed after decryption has completed\n */\n\nconst decryptSegment = ({\n decryptionWorker,\n segment,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n}) => {\n triggerSegmentEventFn({\n type: 'segmentdecryptionstart'\n });\n decrypt({\n id: segment.requestId,\n key: segment.key,\n encryptedBytes: segment.encryptedBytes,\n decryptionWorker,\n segment,\n doneFn\n }, decryptedBytes => {\n segment.bytes = decryptedBytes;\n triggerSegmentEventFn({\n type: 'segmentdecryptioncomplete',\n segment\n });\n handleSegmentBytes({\n segment,\n bytes: segment.bytes,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n });\n });\n};\n/**\n * This function waits for all XHRs to finish (with either success or failure)\n * before continueing processing via it's callback. The function gathers errors\n * from each request into a single errors array so that the error status for\n * each request can be examined later.\n *\n * @param {Object} activeXhrs - an object that tracks all XHR requests\n * @param {WebWorker} decryptionWorker - a WebWorker interface to AES-128 decryption\n * routines\n * @param {Function} trackInfoFn - a callback that receives track info\n * @param {Function} timingInfoFn - a callback that receives timing info\n * @param {Function} videoSegmentTimingInfoFn\n * a callback that receives video timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {Function} audioSegmentTimingInfoFn\n * a callback that receives audio timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {Function} id3Fn - a callback that receives ID3 metadata\n * @param {Function} captionsFn - a callback that receives captions\n * @param {boolean} isEndOfTimeline\n * true if this segment represents the last segment in a timeline\n * @param {Function} endedTimelineFn\n * a callback made when a timeline is ended, will only be called if\n * isEndOfTimeline is true\n * @param {Function} dataFn - a callback that is executed when segment bytes are available\n * and ready to use\n * @param {Function} doneFn - a callback that is executed after all resources have been\n * downloaded and any decryption completed\n */\n\nconst waitForCompletion = ({\n activeXhrs,\n decryptionWorker,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n}) => {\n let count = 0;\n let didError = false;\n return (error, segment) => {\n if (didError) {\n return;\n }\n if (error) {\n didError = true; // If there are errors, we have to abort any outstanding requests\n\n abortAll(activeXhrs); // Even though the requests above are aborted, and in theory we could wait until we\n // handle the aborted events from those requests, there are some cases where we may\n // never get an aborted event. For instance, if the network connection is lost and\n // there were two requests, the first may have triggered an error immediately, while\n // the second request remains unsent. In that case, the aborted algorithm will not\n // trigger an abort: see https://xhr.spec.whatwg.org/#the-abort()-method\n //\n // We also can't rely on the ready state of the XHR, since the request that\n // triggered the connection error may also show as a ready state of 0 (unsent).\n // Therefore, we have to finish this group of requests immediately after the first\n // seen error.\n\n return doneFn(error, segment);\n }\n count += 1;\n if (count === activeXhrs.length) {\n const segmentFinish = function () {\n if (segment.encryptedBytes) {\n return decryptSegment({\n decryptionWorker,\n segment,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n });\n } // Otherwise, everything is ready just continue\n\n handleSegmentBytes({\n segment,\n bytes: segment.bytes,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n });\n }; // Keep track of when *all* of the requests have completed\n\n segment.endOfAllRequests = Date.now();\n if (segment.map && segment.map.encryptedBytes && !segment.map.bytes) {\n triggerSegmentEventFn({\n type: 'segmentdecryptionstart',\n segment\n });\n return decrypt({\n decryptionWorker,\n // add -init to the \"id\" to differentiate between segment\n // and init segment decryption, just in case they happen\n // at the same time at some point in the future.\n id: segment.requestId + '-init',\n encryptedBytes: segment.map.encryptedBytes,\n key: segment.map.key,\n segment,\n doneFn\n }, decryptedBytes => {\n segment.map.bytes = decryptedBytes;\n triggerSegmentEventFn({\n type: 'segmentdecryptioncomplete',\n segment\n });\n parseInitSegment(segment, parseError => {\n if (parseError) {\n abortAll(activeXhrs);\n return doneFn(parseError, segment);\n }\n segmentFinish();\n });\n });\n }\n segmentFinish();\n }\n };\n};\n/**\n * Calls the abort callback if any request within the batch was aborted. Will only call\n * the callback once per batch of requests, even if multiple were aborted.\n *\n * @param {Object} loadendState - state to check to see if the abort function was called\n * @param {Function} abortFn - callback to call for abort\n */\n\nconst handleLoadEnd = ({\n loadendState,\n abortFn\n}) => event => {\n const request = event.target;\n if (request.aborted && abortFn && !loadendState.calledAbortFn) {\n abortFn();\n loadendState.calledAbortFn = true;\n }\n};\n/**\n * Simple progress event callback handler that gathers some stats before\n * executing a provided callback with the `segment` object\n *\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n * @param {Function} progressFn - a callback that is executed each time a progress event\n * is received\n * @param {Function} trackInfoFn - a callback that receives track info\n * @param {Function} timingInfoFn - a callback that receives timing info\n * @param {Function} videoSegmentTimingInfoFn\n * a callback that receives video timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {Function} audioSegmentTimingInfoFn\n * a callback that receives audio timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {boolean} isEndOfTimeline\n * true if this segment represents the last segment in a timeline\n * @param {Function} endedTimelineFn\n * a callback made when a timeline is ended, will only be called if\n * isEndOfTimeline is true\n * @param {Function} dataFn - a callback that is executed when segment bytes are available\n * and ready to use\n * @param {Event} event - the progress event object from XMLHttpRequest\n */\n\nconst handleProgress = ({\n segment,\n progressFn,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn\n}) => event => {\n const request = event.target;\n if (request.aborted) {\n return;\n }\n segment.stats = merge(segment.stats, getProgressStats(event)); // record the time that we receive the first byte of data\n\n if (!segment.stats.firstBytesReceivedAt && segment.stats.bytesReceived) {\n segment.stats.firstBytesReceivedAt = Date.now();\n }\n return progressFn(event, segment);\n};\n/**\n * Load all resources and does any processing necessary for a media-segment\n *\n * Features:\n * decrypts the media-segment if it has a key uri and an iv\n * aborts *all* requests if *any* one request fails\n *\n * The segment object, at minimum, has the following format:\n * {\n * resolvedUri: String,\n * [transmuxer]: Object,\n * [byterange]: {\n * offset: Number,\n * length: Number\n * },\n * [key]: {\n * resolvedUri: String\n * [byterange]: {\n * offset: Number,\n * length: Number\n * },\n * iv: {\n * bytes: Uint32Array\n * }\n * },\n * [map]: {\n * resolvedUri: String,\n * [byterange]: {\n * offset: Number,\n * length: Number\n * },\n * [bytes]: Uint8Array\n * }\n * }\n * ...where [name] denotes optional properties\n *\n * @param {Function} xhr - an instance of the xhr wrapper in xhr.js\n * @param {Object} xhrOptions - the base options to provide to all xhr requests\n * @param {WebWorker} decryptionWorker - a WebWorker interface to AES-128\n * decryption routines\n * @param {Object} segment - a simplified copy of the segmentInfo object\n * from SegmentLoader\n * @param {Function} abortFn - a callback called (only once) if any piece of a request was\n * aborted\n * @param {Function} progressFn - a callback that receives progress events from the main\n * segment's xhr request\n * @param {Function} trackInfoFn - a callback that receives track info\n * @param {Function} timingInfoFn - a callback that receives timing info\n * @param {Function} videoSegmentTimingInfoFn\n * a callback that receives video timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {Function} audioSegmentTimingInfoFn\n * a callback that receives audio timing info based on media times and\n * any adjustments made by the transmuxer\n * @param {Function} id3Fn - a callback that receives ID3 metadata\n * @param {Function} captionsFn - a callback that receives captions\n * @param {boolean} isEndOfTimeline\n * true if this segment represents the last segment in a timeline\n * @param {Function} endedTimelineFn\n * a callback made when a timeline is ended, will only be called if\n * isEndOfTimeline is true\n * @param {Function} dataFn - a callback that receives data from the main segment's xhr\n * request, transmuxed if needed\n * @param {Function} doneFn - a callback that is executed only once all requests have\n * succeeded or failed\n * @return {Function} a function that, when invoked, immediately aborts all\n * outstanding requests\n */\n\nconst mediaSegmentRequest = ({\n xhr,\n xhrOptions,\n decryptionWorker,\n segment,\n abortFn,\n progressFn,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n}) => {\n const activeXhrs = [];\n const finishProcessingFn = waitForCompletion({\n activeXhrs,\n decryptionWorker,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn,\n doneFn,\n onTransmuxerLog,\n triggerSegmentEventFn\n }); // optionally, request the decryption key\n\n if (segment.key && !segment.key.bytes) {\n const objects = [segment.key];\n if (segment.map && !segment.map.bytes && segment.map.key && segment.map.key.resolvedUri === segment.key.resolvedUri) {\n objects.push(segment.map.key);\n }\n const keyRequestOptions = merge(xhrOptions, {\n uri: segment.key.resolvedUri,\n responseType: 'arraybuffer',\n requestType: 'segment-key'\n });\n const keyRequestCallback = handleKeyResponse(segment, objects, finishProcessingFn, triggerSegmentEventFn);\n const keyInfo = {\n uri: segment.key.resolvedUri\n };\n triggerSegmentEventFn({\n type: 'segmentkeyloadstart',\n segment,\n keyInfo\n });\n const keyXhr = xhr(keyRequestOptions, keyRequestCallback);\n activeXhrs.push(keyXhr);\n } // optionally, request the associated media init segment\n\n if (segment.map && !segment.map.bytes) {\n const differentMapKey = segment.map.key && (!segment.key || segment.key.resolvedUri !== segment.map.key.resolvedUri);\n if (differentMapKey) {\n const mapKeyRequestOptions = merge(xhrOptions, {\n uri: segment.map.key.resolvedUri,\n responseType: 'arraybuffer',\n requestType: 'segment-key'\n });\n const mapKeyRequestCallback = handleKeyResponse(segment, [segment.map.key], finishProcessingFn, triggerSegmentEventFn);\n const keyInfo = {\n uri: segment.map.key.resolvedUri\n };\n triggerSegmentEventFn({\n type: 'segmentkeyloadstart',\n segment,\n keyInfo\n });\n const mapKeyXhr = xhr(mapKeyRequestOptions, mapKeyRequestCallback);\n activeXhrs.push(mapKeyXhr);\n }\n const initSegmentOptions = merge(xhrOptions, {\n uri: segment.map.resolvedUri,\n responseType: 'arraybuffer',\n headers: segmentXhrHeaders(segment.map),\n requestType: 'segment-media-initialization'\n });\n const initSegmentRequestCallback = handleInitSegmentResponse({\n segment,\n finishProcessingFn,\n triggerSegmentEventFn\n });\n triggerSegmentEventFn({\n type: 'segmentloadstart',\n segment\n });\n const initSegmentXhr = xhr(initSegmentOptions, initSegmentRequestCallback);\n activeXhrs.push(initSegmentXhr);\n }\n const segmentRequestOptions = merge(xhrOptions, {\n uri: segment.part && segment.part.resolvedUri || segment.resolvedUri,\n responseType: 'arraybuffer',\n headers: segmentXhrHeaders(segment),\n requestType: 'segment'\n });\n const segmentRequestCallback = handleSegmentResponse({\n segment,\n finishProcessingFn,\n responseType: segmentRequestOptions.responseType,\n triggerSegmentEventFn\n });\n triggerSegmentEventFn({\n type: 'segmentloadstart',\n segment\n });\n const segmentXhr = xhr(segmentRequestOptions, segmentRequestCallback);\n segmentXhr.addEventListener('progress', handleProgress({\n segment,\n progressFn,\n trackInfoFn,\n timingInfoFn,\n videoSegmentTimingInfoFn,\n audioSegmentTimingInfoFn,\n id3Fn,\n captionsFn,\n isEndOfTimeline,\n endedTimelineFn,\n dataFn\n }));\n activeXhrs.push(segmentXhr); // since all parts of the request must be considered, but should not make callbacks\n // multiple times, provide a shared state object\n\n const loadendState = {};\n activeXhrs.forEach(activeXhr => {\n activeXhr.addEventListener('loadend', handleLoadEnd({\n loadendState,\n abortFn\n }));\n });\n return () => abortAll(activeXhrs);\n};\n\n/**\n * @file - codecs.js - Handles tasks regarding codec strings such as translating them to\n * codec strings, or translating codec strings into objects that can be examined.\n */\nconst logFn$1 = logger('CodecUtils');\n/**\n * Returns a set of codec strings parsed from the playlist or the default\n * codec strings if no codecs were specified in the playlist\n *\n * @param {Playlist} media the current media playlist\n * @return {Object} an object with the video and audio codecs\n */\n\nconst getCodecs = function (media) {\n // if the codecs were explicitly specified, use them instead of the\n // defaults\n const mediaAttributes = media.attributes || {};\n if (mediaAttributes.CODECS) {\n return parseCodecs(mediaAttributes.CODECS);\n }\n};\nconst isMaat = (main, media) => {\n const mediaAttributes = media.attributes || {};\n return main && main.mediaGroups && main.mediaGroups.AUDIO && mediaAttributes.AUDIO && main.mediaGroups.AUDIO[mediaAttributes.AUDIO];\n};\nconst isMuxed = (main, media) => {\n if (!isMaat(main, media)) {\n return true;\n }\n const mediaAttributes = media.attributes || {};\n const audioGroup = main.mediaGroups.AUDIO[mediaAttributes.AUDIO];\n for (const groupId in audioGroup) {\n // If an audio group has a URI (the case for HLS, as HLS will use external playlists),\n // or there are listed playlists (the case for DASH, as the manifest will have already\n // provided all of the details necessary to generate the audio playlist, as opposed to\n // HLS' externally requested playlists), then the content is demuxed.\n if (!audioGroup[groupId].uri && !audioGroup[groupId].playlists) {\n return true;\n }\n }\n return false;\n};\nconst unwrapCodecList = function (codecList) {\n const codecs = {};\n codecList.forEach(({\n mediaType,\n type,\n details\n }) => {\n codecs[mediaType] = codecs[mediaType] || [];\n codecs[mediaType].push(translateLegacyCodec(`${type}${details}`));\n });\n Object.keys(codecs).forEach(function (mediaType) {\n if (codecs[mediaType].length > 1) {\n logFn$1(`multiple ${mediaType} codecs found as attributes: ${codecs[mediaType].join(', ')}. Setting playlist codecs to null so that we wait for mux.js to probe segments for real codecs.`);\n codecs[mediaType] = null;\n return;\n }\n codecs[mediaType] = codecs[mediaType][0];\n });\n return codecs;\n};\nconst codecCount = function (codecObj) {\n let count = 0;\n if (codecObj.audio) {\n count++;\n }\n if (codecObj.video) {\n count++;\n }\n return count;\n};\n/**\n * Calculates the codec strings for a working configuration of\n * SourceBuffers to play variant streams in a main playlist. If\n * there is no possible working configuration, an empty object will be\n * returned.\n *\n * @param main {Object} the m3u8 object for the main playlist\n * @param media {Object} the m3u8 object for the variant playlist\n * @return {Object} the codec strings.\n *\n * @private\n */\n\nconst codecsForPlaylist = function (main, media) {\n const mediaAttributes = media.attributes || {};\n const codecInfo = unwrapCodecList(getCodecs(media) || []); // HLS with multiple-audio tracks must always get an audio codec.\n // Put another way, there is no way to have a video-only multiple-audio HLS!\n\n if (isMaat(main, media) && !codecInfo.audio) {\n if (!isMuxed(main, media)) {\n // It is possible for codecs to be specified on the audio media group playlist but\n // not on the rendition playlist. This is mostly the case for DASH, where audio and\n // video are always separate (and separately specified).\n const defaultCodecs = unwrapCodecList(codecsFromDefault(main, mediaAttributes.AUDIO) || []);\n if (defaultCodecs.audio) {\n codecInfo.audio = defaultCodecs.audio;\n }\n }\n }\n return codecInfo;\n};\nconst logFn = logger('PlaylistSelector');\nconst representationToString = function (representation) {\n if (!representation || !representation.playlist) {\n return;\n }\n const playlist = representation.playlist;\n return JSON.stringify({\n id: playlist.id,\n bandwidth: representation.bandwidth,\n width: representation.width,\n height: representation.height,\n codecs: playlist.attributes && playlist.attributes.CODECS || ''\n });\n}; // Utilities\n\n/**\n * Returns the CSS value for the specified property on an element\n * using `getComputedStyle`. Firefox has a long-standing issue where\n * getComputedStyle() may return null when running in an iframe with\n * `display: none`.\n *\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n * @param {HTMLElement} el the htmlelement to work on\n * @param {string} the proprety to get the style for\n */\n\nconst safeGetComputedStyle = function (el, property) {\n if (!el) {\n return '';\n }\n const result = window$1.getComputedStyle(el);\n if (!result) {\n return '';\n }\n return result[property];\n};\n/**\n * Resuable stable sort function\n *\n * @param {Playlists} array\n * @param {Function} sortFn Different comparators\n * @function stableSort\n */\n\nconst stableSort = function (array, sortFn) {\n const newArray = array.slice();\n array.sort(function (left, right) {\n const cmp = sortFn(left, right);\n if (cmp === 0) {\n return newArray.indexOf(left) - newArray.indexOf(right);\n }\n return cmp;\n });\n};\n/**\n * A comparator function to sort two playlist object by bandwidth.\n *\n * @param {Object} left a media playlist object\n * @param {Object} right a media playlist object\n * @return {number} Greater than zero if the bandwidth attribute of\n * left is greater than the corresponding attribute of right. Less\n * than zero if the bandwidth of right is greater than left and\n * exactly zero if the two are equal.\n */\n\nconst comparePlaylistBandwidth = function (left, right) {\n let leftBandwidth;\n let rightBandwidth;\n if (left.attributes.BANDWIDTH) {\n leftBandwidth = left.attributes.BANDWIDTH;\n }\n leftBandwidth = leftBandwidth || window$1.Number.MAX_VALUE;\n if (right.attributes.BANDWIDTH) {\n rightBandwidth = right.attributes.BANDWIDTH;\n }\n rightBandwidth = rightBandwidth || window$1.Number.MAX_VALUE;\n return leftBandwidth - rightBandwidth;\n};\n/**\n * A comparator function to sort two playlist object by resolution (width).\n *\n * @param {Object} left a media playlist object\n * @param {Object} right a media playlist object\n * @return {number} Greater than zero if the resolution.width attribute of\n * left is greater than the corresponding attribute of right. Less\n * than zero if the resolution.width of right is greater than left and\n * exactly zero if the two are equal.\n */\n\nconst comparePlaylistResolution = function (left, right) {\n let leftWidth;\n let rightWidth;\n if (left.attributes.RESOLUTION && left.attributes.RESOLUTION.width) {\n leftWidth = left.attributes.RESOLUTION.width;\n }\n leftWidth = leftWidth || window$1.Number.MAX_VALUE;\n if (right.attributes.RESOLUTION && right.attributes.RESOLUTION.width) {\n rightWidth = right.attributes.RESOLUTION.width;\n }\n rightWidth = rightWidth || window$1.Number.MAX_VALUE; // NOTE - Fallback to bandwidth sort as appropriate in cases where multiple renditions\n // have the same media dimensions/ resolution\n\n if (leftWidth === rightWidth && left.attributes.BANDWIDTH && right.attributes.BANDWIDTH) {\n return left.attributes.BANDWIDTH - right.attributes.BANDWIDTH;\n }\n return leftWidth - rightWidth;\n};\n/**\n * Chooses the appropriate media playlist based on bandwidth and player size\n *\n * @param {Object} main\n * Object representation of the main manifest\n * @param {number} playerBandwidth\n * Current calculated bandwidth of the player\n * @param {number} playerWidth\n * Current width of the player element (should account for the device pixel ratio)\n * @param {number} playerHeight\n * Current height of the player element (should account for the device pixel ratio)\n * @param {boolean} limitRenditionByPlayerDimensions\n * True if the player width and height should be used during the selection, false otherwise\n * @param {Object} playlistController\n * the current playlistController object\n * @return {Playlist} the highest bitrate playlist less than the\n * currently detected bandwidth, accounting for some amount of\n * bandwidth variance\n */\n\nlet simpleSelector = function (main, playerBandwidth, playerWidth, playerHeight, limitRenditionByPlayerDimensions, playlistController) {\n // If we end up getting called before `main` is available, exit early\n if (!main) {\n return;\n }\n const options = {\n bandwidth: playerBandwidth,\n width: playerWidth,\n height: playerHeight,\n limitRenditionByPlayerDimensions\n };\n let playlists = main.playlists; // if playlist is audio only, select between currently active audio group playlists.\n\n if (Playlist.isAudioOnly(main)) {\n playlists = playlistController.getAudioTrackPlaylists_(); // add audioOnly to options so that we log audioOnly: true\n // at the buttom of this function for debugging.\n\n options.audioOnly = true;\n } // convert the playlists to an intermediary representation to make comparisons easier\n\n let sortedPlaylistReps = playlists.map(playlist => {\n let bandwidth;\n const width = playlist.attributes && playlist.attributes.RESOLUTION && playlist.attributes.RESOLUTION.width;\n const height = playlist.attributes && playlist.attributes.RESOLUTION && playlist.attributes.RESOLUTION.height;\n bandwidth = playlist.attributes && playlist.attributes.BANDWIDTH;\n bandwidth = bandwidth || window$1.Number.MAX_VALUE;\n return {\n bandwidth,\n width,\n height,\n playlist\n };\n });\n stableSort(sortedPlaylistReps, (left, right) => left.bandwidth - right.bandwidth); // filter out any playlists that have been excluded due to\n // incompatible configurations\n\n sortedPlaylistReps = sortedPlaylistReps.filter(rep => !Playlist.isIncompatible(rep.playlist)); // filter out any playlists that have been disabled manually through the representations\n // api or excluded temporarily due to playback errors.\n\n let enabledPlaylistReps = sortedPlaylistReps.filter(rep => Playlist.isEnabled(rep.playlist));\n if (!enabledPlaylistReps.length) {\n // if there are no enabled playlists, then they have all been excluded or disabled\n // by the user through the representations api. In this case, ignore exclusion and\n // fallback to what the user wants by using playlists the user has not disabled.\n enabledPlaylistReps = sortedPlaylistReps.filter(rep => !Playlist.isDisabled(rep.playlist));\n } // filter out any variant that has greater effective bitrate\n // than the current estimated bandwidth\n\n const bandwidthPlaylistReps = enabledPlaylistReps.filter(rep => rep.bandwidth * Config.BANDWIDTH_VARIANCE < playerBandwidth);\n let highestRemainingBandwidthRep = bandwidthPlaylistReps[bandwidthPlaylistReps.length - 1]; // get all of the renditions with the same (highest) bandwidth\n // and then taking the very first element\n\n const bandwidthBestRep = bandwidthPlaylistReps.filter(rep => rep.bandwidth === highestRemainingBandwidthRep.bandwidth)[0]; // if we're not going to limit renditions by player size, make an early decision.\n\n if (limitRenditionByPlayerDimensions === false) {\n const chosenRep = bandwidthBestRep || enabledPlaylistReps[0] || sortedPlaylistReps[0];\n if (chosenRep && chosenRep.playlist) {\n let type = 'sortedPlaylistReps';\n if (bandwidthBestRep) {\n type = 'bandwidthBestRep';\n }\n if (enabledPlaylistReps[0]) {\n type = 'enabledPlaylistReps';\n }\n logFn(`choosing ${representationToString(chosenRep)} using ${type} with options`, options);\n return chosenRep.playlist;\n }\n logFn('could not choose a playlist with options', options);\n return null;\n } // filter out playlists without resolution information\n\n const haveResolution = bandwidthPlaylistReps.filter(rep => rep.width && rep.height); // sort variants by resolution\n\n stableSort(haveResolution, (left, right) => left.width - right.width); // if we have the exact resolution as the player use it\n\n const resolutionBestRepList = haveResolution.filter(rep => rep.width === playerWidth && rep.height === playerHeight);\n highestRemainingBandwidthRep = resolutionBestRepList[resolutionBestRepList.length - 1]; // ensure that we pick the highest bandwidth variant that have exact resolution\n\n const resolutionBestRep = resolutionBestRepList.filter(rep => rep.bandwidth === highestRemainingBandwidthRep.bandwidth)[0];\n let resolutionPlusOneList;\n let resolutionPlusOneSmallest;\n let resolutionPlusOneRep; // find the smallest variant that is larger than the player\n // if there is no match of exact resolution\n\n if (!resolutionBestRep) {\n resolutionPlusOneList = haveResolution.filter(rep => rep.width > playerWidth || rep.height > playerHeight); // find all the variants have the same smallest resolution\n\n resolutionPlusOneSmallest = resolutionPlusOneList.filter(rep => rep.width === resolutionPlusOneList[0].width && rep.height === resolutionPlusOneList[0].height); // ensure that we also pick the highest bandwidth variant that\n // is just-larger-than the video player\n\n highestRemainingBandwidthRep = resolutionPlusOneSmallest[resolutionPlusOneSmallest.length - 1];\n resolutionPlusOneRep = resolutionPlusOneSmallest.filter(rep => rep.bandwidth === highestRemainingBandwidthRep.bandwidth)[0];\n }\n let leastPixelDiffRep; // If this selector proves to be better than others,\n // resolutionPlusOneRep and resolutionBestRep and all\n // the code involving them should be removed.\n\n if (playlistController.leastPixelDiffSelector) {\n // find the variant that is closest to the player's pixel size\n const leastPixelDiffList = haveResolution.map(rep => {\n rep.pixelDiff = Math.abs(rep.width - playerWidth) + Math.abs(rep.height - playerHeight);\n return rep;\n }); // get the highest bandwidth, closest resolution playlist\n\n stableSort(leastPixelDiffList, (left, right) => {\n // sort by highest bandwidth if pixelDiff is the same\n if (left.pixelDiff === right.pixelDiff) {\n return right.bandwidth - left.bandwidth;\n }\n return left.pixelDiff - right.pixelDiff;\n });\n leastPixelDiffRep = leastPixelDiffList[0];\n } // fallback chain of variants\n\n const chosenRep = leastPixelDiffRep || resolutionPlusOneRep || resolutionBestRep || bandwidthBestRep || enabledPlaylistReps[0] || sortedPlaylistReps[0];\n if (chosenRep && chosenRep.playlist) {\n let type = 'sortedPlaylistReps';\n if (leastPixelDiffRep) {\n type = 'leastPixelDiffRep';\n } else if (resolutionPlusOneRep) {\n type = 'resolutionPlusOneRep';\n } else if (resolutionBestRep) {\n type = 'resolutionBestRep';\n } else if (bandwidthBestRep) {\n type = 'bandwidthBestRep';\n } else if (enabledPlaylistReps[0]) {\n type = 'enabledPlaylistReps';\n }\n logFn(`choosing ${representationToString(chosenRep)} using ${type} with options`, options);\n return chosenRep.playlist;\n }\n logFn('could not choose a playlist with options', options);\n return null;\n};\n\n/**\n * Chooses the appropriate media playlist based on the most recent\n * bandwidth estimate and the player size.\n *\n * Expects to be called within the context of an instance of VhsHandler\n *\n * @return {Playlist} the highest bitrate playlist less than the\n * currently detected bandwidth, accounting for some amount of\n * bandwidth variance\n */\n\nconst lastBandwidthSelector = function () {\n let pixelRatio = this.useDevicePixelRatio ? window$1.devicePixelRatio || 1 : 1;\n if (!isNaN(this.customPixelRatio)) {\n pixelRatio = this.customPixelRatio;\n }\n return simpleSelector(this.playlists.main, this.systemBandwidth, parseInt(safeGetComputedStyle(this.tech_.el(), 'width'), 10) * pixelRatio, parseInt(safeGetComputedStyle(this.tech_.el(), 'height'), 10) * pixelRatio, this.limitRenditionByPlayerDimensions, this.playlistController_);\n};\n/**\n * Chooses the appropriate media playlist based on an\n * exponential-weighted moving average of the bandwidth after\n * filtering for player size.\n *\n * Expects to be called within the context of an instance of VhsHandler\n *\n * @param {number} decay - a number between 0 and 1. Higher values of\n * this parameter will cause previous bandwidth estimates to lose\n * significance more quickly.\n * @return {Function} a function which can be invoked to create a new\n * playlist selector function.\n * @see https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average\n */\n\nconst movingAverageBandwidthSelector = function (decay) {\n let average = -1;\n let lastSystemBandwidth = -1;\n if (decay < 0 || decay > 1) {\n throw new Error('Moving average bandwidth decay must be between 0 and 1.');\n }\n return function () {\n let pixelRatio = this.useDevicePixelRatio ? window$1.devicePixelRatio || 1 : 1;\n if (!isNaN(this.customPixelRatio)) {\n pixelRatio = this.customPixelRatio;\n }\n if (average < 0) {\n average = this.systemBandwidth;\n lastSystemBandwidth = this.systemBandwidth;\n } // stop the average value from decaying for every 250ms\n // when the systemBandwidth is constant\n // and\n // stop average from setting to a very low value when the\n // systemBandwidth becomes 0 in case of chunk cancellation\n\n if (this.systemBandwidth > 0 && this.systemBandwidth !== lastSystemBandwidth) {\n average = decay * this.systemBandwidth + (1 - decay) * average;\n lastSystemBandwidth = this.systemBandwidth;\n }\n return simpleSelector(this.playlists.main, average, parseInt(safeGetComputedStyle(this.tech_.el(), 'width'), 10) * pixelRatio, parseInt(safeGetComputedStyle(this.tech_.el(), 'height'), 10) * pixelRatio, this.limitRenditionByPlayerDimensions, this.playlistController_);\n };\n};\n/**\n * Chooses the appropriate media playlist based on the potential to rebuffer\n *\n * @param {Object} settings\n * Object of information required to use this selector\n * @param {Object} settings.main\n * Object representation of the main manifest\n * @param {number} settings.currentTime\n * The current time of the player\n * @param {number} settings.bandwidth\n * Current measured bandwidth\n * @param {number} settings.duration\n * Duration of the media\n * @param {number} settings.segmentDuration\n * Segment duration to be used in round trip time calculations\n * @param {number} settings.timeUntilRebuffer\n * Time left in seconds until the player has to rebuffer\n * @param {number} settings.currentTimeline\n * The current timeline segments are being loaded from\n * @param {SyncController} settings.syncController\n * SyncController for determining if we have a sync point for a given playlist\n * @return {Object|null}\n * {Object} return.playlist\n * The highest bandwidth playlist with the least amount of rebuffering\n * {Number} return.rebufferingImpact\n * The amount of time in seconds switching to this playlist will rebuffer. A\n * negative value means that switching will cause zero rebuffering.\n */\n\nconst minRebufferMaxBandwidthSelector = function (settings) {\n const {\n main,\n currentTime,\n bandwidth,\n duration,\n segmentDuration,\n timeUntilRebuffer,\n currentTimeline,\n syncController\n } = settings; // filter out any playlists that have been excluded due to\n // incompatible configurations\n\n const compatiblePlaylists = main.playlists.filter(playlist => !Playlist.isIncompatible(playlist)); // filter out any playlists that have been disabled manually through the representations\n // api or excluded temporarily due to playback errors.\n\n let enabledPlaylists = compatiblePlaylists.filter(Playlist.isEnabled);\n if (!enabledPlaylists.length) {\n // if there are no enabled playlists, then they have all been excluded or disabled\n // by the user through the representations api. In this case, ignore exclusion and\n // fallback to what the user wants by using playlists the user has not disabled.\n enabledPlaylists = compatiblePlaylists.filter(playlist => !Playlist.isDisabled(playlist));\n }\n const bandwidthPlaylists = enabledPlaylists.filter(Playlist.hasAttribute.bind(null, 'BANDWIDTH'));\n const rebufferingEstimates = bandwidthPlaylists.map(playlist => {\n const syncPoint = syncController.getSyncPoint(playlist, duration, currentTimeline, currentTime); // If there is no sync point for this playlist, switching to it will require a\n // sync request first. This will double the request time\n\n const numRequests = syncPoint ? 1 : 2;\n const requestTimeEstimate = Playlist.estimateSegmentRequestTime(segmentDuration, bandwidth, playlist);\n const rebufferingImpact = requestTimeEstimate * numRequests - timeUntilRebuffer;\n return {\n playlist,\n rebufferingImpact\n };\n });\n const noRebufferingPlaylists = rebufferingEstimates.filter(estimate => estimate.rebufferingImpact <= 0); // Sort by bandwidth DESC\n\n stableSort(noRebufferingPlaylists, (a, b) => comparePlaylistBandwidth(b.playlist, a.playlist));\n if (noRebufferingPlaylists.length) {\n return noRebufferingPlaylists[0];\n }\n stableSort(rebufferingEstimates, (a, b) => a.rebufferingImpact - b.rebufferingImpact);\n return rebufferingEstimates[0] || null;\n};\n/**\n * Chooses the appropriate media playlist, which in this case is the lowest bitrate\n * one with video. If no renditions with video exist, return the lowest audio rendition.\n *\n * Expects to be called within the context of an instance of VhsHandler\n *\n * @return {Object|null}\n * {Object} return.playlist\n * The lowest bitrate playlist that contains a video codec. If no such rendition\n * exists pick the lowest audio rendition.\n */\n\nconst lowestBitrateCompatibleVariantSelector = function () {\n // filter out any playlists that have been excluded due to\n // incompatible configurations or playback errors\n const playlists = this.playlists.main.playlists.filter(Playlist.isEnabled); // Sort ascending by bitrate\n\n stableSort(playlists, (a, b) => comparePlaylistBandwidth(a, b)); // Parse and assume that playlists with no video codec have no video\n // (this is not necessarily true, although it is generally true).\n //\n // If an entire manifest has no valid videos everything will get filtered\n // out.\n\n const playlistsWithVideo = playlists.filter(playlist => !!codecsForPlaylist(this.playlists.main, playlist).video);\n return playlistsWithVideo[0] || null;\n};\n\n/**\n * Combine all segments into a single Uint8Array\n *\n * @param {Object} segmentObj\n * @return {Uint8Array} concatenated bytes\n * @private\n */\nconst concatSegments = segmentObj => {\n let offset = 0;\n let tempBuffer;\n if (segmentObj.bytes) {\n tempBuffer = new Uint8Array(segmentObj.bytes); // combine the individual segments into one large typed-array\n\n segmentObj.segments.forEach(segment => {\n tempBuffer.set(segment, offset);\n offset += segment.byteLength;\n });\n }\n return tempBuffer;\n};\n/**\n * Example:\n * https://host.com/path1/path2/path3/segment.ts?arg1=val1\n * -->\n * path3/segment.ts\n *\n * @param resolvedUri\n * @return {string}\n */\n\nfunction compactSegmentUrlDescription(resolvedUri) {\n try {\n return new URL(resolvedUri).pathname.split('/').slice(-2).join('/');\n } catch (e) {\n return '';\n }\n}\n\n/**\n * @file text-tracks.js\n */\n/**\n * Create captions text tracks on video.js if they do not exist\n *\n * @param {Object} inbandTextTracks a reference to current inbandTextTracks\n * @param {Object} tech the video.js tech\n * @param {Object} captionStream the caption stream to create\n * @private\n */\n\nconst createCaptionsTrackIfNotExists = function (inbandTextTracks, tech, captionStream) {\n if (!inbandTextTracks[captionStream]) {\n tech.trigger({\n type: 'usage',\n name: 'vhs-608'\n });\n let instreamId = captionStream; // we need to translate SERVICEn for 708 to how mux.js currently labels them\n\n if (/^cc708_/.test(captionStream)) {\n instreamId = 'SERVICE' + captionStream.split('_')[1];\n }\n const track = tech.textTracks().getTrackById(instreamId);\n if (track) {\n // Resuse an existing track with a CC# id because this was\n // very likely created by videojs-contrib-hls from information\n // in the m3u8 for us to use\n inbandTextTracks[captionStream] = track;\n } else {\n // This section gets called when we have caption services that aren't specified in the manifest.\n // Manifest level caption services are handled in media-groups.js under CLOSED-CAPTIONS.\n const captionServices = tech.options_.vhs && tech.options_.vhs.captionServices || {};\n let label = captionStream;\n let language = captionStream;\n let def = false;\n const captionService = captionServices[instreamId];\n if (captionService) {\n label = captionService.label;\n language = captionService.language;\n def = captionService.default;\n } // Otherwise, create a track with the default `CC#` label and\n // without a language\n\n inbandTextTracks[captionStream] = tech.addRemoteTextTrack({\n kind: 'captions',\n id: instreamId,\n // TODO: investigate why this doesn't seem to turn the caption on by default\n default: def,\n label,\n language\n }, false).track;\n }\n }\n};\n/**\n * Add caption text track data to a source handler given an array of captions\n *\n * @param {Object}\n * @param {Object} inbandTextTracks the inband text tracks\n * @param {number} timestampOffset the timestamp offset of the source buffer\n * @param {Array} captionArray an array of caption data\n * @private\n */\n\nconst addCaptionData = function ({\n inbandTextTracks,\n captionArray,\n timestampOffset\n}) {\n if (!captionArray) {\n return;\n }\n const Cue = window$1.WebKitDataCue || window$1.VTTCue;\n captionArray.forEach(caption => {\n const track = caption.stream; // in CEA 608 captions, video.js/mux.js sends a content array\n // with positioning data\n\n if (caption.content) {\n caption.content.forEach(value => {\n const cue = new Cue(caption.startTime + timestampOffset, caption.endTime + timestampOffset, value.text);\n cue.line = value.line;\n cue.align = 'left';\n cue.position = value.position;\n cue.positionAlign = 'line-left';\n inbandTextTracks[track].addCue(cue);\n });\n } else {\n // otherwise, a text value with combined captions is sent\n inbandTextTracks[track].addCue(new Cue(caption.startTime + timestampOffset, caption.endTime + timestampOffset, caption.text));\n }\n });\n};\n/**\n * Define properties on a cue for backwards compatability,\n * but warn the user that the way that they are using it\n * is depricated and will be removed at a later date.\n *\n * @param {Cue} cue the cue to add the properties on\n * @private\n */\n\nconst deprecateOldCue = function (cue) {\n Object.defineProperties(cue.frame, {\n id: {\n get() {\n videojs.log.warn('cue.frame.id is deprecated. Use cue.value.key instead.');\n return cue.value.key;\n }\n },\n value: {\n get() {\n videojs.log.warn('cue.frame.value is deprecated. Use cue.value.data instead.');\n return cue.value.data;\n }\n },\n privateData: {\n get() {\n videojs.log.warn('cue.frame.privateData is deprecated. Use cue.value.data instead.');\n return cue.value.data;\n }\n }\n });\n};\n/**\n * Add metadata text track data to a source handler given an array of metadata\n *\n * @param {Object}\n * @param {Object} inbandTextTracks the inband text tracks\n * @param {Array} metadataArray an array of meta data\n * @param {number} timestampOffset the timestamp offset of the source buffer\n * @param {number} videoDuration the duration of the video\n * @private\n */\n\nconst addMetadata = ({\n inbandTextTracks,\n metadataArray,\n timestampOffset,\n videoDuration\n}) => {\n if (!metadataArray) {\n return;\n }\n const Cue = window$1.WebKitDataCue || window$1.VTTCue;\n const metadataTrack = inbandTextTracks.metadataTrack_;\n if (!metadataTrack) {\n return;\n }\n metadataArray.forEach(metadata => {\n const time = metadata.cueTime + timestampOffset; // if time isn't a finite number between 0 and Infinity, like NaN,\n // ignore this bit of metadata.\n // This likely occurs when you have an non-timed ID3 tag like TIT2,\n // which is the \"Title/Songname/Content description\" frame\n\n if (typeof time !== 'number' || window$1.isNaN(time) || time < 0 || !(time < Infinity)) {\n return;\n } // If we have no frames, we can't create a cue.\n\n if (!metadata.frames || !metadata.frames.length) {\n return;\n }\n metadata.frames.forEach(frame => {\n const cue = new Cue(time, time, frame.value || frame.url || frame.data || '');\n cue.frame = frame;\n cue.value = frame;\n deprecateOldCue(cue);\n metadataTrack.addCue(cue);\n });\n });\n if (!metadataTrack.cues || !metadataTrack.cues.length) {\n return;\n } // Updating the metadeta cues so that\n // the endTime of each cue is the startTime of the next cue\n // the endTime of last cue is the duration of the video\n\n const cues = metadataTrack.cues;\n const cuesArray = []; // Create a copy of the TextTrackCueList...\n // ...disregarding cues with a falsey value\n\n for (let i = 0; i < cues.length; i++) {\n if (cues[i]) {\n cuesArray.push(cues[i]);\n }\n } // Group cues by their startTime value\n\n const cuesGroupedByStartTime = cuesArray.reduce((obj, cue) => {\n const timeSlot = obj[cue.startTime] || [];\n timeSlot.push(cue);\n obj[cue.startTime] = timeSlot;\n return obj;\n }, {}); // Sort startTimes by ascending order\n\n const sortedStartTimes = Object.keys(cuesGroupedByStartTime).sort((a, b) => Number(a) - Number(b)); // Map each cue group's endTime to the next group's startTime\n\n sortedStartTimes.forEach((startTime, idx) => {\n const cueGroup = cuesGroupedByStartTime[startTime];\n const finiteDuration = isFinite(videoDuration) ? videoDuration : startTime;\n const nextTime = Number(sortedStartTimes[idx + 1]) || finiteDuration; // Map each cue's endTime the next group's startTime\n\n cueGroup.forEach(cue => {\n cue.endTime = nextTime;\n });\n });\n}; // object for mapping daterange attributes\n\nconst dateRangeAttr = {\n id: 'ID',\n class: 'CLASS',\n startDate: 'START-DATE',\n duration: 'DURATION',\n endDate: 'END-DATE',\n endOnNext: 'END-ON-NEXT',\n plannedDuration: 'PLANNED-DURATION',\n scte35Out: 'SCTE35-OUT',\n scte35In: 'SCTE35-IN'\n};\nconst dateRangeKeysToOmit = new Set(['id', 'class', 'startDate', 'duration', 'endDate', 'endOnNext', 'startTime', 'endTime', 'processDateRange']);\n/**\n * Add DateRange metadata text track to a source handler given an array of metadata\n *\n * @param {Object}\n * @param {Object} inbandTextTracks the inband text tracks\n * @param {Array} dateRanges parsed media playlist\n * @private\n */\n\nconst addDateRangeMetadata = ({\n inbandTextTracks,\n dateRanges\n}) => {\n const metadataTrack = inbandTextTracks.metadataTrack_;\n if (!metadataTrack) {\n return;\n }\n const Cue = window$1.WebKitDataCue || window$1.VTTCue;\n dateRanges.forEach(dateRange => {\n // we generate multiple cues for each date range with different attributes\n for (const key of Object.keys(dateRange)) {\n if (dateRangeKeysToOmit.has(key)) {\n continue;\n }\n const cue = new Cue(dateRange.startTime, dateRange.endTime, '');\n cue.id = dateRange.id;\n cue.type = 'com.apple.quicktime.HLS';\n cue.value = {\n key: dateRangeAttr[key],\n data: dateRange[key]\n };\n if (key === 'scte35Out' || key === 'scte35In') {\n cue.value.data = new Uint8Array(cue.value.data.match(/[\\da-f]{2}/gi)).buffer;\n }\n metadataTrack.addCue(cue);\n }\n dateRange.processDateRange();\n });\n};\n/**\n * Create metadata text track on video.js if it does not exist\n *\n * @param {Object} inbandTextTracks a reference to current inbandTextTracks\n * @param {string} dispatchType the inband metadata track dispatch type\n * @param {Object} tech the video.js tech\n * @private\n */\n\nconst createMetadataTrackIfNotExists = (inbandTextTracks, dispatchType, tech) => {\n if (inbandTextTracks.metadataTrack_) {\n return;\n }\n inbandTextTracks.metadataTrack_ = tech.addRemoteTextTrack({\n kind: 'metadata',\n label: 'Timed Metadata'\n }, false).track;\n if (!videojs.browser.IS_ANY_SAFARI) {\n inbandTextTracks.metadataTrack_.inBandMetadataTrackDispatchType = dispatchType;\n }\n};\n/**\n * Remove cues from a track on video.js.\n *\n * @param {Double} start start of where we should remove the cue\n * @param {Double} end end of where the we should remove the cue\n * @param {Object} track the text track to remove the cues from\n * @private\n */\n\nconst removeCuesFromTrack = function (start, end, track) {\n let i;\n let cue;\n if (!track) {\n return;\n }\n if (!track.cues) {\n return;\n }\n i = track.cues.length;\n while (i--) {\n cue = track.cues[i]; // Remove any cue within the provided start and end time\n\n if (cue.startTime >= start && cue.endTime <= end) {\n track.removeCue(cue);\n }\n }\n};\n/**\n * Remove duplicate cues from a track on video.js (a cue is considered a\n * duplicate if it has the same time interval and text as another)\n *\n * @param {Object} track the text track to remove the duplicate cues from\n * @private\n */\n\nconst removeDuplicateCuesFromTrack = function (track) {\n const cues = track.cues;\n if (!cues) {\n return;\n }\n const uniqueCues = {};\n for (let i = cues.length - 1; i >= 0; i--) {\n const cue = cues[i];\n const cueKey = `${cue.startTime}-${cue.endTime}-${cue.text}`;\n if (uniqueCues[cueKey]) {\n track.removeCue(cue);\n } else {\n uniqueCues[cueKey] = cue;\n }\n }\n};\n\n/**\n * Returns a list of gops in the buffer that have a pts value of 3 seconds or more in\n * front of current time.\n *\n * @param {Array} buffer\n * The current buffer of gop information\n * @param {number} currentTime\n * The current time\n * @param {Double} mapping\n * Offset to map display time to stream presentation time\n * @return {Array}\n * List of gops considered safe to append over\n */\n\nconst gopsSafeToAlignWith = (buffer, currentTime, mapping) => {\n if (typeof currentTime === 'undefined' || currentTime === null || !buffer.length) {\n return [];\n } // pts value for current time + 3 seconds to give a bit more wiggle room\n\n const currentTimePts = Math.ceil((currentTime - mapping + 3) * ONE_SECOND_IN_TS);\n let i;\n for (i = 0; i < buffer.length; i++) {\n if (buffer[i].pts > currentTimePts) {\n break;\n }\n }\n return buffer.slice(i);\n};\n/**\n * Appends gop information (timing and byteLength) received by the transmuxer for the\n * gops appended in the last call to appendBuffer\n *\n * @param {Array} buffer\n * The current buffer of gop information\n * @param {Array} gops\n * List of new gop information\n * @param {boolean} replace\n * If true, replace the buffer with the new gop information. If false, append the\n * new gop information to the buffer in the right location of time.\n * @return {Array}\n * Updated list of gop information\n */\n\nconst updateGopBuffer = (buffer, gops, replace) => {\n if (!gops.length) {\n return buffer;\n }\n if (replace) {\n // If we are in safe append mode, then completely overwrite the gop buffer\n // with the most recent appeneded data. This will make sure that when appending\n // future segments, we only try to align with gops that are both ahead of current\n // time and in the last segment appended.\n return gops.slice();\n }\n const start = gops[0].pts;\n let i = 0;\n for (i; i < buffer.length; i++) {\n if (buffer[i].pts >= start) {\n break;\n }\n }\n return buffer.slice(0, i).concat(gops);\n};\n/**\n * Removes gop information in buffer that overlaps with provided start and end\n *\n * @param {Array} buffer\n * The current buffer of gop information\n * @param {Double} start\n * position to start the remove at\n * @param {Double} end\n * position to end the remove at\n * @param {Double} mapping\n * Offset to map display time to stream presentation time\n */\n\nconst removeGopBuffer = (buffer, start, end, mapping) => {\n const startPts = Math.ceil((start - mapping) * ONE_SECOND_IN_TS);\n const endPts = Math.ceil((end - mapping) * ONE_SECOND_IN_TS);\n const updatedBuffer = buffer.slice();\n let i = buffer.length;\n while (i--) {\n if (buffer[i].pts <= endPts) {\n break;\n }\n }\n if (i === -1) {\n // no removal because end of remove range is before start of buffer\n return updatedBuffer;\n }\n let j = i + 1;\n while (j--) {\n if (buffer[j].pts <= startPts) {\n break;\n }\n } // clamp remove range start to 0 index\n\n j = Math.max(j, 0);\n updatedBuffer.splice(j, i - j + 1);\n return updatedBuffer;\n};\nconst shallowEqual = function (a, b) {\n // if both are undefined\n // or one or the other is undefined\n // they are not equal\n if (!a && !b || !a && b || a && !b) {\n return false;\n } // they are the same object and thus, equal\n\n if (a === b) {\n return true;\n } // sort keys so we can make sure they have\n // all the same keys later.\n\n const akeys = Object.keys(a).sort();\n const bkeys = Object.keys(b).sort(); // different number of keys, not equal\n\n if (akeys.length !== bkeys.length) {\n return false;\n }\n for (let i = 0; i < akeys.length; i++) {\n const key = akeys[i]; // different sorted keys, not equal\n\n if (key !== bkeys[i]) {\n return false;\n } // different values, not equal\n\n if (a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * The segment loader has no recourse except to fetch a segment in the\n * current playlist and use the internal timestamps in that segment to\n * generate a syncPoint. This function returns a good candidate index\n * for that process.\n *\n * @param {Array} segments - the segments array from a playlist.\n * @return {number} An index of a segment from the playlist to load\n */\n\nconst getSyncSegmentCandidate = function (currentTimeline, segments, targetTime) {\n segments = segments || [];\n const timelineSegments = [];\n let time = 0;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (currentTimeline === segment.timeline) {\n timelineSegments.push(i);\n time += segment.duration;\n if (time > targetTime) {\n return i;\n }\n }\n }\n if (timelineSegments.length === 0) {\n return 0;\n } // default to the last timeline segment\n\n return timelineSegments[timelineSegments.length - 1];\n}; // In the event of a quota exceeded error, keep at least one second of back buffer. This\n// number was arbitrarily chosen and may be updated in the future, but seemed reasonable\n// as a start to prevent any potential issues with removing content too close to the\n// playhead.\n\nconst MIN_BACK_BUFFER = 1; // in ms\n\nconst CHECK_BUFFER_DELAY = 500;\nconst finite = num => typeof num === 'number' && isFinite(num); // With most content hovering around 30fps, if a segment has a duration less than a half\n// frame at 30fps or one frame at 60fps, the bandwidth and throughput calculations will\n// not accurately reflect the rest of the content.\n\nconst MIN_SEGMENT_DURATION_TO_SAVE_STATS = 1 / 60;\nconst illegalMediaSwitch = (loaderType, startingMedia, trackInfo) => {\n // Although these checks should most likely cover non 'main' types, for now it narrows\n // the scope of our checks.\n if (loaderType !== 'main' || !startingMedia || !trackInfo) {\n return null;\n }\n if (!trackInfo.hasAudio && !trackInfo.hasVideo) {\n return 'Neither audio nor video found in segment.';\n }\n if (startingMedia.hasVideo && !trackInfo.hasVideo) {\n return 'Only audio found in segment when we expected video.' + ' We can\\'t switch to audio only from a stream that had video.' + ' To get rid of this message, please add codec information to the manifest.';\n }\n if (!startingMedia.hasVideo && trackInfo.hasVideo) {\n return 'Video found in segment when we expected only audio.' + ' We can\\'t switch to a stream with video from an audio only stream.' + ' To get rid of this message, please add codec information to the manifest.';\n }\n return null;\n};\n/**\n * Calculates a time value that is safe to remove from the back buffer without interrupting\n * playback.\n *\n * @param {TimeRange} seekable\n * The current seekable range\n * @param {number} currentTime\n * The current time of the player\n * @param {number} targetDuration\n * The target duration of the current playlist\n * @return {number}\n * Time that is safe to remove from the back buffer without interrupting playback\n */\n\nconst safeBackBufferTrimTime = (seekable, currentTime, targetDuration) => {\n // 30 seconds before the playhead provides a safe default for trimming.\n //\n // Choosing a reasonable default is particularly important for high bitrate content and\n // VOD videos/live streams with large windows, as the buffer may end up overfilled and\n // throw an APPEND_BUFFER_ERR.\n let trimTime = currentTime - Config.BACK_BUFFER_LENGTH;\n if (seekable.length) {\n // Some live playlists may have a shorter window of content than the full allowed back\n // buffer. For these playlists, don't save content that's no longer within the window.\n trimTime = Math.max(trimTime, seekable.start(0));\n } // Don't remove within target duration of the current time to avoid the possibility of\n // removing the GOP currently being played, as removing it can cause playback stalls.\n\n const maxTrimTime = currentTime - targetDuration;\n return Math.min(maxTrimTime, trimTime);\n};\nconst segmentInfoString = segmentInfo => {\n const {\n startOfSegment,\n duration,\n segment,\n part,\n playlist: {\n mediaSequence: seq,\n id,\n segments = []\n },\n mediaIndex: index,\n partIndex,\n timeline\n } = segmentInfo;\n const segmentLen = segments.length - 1;\n let selection = 'mediaIndex/partIndex increment';\n if (segmentInfo.getMediaInfoForTime) {\n selection = `getMediaInfoForTime (${segmentInfo.getMediaInfoForTime})`;\n } else if (segmentInfo.isSyncRequest) {\n selection = 'getSyncSegmentCandidate (isSyncRequest)';\n }\n if (segmentInfo.independent) {\n selection += ` with independent ${segmentInfo.independent}`;\n }\n const hasPartIndex = typeof partIndex === 'number';\n const name = segmentInfo.segment.uri ? 'segment' : 'pre-segment';\n const zeroBasedPartCount = hasPartIndex ? getKnownPartCount({\n preloadSegment: segment\n }) - 1 : 0;\n return `${name} [${seq + index}/${seq + segmentLen}]` + (hasPartIndex ? ` part [${partIndex}/${zeroBasedPartCount}]` : '') + ` segment start/end [${segment.start} => ${segment.end}]` + (hasPartIndex ? ` part start/end [${part.start} => ${part.end}]` : '') + ` startOfSegment [${startOfSegment}]` + ` duration [${duration}]` + ` timeline [${timeline}]` + ` selected by [${selection}]` + ` playlist [${id}]`;\n};\nconst timingInfoPropertyForMedia = mediaType => `${mediaType}TimingInfo`;\n/**\n * Returns the timestamp offset to use for the segment.\n *\n * @param {number} segmentTimeline\n * The timeline of the segment\n * @param {number} currentTimeline\n * The timeline currently being followed by the loader\n * @param {number} startOfSegment\n * The estimated segment start\n * @param {TimeRange[]} buffered\n * The loader's buffer\n * @param {boolean} overrideCheck\n * If true, no checks are made to see if the timestamp offset value should be set,\n * but sets it directly to a value.\n *\n * @return {number|null}\n * Either a number representing a new timestamp offset, or null if the segment is\n * part of the same timeline\n */\n\nconst timestampOffsetForSegment = ({\n segmentTimeline,\n currentTimeline,\n startOfSegment,\n buffered,\n overrideCheck\n}) => {\n // Check to see if we are crossing a discontinuity to see if we need to set the\n // timestamp offset on the transmuxer and source buffer.\n //\n // Previously, we changed the timestampOffset if the start of this segment was less than\n // the currently set timestampOffset, but this isn't desirable as it can produce bad\n // behavior, especially around long running live streams.\n if (!overrideCheck && segmentTimeline === currentTimeline) {\n return null;\n } // When changing renditions, it's possible to request a segment on an older timeline. For\n // instance, given two renditions with the following:\n //\n // #EXTINF:10\n // segment1\n // #EXT-X-DISCONTINUITY\n // #EXTINF:10\n // segment2\n // #EXTINF:10\n // segment3\n //\n // And the current player state:\n //\n // current time: 8\n // buffer: 0 => 20\n //\n // The next segment on the current rendition would be segment3, filling the buffer from\n // 20s onwards. However, if a rendition switch happens after segment2 was requested,\n // then the next segment to be requested will be segment1 from the new rendition in\n // order to fill time 8 and onwards. Using the buffered end would result in repeated\n // content (since it would position segment1 of the new rendition starting at 20s). This\n // case can be identified when the new segment's timeline is a prior value. Instead of\n // using the buffered end, the startOfSegment can be used, which, hopefully, will be\n // more accurate to the actual start time of the segment.\n\n if (segmentTimeline < currentTimeline) {\n return startOfSegment;\n } // segmentInfo.startOfSegment used to be used as the timestamp offset, however, that\n // value uses the end of the last segment if it is available. While this value\n // should often be correct, it's better to rely on the buffered end, as the new\n // content post discontinuity should line up with the buffered end as if it were\n // time 0 for the new content.\n\n return buffered.length ? buffered.end(buffered.length - 1) : startOfSegment;\n};\n/**\n * Returns whether or not the loader should wait for a timeline change from the timeline\n * change controller before processing the segment.\n *\n * Primary timing in VHS goes by video. This is different from most media players, as\n * audio is more often used as the primary timing source. For the foreseeable future, VHS\n * will continue to use video as the primary timing source, due to the current logic and\n * expectations built around it.\n\n * Since the timing follows video, in order to maintain sync, the video loader is\n * responsible for setting both audio and video source buffer timestamp offsets.\n *\n * Setting different values for audio and video source buffers could lead to\n * desyncing. The following examples demonstrate some of the situations where this\n * distinction is important. Note that all of these cases involve demuxed content. When\n * content is muxed, the audio and video are packaged together, therefore syncing\n * separate media playlists is not an issue.\n *\n * CASE 1: Audio prepares to load a new timeline before video:\n *\n * Timeline: 0 1\n * Audio Segments: 0 1 2 3 4 5 DISCO 6 7 8 9\n * Audio Loader: ^\n * Video Segments: 0 1 2 3 4 5 DISCO 6 7 8 9\n * Video Loader ^\n *\n * In the above example, the audio loader is preparing to load the 6th segment, the first\n * after a discontinuity, while the video loader is still loading the 5th segment, before\n * the discontinuity.\n *\n * If the audio loader goes ahead and loads and appends the 6th segment before the video\n * loader crosses the discontinuity, then when appended, the 6th audio segment will use\n * the timestamp offset from timeline 0. This will likely lead to desyncing. In addition,\n * the audio loader must provide the audioAppendStart value to trim the content in the\n * transmuxer, and that value relies on the audio timestamp offset. Since the audio\n * timestamp offset is set by the video (main) loader, the audio loader shouldn't load the\n * segment until that value is provided.\n *\n * CASE 2: Video prepares to load a new timeline before audio:\n *\n * Timeline: 0 1\n * Audio Segments: 0 1 2 3 4 5 DISCO 6 7 8 9\n * Audio Loader: ^\n * Video Segments: 0 1 2 3 4 5 DISCO 6 7 8 9\n * Video Loader ^\n *\n * In the above example, the video loader is preparing to load the 6th segment, the first\n * after a discontinuity, while the audio loader is still loading the 5th segment, before\n * the discontinuity.\n *\n * If the video loader goes ahead and loads and appends the 6th segment, then once the\n * segment is loaded and processed, both the video and audio timestamp offsets will be\n * set, since video is used as the primary timing source. This is to ensure content lines\n * up appropriately, as any modifications to the video timing are reflected by audio when\n * the video loader sets the audio and video timestamp offsets to the same value. However,\n * setting the timestamp offset for audio before audio has had a chance to change\n * timelines will likely lead to desyncing, as the audio loader will append segment 5 with\n * a timestamp intended to apply to segments from timeline 1 rather than timeline 0.\n *\n * CASE 3: When seeking, audio prepares to load a new timeline before video\n *\n * Timeline: 0 1\n * Audio Segments: 0 1 2 3 4 5 DISCO 6 7 8 9\n * Audio Loader: ^\n * Video Segments: 0 1 2 3 4 5 DISCO 6 7 8 9\n * Video Loader ^\n *\n * In the above example, both audio and video loaders are loading segments from timeline\n * 0, but imagine that the seek originated from timeline 1.\n *\n * When seeking to a new timeline, the timestamp offset will be set based on the expected\n * segment start of the loaded video segment. In order to maintain sync, the audio loader\n * must wait for the video loader to load its segment and update both the audio and video\n * timestamp offsets before it may load and append its own segment. This is the case\n * whether the seek results in a mismatched segment request (e.g., the audio loader\n * chooses to load segment 3 and the video loader chooses to load segment 4) or the\n * loaders choose to load the same segment index from each playlist, as the segments may\n * not be aligned perfectly, even for matching segment indexes.\n *\n * @param {Object} timelinechangeController\n * @param {number} currentTimeline\n * The timeline currently being followed by the loader\n * @param {number} segmentTimeline\n * The timeline of the segment being loaded\n * @param {('main'|'audio')} loaderType\n * The loader type\n * @param {boolean} audioDisabled\n * Whether the audio is disabled for the loader. This should only be true when the\n * loader may have muxed audio in its segment, but should not append it, e.g., for\n * the main loader when an alternate audio playlist is active.\n *\n * @return {boolean}\n * Whether the loader should wait for a timeline change from the timeline change\n * controller before processing the segment\n */\n\nconst shouldWaitForTimelineChange = ({\n timelineChangeController,\n currentTimeline,\n segmentTimeline,\n loaderType,\n audioDisabled\n}) => {\n if (currentTimeline === segmentTimeline) {\n return false;\n }\n if (loaderType === 'audio') {\n const lastMainTimelineChange = timelineChangeController.lastTimelineChange({\n type: 'main'\n }); // Audio loader should wait if:\n //\n // * main hasn't had a timeline change yet (thus has not loaded its first segment)\n // * main hasn't yet changed to the timeline audio is looking to load\n\n return !lastMainTimelineChange || lastMainTimelineChange.to !== segmentTimeline;\n } // The main loader only needs to wait for timeline changes if there's demuxed audio.\n // Otherwise, there's nothing to wait for, since audio would be muxed into the main\n // loader's segments (or the content is audio/video only and handled by the main\n // loader).\n\n if (loaderType === 'main' && audioDisabled) {\n const pendingAudioTimelineChange = timelineChangeController.pendingTimelineChange({\n type: 'audio'\n }); // Main loader should wait for the audio loader if audio is not pending a timeline\n // change to the current timeline.\n //\n // Since the main loader is responsible for setting the timestamp offset for both\n // audio and video, the main loader must wait for audio to be about to change to its\n // timeline before setting the offset, otherwise, if audio is behind in loading,\n // segments from the previous timeline would be adjusted by the new timestamp offset.\n //\n // This requirement means that video will not cross a timeline until the audio is\n // about to cross to it, so that way audio and video will always cross the timeline\n // together.\n //\n // In addition to normal timeline changes, these rules also apply to the start of a\n // stream (going from a non-existent timeline, -1, to timeline 0). It's important\n // that these rules apply to the first timeline change because if they did not, it's\n // possible that the main loader will cross two timelines before the audio loader has\n // crossed one. Logic may be implemented to handle the startup as a special case, but\n // it's easier to simply treat all timeline changes the same.\n\n if (pendingAudioTimelineChange && pendingAudioTimelineChange.to === segmentTimeline) {\n return false;\n }\n return true;\n }\n return false;\n};\nconst shouldFixBadTimelineChanges = timelineChangeController => {\n if (!timelineChangeController) {\n return false;\n }\n const pendingAudioTimelineChange = timelineChangeController.pendingTimelineChange({\n type: 'audio'\n });\n const pendingMainTimelineChange = timelineChangeController.pendingTimelineChange({\n type: 'main'\n });\n const hasPendingTimelineChanges = pendingAudioTimelineChange && pendingMainTimelineChange;\n const differentPendingChanges = hasPendingTimelineChanges && pendingAudioTimelineChange.to !== pendingMainTimelineChange.to;\n const isNotInitialPendingTimelineChange = hasPendingTimelineChanges && pendingAudioTimelineChange.from !== -1 && pendingMainTimelineChange.from !== -1;\n if (isNotInitialPendingTimelineChange && differentPendingChanges) {\n return true;\n }\n return false;\n};\n/**\n * Check if the pending audio timeline change is behind the\n * pending main timeline change.\n *\n * @param {SegmentLoader} segmentLoader\n * @return {boolean}\n */\n\nconst isAudioTimelineBehind = segmentLoader => {\n const pendingAudioTimelineChange = segmentLoader.timelineChangeController_.pendingTimelineChange({\n type: 'audio'\n });\n const pendingMainTimelineChange = segmentLoader.timelineChangeController_.pendingTimelineChange({\n type: 'main'\n });\n const hasPendingTimelineChanges = pendingAudioTimelineChange && pendingMainTimelineChange;\n return hasPendingTimelineChanges && pendingAudioTimelineChange.to < pendingMainTimelineChange.to;\n};\n/**\n * A method to check if the player is waiting for a timeline change, and fixes\n * certain scenarios where the timelines need to be updated.\n *\n * @param {SegmentLoader} segmentLoader\n */\n\nconst checkAndFixTimelines = segmentLoader => {\n const segmentInfo = segmentLoader.pendingSegment_;\n if (!segmentInfo) {\n return;\n }\n const waitingForTimelineChange = shouldWaitForTimelineChange({\n timelineChangeController: segmentLoader.timelineChangeController_,\n currentTimeline: segmentLoader.currentTimeline_,\n segmentTimeline: segmentInfo.timeline,\n loaderType: segmentLoader.loaderType_,\n audioDisabled: segmentLoader.audioDisabled_\n });\n if (waitingForTimelineChange && shouldFixBadTimelineChanges(segmentLoader.timelineChangeController_)) {\n if (isAudioTimelineBehind(segmentLoader)) {\n segmentLoader.timelineChangeController_.trigger('audioTimelineBehind');\n return;\n }\n segmentLoader.timelineChangeController_.trigger('fixBadTimelineChange');\n }\n};\nconst mediaDuration = timingInfos => {\n let maxDuration = 0;\n ['video', 'audio'].forEach(function (type) {\n const typeTimingInfo = timingInfos[`${type}TimingInfo`];\n if (!typeTimingInfo) {\n return;\n }\n const {\n start,\n end\n } = typeTimingInfo;\n let duration;\n if (typeof start === 'bigint' || typeof end === 'bigint') {\n duration = window$1.BigInt(end) - window$1.BigInt(start);\n } else if (typeof start === 'number' && typeof end === 'number') {\n duration = end - start;\n }\n if (typeof duration !== 'undefined' && duration > maxDuration) {\n maxDuration = duration;\n }\n }); // convert back to a number if it is lower than MAX_SAFE_INTEGER\n // as we only need BigInt when we are above that.\n\n if (typeof maxDuration === 'bigint' && maxDuration < Number.MAX_SAFE_INTEGER) {\n maxDuration = Number(maxDuration);\n }\n return maxDuration;\n};\nconst segmentTooLong = ({\n segmentDuration,\n maxDuration\n}) => {\n // 0 duration segments are most likely due to metadata only segments or a lack of\n // information.\n if (!segmentDuration) {\n return false;\n } // For HLS:\n //\n // https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-4.3.3.1\n // The EXTINF duration of each Media Segment in the Playlist\n // file, when rounded to the nearest integer, MUST be less than or equal\n // to the target duration; longer segments can trigger playback stalls\n // or other errors.\n //\n // For DASH, the mpd-parser uses the largest reported segment duration as the target\n // duration. Although that reported duration is occasionally approximate (i.e., not\n // exact), a strict check may report that a segment is too long more often in DASH.\n\n return Math.round(segmentDuration) > maxDuration + TIME_FUDGE_FACTOR;\n};\nconst getTroublesomeSegmentDurationMessage = (segmentInfo, sourceType) => {\n // Right now we aren't following DASH's timing model exactly, so only perform\n // this check for HLS content.\n if (sourceType !== 'hls') {\n return null;\n }\n const segmentDuration = mediaDuration({\n audioTimingInfo: segmentInfo.audioTimingInfo,\n videoTimingInfo: segmentInfo.videoTimingInfo\n }); // Don't report if we lack information.\n //\n // If the segment has a duration of 0 it is either a lack of information or a\n // metadata only segment and shouldn't be reported here.\n\n if (!segmentDuration) {\n return null;\n }\n const targetDuration = segmentInfo.playlist.targetDuration;\n const isSegmentWayTooLong = segmentTooLong({\n segmentDuration,\n maxDuration: targetDuration * 2\n });\n const isSegmentSlightlyTooLong = segmentTooLong({\n segmentDuration,\n maxDuration: targetDuration\n });\n const segmentTooLongMessage = `Segment with index ${segmentInfo.mediaIndex} ` + `from playlist ${segmentInfo.playlist.id} ` + `has a duration of ${segmentDuration} ` + `when the reported duration is ${segmentInfo.duration} ` + `and the target duration is ${targetDuration}. ` + 'For HLS content, a duration in excess of the target duration may result in ' + 'playback issues. See the HLS specification section on EXT-X-TARGETDURATION for ' + 'more details: ' + 'https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-4.3.3.1';\n if (isSegmentWayTooLong || isSegmentSlightlyTooLong) {\n return {\n severity: isSegmentWayTooLong ? 'warn' : 'info',\n message: segmentTooLongMessage\n };\n }\n return null;\n};\n/**\n *\n * @param {Object} options type of segment loader and segment either segmentInfo or simple segment\n * @return a segmentInfo payload for events or errors.\n */\n\nconst segmentInfoPayload = ({\n type,\n segment\n}) => {\n if (!segment) {\n return;\n }\n const isEncrypted = Boolean(segment.key || segment.map && segment.map.ke);\n const isMediaInitialization = Boolean(segment.map && !segment.map.bytes);\n const start = segment.startOfSegment === undefined ? segment.start : segment.startOfSegment;\n return {\n type: type || segment.type,\n uri: segment.resolvedUri || segment.uri,\n start,\n duration: segment.duration,\n isEncrypted,\n isMediaInitialization\n };\n};\n/**\n * An object that manages segment loading and appending.\n *\n * @class SegmentLoader\n * @param {Object} options required and optional options\n * @extends videojs.EventTarget\n */\n\nclass SegmentLoader extends videojs.EventTarget {\n constructor(settings, options = {}) {\n super(); // check pre-conditions\n\n if (!settings) {\n throw new TypeError('Initialization settings are required');\n }\n if (typeof settings.currentTime !== 'function') {\n throw new TypeError('No currentTime getter specified');\n }\n if (!settings.mediaSource) {\n throw new TypeError('No MediaSource specified');\n } // public properties\n\n this.bandwidth = settings.bandwidth;\n this.throughput = {\n rate: 0,\n count: 0\n };\n this.roundTrip = NaN;\n this.resetStats_();\n this.mediaIndex = null;\n this.partIndex = null; // private settings\n\n this.hasPlayed_ = settings.hasPlayed;\n this.currentTime_ = settings.currentTime;\n this.seekable_ = settings.seekable;\n this.seeking_ = settings.seeking;\n this.duration_ = settings.duration;\n this.mediaSource_ = settings.mediaSource;\n this.vhs_ = settings.vhs;\n this.loaderType_ = settings.loaderType;\n this.currentMediaInfo_ = void 0;\n this.startingMediaInfo_ = void 0;\n this.segmentMetadataTrack_ = settings.segmentMetadataTrack;\n this.goalBufferLength_ = settings.goalBufferLength;\n this.sourceType_ = settings.sourceType;\n this.sourceUpdater_ = settings.sourceUpdater;\n this.inbandTextTracks_ = settings.inbandTextTracks;\n this.state_ = 'INIT';\n this.timelineChangeController_ = settings.timelineChangeController;\n this.shouldSaveSegmentTimingInfo_ = true;\n this.parse708captions_ = settings.parse708captions;\n this.useDtsForTimestampOffset_ = settings.useDtsForTimestampOffset;\n this.captionServices_ = settings.captionServices;\n this.exactManifestTimings = settings.exactManifestTimings;\n this.addMetadataToTextTrack = settings.addMetadataToTextTrack; // private instance variables\n\n this.checkBufferTimeout_ = null;\n this.error_ = void 0;\n this.currentTimeline_ = -1;\n this.shouldForceTimestampOffsetAfterResync_ = false;\n this.pendingSegment_ = null;\n this.xhrOptions_ = null;\n this.pendingSegments_ = [];\n this.audioDisabled_ = false;\n this.isPendingTimestampOffset_ = false; // TODO possibly move gopBuffer and timeMapping info to a separate controller\n\n this.gopBuffer_ = [];\n this.timeMapping_ = 0;\n this.safeAppend_ = false;\n this.appendInitSegment_ = {\n audio: true,\n video: true\n };\n this.playlistOfLastInitSegment_ = {\n audio: null,\n video: null\n };\n this.callQueue_ = []; // If the segment loader prepares to load a segment, but does not have enough\n // information yet to start the loading process (e.g., if the audio loader wants to\n // load a segment from the next timeline but the main loader hasn't yet crossed that\n // timeline), then the load call will be added to the queue until it is ready to be\n // processed.\n\n this.loadQueue_ = [];\n this.metadataQueue_ = {\n id3: [],\n caption: []\n };\n this.waitingOnRemove_ = false;\n this.quotaExceededErrorRetryTimeout_ = null; // Fragmented mp4 playback\n\n this.activeInitSegmentId_ = null;\n this.initSegments_ = {}; // HLSe playback\n\n this.cacheEncryptionKeys_ = settings.cacheEncryptionKeys;\n this.keyCache_ = {};\n this.decrypter_ = settings.decrypter; // Manages the tracking and generation of sync-points, mappings\n // between a time in the display time and a segment index within\n // a playlist\n\n this.syncController_ = settings.syncController;\n this.syncPoint_ = {\n segmentIndex: 0,\n time: 0\n };\n this.transmuxer_ = this.createTransmuxer_();\n this.triggerSyncInfoUpdate_ = () => this.trigger('syncinfoupdate');\n this.syncController_.on('syncinfoupdate', this.triggerSyncInfoUpdate_);\n this.mediaSource_.addEventListener('sourceopen', () => {\n if (!this.isEndOfStream_()) {\n this.ended_ = false;\n }\n }); // ...for determining the fetch location\n\n this.fetchAtBuffer_ = false;\n this.logger_ = logger(`SegmentLoader[${this.loaderType_}]`);\n Object.defineProperty(this, 'state', {\n get() {\n return this.state_;\n },\n set(newState) {\n if (newState !== this.state_) {\n this.logger_(`${this.state_} -> ${newState}`);\n this.state_ = newState;\n this.trigger('statechange');\n }\n }\n });\n this.sourceUpdater_.on('ready', () => {\n if (this.hasEnoughInfoToAppend_()) {\n this.processCallQueue_();\n } else {\n checkAndFixTimelines(this);\n }\n });\n this.sourceUpdater_.on('codecschange', metadata => {\n this.trigger(_extends({\n type: 'codecschange'\n }, metadata));\n }); // Only the main loader needs to listen for pending timeline changes, as the main\n // loader should wait for audio to be ready to change its timeline so that both main\n // and audio timelines change together. For more details, see the\n // shouldWaitForTimelineChange function.\n\n if (this.loaderType_ === 'main') {\n this.timelineChangeController_.on('pendingtimelinechange', () => {\n if (this.hasEnoughInfoToAppend_()) {\n this.processCallQueue_();\n } else {\n checkAndFixTimelines(this);\n }\n });\n } // The main loader only listens on pending timeline changes, but the audio loader,\n // since its loads follow main, needs to listen on timeline changes. For more details,\n // see the shouldWaitForTimelineChange function.\n\n if (this.loaderType_ === 'audio') {\n this.timelineChangeController_.on('timelinechange', metadata => {\n this.trigger(_extends({\n type: 'timelinechange'\n }, metadata));\n if (this.hasEnoughInfoToLoad_()) {\n this.processLoadQueue_();\n } else {\n checkAndFixTimelines(this);\n }\n if (this.hasEnoughInfoToAppend_()) {\n this.processCallQueue_();\n } else {\n checkAndFixTimelines(this);\n }\n });\n }\n }\n /**\n * TODO: Current sync controller consists of many hls-specific strategies\n * media sequence sync is also hls-specific, and we would like to be protocol-agnostic on this level\n * this should be a part of the sync-controller and sync controller should expect different strategy list based on the protocol.\n *\n * @return {MediaSequenceSync|null}\n * @private\n */\n\n get mediaSequenceSync_() {\n return this.syncController_.getMediaSequenceSync(this.loaderType_);\n }\n createTransmuxer_() {\n return segmentTransmuxer.createTransmuxer({\n remux: false,\n alignGopsAtEnd: this.safeAppend_,\n keepOriginalTimestamps: true,\n parse708captions: this.parse708captions_,\n captionServices: this.captionServices_\n });\n }\n /**\n * reset all of our media stats\n *\n * @private\n */\n\n resetStats_() {\n this.mediaBytesTransferred = 0;\n this.mediaRequests = 0;\n this.mediaRequestsAborted = 0;\n this.mediaRequestsTimedout = 0;\n this.mediaRequestsErrored = 0;\n this.mediaTransferDuration = 0;\n this.mediaSecondsLoaded = 0;\n this.mediaAppends = 0;\n }\n /**\n * dispose of the SegmentLoader and reset to the default state\n */\n\n dispose() {\n this.trigger('dispose');\n this.state = 'DISPOSED';\n this.pause();\n this.abort_();\n if (this.transmuxer_) {\n this.transmuxer_.terminate();\n }\n this.resetStats_();\n if (this.checkBufferTimeout_) {\n window$1.clearTimeout(this.checkBufferTimeout_);\n }\n if (this.syncController_ && this.triggerSyncInfoUpdate_) {\n this.syncController_.off('syncinfoupdate', this.triggerSyncInfoUpdate_);\n }\n this.off();\n }\n setAudio(enable) {\n this.audioDisabled_ = !enable;\n if (enable) {\n this.appendInitSegment_.audio = true;\n } else {\n // remove current track audio if it gets disabled\n this.sourceUpdater_.removeAudio(0, this.duration_());\n }\n }\n /**\n * abort anything that is currently doing on with the SegmentLoader\n * and reset to a default state\n */\n\n abort() {\n if (this.state !== 'WAITING') {\n if (this.pendingSegment_) {\n this.pendingSegment_ = null;\n }\n this.timelineChangeController_.clearPendingTimelineChange(this.loaderType_);\n return;\n }\n this.abort_(); // We aborted the requests we were waiting on, so reset the loader's state to READY\n // since we are no longer \"waiting\" on any requests. XHR callback is not always run\n // when the request is aborted. This will prevent the loader from being stuck in the\n // WAITING state indefinitely.\n\n this.state = 'READY'; // don't wait for buffer check timeouts to begin fetching the\n // next segment\n\n if (!this.paused()) {\n this.monitorBuffer_();\n }\n }\n /**\n * abort all pending xhr requests and null any pending segements\n *\n * @private\n */\n\n abort_() {\n if (this.pendingSegment_ && this.pendingSegment_.abortRequests) {\n this.pendingSegment_.abortRequests();\n } // clear out the segment being processed\n\n this.pendingSegment_ = null;\n this.callQueue_ = [];\n this.loadQueue_ = [];\n this.metadataQueue_.id3 = [];\n this.metadataQueue_.caption = [];\n this.timelineChangeController_.clearPendingTimelineChange(this.loaderType_);\n this.waitingOnRemove_ = false;\n window$1.clearTimeout(this.quotaExceededErrorRetryTimeout_);\n this.quotaExceededErrorRetryTimeout_ = null;\n }\n checkForAbort_(requestId) {\n // If the state is APPENDING, then aborts will not modify the state, meaning the first\n // callback that happens should reset the state to READY so that loading can continue.\n if (this.state === 'APPENDING' && !this.pendingSegment_) {\n this.state = 'READY';\n return true;\n }\n if (!this.pendingSegment_ || this.pendingSegment_.requestId !== requestId) {\n return true;\n }\n return false;\n }\n /**\n * set an error on the segment loader and null out any pending segements\n *\n * @param {Error} error the error to set on the SegmentLoader\n * @return {Error} the error that was set or that is currently set\n */\n\n error(error) {\n if (typeof error !== 'undefined') {\n this.logger_('error occurred:', error);\n this.error_ = error;\n }\n this.pendingSegment_ = null;\n return this.error_;\n }\n endOfStream() {\n this.ended_ = true;\n if (this.transmuxer_) {\n // need to clear out any cached data to prepare for the new segment\n segmentTransmuxer.reset(this.transmuxer_);\n }\n this.gopBuffer_.length = 0;\n this.pause();\n this.trigger('ended');\n }\n /**\n * Indicates which time ranges are buffered\n *\n * @return {TimeRange}\n * TimeRange object representing the current buffered ranges\n */\n\n buffered_() {\n const trackInfo = this.getMediaInfo_();\n if (!this.sourceUpdater_ || !trackInfo) {\n return createTimeRanges();\n }\n if (this.loaderType_ === 'main') {\n const {\n hasAudio,\n hasVideo,\n isMuxed\n } = trackInfo;\n if (hasVideo && hasAudio && !this.audioDisabled_ && !isMuxed) {\n return this.sourceUpdater_.buffered();\n }\n if (hasVideo) {\n return this.sourceUpdater_.videoBuffered();\n }\n } // One case that can be ignored for now is audio only with alt audio,\n // as we don't yet have proper support for that.\n\n return this.sourceUpdater_.audioBuffered();\n }\n /**\n * Gets and sets init segment for the provided map\n *\n * @param {Object} map\n * The map object representing the init segment to get or set\n * @param {boolean=} set\n * If true, the init segment for the provided map should be saved\n * @return {Object}\n * map object for desired init segment\n */\n\n initSegmentForMap(map, set = false) {\n if (!map) {\n return null;\n }\n const id = initSegmentId(map);\n let storedMap = this.initSegments_[id];\n if (set && !storedMap && map.bytes) {\n this.initSegments_[id] = storedMap = {\n resolvedUri: map.resolvedUri,\n byterange: map.byterange,\n bytes: map.bytes,\n tracks: map.tracks,\n timescales: map.timescales\n };\n }\n return storedMap || map;\n }\n /**\n * Gets and sets key for the provided key\n *\n * @param {Object} key\n * The key object representing the key to get or set\n * @param {boolean=} set\n * If true, the key for the provided key should be saved\n * @return {Object}\n * Key object for desired key\n */\n\n segmentKey(key, set = false) {\n if (!key) {\n return null;\n }\n const id = segmentKeyId(key);\n let storedKey = this.keyCache_[id]; // TODO: We should use the HTTP Expires header to invalidate our cache per\n // https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-6.2.3\n\n if (this.cacheEncryptionKeys_ && set && !storedKey && key.bytes) {\n this.keyCache_[id] = storedKey = {\n resolvedUri: key.resolvedUri,\n bytes: key.bytes\n };\n }\n const result = {\n resolvedUri: (storedKey || key).resolvedUri\n };\n if (storedKey) {\n result.bytes = storedKey.bytes;\n }\n return result;\n }\n /**\n * Returns true if all configuration required for loading is present, otherwise false.\n *\n * @return {boolean} True if the all configuration is ready for loading\n * @private\n */\n\n couldBeginLoading_() {\n return this.playlist_ && !this.paused();\n }\n /**\n * load a playlist and start to fill the buffer\n */\n\n load() {\n // un-pause\n this.monitorBuffer_(); // if we don't have a playlist yet, keep waiting for one to be\n // specified\n\n if (!this.playlist_) {\n return;\n } // if all the configuration is ready, initialize and begin loading\n\n if (this.state === 'INIT' && this.couldBeginLoading_()) {\n return this.init_();\n } // if we're in the middle of processing a segment already, don't\n // kick off an additional segment request\n\n if (!this.couldBeginLoading_() || this.state !== 'READY' && this.state !== 'INIT') {\n return;\n }\n this.state = 'READY';\n }\n /**\n * Once all the starting parameters have been specified, begin\n * operation. This method should only be invoked from the INIT\n * state.\n *\n * @private\n */\n\n init_() {\n this.state = 'READY'; // if this is the audio segment loader, and it hasn't been inited before, then any old\n // audio data from the muxed content should be removed\n\n this.resetEverything();\n return this.monitorBuffer_();\n }\n /**\n * set a playlist on the segment loader\n *\n * @param {PlaylistLoader} media the playlist to set on the segment loader\n */\n\n playlist(newPlaylist, options = {}) {\n if (!newPlaylist) {\n return;\n }\n if (this.playlist_ && this.playlist_.endList && newPlaylist.endList && this.playlist_.uri === newPlaylist.uri) {\n // skip update if both prev and new are vod and have the same URI\n return;\n }\n const oldPlaylist = this.playlist_;\n const segmentInfo = this.pendingSegment_;\n this.playlist_ = newPlaylist;\n this.xhrOptions_ = options; // when we haven't started playing yet, the start of a live playlist\n // is always our zero-time so force a sync update each time the playlist\n // is refreshed from the server\n //\n // Use the INIT state to determine if playback has started, as the playlist sync info\n // should be fixed once requests begin (as sync points are generated based on sync\n // info), but not before then.\n\n if (this.state === 'INIT') {\n newPlaylist.syncInfo = {\n mediaSequence: newPlaylist.mediaSequence,\n time: 0\n }; // Setting the date time mapping means mapping the program date time (if available)\n // to time 0 on the player's timeline. The playlist's syncInfo serves a similar\n // purpose, mapping the initial mediaSequence to time zero. Since the syncInfo can\n // be updated as the playlist is refreshed before the loader starts loading, the\n // program date time mapping needs to be updated as well.\n //\n // This mapping is only done for the main loader because a program date time should\n // map equivalently between playlists.\n\n if (this.loaderType_ === 'main') {\n this.syncController_.setDateTimeMappingForStart(newPlaylist);\n }\n }\n let oldId = null;\n if (oldPlaylist) {\n if (oldPlaylist.id) {\n oldId = oldPlaylist.id;\n } else if (oldPlaylist.uri) {\n oldId = oldPlaylist.uri;\n }\n }\n this.logger_(`playlist update [${oldId} => ${newPlaylist.id || newPlaylist.uri}]`);\n if (this.mediaSequenceSync_) {\n this.mediaSequenceSync_.update(newPlaylist, this.currentTime_());\n this.logger_(`Playlist update:\ncurrentTime: ${this.currentTime_()}\nbufferedEnd: ${lastBufferedEnd(this.buffered_())}\n`, this.mediaSequenceSync_.diagnostics);\n } // in VOD, this is always a rendition switch (or we updated our syncInfo above)\n // in LIVE, we always want to update with new playlists (including refreshes)\n\n this.trigger('syncinfoupdate'); // if we were unpaused but waiting for a playlist, start\n // buffering now\n\n if (this.state === 'INIT' && this.couldBeginLoading_()) {\n return this.init_();\n }\n if (!oldPlaylist || oldPlaylist.uri !== newPlaylist.uri) {\n if (this.mediaIndex !== null) {\n // we must reset/resync the segment loader when we switch renditions and\n // the segment loader is already synced to the previous rendition\n // We only want to reset the loader here for LLHLS playback, as resetLoader sets fetchAtBuffer_\n // to false, resulting in fetching segments at currentTime and causing repeated\n // same-segment requests on playlist change. This erroneously drives up the playback watcher\n // stalled segment count, as re-requesting segments at the currentTime or browser cached segments\n // will not change the buffer.\n // Reference for LLHLS fixes: https://github.com/videojs/http-streaming/pull/1201\n const isLLHLS = !newPlaylist.endList && typeof newPlaylist.partTargetDuration === 'number';\n if (isLLHLS) {\n this.resetLoader();\n } else {\n this.resyncLoader();\n }\n }\n this.currentMediaInfo_ = void 0;\n this.trigger('playlistupdate'); // the rest of this function depends on `oldPlaylist` being defined\n\n return;\n } // we reloaded the same playlist so we are in a live scenario\n // and we will likely need to adjust the mediaIndex\n\n const mediaSequenceDiff = newPlaylist.mediaSequence - oldPlaylist.mediaSequence;\n this.logger_(`live window shift [${mediaSequenceDiff}]`); // update the mediaIndex on the SegmentLoader\n // this is important because we can abort a request and this value must be\n // equal to the last appended mediaIndex\n\n if (this.mediaIndex !== null) {\n this.mediaIndex -= mediaSequenceDiff; // this can happen if we are going to load the first segment, but get a playlist\n // update during that. mediaIndex would go from 0 to -1 if mediaSequence in the\n // new playlist was incremented by 1.\n\n if (this.mediaIndex < 0) {\n this.mediaIndex = null;\n this.partIndex = null;\n } else {\n const segment = this.playlist_.segments[this.mediaIndex]; // partIndex should remain the same for the same segment\n // unless parts fell off of the playlist for this segment.\n // In that case we need to reset partIndex and resync\n\n if (this.partIndex && (!segment.parts || !segment.parts.length || !segment.parts[this.partIndex])) {\n const mediaIndex = this.mediaIndex;\n this.logger_(`currently processing part (index ${this.partIndex}) no longer exists.`);\n this.resetLoader(); // We want to throw away the partIndex and the data associated with it,\n // as the part was dropped from our current playlists segment.\n // The mediaIndex will still be valid so keep that around.\n\n this.mediaIndex = mediaIndex;\n }\n }\n } // update the mediaIndex on the SegmentInfo object\n // this is important because we will update this.mediaIndex with this value\n // in `handleAppendsDone_` after the segment has been successfully appended\n\n if (segmentInfo) {\n segmentInfo.mediaIndex -= mediaSequenceDiff;\n if (segmentInfo.mediaIndex < 0) {\n segmentInfo.mediaIndex = null;\n segmentInfo.partIndex = null;\n } else {\n // we need to update the referenced segment so that timing information is\n // saved for the new playlist's segment, however, if the segment fell off the\n // playlist, we can leave the old reference and just lose the timing info\n if (segmentInfo.mediaIndex >= 0) {\n segmentInfo.segment = newPlaylist.segments[segmentInfo.mediaIndex];\n }\n if (segmentInfo.partIndex >= 0 && segmentInfo.segment.parts) {\n segmentInfo.part = segmentInfo.segment.parts[segmentInfo.partIndex];\n }\n }\n }\n this.syncController_.saveExpiredSegmentInfo(oldPlaylist, newPlaylist);\n }\n /**\n * Prevent the loader from fetching additional segments. If there\n * is a segment request outstanding, it will finish processing\n * before the loader halts. A segment loader can be unpaused by\n * calling load().\n */\n\n pause() {\n if (this.checkBufferTimeout_) {\n window$1.clearTimeout(this.checkBufferTimeout_);\n this.checkBufferTimeout_ = null;\n }\n }\n /**\n * Returns whether the segment loader is fetching additional\n * segments when given the opportunity. This property can be\n * modified through calls to pause() and load().\n */\n\n paused() {\n return this.checkBufferTimeout_ === null;\n }\n /**\n * Delete all the buffered data and reset the SegmentLoader\n *\n * @param {Function} [done] an optional callback to be executed when the remove\n * operation is complete\n */\n\n resetEverything(done) {\n this.ended_ = false;\n this.activeInitSegmentId_ = null;\n this.appendInitSegment_ = {\n audio: true,\n video: true\n };\n this.resetLoader(); // remove from 0, the earliest point, to Infinity, to signify removal of everything.\n // VTT Segment Loader doesn't need to do anything but in the regular SegmentLoader,\n // we then clamp the value to duration if necessary.\n\n this.remove(0, Infinity, done); // clears fmp4 captions\n\n if (this.transmuxer_) {\n this.transmuxer_.postMessage({\n action: 'clearAllMp4Captions'\n }); // reset the cache in the transmuxer\n\n this.transmuxer_.postMessage({\n action: 'reset'\n });\n }\n }\n /**\n * Force the SegmentLoader to resync and start loading around the currentTime instead\n * of starting at the end of the buffer\n *\n * Useful for fast quality changes\n */\n\n resetLoader() {\n this.fetchAtBuffer_ = false;\n if (this.mediaSequenceSync_) {\n this.mediaSequenceSync_.resetAppendedStatus();\n }\n this.resyncLoader();\n }\n /**\n * Force the SegmentLoader to restart synchronization and make a conservative guess\n * before returning to the simple walk-forward method\n */\n\n resyncLoader() {\n if (this.transmuxer_) {\n // need to clear out any cached data to prepare for the new segment\n segmentTransmuxer.reset(this.transmuxer_);\n }\n this.mediaIndex = null;\n this.partIndex = null;\n this.syncPoint_ = null;\n this.isPendingTimestampOffset_ = false; // this is mainly to sync timing-info when switching between renditions with and without timestamp-rollover,\n // so we don't want it for DASH or fragmented mp4 segments.\n\n const isFmp4 = this.currentMediaInfo_ && this.currentMediaInfo_.isFmp4;\n const isHlsTs = this.sourceType_ === 'hls' && !isFmp4;\n if (isHlsTs) {\n this.shouldForceTimestampOffsetAfterResync_ = true;\n }\n this.callQueue_ = [];\n this.loadQueue_ = [];\n this.metadataQueue_.id3 = [];\n this.metadataQueue_.caption = [];\n this.abort();\n if (this.transmuxer_) {\n this.transmuxer_.postMessage({\n action: 'clearParsedMp4Captions'\n });\n }\n }\n /**\n * Remove any data in the source buffer between start and end times\n *\n * @param {number} start - the start time of the region to remove from the buffer\n * @param {number} end - the end time of the region to remove from the buffer\n * @param {Function} [done] - an optional callback to be executed when the remove\n * @param {boolean} force - force all remove operations to happen\n * operation is complete\n */\n\n remove(start, end, done = () => {}, force = false) {\n // clamp end to duration if we need to remove everything.\n // This is due to a browser bug that causes issues if we remove to Infinity.\n // videojs/videojs-contrib-hls#1225\n if (end === Infinity) {\n end = this.duration_();\n } // skip removes that would throw an error\n // commonly happens during a rendition switch at the start of a video\n // from start 0 to end 0\n\n if (end <= start) {\n this.logger_('skipping remove because end ${end} is <= start ${start}');\n return;\n }\n if (!this.sourceUpdater_ || !this.getMediaInfo_()) {\n this.logger_('skipping remove because no source updater or starting media info'); // nothing to remove if we haven't processed any media\n\n return;\n } // set it to one to complete this function's removes\n\n let removesRemaining = 1;\n const removeFinished = () => {\n removesRemaining--;\n if (removesRemaining === 0) {\n done();\n }\n };\n if (force || !this.audioDisabled_) {\n removesRemaining++;\n this.sourceUpdater_.removeAudio(start, end, removeFinished);\n } // While it would be better to only remove video if the main loader has video, this\n // should be safe with audio only as removeVideo will call back even if there's no\n // video buffer.\n //\n // In theory we can check to see if there's video before calling the remove, but in\n // the event that we're switching between renditions and from video to audio only\n // (when we add support for that), we may need to clear the video contents despite\n // what the new media will contain.\n\n if (force || this.loaderType_ === 'main') {\n this.gopBuffer_ = removeGopBuffer(this.gopBuffer_, start, end, this.timeMapping_);\n removesRemaining++;\n this.sourceUpdater_.removeVideo(start, end, removeFinished);\n } // remove any captions and ID3 tags\n\n for (const track in this.inbandTextTracks_) {\n removeCuesFromTrack(start, end, this.inbandTextTracks_[track]);\n }\n removeCuesFromTrack(start, end, this.segmentMetadataTrack_); // finished this function's removes\n\n removeFinished();\n }\n /**\n * (re-)schedule monitorBufferTick_ to run as soon as possible\n *\n * @private\n */\n\n monitorBuffer_() {\n if (this.checkBufferTimeout_) {\n window$1.clearTimeout(this.checkBufferTimeout_);\n }\n this.checkBufferTimeout_ = window$1.setTimeout(this.monitorBufferTick_.bind(this), 1);\n }\n /**\n * As long as the SegmentLoader is in the READY state, periodically\n * invoke fillBuffer_().\n *\n * @private\n */\n\n monitorBufferTick_() {\n if (this.state === 'READY') {\n this.fillBuffer_();\n }\n if (this.checkBufferTimeout_) {\n window$1.clearTimeout(this.checkBufferTimeout_);\n }\n this.checkBufferTimeout_ = window$1.setTimeout(this.monitorBufferTick_.bind(this), CHECK_BUFFER_DELAY);\n }\n /**\n * fill the buffer with segements unless the sourceBuffers are\n * currently updating\n *\n * Note: this function should only ever be called by monitorBuffer_\n * and never directly\n *\n * @private\n */\n\n fillBuffer_() {\n // TODO since the source buffer maintains a queue, and we shouldn't call this function\n // except when we're ready for the next segment, this check can most likely be removed\n if (this.sourceUpdater_.updating()) {\n return;\n } // see if we need to begin loading immediately\n\n const segmentInfo = this.chooseNextRequest_();\n if (!segmentInfo) {\n return;\n }\n const metadata = {\n segmentInfo: segmentInfoPayload({\n type: this.loaderType_,\n segment: segmentInfo\n })\n };\n this.trigger({\n type: 'segmentselected',\n metadata\n });\n if (typeof segmentInfo.timestampOffset === 'number') {\n this.isPendingTimestampOffset_ = false;\n this.timelineChangeController_.pendingTimelineChange({\n type: this.loaderType_,\n from: this.currentTimeline_,\n to: segmentInfo.timeline\n });\n }\n this.loadSegment_(segmentInfo);\n }\n /**\n * Determines if we should call endOfStream on the media source based\n * on the state of the buffer or if appened segment was the final\n * segment in the playlist.\n *\n * @param {number} [mediaIndex] the media index of segment we last appended\n * @param {Object} [playlist] a media playlist object\n * @return {boolean} do we need to call endOfStream on the MediaSource\n */\n\n isEndOfStream_(mediaIndex = this.mediaIndex, playlist = this.playlist_, partIndex = this.partIndex) {\n if (!playlist || !this.mediaSource_) {\n return false;\n }\n const segment = typeof mediaIndex === 'number' && playlist.segments[mediaIndex]; // mediaIndex is zero based but length is 1 based\n\n const appendedLastSegment = mediaIndex + 1 === playlist.segments.length; // true if there are no parts, or this is the last part.\n\n const appendedLastPart = !segment || !segment.parts || partIndex + 1 === segment.parts.length; // if we've buffered to the end of the video, we need to call endOfStream\n // so that MediaSources can trigger the `ended` event when it runs out of\n // buffered data instead of waiting for me\n\n return playlist.endList && this.mediaSource_.readyState === 'open' && appendedLastSegment && appendedLastPart;\n }\n /**\n * Determines what request should be made given current segment loader state.\n *\n * @return {Object} a request object that describes the segment/part to load\n */\n\n chooseNextRequest_() {\n const buffered = this.buffered_();\n const bufferedEnd = lastBufferedEnd(buffered) || 0;\n const bufferedTime = timeAheadOf(buffered, this.currentTime_());\n const preloaded = !this.hasPlayed_() && bufferedTime >= 1;\n const haveEnoughBuffer = bufferedTime >= this.goalBufferLength_();\n const segments = this.playlist_.segments; // return no segment if:\n // 1. we don't have segments\n // 2. The video has not yet played and we already downloaded a segment\n // 3. we already have enough buffered time\n\n if (!segments.length || preloaded || haveEnoughBuffer) {\n return null;\n }\n this.syncPoint_ = this.syncPoint_ || this.syncController_.getSyncPoint(this.playlist_, this.duration_(), this.currentTimeline_, this.currentTime_(), this.loaderType_);\n const next = {\n partIndex: null,\n mediaIndex: null,\n startOfSegment: null,\n playlist: this.playlist_,\n isSyncRequest: Boolean(!this.syncPoint_)\n };\n if (next.isSyncRequest) {\n next.mediaIndex = getSyncSegmentCandidate(this.currentTimeline_, segments, bufferedEnd);\n this.logger_(`choose next request. Can not find sync point. Fallback to media Index: ${next.mediaIndex}`);\n } else if (this.mediaIndex !== null) {\n const segment = segments[this.mediaIndex];\n const partIndex = typeof this.partIndex === 'number' ? this.partIndex : -1;\n next.startOfSegment = segment.end ? segment.end : bufferedEnd;\n if (segment.parts && segment.parts[partIndex + 1]) {\n next.mediaIndex = this.mediaIndex;\n next.partIndex = partIndex + 1;\n } else {\n next.mediaIndex = this.mediaIndex + 1;\n }\n } else {\n let segmentIndex;\n let partIndex;\n let startTime;\n const targetTime = this.fetchAtBuffer_ ? bufferedEnd : this.currentTime_();\n if (this.mediaSequenceSync_) {\n this.logger_(`chooseNextRequest_ request after Quality Switch:\nFor TargetTime: ${targetTime}.\nCurrentTime: ${this.currentTime_()}\nBufferedEnd: ${bufferedEnd}\nFetch At Buffer: ${this.fetchAtBuffer_}\n`, this.mediaSequenceSync_.diagnostics);\n }\n if (this.mediaSequenceSync_ && this.mediaSequenceSync_.isReliable) {\n const syncInfo = this.getSyncInfoFromMediaSequenceSync_(targetTime);\n if (!syncInfo) {\n const message = 'No sync info found while using media sequence sync';\n this.error({\n message,\n metadata: {\n errorType: videojs.Error.StreamingFailedToSelectNextSegment,\n error: new Error(message)\n }\n });\n this.logger_('chooseNextRequest_ - no sync info found using media sequence sync'); // no match\n\n return null;\n }\n this.logger_(`chooseNextRequest_ mediaSequence syncInfo (${syncInfo.start} --> ${syncInfo.end})`);\n segmentIndex = syncInfo.segmentIndex;\n partIndex = syncInfo.partIndex;\n startTime = syncInfo.start;\n } else {\n this.logger_('chooseNextRequest_ - fallback to a regular segment selection algorithm, based on a syncPoint.'); // fallback\n\n const mediaInfoForTime = Playlist.getMediaInfoForTime({\n exactManifestTimings: this.exactManifestTimings,\n playlist: this.playlist_,\n currentTime: targetTime,\n startingPartIndex: this.syncPoint_.partIndex,\n startingSegmentIndex: this.syncPoint_.segmentIndex,\n startTime: this.syncPoint_.time\n });\n segmentIndex = mediaInfoForTime.segmentIndex;\n partIndex = mediaInfoForTime.partIndex;\n startTime = mediaInfoForTime.startTime;\n }\n next.getMediaInfoForTime = this.fetchAtBuffer_ ? `bufferedEnd ${targetTime}` : `currentTime ${targetTime}`;\n next.mediaIndex = segmentIndex;\n next.startOfSegment = startTime;\n next.partIndex = partIndex;\n this.logger_(`choose next request. Playlist switched and we have a sync point. Media Index: ${next.mediaIndex} `);\n }\n const nextSegment = segments[next.mediaIndex];\n let nextPart = nextSegment && typeof next.partIndex === 'number' && nextSegment.parts && nextSegment.parts[next.partIndex]; // if the next segment index is invalid or\n // the next partIndex is invalid do not choose a next segment.\n\n if (!nextSegment || typeof next.partIndex === 'number' && !nextPart) {\n return null;\n } // if the next segment has parts, and we don't have a partIndex.\n // Set partIndex to 0\n\n if (typeof next.partIndex !== 'number' && nextSegment.parts) {\n next.partIndex = 0;\n nextPart = nextSegment.parts[0];\n } // independentSegments applies to every segment in a playlist. If independentSegments appears in a main playlist,\n // it applies to each segment in each media playlist.\n // https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming-23#section-4.3.5.1\n\n const hasIndependentSegments = this.vhs_.playlists && this.vhs_.playlists.main && this.vhs_.playlists.main.independentSegments || this.playlist_.independentSegments; // if we have no buffered data then we need to make sure\n // that the next part we append is \"independent\" if possible.\n // So we check if the previous part is independent, and request\n // it if it is.\n\n if (!bufferedTime && nextPart && !hasIndependentSegments && !nextPart.independent) {\n if (next.partIndex === 0) {\n const lastSegment = segments[next.mediaIndex - 1];\n const lastSegmentLastPart = lastSegment.parts && lastSegment.parts.length && lastSegment.parts[lastSegment.parts.length - 1];\n if (lastSegmentLastPart && lastSegmentLastPart.independent) {\n next.mediaIndex -= 1;\n next.partIndex = lastSegment.parts.length - 1;\n next.independent = 'previous segment';\n }\n } else if (nextSegment.parts[next.partIndex - 1].independent) {\n next.partIndex -= 1;\n next.independent = 'previous part';\n }\n }\n const ended = this.mediaSource_ && this.mediaSource_.readyState === 'ended'; // do not choose a next segment if all of the following:\n // 1. this is the last segment in the playlist\n // 2. end of stream has been called on the media source already\n // 3. the player is not seeking\n\n if (next.mediaIndex >= segments.length - 1 && ended && !this.seeking_()) {\n return null;\n }\n if (this.shouldForceTimestampOffsetAfterResync_) {\n this.shouldForceTimestampOffsetAfterResync_ = false;\n next.forceTimestampOffset = true;\n this.logger_('choose next request. Force timestamp offset after loader resync');\n }\n return this.generateSegmentInfo_(next);\n }\n getSyncInfoFromMediaSequenceSync_(targetTime) {\n if (!this.mediaSequenceSync_) {\n return null;\n } // we should pull the target time to the least available time if we drop out of sync for any reason\n\n const finalTargetTime = Math.max(targetTime, this.mediaSequenceSync_.start);\n if (targetTime !== finalTargetTime) {\n this.logger_(`getSyncInfoFromMediaSequenceSync_. Pulled target time from ${targetTime} to ${finalTargetTime}`);\n }\n const mediaSequenceSyncInfo = this.mediaSequenceSync_.getSyncInfoForTime(finalTargetTime);\n if (!mediaSequenceSyncInfo) {\n // no match at all\n return null;\n }\n if (!mediaSequenceSyncInfo.isAppended) {\n // has a perfect match\n return mediaSequenceSyncInfo;\n } // has match, but segment was already appended.\n // attempt to auto-advance to the nearest next segment:\n\n const nextMediaSequenceSyncInfo = this.mediaSequenceSync_.getSyncInfoForTime(mediaSequenceSyncInfo.end);\n if (!nextMediaSequenceSyncInfo) {\n // no match at all\n return null;\n }\n if (nextMediaSequenceSyncInfo.isAppended) {\n this.logger_('getSyncInfoFromMediaSequenceSync_: We encounter unexpected scenario where next media sequence sync info is also appended!');\n } // got match with the nearest next segment\n\n return nextMediaSequenceSyncInfo;\n }\n generateSegmentInfo_(options) {\n const {\n independent,\n playlist,\n mediaIndex,\n startOfSegment,\n isSyncRequest,\n partIndex,\n forceTimestampOffset,\n getMediaInfoForTime\n } = options;\n const segment = playlist.segments[mediaIndex];\n const part = typeof partIndex === 'number' && segment.parts[partIndex];\n const segmentInfo = {\n requestId: 'segment-loader-' + Math.random(),\n // resolve the segment URL relative to the playlist\n uri: part && part.resolvedUri || segment.resolvedUri,\n // the segment's mediaIndex at the time it was requested\n mediaIndex,\n partIndex: part ? partIndex : null,\n // whether or not to update the SegmentLoader's state with this\n // segment's mediaIndex\n isSyncRequest,\n startOfSegment,\n // the segment's playlist\n playlist,\n // unencrypted bytes of the segment\n bytes: null,\n // when a key is defined for this segment, the encrypted bytes\n encryptedBytes: null,\n // The target timestampOffset for this segment when we append it\n // to the source buffer\n timestampOffset: null,\n // The timeline that the segment is in\n timeline: segment.timeline,\n // The expected duration of the segment in seconds\n duration: part && part.duration || segment.duration,\n // retain the segment in case the playlist updates while doing an async process\n segment,\n part,\n byteLength: 0,\n transmuxer: this.transmuxer_,\n // type of getMediaInfoForTime that was used to get this segment\n getMediaInfoForTime,\n independent\n };\n const overrideCheck = typeof forceTimestampOffset !== 'undefined' ? forceTimestampOffset : this.isPendingTimestampOffset_;\n segmentInfo.timestampOffset = this.timestampOffsetForSegment_({\n segmentTimeline: segment.timeline,\n currentTimeline: this.currentTimeline_,\n startOfSegment,\n buffered: this.buffered_(),\n overrideCheck\n });\n const audioBufferedEnd = lastBufferedEnd(this.sourceUpdater_.audioBuffered());\n if (typeof audioBufferedEnd === 'number') {\n // since the transmuxer is using the actual timing values, but the buffer is\n // adjusted by the timestamp offset, we must adjust the value here\n segmentInfo.audioAppendStart = audioBufferedEnd - this.sourceUpdater_.audioTimestampOffset();\n }\n if (this.sourceUpdater_.videoBuffered().length) {\n segmentInfo.gopsToAlignWith = gopsSafeToAlignWith(this.gopBuffer_,\n // since the transmuxer is using the actual timing values, but the time is\n // adjusted by the timestmap offset, we must adjust the value here\n this.currentTime_() - this.sourceUpdater_.videoTimestampOffset(), this.timeMapping_);\n }\n return segmentInfo;\n } // get the timestampoffset for a segment,\n // added so that vtt segment loader can override and prevent\n // adding timestamp offsets.\n\n timestampOffsetForSegment_(options) {\n return timestampOffsetForSegment(options);\n }\n /**\n * Determines if the network has enough bandwidth to complete the current segment\n * request in a timely manner. If not, the request will be aborted early and bandwidth\n * updated to trigger a playlist switch.\n *\n * @param {Object} stats\n * Object containing stats about the request timing and size\n * @private\n */\n\n earlyAbortWhenNeeded_(stats) {\n if (this.vhs_.tech_.paused() ||\n // Don't abort if the current playlist is on the lowestEnabledRendition\n // TODO: Replace using timeout with a boolean indicating whether this playlist is\n // the lowestEnabledRendition.\n !this.xhrOptions_.timeout ||\n // Don't abort if we have no bandwidth information to estimate segment sizes\n !this.playlist_.attributes.BANDWIDTH) {\n return;\n } // Wait at least 1 second since the first byte of data has been received before\n // using the calculated bandwidth from the progress event to allow the bitrate\n // to stabilize\n\n if (Date.now() - (stats.firstBytesReceivedAt || Date.now()) < 1000) {\n return;\n }\n const currentTime = this.currentTime_();\n const measuredBandwidth = stats.bandwidth;\n const segmentDuration = this.pendingSegment_.duration;\n const requestTimeRemaining = Playlist.estimateSegmentRequestTime(segmentDuration, measuredBandwidth, this.playlist_, stats.bytesReceived); // Subtract 1 from the timeUntilRebuffer so we still consider an early abort\n // if we are only left with less than 1 second when the request completes.\n // A negative timeUntilRebuffering indicates we are already rebuffering\n\n const timeUntilRebuffer$1 = timeUntilRebuffer(this.buffered_(), currentTime, this.vhs_.tech_.playbackRate()) - 1; // Only consider aborting early if the estimated time to finish the download\n // is larger than the estimated time until the player runs out of forward buffer\n\n if (requestTimeRemaining <= timeUntilRebuffer$1) {\n return;\n }\n const switchCandidate = minRebufferMaxBandwidthSelector({\n main: this.vhs_.playlists.main,\n currentTime,\n bandwidth: measuredBandwidth,\n duration: this.duration_(),\n segmentDuration,\n timeUntilRebuffer: timeUntilRebuffer$1,\n currentTimeline: this.currentTimeline_,\n syncController: this.syncController_\n });\n if (!switchCandidate) {\n return;\n }\n const rebufferingImpact = requestTimeRemaining - timeUntilRebuffer$1;\n const timeSavedBySwitching = rebufferingImpact - switchCandidate.rebufferingImpact;\n let minimumTimeSaving = 0.5; // If we are already rebuffering, increase the amount of variance we add to the\n // potential round trip time of the new request so that we are not too aggressive\n // with switching to a playlist that might save us a fraction of a second.\n\n if (timeUntilRebuffer$1 <= TIME_FUDGE_FACTOR) {\n minimumTimeSaving = 1;\n }\n if (!switchCandidate.playlist || switchCandidate.playlist.uri === this.playlist_.uri || timeSavedBySwitching < minimumTimeSaving) {\n return;\n } // set the bandwidth to that of the desired playlist being sure to scale by\n // BANDWIDTH_VARIANCE and add one so the playlist selector does not exclude it\n // don't trigger a bandwidthupdate as the bandwidth is artifial\n\n this.bandwidth = switchCandidate.playlist.attributes.BANDWIDTH * Config.BANDWIDTH_VARIANCE + 1;\n this.trigger('earlyabort');\n }\n handleAbort_(segmentInfo) {\n this.logger_(`Aborting ${segmentInfoString(segmentInfo)}`);\n this.mediaRequestsAborted += 1;\n }\n /**\n * XHR `progress` event handler\n *\n * @param {Event}\n * The XHR `progress` event\n * @param {Object} simpleSegment\n * A simplified segment object copy\n * @private\n */\n\n handleProgress_(event, simpleSegment) {\n this.earlyAbortWhenNeeded_(simpleSegment.stats);\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n }\n this.trigger('progress');\n }\n handleTrackInfo_(simpleSegment, trackInfo) {\n const {\n hasAudio,\n hasVideo\n } = trackInfo;\n const metadata = {\n segmentInfo: segmentInfoPayload({\n type: this.loaderType_,\n segment: simpleSegment\n }),\n trackInfo: {\n hasAudio,\n hasVideo\n }\n };\n this.trigger({\n type: 'segmenttransmuxingtrackinfoavailable',\n metadata\n });\n this.earlyAbortWhenNeeded_(simpleSegment.stats);\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n }\n if (this.checkForIllegalMediaSwitch(trackInfo)) {\n return;\n }\n trackInfo = trackInfo || {}; // When we have track info, determine what media types this loader is dealing with.\n // Guard against cases where we're not getting track info at all until we are\n // certain that all streams will provide it.\n\n if (!shallowEqual(this.currentMediaInfo_, trackInfo)) {\n this.appendInitSegment_ = {\n audio: true,\n video: true\n };\n this.startingMediaInfo_ = trackInfo;\n this.currentMediaInfo_ = trackInfo;\n this.logger_('trackinfo update', trackInfo);\n this.trigger('trackinfo');\n } // trackinfo may cause an abort if the trackinfo\n // causes a codec change to an unsupported codec.\n\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n } // set trackinfo on the pending segment so that\n // it can append.\n\n this.pendingSegment_.trackInfo = trackInfo; // check if any calls were waiting on the track info\n\n if (this.hasEnoughInfoToAppend_()) {\n this.processCallQueue_();\n } else {\n checkAndFixTimelines(this);\n }\n }\n handleTimingInfo_(simpleSegment, mediaType, timeType, time) {\n this.earlyAbortWhenNeeded_(simpleSegment.stats);\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n }\n const segmentInfo = this.pendingSegment_;\n const timingInfoProperty = timingInfoPropertyForMedia(mediaType);\n segmentInfo[timingInfoProperty] = segmentInfo[timingInfoProperty] || {};\n segmentInfo[timingInfoProperty][timeType] = time;\n this.logger_(`timinginfo: ${mediaType} - ${timeType} - ${time}`); // check if any calls were waiting on the timing info\n\n if (this.hasEnoughInfoToAppend_()) {\n this.processCallQueue_();\n } else {\n checkAndFixTimelines(this);\n }\n }\n handleCaptions_(simpleSegment, captionData) {\n this.earlyAbortWhenNeeded_(simpleSegment.stats);\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n } // This could only happen with fmp4 segments, but\n // should still not happen in general\n\n if (captionData.length === 0) {\n this.logger_('SegmentLoader received no captions from a caption event');\n return;\n }\n const segmentInfo = this.pendingSegment_; // Wait until we have some video data so that caption timing\n // can be adjusted by the timestamp offset\n\n if (!segmentInfo.hasAppendedData_) {\n this.metadataQueue_.caption.push(this.handleCaptions_.bind(this, simpleSegment, captionData));\n return;\n }\n const timestampOffset = this.sourceUpdater_.videoTimestampOffset() === null ? this.sourceUpdater_.audioTimestampOffset() : this.sourceUpdater_.videoTimestampOffset();\n const captionTracks = {}; // get total start/end and captions for each track/stream\n\n captionData.forEach(caption => {\n // caption.stream is actually a track name...\n // set to the existing values in tracks or default values\n captionTracks[caption.stream] = captionTracks[caption.stream] || {\n // Infinity, as any other value will be less than this\n startTime: Infinity,\n captions: [],\n // 0 as an other value will be more than this\n endTime: 0\n };\n const captionTrack = captionTracks[caption.stream];\n captionTrack.startTime = Math.min(captionTrack.startTime, caption.startTime + timestampOffset);\n captionTrack.endTime = Math.max(captionTrack.endTime, caption.endTime + timestampOffset);\n captionTrack.captions.push(caption);\n });\n Object.keys(captionTracks).forEach(trackName => {\n const {\n startTime,\n endTime,\n captions\n } = captionTracks[trackName];\n const inbandTextTracks = this.inbandTextTracks_;\n this.logger_(`adding cues from ${startTime} -> ${endTime} for ${trackName}`);\n createCaptionsTrackIfNotExists(inbandTextTracks, this.vhs_.tech_, trackName); // clear out any cues that start and end at the same time period for the same track.\n // We do this because a rendition change that also changes the timescale for captions\n // will result in captions being re-parsed for certain segments. If we add them again\n // without clearing we will have two of the same captions visible.\n\n removeCuesFromTrack(startTime, endTime, inbandTextTracks[trackName]);\n addCaptionData({\n captionArray: captions,\n inbandTextTracks,\n timestampOffset\n });\n }); // Reset stored captions since we added parsed\n // captions to a text track at this point\n\n if (this.transmuxer_) {\n this.transmuxer_.postMessage({\n action: 'clearParsedMp4Captions'\n });\n }\n }\n handleId3_(simpleSegment, id3Frames, dispatchType) {\n this.earlyAbortWhenNeeded_(simpleSegment.stats);\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n }\n const segmentInfo = this.pendingSegment_; // we need to have appended data in order for the timestamp offset to be set\n\n if (!segmentInfo.hasAppendedData_) {\n this.metadataQueue_.id3.push(this.handleId3_.bind(this, simpleSegment, id3Frames, dispatchType));\n return;\n }\n this.addMetadataToTextTrack(dispatchType, id3Frames, this.duration_());\n }\n processMetadataQueue_() {\n this.metadataQueue_.id3.forEach(fn => fn());\n this.metadataQueue_.caption.forEach(fn => fn());\n this.metadataQueue_.id3 = [];\n this.metadataQueue_.caption = [];\n }\n processCallQueue_() {\n const callQueue = this.callQueue_; // Clear out the queue before the queued functions are run, since some of the\n // functions may check the length of the load queue and default to pushing themselves\n // back onto the queue.\n\n this.callQueue_ = [];\n callQueue.forEach(fun => fun());\n }\n processLoadQueue_() {\n const loadQueue = this.loadQueue_; // Clear out the queue before the queued functions are run, since some of the\n // functions may check the length of the load queue and default to pushing themselves\n // back onto the queue.\n\n this.loadQueue_ = [];\n loadQueue.forEach(fun => fun());\n }\n /**\n * Determines whether the loader has enough info to load the next segment.\n *\n * @return {boolean}\n * Whether or not the loader has enough info to load the next segment\n */\n\n hasEnoughInfoToLoad_() {\n // Since primary timing goes by video, only the audio loader potentially needs to wait\n // to load.\n if (this.loaderType_ !== 'audio') {\n return true;\n }\n const segmentInfo = this.pendingSegment_; // A fill buffer must have already run to establish a pending segment before there's\n // enough info to load.\n\n if (!segmentInfo) {\n return false;\n } // The first segment can and should be loaded immediately so that source buffers are\n // created together (before appending). Source buffer creation uses the presence of\n // audio and video data to determine whether to create audio/video source buffers, and\n // uses processed (transmuxed or parsed) media to determine the types required.\n\n if (!this.getCurrentMediaInfo_()) {\n return true;\n }\n if (\n // Technically, instead of waiting to load a segment on timeline changes, a segment\n // can be requested and downloaded and only wait before it is transmuxed or parsed.\n // But in practice, there are a few reasons why it is better to wait until a loader\n // is ready to append that segment before requesting and downloading:\n //\n // 1. Because audio and main loaders cross discontinuities together, if this loader\n // is waiting for the other to catch up, then instead of requesting another\n // segment and using up more bandwidth, by not yet loading, more bandwidth is\n // allotted to the loader currently behind.\n // 2. media-segment-request doesn't have to have logic to consider whether a segment\n // is ready to be processed or not, isolating the queueing behavior to the loader.\n // 3. The audio loader bases some of its segment properties on timing information\n // provided by the main loader, meaning that, if the logic for waiting on\n // processing was in media-segment-request, then it would also need to know how\n // to re-generate the segment information after the main loader caught up.\n shouldWaitForTimelineChange({\n timelineChangeController: this.timelineChangeController_,\n currentTimeline: this.currentTimeline_,\n segmentTimeline: segmentInfo.timeline,\n loaderType: this.loaderType_,\n audioDisabled: this.audioDisabled_\n })) {\n return false;\n }\n return true;\n }\n getCurrentMediaInfo_(segmentInfo = this.pendingSegment_) {\n return segmentInfo && segmentInfo.trackInfo || this.currentMediaInfo_;\n }\n getMediaInfo_(segmentInfo = this.pendingSegment_) {\n return this.getCurrentMediaInfo_(segmentInfo) || this.startingMediaInfo_;\n }\n getPendingSegmentPlaylist() {\n return this.pendingSegment_ ? this.pendingSegment_.playlist : null;\n }\n hasEnoughInfoToAppend_() {\n if (!this.sourceUpdater_.ready()) {\n return false;\n } // If content needs to be removed or the loader is waiting on an append reattempt,\n // then no additional content should be appended until the prior append is resolved.\n\n if (this.waitingOnRemove_ || this.quotaExceededErrorRetryTimeout_) {\n return false;\n }\n const segmentInfo = this.pendingSegment_;\n const trackInfo = this.getCurrentMediaInfo_(); // no segment to append any data for or\n // we do not have information on this specific\n // segment yet\n\n if (!segmentInfo || !trackInfo) {\n return false;\n }\n const {\n hasAudio,\n hasVideo,\n isMuxed\n } = trackInfo;\n if (hasVideo && !segmentInfo.videoTimingInfo) {\n return false;\n } // muxed content only relies on video timing information for now.\n\n if (hasAudio && !this.audioDisabled_ && !isMuxed && !segmentInfo.audioTimingInfo) {\n return false;\n } // we need to allow an append here even if we're moving to different timelines.\n\n if (shouldWaitForTimelineChange({\n timelineChangeController: this.timelineChangeController_,\n currentTimeline: this.currentTimeline_,\n segmentTimeline: segmentInfo.timeline,\n loaderType: this.loaderType_,\n audioDisabled: this.audioDisabled_\n })) {\n return false;\n }\n return true;\n }\n handleData_(simpleSegment, result) {\n this.earlyAbortWhenNeeded_(simpleSegment.stats);\n if (this.checkForAbort_(simpleSegment.requestId)) {\n return;\n } // If there's anything in the call queue, then this data came later and should be\n // executed after the calls currently queued.\n\n if (this.callQueue_.length || !this.hasEnoughInfoToAppend_()) {\n checkAndFixTimelines(this);\n this.callQueue_.push(this.handleData_.bind(this, simpleSegment, result));\n return;\n }\n const segmentInfo = this.pendingSegment_; // update the time mapping so we can translate from display time to media time\n\n this.setTimeMapping_(segmentInfo.timeline); // for tracking overall stats\n\n this.updateMediaSecondsLoaded_(segmentInfo.part || segmentInfo.segment); // Note that the state isn't changed from loading to appending. This is because abort\n // logic may change behavior depending on the state, and changing state too early may\n // inflate our estimates of bandwidth. In the future this should be re-examined to\n // note more granular states.\n // don't process and append data if the mediaSource is closed\n\n if (this.mediaSource_.readyState === 'closed') {\n return;\n } // if this request included an initialization segment, save that data\n // to the initSegment cache\n\n if (simpleSegment.map) {\n simpleSegment.map = this.initSegmentForMap(simpleSegment.map, true); // move over init segment properties to media request\n\n segmentInfo.segment.map = simpleSegment.map;\n } // if this request included a segment key, save that data in the cache\n\n if (simpleSegment.key) {\n this.segmentKey(simpleSegment.key, true);\n }\n segmentInfo.isFmp4 = simpleSegment.isFmp4;\n segmentInfo.timingInfo = segmentInfo.timingInfo || {};\n if (segmentInfo.isFmp4) {\n this.trigger('fmp4');\n segmentInfo.timingInfo.start = segmentInfo[timingInfoPropertyForMedia(result.type)].start;\n } else {\n const trackInfo = this.getCurrentMediaInfo_();\n const useVideoTimingInfo = this.loaderType_ === 'main' && trackInfo && trackInfo.hasVideo;\n let firstVideoFrameTimeForData;\n if (useVideoTimingInfo) {\n firstVideoFrameTimeForData = segmentInfo.videoTimingInfo.start;\n } // Segment loader knows more about segment timing than the transmuxer (in certain\n // aspects), so make any changes required for a more accurate start time.\n // Don't set the end time yet, as the segment may not be finished processing.\n\n segmentInfo.timingInfo.start = this.trueSegmentStart_({\n currentStart: segmentInfo.timingInfo.start,\n playlist: segmentInfo.playlist,\n mediaIndex: segmentInfo.mediaIndex,\n currentVideoTimestampOffset: this.sourceUpdater_.videoTimestampOffset(),\n useVideoTimingInfo,\n firstVideoFrameTimeForData,\n videoTimingInfo: segmentInfo.videoTimingInfo,\n audioTimingInfo: segmentInfo.audioTimingInfo\n });\n } // Init segments for audio and video only need to be appended in certain cases. Now\n // that data is about to be appended, we can check the final cases to determine\n // whether we should append an init segment.\n\n this.updateAppendInitSegmentStatus(segmentInfo, result.type); // Timestamp offset should be updated once we get new data and have its timing info,\n // as we use the start of the segment to offset the best guess (playlist provided)\n // timestamp offset.\n\n this.updateSourceBufferTimestampOffset_(segmentInfo); // if this is a sync request we need to determine whether it should\n // be appended or not.\n\n if (segmentInfo.isSyncRequest) {\n // first save/update our timing info for this segment.\n // this is what allows us to choose an accurate segment\n // and the main reason we make a sync request.\n this.updateTimingInfoEnd_(segmentInfo);\n this.syncController_.saveSegmentTimingInfo({\n segmentInfo,\n shouldSaveTimelineMapping: this.loaderType_ === 'main'\n });\n const next = this.chooseNextRequest_(); // If the sync request isn't the segment that would be requested next\n // after taking into account its timing info, do not append it.\n\n if (next.mediaIndex !== segmentInfo.mediaIndex || next.partIndex !== segmentInfo.partIndex) {\n this.logger_('sync segment was incorrect, not appending');\n return;\n } // otherwise append it like any other segment as our guess was correct.\n\n this.logger_('sync segment was correct, appending');\n } // Save some state so that in the future anything waiting on first append (and/or\n // timestamp offset(s)) can process immediately. While the extra state isn't optimal,\n // we need some notion of whether the timestamp offset or other relevant information\n // has had a chance to be set.\n\n segmentInfo.hasAppendedData_ = true; // Now that the timestamp offset should be set, we can append any waiting ID3 tags.\n\n this.processMetadataQueue_();\n this.appendData_(segmentInfo, result);\n }\n updateAppendInitSegmentStatus(segmentInfo, type) {\n // alt audio doesn't manage timestamp offset\n if (this.loaderType_ === 'main' && typeof segmentInfo.timestampOffset === 'number' &&\n // in the case that we're handling partial data, we don't want to append an init\n // segment for each chunk\n !segmentInfo.changedTimestampOffset) {\n // if the timestamp offset changed, the timeline may have changed, so we have to re-\n // append init segments\n this.appendInitSegment_ = {\n audio: true,\n video: true\n };\n }\n if (this.playlistOfLastInitSegment_[type] !== segmentInfo.playlist) {\n // make sure we append init segment on playlist changes, in case the media config\n // changed\n this.appendInitSegment_[type] = true;\n }\n }\n getInitSegmentAndUpdateState_({\n type,\n initSegment,\n map,\n playlist\n }) {\n // \"The EXT-X-MAP tag specifies how to obtain the Media Initialization Section\n // (Section 3) required to parse the applicable Media Segments. It applies to every\n // Media Segment that appears after it in the Playlist until the next EXT-X-MAP tag\n // or until the end of the playlist.\"\n // https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-4.3.2.5\n if (map) {\n const id = initSegmentId(map);\n if (this.activeInitSegmentId_ === id) {\n // don't need to re-append the init segment if the ID matches\n return null;\n } // a map-specified init segment takes priority over any transmuxed (or otherwise\n // obtained) init segment\n //\n // this also caches the init segment for later use\n\n initSegment = this.initSegmentForMap(map, true).bytes;\n this.activeInitSegmentId_ = id;\n } // We used to always prepend init segments for video, however, that shouldn't be\n // necessary. Instead, we should only append on changes, similar to what we've always\n // done for audio. This is more important (though may not be that important) for\n // frame-by-frame appending for LHLS, simply because of the increased quantity of\n // appends.\n\n if (initSegment && this.appendInitSegment_[type]) {\n // Make sure we track the playlist that we last used for the init segment, so that\n // we can re-append the init segment in the event that we get data from a new\n // playlist. Discontinuities and track changes are handled in other sections.\n this.playlistOfLastInitSegment_[type] = playlist; // Disable future init segment appends for this type. Until a change is necessary.\n\n this.appendInitSegment_[type] = false; // we need to clear out the fmp4 active init segment id, since\n // we are appending the muxer init segment\n\n this.activeInitSegmentId_ = null;\n return initSegment;\n }\n return null;\n }\n handleQuotaExceededError_({\n segmentInfo,\n type,\n bytes\n }, error) {\n const audioBuffered = this.sourceUpdater_.audioBuffered();\n const videoBuffered = this.sourceUpdater_.videoBuffered(); // For now we're ignoring any notion of gaps in the buffer, but they, in theory,\n // should be cleared out during the buffer removals. However, log in case it helps\n // debug.\n\n if (audioBuffered.length > 1) {\n this.logger_('On QUOTA_EXCEEDED_ERR, found gaps in the audio buffer: ' + timeRangesToArray(audioBuffered).join(', '));\n }\n if (videoBuffered.length > 1) {\n this.logger_('On QUOTA_EXCEEDED_ERR, found gaps in the video buffer: ' + timeRangesToArray(videoBuffered).join(', '));\n }\n const audioBufferStart = audioBuffered.length ? audioBuffered.start(0) : 0;\n const audioBufferEnd = audioBuffered.length ? audioBuffered.end(audioBuffered.length - 1) : 0;\n const videoBufferStart = videoBuffered.length ? videoBuffered.start(0) : 0;\n const videoBufferEnd = videoBuffered.length ? videoBuffered.end(videoBuffered.length - 1) : 0;\n if (audioBufferEnd - audioBufferStart <= MIN_BACK_BUFFER && videoBufferEnd - videoBufferStart <= MIN_BACK_BUFFER) {\n // Can't remove enough buffer to make room for new segment (or the browser doesn't\n // allow for appends of segments this size). In the future, it may be possible to\n // split up the segment and append in pieces, but for now, error out this playlist\n // in an attempt to switch to a more manageable rendition.\n this.logger_('On QUOTA_EXCEEDED_ERR, single segment too large to append to ' + 'buffer, triggering an error. ' + `Appended byte length: ${bytes.byteLength}, ` + `audio buffer: ${timeRangesToArray(audioBuffered).join(', ')}, ` + `video buffer: ${timeRangesToArray(videoBuffered).join(', ')}, `);\n this.error({\n message: 'Quota exceeded error with append of a single segment of content',\n excludeUntil: Infinity\n });\n this.trigger('error');\n return;\n } // To try to resolve the quota exceeded error, clear back buffer and retry. This means\n // that the segment-loader should block on future events until this one is handled, so\n // that it doesn't keep moving onto further segments. Adding the call to the call\n // queue will prevent further appends until waitingOnRemove_ and\n // quotaExceededErrorRetryTimeout_ are cleared.\n //\n // Note that this will only block the current loader. In the case of demuxed content,\n // the other load may keep filling as fast as possible. In practice, this should be\n // OK, as it is a rare case when either audio has a high enough bitrate to fill up a\n // source buffer, or video fills without enough room for audio to append (and without\n // the availability of clearing out seconds of back buffer to make room for audio).\n // But it might still be good to handle this case in the future as a TODO.\n\n this.waitingOnRemove_ = true;\n this.callQueue_.push(this.appendToSourceBuffer_.bind(this, {\n segmentInfo,\n type,\n bytes\n }));\n const currentTime = this.currentTime_(); // Try to remove as much audio and video as possible to make room for new content\n // before retrying.\n\n const timeToRemoveUntil = currentTime - MIN_BACK_BUFFER;\n this.logger_(`On QUOTA_EXCEEDED_ERR, removing audio/video from 0 to ${timeToRemoveUntil}`);\n this.remove(0, timeToRemoveUntil, () => {\n this.logger_(`On QUOTA_EXCEEDED_ERR, retrying append in ${MIN_BACK_BUFFER}s`);\n this.waitingOnRemove_ = false; // wait the length of time alotted in the back buffer to prevent wasted\n // attempts (since we can't clear less than the minimum)\n\n this.quotaExceededErrorRetryTimeout_ = window$1.setTimeout(() => {\n this.logger_('On QUOTA_EXCEEDED_ERR, re-processing call queue');\n this.quotaExceededErrorRetryTimeout_ = null;\n this.processCallQueue_();\n }, MIN_BACK_BUFFER * 1000);\n }, true);\n }\n handleAppendError_({\n segmentInfo,\n type,\n bytes\n }, error) {\n // if there's no error, nothing to do\n if (!error) {\n return;\n }\n if (error.code === QUOTA_EXCEEDED_ERR) {\n this.handleQuotaExceededError_({\n segmentInfo,\n type,\n bytes\n }); // A quota exceeded error should be recoverable with a future re-append, so no need\n // to trigger an append error.\n\n return;\n }\n this.logger_('Received non QUOTA_EXCEEDED_ERR on append', error); // If an append errors, we often can't recover.\n // (see https://w3c.github.io/media-source/#sourcebuffer-append-error).\n //\n // Trigger a special error so that it can be handled separately from normal,\n // recoverable errors.\n\n this.error({\n message: `${type} append of ${bytes.length}b failed for segment ` + `#${segmentInfo.mediaIndex} in playlist ${segmentInfo.playlist.id}`,\n metadata: {\n errorType: videojs.Error.StreamingFailedToAppendSegment\n }\n });\n this.trigger('appenderror');\n }\n appendToSourceBuffer_({\n segmentInfo,\n type,\n initSegment,\n data,\n bytes\n }) {\n // If this is a re-append, bytes were already created and don't need to be recreated\n if (!bytes) {\n const segments = [data];\n let byteLength = data.byteLength;\n if (initSegment) {\n // if the media initialization segment is changing, append it before the content\n // segment\n segments.unshift(initSegment);\n byteLength += initSegment.byteLength;\n } // Technically we should be OK appending the init segment separately, however, we\n // haven't yet tested that, and prepending is how we have always done things.\n\n bytes = concatSegments({\n bytes: byteLength,\n segments\n });\n }\n const metadata = {\n segmentInfo: segmentInfoPayload({\n type: this.loaderType_,\n segment: segmentInfo\n })\n };\n this.trigger({\n type: 'segmentappendstart',\n metadata\n });\n this.sourceUpdater_.appendBuffer({\n segmentInfo,\n type,\n bytes\n }, this.handleAppendError_.bind(this, {\n segmentInfo,\n type,\n bytes\n }));\n }\n handleSegmentTimingInfo_(type, requestId, segmentTimingInfo) {\n if (!this.pendingSegment_ || requestId !== this.pendingSegment_.requestId) {\n return;\n }\n const segment = this.pendingSegment_.segment;\n const timingInfoProperty = `${type}TimingInfo`;\n if (!segment[timingInfoProperty]) {\n segment[timingInfoProperty] = {};\n }\n segment[timingInfoProperty].transmuxerPrependedSeconds = segmentTimingInfo.prependedContentDuration || 0;\n segment[timingInfoProperty].transmuxedPresentationStart = segmentTimingInfo.start.presentation;\n segment[timingInfoProperty].transmuxedDecodeStart = segmentTimingInfo.start.decode;\n segment[timingInfoProperty].transmuxedPresentationEnd = segmentTimingInfo.end.presentation;\n segment[timingInfoProperty].transmuxedDecodeEnd = segmentTimingInfo.end.decode; // mainly used as a reference for debugging\n\n segment[timingInfoProperty].baseMediaDecodeTime = segmentTimingInfo.baseMediaDecodeTime;\n }\n appendData_(segmentInfo, result) {\n const {\n type,\n data\n } = result;\n if (!data || !data.byteLength) {\n return;\n }\n if (type === 'audio' && this.audioDisabled_) {\n return;\n }\n const initSegment = this.getInitSegmentAndUpdateState_({\n type,\n initSegment: result.initSegment,\n playlist: segmentInfo.playlist,\n map: segmentInfo.isFmp4 ? segmentInfo.segment.map : null\n });\n this.appendToSourceBuffer_({\n segmentInfo,\n type,\n initSegment,\n data\n });\n }\n /**\n * load a specific segment from a request into the buffer\n *\n * @private\n */\n\n loadSegment_(segmentInfo) {\n this.state = 'WAITING';\n this.pendingSegment_ = segmentInfo;\n this.trimBackBuffer_(segmentInfo);\n if (typeof segmentInfo.timestampOffset === 'number') {\n if (this.transmuxer_) {\n this.transmuxer_.postMessage({\n action: 'clearAllMp4Captions'\n });\n }\n }\n if (!this.hasEnoughInfoToLoad_()) {\n checkAndFixTimelines(this);\n this.loadQueue_.push(() => {\n // regenerate the audioAppendStart, timestampOffset, etc as they\n // may have changed since this function was added to the queue.\n const options = _extends({}, segmentInfo, {\n forceTimestampOffset: true\n });\n _extends(segmentInfo, this.generateSegmentInfo_(options));\n this.isPendingTimestampOffset_ = false;\n this.updateTransmuxerAndRequestSegment_(segmentInfo);\n });\n return;\n }\n this.updateTransmuxerAndRequestSegment_(segmentInfo);\n }\n updateTransmuxerAndRequestSegment_(segmentInfo) {\n // We'll update the source buffer's timestamp offset once we have transmuxed data, but\n // the transmuxer still needs to be updated before then.\n //\n // Even though keepOriginalTimestamps is set to true for the transmuxer, timestamp\n // offset must be passed to the transmuxer for stream correcting adjustments.\n if (this.shouldUpdateTransmuxerTimestampOffset_(segmentInfo.timestampOffset)) {\n this.gopBuffer_.length = 0; // gopsToAlignWith was set before the GOP buffer was cleared\n\n segmentInfo.gopsToAlignWith = [];\n this.timeMapping_ = 0; // reset values in the transmuxer since a discontinuity should start fresh\n\n this.transmuxer_.postMessage({\n action: 'reset'\n });\n this.transmuxer_.postMessage({\n action: 'setTimestampOffset',\n timestampOffset: segmentInfo.timestampOffset\n });\n }\n const simpleSegment = this.createSimplifiedSegmentObj_(segmentInfo);\n const isEndOfStream = this.isEndOfStream_(segmentInfo.mediaIndex, segmentInfo.playlist, segmentInfo.partIndex);\n const isWalkingForward = this.mediaIndex !== null;\n const isDiscontinuity = segmentInfo.timeline !== this.currentTimeline_ &&\n // currentTimeline starts at -1, so we shouldn't end the timeline switching to 0,\n // the first timeline\n segmentInfo.timeline > 0;\n const isEndOfTimeline = isEndOfStream || isWalkingForward && isDiscontinuity;\n this.logger_(`Requesting\n${compactSegmentUrlDescription(segmentInfo.uri)}\n${segmentInfoString(segmentInfo)}`); // If there's an init segment associated with this segment, but it is not cached (identified by a lack of bytes),\n // then this init segment has never been seen before and should be appended.\n //\n // At this point the content type (audio/video or both) is not yet known, but it should be safe to set\n // both to true and leave the decision of whether to append the init segment to append time.\n\n if (simpleSegment.map && !simpleSegment.map.bytes) {\n this.logger_('going to request init segment.');\n this.appendInitSegment_ = {\n video: true,\n audio: true\n };\n }\n segmentInfo.abortRequests = mediaSegmentRequest({\n xhr: this.vhs_.xhr,\n xhrOptions: this.xhrOptions_,\n decryptionWorker: this.decrypter_,\n segment: simpleSegment,\n abortFn: this.handleAbort_.bind(this, segmentInfo),\n progressFn: this.handleProgress_.bind(this),\n trackInfoFn: this.handleTrackInfo_.bind(this),\n timingInfoFn: this.handleTimingInfo_.bind(this),\n videoSegmentTimingInfoFn: this.handleSegmentTimingInfo_.bind(this, 'video', segmentInfo.requestId),\n audioSegmentTimingInfoFn: this.handleSegmentTimingInfo_.bind(this, 'audio', segmentInfo.requestId),\n captionsFn: this.handleCaptions_.bind(this),\n isEndOfTimeline,\n endedTimelineFn: () => {\n this.logger_('received endedtimeline callback');\n },\n id3Fn: this.handleId3_.bind(this),\n dataFn: this.handleData_.bind(this),\n doneFn: this.segmentRequestFinished_.bind(this),\n onTransmuxerLog: ({\n message,\n level,\n stream\n }) => {\n this.logger_(`${segmentInfoString(segmentInfo)} logged from transmuxer stream ${stream} as a ${level}: ${message}`);\n },\n triggerSegmentEventFn: ({\n type,\n segment,\n keyInfo,\n trackInfo,\n timingInfo\n }) => {\n const segInfo = segmentInfoPayload({\n segment\n });\n const metadata = {\n segmentInfo: segInfo\n }; // add other properties if necessary.\n\n if (keyInfo) {\n metadata.keyInfo = keyInfo;\n }\n if (trackInfo) {\n metadata.trackInfo = trackInfo;\n }\n if (timingInfo) {\n metadata.timingInfo = timingInfo;\n }\n this.trigger({\n type,\n metadata\n });\n }\n });\n }\n /**\n * trim the back buffer so that we don't have too much data\n * in the source buffer\n *\n * @private\n *\n * @param {Object} segmentInfo - the current segment\n */\n\n trimBackBuffer_(segmentInfo) {\n const removeToTime = safeBackBufferTrimTime(this.seekable_(), this.currentTime_(), this.playlist_.targetDuration || 10); // Chrome has a hard limit of 150MB of\n // buffer and a very conservative \"garbage collector\"\n // We manually clear out the old buffer to ensure\n // we don't trigger the QuotaExceeded error\n // on the source buffer during subsequent appends\n\n if (removeToTime > 0) {\n this.remove(0, removeToTime);\n }\n }\n /**\n * created a simplified copy of the segment object with just the\n * information necessary to perform the XHR and decryption\n *\n * @private\n *\n * @param {Object} segmentInfo - the current segment\n * @return {Object} a simplified segment object copy\n */\n\n createSimplifiedSegmentObj_(segmentInfo) {\n const segment = segmentInfo.segment;\n const part = segmentInfo.part;\n const isEncrypted = segmentInfo.segment.key || segmentInfo.segment.map && segmentInfo.segment.map.key;\n const isMediaInitialization = segmentInfo.segment.map && !segmentInfo.segment.map.bytes;\n const simpleSegment = {\n resolvedUri: part ? part.resolvedUri : segment.resolvedUri,\n byterange: part ? part.byterange : segment.byterange,\n requestId: segmentInfo.requestId,\n transmuxer: segmentInfo.transmuxer,\n audioAppendStart: segmentInfo.audioAppendStart,\n gopsToAlignWith: segmentInfo.gopsToAlignWith,\n part: segmentInfo.part,\n type: this.loaderType_,\n start: segmentInfo.startOfSegment,\n duration: segmentInfo.duration,\n isEncrypted,\n isMediaInitialization\n };\n const previousSegment = segmentInfo.playlist.segments[segmentInfo.mediaIndex - 1];\n if (previousSegment && previousSegment.timeline === segment.timeline) {\n // The baseStartTime of a segment is used to handle rollover when probing the TS\n // segment to retrieve timing information. Since the probe only looks at the media's\n // times (e.g., PTS and DTS values of the segment), and doesn't consider the\n // player's time (e.g., player.currentTime()), baseStartTime should reflect the\n // media time as well. transmuxedDecodeEnd represents the end time of a segment, in\n // seconds of media time, so should be used here. The previous segment is used since\n // the end of the previous segment should represent the beginning of the current\n // segment, so long as they are on the same timeline.\n if (previousSegment.videoTimingInfo) {\n simpleSegment.baseStartTime = previousSegment.videoTimingInfo.transmuxedDecodeEnd;\n } else if (previousSegment.audioTimingInfo) {\n simpleSegment.baseStartTime = previousSegment.audioTimingInfo.transmuxedDecodeEnd;\n }\n }\n if (segment.key) {\n // if the media sequence is greater than 2^32, the IV will be incorrect\n // assuming 10s segments, that would be about 1300 years\n const iv = segment.key.iv || new Uint32Array([0, 0, 0, segmentInfo.mediaIndex + segmentInfo.playlist.mediaSequence]);\n simpleSegment.key = this.segmentKey(segment.key);\n simpleSegment.key.iv = iv;\n }\n if (segment.map) {\n simpleSegment.map = this.initSegmentForMap(segment.map);\n }\n return simpleSegment;\n }\n saveTransferStats_(stats) {\n // every request counts as a media request even if it has been aborted\n // or canceled due to a timeout\n this.mediaRequests += 1;\n if (stats) {\n this.mediaBytesTransferred += stats.bytesReceived;\n this.mediaTransferDuration += stats.roundTripTime;\n }\n }\n saveBandwidthRelatedStats_(duration, stats) {\n // byteLength will be used for throughput, and should be based on bytes receieved,\n // which we only know at the end of the request and should reflect total bytes\n // downloaded rather than just bytes processed from components of the segment\n this.pendingSegment_.byteLength = stats.bytesReceived;\n if (duration < MIN_SEGMENT_DURATION_TO_SAVE_STATS) {\n this.logger_(`Ignoring segment's bandwidth because its duration of ${duration}` + ` is less than the min to record ${MIN_SEGMENT_DURATION_TO_SAVE_STATS}`);\n return;\n }\n const metadata = {\n bandwidthInfo: {\n from: this.bandwidth,\n to: stats.bandwidth\n }\n }; // player event with payload\n\n this.trigger({\n type: 'bandwidthupdated',\n metadata\n });\n this.bandwidth = stats.bandwidth;\n this.roundTrip = stats.roundTripTime;\n }\n handleTimeout_() {\n // although the VTT segment loader bandwidth isn't really used, it's good to\n // maintain functinality between segment loaders\n this.mediaRequestsTimedout += 1;\n this.bandwidth = 1;\n this.roundTrip = NaN;\n this.trigger('bandwidthupdate');\n this.trigger('timeout');\n }\n /**\n * Handle the callback from the segmentRequest function and set the\n * associated SegmentLoader state and errors if necessary\n *\n * @private\n */\n\n segmentRequestFinished_(error, simpleSegment, result) {\n // TODO handle special cases, e.g., muxed audio/video but only audio in the segment\n // check the call queue directly since this function doesn't need to deal with any\n // data, and can continue even if the source buffers are not set up and we didn't get\n // any data from the segment\n if (this.callQueue_.length) {\n this.callQueue_.push(this.segmentRequestFinished_.bind(this, error, simpleSegment, result));\n return;\n }\n this.saveTransferStats_(simpleSegment.stats); // The request was aborted and the SegmentLoader has already been reset\n\n if (!this.pendingSegment_) {\n return;\n } // the request was aborted and the SegmentLoader has already started\n // another request. this can happen when the timeout for an aborted\n // request triggers due to a limitation in the XHR library\n // do not count this as any sort of request or we risk double-counting\n\n if (simpleSegment.requestId !== this.pendingSegment_.requestId) {\n return;\n } // an error occurred from the active pendingSegment_ so reset everything\n\n if (error) {\n this.pendingSegment_ = null;\n this.state = 'READY'; // aborts are not a true error condition and nothing corrective needs to be done\n\n if (error.code === REQUEST_ERRORS.ABORTED) {\n return;\n }\n this.pause(); // the error is really just that at least one of the requests timed-out\n // set the bandwidth to a very low value and trigger an ABR switch to\n // take emergency action\n\n if (error.code === REQUEST_ERRORS.TIMEOUT) {\n this.handleTimeout_();\n return;\n } // if control-flow has arrived here, then the error is real\n // emit an error event to exclude the current playlist\n\n this.mediaRequestsErrored += 1;\n this.error(error);\n this.trigger('error');\n return;\n }\n const segmentInfo = this.pendingSegment_; // the response was a success so set any bandwidth stats the request\n // generated for ABR purposes\n\n this.saveBandwidthRelatedStats_(segmentInfo.duration, simpleSegment.stats);\n segmentInfo.endOfAllRequests = simpleSegment.endOfAllRequests;\n if (result.gopInfo) {\n this.gopBuffer_ = updateGopBuffer(this.gopBuffer_, result.gopInfo, this.safeAppend_);\n } // Although we may have already started appending on progress, we shouldn't switch the\n // state away from loading until we are officially done loading the segment data.\n\n this.state = 'APPENDING'; // used for testing\n\n this.trigger('appending');\n this.waitForAppendsToComplete_(segmentInfo);\n }\n setTimeMapping_(timeline) {\n const timelineMapping = this.syncController_.mappingForTimeline(timeline);\n if (timelineMapping !== null) {\n this.timeMapping_ = timelineMapping;\n }\n }\n updateMediaSecondsLoaded_(segment) {\n if (typeof segment.start === 'number' && typeof segment.end === 'number') {\n this.mediaSecondsLoaded += segment.end - segment.start;\n } else {\n this.mediaSecondsLoaded += segment.duration;\n }\n }\n shouldUpdateTransmuxerTimestampOffset_(timestampOffset) {\n if (timestampOffset === null) {\n return false;\n } // note that we're potentially using the same timestamp offset for both video and\n // audio\n\n if (this.loaderType_ === 'main' && timestampOffset !== this.sourceUpdater_.videoTimestampOffset()) {\n return true;\n }\n if (!this.audioDisabled_ && timestampOffset !== this.sourceUpdater_.audioTimestampOffset()) {\n return true;\n }\n return false;\n }\n trueSegmentStart_({\n currentStart,\n playlist,\n mediaIndex,\n firstVideoFrameTimeForData,\n currentVideoTimestampOffset,\n useVideoTimingInfo,\n videoTimingInfo,\n audioTimingInfo\n }) {\n if (typeof currentStart !== 'undefined') {\n // if start was set once, keep using it\n return currentStart;\n }\n if (!useVideoTimingInfo) {\n return audioTimingInfo.start;\n }\n const previousSegment = playlist.segments[mediaIndex - 1]; // The start of a segment should be the start of the first full frame contained\n // within that segment. Since the transmuxer maintains a cache of incomplete data\n // from and/or the last frame seen, the start time may reflect a frame that starts\n // in the previous segment. Check for that case and ensure the start time is\n // accurate for the segment.\n\n if (mediaIndex === 0 || !previousSegment || typeof previousSegment.start === 'undefined' || previousSegment.end !== firstVideoFrameTimeForData + currentVideoTimestampOffset) {\n return firstVideoFrameTimeForData;\n }\n return videoTimingInfo.start;\n }\n waitForAppendsToComplete_(segmentInfo) {\n const trackInfo = this.getCurrentMediaInfo_(segmentInfo);\n if (!trackInfo) {\n this.error({\n message: 'No starting media returned, likely due to an unsupported media format.',\n playlistExclusionDuration: Infinity\n });\n this.trigger('error');\n return;\n } // Although transmuxing is done, appends may not yet be finished. Throw a marker\n // on each queue this loader is responsible for to ensure that the appends are\n // complete.\n\n const {\n hasAudio,\n hasVideo,\n isMuxed\n } = trackInfo;\n const waitForVideo = this.loaderType_ === 'main' && hasVideo;\n const waitForAudio = !this.audioDisabled_ && hasAudio && !isMuxed;\n segmentInfo.waitingOnAppends = 0; // segments with no data\n\n if (!segmentInfo.hasAppendedData_) {\n if (!segmentInfo.timingInfo && typeof segmentInfo.timestampOffset === 'number') {\n // When there's no audio or video data in the segment, there's no audio or video\n // timing information.\n //\n // If there's no audio or video timing information, then the timestamp offset\n // can't be adjusted to the appropriate value for the transmuxer and source\n // buffers.\n //\n // Therefore, the next segment should be used to set the timestamp offset.\n this.isPendingTimestampOffset_ = true;\n } // override settings for metadata only segments\n\n segmentInfo.timingInfo = {\n start: 0\n };\n segmentInfo.waitingOnAppends++;\n if (!this.isPendingTimestampOffset_) {\n // update the timestampoffset\n this.updateSourceBufferTimestampOffset_(segmentInfo); // make sure the metadata queue is processed even though we have\n // no video/audio data.\n\n this.processMetadataQueue_();\n } // append is \"done\" instantly with no data.\n\n this.checkAppendsDone_(segmentInfo);\n return;\n } // Since source updater could call back synchronously, do the increments first.\n\n if (waitForVideo) {\n segmentInfo.waitingOnAppends++;\n }\n if (waitForAudio) {\n segmentInfo.waitingOnAppends++;\n }\n if (waitForVideo) {\n this.sourceUpdater_.videoQueueCallback(this.checkAppendsDone_.bind(this, segmentInfo));\n }\n if (waitForAudio) {\n this.sourceUpdater_.audioQueueCallback(this.checkAppendsDone_.bind(this, segmentInfo));\n }\n }\n checkAppendsDone_(segmentInfo) {\n if (this.checkForAbort_(segmentInfo.requestId)) {\n return;\n }\n segmentInfo.waitingOnAppends--;\n if (segmentInfo.waitingOnAppends === 0) {\n this.handleAppendsDone_();\n }\n }\n checkForIllegalMediaSwitch(trackInfo) {\n const illegalMediaSwitchError = illegalMediaSwitch(this.loaderType_, this.getCurrentMediaInfo_(), trackInfo);\n if (illegalMediaSwitchError) {\n this.error({\n message: illegalMediaSwitchError,\n playlistExclusionDuration: Infinity\n });\n this.trigger('error');\n return true;\n }\n return false;\n }\n updateSourceBufferTimestampOffset_(segmentInfo) {\n if (segmentInfo.timestampOffset === null ||\n // we don't yet have the start for whatever media type (video or audio) has\n // priority, timing-wise, so we must wait\n typeof segmentInfo.timingInfo.start !== 'number' ||\n // already updated the timestamp offset for this segment\n segmentInfo.changedTimestampOffset ||\n // the alt audio loader should not be responsible for setting the timestamp offset\n this.loaderType_ !== 'main') {\n return;\n }\n let didChange = false; // Primary timing goes by video, and audio is trimmed in the transmuxer, meaning that\n // the timing info here comes from video. In the event that the audio is longer than\n // the video, this will trim the start of the audio.\n // This also trims any offset from 0 at the beginning of the media\n\n segmentInfo.timestampOffset -= this.getSegmentStartTimeForTimestampOffsetCalculation_({\n videoTimingInfo: segmentInfo.segment.videoTimingInfo,\n audioTimingInfo: segmentInfo.segment.audioTimingInfo,\n timingInfo: segmentInfo.timingInfo\n }); // In the event that there are part segment downloads, each will try to update the\n // timestamp offset. Retaining this bit of state prevents us from updating in the\n // future (within the same segment), however, there may be a better way to handle it.\n\n segmentInfo.changedTimestampOffset = true;\n if (segmentInfo.timestampOffset !== this.sourceUpdater_.videoTimestampOffset()) {\n this.sourceUpdater_.videoTimestampOffset(segmentInfo.timestampOffset);\n didChange = true;\n }\n if (segmentInfo.timestampOffset !== this.sourceUpdater_.audioTimestampOffset()) {\n this.sourceUpdater_.audioTimestampOffset(segmentInfo.timestampOffset);\n didChange = true;\n }\n if (didChange) {\n this.trigger('timestampoffset');\n }\n }\n getSegmentStartTimeForTimestampOffsetCalculation_({\n videoTimingInfo,\n audioTimingInfo,\n timingInfo\n }) {\n if (!this.useDtsForTimestampOffset_) {\n return timingInfo.start;\n }\n if (videoTimingInfo && typeof videoTimingInfo.transmuxedDecodeStart === 'number') {\n return videoTimingInfo.transmuxedDecodeStart;\n } // handle audio only\n\n if (audioTimingInfo && typeof audioTimingInfo.transmuxedDecodeStart === 'number') {\n return audioTimingInfo.transmuxedDecodeStart;\n } // handle content not transmuxed (e.g., MP4)\n\n return timingInfo.start;\n }\n updateTimingInfoEnd_(segmentInfo) {\n segmentInfo.timingInfo = segmentInfo.timingInfo || {};\n const trackInfo = this.getMediaInfo_();\n const useVideoTimingInfo = this.loaderType_ === 'main' && trackInfo && trackInfo.hasVideo;\n const prioritizedTimingInfo = useVideoTimingInfo && segmentInfo.videoTimingInfo ? segmentInfo.videoTimingInfo : segmentInfo.audioTimingInfo;\n if (!prioritizedTimingInfo) {\n return;\n }\n segmentInfo.timingInfo.end = typeof prioritizedTimingInfo.end === 'number' ?\n // End time may not exist in a case where we aren't parsing the full segment (one\n // current example is the case of fmp4), so use the rough duration to calculate an\n // end time.\n prioritizedTimingInfo.end : prioritizedTimingInfo.start + segmentInfo.duration;\n }\n /**\n * callback to run when appendBuffer is finished. detects if we are\n * in a good state to do things with the data we got, or if we need\n * to wait for more\n *\n * @private\n */\n\n handleAppendsDone_() {\n // appendsdone can cause an abort\n if (this.pendingSegment_) {\n const metadata = {\n segmentInfo: segmentInfoPayload({\n type: this.loaderType_,\n segment: this.pendingSegment_\n })\n };\n this.trigger({\n type: 'appendsdone',\n metadata\n });\n }\n if (!this.pendingSegment_) {\n this.state = 'READY'; // TODO should this move into this.checkForAbort to speed up requests post abort in\n // all appending cases?\n\n if (!this.paused()) {\n this.monitorBuffer_();\n }\n return;\n }\n const segmentInfo = this.pendingSegment_;\n if (segmentInfo.part && segmentInfo.part.syncInfo) {\n // low-latency flow\n segmentInfo.part.syncInfo.markAppended();\n } else if (segmentInfo.segment.syncInfo) {\n // normal flow\n segmentInfo.segment.syncInfo.markAppended();\n } // Now that the end of the segment has been reached, we can set the end time. It's\n // best to wait until all appends are done so we're sure that the primary media is\n // finished (and we have its end time).\n\n this.updateTimingInfoEnd_(segmentInfo);\n if (this.shouldSaveSegmentTimingInfo_) {\n // Timeline mappings should only be saved for the main loader. This is for multiple\n // reasons:\n //\n // 1) Only one mapping is saved per timeline, meaning that if both the audio loader\n // and the main loader try to save the timeline mapping, whichever comes later\n // will overwrite the first. In theory this is OK, as the mappings should be the\n // same, however, it breaks for (2)\n // 2) In the event of a live stream, the initial live point will make for a somewhat\n // arbitrary mapping. If audio and video streams are not perfectly in-sync, then\n // the mapping will be off for one of the streams, dependent on which one was\n // first saved (see (1)).\n // 3) Primary timing goes by video in VHS, so the mapping should be video.\n //\n // Since the audio loader will wait for the main loader to load the first segment,\n // the main loader will save the first timeline mapping, and ensure that there won't\n // be a case where audio loads two segments without saving a mapping (thus leading\n // to missing segment timing info).\n this.syncController_.saveSegmentTimingInfo({\n segmentInfo,\n shouldSaveTimelineMapping: this.loaderType_ === 'main'\n });\n }\n const segmentDurationMessage = getTroublesomeSegmentDurationMessage(segmentInfo, this.sourceType_);\n if (segmentDurationMessage) {\n if (segmentDurationMessage.severity === 'warn') {\n videojs.log.warn(segmentDurationMessage.message);\n } else {\n this.logger_(segmentDurationMessage.message);\n }\n }\n this.recordThroughput_(segmentInfo);\n this.pendingSegment_ = null;\n this.state = 'READY';\n if (segmentInfo.isSyncRequest) {\n this.trigger('syncinfoupdate'); // if the sync request was not appended\n // then it was not the correct segment.\n // throw it away and use the data it gave us\n // to get the correct one.\n\n if (!segmentInfo.hasAppendedData_) {\n this.logger_(`Throwing away un-appended sync request ${segmentInfoString(segmentInfo)}`);\n return;\n }\n }\n this.logger_(`Appended ${segmentInfoString(segmentInfo)}`);\n this.addSegmentMetadataCue_(segmentInfo);\n this.fetchAtBuffer_ = true;\n if (this.currentTimeline_ !== segmentInfo.timeline) {\n this.timelineChangeController_.lastTimelineChange({\n type: this.loaderType_,\n from: this.currentTimeline_,\n to: segmentInfo.timeline\n }); // If audio is not disabled, the main segment loader is responsible for updating\n // the audio timeline as well. If the content is video only, this won't have any\n // impact.\n\n if (this.loaderType_ === 'main' && !this.audioDisabled_) {\n this.timelineChangeController_.lastTimelineChange({\n type: 'audio',\n from: this.currentTimeline_,\n to: segmentInfo.timeline\n });\n }\n }\n this.currentTimeline_ = segmentInfo.timeline; // We must update the syncinfo to recalculate the seekable range before\n // the following conditional otherwise it may consider this a bad \"guess\"\n // and attempt to resync when the post-update seekable window and live\n // point would mean that this was the perfect segment to fetch\n\n this.trigger('syncinfoupdate');\n const segment = segmentInfo.segment;\n const part = segmentInfo.part;\n const badSegmentGuess = segment.end && this.currentTime_() - segment.end > segmentInfo.playlist.targetDuration * 3;\n const badPartGuess = part && part.end && this.currentTime_() - part.end > segmentInfo.playlist.partTargetDuration * 3; // If we previously appended a segment/part that ends more than 3 part/targetDurations before\n // the currentTime_ that means that our conservative guess was too conservative.\n // In that case, reset the loader state so that we try to use any information gained\n // from the previous request to create a new, more accurate, sync-point.\n\n if (badSegmentGuess || badPartGuess) {\n this.logger_(`bad ${badSegmentGuess ? 'segment' : 'part'} ${segmentInfoString(segmentInfo)}`);\n this.resetEverything();\n return;\n }\n const isWalkingForward = this.mediaIndex !== null; // Don't do a rendition switch unless we have enough time to get a sync segment\n // and conservatively guess\n\n if (isWalkingForward) {\n this.trigger('bandwidthupdate');\n }\n this.trigger('progress');\n this.mediaIndex = segmentInfo.mediaIndex;\n this.partIndex = segmentInfo.partIndex; // any time an update finishes and the last segment is in the\n // buffer, end the stream. this ensures the \"ended\" event will\n // fire if playback reaches that point.\n\n if (this.isEndOfStream_(segmentInfo.mediaIndex, segmentInfo.playlist, segmentInfo.partIndex)) {\n this.endOfStream();\n } // used for testing\n\n this.trigger('appended');\n if (segmentInfo.hasAppendedData_) {\n this.mediaAppends++;\n }\n if (!this.paused()) {\n this.monitorBuffer_();\n }\n }\n /**\n * Records the current throughput of the decrypt, transmux, and append\n * portion of the semgment pipeline. `throughput.rate` is a the cumulative\n * moving average of the throughput. `throughput.count` is the number of\n * data points in the average.\n *\n * @private\n * @param {Object} segmentInfo the object returned by loadSegment\n */\n\n recordThroughput_(segmentInfo) {\n if (segmentInfo.duration < MIN_SEGMENT_DURATION_TO_SAVE_STATS) {\n this.logger_(`Ignoring segment's throughput because its duration of ${segmentInfo.duration}` + ` is less than the min to record ${MIN_SEGMENT_DURATION_TO_SAVE_STATS}`);\n return;\n }\n const rate = this.throughput.rate; // Add one to the time to ensure that we don't accidentally attempt to divide\n // by zero in the case where the throughput is ridiculously high\n\n const segmentProcessingTime = Date.now() - segmentInfo.endOfAllRequests + 1; // Multiply by 8000 to convert from bytes/millisecond to bits/second\n\n const segmentProcessingThroughput = Math.floor(segmentInfo.byteLength / segmentProcessingTime * 8 * 1000); // This is just a cumulative moving average calculation:\n // newAvg = oldAvg + (sample - oldAvg) / (sampleCount + 1)\n\n this.throughput.rate += (segmentProcessingThroughput - rate) / ++this.throughput.count;\n }\n /**\n * Adds a cue to the segment-metadata track with some metadata information about the\n * segment\n *\n * @private\n * @param {Object} segmentInfo\n * the object returned by loadSegment\n * @method addSegmentMetadataCue_\n */\n\n addSegmentMetadataCue_(segmentInfo) {\n if (!this.segmentMetadataTrack_) {\n return;\n }\n const segment = segmentInfo.segment;\n const start = segment.start;\n const end = segment.end; // Do not try adding the cue if the start and end times are invalid.\n\n if (!finite(start) || !finite(end)) {\n return;\n }\n removeCuesFromTrack(start, end, this.segmentMetadataTrack_);\n const Cue = window$1.WebKitDataCue || window$1.VTTCue;\n const value = {\n custom: segment.custom,\n dateTimeObject: segment.dateTimeObject,\n dateTimeString: segment.dateTimeString,\n programDateTime: segment.programDateTime,\n bandwidth: segmentInfo.playlist.attributes.BANDWIDTH,\n resolution: segmentInfo.playlist.attributes.RESOLUTION,\n codecs: segmentInfo.playlist.attributes.CODECS,\n byteLength: segmentInfo.byteLength,\n uri: segmentInfo.uri,\n timeline: segmentInfo.timeline,\n playlist: segmentInfo.playlist.id,\n start,\n end\n };\n const data = JSON.stringify(value);\n const cue = new Cue(start, end, data); // Attach the metadata to the value property of the cue to keep consistency between\n // the differences of WebKitDataCue in safari and VTTCue in other browsers\n\n cue.value = value;\n this.segmentMetadataTrack_.addCue(cue);\n }\n}\nfunction noop() {}\nconst toTitleCase = function (string) {\n if (typeof string !== 'string') {\n return string;\n }\n return string.replace(/./, w => w.toUpperCase());\n};\n\n/**\n * @file source-updater.js\n */\nconst bufferTypes = ['video', 'audio'];\nconst updating = (type, sourceUpdater) => {\n const sourceBuffer = sourceUpdater[`${type}Buffer`];\n return sourceBuffer && sourceBuffer.updating || sourceUpdater.queuePending[type];\n};\nconst nextQueueIndexOfType = (type, queue) => {\n for (let i = 0; i < queue.length; i++) {\n const queueEntry = queue[i];\n if (queueEntry.type === 'mediaSource') {\n // If the next entry is a media source entry (uses multiple source buffers), block\n // processing to allow it to go through first.\n return null;\n }\n if (queueEntry.type === type) {\n return i;\n }\n }\n return null;\n};\nconst shiftQueue = (type, sourceUpdater) => {\n if (sourceUpdater.queue.length === 0) {\n return;\n }\n let queueIndex = 0;\n let queueEntry = sourceUpdater.queue[queueIndex];\n if (queueEntry.type === 'mediaSource') {\n if (!sourceUpdater.updating() && sourceUpdater.mediaSource.readyState !== 'closed') {\n sourceUpdater.queue.shift();\n queueEntry.action(sourceUpdater);\n if (queueEntry.doneFn) {\n queueEntry.doneFn();\n } // Only specific source buffer actions must wait for async updateend events. Media\n // Source actions process synchronously. Therefore, both audio and video source\n // buffers are now clear to process the next queue entries.\n\n shiftQueue('audio', sourceUpdater);\n shiftQueue('video', sourceUpdater);\n } // Media Source actions require both source buffers, so if the media source action\n // couldn't process yet (because one or both source buffers are busy), block other\n // queue actions until both are available and the media source action can process.\n\n return;\n }\n if (type === 'mediaSource') {\n // If the queue was shifted by a media source action (this happens when pushing a\n // media source action onto the queue), then it wasn't from an updateend event from an\n // audio or video source buffer, so there's no change from previous state, and no\n // processing should be done.\n return;\n } // Media source queue entries don't need to consider whether the source updater is\n // started (i.e., source buffers are created) as they don't need the source buffers, but\n // source buffer queue entries do.\n\n if (!sourceUpdater.ready() || sourceUpdater.mediaSource.readyState === 'closed' || updating(type, sourceUpdater)) {\n return;\n }\n if (queueEntry.type !== type) {\n queueIndex = nextQueueIndexOfType(type, sourceUpdater.queue);\n if (queueIndex === null) {\n // Either there's no queue entry that uses this source buffer type in the queue, or\n // there's a media source queue entry before the next entry of this type, in which\n // case wait for that action to process first.\n return;\n }\n queueEntry = sourceUpdater.queue[queueIndex];\n }\n sourceUpdater.queue.splice(queueIndex, 1); // Keep a record that this source buffer type is in use.\n //\n // The queue pending operation must be set before the action is performed in the event\n // that the action results in a synchronous event that is acted upon. For instance, if\n // an exception is thrown that can be handled, it's possible that new actions will be\n // appended to an empty queue and immediately executed, but would not have the correct\n // pending information if this property was set after the action was performed.\n\n sourceUpdater.queuePending[type] = queueEntry;\n queueEntry.action(type, sourceUpdater);\n if (!queueEntry.doneFn) {\n // synchronous operation, process next entry\n sourceUpdater.queuePending[type] = null;\n shiftQueue(type, sourceUpdater);\n return;\n }\n};\nconst cleanupBuffer = (type, sourceUpdater) => {\n const buffer = sourceUpdater[`${type}Buffer`];\n const titleType = toTitleCase(type);\n if (!buffer) {\n return;\n }\n buffer.removeEventListener('updateend', sourceUpdater[`on${titleType}UpdateEnd_`]);\n buffer.removeEventListener('error', sourceUpdater[`on${titleType}Error_`]);\n sourceUpdater.codecs[type] = null;\n sourceUpdater[`${type}Buffer`] = null;\n};\nconst inSourceBuffers = (mediaSource, sourceBuffer) => mediaSource && sourceBuffer && Array.prototype.indexOf.call(mediaSource.sourceBuffers, sourceBuffer) !== -1;\nconst actions = {\n appendBuffer: (bytes, segmentInfo, onError) => (type, sourceUpdater) => {\n const sourceBuffer = sourceUpdater[`${type}Buffer`]; // can't do anything if the media source / source buffer is null\n // or the media source does not contain this source buffer.\n\n if (!inSourceBuffers(sourceUpdater.mediaSource, sourceBuffer)) {\n return;\n }\n sourceUpdater.logger_(`Appending segment ${segmentInfo.mediaIndex}'s ${bytes.length} bytes to ${type}Buffer`);\n try {\n sourceBuffer.appendBuffer(bytes);\n } catch (e) {\n sourceUpdater.logger_(`Error with code ${e.code} ` + (e.code === QUOTA_EXCEEDED_ERR ? '(QUOTA_EXCEEDED_ERR) ' : '') + `when appending segment ${segmentInfo.mediaIndex} to ${type}Buffer`);\n sourceUpdater.queuePending[type] = null;\n onError(e);\n }\n },\n remove: (start, end) => (type, sourceUpdater) => {\n const sourceBuffer = sourceUpdater[`${type}Buffer`]; // can't do anything if the media source / source buffer is null\n // or the media source does not contain this source buffer.\n\n if (!inSourceBuffers(sourceUpdater.mediaSource, sourceBuffer)) {\n return;\n }\n sourceUpdater.logger_(`Removing ${start} to ${end} from ${type}Buffer`);\n try {\n sourceBuffer.remove(start, end);\n } catch (e) {\n sourceUpdater.logger_(`Remove ${start} to ${end} from ${type}Buffer failed`);\n }\n },\n timestampOffset: offset => (type, sourceUpdater) => {\n const sourceBuffer = sourceUpdater[`${type}Buffer`]; // can't do anything if the media source / source buffer is null\n // or the media source does not contain this source buffer.\n\n if (!inSourceBuffers(sourceUpdater.mediaSource, sourceBuffer)) {\n return;\n }\n sourceUpdater.logger_(`Setting ${type}timestampOffset to ${offset}`);\n sourceBuffer.timestampOffset = offset;\n },\n callback: callback => (type, sourceUpdater) => {\n callback();\n },\n endOfStream: error => sourceUpdater => {\n if (sourceUpdater.mediaSource.readyState !== 'open') {\n return;\n }\n sourceUpdater.logger_(`Calling mediaSource endOfStream(${error || ''})`);\n try {\n sourceUpdater.mediaSource.endOfStream(error);\n } catch (e) {\n videojs.log.warn('Failed to call media source endOfStream', e);\n }\n },\n duration: duration => sourceUpdater => {\n sourceUpdater.logger_(`Setting mediaSource duration to ${duration}`);\n try {\n sourceUpdater.mediaSource.duration = duration;\n } catch (e) {\n videojs.log.warn('Failed to set media source duration', e);\n }\n },\n abort: () => (type, sourceUpdater) => {\n if (sourceUpdater.mediaSource.readyState !== 'open') {\n return;\n }\n const sourceBuffer = sourceUpdater[`${type}Buffer`]; // can't do anything if the media source / source buffer is null\n // or the media source does not contain this source buffer.\n\n if (!inSourceBuffers(sourceUpdater.mediaSource, sourceBuffer)) {\n return;\n }\n sourceUpdater.logger_(`calling abort on ${type}Buffer`);\n try {\n sourceBuffer.abort();\n } catch (e) {\n videojs.log.warn(`Failed to abort on ${type}Buffer`, e);\n }\n },\n addSourceBuffer: (type, codec) => sourceUpdater => {\n const titleType = toTitleCase(type);\n const mime = getMimeForCodec(codec);\n sourceUpdater.logger_(`Adding ${type}Buffer with codec ${codec} to mediaSource`);\n const sourceBuffer = sourceUpdater.mediaSource.addSourceBuffer(mime);\n sourceBuffer.addEventListener('updateend', sourceUpdater[`on${titleType}UpdateEnd_`]);\n sourceBuffer.addEventListener('error', sourceUpdater[`on${titleType}Error_`]);\n sourceUpdater.codecs[type] = codec;\n sourceUpdater[`${type}Buffer`] = sourceBuffer;\n },\n removeSourceBuffer: type => sourceUpdater => {\n const sourceBuffer = sourceUpdater[`${type}Buffer`];\n cleanupBuffer(type, sourceUpdater); // can't do anything if the media source / source buffer is null\n // or the media source does not contain this source buffer.\n\n if (!inSourceBuffers(sourceUpdater.mediaSource, sourceBuffer)) {\n return;\n }\n sourceUpdater.logger_(`Removing ${type}Buffer with codec ${sourceUpdater.codecs[type]} from mediaSource`);\n try {\n sourceUpdater.mediaSource.removeSourceBuffer(sourceBuffer);\n } catch (e) {\n videojs.log.warn(`Failed to removeSourceBuffer ${type}Buffer`, e);\n }\n },\n changeType: codec => (type, sourceUpdater) => {\n const sourceBuffer = sourceUpdater[`${type}Buffer`];\n const mime = getMimeForCodec(codec); // can't do anything if the media source / source buffer is null\n // or the media source does not contain this source buffer.\n\n if (!inSourceBuffers(sourceUpdater.mediaSource, sourceBuffer)) {\n return;\n } // do not update codec if we don't need to.\n // Only update if we change the codec base.\n // For example, going from avc1.640028 to avc1.64001f does not require a changeType call.\n\n const newCodecBase = codec.substring(0, codec.indexOf('.'));\n const oldCodec = sourceUpdater.codecs[type];\n const oldCodecBase = oldCodec.substring(0, oldCodec.indexOf('.'));\n if (oldCodecBase === newCodecBase) {\n return;\n }\n const metadata = {\n codecsChangeInfo: {\n from: oldCodec,\n to: codec\n }\n };\n sourceUpdater.trigger({\n type: 'codecschange',\n metadata\n });\n sourceUpdater.logger_(`changing ${type}Buffer codec from ${oldCodec} to ${codec}`); // check if change to the provided type is supported\n\n try {\n sourceBuffer.changeType(mime);\n sourceUpdater.codecs[type] = codec;\n } catch (e) {\n metadata.errorType = videojs.Error.StreamingCodecsChangeError;\n metadata.error = e;\n e.metadata = metadata;\n sourceUpdater.error_ = e;\n sourceUpdater.trigger('error');\n videojs.log.warn(`Failed to changeType on ${type}Buffer`, e);\n }\n }\n};\nconst pushQueue = ({\n type,\n sourceUpdater,\n action,\n doneFn,\n name\n}) => {\n sourceUpdater.queue.push({\n type,\n action,\n doneFn,\n name\n });\n shiftQueue(type, sourceUpdater);\n};\nconst onUpdateend = (type, sourceUpdater) => e => {\n // Although there should, in theory, be a pending action for any updateend receieved,\n // there are some actions that may trigger updateend events without set definitions in\n // the w3c spec. For instance, setting the duration on the media source may trigger\n // updateend events on source buffers. This does not appear to be in the spec. As such,\n // if we encounter an updateend without a corresponding pending action from our queue\n // for that source buffer type, process the next action.\n const bufferedRangesForType = sourceUpdater[`${type}Buffered`]();\n const descriptiveString = bufferedRangesToString(bufferedRangesForType);\n sourceUpdater.logger_(`received \"updateend\" event for ${type} Source Buffer: `, descriptiveString);\n if (sourceUpdater.queuePending[type]) {\n const doneFn = sourceUpdater.queuePending[type].doneFn;\n sourceUpdater.queuePending[type] = null;\n if (doneFn) {\n // if there's an error, report it\n doneFn(sourceUpdater[`${type}Error_`]);\n }\n }\n shiftQueue(type, sourceUpdater);\n};\n/**\n * A queue of callbacks to be serialized and applied when a\n * MediaSource and its associated SourceBuffers are not in the\n * updating state. It is used by the segment loader to update the\n * underlying SourceBuffers when new data is loaded, for instance.\n *\n * @class SourceUpdater\n * @param {MediaSource} mediaSource the MediaSource to create the SourceBuffer from\n * @param {string} mimeType the desired MIME type of the underlying SourceBuffer\n */\n\nclass SourceUpdater extends videojs.EventTarget {\n constructor(mediaSource) {\n super();\n this.mediaSource = mediaSource;\n this.sourceopenListener_ = () => shiftQueue('mediaSource', this);\n this.mediaSource.addEventListener('sourceopen', this.sourceopenListener_);\n this.logger_ = logger('SourceUpdater'); // initial timestamp offset is 0\n\n this.audioTimestampOffset_ = 0;\n this.videoTimestampOffset_ = 0;\n this.queue = [];\n this.queuePending = {\n audio: null,\n video: null\n };\n this.delayedAudioAppendQueue_ = [];\n this.videoAppendQueued_ = false;\n this.codecs = {};\n this.onVideoUpdateEnd_ = onUpdateend('video', this);\n this.onAudioUpdateEnd_ = onUpdateend('audio', this);\n this.onVideoError_ = e => {\n // used for debugging\n this.videoError_ = e;\n };\n this.onAudioError_ = e => {\n // used for debugging\n this.audioError_ = e;\n };\n this.createdSourceBuffers_ = false;\n this.initializedEme_ = false;\n this.triggeredReady_ = false;\n }\n initializedEme() {\n this.initializedEme_ = true;\n this.triggerReady();\n }\n hasCreatedSourceBuffers() {\n // if false, likely waiting on one of the segment loaders to get enough data to create\n // source buffers\n return this.createdSourceBuffers_;\n }\n hasInitializedAnyEme() {\n return this.initializedEme_;\n }\n ready() {\n return this.hasCreatedSourceBuffers() && this.hasInitializedAnyEme();\n }\n createSourceBuffers(codecs) {\n if (this.hasCreatedSourceBuffers()) {\n // already created them before\n return;\n } // the intial addOrChangeSourceBuffers will always be\n // two add buffers.\n\n this.addOrChangeSourceBuffers(codecs);\n this.createdSourceBuffers_ = true;\n this.trigger('createdsourcebuffers');\n this.triggerReady();\n }\n triggerReady() {\n // only allow ready to be triggered once, this prevents the case\n // where:\n // 1. we trigger createdsourcebuffers\n // 2. ie 11 synchronously initializates eme\n // 3. the synchronous initialization causes us to trigger ready\n // 4. We go back to the ready check in createSourceBuffers and ready is triggered again.\n if (this.ready() && !this.triggeredReady_) {\n this.triggeredReady_ = true;\n this.trigger('ready');\n }\n }\n /**\n * Add a type of source buffer to the media source.\n *\n * @param {string} type\n * The type of source buffer to add.\n *\n * @param {string} codec\n * The codec to add the source buffer with.\n */\n\n addSourceBuffer(type, codec) {\n pushQueue({\n type: 'mediaSource',\n sourceUpdater: this,\n action: actions.addSourceBuffer(type, codec),\n name: 'addSourceBuffer'\n });\n }\n /**\n * call abort on a source buffer.\n *\n * @param {string} type\n * The type of source buffer to call abort on.\n */\n\n abort(type) {\n pushQueue({\n type,\n sourceUpdater: this,\n action: actions.abort(type),\n name: 'abort'\n });\n }\n /**\n * Call removeSourceBuffer and remove a specific type\n * of source buffer on the mediaSource.\n *\n * @param {string} type\n * The type of source buffer to remove.\n */\n\n removeSourceBuffer(type) {\n if (!this.canRemoveSourceBuffer()) {\n videojs.log.error('removeSourceBuffer is not supported!');\n return;\n }\n pushQueue({\n type: 'mediaSource',\n sourceUpdater: this,\n action: actions.removeSourceBuffer(type),\n name: 'removeSourceBuffer'\n });\n }\n /**\n * Whether or not the removeSourceBuffer function is supported\n * on the mediaSource.\n *\n * @return {boolean}\n * if removeSourceBuffer can be called.\n */\n\n canRemoveSourceBuffer() {\n // As of Firefox 83 removeSourceBuffer\n // throws errors, so we report that it does not support this.\n return !videojs.browser.IS_FIREFOX && window$1.MediaSource && window$1.MediaSource.prototype && typeof window$1.MediaSource.prototype.removeSourceBuffer === 'function';\n }\n /**\n * Whether or not the changeType function is supported\n * on our SourceBuffers.\n *\n * @return {boolean}\n * if changeType can be called.\n */\n\n static canChangeType() {\n return window$1.SourceBuffer && window$1.SourceBuffer.prototype && typeof window$1.SourceBuffer.prototype.changeType === 'function';\n }\n /**\n * Whether or not the changeType function is supported\n * on our SourceBuffers.\n *\n * @return {boolean}\n * if changeType can be called.\n */\n\n canChangeType() {\n return this.constructor.canChangeType();\n }\n /**\n * Call the changeType function on a source buffer, given the code and type.\n *\n * @param {string} type\n * The type of source buffer to call changeType on.\n *\n * @param {string} codec\n * The codec string to change type with on the source buffer.\n */\n\n changeType(type, codec) {\n if (!this.canChangeType()) {\n videojs.log.error('changeType is not supported!');\n return;\n }\n pushQueue({\n type,\n sourceUpdater: this,\n action: actions.changeType(codec),\n name: 'changeType'\n });\n }\n /**\n * Add source buffers with a codec or, if they are already created,\n * call changeType on source buffers using changeType.\n *\n * @param {Object} codecs\n * Codecs to switch to\n */\n\n addOrChangeSourceBuffers(codecs) {\n if (!codecs || typeof codecs !== 'object' || Object.keys(codecs).length === 0) {\n throw new Error('Cannot addOrChangeSourceBuffers to undefined codecs');\n }\n Object.keys(codecs).forEach(type => {\n const codec = codecs[type];\n if (!this.hasCreatedSourceBuffers()) {\n return this.addSourceBuffer(type, codec);\n }\n if (this.canChangeType()) {\n this.changeType(type, codec);\n }\n });\n }\n /**\n * Queue an update to append an ArrayBuffer.\n *\n * @param {MediaObject} object containing audioBytes and/or videoBytes\n * @param {Function} done the function to call when done\n * @see http://www.w3.org/TR/media-source/#widl-SourceBuffer-appendBuffer-void-ArrayBuffer-data\n */\n\n appendBuffer(options, doneFn) {\n const {\n segmentInfo,\n type,\n bytes\n } = options;\n this.processedAppend_ = true;\n if (type === 'audio' && this.videoBuffer && !this.videoAppendQueued_) {\n this.delayedAudioAppendQueue_.push([options, doneFn]);\n this.logger_(`delayed audio append of ${bytes.length} until video append`);\n return;\n } // In the case of certain errors, for instance, QUOTA_EXCEEDED_ERR, updateend will\n // not be fired. This means that the queue will be blocked until the next action\n // taken by the segment-loader. Provide a mechanism for segment-loader to handle\n // these errors by calling the doneFn with the specific error.\n\n const onError = doneFn;\n pushQueue({\n type,\n sourceUpdater: this,\n action: actions.appendBuffer(bytes, segmentInfo || {\n mediaIndex: -1\n }, onError),\n doneFn,\n name: 'appendBuffer'\n });\n if (type === 'video') {\n this.videoAppendQueued_ = true;\n if (!this.delayedAudioAppendQueue_.length) {\n return;\n }\n const queue = this.delayedAudioAppendQueue_.slice();\n this.logger_(`queuing delayed audio ${queue.length} appendBuffers`);\n this.delayedAudioAppendQueue_.length = 0;\n queue.forEach(que => {\n this.appendBuffer.apply(this, que);\n });\n }\n }\n /**\n * Get the audio buffer's buffered timerange.\n *\n * @return {TimeRange}\n * The audio buffer's buffered time range\n */\n\n audioBuffered() {\n // no media source/source buffer or it isn't in the media sources\n // source buffer list\n if (!inSourceBuffers(this.mediaSource, this.audioBuffer)) {\n return createTimeRanges();\n }\n return this.audioBuffer.buffered ? this.audioBuffer.buffered : createTimeRanges();\n }\n /**\n * Get the video buffer's buffered timerange.\n *\n * @return {TimeRange}\n * The video buffer's buffered time range\n */\n\n videoBuffered() {\n // no media source/source buffer or it isn't in the media sources\n // source buffer list\n if (!inSourceBuffers(this.mediaSource, this.videoBuffer)) {\n return createTimeRanges();\n }\n return this.videoBuffer.buffered ? this.videoBuffer.buffered : createTimeRanges();\n }\n /**\n * Get a combined video/audio buffer's buffered timerange.\n *\n * @return {TimeRange}\n * the combined time range\n */\n\n buffered() {\n const video = inSourceBuffers(this.mediaSource, this.videoBuffer) ? this.videoBuffer : null;\n const audio = inSourceBuffers(this.mediaSource, this.audioBuffer) ? this.audioBuffer : null;\n if (audio && !video) {\n return this.audioBuffered();\n }\n if (video && !audio) {\n return this.videoBuffered();\n }\n return bufferIntersection(this.audioBuffered(), this.videoBuffered());\n }\n /**\n * Add a callback to the queue that will set duration on the mediaSource.\n *\n * @param {number} duration\n * The duration to set\n *\n * @param {Function} [doneFn]\n * function to run after duration has been set.\n */\n\n setDuration(duration, doneFn = noop) {\n // In order to set the duration on the media source, it's necessary to wait for all\n // source buffers to no longer be updating. \"If the updating attribute equals true on\n // any SourceBuffer in sourceBuffers, then throw an InvalidStateError exception and\n // abort these steps.\" (source: https://www.w3.org/TR/media-source/#attributes).\n pushQueue({\n type: 'mediaSource',\n sourceUpdater: this,\n action: actions.duration(duration),\n name: 'duration',\n doneFn\n });\n }\n /**\n * Add a mediaSource endOfStream call to the queue\n *\n * @param {Error} [error]\n * Call endOfStream with an error\n *\n * @param {Function} [doneFn]\n * A function that should be called when the\n * endOfStream call has finished.\n */\n\n endOfStream(error = null, doneFn = noop) {\n if (typeof error !== 'string') {\n error = undefined;\n } // In order to set the duration on the media source, it's necessary to wait for all\n // source buffers to no longer be updating. \"If the updating attribute equals true on\n // any SourceBuffer in sourceBuffers, then throw an InvalidStateError exception and\n // abort these steps.\" (source: https://www.w3.org/TR/media-source/#attributes).\n\n pushQueue({\n type: 'mediaSource',\n sourceUpdater: this,\n action: actions.endOfStream(error),\n name: 'endOfStream',\n doneFn\n });\n }\n /**\n * Queue an update to remove a time range from the buffer.\n *\n * @param {number} start where to start the removal\n * @param {number} end where to end the removal\n * @param {Function} [done=noop] optional callback to be executed when the remove\n * operation is complete\n * @see http://www.w3.org/TR/media-source/#widl-SourceBuffer-remove-void-double-start-unrestricted-double-end\n */\n\n removeAudio(start, end, done = noop) {\n if (!this.audioBuffered().length || this.audioBuffered().end(0) === 0) {\n done();\n return;\n }\n pushQueue({\n type: 'audio',\n sourceUpdater: this,\n action: actions.remove(start, end),\n doneFn: done,\n name: 'remove'\n });\n }\n /**\n * Queue an update to remove a time range from the buffer.\n *\n * @param {number} start where to start the removal\n * @param {number} end where to end the removal\n * @param {Function} [done=noop] optional callback to be executed when the remove\n * operation is complete\n * @see http://www.w3.org/TR/media-source/#widl-SourceBuffer-remove-void-double-start-unrestricted-double-end\n */\n\n removeVideo(start, end, done = noop) {\n if (!this.videoBuffered().length || this.videoBuffered().end(0) === 0) {\n done();\n return;\n }\n pushQueue({\n type: 'video',\n sourceUpdater: this,\n action: actions.remove(start, end),\n doneFn: done,\n name: 'remove'\n });\n }\n /**\n * Whether the underlying sourceBuffer is updating or not\n *\n * @return {boolean} the updating status of the SourceBuffer\n */\n\n updating() {\n // the audio/video source buffer is updating\n if (updating('audio', this) || updating('video', this)) {\n return true;\n }\n return false;\n }\n /**\n * Set/get the timestampoffset on the audio SourceBuffer\n *\n * @return {number} the timestamp offset\n */\n\n audioTimestampOffset(offset) {\n if (typeof offset !== 'undefined' && this.audioBuffer &&\n // no point in updating if it's the same\n this.audioTimestampOffset_ !== offset) {\n pushQueue({\n type: 'audio',\n sourceUpdater: this,\n action: actions.timestampOffset(offset),\n name: 'timestampOffset'\n });\n this.audioTimestampOffset_ = offset;\n }\n return this.audioTimestampOffset_;\n }\n /**\n * Set/get the timestampoffset on the video SourceBuffer\n *\n * @return {number} the timestamp offset\n */\n\n videoTimestampOffset(offset) {\n if (typeof offset !== 'undefined' && this.videoBuffer &&\n // no point in updating if it's the same\n this.videoTimestampOffset_ !== offset) {\n pushQueue({\n type: 'video',\n sourceUpdater: this,\n action: actions.timestampOffset(offset),\n name: 'timestampOffset'\n });\n this.videoTimestampOffset_ = offset;\n }\n return this.videoTimestampOffset_;\n }\n /**\n * Add a function to the queue that will be called\n * when it is its turn to run in the audio queue.\n *\n * @param {Function} callback\n * The callback to queue.\n */\n\n audioQueueCallback(callback) {\n if (!this.audioBuffer) {\n return;\n }\n pushQueue({\n type: 'audio',\n sourceUpdater: this,\n action: actions.callback(callback),\n name: 'callback'\n });\n }\n /**\n * Add a function to the queue that will be called\n * when it is its turn to run in the video queue.\n *\n * @param {Function} callback\n * The callback to queue.\n */\n\n videoQueueCallback(callback) {\n if (!this.videoBuffer) {\n return;\n }\n pushQueue({\n type: 'video',\n sourceUpdater: this,\n action: actions.callback(callback),\n name: 'callback'\n });\n }\n /**\n * dispose of the source updater and the underlying sourceBuffer\n */\n\n dispose() {\n this.trigger('dispose');\n bufferTypes.forEach(type => {\n this.abort(type);\n if (this.canRemoveSourceBuffer()) {\n this.removeSourceBuffer(type);\n } else {\n this[`${type}QueueCallback`](() => cleanupBuffer(type, this));\n }\n });\n this.videoAppendQueued_ = false;\n this.delayedAudioAppendQueue_.length = 0;\n if (this.sourceopenListener_) {\n this.mediaSource.removeEventListener('sourceopen', this.sourceopenListener_);\n }\n this.off();\n }\n}\nconst uint8ToUtf8 = uintArray => decodeURIComponent(escape(String.fromCharCode.apply(null, uintArray)));\nconst bufferToHexString = buffer => {\n const uInt8Buffer = new Uint8Array(buffer);\n return Array.from(uInt8Buffer).map(byte => byte.toString(16).padStart(2, '0')).join('');\n};\n\n/**\n * @file vtt-segment-loader.js\n */\nconst VTT_LINE_TERMINATORS = new Uint8Array('\\n\\n'.split('').map(char => char.charCodeAt(0)));\nclass NoVttJsError extends Error {\n constructor() {\n super('Trying to parse received VTT cues, but there is no WebVTT. Make sure vtt.js is loaded.');\n }\n}\n/**\n * An object that manages segment loading and appending.\n *\n * @class VTTSegmentLoader\n * @param {Object} options required and optional options\n * @extends videojs.EventTarget\n */\n\nclass VTTSegmentLoader extends SegmentLoader {\n constructor(settings, options = {}) {\n super(settings, options); // SegmentLoader requires a MediaSource be specified or it will throw an error;\n // however, VTTSegmentLoader has no need of a media source, so delete the reference\n\n this.mediaSource_ = null;\n this.subtitlesTrack_ = null;\n this.featuresNativeTextTracks_ = settings.featuresNativeTextTracks;\n this.loadVttJs = settings.loadVttJs; // The VTT segment will have its own time mappings. Saving VTT segment timing info in\n // the sync controller leads to improper behavior.\n\n this.shouldSaveSegmentTimingInfo_ = false;\n }\n /**\n * Indicates which time ranges are buffered\n *\n * @return {TimeRange}\n * TimeRange object representing the current buffered ranges\n */\n\n buffered_() {\n if (!this.subtitlesTrack_ || !this.subtitlesTrack_.cues || !this.subtitlesTrack_.cues.length) {\n return createTimeRanges();\n }\n const cues = this.subtitlesTrack_.cues;\n const start = cues[0].startTime;\n const end = cues[cues.length - 1].startTime;\n return createTimeRanges([[start, end]]);\n }\n /**\n * Gets and sets init segment for the provided map\n *\n * @param {Object} map\n * The map object representing the init segment to get or set\n * @param {boolean=} set\n * If true, the init segment for the provided map should be saved\n * @return {Object}\n * map object for desired init segment\n */\n\n initSegmentForMap(map, set = false) {\n if (!map) {\n return null;\n }\n const id = initSegmentId(map);\n let storedMap = this.initSegments_[id];\n if (set && !storedMap && map.bytes) {\n // append WebVTT line terminators to the media initialization segment if it exists\n // to follow the WebVTT spec (https://w3c.github.io/webvtt/#file-structure) that\n // requires two or more WebVTT line terminators between the WebVTT header and the\n // rest of the file\n const combinedByteLength = VTT_LINE_TERMINATORS.byteLength + map.bytes.byteLength;\n const combinedSegment = new Uint8Array(combinedByteLength);\n combinedSegment.set(map.bytes);\n combinedSegment.set(VTT_LINE_TERMINATORS, map.bytes.byteLength);\n this.initSegments_[id] = storedMap = {\n resolvedUri: map.resolvedUri,\n byterange: map.byterange,\n bytes: combinedSegment\n };\n }\n return storedMap || map;\n }\n /**\n * Returns true if all configuration required for loading is present, otherwise false.\n *\n * @return {boolean} True if the all configuration is ready for loading\n * @private\n */\n\n couldBeginLoading_() {\n return this.playlist_ && this.subtitlesTrack_ && !this.paused();\n }\n /**\n * Once all the starting parameters have been specified, begin\n * operation. This method should only be invoked from the INIT\n * state.\n *\n * @private\n */\n\n init_() {\n this.state = 'READY';\n this.resetEverything();\n return this.monitorBuffer_();\n }\n /**\n * Set a subtitle track on the segment loader to add subtitles to\n *\n * @param {TextTrack=} track\n * The text track to add loaded subtitles to\n * @return {TextTrack}\n * Returns the subtitles track\n */\n\n track(track) {\n if (typeof track === 'undefined') {\n return this.subtitlesTrack_;\n }\n this.subtitlesTrack_ = track; // if we were unpaused but waiting for a sourceUpdater, start\n // buffering now\n\n if (this.state === 'INIT' && this.couldBeginLoading_()) {\n this.init_();\n }\n return this.subtitlesTrack_;\n }\n /**\n * Remove any data in the source buffer between start and end times\n *\n * @param {number} start - the start time of the region to remove from the buffer\n * @param {number} end - the end time of the region to remove from the buffer\n */\n\n remove(start, end) {\n removeCuesFromTrack(start, end, this.subtitlesTrack_);\n }\n /**\n * fill the buffer with segements unless the sourceBuffers are\n * currently updating\n *\n * Note: this function should only ever be called by monitorBuffer_\n * and never directly\n *\n * @private\n */\n\n fillBuffer_() {\n // see if we need to begin loading immediately\n const segmentInfo = this.chooseNextRequest_();\n if (!segmentInfo) {\n return;\n }\n if (this.syncController_.timestampOffsetForTimeline(segmentInfo.timeline) === null) {\n // We don't have the timestamp offset that we need to sync subtitles.\n // Rerun on a timestamp offset or user interaction.\n const checkTimestampOffset = () => {\n this.state = 'READY';\n if (!this.paused()) {\n // if not paused, queue a buffer check as soon as possible\n this.monitorBuffer_();\n }\n };\n this.syncController_.one('timestampoffset', checkTimestampOffset);\n this.state = 'WAITING_ON_TIMELINE';\n return;\n }\n this.loadSegment_(segmentInfo);\n } // never set a timestamp offset for vtt segments.\n\n timestampOffsetForSegment_() {\n return null;\n }\n chooseNextRequest_() {\n return this.skipEmptySegments_(super.chooseNextRequest_());\n }\n /**\n * Prevents the segment loader from requesting segments we know contain no subtitles\n * by walking forward until we find the next segment that we don't know whether it is\n * empty or not.\n *\n * @param {Object} segmentInfo\n * a segment info object that describes the current segment\n * @return {Object}\n * a segment info object that describes the current segment\n */\n\n skipEmptySegments_(segmentInfo) {\n while (segmentInfo && segmentInfo.segment.empty) {\n // stop at the last possible segmentInfo\n if (segmentInfo.mediaIndex + 1 >= segmentInfo.playlist.segments.length) {\n segmentInfo = null;\n break;\n }\n segmentInfo = this.generateSegmentInfo_({\n playlist: segmentInfo.playlist,\n mediaIndex: segmentInfo.mediaIndex + 1,\n startOfSegment: segmentInfo.startOfSegment + segmentInfo.duration,\n isSyncRequest: segmentInfo.isSyncRequest\n });\n }\n return segmentInfo;\n }\n stopForError(error) {\n this.error(error);\n this.state = 'READY';\n this.pause();\n this.trigger('error');\n }\n /**\n * append a decrypted segement to the SourceBuffer through a SourceUpdater\n *\n * @private\n */\n\n segmentRequestFinished_(error, simpleSegment, result) {\n if (!this.subtitlesTrack_) {\n this.state = 'READY';\n return;\n }\n this.saveTransferStats_(simpleSegment.stats); // the request was aborted\n\n if (!this.pendingSegment_) {\n this.state = 'READY';\n this.mediaRequestsAborted += 1;\n return;\n }\n if (error) {\n if (error.code === REQUEST_ERRORS.TIMEOUT) {\n this.handleTimeout_();\n }\n if (error.code === REQUEST_ERRORS.ABORTED) {\n this.mediaRequestsAborted += 1;\n } else {\n this.mediaRequestsErrored += 1;\n }\n this.stopForError(error);\n return;\n }\n const segmentInfo = this.pendingSegment_;\n const isMp4WebVttSegmentWithCues = result.mp4VttCues && result.mp4VttCues.length;\n if (isMp4WebVttSegmentWithCues) {\n segmentInfo.mp4VttCues = result.mp4VttCues;\n } // although the VTT segment loader bandwidth isn't really used, it's good to\n // maintain functionality between segment loaders\n\n this.saveBandwidthRelatedStats_(segmentInfo.duration, simpleSegment.stats); // if this request included a segment key, save that data in the cache\n\n if (simpleSegment.key) {\n this.segmentKey(simpleSegment.key, true);\n }\n this.state = 'APPENDING'; // used for tests\n\n this.trigger('appending');\n const segment = segmentInfo.segment;\n if (segment.map) {\n segment.map.bytes = simpleSegment.map.bytes;\n }\n segmentInfo.bytes = simpleSegment.bytes; // Make sure that vttjs has loaded, otherwise, load it and wait till it finished loading\n\n if (typeof window$1.WebVTT !== 'function' && typeof this.loadVttJs === 'function') {\n this.state = 'WAITING_ON_VTTJS'; // should be fine to call multiple times\n // script will be loaded once but multiple listeners will be added to the queue, which is expected.\n\n this.loadVttJs().then(() => this.segmentRequestFinished_(error, simpleSegment, result), () => this.stopForError({\n message: 'Error loading vtt.js'\n }));\n return;\n }\n segment.requested = true;\n try {\n this.parseVTTCues_(segmentInfo);\n } catch (e) {\n this.stopForError({\n message: e.message,\n metadata: {\n errorType: videojs.Error.StreamingVttParserError,\n error: e\n }\n });\n return;\n }\n if (!isMp4WebVttSegmentWithCues) {\n this.updateTimeMapping_(segmentInfo, this.syncController_.timelines[segmentInfo.timeline], this.playlist_);\n }\n if (segmentInfo.cues.length) {\n segmentInfo.timingInfo = {\n start: segmentInfo.cues[0].startTime,\n end: segmentInfo.cues[segmentInfo.cues.length - 1].endTime\n };\n } else {\n segmentInfo.timingInfo = {\n start: segmentInfo.startOfSegment,\n end: segmentInfo.startOfSegment + segmentInfo.duration\n };\n }\n if (segmentInfo.isSyncRequest) {\n this.trigger('syncinfoupdate');\n this.pendingSegment_ = null;\n this.state = 'READY';\n return;\n }\n segmentInfo.byteLength = segmentInfo.bytes.byteLength;\n this.mediaSecondsLoaded += segment.duration; // Create VTTCue instances for each cue in the new segment and add them to\n // the subtitle track\n\n segmentInfo.cues.forEach(cue => {\n this.subtitlesTrack_.addCue(this.featuresNativeTextTracks_ ? new window$1.VTTCue(cue.startTime, cue.endTime, cue.text) : cue);\n }); // Remove any duplicate cues from the subtitle track. The WebVTT spec allows\n // cues to have identical time-intervals, but if the text is also identical\n // we can safely assume it is a duplicate that can be removed (ex. when a cue\n // \"overlaps\" VTT segments)\n\n removeDuplicateCuesFromTrack(this.subtitlesTrack_);\n this.handleAppendsDone_();\n }\n handleData_(simpleSegment, result) {\n const isVttType = simpleSegment && simpleSegment.type === 'vtt';\n const isTextResult = result && result.type === 'text';\n const isFmp4VttSegment = isVttType && isTextResult; // handle segment data for fmp4 encapsulated webvtt\n\n if (isFmp4VttSegment) {\n super.handleData_(simpleSegment, result);\n }\n }\n updateTimingInfoEnd_() {// noop\n }\n /**\n * Utility function for converting mp4 webvtt cue objects into VTTCues.\n *\n * @param {Object} segmentInfo with mp4 webvtt cues for parsing into VTTCue objecs\n */\n\n parseMp4VttCues_(segmentInfo) {\n const timestampOffset = this.sourceUpdater_.videoTimestampOffset() === null ? this.sourceUpdater_.audioTimestampOffset() : this.sourceUpdater_.videoTimestampOffset();\n segmentInfo.mp4VttCues.forEach(cue => {\n const start = cue.start + timestampOffset;\n const end = cue.end + timestampOffset;\n const vttCue = new window$1.VTTCue(start, end, cue.cueText);\n if (cue.settings) {\n cue.settings.split(' ').forEach(cueSetting => {\n const keyValString = cueSetting.split(':');\n const key = keyValString[0];\n const value = keyValString[1];\n vttCue[key] = isNaN(value) ? value : Number(value);\n });\n }\n segmentInfo.cues.push(vttCue);\n });\n }\n /**\n * Uses the WebVTT parser to parse the segment response\n *\n * @throws NoVttJsError\n *\n * @param {Object} segmentInfo\n * a segment info object that describes the current segment\n * @private\n */\n\n parseVTTCues_(segmentInfo) {\n let decoder;\n let decodeBytesToString = false;\n if (typeof window$1.WebVTT !== 'function') {\n // caller is responsible for exception handling.\n throw new NoVttJsError();\n }\n segmentInfo.cues = [];\n segmentInfo.timestampmap = {\n MPEGTS: 0,\n LOCAL: 0\n };\n if (segmentInfo.mp4VttCues) {\n this.parseMp4VttCues_(segmentInfo);\n return;\n }\n if (typeof window$1.TextDecoder === 'function') {\n decoder = new window$1.TextDecoder('utf8');\n } else {\n decoder = window$1.WebVTT.StringDecoder();\n decodeBytesToString = true;\n }\n const parser = new window$1.WebVTT.Parser(window$1, window$1.vttjs, decoder);\n parser.oncue = segmentInfo.cues.push.bind(segmentInfo.cues);\n parser.ontimestampmap = map => {\n segmentInfo.timestampmap = map;\n };\n parser.onparsingerror = error => {\n videojs.log.warn('Error encountered when parsing cues: ' + error.message);\n };\n if (segmentInfo.segment.map) {\n let mapData = segmentInfo.segment.map.bytes;\n if (decodeBytesToString) {\n mapData = uint8ToUtf8(mapData);\n }\n parser.parse(mapData);\n }\n let segmentData = segmentInfo.bytes;\n if (decodeBytesToString) {\n segmentData = uint8ToUtf8(segmentData);\n }\n parser.parse(segmentData);\n parser.flush();\n }\n /**\n * Updates the start and end times of any cues parsed by the WebVTT parser using\n * the information parsed from the X-TIMESTAMP-MAP header and a TS to media time mapping\n * from the SyncController\n *\n * @param {Object} segmentInfo\n * a segment info object that describes the current segment\n * @param {Object} mappingObj\n * object containing a mapping from TS to media time\n * @param {Object} playlist\n * the playlist object containing the segment\n * @private\n */\n\n updateTimeMapping_(segmentInfo, mappingObj, playlist) {\n const segment = segmentInfo.segment;\n if (!mappingObj) {\n // If the sync controller does not have a mapping of TS to Media Time for the\n // timeline, then we don't have enough information to update the cue\n // start/end times\n return;\n }\n if (!segmentInfo.cues.length) {\n // If there are no cues, we also do not have enough information to figure out\n // segment timing. Mark that the segment contains no cues so we don't re-request\n // an empty segment.\n segment.empty = true;\n return;\n }\n const {\n MPEGTS,\n LOCAL\n } = segmentInfo.timestampmap;\n /**\n * From the spec:\n * The MPEGTS media timestamp MUST use a 90KHz timescale,\n * even when non-WebVTT Media Segments use a different timescale.\n */\n\n const mpegTsInSeconds = MPEGTS / ONE_SECOND_IN_TS;\n const diff = mpegTsInSeconds - LOCAL + mappingObj.mapping;\n segmentInfo.cues.forEach(cue => {\n const duration = cue.endTime - cue.startTime;\n const startTime = this.handleRollover_(cue.startTime + diff, mappingObj.time);\n cue.startTime = Math.max(startTime, 0);\n cue.endTime = Math.max(startTime + duration, 0);\n });\n if (!playlist.syncInfo) {\n const firstStart = segmentInfo.cues[0].startTime;\n const lastStart = segmentInfo.cues[segmentInfo.cues.length - 1].startTime;\n playlist.syncInfo = {\n mediaSequence: playlist.mediaSequence + segmentInfo.mediaIndex,\n time: Math.min(firstStart, lastStart - segment.duration)\n };\n }\n }\n /**\n * MPEG-TS PES timestamps are limited to 2^33.\n * Once they reach 2^33, they roll over to 0.\n * mux.js handles PES timestamp rollover for the following scenarios:\n * [forward rollover(right)] ->\n * PES timestamps monotonically increase, and once they reach 2^33, they roll over to 0\n * [backward rollover(left)] -->\n * we seek back to position before rollover.\n *\n * According to the HLS SPEC:\n * When synchronizing WebVTT with PES timestamps, clients SHOULD account\n * for cases where the 33-bit PES timestamps have wrapped and the WebVTT\n * cue times have not. When the PES timestamp wraps, the WebVTT Segment\n * SHOULD have a X-TIMESTAMP-MAP header that maps the current WebVTT\n * time to the new (low valued) PES timestamp.\n *\n * So we want to handle rollover here and align VTT Cue start/end time to the player's time.\n */\n\n handleRollover_(value, reference) {\n if (reference === null) {\n return value;\n }\n let valueIn90khz = value * ONE_SECOND_IN_TS;\n const referenceIn90khz = reference * ONE_SECOND_IN_TS;\n let offset;\n if (referenceIn90khz < valueIn90khz) {\n // - 2^33\n offset = -8589934592;\n } else {\n // + 2^33\n offset = 8589934592;\n } // distance(value - reference) > 2^32\n\n while (Math.abs(valueIn90khz - referenceIn90khz) > 4294967296) {\n valueIn90khz += offset;\n }\n return valueIn90khz / ONE_SECOND_IN_TS;\n }\n}\n\n/**\n * @file ad-cue-tags.js\n */\n/**\n * Searches for an ad cue that overlaps with the given mediaTime\n *\n * @param {Object} track\n * the track to find the cue for\n *\n * @param {number} mediaTime\n * the time to find the cue at\n *\n * @return {Object|null}\n * the found cue or null\n */\n\nconst findAdCue = function (track, mediaTime) {\n const cues = track.cues;\n for (let i = 0; i < cues.length; i++) {\n const cue = cues[i];\n if (mediaTime >= cue.adStartTime && mediaTime <= cue.adEndTime) {\n return cue;\n }\n }\n return null;\n};\nconst updateAdCues = function (media, track, offset = 0) {\n if (!media.segments) {\n return;\n }\n let mediaTime = offset;\n let cue;\n for (let i = 0; i < media.segments.length; i++) {\n const segment = media.segments[i];\n if (!cue) {\n // Since the cues will span for at least the segment duration, adding a fudge\n // factor of half segment duration will prevent duplicate cues from being\n // created when timing info is not exact (e.g. cue start time initialized\n // at 10.006677, but next call mediaTime is 10.003332 )\n cue = findAdCue(track, mediaTime + segment.duration / 2);\n }\n if (cue) {\n if ('cueIn' in segment) {\n // Found a CUE-IN so end the cue\n cue.endTime = mediaTime;\n cue.adEndTime = mediaTime;\n mediaTime += segment.duration;\n cue = null;\n continue;\n }\n if (mediaTime < cue.endTime) {\n // Already processed this mediaTime for this cue\n mediaTime += segment.duration;\n continue;\n } // otherwise extend cue until a CUE-IN is found\n\n cue.endTime += segment.duration;\n } else {\n if ('cueOut' in segment) {\n cue = new window$1.VTTCue(mediaTime, mediaTime + segment.duration, segment.cueOut);\n cue.adStartTime = mediaTime; // Assumes tag format to be\n // #EXT-X-CUE-OUT:30\n\n cue.adEndTime = mediaTime + parseFloat(segment.cueOut);\n track.addCue(cue);\n }\n if ('cueOutCont' in segment) {\n // Entered into the middle of an ad cue\n // Assumes tag formate to be\n // #EXT-X-CUE-OUT-CONT:10/30\n const [adOffset, adTotal] = segment.cueOutCont.split('/').map(parseFloat);\n cue = new window$1.VTTCue(mediaTime, mediaTime + segment.duration, '');\n cue.adStartTime = mediaTime - adOffset;\n cue.adEndTime = cue.adStartTime + adTotal;\n track.addCue(cue);\n }\n }\n mediaTime += segment.duration;\n }\n};\nclass SyncInfo {\n /**\n * @param {number} start - media sequence start\n * @param {number} end - media sequence end\n * @param {number} segmentIndex - index for associated segment\n * @param {number|null} [partIndex] - index for associated part\n * @param {boolean} [appended] - appended indicator\n *\n */\n constructor({\n start,\n end,\n segmentIndex,\n partIndex = null,\n appended = false\n }) {\n this.start_ = start;\n this.end_ = end;\n this.segmentIndex_ = segmentIndex;\n this.partIndex_ = partIndex;\n this.appended_ = appended;\n }\n isInRange(targetTime) {\n return targetTime >= this.start && targetTime < this.end;\n }\n markAppended() {\n this.appended_ = true;\n }\n resetAppendedStatus() {\n this.appended_ = false;\n }\n get isAppended() {\n return this.appended_;\n }\n get start() {\n return this.start_;\n }\n get end() {\n return this.end_;\n }\n get segmentIndex() {\n return this.segmentIndex_;\n }\n get partIndex() {\n return this.partIndex_;\n }\n}\nclass SyncInfoData {\n /**\n *\n * @param {SyncInfo} segmentSyncInfo - sync info for a given segment\n * @param {Array} [partsSyncInfo] - sync infos for a list of parts for a given segment\n */\n constructor(segmentSyncInfo, partsSyncInfo = []) {\n this.segmentSyncInfo_ = segmentSyncInfo;\n this.partsSyncInfo_ = partsSyncInfo;\n }\n get segmentSyncInfo() {\n return this.segmentSyncInfo_;\n }\n get partsSyncInfo() {\n return this.partsSyncInfo_;\n }\n get hasPartsSyncInfo() {\n return this.partsSyncInfo_.length > 0;\n }\n resetAppendStatus() {\n this.segmentSyncInfo_.resetAppendedStatus();\n this.partsSyncInfo_.forEach(partSyncInfo => partSyncInfo.resetAppendedStatus());\n }\n}\nclass MediaSequenceSync {\n constructor() {\n /**\n * @type {Map}\n * @protected\n */\n this.storage_ = new Map();\n this.diagnostics_ = '';\n this.isReliable_ = false;\n this.start_ = -Infinity;\n this.end_ = Infinity;\n }\n get start() {\n return this.start_;\n }\n get end() {\n return this.end_;\n }\n get diagnostics() {\n return this.diagnostics_;\n }\n get isReliable() {\n return this.isReliable_;\n }\n resetAppendedStatus() {\n this.storage_.forEach(syncInfoData => syncInfoData.resetAppendStatus());\n }\n /**\n * update sync storage\n *\n * @param {Object} playlist\n * @param {number} currentTime\n *\n * @return {void}\n */\n\n update(playlist, currentTime) {\n const {\n mediaSequence,\n segments\n } = playlist;\n this.isReliable_ = this.isReliablePlaylist_(mediaSequence, segments);\n if (!this.isReliable_) {\n return;\n }\n return this.updateStorage_(segments, mediaSequence, this.calculateBaseTime_(mediaSequence, segments, currentTime));\n }\n /**\n * @param {number} targetTime\n * @return {SyncInfo|null}\n */\n\n getSyncInfoForTime(targetTime) {\n for (const {\n segmentSyncInfo,\n partsSyncInfo\n } of this.storage_.values()) {\n // Normal segment flow:\n if (!partsSyncInfo.length) {\n if (segmentSyncInfo.isInRange(targetTime)) {\n return segmentSyncInfo;\n }\n } else {\n // Low latency flow:\n for (const partSyncInfo of partsSyncInfo) {\n if (partSyncInfo.isInRange(targetTime)) {\n return partSyncInfo;\n }\n }\n }\n }\n return null;\n }\n getSyncInfoForMediaSequence(mediaSequence) {\n return this.storage_.get(mediaSequence);\n }\n updateStorage_(segments, startingMediaSequence, startingTime) {\n const newStorage = new Map();\n let newDiagnostics = '\\n';\n let currentStart = startingTime;\n let currentMediaSequence = startingMediaSequence;\n this.start_ = currentStart;\n segments.forEach((segment, segmentIndex) => {\n const prevSyncInfoData = this.storage_.get(currentMediaSequence);\n const segmentStart = currentStart;\n const segmentEnd = segmentStart + segment.duration;\n const segmentIsAppended = Boolean(prevSyncInfoData && prevSyncInfoData.segmentSyncInfo && prevSyncInfoData.segmentSyncInfo.isAppended);\n const segmentSyncInfo = new SyncInfo({\n start: segmentStart,\n end: segmentEnd,\n appended: segmentIsAppended,\n segmentIndex\n });\n segment.syncInfo = segmentSyncInfo;\n let currentPartStart = currentStart;\n const partsSyncInfo = (segment.parts || []).map((part, partIndex) => {\n const partStart = currentPartStart;\n const partEnd = currentPartStart + part.duration;\n const partIsAppended = Boolean(prevSyncInfoData && prevSyncInfoData.partsSyncInfo && prevSyncInfoData.partsSyncInfo[partIndex] && prevSyncInfoData.partsSyncInfo[partIndex].isAppended);\n const partSyncInfo = new SyncInfo({\n start: partStart,\n end: partEnd,\n appended: partIsAppended,\n segmentIndex,\n partIndex\n });\n currentPartStart = partEnd;\n newDiagnostics += `Media Sequence: ${currentMediaSequence}.${partIndex} | Range: ${partStart} --> ${partEnd} | Appended: ${partIsAppended}\\n`;\n part.syncInfo = partSyncInfo;\n return partSyncInfo;\n });\n newStorage.set(currentMediaSequence, new SyncInfoData(segmentSyncInfo, partsSyncInfo));\n newDiagnostics += `${compactSegmentUrlDescription(segment.resolvedUri)} | Media Sequence: ${currentMediaSequence} | Range: ${segmentStart} --> ${segmentEnd} | Appended: ${segmentIsAppended}\\n`;\n currentMediaSequence++;\n currentStart = segmentEnd;\n });\n this.end_ = currentStart;\n this.storage_ = newStorage;\n this.diagnostics_ = newDiagnostics;\n }\n calculateBaseTime_(mediaSequence, segments, fallback) {\n if (!this.storage_.size) {\n // Initial setup flow.\n return 0;\n }\n if (this.storage_.has(mediaSequence)) {\n // Normal flow.\n return this.storage_.get(mediaSequence).segmentSyncInfo.start;\n }\n const minMediaSequenceFromStorage = Math.min(...this.storage_.keys()); // This case captures a race condition that can occur if we switch to a new media playlist that is out of date\n // and still has an older Media Sequence. If this occurs, we extrapolate backwards to get the base time.\n\n if (mediaSequence < minMediaSequenceFromStorage) {\n const mediaSequenceDiff = minMediaSequenceFromStorage - mediaSequence;\n let baseTime = this.storage_.get(minMediaSequenceFromStorage).segmentSyncInfo.start;\n for (let i = 0; i < mediaSequenceDiff; i++) {\n const segment = segments[i];\n baseTime -= segment.duration;\n }\n return baseTime;\n } // Fallback flow.\n // There is a gap between last recorded playlist and a new one received.\n\n return fallback;\n }\n isReliablePlaylist_(mediaSequence, segments) {\n return mediaSequence !== undefined && mediaSequence !== null && Array.isArray(segments) && segments.length;\n }\n}\nclass DependantMediaSequenceSync extends MediaSequenceSync {\n constructor(parent) {\n super();\n this.parent_ = parent;\n }\n calculateBaseTime_(mediaSequence, segments, fallback) {\n if (!this.storage_.size) {\n const info = this.parent_.getSyncInfoForMediaSequence(mediaSequence);\n if (info) {\n return info.segmentSyncInfo.start;\n }\n return 0;\n }\n return super.calculateBaseTime_(mediaSequence, segments, fallback);\n }\n}\n\n/**\n * @file sync-controller.js\n */\n// synchronize expired playlist segments.\n// the max media sequence diff is 48 hours of live stream\n// content with two second segments. Anything larger than that\n// will likely be invalid.\n\nconst MAX_MEDIA_SEQUENCE_DIFF_FOR_SYNC = 86400;\nconst syncPointStrategies = [\n// Stategy \"VOD\": Handle the VOD-case where the sync-point is *always*\n// the equivalence display-time 0 === segment-index 0\n{\n name: 'VOD',\n run: (syncController, playlist, duration, currentTimeline, currentTime) => {\n if (duration !== Infinity) {\n const syncPoint = {\n time: 0,\n segmentIndex: 0,\n partIndex: null\n };\n return syncPoint;\n }\n return null;\n }\n}, {\n name: 'MediaSequence',\n /**\n * run media sequence strategy\n *\n * @param {SyncController} syncController\n * @param {Object} playlist\n * @param {number} duration\n * @param {number} currentTimeline\n * @param {number} currentTime\n * @param {string} type\n */\n run: (syncController, playlist, duration, currentTimeline, currentTime, type) => {\n const mediaSequenceSync = syncController.getMediaSequenceSync(type);\n if (!mediaSequenceSync) {\n return null;\n }\n if (!mediaSequenceSync.isReliable) {\n return null;\n }\n const syncInfo = mediaSequenceSync.getSyncInfoForTime(currentTime);\n if (!syncInfo) {\n return null;\n }\n return {\n time: syncInfo.start,\n partIndex: syncInfo.partIndex,\n segmentIndex: syncInfo.segmentIndex\n };\n }\n},\n// Stategy \"ProgramDateTime\": We have a program-date-time tag in this playlist\n{\n name: 'ProgramDateTime',\n run: (syncController, playlist, duration, currentTimeline, currentTime) => {\n if (!Object.keys(syncController.timelineToDatetimeMappings).length) {\n return null;\n }\n let syncPoint = null;\n let lastDistance = null;\n const partsAndSegments = getPartsAndSegments(playlist);\n currentTime = currentTime || 0;\n for (let i = 0; i < partsAndSegments.length; i++) {\n // start from the end and loop backwards for live\n // or start from the front and loop forwards for non-live\n const index = playlist.endList || currentTime === 0 ? i : partsAndSegments.length - (i + 1);\n const partAndSegment = partsAndSegments[index];\n const segment = partAndSegment.segment;\n const datetimeMapping = syncController.timelineToDatetimeMappings[segment.timeline];\n if (!datetimeMapping || !segment.dateTimeObject) {\n continue;\n }\n const segmentTime = segment.dateTimeObject.getTime() / 1000;\n let start = segmentTime + datetimeMapping; // take part duration into account.\n\n if (segment.parts && typeof partAndSegment.partIndex === 'number') {\n for (let z = 0; z < partAndSegment.partIndex; z++) {\n start += segment.parts[z].duration;\n }\n }\n const distance = Math.abs(currentTime - start); // Once the distance begins to increase, or if distance is 0, we have passed\n // currentTime and can stop looking for better candidates\n\n if (lastDistance !== null && (distance === 0 || lastDistance < distance)) {\n break;\n }\n lastDistance = distance;\n syncPoint = {\n time: start,\n segmentIndex: partAndSegment.segmentIndex,\n partIndex: partAndSegment.partIndex\n };\n }\n return syncPoint;\n }\n},\n// Stategy \"Segment\": We have a known time mapping for a timeline and a\n// segment in the current timeline with timing data\n{\n name: 'Segment',\n run: (syncController, playlist, duration, currentTimeline, currentTime) => {\n let syncPoint = null;\n let lastDistance = null;\n currentTime = currentTime || 0;\n const partsAndSegments = getPartsAndSegments(playlist);\n for (let i = 0; i < partsAndSegments.length; i++) {\n // start from the end and loop backwards for live\n // or start from the front and loop forwards for non-live\n const index = playlist.endList || currentTime === 0 ? i : partsAndSegments.length - (i + 1);\n const partAndSegment = partsAndSegments[index];\n const segment = partAndSegment.segment;\n const start = partAndSegment.part && partAndSegment.part.start || segment && segment.start;\n if (segment.timeline === currentTimeline && typeof start !== 'undefined') {\n const distance = Math.abs(currentTime - start); // Once the distance begins to increase, we have passed\n // currentTime and can stop looking for better candidates\n\n if (lastDistance !== null && lastDistance < distance) {\n break;\n }\n if (!syncPoint || lastDistance === null || lastDistance >= distance) {\n lastDistance = distance;\n syncPoint = {\n time: start,\n segmentIndex: partAndSegment.segmentIndex,\n partIndex: partAndSegment.partIndex\n };\n }\n }\n }\n return syncPoint;\n }\n},\n// Stategy \"Discontinuity\": We have a discontinuity with a known\n// display-time\n{\n name: 'Discontinuity',\n run: (syncController, playlist, duration, currentTimeline, currentTime) => {\n let syncPoint = null;\n currentTime = currentTime || 0;\n if (playlist.discontinuityStarts && playlist.discontinuityStarts.length) {\n let lastDistance = null;\n for (let i = 0; i < playlist.discontinuityStarts.length; i++) {\n const segmentIndex = playlist.discontinuityStarts[i];\n const discontinuity = playlist.discontinuitySequence + i + 1;\n const discontinuitySync = syncController.discontinuities[discontinuity];\n if (discontinuitySync) {\n const distance = Math.abs(currentTime - discontinuitySync.time); // Once the distance begins to increase, we have passed\n // currentTime and can stop looking for better candidates\n\n if (lastDistance !== null && lastDistance < distance) {\n break;\n }\n if (!syncPoint || lastDistance === null || lastDistance >= distance) {\n lastDistance = distance;\n syncPoint = {\n time: discontinuitySync.time,\n segmentIndex,\n partIndex: null\n };\n }\n }\n }\n }\n return syncPoint;\n }\n},\n// Stategy \"Playlist\": We have a playlist with a known mapping of\n// segment index to display time\n{\n name: 'Playlist',\n run: (syncController, playlist, duration, currentTimeline, currentTime) => {\n if (playlist.syncInfo) {\n const syncPoint = {\n time: playlist.syncInfo.time,\n segmentIndex: playlist.syncInfo.mediaSequence - playlist.mediaSequence,\n partIndex: null\n };\n return syncPoint;\n }\n return null;\n }\n}];\nclass SyncController extends videojs.EventTarget {\n constructor(options = {}) {\n super(); // ...for synching across variants\n\n this.timelines = [];\n this.discontinuities = [];\n this.timelineToDatetimeMappings = {}; // TODO: this map should be only available for HLS. Since only HLS has MediaSequence.\n // For some reason this map helps with syncing between quality switch for MPEG-DASH as well.\n // Moreover if we disable this map for MPEG-DASH - quality switch will be broken.\n // MPEG-DASH should have its own separate sync strategy\n\n const main = new MediaSequenceSync();\n const audio = new DependantMediaSequenceSync(main);\n const vtt = new DependantMediaSequenceSync(main);\n this.mediaSequenceStorage_ = {\n main,\n audio,\n vtt\n };\n this.logger_ = logger('SyncController');\n }\n /**\n *\n * @param {string} loaderType\n * @return {MediaSequenceSync|null}\n */\n\n getMediaSequenceSync(loaderType) {\n return this.mediaSequenceStorage_[loaderType] || null;\n }\n /**\n * Find a sync-point for the playlist specified\n *\n * A sync-point is defined as a known mapping from display-time to\n * a segment-index in the current playlist.\n *\n * @param {Playlist} playlist\n * The playlist that needs a sync-point\n * @param {number} duration\n * Duration of the MediaSource (Infinite if playing a live source)\n * @param {number} currentTimeline\n * The last timeline from which a segment was loaded\n * @param {number} currentTime\n * Current player's time\n * @param {string} type\n * Segment loader type\n * @return {Object}\n * A sync-point object\n */\n\n getSyncPoint(playlist, duration, currentTimeline, currentTime, type) {\n // Always use VOD sync point for VOD\n if (duration !== Infinity) {\n const vodSyncPointStrategy = syncPointStrategies.find(({\n name\n }) => name === 'VOD');\n return vodSyncPointStrategy.run(this, playlist, duration);\n }\n const syncPoints = this.runStrategies_(playlist, duration, currentTimeline, currentTime, type);\n if (!syncPoints.length) {\n // Signal that we need to attempt to get a sync-point manually\n // by fetching a segment in the playlist and constructing\n // a sync-point from that information\n return null;\n } // If we have exact match just return it instead of finding the nearest distance\n\n for (const syncPointInfo of syncPoints) {\n const {\n syncPoint,\n strategy\n } = syncPointInfo;\n const {\n segmentIndex,\n time\n } = syncPoint;\n if (segmentIndex < 0) {\n continue;\n }\n const selectedSegment = playlist.segments[segmentIndex];\n const start = time;\n const end = start + selectedSegment.duration;\n this.logger_(`Strategy: ${strategy}. Current time: ${currentTime}. selected segment: ${segmentIndex}. Time: [${start} -> ${end}]}`);\n if (currentTime >= start && currentTime < end) {\n this.logger_('Found sync point with exact match: ', syncPoint);\n return syncPoint;\n }\n } // Now find the sync-point that is closest to the currentTime because\n // that should result in the most accurate guess about which segment\n // to fetch\n\n return this.selectSyncPoint_(syncPoints, {\n key: 'time',\n value: currentTime\n });\n }\n /**\n * Calculate the amount of time that has expired off the playlist during playback\n *\n * @param {Playlist} playlist\n * Playlist object to calculate expired from\n * @param {number} duration\n * Duration of the MediaSource (Infinity if playling a live source)\n * @return {number|null}\n * The amount of time that has expired off the playlist during playback. Null\n * if no sync-points for the playlist can be found.\n */\n\n getExpiredTime(playlist, duration) {\n if (!playlist || !playlist.segments) {\n return null;\n }\n const syncPoints = this.runStrategies_(playlist, duration, playlist.discontinuitySequence, 0); // Without sync-points, there is not enough information to determine the expired time\n\n if (!syncPoints.length) {\n return null;\n }\n const syncPoint = this.selectSyncPoint_(syncPoints, {\n key: 'segmentIndex',\n value: 0\n }); // If the sync-point is beyond the start of the playlist, we want to subtract the\n // duration from index 0 to syncPoint.segmentIndex instead of adding.\n\n if (syncPoint.segmentIndex > 0) {\n syncPoint.time *= -1;\n }\n return Math.abs(syncPoint.time + sumDurations({\n defaultDuration: playlist.targetDuration,\n durationList: playlist.segments,\n startIndex: syncPoint.segmentIndex,\n endIndex: 0\n }));\n }\n /**\n * Runs each sync-point strategy and returns a list of sync-points returned by the\n * strategies\n *\n * @private\n * @param {Playlist} playlist\n * The playlist that needs a sync-point\n * @param {number} duration\n * Duration of the MediaSource (Infinity if playing a live source)\n * @param {number} currentTimeline\n * The last timeline from which a segment was loaded\n * @param {number} currentTime\n * Current player's time\n * @param {string} type\n * Segment loader type\n * @return {Array}\n * A list of sync-point objects\n */\n\n runStrategies_(playlist, duration, currentTimeline, currentTime, type) {\n const syncPoints = []; // Try to find a sync-point in by utilizing various strategies...\n\n for (let i = 0; i < syncPointStrategies.length; i++) {\n const strategy = syncPointStrategies[i];\n const syncPoint = strategy.run(this, playlist, duration, currentTimeline, currentTime, type);\n if (syncPoint) {\n syncPoint.strategy = strategy.name;\n syncPoints.push({\n strategy: strategy.name,\n syncPoint\n });\n }\n }\n return syncPoints;\n }\n /**\n * Selects the sync-point nearest the specified target\n *\n * @private\n * @param {Array} syncPoints\n * List of sync-points to select from\n * @param {Object} target\n * Object specifying the property and value we are targeting\n * @param {string} target.key\n * Specifies the property to target. Must be either 'time' or 'segmentIndex'\n * @param {number} target.value\n * The value to target for the specified key.\n * @return {Object}\n * The sync-point nearest the target\n */\n\n selectSyncPoint_(syncPoints, target) {\n let bestSyncPoint = syncPoints[0].syncPoint;\n let bestDistance = Math.abs(syncPoints[0].syncPoint[target.key] - target.value);\n let bestStrategy = syncPoints[0].strategy;\n for (let i = 1; i < syncPoints.length; i++) {\n const newDistance = Math.abs(syncPoints[i].syncPoint[target.key] - target.value);\n if (newDistance < bestDistance) {\n bestDistance = newDistance;\n bestSyncPoint = syncPoints[i].syncPoint;\n bestStrategy = syncPoints[i].strategy;\n }\n }\n this.logger_(`syncPoint for [${target.key}: ${target.value}] chosen with strategy` + ` [${bestStrategy}]: [time:${bestSyncPoint.time},` + ` segmentIndex:${bestSyncPoint.segmentIndex}` + (typeof bestSyncPoint.partIndex === 'number' ? `,partIndex:${bestSyncPoint.partIndex}` : '') + ']');\n return bestSyncPoint;\n }\n /**\n * Save any meta-data present on the segments when segments leave\n * the live window to the playlist to allow for synchronization at the\n * playlist level later.\n *\n * @param {Playlist} oldPlaylist - The previous active playlist\n * @param {Playlist} newPlaylist - The updated and most current playlist\n */\n\n saveExpiredSegmentInfo(oldPlaylist, newPlaylist) {\n const mediaSequenceDiff = newPlaylist.mediaSequence - oldPlaylist.mediaSequence; // Ignore large media sequence gaps\n\n if (mediaSequenceDiff > MAX_MEDIA_SEQUENCE_DIFF_FOR_SYNC) {\n videojs.log.warn(`Not saving expired segment info. Media sequence gap ${mediaSequenceDiff} is too large.`);\n return;\n } // When a segment expires from the playlist and it has a start time\n // save that information as a possible sync-point reference in future\n\n for (let i = mediaSequenceDiff - 1; i >= 0; i--) {\n const lastRemovedSegment = oldPlaylist.segments[i];\n if (lastRemovedSegment && typeof lastRemovedSegment.start !== 'undefined') {\n newPlaylist.syncInfo = {\n mediaSequence: oldPlaylist.mediaSequence + i,\n time: lastRemovedSegment.start\n };\n this.logger_(`playlist refresh sync: [time:${newPlaylist.syncInfo.time},` + ` mediaSequence: ${newPlaylist.syncInfo.mediaSequence}]`);\n this.trigger('syncinfoupdate');\n break;\n }\n }\n }\n /**\n * Save the mapping from playlist's ProgramDateTime to display. This should only happen\n * before segments start to load.\n *\n * @param {Playlist} playlist - The currently active playlist\n */\n\n setDateTimeMappingForStart(playlist) {\n // It's possible for the playlist to be updated before playback starts, meaning time\n // zero is not yet set. If, during these playlist refreshes, a discontinuity is\n // crossed, then the old time zero mapping (for the prior timeline) would be retained\n // unless the mappings are cleared.\n this.timelineToDatetimeMappings = {};\n if (playlist.segments && playlist.segments.length && playlist.segments[0].dateTimeObject) {\n const firstSegment = playlist.segments[0];\n const playlistTimestamp = firstSegment.dateTimeObject.getTime() / 1000;\n this.timelineToDatetimeMappings[firstSegment.timeline] = -playlistTimestamp;\n }\n }\n /**\n * Calculates and saves timeline mappings, playlist sync info, and segment timing values\n * based on the latest timing information.\n *\n * @param {Object} options\n * Options object\n * @param {SegmentInfo} options.segmentInfo\n * The current active request information\n * @param {boolean} options.shouldSaveTimelineMapping\n * If there's a timeline change, determines if the timeline mapping should be\n * saved for timeline mapping and program date time mappings.\n */\n\n saveSegmentTimingInfo({\n segmentInfo,\n shouldSaveTimelineMapping\n }) {\n const didCalculateSegmentTimeMapping = this.calculateSegmentTimeMapping_(segmentInfo, segmentInfo.timingInfo, shouldSaveTimelineMapping);\n const segment = segmentInfo.segment;\n if (didCalculateSegmentTimeMapping) {\n this.saveDiscontinuitySyncInfo_(segmentInfo); // If the playlist does not have sync information yet, record that information\n // now with segment timing information\n\n if (!segmentInfo.playlist.syncInfo) {\n segmentInfo.playlist.syncInfo = {\n mediaSequence: segmentInfo.playlist.mediaSequence + segmentInfo.mediaIndex,\n time: segment.start\n };\n }\n }\n const dateTime = segment.dateTimeObject;\n if (segment.discontinuity && shouldSaveTimelineMapping && dateTime) {\n this.timelineToDatetimeMappings[segment.timeline] = -(dateTime.getTime() / 1000);\n }\n }\n timestampOffsetForTimeline(timeline) {\n if (typeof this.timelines[timeline] === 'undefined') {\n return null;\n }\n return this.timelines[timeline].time;\n }\n mappingForTimeline(timeline) {\n if (typeof this.timelines[timeline] === 'undefined') {\n return null;\n }\n return this.timelines[timeline].mapping;\n }\n /**\n * Use the \"media time\" for a segment to generate a mapping to \"display time\" and\n * save that display time to the segment.\n *\n * @private\n * @param {SegmentInfo} segmentInfo\n * The current active request information\n * @param {Object} timingInfo\n * The start and end time of the current segment in \"media time\"\n * @param {boolean} shouldSaveTimelineMapping\n * If there's a timeline change, determines if the timeline mapping should be\n * saved in timelines.\n * @return {boolean}\n * Returns false if segment time mapping could not be calculated\n */\n\n calculateSegmentTimeMapping_(segmentInfo, timingInfo, shouldSaveTimelineMapping) {\n // TODO: remove side effects\n const segment = segmentInfo.segment;\n const part = segmentInfo.part;\n let mappingObj = this.timelines[segmentInfo.timeline];\n let start;\n let end;\n if (typeof segmentInfo.timestampOffset === 'number') {\n mappingObj = {\n time: segmentInfo.startOfSegment,\n mapping: segmentInfo.startOfSegment - timingInfo.start\n };\n if (shouldSaveTimelineMapping) {\n this.timelines[segmentInfo.timeline] = mappingObj;\n this.trigger('timestampoffset');\n this.logger_(`time mapping for timeline ${segmentInfo.timeline}: ` + `[time: ${mappingObj.time}] [mapping: ${mappingObj.mapping}]`);\n }\n start = segmentInfo.startOfSegment;\n end = timingInfo.end + mappingObj.mapping;\n } else if (mappingObj) {\n start = timingInfo.start + mappingObj.mapping;\n end = timingInfo.end + mappingObj.mapping;\n } else {\n return false;\n }\n if (part) {\n part.start = start;\n part.end = end;\n } // If we don't have a segment start yet or the start value we got\n // is less than our current segment.start value, save a new start value.\n // We have to do this because parts will have segment timing info saved\n // multiple times and we want segment start to be the earliest part start\n // value for that segment.\n\n if (!segment.start || start < segment.start) {\n segment.start = start;\n }\n segment.end = end;\n return true;\n }\n /**\n * Each time we have discontinuity in the playlist, attempt to calculate the location\n * in display of the start of the discontinuity and save that. We also save an accuracy\n * value so that we save values with the most accuracy (closest to 0.)\n *\n * @private\n * @param {SegmentInfo} segmentInfo - The current active request information\n */\n\n saveDiscontinuitySyncInfo_(segmentInfo) {\n const playlist = segmentInfo.playlist;\n const segment = segmentInfo.segment; // If the current segment is a discontinuity then we know exactly where\n // the start of the range and it's accuracy is 0 (greater accuracy values\n // mean more approximation)\n\n if (segment.discontinuity) {\n this.discontinuities[segment.timeline] = {\n time: segment.start,\n accuracy: 0\n };\n } else if (playlist.discontinuityStarts && playlist.discontinuityStarts.length) {\n // Search for future discontinuities that we can provide better timing\n // information for and save that information for sync purposes\n for (let i = 0; i < playlist.discontinuityStarts.length; i++) {\n const segmentIndex = playlist.discontinuityStarts[i];\n const discontinuity = playlist.discontinuitySequence + i + 1;\n const mediaIndexDiff = segmentIndex - segmentInfo.mediaIndex;\n const accuracy = Math.abs(mediaIndexDiff);\n if (!this.discontinuities[discontinuity] || this.discontinuities[discontinuity].accuracy > accuracy) {\n let time;\n if (mediaIndexDiff < 0) {\n time = segment.start - sumDurations({\n defaultDuration: playlist.targetDuration,\n durationList: playlist.segments,\n startIndex: segmentInfo.mediaIndex,\n endIndex: segmentIndex\n });\n } else {\n time = segment.end + sumDurations({\n defaultDuration: playlist.targetDuration,\n durationList: playlist.segments,\n startIndex: segmentInfo.mediaIndex + 1,\n endIndex: segmentIndex\n });\n }\n this.discontinuities[discontinuity] = {\n time,\n accuracy\n };\n }\n }\n }\n }\n dispose() {\n this.trigger('dispose');\n this.off();\n }\n}\n\n/**\n * The TimelineChangeController acts as a source for segment loaders to listen for and\n * keep track of latest and pending timeline changes. This is useful to ensure proper\n * sync, as each loader may need to make a consideration for what timeline the other\n * loader is on before making changes which could impact the other loader's media.\n *\n * @class TimelineChangeController\n * @extends videojs.EventTarget\n */\n\nclass TimelineChangeController extends videojs.EventTarget {\n constructor() {\n super();\n this.pendingTimelineChanges_ = {};\n this.lastTimelineChanges_ = {};\n }\n clearPendingTimelineChange(type) {\n this.pendingTimelineChanges_[type] = null;\n this.trigger('pendingtimelinechange');\n }\n pendingTimelineChange({\n type,\n from,\n to\n }) {\n if (typeof from === 'number' && typeof to === 'number') {\n this.pendingTimelineChanges_[type] = {\n type,\n from,\n to\n };\n this.trigger('pendingtimelinechange');\n }\n return this.pendingTimelineChanges_[type];\n }\n lastTimelineChange({\n type,\n from,\n to\n }) {\n if (typeof from === 'number' && typeof to === 'number') {\n this.lastTimelineChanges_[type] = {\n type,\n from,\n to\n };\n delete this.pendingTimelineChanges_[type];\n const metadata = {\n timelineChangeInfo: {\n from,\n to\n }\n };\n this.trigger({\n type: 'timelinechange',\n metadata\n });\n }\n return this.lastTimelineChanges_[type];\n }\n dispose() {\n this.trigger('dispose');\n this.pendingTimelineChanges_ = {};\n this.lastTimelineChanges_ = {};\n this.off();\n }\n}\n\n/* rollup-plugin-worker-factory start for worker!/home/runner/work/http-streaming/http-streaming/src/decrypter-worker.js */\nconst workerCode = transform(getWorkerString(function () {\n /**\n * @file stream.js\n */\n\n /**\n * A lightweight readable stream implemention that handles event dispatching.\n *\n * @class Stream\n */\n\n var Stream = /*#__PURE__*/function () {\n function Stream() {\n this.listeners = {};\n }\n /**\n * Add a listener for a specified event type.\n *\n * @param {string} type the event name\n * @param {Function} listener the callback to be invoked when an event of\n * the specified type occurs\n */\n\n var _proto = Stream.prototype;\n _proto.on = function on(type, listener) {\n if (!this.listeners[type]) {\n this.listeners[type] = [];\n }\n this.listeners[type].push(listener);\n }\n /**\n * Remove a listener for a specified event type.\n *\n * @param {string} type the event name\n * @param {Function} listener a function previously registered for this\n * type of event through `on`\n * @return {boolean} if we could turn it off or not\n */;\n _proto.off = function off(type, listener) {\n if (!this.listeners[type]) {\n return false;\n }\n var index = this.listeners[type].indexOf(listener); // TODO: which is better?\n // In Video.js we slice listener functions\n // on trigger so that it does not mess up the order\n // while we loop through.\n //\n // Here we slice on off so that the loop in trigger\n // can continue using it's old reference to loop without\n // messing up the order.\n\n this.listeners[type] = this.listeners[type].slice(0);\n this.listeners[type].splice(index, 1);\n return index > -1;\n }\n /**\n * Trigger an event of the specified type on this stream. Any additional\n * arguments to this function are passed as parameters to event listeners.\n *\n * @param {string} type the event name\n */;\n _proto.trigger = function trigger(type) {\n var callbacks = this.listeners[type];\n if (!callbacks) {\n return;\n } // Slicing the arguments on every invocation of this method\n // can add a significant amount of overhead. Avoid the\n // intermediate object creation for the common case of a\n // single callback argument\n\n if (arguments.length === 2) {\n var length = callbacks.length;\n for (var i = 0; i < length; ++i) {\n callbacks[i].call(this, arguments[1]);\n }\n } else {\n var args = Array.prototype.slice.call(arguments, 1);\n var _length = callbacks.length;\n for (var _i = 0; _i < _length; ++_i) {\n callbacks[_i].apply(this, args);\n }\n }\n }\n /**\n * Destroys the stream and cleans up.\n */;\n _proto.dispose = function dispose() {\n this.listeners = {};\n }\n /**\n * Forwards all `data` events on this stream to the destination stream. The\n * destination stream should provide a method `push` to receive the data\n * events as they arrive.\n *\n * @param {Stream} destination the stream that will receive all `data` events\n * @see http://nodejs.org/api/stream.html#stream_readable_pipe_destination_options\n */;\n _proto.pipe = function pipe(destination) {\n this.on('data', function (data) {\n destination.push(data);\n });\n };\n return Stream;\n }();\n /*! @name pkcs7 @version 1.0.4 @license Apache-2.0 */\n\n /**\n * Returns the subarray of a Uint8Array without PKCS#7 padding.\n *\n * @param padded {Uint8Array} unencrypted bytes that have been padded\n * @return {Uint8Array} the unpadded bytes\n * @see http://tools.ietf.org/html/rfc5652\n */\n\n function unpad(padded) {\n return padded.subarray(0, padded.byteLength - padded[padded.byteLength - 1]);\n }\n /*! @name aes-decrypter @version 4.0.2 @license Apache-2.0 */\n\n /**\n * @file aes.js\n *\n * This file contains an adaptation of the AES decryption algorithm\n * from the Standford Javascript Cryptography Library. That work is\n * covered by the following copyright and permissions notice:\n *\n * Copyright 2009-2010 Emily Stark, Mike Hamburg, Dan Boneh.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\n * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * The views and conclusions contained in the software and documentation\n * are those of the authors and should not be interpreted as representing\n * official policies, either expressed or implied, of the authors.\n */\n\n /**\n * Expand the S-box tables.\n *\n * @private\n */\n\n const precompute = function () {\n const tables = [[[], [], [], [], []], [[], [], [], [], []]];\n const encTable = tables[0];\n const decTable = tables[1];\n const sbox = encTable[4];\n const sboxInv = decTable[4];\n let i;\n let x;\n let xInv;\n const d = [];\n const th = [];\n let x2;\n let x4;\n let x8;\n let s;\n let tEnc;\n let tDec; // Compute double and third tables\n\n for (i = 0; i < 256; i++) {\n th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;\n }\n for (x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n sbox[x] = s;\n sboxInv[s] = x; // Compute MixColumns\n\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n for (i = 0; i < 4; i++) {\n encTable[i][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n decTable[i][s] = tDec = tDec << 24 ^ tDec >>> 8;\n }\n } // Compactify. Considerable speedup on Firefox.\n\n for (i = 0; i < 5; i++) {\n encTable[i] = encTable[i].slice(0);\n decTable[i] = decTable[i].slice(0);\n }\n return tables;\n };\n let aesTables = null;\n /**\n * Schedule out an AES key for both encryption and decryption. This\n * is a low-level class. Use a cipher mode to do bulk encryption.\n *\n * @class AES\n * @param key {Array} The key as an array of 4, 6 or 8 words.\n */\n\n class AES {\n constructor(key) {\n /**\n * The expanded S-box and inverse S-box tables. These will be computed\n * on the client so that we don't have to send them down the wire.\n *\n * There are two tables, _tables[0] is for encryption and\n * _tables[1] is for decryption.\n *\n * The first 4 sub-tables are the expanded S-box with MixColumns. The\n * last (_tables[01][4]) is the S-box itself.\n *\n * @private\n */\n // if we have yet to precompute the S-box tables\n // do so now\n if (!aesTables) {\n aesTables = precompute();\n } // then make a copy of that object for use\n\n this._tables = [[aesTables[0][0].slice(), aesTables[0][1].slice(), aesTables[0][2].slice(), aesTables[0][3].slice(), aesTables[0][4].slice()], [aesTables[1][0].slice(), aesTables[1][1].slice(), aesTables[1][2].slice(), aesTables[1][3].slice(), aesTables[1][4].slice()]];\n let i;\n let j;\n let tmp;\n const sbox = this._tables[0][4];\n const decTable = this._tables[1];\n const keyLen = key.length;\n let rcon = 1;\n if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) {\n throw new Error('Invalid aes key size');\n }\n const encKey = key.slice(0);\n const decKey = [];\n this._key = [encKey, decKey]; // schedule encryption keys\n\n for (i = keyLen; i < 4 * keyLen + 28; i++) {\n tmp = encKey[i - 1]; // apply sbox\n\n if (i % keyLen === 0 || keyLen === 8 && i % keyLen === 4) {\n tmp = sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255]; // shift rows and add rcon\n\n if (i % keyLen === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ rcon << 24;\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n encKey[i] = encKey[i - keyLen] ^ tmp;\n } // schedule decryption keys\n\n for (j = 0; i; j++, i--) {\n tmp = encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n decKey[j] = tmp;\n } else {\n decKey[j] = decTable[0][sbox[tmp >>> 24]] ^ decTable[1][sbox[tmp >> 16 & 255]] ^ decTable[2][sbox[tmp >> 8 & 255]] ^ decTable[3][sbox[tmp & 255]];\n }\n }\n }\n /**\n * Decrypt 16 bytes, specified as four 32-bit words.\n *\n * @param {number} encrypted0 the first word to decrypt\n * @param {number} encrypted1 the second word to decrypt\n * @param {number} encrypted2 the third word to decrypt\n * @param {number} encrypted3 the fourth word to decrypt\n * @param {Int32Array} out the array to write the decrypted words\n * into\n * @param {number} offset the offset into the output array to start\n * writing results\n * @return {Array} The plaintext.\n */\n\n decrypt(encrypted0, encrypted1, encrypted2, encrypted3, out, offset) {\n const key = this._key[1]; // state variables a,b,c,d are loaded with pre-whitened data\n\n let a = encrypted0 ^ key[0];\n let b = encrypted3 ^ key[1];\n let c = encrypted2 ^ key[2];\n let d = encrypted1 ^ key[3];\n let a2;\n let b2;\n let c2; // key.length === 2 ?\n\n const nInnerRounds = key.length / 4 - 2;\n let i;\n let kIndex = 4;\n const table = this._tables[1]; // load up the tables\n\n const table0 = table[0];\n const table1 = table[1];\n const table2 = table[2];\n const table3 = table[3];\n const sbox = table[4]; // Inner rounds. Cribbed from OpenSSL.\n\n for (i = 0; i < nInnerRounds; i++) {\n a2 = table0[a >>> 24] ^ table1[b >> 16 & 255] ^ table2[c >> 8 & 255] ^ table3[d & 255] ^ key[kIndex];\n b2 = table0[b >>> 24] ^ table1[c >> 16 & 255] ^ table2[d >> 8 & 255] ^ table3[a & 255] ^ key[kIndex + 1];\n c2 = table0[c >>> 24] ^ table1[d >> 16 & 255] ^ table2[a >> 8 & 255] ^ table3[b & 255] ^ key[kIndex + 2];\n d = table0[d >>> 24] ^ table1[a >> 16 & 255] ^ table2[b >> 8 & 255] ^ table3[c & 255] ^ key[kIndex + 3];\n kIndex += 4;\n a = a2;\n b = b2;\n c = c2;\n } // Last round.\n\n for (i = 0; i < 4; i++) {\n out[(3 & -i) + offset] = sbox[a >>> 24] << 24 ^ sbox[b >> 16 & 255] << 16 ^ sbox[c >> 8 & 255] << 8 ^ sbox[d & 255] ^ key[kIndex++];\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n }\n }\n /**\n * @file async-stream.js\n */\n\n /**\n * A wrapper around the Stream class to use setTimeout\n * and run stream \"jobs\" Asynchronously\n *\n * @class AsyncStream\n * @extends Stream\n */\n\n class AsyncStream extends Stream {\n constructor() {\n super(Stream);\n this.jobs = [];\n this.delay = 1;\n this.timeout_ = null;\n }\n /**\n * process an async job\n *\n * @private\n */\n\n processJob_() {\n this.jobs.shift()();\n if (this.jobs.length) {\n this.timeout_ = setTimeout(this.processJob_.bind(this), this.delay);\n } else {\n this.timeout_ = null;\n }\n }\n /**\n * push a job into the stream\n *\n * @param {Function} job the job to push into the stream\n */\n\n push(job) {\n this.jobs.push(job);\n if (!this.timeout_) {\n this.timeout_ = setTimeout(this.processJob_.bind(this), this.delay);\n }\n }\n }\n /**\n * @file decrypter.js\n *\n * An asynchronous implementation of AES-128 CBC decryption with\n * PKCS#7 padding.\n */\n\n /**\n * Convert network-order (big-endian) bytes into their little-endian\n * representation.\n */\n\n const ntoh = function (word) {\n return word << 24 | (word & 0xff00) << 8 | (word & 0xff0000) >> 8 | word >>> 24;\n };\n /**\n * Decrypt bytes using AES-128 with CBC and PKCS#7 padding.\n *\n * @param {Uint8Array} encrypted the encrypted bytes\n * @param {Uint32Array} key the bytes of the decryption key\n * @param {Uint32Array} initVector the initialization vector (IV) to\n * use for the first round of CBC.\n * @return {Uint8Array} the decrypted bytes\n *\n * @see http://en.wikipedia.org/wiki/Advanced_Encryption_Standard\n * @see http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_Block_Chaining_.28CBC.29\n * @see https://tools.ietf.org/html/rfc2315\n */\n\n const decrypt = function (encrypted, key, initVector) {\n // word-level access to the encrypted bytes\n const encrypted32 = new Int32Array(encrypted.buffer, encrypted.byteOffset, encrypted.byteLength >> 2);\n const decipher = new AES(Array.prototype.slice.call(key)); // byte and word-level access for the decrypted output\n\n const decrypted = new Uint8Array(encrypted.byteLength);\n const decrypted32 = new Int32Array(decrypted.buffer); // temporary variables for working with the IV, encrypted, and\n // decrypted data\n\n let init0;\n let init1;\n let init2;\n let init3;\n let encrypted0;\n let encrypted1;\n let encrypted2;\n let encrypted3; // iteration variable\n\n let wordIx; // pull out the words of the IV to ensure we don't modify the\n // passed-in reference and easier access\n\n init0 = initVector[0];\n init1 = initVector[1];\n init2 = initVector[2];\n init3 = initVector[3]; // decrypt four word sequences, applying cipher-block chaining (CBC)\n // to each decrypted block\n\n for (wordIx = 0; wordIx < encrypted32.length; wordIx += 4) {\n // convert big-endian (network order) words into little-endian\n // (javascript order)\n encrypted0 = ntoh(encrypted32[wordIx]);\n encrypted1 = ntoh(encrypted32[wordIx + 1]);\n encrypted2 = ntoh(encrypted32[wordIx + 2]);\n encrypted3 = ntoh(encrypted32[wordIx + 3]); // decrypt the block\n\n decipher.decrypt(encrypted0, encrypted1, encrypted2, encrypted3, decrypted32, wordIx); // XOR with the IV, and restore network byte-order to obtain the\n // plaintext\n\n decrypted32[wordIx] = ntoh(decrypted32[wordIx] ^ init0);\n decrypted32[wordIx + 1] = ntoh(decrypted32[wordIx + 1] ^ init1);\n decrypted32[wordIx + 2] = ntoh(decrypted32[wordIx + 2] ^ init2);\n decrypted32[wordIx + 3] = ntoh(decrypted32[wordIx + 3] ^ init3); // setup the IV for the next round\n\n init0 = encrypted0;\n init1 = encrypted1;\n init2 = encrypted2;\n init3 = encrypted3;\n }\n return decrypted;\n };\n /**\n * The `Decrypter` class that manages decryption of AES\n * data through `AsyncStream` objects and the `decrypt`\n * function\n *\n * @param {Uint8Array} encrypted the encrypted bytes\n * @param {Uint32Array} key the bytes of the decryption key\n * @param {Uint32Array} initVector the initialization vector (IV) to\n * @param {Function} done the function to run when done\n * @class Decrypter\n */\n\n class Decrypter {\n constructor(encrypted, key, initVector, done) {\n const step = Decrypter.STEP;\n const encrypted32 = new Int32Array(encrypted.buffer);\n const decrypted = new Uint8Array(encrypted.byteLength);\n let i = 0;\n this.asyncStream_ = new AsyncStream(); // split up the encryption job and do the individual chunks asynchronously\n\n this.asyncStream_.push(this.decryptChunk_(encrypted32.subarray(i, i + step), key, initVector, decrypted));\n for (i = step; i < encrypted32.length; i += step) {\n initVector = new Uint32Array([ntoh(encrypted32[i - 4]), ntoh(encrypted32[i - 3]), ntoh(encrypted32[i - 2]), ntoh(encrypted32[i - 1])]);\n this.asyncStream_.push(this.decryptChunk_(encrypted32.subarray(i, i + step), key, initVector, decrypted));\n } // invoke the done() callback when everything is finished\n\n this.asyncStream_.push(function () {\n // remove pkcs#7 padding from the decrypted bytes\n done(null, unpad(decrypted));\n });\n }\n /**\n * a getter for step the maximum number of bytes to process at one time\n *\n * @return {number} the value of step 32000\n */\n\n static get STEP() {\n // 4 * 8000;\n return 32000;\n }\n /**\n * @private\n */\n\n decryptChunk_(encrypted, key, initVector, decrypted) {\n return function () {\n const bytes = decrypt(encrypted, key, initVector);\n decrypted.set(bytes, encrypted.byteOffset);\n };\n }\n }\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n var win;\n if (typeof window !== \"undefined\") {\n win = window;\n } else if (typeof commonjsGlobal !== \"undefined\") {\n win = commonjsGlobal;\n } else if (typeof self !== \"undefined\") {\n win = self;\n } else {\n win = {};\n }\n var window_1 = win;\n var isArrayBufferView = function isArrayBufferView(obj) {\n if (ArrayBuffer.isView === 'function') {\n return ArrayBuffer.isView(obj);\n }\n return obj && obj.buffer instanceof ArrayBuffer;\n };\n var BigInt = window_1.BigInt || Number;\n [BigInt('0x1'), BigInt('0x100'), BigInt('0x10000'), BigInt('0x1000000'), BigInt('0x100000000'), BigInt('0x10000000000'), BigInt('0x1000000000000'), BigInt('0x100000000000000'), BigInt('0x10000000000000000')];\n (function () {\n var a = new Uint16Array([0xFFCC]);\n var b = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n if (b[0] === 0xFF) {\n return 'big';\n }\n if (b[0] === 0xCC) {\n return 'little';\n }\n return 'unknown';\n })();\n /**\n * Creates an object for sending to a web worker modifying properties that are TypedArrays\n * into a new object with seperated properties for the buffer, byteOffset, and byteLength.\n *\n * @param {Object} message\n * Object of properties and values to send to the web worker\n * @return {Object}\n * Modified message with TypedArray values expanded\n * @function createTransferableMessage\n */\n\n const createTransferableMessage = function (message) {\n const transferable = {};\n Object.keys(message).forEach(key => {\n const value = message[key];\n if (isArrayBufferView(value)) {\n transferable[key] = {\n bytes: value.buffer,\n byteOffset: value.byteOffset,\n byteLength: value.byteLength\n };\n } else {\n transferable[key] = value;\n }\n });\n return transferable;\n };\n /* global self */\n\n /**\n * Our web worker interface so that things can talk to aes-decrypter\n * that will be running in a web worker. the scope is passed to this by\n * webworkify.\n */\n\n self.onmessage = function (event) {\n const data = event.data;\n const encrypted = new Uint8Array(data.encrypted.bytes, data.encrypted.byteOffset, data.encrypted.byteLength);\n const key = new Uint32Array(data.key.bytes, data.key.byteOffset, data.key.byteLength / 4);\n const iv = new Uint32Array(data.iv.bytes, data.iv.byteOffset, data.iv.byteLength / 4);\n /* eslint-disable no-new, handle-callback-err */\n\n new Decrypter(encrypted, key, iv, function (err, bytes) {\n self.postMessage(createTransferableMessage({\n source: data.source,\n decrypted: bytes\n }), [bytes.buffer]);\n });\n /* eslint-enable */\n };\n}));\nvar Decrypter = factory(workerCode);\n/* rollup-plugin-worker-factory end for worker!/home/runner/work/http-streaming/http-streaming/src/decrypter-worker.js */\n\n/**\n * Convert the properties of an HLS track into an audioTrackKind.\n *\n * @private\n */\n\nconst audioTrackKind_ = properties => {\n let kind = properties.default ? 'main' : 'alternative';\n if (properties.characteristics && properties.characteristics.indexOf('public.accessibility.describes-video') >= 0) {\n kind = 'main-desc';\n }\n return kind;\n};\n/**\n * Pause provided segment loader and playlist loader if active\n *\n * @param {SegmentLoader} segmentLoader\n * SegmentLoader to pause\n * @param {Object} mediaType\n * Active media type\n * @function stopLoaders\n */\n\nconst stopLoaders = (segmentLoader, mediaType) => {\n segmentLoader.abort();\n segmentLoader.pause();\n if (mediaType && mediaType.activePlaylistLoader) {\n mediaType.activePlaylistLoader.pause();\n mediaType.activePlaylistLoader = null;\n }\n};\n/**\n * Start loading provided segment loader and playlist loader\n *\n * @param {PlaylistLoader} playlistLoader\n * PlaylistLoader to start loading\n * @param {Object} mediaType\n * Active media type\n * @function startLoaders\n */\n\nconst startLoaders = (playlistLoader, mediaType) => {\n // Segment loader will be started after `loadedmetadata` or `loadedplaylist` from the\n // playlist loader\n mediaType.activePlaylistLoader = playlistLoader;\n playlistLoader.load();\n};\n/**\n * Returns a function to be called when the media group changes. It performs a\n * non-destructive (preserve the buffer) resync of the SegmentLoader. This is because a\n * change of group is merely a rendition switch of the same content at another encoding,\n * rather than a change of content, such as switching audio from English to Spanish.\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Handler for a non-destructive resync of SegmentLoader when the active media\n * group changes.\n * @function onGroupChanged\n */\n\nconst onGroupChanged = (type, settings) => () => {\n const {\n segmentLoaders: {\n [type]: segmentLoader,\n main: mainSegmentLoader\n },\n mediaTypes: {\n [type]: mediaType\n }\n } = settings;\n const activeTrack = mediaType.activeTrack();\n const activeGroup = mediaType.getActiveGroup();\n const previousActiveLoader = mediaType.activePlaylistLoader;\n const lastGroup = mediaType.lastGroup_; // the group did not change do nothing\n\n if (activeGroup && lastGroup && activeGroup.id === lastGroup.id) {\n return;\n }\n mediaType.lastGroup_ = activeGroup;\n mediaType.lastTrack_ = activeTrack;\n stopLoaders(segmentLoader, mediaType);\n if (!activeGroup || activeGroup.isMainPlaylist) {\n // there is no group active or active group is a main playlist and won't change\n return;\n }\n if (!activeGroup.playlistLoader) {\n if (previousActiveLoader) {\n // The previous group had a playlist loader but the new active group does not\n // this means we are switching from demuxed to muxed audio. In this case we want to\n // do a destructive reset of the main segment loader and not restart the audio\n // loaders.\n mainSegmentLoader.resetEverything();\n }\n return;\n } // Non-destructive resync\n\n segmentLoader.resyncLoader();\n startLoaders(activeGroup.playlistLoader, mediaType);\n};\nconst onGroupChanging = (type, settings) => () => {\n const {\n segmentLoaders: {\n [type]: segmentLoader\n },\n mediaTypes: {\n [type]: mediaType\n }\n } = settings;\n mediaType.lastGroup_ = null;\n segmentLoader.abort();\n segmentLoader.pause();\n};\n/**\n * Returns a function to be called when the media track changes. It performs a\n * destructive reset of the SegmentLoader to ensure we start loading as close to\n * currentTime as possible.\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Handler for a destructive reset of SegmentLoader when the active media\n * track changes.\n * @function onTrackChanged\n */\n\nconst onTrackChanged = (type, settings) => () => {\n const {\n mainPlaylistLoader,\n segmentLoaders: {\n [type]: segmentLoader,\n main: mainSegmentLoader\n },\n mediaTypes: {\n [type]: mediaType\n }\n } = settings;\n const activeTrack = mediaType.activeTrack();\n const activeGroup = mediaType.getActiveGroup();\n const previousActiveLoader = mediaType.activePlaylistLoader;\n const lastTrack = mediaType.lastTrack_; // track did not change, do nothing\n\n if (lastTrack && activeTrack && lastTrack.id === activeTrack.id) {\n return;\n }\n mediaType.lastGroup_ = activeGroup;\n mediaType.lastTrack_ = activeTrack;\n stopLoaders(segmentLoader, mediaType);\n if (!activeGroup) {\n // there is no group active so we do not want to restart loaders\n return;\n }\n if (activeGroup.isMainPlaylist) {\n // track did not change, do nothing\n if (!activeTrack || !lastTrack || activeTrack.id === lastTrack.id) {\n return;\n }\n const pc = settings.vhs.playlistController_;\n const newPlaylist = pc.selectPlaylist(); // media will not change do nothing\n\n if (pc.media() === newPlaylist) {\n return;\n }\n mediaType.logger_(`track change. Switching main audio from ${lastTrack.id} to ${activeTrack.id}`);\n mainPlaylistLoader.pause();\n mainSegmentLoader.resetEverything();\n pc.fastQualityChange_(newPlaylist);\n return;\n }\n if (type === 'AUDIO') {\n if (!activeGroup.playlistLoader) {\n // when switching from demuxed audio/video to muxed audio/video (noted by no\n // playlist loader for the audio group), we want to do a destructive reset of the\n // main segment loader and not restart the audio loaders\n mainSegmentLoader.setAudio(true); // don't have to worry about disabling the audio of the audio segment loader since\n // it should be stopped\n\n mainSegmentLoader.resetEverything();\n return;\n } // although the segment loader is an audio segment loader, call the setAudio\n // function to ensure it is prepared to re-append the init segment (or handle other\n // config changes)\n\n segmentLoader.setAudio(true);\n mainSegmentLoader.setAudio(false);\n }\n if (previousActiveLoader === activeGroup.playlistLoader) {\n // Nothing has actually changed. This can happen because track change events can fire\n // multiple times for a \"single\" change. One for enabling the new active track, and\n // one for disabling the track that was active\n startLoaders(activeGroup.playlistLoader, mediaType);\n return;\n }\n if (segmentLoader.track) {\n // For WebVTT, set the new text track in the segmentloader\n segmentLoader.track(activeTrack);\n } // destructive reset\n\n segmentLoader.resetEverything();\n startLoaders(activeGroup.playlistLoader, mediaType);\n};\nconst onError = {\n /**\n * Returns a function to be called when a SegmentLoader or PlaylistLoader encounters\n * an error.\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Error handler. Logs warning (or error if the playlist is excluded) to\n * console and switches back to default audio track.\n * @function onError.AUDIO\n */\n AUDIO: (type, settings) => () => {\n const {\n mediaTypes: {\n [type]: mediaType\n },\n excludePlaylist\n } = settings; // switch back to default audio track\n\n const activeTrack = mediaType.activeTrack();\n const activeGroup = mediaType.activeGroup();\n const id = (activeGroup.filter(group => group.default)[0] || activeGroup[0]).id;\n const defaultTrack = mediaType.tracks[id];\n if (activeTrack === defaultTrack) {\n // Default track encountered an error. All we can do now is exclude the current\n // rendition and hope another will switch audio groups\n excludePlaylist({\n error: {\n message: 'Problem encountered loading the default audio track.'\n }\n });\n return;\n }\n videojs.log.warn('Problem encountered loading the alternate audio track.' + 'Switching back to default.');\n for (const trackId in mediaType.tracks) {\n mediaType.tracks[trackId].enabled = mediaType.tracks[trackId] === defaultTrack;\n }\n mediaType.onTrackChanged();\n },\n /**\n * Returns a function to be called when a SegmentLoader or PlaylistLoader encounters\n * an error.\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Error handler. Logs warning to console and disables the active subtitle track\n * @function onError.SUBTITLES\n */\n SUBTITLES: (type, settings) => () => {\n const {\n mediaTypes: {\n [type]: mediaType\n }\n } = settings;\n videojs.log.warn('Problem encountered loading the subtitle track.' + 'Disabling subtitle track.');\n const track = mediaType.activeTrack();\n if (track) {\n track.mode = 'disabled';\n }\n mediaType.onTrackChanged();\n }\n};\nconst setupListeners = {\n /**\n * Setup event listeners for audio playlist loader\n *\n * @param {string} type\n * MediaGroup type\n * @param {PlaylistLoader|null} playlistLoader\n * PlaylistLoader to register listeners on\n * @param {Object} settings\n * Object containing required information for media groups\n * @function setupListeners.AUDIO\n */\n AUDIO: (type, playlistLoader, settings) => {\n if (!playlistLoader) {\n // no playlist loader means audio will be muxed with the video\n return;\n }\n const {\n tech,\n requestOptions,\n segmentLoaders: {\n [type]: segmentLoader\n }\n } = settings;\n playlistLoader.on('loadedmetadata', () => {\n const media = playlistLoader.media();\n segmentLoader.playlist(media, requestOptions); // if the video is already playing, or if this isn't a live video and preload\n // permits, start downloading segments\n\n if (!tech.paused() || media.endList && tech.preload() !== 'none') {\n segmentLoader.load();\n }\n });\n playlistLoader.on('loadedplaylist', () => {\n segmentLoader.playlist(playlistLoader.media(), requestOptions); // If the player isn't paused, ensure that the segment loader is running\n\n if (!tech.paused()) {\n segmentLoader.load();\n }\n });\n playlistLoader.on('error', onError[type](type, settings));\n },\n /**\n * Setup event listeners for subtitle playlist loader\n *\n * @param {string} type\n * MediaGroup type\n * @param {PlaylistLoader|null} playlistLoader\n * PlaylistLoader to register listeners on\n * @param {Object} settings\n * Object containing required information for media groups\n * @function setupListeners.SUBTITLES\n */\n SUBTITLES: (type, playlistLoader, settings) => {\n const {\n tech,\n requestOptions,\n segmentLoaders: {\n [type]: segmentLoader\n },\n mediaTypes: {\n [type]: mediaType\n }\n } = settings;\n playlistLoader.on('loadedmetadata', () => {\n const media = playlistLoader.media();\n segmentLoader.playlist(media, requestOptions);\n segmentLoader.track(mediaType.activeTrack()); // if the video is already playing, or if this isn't a live video and preload\n // permits, start downloading segments\n\n if (!tech.paused() || media.endList && tech.preload() !== 'none') {\n segmentLoader.load();\n }\n });\n playlistLoader.on('loadedplaylist', () => {\n segmentLoader.playlist(playlistLoader.media(), requestOptions); // If the player isn't paused, ensure that the segment loader is running\n\n if (!tech.paused()) {\n segmentLoader.load();\n }\n });\n playlistLoader.on('error', onError[type](type, settings));\n }\n};\nconst initialize = {\n /**\n * Setup PlaylistLoaders and AudioTracks for the audio groups\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @function initialize.AUDIO\n */\n 'AUDIO': (type, settings) => {\n const {\n vhs,\n sourceType,\n segmentLoaders: {\n [type]: segmentLoader\n },\n requestOptions,\n main: {\n mediaGroups\n },\n mediaTypes: {\n [type]: {\n groups,\n tracks,\n logger_\n }\n },\n mainPlaylistLoader\n } = settings;\n const audioOnlyMain = isAudioOnly(mainPlaylistLoader.main); // force a default if we have none\n\n if (!mediaGroups[type] || Object.keys(mediaGroups[type]).length === 0) {\n mediaGroups[type] = {\n main: {\n default: {\n default: true\n }\n }\n };\n if (audioOnlyMain) {\n mediaGroups[type].main.default.playlists = mainPlaylistLoader.main.playlists;\n }\n }\n for (const groupId in mediaGroups[type]) {\n if (!groups[groupId]) {\n groups[groupId] = [];\n }\n for (const variantLabel in mediaGroups[type][groupId]) {\n let properties = mediaGroups[type][groupId][variantLabel];\n let playlistLoader;\n if (audioOnlyMain) {\n logger_(`AUDIO group '${groupId}' label '${variantLabel}' is a main playlist`);\n properties.isMainPlaylist = true;\n playlistLoader = null; // if vhs-json was provided as the source, and the media playlist was resolved,\n // use the resolved media playlist object\n } else if (sourceType === 'vhs-json' && properties.playlists) {\n playlistLoader = new PlaylistLoader(properties.playlists[0], vhs, requestOptions);\n } else if (properties.resolvedUri) {\n playlistLoader = new PlaylistLoader(properties.resolvedUri, vhs, requestOptions); // TODO: dash isn't the only type with properties.playlists\n // should we even have properties.playlists in this check.\n } else if (properties.playlists && sourceType === 'dash') {\n playlistLoader = new DashPlaylistLoader(properties.playlists[0], vhs, requestOptions, mainPlaylistLoader);\n } else {\n // no resolvedUri means the audio is muxed with the video when using this\n // audio track\n playlistLoader = null;\n }\n properties = merge({\n id: variantLabel,\n playlistLoader\n }, properties);\n setupListeners[type](type, properties.playlistLoader, settings);\n groups[groupId].push(properties);\n if (typeof tracks[variantLabel] === 'undefined') {\n const track = new videojs.AudioTrack({\n id: variantLabel,\n kind: audioTrackKind_(properties),\n enabled: false,\n language: properties.language,\n default: properties.default,\n label: variantLabel\n });\n tracks[variantLabel] = track;\n }\n }\n } // setup single error event handler for the segment loader\n\n segmentLoader.on('error', onError[type](type, settings));\n },\n /**\n * Setup PlaylistLoaders and TextTracks for the subtitle groups\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @function initialize.SUBTITLES\n */\n 'SUBTITLES': (type, settings) => {\n const {\n tech,\n vhs,\n sourceType,\n segmentLoaders: {\n [type]: segmentLoader\n },\n requestOptions,\n main: {\n mediaGroups\n },\n mediaTypes: {\n [type]: {\n groups,\n tracks\n }\n },\n mainPlaylistLoader\n } = settings;\n for (const groupId in mediaGroups[type]) {\n if (!groups[groupId]) {\n groups[groupId] = [];\n }\n for (const variantLabel in mediaGroups[type][groupId]) {\n if (!vhs.options_.useForcedSubtitles && mediaGroups[type][groupId][variantLabel].forced) {\n // Subtitle playlists with the forced attribute are not selectable in Safari.\n // According to Apple's HLS Authoring Specification:\n // If content has forced subtitles and regular subtitles in a given language,\n // the regular subtitles track in that language MUST contain both the forced\n // subtitles and the regular subtitles for that language.\n // Because of this requirement and that Safari does not add forced subtitles,\n // forced subtitles are skipped here to maintain consistent experience across\n // all platforms\n continue;\n }\n let properties = mediaGroups[type][groupId][variantLabel];\n let playlistLoader;\n if (sourceType === 'hls') {\n playlistLoader = new PlaylistLoader(properties.resolvedUri, vhs, requestOptions);\n } else if (sourceType === 'dash') {\n const playlists = properties.playlists.filter(p => p.excludeUntil !== Infinity);\n if (!playlists.length) {\n return;\n }\n playlistLoader = new DashPlaylistLoader(properties.playlists[0], vhs, requestOptions, mainPlaylistLoader);\n } else if (sourceType === 'vhs-json') {\n playlistLoader = new PlaylistLoader(\n // if the vhs-json object included the media playlist, use the media playlist\n // as provided, otherwise use the resolved URI to load the playlist\n properties.playlists ? properties.playlists[0] : properties.resolvedUri, vhs, requestOptions);\n }\n properties = merge({\n id: variantLabel,\n playlistLoader\n }, properties);\n setupListeners[type](type, properties.playlistLoader, settings);\n groups[groupId].push(properties);\n if (typeof tracks[variantLabel] === 'undefined') {\n const track = tech.addRemoteTextTrack({\n id: variantLabel,\n kind: 'subtitles',\n default: properties.default && properties.autoselect,\n language: properties.language,\n label: variantLabel\n }, false).track;\n tracks[variantLabel] = track;\n }\n }\n } // setup single error event handler for the segment loader\n\n segmentLoader.on('error', onError[type](type, settings));\n },\n /**\n * Setup TextTracks for the closed-caption groups\n *\n * @param {String} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @function initialize['CLOSED-CAPTIONS']\n */\n 'CLOSED-CAPTIONS': (type, settings) => {\n const {\n tech,\n main: {\n mediaGroups\n },\n mediaTypes: {\n [type]: {\n groups,\n tracks\n }\n }\n } = settings;\n for (const groupId in mediaGroups[type]) {\n if (!groups[groupId]) {\n groups[groupId] = [];\n }\n for (const variantLabel in mediaGroups[type][groupId]) {\n const properties = mediaGroups[type][groupId][variantLabel]; // Look for either 608 (CCn) or 708 (SERVICEn) caption services\n\n if (!/^(?:CC|SERVICE)/.test(properties.instreamId)) {\n continue;\n }\n const captionServices = tech.options_.vhs && tech.options_.vhs.captionServices || {};\n let newProps = {\n label: variantLabel,\n language: properties.language,\n instreamId: properties.instreamId,\n default: properties.default && properties.autoselect\n };\n if (captionServices[newProps.instreamId]) {\n newProps = merge(newProps, captionServices[newProps.instreamId]);\n }\n if (newProps.default === undefined) {\n delete newProps.default;\n } // No PlaylistLoader is required for Closed-Captions because the captions are\n // embedded within the video stream\n\n groups[groupId].push(merge({\n id: variantLabel\n }, properties));\n if (typeof tracks[variantLabel] === 'undefined') {\n const track = tech.addRemoteTextTrack({\n id: newProps.instreamId,\n kind: 'captions',\n default: newProps.default,\n language: newProps.language,\n label: newProps.label\n }, false).track;\n tracks[variantLabel] = track;\n }\n }\n }\n }\n};\nconst groupMatch = (list, media) => {\n for (let i = 0; i < list.length; i++) {\n if (playlistMatch(media, list[i])) {\n return true;\n }\n if (list[i].playlists && groupMatch(list[i].playlists, media)) {\n return true;\n }\n }\n return false;\n};\n/**\n * Returns a function used to get the active group of the provided type\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Function that returns the active media group for the provided type. Takes an\n * optional parameter {TextTrack} track. If no track is provided, a list of all\n * variants in the group, otherwise the variant corresponding to the provided\n * track is returned.\n * @function activeGroup\n */\n\nconst activeGroup = (type, settings) => track => {\n const {\n mainPlaylistLoader,\n mediaTypes: {\n [type]: {\n groups\n }\n }\n } = settings;\n const media = mainPlaylistLoader.media();\n if (!media) {\n return null;\n }\n let variants = null; // set to variants to main media active group\n\n if (media.attributes[type]) {\n variants = groups[media.attributes[type]];\n }\n const groupKeys = Object.keys(groups);\n if (!variants) {\n // find the mainPlaylistLoader media\n // that is in a media group if we are dealing\n // with audio only\n if (type === 'AUDIO' && groupKeys.length > 1 && isAudioOnly(settings.main)) {\n for (let i = 0; i < groupKeys.length; i++) {\n const groupPropertyList = groups[groupKeys[i]];\n if (groupMatch(groupPropertyList, media)) {\n variants = groupPropertyList;\n break;\n }\n } // use the main group if it exists\n } else if (groups.main) {\n variants = groups.main; // only one group, use that one\n } else if (groupKeys.length === 1) {\n variants = groups[groupKeys[0]];\n }\n }\n if (typeof track === 'undefined') {\n return variants;\n }\n if (track === null || !variants) {\n // An active track was specified so a corresponding group is expected. track === null\n // means no track is currently active so there is no corresponding group\n return null;\n }\n return variants.filter(props => props.id === track.id)[0] || null;\n};\nconst activeTrack = {\n /**\n * Returns a function used to get the active track of type provided\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Function that returns the active media track for the provided type. Returns\n * null if no track is active\n * @function activeTrack.AUDIO\n */\n AUDIO: (type, settings) => () => {\n const {\n mediaTypes: {\n [type]: {\n tracks\n }\n }\n } = settings;\n for (const id in tracks) {\n if (tracks[id].enabled) {\n return tracks[id];\n }\n }\n return null;\n },\n /**\n * Returns a function used to get the active track of type provided\n *\n * @param {string} type\n * MediaGroup type\n * @param {Object} settings\n * Object containing required information for media groups\n * @return {Function}\n * Function that returns the active media track for the provided type. Returns\n * null if no track is active\n * @function activeTrack.SUBTITLES\n */\n SUBTITLES: (type, settings) => () => {\n const {\n mediaTypes: {\n [type]: {\n tracks\n }\n }\n } = settings;\n for (const id in tracks) {\n if (tracks[id].mode === 'showing' || tracks[id].mode === 'hidden') {\n return tracks[id];\n }\n }\n return null;\n }\n};\nconst getActiveGroup = (type, {\n mediaTypes\n}) => () => {\n const activeTrack_ = mediaTypes[type].activeTrack();\n if (!activeTrack_) {\n return null;\n }\n return mediaTypes[type].activeGroup(activeTrack_);\n};\n/**\n * Setup PlaylistLoaders and Tracks for media groups (Audio, Subtitles,\n * Closed-Captions) specified in the main manifest.\n *\n * @param {Object} settings\n * Object containing required information for setting up the media groups\n * @param {Tech} settings.tech\n * The tech of the player\n * @param {Object} settings.requestOptions\n * XHR request options used by the segment loaders\n * @param {PlaylistLoader} settings.mainPlaylistLoader\n * PlaylistLoader for the main source\n * @param {VhsHandler} settings.vhs\n * VHS SourceHandler\n * @param {Object} settings.main\n * The parsed main manifest\n * @param {Object} settings.mediaTypes\n * Object to store the loaders, tracks, and utility methods for each media type\n * @param {Function} settings.excludePlaylist\n * Excludes the current rendition and forces a rendition switch.\n * @function setupMediaGroups\n */\n\nconst setupMediaGroups = settings => {\n ['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(type => {\n initialize[type](type, settings);\n });\n const {\n mediaTypes,\n mainPlaylistLoader,\n tech,\n vhs,\n segmentLoaders: {\n ['AUDIO']: audioSegmentLoader,\n main: mainSegmentLoader\n }\n } = settings; // setup active group and track getters and change event handlers\n\n ['AUDIO', 'SUBTITLES'].forEach(type => {\n mediaTypes[type].activeGroup = activeGroup(type, settings);\n mediaTypes[type].activeTrack = activeTrack[type](type, settings);\n mediaTypes[type].onGroupChanged = onGroupChanged(type, settings);\n mediaTypes[type].onGroupChanging = onGroupChanging(type, settings);\n mediaTypes[type].onTrackChanged = onTrackChanged(type, settings);\n mediaTypes[type].getActiveGroup = getActiveGroup(type, settings);\n }); // DO NOT enable the default subtitle or caption track.\n // DO enable the default audio track\n\n const audioGroup = mediaTypes.AUDIO.activeGroup();\n if (audioGroup) {\n const groupId = (audioGroup.filter(group => group.default)[0] || audioGroup[0]).id;\n mediaTypes.AUDIO.tracks[groupId].enabled = true;\n mediaTypes.AUDIO.onGroupChanged();\n mediaTypes.AUDIO.onTrackChanged();\n const activeAudioGroup = mediaTypes.AUDIO.getActiveGroup(); // a similar check for handling setAudio on each loader is run again each time the\n // track is changed, but needs to be handled here since the track may not be considered\n // changed on the first call to onTrackChanged\n\n if (!activeAudioGroup.playlistLoader) {\n // either audio is muxed with video or the stream is audio only\n mainSegmentLoader.setAudio(true);\n } else {\n // audio is demuxed\n mainSegmentLoader.setAudio(false);\n audioSegmentLoader.setAudio(true);\n }\n }\n mainPlaylistLoader.on('mediachange', () => {\n ['AUDIO', 'SUBTITLES'].forEach(type => mediaTypes[type].onGroupChanged());\n });\n mainPlaylistLoader.on('mediachanging', () => {\n ['AUDIO', 'SUBTITLES'].forEach(type => mediaTypes[type].onGroupChanging());\n }); // custom audio track change event handler for usage event\n\n const onAudioTrackChanged = () => {\n mediaTypes.AUDIO.onTrackChanged();\n tech.trigger({\n type: 'usage',\n name: 'vhs-audio-change'\n });\n };\n tech.audioTracks().addEventListener('change', onAudioTrackChanged);\n tech.remoteTextTracks().addEventListener('change', mediaTypes.SUBTITLES.onTrackChanged);\n vhs.on('dispose', () => {\n tech.audioTracks().removeEventListener('change', onAudioTrackChanged);\n tech.remoteTextTracks().removeEventListener('change', mediaTypes.SUBTITLES.onTrackChanged);\n }); // clear existing audio tracks and add the ones we just created\n\n tech.clearTracks('audio');\n for (const id in mediaTypes.AUDIO.tracks) {\n tech.audioTracks().addTrack(mediaTypes.AUDIO.tracks[id]);\n }\n};\n/**\n * Creates skeleton object used to store the loaders, tracks, and utility methods for each\n * media type\n *\n * @return {Object}\n * Object to store the loaders, tracks, and utility methods for each media type\n * @function createMediaTypes\n */\n\nconst createMediaTypes = () => {\n const mediaTypes = {};\n ['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(type => {\n mediaTypes[type] = {\n groups: {},\n tracks: {},\n activePlaylistLoader: null,\n activeGroup: noop,\n activeTrack: noop,\n getActiveGroup: noop,\n onGroupChanged: noop,\n onTrackChanged: noop,\n lastTrack_: null,\n logger_: logger(`MediaGroups[${type}]`)\n };\n });\n return mediaTypes;\n};\n\n/**\n * A utility class for setting properties and maintaining the state of the content steering manifest.\n *\n * Content Steering manifest format:\n * VERSION: number (required) currently only version 1 is supported.\n * TTL: number in seconds (optional) until the next content steering manifest reload.\n * RELOAD-URI: string (optional) uri to fetch the next content steering manifest.\n * SERVICE-LOCATION-PRIORITY or PATHWAY-PRIORITY a non empty array of unique string values.\n * PATHWAY-CLONES: array (optional) (HLS only) pathway clone objects to copy from other playlists.\n */\n\nclass SteeringManifest {\n constructor() {\n this.priority_ = [];\n this.pathwayClones_ = new Map();\n }\n set version(number) {\n // Only version 1 is currently supported for both DASH and HLS.\n if (number === 1) {\n this.version_ = number;\n }\n }\n set ttl(seconds) {\n // TTL = time-to-live, default = 300 seconds.\n this.ttl_ = seconds || 300;\n }\n set reloadUri(uri) {\n if (uri) {\n // reload URI can be relative to the previous reloadUri.\n this.reloadUri_ = resolveUrl(this.reloadUri_, uri);\n }\n }\n set priority(array) {\n // priority must be non-empty and unique values.\n if (array && array.length) {\n this.priority_ = array;\n }\n }\n set pathwayClones(array) {\n // pathwayClones must be non-empty.\n if (array && array.length) {\n this.pathwayClones_ = new Map(array.map(clone => [clone.ID, clone]));\n }\n }\n get version() {\n return this.version_;\n }\n get ttl() {\n return this.ttl_;\n }\n get reloadUri() {\n return this.reloadUri_;\n }\n get priority() {\n return this.priority_;\n }\n get pathwayClones() {\n return this.pathwayClones_;\n }\n}\n/**\n * This class represents a content steering manifest and associated state. See both HLS and DASH specifications.\n * HLS: https://developer.apple.com/streaming/HLSContentSteeringSpecification.pdf and\n * https://datatracker.ietf.org/doc/draft-pantos-hls-rfc8216bis/ section 4.4.6.6.\n * DASH: https://dashif.org/docs/DASH-IF-CTS-00XX-Content-Steering-Community-Review.pdf\n *\n * @param {function} xhr for making a network request from the browser.\n * @param {function} bandwidth for fetching the current bandwidth from the main segment loader.\n */\n\nclass ContentSteeringController extends videojs.EventTarget {\n constructor(xhr, bandwidth) {\n super();\n this.currentPathway = null;\n this.defaultPathway = null;\n this.queryBeforeStart = false;\n this.availablePathways_ = new Set();\n this.steeringManifest = new SteeringManifest();\n this.proxyServerUrl_ = null;\n this.manifestType_ = null;\n this.ttlTimeout_ = null;\n this.request_ = null;\n this.currentPathwayClones = new Map();\n this.nextPathwayClones = new Map();\n this.excludedSteeringManifestURLs = new Set();\n this.logger_ = logger('Content Steering');\n this.xhr_ = xhr;\n this.getBandwidth_ = bandwidth;\n }\n /**\n * Assigns the content steering tag properties to the steering controller\n *\n * @param {string} baseUrl the baseURL from the main manifest for resolving the steering manifest url\n * @param {Object} steeringTag the content steering tag from the main manifest\n */\n\n assignTagProperties(baseUrl, steeringTag) {\n this.manifestType_ = steeringTag.serverUri ? 'HLS' : 'DASH'; // serverUri is HLS serverURL is DASH\n\n const steeringUri = steeringTag.serverUri || steeringTag.serverURL;\n if (!steeringUri) {\n this.logger_(`steering manifest URL is ${steeringUri}, cannot request steering manifest.`);\n this.trigger('error');\n return;\n } // Content steering manifests can be encoded as a data URI. We can decode, parse and return early if that's the case.\n\n if (steeringUri.startsWith('data:')) {\n this.decodeDataUriManifest_(steeringUri.substring(steeringUri.indexOf(',') + 1));\n return;\n } // reloadUri is the resolution of the main manifest URL and steering URL.\n\n this.steeringManifest.reloadUri = resolveUrl(baseUrl, steeringUri); // pathwayId is HLS defaultServiceLocation is DASH\n\n this.defaultPathway = steeringTag.pathwayId || steeringTag.defaultServiceLocation; // currently only DASH supports the following properties on tags.\n\n this.queryBeforeStart = steeringTag.queryBeforeStart;\n this.proxyServerUrl_ = steeringTag.proxyServerURL; // trigger a steering event if we have a pathway from the content steering tag.\n // this tells VHS which segment pathway to start with.\n // If queryBeforeStart is true we need to wait for the steering manifest response.\n\n if (this.defaultPathway && !this.queryBeforeStart) {\n this.trigger('content-steering');\n }\n }\n /**\n * Requests the content steering manifest and parse the response. This should only be called after\n * assignTagProperties was called with a content steering tag.\n *\n * @param {string} initialUri The optional uri to make the request with.\n * If set, the request should be made with exactly what is passed in this variable.\n * This scenario should only happen once on initalization.\n */\n\n requestSteeringManifest(initial) {\n const reloadUri = this.steeringManifest.reloadUri;\n if (!reloadUri) {\n return;\n } // We currently don't support passing MPD query parameters directly to the content steering URL as this requires\n // ExtUrlQueryInfo tag support. See the DASH content steering spec section 8.1.\n // This request URI accounts for manifest URIs that have been excluded.\n\n const uri = initial ? reloadUri : this.getRequestURI(reloadUri); // If there are no valid manifest URIs, we should stop content steering.\n\n if (!uri) {\n this.logger_('No valid content steering manifest URIs. Stopping content steering.');\n this.trigger('error');\n this.dispose();\n return;\n }\n const metadata = {\n contentSteeringInfo: {\n uri\n }\n };\n this.trigger({\n type: 'contentsteeringloadstart',\n metadata\n });\n this.request_ = this.xhr_({\n uri,\n requestType: 'content-steering-manifest'\n }, (error, errorInfo) => {\n if (error) {\n // If the client receives HTTP 410 Gone in response to a manifest request,\n // it MUST NOT issue another request for that URI for the remainder of the\n // playback session. It MAY continue to use the most-recently obtained set\n // of Pathways.\n if (errorInfo.status === 410) {\n this.logger_(`manifest request 410 ${error}.`);\n this.logger_(`There will be no more content steering requests to ${uri} this session.`);\n this.excludedSteeringManifestURLs.add(uri);\n return;\n } // If the client receives HTTP 429 Too Many Requests with a Retry-After\n // header in response to a manifest request, it SHOULD wait until the time\n // specified by the Retry-After header to reissue the request.\n\n if (errorInfo.status === 429) {\n const retrySeconds = errorInfo.responseHeaders['retry-after'];\n this.logger_(`manifest request 429 ${error}.`);\n this.logger_(`content steering will retry in ${retrySeconds} seconds.`);\n this.startTTLTimeout_(parseInt(retrySeconds, 10));\n return;\n } // If the Steering Manifest cannot be loaded and parsed correctly, the\n // client SHOULD continue to use the previous values and attempt to reload\n // it after waiting for the previously-specified TTL (or 5 minutes if\n // none).\n\n this.logger_(`manifest failed to load ${error}.`);\n this.startTTLTimeout_();\n return;\n }\n this.trigger({\n type: 'contentsteeringloadcomplete',\n metadata\n });\n let steeringManifestJson;\n try {\n steeringManifestJson = JSON.parse(this.request_.responseText);\n } catch (parseError) {\n const errorMetadata = {\n errorType: videojs.Error.StreamingContentSteeringParserError,\n error: parseError\n };\n this.trigger({\n type: 'error',\n metadata: errorMetadata\n });\n }\n this.assignSteeringProperties_(steeringManifestJson);\n const parsedMetadata = {\n contentSteeringInfo: metadata.contentSteeringInfo,\n contentSteeringManifest: {\n version: this.steeringManifest.version,\n reloadUri: this.steeringManifest.reloadUri,\n priority: this.steeringManifest.priority\n }\n };\n this.trigger({\n type: 'contentsteeringparsed',\n metadata: parsedMetadata\n });\n this.startTTLTimeout_();\n });\n }\n /**\n * Set the proxy server URL and add the steering manifest url as a URI encoded parameter.\n *\n * @param {string} steeringUrl the steering manifest url\n * @return the steering manifest url to a proxy server with all parameters set\n */\n\n setProxyServerUrl_(steeringUrl) {\n const steeringUrlObject = new window$1.URL(steeringUrl);\n const proxyServerUrlObject = new window$1.URL(this.proxyServerUrl_);\n proxyServerUrlObject.searchParams.set('url', encodeURI(steeringUrlObject.toString()));\n return this.setSteeringParams_(proxyServerUrlObject.toString());\n }\n /**\n * Decodes and parses the data uri encoded steering manifest\n *\n * @param {string} dataUri the data uri to be decoded and parsed.\n */\n\n decodeDataUriManifest_(dataUri) {\n const steeringManifestJson = JSON.parse(window$1.atob(dataUri));\n this.assignSteeringProperties_(steeringManifestJson);\n }\n /**\n * Set the HLS or DASH content steering manifest request query parameters. For example:\n * _HLS_pathway=\"\" and _HLS_throughput=\n * _DASH_pathway and _DASH_throughput\n *\n * @param {string} uri to add content steering server parameters to.\n * @return a new uri as a string with the added steering query parameters.\n */\n\n setSteeringParams_(url) {\n const urlObject = new window$1.URL(url);\n const path = this.getPathway();\n const networkThroughput = this.getBandwidth_();\n if (path) {\n const pathwayKey = `_${this.manifestType_}_pathway`;\n urlObject.searchParams.set(pathwayKey, path);\n }\n if (networkThroughput) {\n const throughputKey = `_${this.manifestType_}_throughput`;\n urlObject.searchParams.set(throughputKey, networkThroughput);\n }\n return urlObject.toString();\n }\n /**\n * Assigns the current steering manifest properties and to the SteeringManifest object\n *\n * @param {Object} steeringJson the raw JSON steering manifest\n */\n\n assignSteeringProperties_(steeringJson) {\n this.steeringManifest.version = steeringJson.VERSION;\n if (!this.steeringManifest.version) {\n this.logger_(`manifest version is ${steeringJson.VERSION}, which is not supported.`);\n this.trigger('error');\n return;\n }\n this.steeringManifest.ttl = steeringJson.TTL;\n this.steeringManifest.reloadUri = steeringJson['RELOAD-URI']; // HLS = PATHWAY-PRIORITY required. DASH = SERVICE-LOCATION-PRIORITY optional\n\n this.steeringManifest.priority = steeringJson['PATHWAY-PRIORITY'] || steeringJson['SERVICE-LOCATION-PRIORITY']; // Pathway clones to be created/updated in HLS.\n // See section 7.2 https://datatracker.ietf.org/doc/draft-pantos-hls-rfc8216bis/\n\n this.steeringManifest.pathwayClones = steeringJson['PATHWAY-CLONES'];\n this.nextPathwayClones = this.steeringManifest.pathwayClones; // 1. apply first pathway from the array.\n // 2. if first pathway doesn't exist in manifest, try next pathway.\n // a. if all pathways are exhausted, ignore the steering manifest priority.\n // 3. if segments fail from an established pathway, try all variants/renditions, then exclude the failed pathway.\n // a. exclude a pathway for a minimum of the last TTL duration. Meaning, from the next steering response,\n // the excluded pathway will be ignored.\n // See excludePathway usage in excludePlaylist().\n // If there are no available pathways, we need to stop content steering.\n\n if (!this.availablePathways_.size) {\n this.logger_('There are no available pathways for content steering. Ending content steering.');\n this.trigger('error');\n this.dispose();\n }\n const chooseNextPathway = pathwaysByPriority => {\n for (const path of pathwaysByPriority) {\n if (this.availablePathways_.has(path)) {\n return path;\n }\n } // If no pathway matches, ignore the manifest and choose the first available.\n\n return [...this.availablePathways_][0];\n };\n const nextPathway = chooseNextPathway(this.steeringManifest.priority);\n if (this.currentPathway !== nextPathway) {\n this.currentPathway = nextPathway;\n this.trigger('content-steering');\n }\n }\n /**\n * Returns the pathway to use for steering decisions\n *\n * @return {string} returns the current pathway or the default\n */\n\n getPathway() {\n return this.currentPathway || this.defaultPathway;\n }\n /**\n * Chooses the manifest request URI based on proxy URIs and server URLs.\n * Also accounts for exclusion on certain manifest URIs.\n *\n * @param {string} reloadUri the base uri before parameters\n *\n * @return {string} the final URI for the request to the manifest server.\n */\n\n getRequestURI(reloadUri) {\n if (!reloadUri) {\n return null;\n }\n const isExcluded = uri => this.excludedSteeringManifestURLs.has(uri);\n if (this.proxyServerUrl_) {\n const proxyURI = this.setProxyServerUrl_(reloadUri);\n if (!isExcluded(proxyURI)) {\n return proxyURI;\n }\n }\n const steeringURI = this.setSteeringParams_(reloadUri);\n if (!isExcluded(steeringURI)) {\n return steeringURI;\n } // Return nothing if all valid manifest URIs are excluded.\n\n return null;\n }\n /**\n * Start the timeout for re-requesting the steering manifest at the TTL interval.\n *\n * @param {number} ttl time in seconds of the timeout. Defaults to the\n * ttl interval in the steering manifest\n */\n\n startTTLTimeout_(ttl = this.steeringManifest.ttl) {\n // 300 (5 minutes) is the default value.\n const ttlMS = ttl * 1000;\n this.ttlTimeout_ = window$1.setTimeout(() => {\n this.requestSteeringManifest();\n }, ttlMS);\n }\n /**\n * Clear the TTL timeout if necessary.\n */\n\n clearTTLTimeout_() {\n window$1.clearTimeout(this.ttlTimeout_);\n this.ttlTimeout_ = null;\n }\n /**\n * aborts any current steering xhr and sets the current request object to null\n */\n\n abort() {\n if (this.request_) {\n this.request_.abort();\n }\n this.request_ = null;\n }\n /**\n * aborts steering requests clears the ttl timeout and resets all properties.\n */\n\n dispose() {\n this.off('content-steering');\n this.off('error');\n this.abort();\n this.clearTTLTimeout_();\n this.currentPathway = null;\n this.defaultPathway = null;\n this.queryBeforeStart = null;\n this.proxyServerUrl_ = null;\n this.manifestType_ = null;\n this.ttlTimeout_ = null;\n this.request_ = null;\n this.excludedSteeringManifestURLs = new Set();\n this.availablePathways_ = new Set();\n this.steeringManifest = new SteeringManifest();\n }\n /**\n * adds a pathway to the available pathways set\n *\n * @param {string} pathway the pathway string to add\n */\n\n addAvailablePathway(pathway) {\n if (pathway) {\n this.availablePathways_.add(pathway);\n }\n }\n /**\n * Clears all pathways from the available pathways set\n */\n\n clearAvailablePathways() {\n this.availablePathways_.clear();\n }\n /**\n * Removes a pathway from the available pathways set.\n */\n\n excludePathway(pathway) {\n return this.availablePathways_.delete(pathway);\n }\n /**\n * Checks the refreshed DASH manifest content steering tag for changes.\n *\n * @param {string} baseURL new steering tag on DASH manifest refresh\n * @param {Object} newTag the new tag to check for changes\n * @return a true or false whether the new tag has different values\n */\n\n didDASHTagChange(baseURL, newTag) {\n return !newTag && this.steeringManifest.reloadUri || newTag && (resolveUrl(baseURL, newTag.serverURL) !== this.steeringManifest.reloadUri || newTag.defaultServiceLocation !== this.defaultPathway || newTag.queryBeforeStart !== this.queryBeforeStart || newTag.proxyServerURL !== this.proxyServerUrl_);\n }\n getAvailablePathways() {\n return this.availablePathways_;\n }\n}\nconst debounce = (callback, wait) => {\n let timeoutId = null;\n return (...args) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n callback.apply(null, args);\n }, wait);\n };\n};\nconst ABORT_EARLY_EXCLUSION_SECONDS = 10;\nlet Vhs$1; // SegmentLoader stats that need to have each loader's\n// values summed to calculate the final value\n\nconst loaderStats = ['mediaRequests', 'mediaRequestsAborted', 'mediaRequestsTimedout', 'mediaRequestsErrored', 'mediaTransferDuration', 'mediaBytesTransferred', 'mediaAppends'];\nconst sumLoaderStat = function (stat) {\n return this.audioSegmentLoader_[stat] + this.mainSegmentLoader_[stat];\n};\nconst shouldSwitchToMedia = function ({\n currentPlaylist,\n buffered,\n currentTime,\n nextPlaylist,\n bufferLowWaterLine,\n bufferHighWaterLine,\n duration,\n bufferBasedABR,\n log\n}) {\n // we have no other playlist to switch to\n if (!nextPlaylist) {\n videojs.log.warn('We received no playlist to switch to. Please check your stream.');\n return false;\n }\n const sharedLogLine = `allowing switch ${currentPlaylist && currentPlaylist.id || 'null'} -> ${nextPlaylist.id}`;\n if (!currentPlaylist) {\n log(`${sharedLogLine} as current playlist is not set`);\n return true;\n } // no need to switch if playlist is the same\n\n if (nextPlaylist.id === currentPlaylist.id) {\n return false;\n } // determine if current time is in a buffered range.\n\n const isBuffered = Boolean(findRange(buffered, currentTime).length); // If the playlist is live, then we want to not take low water line into account.\n // This is because in LIVE, the player plays 3 segments from the end of the\n // playlist, and if `BUFFER_LOW_WATER_LINE` is greater than the duration availble\n // in those segments, a viewer will never experience a rendition upswitch.\n\n if (!currentPlaylist.endList) {\n // For LLHLS live streams, don't switch renditions before playback has started, as it almost\n // doubles the time to first playback.\n if (!isBuffered && typeof currentPlaylist.partTargetDuration === 'number') {\n log(`not ${sharedLogLine} as current playlist is live llhls, but currentTime isn't in buffered.`);\n return false;\n }\n log(`${sharedLogLine} as current playlist is live`);\n return true;\n }\n const forwardBuffer = timeAheadOf(buffered, currentTime);\n const maxBufferLowWaterLine = bufferBasedABR ? Config.EXPERIMENTAL_MAX_BUFFER_LOW_WATER_LINE : Config.MAX_BUFFER_LOW_WATER_LINE; // For the same reason as LIVE, we ignore the low water line when the VOD\n // duration is below the max potential low water line\n\n if (duration < maxBufferLowWaterLine) {\n log(`${sharedLogLine} as duration < max low water line (${duration} < ${maxBufferLowWaterLine})`);\n return true;\n }\n const nextBandwidth = nextPlaylist.attributes.BANDWIDTH;\n const currBandwidth = currentPlaylist.attributes.BANDWIDTH; // when switching down, if our buffer is lower than the high water line,\n // we can switch down\n\n if (nextBandwidth < currBandwidth && (!bufferBasedABR || forwardBuffer < bufferHighWaterLine)) {\n let logLine = `${sharedLogLine} as next bandwidth < current bandwidth (${nextBandwidth} < ${currBandwidth})`;\n if (bufferBasedABR) {\n logLine += ` and forwardBuffer < bufferHighWaterLine (${forwardBuffer} < ${bufferHighWaterLine})`;\n }\n log(logLine);\n return true;\n } // and if our buffer is higher than the low water line,\n // we can switch up\n\n if ((!bufferBasedABR || nextBandwidth > currBandwidth) && forwardBuffer >= bufferLowWaterLine) {\n let logLine = `${sharedLogLine} as forwardBuffer >= bufferLowWaterLine (${forwardBuffer} >= ${bufferLowWaterLine})`;\n if (bufferBasedABR) {\n logLine += ` and next bandwidth > current bandwidth (${nextBandwidth} > ${currBandwidth})`;\n }\n log(logLine);\n return true;\n }\n log(`not ${sharedLogLine} as no switching criteria met`);\n return false;\n};\n/**\n * the main playlist controller controller all interactons\n * between playlists and segmentloaders. At this time this mainly\n * involves a main playlist and a series of audio playlists\n * if they are available\n *\n * @class PlaylistController\n * @extends videojs.EventTarget\n */\n\nclass PlaylistController extends videojs.EventTarget {\n constructor(options) {\n super(); // Adding a slight debounce to avoid duplicate calls during rapid quality changes, for example:\n // When selecting quality from the quality list,\n // where we may have multiple bandwidth profiles for the same vertical resolution.\n\n this.fastQualityChange_ = debounce(this.fastQualityChange_.bind(this), 100);\n const {\n src,\n withCredentials,\n tech,\n bandwidth,\n externVhs,\n useCueTags,\n playlistExclusionDuration,\n enableLowInitialPlaylist,\n sourceType,\n cacheEncryptionKeys,\n bufferBasedABR,\n leastPixelDiffSelector,\n captionServices,\n experimentalUseMMS\n } = options;\n if (!src) {\n throw new Error('A non-empty playlist URL or JSON manifest string is required');\n }\n let {\n maxPlaylistRetries\n } = options;\n if (maxPlaylistRetries === null || typeof maxPlaylistRetries === 'undefined') {\n maxPlaylistRetries = Infinity;\n }\n Vhs$1 = externVhs;\n this.bufferBasedABR = Boolean(bufferBasedABR);\n this.leastPixelDiffSelector = Boolean(leastPixelDiffSelector);\n this.withCredentials = withCredentials;\n this.tech_ = tech;\n this.vhs_ = tech.vhs;\n this.player_ = options.player_;\n this.sourceType_ = sourceType;\n this.useCueTags_ = useCueTags;\n this.playlistExclusionDuration = playlistExclusionDuration;\n this.maxPlaylistRetries = maxPlaylistRetries;\n this.enableLowInitialPlaylist = enableLowInitialPlaylist;\n this.usingManagedMediaSource_ = false;\n if (this.useCueTags_) {\n this.cueTagsTrack_ = this.tech_.addTextTrack('metadata', 'ad-cues');\n this.cueTagsTrack_.inBandMetadataTrackDispatchType = '';\n }\n this.requestOptions_ = {\n withCredentials,\n maxPlaylistRetries,\n timeout: null\n };\n this.on('error', this.pauseLoading);\n this.mediaTypes_ = createMediaTypes();\n if (experimentalUseMMS && window$1.ManagedMediaSource) {\n // Airplay source not yet implemented. Remote playback must be disabled.\n this.tech_.el_.disableRemotePlayback = true;\n this.mediaSource = new window$1.ManagedMediaSource();\n this.usingManagedMediaSource_ = true;\n videojs.log('Using ManagedMediaSource');\n } else if (window$1.MediaSource) {\n this.mediaSource = new window$1.MediaSource();\n }\n this.handleDurationChange_ = this.handleDurationChange_.bind(this);\n this.handleSourceOpen_ = this.handleSourceOpen_.bind(this);\n this.handleSourceEnded_ = this.handleSourceEnded_.bind(this);\n this.load = this.load.bind(this);\n this.pause = this.pause.bind(this);\n this.mediaSource.addEventListener('durationchange', this.handleDurationChange_); // load the media source into the player\n\n this.mediaSource.addEventListener('sourceopen', this.handleSourceOpen_);\n this.mediaSource.addEventListener('sourceended', this.handleSourceEnded_);\n this.mediaSource.addEventListener('startstreaming', this.load);\n this.mediaSource.addEventListener('endstreaming', this.pause); // we don't have to handle sourceclose since dispose will handle termination of\n // everything, and the MediaSource should not be detached without a proper disposal\n\n this.seekable_ = createTimeRanges();\n this.hasPlayed_ = false;\n this.syncController_ = new SyncController(options);\n this.segmentMetadataTrack_ = tech.addRemoteTextTrack({\n kind: 'metadata',\n label: 'segment-metadata'\n }, false).track;\n this.decrypter_ = new Decrypter();\n this.sourceUpdater_ = new SourceUpdater(this.mediaSource);\n this.inbandTextTracks_ = {};\n this.timelineChangeController_ = new TimelineChangeController();\n this.keyStatusMap_ = new Map();\n const segmentLoaderSettings = {\n vhs: this.vhs_,\n parse708captions: options.parse708captions,\n useDtsForTimestampOffset: options.useDtsForTimestampOffset,\n captionServices,\n mediaSource: this.mediaSource,\n currentTime: this.tech_.currentTime.bind(this.tech_),\n seekable: () => this.seekable(),\n seeking: () => this.tech_.seeking(),\n duration: () => this.duration(),\n hasPlayed: () => this.hasPlayed_,\n goalBufferLength: () => this.goalBufferLength(),\n bandwidth,\n syncController: this.syncController_,\n decrypter: this.decrypter_,\n sourceType: this.sourceType_,\n inbandTextTracks: this.inbandTextTracks_,\n cacheEncryptionKeys,\n sourceUpdater: this.sourceUpdater_,\n timelineChangeController: this.timelineChangeController_,\n exactManifestTimings: options.exactManifestTimings,\n addMetadataToTextTrack: this.addMetadataToTextTrack.bind(this)\n }; // The source type check not only determines whether a special DASH playlist loader\n // should be used, but also covers the case where the provided src is a vhs-json\n // manifest object (instead of a URL). In the case of vhs-json, the default\n // PlaylistLoader should be used.\n\n this.mainPlaylistLoader_ = this.sourceType_ === 'dash' ? new DashPlaylistLoader(src, this.vhs_, merge(this.requestOptions_, {\n addMetadataToTextTrack: this.addMetadataToTextTrack.bind(this)\n })) : new PlaylistLoader(src, this.vhs_, merge(this.requestOptions_, {\n addDateRangesToTextTrack: this.addDateRangesToTextTrack_.bind(this)\n }));\n this.setupMainPlaylistLoaderListeners_(); // setup segment loaders\n // combined audio/video or just video when alternate audio track is selected\n\n this.mainSegmentLoader_ = new SegmentLoader(merge(segmentLoaderSettings, {\n segmentMetadataTrack: this.segmentMetadataTrack_,\n loaderType: 'main'\n }), options); // alternate audio track\n\n this.audioSegmentLoader_ = new SegmentLoader(merge(segmentLoaderSettings, {\n loaderType: 'audio'\n }), options);\n this.subtitleSegmentLoader_ = new VTTSegmentLoader(merge(segmentLoaderSettings, {\n loaderType: 'vtt',\n featuresNativeTextTracks: this.tech_.featuresNativeTextTracks,\n loadVttJs: () => new Promise((resolve, reject) => {\n function onLoad() {\n tech.off('vttjserror', onError);\n resolve();\n }\n function onError() {\n tech.off('vttjsloaded', onLoad);\n reject();\n }\n tech.one('vttjsloaded', onLoad);\n tech.one('vttjserror', onError); // safe to call multiple times, script will be loaded only once:\n\n tech.addWebVttScript_();\n })\n }), options);\n const getBandwidth = () => {\n return this.mainSegmentLoader_.bandwidth;\n };\n this.contentSteeringController_ = new ContentSteeringController(this.vhs_.xhr, getBandwidth);\n this.setupSegmentLoaderListeners_();\n if (this.bufferBasedABR) {\n this.mainPlaylistLoader_.one('loadedplaylist', () => this.startABRTimer_());\n this.tech_.on('pause', () => this.stopABRTimer_());\n this.tech_.on('play', () => this.startABRTimer_());\n } // Create SegmentLoader stat-getters\n // mediaRequests_\n // mediaRequestsAborted_\n // mediaRequestsTimedout_\n // mediaRequestsErrored_\n // mediaTransferDuration_\n // mediaBytesTransferred_\n // mediaAppends_\n\n loaderStats.forEach(stat => {\n this[stat + '_'] = sumLoaderStat.bind(this, stat);\n });\n this.logger_ = logger('pc');\n this.triggeredFmp4Usage = false;\n if (this.tech_.preload() === 'none') {\n this.loadOnPlay_ = () => {\n this.loadOnPlay_ = null;\n this.mainPlaylistLoader_.load();\n };\n this.tech_.one('play', this.loadOnPlay_);\n } else {\n this.mainPlaylistLoader_.load();\n }\n this.timeToLoadedData__ = -1;\n this.mainAppendsToLoadedData__ = -1;\n this.audioAppendsToLoadedData__ = -1;\n const event = this.tech_.preload() === 'none' ? 'play' : 'loadstart'; // start the first frame timer on loadstart or play (for preload none)\n\n this.tech_.one(event, () => {\n const timeToLoadedDataStart = Date.now();\n this.tech_.one('loadeddata', () => {\n this.timeToLoadedData__ = Date.now() - timeToLoadedDataStart;\n this.mainAppendsToLoadedData__ = this.mainSegmentLoader_.mediaAppends;\n this.audioAppendsToLoadedData__ = this.audioSegmentLoader_.mediaAppends;\n });\n });\n }\n mainAppendsToLoadedData_() {\n return this.mainAppendsToLoadedData__;\n }\n audioAppendsToLoadedData_() {\n return this.audioAppendsToLoadedData__;\n }\n appendsToLoadedData_() {\n const main = this.mainAppendsToLoadedData_();\n const audio = this.audioAppendsToLoadedData_();\n if (main === -1 || audio === -1) {\n return -1;\n }\n return main + audio;\n }\n timeToLoadedData_() {\n return this.timeToLoadedData__;\n }\n /**\n * Run selectPlaylist and switch to the new playlist if we should\n *\n * @param {string} [reason=abr] a reason for why the ABR check is made\n * @private\n */\n\n checkABR_(reason = 'abr') {\n const nextPlaylist = this.selectPlaylist();\n if (nextPlaylist && this.shouldSwitchToMedia_(nextPlaylist)) {\n this.switchMedia_(nextPlaylist, reason);\n }\n }\n switchMedia_(playlist, cause, delay) {\n const oldMedia = this.media();\n const oldId = oldMedia && (oldMedia.id || oldMedia.uri);\n const newId = playlist && (playlist.id || playlist.uri);\n if (oldId && oldId !== newId) {\n this.logger_(`switch media ${oldId} -> ${newId} from ${cause}`);\n const metadata = {\n renditionInfo: {\n id: newId,\n bandwidth: playlist.attributes.BANDWIDTH,\n resolution: playlist.attributes.RESOLUTION,\n codecs: playlist.attributes.CODECS\n },\n cause\n };\n this.trigger({\n type: 'renditionselected',\n metadata\n });\n this.tech_.trigger({\n type: 'usage',\n name: `vhs-rendition-change-${cause}`\n });\n }\n this.mainPlaylistLoader_.media(playlist, delay);\n }\n /**\n * A function that ensures we switch our playlists inside of `mediaTypes`\n * to match the current `serviceLocation` provided by the contentSteering controller.\n * We want to check media types of `AUDIO`, `SUBTITLES`, and `CLOSED-CAPTIONS`.\n *\n * This should only be called on a DASH playback scenario while using content steering.\n * This is necessary due to differences in how media in HLS manifests are generally tied to\n * a video playlist, where in DASH that is not always the case.\n */\n\n switchMediaForDASHContentSteering_() {\n ['AUDIO', 'SUBTITLES', 'CLOSED-CAPTIONS'].forEach(type => {\n const mediaType = this.mediaTypes_[type];\n const activeGroup = mediaType ? mediaType.activeGroup() : null;\n const pathway = this.contentSteeringController_.getPathway();\n if (activeGroup && pathway) {\n // activeGroup can be an array or a single group\n const mediaPlaylists = activeGroup.length ? activeGroup[0].playlists : activeGroup.playlists;\n const dashMediaPlaylists = mediaPlaylists.filter(p => p.attributes.serviceLocation === pathway); // Switch the current active playlist to the correct CDN\n\n if (dashMediaPlaylists.length) {\n this.mediaTypes_[type].activePlaylistLoader.media(dashMediaPlaylists[0]);\n }\n }\n });\n }\n /**\n * Start a timer that periodically calls checkABR_\n *\n * @private\n */\n\n startABRTimer_() {\n this.stopABRTimer_();\n this.abrTimer_ = window$1.setInterval(() => this.checkABR_(), 250);\n }\n /**\n * Stop the timer that periodically calls checkABR_\n *\n * @private\n */\n\n stopABRTimer_() {\n // if we're scrubbing, we don't need to pause.\n // This getter will be added to Video.js in version 7.11.\n if (this.tech_.scrubbing && this.tech_.scrubbing()) {\n return;\n }\n window$1.clearInterval(this.abrTimer_);\n this.abrTimer_ = null;\n }\n /**\n * Get a list of playlists for the currently selected audio playlist\n *\n * @return {Array} the array of audio playlists\n */\n\n getAudioTrackPlaylists_() {\n const main = this.main();\n const defaultPlaylists = main && main.playlists || []; // if we don't have any audio groups then we can only\n // assume that the audio tracks are contained in main\n // playlist array, use that or an empty array.\n\n if (!main || !main.mediaGroups || !main.mediaGroups.AUDIO) {\n return defaultPlaylists;\n }\n const AUDIO = main.mediaGroups.AUDIO;\n const groupKeys = Object.keys(AUDIO);\n let track; // get the current active track\n\n if (Object.keys(this.mediaTypes_.AUDIO.groups).length) {\n track = this.mediaTypes_.AUDIO.activeTrack(); // or get the default track from main if mediaTypes_ isn't setup yet\n } else {\n // default group is `main` or just the first group.\n const defaultGroup = AUDIO.main || groupKeys.length && AUDIO[groupKeys[0]];\n for (const label in defaultGroup) {\n if (defaultGroup[label].default) {\n track = {\n label\n };\n break;\n }\n }\n } // no active track no playlists.\n\n if (!track) {\n return defaultPlaylists;\n }\n const playlists = []; // get all of the playlists that are possible for the\n // active track.\n\n for (const group in AUDIO) {\n if (AUDIO[group][track.label]) {\n const properties = AUDIO[group][track.label];\n if (properties.playlists && properties.playlists.length) {\n playlists.push.apply(playlists, properties.playlists);\n } else if (properties.uri) {\n playlists.push(properties);\n } else if (main.playlists.length) {\n // if an audio group does not have a uri\n // see if we have main playlists that use it as a group.\n // if we do then add those to the playlists list.\n for (let i = 0; i < main.playlists.length; i++) {\n const playlist = main.playlists[i];\n if (playlist.attributes && playlist.attributes.AUDIO && playlist.attributes.AUDIO === group) {\n playlists.push(playlist);\n }\n }\n }\n }\n }\n if (!playlists.length) {\n return defaultPlaylists;\n }\n return playlists;\n }\n /**\n * Register event handlers on the main playlist loader. A helper\n * function for construction time.\n *\n * @private\n */\n\n setupMainPlaylistLoaderListeners_() {\n this.mainPlaylistLoader_.on('loadedmetadata', () => {\n const media = this.mainPlaylistLoader_.media();\n const requestTimeout = media.targetDuration * 1.5 * 1000; // If we don't have any more available playlists, we don't want to\n // timeout the request.\n\n if (isLowestEnabledRendition(this.mainPlaylistLoader_.main, this.mainPlaylistLoader_.media())) {\n this.requestOptions_.timeout = 0;\n } else {\n this.requestOptions_.timeout = requestTimeout;\n } // if this isn't a live video and preload permits, start\n // downloading segments\n\n if (media.endList && this.tech_.preload() !== 'none') {\n this.mainSegmentLoader_.playlist(media, this.requestOptions_);\n this.mainSegmentLoader_.load();\n }\n setupMediaGroups({\n sourceType: this.sourceType_,\n segmentLoaders: {\n AUDIO: this.audioSegmentLoader_,\n SUBTITLES: this.subtitleSegmentLoader_,\n main: this.mainSegmentLoader_\n },\n tech: this.tech_,\n requestOptions: this.requestOptions_,\n mainPlaylistLoader: this.mainPlaylistLoader_,\n vhs: this.vhs_,\n main: this.main(),\n mediaTypes: this.mediaTypes_,\n excludePlaylist: this.excludePlaylist.bind(this)\n });\n this.triggerPresenceUsage_(this.main(), media);\n this.setupFirstPlay();\n if (!this.mediaTypes_.AUDIO.activePlaylistLoader || this.mediaTypes_.AUDIO.activePlaylistLoader.media()) {\n this.trigger('selectedinitialmedia');\n } else {\n // We must wait for the active audio playlist loader to\n // finish setting up before triggering this event so the\n // representations API and EME setup is correct\n this.mediaTypes_.AUDIO.activePlaylistLoader.one('loadedmetadata', () => {\n this.trigger('selectedinitialmedia');\n });\n }\n });\n this.mainPlaylistLoader_.on('loadedplaylist', () => {\n if (this.loadOnPlay_) {\n this.tech_.off('play', this.loadOnPlay_);\n }\n let updatedPlaylist = this.mainPlaylistLoader_.media();\n if (!updatedPlaylist) {\n // Add content steering listeners on first load and init.\n this.attachContentSteeringListeners_();\n this.initContentSteeringController_(); // exclude any variants that are not supported by the browser before selecting\n // an initial media as the playlist selectors do not consider browser support\n\n this.excludeUnsupportedVariants_();\n let selectedMedia;\n if (this.enableLowInitialPlaylist) {\n selectedMedia = this.selectInitialPlaylist();\n }\n if (!selectedMedia) {\n selectedMedia = this.selectPlaylist();\n }\n if (!selectedMedia || !this.shouldSwitchToMedia_(selectedMedia)) {\n return;\n }\n this.initialMedia_ = selectedMedia;\n this.switchMedia_(this.initialMedia_, 'initial'); // Under the standard case where a source URL is provided, loadedplaylist will\n // fire again since the playlist will be requested. In the case of vhs-json\n // (where the manifest object is provided as the source), when the media\n // playlist's `segments` list is already available, a media playlist won't be\n // requested, and loadedplaylist won't fire again, so the playlist handler must be\n // called on its own here.\n\n const haveJsonSource = this.sourceType_ === 'vhs-json' && this.initialMedia_.segments;\n if (!haveJsonSource) {\n return;\n }\n updatedPlaylist = this.initialMedia_;\n }\n this.handleUpdatedMediaPlaylist(updatedPlaylist);\n });\n this.mainPlaylistLoader_.on('error', () => {\n const error = this.mainPlaylistLoader_.error;\n this.excludePlaylist({\n playlistToExclude: error.playlist,\n error\n });\n });\n this.mainPlaylistLoader_.on('mediachanging', () => {\n this.mainSegmentLoader_.abort();\n this.mainSegmentLoader_.pause();\n });\n this.mainPlaylistLoader_.on('mediachange', () => {\n const media = this.mainPlaylistLoader_.media();\n const requestTimeout = media.targetDuration * 1.5 * 1000; // If we don't have any more available playlists, we don't want to\n // timeout the request.\n\n if (isLowestEnabledRendition(this.mainPlaylistLoader_.main, this.mainPlaylistLoader_.media())) {\n this.requestOptions_.timeout = 0;\n } else {\n this.requestOptions_.timeout = requestTimeout;\n }\n if (this.sourceType_ === 'dash') {\n // we don't want to re-request the same hls playlist right after it was changed\n // Initially it was implemented as workaround to restart playlist loader for live\n // when playlist loader is paused because of playlist exclusions:\n // see: https://github.com/videojs/http-streaming/pull/1339\n // but this introduces duplicate \"loadedplaylist\" event.\n // Ideally we want to re-think playlist loader life-cycle events,\n // but simply checking \"paused\" state should help a lot\n if (this.mainPlaylistLoader_.isPaused) {\n this.mainPlaylistLoader_.load();\n }\n } // TODO: Create a new event on the PlaylistLoader that signals\n // that the segments have changed in some way and use that to\n // update the SegmentLoader instead of doing it twice here and\n // on `loadedplaylist`\n\n this.mainSegmentLoader_.pause();\n this.mainSegmentLoader_.playlist(media, this.requestOptions_);\n if (this.waitingForFastQualityPlaylistReceived_) {\n this.runFastQualitySwitch_();\n } else {\n this.mainSegmentLoader_.load();\n }\n this.tech_.trigger({\n type: 'mediachange',\n bubbles: true\n });\n });\n this.mainPlaylistLoader_.on('playlistunchanged', () => {\n const updatedPlaylist = this.mainPlaylistLoader_.media(); // ignore unchanged playlists that have already been\n // excluded for not-changing. We likely just have a really slowly updating\n // playlist.\n\n if (updatedPlaylist.lastExcludeReason_ === 'playlist-unchanged') {\n return;\n }\n const playlistOutdated = this.stuckAtPlaylistEnd_(updatedPlaylist);\n if (playlistOutdated) {\n // Playlist has stopped updating and we're stuck at its end. Try to\n // exclude it and switch to another playlist in the hope that that\n // one is updating (and give the player a chance to re-adjust to the\n // safe live point).\n this.excludePlaylist({\n error: {\n message: 'Playlist no longer updating.',\n reason: 'playlist-unchanged'\n }\n }); // useful for monitoring QoS\n\n this.tech_.trigger('playliststuck');\n }\n });\n this.mainPlaylistLoader_.on('renditiondisabled', () => {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-rendition-disabled'\n });\n });\n this.mainPlaylistLoader_.on('renditionenabled', () => {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-rendition-enabled'\n });\n });\n const playlistLoaderEvents = ['manifestrequeststart', 'manifestrequestcomplete', 'manifestparsestart', 'manifestparsecomplete', 'playlistrequeststart', 'playlistrequestcomplete', 'playlistparsestart', 'playlistparsecomplete', 'renditiondisabled', 'renditionenabled'];\n playlistLoaderEvents.forEach(eventName => {\n this.mainPlaylistLoader_.on(eventName, metadata => {\n // trigger directly on the player to ensure early events are fired.\n this.player_.trigger(_extends({}, metadata));\n });\n });\n }\n /**\n * Given an updated media playlist (whether it was loaded for the first time, or\n * refreshed for live playlists), update any relevant properties and state to reflect\n * changes in the media that should be accounted for (e.g., cues and duration).\n *\n * @param {Object} updatedPlaylist the updated media playlist object\n *\n * @private\n */\n\n handleUpdatedMediaPlaylist(updatedPlaylist) {\n if (this.useCueTags_) {\n this.updateAdCues_(updatedPlaylist);\n } // TODO: Create a new event on the PlaylistLoader that signals\n // that the segments have changed in some way and use that to\n // update the SegmentLoader instead of doing it twice here and\n // on `mediachange`\n\n this.mainSegmentLoader_.pause();\n this.mainSegmentLoader_.playlist(updatedPlaylist, this.requestOptions_);\n if (this.waitingForFastQualityPlaylistReceived_) {\n this.runFastQualitySwitch_();\n }\n this.updateDuration(!updatedPlaylist.endList); // If the player isn't paused, ensure that the segment loader is running,\n // as it is possible that it was temporarily stopped while waiting for\n // a playlist (e.g., in case the playlist errored and we re-requested it).\n\n if (!this.tech_.paused()) {\n this.mainSegmentLoader_.load();\n if (this.audioSegmentLoader_) {\n this.audioSegmentLoader_.load();\n }\n }\n }\n /**\n * A helper function for triggerring presence usage events once per source\n *\n * @private\n */\n\n triggerPresenceUsage_(main, media) {\n const mediaGroups = main.mediaGroups || {};\n let defaultDemuxed = true;\n const audioGroupKeys = Object.keys(mediaGroups.AUDIO);\n for (const mediaGroup in mediaGroups.AUDIO) {\n for (const label in mediaGroups.AUDIO[mediaGroup]) {\n const properties = mediaGroups.AUDIO[mediaGroup][label];\n if (!properties.uri) {\n defaultDemuxed = false;\n }\n }\n }\n if (defaultDemuxed) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-demuxed'\n });\n }\n if (Object.keys(mediaGroups.SUBTITLES).length) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-webvtt'\n });\n }\n if (Vhs$1.Playlist.isAes(media)) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-aes'\n });\n }\n if (audioGroupKeys.length && Object.keys(mediaGroups.AUDIO[audioGroupKeys[0]]).length > 1) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-alternate-audio'\n });\n }\n if (this.useCueTags_) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-playlist-cue-tags'\n });\n }\n }\n shouldSwitchToMedia_(nextPlaylist) {\n const currentPlaylist = this.mainPlaylistLoader_.media() || this.mainPlaylistLoader_.pendingMedia_;\n const currentTime = this.tech_.currentTime();\n const bufferLowWaterLine = this.bufferLowWaterLine();\n const bufferHighWaterLine = this.bufferHighWaterLine();\n const buffered = this.tech_.buffered();\n return shouldSwitchToMedia({\n buffered,\n currentTime,\n currentPlaylist,\n nextPlaylist,\n bufferLowWaterLine,\n bufferHighWaterLine,\n duration: this.duration(),\n bufferBasedABR: this.bufferBasedABR,\n log: this.logger_\n });\n }\n /**\n * Register event handlers on the segment loaders. A helper function\n * for construction time.\n *\n * @private\n */\n\n setupSegmentLoaderListeners_() {\n this.mainSegmentLoader_.on('bandwidthupdate', () => {\n // Whether or not buffer based ABR or another ABR is used, on a bandwidth change it's\n // useful to check to see if a rendition switch should be made.\n this.checkABR_('bandwidthupdate');\n this.tech_.trigger('bandwidthupdate');\n });\n this.mainSegmentLoader_.on('timeout', () => {\n if (this.bufferBasedABR) {\n // If a rendition change is needed, then it would've be done on `bandwidthupdate`.\n // Here the only consideration is that for buffer based ABR there's no guarantee\n // of an immediate switch (since the bandwidth is averaged with a timeout\n // bandwidth value of 1), so force a load on the segment loader to keep it going.\n this.mainSegmentLoader_.load();\n }\n }); // `progress` events are not reliable enough of a bandwidth measure to trigger buffer\n // based ABR.\n\n if (!this.bufferBasedABR) {\n this.mainSegmentLoader_.on('progress', () => {\n this.trigger('progress');\n });\n }\n this.mainSegmentLoader_.on('error', () => {\n const error = this.mainSegmentLoader_.error();\n this.excludePlaylist({\n playlistToExclude: error.playlist,\n error\n });\n });\n this.mainSegmentLoader_.on('appenderror', () => {\n this.error = this.mainSegmentLoader_.error_;\n this.trigger('error');\n });\n this.mainSegmentLoader_.on('syncinfoupdate', () => {\n this.onSyncInfoUpdate_();\n });\n this.mainSegmentLoader_.on('timestampoffset', () => {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-timestamp-offset'\n });\n });\n this.audioSegmentLoader_.on('syncinfoupdate', () => {\n this.onSyncInfoUpdate_();\n });\n this.audioSegmentLoader_.on('appenderror', () => {\n this.error = this.audioSegmentLoader_.error_;\n this.trigger('error');\n });\n this.mainSegmentLoader_.on('ended', () => {\n this.logger_('main segment loader ended');\n this.onEndOfStream();\n }); // There is the possibility of the video segment and the audio segment\n // at a current time to be on different timelines. When this occurs, the player\n // forwards playback to a point where these two segment types are back on the same\n // timeline. This time will be just after the end of the audio segment that is on\n // a previous timeline.\n\n this.timelineChangeController_.on('audioTimelineBehind', () => {\n const segmentInfo = this.audioSegmentLoader_.pendingSegment_;\n if (!segmentInfo || !segmentInfo.segment || !segmentInfo.segment.syncInfo) {\n return;\n } // Update the current time to just after the faulty audio segment.\n // This moves playback to a spot where both audio and video segments\n // are on the same timeline.\n\n const newTime = segmentInfo.segment.syncInfo.end + 0.01;\n this.tech_.setCurrentTime(newTime);\n });\n this.timelineChangeController_.on('fixBadTimelineChange', () => {\n // pause, reset-everything and load for all segment-loaders\n this.logger_('Fix bad timeline change. Restarting al segment loaders...');\n this.mainSegmentLoader_.pause();\n this.mainSegmentLoader_.resetEverything();\n if (this.mediaTypes_.AUDIO.activePlaylistLoader) {\n this.audioSegmentLoader_.pause();\n this.audioSegmentLoader_.resetEverything();\n }\n if (this.mediaTypes_.SUBTITLES.activePlaylistLoader) {\n this.subtitleSegmentLoader_.pause();\n this.subtitleSegmentLoader_.resetEverything();\n } // start segment loader loading in case they are paused\n\n this.load();\n });\n this.mainSegmentLoader_.on('earlyabort', event => {\n // never try to early abort with the new ABR algorithm\n if (this.bufferBasedABR) {\n return;\n }\n this.delegateLoaders_('all', ['abort']);\n this.excludePlaylist({\n error: {\n message: 'Aborted early because there isn\\'t enough bandwidth to complete ' + 'the request without rebuffering.'\n },\n playlistExclusionDuration: ABORT_EARLY_EXCLUSION_SECONDS\n });\n });\n const updateCodecs = () => {\n if (!this.sourceUpdater_.hasCreatedSourceBuffers()) {\n return this.tryToCreateSourceBuffers_();\n }\n const codecs = this.getCodecsOrExclude_(); // no codecs means that the playlist was excluded\n\n if (!codecs) {\n return;\n }\n this.sourceUpdater_.addOrChangeSourceBuffers(codecs);\n };\n this.mainSegmentLoader_.on('trackinfo', updateCodecs);\n this.audioSegmentLoader_.on('trackinfo', updateCodecs);\n this.mainSegmentLoader_.on('fmp4', () => {\n if (!this.triggeredFmp4Usage) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-fmp4'\n });\n this.triggeredFmp4Usage = true;\n }\n });\n this.audioSegmentLoader_.on('fmp4', () => {\n if (!this.triggeredFmp4Usage) {\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-fmp4'\n });\n this.triggeredFmp4Usage = true;\n }\n });\n this.audioSegmentLoader_.on('ended', () => {\n this.logger_('audioSegmentLoader ended');\n this.onEndOfStream();\n });\n const segmentLoaderEvents = ['segmentselected', 'segmentloadstart', 'segmentloaded', 'segmentkeyloadstart', 'segmentkeyloadcomplete', 'segmentdecryptionstart', 'segmentdecryptioncomplete', 'segmenttransmuxingstart', 'segmenttransmuxingcomplete', 'segmenttransmuxingtrackinfoavailable', 'segmenttransmuxingtiminginfoavailable', 'segmentappendstart', 'appendsdone', 'bandwidthupdated', 'timelinechange', 'codecschange'];\n segmentLoaderEvents.forEach(eventName => {\n this.mainSegmentLoader_.on(eventName, metadata => {\n this.player_.trigger(_extends({}, metadata));\n });\n this.audioSegmentLoader_.on(eventName, metadata => {\n this.player_.trigger(_extends({}, metadata));\n });\n this.subtitleSegmentLoader_.on(eventName, metadata => {\n this.player_.trigger(_extends({}, metadata));\n });\n });\n }\n mediaSecondsLoaded_() {\n return Math.max(this.audioSegmentLoader_.mediaSecondsLoaded + this.mainSegmentLoader_.mediaSecondsLoaded);\n }\n /**\n * Call load on our SegmentLoaders\n */\n\n load() {\n this.mainSegmentLoader_.load();\n if (this.mediaTypes_.AUDIO.activePlaylistLoader) {\n this.audioSegmentLoader_.load();\n }\n if (this.mediaTypes_.SUBTITLES.activePlaylistLoader) {\n this.subtitleSegmentLoader_.load();\n }\n }\n /**\n * Call pause on our SegmentLoaders\n */\n\n pause() {\n this.mainSegmentLoader_.pause();\n if (this.mediaTypes_.AUDIO.activePlaylistLoader) {\n this.audioSegmentLoader_.pause();\n }\n if (this.mediaTypes_.SUBTITLES.activePlaylistLoader) {\n this.subtitleSegmentLoader_.pause();\n }\n }\n /**\n * Re-tune playback quality level for the current player\n * conditions. This method will perform destructive actions like removing\n * already buffered content in order to readjust the currently active\n * playlist quickly. This is good for manual quality changes\n *\n * @private\n */\n\n fastQualityChange_(media = this.selectPlaylist()) {\n if (media && media === this.mainPlaylistLoader_.media()) {\n this.logger_('skipping fastQualityChange because new media is same as old');\n return;\n }\n this.switchMedia_(media, 'fast-quality'); // we would like to avoid race condition when we call fastQuality,\n // reset everything and start loading segments from prev segments instead of new because new playlist is not received yet\n\n this.waitingForFastQualityPlaylistReceived_ = true;\n }\n runFastQualitySwitch_() {\n this.waitingForFastQualityPlaylistReceived_ = false;\n this.mainSegmentLoader_.pause();\n this.mainSegmentLoader_.resetEverything();\n if (this.mediaTypes_.AUDIO.activePlaylistLoader) {\n this.audioSegmentLoader_.pause();\n this.audioSegmentLoader_.resetEverything();\n }\n if (this.mediaTypes_.SUBTITLES.activePlaylistLoader) {\n this.subtitleSegmentLoader_.pause();\n this.subtitleSegmentLoader_.resetEverything();\n } // start segment loader loading in case they are paused\n\n this.load();\n }\n /**\n * Begin playback.\n */\n\n play() {\n if (this.setupFirstPlay()) {\n return;\n }\n if (this.tech_.ended()) {\n this.tech_.setCurrentTime(0);\n }\n if (this.hasPlayed_) {\n this.load();\n }\n const seekable = this.tech_.seekable(); // if the viewer has paused and we fell out of the live window,\n // seek forward to the live point\n\n if (this.tech_.duration() === Infinity) {\n if (this.tech_.currentTime() < seekable.start(0)) {\n return this.tech_.setCurrentTime(seekable.end(seekable.length - 1));\n }\n }\n }\n /**\n * Seek to the latest media position if this is a live video and the\n * player and video are loaded and initialized.\n */\n\n setupFirstPlay() {\n const media = this.mainPlaylistLoader_.media(); // Check that everything is ready to begin buffering for the first call to play\n // If 1) there is no active media\n // 2) the player is paused\n // 3) the first play has already been setup\n // then exit early\n\n if (!media || this.tech_.paused() || this.hasPlayed_) {\n return false;\n } // when the video is a live stream and/or has a start time\n\n if (!media.endList || media.start) {\n const seekable = this.seekable();\n if (!seekable.length) {\n // without a seekable range, the player cannot seek to begin buffering at the\n // live or start point\n return false;\n }\n const seekableEnd = seekable.end(0);\n let startPoint = seekableEnd;\n if (media.start) {\n const offset = media.start.timeOffset;\n if (offset < 0) {\n startPoint = Math.max(seekableEnd + offset, seekable.start(0));\n } else {\n startPoint = Math.min(seekableEnd, offset);\n }\n } // trigger firstplay to inform the source handler to ignore the next seek event\n\n this.trigger('firstplay'); // seek to the live point\n\n this.tech_.setCurrentTime(startPoint);\n }\n this.hasPlayed_ = true; // we can begin loading now that everything is ready\n\n this.load();\n return true;\n }\n /**\n * handle the sourceopen event on the MediaSource\n *\n * @private\n */\n\n handleSourceOpen_() {\n // Only attempt to create the source buffer if none already exist.\n // handleSourceOpen is also called when we are \"re-opening\" a source buffer\n // after `endOfStream` has been called (in response to a seek for instance)\n this.tryToCreateSourceBuffers_(); // if autoplay is enabled, begin playback. This is duplicative of\n // code in video.js but is required because play() must be invoked\n // *after* the media source has opened.\n\n if (this.tech_.autoplay()) {\n const playPromise = this.tech_.play(); // Catch/silence error when a pause interrupts a play request\n // on browsers which return a promise\n\n if (typeof playPromise !== 'undefined' && typeof playPromise.then === 'function') {\n playPromise.then(null, e => {});\n }\n }\n this.trigger('sourceopen');\n }\n /**\n * handle the sourceended event on the MediaSource\n *\n * @private\n */\n\n handleSourceEnded_() {\n if (!this.inbandTextTracks_.metadataTrack_) {\n return;\n }\n const cues = this.inbandTextTracks_.metadataTrack_.cues;\n if (!cues || !cues.length) {\n return;\n }\n const duration = this.duration();\n cues[cues.length - 1].endTime = isNaN(duration) || Math.abs(duration) === Infinity ? Number.MAX_VALUE : duration;\n }\n /**\n * handle the durationchange event on the MediaSource\n *\n * @private\n */\n\n handleDurationChange_() {\n this.tech_.trigger('durationchange');\n }\n /**\n * Calls endOfStream on the media source when all active stream types have called\n * endOfStream\n *\n * @param {string} streamType\n * Stream type of the segment loader that called endOfStream\n * @private\n */\n\n onEndOfStream() {\n let isEndOfStream = this.mainSegmentLoader_.ended_;\n if (this.mediaTypes_.AUDIO.activePlaylistLoader) {\n const mainMediaInfo = this.mainSegmentLoader_.getCurrentMediaInfo_(); // if the audio playlist loader exists, then alternate audio is active\n\n if (!mainMediaInfo || mainMediaInfo.hasVideo) {\n // if we do not know if the main segment loader contains video yet or if we\n // definitively know the main segment loader contains video, then we need to wait\n // for both main and audio segment loaders to call endOfStream\n isEndOfStream = isEndOfStream && this.audioSegmentLoader_.ended_;\n } else {\n // otherwise just rely on the audio loader\n isEndOfStream = this.audioSegmentLoader_.ended_;\n }\n }\n if (!isEndOfStream) {\n return;\n }\n this.stopABRTimer_();\n this.sourceUpdater_.endOfStream();\n }\n /**\n * Check if a playlist has stopped being updated\n *\n * @param {Object} playlist the media playlist object\n * @return {boolean} whether the playlist has stopped being updated or not\n */\n\n stuckAtPlaylistEnd_(playlist) {\n const seekable = this.seekable();\n if (!seekable.length) {\n // playlist doesn't have enough information to determine whether we are stuck\n return false;\n }\n const expired = this.syncController_.getExpiredTime(playlist, this.duration());\n if (expired === null) {\n return false;\n } // does not use the safe live end to calculate playlist end, since we\n // don't want to say we are stuck while there is still content\n\n const absolutePlaylistEnd = Vhs$1.Playlist.playlistEnd(playlist, expired);\n const currentTime = this.tech_.currentTime();\n const buffered = this.tech_.buffered();\n if (!buffered.length) {\n // return true if the playhead reached the absolute end of the playlist\n return absolutePlaylistEnd - currentTime <= SAFE_TIME_DELTA;\n }\n const bufferedEnd = buffered.end(buffered.length - 1); // return true if there is too little buffer left and buffer has reached absolute\n // end of playlist\n\n return bufferedEnd - currentTime <= SAFE_TIME_DELTA && absolutePlaylistEnd - bufferedEnd <= SAFE_TIME_DELTA;\n }\n /**\n * Exclude a playlist for a set amount of time, making it unavailable for selection by\n * the rendition selection algorithm, then force a new playlist (rendition) selection.\n *\n * @param {Object=} playlistToExclude\n * the playlist to exclude, defaults to the currently selected playlist\n * @param {Object=} error\n * an optional error\n * @param {number=} playlistExclusionDuration\n * an optional number of seconds to exclude the playlist\n */\n\n excludePlaylist({\n playlistToExclude = this.mainPlaylistLoader_.media(),\n error = {},\n playlistExclusionDuration\n }) {\n // If the `error` was generated by the playlist loader, it will contain\n // the playlist we were trying to load (but failed) and that should be\n // excluded instead of the currently selected playlist which is likely\n // out-of-date in this scenario\n playlistToExclude = playlistToExclude || this.mainPlaylistLoader_.media();\n playlistExclusionDuration = playlistExclusionDuration || error.playlistExclusionDuration || this.playlistExclusionDuration; // If there is no current playlist, then an error occurred while we were\n // trying to load the main OR while we were disposing of the tech\n\n if (!playlistToExclude) {\n this.error = error;\n if (this.mediaSource.readyState !== 'open') {\n this.trigger('error');\n } else {\n this.sourceUpdater_.endOfStream('network');\n }\n return;\n }\n playlistToExclude.playlistErrors_++;\n const playlists = this.mainPlaylistLoader_.main.playlists;\n const enabledPlaylists = playlists.filter(isEnabled);\n const isFinalRendition = enabledPlaylists.length === 1 && enabledPlaylists[0] === playlistToExclude; // Don't exclude the only playlist unless it was excluded\n // forever\n\n if (playlists.length === 1 && playlistExclusionDuration !== Infinity) {\n videojs.log.warn(`Problem encountered with playlist ${playlistToExclude.id}. ` + 'Trying again since it is the only playlist.');\n this.tech_.trigger('retryplaylist'); // if this is a final rendition, we should delay\n\n return this.mainPlaylistLoader_.load(isFinalRendition);\n }\n if (isFinalRendition) {\n // If we're content steering, try other pathways.\n if (this.main().contentSteering) {\n const pathway = this.pathwayAttribute_(playlistToExclude); // Ignore at least 1 steering manifest refresh.\n\n const reIncludeDelay = this.contentSteeringController_.steeringManifest.ttl * 1000;\n this.contentSteeringController_.excludePathway(pathway);\n this.excludeThenChangePathway_();\n setTimeout(() => {\n this.contentSteeringController_.addAvailablePathway(pathway);\n }, reIncludeDelay);\n return;\n } // Since we're on the final non-excluded playlist, and we're about to exclude\n // it, instead of erring the player or retrying this playlist, clear out the current\n // exclusion list. This allows other playlists to be attempted in case any have been\n // fixed.\n\n let reincluded = false;\n playlists.forEach(playlist => {\n // skip current playlist which is about to be excluded\n if (playlist === playlistToExclude) {\n return;\n }\n const excludeUntil = playlist.excludeUntil; // a playlist cannot be reincluded if it wasn't excluded to begin with.\n\n if (typeof excludeUntil !== 'undefined' && excludeUntil !== Infinity) {\n reincluded = true;\n delete playlist.excludeUntil;\n }\n });\n if (reincluded) {\n videojs.log.warn('Removing other playlists from the exclusion list because the last ' + 'rendition is about to be excluded.'); // Technically we are retrying a playlist, in that we are simply retrying a previous\n // playlist. This is needed for users relying on the retryplaylist event to catch a\n // case where the player might be stuck and looping through \"dead\" playlists.\n\n this.tech_.trigger('retryplaylist');\n }\n } // Exclude this playlist\n\n let excludeUntil;\n if (playlistToExclude.playlistErrors_ > this.maxPlaylistRetries) {\n excludeUntil = Infinity;\n } else {\n excludeUntil = Date.now() + playlistExclusionDuration * 1000;\n }\n playlistToExclude.excludeUntil = excludeUntil;\n if (error.reason) {\n playlistToExclude.lastExcludeReason_ = error.reason;\n }\n this.tech_.trigger('excludeplaylist');\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-rendition-excluded'\n }); // TODO: only load a new playlist if we're excluding the current playlist\n // If this function was called with a playlist that's not the current active playlist\n // (e.g., media().id !== playlistToExclude.id),\n // then a new playlist should not be selected and loaded, as there's nothing wrong with the current playlist.\n\n const nextPlaylist = this.selectPlaylist();\n if (!nextPlaylist) {\n this.error = 'Playback cannot continue. No available working or supported playlists.';\n this.trigger('error');\n return;\n }\n const logFn = error.internal ? this.logger_ : videojs.log.warn;\n const errorMessage = error.message ? ' ' + error.message : '';\n logFn(`${error.internal ? 'Internal problem' : 'Problem'} encountered with playlist ${playlistToExclude.id}.` + `${errorMessage} Switching to playlist ${nextPlaylist.id}.`); // if audio group changed reset audio loaders\n\n if (nextPlaylist.attributes.AUDIO !== playlistToExclude.attributes.AUDIO) {\n this.delegateLoaders_('audio', ['abort', 'pause']);\n } // if subtitle group changed reset subtitle loaders\n\n if (nextPlaylist.attributes.SUBTITLES !== playlistToExclude.attributes.SUBTITLES) {\n this.delegateLoaders_('subtitle', ['abort', 'pause']);\n }\n this.delegateLoaders_('main', ['abort', 'pause']);\n const delayDuration = nextPlaylist.targetDuration / 2 * 1000 || 5 * 1000;\n const shouldDelay = typeof nextPlaylist.lastRequest === 'number' && Date.now() - nextPlaylist.lastRequest <= delayDuration; // delay if it's a final rendition or if the last refresh is sooner than half targetDuration\n\n return this.switchMedia_(nextPlaylist, 'exclude', isFinalRendition || shouldDelay);\n }\n /**\n * Pause all segment/playlist loaders\n */\n\n pauseLoading() {\n this.delegateLoaders_('all', ['abort', 'pause']);\n this.stopABRTimer_();\n }\n /**\n * Call a set of functions in order on playlist loaders, segment loaders,\n * or both types of loaders.\n *\n * @param {string} filter\n * Filter loaders that should call fnNames using a string. Can be:\n * * all - run on all loaders\n * * audio - run on all audio loaders\n * * subtitle - run on all subtitle loaders\n * * main - run on the main loaders\n *\n * @param {Array|string} fnNames\n * A string or array of function names to call.\n */\n\n delegateLoaders_(filter, fnNames) {\n const loaders = [];\n const dontFilterPlaylist = filter === 'all';\n if (dontFilterPlaylist || filter === 'main') {\n loaders.push(this.mainPlaylistLoader_);\n }\n const mediaTypes = [];\n if (dontFilterPlaylist || filter === 'audio') {\n mediaTypes.push('AUDIO');\n }\n if (dontFilterPlaylist || filter === 'subtitle') {\n mediaTypes.push('CLOSED-CAPTIONS');\n mediaTypes.push('SUBTITLES');\n }\n mediaTypes.forEach(mediaType => {\n const loader = this.mediaTypes_[mediaType] && this.mediaTypes_[mediaType].activePlaylistLoader;\n if (loader) {\n loaders.push(loader);\n }\n });\n ['main', 'audio', 'subtitle'].forEach(name => {\n const loader = this[`${name}SegmentLoader_`];\n if (loader && (filter === name || filter === 'all')) {\n loaders.push(loader);\n }\n });\n loaders.forEach(loader => fnNames.forEach(fnName => {\n if (typeof loader[fnName] === 'function') {\n loader[fnName]();\n }\n }));\n }\n /**\n * set the current time on all segment loaders\n *\n * @param {TimeRange} currentTime the current time to set\n * @return {TimeRange} the current time\n */\n\n setCurrentTime(currentTime) {\n const buffered = findRange(this.tech_.buffered(), currentTime);\n if (!(this.mainPlaylistLoader_ && this.mainPlaylistLoader_.media())) {\n // return immediately if the metadata is not ready yet\n return 0;\n } // it's clearly an edge-case but don't thrown an error if asked to\n // seek within an empty playlist\n\n if (!this.mainPlaylistLoader_.media().segments) {\n return 0;\n } // if the seek location is already buffered, continue buffering as usual\n\n if (buffered && buffered.length) {\n return currentTime;\n } // cancel outstanding requests so we begin buffering at the new\n // location\n\n this.mainSegmentLoader_.pause();\n this.mainSegmentLoader_.resetEverything();\n if (this.mediaTypes_.AUDIO.activePlaylistLoader) {\n this.audioSegmentLoader_.pause();\n this.audioSegmentLoader_.resetEverything();\n }\n if (this.mediaTypes_.SUBTITLES.activePlaylistLoader) {\n this.subtitleSegmentLoader_.pause();\n this.subtitleSegmentLoader_.resetEverything();\n } // start segment loader loading in case they are paused\n\n this.load();\n }\n /**\n * get the current duration\n *\n * @return {TimeRange} the duration\n */\n\n duration() {\n if (!this.mainPlaylistLoader_) {\n return 0;\n }\n const media = this.mainPlaylistLoader_.media();\n if (!media) {\n // no playlists loaded yet, so can't determine a duration\n return 0;\n } // Don't rely on the media source for duration in the case of a live playlist since\n // setting the native MediaSource's duration to infinity ends up with consequences to\n // seekable behavior. See https://github.com/w3c/media-source/issues/5 for details.\n //\n // This is resolved in the spec by https://github.com/w3c/media-source/pull/92,\n // however, few browsers have support for setLiveSeekableRange()\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaSource/setLiveSeekableRange\n //\n // Until a time when the duration of the media source can be set to infinity, and a\n // seekable range specified across browsers, just return Infinity.\n\n if (!media.endList) {\n return Infinity;\n } // Since this is a VOD video, it is safe to rely on the media source's duration (if\n // available). If it's not available, fall back to a playlist-calculated estimate.\n\n if (this.mediaSource) {\n return this.mediaSource.duration;\n }\n return Vhs$1.Playlist.duration(media);\n }\n /**\n * check the seekable range\n *\n * @return {TimeRange} the seekable range\n */\n\n seekable() {\n return this.seekable_;\n }\n getSeekableRange_(playlistLoader, mediaType) {\n const media = playlistLoader.media();\n if (!media) {\n return null;\n }\n const mediaSequenceSync = this.syncController_.getMediaSequenceSync(mediaType);\n if (mediaSequenceSync && mediaSequenceSync.isReliable) {\n const start = mediaSequenceSync.start;\n const end = mediaSequenceSync.end;\n if (!isFinite(start) || !isFinite(end)) {\n return null;\n }\n const liveEdgeDelay = Vhs$1.Playlist.liveEdgeDelay(this.mainPlaylistLoader_.main, media); // Make sure our seekable end is not negative\n\n const calculatedEnd = Math.max(0, end - liveEdgeDelay);\n if (calculatedEnd < start) {\n return null;\n }\n return createTimeRanges([[start, calculatedEnd]]);\n }\n const expired = this.syncController_.getExpiredTime(media, this.duration());\n if (expired === null) {\n return null;\n }\n const seekable = Vhs$1.Playlist.seekable(media, expired, Vhs$1.Playlist.liveEdgeDelay(this.mainPlaylistLoader_.main, media));\n return seekable.length ? seekable : null;\n }\n computeFinalSeekable_(mainSeekable, audioSeekable) {\n if (!audioSeekable) {\n return mainSeekable;\n }\n const mainStart = mainSeekable.start(0);\n const mainEnd = mainSeekable.end(0);\n const audioStart = audioSeekable.start(0);\n const audioEnd = audioSeekable.end(0);\n if (audioStart > mainEnd || mainStart > audioEnd) {\n // Seekables are far apart, rely on main\n return mainSeekable;\n } // Return the overlapping seekable range\n\n return createTimeRanges([[Math.max(mainStart, audioStart), Math.min(mainEnd, audioEnd)]]);\n }\n onSyncInfoUpdate_() {\n // TODO check for creation of both source buffers before updating seekable\n //\n // A fix was made to this function where a check for\n // this.sourceUpdater_.hasCreatedSourceBuffers\n // was added to ensure that both source buffers were created before seekable was\n // updated. However, it originally had a bug where it was checking for a true and\n // returning early instead of checking for false. Setting it to check for false to\n // return early though created other issues. A call to play() would check for seekable\n // end without verifying that a seekable range was present. In addition, even checking\n // for that didn't solve some issues, as handleFirstPlay is sometimes worked around\n // due to a media update calling load on the segment loaders, skipping a seek to live,\n // thereby starting live streams at the beginning of the stream rather than at the end.\n //\n // This conditional should be fixed to wait for the creation of two source buffers at\n // the same time as the other sections of code are fixed to properly seek to live and\n // not throw an error due to checking for a seekable end when no seekable range exists.\n //\n // For now, fall back to the older behavior, with the understanding that the seekable\n // range may not be completely correct, leading to a suboptimal initial live point.\n if (!this.mainPlaylistLoader_) {\n return;\n }\n const mainSeekable = this.getSeekableRange_(this.mainPlaylistLoader_, 'main');\n if (!mainSeekable) {\n return;\n }\n let audioSeekable;\n if (this.mediaTypes_.AUDIO.activePlaylistLoader) {\n audioSeekable = this.getSeekableRange_(this.mediaTypes_.AUDIO.activePlaylistLoader, 'audio');\n if (!audioSeekable) {\n return;\n }\n }\n const oldSeekable = this.seekable_;\n this.seekable_ = this.computeFinalSeekable_(mainSeekable, audioSeekable);\n if (!this.seekable_) {\n return;\n }\n if (oldSeekable && oldSeekable.length && this.seekable_.length) {\n if (oldSeekable.start(0) === this.seekable_.start(0) && oldSeekable.end(0) === this.seekable_.end(0)) {\n // Seekable range hasn't changed\n return;\n }\n }\n this.logger_(`seekable updated [${printableRange(this.seekable_)}]`);\n const metadata = {\n seekableRanges: this.seekable_\n };\n this.trigger({\n type: 'seekablerangeschanged',\n metadata\n });\n this.tech_.trigger('seekablechanged');\n }\n /**\n * Update the player duration\n */\n\n updateDuration(isLive) {\n if (this.updateDuration_) {\n this.mediaSource.removeEventListener('sourceopen', this.updateDuration_);\n this.updateDuration_ = null;\n }\n if (this.mediaSource.readyState !== 'open') {\n this.updateDuration_ = this.updateDuration.bind(this, isLive);\n this.mediaSource.addEventListener('sourceopen', this.updateDuration_);\n return;\n }\n if (isLive) {\n const seekable = this.seekable();\n if (!seekable.length) {\n return;\n } // Even in the case of a live playlist, the native MediaSource's duration should not\n // be set to Infinity (even though this would be expected for a live playlist), since\n // setting the native MediaSource's duration to infinity ends up with consequences to\n // seekable behavior. See https://github.com/w3c/media-source/issues/5 for details.\n //\n // This is resolved in the spec by https://github.com/w3c/media-source/pull/92,\n // however, few browsers have support for setLiveSeekableRange()\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaSource/setLiveSeekableRange\n //\n // Until a time when the duration of the media source can be set to infinity, and a\n // seekable range specified across browsers, the duration should be greater than or\n // equal to the last possible seekable value.\n // MediaSource duration starts as NaN\n // It is possible (and probable) that this case will never be reached for many\n // sources, since the MediaSource reports duration as the highest value without\n // accounting for timestamp offset. For example, if the timestamp offset is -100 and\n // we buffered times 0 to 100 with real times of 100 to 200, even though current\n // time will be between 0 and 100, the native media source may report the duration\n // as 200. However, since we report duration separate from the media source (as\n // Infinity), and as long as the native media source duration value is greater than\n // our reported seekable range, seeks will work as expected. The large number as\n // duration for live is actually a strategy used by some players to work around the\n // issue of live seekable ranges cited above.\n\n if (isNaN(this.mediaSource.duration) || this.mediaSource.duration < seekable.end(seekable.length - 1)) {\n this.sourceUpdater_.setDuration(seekable.end(seekable.length - 1));\n }\n return;\n }\n const buffered = this.tech_.buffered();\n let duration = Vhs$1.Playlist.duration(this.mainPlaylistLoader_.media());\n if (buffered.length > 0) {\n duration = Math.max(duration, buffered.end(buffered.length - 1));\n }\n if (this.mediaSource.duration !== duration) {\n this.sourceUpdater_.setDuration(duration);\n }\n }\n /**\n * dispose of the PlaylistController and everything\n * that it controls\n */\n\n dispose() {\n this.trigger('dispose');\n this.decrypter_.terminate();\n this.mainPlaylistLoader_.dispose();\n this.mainSegmentLoader_.dispose();\n this.contentSteeringController_.dispose();\n this.keyStatusMap_.clear();\n if (this.loadOnPlay_) {\n this.tech_.off('play', this.loadOnPlay_);\n }\n ['AUDIO', 'SUBTITLES'].forEach(type => {\n const groups = this.mediaTypes_[type].groups;\n for (const id in groups) {\n groups[id].forEach(group => {\n if (group.playlistLoader) {\n group.playlistLoader.dispose();\n }\n });\n }\n });\n this.audioSegmentLoader_.dispose();\n this.subtitleSegmentLoader_.dispose();\n this.sourceUpdater_.dispose();\n this.timelineChangeController_.dispose();\n this.stopABRTimer_();\n if (this.updateDuration_) {\n this.mediaSource.removeEventListener('sourceopen', this.updateDuration_);\n }\n this.mediaSource.removeEventListener('durationchange', this.handleDurationChange_); // load the media source into the player\n\n this.mediaSource.removeEventListener('sourceopen', this.handleSourceOpen_);\n this.mediaSource.removeEventListener('sourceended', this.handleSourceEnded_);\n this.off();\n }\n /**\n * return the main playlist object if we have one\n *\n * @return {Object} the main playlist object that we parsed\n */\n\n main() {\n return this.mainPlaylistLoader_.main;\n }\n /**\n * return the currently selected playlist\n *\n * @return {Object} the currently selected playlist object that we parsed\n */\n\n media() {\n // playlist loader will not return media if it has not been fully loaded\n return this.mainPlaylistLoader_.media() || this.initialMedia_;\n }\n areMediaTypesKnown_() {\n const usingAudioLoader = !!this.mediaTypes_.AUDIO.activePlaylistLoader;\n const hasMainMediaInfo = !!this.mainSegmentLoader_.getCurrentMediaInfo_(); // if we are not using an audio loader, then we have audio media info\n // otherwise check on the segment loader.\n\n const hasAudioMediaInfo = !usingAudioLoader ? true : !!this.audioSegmentLoader_.getCurrentMediaInfo_(); // one or both loaders has not loaded sufficently to get codecs\n\n if (!hasMainMediaInfo || !hasAudioMediaInfo) {\n return false;\n }\n return true;\n } // find from and to for codec switch event\n\n getCodecsOrExclude_() {\n const media = {\n main: this.mainSegmentLoader_.getCurrentMediaInfo_() || {},\n audio: this.audioSegmentLoader_.getCurrentMediaInfo_() || {}\n };\n const playlist = this.mainSegmentLoader_.getPendingSegmentPlaylist() || this.media(); // set \"main\" media equal to video\n\n media.video = media.main;\n const playlistCodecs = codecsForPlaylist(this.main(), playlist);\n const codecs = {};\n const usingAudioLoader = !!this.mediaTypes_.AUDIO.activePlaylistLoader;\n if (media.main.hasVideo) {\n codecs.video = playlistCodecs.video || media.main.videoCodec || DEFAULT_VIDEO_CODEC;\n }\n if (media.main.isMuxed) {\n codecs.video += `,${playlistCodecs.audio || media.main.audioCodec || DEFAULT_AUDIO_CODEC}`;\n }\n if (media.main.hasAudio && !media.main.isMuxed || media.audio.hasAudio || usingAudioLoader) {\n codecs.audio = playlistCodecs.audio || media.main.audioCodec || media.audio.audioCodec || DEFAULT_AUDIO_CODEC; // set audio isFmp4 so we use the correct \"supports\" function below\n\n media.audio.isFmp4 = media.main.hasAudio && !media.main.isMuxed ? media.main.isFmp4 : media.audio.isFmp4;\n } // no codecs, no playback.\n\n if (!codecs.audio && !codecs.video) {\n this.excludePlaylist({\n playlistToExclude: playlist,\n error: {\n message: 'Could not determine codecs for playlist.'\n },\n playlistExclusionDuration: Infinity\n });\n return;\n } // fmp4 relies on browser support, while ts relies on muxer support\n\n const supportFunction = (isFmp4, codec) => isFmp4 ? browserSupportsCodec(codec, this.usingManagedMediaSource_) : muxerSupportsCodec(codec);\n const unsupportedCodecs = {};\n let unsupportedAudio;\n ['video', 'audio'].forEach(function (type) {\n if (codecs.hasOwnProperty(type) && !supportFunction(media[type].isFmp4, codecs[type])) {\n const supporter = media[type].isFmp4 ? 'browser' : 'muxer';\n unsupportedCodecs[supporter] = unsupportedCodecs[supporter] || [];\n unsupportedCodecs[supporter].push(codecs[type]);\n if (type === 'audio') {\n unsupportedAudio = supporter;\n }\n }\n });\n if (usingAudioLoader && unsupportedAudio && playlist.attributes.AUDIO) {\n const audioGroup = playlist.attributes.AUDIO;\n this.main().playlists.forEach(variant => {\n const variantAudioGroup = variant.attributes && variant.attributes.AUDIO;\n if (variantAudioGroup === audioGroup && variant !== playlist) {\n variant.excludeUntil = Infinity;\n }\n });\n this.logger_(`excluding audio group ${audioGroup} as ${unsupportedAudio} does not support codec(s): \"${codecs.audio}\"`);\n } // if we have any unsupported codecs exclude this playlist.\n\n if (Object.keys(unsupportedCodecs).length) {\n const message = Object.keys(unsupportedCodecs).reduce((acc, supporter) => {\n if (acc) {\n acc += ', ';\n }\n acc += `${supporter} does not support codec(s): \"${unsupportedCodecs[supporter].join(',')}\"`;\n return acc;\n }, '') + '.';\n this.excludePlaylist({\n playlistToExclude: playlist,\n error: {\n internal: true,\n message\n },\n playlistExclusionDuration: Infinity\n });\n return;\n } // check if codec switching is happening\n\n if (this.sourceUpdater_.hasCreatedSourceBuffers() && !this.sourceUpdater_.canChangeType()) {\n const switchMessages = [];\n ['video', 'audio'].forEach(type => {\n const newCodec = (parseCodecs(this.sourceUpdater_.codecs[type] || '')[0] || {}).type;\n const oldCodec = (parseCodecs(codecs[type] || '')[0] || {}).type;\n if (newCodec && oldCodec && newCodec.toLowerCase() !== oldCodec.toLowerCase()) {\n switchMessages.push(`\"${this.sourceUpdater_.codecs[type]}\" -> \"${codecs[type]}\"`);\n }\n });\n if (switchMessages.length) {\n this.excludePlaylist({\n playlistToExclude: playlist,\n error: {\n message: `Codec switching not supported: ${switchMessages.join(', ')}.`,\n internal: true\n },\n playlistExclusionDuration: Infinity\n });\n return;\n }\n } // TODO: when using the muxer shouldn't we just return\n // the codecs that the muxer outputs?\n\n return codecs;\n }\n /**\n * Create source buffers and exlude any incompatible renditions.\n *\n * @private\n */\n\n tryToCreateSourceBuffers_() {\n // media source is not ready yet or sourceBuffers are already\n // created.\n if (this.mediaSource.readyState !== 'open' || this.sourceUpdater_.hasCreatedSourceBuffers()) {\n return;\n }\n if (!this.areMediaTypesKnown_()) {\n return;\n }\n const codecs = this.getCodecsOrExclude_(); // no codecs means that the playlist was excluded\n\n if (!codecs) {\n return;\n }\n this.sourceUpdater_.createSourceBuffers(codecs);\n const codecString = [codecs.video, codecs.audio].filter(Boolean).join(',');\n this.excludeIncompatibleVariants_(codecString);\n }\n /**\n * Excludes playlists with codecs that are unsupported by the muxer and browser.\n */\n\n excludeUnsupportedVariants_() {\n const playlists = this.main().playlists;\n const ids = []; // TODO: why don't we have a property to loop through all\n // playlist? Why did we ever mix indexes and keys?\n\n Object.keys(playlists).forEach(key => {\n const variant = playlists[key]; // check if we already processed this playlist.\n\n if (ids.indexOf(variant.id) !== -1) {\n return;\n }\n ids.push(variant.id);\n const codecs = codecsForPlaylist(this.main, variant);\n const unsupported = [];\n if (codecs.audio && !muxerSupportsCodec(codecs.audio) && !browserSupportsCodec(codecs.audio, this.usingManagedMediaSource_)) {\n unsupported.push(`audio codec ${codecs.audio}`);\n }\n if (codecs.video && !muxerSupportsCodec(codecs.video) && !browserSupportsCodec(codecs.video, this.usingManagedMediaSource_)) {\n unsupported.push(`video codec ${codecs.video}`);\n }\n if (codecs.text && codecs.text === 'stpp.ttml.im1t') {\n unsupported.push(`text codec ${codecs.text}`);\n }\n if (unsupported.length) {\n variant.excludeUntil = Infinity;\n this.logger_(`excluding ${variant.id} for unsupported: ${unsupported.join(', ')}`);\n }\n });\n }\n /**\n * Exclude playlists that are known to be codec or\n * stream-incompatible with the SourceBuffer configuration. For\n * instance, Media Source Extensions would cause the video element to\n * stall waiting for video data if you switched from a variant with\n * video and audio to an audio-only one.\n *\n * @param {Object} media a media playlist compatible with the current\n * set of SourceBuffers. Variants in the current main playlist that\n * do not appear to have compatible codec or stream configurations\n * will be excluded from the default playlist selection algorithm\n * indefinitely.\n * @private\n */\n\n excludeIncompatibleVariants_(codecString) {\n const ids = [];\n const playlists = this.main().playlists;\n const codecs = unwrapCodecList(parseCodecs(codecString));\n const codecCount_ = codecCount(codecs);\n const videoDetails = codecs.video && parseCodecs(codecs.video)[0] || null;\n const audioDetails = codecs.audio && parseCodecs(codecs.audio)[0] || null;\n Object.keys(playlists).forEach(key => {\n const variant = playlists[key]; // check if we already processed this playlist.\n // or it if it is already excluded forever.\n\n if (ids.indexOf(variant.id) !== -1 || variant.excludeUntil === Infinity) {\n return;\n }\n ids.push(variant.id);\n const exclusionReasons = []; // get codecs from the playlist for this variant\n\n const variantCodecs = codecsForPlaylist(this.mainPlaylistLoader_.main, variant);\n const variantCodecCount = codecCount(variantCodecs); // if no codecs are listed, we cannot determine that this\n // variant is incompatible. Wait for mux.js to probe\n\n if (!variantCodecs.audio && !variantCodecs.video) {\n return;\n } // TODO: we can support this by removing the\n // old media source and creating a new one, but it will take some work.\n // The number of streams cannot change\n\n if (variantCodecCount !== codecCount_) {\n exclusionReasons.push(`codec count \"${variantCodecCount}\" !== \"${codecCount_}\"`);\n } // only exclude playlists by codec change, if codecs cannot switch\n // during playback.\n\n if (!this.sourceUpdater_.canChangeType()) {\n const variantVideoDetails = variantCodecs.video && parseCodecs(variantCodecs.video)[0] || null;\n const variantAudioDetails = variantCodecs.audio && parseCodecs(variantCodecs.audio)[0] || null; // the video codec cannot change\n\n if (variantVideoDetails && videoDetails && variantVideoDetails.type.toLowerCase() !== videoDetails.type.toLowerCase()) {\n exclusionReasons.push(`video codec \"${variantVideoDetails.type}\" !== \"${videoDetails.type}\"`);\n } // the audio codec cannot change\n\n if (variantAudioDetails && audioDetails && variantAudioDetails.type.toLowerCase() !== audioDetails.type.toLowerCase()) {\n exclusionReasons.push(`audio codec \"${variantAudioDetails.type}\" !== \"${audioDetails.type}\"`);\n }\n }\n if (exclusionReasons.length) {\n variant.excludeUntil = Infinity;\n this.logger_(`excluding ${variant.id}: ${exclusionReasons.join(' && ')}`);\n }\n });\n }\n updateAdCues_(media) {\n let offset = 0;\n const seekable = this.seekable();\n if (seekable.length) {\n offset = seekable.start(0);\n }\n updateAdCues(media, this.cueTagsTrack_, offset);\n }\n /**\n * Calculates the desired forward buffer length based on current time\n *\n * @return {number} Desired forward buffer length in seconds\n */\n\n goalBufferLength() {\n const currentTime = this.tech_.currentTime();\n const initial = Config.GOAL_BUFFER_LENGTH;\n const rate = Config.GOAL_BUFFER_LENGTH_RATE;\n const max = Math.max(initial, Config.MAX_GOAL_BUFFER_LENGTH);\n return Math.min(initial + currentTime * rate, max);\n }\n /**\n * Calculates the desired buffer low water line based on current time\n *\n * @return {number} Desired buffer low water line in seconds\n */\n\n bufferLowWaterLine() {\n const currentTime = this.tech_.currentTime();\n const initial = Config.BUFFER_LOW_WATER_LINE;\n const rate = Config.BUFFER_LOW_WATER_LINE_RATE;\n const max = Math.max(initial, Config.MAX_BUFFER_LOW_WATER_LINE);\n const newMax = Math.max(initial, Config.EXPERIMENTAL_MAX_BUFFER_LOW_WATER_LINE);\n return Math.min(initial + currentTime * rate, this.bufferBasedABR ? newMax : max);\n }\n bufferHighWaterLine() {\n return Config.BUFFER_HIGH_WATER_LINE;\n }\n addDateRangesToTextTrack_(dateRanges) {\n createMetadataTrackIfNotExists(this.inbandTextTracks_, 'com.apple.streaming', this.tech_);\n addDateRangeMetadata({\n inbandTextTracks: this.inbandTextTracks_,\n dateRanges\n });\n }\n addMetadataToTextTrack(dispatchType, metadataArray, videoDuration) {\n const timestampOffset = this.sourceUpdater_.videoBuffer ? this.sourceUpdater_.videoTimestampOffset() : this.sourceUpdater_.audioTimestampOffset(); // There's potentially an issue where we could double add metadata if there's a muxed\n // audio/video source with a metadata track, and an alt audio with a metadata track.\n // However, this probably won't happen, and if it does it can be handled then.\n\n createMetadataTrackIfNotExists(this.inbandTextTracks_, dispatchType, this.tech_);\n addMetadata({\n inbandTextTracks: this.inbandTextTracks_,\n metadataArray,\n timestampOffset,\n videoDuration\n });\n }\n /**\n * Utility for getting the pathway or service location from an HLS or DASH playlist.\n *\n * @param {Object} playlist for getting pathway from.\n * @return the pathway attribute of a playlist\n */\n\n pathwayAttribute_(playlist) {\n return playlist.attributes['PATHWAY-ID'] || playlist.attributes.serviceLocation;\n }\n /**\n * Initialize available pathways and apply the tag properties.\n */\n\n initContentSteeringController_() {\n const main = this.main();\n if (!main.contentSteering) {\n return;\n }\n for (const playlist of main.playlists) {\n this.contentSteeringController_.addAvailablePathway(this.pathwayAttribute_(playlist));\n }\n this.contentSteeringController_.assignTagProperties(main.uri, main.contentSteering); // request the steering manifest immediately if queryBeforeStart is set.\n\n if (this.contentSteeringController_.queryBeforeStart) {\n // When queryBeforeStart is true, initial request should omit steering parameters.\n this.contentSteeringController_.requestSteeringManifest(true);\n return;\n } // otherwise start content steering after playback starts\n\n this.tech_.one('canplay', () => {\n this.contentSteeringController_.requestSteeringManifest();\n });\n }\n /**\n * Reset the content steering controller and re-init.\n */\n\n resetContentSteeringController_() {\n this.contentSteeringController_.clearAvailablePathways();\n this.contentSteeringController_.dispose();\n this.initContentSteeringController_();\n }\n /**\n * Attaches the listeners for content steering.\n */\n\n attachContentSteeringListeners_() {\n this.contentSteeringController_.on('content-steering', this.excludeThenChangePathway_.bind(this));\n const contentSteeringEvents = ['contentsteeringloadstart', 'contentsteeringloadcomplete', 'contentsteeringparsed'];\n contentSteeringEvents.forEach(eventName => {\n this.contentSteeringController_.on(eventName, metadata => {\n this.trigger(_extends({}, metadata));\n });\n });\n if (this.sourceType_ === 'dash') {\n this.mainPlaylistLoader_.on('loadedplaylist', () => {\n const main = this.main(); // check if steering tag or pathways changed.\n\n const didDashTagChange = this.contentSteeringController_.didDASHTagChange(main.uri, main.contentSteering);\n const didPathwaysChange = () => {\n const availablePathways = this.contentSteeringController_.getAvailablePathways();\n const newPathways = [];\n for (const playlist of main.playlists) {\n const serviceLocation = playlist.attributes.serviceLocation;\n if (serviceLocation) {\n newPathways.push(serviceLocation);\n if (!availablePathways.has(serviceLocation)) {\n return true;\n }\n }\n } // If we have no new serviceLocations and previously had availablePathways\n\n if (!newPathways.length && availablePathways.size) {\n return true;\n }\n return false;\n };\n if (didDashTagChange || didPathwaysChange()) {\n this.resetContentSteeringController_();\n }\n });\n }\n }\n /**\n * Simple exclude and change playlist logic for content steering.\n */\n\n excludeThenChangePathway_() {\n const currentPathway = this.contentSteeringController_.getPathway();\n if (!currentPathway) {\n return;\n }\n this.handlePathwayClones_();\n const main = this.main();\n const playlists = main.playlists;\n const ids = new Set();\n let didEnablePlaylists = false;\n Object.keys(playlists).forEach(key => {\n const variant = playlists[key];\n const pathwayId = this.pathwayAttribute_(variant);\n const differentPathwayId = pathwayId && currentPathway !== pathwayId;\n const steeringExclusion = variant.excludeUntil === Infinity && variant.lastExcludeReason_ === 'content-steering';\n if (steeringExclusion && !differentPathwayId) {\n delete variant.excludeUntil;\n delete variant.lastExcludeReason_;\n didEnablePlaylists = true;\n }\n const noExcludeUntil = !variant.excludeUntil && variant.excludeUntil !== Infinity;\n const shouldExclude = !ids.has(variant.id) && differentPathwayId && noExcludeUntil;\n if (!shouldExclude) {\n return;\n }\n ids.add(variant.id);\n variant.excludeUntil = Infinity;\n variant.lastExcludeReason_ = 'content-steering'; // TODO: kind of spammy, maybe move this.\n\n this.logger_(`excluding ${variant.id} for ${variant.lastExcludeReason_}`);\n });\n if (this.contentSteeringController_.manifestType_ === 'DASH') {\n Object.keys(this.mediaTypes_).forEach(key => {\n const type = this.mediaTypes_[key];\n if (type.activePlaylistLoader) {\n const currentPlaylist = type.activePlaylistLoader.media_; // Check if the current media playlist matches the current CDN\n\n if (currentPlaylist && currentPlaylist.attributes.serviceLocation !== currentPathway) {\n didEnablePlaylists = true;\n }\n }\n });\n }\n if (didEnablePlaylists) {\n this.changeSegmentPathway_();\n }\n }\n /**\n * Add, update, or delete playlists and media groups for\n * the pathway clones for HLS Content Steering.\n *\n * See https://datatracker.ietf.org/doc/draft-pantos-hls-rfc8216bis/\n *\n * NOTE: Pathway cloning does not currently support the `PER_VARIANT_URIS` and\n * `PER_RENDITION_URIS` as we do not handle `STABLE-VARIANT-ID` or\n * `STABLE-RENDITION-ID` values.\n */\n\n handlePathwayClones_() {\n const main = this.main();\n const playlists = main.playlists;\n const currentPathwayClones = this.contentSteeringController_.currentPathwayClones;\n const nextPathwayClones = this.contentSteeringController_.nextPathwayClones;\n const hasClones = currentPathwayClones && currentPathwayClones.size || nextPathwayClones && nextPathwayClones.size;\n if (!hasClones) {\n return;\n }\n for (const [id, clone] of currentPathwayClones.entries()) {\n const newClone = nextPathwayClones.get(id); // Delete the old pathway clone.\n\n if (!newClone) {\n this.mainPlaylistLoader_.updateOrDeleteClone(clone);\n this.contentSteeringController_.excludePathway(id);\n }\n }\n for (const [id, clone] of nextPathwayClones.entries()) {\n const oldClone = currentPathwayClones.get(id); // Create a new pathway if it is a new pathway clone object.\n\n if (!oldClone) {\n const playlistsToClone = playlists.filter(p => {\n return p.attributes['PATHWAY-ID'] === clone['BASE-ID'];\n });\n playlistsToClone.forEach(p => {\n this.mainPlaylistLoader_.addClonePathway(clone, p);\n });\n this.contentSteeringController_.addAvailablePathway(id);\n continue;\n } // There have not been changes to the pathway clone object, so skip.\n\n if (this.equalPathwayClones_(oldClone, clone)) {\n continue;\n } // Update a preexisting cloned pathway.\n // True is set for the update flag.\n\n this.mainPlaylistLoader_.updateOrDeleteClone(clone, true);\n this.contentSteeringController_.addAvailablePathway(id);\n } // Deep copy contents of next to current pathways.\n\n this.contentSteeringController_.currentPathwayClones = new Map(JSON.parse(JSON.stringify([...nextPathwayClones])));\n }\n /**\n * Determines whether two pathway clone objects are equivalent.\n *\n * @param {Object} a The first pathway clone object.\n * @param {Object} b The second pathway clone object.\n * @return {boolean} True if the pathway clone objects are equal, false otherwise.\n */\n\n equalPathwayClones_(a, b) {\n if (a['BASE-ID'] !== b['BASE-ID'] || a.ID !== b.ID || a['URI-REPLACEMENT'].HOST !== b['URI-REPLACEMENT'].HOST) {\n return false;\n }\n const aParams = a['URI-REPLACEMENT'].PARAMS;\n const bParams = b['URI-REPLACEMENT'].PARAMS; // We need to iterate through both lists of params because one could be\n // missing a parameter that the other has.\n\n for (const p in aParams) {\n if (aParams[p] !== bParams[p]) {\n return false;\n }\n }\n for (const p in bParams) {\n if (aParams[p] !== bParams[p]) {\n return false;\n }\n }\n return true;\n }\n /**\n * Changes the current playlists for audio, video and subtitles after a new pathway\n * is chosen from content steering.\n */\n\n changeSegmentPathway_() {\n const nextPlaylist = this.selectPlaylist();\n this.pauseLoading(); // Switch audio and text track playlists if necessary in DASH\n\n if (this.contentSteeringController_.manifestType_ === 'DASH') {\n this.switchMediaForDASHContentSteering_();\n }\n this.switchMedia_(nextPlaylist, 'content-steering');\n }\n /**\n * Iterates through playlists and check their keyId set and compare with the\n * keyStatusMap, only enable playlists that have a usable key. If the playlist\n * has no keyId leave it enabled by default.\n */\n\n excludeNonUsablePlaylistsByKeyId_() {\n if (!this.mainPlaylistLoader_ || !this.mainPlaylistLoader_.main) {\n return;\n }\n let nonUsableKeyStatusCount = 0;\n const NON_USABLE = 'non-usable';\n this.mainPlaylistLoader_.main.playlists.forEach(playlist => {\n const keyIdSet = this.mainPlaylistLoader_.getKeyIdSet(playlist); // If the playlist doesn't have keyIDs lets not exclude it.\n\n if (!keyIdSet || !keyIdSet.size) {\n return;\n }\n keyIdSet.forEach(key => {\n const USABLE = 'usable';\n const hasUsableKeyStatus = this.keyStatusMap_.has(key) && this.keyStatusMap_.get(key) === USABLE;\n const nonUsableExclusion = playlist.lastExcludeReason_ === NON_USABLE && playlist.excludeUntil === Infinity;\n if (!hasUsableKeyStatus) {\n // Only exclude playlists that haven't already been excluded as non-usable.\n if (playlist.excludeUntil !== Infinity && playlist.lastExcludeReason_ !== NON_USABLE) {\n playlist.excludeUntil = Infinity;\n playlist.lastExcludeReason_ = NON_USABLE;\n this.logger_(`excluding playlist ${playlist.id} because the key ID ${key} doesn't exist in the keyStatusMap or is not ${USABLE}`);\n } // count all nonUsableKeyStatus\n\n nonUsableKeyStatusCount++;\n } else if (hasUsableKeyStatus && nonUsableExclusion) {\n delete playlist.excludeUntil;\n delete playlist.lastExcludeReason_;\n this.logger_(`enabling playlist ${playlist.id} because key ID ${key} is ${USABLE}`);\n }\n });\n }); // If for whatever reason every playlist has a non usable key status. Lets try re-including the SD renditions as a failsafe.\n\n if (nonUsableKeyStatusCount >= this.mainPlaylistLoader_.main.playlists.length) {\n this.mainPlaylistLoader_.main.playlists.forEach(playlist => {\n const isNonHD = playlist && playlist.attributes && playlist.attributes.RESOLUTION && playlist.attributes.RESOLUTION.height < 720;\n const excludedForNonUsableKey = playlist.excludeUntil === Infinity && playlist.lastExcludeReason_ === NON_USABLE;\n if (isNonHD && excludedForNonUsableKey) {\n // Only delete the excludeUntil so we don't try and re-exclude these playlists.\n delete playlist.excludeUntil;\n videojs.log.warn(`enabling non-HD playlist ${playlist.id} because all playlists were excluded due to ${NON_USABLE} key IDs`);\n }\n });\n }\n }\n /**\n * Adds a keystatus to the keystatus map, tries to convert to string if necessary.\n *\n * @param {any} keyId the keyId to add a status for\n * @param {string} status the status of the keyId\n */\n\n addKeyStatus_(keyId, status) {\n const isString = typeof keyId === 'string';\n const keyIdHexString = isString ? keyId : bufferToHexString(keyId);\n const formattedKeyIdString = keyIdHexString.slice(0, 32).toLowerCase();\n this.logger_(`KeyStatus '${status}' with key ID ${formattedKeyIdString} added to the keyStatusMap`);\n this.keyStatusMap_.set(formattedKeyIdString, status);\n }\n /**\n * Utility function for adding key status to the keyStatusMap and filtering usable encrypted playlists.\n *\n * @param {any} keyId the keyId from the keystatuschange event\n * @param {string} status the key status string\n */\n\n updatePlaylistByKeyStatus(keyId, status) {\n this.addKeyStatus_(keyId, status);\n if (!this.waitingForFastQualityPlaylistReceived_) {\n this.excludeNonUsableThenChangePlaylist_();\n } // Listen to loadedplaylist with a single listener and check for new contentProtection elements when a playlist is updated.\n\n this.mainPlaylistLoader_.off('loadedplaylist', this.excludeNonUsableThenChangePlaylist_.bind(this));\n this.mainPlaylistLoader_.on('loadedplaylist', this.excludeNonUsableThenChangePlaylist_.bind(this));\n }\n excludeNonUsableThenChangePlaylist_() {\n this.excludeNonUsablePlaylistsByKeyId_();\n this.fastQualityChange_();\n }\n}\n\n/**\n * Returns a function that acts as the Enable/disable playlist function.\n *\n * @param {PlaylistLoader} loader - The main playlist loader\n * @param {string} playlistID - id of the playlist\n * @param {Function} changePlaylistFn - A function to be called after a\n * playlist's enabled-state has been changed. Will NOT be called if a\n * playlist's enabled-state is unchanged\n * @param {boolean=} enable - Value to set the playlist enabled-state to\n * or if undefined returns the current enabled-state for the playlist\n * @return {Function} Function for setting/getting enabled\n */\n\nconst enableFunction = (loader, playlistID, changePlaylistFn) => enable => {\n const playlist = loader.main.playlists[playlistID];\n const incompatible = isIncompatible(playlist);\n const currentlyEnabled = isEnabled(playlist);\n if (typeof enable === 'undefined') {\n return currentlyEnabled;\n }\n if (enable) {\n delete playlist.disabled;\n } else {\n playlist.disabled = true;\n }\n const metadata = {\n renditionInfo: {\n id: playlistID,\n bandwidth: playlist.attributes.BANDWIDTH,\n resolution: playlist.attributes.RESOLUTION,\n codecs: playlist.attributes.CODECS\n },\n cause: 'fast-quality'\n };\n if (enable !== currentlyEnabled && !incompatible) {\n // Ensure the outside world knows about our changes\n if (enable) {\n // call fast quality change only when the playlist is enabled\n changePlaylistFn(playlist);\n loader.trigger({\n type: 'renditionenabled',\n metadata\n });\n } else {\n loader.trigger({\n type: 'renditiondisabled',\n metadata\n });\n }\n }\n return enable;\n};\n/**\n * The representation object encapsulates the publicly visible information\n * in a media playlist along with a setter/getter-type function (enabled)\n * for changing the enabled-state of a particular playlist entry\n *\n * @class Representation\n */\n\nclass Representation {\n constructor(vhsHandler, playlist, id) {\n const {\n playlistController_: pc\n } = vhsHandler;\n const qualityChangeFunction = pc.fastQualityChange_.bind(pc); // some playlist attributes are optional\n\n if (playlist.attributes) {\n const resolution = playlist.attributes.RESOLUTION;\n this.width = resolution && resolution.width;\n this.height = resolution && resolution.height;\n this.bandwidth = playlist.attributes.BANDWIDTH;\n this.frameRate = playlist.attributes['FRAME-RATE'];\n }\n this.codecs = codecsForPlaylist(pc.main(), playlist);\n this.playlist = playlist; // The id is simply the ordinality of the media playlist\n // within the main playlist\n\n this.id = id; // Partially-apply the enableFunction to create a playlist-\n // specific variant\n\n this.enabled = enableFunction(vhsHandler.playlists, playlist.id, qualityChangeFunction);\n }\n}\n/**\n * A mixin function that adds the `representations` api to an instance\n * of the VhsHandler class\n *\n * @param {VhsHandler} vhsHandler - An instance of VhsHandler to add the\n * representation API into\n */\n\nconst renditionSelectionMixin = function (vhsHandler) {\n // Add a single API-specific function to the VhsHandler instance\n vhsHandler.representations = () => {\n const main = vhsHandler.playlistController_.main();\n const playlists = isAudioOnly(main) ? vhsHandler.playlistController_.getAudioTrackPlaylists_() : main.playlists;\n if (!playlists) {\n return [];\n }\n return playlists.filter(media => !isIncompatible(media)).map((e, i) => new Representation(vhsHandler, e, e.id));\n };\n};\n\n/**\n * @file playback-watcher.js\n *\n * Playback starts, and now my watch begins. It shall not end until my death. I shall\n * take no wait, hold no uncleared timeouts, father no bad seeks. I shall wear no crowns\n * and win no glory. I shall live and die at my post. I am the corrector of the underflow.\n * I am the watcher of gaps. I am the shield that guards the realms of seekable. I pledge\n * my life and honor to the Playback Watch, for this Player and all the Players to come.\n */\n\nconst timerCancelEvents = ['seeking', 'seeked', 'pause', 'playing', 'error'];\n/**\n * @class PlaybackWatcher\n */\n\nclass PlaybackWatcher extends videojs.EventTarget {\n /**\n * Represents an PlaybackWatcher object.\n *\n * @class\n * @param {Object} options an object that includes the tech and settings\n */\n constructor(options) {\n super();\n this.playlistController_ = options.playlistController;\n this.tech_ = options.tech;\n this.seekable = options.seekable;\n this.allowSeeksWithinUnsafeLiveWindow = options.allowSeeksWithinUnsafeLiveWindow;\n this.liveRangeSafeTimeDelta = options.liveRangeSafeTimeDelta;\n this.media = options.media;\n this.playedRanges_ = [];\n this.consecutiveUpdates = 0;\n this.lastRecordedTime = null;\n this.checkCurrentTimeTimeout_ = null;\n this.logger_ = logger('PlaybackWatcher');\n this.logger_('initialize');\n const playHandler = () => this.monitorCurrentTime_();\n const canPlayHandler = () => this.monitorCurrentTime_();\n const waitingHandler = () => this.techWaiting_();\n const cancelTimerHandler = () => this.resetTimeUpdate_();\n const pc = this.playlistController_;\n const loaderTypes = ['main', 'subtitle', 'audio'];\n const loaderChecks = {};\n loaderTypes.forEach(type => {\n loaderChecks[type] = {\n reset: () => this.resetSegmentDownloads_(type),\n updateend: () => this.checkSegmentDownloads_(type)\n };\n pc[`${type}SegmentLoader_`].on('appendsdone', loaderChecks[type].updateend); // If a rendition switch happens during a playback stall where the buffer\n // isn't changing we want to reset. We cannot assume that the new rendition\n // will also be stalled, until after new appends.\n\n pc[`${type}SegmentLoader_`].on('playlistupdate', loaderChecks[type].reset); // Playback stalls should not be detected right after seeking.\n // This prevents one segment playlists (single vtt or single segment content)\n // from being detected as stalling. As the buffer will not change in those cases, since\n // the buffer is the entire video duration.\n\n this.tech_.on(['seeked', 'seeking'], loaderChecks[type].reset);\n });\n /**\n * We check if a seek was into a gap through the following steps:\n * 1. We get a seeking event and we do not get a seeked event. This means that\n * a seek was attempted but not completed.\n * 2. We run `fixesBadSeeks_` on segment loader appends. This means that we already\n * removed everything from our buffer and appended a segment, and should be ready\n * to check for gaps.\n */\n\n const setSeekingHandlers = fn => {\n ['main', 'audio'].forEach(type => {\n pc[`${type}SegmentLoader_`][fn]('appended', this.seekingAppendCheck_);\n });\n };\n this.seekingAppendCheck_ = () => {\n if (this.fixesBadSeeks_()) {\n this.consecutiveUpdates = 0;\n this.lastRecordedTime = this.tech_.currentTime();\n setSeekingHandlers('off');\n }\n };\n this.clearSeekingAppendCheck_ = () => setSeekingHandlers('off');\n this.watchForBadSeeking_ = () => {\n this.clearSeekingAppendCheck_();\n setSeekingHandlers('on');\n };\n this.tech_.on('seeked', this.clearSeekingAppendCheck_);\n this.tech_.on('seeking', this.watchForBadSeeking_);\n this.tech_.on('waiting', waitingHandler);\n this.tech_.on(timerCancelEvents, cancelTimerHandler);\n this.tech_.on('canplay', canPlayHandler);\n /*\n An edge case exists that results in gaps not being skipped when they exist at the beginning of a stream. This case\n is surfaced in one of two ways:\n 1) The `waiting` event is fired before the player has buffered content, making it impossible\n to find or skip the gap. The `waiting` event is followed by a `play` event. On first play\n we can check if playback is stalled due to a gap, and skip the gap if necessary.\n 2) A source with a gap at the beginning of the stream is loaded programatically while the player\n is in a playing state. To catch this case, it's important that our one-time play listener is setup\n even if the player is in a playing state\n */\n\n this.tech_.one('play', playHandler); // Define the dispose function to clean up our events\n\n this.dispose = () => {\n this.clearSeekingAppendCheck_();\n this.logger_('dispose');\n this.tech_.off('waiting', waitingHandler);\n this.tech_.off(timerCancelEvents, cancelTimerHandler);\n this.tech_.off('canplay', canPlayHandler);\n this.tech_.off('play', playHandler);\n this.tech_.off('seeking', this.watchForBadSeeking_);\n this.tech_.off('seeked', this.clearSeekingAppendCheck_);\n loaderTypes.forEach(type => {\n pc[`${type}SegmentLoader_`].off('appendsdone', loaderChecks[type].updateend);\n pc[`${type}SegmentLoader_`].off('playlistupdate', loaderChecks[type].reset);\n this.tech_.off(['seeked', 'seeking'], loaderChecks[type].reset);\n });\n if (this.checkCurrentTimeTimeout_) {\n window$1.clearTimeout(this.checkCurrentTimeTimeout_);\n }\n this.resetTimeUpdate_();\n };\n }\n /**\n * Periodically check current time to see if playback stopped\n *\n * @private\n */\n\n monitorCurrentTime_() {\n this.checkCurrentTime_();\n if (this.checkCurrentTimeTimeout_) {\n window$1.clearTimeout(this.checkCurrentTimeTimeout_);\n } // 42 = 24 fps // 250 is what Webkit uses // FF uses 15\n\n this.checkCurrentTimeTimeout_ = window$1.setTimeout(this.monitorCurrentTime_.bind(this), 250);\n }\n /**\n * Reset stalled download stats for a specific type of loader\n *\n * @param {string} type\n * The segment loader type to check.\n *\n * @listens SegmentLoader#playlistupdate\n * @listens Tech#seeking\n * @listens Tech#seeked\n */\n\n resetSegmentDownloads_(type) {\n const loader = this.playlistController_[`${type}SegmentLoader_`];\n if (this[`${type}StalledDownloads_`] > 0) {\n this.logger_(`resetting possible stalled download count for ${type} loader`);\n }\n this[`${type}StalledDownloads_`] = 0;\n this[`${type}Buffered_`] = loader.buffered_();\n }\n /**\n * Checks on every segment `appendsdone` to see\n * if segment appends are making progress. If they are not\n * and we are still downloading bytes. We exclude the playlist.\n *\n * @param {string} type\n * The segment loader type to check.\n *\n * @listens SegmentLoader#appendsdone\n */\n\n checkSegmentDownloads_(type) {\n const pc = this.playlistController_;\n const loader = pc[`${type}SegmentLoader_`];\n const buffered = loader.buffered_();\n const isBufferedDifferent = isRangeDifferent(this[`${type}Buffered_`], buffered);\n this[`${type}Buffered_`] = buffered; // if another watcher is going to fix the issue or\n // the buffered value for this loader changed\n // appends are working\n\n if (isBufferedDifferent) {\n const metadata = {\n bufferedRanges: buffered\n };\n pc.trigger({\n type: 'bufferedrangeschanged',\n metadata\n });\n this.resetSegmentDownloads_(type);\n return;\n }\n this[`${type}StalledDownloads_`]++;\n this.logger_(`found #${this[`${type}StalledDownloads_`]} ${type} appends that did not increase buffer (possible stalled download)`, {\n playlistId: loader.playlist_ && loader.playlist_.id,\n buffered: timeRangesToArray(buffered)\n }); // after 10 possibly stalled appends with no reset, exclude\n\n if (this[`${type}StalledDownloads_`] < 10) {\n return;\n }\n this.logger_(`${type} loader stalled download exclusion`);\n this.resetSegmentDownloads_(type);\n this.tech_.trigger({\n type: 'usage',\n name: `vhs-${type}-download-exclusion`\n });\n if (type === 'subtitle') {\n return;\n } // TODO: should we exclude audio tracks rather than main tracks\n // when type is audio?\n\n pc.excludePlaylist({\n error: {\n message: `Excessive ${type} segment downloading detected.`\n },\n playlistExclusionDuration: Infinity\n });\n }\n /**\n * The purpose of this function is to emulate the \"waiting\" event on\n * browsers that do not emit it when they are waiting for more\n * data to continue playback\n *\n * @private\n */\n\n checkCurrentTime_() {\n if (this.tech_.paused() || this.tech_.seeking()) {\n return;\n }\n const currentTime = this.tech_.currentTime();\n const buffered = this.tech_.buffered();\n if (this.lastRecordedTime === currentTime && (!buffered.length || currentTime + SAFE_TIME_DELTA >= buffered.end(buffered.length - 1))) {\n // If current time is at the end of the final buffered region, then any playback\n // stall is most likely caused by buffering in a low bandwidth environment. The tech\n // should fire a `waiting` event in this scenario, but due to browser and tech\n // inconsistencies. Calling `techWaiting_` here allows us to simulate\n // responding to a native `waiting` event when the tech fails to emit one.\n return this.techWaiting_();\n }\n if (this.consecutiveUpdates >= 5 && currentTime === this.lastRecordedTime) {\n this.consecutiveUpdates++;\n this.waiting_();\n } else if (currentTime === this.lastRecordedTime) {\n this.consecutiveUpdates++;\n } else {\n this.playedRanges_.push(createTimeRanges([this.lastRecordedTime, currentTime]));\n const metadata = {\n playedRanges: this.playedRanges_\n };\n this.playlistController_.trigger({\n type: 'playedrangeschanged',\n metadata\n });\n this.consecutiveUpdates = 0;\n this.lastRecordedTime = currentTime;\n }\n }\n /**\n * Resets the 'timeupdate' mechanism designed to detect that we are stalled\n *\n * @private\n */\n\n resetTimeUpdate_() {\n this.consecutiveUpdates = 0;\n }\n /**\n * Fixes situations where there's a bad seek\n *\n * @return {boolean} whether an action was taken to fix the seek\n * @private\n */\n\n fixesBadSeeks_() {\n const seeking = this.tech_.seeking();\n if (!seeking) {\n return false;\n } // TODO: It's possible that these seekable checks should be moved out of this function\n // and into a function that runs on seekablechange. It's also possible that we only need\n // afterSeekableWindow as the buffered check at the bottom is good enough to handle before\n // seekable range.\n\n const seekable = this.seekable();\n const currentTime = this.tech_.currentTime();\n const isAfterSeekableRange = this.afterSeekableWindow_(seekable, currentTime, this.media(), this.allowSeeksWithinUnsafeLiveWindow);\n let seekTo;\n if (isAfterSeekableRange) {\n const seekableEnd = seekable.end(seekable.length - 1); // sync to live point (if VOD, our seekable was updated and we're simply adjusting)\n\n seekTo = seekableEnd;\n }\n if (this.beforeSeekableWindow_(seekable, currentTime)) {\n const seekableStart = seekable.start(0); // sync to the beginning of the live window\n // provide a buffer of .1 seconds to handle rounding/imprecise numbers\n\n seekTo = seekableStart + (\n // if the playlist is too short and the seekable range is an exact time (can\n // happen in live with a 3 segment playlist), then don't use a time delta\n seekableStart === seekable.end(0) ? 0 : SAFE_TIME_DELTA);\n }\n if (typeof seekTo !== 'undefined') {\n this.logger_(`Trying to seek outside of seekable at time ${currentTime} with ` + `seekable range ${printableRange(seekable)}. Seeking to ` + `${seekTo}.`);\n this.tech_.setCurrentTime(seekTo);\n return true;\n }\n const sourceUpdater = this.playlistController_.sourceUpdater_;\n const buffered = this.tech_.buffered();\n const audioBuffered = sourceUpdater.audioBuffer ? sourceUpdater.audioBuffered() : null;\n const videoBuffered = sourceUpdater.videoBuffer ? sourceUpdater.videoBuffered() : null;\n const media = this.media(); // verify that at least two segment durations or one part duration have been\n // appended before checking for a gap.\n\n const minAppendedDuration = media.partTargetDuration ? media.partTargetDuration : (media.targetDuration - TIME_FUDGE_FACTOR) * 2; // verify that at least two segment durations have been\n // appended before checking for a gap.\n\n const bufferedToCheck = [audioBuffered, videoBuffered];\n for (let i = 0; i < bufferedToCheck.length; i++) {\n // skip null buffered\n if (!bufferedToCheck[i]) {\n continue;\n }\n const timeAhead = timeAheadOf(bufferedToCheck[i], currentTime); // if we are less than two video/audio segment durations or one part\n // duration behind we haven't appended enough to call this a bad seek.\n\n if (timeAhead < minAppendedDuration) {\n return false;\n }\n }\n const nextRange = findNextRange(buffered, currentTime); // we have appended enough content, but we don't have anything buffered\n // to seek over the gap\n\n if (nextRange.length === 0) {\n return false;\n }\n seekTo = nextRange.start(0) + SAFE_TIME_DELTA;\n this.logger_(`Buffered region starts (${nextRange.start(0)}) ` + ` just beyond seek point (${currentTime}). Seeking to ${seekTo}.`);\n this.tech_.setCurrentTime(seekTo);\n return true;\n }\n /**\n * Handler for situations when we determine the player is waiting.\n *\n * @private\n */\n\n waiting_() {\n if (this.techWaiting_()) {\n return;\n } // All tech waiting checks failed. Use last resort correction\n\n const currentTime = this.tech_.currentTime();\n const buffered = this.tech_.buffered();\n const currentRange = findRange(buffered, currentTime); // Sometimes the player can stall for unknown reasons within a contiguous buffered\n // region with no indication that anything is amiss (seen in Firefox). Seeking to\n // currentTime is usually enough to kickstart the player. This checks that the player\n // is currently within a buffered region before attempting a corrective seek.\n // Chrome does not appear to continue `timeupdate` events after a `waiting` event\n // until there is ~ 3 seconds of forward buffer available. PlaybackWatcher should also\n // make sure there is ~3 seconds of forward buffer before taking any corrective action\n // to avoid triggering an `unknownwaiting` event when the network is slow.\n\n if (currentRange.length && currentTime + 3 <= currentRange.end(0)) {\n this.resetTimeUpdate_();\n this.tech_.setCurrentTime(currentTime);\n this.logger_(`Stopped at ${currentTime} while inside a buffered region ` + `[${currentRange.start(0)} -> ${currentRange.end(0)}]. Attempting to resume ` + 'playback by seeking to the current time.'); // unknown waiting corrections may be useful for monitoring QoS\n\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-unknown-waiting'\n });\n return;\n }\n }\n /**\n * Handler for situations when the tech fires a `waiting` event\n *\n * @return {boolean}\n * True if an action (or none) was needed to correct the waiting. False if no\n * checks passed\n * @private\n */\n\n techWaiting_() {\n const seekable = this.seekable();\n const currentTime = this.tech_.currentTime();\n if (this.tech_.seeking()) {\n // Tech is seeking or already waiting on another action, no action needed\n return true;\n }\n if (this.beforeSeekableWindow_(seekable, currentTime)) {\n const livePoint = seekable.end(seekable.length - 1);\n this.logger_(`Fell out of live window at time ${currentTime}. Seeking to ` + `live point (seekable end) ${livePoint}`);\n this.resetTimeUpdate_();\n this.tech_.setCurrentTime(livePoint); // live window resyncs may be useful for monitoring QoS\n\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-live-resync'\n });\n return true;\n }\n const sourceUpdater = this.tech_.vhs.playlistController_.sourceUpdater_;\n const buffered = this.tech_.buffered();\n const videoUnderflow = this.videoUnderflow_({\n audioBuffered: sourceUpdater.audioBuffered(),\n videoBuffered: sourceUpdater.videoBuffered(),\n currentTime\n });\n if (videoUnderflow) {\n // Even though the video underflowed and was stuck in a gap, the audio overplayed\n // the gap, leading currentTime into a buffered range. Seeking to currentTime\n // allows the video to catch up to the audio position without losing any audio\n // (only suffering ~3 seconds of frozen video and a pause in audio playback).\n this.resetTimeUpdate_();\n this.tech_.setCurrentTime(currentTime); // video underflow may be useful for monitoring QoS\n\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-video-underflow'\n });\n return true;\n }\n const nextRange = findNextRange(buffered, currentTime); // check for gap\n\n if (nextRange.length > 0) {\n this.logger_(`Stopped at ${currentTime} and seeking to ${nextRange.start(0)}`);\n this.resetTimeUpdate_();\n this.skipTheGap_(currentTime);\n return true;\n } // All checks failed. Returning false to indicate failure to correct waiting\n\n return false;\n }\n afterSeekableWindow_(seekable, currentTime, playlist, allowSeeksWithinUnsafeLiveWindow = false) {\n if (!seekable.length) {\n // we can't make a solid case if there's no seekable, default to false\n return false;\n }\n let allowedEnd = seekable.end(seekable.length - 1) + SAFE_TIME_DELTA;\n const isLive = !playlist.endList;\n const isLLHLS = typeof playlist.partTargetDuration === 'number';\n if (isLive && (isLLHLS || allowSeeksWithinUnsafeLiveWindow)) {\n allowedEnd = seekable.end(seekable.length - 1) + playlist.targetDuration * 3;\n }\n if (currentTime > allowedEnd) {\n return true;\n }\n return false;\n }\n beforeSeekableWindow_(seekable, currentTime) {\n if (seekable.length &&\n // can't fall before 0 and 0 seekable start identifies VOD stream\n seekable.start(0) > 0 && currentTime < seekable.start(0) - this.liveRangeSafeTimeDelta) {\n return true;\n }\n return false;\n }\n videoUnderflow_({\n videoBuffered,\n audioBuffered,\n currentTime\n }) {\n // audio only content will not have video underflow :)\n if (!videoBuffered) {\n return;\n }\n let gap; // find a gap in demuxed content.\n\n if (videoBuffered.length && audioBuffered.length) {\n // in Chrome audio will continue to play for ~3s when we run out of video\n // so we have to check that the video buffer did have some buffer in the\n // past.\n const lastVideoRange = findRange(videoBuffered, currentTime - 3);\n const videoRange = findRange(videoBuffered, currentTime);\n const audioRange = findRange(audioBuffered, currentTime);\n if (audioRange.length && !videoRange.length && lastVideoRange.length) {\n gap = {\n start: lastVideoRange.end(0),\n end: audioRange.end(0)\n };\n } // find a gap in muxed content.\n } else {\n const nextRange = findNextRange(videoBuffered, currentTime); // Even if there is no available next range, there is still a possibility we are\n // stuck in a gap due to video underflow.\n\n if (!nextRange.length) {\n gap = this.gapFromVideoUnderflow_(videoBuffered, currentTime);\n }\n }\n if (gap) {\n this.logger_(`Encountered a gap in video from ${gap.start} to ${gap.end}. ` + `Seeking to current time ${currentTime}`);\n return true;\n }\n return false;\n }\n /**\n * Timer callback. If playback still has not proceeded, then we seek\n * to the start of the next buffered region.\n *\n * @private\n */\n\n skipTheGap_(scheduledCurrentTime) {\n const buffered = this.tech_.buffered();\n const currentTime = this.tech_.currentTime();\n const nextRange = findNextRange(buffered, currentTime);\n this.resetTimeUpdate_();\n if (nextRange.length === 0 || currentTime !== scheduledCurrentTime) {\n return;\n }\n this.logger_('skipTheGap_:', 'currentTime:', currentTime, 'scheduled currentTime:', scheduledCurrentTime, 'nextRange start:', nextRange.start(0)); // only seek if we still have not played\n\n this.tech_.setCurrentTime(nextRange.start(0) + TIME_FUDGE_FACTOR);\n const metadata = {\n gapInfo: {\n from: currentTime,\n to: nextRange.start(0)\n }\n };\n this.playlistController_.trigger({\n type: 'gapjumped',\n metadata\n });\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-gap-skip'\n });\n }\n gapFromVideoUnderflow_(buffered, currentTime) {\n // At least in Chrome, if there is a gap in the video buffer, the audio will continue\n // playing for ~3 seconds after the video gap starts. This is done to account for\n // video buffer underflow/underrun (note that this is not done when there is audio\n // buffer underflow/underrun -- in that case the video will stop as soon as it\n // encounters the gap, as audio stalls are more noticeable/jarring to a user than\n // video stalls). The player's time will reflect the playthrough of audio, so the\n // time will appear as if we are in a buffered region, even if we are stuck in a\n // \"gap.\"\n //\n // Example:\n // video buffer: 0 => 10.1, 10.2 => 20\n // audio buffer: 0 => 20\n // overall buffer: 0 => 10.1, 10.2 => 20\n // current time: 13\n //\n // Chrome's video froze at 10 seconds, where the video buffer encountered the gap,\n // however, the audio continued playing until it reached ~3 seconds past the gap\n // (13 seconds), at which point it stops as well. Since current time is past the\n // gap, findNextRange will return no ranges.\n //\n // To check for this issue, we see if there is a gap that starts somewhere within\n // a 3 second range (3 seconds +/- 1 second) back from our current time.\n const gaps = findGaps(buffered);\n for (let i = 0; i < gaps.length; i++) {\n const start = gaps.start(i);\n const end = gaps.end(i); // gap is starts no more than 4 seconds back\n\n if (currentTime - start < 4 && currentTime - start > 2) {\n return {\n start,\n end\n };\n }\n }\n return null;\n }\n}\nconst defaultOptions = {\n errorInterval: 30,\n getSource(next) {\n const tech = this.tech({\n IWillNotUseThisInPlugins: true\n });\n const sourceObj = tech.currentSource_ || this.currentSource();\n return next(sourceObj);\n }\n};\n/**\n * Main entry point for the plugin\n *\n * @param {Player} player a reference to a videojs Player instance\n * @param {Object} [options] an object with plugin options\n * @private\n */\n\nconst initPlugin = function (player, options) {\n let lastCalled = 0;\n let seekTo = 0;\n const localOptions = merge(defaultOptions, options);\n player.ready(() => {\n player.trigger({\n type: 'usage',\n name: 'vhs-error-reload-initialized'\n });\n });\n /**\n * Player modifications to perform that must wait until `loadedmetadata`\n * has been triggered\n *\n * @private\n */\n\n const loadedMetadataHandler = function () {\n if (seekTo) {\n player.currentTime(seekTo);\n }\n };\n /**\n * Set the source on the player element, play, and seek if necessary\n *\n * @param {Object} sourceObj An object specifying the source url and mime-type to play\n * @private\n */\n\n const setSource = function (sourceObj) {\n if (sourceObj === null || sourceObj === undefined) {\n return;\n }\n seekTo = player.duration() !== Infinity && player.currentTime() || 0;\n player.one('loadedmetadata', loadedMetadataHandler);\n player.src(sourceObj);\n player.trigger({\n type: 'usage',\n name: 'vhs-error-reload'\n });\n player.play();\n };\n /**\n * Attempt to get a source from either the built-in getSource function\n * or a custom function provided via the options\n *\n * @private\n */\n\n const errorHandler = function () {\n // Do not attempt to reload the source if a source-reload occurred before\n // 'errorInterval' time has elapsed since the last source-reload\n if (Date.now() - lastCalled < localOptions.errorInterval * 1000) {\n player.trigger({\n type: 'usage',\n name: 'vhs-error-reload-canceled'\n });\n return;\n }\n if (!localOptions.getSource || typeof localOptions.getSource !== 'function') {\n videojs.log.error('ERROR: reloadSourceOnError - The option getSource must be a function!');\n return;\n }\n lastCalled = Date.now();\n return localOptions.getSource.call(player, setSource);\n };\n /**\n * Unbind any event handlers that were bound by the plugin\n *\n * @private\n */\n\n const cleanupEvents = function () {\n player.off('loadedmetadata', loadedMetadataHandler);\n player.off('error', errorHandler);\n player.off('dispose', cleanupEvents);\n };\n /**\n * Cleanup before re-initializing the plugin\n *\n * @param {Object} [newOptions] an object with plugin options\n * @private\n */\n\n const reinitPlugin = function (newOptions) {\n cleanupEvents();\n initPlugin(player, newOptions);\n };\n player.on('error', errorHandler);\n player.on('dispose', cleanupEvents); // Overwrite the plugin function so that we can correctly cleanup before\n // initializing the plugin\n\n player.reloadSourceOnError = reinitPlugin;\n};\n/**\n * Reload the source when an error is detected as long as there\n * wasn't an error previously within the last 30 seconds\n *\n * @param {Object} [options] an object with plugin options\n */\n\nconst reloadSourceOnError = function (options) {\n initPlugin(this, options);\n};\nvar version$4 = \"3.16.2\";\nvar version$3 = \"7.1.0\";\nvar version$2 = \"1.3.1\";\nvar version$1 = \"7.2.0\";\nvar version = \"4.0.2\";\nconst Vhs = {\n PlaylistLoader,\n Playlist,\n utils,\n STANDARD_PLAYLIST_SELECTOR: lastBandwidthSelector,\n INITIAL_PLAYLIST_SELECTOR: lowestBitrateCompatibleVariantSelector,\n lastBandwidthSelector,\n movingAverageBandwidthSelector,\n comparePlaylistBandwidth,\n comparePlaylistResolution,\n xhr: xhrFactory()\n}; // Define getter/setters for config properties\n\nObject.keys(Config).forEach(prop => {\n Object.defineProperty(Vhs, prop, {\n get() {\n videojs.log.warn(`using Vhs.${prop} is UNSAFE be sure you know what you are doing`);\n return Config[prop];\n },\n set(value) {\n videojs.log.warn(`using Vhs.${prop} is UNSAFE be sure you know what you are doing`);\n if (typeof value !== 'number' || value < 0) {\n videojs.log.warn(`value of Vhs.${prop} must be greater than or equal to 0`);\n return;\n }\n Config[prop] = value;\n }\n });\n});\nconst LOCAL_STORAGE_KEY = 'videojs-vhs';\n/**\n * Updates the selectedIndex of the QualityLevelList when a mediachange happens in vhs.\n *\n * @param {QualityLevelList} qualityLevels The QualityLevelList to update.\n * @param {PlaylistLoader} playlistLoader PlaylistLoader containing the new media info.\n * @function handleVhsMediaChange\n */\n\nconst handleVhsMediaChange = function (qualityLevels, playlistLoader) {\n const newPlaylist = playlistLoader.media();\n let selectedIndex = -1;\n for (let i = 0; i < qualityLevels.length; i++) {\n if (qualityLevels[i].id === newPlaylist.id) {\n selectedIndex = i;\n break;\n }\n }\n qualityLevels.selectedIndex_ = selectedIndex;\n qualityLevels.trigger({\n selectedIndex,\n type: 'change'\n });\n};\n/**\n * Adds quality levels to list once playlist metadata is available\n *\n * @param {QualityLevelList} qualityLevels The QualityLevelList to attach events to.\n * @param {Object} vhs Vhs object to listen to for media events.\n * @function handleVhsLoadedMetadata\n */\n\nconst handleVhsLoadedMetadata = function (qualityLevels, vhs) {\n vhs.representations().forEach(rep => {\n qualityLevels.addQualityLevel(rep);\n });\n handleVhsMediaChange(qualityLevels, vhs.playlists);\n}; // VHS is a source handler, not a tech. Make sure attempts to use it\n// as one do not cause exceptions.\n\nVhs.canPlaySource = function () {\n return videojs.log.warn('VHS is no longer a tech. Please remove it from ' + 'your player\\'s techOrder.');\n};\nconst emeKeySystems = (keySystemOptions, mainPlaylist, audioPlaylist) => {\n if (!keySystemOptions) {\n return keySystemOptions;\n }\n let codecs = {};\n if (mainPlaylist && mainPlaylist.attributes && mainPlaylist.attributes.CODECS) {\n codecs = unwrapCodecList(parseCodecs(mainPlaylist.attributes.CODECS));\n }\n if (audioPlaylist && audioPlaylist.attributes && audioPlaylist.attributes.CODECS) {\n codecs.audio = audioPlaylist.attributes.CODECS;\n }\n const videoContentType = getMimeForCodec(codecs.video);\n const audioContentType = getMimeForCodec(codecs.audio); // upsert the content types based on the selected playlist\n\n const keySystemContentTypes = {};\n for (const keySystem in keySystemOptions) {\n keySystemContentTypes[keySystem] = {};\n if (audioContentType) {\n keySystemContentTypes[keySystem].audioContentType = audioContentType;\n }\n if (videoContentType) {\n keySystemContentTypes[keySystem].videoContentType = videoContentType;\n } // Default to using the video playlist's PSSH even though they may be different, as\n // videojs-contrib-eme will only accept one in the options.\n //\n // This shouldn't be an issue for most cases as early intialization will handle all\n // unique PSSH values, and if they aren't, then encrypted events should have the\n // specific information needed for the unique license.\n\n if (mainPlaylist.contentProtection && mainPlaylist.contentProtection[keySystem] && mainPlaylist.contentProtection[keySystem].pssh) {\n keySystemContentTypes[keySystem].pssh = mainPlaylist.contentProtection[keySystem].pssh;\n } // videojs-contrib-eme accepts the option of specifying: 'com.some.cdm': 'url'\n // so we need to prevent overwriting the URL entirely\n\n if (typeof keySystemOptions[keySystem] === 'string') {\n keySystemContentTypes[keySystem].url = keySystemOptions[keySystem];\n }\n }\n return merge(keySystemOptions, keySystemContentTypes);\n};\n/**\n * @typedef {Object} KeySystems\n *\n * keySystems configuration for https://github.com/videojs/videojs-contrib-eme\n * Note: not all options are listed here.\n *\n * @property {Uint8Array} [pssh]\n * Protection System Specific Header\n */\n\n/**\n * Goes through all the playlists and collects an array of KeySystems options objects\n * containing each playlist's keySystems and their pssh values, if available.\n *\n * @param {Object[]} playlists\n * The playlists to look through\n * @param {string[]} keySystems\n * The keySystems to collect pssh values for\n *\n * @return {KeySystems[]}\n * An array of KeySystems objects containing available key systems and their\n * pssh values\n */\n\nconst getAllPsshKeySystemsOptions = (playlists, keySystems) => {\n return playlists.reduce((keySystemsArr, playlist) => {\n if (!playlist.contentProtection) {\n return keySystemsArr;\n }\n const keySystemsOptions = keySystems.reduce((keySystemsObj, keySystem) => {\n const keySystemOptions = playlist.contentProtection[keySystem];\n if (keySystemOptions && keySystemOptions.pssh) {\n keySystemsObj[keySystem] = {\n pssh: keySystemOptions.pssh\n };\n }\n return keySystemsObj;\n }, {});\n if (Object.keys(keySystemsOptions).length) {\n keySystemsArr.push(keySystemsOptions);\n }\n return keySystemsArr;\n }, []);\n};\n/**\n * Returns a promise that waits for the\n * [eme plugin](https://github.com/videojs/videojs-contrib-eme) to create a key session.\n *\n * Works around https://bugs.chromium.org/p/chromium/issues/detail?id=895449 in non-IE11\n * browsers.\n *\n * As per the above ticket, this is particularly important for Chrome, where, if\n * unencrypted content is appended before encrypted content and the key session has not\n * been created, a MEDIA_ERR_DECODE will be thrown once the encrypted content is reached\n * during playback.\n *\n * @param {Object} player\n * The player instance\n * @param {Object[]} sourceKeySystems\n * The key systems options from the player source\n * @param {Object} [audioMedia]\n * The active audio media playlist (optional)\n * @param {Object[]} mainPlaylists\n * The playlists found on the main playlist object\n *\n * @return {Object}\n * Promise that resolves when the key session has been created\n */\n\nconst waitForKeySessionCreation = ({\n player,\n sourceKeySystems,\n audioMedia,\n mainPlaylists\n}) => {\n if (!player.eme.initializeMediaKeys) {\n return Promise.resolve();\n } // TODO should all audio PSSH values be initialized for DRM?\n //\n // All unique video rendition pssh values are initialized for DRM, but here only\n // the initial audio playlist license is initialized. In theory, an encrypted\n // event should be fired if the user switches to an alternative audio playlist\n // where a license is required, but this case hasn't yet been tested. In addition, there\n // may be many alternate audio playlists unlikely to be used (e.g., multiple different\n // languages).\n\n const playlists = audioMedia ? mainPlaylists.concat([audioMedia]) : mainPlaylists;\n const keySystemsOptionsArr = getAllPsshKeySystemsOptions(playlists, Object.keys(sourceKeySystems));\n const initializationFinishedPromises = [];\n const keySessionCreatedPromises = []; // Since PSSH values are interpreted as initData, EME will dedupe any duplicates. The\n // only place where it should not be deduped is for ms-prefixed APIs, but\n // the existence of modern EME APIs in addition to\n // ms-prefixed APIs on Edge should prevent this from being a concern.\n // initializeMediaKeys also won't use the webkit-prefixed APIs.\n\n keySystemsOptionsArr.forEach(keySystemsOptions => {\n keySessionCreatedPromises.push(new Promise((resolve, reject) => {\n player.tech_.one('keysessioncreated', resolve);\n }));\n initializationFinishedPromises.push(new Promise((resolve, reject) => {\n player.eme.initializeMediaKeys({\n keySystems: keySystemsOptions\n }, err => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n });\n }));\n }); // The reasons Promise.race is chosen over Promise.any:\n //\n // * Promise.any is only available in Safari 14+.\n // * None of these promises are expected to reject. If they do reject, it might be\n // better here for the race to surface the rejection, rather than mask it by using\n // Promise.any.\n\n return Promise.race([\n // If a session was previously created, these will all finish resolving without\n // creating a new session, otherwise it will take until the end of all license\n // requests, which is why the key session check is used (to make setup much faster).\n Promise.all(initializationFinishedPromises),\n // Once a single session is created, the browser knows DRM will be used.\n Promise.race(keySessionCreatedPromises)]);\n};\n/**\n * If the [eme](https://github.com/videojs/videojs-contrib-eme) plugin is available, and\n * there are keySystems on the source, sets up source options to prepare the source for\n * eme.\n *\n * @param {Object} player\n * The player instance\n * @param {Object[]} sourceKeySystems\n * The key systems options from the player source\n * @param {Object} media\n * The active media playlist\n * @param {Object} [audioMedia]\n * The active audio media playlist (optional)\n *\n * @return {boolean}\n * Whether or not options were configured and EME is available\n */\n\nconst setupEmeOptions = ({\n player,\n sourceKeySystems,\n media,\n audioMedia\n}) => {\n const sourceOptions = emeKeySystems(sourceKeySystems, media, audioMedia);\n if (!sourceOptions) {\n return false;\n }\n player.currentSource().keySystems = sourceOptions; // eme handles the rest of the setup, so if it is missing\n // do nothing.\n\n if (sourceOptions && !player.eme) {\n videojs.log.warn('DRM encrypted source cannot be decrypted without a DRM plugin');\n return false;\n }\n return true;\n};\nconst getVhsLocalStorage = () => {\n if (!window$1.localStorage) {\n return null;\n }\n const storedObject = window$1.localStorage.getItem(LOCAL_STORAGE_KEY);\n if (!storedObject) {\n return null;\n }\n try {\n return JSON.parse(storedObject);\n } catch (e) {\n // someone may have tampered with the value\n return null;\n }\n};\nconst updateVhsLocalStorage = options => {\n if (!window$1.localStorage) {\n return false;\n }\n let objectToStore = getVhsLocalStorage();\n objectToStore = objectToStore ? merge(objectToStore, options) : options;\n try {\n window$1.localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(objectToStore));\n } catch (e) {\n // Throws if storage is full (e.g., always on iOS 5+ Safari private mode, where\n // storage is set to 0).\n // https://developer.mozilla.org/en-US/docs/Web/API/Storage/setItem#Exceptions\n // No need to perform any operation.\n return false;\n }\n return objectToStore;\n};\n/**\n * Parses VHS-supported media types from data URIs. See\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\n * for information on data URIs.\n *\n * @param {string} dataUri\n * The data URI\n *\n * @return {string|Object}\n * The parsed object/string, or the original string if no supported media type\n * was found\n */\n\nconst expandDataUri = dataUri => {\n if (dataUri.toLowerCase().indexOf('data:application/vnd.videojs.vhs+json,') === 0) {\n return JSON.parse(dataUri.substring(dataUri.indexOf(',') + 1));\n } // no known case for this data URI, return the string as-is\n\n return dataUri;\n};\n/**\n * Adds a request hook to an xhr object\n *\n * @param {Object} xhr object to add the onRequest hook to\n * @param {function} callback hook function for an xhr request\n */\n\nconst addOnRequestHook = (xhr, callback) => {\n if (!xhr._requestCallbackSet) {\n xhr._requestCallbackSet = new Set();\n }\n xhr._requestCallbackSet.add(callback);\n};\n/**\n * Adds a response hook to an xhr object\n *\n * @param {Object} xhr object to add the onResponse hook to\n * @param {function} callback hook function for an xhr response\n */\n\nconst addOnResponseHook = (xhr, callback) => {\n if (!xhr._responseCallbackSet) {\n xhr._responseCallbackSet = new Set();\n }\n xhr._responseCallbackSet.add(callback);\n};\n/**\n * Removes a request hook on an xhr object, deletes the onRequest set if empty.\n *\n * @param {Object} xhr object to remove the onRequest hook from\n * @param {function} callback hook function to remove\n */\n\nconst removeOnRequestHook = (xhr, callback) => {\n if (!xhr._requestCallbackSet) {\n return;\n }\n xhr._requestCallbackSet.delete(callback);\n if (!xhr._requestCallbackSet.size) {\n delete xhr._requestCallbackSet;\n }\n};\n/**\n * Removes a response hook on an xhr object, deletes the onResponse set if empty.\n *\n * @param {Object} xhr object to remove the onResponse hook from\n * @param {function} callback hook function to remove\n */\n\nconst removeOnResponseHook = (xhr, callback) => {\n if (!xhr._responseCallbackSet) {\n return;\n }\n xhr._responseCallbackSet.delete(callback);\n if (!xhr._responseCallbackSet.size) {\n delete xhr._responseCallbackSet;\n }\n};\n/**\n * Whether the browser has built-in HLS support.\n */\n\nVhs.supportsNativeHls = function () {\n if (!document$1 || !document$1.createElement) {\n return false;\n }\n const video = document$1.createElement('video'); // native HLS is definitely not supported if HTML5 video isn't\n\n if (!videojs.getTech('Html5').isSupported()) {\n return false;\n } // HLS manifests can go by many mime-types\n\n const canPlay = [\n // Apple santioned\n 'application/vnd.apple.mpegurl',\n // Apple sanctioned for backwards compatibility\n 'audio/mpegurl',\n // Very common\n 'audio/x-mpegurl',\n // Very common\n 'application/x-mpegurl',\n // Included for completeness\n 'video/x-mpegurl', 'video/mpegurl', 'application/mpegurl'];\n return canPlay.some(function (canItPlay) {\n return /maybe|probably/i.test(video.canPlayType(canItPlay));\n });\n}();\nVhs.supportsNativeDash = function () {\n if (!document$1 || !document$1.createElement || !videojs.getTech('Html5').isSupported()) {\n return false;\n }\n return /maybe|probably/i.test(document$1.createElement('video').canPlayType('application/dash+xml'));\n}();\nVhs.supportsTypeNatively = type => {\n if (type === 'hls') {\n return Vhs.supportsNativeHls;\n }\n if (type === 'dash') {\n return Vhs.supportsNativeDash;\n }\n return false;\n};\n/**\n * VHS is a source handler, not a tech. Make sure attempts to use it\n * as one do not cause exceptions.\n */\n\nVhs.isSupported = function () {\n return videojs.log.warn('VHS is no longer a tech. Please remove it from ' + 'your player\\'s techOrder.');\n};\n/**\n * A global function for setting an onRequest hook\n *\n * @param {function} callback for request modifiction\n */\n\nVhs.xhr.onRequest = function (callback) {\n addOnRequestHook(Vhs.xhr, callback);\n};\n/**\n * A global function for setting an onResponse hook\n *\n * @param {callback} callback for response data retrieval\n */\n\nVhs.xhr.onResponse = function (callback) {\n addOnResponseHook(Vhs.xhr, callback);\n};\n/**\n * Deletes a global onRequest callback if it exists\n *\n * @param {function} callback to delete from the global set\n */\n\nVhs.xhr.offRequest = function (callback) {\n removeOnRequestHook(Vhs.xhr, callback);\n};\n/**\n * Deletes a global onResponse callback if it exists\n *\n * @param {function} callback to delete from the global set\n */\n\nVhs.xhr.offResponse = function (callback) {\n removeOnResponseHook(Vhs.xhr, callback);\n};\nconst Component = videojs.getComponent('Component');\n/**\n * The Vhs Handler object, where we orchestrate all of the parts\n * of VHS to interact with video.js\n *\n * @class VhsHandler\n * @extends videojs.Component\n * @param {Object} source the soruce object\n * @param {Tech} tech the parent tech object\n * @param {Object} options optional and required options\n */\n\nclass VhsHandler extends Component {\n constructor(source, tech, options) {\n super(tech, options.vhs); // if a tech level `initialBandwidth` option was passed\n // use that over the VHS level `bandwidth` option\n\n if (typeof options.initialBandwidth === 'number') {\n this.options_.bandwidth = options.initialBandwidth;\n }\n this.logger_ = logger('VhsHandler'); // we need access to the player in some cases,\n // so, get it from Video.js via the `playerId`\n\n if (tech.options_ && tech.options_.playerId) {\n const _player = videojs.getPlayer(tech.options_.playerId);\n this.player_ = _player;\n }\n this.tech_ = tech;\n this.source_ = source;\n this.stats = {};\n this.ignoreNextSeekingEvent_ = false;\n this.setOptions_();\n if (this.options_.overrideNative && tech.overrideNativeAudioTracks && tech.overrideNativeVideoTracks) {\n tech.overrideNativeAudioTracks(true);\n tech.overrideNativeVideoTracks(true);\n } else if (this.options_.overrideNative && (tech.featuresNativeVideoTracks || tech.featuresNativeAudioTracks)) {\n // overriding native VHS only works if audio tracks have been emulated\n // error early if we're misconfigured\n throw new Error('Overriding native VHS requires emulated tracks. ' + 'See https://git.io/vMpjB');\n } // listen for fullscreenchange events for this player so that we\n // can adjust our quality selection quickly\n\n this.on(document$1, ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange'], event => {\n const fullscreenElement = document$1.fullscreenElement || document$1.webkitFullscreenElement || document$1.mozFullScreenElement || document$1.msFullscreenElement;\n if (fullscreenElement && fullscreenElement.contains(this.tech_.el())) {\n this.playlistController_.fastQualityChange_();\n } else {\n // When leaving fullscreen, since the in page pixel dimensions should be smaller\n // than full screen, see if there should be a rendition switch down to preserve\n // bandwidth.\n this.playlistController_.checkABR_();\n }\n });\n this.on(this.tech_, 'seeking', function () {\n if (this.ignoreNextSeekingEvent_) {\n this.ignoreNextSeekingEvent_ = false;\n return;\n }\n this.setCurrentTime(this.tech_.currentTime());\n });\n this.on(this.tech_, 'error', function () {\n // verify that the error was real and we are loaded\n // enough to have pc loaded.\n if (this.tech_.error() && this.playlistController_) {\n this.playlistController_.pauseLoading();\n }\n });\n this.on(this.tech_, 'play', this.play);\n }\n /**\n * Set VHS options based on options from configuration, as well as partial\n * options to be passed at a later time.\n *\n * @param {Object} options A partial chunk of config options\n */\n\n setOptions_(options = {}) {\n this.options_ = merge(this.options_, options); // defaults\n\n this.options_.withCredentials = this.options_.withCredentials || false;\n this.options_.limitRenditionByPlayerDimensions = this.options_.limitRenditionByPlayerDimensions === false ? false : true;\n this.options_.useDevicePixelRatio = this.options_.useDevicePixelRatio || false;\n this.options_.useBandwidthFromLocalStorage = typeof this.source_.useBandwidthFromLocalStorage !== 'undefined' ? this.source_.useBandwidthFromLocalStorage : this.options_.useBandwidthFromLocalStorage || false;\n this.options_.useForcedSubtitles = this.options_.useForcedSubtitles || false;\n this.options_.useNetworkInformationApi = this.options_.useNetworkInformationApi || false;\n this.options_.useDtsForTimestampOffset = this.options_.useDtsForTimestampOffset || false;\n this.options_.customTagParsers = this.options_.customTagParsers || [];\n this.options_.customTagMappers = this.options_.customTagMappers || [];\n this.options_.cacheEncryptionKeys = this.options_.cacheEncryptionKeys || false;\n this.options_.llhls = this.options_.llhls === false ? false : true;\n this.options_.bufferBasedABR = this.options_.bufferBasedABR || false;\n if (typeof this.options_.playlistExclusionDuration !== 'number') {\n this.options_.playlistExclusionDuration = 60;\n }\n if (typeof this.options_.bandwidth !== 'number') {\n if (this.options_.useBandwidthFromLocalStorage) {\n const storedObject = getVhsLocalStorage();\n if (storedObject && storedObject.bandwidth) {\n this.options_.bandwidth = storedObject.bandwidth;\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-bandwidth-from-local-storage'\n });\n }\n if (storedObject && storedObject.throughput) {\n this.options_.throughput = storedObject.throughput;\n this.tech_.trigger({\n type: 'usage',\n name: 'vhs-throughput-from-local-storage'\n });\n }\n }\n } // if bandwidth was not set by options or pulled from local storage, start playlist\n // selection at a reasonable bandwidth\n\n if (typeof this.options_.bandwidth !== 'number') {\n this.options_.bandwidth = Config.INITIAL_BANDWIDTH;\n } // If the bandwidth number is unchanged from the initial setting\n // then this takes precedence over the enableLowInitialPlaylist option\n\n this.options_.enableLowInitialPlaylist = this.options_.enableLowInitialPlaylist && this.options_.bandwidth === Config.INITIAL_BANDWIDTH; // grab options passed to player.src\n\n ['withCredentials', 'useDevicePixelRatio', 'customPixelRatio', 'limitRenditionByPlayerDimensions', 'bandwidth', 'customTagParsers', 'customTagMappers', 'cacheEncryptionKeys', 'playlistSelector', 'initialPlaylistSelector', 'bufferBasedABR', 'liveRangeSafeTimeDelta', 'llhls', 'useForcedSubtitles', 'useNetworkInformationApi', 'useDtsForTimestampOffset', 'exactManifestTimings', 'leastPixelDiffSelector'].forEach(option => {\n if (typeof this.source_[option] !== 'undefined') {\n this.options_[option] = this.source_[option];\n }\n });\n this.limitRenditionByPlayerDimensions = this.options_.limitRenditionByPlayerDimensions;\n this.useDevicePixelRatio = this.options_.useDevicePixelRatio;\n const customPixelRatio = this.options_.customPixelRatio; // Ensure the custom pixel ratio is a number greater than or equal to 0\n\n if (typeof customPixelRatio === 'number' && customPixelRatio >= 0) {\n this.customPixelRatio = customPixelRatio;\n }\n } // alias for public method to set options\n\n setOptions(options = {}) {\n this.setOptions_(options);\n }\n /**\n * called when player.src gets called, handle a new source\n *\n * @param {Object} src the source object to handle\n */\n\n src(src, type) {\n // do nothing if the src is falsey\n if (!src) {\n return;\n }\n this.setOptions_(); // add main playlist controller options\n\n this.options_.src = expandDataUri(this.source_.src);\n this.options_.tech = this.tech_;\n this.options_.externVhs = Vhs;\n this.options_.sourceType = simpleTypeFromSourceType(type); // Whenever we seek internally, we should update the tech\n\n this.options_.seekTo = time => {\n this.tech_.setCurrentTime(time);\n }; // pass player to allow for player level eventing on construction.\n\n this.options_.player_ = this.player_;\n this.playlistController_ = new PlaylistController(this.options_);\n const playbackWatcherOptions = merge({\n liveRangeSafeTimeDelta: SAFE_TIME_DELTA\n }, this.options_, {\n seekable: () => this.seekable(),\n media: () => this.playlistController_.media(),\n playlistController: this.playlistController_\n });\n this.playbackWatcher_ = new PlaybackWatcher(playbackWatcherOptions);\n this.attachStreamingEventListeners_();\n this.playlistController_.on('error', () => {\n const player = videojs.players[this.tech_.options_.playerId];\n let error = this.playlistController_.error;\n if (typeof error === 'object' && !error.code) {\n error.code = 3;\n } else if (typeof error === 'string') {\n error = {\n message: error,\n code: 3\n };\n }\n player.error(error);\n });\n const defaultSelector = this.options_.bufferBasedABR ? Vhs.movingAverageBandwidthSelector(0.55) : Vhs.STANDARD_PLAYLIST_SELECTOR; // `this` in selectPlaylist should be the VhsHandler for backwards\n // compatibility with < v2\n\n this.playlistController_.selectPlaylist = this.selectPlaylist ? this.selectPlaylist.bind(this) : defaultSelector.bind(this);\n this.playlistController_.selectInitialPlaylist = Vhs.INITIAL_PLAYLIST_SELECTOR.bind(this); // re-expose some internal objects for backwards compatibility with < v2\n\n this.playlists = this.playlistController_.mainPlaylistLoader_;\n this.mediaSource = this.playlistController_.mediaSource; // Proxy assignment of some properties to the main playlist\n // controller. Using a custom property for backwards compatibility\n // with < v2\n\n Object.defineProperties(this, {\n selectPlaylist: {\n get() {\n return this.playlistController_.selectPlaylist;\n },\n set(selectPlaylist) {\n this.playlistController_.selectPlaylist = selectPlaylist.bind(this);\n }\n },\n throughput: {\n get() {\n return this.playlistController_.mainSegmentLoader_.throughput.rate;\n },\n set(throughput) {\n this.playlistController_.mainSegmentLoader_.throughput.rate = throughput; // By setting `count` to 1 the throughput value becomes the starting value\n // for the cumulative average\n\n this.playlistController_.mainSegmentLoader_.throughput.count = 1;\n }\n },\n bandwidth: {\n get() {\n let playerBandwidthEst = this.playlistController_.mainSegmentLoader_.bandwidth;\n const networkInformation = window$1.navigator.connection || window$1.navigator.mozConnection || window$1.navigator.webkitConnection;\n const tenMbpsAsBitsPerSecond = 10e6;\n if (this.options_.useNetworkInformationApi && networkInformation) {\n // downlink returns Mbps\n // https://developer.mozilla.org/en-US/docs/Web/API/NetworkInformation/downlink\n const networkInfoBandwidthEstBitsPerSec = networkInformation.downlink * 1000 * 1000; // downlink maxes out at 10 Mbps. In the event that both networkInformationApi and the player\n // estimate a bandwidth greater than 10 Mbps, use the larger of the two estimates to ensure that\n // high quality streams are not filtered out.\n\n if (networkInfoBandwidthEstBitsPerSec >= tenMbpsAsBitsPerSecond && playerBandwidthEst >= tenMbpsAsBitsPerSecond) {\n playerBandwidthEst = Math.max(playerBandwidthEst, networkInfoBandwidthEstBitsPerSec);\n } else {\n playerBandwidthEst = networkInfoBandwidthEstBitsPerSec;\n }\n }\n return playerBandwidthEst;\n },\n set(bandwidth) {\n this.playlistController_.mainSegmentLoader_.bandwidth = bandwidth; // setting the bandwidth manually resets the throughput counter\n // `count` is set to zero that current value of `rate` isn't included\n // in the cumulative average\n\n this.playlistController_.mainSegmentLoader_.throughput = {\n rate: 0,\n count: 0\n };\n }\n },\n /**\n * `systemBandwidth` is a combination of two serial processes bit-rates. The first\n * is the network bitrate provided by `bandwidth` and the second is the bitrate of\n * the entire process after that - decryption, transmuxing, and appending - provided\n * by `throughput`.\n *\n * Since the two process are serial, the overall system bandwidth is given by:\n * sysBandwidth = 1 / (1 / bandwidth + 1 / throughput)\n */\n systemBandwidth: {\n get() {\n const invBandwidth = 1 / (this.bandwidth || 1);\n let invThroughput;\n if (this.throughput > 0) {\n invThroughput = 1 / this.throughput;\n } else {\n invThroughput = 0;\n }\n const systemBitrate = Math.floor(1 / (invBandwidth + invThroughput));\n return systemBitrate;\n },\n set() {\n videojs.log.error('The \"systemBandwidth\" property is read-only');\n }\n }\n });\n if (this.options_.bandwidth) {\n this.bandwidth = this.options_.bandwidth;\n }\n if (this.options_.throughput) {\n this.throughput = this.options_.throughput;\n }\n Object.defineProperties(this.stats, {\n bandwidth: {\n get: () => this.bandwidth || 0,\n enumerable: true\n },\n mediaRequests: {\n get: () => this.playlistController_.mediaRequests_() || 0,\n enumerable: true\n },\n mediaRequestsAborted: {\n get: () => this.playlistController_.mediaRequestsAborted_() || 0,\n enumerable: true\n },\n mediaRequestsTimedout: {\n get: () => this.playlistController_.mediaRequestsTimedout_() || 0,\n enumerable: true\n },\n mediaRequestsErrored: {\n get: () => this.playlistController_.mediaRequestsErrored_() || 0,\n enumerable: true\n },\n mediaTransferDuration: {\n get: () => this.playlistController_.mediaTransferDuration_() || 0,\n enumerable: true\n },\n mediaBytesTransferred: {\n get: () => this.playlistController_.mediaBytesTransferred_() || 0,\n enumerable: true\n },\n mediaSecondsLoaded: {\n get: () => this.playlistController_.mediaSecondsLoaded_() || 0,\n enumerable: true\n },\n mediaAppends: {\n get: () => this.playlistController_.mediaAppends_() || 0,\n enumerable: true\n },\n mainAppendsToLoadedData: {\n get: () => this.playlistController_.mainAppendsToLoadedData_() || 0,\n enumerable: true\n },\n audioAppendsToLoadedData: {\n get: () => this.playlistController_.audioAppendsToLoadedData_() || 0,\n enumerable: true\n },\n appendsToLoadedData: {\n get: () => this.playlistController_.appendsToLoadedData_() || 0,\n enumerable: true\n },\n timeToLoadedData: {\n get: () => this.playlistController_.timeToLoadedData_() || 0,\n enumerable: true\n },\n buffered: {\n get: () => timeRangesToArray(this.tech_.buffered()),\n enumerable: true\n },\n currentTime: {\n get: () => this.tech_.currentTime(),\n enumerable: true\n },\n currentSource: {\n get: () => this.tech_.currentSource_,\n enumerable: true\n },\n currentTech: {\n get: () => this.tech_.name_,\n enumerable: true\n },\n duration: {\n get: () => this.tech_.duration(),\n enumerable: true\n },\n main: {\n get: () => this.playlists.main,\n enumerable: true\n },\n playerDimensions: {\n get: () => this.tech_.currentDimensions(),\n enumerable: true\n },\n seekable: {\n get: () => timeRangesToArray(this.tech_.seekable()),\n enumerable: true\n },\n timestamp: {\n get: () => Date.now(),\n enumerable: true\n },\n videoPlaybackQuality: {\n get: () => this.tech_.getVideoPlaybackQuality(),\n enumerable: true\n }\n });\n this.tech_.one('canplay', this.playlistController_.setupFirstPlay.bind(this.playlistController_));\n this.tech_.on('bandwidthupdate', () => {\n if (this.options_.useBandwidthFromLocalStorage) {\n updateVhsLocalStorage({\n bandwidth: this.bandwidth,\n throughput: Math.round(this.throughput)\n });\n }\n });\n this.playlistController_.on('selectedinitialmedia', () => {\n // Add the manual rendition mix-in to VhsHandler\n renditionSelectionMixin(this);\n });\n this.playlistController_.sourceUpdater_.on('createdsourcebuffers', () => {\n this.setupEme_();\n }); // the bandwidth of the primary segment loader is our best\n // estimate of overall bandwidth\n\n this.on(this.playlistController_, 'progress', function () {\n this.tech_.trigger('progress');\n }); // In the live case, we need to ignore the very first `seeking` event since\n // that will be the result of the seek-to-live behavior\n\n this.on(this.playlistController_, 'firstplay', function () {\n this.ignoreNextSeekingEvent_ = true;\n });\n this.setupQualityLevels_(); // do nothing if the tech has been disposed already\n // this can occur if someone sets the src in player.ready(), for instance\n\n if (!this.tech_.el()) {\n return;\n }\n this.mediaSourceUrl_ = window$1.URL.createObjectURL(this.playlistController_.mediaSource); // If we are playing HLS with MSE in Safari, add source elements for both the blob and manifest URLs.\n // The latter will enable Airplay playback on receiver devices.\n\n if ((videojs.browser.IS_ANY_SAFARI || videojs.browser.IS_IOS) && this.options_.overrideNative && this.options_.sourceType === 'hls' && typeof this.tech_.addSourceElement === 'function') {\n this.tech_.addSourceElement(this.mediaSourceUrl_);\n this.tech_.addSourceElement(this.source_.src);\n } else {\n this.tech_.src(this.mediaSourceUrl_);\n }\n }\n createKeySessions_() {\n const audioPlaylistLoader = this.playlistController_.mediaTypes_.AUDIO.activePlaylistLoader;\n this.logger_('waiting for EME key session creation');\n waitForKeySessionCreation({\n player: this.player_,\n sourceKeySystems: this.source_.keySystems,\n audioMedia: audioPlaylistLoader && audioPlaylistLoader.media(),\n mainPlaylists: this.playlists.main.playlists\n }).then(() => {\n this.logger_('created EME key session');\n this.playlistController_.sourceUpdater_.initializedEme();\n }).catch(err => {\n this.logger_('error while creating EME key session', err);\n this.player_.error({\n message: 'Failed to initialize media keys for EME',\n code: 3\n });\n });\n }\n handleWaitingForKey_() {\n // If waitingforkey is fired, it's possible that the data that's necessary to retrieve\n // the key is in the manifest. While this should've happened on initial source load, it\n // may happen again in live streams where the keys change, and the manifest info\n // reflects the update.\n //\n // Because videojs-contrib-eme compares the PSSH data we send to that of PSSH data it's\n // already requested keys for, we don't have to worry about this generating extraneous\n // requests.\n this.logger_('waitingforkey fired, attempting to create any new key sessions');\n this.createKeySessions_();\n }\n /**\n * If necessary and EME is available, sets up EME options and waits for key session\n * creation.\n *\n * This function also updates the source updater so taht it can be used, as for some\n * browsers, EME must be configured before content is appended (if appending unencrypted\n * content before encrypted content).\n */\n\n setupEme_() {\n const audioPlaylistLoader = this.playlistController_.mediaTypes_.AUDIO.activePlaylistLoader;\n const didSetupEmeOptions = setupEmeOptions({\n player: this.player_,\n sourceKeySystems: this.source_.keySystems,\n media: this.playlists.media(),\n audioMedia: audioPlaylistLoader && audioPlaylistLoader.media()\n });\n this.player_.tech_.on('keystatuschange', e => {\n this.playlistController_.updatePlaylistByKeyStatus(e.keyId, e.status);\n });\n this.handleWaitingForKey_ = this.handleWaitingForKey_.bind(this);\n this.player_.tech_.on('waitingforkey', this.handleWaitingForKey_);\n if (!didSetupEmeOptions) {\n // If EME options were not set up, we've done all we could to initialize EME.\n this.playlistController_.sourceUpdater_.initializedEme();\n return;\n }\n this.createKeySessions_();\n }\n /**\n * Initializes the quality levels and sets listeners to update them.\n *\n * @method setupQualityLevels_\n * @private\n */\n\n setupQualityLevels_() {\n const player = videojs.players[this.tech_.options_.playerId]; // if there isn't a player or there isn't a qualityLevels plugin\n // or qualityLevels_ listeners have already been setup, do nothing.\n\n if (!player || !player.qualityLevels || this.qualityLevels_) {\n return;\n }\n this.qualityLevels_ = player.qualityLevels();\n this.playlistController_.on('selectedinitialmedia', () => {\n handleVhsLoadedMetadata(this.qualityLevels_, this);\n });\n this.playlists.on('mediachange', () => {\n handleVhsMediaChange(this.qualityLevels_, this.playlists);\n });\n }\n /**\n * return the version\n */\n\n static version() {\n return {\n '@videojs/http-streaming': version$4,\n 'mux.js': version$3,\n 'mpd-parser': version$2,\n 'm3u8-parser': version$1,\n 'aes-decrypter': version\n };\n }\n /**\n * return the version\n */\n\n version() {\n return this.constructor.version();\n }\n canChangeType() {\n return SourceUpdater.canChangeType();\n }\n /**\n * Begin playing the video.\n */\n\n play() {\n this.playlistController_.play();\n }\n /**\n * a wrapper around the function in PlaylistController\n */\n\n setCurrentTime(currentTime) {\n this.playlistController_.setCurrentTime(currentTime);\n }\n /**\n * a wrapper around the function in PlaylistController\n */\n\n duration() {\n return this.playlistController_.duration();\n }\n /**\n * a wrapper around the function in PlaylistController\n */\n\n seekable() {\n return this.playlistController_.seekable();\n }\n /**\n * Abort all outstanding work and cleanup.\n */\n\n dispose() {\n if (this.playbackWatcher_) {\n this.playbackWatcher_.dispose();\n }\n if (this.playlistController_) {\n this.playlistController_.dispose();\n }\n if (this.qualityLevels_) {\n this.qualityLevels_.dispose();\n }\n if (this.tech_ && this.tech_.vhs) {\n delete this.tech_.vhs;\n }\n if (this.mediaSourceUrl_ && window$1.URL.revokeObjectURL) {\n window$1.URL.revokeObjectURL(this.mediaSourceUrl_);\n this.mediaSourceUrl_ = null;\n }\n if (this.tech_) {\n this.tech_.off('waitingforkey', this.handleWaitingForKey_);\n }\n super.dispose();\n }\n convertToProgramTime(time, callback) {\n return getProgramTime({\n playlist: this.playlistController_.media(),\n time,\n callback\n });\n } // the player must be playing before calling this\n\n seekToProgramTime(programTime, callback, pauseAfterSeek = true, retryCount = 2) {\n return seekToProgramTime({\n programTime,\n playlist: this.playlistController_.media(),\n retryCount,\n pauseAfterSeek,\n seekTo: this.options_.seekTo,\n tech: this.options_.tech,\n callback\n });\n }\n /**\n * Adds the onRequest, onResponse, offRequest and offResponse functions\n * to the VhsHandler xhr Object.\n */\n\n setupXhrHooks_() {\n /**\n * A player function for setting an onRequest hook\n *\n * @param {function} callback for request modifiction\n */\n this.xhr.onRequest = callback => {\n addOnRequestHook(this.xhr, callback);\n };\n /**\n * A player function for setting an onResponse hook\n *\n * @param {callback} callback for response data retrieval\n */\n\n this.xhr.onResponse = callback => {\n addOnResponseHook(this.xhr, callback);\n };\n /**\n * Deletes a player onRequest callback if it exists\n *\n * @param {function} callback to delete from the player set\n */\n\n this.xhr.offRequest = callback => {\n removeOnRequestHook(this.xhr, callback);\n };\n /**\n * Deletes a player onResponse callback if it exists\n *\n * @param {function} callback to delete from the player set\n */\n\n this.xhr.offResponse = callback => {\n removeOnResponseHook(this.xhr, callback);\n }; // Trigger an event on the player to notify the user that vhs is ready to set xhr hooks.\n // This allows hooks to be set before the source is set to vhs when handleSource is called.\n\n this.player_.trigger('xhr-hooks-ready');\n }\n attachStreamingEventListeners_() {\n const playlistControllerEvents = ['seekablerangeschanged', 'bufferedrangeschanged', 'contentsteeringloadstart', 'contentsteeringloadcomplete', 'contentsteeringparsed'];\n const playbackWatcher = ['gapjumped', 'playedrangeschanged']; // re-emit streaming events and payloads on the player.\n\n playlistControllerEvents.forEach(eventName => {\n this.playlistController_.on(eventName, metadata => {\n this.player_.trigger(_extends({}, metadata));\n });\n });\n playbackWatcher.forEach(eventName => {\n this.playbackWatcher_.on(eventName, metadata => {\n this.player_.trigger(_extends({}, metadata));\n });\n });\n }\n}\n/**\n * The Source Handler object, which informs video.js what additional\n * MIME types are supported and sets up playback. It is registered\n * automatically to the appropriate tech based on the capabilities of\n * the browser it is running in. It is not necessary to use or modify\n * this object in normal usage.\n */\n\nconst VhsSourceHandler = {\n name: 'videojs-http-streaming',\n VERSION: version$4,\n canHandleSource(srcObj, options = {}) {\n const localOptions = merge(videojs.options, options); // If not opting to experimentalUseMMS, and playback is only supported with MediaSource, cannot handle source\n\n if (!localOptions.vhs.experimentalUseMMS && !browserSupportsCodec('avc1.4d400d,mp4a.40.2', false)) {\n return false;\n }\n return VhsSourceHandler.canPlayType(srcObj.type, localOptions);\n },\n handleSource(source, tech, options = {}) {\n const localOptions = merge(videojs.options, options);\n tech.vhs = new VhsHandler(source, tech, localOptions);\n tech.vhs.xhr = xhrFactory();\n tech.vhs.setupXhrHooks_();\n tech.vhs.src(source.src, source.type);\n return tech.vhs;\n },\n canPlayType(type, options) {\n const simpleType = simpleTypeFromSourceType(type);\n if (!simpleType) {\n return '';\n }\n const overrideNative = VhsSourceHandler.getOverrideNative(options);\n const supportsTypeNatively = Vhs.supportsTypeNatively(simpleType);\n const canUseMsePlayback = !supportsTypeNatively || overrideNative;\n return canUseMsePlayback ? 'maybe' : '';\n },\n getOverrideNative(options = {}) {\n const {\n vhs = {}\n } = options;\n const defaultOverrideNative = !(videojs.browser.IS_ANY_SAFARI || videojs.browser.IS_IOS);\n const {\n overrideNative = defaultOverrideNative\n } = vhs;\n return overrideNative;\n }\n};\n/**\n * Check to see if either the native MediaSource or ManagedMediaSource\n * objectx exist and support an MP4 container with both H.264 video\n * and AAC-LC audio.\n *\n * @return {boolean} if native media sources are supported\n */\n\nconst supportsNativeMediaSources = () => {\n return browserSupportsCodec('avc1.4d400d,mp4a.40.2', true);\n}; // register source handlers with the appropriate techs\n\nif (supportsNativeMediaSources()) {\n videojs.getTech('Html5').registerSourceHandler(VhsSourceHandler, 0);\n}\nvideojs.VhsHandler = VhsHandler;\nvideojs.VhsSourceHandler = VhsSourceHandler;\nvideojs.Vhs = Vhs;\nif (!videojs.use) {\n videojs.registerComponent('Vhs', Vhs);\n}\nvideojs.options.vhs = videojs.options.vhs || {};\nif (!videojs.getPlugin || !videojs.getPlugin('reloadSourceOnError')) {\n videojs.registerPlugin('reloadSourceOnError', reloadSourceOnError);\n}\n\nexport { videojs as default };\n","import { type BoxProps, type MantineSize } from \"@mantine/core\";\nimport { getRadius } from \"@mantine/core\";\nimport cx from \"clsx\";\nimport { type FC } from \"react\";\nimport videojs from \"video.js\";\nimport type Player from \"video.js/dist/types/player\";\n\nimport classes from \"./VideoJS.module.css\";\nimport \"video.js/dist/video-js.css\";\n\nexport interface VideoJSProps extends BoxProps {\n options?: Record;\n radius?: MantineSize;\n onReady?: (player: Player) => void;\n}\n\nconst VideoJS: FC = ({\n options,\n radius = \"default\",\n className,\n style,\n onReady,\n ...otherProps\n}) => {\n const containerRef = useRef(null);\n const playerRef = useRef(null);\n\n useEffect(() => {\n // Make sure Video.js player is only initialized once\n if (!playerRef.current) {\n invariant(containerRef.current);\n\n // The Video.js player needs to be _inside_ the component el for React 18 Strict Mode.\n const videoEl = document.createElement(\"video-js\");\n videoEl.classList.add(\"vjs-big-play-centered\");\n containerRef.current.appendChild(videoEl);\n\n const player = videojs(videoEl, options, () => {\n onReady?.(player);\n });\n playerRef.current = player;\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Dispose the Video.js player when the functional component unmouGnts\n useEffect(() => {\n const player = playerRef.current;\n return () => {\n if (player && !player.isDisposed()) {\n player.dispose();\n playerRef.current = null;\n }\n };\n }, []);\n\n return (\n \n );\n};\n\nexport default VideoJS;\n"],"names":["i","o","l","d","r","c","m","f","p","g","k","h","b","L","e","s","M","t","F","j","z","u","n","a","win","global","window_1","topLevel","minDoc","require$$0","doccy","document_1","isFunction_1","isFunction","toString","fn","string","_createForOfIteratorHelperLoose","allowArrayLike","it","_unsupportedIterableToArray","minLen","_arrayLikeToArray","arr","len","arr2","InterceptorsStorage","_proto","type","interceptor","interceptorsSet","payload","interceptors","_iterator","_step","RetryManager","maxAttempts","delayFactor","fuzzFactor","initialDelay","_temp","_ref","Retry","options","_proto2","delayDelta","lowValue","highValue","retry","window","httpResponseHandler","callback","decodeResponseBody","err","response","responseBody","cause","charset","getCharset","contentTypeHeader","contentType","_contentType$split","value","httpHandler","_extends","require$$1","require$$2","require$$3","require$$4","createXHR","require$$5","parseHeaders","headers","result","row","index","key","libModule","noop","forEachArray","method","uri","initParams","_createXHR","array","iterator","isEmpty","obj","params","requestInterceptorPayload","updatedPayload","called","body","readystatechange","xhr","loadFunc","getBody","getXml","isJson","errorFunc","evt","timeoutTimer","aborted","responseInterceptorPayload","failureResponse","_updatedPayload","status","_updatedPayload2","sync","firefoxBugTakenEffect","document","_objCreate","ParsingError","errorData","message","parseTimeStamp","input","computeSeconds","Settings","v","dflt","defaultKey","parseOptions","keyValueDelim","groupDelim","groups","kv","parseCue","cue","regionList","oInput","consumeTimeStamp","ts","consumeCueSettings","settings","vals","vals0","skipWhitespace","TEXTAREA_ELEMENT","TAG_NAME","DEFAULT_COLOR_CLASS","TAG_ANNOTATION","NEEDS_PARENT","parseContent","nextToken","consume","unescape","shouldAdd","current","element","createElement","annotation","tagName","name","rootDiv","tagStack","node","classes","cl","bgColor","colorName","propName","propValue","strongRTLRanges","isStrongRTLChar","charCode","currentRange","determineBidi","cueDiv","nodeStack","text","pushNodes","nextTextNode","computeLinePos","track","trackList","count","StyleBox","styles","div","prop","val","unit","CueStyleBox","styleOptions","textPos","box","BoxPosition","lh","height","width","top","rects","axis","toMove","b2","boxes","container","x","y","intersectArea","reference","ret","moveBoxToLinePosition","styleBox","containerBox","boxPositions","findBestPosition","bestPosition","specifiedPosition","percentage","boxPosition","linePos","size","step","position","maxPosition","initialAxis","calculatedPercentage","WebVTT","data","cuetext","FONT_SIZE_PERCENT","FONT_STYLE","CUE_BACKGROUND_PADDING","cues","overlay","paddedOverlay","shouldCompute","fontSize","vttjs","decoder","self","collectNextLine","buffer","pos","line","parseRegion","xy","anchor","region","parseTimestampMap","parseHeader","alreadyCollectedLine","hasSubstring","vtt","autoKeyword","directionSetting","alignSetting","findDirectionSetting","dir","findAlignSetting","align","VTTCue","startTime","endTime","_id","_pauseOnExit","_startTime","_endTime","_text","_region","_vertical","_snapToLines","_line","_lineAlign","_position","_positionAlign","_size","_align","setting","vttcue","scrollSetting","findScrollSetting","scroll","isValidPercentValue","VTTRegion","_width","_lines","_regionAnchorX","_regionAnchorY","_viewportAnchorX","_viewportAnchorY","_scroll","vttregion","browserIndexModule","cueShim","regionShim","nativeVTTCue","nativeVTTRegion","DEFAULT_LOCATION","resolveUrl","baseUrl","relativeUrl","protocolLess","removeLocation","newUrl","Stream","listener","callbacks","length","args","_length","_i","destination","atob","decodeB64ToUint8Array","b64Text","decodedString","LineStream","nextNewline","TAB","parseByterange","byterangeString","match","attributeSeparator","keyvalue","parseAttributes","attributes","attrs","attr","parseResolution","resolution","split","ParseStream","event","acc","mapper","mappedLine","newLine","subkey","clientAttributePattern","isHexaDecimal","isDecimalFloating","expression","customType","dataParser","segment","map","mapFn","camelCase","str","camelCaseKeys","setHoldBack","manifest","serverControl","targetDuration","partTargetDuration","tag","hb","phb","minTargetDuration","minPartDuration","Parser","opts","uris","currentUri","currentMap","hasParts","defaultMediaGroups","widevineUuid","currentTimeline","lastByterangeEnd","lastPartByterangeEnd","dateRangeTags","entry","mediaGroup","rendition","def","byterange","mediaGroupType","lastProgramDateTime","programDateTime","segmentIndex","part","partIndex","hint","isPart","otherHint","report","required","dateRange","endOnNextYes","newDateInSeconds","attribute","dateRangeWithSameId","dateRangeToFind","addDef","currentVersion","targetVersion","identifier","missing","chunk","regexs","mediaTypes","upperMediaTypes","translateLegacyCodec","codec","orig","profile","avcLevel","profileHex","avcLevelHex","parseCodecs","codecString","codecs","codecType","details","codecsFromDefault","master","audioGroupId","audioGroup","audioType","isAudioCodec","isTextCodec","getMimeForCodec","browserSupportsCodec","withMMS","muxerSupportsCodec","DEFAULT_AUDIO_CODEC","DEFAULT_VIDEO_CODEC","MPEGURL_REGEX","DASH_REGEX","simpleTypeFromSourceType","countBits","countBytes","isArrayBufferView","isTypedArray","toUint8","bytes","BigInt","BYTE_TABLE","bytesToNumber","_ref$signed","signed","_ref$le","le","number","total","byte","exponent","max","numberToBytes","_temp2","_ref2","_ref2$le","byteCount","byteIndex","stringToBytes","stringIsBytes","view","concatTypedArrays","_len","buffers","_key","totalLen","buf","tempBuffer","offset","bytesMatch","_temp3","_ref3","_ref3$offset","_ref3$mask","mask","bByte","aByte","forEachMediaGroup","mediaType","groupKey","labelKey","mediaProperties","find","list","predicate","ac","item","freeze","object","oc","assign","target","source","MIME_TYPE","NAMESPACE","conventions","notEmptyString","splitOnASCIIWhitespace","orderedSetReducer","toOrderedSet","arrayIncludes","copy","src","dest","Class","Super","pt","NodeType","ELEMENT_NODE","ATTRIBUTE_NODE","TEXT_NODE","CDATA_SECTION_NODE","ENTITY_REFERENCE_NODE","ENTITY_NODE","PROCESSING_INSTRUCTION_NODE","COMMENT_NODE","DOCUMENT_NODE","DOCUMENT_TYPE_NODE","DOCUMENT_FRAGMENT_NODE","NOTATION_NODE","ExceptionCode","ExceptionMessage","HIERARCHY_REQUEST_ERR","NOT_FOUND_ERR","INUSE_ATTRIBUTE_ERR","DOMException","code","error","NodeList","isHTML","nodeFilter","serializeToString","LiveNodeList","refresh","_updateLiveList","inc","ls","__set__","NamedNodeMap","_findNodeIndex","_addNamedNode","el","newAttr","oldAttr","doc","_onRemoveAttribute","_onAddAttribute","_removeNamedNode","lastIndex","namespaceURI","localName","DOMImplementation","feature","version","qualifiedName","doctype","Document","root","publicId","systemId","DocumentType","Node","newChild","refChild","_insertBefore","oldChild","assertPreReplacementValidityInDocument","_removeChild","deep","cloneNode","child","next","prefix","_xmlEncoder","_visitNode","ns","remove","_onUpdateChild","cs","parentNode","previous","hasValidParentNodeType","hasInsertableNodeType","isElementNode","isTextNode","isDocTypeNode","isElementInsertionPossible","parentChildNodes","docTypeNode","isElementReplacementPossible","hasElementChildThatIsNotChild","assertPreInsertionValidity1to5","parent","assertPreInsertionValidityInDocument","nodeChildNodes","nodeChildElements","parentElementChild","_inDocumentAssertion","cp","newFirst","newLast","pre","_appendSingleChild","importedNode","importNode","id","rtv","classNames","classNamesSet","base","nodeClassNames","matches","nodeClassNamesSet","Element","DocumentFragment","Text","Comment","CDATASection","ProcessingInstruction","Attr","EntityReference","pl","old","CharacterData","start","end","newText","newNode","Notation","Entity","XMLSerializer","isHtml","nodeSerializeToString","refNode","visibleNamespaces","needNamespaceDefine","addSerializedAttribute","nodeName","prefixedNodeName","defaultNS","ai","nsi","namespace","pubid","sysid","sub","node2","attrs2","getTextContent","dom","exports","nameStartChar","nameChar","tagNamePattern","S_TAG","S_ATTR","S_ATTR_SPACE","S_EQ","S_ATTR_NOQUOT_VALUE","S_ATTR_END","S_TAG_SPACE","S_TAG_CLOSE","ParseError","locator","XMLReader","defaultNSMap","entityMap","domBuilder","_copy","parse","defaultNSMapCopy","errorHandler","fixedFromCharCode","surrogate1","surrogate2","entityReplacer","appendText","xt","lineEnd","linePattern","lineStart","parseStack","closeMap","tagStart","config","localNSMap","endMatch","endIgnoreCaseMach","parseInstruction","parseDCC","ElementAttributes","currentNSMap","parseElementStartPart","fixSelfClosed","locator2","copyLocator","appendElement","parseHtmlSpecialContent","addAttribute","qname","startIndex","attrName","qName","nsp","nsPrefix","elStartEnd","elEndStart","matchs","lastMatch","reg","sax","entities","normalizeLineEndings","DOMParser","mimeType","DOMHandler","buildErrorHandler","normalize","errorImpl","isCallback","build","msg","_locator","ins","ch","chars","_toString","charNode","comm","impl","dt","hander","domParser","isObject","merge","objects","values","range","flatten","lists","from","findIndexes","union","keyFunction","errors","urlTypeToSegment","indexRange","ranges","startRange","endRange","byteRangeToString","parseEndNumber","endNumber","segmentRange","duration","timescale","sourceDuration","periodDuration","segmentDuration","NOW","clientOffset","availabilityStartTime","periodStart","minimumUpdatePeriod","timeShiftBufferDepth","now","periodStartWC","segmentCount","availableStart","availableEnd","toSegments","startNumber","parseByDuration","segments","sectionDuration","segmentsFromBase","initialization","presentationTime","initSegment","segmentTimeInfo","addSidxSegmentsToPlaylist$1","playlist","sidx","timeline","sidxByteRange","sidxEnd","mediaReferences","endIndex","SUPPORTED_MEDIA_TYPES","TIME_FUDGE","getUniqueTimelineStarts","timelineStarts","findPlaylistWithName","playlists","getMediaGroupPlaylists","mediaGroupPlaylists","properties","group","label","updateMediaSequenceForPlaylist","mediaSequence","updateSequenceNumbers","oldPlaylists","newPlaylists","oldPlaylist","firstNewSegment","oldMatchingSegmentIndex","oldSegment","positionManifestOnTimeline","oldManifest","newManifest","generateSidxKey","mergeDiscontiguousPlaylists","playlistsByBaseUrl","cur","allPlaylists","playlistGroup","mergedPlaylists","addSidxSegmentsToPlaylist","sidxMapping","sidxKey","sidxMatch","addSidxSegmentsToPlaylists","formatAudioPlaylist","discontinuitySequence","discontinuityStarts","isAudioOnly","formatVttPlaylist","m3u8Attributes","vttPlaylist","organizeAudioPlaylists","mainPlaylist","formattedPlaylists","role","language","roleLabel","formatted","firstLabel","organizeVttPlaylists","organizeCaptionServices","captionServices","svcObj","svc","service","channel","formatVideoPlaylist","videoOnly","audioOnly","vttOnly","addMediaSequenceValues","flattenMediaGroupPlaylists","mediaGroupObject","labelContents","toM3u8","dashPlaylists","locations","contentSteering","previousManifest","eventStream","suggestedPresentationDelay","videoPlaylists","audioPlaylists","vttPlaylists","captions","organizedAudioGroup","organizedVttGroup","playlistTimelineStarts","getLiveRValue","time","parseByTimeline","segmentTimeline","media","sIndex","S","repeat","segmentTime","nextS","identifierPattern","identifierReplacement","format","constructTemplateUrl","url","parseTemplateInfo","segmentsFromTemplate","templateValues","mapSegment","presentationTimeOffset","SegmentURLToSegmentObject","segmentUrl","segmentsFromList","segmentUrls","segmentUrlMap","segmentUrlObject","generateSegments","segmentInfo","segmentAttributes","segmentsFn","segmentsInfo","toPlaylists","representations","findChildren","getContent","parseDivisionValue","prev","parseDuration","year","month","day","hour","minute","second","parseDate","parsers","parsedValue","parseFn","keySystemsMap","buildBaseUrls","references","baseUrlElements","baseUrlElement","initialBaseUrl","resolvedBaseUrl","finalBaseUrl","getSegmentInformation","adaptationSet","segmentTemplate","segmentList","segmentBase","segmentTimelineParentNode","segmentInitializationParentNode","segmentInitialization","template","inheritBaseUrls","adaptationSetAttributes","adaptationSetBaseUrls","adaptationSetSegmentInfo","representation","repBaseUrlElements","repBaseUrls","representationSegmentInfo","generateKeySystemInformation","contentProtectionNodes","keySystem","psshNode","pssh","parseCaptionServiceMetadata","flags","opt","toEventStream","period","eventStreamAttributes","schemeIdUri","eventAttributes","toRepresentations","periodAttributes","periodBaseUrls","periodSegmentInfo","roleAttributes","accessibility","labelVal","contentProtection","toAdaptationSets","mpdAttributes","mpdBaseUrls","adaptationSets","generateContentSteeringInformation","contentSteeringNodes","eventHandler","infoFromContentSteeringTag","getPeriodStart","priorPeriodAttributes","mpdType","inheritAttributes","mpd","manifestUri","periodNodes","periods","priorPeriod","stringToMpdXml","manifestString","parser","xml","parseUTCTimingScheme","UTCTimingNode","parsedManifestInfo","parseUTCTiming","MAX_UINT32","getUint64","uint8","dv","numbers","parseSidx","referenceCount","parseSidx_1","ID3","getId3Size","returnSize","footerPresent","getId3Offset","normalizePath","path","normalizePaths","paths","findBox","complete","results","EBML_TAGS","LENGTH_TABLE","getLength","getvint","removeLength","valueBytes","getInfinityDataSize","innerid","dataHeader","findEbml","dataStart","dataEnd","totalLength","NAL_TYPE_ONE","NAL_TYPE_TWO","EMULATION_PREVENTION","discardEmulationPreventionBytes","positions","newLength","newData","sourceIndex","findNal","dataType","types","nalLimit","nalStart","nalsFound","nalOffset","nalType","findH264Nal","findH265Nal","CONSTANTS","_isLikely","docType","isLikelyTypes","isLikelyFn","isLikely","detectContainerForBytes","isLikelyFmp4MediaSegment","ONE_SECOND_IN_TS","secondsToVideoTs","secondsToAudioTs","videoTsToSeconds","audioTsToSeconds","audioTsToVideoTs","videoTsToAudioTs","metadataTsToSeconds","seconds","sampleRate","timestamp","timelineStartPts","keepOriginalTimestamps","clock","version$6","hooks_","hooks","hook","removeHook","hookOnce","original","wrapper","FullscreenApi","apiMap","specApi","browserApi","document$1","history","LogByTypeFactory","log","level","lvl","lvlRegExp","resultName","splice","window$1","createLogger$1","delimiter","logByType","subName","subDelimiter","subStyles","resultDelimiter","resultStyles","newName","newDelimiter","newStyles","fname","historyItem","log$1","createLogger","keys","each","reduce","initial","accum","isPlain","merge$1","sources","defineLazyProperty","getValue","setter","set","Obj","IS_IPOD","IOS_VERSION","IS_ANDROID","ANDROID_VERSION","IS_FIREFOX","IS_EDGE","IS_CHROMIUM","IS_CHROME","CHROMIUM_VERSION","CHROME_VERSION","IS_CHROMECAST_RECEIVER","IE_VERSION","IS_SAFARI","IS_WINDOWS","IS_IPAD","IS_IPHONE","IS_TIZEN","IS_WEBOS","IS_SMART_TV","TOUCH_ENABLED","isReal","UAD","USER_AGENT","major","minor","IS_IOS","IS_ANY_SAFARI","browser","isNonBlankString","throwIfWhitespace","isEl","isInFrame","createQuerier","selector","context","ctx","createEl","content","textContent","appendContent","prependTo","hasClass","classToCheck","addClass","classesToAdd","removeClass","classesToRemove","toggleClass","classToToggle","className","setAttributes","attrValue","getAttributes","knownBooleans","attrVal","getAttribute","setAttribute","removeAttribute","blockTextSelection","unblockTextSelection","getBoundingClientRect","rect","computedStyle","findPosition","left","getPointerPosition","translated","transform","transformValue","matrix","boxTarget","boxW","boxH","offsetY","offsetX","emptyEl","normalizeContent","insertContent","isSingleLeftClick","$","$$","computedStyleValue","copyStyleSheetsToWindow","styleSheet","cssRules","rule","style","link","Dom","_windowLoaded","videojs$1","autoSetup","vids","audios","divs","mediaEls","mediaEl","autoSetupTimeout","wait","vjs","setWindowLoaded","createStyleElement","setTextContent","DomData","_initialGuid","_guid","newGUID","_cleanUpEvents","elem","_handleMultipleEvents","fixEvent","returnTrue","returnFalse","deprecatedProps","_supportsPassive","supportsPassive","passiveEvents","on","hash","handlers","handlersCopy","off","removeType","trigger","elemData","targetData","one","func","any","Events","UPDATE_REFRESH_INTERVAL","bind_","uid","bound","throttle","last","debounce$1","immediate","timeout","cancel","debounced","later","Fn","EVENT_MAP","EventTarget$2","ael","oldTimeout","objName","isEvented","addEventedCallback","isValidEventType","validateTarget","fnName","validateEventType","validateListener","normalizeListenArgs","isTargetingSelf","listen","EventedMixin","removeListenerOnDispose","removeRemoverOnTargetDispose","largs","targetOrType","typeOrListener","evented","eventBusKey","StatefulMixin","stateUpdates","changes","stateful","defaultState","toLowerCase","w","toTitleCase$1","titleCaseEquals","str1","str2","Str","Component$1","player","ready","tokens","defaultValue","languages","primaryCode","primaryLang","localizedString","names","currentChild","iconName","xmlnsURL","iconContainer","svgEl","useEl","component","componentName","componentClassName","ComponentClass","childFound","compEl","children","parentOptions","handleAdd","workingChildren","Tech","wchild","readyQueue","num","skipListeners","widthOrHeight","pxIndex","computedWidthOrHeight","boundingClientRect","center","touchStart","firstTouch","tapMovementThreshold","touchTimeThreshold","couldBeTap","xdiff","ydiff","noTap","touchHolding","touchEnd","timeoutId","interval","intervalId","idName","cancelName","isVisibleStyleProperty","elementStyle","thisVisibility","isBeingRendered","isVisible","elementCenter","pointContainer","ComponentToRegister","isTech","isComp","reason","Player","players","playerNames","pname","rangeCheck","maxIndex","getRange","valueIndex","rangeIndex","createTimeRangesObj","timeRangesObj","createTimeRanges$1","defaultImplementation","guide","gm","gh","implementation","setFormatTime","customImplementation","resetFormatTime","formatTime","Time","bufferedPercent","buffered","bufferedDuration","MediaError","isPromise","silencePromise","trackToJson_","textTracksToJson","tech","trackEls","trackObjs","trackEl","json","jsonToTextTracks","addedTrack","textTrackConverter","MODAL_CLASS_NAME","ModalDialog","desc","closeable","close","temp","contentEl","parentEl","nextSiblingEl","closeButton","activeEl","playerEl","focusableEls","focusIndex","allChildren","TrackList","tracks","rtrack","disableOthers$1","AudioTrackList","disableOthers","VideoTrackList","TextTrackList","HtmlTrackElementList","trackElements","trackElement","trackElement_","TextTrackCueList","oldLength","defineProp","VideoTrackKind","AudioTrackKind","TextTrackKind","TextTrackMode","Track","trackProps","newLabel","parseUrl","getAbsoluteURL","getFileExtension","pathParts","isCrossOrigin","winLoc","Url","parseCues","srcContent","loadTrack","crossOrigin","withCredentials","XHR","TextTrack","mode","default_","activeCues","changed","disposeHandler","newMode","ct","active","originalCue","removeCue","AudioTrack","enabled","newEnabled","VideoTrack","selected","newSelected","HTMLTrackElement","readyState","NORMAL","REMOTE","ALL","createTrackHelper","kind","props","numBufferedPercent","_isScrubbing","_seconds","trackListChanges","script","remoteTracks","handleAddTrack","handleRemoveTrack","updateDisplay","textTracksChanges","manualCleanup","htmlTrackElement","cb","override","_type","srcObj","_Tech","handler","can","sh","originalFn","middlewares","middlewareInstances","TERMINATOR","use","middleware","setSource","setSourceHelper","setTech","mw","get","middlewareIterator","arg","mediate","callMethod","middlewareValue","terminated","returnValue","executeRight","allowedGetters","allowedSetters","allowedMediators","mws","clearCacheForPlayer","getOrCreateFactory","mwFactory","mwf","mwi","lastRun","mwrest","_src","MimetypesKind","getMimetype","ext","findMimetype","matchingSources","filterSource","newsrc","srcobj","fixSource","mimetype","icons","backKeyCode","SpatialNavKeyCodes","keyName","STEP_SECONDS$1","SpatialNavigation","actualEvent","direction","action","nextFocusedElement","isChildrenOfPlayer","currentComponent","focusableComponents","searchForChildrenCandidates","componentsArray","buttonContainer","searchForSuitableChild","suitableChild","curComp","currentFocusedComponent","currentPositions","candidates","bestCandidate","currentCenter","minDistance","candidate","candidateCenter","distance","srcRect","targetRect","center1","center2","dx","dy","spatialNavigation","MediaLoader","options_","techName","ClickableComponent","localizedText","PosterImage","darkGray","lightGray","fontMap","constructColor","color","opacity","hex","tryUpdateStyle","getCSSPositionValue","TextTrackDisplay","updateDisplayTextHandler","updateDisplayHandler","screenOrientation","changeOrientationEvent","modes","userPref","firstDesc","firstCaptions","preferredTrack","allowMultipleShowingTracks","showingTracks","descriptionsTrack","captionsSubtitlesTrack","textTrackDisplay","vjsTextTrackCues","controlBarHeight","playerHeight","vjsTextTrackCue","insetStyles","playerWidth","playerAspectRatio","videoAspectRatio","insetInlineMatch","insetBlockMatch","overrides","cueEl","LoadingSpinner","isAudio","playerType","controlText","Button","BigPlayButton","playPromise","playToggle","playFocus","CloseButton","PlayToggle","TimeDisplay","span","oldNode","CurrentTimeDisplay","DurationDisplay","updateContent","TimeDivider","RemainingTimeDisplay","LiveDisplay","SeekToLive","clamp","min","Num","Slider","progress","sizeKey","spatialNavOptions","spatialNavEnabled","horizontalSeek","bool","percentify","LoadProgressBar","loadedText","separator","liveTracker","bufferedEnd","percent","TimeTooltip","seekBarRect","seekBarPoint","tooltipRect","playerRect","seekBarPointPx","spaceLeftOfPoint","spaceRightOfPoint","pullTooltipBy","liveWindow","secondsBehind","PlayProgressBar","timeTooltip","MouseTimeDisplay","STEP_SECONDS","PAGE_KEY_MULTIPLIER","SeekBar","shouldDisableSeekWhileScrubbingOnMobile","currentTime","mouseDown","newTime","seekableStart","seekableEnd","mouseTimeDisplay","gotoFraction","ProgressControl","seekBar","playProgressBar","seekBarEl","PictureInPictureToggle","FullscreenToggle","checkVolumeSupport","VolumeLevel","VolumeLevelTooltip","rangeBarRect","rangeBarPoint","vertical","volumeBarPointPx","volume","MouseVolumeLevelDisplay","VolumeBar","mouseVolumeLevelDisplay","volumeBarEl","volumeBarRect","volumeBarPoint","ariaValue","volumeBeforeDrag","VolumeControl","orientationClass","checkMuteSupport","MuteToggle","vol","lastVolume","volumeToSet","VolumePanel","SkipForward","playerOptions","currentVideoTime","SkipBackward","Menu","childComponent","contentElType","relatedTarget","btn","childComponents","foundComponent","stepChild","MenuButton","buttonClass","handleClick","menu","titleEl","titleComponent","menuButtonClass","TrackButton","updateHandler","MenuItem","menuItemEl","TextTrackMenuItem","changeHandler","selectedLanguageChangeHandler","referenceTrack","shouldBeSelected","selectedLanguage","OffTextTrackMenuItem","allHidden","TextTrackButton","items","TrackMenuItem","ChaptersTrackMenuItem","ChaptersButton","remoteTextTrackEl","mi","DescriptionsButton","disabled","SubtitlesButton","CaptionSettingsMenuItem","CaptionsButton","SubsCapsMenuItem","parentSpan","SubsCapsButton","AudioTrackMenuItem","AudioTrackButton","PlaybackRateMenuItem","rate","PlaybackRateMenuButton","rates","Spacer","CustomControlSpacer","ControlBar","ErrorDisplay","TextTrackSelect","optionText","optionId","option","TextTrackFieldset","legendElement","selects","selectConfig","selectClassName","guid","textTrackSelect","TextTrackSettingsColors","id_","ElFgColorFieldset","ElBgColorFieldset","ElWinColorFieldset","TextTrackSettingsFont","TrackSettingsControls","defaultsDescription","resetButton","doneButton","LOCAL_STORAGE_KEY$1","COLOR_BLACK","COLOR_BLUE","COLOR_CYAN","COLOR_GREEN","COLOR_MAGENTA","COLOR_RED","COLOR_WHITE","COLOR_YELLOW","OPACITY_OPAQUE","OPACITY_SEMI","OPACITY_TRANS","selectConfigs","parseOptionValue","getSelectedOptionValue","setSelectedOption","TextTrackSettings","textTrackSettingsColors","textTrackSettingsFont","trackSettingsControls","ttDisplay","ResizeManager","RESIZE_OBSERVER_AVAILABLE","debouncedHandler_","unloadListener_","defaults$1","LiveTracker","seekable","deltaTime","liveCurrentTime","isBehind","timeDiff","seekableEnds","seekableStarts","TitleBar","techEl","techAriaAttrs","techAriaAttr","defaults","TransientButton","sourcesetLoad","srcUrls","innerHTMLDescriptorPolyfill","dummy","docFrag","getDescriptor","priority","descriptor","getInnerHTMLDescriptor","firstSourceWatch","innerDescriptor","appendWrapper","appendFn","retval","srcDescriptorPolyfill","getSrcDescriptor","setupSourceset","srcDescriptor","oldSetAttribute","oldLoad","Html5","crossoriginTracks","nodes","nodesLength","removeNodes","textTracks","metadataTracksPreFullscreenState","takeMetadataTrackSnapshot","restoreTrackMode","storedTrack","lowerCaseType","eventName","elTracks","techTracks","listeners","removeOldTracks","removeTracks","found","clone","tagAttributes","settingsAttrs","loadstartFired","setLoadstartFired","triggerLoadstart","eventsToTrigger","isScrubbing","checkProgress","endFn","beginFn","video","srcUrl","sourceAttributes","sourceElement","sourceElements","videoPlaybackQuality","canControl","muted","playbackRate","TECH_EVENTS_RETRIGGER","TECH_EVENTS_QUEUE","BREAKPOINT_ORDER","BREAKPOINT_CLASSES","DEFAULT_BREAKPOINTS","closest","languagesToLower","playerOptionsCopy","parsedSVG","sprite","majorVersion","playerElIngest","divEmbed","deviceClassNames","defaultsStyleEl","head","links","linkEl","dimension","privDimension","parsedVal","ratio","aspectRatio","idClass","ratioParts","ratioMultiplier","titleTechName","camelTechName","autoplay","techOptions","TechClass","eventObj","safety","resolveMuted","previouslyMuted","restoreMuted","mutedPromise","promise","sourceElSources","sourceEls","matchingSourceEls","sourceObj","updateSourceCaches","playerSrc","eventSrc","techSrc","request","queued","timeWhenWaiting","timeUpdateListener","targetPlayer","isFs","resolve","isSrcReady","isSafariOrIOS","queue","q","percentAsDecimal","defaultMuted","isFS","oldValue","fullscreenOptions","reject","offHandler","fsOptions","isPiP","pipContainer","pipWindow","pipVideo","userActions","allowedInputTypes","hotkeys","fullscreenKey","keydownEvent","muteKey","playPauseKey","FSToggle","techs","findFirstPassingTechSourcePair","outerArray","innerArray","tester","outerChoice","innerChoice","foundSourceAndTech","flip","finder","isRetry","middlewareSource","stopListeningForErrors","sourceTech","currentTimeDisplay","durationDisplay","progressControl","remainingTimeDisplay","techAutoplay","newPoster","hookFunction","newErr","triggerSuppressedError","mouseInProgress","lastMoveX","lastMoveY","handleActivity","handleMouseMove","handleMouseDown","handleMouseUpAndMouseLeave","controlBar","inactivityTimeout","activityCheck","playerChildren","exitPromises","modal","currentBreakpoint","currentWidth","candidateBreakpoint","maxWidth","breakpoints","artist","artwork","description","poster","title","tt","baseOptions","tagOptions","dataSetup","childName","newRates","navigator","BASE_PLUGIN_NAME","PLUGIN_CACHE_KEY","pluginStorage","pluginExists","getPlugin","markPluginAsActive","triggerSetupEvent","before","createBasicPlugin","plugin","basicPluginWrapper","instance","createPluginFactory","PluginSubClass","Plugin","deprecate","warned","deprecateForMajor","oldName","VjsErrors","normalizeId","videojs","rootNode","PlayerComponent","nId","playerId","comp","QualityLevel","enable","QualityLevelList","qualityLevel","removed","version$5","initPlugin$1","originalPluginFn","qualityLevelList","qualityLevels","_resolveUrl","resolveManifestRedirect","req","logger","createTimeRanges","bufferedRangesToString","bufferedRangesStr","TIME_FUDGE_FACTOR","SAFE_TIME_DELTA","filterRanges","timeRanges","findRange","findNextRange","findGaps","bufferIntersection","bufferA","bufferB","arity","extents","printableRange","strArr","timeUntilRebuffer","timeRangesToArray","timeRangesList","isRangeDifferent","lastBufferedEnd","timeAheadOf","segmentDurationWithParts","getPartsAndSegments","si","pi","getLastParts","lastSegment","getKnownPartCount","preloadSegment","parts","preloadHints","partCount","liveEdgeDelay","main","backwardDuration","endSequence","forwardDuration","intervalDuration","expired","backward","forward","sumDurations","defaultDuration","durationList","durations","playlistEnd","useSafeLiveEnd","liveEdgePadding","lastSegmentEndTime","getMediaInfoForTime","startingSegmentIndex","startingPartIndex","exactManifestTimings","partsAndSegments","partAndSegment","canUseFudgeFactor","isExactlyAtTheEnd","isExtremelyCloseToTheEnd","isExcluded","isIncompatible","isEnabled","excluded","isDisabled","isAes","hasAttribute","estimateSegmentRequestTime","bandwidth","bytesReceived","isLowestEnabledRendition","currentBandwidth","playlistMatch","someAudioVariant","AUDIO","groupName","variant","CODECS","Playlist","createPlaylistID","groupID","parseManifest","onwarn","oninfo","customTagParsers","customTagMappers","llhls","customParser","setupMediaPlaylist","setupMediaPlaylists","resolveMediaGroupUris","mainForMedia","addPropertiesToMain","createGroupID","phonyUri","audioOnlyMain","groupId","DateRangesStorage","firstSegment","dateRanges","pendingDateRange","dateRangeClasses","dateRangesToProcess","classList","QUOTA_EXCEEDED_ERR","getStreamingNetworkErrorMetadata","requestType","parseFailure","isBadStatus","isFailure","errorMetadata","isBadStatusOrParseFailure","errorType","EventTarget$1","addLLHLSQueryDirectives","parameters","nextMSN","nextPart","parsedUri","updateSegment","updateSegments","update","oldSegments","newSegments","newIndex","newSegment","resolveSegmentUris","baseUri","getAllSegments","isPlaylistUnchanged","updateMain$1","newMedia","unchangedCheck","oldMedia","mergedPlaylist","refreshDelay","lastPart","lastDuration","playlistMetadataPayload","isLive","renditions","BANDWIDTH","RESOLUTION","PlaylistLoader","vhs","vhsOptions","mediaPlaylist","availableDateRanges","startingState","playlistString","playlistObject","metadata","oldRequest","shouldDelay","delay","mediaChange","mainPlaylistRef","isUpdate","pathway","oldPlaylistUri","oldPlaylistId","newPlaylistUri","newPlaylistId","updatedPlaylist","oldMediaPlaylist","basePlaylist","playlistId","baseID","newUri","newPlaylistID","newMediaPlaylist","newProps","baseURI","oldAttributes","keyIds","keysystem","keyId","callbackWrapper","reqResponse","callAllRequestHooks","requestSet","newOptions","requestCallback","callAllResponseHooks","responseSet","responseCallback","xhrFactory","XhrFunction","beforeRequest","_requestCallbackSet","_responseCallbackSet","xhrMethod","beforeRequestOptions","originalAbort","byterangeStr","byterangeEnd","byterangeStart","segmentXhrHeaders","textRange","formatHexString","formatAsciiString","createTransferableMessage","transferable","initSegmentId","segmentKeyId","hexDump","ascii","tagDump","textRanges","utils","SEGMENT_END_FUDGE_PERCENT","playerTimeToProgramTime","playerTime","transmuxerPrependedSeconds","startOfSegment","offsetFromSegmentStart","originalSegmentVideoDuration","videoTimingInfo","findSegmentForProgramTime","programTime","dateTimeObject","nextSegmentStart","lastSegmentStart","lastSegmentDuration","lastSegmentEnd","findSegmentForPlayerTime","segmentEnd","getOffsetFromTimestamp","comparisonTimeStamp","segmentDateTime","segmentTimeEpoch","verifyProgramDateTimeTags","getProgramTime","matchedSegment","programTimeObject","seekToProgramTime","retryCount","seekTo","pauseAfterSeek","mediaOffset","seekToTime","seekedCallback","callbackOnCompleted","containerRequest","id3Offset","finished","endRequestAndCallback","_bytes","progressListener","newPart","loaded","EventTarget","dashPlaylistUnchanged","aSegment","bSegment","aByterange","bByterange","dashGroupId","parseMainXml","mainXml","removeOldMediaGroupLabels","newMain","updateMain","oldMain","noChanges","playlistUpdate","equivalentSidx","compareSidxEntry","oldSidxMapping","newSidxMapping","currentSidxInfo","savedSidxInfo","filterChangedSidxMappings","mediaGroupSidx","DashPlaylistLoader","srcUrlOrPlaylist","mainPlaylistLoader","fin","REQUEST_TYPE","sidxContainer","sidxChanged","isFinalRendition","mainChanged","done","utcTiming","serverTime","location","endList","parsedManifest","mpl","mup","mediaID","mediaChanged","createMediaUpdateTimeout","metadataArray","eventStreamNode","defaultKID","Config","stringToArrayBuffer","browserWorkerPolyFill","workerObj","createObjectURL","blob","factory","objectUrl","worker","terminate","getWorkerString","workerCode$1","commonjsGlobal","Stream$8","flushSource","stream","MAX_UINT32$1","getUint64$5","dinf","esds","ftyp","mdat","mfhd","minf","moof","moov","mvex","mvhd","trak","tkhd","mdia","mdhd","hdlr","sdtp","stbl","stsd","traf","trex","trun$1","MAJOR_BRAND","MINOR_VERSION","AVC1_BRAND","VIDEO_HDLR","AUDIO_HDLR","HDLR_TYPES","VMHD","SMHD","DREF","STCO","STSC","STSZ","STTS","sequenceNumber","trackFragments","samples","videoSample","audioSample","sps","pps","sequenceParameterSets","pictureParameterSets","avc1Box","hSpacing","vSpacing","trackFragmentHeader","trackFragmentDecodeTime","trackFragmentRun","sampleDependencyTable","dataOffset","upperWordBaseMediaDecodeTime","lowerWordBaseMediaDecodeTime","audioTrun","videoTrun","trunHeader","durationPresent","sizePresent","flagsPresent","compositionTimeOffset","bytesOffest","header","sample","mp4Generator","fileType","movie","groupNalsIntoFrames","nalUnits","currentNal","currentFrame","frames","groupFramesIntoGops","currentGop","gops","extendFirstKeyFrame","createDefaultSample","sampleForFrame","frame","generateSampleTable$1","baseDataOffset","concatenateNalData","nalsByteLength","numberOfNals","totalByteLength","generateSampleTableForFrame","concatenateNalDataForFrame","frameUtils$1","highPrefix","lowPrefix","zeroFill","makeTable","metaTable","silence","silence_1","coneOfSilence","ONE_SECOND_IN_TS$4","clock$2","clock$1","sumFrameByteLengths","currentObj","sum","prefixWithSilence","audioAppendStartTs","videoBaseMediaDecodeTime","baseMediaDecodeTimeTs","frameDuration","audioGapDuration","audioFillFrameCount","audioFillDuration","silentFrame","firstFrame","trimAdtsFramesByEarliestDts","adtsFrames","earliestAllowedDts","generateSampleTable","concatenateFrameData","audioFrameUtils$1","ONE_SECOND_IN_TS$3","collectDtsInfo","clearDtsInfo","calculateTrackBaseMediaDecodeTime","baseMediaDecodeTime","scale","minSegmentDts","trackDecodeInfo$1","USER_DATA_REGISTERED_ITU_T_T35","RBSP_TRAILING_BITS","parseSei","payloadType","payloadSize","userIdentifier","parseUserData","sei","parseCaptionPackets","pts","userData","discardEmulationPreventionBytes$1","emulationPreventionBytesPositions","captionPacketParser","Stream$7","cea708Parser","CaptionStream$2","Cea608Stream","Cea708Stream","cc","newCaptionPackets","flushType","idx","packet","ccStream","CHARACTER_TRANSLATION_708","get708CharFromCode","newCode","within708TextBlock","Cea708Window","windowNum","Cea708Service","serviceNum","encoding","beforeRowOverflow","captionServiceEncodings","serviceProps","serviceName","byte0","byte1","packet708","packetData","blockSize","isExtended","isMultiByte","extended","currentByte","nextByte","char","charCodeArray","toHexString","byteArray","unicode","firstByte","secondByte","winAttr","displayedText","winId","penAttr","penColor","penLoc","CHARACTER_TRANSLATION","getCharFromCode","BOTTOM_ROW","ROWS","createDisplayBuffer","field","dataChannel","swap","char0","char1","indentations","logWarning","newBaseRow","baseRow","captionStream","streamTypes","Stream$6","MAX_TS","RO_THRESH","TYPE_SHARED","handleRollover$1","TimestampRolloverStream$1","lastDTS","referenceDTS","timestampRolloverStream","typedArrayIndexOf$1","typedArray","fromIndex","currentIndex","typedArrayIndexOf","textEncodingDescriptionByte","percentEncode$1","parseUtf8","parseIso88591$1","parseSyncSafeInteger$1","frameParsers","mimeTypeEndIndex","descriptionEndIndex","LINK_MIME_TYPE","parseId3Frames$1","frameSize","frameHeader","frameStart","tagSize","hasExtendedHeader","parseId3","Stream$5","StreamTypes$3","id3","MetadataStream","bufferSize","metadataStream","Stream$4","CaptionStream$1","StreamTypes$2","TimestampRolloverStream","TransportPacketStream","TransportParseStream","ElementaryStream","MP2T_PACKET_LENGTH$1","SYNC_BYTE$1","bytesInBuffer","everything","parsePsi","parsePat","parsePmt","psi","pat","pmt","sectionLength","tableEnd","programInfoLength","streamType","pid","segmentHadPmt","audio","timedMetadata","programMapTable","parsePes","pes","ptsDtsFlags","startPrefix","flushStream","forceFlush","packetFlushable","fragment","m2ts$1","m2ts_1","Stream$3","ONE_SECOND_IN_TS$2","AdtsStream$1","ADTS_SAMPLING_FREQUENCIES$1","handlePartialSegments","frameNum","frameLength","protectionSkipBytes","oldBuffer","sampleCount","adtsFrameDuration","skip","adts","ExpGolomb$1","workingData","workingBytesAvailable","workingWord","workingBitsAvailable","workingBytes","availableBytes","skipBytes","bits","valu","leadingZeroCount","clz","expGolomb","Stream$2","ExpGolomb","H264Stream$1","NalByteStream","PROFILES_WITH_OPTIONAL_SPS_DATA","syncPoint","swapBuffer","nalByteStream","trackId","currentPts","currentDts","readSequenceParameterSet","skipScalingList","expGolombDecoder","lastScale","nextScale","deltaScale","frameCropLeftOffset","frameCropRightOffset","frameCropTopOffset","frameCropBottomOffset","profileIdc","levelIdc","profileCompatibility","chromaFormatIdc","picOrderCntType","numRefFramesInPicOrderCntCycle","picWidthInMbsMinus1","picHeightInMapUnitsMinus1","frameMbsOnlyFlag","scalingListCount","sarRatio","aspectRatioIdc","h264","ADTS_SAMPLING_FREQUENCIES","parseId3TagSize","isLikelyAacData$1","parseSyncSafeInteger","percentEncode","parseIso88591","parseAdtsSize","lowThree","middle","highTwo","parseType$5","parseSampleRate","parseAacTimestamp","owner","Stream$1","aacUtils","AacStream$1","timeStamp","bytesLeft","tempLength","aac","AUDIO_PROPERTIES$1","audioProperties","VIDEO_PROPERTIES$1","videoProperties","mp4","frameUtils","audioFrameUtils","trackDecodeInfo","m2ts","AdtsStream","H264Stream","AacStream","isLikelyAacData","ONE_SECOND_IN_TS$1","AUDIO_PROPERTIES","VIDEO_PROPERTIES","VideoSegmentStream","AudioSegmentStream","Transmuxer","CoalesceStream","retriggerForStream","addPipelineLogRetriggers","transmuxer","pipeline","arrayEquals","generateSegmentTimingInfo","startDts","startPts","endDts","endPts","prependedContentDuration","ptsOffsetFromDts","decodeDuration","presentationDuration","earliestDts","videoClockCyclesOfSilencePrefixed","gopsToAlignWith","nalUnit","gopForFusion","firstGop","lastGop","alignedGops","gop","halfSecond","allowableOverlap","nearestDistance","dtsDistance","nearestGopObj","currentGopObj","alignIndex","gopIndex","byteLength","nalCount","alignEndIndex","matchFound","trimIndex","newGopsToAlignWith","output","caption","hasFlushed","videoTrack","audioTrack","timelineStartInfo","id3Frame","isAac","toUnsigned$3","toHexString$1","bin","parseType$4","parseType_1","toUnsigned$2","parseType$3","findBox$5","subresults","findBox_1","toUnsigned$1","getUint64$4","tfdt","parseTfdt$3","tfhd","baseDataOffsetPresent","sampleDescriptionIndexPresent","defaultSampleDurationPresent","defaultSampleSizePresent","defaultSampleFlagsPresent","durationIsEmpty","defaultBaseIsMoof","parseTfhd$2","getUint64$3","parseSampleFlags$1","parseSampleFlags_1","parseSampleFlags","trun","dataOffsetPresent","firstSampleFlagsPresent","sampleDurationPresent","sampleSizePresent","sampleFlagsPresent","sampleCompositionTimeOffsetPresent","parseTrun$2","numberHelpers","getUint64$2","inspectMp4","textifyMp4","parseMp4Date","parseType$2","findBox$4","nalParse","avcStream","avcView","numOfSequenceParameterSets","numOfPictureParameterSets","nalSize","entryCount","ab","inspectedMp4","depth","indent","mp4Inspector","uint8ToCString$1","curChar","retString","uint8ToCString","getUint64$1","parseEmsgBox","boxData","scheme_id_uri","presentation_time","presentation_time_delta","event_duration","message_data","emsgBox","isValidEmsgBox","scaleTime","timeDelta","emsg","hasScheme","isValidV0Box","isDefined","isValidV1Box","emsg$1","toUnsigned","findBox$3","parseType$1","parseTfhd$1","parseTrun$1","parseTfdt$2","compositionStartTime","getVideoTrackIds","getTracks","getTimescaleFromMediaHeader$1","getEmsgID3","window$2","parseId3Frames","init","traks","trafs","lowestTime","baseTime","timescales","trafBoxes","parsedTfhd","parsedTfdt","parsedTrun","videoTrackIds","hdlrs","tkhds","handlerType","tkhdVersion","sampleDescriptions","codecBox","codecConfig","codecConfigType","segmentData","emsgBoxes","parsedBox","parsedId3Frames","probe$2","parseTrun","findBox$2","getMdatTrafPairs$2","mdats","mdatTrafPairs","matchingTraf","parseSamples$2","truns","defaultSampleDuration","defaultSampleSize","allSamples","trackRun","CaptionStream","findBox$1","parseTfdt$1","parseTfhd","getMdatTrafPairs$1","parseSamples$1","mapToSample","approximateOffset","findSeiNals","seiNal","lastMatchedSample","matchingSample","parseCaptionNals","videoTrackId","captionNals","pair","headerInfo","parseEmbeddedCaptions","trackNals","CaptionParser","isInitialized","segmentCache","parsedCaptions","parsingPartial","parsedData","cachedSegment","nals","nal","captionParser","parseTfdt","getTimescaleFromMediaHeader","parseSamples","getMdatTrafPairs","webvttParser","vttCues","mdatBox","trafBox","tfdtBox","tfhdBox","trunBoxes","mdatOffset","UTF_8","textDecoder","sampleData","vttcBox","paylBox","sttgBox","cueText","StreamTypes$1","parsePid","parsePayloadUnitStartIndicator","parseAdaptionField","parseType","pmtPid","pusi","payloadOffset","parsePesType","parsePesTime","parseNalUnitType","videoPacketContainsKeyFrame","frameBuffer","frameI","frameSyncPoint","foundKeyFrame","probe$1","StreamTypes","handleRollover","probe","MP2T_PACKET_LENGTH","SYNC_BYTE","parsePsi_","table","parseAudioPes_","pesType","parsed","endLoop","parseVideoPes_","firstKeyFrame","adjustTimestamp_","baseTimestamp","audioBaseTimestamp","info","videoBaseTimestamp","inspectAac_","audioCount","audioTimescale","inspectTs_","inspect","isAacData","tsInspector","wireTransmuxerEvents","initArray","gopInfo","timingInfo","videoSegmentTimingInfo","audioSegmentTimingInfo","trackInfo","audioTimingInfo","MessageHandlers","id3Frames","baseStartTime","tsStartTime","timeInfo","timestampOffset","TransmuxWorker","handleData_","transmuxedData","captionStreams","videoFrameDtsTime","videoFramePtsTime","handleDone_","handleGopInfo_","processTransmux","audioAppendStart","remux","onData","onTrackInfo","onAudioTimingInfo","onVideoTimingInfo","onVideoSegmentTimingInfo","onAudioSegmentTimingInfo","onId3","onCaptions","onDone","onEndedTimeline","onTransmuxerLog","isEndOfTimeline","triggerSegmentEventFn","waitForEndedTimelineEvent","handleMessage","dequeue","handleError","segmentInfoPayload","byteOffset","processAction","enqueueAction","reset","endTimeline","transmux","createTransmuxer","term","segmentTransmuxer","workerCallback","endAction","listenForEndEvent","isArrayBuffer","transfers","REQUEST_ERRORS","WEB_VTT_CODEC","abortAll","activeXhrs","getRequestStats","getProgressStats","progressEvent","stats","handleErrors","handleKeyResponse","finishProcessingFn","errorObj","keyInfo","initMp4Text","parseMp4TextSegment","doneFn","mp4VttCues","parseInitSegment","handleInitSegmentResponse","parseError","handleSegmentResponse","responseType","newBytes","transmuxAndNotify","trackInfoFn","timingInfoFn","videoSegmentTimingInfoFn","audioSegmentTimingInfoFn","id3Fn","captionsFn","endedTimelineFn","dataFn","fmp4Tracks","isMuxed","audioStartFn","audioEndFn","videoStartFn","videoEndFn","finish","dispatchType","probeResult","handleSegmentBytes","bytesAsUint8Array","finishLoading","emsgData","decrypt","encryptedBytes","decryptionWorker","decryptionHandler","decrypted","decryptError","keyBytes","decryptSegment","decryptedBytes","waitForCompletion","didError","segmentFinish","handleLoadEnd","loadendState","abortFn","handleProgress","progressFn","mediaSegmentRequest","xhrOptions","keyRequestOptions","keyRequestCallback","keyXhr","mapKeyRequestOptions","mapKeyRequestCallback","mapKeyXhr","initSegmentOptions","initSegmentRequestCallback","initSegmentXhr","segmentRequestOptions","segmentRequestCallback","segmentXhr","activeXhr","logFn$1","getCodecs","mediaAttributes","isMaat","unwrapCodecList","codecList","codecCount","codecObj","codecsForPlaylist","codecInfo","defaultCodecs","logFn","representationToString","safeGetComputedStyle","property","stableSort","sortFn","newArray","right","cmp","comparePlaylistBandwidth","leftBandwidth","rightBandwidth","comparePlaylistResolution","leftWidth","rightWidth","simpleSelector","playerBandwidth","limitRenditionByPlayerDimensions","playlistController","sortedPlaylistReps","rep","enabledPlaylistReps","bandwidthPlaylistReps","highestRemainingBandwidthRep","bandwidthBestRep","chosenRep","haveResolution","resolutionBestRepList","resolutionBestRep","resolutionPlusOneList","resolutionPlusOneSmallest","resolutionPlusOneRep","leastPixelDiffRep","leastPixelDiffList","lastBandwidthSelector","pixelRatio","movingAverageBandwidthSelector","decay","average","lastSystemBandwidth","minRebufferMaxBandwidthSelector","syncController","compatiblePlaylists","enabledPlaylists","rebufferingEstimates","numRequests","rebufferingImpact","noRebufferingPlaylists","estimate","lowestBitrateCompatibleVariantSelector","concatSegments","segmentObj","compactSegmentUrlDescription","resolvedUri","createCaptionsTrackIfNotExists","inbandTextTracks","instreamId","captionService","addCaptionData","captionArray","Cue","deprecateOldCue","addMetadata","videoDuration","metadataTrack","cuesArray","cuesGroupedByStartTime","timeSlot","sortedStartTimes","cueGroup","finiteDuration","nextTime","dateRangeAttr","dateRangeKeysToOmit","addDateRangeMetadata","createMetadataTrackIfNotExists","removeCuesFromTrack","removeDuplicateCuesFromTrack","uniqueCues","cueKey","gopsSafeToAlignWith","mapping","currentTimePts","updateGopBuffer","replace","removeGopBuffer","updatedBuffer","shallowEqual","akeys","bkeys","getSyncSegmentCandidate","targetTime","timelineSegments","MIN_BACK_BUFFER","CHECK_BUFFER_DELAY","finite","MIN_SEGMENT_DURATION_TO_SAVE_STATS","illegalMediaSwitch","loaderType","startingMedia","safeBackBufferTrimTime","trimTime","maxTrimTime","segmentInfoString","seq","segmentLen","selection","hasPartIndex","zeroBasedPartCount","timingInfoPropertyForMedia","timestampOffsetForSegment","overrideCheck","shouldWaitForTimelineChange","timelineChangeController","audioDisabled","lastMainTimelineChange","pendingAudioTimelineChange","shouldFixBadTimelineChanges","pendingMainTimelineChange","hasPendingTimelineChanges","differentPendingChanges","isAudioTimelineBehind","segmentLoader","checkAndFixTimelines","mediaDuration","timingInfos","maxDuration","typeTimingInfo","segmentTooLong","getTroublesomeSegmentDurationMessage","sourceType","isSegmentWayTooLong","isSegmentSlightlyTooLong","segmentTooLongMessage","isEncrypted","isMediaInitialization","SegmentLoader","newState","requestId","hasAudio","hasVideo","storedMap","storedKey","newPlaylist","oldId","mediaSequenceDiff","mediaIndex","isFmp4","force","removesRemaining","removeFinished","appendedLastSegment","appendedLastPart","bufferedTime","preloaded","haveEnoughBuffer","syncInfo","mediaInfoForTime","nextSegment","hasIndependentSegments","lastSegmentLastPart","ended","finalTargetTime","mediaSequenceSyncInfo","nextMediaSequenceSyncInfo","independent","isSyncRequest","forceTimestampOffset","audioBufferedEnd","measuredBandwidth","requestTimeRemaining","timeUntilRebuffer$1","switchCandidate","timeSavedBySwitching","minimumTimeSaving","simpleSegment","timeType","timingInfoProperty","captionData","captionTracks","captionTrack","trackName","callQueue","fun","loadQueue","useVideoTimingInfo","firstVideoFrameTimeForData","audioBuffered","videoBuffered","audioBufferStart","audioBufferEnd","videoBufferStart","videoBufferEnd","timeToRemoveUntil","segmentTimingInfo","isEndOfStream","isWalkingForward","isDiscontinuity","removeToTime","previousSegment","iv","timelineMapping","currentStart","currentVideoTimestampOffset","waitForVideo","waitForAudio","illegalMediaSwitchError","didChange","prioritizedTimingInfo","segmentDurationMessage","badSegmentGuess","badPartGuess","segmentProcessingTime","segmentProcessingThroughput","toTitleCase","bufferTypes","updating","sourceUpdater","sourceBuffer","nextQueueIndexOfType","queueEntry","shiftQueue","queueIndex","cleanupBuffer","titleType","inSourceBuffers","mediaSource","actions","onError","mime","newCodecBase","oldCodec","pushQueue","onUpdateend","bufferedRangesForType","descriptiveString","SourceUpdater","que","uint8ToUtf8","uintArray","bufferToHexString","uInt8Buffer","VTT_LINE_TERMINATORS","NoVttJsError","VTTSegmentLoader","combinedByteLength","combinedSegment","checkTimestampOffset","isMp4WebVttSegmentWithCues","isVttType","isTextResult","vttCue","cueSetting","keyValString","decodeBytesToString","mapData","mappingObj","MPEGTS","LOCAL","diff","firstStart","lastStart","valueIn90khz","referenceIn90khz","findAdCue","mediaTime","updateAdCues","adOffset","adTotal","SyncInfo","appended","SyncInfoData","segmentSyncInfo","partsSyncInfo","partSyncInfo","MediaSequenceSync","syncInfoData","startingMediaSequence","startingTime","newStorage","newDiagnostics","currentMediaSequence","prevSyncInfoData","segmentStart","segmentIsAppended","currentPartStart","partStart","partEnd","partIsAppended","fallback","minMediaSequenceFromStorage","DependantMediaSequenceSync","MAX_MEDIA_SEQUENCE_DIFF_FOR_SYNC","syncPointStrategies","mediaSequenceSync","lastDistance","datetimeMapping","discontinuity","discontinuitySync","SyncController","syncPoints","syncPointInfo","strategy","selectedSegment","bestSyncPoint","bestDistance","bestStrategy","newDistance","lastRemovedSegment","playlistTimestamp","shouldSaveTimelineMapping","didCalculateSegmentTimeMapping","dateTime","mediaIndexDiff","accuracy","TimelineChangeController","to","workerCode","unpad","padded","precompute","tables","encTable","decTable","sbox","sboxInv","xInv","th","x2","x4","x8","tEnc","tDec","aesTables","AES","tmp","keyLen","rcon","encKey","decKey","encrypted0","encrypted1","encrypted2","encrypted3","out","a2","c2","nInnerRounds","kIndex","table0","table1","table2","table3","AsyncStream","job","ntoh","word","encrypted","initVector","encrypted32","decipher","decrypted32","init0","init1","init2","init3","wordIx","Decrypter","audioTrackKind_","stopLoaders","startLoaders","playlistLoader","onGroupChanged","mainSegmentLoader","activeTrack","activeGroup","previousActiveLoader","lastGroup","onGroupChanging","onTrackChanged","lastTrack","pc","excludePlaylist","defaultTrack","setupListeners","requestOptions","initialize","mediaGroups","logger_","variantLabel","groupMatch","variants","groupKeys","groupPropertyList","getActiveGroup","activeTrack_","setupMediaGroups","audioSegmentLoader","onAudioTrackChanged","createMediaTypes","SteeringManifest","ContentSteeringController","steeringTag","steeringUri","reloadUri","errorInfo","retrySeconds","steeringManifestJson","parsedMetadata","steeringUrl","steeringUrlObject","proxyServerUrlObject","dataUri","urlObject","networkThroughput","pathwayKey","throughputKey","steeringJson","nextPathway","pathwaysByPriority","proxyURI","steeringURI","ttl","ttlMS","baseURL","newTag","debounce","ABORT_EARLY_EXCLUSION_SECONDS","Vhs$1","loaderStats","sumLoaderStat","stat","shouldSwitchToMedia","currentPlaylist","nextPlaylist","bufferLowWaterLine","bufferHighWaterLine","bufferBasedABR","sharedLogLine","isBuffered","forwardBuffer","maxBufferLowWaterLine","nextBandwidth","currBandwidth","logLine","PlaylistController","externVhs","useCueTags","playlistExclusionDuration","enableLowInitialPlaylist","cacheEncryptionKeys","leastPixelDiffSelector","experimentalUseMMS","maxPlaylistRetries","segmentLoaderSettings","onLoad","getBandwidth","timeToLoadedDataStart","newId","dashMediaPlaylists","defaultPlaylists","defaultGroup","requestTimeout","selectedMedia","defaultDemuxed","audioGroupKeys","updateCodecs","startPoint","mainMediaInfo","absolutePlaylistEnd","playlistToExclude","reIncludeDelay","reincluded","excludeUntil","errorMessage","delayDuration","filter","fnNames","loaders","dontFilterPlaylist","loader","calculatedEnd","mainSeekable","audioSeekable","mainStart","mainEnd","audioStart","audioEnd","oldSeekable","usingAudioLoader","hasMainMediaInfo","hasAudioMediaInfo","playlistCodecs","supportFunction","unsupportedCodecs","unsupportedAudio","supporter","switchMessages","newCodec","ids","unsupported","codecCount_","videoDetails","audioDetails","exclusionReasons","variantCodecs","variantCodecCount","variantVideoDetails","variantAudioDetails","newMax","availablePathways","newPathways","serviceLocation","currentPathway","didEnablePlaylists","pathwayId","differentPathwayId","noExcludeUntil","currentPathwayClones","nextPathwayClones","oldClone","aParams","bParams","nonUsableKeyStatusCount","NON_USABLE","keyIdSet","USABLE","hasUsableKeyStatus","nonUsableExclusion","isNonHD","excludedForNonUsableKey","formattedKeyIdString","enableFunction","playlistID","changePlaylistFn","incompatible","currentlyEnabled","Representation","vhsHandler","qualityChangeFunction","renditionSelectionMixin","timerCancelEvents","PlaybackWatcher","playHandler","canPlayHandler","waitingHandler","cancelTimerHandler","loaderTypes","loaderChecks","setSeekingHandlers","isBufferedDifferent","isAfterSeekableRange","minAppendedDuration","bufferedToCheck","nextRange","livePoint","allowSeeksWithinUnsafeLiveWindow","allowedEnd","isLLHLS","gap","lastVideoRange","videoRange","audioRange","scheduledCurrentTime","gaps","defaultOptions","initPlugin","lastCalled","localOptions","loadedMetadataHandler","cleanupEvents","reinitPlugin","reloadSourceOnError","version$4","version$3","version$2","version$1","Vhs","LOCAL_STORAGE_KEY","handleVhsMediaChange","selectedIndex","handleVhsLoadedMetadata","emeKeySystems","keySystemOptions","audioPlaylist","videoContentType","audioContentType","keySystemContentTypes","getAllPsshKeySystemsOptions","keySystems","keySystemsArr","keySystemsOptions","keySystemsObj","waitForKeySessionCreation","sourceKeySystems","audioMedia","mainPlaylists","keySystemsOptionsArr","initializationFinishedPromises","keySessionCreatedPromises","setupEmeOptions","sourceOptions","getVhsLocalStorage","storedObject","updateVhsLocalStorage","objectToStore","expandDataUri","addOnRequestHook","addOnResponseHook","removeOnRequestHook","removeOnResponseHook","canItPlay","Component","VhsHandler","_player","fullscreenElement","customPixelRatio","playbackWatcherOptions","defaultSelector","selectPlaylist","throughput","playerBandwidthEst","networkInformation","tenMbpsAsBitsPerSecond","networkInfoBandwidthEstBitsPerSec","invBandwidth","invThroughput","audioPlaylistLoader","didSetupEmeOptions","playlistControllerEvents","playbackWatcher","VhsSourceHandler","simpleType","overrideNative","defaultOverrideNative","supportsNativeMediaSources","VideoJS","radius","onReady","otherProps","containerRef","useRef","playerRef","useEffect","invariant","videoEl","jsx","Box","cx","getRadius"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35]}