element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var scriptEl = global.document.createElement('script');\n scriptEl.onreadystatechange = function () {\n nextTick();\n\n scriptEl.onreadystatechange = null;\n scriptEl.parentNode.removeChild(scriptEl);\n scriptEl = null;\n };\n global.document.documentElement.appendChild(scriptEl);\n };\n } else {\n scheduleDrain = function () {\n setTimeout(nextTick, 0);\n };\n }\n}\n\nvar draining;\nvar queue = [];\n//named nextTick for less confusing stack traces\nfunction nextTick() {\n draining = true;\n var i, oldQueue;\n var len = queue.length;\n while (len) {\n oldQueue = queue;\n queue = [];\n i = -1;\n while (++i < len) {\n oldQueue[i]();\n }\n len = queue.length;\n }\n draining = false;\n}\n\nmodule.exports = immediate;\nfunction immediate(task) {\n if (queue.push(task) === 1 && !draining) {\n scheduleDrain();\n }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],2:[function(_dereq_,module,exports){\n'use strict';\nvar immediate = _dereq_(1);\n\n/* istanbul ignore next */\nfunction INTERNAL() {}\n\nvar handlers = {};\n\nvar REJECTED = ['REJECTED'];\nvar FULFILLED = ['FULFILLED'];\nvar PENDING = ['PENDING'];\n\nmodule.exports = Promise;\n\nfunction Promise(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('resolver must be a function');\n }\n this.state = PENDING;\n this.queue = [];\n this.outcome = void 0;\n if (resolver !== INTERNAL) {\n safelyResolveThenable(this, resolver);\n }\n}\n\nPromise.prototype[\"catch\"] = function (onRejected) {\n return this.then(null, onRejected);\n};\nPromise.prototype.then = function (onFulfilled, onRejected) {\n if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||\n typeof onRejected !== 'function' && this.state === REJECTED) {\n return this;\n }\n var promise = new this.constructor(INTERNAL);\n if (this.state !== PENDING) {\n var resolver = this.state === FULFILLED ? onFulfilled : onRejected;\n unwrap(promise, resolver, this.outcome);\n } else {\n this.queue.push(new QueueItem(promise, onFulfilled, onRejected));\n }\n\n return promise;\n};\nfunction QueueItem(promise, onFulfilled, onRejected) {\n this.promise = promise;\n if (typeof onFulfilled === 'function') {\n this.onFulfilled = onFulfilled;\n this.callFulfilled = this.otherCallFulfilled;\n }\n if (typeof onRejected === 'function') {\n this.onRejected = onRejected;\n this.callRejected = this.otherCallRejected;\n }\n}\nQueueItem.prototype.callFulfilled = function (value) {\n handlers.resolve(this.promise, value);\n};\nQueueItem.prototype.otherCallFulfilled = function (value) {\n unwrap(this.promise, this.onFulfilled, value);\n};\nQueueItem.prototype.callRejected = function (value) {\n handlers.reject(this.promise, value);\n};\nQueueItem.prototype.otherCallRejected = function (value) {\n unwrap(this.promise, this.onRejected, value);\n};\n\nfunction unwrap(promise, func, value) {\n immediate(function () {\n var returnValue;\n try {\n returnValue = func(value);\n } catch (e) {\n return handlers.reject(promise, e);\n }\n if (returnValue === promise) {\n handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));\n } else {\n handlers.resolve(promise, returnValue);\n }\n });\n}\n\nhandlers.resolve = function (self, value) {\n var result = tryCatch(getThen, value);\n if (result.status === 'error') {\n return handlers.reject(self, result.value);\n }\n var thenable = result.value;\n\n if (thenable) {\n safelyResolveThenable(self, thenable);\n } else {\n self.state = FULFILLED;\n self.outcome = value;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callFulfilled(value);\n }\n }\n return self;\n};\nhandlers.reject = function (self, error) {\n self.state = REJECTED;\n self.outcome = error;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callRejected(error);\n }\n return self;\n};\n\nfunction getThen(obj) {\n // Make sure we only access the accessor once as required by the spec\n var then = obj && obj.then;\n if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') {\n return function appyThen() {\n then.apply(obj, arguments);\n };\n }\n}\n\nfunction safelyResolveThenable(self, thenable) {\n // Either fulfill, reject or reject with error\n var called = false;\n function onError(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.reject(self, value);\n }\n\n function onSuccess(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.resolve(self, value);\n }\n\n function tryToUnwrap() {\n thenable(onSuccess, onError);\n }\n\n var result = tryCatch(tryToUnwrap);\n if (result.status === 'error') {\n onError(result.value);\n }\n}\n\nfunction tryCatch(func, value) {\n var out = {};\n try {\n out.value = func(value);\n out.status = 'success';\n } catch (e) {\n out.status = 'error';\n out.value = e;\n }\n return out;\n}\n\nPromise.resolve = resolve;\nfunction resolve(value) {\n if (value instanceof this) {\n return value;\n }\n return handlers.resolve(new this(INTERNAL), value);\n}\n\nPromise.reject = reject;\nfunction reject(reason) {\n var promise = new this(INTERNAL);\n return handlers.reject(promise, reason);\n}\n\nPromise.all = all;\nfunction all(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var values = new Array(len);\n var resolved = 0;\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n allResolver(iterable[i], i);\n }\n return promise;\n function allResolver(value, i) {\n self.resolve(value).then(resolveFromAll, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n function resolveFromAll(outValue) {\n values[i] = outValue;\n if (++resolved === len && !called) {\n called = true;\n handlers.resolve(promise, values);\n }\n }\n }\n}\n\nPromise.race = race;\nfunction race(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n resolver(iterable[i]);\n }\n return promise;\n function resolver(value) {\n self.resolve(value).then(function (response) {\n if (!called) {\n called = true;\n handlers.resolve(promise, response);\n }\n }, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n }\n}\n\n},{\"1\":1}],3:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nif (typeof global.Promise !== 'function') {\n global.Promise = _dereq_(2);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"2\":2}],4:[function(_dereq_,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction getIDB() {\n /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */\n try {\n if (typeof indexedDB !== 'undefined') {\n return indexedDB;\n }\n if (typeof webkitIndexedDB !== 'undefined') {\n return webkitIndexedDB;\n }\n if (typeof mozIndexedDB !== 'undefined') {\n return mozIndexedDB;\n }\n if (typeof OIndexedDB !== 'undefined') {\n return OIndexedDB;\n }\n if (typeof msIndexedDB !== 'undefined') {\n return msIndexedDB;\n }\n } catch (e) {\n return;\n }\n}\n\nvar idb = getIDB();\n\nfunction isIndexedDBValid() {\n try {\n // Initialize IndexedDB; fall back to vendor-prefixed versions\n // if needed.\n if (!idb) {\n return false;\n }\n // We mimic PouchDB here;\n //\n // We test for openDatabase because IE Mobile identifies itself\n // as Safari. Oh the lulz...\n var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform);\n\n var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1;\n\n // Safari <10.1 does not meet our requirements for IDB support (#5572)\n // since Safari 10.1 shipped with fetch, we can use that to detect it\n return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' &&\n // some outdated implementations of IDB that appear on Samsung\n // and HTC Android devices <4.4 are missing IDBKeyRange\n // See: https://github.com/mozilla/localForage/issues/128\n // See: https://github.com/mozilla/localForage/issues/272\n typeof IDBKeyRange !== 'undefined';\n } catch (e) {\n return false;\n }\n}\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\nfunction createBlob(parts, properties) {\n /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n parts = parts || [];\n properties = properties || {};\n try {\n return new Blob(parts, properties);\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder;\n var builder = new Builder();\n for (var i = 0; i < parts.length; i += 1) {\n builder.append(parts[i]);\n }\n return builder.getBlob(properties.type);\n }\n}\n\n// This is CommonJS because lie is an external dependency, so Rollup\n// can just ignore it.\nif (typeof Promise === 'undefined') {\n // In the \"nopromises\" build this will just throw if you don't have\n // a global promise object, but it would throw anyway later.\n _dereq_(3);\n}\nvar Promise$1 = Promise;\n\nfunction executeCallback(promise, callback) {\n if (callback) {\n promise.then(function (result) {\n callback(null, result);\n }, function (error) {\n callback(error);\n });\n }\n}\n\nfunction executeTwoCallbacks(promise, callback, errorCallback) {\n if (typeof callback === 'function') {\n promise.then(callback);\n }\n\n if (typeof errorCallback === 'function') {\n promise[\"catch\"](errorCallback);\n }\n}\n\nfunction normalizeKey(key) {\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n return key;\n}\n\nfunction getCallback() {\n if (arguments.length && typeof arguments[arguments.length - 1] === 'function') {\n return arguments[arguments.length - 1];\n }\n}\n\n// Some code originally from async_storage.js in\n// [Gaia](https://github.com/mozilla-b2g/gaia).\n\nvar DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';\nvar supportsBlobs = void 0;\nvar dbContexts = {};\nvar toString = Object.prototype.toString;\n\n// Transaction Modes\nvar READ_ONLY = 'readonly';\nvar READ_WRITE = 'readwrite';\n\n// Transform a binary string to an array buffer, because otherwise\n// weird stuff happens when you try to work with the binary string directly.\n// It is known.\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction _binStringToArrayBuffer(bin) {\n var length = bin.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n for (var i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n return buf;\n}\n\n//\n// Blobs are not supported in all versions of IndexedDB, notably\n// Chrome <37 and Android <5. In those versions, storing a blob will throw.\n//\n// Various other blob bugs exist in Chrome v37-42 (inclusive).\n// Detecting them is expensive and confusing to users, and Chrome 37-42\n// is at very low usage worldwide, so we do a hacky userAgent check instead.\n//\n// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120\n// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916\n// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836\n//\n// Code borrowed from PouchDB. See:\n// https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js\n//\nfunction _checkBlobSupportWithoutCaching(idb) {\n return new Promise$1(function (resolve) {\n var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE);\n var blob = createBlob(['']);\n txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key');\n\n txn.onabort = function (e) {\n // If the transaction aborts now its due to not being able to\n // write to the database, likely due to the disk being full\n e.preventDefault();\n e.stopPropagation();\n resolve(false);\n };\n\n txn.oncomplete = function () {\n var matchedChrome = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n var matchedEdge = navigator.userAgent.match(/Edge\\//);\n // MS Edge pretends to be Chrome 42:\n // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx\n resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);\n };\n })[\"catch\"](function () {\n return false; // error, so assume unsupported\n });\n}\n\nfunction _checkBlobSupport(idb) {\n if (typeof supportsBlobs === 'boolean') {\n return Promise$1.resolve(supportsBlobs);\n }\n return _checkBlobSupportWithoutCaching(idb).then(function (value) {\n supportsBlobs = value;\n return supportsBlobs;\n });\n}\n\nfunction _deferReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Create a deferred object representing the current database operation.\n var deferredOperation = {};\n\n deferredOperation.promise = new Promise$1(function (resolve, reject) {\n deferredOperation.resolve = resolve;\n deferredOperation.reject = reject;\n });\n\n // Enqueue the deferred operation.\n dbContext.deferredOperations.push(deferredOperation);\n\n // Chain its promise to the database readiness.\n if (!dbContext.dbReady) {\n dbContext.dbReady = deferredOperation.promise;\n } else {\n dbContext.dbReady = dbContext.dbReady.then(function () {\n return deferredOperation.promise;\n });\n }\n}\n\nfunction _advanceReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Dequeue a deferred operation.\n var deferredOperation = dbContext.deferredOperations.pop();\n\n // Resolve its promise (which is part of the database readiness\n // chain of promises).\n if (deferredOperation) {\n deferredOperation.resolve();\n return deferredOperation.promise;\n }\n}\n\nfunction _rejectReadiness(dbInfo, err) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Dequeue a deferred operation.\n var deferredOperation = dbContext.deferredOperations.pop();\n\n // Reject its promise (which is part of the database readiness\n // chain of promises).\n if (deferredOperation) {\n deferredOperation.reject(err);\n return deferredOperation.promise;\n }\n}\n\nfunction _getConnection(dbInfo, upgradeNeeded) {\n return new Promise$1(function (resolve, reject) {\n dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext();\n\n if (dbInfo.db) {\n if (upgradeNeeded) {\n _deferReadiness(dbInfo);\n dbInfo.db.close();\n } else {\n return resolve(dbInfo.db);\n }\n }\n\n var dbArgs = [dbInfo.name];\n\n if (upgradeNeeded) {\n dbArgs.push(dbInfo.version);\n }\n\n var openreq = idb.open.apply(idb, dbArgs);\n\n if (upgradeNeeded) {\n openreq.onupgradeneeded = function (e) {\n var db = openreq.result;\n try {\n db.createObjectStore(dbInfo.storeName);\n if (e.oldVersion <= 1) {\n // Added when support for blob shims was added\n db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);\n }\n } catch (ex) {\n if (ex.name === 'ConstraintError') {\n console.warn('The database \"' + dbInfo.name + '\"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage \"' + dbInfo.storeName + '\" already exists.');\n } else {\n throw ex;\n }\n }\n };\n }\n\n openreq.onerror = function (e) {\n e.preventDefault();\n reject(openreq.error);\n };\n\n openreq.onsuccess = function () {\n resolve(openreq.result);\n _advanceReadiness(dbInfo);\n };\n });\n}\n\nfunction _getOriginalConnection(dbInfo) {\n return _getConnection(dbInfo, false);\n}\n\nfunction _getUpgradedConnection(dbInfo) {\n return _getConnection(dbInfo, true);\n}\n\nfunction _isUpgradeNeeded(dbInfo, defaultVersion) {\n if (!dbInfo.db) {\n return true;\n }\n\n var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);\n var isDowngrade = dbInfo.version < dbInfo.db.version;\n var isUpgrade = dbInfo.version > dbInfo.db.version;\n\n if (isDowngrade) {\n // If the version is not the default one\n // then warn for impossible downgrade.\n if (dbInfo.version !== defaultVersion) {\n console.warn('The database \"' + dbInfo.name + '\"' + \" can't be downgraded from version \" + dbInfo.db.version + ' to version ' + dbInfo.version + '.');\n }\n // Align the versions to prevent errors.\n dbInfo.version = dbInfo.db.version;\n }\n\n if (isUpgrade || isNewStore) {\n // If the store is new then increment the version (if needed).\n // This will trigger an \"upgradeneeded\" event which is required\n // for creating a store.\n if (isNewStore) {\n var incVersion = dbInfo.db.version + 1;\n if (incVersion > dbInfo.version) {\n dbInfo.version = incVersion;\n }\n }\n\n return true;\n }\n\n return false;\n}\n\n// encode a blob for indexeddb engines that don't support blobs\nfunction _encodeBlob(blob) {\n return new Promise$1(function (resolve, reject) {\n var reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = function (e) {\n var base64 = btoa(e.target.result || '');\n resolve({\n __local_forage_encoded_blob: true,\n data: base64,\n type: blob.type\n });\n };\n reader.readAsBinaryString(blob);\n });\n}\n\n// decode an encoded blob\nfunction _decodeBlob(encodedBlob) {\n var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));\n return createBlob([arrayBuff], { type: encodedBlob.type });\n}\n\n// is this one of our fancy encoded blobs?\nfunction _isEncodedBlob(value) {\n return value && value.__local_forage_encoded_blob;\n}\n\n// Specialize the default `ready()` function by making it dependent\n// on the current database operations. Thus, the driver will be actually\n// ready when it's been initialized (default) *and* there are no pending\n// operations on the database (initiated by some other instances).\nfunction _fullyReady(callback) {\n var self = this;\n\n var promise = self._initReady().then(function () {\n var dbContext = dbContexts[self._dbInfo.name];\n\n if (dbContext && dbContext.dbReady) {\n return dbContext.dbReady;\n }\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n}\n\n// Try to establish a new db connection to replace the\n// current one which is broken (i.e. experiencing\n// InvalidStateError while creating a transaction).\nfunction _tryReconnect(dbInfo) {\n _deferReadiness(dbInfo);\n\n var dbContext = dbContexts[dbInfo.name];\n var forages = dbContext.forages;\n\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n if (forage._dbInfo.db) {\n forage._dbInfo.db.close();\n forage._dbInfo.db = null;\n }\n }\n dbInfo.db = null;\n\n return _getOriginalConnection(dbInfo).then(function (db) {\n dbInfo.db = db;\n if (_isUpgradeNeeded(dbInfo)) {\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n return db;\n }).then(function (db) {\n // store the latest db reference\n // in case the db was upgraded\n dbInfo.db = dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n forages[i]._dbInfo.db = db;\n }\n })[\"catch\"](function (err) {\n _rejectReadiness(dbInfo, err);\n throw err;\n });\n}\n\n// FF doesn't like Promises (micro-tasks) and IDDB store operations,\n// so we have to do it with callbacks\nfunction createTransaction(dbInfo, mode, callback, retries) {\n if (retries === undefined) {\n retries = 1;\n }\n\n try {\n var tx = dbInfo.db.transaction(dbInfo.storeName, mode);\n callback(null, tx);\n } catch (err) {\n if (retries > 0 && (!dbInfo.db || err.name === 'InvalidStateError' || err.name === 'NotFoundError')) {\n return Promise$1.resolve().then(function () {\n if (!dbInfo.db || err.name === 'NotFoundError' && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) {\n // increase the db version, to create the new ObjectStore\n if (dbInfo.db) {\n dbInfo.version = dbInfo.db.version + 1;\n }\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n }).then(function () {\n return _tryReconnect(dbInfo).then(function () {\n createTransaction(dbInfo, mode, callback, retries - 1);\n });\n })[\"catch\"](callback);\n }\n\n callback(err);\n }\n}\n\nfunction createDbContext() {\n return {\n // Running localForages sharing a database.\n forages: [],\n // Shared database.\n db: null,\n // Database readiness (promise).\n dbReady: null,\n // Deferred operations on the database.\n deferredOperations: []\n };\n}\n\n// Open the IndexedDB database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n // Get the current context of the database;\n var dbContext = dbContexts[dbInfo.name];\n\n // ...or create a new context.\n if (!dbContext) {\n dbContext = createDbContext();\n // Register the new context in the global container.\n dbContexts[dbInfo.name] = dbContext;\n }\n\n // Register itself as a running localForage in the current context.\n dbContext.forages.push(self);\n\n // Replace the default `ready()` function with the specialized one.\n if (!self._initReady) {\n self._initReady = self.ready;\n self.ready = _fullyReady;\n }\n\n // Create an array of initialization states of the related localForages.\n var initPromises = [];\n\n function ignoreErrors() {\n // Don't handle errors here,\n // just makes sure related localForages aren't pending.\n return Promise$1.resolve();\n }\n\n for (var j = 0; j < dbContext.forages.length; j++) {\n var forage = dbContext.forages[j];\n if (forage !== self) {\n // Don't wait for itself...\n initPromises.push(forage._initReady()[\"catch\"](ignoreErrors));\n }\n }\n\n // Take a snapshot of the related localForages.\n var forages = dbContext.forages.slice(0);\n\n // Initialize the connection process only when\n // all the related localForages aren't pending.\n return Promise$1.all(initPromises).then(function () {\n dbInfo.db = dbContext.db;\n // Get the connection or open a new one without upgrade.\n return _getOriginalConnection(dbInfo);\n }).then(function (db) {\n dbInfo.db = db;\n if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n return db;\n }).then(function (db) {\n dbInfo.db = dbContext.db = db;\n self._dbInfo = dbInfo;\n // Share the final connection amongst related localForages.\n for (var k = 0; k < forages.length; k++) {\n var forage = forages[k];\n if (forage !== self) {\n // Self is already up-to-date.\n forage._dbInfo.db = dbInfo.db;\n forage._dbInfo.version = dbInfo.version;\n }\n }\n });\n}\n\nfunction getItem(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.get(key);\n\n req.onsuccess = function () {\n var value = req.result;\n if (value === undefined) {\n value = null;\n }\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n resolve(value);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items stored in database.\nfunction iterate(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.openCursor();\n var iterationNumber = 1;\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (cursor) {\n var value = cursor.value;\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n var result = iterator(value, cursor.key, iterationNumber++);\n\n // when the iterator callback retuns any\n // (non-`undefined`) value, then we stop\n // the iteration immediately\n if (result !== void 0) {\n resolve(result);\n } else {\n cursor[\"continue\"]();\n }\n } else {\n resolve();\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n\n return promise;\n}\n\nfunction setItem(key, value, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n var dbInfo;\n self.ready().then(function () {\n dbInfo = self._dbInfo;\n if (toString.call(value) === '[object Blob]') {\n return _checkBlobSupport(dbInfo.db).then(function (blobSupport) {\n if (blobSupport) {\n return value;\n }\n return _encodeBlob(value);\n });\n }\n return value;\n }).then(function (value) {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n\n // The reason we don't _save_ null is because IE 10 does\n // not support saving the `null` type in IndexedDB. How\n // ironic, given the bug below!\n // See: https://github.com/mozilla/localForage/issues/161\n if (value === null) {\n value = undefined;\n }\n\n var req = store.put(value, key);\n\n transaction.oncomplete = function () {\n // Cast to undefined so the value passed to\n // callback/promise is the same as what one would get out\n // of `getItem()` later. This leads to some weirdness\n // (setItem('foo', undefined) will return `null`), but\n // it's not my fault localStorage is our baseline and that\n // it's weird.\n if (value === undefined) {\n value = null;\n }\n\n resolve(value);\n };\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction removeItem(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n // We use a Grunt task to make this safe for IE and some\n // versions of Android (including those used by Cordova).\n // Normally IE won't like `.delete()` and will insist on\n // using `['delete']()`, but we have a build step that\n // fixes this for us now.\n var req = store[\"delete\"](key);\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onerror = function () {\n reject(req.error);\n };\n\n // The request will be also be aborted if we've exceeded our storage\n // space.\n transaction.onabort = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction clear(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.clear();\n\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction length(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.count();\n\n req.onsuccess = function () {\n resolve(req.result);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction key(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n if (n < 0) {\n resolve(null);\n\n return;\n }\n\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var advanced = false;\n var req = store.openCursor();\n\n req.onsuccess = function () {\n var cursor = req.result;\n if (!cursor) {\n // this means there weren't enough keys\n resolve(null);\n\n return;\n }\n\n if (n === 0) {\n // We have the first key, return it if that's what they\n // wanted.\n resolve(cursor.key);\n } else {\n if (!advanced) {\n // Otherwise, ask the cursor to skip ahead n\n // records.\n advanced = true;\n cursor.advance(n);\n } else {\n // When we get here, we've got the nth key.\n resolve(cursor.key);\n }\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.openCursor();\n var keys = [];\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (!cursor) {\n resolve(keys);\n return;\n }\n\n keys.push(cursor.key);\n cursor[\"continue\"]();\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction dropInstance(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n var currentConfig = this.config();\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db;\n\n var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then(function (db) {\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n forages[i]._dbInfo.db = db;\n }\n return db;\n });\n\n if (!options.storeName) {\n promise = dbPromise.then(function (db) {\n _deferReadiness(options);\n\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n\n db.close();\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n forage._dbInfo.db = null;\n }\n\n var dropDBPromise = new Promise$1(function (resolve, reject) {\n var req = idb.deleteDatabase(options.name);\n\n req.onerror = req.onblocked = function (err) {\n var db = req.result;\n if (db) {\n db.close();\n }\n reject(err);\n };\n\n req.onsuccess = function () {\n var db = req.result;\n if (db) {\n db.close();\n }\n resolve(db);\n };\n });\n\n return dropDBPromise.then(function (db) {\n dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n var _forage = forages[i];\n _advanceReadiness(_forage._dbInfo);\n }\n })[\"catch\"](function (err) {\n (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n throw err;\n });\n });\n } else {\n promise = dbPromise.then(function (db) {\n if (!db.objectStoreNames.contains(options.storeName)) {\n return;\n }\n\n var newVersion = db.version + 1;\n\n _deferReadiness(options);\n\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n\n db.close();\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n forage._dbInfo.db = null;\n forage._dbInfo.version = newVersion;\n }\n\n var dropObjectPromise = new Promise$1(function (resolve, reject) {\n var req = idb.open(options.name, newVersion);\n\n req.onerror = function (err) {\n var db = req.result;\n db.close();\n reject(err);\n };\n\n req.onupgradeneeded = function () {\n var db = req.result;\n db.deleteObjectStore(options.storeName);\n };\n\n req.onsuccess = function () {\n var db = req.result;\n db.close();\n resolve(db);\n };\n });\n\n return dropObjectPromise.then(function (db) {\n dbContext.db = db;\n for (var j = 0; j < forages.length; j++) {\n var _forage2 = forages[j];\n _forage2._dbInfo.db = db;\n _advanceReadiness(_forage2._dbInfo);\n }\n })[\"catch\"](function (err) {\n (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n throw err;\n });\n });\n }\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar asyncStorage = {\n _driver: 'asyncStorage',\n _initStorage: _initStorage,\n _support: isIndexedDBValid(),\n iterate: iterate,\n getItem: getItem,\n setItem: setItem,\n removeItem: removeItem,\n clear: clear,\n length: length,\n key: key,\n keys: keys,\n dropInstance: dropInstance\n};\n\nfunction isWebSQLValid() {\n return typeof openDatabase === 'function';\n}\n\n// Sadly, the best way to save binary data in WebSQL/localStorage is serializing\n// it to Base64, so this is how we store it to prevent very strange errors with less\n// verbose ways of binary <-> string data storage.\nvar BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nvar BLOB_TYPE_PREFIX = '~~local_forage_type~';\nvar BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;\n\nvar SERIALIZED_MARKER = '__lfsc__:';\nvar SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;\n\n// OMG the serializations!\nvar TYPE_ARRAYBUFFER = 'arbf';\nvar TYPE_BLOB = 'blob';\nvar TYPE_INT8ARRAY = 'si08';\nvar TYPE_UINT8ARRAY = 'ui08';\nvar TYPE_UINT8CLAMPEDARRAY = 'uic8';\nvar TYPE_INT16ARRAY = 'si16';\nvar TYPE_INT32ARRAY = 'si32';\nvar TYPE_UINT16ARRAY = 'ur16';\nvar TYPE_UINT32ARRAY = 'ui32';\nvar TYPE_FLOAT32ARRAY = 'fl32';\nvar TYPE_FLOAT64ARRAY = 'fl64';\nvar TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;\n\nvar toString$1 = Object.prototype.toString;\n\nfunction stringToBuffer(serializedString) {\n // Fill the string into a ArrayBuffer.\n var bufferLength = serializedString.length * 0.75;\n var len = serializedString.length;\n var i;\n var p = 0;\n var encoded1, encoded2, encoded3, encoded4;\n\n if (serializedString[serializedString.length - 1] === '=') {\n bufferLength--;\n if (serializedString[serializedString.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n var buffer = new ArrayBuffer(bufferLength);\n var bytes = new Uint8Array(buffer);\n\n for (i = 0; i < len; i += 4) {\n encoded1 = BASE_CHARS.indexOf(serializedString[i]);\n encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]);\n encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]);\n encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]);\n\n /*jslint bitwise: true */\n bytes[p++] = encoded1 << 2 | encoded2 >> 4;\n bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;\n bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;\n }\n return buffer;\n}\n\n// Converts a buffer to a string to store, serialized, in the backend\n// storage library.\nfunction bufferToString(buffer) {\n // base64-arraybuffer\n var bytes = new Uint8Array(buffer);\n var base64String = '';\n var i;\n\n for (i = 0; i < bytes.length; i += 3) {\n /*jslint bitwise: true */\n base64String += BASE_CHARS[bytes[i] >> 2];\n base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];\n base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];\n base64String += BASE_CHARS[bytes[i + 2] & 63];\n }\n\n if (bytes.length % 3 === 2) {\n base64String = base64String.substring(0, base64String.length - 1) + '=';\n } else if (bytes.length % 3 === 1) {\n base64String = base64String.substring(0, base64String.length - 2) + '==';\n }\n\n return base64String;\n}\n\n// Serialize a value, afterwards executing a callback (which usually\n// instructs the `setItem()` callback/promise to be executed). This is how\n// we store binary data with localStorage.\nfunction serialize(value, callback) {\n var valueType = '';\n if (value) {\n valueType = toString$1.call(value);\n }\n\n // Cannot use `value instanceof ArrayBuffer` or such here, as these\n // checks fail when running the tests using casper.js...\n //\n // TODO: See why those tests fail and use a better solution.\n if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) {\n // Convert binary arrays to a string and prefix the string with\n // a special marker.\n var buffer;\n var marker = SERIALIZED_MARKER;\n\n if (value instanceof ArrayBuffer) {\n buffer = value;\n marker += TYPE_ARRAYBUFFER;\n } else {\n buffer = value.buffer;\n\n if (valueType === '[object Int8Array]') {\n marker += TYPE_INT8ARRAY;\n } else if (valueType === '[object Uint8Array]') {\n marker += TYPE_UINT8ARRAY;\n } else if (valueType === '[object Uint8ClampedArray]') {\n marker += TYPE_UINT8CLAMPEDARRAY;\n } else if (valueType === '[object Int16Array]') {\n marker += TYPE_INT16ARRAY;\n } else if (valueType === '[object Uint16Array]') {\n marker += TYPE_UINT16ARRAY;\n } else if (valueType === '[object Int32Array]') {\n marker += TYPE_INT32ARRAY;\n } else if (valueType === '[object Uint32Array]') {\n marker += TYPE_UINT32ARRAY;\n } else if (valueType === '[object Float32Array]') {\n marker += TYPE_FLOAT32ARRAY;\n } else if (valueType === '[object Float64Array]') {\n marker += TYPE_FLOAT64ARRAY;\n } else {\n callback(new Error('Failed to get type for BinaryArray'));\n }\n }\n\n callback(marker + bufferToString(buffer));\n } else if (valueType === '[object Blob]') {\n // Conver the blob to a binaryArray and then to a string.\n var fileReader = new FileReader();\n\n fileReader.onload = function () {\n // Backwards-compatible prefix for the blob type.\n var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result);\n\n callback(SERIALIZED_MARKER + TYPE_BLOB + str);\n };\n\n fileReader.readAsArrayBuffer(value);\n } else {\n try {\n callback(JSON.stringify(value));\n } catch (e) {\n console.error(\"Couldn't convert value into a JSON string: \", value);\n\n callback(null, e);\n }\n }\n}\n\n// Deserialize data we've inserted into a value column/field. We place\n// special markers into our strings to mark them as encoded; this isn't\n// as nice as a meta field, but it's the only sane thing we can do whilst\n// keeping localStorage support intact.\n//\n// Oftentimes this will just deserialize JSON content, but if we have a\n// special marker (SERIALIZED_MARKER, defined above), we will extract\n// some kind of arraybuffer/binary data/typed array out of the string.\nfunction deserialize(value) {\n // If we haven't marked this string as being specially serialized (i.e.\n // something other than serialized JSON), we can just return it and be\n // done with it.\n if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {\n return JSON.parse(value);\n }\n\n // The following code deals with deserializing some kind of Blob or\n // TypedArray. First we separate out the type of data we're dealing\n // with from the data itself.\n var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);\n var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);\n\n var blobType;\n // Backwards-compatible blob type serialization strategy.\n // DBs created with older versions of localForage will simply not have the blob type.\n if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {\n var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);\n blobType = matcher[1];\n serializedString = serializedString.substring(matcher[0].length);\n }\n var buffer = stringToBuffer(serializedString);\n\n // Return the right type based on the code/type set during\n // serialization.\n switch (type) {\n case TYPE_ARRAYBUFFER:\n return buffer;\n case TYPE_BLOB:\n return createBlob([buffer], { type: blobType });\n case TYPE_INT8ARRAY:\n return new Int8Array(buffer);\n case TYPE_UINT8ARRAY:\n return new Uint8Array(buffer);\n case TYPE_UINT8CLAMPEDARRAY:\n return new Uint8ClampedArray(buffer);\n case TYPE_INT16ARRAY:\n return new Int16Array(buffer);\n case TYPE_UINT16ARRAY:\n return new Uint16Array(buffer);\n case TYPE_INT32ARRAY:\n return new Int32Array(buffer);\n case TYPE_UINT32ARRAY:\n return new Uint32Array(buffer);\n case TYPE_FLOAT32ARRAY:\n return new Float32Array(buffer);\n case TYPE_FLOAT64ARRAY:\n return new Float64Array(buffer);\n default:\n throw new Error('Unkown type: ' + type);\n }\n}\n\nvar localforageSerializer = {\n serialize: serialize,\n deserialize: deserialize,\n stringToBuffer: stringToBuffer,\n bufferToString: bufferToString\n};\n\n/*\n * Includes code from:\n *\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n\nfunction createDbTable(t, dbInfo, callback, errorCallback) {\n t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback);\n}\n\n// Open the WebSQL database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage$1(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i];\n }\n }\n\n var dbInfoPromise = new Promise$1(function (resolve, reject) {\n // Open the database; the openDatabase API will automatically\n // create it for us if it doesn't exist.\n try {\n dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);\n } catch (e) {\n return reject(e);\n }\n\n // Create our key/value table if it doesn't exist.\n dbInfo.db.transaction(function (t) {\n createDbTable(t, dbInfo, function () {\n self._dbInfo = dbInfo;\n resolve();\n }, function (t, error) {\n reject(error);\n });\n }, reject);\n });\n\n dbInfo.serializer = localforageSerializer;\n return dbInfoPromise;\n}\n\nfunction tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) {\n t.executeSql(sqlStatement, args, callback, function (t, error) {\n if (error.code === error.SYNTAX_ERR) {\n t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name = ?\", [dbInfo.storeName], function (t, results) {\n if (!results.rows.length) {\n // if the table is missing (was deleted)\n // re-create it table and retry\n createDbTable(t, dbInfo, function () {\n t.executeSql(sqlStatement, args, callback, errorCallback);\n }, errorCallback);\n } else {\n errorCallback(t, error);\n }\n }, errorCallback);\n } else {\n errorCallback(t, error);\n }\n }, errorCallback);\n}\n\nfunction getItem$1(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).value : null;\n\n // Check to see if this is serialized content we need to\n // unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction iterate$1(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) {\n var rows = results.rows;\n var length = rows.length;\n\n for (var i = 0; i < length; i++) {\n var item = rows.item(i);\n var result = item.value;\n\n // Check to see if this is serialized content\n // we need to unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n result = iterator(result, item.key, i + 1);\n\n // void(0) prevents problems with redefinition\n // of `undefined`.\n if (result !== void 0) {\n resolve(result);\n return;\n }\n }\n\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction _setItem(key, value, callback, retriesLeft) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n // The localStorage API doesn't return undefined values in an\n // \"expected\" way, so undefined is always cast to null in all\n // drivers. See: https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () {\n resolve(originalValue);\n }, function (t, error) {\n reject(error);\n });\n }, function (sqlError) {\n // The transaction failed; check\n // to see if it's a quota error.\n if (sqlError.code === sqlError.QUOTA_ERR) {\n // We reject the callback outright for now, but\n // it's worth trying to re-run the transaction.\n // Even if the user accepts the prompt to use\n // more storage on Safari, this error will\n // be called.\n //\n // Try to re-run the transaction.\n if (retriesLeft > 0) {\n resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1]));\n return;\n }\n reject(sqlError);\n }\n });\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction setItem$1(key, value, callback) {\n return _setItem.apply(this, [key, value, callback, 1]);\n}\n\nfunction removeItem$1(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Deletes every item in the table.\n// TODO: Find out if this resets the AUTO_INCREMENT number.\nfunction clear$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Does a simple `COUNT(key)` to get the number of items stored in\n// localForage.\nfunction length$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n // Ahhh, SQL makes this one soooooo easy.\n tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) {\n var result = results.rows.item(0).c;\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Return the key located at key index X; essentially gets the key from a\n// `WHERE id = ?`. This is the most efficient way I can think to implement\n// this rarely-used (in my experience) part of the API, but it can seem\n// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so\n// the ID of each key will change every time it's updated. Perhaps a stored\n// procedure for the `setItem()` SQL would solve this problem?\n// TODO: Don't change ID on `setItem()`.\nfunction key$1(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).key : null;\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) {\n var keys = [];\n\n for (var i = 0; i < results.rows.length; i++) {\n keys.push(results.rows.item(i).key);\n }\n\n resolve(keys);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// https://www.w3.org/TR/webdatabase/#databases\n// > There is no way to enumerate or delete the databases available for an origin from this API.\nfunction getAllStoreNames(db) {\n return new Promise$1(function (resolve, reject) {\n db.transaction(function (t) {\n t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'\", [], function (t, results) {\n var storeNames = [];\n\n for (var i = 0; i < results.rows.length; i++) {\n storeNames.push(results.rows.item(i).name);\n }\n\n resolve({\n db: db,\n storeNames: storeNames\n });\n }, function (t, error) {\n reject(error);\n });\n }, function (sqlError) {\n reject(sqlError);\n });\n });\n}\n\nfunction dropInstance$1(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n var currentConfig = this.config();\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n promise = new Promise$1(function (resolve) {\n var db;\n if (options.name === currentConfig.name) {\n // use the db reference of the current instance\n db = self._dbInfo.db;\n } else {\n db = openDatabase(options.name, '', '', 0);\n }\n\n if (!options.storeName) {\n // drop all database tables\n resolve(getAllStoreNames(db));\n } else {\n resolve({\n db: db,\n storeNames: [options.storeName]\n });\n }\n }).then(function (operationInfo) {\n return new Promise$1(function (resolve, reject) {\n operationInfo.db.transaction(function (t) {\n function dropTable(storeName) {\n return new Promise$1(function (resolve, reject) {\n t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n }\n\n var operations = [];\n for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) {\n operations.push(dropTable(operationInfo.storeNames[i]));\n }\n\n Promise$1.all(operations).then(function () {\n resolve();\n })[\"catch\"](function (e) {\n reject(e);\n });\n }, function (sqlError) {\n reject(sqlError);\n });\n });\n });\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar webSQLStorage = {\n _driver: 'webSQLStorage',\n _initStorage: _initStorage$1,\n _support: isWebSQLValid(),\n iterate: iterate$1,\n getItem: getItem$1,\n setItem: setItem$1,\n removeItem: removeItem$1,\n clear: clear$1,\n length: length$1,\n key: key$1,\n keys: keys$1,\n dropInstance: dropInstance$1\n};\n\nfunction isLocalStorageValid() {\n try {\n return typeof localStorage !== 'undefined' && 'setItem' in localStorage &&\n // in IE8 typeof localStorage.setItem === 'object'\n !!localStorage.setItem;\n } catch (e) {\n return false;\n }\n}\n\nfunction _getKeyPrefix(options, defaultConfig) {\n var keyPrefix = options.name + '/';\n\n if (options.storeName !== defaultConfig.storeName) {\n keyPrefix += options.storeName + '/';\n }\n return keyPrefix;\n}\n\n// Check if localStorage throws when saving an item\nfunction checkIfLocalStorageThrows() {\n var localStorageTestKey = '_localforage_support_test';\n\n try {\n localStorage.setItem(localStorageTestKey, true);\n localStorage.removeItem(localStorageTestKey);\n\n return false;\n } catch (e) {\n return true;\n }\n}\n\n// Check if localStorage is usable and allows to save an item\n// This method checks if localStorage is usable in Safari Private Browsing\n// mode, or in any other case where the available quota for localStorage\n// is 0 and there wasn't any saved items yet.\nfunction _isLocalStorageUsable() {\n return !checkIfLocalStorageThrows() || localStorage.length > 0;\n}\n\n// Config the localStorage backend, using options set in the config.\nfunction _initStorage$2(options) {\n var self = this;\n var dbInfo = {};\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig);\n\n if (!_isLocalStorageUsable()) {\n return Promise$1.reject();\n }\n\n self._dbInfo = dbInfo;\n dbInfo.serializer = localforageSerializer;\n\n return Promise$1.resolve();\n}\n\n// Remove all keys from the datastore, effectively destroying all data in\n// the app's key/value store!\nfunction clear$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var keyPrefix = self._dbInfo.keyPrefix;\n\n for (var i = localStorage.length - 1; i >= 0; i--) {\n var key = localStorage.key(i);\n\n if (key.indexOf(keyPrefix) === 0) {\n localStorage.removeItem(key);\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Retrieve an item from the store. Unlike the original async_storage\n// library in Gaia, we don't modify return values at all. If a key's value\n// is `undefined`, we pass that value to the callback function.\nfunction getItem$2(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result = localStorage.getItem(dbInfo.keyPrefix + key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the key\n // is likely undefined and we'll pass it straight to the\n // callback.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items in the store.\nfunction iterate$2(iterator, callback) {\n var self = this;\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var keyPrefix = dbInfo.keyPrefix;\n var keyPrefixLength = keyPrefix.length;\n var length = localStorage.length;\n\n // We use a dedicated iterator instead of the `i` variable below\n // so other keys we fetch in localStorage aren't counted in\n // the `iterationNumber` argument passed to the `iterate()`\n // callback.\n //\n // See: github.com/mozilla/localForage/pull/435#discussion_r38061530\n var iterationNumber = 1;\n\n for (var i = 0; i < length; i++) {\n var key = localStorage.key(i);\n if (key.indexOf(keyPrefix) !== 0) {\n continue;\n }\n var value = localStorage.getItem(key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the\n // key is likely undefined and we'll pass it straight\n // to the iterator.\n if (value) {\n value = dbInfo.serializer.deserialize(value);\n }\n\n value = iterator(value, key.substring(keyPrefixLength), iterationNumber++);\n\n if (value !== void 0) {\n return value;\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Same as localStorage's key() method, except takes a callback.\nfunction key$2(n, callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result;\n try {\n result = localStorage.key(n);\n } catch (error) {\n result = null;\n }\n\n // Remove the prefix from the key, if a key is found.\n if (result) {\n result = result.substring(dbInfo.keyPrefix.length);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var length = localStorage.length;\n var keys = [];\n\n for (var i = 0; i < length; i++) {\n var itemKey = localStorage.key(i);\n if (itemKey.indexOf(dbInfo.keyPrefix) === 0) {\n keys.push(itemKey.substring(dbInfo.keyPrefix.length));\n }\n }\n\n return keys;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Supply the number of keys in the datastore to the callback function.\nfunction length$2(callback) {\n var self = this;\n var promise = self.keys().then(function (keys) {\n return keys.length;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Remove an item from the store, nice and simple.\nfunction removeItem$2(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n localStorage.removeItem(dbInfo.keyPrefix + key);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Set a key's value and run an optional callback once the value is set.\n// Unlike Gaia's implementation, the callback function is passed the value,\n// in case you want to operate on that value only after you're sure it\n// saved, or something like that.\nfunction setItem$2(key, value, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n // Convert undefined values to null.\n // https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n return new Promise$1(function (resolve, reject) {\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n try {\n localStorage.setItem(dbInfo.keyPrefix + key, value);\n resolve(originalValue);\n } catch (e) {\n // localStorage capacity exceeded.\n // TODO: Make this a specific error/event.\n if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {\n reject(e);\n }\n reject(e);\n }\n }\n });\n });\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction dropInstance$2(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n var currentConfig = this.config();\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n promise = new Promise$1(function (resolve) {\n if (!options.storeName) {\n resolve(options.name + '/');\n } else {\n resolve(_getKeyPrefix(options, self._defaultConfig));\n }\n }).then(function (keyPrefix) {\n for (var i = localStorage.length - 1; i >= 0; i--) {\n var key = localStorage.key(i);\n\n if (key.indexOf(keyPrefix) === 0) {\n localStorage.removeItem(key);\n }\n }\n });\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar localStorageWrapper = {\n _driver: 'localStorageWrapper',\n _initStorage: _initStorage$2,\n _support: isLocalStorageValid(),\n iterate: iterate$2,\n getItem: getItem$2,\n setItem: setItem$2,\n removeItem: removeItem$2,\n clear: clear$2,\n length: length$2,\n key: key$2,\n keys: keys$2,\n dropInstance: dropInstance$2\n};\n\nvar sameValue = function sameValue(x, y) {\n return x === y || typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y);\n};\n\nvar includes = function includes(array, searchElement) {\n var len = array.length;\n var i = 0;\n while (i < len) {\n if (sameValue(array[i], searchElement)) {\n return true;\n }\n i++;\n }\n\n return false;\n};\n\nvar isArray = Array.isArray || function (arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n};\n\n// Drivers are stored here when `defineDriver()` is called.\n// They are shared across all instances of localForage.\nvar DefinedDrivers = {};\n\nvar DriverSupport = {};\n\nvar DefaultDrivers = {\n INDEXEDDB: asyncStorage,\n WEBSQL: webSQLStorage,\n LOCALSTORAGE: localStorageWrapper\n};\n\nvar DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver];\n\nvar OptionalDriverMethods = ['dropInstance'];\n\nvar LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'].concat(OptionalDriverMethods);\n\nvar DefaultConfig = {\n description: '',\n driver: DefaultDriverOrder.slice(),\n name: 'localforage',\n // Default DB size is _JUST UNDER_ 5MB, as it's the highest size\n // we can use without a prompt.\n size: 4980736,\n storeName: 'keyvaluepairs',\n version: 1.0\n};\n\nfunction callWhenReady(localForageInstance, libraryMethod) {\n localForageInstance[libraryMethod] = function () {\n var _args = arguments;\n return localForageInstance.ready().then(function () {\n return localForageInstance[libraryMethod].apply(localForageInstance, _args);\n });\n };\n}\n\nfunction extend() {\n for (var i = 1; i < arguments.length; i++) {\n var arg = arguments[i];\n\n if (arg) {\n for (var _key in arg) {\n if (arg.hasOwnProperty(_key)) {\n if (isArray(arg[_key])) {\n arguments[0][_key] = arg[_key].slice();\n } else {\n arguments[0][_key] = arg[_key];\n }\n }\n }\n }\n }\n\n return arguments[0];\n}\n\nvar LocalForage = function () {\n function LocalForage(options) {\n _classCallCheck(this, LocalForage);\n\n for (var driverTypeKey in DefaultDrivers) {\n if (DefaultDrivers.hasOwnProperty(driverTypeKey)) {\n var driver = DefaultDrivers[driverTypeKey];\n var driverName = driver._driver;\n this[driverTypeKey] = driverName;\n\n if (!DefinedDrivers[driverName]) {\n // we don't need to wait for the promise,\n // since the default drivers can be defined\n // in a blocking manner\n this.defineDriver(driver);\n }\n }\n }\n\n this._defaultConfig = extend({}, DefaultConfig);\n this._config = extend({}, this._defaultConfig, options);\n this._driverSet = null;\n this._initDriver = null;\n this._ready = false;\n this._dbInfo = null;\n\n this._wrapLibraryMethodsWithReady();\n this.setDriver(this._config.driver)[\"catch\"](function () {});\n }\n\n // Set any config values for localForage; can be called anytime before\n // the first API call (e.g. `getItem`, `setItem`).\n // We loop through options so we don't overwrite existing config\n // values.\n\n\n LocalForage.prototype.config = function config(options) {\n // If the options argument is an object, we use it to set values.\n // Otherwise, we return either a specified config value or all\n // config values.\n if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {\n // If localforage is ready and fully initialized, we can't set\n // any new configuration values. Instead, we return an error.\n if (this._ready) {\n return new Error(\"Can't call config() after localforage \" + 'has been used.');\n }\n\n for (var i in options) {\n if (i === 'storeName') {\n options[i] = options[i].replace(/\\W/g, '_');\n }\n\n if (i === 'version' && typeof options[i] !== 'number') {\n return new Error('Database version must be a number.');\n }\n\n this._config[i] = options[i];\n }\n\n // after all config options are set and\n // the driver option is used, try setting it\n if ('driver' in options && options.driver) {\n return this.setDriver(this._config.driver);\n }\n\n return true;\n } else if (typeof options === 'string') {\n return this._config[options];\n } else {\n return this._config;\n }\n };\n\n // Used to define a custom driver, shared across all instances of\n // localForage.\n\n\n LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {\n var promise = new Promise$1(function (resolve, reject) {\n try {\n var driverName = driverObject._driver;\n var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver');\n\n // A driver name should be defined and not overlap with the\n // library-defined, default drivers.\n if (!driverObject._driver) {\n reject(complianceError);\n return;\n }\n\n var driverMethods = LibraryMethods.concat('_initStorage');\n for (var i = 0, len = driverMethods.length; i < len; i++) {\n var driverMethodName = driverMethods[i];\n\n // when the property is there,\n // it should be a method even when optional\n var isRequired = !includes(OptionalDriverMethods, driverMethodName);\n if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== 'function') {\n reject(complianceError);\n return;\n }\n }\n\n var configureMissingMethods = function configureMissingMethods() {\n var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) {\n return function () {\n var error = new Error('Method ' + methodName + ' is not implemented by the current driver');\n var promise = Promise$1.reject(error);\n executeCallback(promise, arguments[arguments.length - 1]);\n return promise;\n };\n };\n\n for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) {\n var optionalDriverMethod = OptionalDriverMethods[_i];\n if (!driverObject[optionalDriverMethod]) {\n driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod);\n }\n }\n };\n\n configureMissingMethods();\n\n var setDriverSupport = function setDriverSupport(support) {\n if (DefinedDrivers[driverName]) {\n console.info('Redefining LocalForage driver: ' + driverName);\n }\n DefinedDrivers[driverName] = driverObject;\n DriverSupport[driverName] = support;\n // don't use a then, so that we can define\n // drivers that have simple _support methods\n // in a blocking manner\n resolve();\n };\n\n if ('_support' in driverObject) {\n if (driverObject._support && typeof driverObject._support === 'function') {\n driverObject._support().then(setDriverSupport, reject);\n } else {\n setDriverSupport(!!driverObject._support);\n }\n } else {\n setDriverSupport(true);\n }\n } catch (e) {\n reject(e);\n }\n });\n\n executeTwoCallbacks(promise, callback, errorCallback);\n return promise;\n };\n\n LocalForage.prototype.driver = function driver() {\n return this._driver || null;\n };\n\n LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {\n var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error('Driver not found.'));\n\n executeTwoCallbacks(getDriverPromise, callback, errorCallback);\n return getDriverPromise;\n };\n\n LocalForage.prototype.getSerializer = function getSerializer(callback) {\n var serializerPromise = Promise$1.resolve(localforageSerializer);\n executeTwoCallbacks(serializerPromise, callback);\n return serializerPromise;\n };\n\n LocalForage.prototype.ready = function ready(callback) {\n var self = this;\n\n var promise = self._driverSet.then(function () {\n if (self._ready === null) {\n self._ready = self._initDriver();\n }\n\n return self._ready;\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n };\n\n LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {\n var self = this;\n\n if (!isArray(drivers)) {\n drivers = [drivers];\n }\n\n var supportedDrivers = this._getSupportedDrivers(drivers);\n\n function setDriverToConfig() {\n self._config.driver = self.driver();\n }\n\n function extendSelfWithDriver(driver) {\n self._extend(driver);\n setDriverToConfig();\n\n self._ready = self._initStorage(self._config);\n return self._ready;\n }\n\n function initDriver(supportedDrivers) {\n return function () {\n var currentDriverIndex = 0;\n\n function driverPromiseLoop() {\n while (currentDriverIndex < supportedDrivers.length) {\n var driverName = supportedDrivers[currentDriverIndex];\n currentDriverIndex++;\n\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(extendSelfWithDriver)[\"catch\"](driverPromiseLoop);\n }\n\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n }\n\n return driverPromiseLoop();\n };\n }\n\n // There might be a driver initialization in progress\n // so wait for it to finish in order to avoid a possible\n // race condition to set _dbInfo\n var oldDriverSetDone = this._driverSet !== null ? this._driverSet[\"catch\"](function () {\n return Promise$1.resolve();\n }) : Promise$1.resolve();\n\n this._driverSet = oldDriverSetDone.then(function () {\n var driverName = supportedDrivers[0];\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(function (driver) {\n self._driver = driver._driver;\n setDriverToConfig();\n self._wrapLibraryMethodsWithReady();\n self._initDriver = initDriver(supportedDrivers);\n });\n })[\"catch\"](function () {\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n });\n\n executeTwoCallbacks(this._driverSet, callback, errorCallback);\n return this._driverSet;\n };\n\n LocalForage.prototype.supports = function supports(driverName) {\n return !!DriverSupport[driverName];\n };\n\n LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) {\n extend(this, libraryMethodsAndProperties);\n };\n\n LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {\n var supportedDrivers = [];\n for (var i = 0, len = drivers.length; i < len; i++) {\n var driverName = drivers[i];\n if (this.supports(driverName)) {\n supportedDrivers.push(driverName);\n }\n }\n return supportedDrivers;\n };\n\n LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {\n // Add a stub for each driver API method that delays the call to the\n // corresponding driver method until localForage is ready. These stubs\n // will be replaced by the driver methods as soon as the driver is\n // loaded, so there is no performance impact.\n for (var i = 0, len = LibraryMethods.length; i < len; i++) {\n callWhenReady(this, LibraryMethods[i]);\n }\n };\n\n LocalForage.prototype.createInstance = function createInstance(options) {\n return new LocalForage(options);\n };\n\n return LocalForage;\n}();\n\n// The actual localForage object that we expose as a module or via a\n// global. It's extended by pulling in one of our other libraries.\n\n\nvar localforage_js = new LocalForage();\n\nmodule.exports = localforage_js;\n\n},{\"3\":3}]},{},[4])(4)\n});\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventBus from './EventBus';\nimport Events from './events/Events';\nimport FactoryMaker from './FactoryMaker';\n\nconst LOG_LEVEL_NONE = 0;\nconst LOG_LEVEL_FATAL = 1;\nconst LOG_LEVEL_ERROR = 2;\nconst LOG_LEVEL_WARNING = 3;\nconst LOG_LEVEL_INFO = 4;\nconst LOG_LEVEL_DEBUG = 5;\n\n/**\n * @module Debug\n * @param {object} config\n * @ignore\n */\nfunction Debug(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const settings = config.settings;\n\n const logFn = [];\n\n let instance,\n showLogTimestamp,\n showCalleeName,\n startTime;\n\n function setup() {\n showLogTimestamp = true;\n showCalleeName = true;\n startTime = new Date().getTime();\n\n if (typeof window !== 'undefined' && window.console) {\n logFn[LOG_LEVEL_FATAL] = getLogFn(window.console.error);\n logFn[LOG_LEVEL_ERROR] = getLogFn(window.console.error);\n logFn[LOG_LEVEL_WARNING] = getLogFn(window.console.warn);\n logFn[LOG_LEVEL_INFO] = getLogFn(window.console.info);\n logFn[LOG_LEVEL_DEBUG] = getLogFn(window.console.debug);\n }\n }\n\n function getLogFn(fn) {\n if (fn && fn.bind) {\n return fn.bind(window.console);\n }\n // if not define, return the default function for reporting logs\n return window.console.log.bind(window.console);\n }\n\n /**\n * Retrieves a logger which can be used to write logging information in browser console.\n * @param {object} instance Object for which the logger is created. It is used\n * to include calle object information in log messages.\n * @memberof module:Debug\n * @returns {Logger}\n * @instance\n */\n function getLogger(instance) {\n return {\n fatal: fatal.bind(instance),\n error: error.bind(instance),\n warn: warn.bind(instance),\n info: info.bind(instance),\n debug: debug.bind(instance)\n };\n }\n\n /**\n * Prepends a timestamp in milliseconds to each log message.\n * @param {boolean} value Set to true if you want to see a timestamp in each log message.\n * @default LOG_LEVEL_WARNING\n * @memberof module:Debug\n * @instance\n */\n function setLogTimestampVisible(value) {\n showLogTimestamp = value;\n }\n /**\n * Prepends the callee object name, and media type if available, to each log message.\n * @param {boolean} value Set to true if you want to see the callee object name and media type in each log message.\n * @default true\n * @memberof module:Debug\n * @instance\n */\n function setCalleeNameVisible(value) {\n showCalleeName = value;\n }\n\n function fatal(...params) {\n doLog(LOG_LEVEL_FATAL, this, ...params);\n }\n\n function error(...params) {\n doLog(LOG_LEVEL_ERROR, this, ...params);\n }\n\n function warn(...params) {\n doLog(LOG_LEVEL_WARNING, this, ...params);\n }\n\n function info(...params) {\n doLog(LOG_LEVEL_INFO, this, ...params);\n }\n\n function debug(...params) {\n doLog(LOG_LEVEL_DEBUG, this, ...params);\n }\n\n function doLog(level, _this, ...params) {\n let message = '';\n let logTime = null;\n\n if (showLogTimestamp) {\n logTime = new Date().getTime();\n message += '[' + (logTime - startTime) + ']';\n }\n\n if (showCalleeName && _this && _this.getClassName) {\n message += '[' + _this.getClassName() + ']';\n if (_this.getType) {\n message += '[' + _this.getType() + ']';\n }\n }\n\n if (message.length > 0) {\n message += ' ';\n }\n\n Array.apply(null, params).forEach(function (item) {\n message += item + ' ';\n });\n\n // log to console if the log level is high enough\n if (logFn[level] && settings.get().debug.logLevel >= level) {\n logFn[level](message);\n }\n\n // send log event regardless of log level\n eventBus.trigger(Events.LOG, {message: message, level: level});\n }\n\n instance = {\n getLogger: getLogger,\n setLogTimestampVisible: setLogTimestampVisible,\n setCalleeNameVisible: setCalleeNameVisible\n };\n\n setup();\n\n return instance;\n}\n\nDebug.__dashjs_factory_name = 'Debug';\n\nconst factory = FactoryMaker.getSingletonFactory(Debug);\nfactory.LOG_LEVEL_NONE = LOG_LEVEL_NONE;\nfactory.LOG_LEVEL_FATAL = LOG_LEVEL_FATAL;\nfactory.LOG_LEVEL_ERROR = LOG_LEVEL_ERROR;\nfactory.LOG_LEVEL_WARNING = LOG_LEVEL_WARNING;\nfactory.LOG_LEVEL_INFO = LOG_LEVEL_INFO;\nfactory.LOG_LEVEL_DEBUG = LOG_LEVEL_DEBUG;\nFactoryMaker.updateSingletonFactory(Debug.__dashjs_factory_name, factory);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from './FactoryMaker';\n\nconst EVENT_PRIORITY_LOW = 0;\nconst EVENT_PRIORITY_HIGH = 5000;\n\nfunction EventBus() {\n\n let handlers = {};\n\n function on(type, listener, scope, priority = EVENT_PRIORITY_LOW) {\n\n if (!type) {\n throw new Error('event type cannot be null or undefined');\n }\n if (!listener || typeof (listener) !== 'function') {\n throw new Error('listener must be a function: ' + listener);\n }\n\n if (getHandlerIdx(type, listener, scope) >= 0) return;\n\n handlers[type] = handlers[type] || [];\n\n const handler = {\n callback: listener,\n scope: scope,\n priority: priority\n };\n\n const inserted = handlers[type].some((item , idx) => {\n if (item && priority > item.priority ) {\n handlers[type].splice(idx, 0, handler);\n return true;\n }\n });\n\n if (!inserted) {\n handlers[type].push(handler);\n }\n }\n\n function off(type, listener, scope) {\n if (!type || !listener || !handlers[type]) return;\n const idx = getHandlerIdx(type, listener, scope);\n if (idx < 0) return;\n handlers[type][idx] = null;\n }\n\n function trigger(type, payload) {\n if (!type || !handlers[type]) return;\n\n payload = payload || {};\n\n if (payload.hasOwnProperty('type')) throw new Error('\\'type\\' is a reserved word for event dispatching');\n\n payload.type = type;\n\n handlers[type] = handlers[type].filter((item) => item);\n handlers[type].forEach( handler => handler && handler.callback.call(handler.scope, payload) );\n }\n\n function getHandlerIdx(type, listener, scope) {\n\n let idx = -1;\n\n if (!handlers[type]) return idx;\n\n handlers[type].some( (item, index) => {\n if (item && item.callback === listener && (!scope || scope === item.scope)) {\n idx = index;\n return true;\n }\n });\n return idx;\n }\n\n function reset() {\n handlers = {};\n }\n\n const instance = {\n on: on,\n off: off,\n trigger: trigger,\n reset: reset\n };\n\n return instance;\n}\n\nEventBus.__dashjs_factory_name = 'EventBus';\nconst factory = FactoryMaker.getSingletonFactory(EventBus);\nfactory.EVENT_PRIORITY_LOW = EVENT_PRIORITY_LOW;\nfactory.EVENT_PRIORITY_HIGH = EVENT_PRIORITY_HIGH;\nFactoryMaker.updateSingletonFactory(EventBus.__dashjs_factory_name, factory);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @module FactoryMaker\n * @ignore\n */\nconst FactoryMaker = (function () {\n\n let instance;\n const singletonContexts = [];\n const singletonFactories = {};\n const classFactories = {};\n\n function extend(name, childInstance, override, context) {\n if (!context[name] && childInstance) {\n context[name] = {\n instance: childInstance,\n override: override\n };\n }\n }\n\n /**\n * Use this method from your extended object. this.factory is injected into your object.\n * this.factory.getSingletonInstance(this.context, 'VideoModel')\n * will return the video model for use in the extended object.\n *\n * @param {Object} context - injected into extended object as this.context\n * @param {string} className - string name found in all dash.js objects\n * with name __dashjs_factory_name Will be at the bottom. Will be the same as the object's name.\n * @returns {*} Context aware instance of specified singleton name.\n * @memberof module:FactoryMaker\n * @instance\n */\n function getSingletonInstance(context, className) {\n for (const i in singletonContexts) {\n const obj = singletonContexts[i];\n if (obj.context === context && obj.name === className) {\n return obj.instance;\n }\n }\n return null;\n }\n\n /**\n * Use this method to add an singleton instance to the system. Useful for unit testing to mock objects etc.\n *\n * @param {Object} context\n * @param {string} className\n * @param {Object} instance\n * @memberof module:FactoryMaker\n * @instance\n */\n function setSingletonInstance(context, className, instance) {\n for (const i in singletonContexts) {\n const obj = singletonContexts[i];\n if (obj.context === context && obj.name === className) {\n singletonContexts[i].instance = instance;\n return;\n }\n }\n singletonContexts.push({\n name: className,\n context: context,\n instance: instance\n });\n }\n\n /*------------------------------------------------------------------------------------------*/\n\n // Factories storage Management\n\n /*------------------------------------------------------------------------------------------*/\n\n function getFactoryByName(name, factoriesArray) {\n return factoriesArray[name];\n }\n\n function updateFactory(name, factory, factoriesArray) {\n if (name in factoriesArray) {\n factoriesArray[name] = factory;\n }\n }\n\n /*------------------------------------------------------------------------------------------*/\n\n // Class Factories Management\n\n /*------------------------------------------------------------------------------------------*/\n\n function updateClassFactory(name, factory) {\n updateFactory(name, factory, classFactories);\n }\n\n function getClassFactoryByName(name) {\n return getFactoryByName(name, classFactories);\n }\n\n function getClassFactory(classConstructor) {\n let factory = getFactoryByName(classConstructor.__dashjs_factory_name, classFactories);\n\n if (!factory) {\n factory = function (context) {\n if (context === undefined) {\n context = {};\n }\n return {\n create: function () {\n return merge(classConstructor, context, arguments);\n }\n };\n };\n\n classFactories[classConstructor.__dashjs_factory_name] = factory; // store factory\n }\n return factory;\n }\n\n /*------------------------------------------------------------------------------------------*/\n\n // Singleton Factory MAangement\n\n /*------------------------------------------------------------------------------------------*/\n\n function updateSingletonFactory(name, factory) {\n updateFactory(name, factory, singletonFactories);\n }\n\n function getSingletonFactoryByName(name) {\n return getFactoryByName(name, singletonFactories);\n }\n\n function getSingletonFactory(classConstructor) {\n let factory = getFactoryByName(classConstructor.__dashjs_factory_name, singletonFactories);\n if (!factory) {\n factory = function (context) {\n let instance;\n if (context === undefined) {\n context = {};\n }\n return {\n getInstance: function () {\n // If we don't have an instance yet check for one on the context\n if (!instance) {\n instance = getSingletonInstance(context, classConstructor.__dashjs_factory_name);\n }\n // If there's no instance on the context then create one\n if (!instance) {\n instance = merge(classConstructor, context, arguments);\n singletonContexts.push({\n name: classConstructor.__dashjs_factory_name,\n context: context,\n instance: instance\n });\n }\n return instance;\n }\n };\n };\n singletonFactories[classConstructor.__dashjs_factory_name] = factory; // store factory\n }\n\n return factory;\n }\n\n function merge(classConstructor, context, args) {\n\n let classInstance;\n const className = classConstructor.__dashjs_factory_name;\n const extensionObject = context[className];\n\n if (extensionObject) {\n\n let extension = extensionObject.instance;\n\n if (extensionObject.override) { //Override public methods in parent but keep parent.\n\n classInstance = classConstructor.apply({context}, args);\n extension = extension.apply({\n context,\n factory: instance,\n parent: classInstance\n }, args);\n\n for (const prop in extension) {\n if (classInstance.hasOwnProperty(prop)) {\n classInstance[prop] = extension[prop];\n }\n }\n\n } else { //replace parent object completely with new object. Same as dijon.\n\n return extension.apply({\n context,\n factory: instance\n }, args);\n\n }\n } else {\n // Create new instance of the class\n classInstance = classConstructor.apply({context}, args);\n }\n\n // Add getClassName function to class instance prototype (used by Debug)\n classInstance.getClassName = function () {return className;};\n\n return classInstance;\n }\n\n instance = {\n extend: extend,\n getSingletonInstance: getSingletonInstance,\n setSingletonInstance: setSingletonInstance,\n getSingletonFactory: getSingletonFactory,\n getSingletonFactoryByName: getSingletonFactoryByName,\n updateSingletonFactory: updateSingletonFactory,\n getClassFactory: getClassFactory,\n getClassFactoryByName: getClassFactoryByName,\n updateClassFactory: updateClassFactory\n };\n\n return instance;\n\n}());\n\nexport default FactoryMaker;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from './FactoryMaker';\nimport Utils from './Utils.js';\nimport Debug from '../core/Debug';\nimport Constants from '../streaming/constants/Constants';\nimport {HTTPRequest} from '../streaming/vo/metrics/HTTPRequest';\n\n/** @module Settings\n * @description Define the configuration parameters of Dash.js MediaPlayer.\n * @see {@link module:Settings~PlayerSettings PlayerSettings} for further information about the supported configuration properties\n */\n\n\n/**\n * @typedef {Object} PlayerSettings\n * @property {module:Settings~DebugSettings} [debug] Debug related settings\n * @property {module:Settings~StreamingSettings} [streaming] Streaming related settings\n * @example\n *\n * // Full settings object\n * settings = {\n * debug: {\n * logLevel: Debug.LOG_LEVEL_WARNING\n * },\n * streaming: {\n * metricsMaxListDepth: 1000,\n * abandonLoadTimeout: 10000,\n * liveDelayFragmentCount: NaN,\n * liveDelay: null,\n * scheduleWhilePaused: true,\n * fastSwitchEnabled: false,\n * bufferPruningInterval: 10,\n * bufferToKeep: 20,\n * bufferAheadToKeep: 80,\n * jumpGaps: true,\n * smallGapLimit: 1.5,\n * stableBufferTime: 12,\n * bufferTimeAtTopQuality: 30,\n * bufferTimeAtTopQualityLongForm: 60,\n * longFormContentDurationThreshold: 600,\n * wallclockTimeUpdateInterval: 50,\n * lowLatencyEnabled: false,\n * keepProtectionMediaKeys: false,\n * useManifestDateHeaderTimeSource: true,\n * useSuggestedPresentationDelay: true,\n * useAppendWindowEnd: true,\n * manifestUpdateRetryInterval: 100,\n * liveCatchUpMinDrift: 0.02,\n * liveCatchUpMaxDrift: 0,\n * liveCatchUpPlaybackRate: 0.5,\n * lastBitrateCachingInfo: { enabled: true, ttl: 360000 },\n * lastMediaSettingsCachingInfo: { enabled: true, ttl: 360000 },\n * cacheLoadThresholds: { video: 50, audio: 5 },\n * retryIntervals: {\n * MPD: 500,\n * XLinkExpansion: 500,\n * InitializationSegment: 1000,\n * IndexSegment: 1000,\n * MediaSegment: 1000,\n * BitstreamSwitchingSegment: 1000,\n * other: 1000,\n * lowLatencyReductionFactor: 10\n * },\n * retryAttempts: {\n * MPD: 3,\n * XLinkExpansion: 1,\n * InitializationSegment: 3,\n * IndexSegment: 3,\n * MediaSegment: 3,\n * BitstreamSwitchingSegment: 3,\n * other: 3,\n * lowLatencyMultiplyFactor: 5\n * },\n * abr: {\n * movingAverageMethod: Constants.MOVING_AVERAGE_SLIDING_WINDOW,\n * ABRStrategy: Constants.ABR_STRATEGY_DYNAMIC,\n * bandwidthSafetyFactor: 0.9,\n * useDefaultABRRules: true,\n * useBufferOccupancyABR: false,\n * useDeadTimeLatency: true,\n * limitBitrateByPortal: false,\n * usePixelRatioInLimitBitrateByPortal: false,\n * maxBitrate: { audio: -1, video: -1 },\n * minBitrate: { audio: -1, video: -1 },\n * maxRepresentationRatio: { audio: 1, video: 1 },\n * initialBitrate: { audio: -1, video: -1 },\n * initialRepresentationRatio: { audio: -1, video: -1 },\n * autoSwitchBitrate: { audio: true, video: true }\n * },\n * cmcd: {\n * enabled: false,\n * sid: null,\n * cid: null,\n * did: null\n * }\n * }\n * }\n */\n\n\n/**\n * @typedef {Object} DebugSettings\n * @property {number} [logLevel=dashjs.Debug.LOG_LEVEL_WARNING]\n * Sets up the log level. The levels are cumulative. For example, if you set the log level\n * to dashjs.Debug.LOG_LEVEL_WARNING all warnings, errors and fatals will be logged. Possible values.\n *\n * \n * - dashjs.Debug.LOG_LEVEL_NONE
\n * No message is written in the browser console.\n *\n * - dashjs.Debug.LOG_LEVEL_FATAL
\n * Log fatal errors. An error is considered fatal when it causes playback to fail completely.\n *\n * - dashjs.Debug.LOG_LEVEL_ERROR
\n * Log error messages.\n *\n * - dashjs.Debug.LOG_LEVEL_WARNING
\n * Log warning messages.\n *\n * - dashjs.Debug.LOG_LEVEL_INFO
\n * Log info messages.\n *\n * - dashjs.Debug.LOG_LEVEL_DEBUG
\n * Log debug messages.\n *
\n */\n\n/**\n * @typedef {Object} AbrSettings\n * @property {string} [movingAverageMethod=\"slidingWindow\"]\n * Sets the moving average method used for smoothing throughput estimates. Valid methods are\n * \"slidingWindow\" and \"ewma\". The call has no effect if an invalid method is passed.\n *\n * The sliding window moving average method computes the average throughput using the last four segments downloaded.\n * If the stream is live (as opposed to VOD), then only the last three segments are used.\n * If wide variations in throughput are detected, the number of segments can be dynamically increased to avoid oscillations.\n *\n * The exponentially weighted moving average (EWMA) method computes the average using exponential smoothing.\n * Two separate estimates are maintained, a fast one with a three-second half life and a slow one with an eight-second half life.\n * The throughput estimate at any time is the minimum of the fast and slow estimates.\n * This allows a fast reaction to a bandwidth drop and prevents oscillations on bandwidth spikes.\n * @property {string} [ABRStrategy=\"abrDynamic\"] Returns the current ABR strategy being used: \"abrDynamic\", \"abrBola\" or \"abrThroughput\".\n * @property {number} [bandwidthSafetyFactor=0.9]\n * Standard ABR throughput rules multiply the throughput by this value. It should be between 0 and 1,\n * with lower values giving less rebuffering (but also lower quality).\n * @property {boolean} [useDefaultABRRules=true] Should the default ABR rules be used, or the custom ones added.\n * @property {boolean} [useBufferOccupancyABR=false] Whether to use the BOLA abr rule.\n * @property {boolean} [useDeadTimeLatency=true]\n * If true, only the download portion will be considered part of the download bitrate\n * and latency will be regarded as static. If false, the reciprocal of the whole\n * transfer time will be used.\n * @property {boolean} [limitBitrateByPortal=false] If true, the size of the video portal will limit the max chosen video resolution.\n * @property {boolean} [usePixelRatioInLimitBitrateByPortal=false]\n * Sets whether to take into account the device's pixel ratio when defining the portal dimensions.\n * Useful on, for example, retina displays.\n * @property {module:Settings~AudioVideoSettings} [maxBitrate={audio: -1, video: -1}] The maximum bitrate that the ABR algorithms will choose. Use NaN for no limit.\n * @property {module:Settings~AudioVideoSettings} [minBitrate={audio: -1, video: -1}] The minimum bitrate that the ABR algorithms will choose. Use NaN for no limit.\n * @property {module:Settings~AudioVideoSettings} [maxRepresentationRatio={audio: 1, video: 1}]\n * When switching multi-bitrate content (auto or manual mode) this property specifies the maximum representation allowed,\n * as a proportion of the size of the representation set.\n *\n * You can set or remove this cap at anytime before or during playback. To clear this setting you set the value to 1.\n *\n * If both this and maxAllowedBitrate are defined, maxAllowedBitrate is evaluated first, then maxAllowedRepresentation,\n * i.e. the lowest value from executing these rules is used.\n *\n * This feature is typically used to reserve higher representations for playback only when connected over a fast connection.\n * @property {module:Settings~AudioVideoSettings} [initialBitrate={audio: -1, video: -1}] Explicitly set the starting bitrate for audio or video\n * @property {module:Settings~AudioVideoSettings} [initialRepresentationRatio={audio: -1, video: -1}] Explicitly set the initial representation ratio. If initalBitrate is specified, this is ignored.\n * @property {module:Settings~AudioVideoSettings} [autoSwitchBitrate={audio: true, video: true}] Indicates whether the player should enable ABR algorithms to switch the bitrate.\n */\n\n/**\n * @typedef {Object} StreamingSettings\n * @property {number} [metricsMaxListDepth=1000] Maximum list depth of metrics.\n * @property {number} [abandonLoadTimeout=10000]\n * A timeout value in seconds, which during the ABRController will block switch-up events.\n * This will only take effect after an abandoned fragment event occurs.\n * @property {number} [liveDelayFragmentCount=NaN]\n * Changing this value will lower or increase live stream latency. The detected segment duration will be multiplied by this value\n * to define a time in seconds to delay a live stream from the live edge. Lowering this value will lower latency but may decrease\n * the player's ability to build a stable buffer.\n * @property {number} [liveDelay]\n * Equivalent in seconds of setLiveDelayFragmentCount
\n * Lowering this value will lower latency but may decrease the player's ability to build a stable buffer.
\n * This value should be less than the manifest duration by a couple of segment durations to avoid playback issues
\n * If set, this parameter will take precedence over setLiveDelayFragmentCount and manifest info
\n * @property {boolean} [scheduleWhilePaused=true]\n * Set to true if you would like dash.js to keep downloading fragments in the background\n * when the video element is paused.\n * @property {boolean} [fastSwitchEnabled=false]\n * When enabled, after an ABR up-switch in quality, instead of requesting and appending the next fragment\n * at the end of the current buffer range it is requested and appended closer to the current time\n * When enabled, The maximum time to render a higher quality is current time + (1.5 * fragment duration).\n *\n * Note, When ABR down-switch is detected, we appended the lower quality at the end of the buffer range to preserve the\n * higher quality media for as long as possible.\n *\n * If enabled, it should be noted there are a few cases when the client will not replace inside buffer range but rather\n * just append at the end. 1. When the buffer level is less than one fragment duration 2. The client\n * is in an Abandonment State due to recent fragment abandonment event.\n *\n * Known issues:\n * 1. In IE11 with auto switching off, if a user switches to a quality they can not download in time the\n * fragment may be appended in the same range as the playhead or even in the past, in IE11 it may cause a stutter\n * or stall in playback.\n * @property {number} [bufferPruningInterval=10] The interval of pruning buffer in sconds.\n * @property {number} [bufferToKeep=20]\n * This value influences the buffer pruning logic.\n * Allows you to modify the buffer that is kept in source buffer in seconds.\n * 0|-----------bufferToPrune-----------|-----bufferToKeep-----|currentTime|\n * @property {number} [bufferAheadToKeep=80]\n * This value influences the buffer pruning logic.\n * Allows you to modify the buffer ahead of current time position that is kept in source buffer in seconds.\n * 0|--------|currentTime|-----bufferAheadToKeep----|----bufferToPrune-----------|end|
\n * @property {boolean} [jumpGaps=true] Sets whether player should jump small gaps (discontinuities) in the buffer.\n * @property {number} [smallGapLimit=1.8] Time in seconds for a gap to be considered small.\n * @property {number} [stableBufferTime=12]\n * The time that the internal buffer target will be set to post startup/seeks (NOT top quality).\n *\n * When the time is set higher than the default you will have to wait longer\n * to see automatic bitrate switches but will have a larger buffer which\n * will increase stability.\n * @property {number} [bufferTimeAtTopQuality=30]\n * The time that the internal buffer target will be set to once playing the top quality.\n * If there are multiple bitrates in your adaptation, and the media is playing at the highest\n * bitrate, then we try to build a larger buffer at the top quality to increase stability\n * and to maintain media quality.\n * @property {number} [bufferTimeAtTopQualityLongForm=60] The time that the internal buffer target will be set to once playing the top quality for long form content.\n * @property {number} [longFormContentDurationThreshold=600]\n * The threshold which defines if the media is considered long form content.\n * This will directly affect the buffer targets when playing back at the top quality.\n * @property {number} [wallclockTimeUpdateInterval=50] How frequently the wallclockTimeUpdated internal event is triggered (in milliseconds).\n * @property {boolean} [lowLatencyEnabled=false] Enable or disable low latency mode\n * @property {boolean} [keepProtectionMediaKeys=false]\n * Set the value for the ProtectionController and MediaKeys life cycle. If true, the\n * ProtectionController and then created MediaKeys and MediaKeySessions will be preserved during\n * the MediaPlayer lifetime.\n * @property {boolean} [useManifestDateHeaderTimeSource=true]\n * Allows you to enable the use of the Date Header, if exposed with CORS, as a timing source for live edge detection. The\n * use of the date header will happen only after the other timing source that take precedence fail or are omitted as described.\n * @property {boolean} [useSuggestedPresentationDelay=true]\n *
Set to true if you would like to override the default live delay and honor the SuggestedPresentationDelay attribute in by the manifest.
\n * @property {boolean} [useAppendWindowEnd=true]\n * Specifies if the appendWindowEnd attribute of the MSE SourceBuffers should be set according to content duration from manifest.\n * @property {number} [manifestUpdateRetryInterval=100]\n * For live streams, set the interval-frequency in milliseconds at which\n * dash.js will check if the current manifest is still processed before\n * downloading the next manifest once the minimumUpdatePeriod time has\n * @property {number} [liveCatchUpMinDrift=0.02]\n * Use this method to set the minimum latency deviation allowed before activating catch-up mechanism. In low latency mode,\n * when the difference between the measured latency and the target one,\n * as an absolute number, is higher than the one sets with this method, then dash.js increases/decreases\n * playback rate until target latency is reached.\n *\n * LowLatencyMinDrift should be provided in seconds, and it uses values between 0.0 and 0.5.\n *\n * Note: Catch-up mechanism is only applied when playing low latency live streams.\n * @property {number} [liveCatchUpMaxDrift=0]\n * Use this method to set the maximum latency deviation allowed before dash.js to do a seeking to live position. In low latency mode,\n * when the difference between the measured latency and the target one,\n * as an absolute number, is higher than the one sets with this method, then dash.js does a seek to live edge position minus\n * the target live delay.\n *\n * LowLatencyMaxDriftBeforeSeeking should be provided in seconds. If 0, then seeking operations won't be used for\n * fixing latency deviations.\n *\n * Note: Catch-up mechanism is only applied when playing low latency live streams.\n * @property {number} [liveCatchUpPlaybackRate=0.5]\n * Use this parameter to set the maximum catch up rate, as a percentage, for low latency live streams. In low latency mode,\n * when measured latency is higher/lower than the target one,\n * dash.js increases/decreases playback rate respectively up to (+/-) the percentage defined with this method until target is reached.\n *\n * Valid values for catch up rate are in range 0-0.5 (0-50%). Set it to 0 to turn off live catch up feature.\n *\n * Note: Catch-up mechanism is only applied when playing low latency live streams.\n * @property {number} [liveCatchupLatencyThreshold=NaN]\n * Use this parameter to set the maximum threshold for which live catch up is applied. For instance, if this value is set to 8 seconds,\n * then live catchup is only applied if the current live latency is equal or below 8 seconds. The reason behind this parameter is to avoid an increase\n * of the playback rate if the user seeks within the DVR window.\n *\n * If no value is specified this will be twice the maximum live delay. The maximum live delay is either specified in the manifest as part of a ServiceDescriptor or calculated the following:\n * maximumLiveDelay = targetDelay + liveCatchupMinDrift\n *\n * Note: Catch-up mechanism is only applied when playing low latency live streams.\n * @property {module:Settings~CachingInfoSettings} [lastBitrateCachingInfo={enabled: true, ttl: 360000}]\n * Set to false if you would like to disable the last known bit rate from being stored during playback and used\n * to set the initial bit rate for subsequent playback within the expiration window.\n *\n * The default expiration is one hour, defined in milliseconds. If expired, the default initial bit rate (closest to 1000 kbps) will be used\n * for that session and a new bit rate will be stored during that session.\n * @property {module:Settings~CachingInfoSettings} [lastMediaSettingsCachingInfo={enabled: true, ttl: 360000}]\n * Set to false if you would like to disable the last known lang for audio (or camera angle for video) from being stored during playback and used\n * to set the initial settings for subsequent playback within the expiration window.\n *\n * The default expiration is one hour, defined in milliseconds. If expired, the default settings will be used\n * for that session and a new settings will be stored during that session.\n * @property {module:Settings~AudioVideoSettings} [cacheLoadThresholds={video: 50, audio: 5}]\n * For a given media type, the threshold which defines if the response to a fragment\n * request is coming from browser cache or not.\n * @property {module:Settings~RequestTypeSettings} [retryIntervals] Time in milliseconds of which to reload a failed file load attempt. For low latency mode these values are divided by lowLatencyReductionFactor.\n * @property {module:Settings~RequestTypeSettings} [retryAttempts] Total number of retry attempts that will occur on a file load before it fails. For low latency mode these values are multiplied by lowLatencyMultiplyFactor.\n * @property {module:Settings~AbrSettings} abr Adaptive Bitrate algorithm related settings.\n * @property {module:Settings~CmcdSettings} cmcd Settings related to Common Media Client Data reporting.\n */\n\n/**\n * @typedef {Object} CachingInfoSettings\n * @property {boolean} [enable] Enable or disable the caching feature.\n * @property {number} [ttl] Time to live. A value defined in milliseconds representing how log to cache the settings for.\n */\n\n/**\n * @typedef {Object} module:Settings~AudioVideoSettings\n * @property {number|boolean} [audio] Configuration for audio media type of tracks.\n * @property {number|boolean} [video] Configuration for video media type of tracks.\n */\n\n/**\n * @typedef {Object} RequestTypeSettings\n * @property {number} [MPD] Manifest type of requests\n * @property {number} [XLinkExpansion] XLink expansion type of requests\n * @property {number} [InitializationSegment] Request to retrieve an initialization segment\n * @property {number} [IndexSegment] Request to retrieve an index segment (SegmentBase)\n * @property {number} [MediaSegment] Request to retrieve a media segment (video/audio/image/text chunk)\n * @property {number} [BitstreamSwitchingSegment] Bitrate stream switching type of request\n * @property {number} [other] Other type of request\n *\n */\n\n/**\n * @typedef {Object} module:Settings~CmcdSettings\n * @property {boolean} [enable=false] Enable or disable the CMCD reporting.\n * @property {string} [sid] GUID identifying the current playback session. Should be in UUID format. If not specified a UUID will be automatically generated.\n * @property {string} [cid] A unique string to identify the current content. If not specified it will be a hash of the MPD url.\n * @property {string} [did=dash.js-cmcd-default-id] A unique string identifying the current device.\n */\n\n\n/**\n * @class\n * @ignore\n */\nfunction Settings() {\n let instance;\n\n /**\n * @const {PlayerSettings} defaultSettings\n * @ignore\n */\n const defaultSettings = {\n debug: {\n logLevel: Debug.LOG_LEVEL_WARNING\n },\n streaming: {\n metricsMaxListDepth: 1000,\n abandonLoadTimeout: 10000,\n liveDelayFragmentCount: NaN,\n liveDelay: null,\n scheduleWhilePaused: true,\n fastSwitchEnabled: false,\n bufferPruningInterval: 10,\n bufferToKeep: 20,\n bufferAheadToKeep: 80,\n jumpGaps: true,\n smallGapLimit: 1.5,\n stableBufferTime: 12,\n bufferTimeAtTopQuality: 30,\n bufferTimeAtTopQualityLongForm: 60,\n longFormContentDurationThreshold: 600,\n wallclockTimeUpdateInterval: 50,\n lowLatencyEnabled: false,\n keepProtectionMediaKeys: false,\n useManifestDateHeaderTimeSource: true,\n useSuggestedPresentationDelay: true,\n useAppendWindowEnd: true,\n manifestUpdateRetryInterval: 100,\n liveCatchUpMinDrift: 0.02,\n liveCatchUpMaxDrift: 0,\n liveCatchUpPlaybackRate: 0.5,\n liveCatchupLatencyThreshold: NaN,\n lastBitrateCachingInfo: {enabled: true, ttl: 360000},\n lastMediaSettingsCachingInfo: {enabled: true, ttl: 360000},\n cacheLoadThresholds: {video: 50, audio: 5},\n retryIntervals: {\n [HTTPRequest.MPD_TYPE]: 500,\n [HTTPRequest.XLINK_EXPANSION_TYPE]: 500,\n [HTTPRequest.MEDIA_SEGMENT_TYPE]: 1000,\n [HTTPRequest.INIT_SEGMENT_TYPE]: 1000,\n [HTTPRequest.BITSTREAM_SWITCHING_SEGMENT_TYPE]: 1000,\n [HTTPRequest.INDEX_SEGMENT_TYPE]: 1000,\n [HTTPRequest.OTHER_TYPE]: 1000,\n lowLatencyReductionFactor: 10\n },\n retryAttempts: {\n [HTTPRequest.MPD_TYPE]: 3,\n [HTTPRequest.XLINK_EXPANSION_TYPE]: 1,\n [HTTPRequest.MEDIA_SEGMENT_TYPE]: 3,\n [HTTPRequest.INIT_SEGMENT_TYPE]: 3,\n [HTTPRequest.BITSTREAM_SWITCHING_SEGMENT_TYPE]: 3,\n [HTTPRequest.INDEX_SEGMENT_TYPE]: 3,\n [HTTPRequest.OTHER_TYPE]: 3,\n lowLatencyMultiplyFactor: 5\n },\n abr: {\n movingAverageMethod: Constants.MOVING_AVERAGE_SLIDING_WINDOW,\n ABRStrategy: Constants.ABR_STRATEGY_DYNAMIC,\n bandwidthSafetyFactor: 0.9,\n useDefaultABRRules: true,\n useBufferOccupancyABR: false,\n useDeadTimeLatency: true,\n limitBitrateByPortal: false,\n usePixelRatioInLimitBitrateByPortal: false,\n maxBitrate: {audio: -1, video: -1},\n minBitrate: {audio: -1, video: -1},\n maxRepresentationRatio: {audio: 1, video: 1},\n initialBitrate: {audio: -1, video: -1},\n initialRepresentationRatio: {audio: -1, video: -1},\n autoSwitchBitrate: {audio: true, video: true}\n },\n cmcd: {\n enabled: false,\n sid: null,\n cid: null,\n did: null\n }\n }\n };\n\n let settings = Utils.clone(defaultSettings);\n\n //Merge in the settings. If something exists in the new config that doesn't match the schema of the default config,\n //regard it as an error and log it.\n function mixinSettings(source, dest, path) {\n for (let n in source) {\n if (source.hasOwnProperty(n)) {\n if (dest.hasOwnProperty(n)) {\n if (typeof source[n] === 'object' && source[n] !== null) {\n mixinSettings(source[n], dest[n], path.slice() + n + '.');\n } else {\n dest[n] = Utils.clone(source[n]);\n }\n }\n }\n }\n }\n\n /**\n * Return the settings object. Don't copy/store this object, you won't get updates.\n * @func\n * @instance\n */\n function get() {\n return settings;\n }\n\n /**\n * @func\n * @instance\n * @param {object} settingsObj - This should be a partial object of the Settings.Schema type. That is, fields defined should match the path (e.g.\n * settingsObj.streaming.abr.autoSwitchBitrate.audio -> defaultSettings.streaming.abr.autoSwitchBitrate.audio). Where an element's path does\n * not match it is ignored, and a warning is logged.\n *\n * Use to change the settings object. Any new values defined will overwrite the settings and anything undefined will not change.\n * Implementers of new settings should add it in an approriate namespace to the defaultSettings object and give it a default value (that is not undefined).\n *\n */\n function update(settingsObj) {\n if (typeof settingsObj === 'object') {\n mixinSettings(settingsObj, settings, '');\n }\n }\n\n /**\n * Resets the settings object. Everything is set to its default value.\n * @func\n * @instance\n *\n */\n function reset() {\n settings = Utils.clone(defaultSettings);\n }\n\n instance = {\n get: get,\n update: update,\n reset: reset\n };\n\n return instance;\n}\n\n\nSettings.__dashjs_factory_name = 'Settings';\nlet factory = FactoryMaker.getSingletonFactory(Settings);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @class\n * @ignore\n */\n\nclass Utils {\n static mixin(dest, source, copy) {\n let s;\n let empty = {};\n if (dest) {\n for (let name in source) {\n if (source.hasOwnProperty(name)) {\n s = source[name];\n if (!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))) {\n if (typeof dest[name] === 'object' && dest[name] !== null) {\n dest[name] = Utils.mixin(dest[name], s, copy);\n } else {\n dest[name] = copy(s);\n }\n }\n }\n }\n }\n return dest;\n }\n\n static clone(src) {\n if (!src || typeof src !== 'object') {\n return src; // anything\n }\n let r;\n if (src instanceof Array) {\n // array\n r = [];\n for (let i = 0, l = src.length; i < l; ++i) {\n if (i in src) {\n r.push(Utils.clone(src[i]));\n }\n }\n } else {\n r = {};\n }\n return Utils.mixin(r, src, Utils.clone);\n }\n\n static addAditionalQueryParameterToUrl(url, params) {\n try {\n if (!params || params.length === 0) {\n return url;\n }\n\n let modifiedUrl = new URL(url);\n\n params.forEach((param) => {\n if (param.key && param.value) {\n modifiedUrl.searchParams.set(param.key, param.value);\n }\n });\n\n return modifiedUrl.href;\n\n\n } catch (e) {\n return url;\n }\n }\n\n static generateUuid() {\n let dt = new Date().getTime();\n const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (dt + Math.random() * 16) % 16 | 0;\n dt = Math.floor(dt / 16);\n return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);\n });\n return uuid;\n }\n\n static generateHashCode(string) {\n let hash = 0;\n\n if (string.length === 0) {\n return hash;\n }\n\n for (let i = 0; i < string.length; i++) {\n const chr = string.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0;\n }\n return hash;\n }\n}\n\nexport default Utils;\n","const VERSION = '3.1.2';\nexport function getVersionString() {\n return VERSION;\n}\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport ErrorsBase from './ErrorsBase';\n/**\n * Errors declaration\n * @class\n */\nclass Errors extends ErrorsBase {\n constructor () {\n super();\n /**\n * Error code returned when a manifest parsing error occurs\n */\n this.MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE = 10;\n /**\n * Error code returned when a manifest loading error occurs\n */\n this.MANIFEST_LOADER_LOADING_FAILURE_ERROR_CODE = 11;\n /**\n * Error code returned when a xlink loading error occurs\n */\n this.XLINK_LOADER_LOADING_FAILURE_ERROR_CODE = 12;\n /**\n * Error code returned when the update of segments list has failed\n */\n this.SEGMENTS_UPDATE_FAILED_ERROR_CODE = 13;\n this.SEGMENTS_UNAVAILABLE_ERROR_CODE = 14;\n this.SEGMENT_BASE_LOADER_ERROR_CODE = 15;\n this.TIME_SYNC_FAILED_ERROR_CODE = 16;\n this.FRAGMENT_LOADER_LOADING_FAILURE_ERROR_CODE = 17;\n this.FRAGMENT_LOADER_NULL_REQUEST_ERROR_CODE = 18;\n this.URL_RESOLUTION_FAILED_GENERIC_ERROR_CODE = 19;\n this.APPEND_ERROR_CODE = 20;\n this.REMOVE_ERROR_CODE = 21;\n this.DATA_UPDATE_FAILED_ERROR_CODE = 22;\n /**\n * Error code returned when MediaSource is not supported by the browser\n */\n this.CAPABILITY_MEDIASOURCE_ERROR_CODE = 23;\n /**\n * Error code returned when Protected contents are not supported\n */\n this.CAPABILITY_MEDIAKEYS_ERROR_CODE = 24;\n\n this.DOWNLOAD_ERROR_ID_MANIFEST_CODE = 25;\n\n this.DOWNLOAD_ERROR_ID_SIDX_CODE = 26;\n this.DOWNLOAD_ERROR_ID_CONTENT_CODE = 27;\n\n this.DOWNLOAD_ERROR_ID_INITIALIZATION_CODE = 28;\n\n this.DOWNLOAD_ERROR_ID_XLINK_CODE = 29;\n\n this.MANIFEST_ERROR_ID_CODEC_CODE = 30;\n this.MANIFEST_ERROR_ID_PARSE_CODE = 31;\n\n /**\n * Error code returned when no stream (period) has been detected in the manifest\n */\n this.MANIFEST_ERROR_ID_NOSTREAMS_CODE = 32;\n /**\n * Error code returned when something wrong has append during subtitles parsing (TTML or VTT)\n */\n this.TIMED_TEXT_ERROR_ID_PARSE_CODE = 33;\n /**\n * Error code returned when a 'muxed' media type has been detected in the manifest. This type is not supported\n */\n this.MANIFEST_ERROR_ID_MULTIPLEXED_CODE = 34;\n /**\n * Error code returned when a media source type is not supported\n */\n this.MEDIASOURCE_TYPE_UNSUPPORTED_CODE = 35;\n\n this.MANIFEST_LOADER_PARSING_FAILURE_ERROR_MESSAGE = 'parsing failed for ';\n this.MANIFEST_LOADER_LOADING_FAILURE_ERROR_MESSAGE = 'Failed loading manifest: ';\n this.XLINK_LOADER_LOADING_FAILURE_ERROR_MESSAGE = 'Failed loading Xlink element: ';\n this.SEGMENTS_UPDATE_FAILED_ERROR_MESSAGE = 'Segments update failed';\n this.SEGMENTS_UNAVAILABLE_ERROR_MESSAGE = 'no segments are available yet';\n this.SEGMENT_BASE_LOADER_ERROR_MESSAGE = 'error loading segments';\n this.TIME_SYNC_FAILED_ERROR_MESSAGE = 'Failed to synchronize time';\n this.FRAGMENT_LOADER_NULL_REQUEST_ERROR_MESSAGE = 'request is null';\n this.URL_RESOLUTION_FAILED_GENERIC_ERROR_MESSAGE = 'Failed to resolve a valid URL';\n this.APPEND_ERROR_MESSAGE = 'chunk is not defined';\n this.REMOVE_ERROR_MESSAGE = 'buffer is not defined';\n this.DATA_UPDATE_FAILED_ERROR_MESSAGE = 'Data update failed';\n\n this.CAPABILITY_MEDIASOURCE_ERROR_MESSAGE = 'mediasource is not supported';\n this.CAPABILITY_MEDIAKEYS_ERROR_MESSAGE = 'mediakeys is not supported';\n this.TIMED_TEXT_ERROR_MESSAGE_PARSE = 'parsing error :';\n this.MEDIASOURCE_TYPE_UNSUPPORTED_MESSAGE = 'Error creating source buffer of type : ';\n }\n}\n\nlet errors = new Errors();\nexport default errors;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass ErrorsBase {\n extend (errors, config) {\n if (!errors) return;\n\n let override = config ? config.override : false;\n let publicOnly = config ? config.publicOnly : false;\n\n\n for (const err in errors) {\n if (!errors.hasOwnProperty(err) || (this[err] && !override)) continue;\n if (publicOnly && errors[err].indexOf('public_') === -1) continue;\n this[err] = errors[err];\n\n }\n }\n}\n\nexport default ErrorsBase;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventsBase from './EventsBase';\n\n/**\n * These are internal events that should not be needed at the player level.\n * If you find and event in here that you would like access to from MediaPlayer level\n * please add an issue at https://github.com/Dash-Industry-Forum/dash.js/issues/new\n * @class\n * @ignore\n */\nclass CoreEvents extends EventsBase {\n constructor () {\n super();\n this.BUFFERING_COMPLETED = 'bufferingCompleted';\n this.BUFFER_CLEARED = 'bufferCleared';\n this.BUFFER_LEVEL_UPDATED = 'bufferLevelUpdated';\n this.BYTES_APPENDED = 'bytesAppended';\n this.BYTES_APPENDED_END_FRAGMENT = 'bytesAppendedEndFragment';\n this.CHECK_FOR_EXISTENCE_COMPLETED = 'checkForExistenceCompleted';\n this.CURRENT_TRACK_CHANGED = 'currentTrackChanged';\n this.DATA_UPDATE_COMPLETED = 'dataUpdateCompleted';\n this.DATA_UPDATE_STARTED = 'dataUpdateStarted';\n this.INBAND_EVENTS = 'inbandEvents';\n this.INITIALIZATION_LOADED = 'initializationLoaded';\n this.INIT_FRAGMENT_LOADED = 'initFragmentLoaded';\n this.INIT_FRAGMENT_NEEDED = 'initFragmentNeeded';\n this.INTERNAL_MANIFEST_LOADED = 'internalManifestLoaded';\n this.ORIGINAL_MANIFEST_LOADED = 'originalManifestLoaded';\n this.LIVE_EDGE_SEARCH_COMPLETED = 'liveEdgeSearchCompleted';\n this.LOADING_COMPLETED = 'loadingCompleted';\n this.LOADING_PROGRESS = 'loadingProgress';\n this.LOADING_DATA_PROGRESS = 'loadingDataProgress';\n this.LOADING_ABANDONED = 'loadingAborted';\n this.MANIFEST_UPDATED = 'manifestUpdated';\n this.MEDIA_FRAGMENT_LOADED = 'mediaFragmentLoaded';\n this.MEDIA_FRAGMENT_NEEDED = 'mediaFragmentNeeded';\n this.QUOTA_EXCEEDED = 'quotaExceeded';\n this.REPRESENTATION_UPDATE_STARTED = 'representationUpdateStarted';\n this.REPRESENTATION_UPDATE_COMPLETED = 'representationUpdateCompleted';\n this.SEGMENTS_LOADED = 'segmentsLoaded';\n this.SERVICE_LOCATION_BLACKLIST_ADD = 'serviceLocationBlacklistAdd';\n this.SERVICE_LOCATION_BLACKLIST_CHANGED = 'serviceLocationBlacklistChanged';\n this.SOURCEBUFFER_REMOVE_COMPLETED = 'sourceBufferRemoveCompleted';\n this.STREAMS_COMPOSED = 'streamsComposed';\n this.STREAM_BUFFERING_COMPLETED = 'streamBufferingCompleted';\n this.STREAM_COMPLETED = 'streamCompleted';\n this.TEXT_TRACKS_QUEUE_INITIALIZED = 'textTracksQueueInitialized';\n this.TIME_SYNCHRONIZATION_COMPLETED = 'timeSynchronizationComplete';\n this.URL_RESOLUTION_FAILED = 'urlResolutionFailed';\n this.VIDEO_CHUNK_RECEIVED = 'videoChunkReceived';\n this.WALLCLOCK_TIME_UPDATED = 'wallclockTimeUpdated';\n this.XLINK_ELEMENT_LOADED = 'xlinkElementLoaded';\n this.XLINK_READY = 'xlinkReady';\n this.SEGMENTBASE_INIT_REQUEST_NEEDED = 'segmentBaseInitRequestNeeded';\n this.SEGMENTBASE_SEGMENTSLIST_REQUEST_NEEDED = 'segmentBaseSegmentsListRequestNeeded';\n this.SEEK_TARGET = 'seekTarget';\n this.DYNAMIC_STREAM_COMPLETED = 'dynamicStreamCompleted';\n }\n}\n\nexport default CoreEvents;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nimport CoreEvents from './CoreEvents';\nclass Events extends CoreEvents {\n}\nlet events = new Events();\nexport default events;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass EventsBase {\n extend (events, config) {\n if (!events) return;\n\n let override = config ? config.override : false;\n let publicOnly = config ? config.publicOnly : false;\n\n\n for (const evt in events) {\n if (!events.hasOwnProperty(evt) || (this[evt] && !override)) continue;\n if (publicOnly && events[evt].indexOf('public_') === -1) continue;\n this[evt] = events[evt];\n\n }\n }\n}\n\nexport default EventsBase;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FragmentRequest from '../streaming/vo/FragmentRequest';\nimport { HTTPRequest } from '../streaming/vo/metrics/HTTPRequest';\nimport FactoryMaker from '../core/FactoryMaker';\nimport {\n replaceIDForTemplate,\n unescapeDollarsInTemplate,\n replaceTokenForTemplate,\n getTimeBasedSegment\n} from './utils/SegmentsUtils';\n\nimport SegmentsController from './controllers/SegmentsController';\n\nfunction DashHandler(config) {\n\n config = config || {};\n const context = this.context;\n\n const eventBus = config.eventBus;\n const events = config.events;\n const debug = config.debug;\n const dashConstants = config.dashConstants;\n const urlUtils = config.urlUtils;\n const type = config.type;\n const streamInfo = config.streamInfo;\n\n const timelineConverter = config.timelineConverter;\n const dashMetrics = config.dashMetrics;\n const baseURLController = config.baseURLController;\n\n let instance,\n logger,\n segmentIndex,\n lastSegment,\n requestedTime,\n currentTime,\n isDynamicManifest,\n dynamicStreamCompleted,\n selectedMimeType,\n segmentsController;\n\n function setup() {\n logger = debug.getLogger(instance);\n resetInitialSettings();\n\n segmentsController = SegmentsController(context).create(config);\n\n eventBus.on(events.INITIALIZATION_LOADED, onInitializationLoaded, instance);\n eventBus.on(events.SEGMENTS_LOADED, onSegmentsLoaded, instance);\n eventBus.on(events.REPRESENTATION_UPDATE_STARTED, onRepresentationUpdateStarted, instance);\n eventBus.on(events.DYNAMIC_STREAM_COMPLETED, onDynamicStreamCompleted, instance);\n }\n\n function initialize(isDynamic) {\n isDynamicManifest = isDynamic;\n dynamicStreamCompleted = false;\n segmentsController.initialize(isDynamic);\n }\n\n function getType() {\n return type;\n }\n\n function getStreamInfo() {\n return streamInfo;\n }\n\n function setCurrentTime(value) {\n currentTime = value;\n }\n\n function getCurrentTime() {\n return currentTime;\n }\n\n function setCurrentIndex (value) {\n segmentIndex = value;\n }\n\n function getCurrentIndex () {\n return segmentIndex;\n }\n\n function resetIndex() {\n segmentIndex = -1;\n lastSegment = null;\n }\n\n function resetInitialSettings() {\n resetIndex();\n currentTime = 0;\n requestedTime = null;\n segmentsController = null;\n selectedMimeType = null;\n }\n\n function reset() {\n resetInitialSettings();\n\n eventBus.off(events.INITIALIZATION_LOADED, onInitializationLoaded, instance);\n eventBus.off(events.SEGMENTS_LOADED, onSegmentsLoaded, instance);\n eventBus.off(events.REPRESENTATION_UPDATE_STARTED, onRepresentationUpdateStarted, instance);\n eventBus.off(events.DYNAMIC_STREAM_COMPLETED, onDynamicStreamCompleted, instance);\n }\n\n function setRequestUrl(request, destination, representation) {\n const baseURL = baseURLController.resolve(representation.path);\n let url,\n serviceLocation;\n\n if (!baseURL || (destination === baseURL.url) || (!urlUtils.isRelative(destination))) {\n url = destination;\n } else {\n url = baseURL.url;\n serviceLocation = baseURL.serviceLocation;\n\n if (destination) {\n url = urlUtils.resolve(destination, url);\n }\n }\n\n if (urlUtils.isRelative(url)) {\n return false;\n }\n\n request.url = url;\n request.serviceLocation = serviceLocation;\n\n return true;\n }\n\n function generateInitRequest(mediaInfo, representation, mediaType) {\n const request = new FragmentRequest();\n const period = representation.adaptation.period;\n const presentationStartTime = period.start;\n\n request.mediaType = mediaType;\n request.type = HTTPRequest.INIT_SEGMENT_TYPE;\n request.range = representation.range;\n request.availabilityStartTime = timelineConverter.calcAvailabilityStartTimeFromPresentationTime(presentationStartTime, period.mpd, isDynamicManifest);\n request.availabilityEndTime = timelineConverter.calcAvailabilityEndTimeFromPresentationTime(presentationStartTime + period.duration, period.mpd, isDynamicManifest);\n request.quality = representation.index;\n request.mediaInfo = mediaInfo;\n request.representationId = representation.id;\n\n if (setRequestUrl(request, representation.initialization, representation)) {\n request.url = replaceTokenForTemplate(request.url, 'Bandwidth', representation.bandwidth);\n return request;\n }\n }\n\n function getInitRequest(mediaInfo, representation) {\n if (!representation) return null;\n const request = generateInitRequest(mediaInfo, representation, getType());\n return request;\n }\n\n function setMimeType(newMimeType) {\n selectedMimeType = newMimeType;\n }\n\n function setExpectedLiveEdge(liveEdge) {\n timelineConverter.setExpectedLiveEdge(liveEdge);\n dashMetrics.updateManifestUpdateInfo({presentationStartTime: liveEdge});\n }\n\n function onRepresentationUpdateStarted(eventObj) {\n if (eventObj.sender.getType() !== getType()) return;\n\n processRepresentation(eventObj.representation);\n }\n\n function processRepresentation(voRepresentation) {\n const hasInitialization = voRepresentation.hasInitialization();\n const hasSegments = voRepresentation.hasSegments();\n\n //if representation has initialization and segments information, REPRESENTATION_UPDATE_COMPLETED can be triggered immediately\n //otherwise, it means that a request has to be made to get initialization and/or segments informations\n if (hasInitialization && hasSegments) {\n eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, {sender: instance, representation: voRepresentation});\n } else {\n segmentsController.update(voRepresentation, getType(), selectedMimeType, hasInitialization, hasSegments);\n }\n }\n\n function getRequestForSegment(mediaInfo, segment) {\n if (segment === null || segment === undefined) {\n return null;\n }\n\n const request = new FragmentRequest();\n const representation = segment.representation;\n const bandwidth = representation.adaptation.period.mpd.manifest.Period_asArray[representation.adaptation.period.index].\n AdaptationSet_asArray[representation.adaptation.index].Representation_asArray[representation.index].bandwidth;\n let url = segment.media;\n\n url = replaceTokenForTemplate(url, 'Number', segment.replacementNumber);\n url = replaceTokenForTemplate(url, 'Time', segment.replacementTime);\n url = replaceTokenForTemplate(url, 'Bandwidth', bandwidth);\n url = replaceIDForTemplate(url, representation.id);\n url = unescapeDollarsInTemplate(url);\n\n request.mediaType = getType();\n request.type = HTTPRequest.MEDIA_SEGMENT_TYPE;\n request.range = segment.mediaRange;\n request.startTime = segment.presentationStartTime;\n request.duration = segment.duration;\n request.timescale = representation.timescale;\n request.availabilityStartTime = segment.availabilityStartTime;\n request.availabilityEndTime = segment.availabilityEndTime;\n request.wallStartTime = segment.wallStartTime;\n request.quality = representation.index;\n request.index = segment.availabilityIdx;\n request.mediaInfo = mediaInfo;\n request.adaptationIndex = representation.adaptation.index;\n request.representationId = representation.id;\n\n if (setRequestUrl(request, url, representation)) {\n return request;\n }\n }\n\n function isMediaFinished(representation) {\n let isFinished = false;\n\n if (!representation) return isFinished;\n\n if (!isDynamicManifest) {\n if (segmentIndex >= representation.availableSegmentsNumber) {\n isFinished = true;\n }\n } else {\n if (dynamicStreamCompleted) {\n isFinished = true;\n } else if (lastSegment) {\n const time = parseFloat((lastSegment.presentationStartTime - representation.adaptation.period.start).toFixed(5));\n const endTime = lastSegment.duration > 0 ? time + 1.5 * lastSegment.duration : time;\n const duration = representation.adaptation.period.duration;\n\n isFinished = endTime >= duration;\n }\n }\n\n return isFinished;\n }\n\n function getSegmentRequestForTime(mediaInfo, representation, time, options) {\n let request = null;\n\n if (!representation || !representation.segmentInfoType) {\n return request;\n }\n\n const idx = segmentIndex;\n const keepIdx = options ? options.keepIdx : false;\n const ignoreIsFinished = (options && options.ignoreIsFinished) ? true : false;\n\n if (requestedTime !== time) { // When playing at live edge with 0 delay we may loop back with same time and index until it is available. Reduces verboseness of logs.\n requestedTime = time;\n logger.debug('Getting the request for time : ' + time);\n }\n\n const segment = segmentsController.getSegmentByTime(representation, time);\n if (segment) {\n segmentIndex = segment.availabilityIdx;\n lastSegment = segment;\n logger.debug('Index for time ' + time + ' is ' + segmentIndex);\n request = getRequestForSegment(mediaInfo, segment);\n } else {\n const finished = !ignoreIsFinished ? isMediaFinished(representation) : false;\n if (finished) {\n request = new FragmentRequest();\n request.action = FragmentRequest.ACTION_COMPLETE;\n request.index = segmentIndex - 1;\n request.mediaType = type;\n request.mediaInfo = mediaInfo;\n logger.debug('Signal complete in getSegmentRequestForTime');\n }\n }\n\n if (keepIdx && idx >= 0) {\n segmentIndex = representation.segmentInfoType === dashConstants.SEGMENT_TIMELINE && isDynamicManifest ? segmentIndex : idx;\n }\n\n return request;\n }\n\n function getNextSegmentRequest(mediaInfo, representation) {\n let request = null;\n\n if (!representation || !representation.segmentInfoType) {\n return null;\n }\n\n requestedTime = null;\n\n const indexToRequest = segmentIndex + 1;\n logger.debug('Getting the next request at index: ' + indexToRequest);\n\n // check that there is a segment in this index\n const segment = segmentsController.getSegmentByIndex(representation, indexToRequest, lastSegment ? lastSegment.mediaStartTime : -1);\n if (!segment && isEndlessMedia(representation) && !dynamicStreamCompleted) {\n logger.debug('No segment found at index: ' + indexToRequest + '. Wait for next loop');\n return null;\n } else {\n if (segment) {\n request = getRequestForSegment(mediaInfo, segment);\n segmentIndex = segment.availabilityIdx;\n } else {\n if (isDynamicManifest) {\n segmentIndex = indexToRequest - 1;\n } else {\n segmentIndex = indexToRequest;\n }\n }\n }\n\n if (segment) {\n lastSegment = segment;\n } else {\n const finished = isMediaFinished(representation, segment);\n if (finished) {\n request = new FragmentRequest();\n request.action = FragmentRequest.ACTION_COMPLETE;\n request.index = segmentIndex - 1;\n request.mediaType = getType();\n request.mediaInfo = mediaInfo;\n logger.debug('Signal complete');\n }\n }\n\n return request;\n }\n\n function isEndlessMedia(representation) {\n return !isFinite(representation.adaptation.period.duration);\n }\n\n function onInitializationLoaded(e) {\n const representation = e.representation;\n if (!representation.segments) return;\n\n eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, {sender: this, representation: representation});\n }\n\n function onSegmentsLoaded(e) {\n if (e.error || (getType() !== e.mediaType)) return;\n\n const fragments = e.segments;\n const representation = e.representation;\n const segments = [];\n let count = 0;\n\n let i,\n len,\n s,\n seg;\n\n for (i = 0, len = fragments ? fragments.length : 0; i < len; i++) {\n s = fragments[i];\n\n seg = getTimeBasedSegment(\n timelineConverter,\n isDynamicManifest,\n representation,\n s.startTime,\n s.duration,\n s.timescale,\n s.media,\n s.mediaRange,\n count);\n\n if (seg) {\n segments.push(seg);\n seg = null;\n count++;\n }\n }\n\n if (segments.length > 0) {\n representation.segmentAvailabilityRange = {start: segments[0].presentationStartTime, end: segments[segments.length - 1].presentationStartTime};\n representation.availableSegmentsNumber = segments.length;\n representation.segments = segments;\n\n if (isDynamicManifest) {\n const lastSegment = segments[segments.length - 1];\n const liveEdge = lastSegment.presentationStartTime - 8;\n // the last segment is the Expected, not calculated, live edge.\n setExpectedLiveEdge(liveEdge);\n }\n }\n\n if (!representation.hasInitialization()) {\n return;\n }\n\n eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, {sender: this, representation: representation});\n }\n\n function onDynamicStreamCompleted() {\n logger.debug('Dynamic stream complete');\n dynamicStreamCompleted = true;\n }\n\n instance = {\n initialize: initialize,\n getType: getType, //need to be public in order to be used by logger\n getStreamInfo: getStreamInfo,\n getInitRequest: getInitRequest,\n getRequestForSegment: getRequestForSegment,\n getSegmentRequestForTime: getSegmentRequestForTime,\n getNextSegmentRequest: getNextSegmentRequest,\n setCurrentTime: setCurrentTime,\n getCurrentTime: getCurrentTime,\n setCurrentIndex: setCurrentIndex,\n getCurrentIndex: getCurrentIndex,\n isMediaFinished: isMediaFinished,\n reset: reset,\n resetIndex: resetIndex,\n setMimeType: setMimeType\n };\n\n setup();\n\n return instance;\n}\n\nDashHandler.__dashjs_factory_name = 'DashHandler';\nexport default FactoryMaker.getClassFactory(DashHandler);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Dash constants declaration\n * @class\n * @ignore\n */\nclass DashConstants {\n\n init() {\n this.BASE_URL = 'BaseURL';\n this.SEGMENT_BASE = 'SegmentBase';\n this.SEGMENT_TEMPLATE = 'SegmentTemplate';\n this.SEGMENT_LIST = 'SegmentList';\n this.SEGMENT_URL = 'SegmentURL';\n this.SEGMENT_TIMELINE = 'SegmentTimeline';\n this.SEGMENT_PROFILES = 'segmentProfiles';\n this.ADAPTATION_SET = 'AdaptationSet';\n this.REPRESENTATION = 'Representation';\n this.REPRESENTATION_INDEX = 'RepresentationIndex';\n this.SUB_REPRESENTATION = 'SubRepresentation';\n this.INITIALIZATION = 'Initialization';\n this.INITIALIZATION_MINUS = 'initialization';\n this.MPD = 'MPD';\n this.PERIOD = 'Period';\n this.ASSET_IDENTIFIER = 'AssetIdentifier';\n this.EVENT_STREAM = 'EventStream';\n this.ID = 'id';\n this.PROFILES = 'profiles';\n this.SERVICE_LOCATION = 'serviceLocation';\n this.RANGE = 'range';\n this.INDEX = 'index';\n this.MEDIA = 'media';\n this.BYTE_RANGE = 'byteRange';\n this.INDEX_RANGE = 'indexRange';\n this.MEDIA_RANGE = 'mediaRange';\n this.VALUE = 'value';\n this.CONTENT_TYPE = 'contentType';\n this.MIME_TYPE = 'mimeType';\n this.BITSTREAM_SWITCHING = 'BitstreamSwitching';\n this.BITSTREAM_SWITCHING_MINUS = 'bitstreamSwitching';\n this.CODECS = 'codecs';\n this.DEPENDENCY_ID = 'dependencyId';\n this.MEDIA_STREAM_STRUCTURE_ID = 'mediaStreamStructureId';\n this.METRICS = 'Metrics';\n this.METRICS_MINUS = 'metrics';\n this.REPORTING = 'Reporting';\n this.WIDTH = 'width';\n this.HEIGHT = 'height';\n this.SAR = 'sar';\n this.FRAMERATE = 'frameRate';\n this.AUDIO_SAMPLING_RATE = 'audioSamplingRate';\n this.MAXIMUM_SAP_PERIOD = 'maximumSAPPeriod';\n this.START_WITH_SAP = 'startWithSAP';\n this.MAX_PLAYOUT_RATE = 'maxPlayoutRate';\n this.CODING_DEPENDENCY = 'codingDependency';\n this.SCAN_TYPE = 'scanType';\n this.FRAME_PACKING = 'FramePacking';\n this.AUDIO_CHANNEL_CONFIGURATION = 'AudioChannelConfiguration';\n this.CONTENT_PROTECTION = 'ContentProtection';\n this.ESSENTIAL_PROPERTY = 'EssentialProperty';\n this.SUPPLEMENTAL_PROPERTY = 'SupplementalProperty';\n this.INBAND_EVENT_STREAM = 'InbandEventStream';\n this.ACCESSIBILITY = 'Accessibility';\n this.ROLE = 'Role';\n this.RATING = 'Rating';\n this.CONTENT_COMPONENT = 'ContentComponent';\n this.SUBSET = 'Subset';\n this.LANG = 'lang';\n this.VIEWPOINT = 'Viewpoint';\n this.ROLE_ASARRAY = 'Role_asArray';\n this.ACCESSIBILITY_ASARRAY = 'Accessibility_asArray';\n this.AUDIOCHANNELCONFIGURATION_ASARRAY = 'AudioChannelConfiguration_asArray';\n this.CONTENTPROTECTION_ASARRAY = 'ContentProtection_asArray';\n this.MAIN = 'main';\n this.DYNAMIC = 'dynamic';\n this.STATIC = 'static';\n this.MEDIA_PRESENTATION_DURATION = 'mediaPresentationDuration';\n this.MINIMUM_UPDATE_PERIOD = 'minimumUpdatePeriod';\n this.CODEC_PRIVATE_DATA = 'codecPrivateData';\n this.BANDWITH = 'bandwidth';\n this.SOURCE_URL = 'sourceURL';\n this.TIMESCALE = 'timescale';\n this.DURATION = 'duration';\n this.START_NUMBER = 'startNumber';\n this.PRESENTATION_TIME_OFFSET = 'presentationTimeOffset';\n this.AVAILABILITY_START_TIME = 'availabilityStartTime';\n this.AVAILABILITY_END_TIME = 'availabilityEndTime';\n this.TIMESHIFT_BUFFER_DEPTH = 'timeShiftBufferDepth';\n this.MAX_SEGMENT_DURATION = 'maxSegmentDuration';\n this.PRESENTATION_TIME = 'presentationTime';\n this.MIN_BUFFER_TIME = 'minBufferTime';\n this.MAX_SUBSEGMENT_DURATION = 'maxSubsegmentDuration';\n this.START = 'start';\n this.AVAILABILITY_TIME_OFFSET = 'availabilityTimeOffset';\n this.AVAILABILITY_TIME_COMPLETE = 'availabilityTimeComplete';\n this.CENC_DEFAULT_KID = 'cenc:default_KID';\n this.DVB_PRIORITY = 'dvb:priority';\n this.DVB_WEIGHT = 'dvb:weight';\n this.SUGGESTED_PRESENTATION_DELAY = 'suggestedPresentationDelay';\n this.SERVICE_DESCRIPTION = 'ServiceDescription';\n this.SERVICE_DESCRIPTION_SCOPE = 'Scope';\n this.SERVICE_DESCRIPTION_LATENCY = 'Latency';\n this.SERVICE_DESCRIPTION_PLAYBACK_RATE = 'PlaybackRate';\n }\n\n constructor () {\n this.init();\n }\n}\n\nlet constants = new DashConstants();\nexport default constants;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../../streaming/constants/Constants';\nimport DashJSError from '../../streaming/vo/DashJSError';\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction RepresentationController(config) {\n\n config = config || {};\n const eventBus = config.eventBus;\n const events = config.events;\n const errors = config.errors;\n const abrController = config.abrController;\n const dashMetrics = config.dashMetrics;\n const playbackController = config.playbackController;\n const timelineConverter = config.timelineConverter;\n const type = config.type;\n const streamId = config.streamId;\n const dashConstants = config.dashConstants;\n\n let instance,\n realAdaptation,\n updating,\n voAvailableRepresentations,\n currentVoRepresentation;\n\n function setup() {\n resetInitialSettings();\n\n eventBus.on(events.QUALITY_CHANGE_REQUESTED, onQualityChanged, instance);\n eventBus.on(events.REPRESENTATION_UPDATE_COMPLETED, onRepresentationUpdated, instance);\n eventBus.on(events.WALLCLOCK_TIME_UPDATED, onWallclockTimeUpdated, instance);\n eventBus.on(events.MANIFEST_VALIDITY_CHANGED, onManifestValidityChanged, instance);\n }\n\n function checkConfig() {\n if (!abrController || !dashMetrics || !playbackController || !timelineConverter) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function getData() {\n return realAdaptation;\n }\n\n function isUpdating() {\n return updating;\n }\n\n function getCurrentRepresentation() {\n return currentVoRepresentation;\n }\n\n function resetInitialSettings() {\n realAdaptation = null;\n updating = true;\n voAvailableRepresentations = [];\n }\n\n function reset() {\n\n eventBus.off(events.QUALITY_CHANGE_REQUESTED, onQualityChanged, instance);\n eventBus.off(events.REPRESENTATION_UPDATE_COMPLETED, onRepresentationUpdated, instance);\n eventBus.off(events.WALLCLOCK_TIME_UPDATED, onWallclockTimeUpdated, instance);\n eventBus.off(events.MANIFEST_VALIDITY_CHANGED, onManifestValidityChanged, instance);\n\n resetInitialSettings();\n }\n\n function getType() {\n return type;\n }\n\n function getStreamId() {\n return streamId;\n }\n\n function updateData(newRealAdaptation, availableRepresentations, type, quality) {\n checkConfig();\n\n startDataUpdate();\n\n voAvailableRepresentations = availableRepresentations;\n\n currentVoRepresentation = getRepresentationForQuality(quality);\n realAdaptation = newRealAdaptation;\n\n if (type !== Constants.VIDEO && type !== Constants.AUDIO && type !== Constants.FRAGMENTED_TEXT) {\n endDataUpdate();\n return;\n }\n\n updateAvailabilityWindow(playbackController.getIsDynamic(), true);\n }\n\n function addRepresentationSwitch() {\n checkConfig();\n const now = new Date();\n const currentRepresentation = getCurrentRepresentation();\n const currentVideoTimeMs = playbackController.getTime() * 1000;\n if (currentRepresentation) {\n dashMetrics.addRepresentationSwitch(currentRepresentation.adaptation.type, now, currentVideoTimeMs, currentRepresentation.id);\n }\n }\n\n function getRepresentationForQuality(quality) {\n return quality === null || quality === undefined || quality >= voAvailableRepresentations.length ? null : voAvailableRepresentations[quality];\n }\n\n function getQualityForRepresentation(voRepresentation) {\n return voAvailableRepresentations.indexOf(voRepresentation);\n }\n\n function isAllRepresentationsUpdated() {\n for (let i = 0, ln = voAvailableRepresentations.length; i < ln; i++) {\n let segmentInfoType = voAvailableRepresentations[i].segmentInfoType;\n if (voAvailableRepresentations[i].segmentAvailabilityRange === null || !voAvailableRepresentations[i].hasInitialization() ||\n ((segmentInfoType === dashConstants.SEGMENT_BASE || segmentInfoType === dashConstants.BASE_URL) && !voAvailableRepresentations[i].segments)\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n function setExpectedLiveEdge(liveEdge) {\n timelineConverter.setExpectedLiveEdge(liveEdge);\n dashMetrics.updateManifestUpdateInfo({presentationStartTime: liveEdge});\n }\n\n function updateRepresentation(representation, isDynamic) {\n representation.segmentAvailabilityRange = timelineConverter.calcSegmentAvailabilityRange(representation, isDynamic);\n\n if ((representation.segmentAvailabilityRange.end < representation.segmentAvailabilityRange.start) && !representation.useCalculatedLiveEdgeTime) {\n let error = new DashJSError(errors.SEGMENTS_UNAVAILABLE_ERROR_CODE, errors.SEGMENTS_UNAVAILABLE_ERROR_MESSAGE, {availabilityDelay: representation.segmentAvailabilityRange.start - representation.segmentAvailabilityRange.end});\n endDataUpdate(error);\n return;\n }\n\n if (isDynamic) {\n setExpectedLiveEdge(representation.segmentAvailabilityRange.end);\n }\n }\n\n function updateAvailabilityWindow(isDynamic, notifyUpdate) {\n checkConfig();\n\n for (let i = 0, ln = voAvailableRepresentations.length; i < ln; i++) {\n updateRepresentation(voAvailableRepresentations[i], isDynamic);\n if (notifyUpdate) {\n eventBus.trigger(events.REPRESENTATION_UPDATE_STARTED, {\n sender: instance,\n representation: voAvailableRepresentations[i]\n });\n }\n }\n }\n\n function resetAvailabilityWindow() {\n voAvailableRepresentations.forEach(rep => {\n rep.segmentAvailabilityRange = null;\n });\n }\n\n function startDataUpdate() {\n updating = true;\n eventBus.trigger(events.DATA_UPDATE_STARTED, {sender: instance});\n }\n\n function endDataUpdate(error) {\n updating = false;\n let eventArg = {sender: instance, data: realAdaptation, currentRepresentation: currentVoRepresentation};\n if (error) {\n eventArg.error = error;\n }\n eventBus.trigger(events.DATA_UPDATE_COMPLETED, eventArg);\n }\n\n function postponeUpdate(postponeTimePeriod) {\n let delay = postponeTimePeriod;\n let update = function () {\n if (isUpdating()) return;\n\n startDataUpdate();\n\n // clear the segmentAvailabilityRange for all reps.\n // this ensures all are updated before the live edge search starts\n resetAvailabilityWindow();\n\n updateAvailabilityWindow(playbackController.getIsDynamic(), true);\n };\n eventBus.trigger(events.AST_IN_FUTURE, {delay: delay});\n setTimeout(update, delay);\n }\n\n function onRepresentationUpdated(e) {\n if (e.sender.getType() !== getType() || e.sender.getStreamInfo().id !== streamId || !isUpdating()) return;\n\n if (e.error) {\n endDataUpdate(e.error);\n return;\n }\n\n let streamInfo = e.sender.getStreamInfo();\n let r = e.representation;\n let manifestUpdateInfo = dashMetrics.getCurrentManifestUpdate();\n let alreadyAdded = false;\n let postponeTimePeriod = 0;\n let repInfo,\n err,\n repSwitch;\n\n if (r.adaptation.period.mpd.manifest.type === dashConstants.DYNAMIC && !r.adaptation.period.mpd.manifest.ignorePostponeTimePeriod) {\n // We must put things to sleep unless till e.g. the startTime calculation in ScheduleController.onLiveEdgeSearchCompleted fall after the segmentAvailabilityRange.start\n postponeTimePeriod = getRepresentationUpdatePostponeTimePeriod(r, streamInfo);\n }\n\n if (postponeTimePeriod > 0) {\n postponeUpdate(postponeTimePeriod);\n err = new DashJSError(errors.SEGMENTS_UPDATE_FAILED_ERROR_CODE, errors.SEGMENTS_UPDATE_FAILED_ERROR_MESSAGE);\n endDataUpdate(err);\n return;\n }\n\n if (manifestUpdateInfo) {\n for (let i = 0; i < manifestUpdateInfo.representationInfo.length; i++) {\n repInfo = manifestUpdateInfo.representationInfo[i];\n if (repInfo.index === r.index && repInfo.mediaType === getType()) {\n alreadyAdded = true;\n break;\n }\n }\n\n if (!alreadyAdded) {\n dashMetrics.addManifestUpdateRepresentationInfo(r, getType());\n }\n }\n\n if (isAllRepresentationsUpdated()) {\n abrController.setPlaybackQuality(getType(), streamInfo, getQualityForRepresentation(currentVoRepresentation));\n dashMetrics.updateManifestUpdateInfo({latency: currentVoRepresentation.segmentAvailabilityRange.end - playbackController.getTime()});\n\n repSwitch = dashMetrics.getCurrentRepresentationSwitch(getCurrentRepresentation().adaptation.type);\n\n if (!repSwitch) {\n addRepresentationSwitch();\n }\n endDataUpdate();\n }\n }\n\n function getRepresentationUpdatePostponeTimePeriod(representation, streamInfo) {\n try {\n const streamController = playbackController.getStreamController();\n const activeStreamInfo = streamController.getActiveStreamInfo();\n let startTimeAnchor = representation.segmentAvailabilityRange.start;\n\n if (activeStreamInfo && activeStreamInfo.id && activeStreamInfo.id !== streamInfo.id) {\n // We need to consider the currently playing period if a period switch is performed.\n startTimeAnchor = Math.min(playbackController.getTime(), startTimeAnchor);\n }\n\n let segmentAvailabilityTimePeriod = representation.segmentAvailabilityRange.end - startTimeAnchor;\n let liveDelay = playbackController.getLiveDelay();\n\n return (liveDelay - segmentAvailabilityTimePeriod) * 1000;\n } catch (e) {\n return 0;\n }\n }\n\n function onWallclockTimeUpdated(e) {\n if (e.isDynamic) {\n updateAvailabilityWindow(e.isDynamic);\n }\n }\n\n function onQualityChanged(e) {\n if (e.mediaType !== getType() || streamId !== e.streamInfo.id) return;\n\n currentVoRepresentation = getRepresentationForQuality(e.newQuality);\n addRepresentationSwitch();\n }\n\n function onManifestValidityChanged(e) {\n if (e.newDuration) {\n const representation = getCurrentRepresentation();\n if (representation && representation.adaptation.period) {\n const period = representation.adaptation.period;\n period.duration = e.newDuration;\n }\n }\n }\n\n instance = {\n getData: getData,\n isUpdating: isUpdating,\n updateData: updateData,\n updateRepresentation: updateRepresentation,\n getCurrentRepresentation: getCurrentRepresentation,\n getRepresentationForQuality: getRepresentationForQuality,\n getType: getType,\n getStreamId: getStreamId,\n reset: reset\n };\n\n setup();\n return instance;\n}\n\nRepresentationController.__dashjs_factory_name = 'RepresentationController';\nexport default FactoryMaker.getClassFactory(RepresentationController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport TimelineSegmentsGetter from '../utils/TimelineSegmentsGetter';\nimport TemplateSegmentsGetter from '../utils/TemplateSegmentsGetter';\nimport ListSegmentsGetter from '../utils/ListSegmentsGetter';\nimport SegmentBaseGetter from '../utils/SegmentBaseGetter';\n\nfunction SegmentsController(config) {\n config = config || {};\n\n const context = this.context;\n const events = config.events;\n const eventBus = config.eventBus;\n const dashConstants = config.dashConstants;\n\n let instance,\n getters;\n\n function setup() {\n getters = {};\n }\n\n function initialize(isDynamic) {\n getters[dashConstants.SEGMENT_TIMELINE] = TimelineSegmentsGetter(context).create(config, isDynamic);\n getters[dashConstants.SEGMENT_TEMPLATE] = TemplateSegmentsGetter(context).create(config, isDynamic);\n getters[dashConstants.SEGMENT_LIST] = ListSegmentsGetter(context).create(config, isDynamic);\n getters[dashConstants.SEGMENT_BASE] = SegmentBaseGetter(context).create(config, isDynamic);\n }\n\n function update(voRepresentation, type, mimeType, hasInitialization, hasSegments) {\n if (!hasInitialization) {\n eventBus.trigger(events.SEGMENTBASE_INIT_REQUEST_NEEDED, {mimeType: mimeType, representation: voRepresentation});\n }\n\n if (!hasSegments) {\n eventBus.trigger(events.SEGMENTBASE_SEGMENTSLIST_REQUEST_NEEDED, {mimeType: mimeType, mediaType: type, representation: voRepresentation});\n }\n }\n\n function getSegmentsGetter(representation) {\n return representation ? representation.segments ? getters[dashConstants.SEGMENT_BASE] : getters[representation.segmentInfoType] : null;\n }\n\n function getSegmentByIndex(representation, index, lastSegmentTime) {\n const getter = getSegmentsGetter(representation);\n return getter ? getter.getSegmentByIndex(representation, index, lastSegmentTime) : null;\n }\n\n function getSegmentByTime(representation, time) {\n const getter = getSegmentsGetter(representation);\n return getter ? getter.getSegmentByTime(representation, time) : null;\n }\n\n instance = {\n initialize: initialize,\n update: update,\n getSegmentByIndex: getSegmentByIndex,\n getSegmentByTime: getSegmentByTime\n };\n\n setup();\n\n return instance;\n}\n\nSegmentsController.__dashjs_factory_name = 'SegmentsController';\nconst factory = FactoryMaker.getClassFactory(SegmentsController);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../../streaming/constants/Constants';\nimport DashConstants from '../constants/DashConstants';\nimport Representation from '../vo/Representation';\nimport AdaptationSet from '../vo/AdaptationSet';\nimport Period from '../vo/Period';\nimport Mpd from '../vo/Mpd';\nimport UTCTiming from '../vo/UTCTiming';\nimport Event from '../vo/Event';\nimport BaseURL from '../vo/BaseURL';\nimport EventStream from '../vo/EventStream';\nimport ObjectUtils from '../../streaming/utils/ObjectUtils';\nimport URLUtils from '../../streaming/utils/URLUtils';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport DashJSError from '../../streaming/vo/DashJSError';\nimport Errors from '../../core/errors/Errors';\nimport { THUMBNAILS_SCHEME_ID_URIS } from '../../streaming/thumbnail/ThumbnailTracks';\n\nfunction DashManifestModel() {\n let instance,\n logger,\n errHandler,\n BASE64;\n\n const context = this.context;\n const urlUtils = URLUtils(context).getInstance();\n\n const isInteger = Number.isInteger || function (value) {\n return typeof value === 'number' &&\n isFinite(value) &&\n Math.floor(value) === value;\n };\n\n function setup () {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n function getIsTypeOf(adaptation, type) {\n\n let i,\n len,\n representation,\n col,\n mimeTypeRegEx,\n codecs;\n let result = false;\n let found = false;\n\n if (!adaptation) {\n throw new Error('adaptation is not defined');\n }\n\n if (!type) {\n throw new Error('type is not defined');\n }\n\n if (adaptation.hasOwnProperty('ContentComponent_asArray')) {\n col = adaptation.ContentComponent_asArray;\n }\n\n mimeTypeRegEx = (type !== Constants.TEXT) ? new RegExp(type) : new RegExp('(vtt|ttml)');\n\n if (adaptation.Representation_asArray && adaptation.Representation_asArray.length && adaptation.Representation_asArray.length > 0) {\n let essentialProperties = getEssentialPropertiesForRepresentation(adaptation.Representation_asArray[0]);\n if (essentialProperties && essentialProperties.length > 0 && THUMBNAILS_SCHEME_ID_URIS.indexOf(essentialProperties[0].schemeIdUri) >= 0) {\n return type === Constants.IMAGE;\n }\n if (adaptation.Representation_asArray[0].hasOwnProperty(DashConstants.CODECS)) {\n // Just check the start of the codecs string\n codecs = adaptation.Representation_asArray[0].codecs;\n if (codecs.search(Constants.STPP) === 0 || codecs.search(Constants.WVTT) === 0) {\n return type === Constants.FRAGMENTED_TEXT;\n }\n }\n }\n\n if (col) {\n if (col.length > 1) {\n return (type === Constants.MUXED);\n } else if (col[0] && col[0].contentType === type) {\n result = true;\n found = true;\n }\n }\n\n if (adaptation.hasOwnProperty(DashConstants.MIME_TYPE)) {\n result = mimeTypeRegEx.test(adaptation.mimeType);\n found = true;\n }\n\n // couldn't find on adaptationset, so check a representation\n if (!found) {\n i = 0;\n len = adaptation.Representation_asArray && adaptation.Representation_asArray.length ? adaptation.Representation_asArray.length : 0;\n while (!found && i < len) {\n representation = adaptation.Representation_asArray[i];\n\n if (representation.hasOwnProperty(DashConstants.MIME_TYPE)) {\n result = mimeTypeRegEx.test(representation.mimeType);\n found = true;\n }\n\n i++;\n }\n }\n\n return result;\n }\n\n function getIsAudio(adaptation) {\n return getIsTypeOf(adaptation, Constants.AUDIO);\n }\n\n function getIsVideo(adaptation) {\n return getIsTypeOf(adaptation, Constants.VIDEO);\n }\n\n function getIsFragmentedText(adaptation) {\n return getIsTypeOf(adaptation, Constants.FRAGMENTED_TEXT);\n }\n\n function getIsMuxed(adaptation) {\n return getIsTypeOf(adaptation, Constants.MUXED);\n }\n\n function getIsImage(adaptation) {\n return getIsTypeOf(adaptation, Constants.IMAGE);\n }\n\n function getIsTextTrack(type) {\n return (type === 'text/vtt' || type === 'application/ttml+xml');\n }\n\n function getLanguageForAdaptation(adaptation) {\n let lang = '';\n\n if (adaptation && adaptation.hasOwnProperty(DashConstants.LANG)) {\n //Filter out any other characters not allowed according to RFC5646\n lang = adaptation.lang.replace(/[^A-Za-z0-9-]/g, '');\n }\n\n return lang;\n }\n\n function getViewpointForAdaptation(adaptation) {\n return adaptation && adaptation.hasOwnProperty(DashConstants.VIEWPOINT) ? adaptation.Viewpoint : null;\n }\n\n function getRolesForAdaptation(adaptation) {\n return adaptation && adaptation.hasOwnProperty(DashConstants.ROLE_ASARRAY) ? adaptation.Role_asArray : [];\n }\n\n function getAccessibilityForAdaptation(adaptation) {\n return adaptation && adaptation.hasOwnProperty(DashConstants.ACCESSIBILITY_ASARRAY) ? adaptation.Accessibility_asArray : [];\n }\n\n function getAudioChannelConfigurationForAdaptation(adaptation) {\n return adaptation && adaptation.hasOwnProperty(DashConstants.AUDIOCHANNELCONFIGURATION_ASARRAY) ? adaptation.AudioChannelConfiguration_asArray : [];\n }\n\n function getAudioChannelConfigurationForRepresentation(representation) {\n return representation && representation.hasOwnProperty(DashConstants.AUDIOCHANNELCONFIGURATION_ASARRAY) ? representation.AudioChannelConfiguration_asArray : [];\n }\n\n function getRepresentationSortFunction() {\n return (a, b) => a.bandwidth - b.bandwidth;\n }\n\n function processAdaptation(realAdaptation) {\n if (realAdaptation && Array.isArray(realAdaptation.Representation_asArray)) {\n realAdaptation.Representation_asArray.sort(getRepresentationSortFunction());\n }\n\n return realAdaptation;\n }\n\n function getRealAdaptations(manifest, periodIndex) {\n return manifest && manifest.Period_asArray && isInteger(periodIndex) ? manifest.Period_asArray[periodIndex] ? manifest.Period_asArray[periodIndex].AdaptationSet_asArray : [] : [];\n }\n\n function getAdaptationForId(id, manifest, periodIndex) {\n const realAdaptations = getRealAdaptations(manifest, periodIndex);\n let i,\n len;\n\n for (i = 0, len = realAdaptations.length; i < len; i++) {\n if (realAdaptations[i].hasOwnProperty(DashConstants.ID) && realAdaptations[i].id === id) {\n return realAdaptations[i];\n }\n }\n\n return null;\n }\n\n function getAdaptationForIndex(index, manifest, periodIndex) {\n const realAdaptations = getRealAdaptations(manifest, periodIndex);\n if (realAdaptations.length > 0 && isInteger(index)) {\n return realAdaptations[index];\n } else {\n return null;\n }\n }\n\n function getIndexForAdaptation(realAdaptation, manifest, periodIndex) {\n if (!realAdaptation) {\n return -1;\n }\n\n const realAdaptations = getRealAdaptations(manifest, periodIndex);\n\n for (let i = 0; i < realAdaptations.length; i++) {\n let objectUtils = ObjectUtils(context).getInstance();\n if (objectUtils.areEqual(realAdaptations[i], realAdaptation)) {\n return i;\n }\n }\n\n return -1;\n }\n\n function getAdaptationsForType(manifest, periodIndex, type) {\n const realAdaptations = getRealAdaptations(manifest, periodIndex);\n let i,\n len;\n const adaptations = [];\n\n for (i = 0, len = realAdaptations.length; i < len; i++) {\n if (getIsTypeOf(realAdaptations[i], type)) {\n adaptations.push(processAdaptation(realAdaptations[i]));\n }\n }\n\n return adaptations;\n }\n\n function getCodec(adaptation, representationId, addResolutionInfo) {\n let codec = null;\n\n if (adaptation && adaptation.Representation_asArray && adaptation.Representation_asArray.length > 0) {\n const representation = isInteger(representationId) && representationId >= 0 && representationId < adaptation.Representation_asArray.length ?\n adaptation.Representation_asArray[representationId] : adaptation.Representation_asArray[0];\n if (representation) {\n codec = representation.mimeType + ';codecs=\"' + representation.codecs + '\"';\n if (addResolutionInfo && representation.width !== undefined) {\n codec += ';width=\"' + representation.width + '\";height=\"' + representation.height + '\"';\n }\n }\n }\n\n // If the codec contains a profiles parameter we remove it. Otherwise it will cause problems when checking for codec capabilities of the platform\n if (codec) {\n codec = codec.replace(/\\sprofiles=[^;]*/g, '');\n }\n\n return codec;\n }\n\n function getMimeType(adaptation) {\n return adaptation && adaptation.Representation_asArray && adaptation.Representation_asArray.length > 0 ? adaptation.Representation_asArray[0].mimeType : null;\n }\n\n function getKID(adaptation) {\n if (!adaptation || !adaptation.hasOwnProperty(DashConstants.CENC_DEFAULT_KID)) {\n return null;\n }\n return adaptation[DashConstants.CENC_DEFAULT_KID];\n }\n\n function getLabelsForAdaptation(adaptation) {\n if (!adaptation || !Array.isArray(adaptation.Label_asArray)) {\n return [];\n }\n\n const labelArray = [];\n\n for (let i = 0; i < adaptation.Label_asArray.length; i++) {\n labelArray.push({\n lang: adaptation.Label_asArray[i].lang,\n text: adaptation.Label_asArray[i].__text || adaptation.Label_asArray[i]\n });\n }\n\n return labelArray;\n }\n\n function getContentProtectionData(adaptation) {\n if (!adaptation || !adaptation.hasOwnProperty(DashConstants.CONTENTPROTECTION_ASARRAY) || adaptation.ContentProtection_asArray.length === 0) {\n return null;\n }\n return adaptation.ContentProtection_asArray;\n }\n\n function getIsDynamic(manifest) {\n let isDynamic = false;\n if (manifest && manifest.hasOwnProperty('type')) {\n isDynamic = (manifest.type === DashConstants.DYNAMIC);\n }\n return isDynamic;\n }\n\n function hasProfile(manifest, profile) {\n let has = false;\n\n if (manifest && manifest.profiles && manifest.profiles.length > 0) {\n has = (manifest.profiles.indexOf(profile) !== -1);\n }\n\n return has;\n }\n\n function getDuration(manifest) {\n let mpdDuration;\n //@mediaPresentationDuration specifies the duration of the entire Media Presentation.\n //If the attribute is not present, the duration of the Media Presentation is unknown.\n if (manifest && manifest.hasOwnProperty(DashConstants.MEDIA_PRESENTATION_DURATION)) {\n mpdDuration = manifest.mediaPresentationDuration;\n } else if (manifest && manifest.type == 'dynamic') {\n mpdDuration = Number.POSITIVE_INFINITY;\n } else {\n mpdDuration = Number.MAX_SAFE_INTEGER || Number.MAX_VALUE;\n }\n\n return mpdDuration;\n }\n\n function getBandwidth(representation) {\n return representation && representation.bandwidth ? representation.bandwidth : NaN;\n }\n\n function getManifestUpdatePeriod(manifest, latencyOfLastUpdate = 0) {\n let delay = NaN;\n if (manifest && manifest.hasOwnProperty(DashConstants.MINIMUM_UPDATE_PERIOD)) {\n delay = manifest.minimumUpdatePeriod;\n }\n return isNaN(delay) ? delay : Math.max(delay - latencyOfLastUpdate, 1);\n }\n\n function getRepresentationCount(adaptation) {\n return adaptation && Array.isArray(adaptation.Representation_asArray) ? adaptation.Representation_asArray.length : 0;\n }\n\n function getBitrateListForAdaptation(realAdaptation) {\n const processedRealAdaptation = processAdaptation(realAdaptation);\n const realRepresentations = processedRealAdaptation && Array.isArray(processedRealAdaptation.Representation_asArray) ? processedRealAdaptation.Representation_asArray : [];\n\n return realRepresentations.map((realRepresentation) => {\n return {\n bandwidth: realRepresentation.bandwidth,\n width: realRepresentation.width || 0,\n height: realRepresentation.height || 0,\n scanType: realRepresentation.scanType || null,\n id: realRepresentation.id || null\n };\n });\n }\n\n function getEssentialPropertiesForRepresentation(realRepresentation) {\n if (!realRepresentation || ! realRepresentation.EssentialProperty_asArray || !realRepresentation.EssentialProperty_asArray.length) return null;\n\n return realRepresentation.EssentialProperty_asArray.map( (prop) => {\n return {\n schemeIdUri: prop.schemeIdUri,\n value: prop.value\n };\n });\n }\n\n function getRepresentationFor(index, adaptation) {\n return adaptation && adaptation.Representation_asArray && adaptation.Representation_asArray.length > 0 &&\n isInteger(index) ? adaptation.Representation_asArray[index] : null;\n }\n\n function getRealAdaptationFor(voAdaptation) {\n if (voAdaptation && voAdaptation.period && isInteger(voAdaptation.period.index)) {\n const periodArray = voAdaptation.period.mpd.manifest.Period_asArray[voAdaptation.period.index];\n if (periodArray && periodArray.AdaptationSet_asArray && isInteger(voAdaptation.index)) {\n return processAdaptation(periodArray.AdaptationSet_asArray[voAdaptation.index]);\n }\n }\n }\n\n function isLastRepeatAttributeValid(segmentTimeline) {\n let s = segmentTimeline.S_asArray[segmentTimeline.S_asArray.length - 1];\n return !s.hasOwnProperty('r') || s.r >= 0;\n }\n\n function getUseCalculatedLiveEdgeTimeForAdaptation(voAdaptation) {\n let realAdaptation = getRealAdaptationFor(voAdaptation);\n let realRepresentation = realAdaptation && Array.isArray(realAdaptation.Representation_asArray) ? realAdaptation.Representation_asArray[0] : null;\n let segmentInfo;\n if (realRepresentation) {\n if (realRepresentation.hasOwnProperty(DashConstants.SEGMENT_LIST)) {\n segmentInfo = realRepresentation.SegmentList;\n return segmentInfo.hasOwnProperty(DashConstants.SEGMENT_TIMELINE) ?\n isLastRepeatAttributeValid(segmentInfo.SegmentTimeline) :\n true;\n } else if (realRepresentation.hasOwnProperty(DashConstants.SEGMENT_TEMPLATE)) {\n segmentInfo = realRepresentation.SegmentTemplate;\n if (segmentInfo.hasOwnProperty(DashConstants.SEGMENT_TIMELINE)) {\n return isLastRepeatAttributeValid(segmentInfo.SegmentTimeline);\n }\n }\n }\n\n return false;\n }\n\n function getRepresentationsForAdaptation(voAdaptation) {\n const voRepresentations = [];\n const processedRealAdaptation = getRealAdaptationFor(voAdaptation);\n let segmentInfo,\n baseUrl;\n\n if (processedRealAdaptation && processedRealAdaptation.Representation_asArray) {\n // TODO: TO BE REMOVED. We should get just the baseUrl elements that affects to the representations\n // that we are processing. Making it works properly will require much further changes and given\n // parsing base Urls parameters is needed for our ultra low latency examples, we will\n // keep this \"tricky\" code until the real (and good) solution comes\n if (voAdaptation && voAdaptation.period && isInteger(voAdaptation.period.index)) {\n const baseUrls = getBaseURLsFromElement(voAdaptation.period.mpd.manifest);\n if (baseUrls) {\n baseUrl = baseUrls[0];\n }\n }\n for (let i = 0, len = processedRealAdaptation.Representation_asArray.length; i < len; ++i) {\n const realRepresentation = processedRealAdaptation.Representation_asArray[i];\n const voRepresentation = new Representation();\n voRepresentation.index = i;\n voRepresentation.adaptation = voAdaptation;\n\n if (realRepresentation.hasOwnProperty(DashConstants.ID)) {\n voRepresentation.id = realRepresentation.id;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.CODECS)) {\n voRepresentation.codecs = realRepresentation.codecs;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.CODEC_PRIVATE_DATA)) {\n voRepresentation.codecPrivateData = realRepresentation.codecPrivateData;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.BANDWITH)) {\n voRepresentation.bandwidth = realRepresentation.bandwidth;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.WIDTH)) {\n voRepresentation.width = realRepresentation.width;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.HEIGHT)) {\n voRepresentation.height = realRepresentation.height;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.SCAN_TYPE)) {\n voRepresentation.scanType = realRepresentation.scanType;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.MAX_PLAYOUT_RATE)) {\n voRepresentation.maxPlayoutRate = realRepresentation.maxPlayoutRate;\n }\n\n if (realRepresentation.hasOwnProperty(DashConstants.SEGMENT_BASE)) {\n segmentInfo = realRepresentation.SegmentBase;\n voRepresentation.segmentInfoType = DashConstants.SEGMENT_BASE;\n } else if (realRepresentation.hasOwnProperty(DashConstants.SEGMENT_LIST)) {\n segmentInfo = realRepresentation.SegmentList;\n\n if (segmentInfo.hasOwnProperty(DashConstants.SEGMENT_TIMELINE)) {\n voRepresentation.segmentInfoType = DashConstants.SEGMENT_TIMELINE;\n voRepresentation.useCalculatedLiveEdgeTime = isLastRepeatAttributeValid(segmentInfo.SegmentTimeline);\n } else {\n voRepresentation.segmentInfoType = DashConstants.SEGMENT_LIST;\n voRepresentation.useCalculatedLiveEdgeTime = true;\n }\n } else if (realRepresentation.hasOwnProperty(DashConstants.SEGMENT_TEMPLATE)) {\n segmentInfo = realRepresentation.SegmentTemplate;\n\n if (segmentInfo.hasOwnProperty(DashConstants.SEGMENT_TIMELINE)) {\n voRepresentation.segmentInfoType = DashConstants.SEGMENT_TIMELINE;\n voRepresentation.useCalculatedLiveEdgeTime = isLastRepeatAttributeValid(segmentInfo.SegmentTimeline);\n } else {\n voRepresentation.segmentInfoType = DashConstants.SEGMENT_TEMPLATE;\n }\n\n if (segmentInfo.hasOwnProperty(DashConstants.INITIALIZATION_MINUS)) {\n voRepresentation.initialization = segmentInfo.initialization.split('$Bandwidth$')\n .join(realRepresentation.bandwidth).split('$RepresentationID$').join(realRepresentation.id);\n }\n } else {\n voRepresentation.segmentInfoType = DashConstants.BASE_URL;\n }\n\n voRepresentation.essentialProperties = getEssentialPropertiesForRepresentation(realRepresentation);\n\n if (segmentInfo) {\n if (segmentInfo.hasOwnProperty(DashConstants.INITIALIZATION)) {\n const initialization = segmentInfo.Initialization;\n\n if (initialization.hasOwnProperty(DashConstants.SOURCE_URL)) {\n voRepresentation.initialization = initialization.sourceURL;\n }\n\n if (initialization.hasOwnProperty(DashConstants.RANGE)) {\n voRepresentation.range = initialization.range;\n // initialization source url will be determined from\n // BaseURL when resolved at load time.\n }\n } else if (realRepresentation.hasOwnProperty(DashConstants.MIME_TYPE) && getIsTextTrack(realRepresentation.mimeType)) {\n voRepresentation.range = 0;\n }\n\n if (segmentInfo.hasOwnProperty(DashConstants.TIMESCALE)) {\n voRepresentation.timescale = segmentInfo.timescale;\n }\n if (segmentInfo.hasOwnProperty(DashConstants.DURATION)) {\n // TODO according to the spec @maxSegmentDuration specifies the maximum duration of any Segment in any Representation in the Media Presentation\n // It is also said that for a SegmentTimeline any @d value shall not exceed the value of MPD@maxSegmentDuration, but nothing is said about\n // SegmentTemplate @duration attribute. We need to find out if @maxSegmentDuration should be used instead of calculated duration if the the duration\n // exceeds @maxSegmentDuration\n voRepresentation.segmentDuration = segmentInfo.duration / voRepresentation.timescale;\n } else if (realRepresentation.hasOwnProperty(DashConstants.SEGMENT_TEMPLATE)) {\n segmentInfo = realRepresentation.SegmentTemplate;\n\n if (segmentInfo.hasOwnProperty(DashConstants.SEGMENT_TIMELINE)) {\n voRepresentation.segmentDuration = calcSegmentDuration(segmentInfo.SegmentTimeline) / voRepresentation.timescale;\n }\n }\n if (segmentInfo.hasOwnProperty(DashConstants.MEDIA)) {\n voRepresentation.media = segmentInfo.media;\n }\n if (segmentInfo.hasOwnProperty(DashConstants.START_NUMBER)) {\n voRepresentation.startNumber = segmentInfo.startNumber;\n }\n if (segmentInfo.hasOwnProperty(DashConstants.INDEX_RANGE)) {\n voRepresentation.indexRange = segmentInfo.indexRange;\n }\n if (segmentInfo.hasOwnProperty(DashConstants.PRESENTATION_TIME_OFFSET)) {\n voRepresentation.presentationTimeOffset = segmentInfo.presentationTimeOffset / voRepresentation.timescale;\n }\n if (segmentInfo.hasOwnProperty(DashConstants.AVAILABILITY_TIME_OFFSET)) {\n voRepresentation.availabilityTimeOffset = segmentInfo.availabilityTimeOffset;\n } else if (baseUrl && baseUrl.availabilityTimeOffset !== undefined) {\n voRepresentation.availabilityTimeOffset = baseUrl.availabilityTimeOffset;\n }\n if (segmentInfo.hasOwnProperty(DashConstants.AVAILABILITY_TIME_COMPLETE)) {\n voRepresentation.availabilityTimeComplete = segmentInfo.availabilityTimeComplete !== 'false';\n } else if (baseUrl && baseUrl.availabilityTimeComplete !== undefined) {\n voRepresentation.availabilityTimeComplete = baseUrl.availabilityTimeComplete;\n }\n }\n\n voRepresentation.MSETimeOffset = calcMSETimeOffset(voRepresentation);\n voRepresentation.path = [voAdaptation.period.index, voAdaptation.index, i];\n voRepresentations.push(voRepresentation);\n }\n }\n\n return voRepresentations;\n }\n\n function calcSegmentDuration(segmentTimeline) {\n let s0 = segmentTimeline.S_asArray[0];\n let s1 = segmentTimeline.S_asArray[1];\n return s0.hasOwnProperty('d') ? s0.d : (s1.t - s0.t);\n }\n\n function calcMSETimeOffset(representation) {\n // The MSEOffset is offset from AST for media. It is Period@start - presentationTimeOffset\n const presentationOffset = representation.presentationTimeOffset;\n const periodStart = representation.adaptation.period.start;\n return (periodStart - presentationOffset);\n }\n\n function getAdaptationsForPeriod(voPeriod) {\n const realPeriod = voPeriod && isInteger(voPeriod.index) ? voPeriod.mpd.manifest.Period_asArray[voPeriod.index] : null;\n const voAdaptations = [];\n let voAdaptationSet,\n realAdaptationSet,\n i;\n\n if (realPeriod && realPeriod.AdaptationSet_asArray) {\n for (i = 0; i < realPeriod.AdaptationSet_asArray.length; i++) {\n realAdaptationSet = realPeriod.AdaptationSet_asArray[i];\n voAdaptationSet = new AdaptationSet();\n if (realAdaptationSet.hasOwnProperty(DashConstants.ID)) {\n voAdaptationSet.id = realAdaptationSet.id;\n }\n voAdaptationSet.index = i;\n voAdaptationSet.period = voPeriod;\n\n if (getIsMuxed(realAdaptationSet)) {\n voAdaptationSet.type = Constants.MUXED;\n } else if (getIsAudio(realAdaptationSet)) {\n voAdaptationSet.type = Constants.AUDIO;\n } else if (getIsVideo(realAdaptationSet)) {\n voAdaptationSet.type = Constants.VIDEO;\n } else if (getIsFragmentedText(realAdaptationSet)) {\n voAdaptationSet.type = Constants.FRAGMENTED_TEXT;\n } else if (getIsImage(realAdaptationSet)) {\n voAdaptationSet.type = Constants.IMAGE;\n } else {\n voAdaptationSet.type = Constants.TEXT;\n }\n voAdaptations.push(voAdaptationSet);\n }\n }\n\n return voAdaptations;\n }\n\n function getRegularPeriods(mpd) {\n const isDynamic = mpd ? getIsDynamic(mpd.manifest) : false;\n const voPeriods = [];\n let realPreviousPeriod = null;\n let realPeriod = null;\n let voPreviousPeriod = null;\n let voPeriod = null;\n let len,\n i;\n\n for (i = 0, len = mpd && mpd.manifest && mpd.manifest.Period_asArray ? mpd.manifest.Period_asArray.length : 0; i < len; i++) {\n realPeriod = mpd.manifest.Period_asArray[i];\n\n // If the attribute @start is present in the Period, then the\n // Period is a regular Period and the PeriodStart is equal\n // to the value of this attribute.\n if (realPeriod.hasOwnProperty(DashConstants.START)) {\n voPeriod = new Period();\n voPeriod.start = realPeriod.start;\n }\n // If the @start attribute is absent, but the previous Period\n // element contains a @duration attribute then then this new\n // Period is also a regular Period. The start time of the new\n // Period PeriodStart is the sum of the start time of the previous\n // Period PeriodStart and the value of the attribute @duration\n // of the previous Period.\n else if (realPreviousPeriod !== null && realPreviousPeriod.hasOwnProperty(DashConstants.DURATION) && voPreviousPeriod !== null) {\n voPeriod = new Period();\n voPeriod.start = parseFloat((voPreviousPeriod.start + voPreviousPeriod.duration).toFixed(5));\n }\n // If (i) @start attribute is absent, and (ii) the Period element\n // is the first in the MPD, and (iii) the MPD@type is 'static',\n // then the PeriodStart time shall be set to zero.\n else if (i === 0 && !isDynamic) {\n voPeriod = new Period();\n voPeriod.start = 0;\n }\n\n // The Period extends until the PeriodStart of the next Period.\n // The difference between the PeriodStart time of a Period and\n // the PeriodStart time of the following Period.\n if (voPreviousPeriod !== null && isNaN(voPreviousPeriod.duration)) {\n if (voPeriod !== null) {\n voPreviousPeriod.duration = parseFloat((voPeriod.start - voPreviousPeriod.start).toFixed(5));\n } else {\n logger.warn('First period duration could not be calculated because lack of start and duration period properties. This will cause timing issues during playback');\n }\n }\n\n if (voPeriod !== null) {\n voPeriod.id = getPeriodId(realPeriod, i);\n voPeriod.index = i;\n voPeriod.mpd = mpd;\n\n if (realPeriod.hasOwnProperty(DashConstants.DURATION)) {\n voPeriod.duration = realPeriod.duration;\n }\n\n voPeriods.push(voPeriod);\n realPreviousPeriod = realPeriod;\n voPreviousPeriod = voPeriod;\n }\n\n realPeriod = null;\n voPeriod = null;\n }\n\n if (voPeriods.length === 0) {\n return voPeriods;\n }\n\n // The last Period extends until the end of the Media Presentation.\n // The difference between the PeriodStart time of the last Period\n // and the mpd duration\n if (voPreviousPeriod !== null && isNaN(voPreviousPeriod.duration)) {\n voPreviousPeriod.duration = parseFloat((getEndTimeForLastPeriod(voPreviousPeriod) - voPreviousPeriod.start).toFixed(5));\n }\n\n return voPeriods;\n }\n\n function getPeriodId(realPeriod, i) {\n if (!realPeriod) {\n throw new Error('Period cannot be null or undefined');\n }\n\n let id = Period.DEFAULT_ID + '_' + i;\n\n if (realPeriod.hasOwnProperty(DashConstants.ID) && realPeriod.id.length > 0 && realPeriod.id !== '__proto__') {\n id = realPeriod.id;\n }\n\n return id;\n }\n\n function getMpd(manifest) {\n const mpd = new Mpd();\n\n if (manifest) {\n mpd.manifest = manifest;\n\n if (manifest.hasOwnProperty(DashConstants.AVAILABILITY_START_TIME)) {\n mpd.availabilityStartTime = new Date(manifest.availabilityStartTime.getTime());\n } else {\n if (manifest.loadedTime) {\n mpd.availabilityStartTime = new Date(manifest.loadedTime.getTime());\n }\n }\n\n if (manifest.hasOwnProperty(DashConstants.AVAILABILITY_END_TIME)) {\n mpd.availabilityEndTime = new Date(manifest.availabilityEndTime.getTime());\n }\n\n if (manifest.hasOwnProperty(DashConstants.MINIMUM_UPDATE_PERIOD)) {\n mpd.minimumUpdatePeriod = manifest.minimumUpdatePeriod;\n }\n\n if (manifest.hasOwnProperty(DashConstants.MEDIA_PRESENTATION_DURATION)) {\n mpd.mediaPresentationDuration = manifest.mediaPresentationDuration;\n }\n\n if (manifest.hasOwnProperty(DashConstants.SUGGESTED_PRESENTATION_DELAY)) {\n mpd.suggestedPresentationDelay = manifest.suggestedPresentationDelay;\n }\n\n if (manifest.hasOwnProperty(DashConstants.TIMESHIFT_BUFFER_DEPTH)) {\n mpd.timeShiftBufferDepth = manifest.timeShiftBufferDepth;\n }\n\n if (manifest.hasOwnProperty(DashConstants.MAX_SEGMENT_DURATION)) {\n mpd.maxSegmentDuration = manifest.maxSegmentDuration;\n }\n }\n\n return mpd;\n }\n\n function checkConfig() {\n if (!errHandler || !errHandler.hasOwnProperty('error')) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function getEndTimeForLastPeriod(voPeriod) {\n checkConfig();\n const isDynamic = getIsDynamic(voPeriod.mpd.manifest);\n\n let periodEnd;\n if (voPeriod.mpd.manifest.mediaPresentationDuration) {\n periodEnd = voPeriod.mpd.manifest.mediaPresentationDuration;\n } else if (voPeriod.duration) {\n periodEnd = voPeriod.duration;\n } else if (isDynamic) {\n periodEnd = Number.POSITIVE_INFINITY;\n } else {\n errHandler.error(new DashJSError(Errors.MANIFEST_ERROR_ID_PARSE_CODE, 'Must have @mediaPresentationDuration on MPD or an explicit @duration on the last period.', voPeriod));\n }\n\n return periodEnd;\n }\n\n function getEventsForPeriod(period) {\n const manifest = period && period.mpd && period.mpd.manifest ? period.mpd.manifest : null;\n const periodArray = manifest ? manifest.Period_asArray : null;\n const eventStreams = periodArray && period && isInteger(period.index) ? periodArray[period.index].EventStream_asArray : null;\n const events = [];\n let i,\n j;\n\n if (eventStreams) {\n for (i = 0; i < eventStreams.length; i++) {\n const eventStream = new EventStream();\n eventStream.period = period;\n eventStream.timescale = 1;\n\n if (eventStreams[i].hasOwnProperty(Constants.SCHEME_ID_URI)) {\n eventStream.schemeIdUri = eventStreams[i].schemeIdUri;\n } else {\n throw new Error('Invalid EventStream. SchemeIdUri has to be set');\n }\n if (eventStreams[i].hasOwnProperty(DashConstants.TIMESCALE)) {\n eventStream.timescale = eventStreams[i].timescale;\n }\n if (eventStreams[i].hasOwnProperty(DashConstants.VALUE)) {\n eventStream.value = eventStreams[i].value;\n }\n for (j = 0; eventStreams[i].Event_asArray && j < eventStreams[i].Event_asArray.length; j++) {\n const event = new Event();\n event.presentationTime = 0;\n event.eventStream = eventStream;\n\n if (eventStreams[i].Event_asArray[j].hasOwnProperty(DashConstants.PRESENTATION_TIME)) {\n event.presentationTime = eventStreams[i].Event_asArray[j].presentationTime;\n const presentationTimeOffset = eventStream.presentationTimeOffset ? eventStream.presentationTimeOffset * eventStream.timescale : 0;\n event.calculatedPresentationTime = event.presentationTime + (period.start * eventStream.timescale) + presentationTimeOffset;\n }\n if (eventStreams[i].Event_asArray[j].hasOwnProperty(DashConstants.DURATION)) {\n event.duration = eventStreams[i].Event_asArray[j].duration;\n }\n if (eventStreams[i].Event_asArray[j].hasOwnProperty(DashConstants.ID)) {\n event.id = eventStreams[i].Event_asArray[j].id;\n }\n\n if (eventStreams[i].Event_asArray[j].Signal && eventStreams[i].Event_asArray[j].Signal.Binary) {\n // toString is used to manage both regular and namespaced tags\n event.messageData = BASE64.decodeArray(eventStreams[i].Event_asArray[j].Signal.Binary.toString());\n } else {\n // From Cor.1: 'NOTE: this attribute is an alternative\n // to specifying a complete XML element(s) in the Event.\n // It is useful when an event leans itself to a compact\n // string representation'.\n event.messageData =\n eventStreams[i].Event_asArray[j].messageData ||\n eventStreams[i].Event_asArray[j].__text;\n }\n\n events.push(event);\n }\n }\n }\n\n return events;\n }\n\n function getEventStreams(inbandStreams, representation) {\n const eventStreams = [];\n let i;\n\n if (!inbandStreams) return eventStreams;\n\n for (i = 0; i < inbandStreams.length; i++) {\n const eventStream = new EventStream();\n eventStream.timescale = 1;\n eventStream.representation = representation;\n\n if (inbandStreams[i].hasOwnProperty(Constants.SCHEME_ID_URI)) {\n eventStream.schemeIdUri = inbandStreams[i].schemeIdUri;\n } else {\n throw new Error('Invalid EventStream. SchemeIdUri has to be set');\n }\n if (inbandStreams[i].hasOwnProperty(DashConstants.TIMESCALE)) {\n eventStream.timescale = inbandStreams[i].timescale;\n }\n if (inbandStreams[i].hasOwnProperty(DashConstants.VALUE)) {\n eventStream.value = inbandStreams[i].value;\n }\n eventStreams.push(eventStream);\n }\n\n return eventStreams;\n }\n\n function getEventStreamForAdaptationSet(manifest, adaptation) {\n let inbandStreams,\n periodArray,\n adaptationArray;\n\n if (manifest && manifest.Period_asArray && adaptation && adaptation.period && isInteger(adaptation.period.index)) {\n periodArray = manifest.Period_asArray[adaptation.period.index];\n if (periodArray && periodArray.AdaptationSet_asArray && isInteger(adaptation.index)) {\n adaptationArray = periodArray.AdaptationSet_asArray[adaptation.index];\n if (adaptationArray) {\n inbandStreams = adaptationArray.InbandEventStream_asArray;\n }\n }\n }\n\n return getEventStreams(inbandStreams, null);\n }\n\n function getEventStreamForRepresentation(manifest, representation) {\n let inbandStreams,\n periodArray,\n adaptationArray,\n representationArray;\n\n if (manifest && manifest.Period_asArray && representation && representation.adaptation && representation.adaptation.period && isInteger(representation.adaptation.period.index)) {\n periodArray = manifest.Period_asArray[representation.adaptation.period.index];\n if (periodArray && periodArray.AdaptationSet_asArray && isInteger(representation.adaptation.index)) {\n adaptationArray = periodArray.AdaptationSet_asArray[representation.adaptation.index];\n if (adaptationArray && adaptationArray.Representation_asArray && isInteger(representation.index)) {\n representationArray = adaptationArray.Representation_asArray[representation.index];\n if (representationArray) {\n inbandStreams = representationArray.InbandEventStream_asArray;\n }\n }\n }\n }\n\n return getEventStreams(inbandStreams, representation);\n }\n\n function getUTCTimingSources(manifest) {\n const isDynamic = getIsDynamic(manifest);\n const hasAST = manifest ? manifest.hasOwnProperty(DashConstants.AVAILABILITY_START_TIME) : false;\n const utcTimingsArray = manifest ? manifest.UTCTiming_asArray : null;\n const utcTimingEntries = [];\n\n // do not bother synchronizing the clock unless MPD is live,\n // or it is static and has availabilityStartTime attribute\n if ((isDynamic || hasAST)) {\n if (utcTimingsArray) {\n // the order is important here - 23009-1 states that the order\n // in the manifest \"indicates relative preference, first having\n // the highest, and the last the lowest priority\".\n utcTimingsArray.forEach(function (utcTiming) {\n const entry = new UTCTiming();\n\n if (utcTiming.hasOwnProperty(Constants.SCHEME_ID_URI)) {\n entry.schemeIdUri = utcTiming.schemeIdUri;\n } else {\n // entries of type DescriptorType with no schemeIdUri\n // are meaningless. let's just ignore this entry and\n // move on.\n return;\n }\n\n // this is (incorrectly) interpreted as a number - schema\n // defines it as a string\n if (utcTiming.hasOwnProperty(DashConstants.VALUE)) {\n entry.value = utcTiming.value.toString();\n } else {\n // without a value, there's not a lot we can do with\n // this entry. let's just ignore this one and move on\n return;\n }\n\n // we're not interested in the optional id or any other\n // attributes which might be attached to the entry\n\n utcTimingEntries.push(entry);\n });\n }\n }\n\n return utcTimingEntries;\n }\n\n function getBaseURLsFromElement(node) {\n const baseUrls = [];\n // if node.BaseURL_asArray and node.baseUri are undefined entries\n // will be [undefined] which entries.some will just skip\n const entries = node.BaseURL_asArray || [node.baseUri];\n let earlyReturn = false;\n\n entries.some(entry => {\n if (entry) {\n const baseUrl = new BaseURL();\n let text = entry.__text || entry;\n\n if (urlUtils.isRelative(text)) {\n // it doesn't really make sense to have relative and\n // absolute URLs at the same level, or multiple\n // relative URLs at the same level, so assume we are\n // done from this level of the MPD\n earlyReturn = true;\n\n // deal with the specific case where the MPD@BaseURL\n // is specified and is relative. when no MPD@BaseURL\n // entries exist, that case is handled by the\n // [node.baseUri] in the entries definition.\n if (node.baseUri) {\n text = urlUtils.resolve(text, node.baseUri);\n }\n }\n\n baseUrl.url = text;\n\n // serviceLocation is optional, but we need it in order\n // to blacklist correctly. if it's not available, use\n // anything unique since there's no relationship to any\n // other BaseURL and, in theory, the url should be\n // unique so use this instead.\n if (entry.hasOwnProperty(DashConstants.SERVICE_LOCATION) &&\n entry.serviceLocation.length) {\n baseUrl.serviceLocation = entry.serviceLocation;\n } else {\n baseUrl.serviceLocation = text;\n }\n\n if (entry.hasOwnProperty(DashConstants.DVB_PRIORITY)) {\n baseUrl.dvb_priority = entry[DashConstants.DVB_PRIORITY];\n }\n\n if (entry.hasOwnProperty(DashConstants.DVB_WEIGHT)) {\n baseUrl.dvb_weight = entry[DashConstants.DVB_WEIGHT];\n }\n\n if (entry.hasOwnProperty(DashConstants.AVAILABILITY_TIME_OFFSET)) {\n baseUrl.availabilityTimeOffset = entry[DashConstants.AVAILABILITY_TIME_OFFSET];\n }\n\n if (entry.hasOwnProperty(DashConstants.AVAILABILITY_TIME_COMPLETE)) {\n baseUrl.availabilityTimeComplete = entry[DashConstants.AVAILABILITY_TIME_COMPLETE] !== 'false';\n }\n /* NOTE: byteRange currently unused\n */\n\n baseUrls.push(baseUrl);\n\n return earlyReturn;\n }\n });\n\n return baseUrls;\n }\n\n function getLocation(manifest) {\n if (manifest && manifest.hasOwnProperty(Constants.LOCATION)) {\n // for now, do not support multiple Locations -\n // just set Location to the first Location.\n manifest.Location = manifest.Location_asArray[0];\n\n return manifest.Location;\n }\n\n // may well be undefined\n return undefined;\n }\n\n function getSuggestedPresentationDelay(mpd) {\n return mpd && mpd.hasOwnProperty(DashConstants.SUGGESTED_PRESENTATION_DELAY) ? mpd.suggestedPresentationDelay : null;\n }\n\n function getAvailabilityStartTime(mpd) {\n return mpd && mpd.hasOwnProperty(DashConstants.AVAILABILITY_START_TIME) && mpd.availabilityStartTime !== null ? mpd.availabilityStartTime.getTime() : null;\n }\n\n function getServiceDescriptions(manifest) {\n const serviceDescriptions = [];\n if (manifest && manifest.hasOwnProperty(DashConstants.SERVICE_DESCRIPTION)) {\n for (const sd of manifest.ServiceDescription_asArray) {\n // Convert each of the properties defined in\n let id, schemeIdUri, latency, playbackRate;\n for (const prop in sd) {\n if (sd.hasOwnProperty(prop)) {\n if (prop === DashConstants.ID) {\n id = sd[prop];\n } else if (prop === DashConstants.SERVICE_DESCRIPTION_SCOPE) {\n schemeIdUri = sd[prop].schemeIdUri;\n } else if (prop === DashConstants.SERVICE_DESCRIPTION_LATENCY) {\n latency = {\n target: sd[prop].target,\n max: sd[prop].max,\n min: sd[prop].min\n };\n } else if (prop === DashConstants.SERVICE_DESCRIPTION_PLAYBACK_RATE) {\n playbackRate = {\n max: sd[prop].max,\n min: sd[prop].min\n };\n }\n }\n }\n // we have a ServiceDescription for low latency. Add it if it really has parameters defined\n if (schemeIdUri === Constants.SERVICE_DESCRIPTION_LL_SCHEME && (latency || playbackRate)) {\n serviceDescriptions.push({\n id,\n schemeIdUri,\n latency,\n playbackRate\n });\n }\n }\n }\n\n return serviceDescriptions;\n }\n\n function getSupplementalPropperties(adaptation) {\n const supplementalProperties = {};\n\n if (adaptation && adaptation.hasOwnProperty(DashConstants.SUPPLEMENTAL_PROPERTY)) {\n for (const sp of adaptation.SupplementalProperty_asArray) {\n if (sp.hasOwnProperty(Constants.SCHEME_ID_URI) && sp.hasOwnProperty(DashConstants.VALUE)) {\n supplementalProperties[sp[Constants.SCHEME_ID_URI]] = sp[DashConstants.VALUE];\n }\n }\n }\n return supplementalProperties;\n }\n\n function setConfig(config) {\n if (!config) return;\n\n if (config.errHandler) {\n errHandler = config.errHandler;\n }\n\n if (config.BASE64) {\n BASE64 = config.BASE64;\n }\n }\n\n instance = {\n getIsTypeOf: getIsTypeOf,\n getIsTextTrack: getIsTextTrack,\n getLanguageForAdaptation: getLanguageForAdaptation,\n getViewpointForAdaptation: getViewpointForAdaptation,\n getRolesForAdaptation: getRolesForAdaptation,\n getAccessibilityForAdaptation: getAccessibilityForAdaptation,\n getAudioChannelConfigurationForAdaptation: getAudioChannelConfigurationForAdaptation,\n getAudioChannelConfigurationForRepresentation: getAudioChannelConfigurationForRepresentation,\n getAdaptationForIndex: getAdaptationForIndex,\n getIndexForAdaptation: getIndexForAdaptation,\n getAdaptationForId: getAdaptationForId,\n getAdaptationsForType: getAdaptationsForType,\n getCodec: getCodec,\n getMimeType: getMimeType,\n getKID: getKID,\n getLabelsForAdaptation: getLabelsForAdaptation,\n getContentProtectionData: getContentProtectionData,\n getIsDynamic: getIsDynamic,\n hasProfile: hasProfile,\n getDuration: getDuration,\n getBandwidth: getBandwidth,\n getManifestUpdatePeriod: getManifestUpdatePeriod,\n getRepresentationCount: getRepresentationCount,\n getBitrateListForAdaptation: getBitrateListForAdaptation,\n getRepresentationFor: getRepresentationFor,\n getRepresentationsForAdaptation: getRepresentationsForAdaptation,\n getAdaptationsForPeriod: getAdaptationsForPeriod,\n getRegularPeriods: getRegularPeriods,\n getMpd: getMpd,\n getEventsForPeriod: getEventsForPeriod,\n getEventStreamForAdaptationSet: getEventStreamForAdaptationSet,\n getEventStreamForRepresentation: getEventStreamForRepresentation,\n getUTCTimingSources: getUTCTimingSources,\n getBaseURLsFromElement: getBaseURLsFromElement,\n getRepresentationSortFunction: getRepresentationSortFunction,\n getLocation: getLocation,\n getUseCalculatedLiveEdgeTimeForAdaptation: getUseCalculatedLiveEdgeTimeForAdaptation,\n getSuggestedPresentationDelay: getSuggestedPresentationDelay,\n getAvailabilityStartTime: getAvailabilityStartTime,\n getServiceDescriptions: getServiceDescriptions,\n getSupplementalPropperties: getSupplementalPropperties,\n setConfig: setConfig\n };\n\n setup();\n\n return instance;\n}\n\nDashManifestModel.__dashjs_factory_name = 'DashManifestModel';\nexport default FactoryMaker.getSingletonFactory(DashManifestModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport ObjectIron from './objectiron';\nimport X2JS from '../../../externals/xml2json';\nimport StringMatcher from './matchers/StringMatcher';\nimport DurationMatcher from './matchers/DurationMatcher';\nimport DateTimeMatcher from './matchers/DateTimeMatcher';\nimport NumericMatcher from './matchers/NumericMatcher';\nimport RepresentationBaseValuesMap from './maps/RepresentationBaseValuesMap';\nimport SegmentValuesMap from './maps/SegmentValuesMap';\n\nfunction DashParser(config) {\n\n config = config || {};\n const context = this.context;\n const debug = config.debug;\n\n let instance,\n logger,\n matchers,\n converter,\n objectIron;\n\n function setup() {\n logger = debug.getLogger(instance);\n matchers = [\n new DurationMatcher(),\n new DateTimeMatcher(),\n new NumericMatcher(),\n new StringMatcher() // last in list to take precedence over NumericMatcher\n ];\n\n converter = new X2JS({\n escapeMode: false,\n attributePrefix: '',\n arrayAccessForm: 'property',\n emptyNodeForm: 'object',\n stripWhitespaces: false,\n enableToStringFunc: true,\n ignoreRoot: true,\n matchers: matchers\n });\n\n objectIron = ObjectIron(context).create({\n adaptationset: new RepresentationBaseValuesMap(),\n period: new SegmentValuesMap()\n });\n }\n\n function getMatchers() {\n return matchers;\n }\n\n function getIron() {\n return objectIron;\n }\n\n function parse(data) {\n let manifest;\n const startTime = window.performance.now();\n\n manifest = converter.xml_str2json(data);\n\n if (!manifest) {\n throw new Error('parsing the manifest failed');\n }\n\n const jsonTime = window.performance.now();\n objectIron.run(manifest);\n\n const ironedTime = window.performance.now();\n logger.info('Parsing complete: ( xml2json: ' + (jsonTime - startTime).toPrecision(3) + 'ms, objectiron: ' + (ironedTime - jsonTime).toPrecision(3) + 'ms, total: ' + ((ironedTime - startTime) / 1000).toPrecision(3) + 's)');\n\n manifest.protocol = 'DASH';\n\n return manifest;\n }\n\n instance = {\n parse: parse,\n getMatchers: getMatchers,\n getIron: getIron\n };\n\n setup();\n\n return instance;\n}\n\nDashParser.__dashjs_factory_name = 'DashParser';\nexport default FactoryMaker.getClassFactory(DashParser);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc a property belonging to a MapNode\n * @ignore\n */\n\nclass CommonProperty {\n constructor(name) {\n const getDefaultMergeForName =\n (n) => n && n.length && n.charAt(0) === n.charAt(0).toUpperCase();\n\n this._name = name;\n this._merge = getDefaultMergeForName(name);\n }\n\n get name() {\n return this._name;\n }\n\n get merge() {\n return this._merge;\n }\n}\n\nexport default CommonProperty;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc a node at some level in a ValueMap\n */\nimport CommonProperty from './CommonProperty';\n\nclass MapNode {\n constructor(name, properties, children) {\n this._name = name || '';\n this._properties = [];\n this._children = children || [];\n\n if (Array.isArray(properties)) {\n properties.forEach(p => {\n this._properties.push(new CommonProperty(p));\n });\n }\n }\n\n get name() {\n return this._name;\n }\n\n get children() {\n return this._children;\n }\n\n get properties() {\n return this._properties;\n }\n}\n\nexport default MapNode;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc a RepresentationBaseValuesMap type for input to objectiron\n */\nimport MapNode from './MapNode';\nimport DashConstants from '../../constants/DashConstants';\n\nclass RepresentationBaseValuesMap extends MapNode {\n constructor() {\n const commonProperties = [\n DashConstants.PROFILES, DashConstants.WIDTH, DashConstants.HEIGHT, DashConstants.SAR, DashConstants.FRAMERATE, DashConstants.AUDIO_SAMPLING_RATE, DashConstants.MIME_TYPE, DashConstants.SEGMENT_PROFILES, DashConstants.CODECS, DashConstants.MAXIMUM_SAP_PERIOD, DashConstants.START_WITH_SAP, DashConstants.MAX_PLAYOUT_RATE, DashConstants.CODING_DEPENDENCY, DashConstants.SCAN_TYPE, DashConstants.FRAME_PACKING, DashConstants.AUDIO_CHANNEL_CONFIGURATION, DashConstants.CONTENT_PROTECTION, DashConstants.ESSENTIAL_PROPERTY, DashConstants.SUPPLEMENTAL_PROPERTY, DashConstants.INBAND_EVENT_STREAM\n ];\n\n super(DashConstants.ADAPTATION_SET, commonProperties, [\n new MapNode(DashConstants.REPRESENTATION, commonProperties, [\n new MapNode(DashConstants.SUB_REPRESENTATION, commonProperties)\n ])\n ]);\n }\n}\n\nexport default RepresentationBaseValuesMap;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc a SegmentValuesMap type for input to objectiron\n */\nimport MapNode from './MapNode';\nimport DashConstants from '../../constants/DashConstants';\n\nclass SegmentValuesMap extends MapNode {\n constructor() {\n const commonProperties = [\n DashConstants.SEGMENT_BASE, DashConstants.SEGMENT_TEMPLATE, DashConstants.SEGMENT_LIST\n ];\n\n super(DashConstants.PERIOD, commonProperties, [\n new MapNode(DashConstants.ADAPTATION_SET, commonProperties, [\n new MapNode(DashConstants.REPRESENTATION, commonProperties)\n ])\n ]);\n }\n}\n\nexport default SegmentValuesMap;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n\n/**\n * @classdesc a base type for matching and converting types in manifest to\n * something more useful\n * @ignore\n */\nclass BaseMatcher {\n constructor(test, converter) {\n this._test = test;\n this._converter = converter;\n }\n\n get test() {\n return this._test;\n }\n\n get converter() {\n return this._converter;\n }\n}\n\nexport default BaseMatcher;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc matches and converts xs:datetime to Date\n */\nimport BaseMatcher from './BaseMatcher';\n\nconst SECONDS_IN_MIN = 60;\nconst MINUTES_IN_HOUR = 60;\nconst MILLISECONDS_IN_SECONDS = 1000;\n\nconst datetimeRegex = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(?::([0-9]*)(\\.[0-9]*)?)?(?:([+-])([0-9]{2})(?::?)([0-9]{2}))?/;\n\nclass DateTimeMatcher extends BaseMatcher {\n constructor() {\n super(\n attr => datetimeRegex.test(attr.value),\n str => {\n const match = datetimeRegex.exec(str);\n let utcDate;\n\n // If the string does not contain a timezone offset different browsers can interpret it either\n // as UTC or as a local time so we have to parse the string manually to normalize the given date value for\n // all browsers\n utcDate = Date.UTC(\n parseInt(match[1], 10),\n parseInt(match[2], 10) - 1, // months start from zero\n parseInt(match[3], 10),\n parseInt(match[4], 10),\n parseInt(match[5], 10),\n (match[6] && parseInt(match[6], 10) || 0),\n (match[7] && parseFloat(match[7]) * MILLISECONDS_IN_SECONDS) || 0);\n\n // If the date has timezone offset take it into account as well\n if (match[9] && match[10]) {\n const timezoneOffset = parseInt(match[9], 10) * MINUTES_IN_HOUR + parseInt(match[10], 10);\n utcDate += (match[8] === '+' ? -1 : +1) * timezoneOffset * SECONDS_IN_MIN * MILLISECONDS_IN_SECONDS;\n }\n\n return new Date(utcDate);\n }\n );\n }\n}\n\nexport default DateTimeMatcher;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc matches and converts xs:duration to seconds\n */\nimport BaseMatcher from './BaseMatcher';\nimport Constants from '../../../streaming/constants/Constants';\nimport DashConstants from '../../constants/DashConstants';\n\nconst durationRegex = /^([-])?P(([\\d.]*)Y)?(([\\d.]*)M)?(([\\d.]*)D)?T?(([\\d.]*)H)?(([\\d.]*)M)?(([\\d.]*)S)?/;\n\nconst SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\nconst SECONDS_IN_MONTH = 30 * 24 * 60 * 60;\nconst SECONDS_IN_DAY = 24 * 60 * 60;\nconst SECONDS_IN_HOUR = 60 * 60;\nconst SECONDS_IN_MIN = 60;\n\nclass DurationMatcher extends BaseMatcher {\n constructor() {\n super(\n attr => {\n const attributeList = [\n DashConstants.MIN_BUFFER_TIME, DashConstants.MEDIA_PRESENTATION_DURATION,\n DashConstants.MINIMUM_UPDATE_PERIOD, DashConstants.TIMESHIFT_BUFFER_DEPTH, DashConstants.MAX_SEGMENT_DURATION,\n DashConstants.MAX_SUBSEGMENT_DURATION, DashConstants.SUGGESTED_PRESENTATION_DELAY, DashConstants.START,\n Constants.START_TIME, DashConstants.DURATION\n ];\n const len = attributeList.length;\n\n for (let i = 0; i < len; i++) {\n if (attr.nodeName === attributeList[i]) {\n return durationRegex.test(attr.value);\n }\n }\n\n return false;\n },\n str => {\n //str = \"P10Y10M10DT10H10M10.1S\";\n const match = durationRegex.exec(str);\n let result = (parseFloat(match[3] || 0) * SECONDS_IN_YEAR +\n parseFloat(match[5] || 0) * SECONDS_IN_MONTH +\n parseFloat(match[7] || 0) * SECONDS_IN_DAY +\n parseFloat(match[9] || 0) * SECONDS_IN_HOUR +\n parseFloat(match[11] || 0) * SECONDS_IN_MIN +\n parseFloat(match[13] || 0));\n\n if (match[1] !== undefined) {\n result = -result;\n }\n\n return result;\n }\n );\n }\n}\n\nexport default DurationMatcher;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc Matches and converts xs:numeric to float\n */\nimport BaseMatcher from './BaseMatcher';\n\nconst numericRegex = /^[-+]?[0-9]+[.]?[0-9]*([eE][-+]?[0-9]+)?$/;\n\nclass NumericMatcher extends BaseMatcher {\n constructor() {\n super(\n attr => numericRegex.test(attr.value),\n str => parseFloat(str)\n );\n }\n}\n\nexport default NumericMatcher;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc Matches and converts xs:string to string, but only for specific attributes on specific nodes\n */\nimport BaseMatcher from './BaseMatcher';\nimport DashConstants from '../../constants/DashConstants';\n\nclass StringMatcher extends BaseMatcher {\n constructor() {\n super(\n (attr, nodeName) => {\n const stringAttrsInElements = {\n [DashConstants.MPD]: [ DashConstants.ID, DashConstants.PROFILES ],\n [DashConstants.PERIOD]: [ DashConstants.ID ],\n [DashConstants.BASE_URL]: [ DashConstants.SERVICE_LOCATION, DashConstants.BYTE_RANGE ],\n [DashConstants.SEGMENT_BASE]: [ DashConstants.INDEX_RANGE ],\n [DashConstants.INITIALIZATION]: [ DashConstants.RANGE ],\n [DashConstants.REPRESENTATION_INDEX]: [ DashConstants.RANGE ],\n [DashConstants.SEGMENT_LIST]: [ DashConstants.INDEX_RANGE ],\n [DashConstants.BITSTREAM_SWITCHING]: [ DashConstants.RANGE ],\n [DashConstants.SEGMENT_URL]: [ DashConstants.MEDIA_RANGE, DashConstants.INDEX_RANGE ],\n [DashConstants.SEGMENT_TEMPLATE]: [ DashConstants.INDEX_RANGE, DashConstants.MEDIA, DashConstants.INDEX, DashConstants.INITIALIZATION_MINUS, DashConstants.BITSTREAM_SWITCHING_MINUS ],\n [DashConstants.ASSET_IDENTIFIER]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.EVENT_STREAM]: [ DashConstants.VALUE ],\n [DashConstants.ADAPTATION_SET]: [ DashConstants.PROFILES, DashConstants.MIME_TYPE, DashConstants.SEGMENT_PROFILES, DashConstants.CODECS, DashConstants.CONTENT_TYPE ],\n [DashConstants.FRAME_PACKING]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.AUDIO_CHANNEL_CONFIGURATION]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.CONTENT_PROTECTION]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.ESSENTIAL_PROPERTY]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.SUPPLEMENTAL_PROPERTY]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.INBAND_EVENT_STREAM]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.ACCESSIBILITY]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.ROLE]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.RATING]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.VIEWPOINT]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.CONTENT_COMPONENT]: [ DashConstants.CONTENT_TYPE ],\n [DashConstants.REPRESENTATION]: [ DashConstants.ID, DashConstants.DEPENDENCY_ID, DashConstants.MEDIA_STREAM_STRUCTURE_ID ],\n [DashConstants.SUBSET]: [ DashConstants.ID ],\n [DashConstants.METRICS]: [ DashConstants.METRICS_MINUS ],\n [DashConstants.REPORTING]: [ DashConstants.VALUE, DashConstants.ID ]\n };\n if (stringAttrsInElements.hasOwnProperty(nodeName)) {\n let attrNames = stringAttrsInElements[nodeName];\n if (attrNames !== undefined) {\n return attrNames.indexOf(attr.name) >= 0;\n } else {\n return false;\n }\n }\n return false;\n },\n str => String(str)\n );\n }\n}\n\nexport default StringMatcher;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction ObjectIron(mappers) {\n\n function mergeValues(parentItem, childItem) {\n for (let name in parentItem) {\n if (!childItem.hasOwnProperty(name)) {\n childItem[name] = parentItem[name];\n }\n }\n }\n\n function mapProperties(properties, parent, child) {\n for (let i = 0, len = properties.length; i < len; ++i) {\n const property = properties[i];\n\n if (parent[property.name]) {\n if (child[property.name]) {\n // check to see if we should merge\n if (property.merge) {\n const parentValue = parent[property.name];\n const childValue = child[property.name];\n\n // complex objects; merge properties\n if (typeof parentValue === 'object' && typeof childValue === 'object') {\n mergeValues(parentValue, childValue);\n }\n // simple objects; merge them together\n else {\n child[property.name] = parentValue + childValue;\n }\n }\n } else {\n // just add the property\n child[property.name] = parent[property.name];\n }\n }\n }\n }\n\n function mapItem(item, node) {\n for (let i = 0, len = item.children.length; i < len; ++i) {\n const childItem = item.children[i];\n\n const array = node[childItem.name + '_asArray'];\n if (array) {\n for (let v = 0, len2 = array.length; v < len2; ++v) {\n const childNode = array[v];\n mapProperties(item.properties, node, childNode);\n mapItem(childItem, childNode);\n }\n }\n }\n }\n\n function run(source) {\n\n if (source === null || typeof source !== 'object') {\n return source;\n }\n\n if ('period' in mappers) {\n const periodMapper = mappers.period;\n const periods = source.Period_asArray;\n for (let i = 0, len = periods.length; i < len; ++i) {\n const period = periods[i];\n mapItem(periodMapper, period);\n\n if ('adaptationset' in mappers) {\n const adaptationSets = period.AdaptationSet_asArray;\n if (adaptationSets) {\n const adaptationSetMapper = mappers.adaptationset;\n for (let i = 0, len = adaptationSets.length; i < len; ++i) {\n mapItem(adaptationSetMapper, adaptationSets[i]);\n }\n }\n }\n }\n }\n\n return source;\n }\n\n return {\n run: run\n };\n}\n\n\nObjectIron.__dashjs_factory_name = 'ObjectIron';\nconst factory = FactoryMaker.getClassFactory(ObjectIron);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Constants from '../../streaming/constants/Constants';\n\nimport { getIndexBasedSegment } from './SegmentsUtils';\n\nfunction ListSegmentsGetter(config, isDynamic) {\n\n config = config || {};\n const timelineConverter = config.timelineConverter;\n\n let instance;\n\n function checkConfig() {\n if (!timelineConverter || !timelineConverter.hasOwnProperty('calcPeriodRelativeTimeFromMpdRelativeTime')) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function getSegmentByIndex(representation, index) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n const list = representation.adaptation.period.mpd.manifest.Period_asArray[representation.adaptation.period.index].\n AdaptationSet_asArray[representation.adaptation.index].Representation_asArray[representation.index].SegmentList;\n const len = list.SegmentURL_asArray.length;\n\n const start = representation.startNumber;\n let segment = null;\n if (index < len) {\n const s = list.SegmentURL_asArray[index];\n\n segment = getIndexBasedSegment(timelineConverter, isDynamic, representation, index);\n if (segment) {\n segment.replacementTime = (start + index - 1) * representation.segmentDuration;\n segment.media = s.media ? s.media : '';\n segment.mediaRange = s.mediaRange;\n segment.index = index;\n segment.indexRange = s.indexRange;\n }\n }\n\n representation.availableSegmentsNumber = len;\n\n return segment;\n }\n\n function getSegmentByTime(representation, requestedTime) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n const duration = representation.segmentDuration;\n\n if (isNaN(duration)) {\n return null;\n }\n\n const periodTime = timelineConverter.calcPeriodRelativeTimeFromMpdRelativeTime(representation, requestedTime);\n const index = Math.floor(periodTime / duration);\n\n return getSegmentByIndex(representation, index);\n }\n\n instance = {\n getSegmentByIndex: getSegmentByIndex,\n getSegmentByTime: getSegmentByTime\n };\n\n return instance;\n}\n\nListSegmentsGetter.__dashjs_factory_name = 'ListSegmentsGetter';\nconst factory = FactoryMaker.getClassFactory(ListSegmentsGetter);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Constants from '../../streaming/constants/Constants';\n\n\nfunction SegmentBaseGetter(config) {\n\n config = config || {};\n const timelineConverter = config.timelineConverter;\n\n let instance;\n\n function checkConfig() {\n if (!timelineConverter || !timelineConverter.hasOwnProperty('calcPeriodRelativeTimeFromMpdRelativeTime')) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function getSegmentByIndex(representation, index) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n const len = representation.segments ? representation.segments.length : -1;\n let seg;\n if (index < len) {\n seg = representation.segments[index];\n if (seg && seg.availabilityIdx === index) {\n return seg;\n }\n }\n\n for (let i = 0; i < len; i++) {\n seg = representation.segments[i];\n\n if (seg && seg.availabilityIdx === index) {\n return seg;\n }\n }\n\n return null;\n }\n\n function getSegmentByTime(representation, requestedTime) {\n checkConfig();\n\n const periodTime = timelineConverter.calcPeriodRelativeTimeFromMpdRelativeTime(representation, requestedTime);\n const index = getIndexByTime(representation, periodTime);\n\n return getSegmentByIndex(representation, index);\n }\n\n function getIndexByTime(representation, time) {\n if (!representation) {\n return -1;\n }\n\n const segments = representation.segments;\n const ln = segments ? segments.length : null;\n\n let idx = -1;\n let epsilon,\n frag,\n ft,\n fd,\n i;\n\n if (segments && ln > 0) {\n for (i = 0; i < ln; i++) {\n frag = segments[i];\n ft = frag.presentationStartTime;\n fd = frag.duration;\n\n epsilon = fd / 2;\n if ((time + epsilon) >= ft &&\n (time - epsilon) < (ft + fd)) {\n idx = frag.availabilityIdx;\n break;\n }\n }\n }\n\n return idx;\n }\n\n instance = {\n getSegmentByIndex: getSegmentByIndex,\n getSegmentByTime: getSegmentByTime\n };\n\n return instance;\n}\n\nSegmentBaseGetter.__dashjs_factory_name = 'SegmentBaseGetter';\nconst factory = FactoryMaker.getClassFactory(SegmentBaseGetter);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport Segment from './../vo/Segment';\n\nfunction zeroPadToLength(numStr, minStrLength) {\n while (numStr.length < minStrLength) {\n numStr = '0' + numStr;\n }\n return numStr;\n}\n\nfunction getNumberForSegment(segment, segmentIndex) {\n return segment.representation.startNumber + segmentIndex;\n}\n\nexport function unescapeDollarsInTemplate(url) {\n return url ? url.split('$$').join('$') : url;\n}\n\nexport function replaceIDForTemplate(url, value) {\n if (!value || !url || url.indexOf('$RepresentationID$') === -1) { return url; }\n let v = value.toString();\n return url.split('$RepresentationID$').join(v);\n}\n\nexport function replaceTokenForTemplate(url, token, value) {\n const formatTag = '%0';\n\n let startPos,\n endPos,\n formatTagPos,\n specifier,\n width,\n paddedValue;\n\n const tokenLen = token.length;\n const formatTagLen = formatTag.length;\n\n if (!url) {\n return url;\n }\n\n // keep looping round until all instances of have been\n // replaced. once that has happened, startPos below will be -1\n // and the completed url will be returned.\n while (true) {\n\n // check if there is a valid $...$ identifier\n // if not, return the url as is.\n startPos = url.indexOf('$' + token);\n if (startPos < 0) {\n return url;\n }\n\n // the next '$' must be the end of the identifier\n // if there isn't one, return the url as is.\n endPos = url.indexOf('$', startPos + tokenLen);\n if (endPos < 0) {\n return url;\n }\n\n // now see if there is an additional format tag suffixed to\n // the identifier within the enclosing '$' characters\n formatTagPos = url.indexOf(formatTag, startPos + tokenLen);\n if (formatTagPos > startPos && formatTagPos < endPos) {\n\n specifier = url.charAt(endPos - 1);\n width = parseInt(url.substring(formatTagPos + formatTagLen, endPos - 1), 10);\n\n // support the minimum specifiers required by IEEE 1003.1\n // (d, i , o, u, x, and X) for completeness\n switch (specifier) {\n // treat all int types as uint,\n // hence deliberate fallthrough\n case 'd':\n case 'i':\n case 'u':\n paddedValue = zeroPadToLength(value.toString(), width);\n break;\n case 'x':\n paddedValue = zeroPadToLength(value.toString(16), width);\n break;\n case 'X':\n paddedValue = zeroPadToLength(value.toString(16), width).toUpperCase();\n break;\n case 'o':\n paddedValue = zeroPadToLength(value.toString(8), width);\n break;\n default:\n return url;\n }\n } else {\n paddedValue = value;\n }\n\n url = url.substring(0, startPos) + paddedValue + url.substring(endPos + 1);\n }\n}\n\nfunction getSegment(representation, duration, presentationStartTime, mediaStartTime, availabilityStartTime,\n timelineConverter, presentationEndTime, isDynamic, index) {\n let seg = new Segment();\n\n seg.representation = representation;\n seg.duration = duration;\n seg.presentationStartTime = presentationStartTime;\n seg.mediaStartTime = mediaStartTime;\n seg.availabilityStartTime = availabilityStartTime;\n seg.availabilityEndTime = timelineConverter.calcAvailabilityEndTimeFromPresentationTime(presentationEndTime, representation.adaptation.period.mpd, isDynamic);\n seg.wallStartTime = timelineConverter.calcWallTimeForSegment(seg, isDynamic);\n seg.replacementNumber = getNumberForSegment(seg, index);\n seg.availabilityIdx = index;\n\n return seg;\n}\n\nfunction isSegmentAvailable(timelineConverter, representation, segment, isDynamic) {\n const periodEnd = timelineConverter.getPeriodEnd(representation, isDynamic);\n const periodRelativeEnd = timelineConverter.calcPeriodRelativeTimeFromMpdRelativeTime(representation, periodEnd);\n\n const segmentTime = timelineConverter.calcPeriodRelativeTimeFromMpdRelativeTime(representation, segment.presentationStartTime);\n if (segmentTime >= periodRelativeEnd) {\n if (isDynamic) {\n // segment is not available in current period, but it may be segment available in another period that current one (in DVR window)\n // if not (time > segmentAvailabilityRange.end), then return false\n if ( representation.segmentAvailabilityRange && segment.presentationStartTime >= representation.segmentAvailabilityRange.end) {\n return false;\n }\n } else {\n return false;\n }\n }\n\n return true;\n}\n\nexport function getIndexBasedSegment(timelineConverter, isDynamic, representation, index) {\n let duration,\n presentationStartTime,\n presentationEndTime;\n\n duration = representation.segmentDuration;\n\n /*\n * From spec - If neither @duration attribute nor SegmentTimeline element is present, then the Representation\n * shall contain exactly one Media Segment. The MPD start time is 0 and the MPD duration is obtained\n * in the same way as for the last Media Segment in the Representation.\n */\n if (isNaN(duration)) {\n duration = representation.adaptation.period.duration;\n }\n\n presentationStartTime = parseFloat((representation.adaptation.period.start + (index * duration)).toFixed(5));\n presentationEndTime = parseFloat((presentationStartTime + duration).toFixed(5));\n\n const segment = getSegment(representation, duration, presentationStartTime,\n timelineConverter.calcMediaTimeFromPresentationTime(presentationStartTime, representation),\n timelineConverter.calcAvailabilityStartTimeFromPresentationTime(presentationStartTime, representation.adaptation.period.mpd, isDynamic),\n timelineConverter, presentationEndTime, isDynamic, index);\n\n if (!isSegmentAvailable(timelineConverter, representation, segment, isDynamic)) {\n return null;\n }\n\n return segment;\n}\n\nexport function getTimeBasedSegment(timelineConverter, isDynamic, representation, time, duration, fTimescale, url, range, index, tManifest) {\n const scaledTime = time / fTimescale;\n const scaledDuration = Math.min(duration / fTimescale, representation.adaptation.period.mpd.maxSegmentDuration);\n\n let presentationStartTime,\n presentationEndTime,\n seg;\n\n presentationStartTime = timelineConverter.calcPresentationTimeFromMediaTime(scaledTime, representation);\n presentationEndTime = presentationStartTime + scaledDuration;\n\n seg = getSegment(representation, scaledDuration, presentationStartTime,\n scaledTime,\n representation.adaptation.period.mpd.manifest.loadedTime,\n timelineConverter, presentationEndTime, isDynamic, index);\n\n if (!isSegmentAvailable(timelineConverter, representation, seg, isDynamic)) {\n return null;\n }\n\n seg.replacementTime = tManifest ? tManifest : time;\n\n url = replaceTokenForTemplate(url, 'Number', seg.replacementNumber);\n url = replaceTokenForTemplate(url, 'Time', seg.replacementTime);\n seg.media = url;\n seg.mediaRange = range;\n\n return seg;\n}\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Constants from '../../streaming/constants/Constants';\n\nimport { replaceTokenForTemplate, getIndexBasedSegment } from './SegmentsUtils';\n\nfunction TemplateSegmentsGetter(config, isDynamic) {\n config = config || {};\n const timelineConverter = config.timelineConverter;\n\n let instance;\n\n function checkConfig() {\n if (!timelineConverter || !timelineConverter.hasOwnProperty('calcPeriodRelativeTimeFromMpdRelativeTime')) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function getSegmentByIndex(representation, index) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n const template = representation.adaptation.period.mpd.manifest.Period_asArray[representation.adaptation.period.index].\n AdaptationSet_asArray[representation.adaptation.index].Representation_asArray[representation.index].SegmentTemplate;\n\n index = Math.max(index, 0);\n\n const seg = getIndexBasedSegment(timelineConverter, isDynamic, representation, index);\n if (seg) {\n seg.replacementTime = (index - 1) * representation.segmentDuration;\n\n let url = template.media;\n url = replaceTokenForTemplate(url, 'Number', seg.replacementNumber);\n url = replaceTokenForTemplate(url, 'Time', seg.replacementTime);\n seg.media = url;\n }\n\n const duration = representation.segmentDuration;\n const availabilityWindow = representation.segmentAvailabilityRange;\n if (isNaN(duration)) {\n representation.availableSegmentsNumber = 1;\n }\n else {\n representation.availableSegmentsNumber = Math.ceil((availabilityWindow.end - availabilityWindow.start) / duration);\n }\n\n return seg;\n }\n\n function getSegmentByTime(representation, requestedTime) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n const duration = representation.segmentDuration;\n\n if (isNaN(duration)) {\n return null;\n }\n\n const periodTime = timelineConverter.calcPeriodRelativeTimeFromMpdRelativeTime(representation, requestedTime);\n const index = Math.floor(periodTime / duration);\n\n return getSegmentByIndex(representation, index);\n }\n\n instance = {\n getSegmentByIndex: getSegmentByIndex,\n getSegmentByTime: getSegmentByTime\n };\n\n return instance;\n}\n\nTemplateSegmentsGetter.__dashjs_factory_name = 'TemplateSegmentsGetter';\nconst factory = FactoryMaker.getClassFactory(TemplateSegmentsGetter);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Constants from '../../streaming/constants/Constants';\n\nimport { getTimeBasedSegment } from './SegmentsUtils';\n\nfunction TimelineSegmentsGetter(config, isDynamic) {\n\n config = config || {};\n const timelineConverter = config.timelineConverter;\n\n let instance;\n\n function checkConfig() {\n if (!timelineConverter || !timelineConverter.hasOwnProperty('calcMediaTimeFromPresentationTime') ||\n !timelineConverter.hasOwnProperty('calcSegmentAvailabilityRange')) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function iterateSegments(representation, iterFunc) {\n const base = representation.adaptation.period.mpd.manifest.Period_asArray[representation.adaptation.period.index].\n AdaptationSet_asArray[representation.adaptation.index].Representation_asArray[representation.index].SegmentTemplate ||\n representation.adaptation.period.mpd.manifest.Period_asArray[representation.adaptation.period.index].\n AdaptationSet_asArray[representation.adaptation.index].Representation_asArray[representation.index].SegmentList;\n const timeline = base.SegmentTimeline;\n const list = base.SegmentURL_asArray;\n\n let time = 0;\n let scaledTime = 0;\n let availabilityIdx = -1;\n\n let fragments,\n frag,\n i,\n len,\n j,\n repeat,\n repeatEndTime,\n nextFrag,\n fTimescale;\n\n fTimescale = representation.timescale;\n fragments = timeline.S_asArray;\n\n let breakIterator = false;\n\n for (i = 0, len = fragments.length; i < len && !breakIterator; i++) {\n frag = fragments[i];\n repeat = 0;\n if (frag.hasOwnProperty('r')) {\n repeat = frag.r;\n }\n\n // For a repeated S element, t belongs only to the first segment\n if (frag.hasOwnProperty('t')) {\n time = frag.t;\n scaledTime = time / fTimescale;\n }\n\n // This is a special case: \"A negative value of the @r attribute of the S element indicates that the duration indicated in @d attribute repeats until the start of the next S element, the end of the Period or until the\n // next MPD update.\"\n if (repeat < 0) {\n nextFrag = fragments[i + 1];\n\n if (nextFrag && nextFrag.hasOwnProperty('t')) {\n repeatEndTime = nextFrag.t / fTimescale;\n } else {\n const availabilityEnd = representation.segmentAvailabilityRange ? representation.segmentAvailabilityRange.end : (timelineConverter.calcSegmentAvailabilityRange(representation, isDynamic).end);\n repeatEndTime = timelineConverter.calcMediaTimeFromPresentationTime(availabilityEnd, representation);\n representation.segmentDuration = frag.d / fTimescale;\n }\n\n repeat = Math.ceil((repeatEndTime - scaledTime) / (frag.d / fTimescale)) - 1;\n }\n\n for (j = 0; j <= repeat && !breakIterator; j++) {\n availabilityIdx++;\n\n breakIterator = iterFunc(time, scaledTime, base, list, frag, fTimescale, availabilityIdx, i);\n\n if (breakIterator) {\n representation.segmentDuration = frag.d / fTimescale;\n\n // check if there is at least one more segment\n if (j < repeat - 1 || i < len - 1) {\n availabilityIdx++;\n }\n }\n\n time += frag.d;\n scaledTime = time / fTimescale;\n }\n }\n\n representation.availableSegmentsNumber = availabilityIdx;\n }\n\n function getSegmentByIndex(representation, index, lastSegmentTime) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n let segment = null;\n let found = false;\n\n iterateSegments(representation, function (time, scaledTime, base, list, frag, fTimescale, availabilityIdx, i) {\n if (found || lastSegmentTime < 0) {\n let media = base.media;\n let mediaRange = frag.mediaRange;\n\n if (list) {\n media = list[i].media || '';\n mediaRange = list[i].mediaRange;\n }\n\n segment = getTimeBasedSegment(\n timelineConverter,\n isDynamic,\n representation,\n time,\n frag.d,\n fTimescale,\n media,\n mediaRange,\n availabilityIdx,\n frag.tManifest);\n\n return true;\n } else if (scaledTime >= lastSegmentTime - frag.d * 0.5 / fTimescale) { // same logic, if deviation is\n // 50% of segment duration, segment is found if scaledTime is greater than or equal to (startTime of previous segment - half of the previous segment duration)\n found = true;\n }\n\n return false;\n });\n\n return segment;\n }\n\n function getSegmentByTime(representation, requestedTime) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n if (requestedTime === undefined) {\n requestedTime = null;\n }\n\n let segment = null;\n const requiredMediaTime = timelineConverter.calcMediaTimeFromPresentationTime(requestedTime, representation);\n\n iterateSegments(representation, function (time, scaledTime, base, list, frag, fTimescale, availabilityIdx, i) {\n // In some cases when requiredMediaTime = actual end time of the last segment\n // it is possible that this time a bit exceeds the declared end time of the last segment.\n // in this case we still need to include the last segment in the segment list.\n if (requiredMediaTime < (scaledTime + (frag.d / fTimescale))) {\n let media = base.media;\n let mediaRange = frag.mediaRange;\n\n if (list) {\n media = list[i].media || '';\n mediaRange = list[i].mediaRange;\n }\n\n segment = getTimeBasedSegment(\n timelineConverter,\n isDynamic,\n representation,\n time,\n frag.d,\n fTimescale,\n media,\n mediaRange,\n availabilityIdx,\n frag.tManifest);\n\n return true;\n }\n\n return false;\n });\n\n return segment;\n }\n\n\n instance = {\n getSegmentByIndex: getSegmentByIndex,\n getSegmentByTime: getSegmentByTime\n };\n\n return instance;\n}\n\nTimelineSegmentsGetter.__dashjs_factory_name = 'TimelineSegmentsGetter';\nconst factory = FactoryMaker.getClassFactory(TimelineSegmentsGetter);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass AdaptationSet {\n constructor() {\n this.period = null;\n this.index = -1;\n this.type = null;\n }\n}\n\nexport default AdaptationSet;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\n\nconst DEFAULT_DVB_PRIORITY = 1;\nconst DEFAULT_DVB_WEIGHT = 1;\n\nclass BaseURL {\n constructor(url, serviceLocation, priority, weight) {\n this.url = url || '';\n this.serviceLocation = serviceLocation || url || '';\n\n // DVB extensions\n this.dvb_priority = priority || DEFAULT_DVB_PRIORITY;\n this.dvb_weight = weight || DEFAULT_DVB_WEIGHT;\n\n this.availabilityTimeOffset = 0;\n this.availabilityTimeComplete = true;\n\n /* currently unused:\n * byteRange,\n */\n }\n}\n\nBaseURL.DEFAULT_DVB_PRIORITY = DEFAULT_DVB_PRIORITY;\nBaseURL.DEFAULT_DVB_WEIGHT = DEFAULT_DVB_WEIGHT;\n\nexport default BaseURL;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass Event {\n constructor() {\n this.duration = NaN;\n this.presentationTime = NaN;\n this.id = NaN;\n this.messageData = '';\n this.eventStream = null;\n this.presentationTimeDelta = NaN; // Specific EMSG Box parameter\n }\n}\n\nexport default Event;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass EventStream {\n constructor() {\n this.adaptionSet = null;\n this.representation = null;\n this.period = null;\n this.timescale = 1;\n this.value = '';\n this.schemeIdUri = '';\n }\n}\n\nexport default EventStream;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass Mpd {\n constructor() {\n this.manifest = null;\n this.suggestedPresentationDelay = 0;\n this.availabilityStartTime = null;\n this.availabilityEndTime = Number.POSITIVE_INFINITY;\n this.timeShiftBufferDepth = Number.POSITIVE_INFINITY;\n this.maxSegmentDuration = Number.POSITIVE_INFINITY;\n this.minimumUpdatePeriod = NaN;\n this.mediaPresentationDuration = NaN;\n }\n}\n\nexport default Mpd;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass Period {\n constructor() {\n this.id = null;\n this.index = -1;\n this.duration = NaN;\n this.start = NaN;\n this.mpd = null;\n }\n}\n\nPeriod.DEFAULT_ID = 'defaultId';\n\nexport default Period;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\n\nimport DashConstants from '../constants/DashConstants';\n\nclass Representation {\n constructor() {\n this.id = null;\n this.index = -1;\n this.adaptation = null;\n this.segmentInfoType = null;\n this.initialization = null;\n this.codecs = null;\n this.codecPrivateData = null;\n this.segmentDuration = NaN;\n this.timescale = 1;\n this.startNumber = 1;\n this.indexRange = null;\n this.range = null;\n this.presentationTimeOffset = 0;\n // Set the source buffer timeOffset to this\n this.MSETimeOffset = NaN;\n this.segmentAvailabilityRange = null;\n this.availableSegmentsNumber = 0;\n this.bandwidth = NaN;\n this.width = NaN;\n this.height = NaN;\n this.scanType = null;\n this.maxPlayoutRate = NaN;\n this.availabilityTimeOffset = 0;\n this.availabilityTimeComplete = true;\n }\n\n hasInitialization() {\n return (this.initialization !== null || this.range !== null);\n }\n\n hasSegments() {\n return this.segmentInfoType !== DashConstants.BASE_URL &&\n this.segmentInfoType !== DashConstants.SEGMENT_BASE &&\n !this.indexRange;\n }\n}\n\nexport default Representation;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass Segment {\n constructor() {\n this.indexRange = null;\n this.index = null;\n this.mediaRange = null;\n this.media = null;\n this.duration = NaN;\n // this is the time that should be inserted into the media url\n this.replacementTime = null;\n // this is the number that should be inserted into the media url\n this.replacementNumber = NaN;\n // This is supposed to match the time encoded in the media Segment\n this.mediaStartTime = NaN;\n // When the source buffer timeOffset is set to MSETimeOffset this is the\n // time that will match the seekTarget and video.currentTime\n this.presentationStartTime = NaN;\n // Do not schedule this segment until\n this.availabilityStartTime = NaN;\n // Ignore and discard this segment after\n this.availabilityEndTime = NaN;\n // The index of the segment inside the availability window\n this.availabilityIdx = NaN;\n // For dynamic mpd's, this is the wall clock time that the video\n // element currentTime should be presentationStartTime\n this.wallStartTime = NaN;\n this.representation = null;\n }\n}\n\nexport default Segment;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass UTCTiming {\n constructor() {\n // UTCTiming is a DescriptorType and doesn't have any additional fields\n this.schemeIdUri = '';\n this.value = '';\n }\n}\n\nexport default UTCTiming;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport OfflineConstants from './constants/OfflineConstants';\nimport OfflineStream from './OfflineStream';\nimport OfflineIndexDBManifestParser from './utils/OfflineIndexDBManifestParser';\nimport OfflineErrors from './errors/OfflineErrors';\nimport DashParser from '../dash/parser/DashParser';\n\nfunction OfflineDownload(config) {\n config = config || {};\n\n const context = this.context;\n const manifestLoader = config.manifestLoader;\n const mediaPlayerModel = config.mediaPlayerModel;\n const abrController = config.abrController;\n const playbackController = config.playbackController;\n const adapter = config.adapter;\n const dashMetrics = config.dashMetrics;\n const timelineConverter = config.timelineConverter;\n const offlineStoreController = config.offlineStoreController;\n const manifestId = config.id;\n const eventBus = config.eventBus;\n const errHandler = config.errHandler;\n const events = config.events;\n const errors = config.errors;\n const settings = config.settings;\n const debug = config.debug;\n const manifestUpdater = config.manifestUpdater;\n const baseURLController = config.baseURLController;\n const constants = config.constants;\n const dashConstants = config.dashConstants;\n const urlUtils = config.urlUtils;\n\n let instance,\n logger,\n _manifestURL,\n _offlineURL,\n _xmlManifest,\n _streams,\n _manifest,\n _isDownloadingStatus,\n _isComposed,\n _representationsToUpdate,\n _indexDBManifestParser,\n _progressionById,\n _progression,\n _status;\n\n\n function setup() {\n logger = debug.getLogger(instance);\n manifestUpdater.initialize();\n _streams = [];\n _isDownloadingStatus = false;\n _isComposed = false;\n _progressionById = {};\n _progression = 0;\n _status = undefined;\n }\n\n function getId() {\n return manifestId;\n }\n\n function getOfflineUrl () {\n return _offlineURL;\n }\n\n function getManifestUrl () {\n return _manifestURL;\n }\n\n function getStatus () {\n return _status;\n }\n\n function setInitialState(state) {\n _offlineURL = state.url;\n _progression = state.progress;\n _manifestURL = state.originalUrl;\n _status = state.status;\n }\n\n /**\n * Download a stream, from url of manifest\n * @param {string} url\n * @instance\n */\n function downloadFromUrl(url) {\n _manifestURL = url;\n _offlineURL = `${OfflineConstants.OFFLINE_SCHEME}://${manifestId}`;\n _status = OfflineConstants.OFFLINE_STATUS_CREATED;\n setupOfflineEvents();\n let offlineManifest = {\n 'fragmentStore': manifestId,\n 'status': _status,\n 'manifestId': manifestId,\n 'url': _offlineURL,\n 'originalURL': url\n };\n return createOfflineManifest(offlineManifest);\n }\n\n function initDownload() {\n manifestLoader.load(_manifestURL);\n _isDownloadingStatus = true;\n }\n\n function setupOfflineEvents() {\n eventBus.on(events.MANIFEST_UPDATED, onManifestUpdated, instance);\n eventBus.on(events.ORIGINAL_MANIFEST_LOADED, onOriginalManifestLoaded, instance);\n setupIndexedDBEvents();\n }\n\n function setupIndexedDBEvents() {\n eventBus.on(events.ERROR, onError, instance);\n }\n\n function isDownloading() {\n return _isDownloadingStatus;\n }\n\n function onManifestUpdated(e) {\n if (_isComposed) {\n return;\n }\n if (!e.error) {\n try {\n _manifest = e.manifest;\n } catch (err) {\n _status = OfflineConstants.OFFLINE_STATUS_ERROR;\n errHandler.error({\n code: OfflineErrors.OFFLINE_ERROR,\n message: err.message,\n data: {\n id: manifestId,\n status: _status\n }\n });\n }\n }\n }\n\n function onDownloadingStarted(e) {\n if (e.id !== manifestId) {\n return;\n }\n if (!e.error && manifestId !== null) {\n _status = OfflineConstants.OFFLINE_STATUS_STARTED;\n offlineStoreController.setDownloadingStatus(manifestId, _status).then(function () {\n eventBus.trigger(events.OFFLINE_RECORD_STARTED, {id: manifestId, message: 'Downloading started for this stream !'});\n });\n } else {\n _status = OfflineConstants.OFFLINE_STATUS_ERROR;\n errHandler.error({\n code: OfflineErrors.OFFLINE_ERROR,\n message: 'Cannot start download ',\n data: {\n id: manifestId,\n status: _status,\n error: e.error\n }\n });\n }\n }\n\n function OnStreamProgression(stream, downloaded, available) {\n\n _progressionById[stream.getStreamInfo().id] = {\n downloaded,\n available\n };\n\n let segments = 0;\n let allSegments = 0;\n let waitForAllProgress;\n for (var property in _progressionById) {\n if (_progressionById.hasOwnProperty(property)) {\n if (_progressionById[property] === null) {\n waitForAllProgress = true;\n } else {\n segments += _progressionById[property].downloaded;\n allSegments += _progressionById[property].available;\n }\n }\n }\n\n if (!waitForAllProgress) {\n // all progression have been started, we can compute global progression\n _progression = segments / allSegments;\n\n // store progression\n offlineStoreController.getManifestById(manifestId)\n .then((item) => {\n item.progress = _progression;\n return updateOfflineManifest(item);\n });\n }\n }\n\n function onDownloadingFinished(e) {\n if (e.id !== manifestId) {\n return;\n }\n if (!e.error && manifestId !== null) {\n _status = OfflineConstants.OFFLINE_STATUS_FINISHED;\n offlineStoreController.setDownloadingStatus(manifestId, _status)\n .then(function () {\n eventBus.trigger(events.OFFLINE_RECORD_FINISHED, {id: manifestId, message: 'Downloading has been successfully completed for this stream !'});\n resetDownload();\n });\n } else {\n _status = OfflineConstants.OFFLINE_STATUS_ERROR;\n errHandler.error({\n code: OfflineErrors.OFFLINE_ERROR,\n message: 'Error finishing download ',\n data: {\n id: manifestId,\n status: _status,\n error: e.error\n }\n });\n }\n }\n\n function onManifestUpdateNeeded(e) {\n if (e.id !== manifestId) {\n return;\n }\n\n _representationsToUpdate = e.representations;\n\n if (_representationsToUpdate.length > 0) {\n _indexDBManifestParser.parse(_xmlManifest, _representationsToUpdate).then(function (parsedManifest) {\n if (parsedManifest !== null && manifestId !== null) {\n offlineStoreController.getManifestById(manifestId)\n .then((item) => {\n item.manifest = parsedManifest;\n return updateOfflineManifest(item);\n })\n .then( function () {\n for (let i = 0, ln = _streams.length; i < ln; i++) {\n _streams[i].startOfflineStreamProcessors();\n }\n });\n } else {\n throw 'falling parsing offline manifest';\n }\n }).catch(function (err) {\n throw err;\n });\n }\n }\n\n function composeStreams() {\n try {\n adapter.updatePeriods(_manifest);\n baseURLController.initialize(_manifest);\n const streamsInfo = adapter.getStreamsInfo();\n if (streamsInfo.length === 0) {\n _status = OfflineConstants.OFFLINE_STATUS_ERROR;\n errHandler.error({\n code: OfflineErrors.OFFLINE_ERROR,\n message: 'Cannot download - no streams',\n data: {\n id: manifestId,\n status: _status\n }\n });\n }\n for (let i = 0, ln = streamsInfo.length; i < ln; i++) {\n const streamInfo = streamsInfo[i];\n let stream = OfflineStream(context).create({\n id: manifestId,\n callbacks: {\n started: onDownloadingStarted,\n progression: OnStreamProgression,\n finished: onDownloadingFinished,\n updateManifestNeeded: onManifestUpdateNeeded\n },\n constants: constants,\n dashConstants: dashConstants,\n eventBus: eventBus,\n events: events,\n errors: errors,\n settings: settings,\n debug: debug,\n errHandler: errHandler,\n mediaPlayerModel: mediaPlayerModel,\n abrController: abrController,\n playbackController: playbackController,\n dashMetrics: dashMetrics,\n baseURLController: baseURLController,\n timelineConverter: timelineConverter,\n adapter: adapter,\n offlineStoreController: offlineStoreController\n });\n _streams.push(stream);\n\n // initialise stream and get downloadable representations\n stream.initialize(streamInfo);\n _progressionById[streamInfo.id] = null;\n }\n _isComposed = true;\n } catch (e) {\n logger.info(e);\n _status = OfflineConstants.OFFLINE_STATUS_ERROR;\n errHandler.error({\n code: OfflineErrors.OFFLINE_ERROR,\n message: e.message,\n data: {\n id: manifestId,\n status: _status,\n error: e.error\n }\n });\n }\n }\n\n function getMediaInfos() {\n _streams.forEach(stream => {\n stream.getMediaInfos();\n });\n }\n\n /**\n * Init databsse to store fragments\n * @param {number} manifestId\n * @instance\n */\n function createFragmentStore(manifestId) {\n return offlineStoreController.createFragmentStore(manifestId);\n }\n\n /**\n * Store in database the string representation of offline manifest (with only downloaded representations)\n * @param {object} offlineManifest\n * @instance\n */\n function createOfflineManifest(offlineManifest) {\n return offlineStoreController.createOfflineManifest(offlineManifest);\n }\n\n /**\n * Store in database the string representation of offline manifest (with only downloaded representations)\n * @param {object} offlineManifest\n * @instance\n */\n function updateOfflineManifest(offlineManifest) {\n return offlineStoreController.updateOfflineManifest(offlineManifest);\n }\n\n /**\n * Triggered when manifest is loaded from internet.\n * @param {Object[]} e\n */\n function onOriginalManifestLoaded(e) {\n // unregister form event\n eventBus.off(events.ORIGINAL_MANIFEST_LOADED, onOriginalManifestLoaded, instance);\n\n _xmlManifest = e.originalManifest;\n\n if (_manifest.type === dashConstants.DYNAMIC) {\n _status = OfflineConstants.OFFLINE_STATUS_ERROR;\n errHandler.error({\n code: OfflineErrors.OFFLINE_ERROR,\n message: 'Cannot handle DYNAMIC manifest',\n data: {\n id: manifestId,\n status: _status\n }\n });\n logger.error('Cannot handle DYNAMIC manifest');\n\n return;\n }\n\n if (_manifest.Period_asArray.length > 1) {\n _status = OfflineConstants.OFFLINE_STATUS_ERROR;\n errHandler.error({\n code: OfflineErrors.OFFLINE_ERROR,\n message: 'MultiPeriod manifest are not yet supported',\n data: {\n id: manifestId,\n status: _status\n }\n });\n logger.error('MultiPeriod manifest are not yet supported');\n\n return;\n }\n\n // save original manifest (for resume)\n\n // initialise offline streams\n composeStreams(_manifest);\n\n // get MediaInfos\n getMediaInfos();\n\n eventBus.trigger(events.STREAMS_COMPOSED);\n }\n\n function initializeAllMediasInfoList(selectedRepresentations) {\n for (let i = 0; i < _streams.length; i++) {\n _streams[i].initializeAllMediasInfoList(selectedRepresentations);\n }\n }\n\n function getSelectedRepresentations(mediaInfos) {\n let rep = {};\n rep[constants.VIDEO] = [];\n rep[constants.AUDIO] = [];\n rep[constants.TEXT] = [];\n rep[constants.FRAGMENTED_TEXT] = [];\n\n // selectedRepresentations.video.forEach(item => {\n // ret[constants.VIDEO].push(item.id);\n // });\n // selectedRepresentations.audio.forEach(item => {\n // ret[constants.AUDIO].push(item.id);\n // });\n // selectedRepresentations.text.forEach(item => {\n // ret[item.type].push(item.id);\n // });\n\n mediaInfos.forEach(mediaInfo => {\n mediaInfo.bitrateList.forEach(bitrate => {\n rep[mediaInfo.type].push(bitrate.id);\n });\n });\n return rep;\n }\n\n function startDownload(mediaInfos) {\n try {\n let rep = getSelectedRepresentations(mediaInfos);\n\n offlineStoreController.saveSelectedRepresentations(manifestId, rep)\n .then(() => {\n return createFragmentStore(manifestId);\n })\n .then(() => {\n return generateOfflineManifest(rep);\n })\n .then(function () {\n initializeAllMediasInfoList(rep);\n });\n } catch (err) {\n _status = OfflineConstants.OFFLINE_STATUS_ERROR;\n errHandler.error({\n code: OfflineErrors.OFFLINE_ERROR,\n message: err.message,\n data: {\n id: manifestId,\n status: _status\n }\n });\n }\n }\n\n /**\n * Create the parser used to convert original manifest in offline manifest\n * Creates a JSON object that will be stored in database\n * @param {Object[]} selectedRepresentations\n * @instance\n */\n function generateOfflineManifest(selectedRepresentations) {\n _indexDBManifestParser = OfflineIndexDBManifestParser(context).create({\n manifestId: manifestId,\n allMediaInfos: selectedRepresentations,\n debug: debug,\n dashConstants: dashConstants,\n constants: constants,\n urlUtils: urlUtils\n });\n\n return _indexDBManifestParser.parse(_xmlManifest).then(function (parsedManifest) {\n if (parsedManifest !== null) {\n return offlineStoreController.getManifestById(manifestId)\n .then((item) => {\n item.originalURL = _manifest.url;\n item.originalManifest = _xmlManifest;\n item.manifest = parsedManifest;\n return updateOfflineManifest(item);\n });\n } else {\n return Promise.reject('falling parsing offline manifest');\n }\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n\n /**\n * Stops downloading of fragments\n * @instance\n */\n function stopDownload() {\n if (manifestId !== null && isDownloading()) {\n for (let i = 0, ln = _streams.length; i < ln; i++) {\n _streams[i].stopOfflineStreamProcessors();\n }\n\n // remove streams\n _streams = [];\n\n _isComposed = false;\n\n _status = OfflineConstants.OFFLINE_STATUS_STOPPED;\n // update status\n offlineStoreController.setDownloadingStatus(manifestId, _status).then(function () {\n eventBus.trigger(events.OFFLINE_RECORD_STOPPED, {\n sender: this,\n id: manifestId,\n status: _status,\n message: 'Downloading has been stopped for this stream !'\n });\n _isDownloadingStatus = false;\n });\n }\n }\n\n /**\n * Delete an offline manifest (and all of its data)\n * @instance\n */\n function deleteDownload() {\n stopDownload();\n }\n\n /**\n * Resume download of a stream\n * @instance\n */\n function resumeDownload() {\n if (isDownloading()) {\n return;\n }\n\n _isDownloadingStatus = true;\n\n let selectedRepresentations;\n\n offlineStoreController.getManifestById(manifestId)\n .then((item) => {\n let parser = DashParser(context).create({debug: debug});\n _manifest = parser.parse(item.originalManifest);\n\n composeStreams(_manifest);\n\n selectedRepresentations = item.selected;\n\n eventBus.trigger(events.STREAMS_COMPOSED);\n\n return createFragmentStore(manifestId);\n }). then(() => {\n initializeAllMediasInfoList(selectedRepresentations);\n });\n }\n\n /**\n * Compute the progression of download\n * @instance\n */\n function getDownloadProgression() {\n return Math.round(_progression * 100);\n }\n\n /**\n * Reset events listeners\n * @instance\n */\n function resetDownload() {\n for (let i = 0, ln = _streams.length; i < ln; i++) {\n _streams[i].reset();\n }\n _indexDBManifestParser = null;\n _isDownloadingStatus = false;\n _streams = [];\n eventBus.off(events.MANIFEST_UPDATED, onManifestUpdated, instance);\n eventBus.off(events.ORIGINAL_MANIFEST_LOADED, onOriginalManifestLoaded, instance);\n resetIndexedDBEvents();\n }\n\n function onError(e) {\n if ( e.error.code === OfflineErrors.INDEXEDDB_QUOTA_EXCEED_ERROR ||\n e.error.code === OfflineErrors.INDEXEDDB_INVALID_STATE_ERROR ) {\n stopDownload();\n }\n }\n\n function resetIndexedDBEvents() {\n eventBus.on(events.ERROR, onError, instance);\n }\n\n /**\n * Reset\n * @instance\n */\n function reset() {\n if (isDownloading()) {\n resetDownload();\n }\n baseURLController.reset();\n manifestUpdater.reset();\n }\n\n instance = {\n reset: reset,\n getId: getId,\n getOfflineUrl: getOfflineUrl,\n getManifestUrl: getManifestUrl,\n getStatus: getStatus,\n setInitialState: setInitialState,\n initDownload: initDownload,\n downloadFromUrl: downloadFromUrl,\n startDownload: startDownload,\n stopDownload: stopDownload,\n resumeDownload: resumeDownload,\n deleteDownload: deleteDownload,\n getDownloadProgression: getDownloadProgression,\n isDownloading: isDownloading,\n resetDownload: resetDownload\n };\n\n setup();\n\n return instance;\n}\n\nOfflineDownload.__dashjs_factory_name = 'OfflineDownload';\nexport default dashjs.FactoryMaker.getClassFactory(OfflineDownload); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport OfflineStreamProcessor from './OfflineStreamProcessor';\n\n/**\n * Initialize and Manage Offline Stream for each type\n */\n/**\n * @class OfflineStream\n * @description Initialize and Manage Offline Stream for each type\n * @param {Object} config - dependences\n * @ignore\n */\nfunction OfflineStream(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = config.eventBus;\n const events = config.events;\n const errors = config.errors;\n const constants = config.constants;\n const dashConstants = config.dashConstants;\n const settings = config.settings;\n const debug = config.debug;\n const errHandler = config.errHandler;\n const mediaPlayerModel = config.mediaPlayerModel;\n const abrController = config.abrController;\n const playbackController = config.playbackController;\n const adapter = config.adapter;\n const dashMetrics = config.dashMetrics;\n const baseURLController = config.baseURLController;\n const timelineConverter = config.timelineConverter;\n const offlineStoreController = config.offlineStoreController;\n const manifestId = config.id;\n const startedCb = config.callbacks && config.callbacks.started;\n const progressionCb = config.callbacks && config.callbacks.progression;\n const finishedCb = config.callbacks && config.callbacks.finished;\n const updateManifest = config.callbacks && config.callbacks.updateManifestNeeded;\n\n let instance,\n offlineStreamProcessors,\n startedOfflineStreamProcessors,\n finishedOfflineStreamProcessors,\n streamInfo,\n representationsToUpdate,\n allMediasInfosList,\n progressionById;\n\n function setup() {\n resetInitialSettings();\n }\n\n /**\n * Reset\n */\n function resetInitialSettings() {\n streamInfo = null;\n offlineStreamProcessors = [];\n startedOfflineStreamProcessors = 0;\n finishedOfflineStreamProcessors = 0;\n allMediasInfosList = [];\n representationsToUpdate = [];\n progressionById = {};\n }\n\n /**\n * Initialize offlinestream\n * @param {Object} initStreamInfo\n */\n function initialize(initStreamInfo) {\n streamInfo = initStreamInfo;\n eventBus.on(events.DATA_UPDATE_COMPLETED, onDataUpdateCompleted, this);\n }\n\n /**\n * Creates media infos list, so that user will be able to choose the representation he wants to download\n */\n function getMediaInfos() {\n let mediaInfos = adapter.getAllMediaInfoForType(streamInfo, constants.VIDEO);\n mediaInfos = mediaInfos.concat(adapter.getAllMediaInfoForType(streamInfo, constants.AUDIO));\n mediaInfos = mediaInfos.concat(adapter.getAllMediaInfoForType(streamInfo, constants.FRAGMENTED_TEXT));\n mediaInfos = mediaInfos.concat(adapter.getAllMediaInfoForType(streamInfo, constants.TEXT));\n\n // mediaInfos = mediaInfos.concat(adapter.getAllMediaInfoForType(streamInfo, constants.MUXED));\n // mediaInfos = mediaInfos.concat(adapter.getAllMediaInfoForType(streamInfo, constants.IMAGE));\n\n eventBus.trigger(events.OFFLINE_RECORD_LOADEDMETADATA, {\n id: manifestId,\n mediaInfos: mediaInfos\n });\n }\n\n /**\n * Initialize with choosen representations by user\n * @param {Object} mediasInfoList\n */\n function initializeAllMediasInfoList(mediasInfoList) {\n allMediasInfosList = mediasInfoList;\n initializeMedia(streamInfo);\n }\n\n /**\n * Initialize media for each type\n * @param {Object} streamInfo\n */\n function initializeMedia(streamInfo) {\n createOfflineStreamProcessorFor(constants.VIDEO,streamInfo);\n createOfflineStreamProcessorFor(constants.AUDIO,streamInfo);\n createOfflineStreamProcessorFor(constants.FRAGMENTED_TEXT,streamInfo);\n createOfflineStreamProcessorFor(constants.TEXT,streamInfo);\n\n createOfflineStreamProcessorFor(constants.MUXED,streamInfo);\n createOfflineStreamProcessorFor(constants.IMAGE,streamInfo);\n }\n\n function createOfflineStreamProcessorFor(type, streamInfo) {\n // filter mediaInfo according to choosen representation id\n let allMediaInfoForType = adapter.getAllMediaInfoForType(streamInfo, type);\n allMediaInfoForType.forEach((media) => {\n media.bitrateList = media.bitrateList.filter((bitrate) => {\n if (allMediasInfosList[type] && allMediasInfosList[type].indexOf(bitrate.id) !== -1) {\n return true;\n }\n return false;\n });\n });\n\n allMediaInfoForType = allMediaInfoForType.filter((media) => {\n return (media.bitrateList && media.bitrateList.length > 0);\n });\n\n // cration of an offline stream processor for each choosen representation\n allMediaInfoForType.forEach((mediaInfo) => {\n if (mediaInfo.bitrateList) {\n mediaInfo.bitrateList.forEach((bitrate) => {\n createStreamProcessor(mediaInfo, bitrate);\n });\n }\n });\n return allMediaInfoForType;\n }\n\n function createStreamProcessor (mediaInfo, bitrate) {\n\n let streamProcessor = OfflineStreamProcessor(context).create({\n id: manifestId,\n streamInfo: streamInfo,\n debug: debug,\n events: events,\n errors: errors,\n eventBus: eventBus,\n constants: constants,\n dashConstants: dashConstants,\n settings: settings,\n type: mediaInfo.type,\n mimeType: mediaInfo.mimeType,\n bitrate: bitrate,\n errHandler: errHandler,\n mediaPlayerModel: mediaPlayerModel,\n abrController: abrController,\n playbackController: playbackController,\n adapter: adapter,\n dashMetrics: dashMetrics,\n baseURLController: baseURLController,\n timelineConverter: timelineConverter,\n offlineStoreController: offlineStoreController,\n callbacks: {\n completed: onStreamCompleted,\n progression: onStreamProgression\n }\n });\n offlineStreamProcessors.push(streamProcessor);\n streamProcessor.initialize(mediaInfo);\n\n progressionById[bitrate.id] = null;\n }\n\n function onStreamCompleted() {\n finishedOfflineStreamProcessors++;\n if (finishedOfflineStreamProcessors === offlineStreamProcessors.length) {\n finishedCb({sender: this, id: manifestId, message: 'Downloading has been successfully completed for this stream !'});\n }\n }\n\n function onStreamProgression(streamProcessor, downloadedSegments, availableSegments ) {\n progressionById[streamProcessor.getRepresentationId()] = {\n downloadedSegments,\n availableSegments\n };\n\n let segments = 0;\n let allSegments = 0;\n let waitForAllProgress;\n for (var property in progressionById) {\n if (progressionById.hasOwnProperty(property)) {\n if (progressionById[property] === null) {\n waitForAllProgress = true;\n } else {\n segments += progressionById[property].downloadedSegments;\n allSegments += progressionById[property].availableSegments;\n }\n }\n }\n\n if (!waitForAllProgress && progressionCb) {\n // all progression have been started, we can compute global progression\n if (allSegments > 0) {\n progressionCb(instance, segments, allSegments);\n }\n }\n }\n\n function onDataUpdateCompleted(e) {\n let repCtrl = e.sender;\n if (!streamInfo || repCtrl.getStreamId() !== streamInfo.id) return;\n\n if (e.currentRepresentation.segments && e.currentRepresentation.segments.length > 0) {\n representationsToUpdate.push(e.currentRepresentation);\n }\n\n let sp;\n // data are ready fr stream processor, let's start download\n for (let i = 0; i < offlineStreamProcessors.length; i++ ) {\n if (offlineStreamProcessors[i].getRepresentationController().getType() === repCtrl.getType()) {\n sp = offlineStreamProcessors[i];\n break;\n }\n }\n\n if (sp) {\n checkIfAllOfflineStreamProcessorsStarted();\n }\n }\n\n function checkIfAllOfflineStreamProcessorsStarted() {\n startedOfflineStreamProcessors++;\n if (startedOfflineStreamProcessors === offlineStreamProcessors.length) {\n startedCb({sender: this, id: manifestId, message: 'Downloading started for this stream !'});\n\n if (representationsToUpdate.length > 0) {\n updateManifest({sender: this, id: manifestId, representations: representationsToUpdate });\n } else {\n startOfflineStreamProcessors();\n }\n }\n }\n\n function getStreamInfo() {\n return streamInfo;\n }\n\n function getStartTime() {\n return streamInfo ? streamInfo.start : NaN;\n }\n\n function getDuration() {\n return streamInfo ? streamInfo.duration : NaN;\n }\n\n /**\n * Stop offline stream processors\n */\n function stopOfflineStreamProcessors() {\n for (let i = 0; i < offlineStreamProcessors.length; i++) {\n offlineStreamProcessors[i].stop();\n }\n }\n\n /**\n * Start offline stream processors\n */\n function startOfflineStreamProcessors() {\n for (let i = 0; i < offlineStreamProcessors.length; i++) {\n offlineStreamProcessors[i].start();\n }\n }\n\n function deactivate() {\n let ln = offlineStreamProcessors ? offlineStreamProcessors.length : 0;\n for (let i = 0; i < ln; i++) {\n offlineStreamProcessors[i].removeExecutedRequestsBeforeTime(getStartTime() + getDuration());\n offlineStreamProcessors[i].reset();\n }\n }\n\n /**\n * Reset\n */\n function reset() {\n stopOfflineStreamProcessors();\n deactivate();\n resetInitialSettings();\n\n eventBus.off(events.DATA_UPDATE_COMPLETED, onDataUpdateCompleted, this);\n }\n\n instance = {\n initialize: initialize,\n getMediaInfos: getMediaInfos,\n initializeAllMediasInfoList: initializeAllMediasInfoList,\n getStreamInfo: getStreamInfo,\n stopOfflineStreamProcessors: stopOfflineStreamProcessors,\n startOfflineStreamProcessors: startOfflineStreamProcessors,\n reset: reset\n };\n\n setup();\n return instance;\n}\n\nOfflineStream.__dashjs_factory_name = 'OfflineStream';\nexport default dashjs.FactoryMaker.getClassFactory(OfflineStream); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport DashHandler from '../dash/DashHandler';\nimport RepresentationController from '../dash/controllers/RepresentationController';\nimport FragmentModel from '../streaming/models/FragmentModel';\nimport FragmentLoader from '../streaming/FragmentLoader';\nimport URLUtils from '../streaming/utils/URLUtils';\nimport RequestModifier from '../streaming/utils/RequestModifier';\n\n\nfunction OfflineStreamProcessor(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = config.eventBus;\n const events = config.events;\n const errors = config.errors;\n const debug = config.debug;\n const constants = config.constants;\n const settings = config.settings;\n const dashConstants = config.dashConstants;\n const manifestId = config.id;\n const type = config.type;\n const streamInfo = config.streamInfo;\n const errHandler = config.errHandler;\n const mediaPlayerModel = config.mediaPlayerModel;\n const abrController = config.abrController;\n const playbackController = config.playbackController;\n const adapter = config.adapter;\n const dashMetrics = config.dashMetrics;\n const baseURLController = config.baseURLController;\n const timelineConverter = config.timelineConverter;\n const bitrate = config.bitrate;\n const offlineStoreController = config.offlineStoreController;\n const completedCb = config.callbacks && config.callbacks.completed;\n const progressCb = config.callbacks && config.callbacks.progression;\n\n let instance,\n logger,\n mediaInfo,\n indexHandler,\n representationController,\n fragmentModel,\n updating,\n downloadedSegments,\n isInitialized,\n isStopped;\n\n function setup() {\n resetInitialSettings();\n logger = debug.getLogger(instance);\n\n indexHandler = DashHandler(context).create({\n streamInfo: streamInfo,\n type: type,\n timelineConverter: timelineConverter,\n dashMetrics: dashMetrics,\n mediaPlayerModel: mediaPlayerModel,\n baseURLController: baseURLController,\n errHandler: errHandler,\n settings: settings,\n // boxParser: boxParser,\n eventBus: eventBus,\n events: events,\n debug: debug,\n requestModifier: RequestModifier(context).getInstance(),\n dashConstants: dashConstants,\n constants: constants,\n urlUtils: URLUtils(context).getInstance()\n });\n\n representationController = RepresentationController(context).create({\n streamId: streamInfo.id,\n type: type,\n abrController: abrController,\n dashMetrics: dashMetrics,\n playbackController: playbackController,\n timelineConverter: timelineConverter,\n dashConstants: dashConstants,\n events: events,\n eventBus: eventBus,\n errors: errors\n });\n\n fragmentModel = FragmentModel(context).create({\n streamId: streamInfo.id,\n dashMetrics: dashMetrics,\n fragmentLoader: FragmentLoader(context).create({\n dashMetrics: dashMetrics,\n mediaPlayerModel: mediaPlayerModel,\n errHandler: errHandler,\n requestModifier: RequestModifier(context).getInstance(),\n settings: settings,\n eventBus: eventBus,\n events: events,\n errors: errors,\n constants: constants,\n dashConstants: dashConstants,\n urlUtils: URLUtils(context).getInstance()\n }),\n debug: debug,\n eventBus: eventBus,\n events: events\n });\n\n eventBus.on(events.STREAM_COMPLETED, onStreamCompleted, instance);\n eventBus.on(events.FRAGMENT_LOADING_COMPLETED, onFragmentLoadingCompleted, instance);\n }\n\n function initialize(_mediaInfo) {\n mediaInfo = _mediaInfo;\n indexHandler.initialize(false);\n updateRepresentation(mediaInfo);\n }\n\n function isInitRequest(request) {\n return request.type === 'InitializationSegment';\n }\n\n function onFragmentLoadingCompleted(e) {\n if (e.sender !== fragmentModel) {\n return;\n }\n\n if (e.request !== null) {\n let isInit = isInitRequest(e.request);\n let suffix = isInit ? 'init' : e.request.index;\n let fragmentName = e.request.representationId + '_' + suffix;\n offlineStoreController.storeFragment(manifestId, fragmentName, e.response)\n .then(() => {\n if (!isInit) {\n // store current index and downloadedSegments number\n offlineStoreController.setRepresentationCurrentState(manifestId, e.request.representationId, {\n index: e.request.index,\n downloaded: downloadedSegments\n } );\n }\n });\n }\n\n if (e.error && e.request.serviceLocation && !isStopped) {\n fragmentModel.executeRequest(e.request);\n } else {\n downloadedSegments++;\n download();\n }\n }\n\n function onStreamCompleted(e) {\n if (e.fragmentModel !== fragmentModel) {\n return;\n }\n logger.info(`[${manifestId}] Stream is complete`);\n stop();\n completedCb();\n }\n\n function getRepresentationController () {\n return representationController;\n }\n\n function getRepresentationId() {\n return representationController.getCurrentRepresentation().id;\n }\n\n /**\n * Stops download of fragments\n * @memberof OfflineStreamProcessor#\n */\n function stop() {\n if (isStopped) {\n return;\n }\n isStopped = true;\n }\n\n\n function removeExecutedRequestsBeforeTime(time) {\n if (fragmentModel) {\n fragmentModel.removeExecutedRequestsBeforeTime(time);\n }\n }\n\n /**\n * Execute init request for the represenation\n * @memberof OfflineStreamProcessor#\n */\n function getInitRequest() {\n if (!representationController.getCurrentRepresentation()) {\n return null;\n }\n\n return indexHandler.getInitRequest(getMediaInfo(), representationController.getCurrentRepresentation());\n }\n\n /**\n * Get next request\n * @memberof OfflineStreamProcessor#\n */\n function getNextRequest() {\n return indexHandler.getNextSegmentRequest(getMediaInfo(), representationController.getCurrentRepresentation());\n }\n\n /**\n * Start download\n * @memberof OfflineStreamProcessor#\n */\n function start() {\n if (representationController) {\n if (!representationController.getCurrentRepresentation()) {\n throw new Error('Start denied to OfflineStreamProcessor');\n }\n isStopped = false;\n\n offlineStoreController.getRepresentationCurrentState(manifestId, representationController.getCurrentRepresentation().id)\n .then((state) => {\n if (state) {\n indexHandler.setCurrentIndex(state.index);\n downloadedSegments = state.downloaded;\n }\n download();\n }).catch(() => {\n // start from beginining\n download();\n });\n }\n }\n\n /**\n * Performs download of fragment according to type\n * @memberof OfflineStreamProcessor#\n */\n function download() {\n if (isStopped) {\n return;\n }\n\n if (isNaN(representationController.getCurrentRepresentation())) {\n let request = null;\n if (!isInitialized) {\n request = getInitRequest();\n isInitialized = true;\n } else {\n request = getNextRequest();\n\n // update progression : done here because availableSegmentsNumber is done in getNextRequest from dash handler\n updateProgression();\n }\n\n if (request) {\n logger.info(`[${manifestId}] download request : ${request.url}`);\n fragmentModel.executeRequest(request);\n } else {\n logger.info(`[${manifestId}] no request to be downloaded`);\n }\n }\n }\n\n /**\n * Update representation\n * @param {Object} mediaInfo - mediaInfo\n * @memberof OfflineStreamProcessor#\n */\n function updateRepresentation(mediaInfo) {\n updating = true;\n\n let voRepresentations = adapter.getVoRepresentations(mediaInfo);\n\n // get representation VO according to id.\n let quality = voRepresentations.findIndex((representation) => {\n return representation.id === bitrate.id;\n });\n\n if (type !== constants.VIDEO && type !== constants.AUDIO && type !== constants.TEXT && type !== constants.FRAGMENTED_TEXT) {\n updating = false;\n return;\n }\n\n representationController.updateData(null, voRepresentations, type, quality);\n }\n\n function isUpdating() {\n return updating;\n }\n\n function getType() {\n return type;\n }\n\n function getMediaInfo() {\n return mediaInfo;\n }\n\n function getAvailableSegmentsNumber() {\n return representationController.getCurrentRepresentation().availableSegmentsNumber + 1; // do not forget init segment\n }\n\n function updateProgression () {\n if (progressCb) {\n progressCb(instance, downloadedSegments, getAvailableSegmentsNumber());\n }\n }\n\n function resetInitialSettings() {\n isInitialized = false;\n downloadedSegments = 0;\n updating = false;\n }\n\n /**\n * Reset\n * @memberof OfflineStreamProcessor#\n */\n function reset() {\n resetInitialSettings();\n indexHandler.reset();\n\n eventBus.off(events.STREAM_COMPLETED, onStreamCompleted, instance);\n eventBus.off(events.FRAGMENT_LOADING_COMPLETED, onFragmentLoadingCompleted, instance);\n }\n\n instance = {\n initialize: initialize,\n getMediaInfo: getMediaInfo,\n getRepresentationController: getRepresentationController,\n removeExecutedRequestsBeforeTime: removeExecutedRequestsBeforeTime,\n getType: getType,\n getRepresentationId: getRepresentationId,\n isUpdating: isUpdating,\n start: start,\n stop: stop,\n getAvailableSegmentsNumber: getAvailableSegmentsNumber,\n reset: reset\n };\n\n setup();\n\n return instance;\n}\nOfflineStreamProcessor.__dashjs_factory_name = 'OfflineStreamProcessor';\nconst factory = dashjs.FactoryMaker.getClassFactory(OfflineStreamProcessor); /* jshint ignore:line */\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Offline constants declaration\n * @class\n * @ignore\n */\nclass OfflineConstants {\n\n init() {\n this.OFFLINE_SCHEME = 'offline_indexeddb';\n this.OFFLINE_URL_REGEX = /^offline_indexeddb:\\/\\//i;\n this.OFFLINE_STATUS_CREATED = 'created';\n this.OFFLINE_STATUS_STARTED = 'started';\n this.OFFLINE_STATUS_STOPPED = 'stopped';\n this.OFFLINE_STATUS_FINISHED = 'finished';\n this.OFFLINE_STATUS_ERROR = 'error';\n }\n\n constructor () {\n this.init();\n }\n}\n\nlet constants = new OfflineConstants();\nexport default constants;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport OfflineConstants from '../constants/OfflineConstants';\nimport OfflineStoreController from './OfflineStoreController';\nimport OfflineDownload from '../OfflineDownload';\nimport IndexDBOfflineLoader from '../net/IndexDBOfflineLoader';\nimport OfflineUrlUtils from '../utils/OfflineUrlUtils';\nimport OfflineEvents from '../events/OfflineEvents';\nimport OfflineErrors from '../errors/OfflineErrors';\nimport OfflineRecord from '../vo/OfflineDownloadVo';\n\n/**\n * @module OfflineController\n * @param {Object} config - dependencies\n * @description Provides access to offline stream recording and playback functionality.\n */\nfunction OfflineController(config) {\n\n const context = this.context;\n const errHandler = config.errHandler;\n const events = config.events;\n const errors = config.errors;\n const settings = config.settings;\n const eventBus = config.eventBus;\n const debug = config.debug;\n const manifestLoader = config.manifestLoader;\n const manifestModel = config.manifestModel;\n const mediaPlayerModel = config.mediaPlayerModel;\n const abrController = config.abrController;\n const playbackController = config.playbackController;\n const dashMetrics = config.dashMetrics;\n const timelineConverter = config.timelineConverter;\n const adapter = config.adapter;\n const manifestUpdater = config.manifestUpdater;\n const baseURLController = config.baseURLController;\n const schemeLoaderFactory = config.schemeLoaderFactory;\n const constants = config.constants;\n const dashConstants = config.dashConstants;\n const urlUtils = config.urlUtils;\n\n let instance,\n downloads,\n logger,\n offlineStoreController,\n offlineUrlUtils;\n\n function setup() {\n logger = debug.getLogger(instance);\n offlineStoreController = OfflineStoreController(context).create({\n eventBus: config.eventBus,\n errHandler: errHandler\n });\n offlineUrlUtils = OfflineUrlUtils(context).getInstance();\n urlUtils.registerUrlRegex(offlineUrlUtils.getRegex(), offlineUrlUtils);\n schemeLoaderFactory.registerLoader(OfflineConstants.OFFLINE_SCHEME, IndexDBOfflineLoader);\n\n downloads = [];\n }\n\n /*\n ---------------------------------------------------------------------------\n DOWNLOAD LIST FUNCTIONS\n ---------------------------------------------------------------------------\n */\n function getDownloadFromId(id) {\n let download = downloads.find((item) => {\n return item.getId() === id;\n });\n return download;\n }\n\n function createDownloadFromId(id) {\n let download;\n download = getDownloadFromId(id);\n\n if (!download) {\n // create download controller\n download = OfflineDownload(context).create({\n id: id,\n eventBus: eventBus,\n events: events,\n errors: errors,\n settings: settings,\n manifestLoader: manifestLoader,\n manifestModel: manifestModel,\n mediaPlayerModel: mediaPlayerModel,\n manifestUpdater: manifestUpdater,\n baseURLController: baseURLController,\n abrController: abrController,\n playbackController: playbackController,\n adapter: adapter,\n dashMetrics: dashMetrics,\n timelineConverter: timelineConverter,\n errHandler: errHandler,\n offlineStoreController: offlineStoreController,\n debug: debug,\n constants: constants,\n dashConstants: dashConstants,\n urlUtils: urlUtils\n });\n\n downloads.push(download);\n }\n\n return download;\n }\n\n function createDownloadFromStorage(offline) {\n let download = getDownloadFromId(offline.manifestId);\n\n if (!download) {\n download = createDownloadFromId(offline.manifestId);\n let status = offline.status;\n if (status === OfflineConstants.OFFLINE_STATUS_STARTED) {\n status = OfflineConstants.OFFLINE_STATUS_STOPPED;\n }\n\n download.setInitialState({\n url: offline.url,\n progress: offline.progress,\n originalUrl: offline.originalURL,\n status: status\n });\n }\n\n return download;\n }\n\n function removeDownloadFromId(id) {\n return new Promise(function (resolve, reject) {\n let download = getDownloadFromId(id);\n let waitForStatusChanged = false;\n if (download) {\n //is download running?\n if (download.isDownloading()) {\n //register status changed event\n waitForStatusChanged = true;\n const downloadStopped = function () {\n eventBus.off(events.OFFLINE_RECORD_STOPPED, downloadStopped, instance);\n return offlineStoreController.deleteDownloadById(id).then(function () {\n resolve();\n }).catch(function (err) {\n reject(err);\n });\n };\n eventBus.on(events.OFFLINE_RECORD_STOPPED, downloadStopped, instance);\n }\n download.deleteDownload();\n let index = downloads.indexOf(download);\n downloads.splice(index, 1);\n }\n\n if (!waitForStatusChanged) {\n resolve();\n }\n });\n }\n\n function generateManifestId() {\n let timestamp = new Date().getTime();\n return timestamp;\n }\n\n /*\n ---------------------------------------------------------------------------\n\n OFFLINE CONTROLLER API\n\n ---------------------------------------------------------------------------\n */\n\n /**\n * Loads records from storage\n * This methods has to be called first, to be sure that all downloads have been loaded\n *\n * @return {Promise} asynchronously resolved\n * @memberof module:OfflineController\n */\n function loadRecordsFromStorage() {\n return new Promise(function (resolve, reject) {\n offlineStoreController.getAllManifests().then((items) => {\n items.manifests.forEach((offline) => {\n createDownloadFromStorage(offline);\n });\n\n resolve();\n }).catch((e) => {\n logger.error('Failed to load downloads ' + e);\n reject(e);\n });\n });\n }\n\n /**\n * Get all records from storage\n *\n * @return {Promise} asynchronously resolved with records\n * @memberof module:OfflineController\n * @instance\n */\n function getAllRecords() {\n let records = [];\n downloads.forEach((download) => {\n const record = new OfflineRecord();\n record.id = download.getId();\n record.progress = download.getDownloadProgression();\n record.url = download.getOfflineUrl();\n record.originalUrl = download.getManifestUrl();\n record.status = download.getStatus();\n records.push(record);\n });\n return records;\n }\n\n /**\n * Create a new content record in storage and download manifest from url\n *\n * @param {string} manifestURL - the content manifest url\n * @return {Promise} asynchronously resolved with record identifier\n * @memberof module:OfflineController\n * @instance\n */\n function createRecord(manifestURL) {\n return new Promise(function (resolve, reject) {\n let id = generateManifestId();\n\n // create download controller\n let download = createDownloadFromId(id);\n\n download.downloadFromUrl(manifestURL).then(() => {\n download.initDownload();\n resolve(id);\n })\n .catch((e) => {\n logger.error('Failed to download ' + e);\n removeDownloadFromId(id).then(function () {\n reject(e);\n });\n });\n });\n }\n\n /**\n * Start downloading the record with selected tracks representations\n *\n * @param {string} id - record identifier\n * @param {MediaInfo[]} mediaInfos - the selected tracks representations\n * @memberof module:OfflineController\n * @instance\n */\n function startRecord(id, mediaInfos) {\n let download = getDownloadFromId(id);\n if (download) {\n download.startDownload(mediaInfos);\n }\n }\n\n /**\n * Stop downloading of the record\n *\n * @param {string} id - record identifier\n * @memberof module:OfflineController\n * @instance\n */\n function stopRecord(id) {\n let download = getDownloadFromId(id);\n if (download) {\n download.stopDownload();\n }\n }\n\n /**\n * Resume downloading of the record\n *\n * @param {string} id - record identifier\n * @memberof module:OfflineController\n * @instance\n */\n function resumeRecord(id) {\n let download = getDownloadFromId(id);\n if (download) {\n download.resumeDownload();\n }\n }\n\n /**\n * Deletes a record from storage\n *\n * @param {string} id - record identifier\n * @memberof module:OfflineController\n * @instance\n */\n function deleteRecord(id) {\n return removeDownloadFromId(id).then(function () {\n return offlineStoreController.deleteDownloadById(id);\n });\n }\n\n\n /**\n * Get download progression of a record\n *\n * @param {string} id - record identifier\n * @return {number} percentage progression\n * @memberof module:OfflineController\n * @instance\n */\n function getRecordProgression(id) {\n let download = getDownloadFromId(id);\n if (download) {\n return download.getDownloadProgression();\n }\n return 0;\n }\n\n /**\n * Reset all records\n * @memberof module:OfflineController\n * @instance\n */\n function resetRecords() {\n downloads.forEach((download) => {\n download.resetDownload();\n });\n }\n\n /**\n * Reset\n * @instance\n */\n function reset() {\n resetRecords();\n schemeLoaderFactory.unregisterLoader(OfflineConstants.OFFLINE_SCHEME);\n }\n\n instance = {\n loadRecordsFromStorage: loadRecordsFromStorage,\n createRecord: createRecord,\n startRecord: startRecord,\n stopRecord: stopRecord,\n resumeRecord: resumeRecord,\n deleteRecord: deleteRecord,\n getRecordProgression: getRecordProgression,\n getAllRecords: getAllRecords,\n resetRecords: resetRecords,\n reset: reset\n };\n\n setup();\n\n return instance;\n}\n\nOfflineController.__dashjs_factory_name = 'OfflineController';\nconst factory = dashjs.FactoryMaker.getClassFactory(OfflineController); /* jshint ignore:line */\nfactory.events = OfflineEvents;\nfactory.errors = OfflineErrors;\ndashjs.FactoryMaker.updateClassFactory(OfflineController.__dashjs_factory_name, factory); /* jshint ignore:line */\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport IndexDBStore from '../storage/IndexDBStore';\nimport OfflineErrors from '../errors/OfflineErrors';\n\n/**\n * @class OfflineStoreController\n * @description This class manages database store\n * @param {object} config\n * @ignore\n */\nfunction OfflineStoreController(config) {\n\n config = config || {};\n const context = this.context;\n const errHandler = config.errHandler;\n\n let instance,\n indexDBStore;\n\n function setup() {\n indexDBStore = IndexDBStore(context).getInstance();\n }\n\n function createFragmentStore(manifestId, storeName) {\n try {\n indexDBStore.createFragmentStore(manifestId, storeName);\n } catch (err) {\n manageDOMError(err);\n }\n }\n\n function storeFragment(manifestId, fragmentId, fragmentData) {\n return indexDBStore.storeFragment(manifestId, fragmentId, fragmentData).catch(function (err) {\n manageDOMError(err);\n });\n }\n\n function createOfflineManifest(manifest) {\n return indexDBStore.storeManifest(manifest).catch(function (err) {\n manageDOMError(err);\n });\n }\n\n function updateOfflineManifest(manifest) {\n return indexDBStore.updateManifest(manifest).catch(function (err) {\n manageDOMError(err);\n });\n }\n\n function getManifestById(manifestId) {\n return indexDBStore.getManifestById(manifestId).catch(function (err) {\n manageDOMError(err);\n });\n }\n\n function saveSelectedRepresentations (manifestId, selected) {\n return indexDBStore.saveSelectedRepresentations(manifestId, selected).catch(function (err) {\n manageDOMError(err);\n });\n }\n\n function getCurrentHigherManifestId() {\n return indexDBStore.getCurrentHigherManifestId().catch(function (err) {\n manageDOMError(err);\n });\n }\n\n function getAllManifests() {\n return indexDBStore.getAllManifests().catch(function (err) {\n manageDOMError(err);\n });\n }\n\n function deleteDownloadById(manifestId) {\n return indexDBStore.deleteDownloadById(manifestId).catch(function (err) {\n manageDOMError(err);\n });\n }\n\n function setDownloadingStatus(manifestId, status) {\n return indexDBStore.setDownloadingStatus(manifestId, status).catch(function (err) {\n manageDOMError(err);\n });\n }\n\n function setRepresentationCurrentState(manifestId, representationId, state) {\n return indexDBStore.setRepresentationCurrentState(manifestId, representationId, state).catch(function (err) {\n manageDOMError(err);\n });\n }\n\n function getRepresentationCurrentState(manifestId, representationId) {\n return indexDBStore.getRepresentationCurrentState(manifestId, representationId).catch(function (err) {\n manageDOMError(err);\n });\n }\n\n function manageDOMError(err) {\n let error;\n if (err) {\n switch (err.name) {\n case 'QuotaExceededError':\n error = OfflineErrors.INDEXEDDB_QUOTA_EXCEED_ERROR;\n break;\n case 'InvalidStateError':\n error = OfflineErrors.INDEXEDDB_INVALID_STATE_ERROR;\n break;\n case 'NotFoundError':\n error = OfflineErrors.INDEXEDDB_NOT_FOUND_ERROR;\n break;\n case 'VersionError':\n error = OfflineErrors.INDEXEDDB_VERSION_ERROR;\n break;\n // TODO : Manage all DOM cases\n }\n\n // avoid importing DashJSError object from streaming\n errHandler.error({code: error, message: err.name, data: err});\n }\n }\n\n instance = {\n storeFragment: storeFragment,\n createOfflineManifest: createOfflineManifest,\n updateOfflineManifest: updateOfflineManifest,\n getManifestById: getManifestById,\n saveSelectedRepresentations: saveSelectedRepresentations,\n createFragmentStore: createFragmentStore,\n getCurrentHigherManifestId: getCurrentHigherManifestId,\n getAllManifests: getAllManifests,\n deleteDownloadById: deleteDownloadById,\n setDownloadingStatus: setDownloadingStatus,\n setRepresentationCurrentState: setRepresentationCurrentState,\n getRepresentationCurrentState: getRepresentationCurrentState\n };\n\n setup();\n\n return instance;\n}\n\nOfflineStoreController.__dashjs_factory_name = 'OfflineStoreController';\nexport default dashjs.FactoryMaker.getClassFactory(OfflineStoreController); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport ErrorsBase from '../../core/errors/ErrorsBase';\n/**\n * Offline Errors declaration\n * @class\n */\nclass OfflineErrors extends ErrorsBase {\n constructor () {\n\n super();\n\n /**\n * Error code returned when an error occurs in offline module\n */\n this.OFFLINE_ERROR = 11000;\n\n // Based upon https://developer.mozilla.org/fr/docs/Web/API/DOMException\n this.INDEXEDDB_QUOTA_EXCEED_ERROR = 11001;\n this.INDEXEDDB_INVALID_STATE_ERROR = 11002;\n this.INDEXEDDB_NOT_READABLE_ERROR = 11003;\n this.INDEXEDDB_NOT_FOUND_ERROR = 11004;\n this.INDEXEDDB_NETWORK_ERROR = 11005;\n this.INDEXEDDB_DATA_ERROR = 11006;\n this.INDEXEDDB_TRANSACTION_INACTIVE_ERROR = 11007;\n this.INDEXEDDB_NOT_ALLOWED_ERROR = 11008;\n this.INDEXEDDB_NOT_SUPPORTED_ERROR = 11009;\n this.INDEXEDDB_VERSION_ERROR = 11010;\n this.INDEXEDDB_TIMEOUT_ERROR = 11011;\n this.INDEXEDDB_ABORT_ERROR = 11012;\n this.INDEXEDDB_UNKNOWN_ERROR = 11013;\n }\n}\n\nlet offlineErrors = new OfflineErrors();\nexport default offlineErrors;\n","import EventsBase from './../../core/events/EventsBase';\n/**\n * These are offline events that should be sent to the player level.\n * @class\n */\nclass OfflineEvents extends EventsBase {\n constructor () {\n super();\n\n /**\n * Triggered when all mediaInfo has been loaded\n * @event OfflineEvents#OFFLINE_RECORD_LOADEDMETADATA\n */\n this.OFFLINE_RECORD_LOADEDMETADATA = 'public_offlineRecordLoadedmetadata';\n\n /**\n * Triggered when a record is initialized and download is started\n * @event OfflineEvents#OFFLINE_RECORD_STARTED\n */\n this.OFFLINE_RECORD_STARTED = 'public_offlineRecordStarted';\n\n /**\n * Triggered when the user stop downloading a record\n * @event OfflineEvents#OFFLINE_RECORD_STOPPED\n */\n this.OFFLINE_RECORD_STOPPED = 'public_offlineRecordStopped';\n\n /**\n * Triggered when all record has been downloaded\n * @event OfflineEvents#OFFLINE_RECORD_FINISHED\n */\n this.OFFLINE_RECORD_FINISHED = 'public_offlineRecordFinished';\n }\n}\n\nlet offlineEvents = new OfflineEvents();\nexport default offlineEvents;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport OfflineController from './controllers/OfflineController';\n\n// Shove both of these into the global scope\nvar context = (typeof window !== 'undefined' && window) || global;\n\nvar dashjs = context.dashjs;\nif (!dashjs) {\n dashjs = context.dashjs = {};\n}\n\ndashjs.OfflineController = OfflineController;\n\nexport default dashjs;\nexport { OfflineController };\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport IndexDBStore from '../storage/IndexDBStore';\n\nfunction IndexDBOfflineLoader(config) {\n config = config || {};\n const context = this.context;\n const urlUtils = config.urlUtils;\n const constants = config.constants;\n const dashConstants = config.dashConstants;\n\n let instance,\n indexDBStore;\n\n function setup() {\n indexDBStore = IndexDBStore(context).getInstance();\n }\n\n function getManifestId (url) {\n let myURL = urlUtils.removeHostname(url);\n var parts = myURL.split('/');\n return parts[0];\n }\n /**\n * Load manifest or fragment from indexeddb database\n * @param {object} config configuration of request\n */\n function load(config) {\n if (config.request) {\n let manifestId = getManifestId(config.request.url);\n if (manifestId % 1 === 0) {\n if (\n config.request.mediaType === constants.AUDIO ||\n config.request.mediaType === constants.VIDEO ||\n config.request.mediaType === constants.TEXT ||\n config.request.mediaType === constants.MUXED ||\n config.request.mediaType === constants.IMAGE ||\n config.request.mediaType === constants.FRAGMENTED_TEXT ||\n config.request.mediaType === constants.EMBEDDED_TEXT\n ) {\n let suffix = config.request.type === 'InitializationSegment' ? 'init' : config.request.index;\n let key = config.request.representationId + '_' + suffix;\n indexDBStore.getFragmentByKey(manifestId, key).then(function (fragment) {\n config.success(fragment, null, config.request.url, constants.ARRAY_BUFFER);\n }).catch(function (err) {\n config.error(err);\n });\n } else if (config.request.type === dashConstants.MPD) {\n indexDBStore.getManifestById(manifestId).then(function (item) {\n indexDBStore.createFragmentStore(item.fragmentStore);\n config.success(item.manifest, null, config.request.url, constants.XML);\n }).catch(function (err) {\n config.error(config.request, 404, err);\n });\n }\n } else {\n config.error(config.request, null, 'MediaType can not be found');\n }\n }\n }\n\n function abort() {\n // nothing to do\n }\n\n setup();\n\n instance = {\n load: load,\n abort: abort\n };\n\n return instance;\n}\n\nIndexDBOfflineLoader.__dashjs_factory_name = 'IndexDBOfflineLoader';\nconst factory = dashjs.FactoryMaker.getClassFactory(IndexDBOfflineLoader); /* jshint ignore:line */\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nconst localforage = require('localforage');\nconst entities = require('html-entities').XmlEntities;\n\n/**\n * @ignore\n */\nfunction IndexDBStore() {\n\n let instance,\n manifestStore,\n fragmentStores;\n\n function setup() {\n fragmentStores = {};\n\n if (typeof window === 'undefined') {\n return;\n }\n\n localforage.config({\n driver: localforage.INDEXEDDB,\n name: 'dash_offline_db'\n });\n\n manifestStore = localforage.createInstance({\n driver: localforage.INDEXEDDB,\n name: 'dash_offline_db',\n version: 1.0,\n storeName: 'manifest'\n });\n }\n\n /////////////////////////////////////////\n //\n // GET/SET Methods\n //\n ////////////////////////////////////////\n\n /**\n * Creates an instance of localforage to store fragments in indexed db\n * @param {string} storeName\n * @instance\n */\n function createFragmentStore(storeName) {\n\n if (!fragmentStores[storeName]) {\n console.log('setStore ' + storeName);\n let fragmentStore = localforage.createInstance({\n driver: localforage.INDEXEDDB,\n name: 'dash_offline_db',\n version: 1.0,\n storeName: storeName\n });\n fragmentStores[storeName] = fragmentStore;\n }\n }\n\n /**\n * Update download status\n * @param {number} manifestId\n * @param {string} newStatus\n * @returns {Promise} promise\n * @instance\n */\n function setDownloadingStatus(manifestId, newStatus) {\n return getManifestById(manifestId).then(function (item) {\n item.status = newStatus;\n return updateManifest(item).catch(function () {\n return Promise.reject('Cannot set status ' + newStatus + ' for this stream !');\n });\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n\n /**\n * Updat last downloaded fragment index for representationId\n * @param {number} manifestId - manifest id\n * @param {string} representationId - representation\n * @param {number} state - representation state\n * @returns {Promise} promise\n * @instance\n */\n function setRepresentationCurrentState(manifestId, representationId, state) {\n return getManifestById(manifestId).then(function (item) {\n if (!item.state) {\n item.state = {};\n }\n\n if (!item.state[representationId]) {\n item.state[representationId] = {\n index: -1,\n downloaded: 0\n };\n }\n\n item.state[representationId] = state;\n return updateManifest(item).catch(function () {\n return Promise.reject('Cannot set current index for represenation id ' + representationId);\n });\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n\n /**\n * Returns current downloaded segment index for representation\n * @param {number} manifestId - manifest id\n * @param {string} representationId - representation\n * @returns {Promise} promise\n * @instance\n */\n function getRepresentationCurrentState(manifestId, representationId) {\n return getManifestById(manifestId).then(function (item) {\n let state = {\n index: -1,\n downloaded: 0\n };\n if (item.state && item.state[representationId]) {\n state = item.state[representationId];\n }\n return Promise.resolve(state);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n\n /**\n * Returns a fragment from its key\n * @param {number} manifestId\n * @param {number} key\n * @returns {Promise} fragment\n * @instance\n */\n function getFragmentByKey(manifestId, key) {\n let fragmentStore = fragmentStores[manifestId];\n\n if (!fragmentStore) {\n return Promise.reject(new Error (`No fragment store found for manifest ${manifestId}`));\n }\n\n return fragmentStore.getItem(key).then(function (value) {\n return Promise.resolve(value);\n }).catch(function (err) {\n return Promise.reject(err);\n });\n\n }\n\n /**\n * Returns a manifest from its identifier\n * @param {number} id\n * @returns {Promise} {Object[]} manifests\n * @instance\n */\n function getManifestById(id) {\n return getAllManifests().then(function (array) {\n if (array) {\n let item = null;\n for (let i = 0; i < array.manifests.length; i++) {\n if (array.manifests[i].manifestId === parseInt(id)) {\n item = array.manifests[i];\n }\n }\n if (item !== null) {\n item.manifest = entities.decode(item.manifest);\n return Promise.resolve(item);\n } else {\n return Promise.reject('Cannot found manifest with this manifestId : ' + id);\n }\n } else {\n return Promise.reject('Any manifests stored in DB !');\n }\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n\n /**\n * Returns all offline manifests\n * @returns {Promise} {Object[]} manifests\n * @instance\n */\n function getAllManifests() {\n return manifestStore.getItem('manifest').then(function (array) {\n return Promise.resolve(array ? array : {\n 'manifests': []\n });\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n\n /**\n * Return higher manifest id\n * @returns {Promise} number\n * @instance\n */\n function getCurrentHigherManifestId() {\n return getAllManifests().then(function (array) {\n let higherManifestId = 0;\n if (array) {\n for (let i = 0; i < array.manifests.length; i++) {\n if (array.manifests[i].manifestId > higherManifestId) {\n higherManifestId = array.manifests[i].manifestId;\n }\n }\n return Promise.resolve(higherManifestId);\n } else {\n return Promise.resolve(higherManifestId);\n }\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n\n /**\n * Update manifest\n * @param {Object} manifest updated manifest\n * @returns {Promise} promise asynchronously resolved\n * @instance\n */\n function updateManifest(manifest) {\n return getAllManifests().then(function (array) {\n try {\n for (let i = 0; i < array.manifests.length; i++) {\n if (array.manifests[i].manifestId === manifest.manifestId) {\n array.manifests[i] = manifest;\n }\n }\n return manifestStore.setItem('manifest', array);\n } catch (err) {\n throw new Error('Any results found !');\n }\n });\n }\n\n /**\n * save selected representation by user\n * @param {Object} manifest updated manifest\n * @param {Object} selected selected representations\n * @returns {Promise} promise asynchronously resolved\n * @instance\n */\n function saveSelectedRepresentations(manifest, selected) {\n return getManifestById(manifest).then(function (item) {\n if (!item.selected) {\n item.selected = {};\n }\n\n item.selected = selected;\n return updateManifest(item).catch(function () {\n return Promise.reject('Cannot save selected representations');\n });\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n\n /**\n * Store a manifest in manifest array\n * @param {Object} manifest\n * @instance\n */\n function storeManifest(manifest) {\n return manifestStore.getItem('manifest').then(function (results) {\n let array = results ? results : {\n 'manifests': []\n };\n array.manifests.push(manifest);\n return manifestStore.setItem('manifest', array);\n });\n }\n\n /**\n * Store a fragment in fragment store\n * @param {number} manifestId\n * @param {number} fragmentId\n * @param {Object} fragmentData\n * @returns {Promise} promise asynchronously resolved\n * @instance\n */\n function storeFragment(manifestId, fragmentId, fragmentData) {\n let fragmentStore = fragmentStores[manifestId];\n\n if (!fragmentStore) {\n return Promise.reject(new Error (`No fragment store found for manifest ${manifestId}`));\n }\n\n return fragmentStore.setItem(fragmentId, fragmentData, function () {\n return Promise.resolve();\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n\n /////////////////////////////////////////\n //\n // DROP Methods\n //\n ////////////////////////////////////////\n\n /**\n * Remove all manifest and fragment store\n * @returns {Promise} promise asynchronously resolved\n * @instance\n */\n function dropAll() {\n return localforage.clear().then(function () {\n return Promise.resolve();\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n\n /**\n * Remove framgent store given its name\n * @param {string} storeName\n * @instance\n */\n function dropFragmentStore(storeName) {\n localforage.dropInstance({\n driver: localforage.INDEXEDDB,\n name: 'dash_offline_db',\n version: 1.0,\n storeName: storeName\n }).then(function () {\n delete fragmentStores[storeName];\n }).catch(function (err) {\n console.log('dropFragmentStore failed ' + err);\n });\n return;\n }\n\n /**\n * Remove download given its id (fragmentStore + manifest entry in manifest array)\n * @param {number} manifestId\n * @returns {Promise} promise asynchronously resolved\n * @instance\n */\n function deleteDownloadById(manifestId) {\n return manifestStore.getItem('manifest').then(function (array) {\n if (array) {\n return deleteFragmentStore(manifestId).then(function () {\n for (let i = 0; i < array.manifests.length; i++) {\n if (array.manifests[i].manifestId === parseInt(manifestId)) {\n array.manifests.splice(i, 1);\n }\n }\n return manifestStore.setItem('manifest', array).then(function () {\n return Promise.resolve('This stream has been successfull removed !');\n }).catch(function () {\n return Promise.reject('An error occured when trying to delete this manifest');\n });\n });\n } else {\n return Promise.resolve('Nothing to delete !');\n }\n }).catch(function (err) {\n return Promise.reject(err);\n });\n }\n\n /**\n * Remove fragment store\n * @param {string} storeName\n * @returns {Promise} promise asynchronously resolved\n * @instance\n */\n function deleteFragmentStore(storeName) {\n localforage.createInstance({\n name: 'dash_offline_db',\n storeName: storeName\n });\n return localforage.dropInstance({\n name: 'dash_offline_db',\n storeName: storeName\n }).then(function () {\n delete fragmentStores[storeName];\n return Promise.resolve();\n }).catch(function (err) {\n console.log(err);\n return Promise.reject(err);\n });\n\n }\n\n\n setup();\n\n instance = {\n dropAll: dropAll,\n getFragmentByKey: getFragmentByKey,\n getManifestById: getManifestById,\n storeFragment: storeFragment,\n storeManifest: storeManifest,\n updateManifest: updateManifest,\n saveSelectedRepresentations: saveSelectedRepresentations,\n createFragmentStore: createFragmentStore,\n setDownloadingStatus: setDownloadingStatus,\n setRepresentationCurrentState: setRepresentationCurrentState,\n getRepresentationCurrentState: getRepresentationCurrentState,\n getCurrentHigherManifestId: getCurrentHigherManifestId,\n getAllManifests: getAllManifests,\n dropFragmentStore: dropFragmentStore,\n deleteDownloadById: deleteDownloadById\n };\n\n return instance;\n}\n\nIndexDBStore.__dashjs_factory_name = 'IndexDBStore';\nexport default dashjs.FactoryMaker.getSingletonFactory(IndexDBStore); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nconst Entities = require('html-entities').XmlEntities;\nconst OFFLINE_BASE_URL = 'offline_indexeddb://';\n\nfunction OfflineIndexDBManifestParser(config) {\n\n const manifestId = config.manifestId;\n const allMediaInfos = config.allMediaInfos;\n const urlUtils = config.urlUtils;\n const debug = config.debug;\n const dashConstants = config.dashConstants;\n const constants = config.constants;\n\n let instance,\n DOM,\n logger;\n\n\n function setup() {\n logger = debug.getLogger(instance);\n }\n\n /**\n * Parse XML manifest\n * @param {string} XMLDoc - xml manifest\n * @param {object} representation\n * @returns {Promise} a promise that will be resolved or rejected at the end of encoding process\n * @instance\n */\n function parse(XMLDoc, representation) {\n return new Promise(function (resolve, reject) {\n\n DOM = new DOMParser().parseFromString(XMLDoc, 'application/xml');\n let mpd = DOM.getElementsByTagName(dashConstants.MPD) ? DOM.getElementsByTagName(dashConstants.MPD) : null;\n\n for (let i = 0; i < mpd.length; i++) {\n if (mpd[i] !== null) {\n editBaseURLAttribute(mpd[i]);\n browsePeriods(mpd[i], representation);\n }\n }\n\n let manifestEncoded = encodeManifest(DOM);\n if (manifestEncoded !== '') {\n resolve(manifestEncoded);\n } else {\n reject('Encoded error');\n }\n });\n }\n\n /**\n * URL encode parsed manifest\n * @param {string} DOM\n * @returns {string} Url encoded XML\n * @instance\n */\n function encodeManifest(DOM) {\n logger.info('encodedManifest ' + new XMLSerializer().serializeToString(DOM));\n return new Entities().encode(new XMLSerializer().serializeToString(DOM));\n }\n\n /**\n * Update baseURL to point to local stored data P\n * @param {XML} currentMPD\n * @instance\n */\n function editBaseURLAttribute(currentMPD) {\n let basesURL,\n fragmentId,\n representationId;\n\n let url = `${OFFLINE_BASE_URL}${manifestId}/`;\n\n basesURL = currentMPD.getElementsByTagName(dashConstants.BASE_URL);\n\n if (basesURL.length === 0) {\n // add baseURL\n let element = DOM.createElement(dashConstants.BASE_URL);\n element.innerHTML = url;\n currentMPD.appendChild(element);\n }\n basesURL = currentMPD.getElementsByTagName(dashConstants.BASE_URL);\n for (let i = 0; i < basesURL.length; i++) {\n let parent = basesURL[i].parentNode;\n\n if (parent.nodeName === dashConstants.MPD) {\n basesURL[i].innerHTML = url;\n } else if (parent.nodeName === dashConstants.REPRESENTATION) {\n let adaptationsSet = parent.parentNode;\n if (adaptationsSet.nodeName == dashConstants.ADAPTATION_SET) {\n\n if (urlUtils.isHTTPS(basesURL[i].innerHTML) || urlUtils.isHTTPURL(basesURL[i].innerHTML)) {\n fragmentId = getFragmentId(basesURL[i].innerHTML);\n representationId = getBestRepresentationId(adaptationsSet);\n basesURL[i].innerHTML = url + representationId + '_' + fragmentId;\n } else if (basesURL[i].innerHTML === './') {\n basesURL[i].innerHTML = url;\n } else {\n fragmentId = getFragmentId(basesURL[i].innerHTML);\n representationId = getBestRepresentationId(adaptationsSet);\n basesURL[i].innerHTML = representationId + '_' + fragmentId;\n }\n }\n } else {\n basesURL[i].innerHTML = url;\n }\n }\n }\n\n /**\n * Browse periods\n * @param {XML} currentMPD\n * @param {Object} representation\n * @instance\n */\n function browsePeriods(currentMPD, representation) {\n let periods = currentMPD.getElementsByTagName(dashConstants.PERIOD);\n for (let j = 0; j < periods.length; j++) {\n browseAdaptationsSet(periods[j], representation);\n }\n }\n\n /**\n * Browse adapatation set to update data (delete those taht are not choosen by user ...)\n * @param {XML} currentPeriod\n * @param {Array} representationsToUpdate\n * @instance\n */\n function browseAdaptationsSet(currentPeriod, representationsToUpdate) {\n let adaptationsSet,\n currentAdaptationSet,\n currentAdaptationType,\n representations;\n\n adaptationsSet = currentPeriod.getElementsByTagName(dashConstants.ADAPTATION_SET);\n\n for (let i = adaptationsSet.length - 1; i >= 0; i--) {\n currentAdaptationSet = adaptationsSet[i];\n if (currentAdaptationSet) {\n currentAdaptationType = findAdaptationType(currentAdaptationSet);\n representations = findRepresentations(currentAdaptationSet);\n\n findAndKeepOnlySelectedRepresentations(currentAdaptationSet, representations, currentAdaptationType);\n\n representations = findRepresentations(currentAdaptationSet);\n\n deleteSegmentBase(currentAdaptationSet);\n\n if (representations.length === 0) {\n currentPeriod.removeChild(currentAdaptationSet);\n } else {\n //detect Segment list use case\n for (let i = 0; i < representations.length; i++) {\n let rep = representations[i];\n let segmentList = getSegmentList(rep);\n if (segmentList.length >= 1) {\n editSegmentListAttributes(segmentList, rep);\n }\n }\n\n let segmentTemplate = getSegmentTemplate(currentAdaptationSet);\n // segmentTemplate is defined, update attributes in order to be correctly played offline\n if (segmentTemplate.length >= 1) {\n editSegmentTemplateAttributes(segmentTemplate);\n }\n\n // detect SegmentBase use case => transfrom manifest to SegmentList in SegmentTemplate\n if (representationsToUpdate && representationsToUpdate.length > 0 ) {\n let selectedRep;\n for (let i = 0; i < representations.length; i++) {\n let rep = representations[i];\n for (let j = 0; representationsToUpdate && j < representationsToUpdate.length; j++) {\n if (representationsToUpdate[j].id === rep.id) {\n selectedRep = representationsToUpdate[j];\n break;\n }\n }\n }\n addSegmentTemplateAttributes(currentAdaptationSet, selectedRep);\n }\n }\n }\n }\n }\n\n /**\n * Returns type of adapation set\n * @param {XML} currentAdaptationSet\n * @returns {string|null} type\n * @instance\n */\n function findAdaptationType(currentAdaptationSet) {\n if (getIsMuxed(currentAdaptationSet)) {\n return constants.MUXED;\n } else if (getIsAudio(currentAdaptationSet)) {\n return constants.AUDIO;\n } else if (getIsVideo(currentAdaptationSet)) {\n return constants.VIDEO;\n } else if (getIsFragmentedText(currentAdaptationSet)) {\n return constants.FRAGMENTED_TEXT;\n } else if (getIsImage(currentAdaptationSet)) {\n return constants.IMAGE;\n }\n\n return constants.TEXT;\n }\n\n function getIsAudio(adaptation) {\n return getIsTypeOf(adaptation, constants.AUDIO);\n }\n\n function getIsVideo(adaptation) {\n return getIsTypeOf(adaptation, constants.VIDEO);\n }\n\n function getIsFragmentedText(adaptation) {\n return getIsTypeOf(adaptation, constants.FRAGMENTED_TEXT);\n }\n\n function getIsMuxed(adaptation) {\n return getIsTypeOf(adaptation, constants.MUXED);\n }\n\n function getIsImage(adaptation) {\n return getIsTypeOf(adaptation, constants.IMAGE);\n }\n\n // based upon DashManifestModel, but using DomParser\n function getIsTypeOf(adaptation, type) {\n\n if (!adaptation) {\n throw new Error('adaptation is not defined');\n }\n\n if (!type) {\n throw new Error('type is not defined');\n }\n\n // 1. check codecs for fragmented text\n if (isFragmentedTextCodecFound(adaptation)) {\n // fragmented text codec has been found for adaptation, let's check if tested type is fragmented text\n return type === constants.FRAGMENTED_TEXT;\n }\n\n // 2. test mime type\n return testMimeType(adaptation, type);\n }\n\n function testMimeType(adaptation, type) {\n let mimeTypeRegEx = (type !== constants.TEXT) ? new RegExp(type) : new RegExp('(vtt|ttml)');\n\n let mimeType = findMimeType(adaptation);\n if (mimeType) {\n return mimeTypeRegEx.test(mimeType);\n }\n\n // no mime type in adaptation, search in representation\n let representations = findRepresentations(adaptation);\n if (representations) {\n for (let i = 0; i < representations.length; i++) {\n let representation = representations[i];\n mimeType = findMimeType(representation);\n if (mimeType) {\n return mimeTypeRegEx.test(mimeType);\n }\n }\n }\n return false;\n }\n\n /**\n * Search for fragmented text codec in adaptation (STPP or WVTT)\n * @param {Object} adaptation\n */\n function isFragmentedTextCodecFound (adaptation) {\n let isFragmentedTextCodecFoundInTag = function (tag) {\n let codecs = tag.getAttribute(dashConstants.CODECS);\n if (codecs) {\n if (codecs.search(constants.STPP) === 0 ||\n codecs.search(constants.WVTT) === 0 ) {\n return true;\n }\n }\n return false;\n };\n\n if (isFragmentedTextCodecFoundInTag(adaptation)) {\n return true;\n }\n\n // check in representations\n let representations = findRepresentations(adaptation);\n if (representations && representations.length > 0) {\n\n if (isFragmentedTextCodecFoundInTag(representations[0])) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns mime-type of xml tag\n * @param {Object} tag\n * @returns {string|null} mimeType\n * @instance\n */\n function findMimeType(tag) {\n return tag.getAttribute(dashConstants.MIME_TYPE);\n }\n\n /**\n * Returns representations of adaptation set\n * @param {XML} adaptation\n * @returns {XML} representations\n * @instance\n */\n function findRepresentations(adaptation) {\n return adaptation.getElementsByTagName(dashConstants.REPRESENTATION);\n }\n\n /**\n * Return segment template list of adaptations set\n * @param {XML} currentAdaptationSet\n * @returns {XML} representations\n * @instance\n */\n function getSegmentTemplate(currentAdaptationSet) {\n return currentAdaptationSet.getElementsByTagName(dashConstants.SEGMENT_TEMPLATE);\n }\n\n /**\n * Return segment list tags of adaptations set\n * @param {XML} tag\n * @returns {XML} representations\n * @instance\n */\n function getSegmentList(tag) {\n return tag.getElementsByTagName(dashConstants.SEGMENT_LIST);\n }\n\n function deleteSegmentBase(tag) {\n let elements = tag.getElementsByTagName(dashConstants.SEGMENT_BASE);\n for (let i = 0; i < elements.length; i++) {\n let segmentBase = elements[i];\n segmentBase.parentNode.removeChild(segmentBase);\n }\n }\n\n /**\n * @param {XML} segmentTemplate\n * @param {object} rep\n * @instance\n */\n function addSegmentTimelineElements(segmentTemplate, rep) {\n let S = DOM.createElement('S');\n if (rep && rep.segments) {\n let segmentTimelineElement = DOM.createElement(dashConstants.SEGMENT_TIMELINE);\n let changedDuration = getDurationChangeArray(rep);\n for (let i = 0; i < changedDuration.length; i++) {\n let repeatValue = i + 1 < changedDuration.length ? (changedDuration[i + 1] - changedDuration[i]) - 1 : 0;\n if (repeatValue > 1) {\n S.setAttribute('r', repeatValue);\n }\n S.setAttribute('d', rep.segments[changedDuration[i]].duration);\n segmentTimelineElement.appendChild(S);\n S = DOM.createElement('S');\n }\n segmentTemplate.appendChild(segmentTimelineElement);\n }\n }\n\n function getDurationChangeArray(rep) {\n let array = [];\n array.push(0);\n for (let i = 1; i < rep.segments.length; i++) {\n if (rep.segments[i - 1].duration !== rep.segments[i].duration) {\n array.push(i);\n }\n }\n return array;\n }\n\n /**\n * Update attributes of segment templates to match offline urls\n * @param {Array} segmentsTemplates\n * @instance\n */\n function editSegmentTemplateAttributes(segmentsTemplates) {\n for (let i = 0; i < segmentsTemplates.length; i++) {\n let media = segmentsTemplates[i].getAttribute(dashConstants.MEDIA);\n media = '$RepresentationID$_$Number$' + media.substring(media.indexOf('.'), media.length); //id + extension\n segmentsTemplates[i].setAttribute(dashConstants.START_NUMBER, '0');\n segmentsTemplates[i].setAttribute(dashConstants.MEDIA, media);\n segmentsTemplates[i].setAttribute(dashConstants.INITIALIZATION_MINUS,'$RepresentationID$_init');\n }\n }\n\n /**\n * Update attributes of segment list to match offline urls\n * @param {Array} segmentLists\n * @param {Object} representation\n * @instance\n */\n function editSegmentListAttributes(segmentLists, representation) {\n let repId = representation.getAttribute(dashConstants.ID);\n for (let i = 0; i < segmentLists.length; i++) {\n\n let segmentList = segmentLists[i];\n let initialisation = segmentList.getElementsByTagName(dashConstants.INITIALIZATION);\n if (initialisation) {\n let sourceURL = initialisation[0].getAttribute(dashConstants.SOURCE_URL);\n sourceURL = `${repId}_init`;\n initialisation[0].setAttribute(dashConstants.SOURCE_URL, sourceURL);\n }\n let segmentURLs = segmentList.getElementsByTagName(dashConstants.SEGMENT_URL);\n\n if (segmentURLs) {\n for (let j = 0; j < segmentURLs.length; j++) {\n let segmentUrl = segmentURLs[j];\n let media = segmentUrl.getAttribute(dashConstants.MEDIA);\n media = `${repId}_${j}`;\n segmentUrl.setAttribute(dashConstants.MEDIA, media);\n }\n }\n }\n }\n\n /**\n * @param {XML} adaptationSet\n * @param {object} rep\n * @instance\n */\n function addSegmentTemplateAttributes(adaptationSet, rep) {\n let segmentTemplateElement = DOM.createElement(dashConstants.SEGMENT_TEMPLATE);\n segmentTemplateElement.setAttribute(dashConstants.START_NUMBER, '0');\n segmentTemplateElement.setAttribute(dashConstants.MEDIA, '$RepresentationID$-$Time$');\n segmentTemplateElement.setAttribute(dashConstants.INITIALIZATION_MINUS,'$RepresentationID$_init');\n addSegmentTimelineElements(segmentTemplateElement, rep);\n adaptationSet.appendChild(segmentTemplateElement);\n }\n\n /**\n * Delete all representations except the one choosed by user\n * @param {XML} currentAdaptationSet\n * @param {XML} representations\n * @param {string} adaptationType\n * @instance\n */\n function findAndKeepOnlySelectedRepresentations(currentAdaptationSet, representations, adaptationType) {\n for ( var i = representations.length - 1; i >= 0; i--) {\n let representation = representations[i];\n let repId = representation.getAttribute(dashConstants.ID);\n if (allMediaInfos[adaptationType] && allMediaInfos[adaptationType].indexOf(repId) === -1) {\n // representation is not selected, remove it\n currentAdaptationSet.removeChild(representation);\n }\n }\n }\n\n // UTILS\n /**\n * Get id of first representation of adaptation set\n * @param {XMl} currentAdaptationSet\n * @returns {string} id\n * @instance\n */\n function getBestRepresentationId(currentAdaptationSet) {\n let bestRepresentation = currentAdaptationSet.getElementsByTagName(dashConstants.REPRESENTATION)[0];\n console.log(bestRepresentation.getAttribute(dashConstants.ID));\n return bestRepresentation.getAttribute(dashConstants.ID);\n }\n\n /**\n * Parse and returns fragments of offline url => xxxx://xxxx/fragmentId/\n * @param {string} url\n * @returns {string} fragmentId\n * @instance\n */\n function getFragmentId(url) {\n let idxFragId = url.lastIndexOf('/');\n //logger.warn('fragId : ' + url.substring(idxFragId + 1, url.length));\n return url.substring(idxFragId,url.length);\n }\n\n setup();\n\n instance = {\n parse: parse\n };\n\n return instance;\n}\nOfflineIndexDBManifestParser.__dashjs_factory_name = 'OfflineIndexDBManifestParser';\nexport default dashjs.FactoryMaker.getClassFactory(OfflineIndexDBManifestParser); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport OfflineConstants from '../constants/OfflineConstants';\n\nfunction OfflineUrlUtils() {\n\n function setup() {\n }\n\n function getRegex() {\n return OfflineConstants.OFFLINE_URL_REGEX;\n }\n\n /*\n * -------------------\n * SPECIFIC BEHAVIOUR\n * -------------------\n */\n function removeHostname(url) {\n return url.replace(/(^\\w+:|^)\\/\\//, '');\n }\n\n function isRelative() {\n return false;\n }\n\n function resolve(url, baseUrl) {\n if (baseUrl.charAt(baseUrl.length - 1 ) !== '/') {\n baseUrl = baseUrl.concat('/');\n }\n return baseUrl + url;\n }\n\n setup();\n const instance = {\n getRegex: getRegex,\n isRelative: isRelative,\n removeHostname: removeHostname,\n resolve: resolve\n };\n return instance;\n}\n\nOfflineUrlUtils.__dashjs_factory_name = 'OfflineUrlUtils';\nexport default dashjs.FactoryMaker.getSingletonFactory(OfflineUrlUtils); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass OfflineDownload {\n constructor() {\n this.id = null;\n this.url = null;\n this.originalUrl = null;\n this.status = null;\n this.progress = null;\n }\n}\n\nexport default OfflineDownload;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from './constants/Constants';\nimport URLLoader from './net/URLLoader';\nimport HeadRequest from './vo/HeadRequest';\nimport DashJSError from './vo/DashJSError';\nimport FactoryMaker from '../core/FactoryMaker';\n\nfunction FragmentLoader(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = config.eventBus;\n const events = config.events;\n const urlUtils = config.urlUtils;\n const errors = config.errors;\n\n let instance,\n urlLoader;\n\n function setup() {\n urlLoader = URLLoader(context).create({\n errHandler: config.errHandler,\n errors: errors,\n dashMetrics: config.dashMetrics,\n mediaPlayerModel: config.mediaPlayerModel,\n requestModifier: config.requestModifier,\n useFetch: config.settings.get().streaming.lowLatencyEnabled,\n urlUtils: urlUtils,\n constants: Constants,\n boxParser: config.boxParser,\n dashConstants: config.dashConstants\n });\n }\n\n function checkForExistence(request) {\n const report = function (success) {\n eventBus.trigger(\n events.CHECK_FOR_EXISTENCE_COMPLETED, {\n request: request,\n exists: success\n }\n );\n };\n\n if (request) {\n let headRequest = new HeadRequest(request.url);\n urlLoader.load({\n request: headRequest,\n success: function () {\n report(true);\n },\n error: function () {\n report(false);\n }\n });\n } else {\n report(false);\n }\n }\n\n function load(request) {\n const report = function (data, error) {\n eventBus.trigger(events.LOADING_COMPLETED, {\n request: request,\n response: data || null,\n error: error || null,\n sender: instance\n });\n };\n\n if (request) {\n urlLoader.load({\n request: request,\n progress: function (event) {\n eventBus.trigger(events.LOADING_PROGRESS, {\n request: request,\n stream: event.stream\n });\n if (event.data) {\n eventBus.trigger(events.LOADING_DATA_PROGRESS, {\n request: request,\n response: event.data || null,\n error: null,\n sender: instance\n });\n }\n },\n success: function (data) {\n report(data);\n },\n error: function (request, statusText, errorText) {\n report(\n undefined,\n new DashJSError(\n errors.FRAGMENT_LOADER_LOADING_FAILURE_ERROR_CODE,\n errorText,\n statusText\n )\n );\n },\n abort: function (request) {\n if (request) {\n eventBus.trigger(events.LOADING_ABANDONED, {request: request, mediaType: request.mediaType, sender: instance});\n }\n }\n });\n } else {\n report(\n undefined,\n new DashJSError(\n errors.FRAGMENT_LOADER_NULL_REQUEST_ERROR_CODE,\n errors.FRAGMENT_LOADER_NULL_REQUEST_ERROR_MESSAGE\n )\n );\n }\n }\n\n function abort() {\n if (urlLoader) {\n urlLoader.abort();\n }\n }\n\n function reset() {\n if (urlLoader) {\n urlLoader.abort();\n urlLoader = null;\n }\n }\n\n instance = {\n checkForExistence: checkForExistence,\n load: load,\n abort: abort,\n reset: reset\n };\n\n setup();\n\n return instance;\n}\n\nFragmentLoader.__dashjs_factory_name = 'FragmentLoader';\nexport default FactoryMaker.getClassFactory(FragmentLoader);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventsBase from '../core/events/EventsBase';\n/**\n * @class\n * @implements EventsBase\n */\nclass MediaPlayerEvents extends EventsBase {\n\n /**\n * @description Public facing external events to be used when developing a player that implements dash.js.\n */\n constructor() {\n super();\n /**\n * Triggered when playback will not start yet\n * as the MPD's availabilityStartTime is in the future.\n * Check delay property in payload to determine time before playback will start.\n * @event MediaPlayerEvents#AST_IN_FUTURE\n */\n this.AST_IN_FUTURE = 'astInFuture';\n\n /**\n * Triggered when the video element's buffer state changes to stalled.\n * Check mediaType in payload to determine type (Video, Audio, FragmentedText).\n * @event MediaPlayerEvents#BUFFER_EMPTY\n */\n this.BUFFER_EMPTY = 'bufferStalled';\n\n /**\n * Triggered when the video element's buffer state changes to loaded.\n * Check mediaType in payload to determine type (Video, Audio, FragmentedText).\n * @event MediaPlayerEvents#BUFFER_LOADED\n */\n this.BUFFER_LOADED = 'bufferLoaded';\n\n /**\n * Triggered when the video element's buffer state changes, either stalled or loaded. Check payload for state.\n * @event MediaPlayerEvents#BUFFER_LEVEL_STATE_CHANGED\n */\n this.BUFFER_LEVEL_STATE_CHANGED = 'bufferStateChanged';\n\n /**\n * Triggered when there is an error from the element or MSE source buffer.\n * @event MediaPlayerEvents#ERROR\n */\n this.ERROR = 'error';\n /**\n * Triggered when a fragment download has completed.\n * @event MediaPlayerEvents#FRAGMENT_LOADING_COMPLETED\n */\n this.FRAGMENT_LOADING_COMPLETED = 'fragmentLoadingCompleted';\n\n /**\n * Triggered when a partial fragment download has completed.\n * @event MediaPlayerEvents#FRAGMENT_LOADING_PROGRESS\n */\n this.FRAGMENT_LOADING_PROGRESS = 'fragmentLoadingProgress';\n /**\n * Triggered when a fragment download has started.\n * @event MediaPlayerEvents#FRAGMENT_LOADING_STARTED\n */\n this.FRAGMENT_LOADING_STARTED = 'fragmentLoadingStarted';\n\n /**\n * Triggered when a fragment download is abandoned due to detection of slow download base on the ABR abandon rule..\n * @event MediaPlayerEvents#FRAGMENT_LOADING_ABANDONED\n */\n this.FRAGMENT_LOADING_ABANDONED = 'fragmentLoadingAbandoned';\n\n /**\n * Triggered when {@link module:Debug} logger methods are called.\n * @event MediaPlayerEvents#LOG\n */\n this.LOG = 'log';\n\n //TODO refactor with internal event\n /**\n * Triggered when the manifest load is complete\n * @event MediaPlayerEvents#MANIFEST_LOADED\n */\n this.MANIFEST_LOADED = 'manifestLoaded';\n\n /**\n * Triggered anytime there is a change to the overall metrics.\n * @event MediaPlayerEvents#METRICS_CHANGED\n */\n this.METRICS_CHANGED = 'metricsChanged';\n\n /**\n * Triggered when an individual metric is added, updated or cleared.\n * @event MediaPlayerEvents#METRIC_CHANGED\n */\n this.METRIC_CHANGED = 'metricChanged';\n\n /**\n * Triggered every time a new metric is added.\n * @event MediaPlayerEvents#METRIC_ADDED\n */\n this.METRIC_ADDED = 'metricAdded';\n\n /**\n * Triggered every time a metric is updated.\n * @event MediaPlayerEvents#METRIC_UPDATED\n */\n this.METRIC_UPDATED = 'metricUpdated';\n\n /**\n * Triggered at the stream end of a period.\n * @event MediaPlayerEvents#PERIOD_SWITCH_COMPLETED\n */\n this.PERIOD_SWITCH_COMPLETED = 'periodSwitchCompleted';\n\n /**\n * Triggered when a new period starts.\n * @event MediaPlayerEvents#PERIOD_SWITCH_STARTED\n */\n this.PERIOD_SWITCH_STARTED = 'periodSwitchStarted';\n\n /**\n * Triggered when an ABR up /down switch is initiated; either by user in manual mode or auto mode via ABR rules.\n * @event MediaPlayerEvents#QUALITY_CHANGE_REQUESTED\n */\n this.QUALITY_CHANGE_REQUESTED = 'qualityChangeRequested';\n\n /**\n * Triggered when the new ABR quality is being rendered on-screen.\n * @event MediaPlayerEvents#QUALITY_CHANGE_RENDERED\n */\n this.QUALITY_CHANGE_RENDERED = 'qualityChangeRendered';\n\n /**\n * Triggered when the new track is being rendered.\n * @event MediaPlayerEvents#TRACK_CHANGE_RENDERED\n */\n this.TRACK_CHANGE_RENDERED = 'trackChangeRendered';\n\n /**\n * Triggered when the source is setup and ready.\n * @event MediaPlayerEvents#SOURCE_INITIALIZED\n */\n this.SOURCE_INITIALIZED = 'sourceInitialized';\n\n /**\n * Triggered when a stream (period) is being loaded\n * @event MediaPlayerEvents#STREAM_INITIALIZING\n */\n this.STREAM_INITIALIZING = 'streamInitializing';\n\n /**\n * Triggered when a stream (period) is loaded\n * @event MediaPlayerEvents#STREAM_INITIALIZED\n */\n this.STREAM_INITIALIZED = 'streamInitialized';\n\n /**\n * Triggered when the player has been reset.\n * @event MediaPlayerEvents#STREAM_TEARDOWN_COMPLETE\n */\n this.STREAM_TEARDOWN_COMPLETE = 'streamTeardownComplete';\n\n /**\n * Triggered once all text tracks detected in the MPD are added to the video element.\n * @event MediaPlayerEvents#TEXT_TRACKS_ADDED\n */\n this.TEXT_TRACKS_ADDED = 'allTextTracksAdded';\n\n /**\n * Triggered when a text track is added to the video element's TextTrackList\n * @event MediaPlayerEvents#TEXT_TRACK_ADDED\n */\n this.TEXT_TRACK_ADDED = 'textTrackAdded';\n\n /**\n * Triggered when a ttml chunk is parsed.\n * @event MediaPlayerEvents#TTML_PARSED\n */\n this.TTML_PARSED = 'ttmlParsed';\n\n /**\n * Triggered when a ttml chunk has to be parsed.\n * @event MediaPlayerEvents#TTML_TO_PARSE\n */\n this.TTML_TO_PARSE = 'ttmlToParse';\n\n /**\n * Triggered when a caption is rendered.\n * @event MediaPlayerEvents#CAPTION_RENDERED\n */\n this.CAPTION_RENDERED = 'captionRendered';\n\n /**\n * Triggered when the caption container is resized.\n * @event MediaPlayerEvents#CAPTION_CONTAINER_RESIZE\n */\n this.CAPTION_CONTAINER_RESIZE = 'captionContainerResize';\n\n /**\n * Sent when enough data is available that the media can be played,\n * at least for a couple of frames. This corresponds to the\n * HAVE_ENOUGH_DATA readyState.\n * @event MediaPlayerEvents#CAN_PLAY\n */\n this.CAN_PLAY = 'canPlay';\n\n /**\n * Sent when playback completes.\n * @event MediaPlayerEvents#PLAYBACK_ENDED\n */\n this.PLAYBACK_ENDED = 'playbackEnded';\n\n /**\n * Sent when an error occurs. The element's error\n * attribute contains more information.\n * @event MediaPlayerEvents#PLAYBACK_ERROR\n */\n this.PLAYBACK_ERROR = 'playbackError';\n\n /**\n * Sent when playback is not allowed (for example if user gesture is needed).\n * @event MediaPlayerEvents#PLAYBACK_NOT_ALLOWED\n */\n this.PLAYBACK_NOT_ALLOWED = 'playbackNotAllowed';\n\n /**\n * The media's metadata has finished loading; all attributes now\n * contain as much useful information as they're going to.\n * @event MediaPlayerEvents#PLAYBACK_METADATA_LOADED\n */\n this.PLAYBACK_METADATA_LOADED = 'playbackMetaDataLoaded';\n\n /**\n * Sent when playback is paused.\n * @event MediaPlayerEvents#PLAYBACK_PAUSED\n */\n this.PLAYBACK_PAUSED = 'playbackPaused';\n\n /**\n * Sent when the media begins to play (either for the first time, after having been paused,\n * or after ending and then restarting).\n *\n * @event MediaPlayerEvents#PLAYBACK_PLAYING\n */\n this.PLAYBACK_PLAYING = 'playbackPlaying';\n\n /**\n * Sent periodically to inform interested parties of progress downloading\n * the media. Information about the current amount of the media that has\n * been downloaded is available in the media element's buffered attribute.\n * @event MediaPlayerEvents#PLAYBACK_PROGRESS\n */\n this.PLAYBACK_PROGRESS = 'playbackProgress';\n\n /**\n * Sent when the playback speed changes.\n * @event MediaPlayerEvents#PLAYBACK_RATE_CHANGED\n */\n this.PLAYBACK_RATE_CHANGED = 'playbackRateChanged';\n\n /**\n * Sent when a seek operation completes.\n * @event MediaPlayerEvents#PLAYBACK_SEEKED\n */\n this.PLAYBACK_SEEKED = 'playbackSeeked';\n\n /**\n * Sent when a seek operation begins.\n * @event MediaPlayerEvents#PLAYBACK_SEEKING\n */\n this.PLAYBACK_SEEKING = 'playbackSeeking';\n\n /**\n * Sent when a seek operation has been asked.\n * @event MediaPlayerEvents#PLAYBACK_SEEK_ASKED\n */\n this.PLAYBACK_SEEK_ASKED = 'playbackSeekAsked';\n\n /**\n * Sent when the video element reports stalled\n * @event MediaPlayerEvents#PLAYBACK_STALLED\n */\n this.PLAYBACK_STALLED = 'playbackStalled';\n\n /**\n * Sent when playback of the media starts after having been paused;\n * that is, when playback is resumed after a prior pause event.\n *\n * @event MediaPlayerEvents#PLAYBACK_STARTED\n */\n this.PLAYBACK_STARTED = 'playbackStarted';\n\n /**\n * The time indicated by the element's currentTime attribute has changed.\n * @event MediaPlayerEvents#PLAYBACK_TIME_UPDATED\n */\n this.PLAYBACK_TIME_UPDATED = 'playbackTimeUpdated';\n\n /**\n * Sent when the media playback has stopped because of a temporary lack of data.\n *\n * @event MediaPlayerEvents#PLAYBACK_WAITING\n */\n this.PLAYBACK_WAITING = 'playbackWaiting';\n\n /**\n * Manifest validity changed - As a result of an MPD validity expiration event.\n * @event MediaPlayerEvents#MANIFEST_VALIDITY_CHANGED\n */\n this.MANIFEST_VALIDITY_CHANGED = 'manifestValidityChanged';\n }\n}\n\nlet mediaPlayerEvents = new MediaPlayerEvents();\nexport default mediaPlayerEvents;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Constants declaration\n * @class\n * @ignore\n * @hideconstructor\n */\nclass Constants {\n\n init () {\n /**\n * @constant {string} STREAM Stream media type. Mainly used to report metrics relative to the full stream\n * @memberof Constants#\n * @static\n */\n this.STREAM = 'stream';\n\n /**\n * @constant {string} VIDEO Video media type\n * @memberof Constants#\n * @static\n */\n this.VIDEO = 'video';\n\n /**\n * @constant {string} AUDIO Audio media type\n * @memberof Constants#\n * @static\n */\n this.AUDIO = 'audio';\n\n /**\n * @constant {string} TEXT Text media type\n * @memberof Constants#\n * @static\n */\n this.TEXT = 'text';\n\n /**\n * @constant {string} FRAGMENTED_TEXT Fragmented text media type\n * @memberof Constants#\n * @static\n */\n this.FRAGMENTED_TEXT = 'fragmentedText';\n\n /**\n * @constant {string} EMBEDDED_TEXT Embedded text media type\n * @memberof Constants#\n * @static\n */\n this.EMBEDDED_TEXT = 'embeddedText';\n\n /**\n * @constant {string} MUXED Muxed (video/audio in the same chunk) media type\n * @memberof Constants#\n * @static\n */\n this.MUXED = 'muxed';\n\n /**\n * @constant {string} IMAGE Image media type\n * @memberof Constants#\n * @static\n */\n this.IMAGE = 'image';\n\n /**\n * @constant {string} STPP STTP Subtitles format\n * @memberof Constants#\n * @static\n */\n this.STPP = 'stpp';\n\n /**\n * @constant {string} TTML STTP Subtitles format\n * @memberof Constants#\n * @static\n */\n this.TTML = 'ttml';\n\n /**\n * @constant {string} VTT STTP Subtitles format\n * @memberof Constants#\n * @static\n */\n this.VTT = 'vtt';\n\n /**\n * @constant {string} WVTT STTP Subtitles format\n * @memberof Constants#\n * @static\n */\n this.WVTT = 'wvtt';\n\n /**\n * @constant {string} ABR_STRATEGY_DYNAMIC Dynamic Adaptive bitrate algorithm\n * @memberof Constants#\n * @static\n */\n this.ABR_STRATEGY_DYNAMIC = 'abrDynamic';\n\n /**\n * @constant {string} ABR_STRATEGY_BOLA Adaptive bitrate algorithm based on Bola (buffer level)\n * @memberof Constants#\n * @static\n */\n this.ABR_STRATEGY_BOLA = 'abrBola';\n\n /**\n * @constant {string} ABR_STRATEGY_THROUGHPUT Adaptive bitrate algorithm based on throughput\n * @memberof Constants#\n * @static\n */\n this.ABR_STRATEGY_THROUGHPUT = 'abrThroughput';\n\n /**\n * @constant {string} MOVING_AVERAGE_SLIDING_WINDOW Moving average sliding window\n * @memberof Constants#\n * @static\n */\n this.MOVING_AVERAGE_SLIDING_WINDOW = 'slidingWindow';\n\n /**\n * @constant {string} EWMA Exponential moving average\n * @memberof Constants#\n * @static\n */\n this.MOVING_AVERAGE_EWMA = 'ewma';\n\n /**\n * @constant {string} BAD_ARGUMENT_ERROR Invalid Arguments type of error\n * @memberof Constants#\n * @static\n */\n this.BAD_ARGUMENT_ERROR = 'Invalid Arguments';\n\n /**\n * @constant {string} MISSING_CONFIG_ERROR Missing ocnfiguration parameters type of error\n * @memberof Constants#\n * @static\n */\n this.MISSING_CONFIG_ERROR = 'Missing config parameter(s)';\n this.LOCATION = 'Location';\n this.INITIALIZE = 'initialize';\n this.TEXT_SHOWING = 'showing';\n this.TEXT_HIDDEN = 'hidden';\n this.CC1 = 'CC1';\n this.CC3 = 'CC3';\n this.UTF8 = 'utf-8';\n this.SCHEME_ID_URI = 'schemeIdUri';\n this.START_TIME = 'starttime';\n this.SERVICE_DESCRIPTION_LL_SCHEME = 'urn:dvb:dash:lowlatency:scope:2019';\n this.SUPPLEMENTAL_PROPERTY_LL_SCHEME = 'urn:dvb:dash:lowlatency:critical:2019';\n this.XML = 'XML';\n this.ARRAY_BUFFER = 'ArrayBuffer';\n }\n\n constructor () {\n this.init();\n }\n}\n\nconst constants = new Constants();\nexport default constants;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventBus from '../../core/EventBus';\nimport MediaPlayerEvents from '../MediaPlayerEvents';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport Settings from '../../core/Settings';\nimport {HTTPRequest} from '../vo/metrics/HTTPRequest';\nimport DashManifestModel from '../../dash/models/DashManifestModel';\nimport Utils from '../../core/Utils';\nimport {getVersionString} from '../../core/Version';\n\nconst CMCD_REQUEST_FIELD_NAME = 'Common-Media-Client-Data';\nconst CMCD_VERSION = 1;\nconst DEFAULT_DEVICE_ID = `dash.js-v${getVersionString()}`;\nconst BUFFER_STATES = {\n DEFAULT: null,\n INITIALIZING: 1,\n SEEKING: 2,\n RISK: 3,\n EMPTY: 4\n};\nconst OBJECT_TYPES = {\n MANIFEST: 'm',\n AUDIO: 'a',\n VIDEO: 'v',\n INIT: 'i',\n CAPTION: 'c'\n};\nconst STREAMING_FORMATS = {\n DASH: 'd',\n MSS: 's'\n};\nconst STREAM_TYPES = {\n VOD: 'v',\n LIVE: 'l'\n};\n\nfunction CmcdModel() {\n\n let logger,\n dashManifestModel,\n instance,\n internalData,\n abrController,\n dashMetrics,\n playbackController;\n\n let context = this.context;\n let eventBus = EventBus(context).getInstance();\n let settings = Settings(context).getInstance();\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n dashManifestModel = DashManifestModel(context).getInstance();\n\n _resetInitialSettings();\n }\n\n function initialize() {\n eventBus.on(MediaPlayerEvents.PLAYBACK_RATE_CHANGED, _onPlaybackRateChanged, instance);\n eventBus.on(MediaPlayerEvents.MANIFEST_LOADED, _onManifestLoaded, instance);\n eventBus.on(MediaPlayerEvents.BUFFER_LEVEL_STATE_CHANGED, _onBufferLevelStateChanged, instance);\n }\n\n function setConfig(config) {\n if (!config) return;\n\n if (config.abrController) {\n abrController = config.abrController;\n }\n\n if (config.dashMetrics) {\n dashMetrics = config.dashMetrics;\n }\n\n if (config.playbackController) {\n playbackController = config.playbackController;\n }\n }\n\n function _resetInitialSettings() {\n internalData = {\n pr: 1,\n nor: null,\n st: null,\n sf: null,\n sid: `${Utils.generateUuid()}`,\n bs: {\n audio: BUFFER_STATES.INITIALIZING,\n video: BUFFER_STATES.INITIALIZING\n },\n cid: null,\n did: `${DEFAULT_DEVICE_ID}`\n\n };\n }\n\n function getQueryParameter(request) {\n try {\n if (settings.get().streaming.cmcd && settings.get().streaming.cmcd.enabled) {\n const cmcdData = _getCmcdData(request);\n const finalPayloadString = _buildFinalString(cmcdData);\n\n return {\n key: CMCD_REQUEST_FIELD_NAME,\n value: finalPayloadString\n };\n }\n\n return null;\n } catch (e) {\n return null;\n }\n }\n\n function _getCmcdData(request) {\n try {\n let cmcdData = null;\n\n if (request.type === HTTPRequest.MPD_TYPE) {\n _setDefaultContentId(request);\n return _getCmcdDataForMpd(request);\n } else if (request.type === HTTPRequest.MEDIA_SEGMENT_TYPE) {\n return _getCmcdDataForMediaSegment(request);\n } else if (request.type === HTTPRequest.INIT_SEGMENT_TYPE) {\n return _getCmcdDataForInitSegment(request);\n }\n\n return cmcdData;\n } catch (e) {\n return null;\n }\n }\n\n function _setDefaultContentId(request) {\n try {\n internalData.cid = `${Utils.generateHashCode(request.url)}`;\n } catch (e) {\n\n }\n }\n\n function _getCmcdDataForMpd() {\n const data = _getGenericCmcdData();\n\n data.ot = `${OBJECT_TYPES.MANIFEST}`;\n\n return data;\n }\n\n function _getCmcdDataForMediaSegment(request) {\n const data = _getGenericCmcdData();\n const encodedBitrate = _getBitrateByRequest(request);\n const d = _getObjectDurationByRequest(request);\n const ot = request.mediaType === 'video' ? `${OBJECT_TYPES.VIDEO}` : request.mediaType === 'audio' ? `${OBJECT_TYPES.AUDIO}` : request.mediaType === 'fragmentedText' ? `${OBJECT_TYPES.CAPTION}` : null;\n const mtp = _getMeasuredThroughputByType(request.mediaType);\n const dl = _getDeadlineByType(request.mediaType);\n const bs = _getBufferStateByRequest(request);\n\n if (encodedBitrate) {\n data.br = encodedBitrate;\n }\n\n if (ot) {\n data.ot = ot;\n }\n\n if (!isNaN(d)) {\n data.d = d;\n }\n\n if (!isNaN(mtp)) {\n data.mtp = mtp;\n }\n\n if (!isNaN(dl)) {\n data.dl = dl;\n }\n\n if (!isNaN(bs) && bs !== null) {\n data.bs = bs;\n }\n\n return data;\n }\n\n function _getCmcdDataForInitSegment() {\n const data = _getGenericCmcdData();\n\n data.ot = `${OBJECT_TYPES.INIT}`;\n\n return data;\n }\n\n function _getGenericCmcdData() {\n const data = {};\n\n data.v = CMCD_VERSION;\n data.sid = settings.get().streaming.cmcd.sid ? settings.get().streaming.cmcd.sid : internalData.sid;\n data.cid = settings.get().streaming.cmcd.cid ? settings.get().streaming.cmcd.cid : internalData.cid;\n data.did = settings.get().streaming.cmcd.did ? settings.get().streaming.cmcd.did : internalData.did;\n\n data.sid = `\"${data.sid}\"`;\n data.cid = `\"${data.cid}\"`;\n data.did = `\"${data.did}\"`;\n\n if (!isNaN(internalData.pr) && internalData.pr !== 1 && internalData.pr !== null) {\n data.pr = internalData.pr;\n }\n\n if (internalData.st) {\n data.st = internalData.st;\n }\n\n if (internalData.sf) {\n data.sf = internalData.sf;\n }\n\n return data;\n }\n\n function _getBitrateByRequest(request) {\n try {\n const quality = request.quality;\n const bitrateList = request.mediaInfo.bitrateList;\n\n return parseInt(bitrateList[quality].bandwidth / 1000);\n } catch (e) {\n return null;\n }\n }\n\n function _getObjectDurationByRequest(request) {\n try {\n return !isNaN(request.duration) ? Math.round(request.duration * 1000) : null;\n } catch (e) {\n return null;\n }\n }\n\n function _getMeasuredThroughputByType(mediaType) {\n try {\n return Math.round(abrController.getThroughputHistory().getSafeAverageThroughput(mediaType));\n } catch (e) {\n return null;\n }\n }\n\n function _getDeadlineByType(mediaType) {\n try {\n const playbackRate = internalData.pr;\n const bufferLevel = dashMetrics.getCurrentBufferLevel(mediaType);\n\n if (!isNaN(playbackRate) && !isNaN(bufferLevel)) {\n return parseInt((bufferLevel / playbackRate) * 1000);\n }\n\n return null;\n } catch (e) {\n return null;\n }\n }\n\n function _getBufferStateByRequest(request) {\n try {\n const mediaType = request.mediaType;\n if (internalData.bs[mediaType] !== null) {\n return internalData.bs[mediaType];\n }\n\n const bufferLevel = dashMetrics.getCurrentBufferLevel(mediaType);\n const duration = request.duration;\n if (bufferLevel < duration) {\n return BUFFER_STATES.RISK;\n }\n\n return BUFFER_STATES.DEFAULT;\n } catch (e) {\n\n }\n }\n\n function _onPlaybackRateChanged(data) {\n try {\n internalData.pr = data.playbackRate;\n } catch (e) {\n\n }\n }\n\n function _onManifestLoaded(data) {\n try {\n const isDynamic = dashManifestModel.getIsDynamic(data.data);\n const st = isDynamic ? `${STREAM_TYPES.LIVE}` : `${STREAM_TYPES.VOD}`;\n const sf = data.protocol && data.protocol === 'MSS' ? `${STREAMING_FORMATS.MSS}` : `${STREAMING_FORMATS.DASH}`;\n\n internalData.st = `${st}`;\n internalData.sf = `${sf}`;\n } catch (e) {\n }\n }\n\n function _onBufferLevelStateChanged(data) {\n try {\n if (data.state && data.mediaType) {\n let state = null;\n switch (data.state) {\n case MediaPlayerEvents.BUFFER_LOADED:\n state = BUFFER_STATES.DEFAULT;\n break;\n case MediaPlayerEvents.BUFFER_EMPTY:\n if (playbackController.isSeeking()) {\n state = BUFFER_STATES.SEEKING;\n }\n state = BUFFER_STATES.EMPTY;\n break;\n default:\n }\n internalData.bs[data.mediaType] = state;\n\n }\n } catch (e) {\n\n }\n }\n\n function _buildFinalString(cmcdData) {\n try {\n if (!cmcdData) {\n return null;\n }\n const keys = Object.keys(cmcdData);\n const length = keys.length;\n\n return keys.reduce((acc, key, index) => {\n acc += `${key}=${cmcdData[key]}`;\n if (index < length - 1) {\n acc += ',';\n }\n\n return acc;\n }, '');\n\n } catch (e) {\n return null;\n }\n }\n\n function reset() {\n eventBus.off(MediaPlayerEvents.PLAYBACK_RATE_CHANGED, _onPlaybackRateChanged, this);\n eventBus.off(MediaPlayerEvents.MANIFEST_LOADED, _onManifestLoaded, this);\n eventBus.off(MediaPlayerEvents.BUFFER_LEVEL_STATE_CHANGED, _onBufferLevelStateChanged, instance);\n\n _resetInitialSettings();\n }\n\n instance = {\n getQueryParameter,\n setConfig,\n reset,\n initialize\n };\n\n setup();\n\n return instance;\n}\n\nCmcdModel.__dashjs_factory_name = 'CmcdModel';\nexport default FactoryMaker.getSingletonFactory(CmcdModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport FragmentRequest from '../vo/FragmentRequest';\n\nconst FRAGMENT_MODEL_LOADING = 'loading';\nconst FRAGMENT_MODEL_EXECUTED = 'executed';\nconst FRAGMENT_MODEL_CANCELED = 'canceled';\nconst FRAGMENT_MODEL_FAILED = 'failed';\n\nfunction FragmentModel(config) {\n\n config = config || {};\n const eventBus = config.eventBus;\n const events = config.events;\n const dashMetrics = config.dashMetrics;\n const fragmentLoader = config.fragmentLoader;\n const debug = config.debug;\n const streamId = config.streamId;\n\n let instance,\n logger,\n executedRequests,\n loadingRequests;\n\n function setup() {\n logger = debug.getLogger(instance);\n resetInitialSettings();\n eventBus.on(events.LOADING_COMPLETED, onLoadingCompleted, instance);\n eventBus.on(events.LOADING_DATA_PROGRESS, onLoadingInProgress, instance);\n eventBus.on(events.LOADING_ABANDONED, onLoadingAborted, instance);\n }\n\n function isFragmentLoaded(request) {\n const isEqualComplete = function (req1, req2) {\n return ((req1.action === FragmentRequest.ACTION_COMPLETE) && (req1.action === req2.action));\n };\n\n const isEqualMedia = function (req1, req2) {\n return !isNaN(req1.index) && (req1.startTime === req2.startTime) && (req1.adaptationIndex === req2.adaptationIndex) && (req1.type === req2.type);\n };\n\n const isEqualInit = function (req1, req2) {\n return isNaN(req1.index) && isNaN(req2.index) && (req1.quality === req2.quality);\n };\n\n const check = function (requests) {\n let isLoaded = false;\n\n requests.some(req => {\n if (isEqualMedia(request, req) || isEqualInit(request, req) || isEqualComplete(request, req)) {\n isLoaded = true;\n return isLoaded;\n }\n });\n return isLoaded;\n };\n\n if (!request) {\n return false;\n }\n\n return check(executedRequests);\n }\n\n function isFragmentLoadedOrPending(request) {\n let isLoaded = false;\n let i = 0;\n let req;\n\n // First, check if the fragment has already been loaded\n isLoaded = isFragmentLoaded(request);\n\n // Then, check if the fragment is about to be loeaded\n if (!isLoaded) {\n for (i = 0; i < loadingRequests.length; i++) {\n req = loadingRequests[i];\n if ((request.url === req.url) && (request.startTime === req.startTime)) {\n isLoaded = true;\n }\n }\n }\n\n return isLoaded;\n }\n\n /**\n *\n * Gets an array of {@link FragmentRequest} objects\n *\n * @param {Object} filter The object with properties by which the method filters the requests to be returned.\n * the only mandatory property is state, which must be a value from\n * other properties should match the properties of {@link FragmentRequest}. E.g.:\n * getRequests({state: FragmentModel.FRAGMENT_MODEL_EXECUTED, quality: 0}) - returns\n * all the requests from executedRequests array where requests.quality = filter.quality\n *\n * @returns {Array}\n * @memberof FragmentModel#\n */\n function getRequests(filter) {\n const states = filter ? filter.state instanceof Array ? filter.state : [filter.state] : [];\n\n let filteredRequests = [];\n states.forEach(state => {\n const requests = getRequestsForState(state);\n filteredRequests = filteredRequests.concat(filterRequests(requests, filter));\n });\n\n return filteredRequests;\n }\n\n function getRequestThreshold(req) {\n return isNaN(req.duration) ? 0.25 : Math.min(req.duration / 8, 0.5);\n }\n\n function removeExecutedRequestsBeforeTime(time) {\n executedRequests = executedRequests.filter(req => {\n const threshold = getRequestThreshold(req);\n return isNaN(req.startTime) || (time !== undefined ? req.startTime >= time - threshold : false);\n });\n }\n\n function removeExecutedRequestsAfterTime(time) {\n executedRequests = executedRequests.filter(req => {\n return isNaN(req.startTime) || (time !== undefined ? req.startTime < time : false);\n });\n }\n\n function removeExecutedRequestsInTimeRange(start, end) {\n if (end <= start + 0.5) {\n return;\n }\n\n executedRequests = executedRequests.filter(req => {\n const threshold = getRequestThreshold(req);\n return (isNaN(req.startTime) || req.startTime >= (end - threshold)) ||\n (isNaN(req.duration) || (req.startTime + req.duration) <= (start + threshold));\n });\n }\n\n // Remove requests that are not \"represented\" by any of buffered ranges\n function syncExecutedRequestsWithBufferedRange(bufferedRanges, streamDuration) {\n if (!bufferedRanges || bufferedRanges.length === 0) {\n removeExecutedRequestsBeforeTime();\n return;\n }\n\n let start = 0;\n for (let i = 0, ln = bufferedRanges.length; i < ln; i++) {\n removeExecutedRequestsInTimeRange(start, bufferedRanges.start(i));\n start = bufferedRanges.end(i);\n }\n if (streamDuration > 0) {\n removeExecutedRequestsInTimeRange(start, streamDuration);\n }\n }\n\n function abortRequests() {\n fragmentLoader.abort();\n loadingRequests = [];\n }\n\n function executeRequest(request) {\n switch (request.action) {\n case FragmentRequest.ACTION_COMPLETE:\n executedRequests.push(request);\n addSchedulingInfoMetrics(request, FRAGMENT_MODEL_EXECUTED);\n logger.debug('STREAM_COMPLETED');\n eventBus.trigger(events.STREAM_COMPLETED, {\n request: request\n });\n break;\n case FragmentRequest.ACTION_DOWNLOAD:\n addSchedulingInfoMetrics(request, FRAGMENT_MODEL_LOADING);\n loadingRequests.push(request);\n loadCurrentFragment(request);\n break;\n default:\n logger.warn('Unknown request action.');\n }\n }\n\n function loadCurrentFragment(request) {\n eventBus.trigger(events.FRAGMENT_LOADING_STARTED, {\n streamId: streamId,\n request: request\n });\n fragmentLoader.load(request);\n }\n\n function getRequestForTime(arr, time, threshold) {\n // loop through the executed requests and pick the one for which the playback interval matches the given time\n const lastIdx = arr.length - 1;\n for (let i = lastIdx; i >= 0; i--) {\n const req = arr[i];\n const start = req.startTime;\n const end = start + req.duration;\n threshold = !isNaN(threshold) ? threshold : getRequestThreshold(req);\n if ((!isNaN(start) && !isNaN(end) && ((time + threshold) >= start) && ((time - threshold) < end)) || (isNaN(start) && isNaN(time))) {\n return req;\n }\n }\n return null;\n }\n\n function filterRequests(arr, filter) {\n // for time use a specific filtration function\n if (filter.hasOwnProperty('time')) {\n return [getRequestForTime(arr, filter.time, filter.threshold)];\n }\n\n return arr.filter(request => {\n for (const prop in filter) {\n if (prop === 'state') continue;\n if (filter.hasOwnProperty(prop) && request[prop] != filter[prop]) return false;\n }\n\n return true;\n });\n }\n\n function getRequestsForState(state) {\n let requests;\n switch (state) {\n case FRAGMENT_MODEL_LOADING:\n requests = loadingRequests;\n break;\n case FRAGMENT_MODEL_EXECUTED:\n requests = executedRequests;\n break;\n default:\n requests = [];\n }\n return requests;\n }\n\n function addSchedulingInfoMetrics(request, state) {\n dashMetrics.addSchedulingInfo(request, state);\n dashMetrics.addRequestsQueue(request.mediaType, loadingRequests, executedRequests);\n }\n\n function onLoadingCompleted(e) {\n if (e.sender !== fragmentLoader) return;\n\n loadingRequests.splice(loadingRequests.indexOf(e.request), 1);\n\n if (e.response && !e.error) {\n executedRequests.push(e.request);\n }\n\n addSchedulingInfoMetrics(e.request, e.error ? FRAGMENT_MODEL_FAILED : FRAGMENT_MODEL_EXECUTED);\n\n eventBus.trigger(events.FRAGMENT_LOADING_COMPLETED, {\n request: e.request,\n response: e.response,\n error: e.error,\n sender: this\n });\n }\n\n function onLoadingInProgress(e) {\n if (e.sender !== fragmentLoader) return;\n\n eventBus.trigger(events.FRAGMENT_LOADING_PROGRESS, {\n request: e.request,\n response: e.response,\n error: e.error,\n sender: this\n });\n }\n\n function onLoadingAborted(e) {\n if (e.sender !== fragmentLoader) return;\n\n eventBus.trigger(events.FRAGMENT_LOADING_ABANDONED, { streamId: streamId, request: e.request, mediaType: e.mediaType });\n }\n\n function resetInitialSettings() {\n executedRequests = [];\n loadingRequests = [];\n }\n\n function reset() {\n eventBus.off(events.LOADING_COMPLETED, onLoadingCompleted, this);\n eventBus.off(events.LOADING_DATA_PROGRESS, onLoadingInProgress, this);\n eventBus.off(events.LOADING_ABANDONED, onLoadingAborted, this);\n\n if (fragmentLoader) {\n fragmentLoader.reset();\n }\n resetInitialSettings();\n }\n\n function addExecutedRequest(request) {\n executedRequests.push(request);\n }\n\n instance = {\n getRequests: getRequests,\n isFragmentLoaded: isFragmentLoaded,\n isFragmentLoadedOrPending: isFragmentLoadedOrPending,\n removeExecutedRequestsBeforeTime: removeExecutedRequestsBeforeTime,\n removeExecutedRequestsAfterTime: removeExecutedRequestsAfterTime,\n syncExecutedRequestsWithBufferedRange: syncExecutedRequestsWithBufferedRange,\n abortRequests: abortRequests,\n executeRequest: executeRequest,\n reset: reset,\n addExecutedRequest: addExecutedRequest\n };\n\n setup();\n return instance;\n}\n\nFragmentModel.__dashjs_factory_name = 'FragmentModel';\nconst factory = FactoryMaker.getClassFactory(FragmentModel);\nfactory.FRAGMENT_MODEL_LOADING = FRAGMENT_MODEL_LOADING;\nfactory.FRAGMENT_MODEL_EXECUTED = FRAGMENT_MODEL_EXECUTED;\nfactory.FRAGMENT_MODEL_CANCELED = FRAGMENT_MODEL_CANCELED;\nfactory.FRAGMENT_MODEL_FAILED = FRAGMENT_MODEL_FAILED;\nFactoryMaker.updateClassFactory(FragmentModel.__dashjs_factory_name, factory);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\n\n/**\n * @module FetchLoader\n * @ignore\n * @description Manages download of resources via HTTP using fetch.\n * @param {Object} cfg - dependencies from parent\n */\nfunction FetchLoader(cfg) {\n\n cfg = cfg || {};\n const requestModifier = cfg.requestModifier;\n const boxParser = cfg.boxParser;\n\n let instance;\n\n function load(httpRequest) {\n\n // Variables will be used in the callback functions\n const requestStartTime = new Date();\n const request = httpRequest.request;\n\n const headers = new Headers(); /*jshint ignore:line*/\n if (request.range) {\n headers.append('Range', 'bytes=' + request.range);\n }\n\n if (!request.requestStartDate) {\n request.requestStartDate = requestStartTime;\n }\n\n if (requestModifier) {\n // modifyRequestHeader expects a XMLHttpRequest object so,\n // to keep backward compatibility, we should expose a setRequestHeader method\n // TODO: Remove RequestModifier dependency on XMLHttpRequest object and define\n // a more generic way to intercept/modify requests\n requestModifier.modifyRequestHeader({\n setRequestHeader: function (header, value) {\n headers.append(header, value);\n }\n });\n }\n\n let abortController;\n if (typeof window.AbortController === 'function') {\n abortController = new AbortController(); /*jshint ignore:line*/\n httpRequest.abortController = abortController;\n abortController.signal.onabort = httpRequest.onabort;\n }\n\n const reqOptions = {\n method: httpRequest.method,\n headers: headers,\n credentials: httpRequest.withCredentials ? 'include' : undefined,\n signal: abortController ? abortController.signal : undefined\n };\n\n fetch(httpRequest.url, reqOptions).then(function (response) {\n if (!httpRequest.response) {\n httpRequest.response = {};\n }\n httpRequest.response.status = response.status;\n httpRequest.response.statusText = response.statusText;\n httpRequest.response.responseURL = response.url;\n\n if (!response.ok) {\n httpRequest.onerror();\n }\n\n let responseHeaders = '';\n for (const key of response.headers.keys()) {\n responseHeaders += key + ': ' + response.headers.get(key) + '\\r\\n';\n }\n httpRequest.response.responseHeaders = responseHeaders;\n\n if (!response.body) {\n // Fetch returning a ReadableStream response body is not currently supported by all browsers.\n // Browser compatibility: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\n // If it is not supported, returning the whole segment when it's ready (as xhr)\n return response.arrayBuffer().then(function (buffer) {\n httpRequest.response.response = buffer;\n const event = {\n loaded: buffer.byteLength,\n total: buffer.byteLength,\n stream: false\n };\n httpRequest.progress(event);\n httpRequest.onload();\n httpRequest.onend();\n return;\n });\n }\n\n const totalBytes = parseInt(response.headers.get('Content-Length'), 10);\n let bytesReceived = 0;\n let signaledFirstByte = false;\n let remaining = new Uint8Array();\n let offset = 0;\n\n httpRequest.reader = response.body.getReader();\n let downLoadedData = [];\n\n const processResult = function ({value, done}) {\n if (done) {\n if (remaining) {\n // If there is pending data, call progress so network metrics\n // are correctly generated\n // Same structure as https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequestEventTarget/onprogress\n httpRequest.progress({\n loaded: bytesReceived,\n total: isNaN(totalBytes) ? bytesReceived : totalBytes,\n lengthComputable: true,\n time: calculateDownloadedTime(downLoadedData, bytesReceived),\n stream: true\n });\n\n httpRequest.response.response = remaining.buffer;\n }\n httpRequest.onload();\n httpRequest.onend();\n return;\n }\n\n if (value && value.length > 0) {\n remaining = concatTypedArray(remaining, value);\n bytesReceived += value.length;\n downLoadedData.push({\n ts: Date.now(),\n bytes: value.length\n });\n\n const boxesInfo = boxParser.findLastTopIsoBoxCompleted(['moov', 'mdat'], remaining, offset);\n if (boxesInfo.found) {\n const end = boxesInfo.lastCompletedOffset + boxesInfo.size;\n\n // If we are going to pass full buffer, avoid copying it and pass\n // complete buffer. Otherwise clone the part of the buffer that is completed\n // and adjust remaining buffer. A clone is needed because ArrayBuffer of a typed-array\n // keeps a reference to the original data\n let data;\n if (end === remaining.length) {\n data = remaining;\n remaining = new Uint8Array();\n } else {\n data = new Uint8Array(remaining.subarray(0, end));\n remaining = remaining.subarray(end);\n }\n\n // Announce progress but don't track traces. Throughput measures are quite unstable\n // when they are based in small amount of data\n httpRequest.progress({\n data: data.buffer,\n lengthComputable: false,\n noTrace: true\n });\n\n offset = 0;\n } else {\n offset = boxesInfo.lastCompletedOffset;\n\n // Call progress so it generates traces that will be later used to know when the first byte\n // were received\n if (!signaledFirstByte) {\n httpRequest.progress({\n lengthComputable: false,\n noTrace: true\n });\n signaledFirstByte = true;\n }\n }\n }\n read(httpRequest, processResult);\n };\n\n read(httpRequest, processResult);\n })\n .catch(function (e) {\n if (httpRequest.onerror) {\n httpRequest.onerror(e);\n }\n });\n }\n\n function read(httpRequest, processResult) {\n httpRequest.reader.read()\n .then(processResult)\n .catch(function (e) {\n if (httpRequest.onerror && httpRequest.response.status === 200) {\n // Error, but response code is 200, trigger error\n httpRequest.onerror(e);\n }\n });\n }\n\n function concatTypedArray(remaining, data) {\n if (remaining.length === 0) {\n return data;\n }\n const result = new Uint8Array(remaining.length + data.length);\n result.set(remaining);\n result.set(data, remaining.length);\n return result;\n }\n\n function abort(request) {\n if (request.abortController) {\n // For firefox and edge\n request.abortController.abort();\n } else if (request.reader) {\n // For Chrome\n try {\n request.reader.cancel();\n request.onabort();\n } catch (e) {\n // throw exceptions (TypeError) when reader was previously closed,\n // for example, because a network issue\n }\n }\n }\n\n function calculateDownloadedTime(datum, bytesReceived) {\n datum = datum.filter(data => data.bytes > ((bytesReceived / 4) / datum.length));\n if (datum.length > 1) {\n let time = 0;\n const avgTimeDistance = (datum[datum.length - 1].ts - datum[0].ts) / datum.length;\n datum.forEach((data, index) => {\n // To be counted the data has to be over a threshold\n const next = datum[index + 1];\n if (next) {\n const distance = next.ts - data.ts;\n time += distance < avgTimeDistance ? distance : 0;\n }\n });\n return time;\n }\n return null;\n }\n\n instance = {\n load: load,\n abort: abort,\n calculateDownloadedTime: calculateDownloadedTime\n };\n\n return instance;\n}\n\nFetchLoader.__dashjs_factory_name = 'FetchLoader';\n\nconst factory = FactoryMaker.getClassFactory(FetchLoader);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport XHRLoader from './XHRLoader';\nimport FetchLoader from './FetchLoader';\nimport {HTTPRequest} from '../vo/metrics/HTTPRequest';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport DashJSError from '../vo/DashJSError';\nimport CmcdModel from '../models/CmcdModel';\nimport Utils from '../../core/Utils';\n\n/**\n * @module HTTPLoader\n * @ignore\n * @description Manages download of resources via HTTP.\n * @param {Object} cfg - dependancies from parent\n */\nfunction HTTPLoader(cfg) {\n\n cfg = cfg || {};\n\n const context = this.context;\n const errHandler = cfg.errHandler;\n const dashMetrics = cfg.dashMetrics;\n const mediaPlayerModel = cfg.mediaPlayerModel;\n const requestModifier = cfg.requestModifier;\n const boxParser = cfg.boxParser;\n const useFetch = cfg.useFetch || false;\n const errors = cfg.errors;\n\n let instance,\n requests,\n delayedRequests,\n retryRequests,\n downloadErrorToRequestTypeMap,\n cmcdModel;\n\n function setup() {\n requests = [];\n delayedRequests = [];\n retryRequests = [];\n cmcdModel = CmcdModel(context).getInstance();\n\n downloadErrorToRequestTypeMap = {\n [HTTPRequest.MPD_TYPE]: errors.DOWNLOAD_ERROR_ID_MANIFEST_CODE,\n [HTTPRequest.XLINK_EXPANSION_TYPE]: errors.DOWNLOAD_ERROR_ID_XLINK_CODE,\n [HTTPRequest.INIT_SEGMENT_TYPE]: errors.DOWNLOAD_ERROR_ID_INITIALIZATION_CODE,\n [HTTPRequest.MEDIA_SEGMENT_TYPE]: errors.DOWNLOAD_ERROR_ID_CONTENT_CODE,\n [HTTPRequest.INDEX_SEGMENT_TYPE]: errors.DOWNLOAD_ERROR_ID_CONTENT_CODE,\n [HTTPRequest.BITSTREAM_SWITCHING_SEGMENT_TYPE]: errors.DOWNLOAD_ERROR_ID_CONTENT_CODE,\n [HTTPRequest.OTHER_TYPE]: errors.DOWNLOAD_ERROR_ID_CONTENT_CODE\n };\n }\n\n function internalLoad(config, remainingAttempts) {\n const request = config.request;\n const traces = [];\n let firstProgress = true;\n let needFailureReport = true;\n let requestStartTime = new Date();\n let lastTraceTime = requestStartTime;\n let lastTraceReceivedCount = 0;\n let httpRequest;\n\n if (!requestModifier || !dashMetrics || !errHandler) {\n throw new Error('config object is not correct or missing');\n }\n\n const handleLoaded = function (success) {\n needFailureReport = false;\n\n request.requestStartDate = requestStartTime;\n request.requestEndDate = new Date();\n request.firstByteDate = request.firstByteDate || requestStartTime;\n\n if (!request.checkExistenceOnly) {\n dashMetrics.addHttpRequest(request, httpRequest.response ? httpRequest.response.responseURL : null,\n httpRequest.response ? httpRequest.response.status : null,\n httpRequest.response && httpRequest.response.getAllResponseHeaders ? httpRequest.response.getAllResponseHeaders() :\n httpRequest.response ? httpRequest.response.responseHeaders : [],\n success ? traces : null);\n\n if (request.type === HTTPRequest.MPD_TYPE) {\n dashMetrics.addManifestUpdate(request.type, request.requestStartDate, request.requestEndDate);\n }\n }\n };\n\n const onloadend = function () {\n if (requests.indexOf(httpRequest) === -1) {\n return;\n } else {\n requests.splice(requests.indexOf(httpRequest), 1);\n }\n\n if (needFailureReport) {\n handleLoaded(false);\n\n if (remainingAttempts > 0) {\n remainingAttempts--;\n let retryRequest = {config: config};\n retryRequests.push(retryRequest);\n retryRequest.timeout = setTimeout(function () {\n if (retryRequests.indexOf(retryRequest) === -1) {\n return;\n } else {\n retryRequests.splice(retryRequests.indexOf(retryRequest), 1);\n }\n internalLoad(config, remainingAttempts);\n }, mediaPlayerModel.getRetryIntervalsForType(request.type));\n } else {\n errHandler.error(new DashJSError(downloadErrorToRequestTypeMap[request.type], request.url + ' is not available', {\n request: request,\n response: httpRequest.response\n }));\n\n if (config.error) {\n config.error(request, 'error', httpRequest.response.statusText);\n }\n\n if (config.complete) {\n config.complete(request, httpRequest.response.statusText);\n }\n }\n }\n };\n\n const progress = function (event) {\n const currentTime = new Date();\n\n if (firstProgress) {\n firstProgress = false;\n if (!event.lengthComputable ||\n (event.lengthComputable && event.total !== event.loaded)) {\n request.firstByteDate = currentTime;\n }\n }\n\n if (event.lengthComputable) {\n request.bytesLoaded = event.loaded;\n request.bytesTotal = event.total;\n }\n\n if (!event.noTrace) {\n traces.push({\n s: lastTraceTime,\n d: event.time ? event.time : currentTime.getTime() - lastTraceTime.getTime(),\n b: [event.loaded ? event.loaded - lastTraceReceivedCount : 0]\n });\n\n lastTraceTime = currentTime;\n lastTraceReceivedCount = event.loaded;\n }\n\n if (config.progress && event) {\n config.progress(event);\n }\n };\n\n const onload = function () {\n if (httpRequest.response.status >= 200 && httpRequest.response.status <= 299) {\n handleLoaded(true);\n\n if (config.success) {\n config.success(httpRequest.response.response, httpRequest.response.statusText, httpRequest.response.responseURL);\n }\n\n if (config.complete) {\n config.complete(request, httpRequest.response.statusText);\n }\n }\n };\n\n const onabort = function () {\n if (config.abort) {\n config.abort(request);\n }\n };\n\n let loader;\n if (useFetch && window.fetch && request.responseType === 'arraybuffer' && request.type === HTTPRequest.MEDIA_SEGMENT_TYPE) {\n loader = FetchLoader(context).create({\n requestModifier: requestModifier,\n boxParser: boxParser\n });\n } else {\n loader = XHRLoader(context).create({\n requestModifier: requestModifier\n });\n }\n\n let modifiedUrl = requestModifier.modifyRequestURL(request.url);\n const additionalQueryParameter = _getAdditionalQueryParameter(request);\n modifiedUrl = Utils.addAditionalQueryParameterToUrl(modifiedUrl, additionalQueryParameter);\n const verb = request.checkExistenceOnly ? HTTPRequest.HEAD : HTTPRequest.GET;\n const withCredentials = mediaPlayerModel.getXHRWithCredentialsForType(request.type);\n\n\n httpRequest = {\n url: modifiedUrl,\n method: verb,\n withCredentials: withCredentials,\n request: request,\n onload: onload,\n onend: onloadend,\n onerror: onloadend,\n progress: progress,\n onabort: onabort,\n loader: loader\n };\n\n // Adds the ability to delay single fragment loading time to control buffer.\n let now = new Date().getTime();\n if (isNaN(request.delayLoadingTime) || now >= request.delayLoadingTime) {\n // no delay - just send\n requests.push(httpRequest);\n loader.load(httpRequest);\n } else {\n // delay\n let delayedRequest = {httpRequest: httpRequest};\n delayedRequests.push(delayedRequest);\n delayedRequest.delayTimeout = setTimeout(function () {\n if (delayedRequests.indexOf(delayedRequest) === -1) {\n return;\n } else {\n delayedRequests.splice(delayedRequests.indexOf(delayedRequest), 1);\n }\n try {\n requestStartTime = new Date();\n lastTraceTime = requestStartTime;\n requests.push(delayedRequest.httpRequest);\n loader.load(delayedRequest.httpRequest);\n } catch (e) {\n delayedRequest.httpRequest.onerror();\n }\n }, (request.delayLoadingTime - now));\n }\n }\n\n function _getAdditionalQueryParameter(request) {\n try {\n const additionalQueryParameter = [];\n const cmcdQueryParameter = cmcdModel.getQueryParameter(request);\n\n if (cmcdQueryParameter) {\n additionalQueryParameter.push(cmcdQueryParameter);\n }\n\n return additionalQueryParameter;\n } catch (e) {\n return [];\n }\n }\n\n /**\n * Initiates a download of the resource described by config.request\n * @param {Object} config - contains request (FragmentRequest or derived type), and callbacks\n * @memberof module:HTTPLoader\n * @instance\n */\n function load(config) {\n if (config.request) {\n internalLoad(\n config,\n mediaPlayerModel.getRetryAttemptsForType(\n config.request.type\n )\n );\n } else {\n if (config.error) {\n config.error(config.request, 'error');\n }\n }\n }\n\n /**\n * Aborts any inflight downloads\n * @memberof module:HTTPLoader\n * @instance\n */\n function abort() {\n retryRequests.forEach(t => {\n clearTimeout(t.timeout);\n // abort request in order to trigger LOADING_ABANDONED event\n if (t.config.request && t.config.abort) {\n t.config.abort(t.config.request);\n }\n });\n retryRequests = [];\n\n delayedRequests.forEach(x => clearTimeout(x.delayTimeout));\n delayedRequests = [];\n\n requests.forEach(x => {\n // abort will trigger onloadend which we don't want\n // when deliberately aborting inflight requests -\n // set them to undefined so they are not called\n x.onloadend = x.onerror = x.onprogress = undefined;\n x.loader.abort(x);\n });\n requests = [];\n }\n\n instance = {\n load: load,\n abort: abort\n };\n\n setup();\n\n return instance;\n}\n\nHTTPLoader.__dashjs_factory_name = 'HTTPLoader';\n\nconst factory = FactoryMaker.getClassFactory(HTTPLoader);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport HTTPLoader from '../../streaming/net/HTTPLoader';\n\n/**\n * @module\n * @description Choose right url loader for scheme\n * @ignore\n */\nfunction SchemeLoaderFactory() {\n\n let instance;\n\n let schemeLoaderMap;\n\n function registerLoader(scheme, loader) {\n schemeLoaderMap[scheme] = loader;\n }\n\n function unregisterLoader(scheme) {\n if (schemeLoaderMap[scheme]) {\n delete schemeLoaderMap[scheme];\n }\n }\n\n function unregisterAllLoader() {\n schemeLoaderMap = {};\n }\n\n function getLoader(url) {\n\n // iterates through schemeLoaderMap to find a loader for the scheme\n for (var scheme in schemeLoaderMap) {\n if (schemeLoaderMap.hasOwnProperty(scheme) && url.startsWith(scheme)) {\n return schemeLoaderMap[scheme];\n }\n }\n\n return HTTPLoader;\n }\n\n function reset() {\n unregisterAllLoader();\n }\n\n function setup() {\n reset();\n }\n\n setup();\n\n instance = {\n getLoader: getLoader,\n registerLoader: registerLoader,\n unregisterLoader: unregisterLoader,\n unregisterAllLoader: unregisterAllLoader,\n reset: reset\n };\n\n return instance;\n}\n\nSchemeLoaderFactory.__dashjs_factory_name = 'SchemeLoaderFactory';\nconst factory = FactoryMaker.getSingletonFactory(SchemeLoaderFactory);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport SchemeLoaderFactory from '../../streaming/net/SchemeLoaderFactory';\n\n/**\n * @class URLLoader\n * @description Call Offline Loader or Online Loader dependaing on URL\n * @param {Object} cfg - dependances\n * @ignore\n*/\nfunction URLLoader(cfg) {\n\n cfg = cfg || {};\n const context = this.context;\n\n let instance,\n schemeLoaderFactory,\n loader;\n\n schemeLoaderFactory = SchemeLoaderFactory(context).getInstance();\n\n function load(config) {\n\n let loaderFactory = schemeLoaderFactory.getLoader(config && config.request ? config.request.url : null);\n loader = loaderFactory(context).create({\n errHandler: cfg.errHandler,\n mediaPlayerModel: cfg.mediaPlayerModel,\n requestModifier: cfg.requestModifier,\n useFetch: cfg.useFetch || null,\n dashMetrics: cfg.dashMetrics,\n boxParser: cfg.boxParser ? cfg.boxParser : null,\n constants: cfg.constants ? cfg.constants : null,\n dashConstants: cfg.dashConstants ? cfg.dashConstants : null,\n urlUtils: cfg.urlUtils ? cfg.urlUtils : null,\n errors: cfg.errors\n });\n\n loader.load(config);\n }\n\n function abort() {\n if (loader) {\n loader.abort();\n }\n }\n instance = {\n load: load,\n abort: abort\n };\n\n return instance;\n\n}\nURLLoader.__dashjs_factory_name = 'URLLoader';\n\nconst factory = FactoryMaker.getClassFactory(URLLoader);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\n\n/**\n * @module XHRLoader\n * @ignore\n * @description Manages download of resources via HTTP.\n * @param {Object} cfg - dependencies from parent\n */\nfunction XHRLoader(cfg) {\n\n cfg = cfg || {};\n const requestModifier = cfg.requestModifier;\n\n let instance;\n\n function load(httpRequest) {\n\n // Variables will be used in the callback functions\n const requestStartTime = new Date();\n const request = httpRequest.request;\n\n let xhr = new XMLHttpRequest();\n xhr.open(httpRequest.method, httpRequest.url, true);\n\n if (request.responseType) {\n xhr.responseType = request.responseType;\n }\n\n if (request.range) {\n xhr.setRequestHeader('Range', 'bytes=' + request.range);\n }\n\n if (!request.requestStartDate) {\n request.requestStartDate = requestStartTime;\n }\n\n if (requestModifier) {\n xhr = requestModifier.modifyRequestHeader(xhr);\n }\n\n xhr.withCredentials = httpRequest.withCredentials;\n\n xhr.onload = httpRequest.onload;\n xhr.onloadend = httpRequest.onend;\n xhr.onerror = httpRequest.onerror;\n xhr.onprogress = httpRequest.progress;\n xhr.onabort = httpRequest.onabort;\n\n xhr.send();\n\n httpRequest.response = xhr;\n }\n\n function abort(request) {\n const x = request.response;\n x.onloadend = x.onerror = x.onprogress = undefined; //Ignore events from aborted requests.\n x.abort();\n }\n\n instance = {\n load: load,\n abort: abort\n };\n\n return instance;\n}\n\nXHRLoader.__dashjs_factory_name = 'XHRLoader';\n\nconst factory = FactoryMaker.getClassFactory(XHRLoader);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\nimport DashConstants from '../../dash/constants/DashConstants';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport ThumbnailTrackInfo from '../vo/ThumbnailTrackInfo';\nimport URLUtils from '../../streaming/utils/URLUtils';\nimport { replaceIDForTemplate, getTimeBasedSegment } from '../../dash/utils/SegmentsUtils';\nimport Events from '../../core/events/Events';\nimport BoxParser from '../../streaming/utils/BoxParser';\nimport XHRLoader from '../../streaming/net/XHRLoader';\nimport DashHandler from '../../dash/DashHandler';\n\nexport const THUMBNAILS_SCHEME_ID_URIS = ['http://dashif.org/thumbnail_tile',\n 'http://dashif.org/guidelines/thumbnail_tile'];\n\nfunction ThumbnailTracks(config) {\n const context = this.context;\n const adapter = config.adapter;\n const baseURLController = config.baseURLController;\n const streamInfo = config.streamInfo;\n const timelineConverter = config.timelineConverter;\n const debug = config.debug;\n const eventBus = config.eventBus;\n const events = config.events;\n const dashConstants = config.dashConstants;\n\n const urlUtils = URLUtils(context).getInstance();\n\n let instance,\n tracks,\n indexHandler,\n currentTrackIndex,\n mediaInfo,\n loader,\n boxParser;\n\n function initialize() {\n reset();\n loader = XHRLoader(context).create({});\n boxParser = BoxParser(context).getInstance();\n\n indexHandler = DashHandler(context).create({\n timelineConverter: timelineConverter,\n baseURLController: baseURLController,\n debug: debug,\n eventBus: eventBus,\n events: events,\n dashConstants: dashConstants,\n urlUtils: urlUtils\n });\n\n // initialize controllers\n indexHandler.initialize(adapter ? adapter.getIsDynamic() : false);\n\n // parse representation and create tracks\n addTracks();\n }\n\n function normalizeSegments(fragments, representation) {\n const segments = [];\n let count = 0;\n\n let i,\n len,\n s,\n seg;\n\n for (i = 0, len = fragments.length; i < len; i++) {\n s = fragments[i];\n\n seg = getTimeBasedSegment(\n timelineConverter,\n adapter.getIsDynamic(),\n representation,\n s.startTime,\n s.duration,\n s.timescale,\n s.media,\n s.mediaRange,\n count);\n\n if (seg) {\n segments.push(seg);\n seg = null;\n count++;\n }\n }\n return segments;\n }\n\n function addTracks() {\n if (!streamInfo || !adapter) {\n return;\n }\n\n // Extract thumbnail tracks\n mediaInfo = adapter.getMediaInfoForType(streamInfo, Constants.IMAGE);\n if (!mediaInfo) {\n return;\n }\n\n const voReps = adapter.getVoRepresentations(mediaInfo);\n\n if (voReps && voReps.length > 0) {\n voReps.forEach((rep) => {\n if ((rep.segmentInfoType === DashConstants.SEGMENT_TEMPLATE && rep.segmentDuration > 0 && rep.media) ||\n rep.segmentInfoType === DashConstants.SEGMENT_TIMELINE) {\n createTrack(rep);\n }\n if (rep.segmentInfoType === DashConstants.SEGMENT_BASE) {\n createTrack(rep, true);\n }\n });\n }\n\n if (tracks.length > 0) {\n // Sort bitrates and select the lowest bitrate rendition\n tracks.sort((a, b) => a.bitrate - b.bitrate);\n currentTrackIndex = tracks.length - 1;\n }\n }\n\n function createTrack(representation, useSegmentBase) {\n const track = new ThumbnailTrackInfo();\n track.id = representation.id;\n track.bitrate = representation.bandwidth;\n track.width = representation.width;\n track.height = representation.height;\n track.tilesHor = 1;\n track.tilesVert = 1;\n\n if (representation.essentialProperties) {\n representation.essentialProperties.forEach((p) => {\n if (THUMBNAILS_SCHEME_ID_URIS.indexOf(p.schemeIdUri) >= 0 && p.value) {\n const vars = p.value.split('x');\n if (vars.length === 2 && !isNaN(vars[0]) && !isNaN(vars[1])) {\n track.tilesHor = parseInt(vars[0], 10);\n track.tilesVert = parseInt(vars[1], 10);\n }\n }\n });\n }\n\n if (useSegmentBase) {\n eventBus.trigger(Events.SEGMENTBASE_SEGMENTSLIST_REQUEST_NEEDED, {\n mimeType: mediaInfo.mimeType,\n mediaType: Constants.IMAGE,\n representation: representation,\n callback: function (segments, representation) {\n let cache = [];\n segments = normalizeSegments(segments, representation);\n track.segmentDuration = segments[0].duration; //assume all segments have the same duration\n track.readThumbnail = function (time, callback) {\n\n let cached = null;\n cache.some(el => {\n if (el.start <= time && el.end > time) {\n cached = el.url;\n return true;\n }\n });\n if (cached) {\n callback(cached);\n } else {\n segments.some((ss) => {\n if (ss.mediaStartTime <= time && ss.mediaStartTime + ss.duration > time) {\n const baseURL = baseURLController.resolve(representation.path);\n loader.load({\n method: 'get',\n url: baseURL.url,\n request: {\n range: ss.mediaRange,\n responseType: 'arraybuffer'\n },\n onload: function (e) {\n let info = boxParser.getSamplesInfo(e.target.response);\n let blob = new Blob( [ e.target.response.slice(info.sampleList[0].offset, info.sampleList[0].offset + info.sampleList[0].size) ], { type: 'image/jpeg' } );\n let imageUrl = window.URL.createObjectURL( blob );\n cache.push({\n start: ss.mediaStartTime,\n end: ss.mediaStartTime + ss.duration,\n url: imageUrl\n });\n if (callback)\n callback(imageUrl);\n }\n });\n return true;\n }\n });\n }\n };\n }\n });\n } else {\n track.startNumber = representation.startNumber;\n track.segmentDuration = representation.segmentDuration;\n track.timescale = representation.timescale;\n track.templateUrl = buildTemplateUrl(representation);\n }\n\n if (track.tilesHor > 0 && track.tilesVert > 0) {\n // Precalculate width and heigth per tile for perf reasons\n track.widthPerTile = track.width / track.tilesHor;\n track.heightPerTile = track.height / track.tilesVert;\n tracks.push(track);\n }\n }\n\n function buildTemplateUrl(representation) {\n const templateUrl = urlUtils.isRelative(representation.media) ?\n urlUtils.resolve(representation.media, baseURLController.resolve(representation.path).url) : representation.media;\n\n if (!templateUrl) {\n return '';\n }\n\n return replaceIDForTemplate(templateUrl, representation.id);\n }\n\n function getTracks() {\n return tracks;\n }\n\n function getCurrentTrackIndex() {\n return currentTrackIndex;\n }\n\n function getCurrentTrack() {\n if (currentTrackIndex < 0) {\n return null;\n }\n return tracks[currentTrackIndex];\n }\n\n function setTrackByIndex(index) {\n if (!tracks || tracks.length === 0) {\n return;\n }\n // select highest bitrate in case selected index is higher than bitrate list length\n if (index >= tracks.length) {\n index = tracks.length - 1;\n }\n currentTrackIndex = index;\n }\n\n function getThumbnailRequestForTime(time) {\n let currentVoRep;\n const voReps = adapter.getVoRepresentations(mediaInfo);\n for (let i = 0; i < voReps.length; i++) {\n if (tracks[currentTrackIndex].id === voReps[i].id) {\n currentVoRep = voReps[i];\n break;\n }\n }\n\n return indexHandler.getSegmentRequestForTime(mediaInfo, currentVoRep, time);\n }\n\n function reset() {\n tracks = [];\n currentTrackIndex = -1;\n mediaInfo = null;\n }\n\n instance = {\n initialize: initialize,\n getTracks: getTracks,\n reset: reset,\n setTrackByIndex: setTrackByIndex,\n getCurrentTrack: getCurrentTrack,\n getCurrentTrackIndex: getCurrentTrackIndex,\n getThumbnailRequestForTime: getThumbnailRequestForTime\n };\n\n initialize();\n\n return instance;\n}\n\nThumbnailTracks.__dashjs_factory_name = 'ThumbnailTracks';\nexport default FactoryMaker.getClassFactory(ThumbnailTracks);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport Debug from '../../core/Debug';\nimport IsoFile from './IsoFile';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport ISOBoxer from 'codem-isoboxer';\n\nimport IsoBoxSearchInfo from '../vo/IsoBoxSearchInfo';\n\nfunction BoxParser(/*config*/) {\n\n let logger,\n instance;\n let context = this.context;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n /**\n * @param {ArrayBuffer} data\n * @returns {IsoFile|null}\n * @memberof BoxParser#\n */\n function parse(data) {\n if (!data) return null;\n\n if (data.fileStart === undefined) {\n data.fileStart = 0;\n }\n\n let parsedFile = ISOBoxer.parseBuffer(data);\n let dashIsoFile = IsoFile(context).create();\n\n dashIsoFile.setData(parsedFile);\n\n return dashIsoFile;\n }\n\n /**\n * From the list of type boxes to look for, returns the latest one that is fully completed (header + payload). This\n * method only looks into the list of top boxes and doesn't analyze nested boxes.\n * @param {string[]} types\n * @param {ArrayBuffer|uint8Array} buffer\n * @param {number} offset\n * @returns {IsoBoxSearchInfo}\n * @memberof BoxParser#\n */\n function findLastTopIsoBoxCompleted(types, buffer, offset) {\n if (offset === undefined) {\n offset = 0;\n }\n\n // 8 = size (uint32) + type (4 characters)\n if (!buffer || offset + 8 >= buffer.byteLength) {\n return new IsoBoxSearchInfo(0, false);\n }\n\n const data = (buffer instanceof ArrayBuffer) ? new Uint8Array(buffer) : buffer;\n let boxInfo;\n let lastCompletedOffset = 0;\n while (offset < data.byteLength) {\n const boxSize = parseUint32(data, offset);\n const boxType = parseIsoBoxType(data, offset + 4);\n\n if (boxSize === 0) {\n break;\n }\n\n if (offset + boxSize <= data.byteLength) {\n if (types.indexOf(boxType) >= 0) {\n boxInfo = new IsoBoxSearchInfo(offset, true, boxSize);\n } else {\n lastCompletedOffset = offset + boxSize;\n }\n }\n\n offset += boxSize;\n }\n\n if (!boxInfo) {\n return new IsoBoxSearchInfo(lastCompletedOffset, false);\n }\n\n return boxInfo;\n }\n\n function getSamplesInfo(ab) {\n if (!ab || ab.byteLength === 0) {\n return {sampleList: [], lastSequenceNumber: NaN, totalDuration: NaN, numSequences: NaN};\n }\n let isoFile = parse(ab);\n // zero or more moofs\n let moofBoxes = isoFile.getBoxes('moof');\n // exactly one mfhd per moof\n let mfhdBoxes = isoFile.getBoxes('mfhd');\n\n let sampleDuration,\n sampleCompositionTimeOffset,\n sampleCount,\n sampleSize,\n sampleDts,\n sampleList,\n sample,\n i, j, k, l, m, n,\n dataOffset,\n lastSequenceNumber,\n numSequences,\n totalDuration;\n\n numSequences = isoFile.getBoxes('moof').length;\n lastSequenceNumber = mfhdBoxes[mfhdBoxes.length - 1].sequence_number;\n sampleCount = 0;\n\n sampleList = [];\n let subsIndex = -1;\n let nextSubsSample = -1;\n for (l = 0; l < moofBoxes.length; l++) {\n let moofBox = moofBoxes[l];\n // zero or more trafs per moof\n let trafBoxes = moofBox.getChildBoxes('traf');\n for (j = 0; j < trafBoxes.length; j++) {\n let trafBox = trafBoxes[j];\n // exactly one tfhd per traf\n let tfhdBox = trafBox.getChildBox('tfhd');\n // zero or one tfdt per traf\n let tfdtBox = trafBox.getChildBox('tfdt');\n sampleDts = tfdtBox.baseMediaDecodeTime;\n // zero or more truns per traf\n let trunBoxes = trafBox.getChildBoxes('trun');\n // zero or more subs per traf\n let subsBoxes = trafBox.getChildBoxes('subs');\n for (k = 0; k < trunBoxes.length; k++) {\n let trunBox = trunBoxes[k];\n sampleCount = trunBox.sample_count;\n dataOffset = (tfhdBox.base_data_offset || 0) + (trunBox.data_offset || 0);\n\n for (i = 0; i < sampleCount; i++) {\n sample = trunBox.samples[i];\n sampleDuration = (sample.sample_duration !== undefined) ? sample.sample_duration : tfhdBox.default_sample_duration;\n sampleSize = (sample.sample_size !== undefined) ? sample.sample_size : tfhdBox.default_sample_size;\n sampleCompositionTimeOffset = (sample.sample_composition_time_offset !== undefined) ? sample.sample_composition_time_offset : 0;\n let sampleData = {\n 'dts': sampleDts,\n 'cts': (sampleDts + sampleCompositionTimeOffset),\n 'duration': sampleDuration,\n 'offset': moofBox.offset + dataOffset,\n 'size': sampleSize,\n 'subSizes': [sampleSize]\n };\n if (subsBoxes) {\n for (m = 0; m < subsBoxes.length; m++) {\n let subsBox = subsBoxes[m];\n if (subsIndex < (subsBox.entry_count - 1) && i > nextSubsSample) {\n subsIndex++;\n nextSubsSample += subsBox.entries[subsIndex].sample_delta;\n }\n if (i == nextSubsSample) {\n sampleData.subSizes = [];\n let entry = subsBox.entries[subsIndex];\n for (n = 0; n < entry.subsample_count; n++) {\n sampleData.subSizes.push(entry.subsamples[n].subsample_size);\n }\n }\n }\n }\n sampleList.push(sampleData);\n dataOffset += sampleSize;\n sampleDts += sampleDuration;\n }\n }\n totalDuration = sampleDts - tfdtBox.baseMediaDecodeTime;\n }\n }\n return {sampleList: sampleList, lastSequenceNumber: lastSequenceNumber, totalDuration: totalDuration, numSequences: numSequences};\n }\n\n function getMediaTimescaleFromMoov(ab) {\n let isoFile = parse(ab);\n let mdhdBox = isoFile ? isoFile.getBox('mdhd') : undefined;\n\n return mdhdBox ? mdhdBox.timescale : NaN;\n }\n\n function parseUint32(data, offset) {\n return data[offset + 3] >>> 0 |\n (data[offset + 2] << 8) >>> 0 |\n (data[offset + 1] << 16) >>> 0 |\n (data[offset] << 24) >>> 0;\n }\n\n function parseIsoBoxType(data, offset) {\n return String.fromCharCode(data[offset++]) +\n String.fromCharCode(data[offset++]) +\n String.fromCharCode(data[offset++]) +\n String.fromCharCode(data[offset]);\n }\n\n function findInitRange(data) {\n let initRange = null;\n let start,\n end;\n\n const isoFile = parse(data);\n\n if (!isoFile) {\n return initRange;\n }\n\n const ftyp = isoFile.getBox('ftyp');\n const moov = isoFile.getBox('moov');\n\n logger.debug('Searching for initialization.');\n\n if (moov && moov.isComplete) {\n start = ftyp ? ftyp.offset : moov.offset;\n end = moov.offset + moov.size - 1;\n initRange = start + '-' + end;\n\n logger.debug('Found the initialization. Range: ' + initRange);\n }\n\n return initRange;\n }\n\n instance = {\n parse: parse,\n findLastTopIsoBoxCompleted: findLastTopIsoBoxCompleted,\n getMediaTimescaleFromMoov: getMediaTimescaleFromMoov,\n getSamplesInfo: getSamplesInfo,\n findInitRange: findInitRange\n };\n\n setup();\n\n return instance;\n}\nBoxParser.__dashjs_factory_name = 'BoxParser';\nexport default FactoryMaker.getSingletonFactory(BoxParser);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\n\n/**\n * @module DefaultURLUtils\n * @description Provides utility functions for operating on URLs.\n * Initially this is simply a method to determine the Base URL of a URL, but\n * should probably include other things provided all over the place such as\n * determining whether a URL is relative/absolute, resolving two paths etc.\n * @ignore\n */\nfunction DefaultURLUtils() {\n\n let resolveFunction;\n\n const schemeRegex = /^[a-z][a-z0-9+\\-_.]*:/i;\n const httpUrlRegex = /^https?:\\/\\//i;\n const httpsUrlRegex = /^https:\\/\\//i;\n const originRegex = /^([a-z][a-z0-9+\\-_.]*:\\/\\/[^\\/]+)\\/?/i;\n\n /**\n * Resolves a url given an optional base url\n * Uses window.URL to do the resolution.\n *\n * @param {string} url\n * @param {string} [baseUrl]\n * @return {string}\n * @memberof module:DefaultURLUtils\n * @instance\n * @private\n */\n const nativeURLResolver = (url, baseUrl) => {\n try {\n return new window.URL(url, baseUrl).toString();\n } catch (e) {\n return url;\n }\n };\n\n /**\n * Resolves a url given an optional base url\n * Does not resolve ./, ../ etc but will do enough to construct something\n * which will satisfy XHR etc when window.URL is not available ie\n * IE11/node etc.\n *\n * @param {string} url\n * @param {string} [baseUrl]\n * @return {string}\n * @memberof module:DefaultURLUtils\n * @instance\n * @private\n */\n const dumbURLResolver = (url, baseUrl) => {\n let baseUrlParseFunc = parseBaseUrl;\n\n if (!baseUrl) {\n return url;\n }\n\n if (!isRelative(url)) {\n return url;\n }\n\n if (isPathAbsolute(url)) {\n baseUrlParseFunc = parseOrigin;\n }\n\n if (isSchemeRelative(url)) {\n baseUrlParseFunc = parseScheme;\n }\n\n const base = baseUrlParseFunc(baseUrl);\n const joinChar =\n base.charAt(base.length - 1) !== '/' &&\n url.charAt(0) !== '/' ?\n '/' : '';\n\n return [base, url].join(joinChar);\n };\n\n function setup() {\n try {\n const u = new window.URL('x', 'http://y'); //jshint ignore:line\n resolveFunction = nativeURLResolver;\n } catch (e) {\n // must be IE11/Node etc\n } finally {\n resolveFunction = resolveFunction || dumbURLResolver;\n }\n }\n\n /**\n * Returns a string that contains the Base URL of a URL, if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function parseBaseUrl(url) {\n const slashIndex = url.indexOf('/');\n const lastSlashIndex = url.lastIndexOf('/');\n\n if (slashIndex !== -1) {\n // if there is only '//'\n if (lastSlashIndex === slashIndex + 1) {\n return url;\n }\n\n if (url.indexOf('?') !== -1) {\n url = url.substring(0, url.indexOf('?'));\n }\n\n return url.substring(0, lastSlashIndex + 1);\n }\n\n return '';\n }\n\n /**\n * Returns a string that contains the scheme and origin of a URL,\n * if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function parseOrigin(url) {\n const matches = url.match(originRegex);\n\n if (matches) {\n return matches[1];\n }\n\n return '';\n }\n\n /**\n * Returns a string that contains the fragment of a URL without scheme,\n * if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function removeHostname(url) {\n let urlParts = /^(?:\\w+\\:\\/\\/)?([^\\/]+)(.*)$/.exec(url); //[1] = host / [2] = path\n return urlParts[2].substring(1);\n }\n\n /**\n * Returns a string that contains the scheme of a URL, if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function parseScheme(url) {\n const matches = url.match(schemeRegex);\n\n if (matches) {\n return matches[0];\n }\n\n return '';\n }\n\n /**\n * Determines whether the url is relative.\n * @return {boolean}\n * @param {string} url\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function isRelative(url) {\n return !schemeRegex.test(url);\n }\n\n /**\n * Determines whether the url is path-absolute.\n * @return {bool}\n * @param {string} url\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function isPathAbsolute(url) {\n return isRelative(url) && url.charAt(0) === '/';\n }\n\n /**\n * Determines whether the url is scheme-relative.\n * @return {bool}\n * @param {string} url\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function isSchemeRelative(url) {\n return url.indexOf('//') === 0;\n }\n\n /**\n * Determines whether the url is an HTTP-URL as defined in ISO/IEC\n * 23009-1:2014 3.1.15. ie URL with a fixed scheme of http or https\n * @return {bool}\n * @param {string} url\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function isHTTPURL(url) {\n return httpUrlRegex.test(url);\n }\n\n /**\n * Determines whether the supplied url has https scheme\n * @return {bool}\n * @param {string} url\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function isHTTPS(url) {\n return httpsUrlRegex.test(url);\n }\n\n /**\n * Resolves a url given an optional base url\n * @return {string}\n * @param {string} url\n * @param {string} [baseUrl]\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function resolve(url, baseUrl) {\n return resolveFunction(url, baseUrl);\n }\n\n setup();\n\n const instance = {\n parseBaseUrl: parseBaseUrl,\n parseOrigin: parseOrigin,\n parseScheme: parseScheme,\n isRelative: isRelative,\n isPathAbsolute: isPathAbsolute,\n isSchemeRelative: isSchemeRelative,\n isHTTPURL: isHTTPURL,\n isHTTPS: isHTTPS,\n removeHostname: removeHostname,\n resolve: resolve\n };\n\n return instance;\n}\n\nDefaultURLUtils.__dashjs_factory_name = 'DefaultURLUtils';\nexport default FactoryMaker.getSingletonFactory(DefaultURLUtils);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport IsoBox from '../vo/IsoBox';\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction IsoFile() {\n\n let instance,\n parsedIsoFile;\n\n /**\n * @param {string} type\n * @returns {IsoBox|null}\n * @memberof IsoFile#\n */\n function getBox(type) {\n if (!type || !parsedIsoFile || !parsedIsoFile.boxes || (parsedIsoFile.boxes.length === 0) || typeof parsedIsoFile.fetch !== 'function') return null;\n\n return convertToDashIsoBox(parsedIsoFile.fetch(type));\n }\n\n /**\n * @param {string} type\n * @returns {Array|null} array of {@link IsoBox}\n * @memberof IsoFile#\n */\n function getBoxes(type) {\n let boxes = [];\n\n if (!type || !parsedIsoFile || typeof parsedIsoFile.fetchAll !== 'function') {\n return boxes;\n }\n\n let boxData = parsedIsoFile.fetchAll(type);\n let box;\n\n for (let i = 0, ln = boxData.length; i < ln; i++) {\n box = convertToDashIsoBox(boxData[i]);\n\n if (box) {\n boxes.push(box);\n }\n }\n\n return boxes;\n }\n\n /**\n * @param {string} value\n * @memberof IsoFile#\n */\n function setData(value) {\n parsedIsoFile = value;\n }\n\n /**\n * @returns {IsoBox|null}\n * @memberof IsoFile#\n */\n function getLastBox() {\n if (!parsedIsoFile || !parsedIsoFile.boxes || !parsedIsoFile.boxes.length) return null;\n\n let type = parsedIsoFile.boxes[parsedIsoFile.boxes.length - 1].type;\n let boxes = getBoxes(type);\n\n return boxes.length > 0 ? boxes[boxes.length - 1] : null;\n }\n\n function convertToDashIsoBox(boxData) {\n if (!boxData) return null;\n\n let box = new IsoBox(boxData);\n\n if (boxData.hasOwnProperty('_incomplete')) {\n box.isComplete = !boxData._incomplete;\n }\n\n return box;\n }\n\n instance = {\n getBox: getBox,\n getBoxes: getBoxes,\n setData: setData,\n getLastBox: getLastBox\n };\n\n return instance;\n}\nIsoFile.__dashjs_factory_name = 'IsoFile';\nexport default FactoryMaker.getClassFactory(IsoFile);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport deepEqual from 'fast-deep-equal';\n\n/**\n * @module ObjectUtils\n * @ignore\n * @description Provides utility functions for objects\n */\nfunction ObjectUtils() {\n\n let instance;\n\n /**\n * Returns true if objects are equal\n * @return {boolean}\n * @param {object} obj1\n * @param {object} obj2\n * @memberof module:ObjectUtils\n * @instance\n */\n function areEqual(obj1, obj2) {\n return deepEqual(obj1, obj2);\n }\n\n instance = {\n areEqual: areEqual\n };\n\n return instance;\n}\n\nObjectUtils.__dashjs_factory_name = 'ObjectUtils';\nexport default FactoryMaker.getSingletonFactory(ObjectUtils);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction RequestModifier() {\n\n let instance;\n\n function modifyRequestURL(url) {\n return url;\n }\n\n function modifyRequestHeader(request) {\n return request;\n }\n\n instance = {\n modifyRequestURL: modifyRequestURL,\n modifyRequestHeader: modifyRequestHeader\n };\n\n return instance;\n}\n\nRequestModifier.__dashjs_factory_name = 'RequestModifier';\nexport default FactoryMaker.getSingletonFactory(RequestModifier);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport DefaultURLUtils from './DefaultURLUtils';\n\n/**\n * @module URLUtils\n * @ignore\n * @description Provides utility functions for operating on URLs.\n * Initially this is simply a method to determine the Base URL of a URL, but\n * should probably include other things provided all over the place such as\n * determining whether a URL is relative/absolute, resolving two paths etc.\n */\nfunction URLUtils() {\n\n let instance;\n let defaultURLUtils;\n let regexUtils = [];\n const context = this.context;\n\n function getUtils(url) {\n let i;\n for (i = 0; i < regexUtils.length; i++) {\n let regex = regexUtils[i].regex;\n if (regex.test(url)) {\n return regexUtils[i].utils;\n }\n }\n return defaultURLUtils;\n }\n\n function setup() {\n defaultURLUtils = DefaultURLUtils(context).getInstance();\n }\n\n /**\n * Register a module to handle specific url.\n * @param {regex} regex - url regex\n * @param {object} utils - object that handles the regex\n * @memberof module:URLUtils\n * @instance\n */\n function registerUrlRegex(regex, utils) {\n regexUtils.push({regex: regex, utils: utils});\n }\n\n function internalCall(functionName, url, baseUrl) {\n let utils = getUtils(baseUrl || url);\n return utils && typeof (utils[functionName]) === 'function' ? utils[functionName](url, baseUrl) : defaultURLUtils[functionName](url, baseUrl);\n }\n\n /**\n * Returns a string that contains the Base URL of a URL, if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:URLUtils\n * @instance\n */\n function parseBaseUrl(url) {\n return internalCall('parseBaseUrl', url);\n }\n\n /**\n * Returns a string that contains the scheme and origin of a URL,\n * if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:URLUtils\n * @instance\n */\n function parseOrigin(url) {\n return internalCall('parseOrigin', url);\n }\n\n /**\n * Returns a string that contains the fragment of a URL without scheme,\n * if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:URLUtils\n * @instance\n */\n function removeHostname(url) {\n return internalCall('removeHostname', url);\n }\n\n /**\n * Returns a string that contains the scheme of a URL, if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:URLUtils\n * @instance\n */\n function parseScheme(url) {\n return internalCall('parseScheme', url);\n }\n\n /**\n * Determines whether the url is relative.\n * @return {boolean}\n * @param {string} url\n * @memberof module:URLUtils\n * @instance\n */\n function isRelative(url) {\n return internalCall('isRelative', url);\n }\n\n /**\n * Determines whether the url is path-absolute.\n * @return {bool}\n * @param {string} url\n * @memberof module:URLUtils\n * @instance\n */\n function isPathAbsolute(url) {\n return internalCall('isPathAbsolute', url);\n }\n\n /**\n * Determines whether the url is scheme-relative.\n * @return {bool}\n * @param {string} url\n * @memberof module:URLUtils\n * @instance\n */\n function isSchemeRelative(url) {\n return internalCall('isSchemeRelative', url);\n }\n\n /**\n * Determines whether the url is an HTTP-URL as defined in ISO/IEC\n * 23009-1:2014 3.1.15. ie URL with a fixed scheme of http or https\n * @return {bool}\n * @param {string} url\n * @memberof module:URLUtils\n * @instance\n */\n function isHTTPURL(url) {\n return internalCall('isHTTPURL', url);\n }\n\n /**\n * Determines whether the supplied url has https scheme\n * @return {bool}\n * @param {string} url\n * @memberof module:URLUtils\n * @instance\n */\n function isHTTPS(url) {\n return internalCall('isHTTPS', url);\n }\n\n /**\n * Resolves a url given an optional base url\n * @return {string}\n * @param {string} url\n * @param {string} [baseUrl]\n * @memberof module:URLUtils\n * @instance\n */\n function resolve(url, baseUrl) {\n return internalCall('resolve', url, baseUrl);\n }\n\n setup();\n instance = {\n registerUrlRegex: registerUrlRegex,\n parseBaseUrl: parseBaseUrl,\n parseOrigin: parseOrigin,\n parseScheme: parseScheme,\n isRelative: isRelative,\n isPathAbsolute: isPathAbsolute,\n isSchemeRelative: isSchemeRelative,\n isHTTPURL: isHTTPURL,\n isHTTPS: isHTTPS,\n removeHostname: removeHostname,\n resolve: resolve\n };\n\n return instance;\n}\n\nURLUtils.__dashjs_factory_name = 'URLUtils';\nconst factory = FactoryMaker.getSingletonFactory(URLUtils);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass DashJSError {\n constructor(code, message, data) {\n this.code = code || null;\n this.message = message || null;\n this.data = data || null;\n }\n}\n\nexport default DashJSError;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { HTTPRequest } from '../vo/metrics/HTTPRequest';\n\n/**\n * @class\n * @ignore\n */\nclass FragmentRequest {\n constructor(url) {\n this.action = FragmentRequest.ACTION_DOWNLOAD;\n this.startTime = NaN;\n this.mediaType = null;\n this.mediaInfo = null;\n this.type = null;\n this.duration = NaN;\n this.timescale = NaN;\n this.range = null;\n this.url = url || null;\n this.serviceLocation = null;\n this.requestStartDate = null;\n this.firstByteDate = null;\n this.requestEndDate = null;\n this.quality = NaN;\n this.index = NaN;\n this.availabilityStartTime = null;\n this.availabilityEndTime = null;\n this.wallStartTime = null;\n this.bytesLoaded = NaN;\n this.bytesTotal = NaN;\n this.delayLoadingTime = NaN;\n this.responseType = 'arraybuffer';\n this.representationId = null;\n }\n\n isInitializationRequest() {\n return (this.type && this.type === HTTPRequest.INIT_SEGMENT_TYPE);\n }\n\n setInfo(info) {\n this.type = info && info.init ? HTTPRequest.INIT_SEGMENT_TYPE : HTTPRequest.MEDIA_SEGMENT_TYPE;\n this.url = info && info.url ? info.url : null;\n this.range = info && info.range ? info.range.start + '-' + info.range.end : null;\n this.mediaType = info && info.mediaType ? info.mediaType : null;\n }\n}\n\nFragmentRequest.ACTION_DOWNLOAD = 'download';\nFragmentRequest.ACTION_COMPLETE = 'complete';\n\nexport default FragmentRequest;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nimport FragmentRequest from './FragmentRequest';\n\nclass HeadRequest extends FragmentRequest {\n constructor(url) {\n super(url);\n this.checkForExistenceOnly = true;\n }\n}\n\nexport default HeadRequest;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass IsoBox {\n constructor(boxData) {\n this.offset = boxData._offset;\n this.type = boxData.type;\n this.size = boxData.size;\n this.boxes = [];\n if (boxData.boxes) {\n for (let i = 0; i < boxData.boxes.length; i++) {\n this.boxes.push(new IsoBox(boxData.boxes[i]));\n }\n }\n this.isComplete = true;\n\n switch (boxData.type) {\n case 'sidx':\n this.timescale = boxData.timescale;\n this.earliest_presentation_time = boxData.earliest_presentation_time;\n this.first_offset = boxData.first_offset;\n this.references = boxData.references;\n if (boxData.references) {\n this.references = [];\n for (let i = 0; i < boxData.references.length; i++) {\n let reference = {\n reference_type: boxData.references[i].reference_type,\n referenced_size: boxData.references[i].referenced_size,\n subsegment_duration: boxData.references[i].subsegment_duration\n };\n this.references.push(reference);\n }\n }\n break;\n case 'emsg':\n this.id = boxData.id;\n this.value = boxData.value;\n this.timescale = boxData.timescale;\n this.scheme_id_uri = boxData.scheme_id_uri;\n this.presentation_time_delta = boxData.version === 1 ? boxData.presentation_time : boxData.presentation_time_delta;\n this.event_duration = boxData.event_duration;\n this.message_data = boxData.message_data;\n break;\n case 'mdhd':\n this.timescale = boxData.timescale;\n break;\n case 'mfhd':\n this.sequence_number = boxData.sequence_number;\n break;\n case 'subs':\n this.entry_count = boxData.entry_count;\n this.entries = boxData.entries;\n break;\n case 'tfhd':\n this.base_data_offset = boxData.base_data_offset;\n this.sample_description_index = boxData.sample_description_index;\n this.default_sample_duration = boxData.default_sample_duration;\n this.default_sample_size = boxData.default_sample_size;\n this.default_sample_flags = boxData.default_sample_flags;\n this.flags = boxData.flags;\n break;\n case 'tfdt':\n this.version = boxData.version;\n this.baseMediaDecodeTime = boxData.baseMediaDecodeTime;\n this.flags = boxData.flags;\n break;\n case 'trun':\n this.sample_count = boxData.sample_count;\n this.first_sample_flags = boxData.first_sample_flags;\n this.data_offset = boxData.data_offset;\n this.flags = boxData.flags;\n this.samples = boxData.samples;\n if (boxData.samples) {\n this.samples = [];\n for (let i = 0, ln = boxData.samples.length; i < ln; i++) {\n let sample = {\n sample_size: boxData.samples[i].sample_size,\n sample_duration: boxData.samples[i].sample_duration,\n sample_composition_time_offset: boxData.samples[i].sample_composition_time_offset\n };\n this.samples.push(sample);\n }\n }\n break;\n }\n\n }\n\n getChildBox(type) {\n for (let i = 0; i < this.boxes.length; i++) {\n if (this.boxes[i].type === type) {\n return this.boxes[i];\n }\n }\n }\n\n getChildBoxes(type) {\n let boxes = [];\n for (let i = 0; i < this.boxes.length; i++) {\n if (this.boxes[i].type === type) {\n boxes.push(this.boxes[i]);\n }\n }\n return boxes;\n }\n\n}\n\nexport default IsoBox;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass IsoBoxSearchInfo {\n constructor(lastCompletedOffset, found, size) {\n this.lastCompletedOffset = lastCompletedOffset;\n this.found = found;\n this.size = size;\n }\n}\n\nexport default IsoBoxSearchInfo;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass ThumbnailTrackInfo {\n constructor() {\n this.bitrate = 0;\n this.width = 0;\n this.height = 0;\n this.tilesHor = 0;\n this.tilesVert = 0;\n this.widthPerTile = 0;\n this.heightPerTile = 0;\n this.startNumber = 0;\n this.segmentDuration = 0;\n this.timescale = 0;\n this.templateUrl = '';\n this.id = '';\n }\n}\n\nexport default ThumbnailTrackInfo;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc This Object holds reference to the HTTPRequest for manifest, fragment and xlink loading.\n * Members which are not defined in ISO23009-1 Annex D should be prefixed by a _ so that they are ignored\n * by Metrics Reporting code.\n * @ignore\n */\nclass HTTPRequest {\n /**\n * @class\n */\n constructor() {\n /**\n * Identifier of the TCP connection on which the HTTP request was sent.\n * @public\n */\n this.tcpid = null;\n /**\n * This is an optional parameter and should not be included in HTTP request/response transactions for progressive download.\n * The type of the request:\n * - MPD\n * - XLink expansion\n * - Initialization Fragment\n * - Index Fragment\n * - Media Fragment\n * - Bitstream Switching Fragment\n * - other\n * @public\n */\n this.type = null;\n /**\n * The original URL (before any redirects or failures)\n * @public\n */\n this.url = null;\n /**\n * The actual URL requested, if different from above\n * @public\n */\n this.actualurl = null;\n /**\n * The contents of the byte-range-spec part of the HTTP Range header.\n * @public\n */\n this.range = null;\n /**\n * Real-Time | The real time at which the request was sent.\n * @public\n */\n this.trequest = null;\n /**\n * Real-Time | The real time at which the first byte of the response was received.\n * @public\n */\n this.tresponse = null;\n /**\n * The HTTP response code.\n * @public\n */\n this.responsecode = null;\n /**\n * The duration of the throughput trace intervals (ms), for successful requests only.\n * @public\n */\n this.interval = null;\n /**\n * Throughput traces, for successful requests only.\n * @public\n */\n this.trace = [];\n\n /**\n * Type of stream (\"audio\" | \"video\" etc..)\n * @public\n */\n this._stream = null;\n /**\n * Real-Time | The real time at which the request finished.\n * @public\n */\n this._tfinish = null;\n /**\n * The duration of the media requests, if available, in milliseconds.\n * @public\n */\n this._mediaduration = null;\n /**\n * The media segment quality\n * @public\n */\n this._quality = null;\n /**\n * all the response headers from request.\n * @public\n */\n this._responseHeaders = null;\n /**\n * The selected service location for the request. string.\n * @public\n */\n this._serviceLocation = null;\n }\n}\n\n/**\n * @classdesc This Object holds reference to the progress of the HTTPRequest.\n * @ignore\n */\nclass HTTPRequestTrace {\n /**\n * @class\n */\n constructor() {\n /**\n * Real-Time | Measurement stream start.\n * @public\n */\n this.s = null;\n /**\n * Measurement stream duration (ms).\n * @public\n */\n this.d = null;\n /**\n * List of integers counting the bytes received in each trace interval within the measurement stream.\n * @public\n */\n this.b = [];\n }\n}\n\nHTTPRequest.GET = 'GET';\nHTTPRequest.HEAD = 'HEAD';\nHTTPRequest.MPD_TYPE = 'MPD';\nHTTPRequest.XLINK_EXPANSION_TYPE = 'XLinkExpansion';\nHTTPRequest.INIT_SEGMENT_TYPE = 'InitializationSegment';\nHTTPRequest.INDEX_SEGMENT_TYPE = 'IndexSegment';\nHTTPRequest.MEDIA_SEGMENT_TYPE = 'MediaSegment';\nHTTPRequest.BITSTREAM_SWITCHING_SEGMENT_TYPE = 'BitstreamSwitchingSegment';\nHTTPRequest.OTHER_TYPE = 'other';\n\nexport { HTTPRequest, HTTPRequestTrace };\n"],"names":["r","e","n","t","o","i","f","c","require","u","a","Error","code","p","exports","call","length","1","_dereq_","module","config","undefined","escapeMode","attributePrefix","arrayAccessForm","emptyNodeForm","enableToStringFunc","arrayAccessFormPaths","skipEmptyTextNodesForObj","stripWhitespaces","datetimeAccessFormPaths","useDoubleQuotes","xmlElementsFilter","jsonPropertiesFilter","keepCData","ignoreRoot","initConfigDefaults","DOMNodeTypes","ELEMENT_NODE","TEXT_NODE","CDATA_SECTION_NODE","COMMENT_NODE","DOCUMENT_NODE","getNodeLocalName","node","nodeLocalName","localName","baseName","nodeName","escapeXmlChars","str","replace","checkInStdFiltersArrayForm","stdFiltersArrayForm","obj","name","path","idx","filterPath","RegExp","test","toArrayAccessForm","childName","Array","fromXmlDateTime","prop","offsetMinutes","bits","split","d","Date","secondBits","setHours","setMilliseconds","Number","setMinutes","getMinutes","getTimezoneOffset","indexOf","UTC","getFullYear","getMonth","getDate","getHours","getSeconds","getMilliseconds","parseDOMChildren","nodeType","result","Object","nodeChildren","childNodes","cidx","child","__cnt","children","childPath","childType","push","__children","aidx","attributes","attr","value2","value","m","ml","matchers","matchobj","converter","nodePrefix","prefix","__prefix","__text","join","trim","fullPath","checkFromXmlDateTimePaths","__cdata","toString","this","nodeValue","startTag","jsonObj","element","attrList","closed","resultStr","attrName","attrVal","substr","endTag","elementName","jsonXmlSpecialElem","jsonObjField","suffix","Function","jsonXmlElemCount","elementsCnt","it","parseJSONAttributes","ait","parseJSONTextObject","jsonTxtObj","getJsonPropertyPath","jsonObjPath","jsonPropName","parseJSONObject","subObj","propertyName","jsonArrRoot","jsonArrObj","arIdx","parseJSONArray","toISOString","parseXmlString","xmlDocStr","xmlDoc","window","ActiveXObject","DOMParser","parser","parseFromString","getElementsByTagNameNS","err","async","loadXML","asArray","toXmlDateTime","dt","asDateTime","xml2json","xml_str2json","json2xml_str","json2xml","getVersion","ISOBoxer","parseBuffer","arrayBuffer","ISOFile","parse","addBoxProcessor","type","ISOBox","prototype","_boxProcessors","createFile","createBox","parent","pos","newBox","create","append","createFullBox","version","flags","Utils","dataViewToString","dataView","encoding","impliedEncoding","TextDecoder","decode","byteLength","getUint8","String","fromCharCode","utf8ToByteArray","string","TextEncoder","encode","charCodeAt","appendBox","box","_offset","_cursor","offset","_root","_raw","_parent","index","boxes","splice","Cursor","initialOffset","DataView","fetch","fetchAll","returnEarly","_sweep","write","getLength","bytes","Uint8Array","_rawo","buffer","_parseBox","byteOffset","_boxContainers","_procField","size","_parsing","_readField","_writeField","_procFieldArray","_procFullBox","_procEntries","fn","_procSubEntries","entry","_procEntryField","_procSubBoxes","_readUint","_readInt","_readTemplate","_readTerminatedString","_readString","_readData","_readUTF8String","getInt8","getInt16","getInt32","s1","s2","Math","pow","getUint16","getUint32","char","data","_incomplete","largesize","_parseContainerBox","_data","_parseFullBox","_writeData","_writeInt","setInt8","setInt16","setInt32","floor","setUint32","_writeUint","setUint8","setUint16","_writeString","_writeTerminatedString","_writeTemplate","pre","post","set","_writeUTF8String","entry_count","nbCompatibleBrands","language","DataSize","sample_count","reference_count","reference","reference_type","referenced_size","sap","starts_with_SAP","SAP_type","SAP_delta_time","subsegment_count","subsegment","ranges_count","range","subsample_count","subsample","reserved","length_size_of_traf_num","length_size_of_trun_num","length_size_of_sample_num","number_of_entry","sample","isArray","keyList","keys","hasProp","hasOwnProperty","equal","b","key","arrA","arrB","dateA","dateB","getTime","regexpA","regexpB","XmlEntities","Html4Entities","Html5Entities","AllHtmlEntities","HTML_ALPHA","HTML_CODES","alphaIndex","numIndex","s","entity","chr","charAt","toLowerCase","parseInt","isNaN","strLength","alpha","encodeNonUTF","cc","encodeNonASCII","ENTITIES","charIndex","charInfo","_results","chr2","chars","addChar","createIndexes","ALPHA_INDEX","<",">",""","&apos","&","<",">",""","'","&","CHAR_INDEX","60","62","34","39","38","CHAR_S_INDEX","<",">","\"","'","&","strLenght","define","amd","global","self","localforage","l","called","observer","channel","draining","Mutation","MutationObserver","WebKitMutationObserver","scheduleDrain","nextTick","document","createTextNode","observe","characterData","setImmediate","MessageChannel","createElement","scriptEl","onreadystatechange","parentNode","removeChild","documentElement","appendChild","setTimeout","port1","onmessage","port2","postMessage","queue","oldQueue","len","task","2","immediate","INTERNAL","handlers","REJECTED","FULFILLED","PENDING","Promise","resolver","TypeError","state","outcome","safelyResolveThenable","QueueItem","promise","onFulfilled","onRejected","callFulfilled","otherCallFulfilled","callRejected","otherCallRejected","unwrap","func","returnValue","reject","resolve","getThen","then","apply","arguments","thenable","onError","onSuccess","tryCatch","status","out","constructor","error","reason","all","iterable","values","resolved","outValue","allResolver","race","response","3","4","_typeof","Symbol","iterator","idb","indexedDB","webkitIndexedDB","mozIndexedDB","OIndexedDB","msIndexedDB","getIDB","createBlob","parts","properties","Blob","builder","BlobBuilder","MSBlobBuilder","MozBlobBuilder","WebKitBlobBuilder","getBlob","Promise$1","executeCallback","callback","executeTwoCallbacks","errorCallback","normalizeKey","console","warn","getCallback","DETECT_BLOB_SUPPORT_STORE","supportsBlobs","dbContexts","READ_ONLY","READ_WRITE","_checkBlobSupport","txn","transaction","blob","objectStore","put","onabort","preventDefault","stopPropagation","oncomplete","matchedChrome","navigator","userAgent","match","matchedEdge","_deferReadiness","dbInfo","dbContext","deferredOperation","deferredOperations","dbReady","_advanceReadiness","pop","_rejectReadiness","_getConnection","upgradeNeeded","createDbContext","db","close","dbArgs","openreq","open","onupgradeneeded","createObjectStore","storeName","oldVersion","ex","newVersion","onerror","onsuccess","_getOriginalConnection","_getUpgradedConnection","_isUpgradeNeeded","defaultVersion","incVersion","isNewStore","objectStoreNames","contains","isDowngrade","isUpgrade","_decodeBlob","encodedBlob","bin","buf","ArrayBuffer","arr","_binStringToArrayBuffer","atob","_isEncodedBlob","__local_forage_encoded_blob","_fullyReady","_initReady","_dbInfo","createTransaction","mode","retries","tx","forages","forage","_tryReconnect","asyncStorage","_driver","_initStorage","options","ready","initPromises","ignoreErrors","j","slice","_defaultConfig","k","_support","isSafari","openDatabase","platform","hasFetch","IDBKeyRange","isIndexedDBValid","iterate","req","openCursor","iterationNumber","cursor","getItem","get","setItem","blobSupport","reader","FileReader","onloadend","base64","btoa","target","readAsBinaryString","store","removeItem","clear","count","advanced","advance","dropInstance","dbPromise","currentConfig","deleteObjectStore","_forage2","deleteDatabase","onblocked","BASE_CHARS","BLOB_TYPE_PREFIX_REGEX","SERIALIZED_MARKER","SERIALIZED_MARKER_LENGTH","TYPE_ARRAYBUFFER","TYPE_BLOB","TYPE_SERIALIZED_MARKER_LENGTH","toString$1","stringToBuffer","serializedString","encoded1","encoded2","encoded3","encoded4","bufferLength","bufferToString","base64String","substring","localforageSerializer","serialize","valueType","marker","fileReader","onload","readAsArrayBuffer","JSON","stringify","deserialize","matcher","blobType","Int8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","createDbTable","executeSql","tryExecuteSql","sqlStatement","args","SYNTAX_ERR","results","rows","_setItem","retriesLeft","originalValue","serializer","sqlError","QUOTA_ERR","webSQLStorage","dbInfoPromise","description","item","storeNames","operationInfo","operations","dropTable","_getKeyPrefix","defaultConfig","keyPrefix","_isLocalStorageUsable","localStorageTestKey","localStorage","checkIfLocalStorageThrows","includes","array","searchElement","x","y","localStorageWrapper","isLocalStorageValid","keyPrefixLength","itemKey","arg","DefinedDrivers","DriverSupport","DefaultDrivers","INDEXEDDB","WEBSQL","LOCALSTORAGE","DefaultDriverOrder","OptionalDriverMethods","LibraryMethods","concat","DefaultConfig","driver","extend","_key","LocalForage","driverTypeKey","instance","Constructor","_classCallCheck","driverName","defineDriver","_config","_driverSet","_initDriver","_ready","_wrapLibraryMethodsWithReady","setDriver","localforage_js","driverObject","complianceError","driverMethods","driverMethodName","_i","_len","optionalDriverMethod","methodName","methodNotImplementedFactory","configureMissingMethods","setDriverSupport","support","info","getDriver","getDriverPromise","getSerializer","serializerPromise","drivers","supportedDrivers","_getSupportedDrivers","setDriverToConfig","extendSelfWithDriver","_extend","initDriver","currentDriverIndex","driverPromiseLoop","oldDriverSetDone","supports","libraryMethodsAndProperties","localForageInstance","libraryMethod","_args","callWhenReady","createInstance","LOG_LEVEL_FATAL","LOG_LEVEL_ERROR","LOG_LEVEL_WARNING","LOG_LEVEL_INFO","LOG_LEVEL_DEBUG","Debug","context","eventBus","_EventBus2","getInstance","settings","logFn","showLogTimestamp","showCalleeName","startTime","getLogFn","bind","log","doLog","level","_this","logTime","message","getClassName","getType","params","_len6","_key6","forEach","debug","logLevel","trigger","_eventsEvents2","LOG","getLogger","fatal","_len2","_key2","_len3","_key3","_len4","_key4","_len5","_key5","setLogTimestampVisible","setCalleeNameVisible","__dashjs_factory_name","factory","_FactoryMaker2","getSingletonFactory","LOG_LEVEL_NONE","updateSingletonFactory","EventBus","getHandlerIdx","listener","scope","some","on","handler","priority","off","payload","filter","reset","EVENT_PRIORITY_LOW","EVENT_PRIORITY_HIGH","singletonContexts","singletonFactories","classFactories","FactoryMaker","childInstance","override","getSingletonInstance","setSingletonInstance","className","classConstructor","getFactoryByName","merge","getSingletonFactoryByName","updateFactory","getClassFactory","getClassFactoryByName","updateClassFactory","factoriesArray","classInstance","extensionObject","extension","Settings","defaultSettings","_coreDebug2","streaming","metricsMaxListDepth","abandonLoadTimeout","liveDelayFragmentCount","NaN","liveDelay","scheduleWhilePaused","fastSwitchEnabled","bufferPruningInterval","bufferToKeep","bufferAheadToKeep","jumpGaps","smallGapLimit","stableBufferTime","bufferTimeAtTopQuality","bufferTimeAtTopQualityLongForm","longFormContentDurationThreshold","wallclockTimeUpdateInterval","lowLatencyEnabled","keepProtectionMediaKeys","useManifestDateHeaderTimeSource","useSuggestedPresentationDelay","useAppendWindowEnd","manifestUpdateRetryInterval","liveCatchUpMinDrift","liveCatchUpMaxDrift","liveCatchUpPlaybackRate","liveCatchupLatencyThreshold","lastBitrateCachingInfo","enabled","ttl","lastMediaSettingsCachingInfo","cacheLoadThresholds","video","audio","retryIntervals","_defineProperty","_retryIntervals","_streamingVoMetricsHTTPRequest","HTTPRequest","MPD_TYPE","XLINK_EXPANSION_TYPE","MEDIA_SEGMENT_TYPE","INIT_SEGMENT_TYPE","BITSTREAM_SWITCHING_SEGMENT_TYPE","INDEX_SEGMENT_TYPE","OTHER_TYPE","retryAttempts","_retryAttempts","abr","movingAverageMethod","_streamingConstantsConstants2","MOVING_AVERAGE_SLIDING_WINDOW","ABRStrategy","ABR_STRATEGY_DYNAMIC","bandwidthSafetyFactor","useDefaultABRRules","useBufferOccupancyABR","useDeadTimeLatency","limitBitrateByPortal","usePixelRatioInLimitBitrateByPortal","maxBitrate","minBitrate","maxRepresentationRatio","initialBitrate","initialRepresentationRatio","autoSwitchBitrate","cmcd","sid","cid","did","_UtilsJs2","clone","update","settingsObj","mixinSettings","source","dest","copy","empty","_name","mixin","src","url","modifiedUrl","URL","param","searchParams","href","random","hash","VERSION","Errors","_get","getPrototypeOf","MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE","MANIFEST_LOADER_LOADING_FAILURE_ERROR_CODE","XLINK_LOADER_LOADING_FAILURE_ERROR_CODE","SEGMENTS_UPDATE_FAILED_ERROR_CODE","SEGMENTS_UNAVAILABLE_ERROR_CODE","SEGMENT_BASE_LOADER_ERROR_CODE","TIME_SYNC_FAILED_ERROR_CODE","FRAGMENT_LOADER_LOADING_FAILURE_ERROR_CODE","FRAGMENT_LOADER_NULL_REQUEST_ERROR_CODE","URL_RESOLUTION_FAILED_GENERIC_ERROR_CODE","APPEND_ERROR_CODE","REMOVE_ERROR_CODE","DATA_UPDATE_FAILED_ERROR_CODE","CAPABILITY_MEDIASOURCE_ERROR_CODE","CAPABILITY_MEDIAKEYS_ERROR_CODE","DOWNLOAD_ERROR_ID_MANIFEST_CODE","DOWNLOAD_ERROR_ID_SIDX_CODE","DOWNLOAD_ERROR_ID_CONTENT_CODE","DOWNLOAD_ERROR_ID_INITIALIZATION_CODE","DOWNLOAD_ERROR_ID_XLINK_CODE","MANIFEST_ERROR_ID_CODEC_CODE","MANIFEST_ERROR_ID_PARSE_CODE","MANIFEST_ERROR_ID_NOSTREAMS_CODE","TIMED_TEXT_ERROR_ID_PARSE_CODE","MANIFEST_ERROR_ID_MULTIPLEXED_CODE","MEDIASOURCE_TYPE_UNSUPPORTED_CODE","MANIFEST_LOADER_PARSING_FAILURE_ERROR_MESSAGE","MANIFEST_LOADER_LOADING_FAILURE_ERROR_MESSAGE","XLINK_LOADER_LOADING_FAILURE_ERROR_MESSAGE","SEGMENTS_UPDATE_FAILED_ERROR_MESSAGE","SEGMENTS_UNAVAILABLE_ERROR_MESSAGE","SEGMENT_BASE_LOADER_ERROR_MESSAGE","TIME_SYNC_FAILED_ERROR_MESSAGE","FRAGMENT_LOADER_NULL_REQUEST_ERROR_MESSAGE","URL_RESOLUTION_FAILED_GENERIC_ERROR_MESSAGE","APPEND_ERROR_MESSAGE","REMOVE_ERROR_MESSAGE","DATA_UPDATE_FAILED_ERROR_MESSAGE","CAPABILITY_MEDIASOURCE_ERROR_MESSAGE","CAPABILITY_MEDIAKEYS_ERROR_MESSAGE","TIMED_TEXT_ERROR_MESSAGE_PARSE","MEDIASOURCE_TYPE_UNSUPPORTED_MESSAGE","errors","ErrorsBase","publicOnly","CoreEvents","BUFFERING_COMPLETED","BUFFER_CLEARED","BUFFER_LEVEL_UPDATED","BYTES_APPENDED","BYTES_APPENDED_END_FRAGMENT","CHECK_FOR_EXISTENCE_COMPLETED","CURRENT_TRACK_CHANGED","DATA_UPDATE_COMPLETED","DATA_UPDATE_STARTED","INBAND_EVENTS","INITIALIZATION_LOADED","INIT_FRAGMENT_LOADED","INIT_FRAGMENT_NEEDED","INTERNAL_MANIFEST_LOADED","ORIGINAL_MANIFEST_LOADED","LIVE_EDGE_SEARCH_COMPLETED","LOADING_COMPLETED","LOADING_PROGRESS","LOADING_DATA_PROGRESS","LOADING_ABANDONED","MANIFEST_UPDATED","MEDIA_FRAGMENT_LOADED","MEDIA_FRAGMENT_NEEDED","QUOTA_EXCEEDED","REPRESENTATION_UPDATE_STARTED","REPRESENTATION_UPDATE_COMPLETED","SEGMENTS_LOADED","SERVICE_LOCATION_BLACKLIST_ADD","SERVICE_LOCATION_BLACKLIST_CHANGED","SOURCEBUFFER_REMOVE_COMPLETED","STREAMS_COMPOSED","STREAM_BUFFERING_COMPLETED","STREAM_COMPLETED","TEXT_TRACKS_QUEUE_INITIALIZED","TIME_SYNCHRONIZATION_COMPLETED","URL_RESOLUTION_FAILED","VIDEO_CHUNK_RECEIVED","WALLCLOCK_TIME_UPDATED","XLINK_ELEMENT_LOADED","XLINK_READY","SEGMENTBASE_INIT_REQUEST_NEEDED","SEGMENTBASE_SEGMENTSLIST_REQUEST_NEEDED","SEEK_TARGET","DYNAMIC_STREAM_COMPLETED","Events","events","EventsBase","evt","DashHandler","dashConstants","urlUtils","streamInfo","timelineConverter","dashMetrics","baseURLController","logger","segmentIndex","lastSegment","requestedTime","currentTime","isDynamicManifest","dynamicStreamCompleted","selectedMimeType","segmentsController","resetIndex","resetInitialSettings","setRequestUrl","request","destination","representation","baseURL","serviceLocation","isRelative","onRepresentationUpdateStarted","eventObj","voRepresentation","hasInitialization","hasSegments","sender","getRequestForSegment","mediaInfo","segment","_streamingVoFragmentRequest2","bandwidth","adaptation","period","mpd","manifest","Period_asArray","AdaptationSet_asArray","Representation_asArray","media","_utilsSegmentsUtils","replaceTokenForTemplate","replacementNumber","replacementTime","replaceIDForTemplate","id","unescapeDollarsInTemplate","mediaType","mediaRange","presentationStartTime","duration","timescale","availabilityStartTime","availabilityEndTime","wallStartTime","quality","availabilityIdx","adaptationIndex","representationId","isMediaFinished","time","endTime","isFinished","parseFloat","start","toFixed","availableSegmentsNumber","onInitializationLoaded","segments","onSegmentsLoaded","seg","liveEdge","fragments","getTimeBasedSegment","segmentAvailabilityRange","end","setExpectedLiveEdge","updateManifestUpdateInfo","onDynamicStreamCompleted","initialize","isDynamic","getStreamInfo","getInitRequest","calcAvailabilityStartTimeFromPresentationTime","calcAvailabilityEndTimeFromPresentationTime","initialization","generateInitRequest","getSegmentRequestForTime","segmentInfoType","keepIdx","ignoreIsFinished","getSegmentByTime","action","ACTION_COMPLETE","SEGMENT_TIMELINE","getNextSegmentRequest","indexToRequest","getSegmentByIndex","mediaStartTime","isFinite","setCurrentTime","getCurrentTime","setCurrentIndex","getCurrentIndex","setMimeType","newMimeType","_controllersSegmentsController2","_coreFactoryMaker2","DashConstants","init","constants","BASE_URL","SEGMENT_BASE","SEGMENT_TEMPLATE","SEGMENT_LIST","SEGMENT_URL","SEGMENT_PROFILES","ADAPTATION_SET","REPRESENTATION","REPRESENTATION_INDEX","SUB_REPRESENTATION","INITIALIZATION","INITIALIZATION_MINUS","MPD","PERIOD","ASSET_IDENTIFIER","EVENT_STREAM","ID","PROFILES","SERVICE_LOCATION","RANGE","INDEX","MEDIA","BYTE_RANGE","INDEX_RANGE","MEDIA_RANGE","VALUE","CONTENT_TYPE","MIME_TYPE","BITSTREAM_SWITCHING","BITSTREAM_SWITCHING_MINUS","CODECS","DEPENDENCY_ID","MEDIA_STREAM_STRUCTURE_ID","METRICS","METRICS_MINUS","REPORTING","WIDTH","HEIGHT","SAR","FRAMERATE","AUDIO_SAMPLING_RATE","MAXIMUM_SAP_PERIOD","START_WITH_SAP","MAX_PLAYOUT_RATE","CODING_DEPENDENCY","SCAN_TYPE","FRAME_PACKING","AUDIO_CHANNEL_CONFIGURATION","CONTENT_PROTECTION","ESSENTIAL_PROPERTY","SUPPLEMENTAL_PROPERTY","INBAND_EVENT_STREAM","ACCESSIBILITY","ROLE","RATING","CONTENT_COMPONENT","SUBSET","LANG","VIEWPOINT","ROLE_ASARRAY","ACCESSIBILITY_ASARRAY","AUDIOCHANNELCONFIGURATION_ASARRAY","CONTENTPROTECTION_ASARRAY","MAIN","DYNAMIC","STATIC","MEDIA_PRESENTATION_DURATION","MINIMUM_UPDATE_PERIOD","CODEC_PRIVATE_DATA","BANDWITH","SOURCE_URL","TIMESCALE","DURATION","START_NUMBER","PRESENTATION_TIME_OFFSET","AVAILABILITY_START_TIME","AVAILABILITY_END_TIME","TIMESHIFT_BUFFER_DEPTH","MAX_SEGMENT_DURATION","PRESENTATION_TIME","MIN_BUFFER_TIME","MAX_SUBSEGMENT_DURATION","START","AVAILABILITY_TIME_OFFSET","AVAILABILITY_TIME_COMPLETE","CENC_DEFAULT_KID","DVB_PRIORITY","DVB_WEIGHT","SUGGESTED_PRESENTATION_DELAY","SERVICE_DESCRIPTION","SERVICE_DESCRIPTION_SCOPE","SERVICE_DESCRIPTION_LATENCY","SERVICE_DESCRIPTION_PLAYBACK_RATE","RepresentationController","abrController","playbackController","streamId","realAdaptation","updating","voAvailableRepresentations","currentVoRepresentation","checkConfig","MISSING_CONFIG_ERROR","isUpdating","getCurrentRepresentation","addRepresentationSwitch","now","currentRepresentation","currentVideoTimeMs","getRepresentationForQuality","updateRepresentation","calcSegmentAvailabilityRange","useCalculatedLiveEdgeTime","endDataUpdate","_streamingVoDashJSError2","availabilityDelay","updateAvailabilityWindow","notifyUpdate","ln","startDataUpdate","eventArg","postponeUpdate","postponeTimePeriod","delay","AST_IN_FUTURE","rep","getIsDynamic","onRepresentationUpdated","repInfo","manifestUpdateInfo","getCurrentManifestUpdate","alreadyAdded","ignorePostponeTimePeriod","activeStreamInfo","getStreamController","getActiveStreamInfo","startTimeAnchor","min","segmentAvailabilityTimePeriod","getLiveDelay","getRepresentationUpdatePostponeTimePeriod","representationInfo","addManifestUpdateRepresentationInfo","isAllRepresentationsUpdated","setPlaybackQuality","latency","getCurrentRepresentationSwitch","onWallclockTimeUpdated","onQualityChanged","newQuality","onManifestValidityChanged","newDuration","getData","updateData","newRealAdaptation","availableRepresentations","VIDEO","AUDIO","FRAGMENTED_TEXT","getStreamId","QUALITY_CHANGE_REQUESTED","MANIFEST_VALIDITY_CHANGED","SegmentsController","getters","getSegmentsGetter","_utilsTimelineSegmentsGetter2","_utilsTemplateSegmentsGetter2","_utilsListSegmentsGetter2","_utilsSegmentBaseGetter2","mimeType","lastSegmentTime","getter","DashManifestModel","errHandler","BASE64","_streamingUtilsURLUtils2","isInteger","getIsTypeOf","col","mimeTypeRegEx","codecs","found","ContentComponent_asArray","TEXT","essentialProperties","getEssentialPropertiesForRepresentation","_streamingThumbnailThumbnailTracks","THUMBNAILS_SCHEME_ID_URIS","schemeIdUri","IMAGE","_constantsDashConstants2","search","STPP","WVTT","MUXED","contentType","getIsTextTrack","getRepresentationSortFunction","processAdaptation","sort","getRealAdaptations","periodIndex","realRepresentation","EssentialProperty_asArray","map","getRealAdaptationFor","voAdaptation","periodArray","isLastRepeatAttributeValid","segmentTimeline","S_asArray","getEventStreams","inbandStreams","eventStreams","eventStream","_voEventStream2","SCHEME_ID_URI","getBaseURLsFromElement","baseUrls","entries","BaseURL_asArray","baseUri","earlyReturn","baseUrl","_voBaseURL2","text","dvb_priority","dvb_weight","availabilityTimeOffset","availabilityTimeComplete","getLanguageForAdaptation","lang","getViewpointForAdaptation","Viewpoint","getRolesForAdaptation","Role_asArray","getAccessibilityForAdaptation","Accessibility_asArray","getAudioChannelConfigurationForAdaptation","AudioChannelConfiguration_asArray","getAudioChannelConfigurationForRepresentation","getAdaptationForIndex","realAdaptations","getIndexForAdaptation","_streamingUtilsObjectUtils2","areEqual","getAdaptationForId","getAdaptationsForType","adaptations","getCodec","addResolutionInfo","codec","width","height","getMimeType","getKID","getLabelsForAdaptation","Label_asArray","labelArray","getContentProtectionData","ContentProtection_asArray","hasProfile","profile","has","profiles","getDuration","mediaPresentationDuration","POSITIVE_INFINITY","MAX_SAFE_INTEGER","MAX_VALUE","getBandwidth","getManifestUpdatePeriod","latencyOfLastUpdate","minimumUpdatePeriod","max","getRepresentationCount","getBitrateListForAdaptation","processedRealAdaptation","scanType","getRepresentationFor","getRepresentationsForAdaptation","presentationOffset","s0","voRepresentations","segmentInfo","_voRepresentation2","codecPrivateData","maxPlayoutRate","SegmentBase","SegmentList","SegmentTimeline","SegmentTemplate","Initialization","sourceURL","segmentDuration","startNumber","indexRange","presentationTimeOffset","MSETimeOffset","getAdaptationsForPeriod","voPeriod","realPeriod","voAdaptations","voAdaptationSet","realAdaptationSet","_voAdaptationSet2","getRegularPeriods","voPeriods","realPreviousPeriod","voPreviousPeriod","_voPeriod2","DEFAULT_ID","getPeriodId","periodEnd","_coreErrorsErrors2","getEndTimeForLastPeriod","getMpd","_voMpd2","loadedTime","suggestedPresentationDelay","timeShiftBufferDepth","maxSegmentDuration","getEventsForPeriod","EventStream_asArray","Event_asArray","_event","_voEvent2","presentationTime","calculatedPresentationTime","Signal","Binary","messageData","decodeArray","getEventStreamForAdaptationSet","adaptationArray","InbandEventStream_asArray","getEventStreamForRepresentation","representationArray","getUTCTimingSources","hasAST","utcTimingsArray","UTCTiming_asArray","utcTimingEntries","utcTiming","_voUTCTiming2","getLocation","LOCATION","Location","Location_asArray","getUseCalculatedLiveEdgeTimeForAdaptation","getSuggestedPresentationDelay","getAvailabilityStartTime","getServiceDescriptions","serviceDescriptions","_step","_iterator","ServiceDescription_asArray","_iteratorNormalCompletion","next","done","sd","playbackRate","SERVICE_DESCRIPTION_LL_SCHEME","getSupplementalPropperties","supplementalProperties","_step2","_iterator2","SupplementalProperty_asArray","_iteratorNormalCompletion2","sp","setConfig","DashParser","objectIron","performance","jsonTime","run","ironedTime","toPrecision","protocol","getMatchers","getIron","_matchersDurationMatcher2","_matchersDateTimeMatcher2","_matchersNumericMatcher2","_matchersStringMatcher2","_externalsXml2json2","_objectiron2","adaptationset","_mapsRepresentationBaseValuesMap2","_mapsSegmentValuesMap2","CommonProperty","_merge","toUpperCase","MapNode","_children","_properties","_CommonProperty2","RepresentationBaseValuesMap","commonProperties","_MapNode3","SegmentValuesMap","BaseMatcher","_test","_converter","SECONDS_IN_MIN","MINUTES_IN_HOUR","MILLISECONDS_IN_SECONDS","datetimeRegex","DateTimeMatcher","timezoneOffset","exec","utcDate","durationRegex","SECONDS_IN_YEAR","SECONDS_IN_MONTH","SECONDS_IN_DAY","SECONDS_IN_HOUR","DurationMatcher","attributeList","START_TIME","numericRegex","NumericMatcher","StringMatcher","stringAttrsInElements","_stringAttrsInElements","attrNames","ObjectIron","mappers","mapProperties","parentValue","childValue","property","parentItem","childItem","mergeValues","mapItem","v","len2","childNode","periodMapper","periods","adaptationSets","adaptationSetMapper","ListSegmentsGetter","list","SegmentURL_asArray","_SegmentsUtils","getIndexBasedSegment","periodTime","calcPeriodRelativeTimeFromMpdRelativeTime","SegmentBaseGetter","epsilon","frag","ft","fd","getIndexByTime","presentationEndTime","getSegment","calcMediaTimeFromPresentationTime","isSegmentAvailable","fTimescale","tManifest","scaledTime","scaledDuration","calcPresentationTimeFromMediaTime","zeroPadToLength","numStr","minStrLength","token","startPos","endPos","formatTagPos","specifier","paddedValue","tokenLen","formatTagLen","_voSegment2","calcWallTimeForSegment","getPeriodEnd","TemplateSegmentsGetter","template","availabilityWindow","ceil","TimelineSegmentsGetter","iterateSegments","iterFunc","base","timeline","repeat","repeatEndTime","nextFrag","breakIterator","availabilityEnd","requiredMediaTime","AdaptationSet","BaseURL","weight","DEFAULT_DVB_PRIORITY","DEFAULT_DVB_WEIGHT","Event","presentationTimeDelta","EventStream","adaptionSet","Mpd","Period","Representation","Segment","UTCTiming","OfflineDownload","manifestLoader","mediaPlayerModel","adapter","offlineStoreController","manifestId","manifestUpdater","_manifestURL","_offlineURL","_xmlManifest","_streams","_manifest","_isDownloadingStatus","_isComposed","_representationsToUpdate","_indexDBManifestParser","_progressionById","_progression","_status","isDownloading","onManifestUpdated","_constantsOfflineConstants2","OFFLINE_STATUS_ERROR","_errorsOfflineErrors2","OFFLINE_ERROR","onDownloadingStarted","OFFLINE_STATUS_STARTED","setDownloadingStatus","OFFLINE_RECORD_STARTED","OnStreamProgression","stream","downloaded","available","allSegments","waitForAllProgress","getManifestById","progress","updateOfflineManifest","onDownloadingFinished","OFFLINE_STATUS_FINISHED","OFFLINE_RECORD_FINISHED","resetDownload","onManifestUpdateNeeded","representations","parsedManifest","startOfflineStreamProcessors","composeStreams","updatePeriods","streamsInfo","getStreamsInfo","_OfflineStream2","callbacks","started","progression","finished","updateManifestNeeded","createFragmentStore","offlineManifest","onOriginalManifestLoaded","originalManifest","getMediaInfos","initializeAllMediasInfoList","selectedRepresentations","stopDownload","stopOfflineStreamProcessors","OFFLINE_STATUS_STOPPED","OFFLINE_RECORD_STOPPED","ERROR","INDEXEDDB_QUOTA_EXCEED_ERROR","INDEXEDDB_INVALID_STATE_ERROR","getId","getOfflineUrl","getManifestUrl","getStatus","setInitialState","originalUrl","initDownload","load","downloadFromUrl","OFFLINE_SCHEME","OFFLINE_STATUS_CREATED","fragmentStore","originalURL","createOfflineManifest","startDownload","mediaInfos","bitrateList","bitrate","saveSelectedRepresentations","_utilsOfflineIndexDBManifestParser2","allMediaInfos","resumeDownload","_dashParserDashParser2","selected","deleteDownload","getDownloadProgression","round","dashjs","OfflineStream","startedCb","progressionCb","finishedCb","updateManifest","offlineStreamProcessors","startedOfflineStreamProcessors","finishedOfflineStreamProcessors","representationsToUpdate","allMediasInfosList","progressionById","createOfflineStreamProcessorFor","allMediaInfoForType","getAllMediaInfoForType","streamProcessor","_OfflineStreamProcessor2","completed","onStreamCompleted","onStreamProgression","downloadedSegments","availableSegments","getRepresentationId","onDataUpdateCompleted","repCtrl","getRepresentationController","checkIfAllOfflineStreamProcessorsStarted","stop","deactivate","removeExecutedRequestsBeforeTime","initStreamInfo","OFFLINE_RECORD_LOADEDMETADATA","mediasInfoList","OfflineStreamProcessor","completedCb","progressCb","indexHandler","representationController","fragmentModel","isInitialized","isStopped","onFragmentLoadingCompleted","isInit","fragmentName","storeFragment","setRepresentationCurrentState","executeRequest","download","getAvailableSegmentsNumber","getMediaInfo","_mediaInfo","getVoRepresentations","findIndex","getRepresentationCurrentState","FRAGMENT_LOADING_COMPLETED","_dashDashHandler2","requestModifier","_streamingUtilsRequestModifier2","_dashControllersRepresentationController2","_streamingModelsFragmentModel2","fragmentLoader","_streamingFragmentLoader2","OfflineConstants","OFFLINE_URL_REGEX","OfflineController","manifestModel","schemeLoaderFactory","downloads","offlineUrlUtils","getDownloadFromId","find","createDownloadFromId","_OfflineDownload2","removeDownloadFromId","waitForStatusChanged","downloadStopped","deleteDownloadById","resetRecords","loadRecordsFromStorage","getAllManifests","items","manifests","offline","createRecord","manifestURL","startRecord","stopRecord","resumeRecord","deleteRecord","getRecordProgression","getAllRecords","records","record","_voOfflineDownloadVo2","unregisterLoader","_OfflineStoreController2","_utilsOfflineUrlUtils2","registerUrlRegex","getRegex","registerLoader","_netIndexDBOfflineLoader2","_eventsOfflineEvents2","OfflineStoreController","indexDBStore","manageDOMError","INDEXEDDB_NOT_FOUND_ERROR","INDEXEDDB_VERSION_ERROR","fragmentId","fragmentData","storeManifest","getCurrentHigherManifestId","_storageIndexDBStore2","OfflineErrors","INDEXEDDB_NOT_READABLE_ERROR","INDEXEDDB_NETWORK_ERROR","INDEXEDDB_DATA_ERROR","INDEXEDDB_TRANSACTION_INACTIVE_ERROR","INDEXEDDB_NOT_ALLOWED_ERROR","INDEXEDDB_NOT_SUPPORTED_ERROR","INDEXEDDB_TIMEOUT_ERROR","INDEXEDDB_ABORT_ERROR","INDEXEDDB_UNKNOWN_ERROR","offlineErrors","OfflineEvents","offlineEvents","_controllersOfflineController2","IndexDBOfflineLoader","removeHostname","EMBEDDED_TEXT","getFragmentByKey","fragment","success","ARRAY_BUFFER","XML","abort","entities","IndexDBStore","manifestStore","fragmentStores","dropAll","newStatus","higherManifestId","dropFragmentStore","Entities","OfflineIndexDBManifestParser","DOM","isFragmentedTextCodecFoundInTag","tag","getAttribute","findRepresentations","isFragmentedTextCodecFound","findMimeType","testMimeType","getElementsByTagName","getBestRepresentationId","currentAdaptationSet","bestRepresentation","getFragmentId","idxFragId","lastIndexOf","XMLDoc","currentMPD","basesURL","innerHTML","adaptationsSet","isHTTPS","isHTTPURL","editBaseURLAttribute","currentPeriod","currentAdaptationType","getIsMuxed","getIsAudio","getIsVideo","getIsFragmentedText","getIsImage","findAdaptationType","adaptationType","repId","findAndKeepOnlySelectedRepresentations","elements","segmentBase","deleteSegmentBase","segmentList","getSegmentList","segmentLists","initialisation","setAttribute","segmentURLs","segmentUrl","editSegmentListAttributes","segmentTemplate","getSegmentTemplate","segmentsTemplates","editSegmentTemplateAttributes","selectedRep","_i2","adaptationSet","segmentTemplateElement","S","segmentTimelineElement","changedDuration","getDurationChangeArray","repeatValue","addSegmentTimelineElements","addSegmentTemplateAttributes","browseAdaptationsSet","browsePeriods","manifestEncoded","XMLSerializer","serializeToString","OfflineUrlUtils","FragmentLoader","urlLoader","checkForExistence","report","exists","headRequest","_voHeadRequest2","event","statusText","errorText","_voDashJSError2","_netURLLoader2","useFetch","_constantsConstants2","boxParser","MediaPlayerEvents","BUFFER_EMPTY","BUFFER_LOADED","BUFFER_LEVEL_STATE_CHANGED","FRAGMENT_LOADING_PROGRESS","FRAGMENT_LOADING_STARTED","FRAGMENT_LOADING_ABANDONED","MANIFEST_LOADED","METRICS_CHANGED","METRIC_CHANGED","METRIC_ADDED","METRIC_UPDATED","PERIOD_SWITCH_COMPLETED","PERIOD_SWITCH_STARTED","QUALITY_CHANGE_RENDERED","TRACK_CHANGE_RENDERED","SOURCE_INITIALIZED","STREAM_INITIALIZING","STREAM_INITIALIZED","STREAM_TEARDOWN_COMPLETE","TEXT_TRACKS_ADDED","TEXT_TRACK_ADDED","TTML_PARSED","TTML_TO_PARSE","CAPTION_RENDERED","CAPTION_CONTAINER_RESIZE","CAN_PLAY","PLAYBACK_ENDED","PLAYBACK_ERROR","PLAYBACK_NOT_ALLOWED","PLAYBACK_METADATA_LOADED","PLAYBACK_PAUSED","PLAYBACK_PLAYING","PLAYBACK_PROGRESS","PLAYBACK_RATE_CHANGED","PLAYBACK_SEEKED","PLAYBACK_SEEKING","PLAYBACK_SEEK_ASKED","PLAYBACK_STALLED","PLAYBACK_STARTED","PLAYBACK_TIME_UPDATED","PLAYBACK_WAITING","mediaPlayerEvents","Constants","STREAM","TTML","VTT","ABR_STRATEGY_BOLA","ABR_STRATEGY_THROUGHPUT","MOVING_AVERAGE_EWMA","BAD_ARGUMENT_ERROR","INITIALIZE","TEXT_SHOWING","TEXT_HIDDEN","CC1","CC3","UTF8","SUPPLEMENTAL_PROPERTY_LL_SCHEME","DEFAULT_DEVICE_ID","_coreVersion","getVersionString","BUFFER_STATES","OBJECT_TYPES","STREAMING_FORMATS","STREAM_TYPES","CmcdModel","dashManifestModel","internalData","_coreEventBus2","_coreSettings2","_resetInitialSettings","pr","nor","st","sf","_coreUtils2","generateUuid","bs","_getGenericCmcdData","_onPlaybackRateChanged","_onManifestLoaded","_onBufferLevelStateChanged","_MediaPlayerEvents2","isSeeking","getQueryParameter","cmcdData","reduce","acc","_buildFinalString","_voMetricsHTTPRequest","generateHashCode","_setDefaultContentId","ot","_getCmcdDataForMpd","encodedBitrate","_getBitrateByRequest","_getObjectDurationByRequest","mtp","getThroughputHistory","getSafeAverageThroughput","_getMeasuredThroughputByType","dl","bufferLevel","getCurrentBufferLevel","_getDeadlineByType","_getBufferStateByRequest","br","_getCmcdDataForMediaSegment","_getCmcdDataForInitSegment","_getCmcdData","_dashModelsDashManifestModel2","FRAGMENT_MODEL_LOADING","FRAGMENT_MODEL_EXECUTED","FragmentModel","executedRequests","loadingRequests","isFragmentLoaded","isLoaded","req1","req2","_voFragmentRequest2","getRequestThreshold","threshold","removeExecutedRequestsInTimeRange","addSchedulingInfoMetrics","addSchedulingInfo","addRequestsQueue","onLoadingCompleted","onLoadingInProgress","onLoadingAborted","getRequests","states","filteredRequests","requests","getRequestsForState","getRequestForTime","filterRequests","isFragmentLoadedOrPending","removeExecutedRequestsAfterTime","syncExecutedRequestsWithBufferedRange","bufferedRanges","streamDuration","abortRequests","ACTION_DOWNLOAD","addExecutedRequest","FRAGMENT_MODEL_CANCELED","FRAGMENT_MODEL_FAILED","FetchLoader","cfg","read","httpRequest","processResult","calculateDownloadedTime","datum","bytesReceived","avgTimeDistance","ts","distance","requestStartTime","headers","Headers","requestStartDate","modifyRequestHeader","setRequestHeader","header","abortController","AbortController","signal","reqOptions","method","credentials","withCredentials","responseURL","ok","responseHeaders","body","loaded","total","onend","totalBytes","signaledFirstByte","remaining","getReader","downLoadedData","_ref","boxesInfo","lengthComputable","concatTypedArray","findLastTopIsoBoxCompleted","lastCompletedOffset","subarray","noTrace","cancel","HTTPLoader","delayedRequests","retryRequests","downloadErrorToRequestTypeMap","cmcdModel","internalLoad","remainingAttempts","traces","firstProgress","needFailureReport","lastTraceTime","lastTraceReceivedCount","handleLoaded","requestEndDate","firstByteDate","checkExistenceOnly","addHttpRequest","getAllResponseHeaders","addManifestUpdate","retryRequest","timeout","getRetryIntervalsForType","complete","delayedRequest","loader","responseType","_FetchLoader2","_XHRLoader2","modifyRequestURL","additionalQueryParameter","cmcdQueryParameter","_getAdditionalQueryParameter","addAditionalQueryParameterToUrl","HEAD","GET","getXHRWithCredentialsForType","bytesLoaded","bytesTotal","delayLoadingTime","delayTimeout","getRetryAttemptsForType","clearTimeout","onprogress","_modelsCmcdModel2","_downloadErrorToRequestTypeMap","SchemeLoaderFactory","schemeLoaderMap","unregisterAllLoader","getLoader","scheme","startsWith","_streamingNetHTTPLoader2","URLLoader","_streamingNetSchemeLoaderFactory2","loaderFactory","XHRLoader","xhr","XMLHttpRequest","send","ThumbnailTracks","tracks","currentTrackIndex","_streamingNetXHRLoader2","_streamingUtilsBoxParser2","getMediaInfoForType","voReps","_dashConstantsDashConstants2","createTrack","addTracks","useSegmentBase","templateUrl","track","_voThumbnailTrackInfo2","tilesHor","tilesVert","vars","_coreEventsEvents2","cache","_dashUtilsSegmentsUtils","normalizeSegments","readThumbnail","cached","el","ss","getSamplesInfo","sampleList","imageUrl","createObjectURL","widthPerTile","heightPerTile","getTracks","setTrackByIndex","getCurrentTrack","getCurrentTrackIndex","getThumbnailRequestForTime","currentVoRep","BoxParser","fileStart","parsedFile","_codemIsoboxer2","dashIsoFile","_IsoFile2","setData","types","_voIsoBoxSearchInfo2","boxInfo","boxSize","boxType","getMediaTimescaleFromMoov","ab","isoFile","mdhdBox","getBox","lastSequenceNumber","totalDuration","numSequences","sampleDuration","sampleSize","moofBoxes","getBoxes","mfhdBoxes","sampleDts","dataOffset","sequence_number","subsIndex","nextSubsSample","moofBox","trafBoxes","getChildBoxes","trafBox","tfhdBox","getChildBox","tfdtBox","baseMediaDecodeTime","trunBoxes","subsBoxes","trunBox","sampleCount","base_data_offset","data_offset","samples","sample_duration","default_sample_duration","sample_size","default_sample_size","sampleData","dts","cts","sample_composition_time_offset","subSizes","subsBox","sample_delta","subsamples","subsample_size","findInitRange","initRange","ftyp","moov","isComplete","DefaultURLUtils","nativeURLResolver","dumbURLResolver","baseUrlParseFunc","parseBaseUrl","isPathAbsolute","parseOrigin","isSchemeRelative","parseScheme","joinChar","resolveFunction","schemeRegex","httpUrlRegex","httpsUrlRegex","originRegex","slashIndex","lastSlashIndex","matches","setup","IsoFile","parsedIsoFile","boxData","convertToDashIsoBox","_voIsoBox2","getLastBox","ObjectUtils","obj1","obj2","_fastDeepEqual2","RequestModifier","URLUtils","defaultURLUtils","regexUtils","internalCall","functionName","utils","regex","getUtils","_DefaultURLUtils2","DashJSError","FragmentRequest","HeadRequest","checkForExistenceOnly","IsoBox","earliest_presentation_time","first_offset","references","subsegment_duration","scheme_id_uri","presentation_time_delta","presentation_time","event_duration","message_data","sample_description_index","default_sample_flags","first_sample_flags","IsoBoxSearchInfo","ThumbnailTrackInfo","tcpid","actualurl","trequest","tresponse","responsecode","interval","trace","_stream","_tfinish","_mediaduration","_quality","_responseHeaders","_serviceLocation","HTTPRequestTrace"],"mappings":"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A,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,KAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,UAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,KAAA,CAAA,MAAA,CAAA,KAAA,CAAA,SAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,WAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,WAAA,CAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,UAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,SAAA,CAAA,QAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,KAAA,CAAA,gBAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,SAAA,CAAA,OAAA,CAAA,MAAA,CAAA,KAAA,CAAA,QAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,WAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,WAAA,CAAA,OAAA,CAAA,cAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,UAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,aAAA,CAAA,OAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,SAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,UAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,YAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,UAAA,CAAA,OAAA,CAAA,kBAAA,CAAA,OAAA,CAAA,gBAAA,CAAA,OAAA,CAAA,WAAA,CAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,eAAA,CAAA,QAAA,CAAA,cAAA,CAAA,OAAA,CAAA,gBAAA,CAAA,OAAA,CAAA,oBAAA,CAAA,OAAA,CAAA,oBAAA,CAAA,OAAA,CAAA,qBAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,MAAA,CAAA,GAAA,OAAA,CAAA,UAAA,CAAA,KAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,KAAA,CAAA,WAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,SAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,SAAA,CAAA,QAAA,CAAA,uBAAA,CAAA,OAAA,CAAA,OAAA,CAAA,KAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,UAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,UAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,UAAA,CAAA,MAAA,CAAA,UAAA,CAAA,QAAA,CAAA,OAAA,CAAA,MAAA,CAAA,YAAA,CAAA,MAAA,CAAA,YAAA,CAAA,MAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,YAAA,CAAA,QAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA,CAAA,kBAAA,CAAA,OAAA,CAAA,mBAAA,CAAA,OAAA,CAAA,aAAA,CAAA,OAAA,CAAA,cAAA,CAAA,OAAA,CAAA,cAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,WAAA,CAAA,MAAA,CAAA,WAAA,CAAA,OAAA,CAAA,cAAA,CAAA,OAAA,CAAA,aAAA,CAAA,OAAA,CAAA,cAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,WAAA,CAAA,QAAA,CAAA,SAAA,CAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAAA,2BAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,QAAA,CAAA,KAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,QAAA,CAAA,KAAA,CAAA,SAAA,CAAA,KAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,aAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,UAAA,CAAA,QAAA,CAAA,YAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,kBAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA,CAAA,kCAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,UAAA,CAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,UAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,SAAA,CAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,KAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,UAAA,CAAA,QAAA,CAAA,cAAA,CAAA,OAAA,CAAA,cAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,aAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,iBAAA,CAAA,OAAA,CAAA,kBAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,UAAA,CAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,KAAA,CAAA,OAAA,CAAA,KAAA,CAAA,OAAA,CAAA,WAAA,CAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,UAAA,CAAA,QAAA,CAAA,SAAA,CAAA,QAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,mBAAA,CAAA,MAAA,CAAA,iBAAA,CAAA,MAAA,CAAA,yBAAA,CAAA,MAAA,CAAA,mBAAA,CAAA,KAAA,CAAA,mBAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,cAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,MAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,OAAA,CAAA,UAAA,CAAA,MAAA,CAAA,QAAA,CAAA,OAAA,CAAA,MAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,KAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,iBAAA,CAAA,OAAA,CAAA,wBAAA,CAAA,OAAA,CAAA,YAAA,CAAA,MAAA,CAAA,kBAAA,CAAA,OAAA,CAAA,kBAAA,CAAA,OAAA,CAAA,uBAAA,CAAA,OAAA,CAAA,gBAAA,CAAA,QAAA,CAAA,sBAAA,CAAA,QAAA,CAAA,2BAAA,CAAA,QAAA,CAAA,uBAAA,CAAA,QAAA,CAAA,mBAAA,CAAA,OAAA,CAAA,iBAAA,CAAA,OAAA,CAAA,gBAAA,CAAA,OAAA,CAAA,oBAAA,CAAA,OAAA,CAAA,oBAAA,CAAA,OAAA,CAAA,eAAA,CAAA,QAAA,CAAA,YAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,mBAAA,CAAA,OAAA,CAAA,YAAA,CAAA,MAAA,CAAA,iBAAA,CAAA,OAAA,CAAA,kBAAA,CAAA,OAAA,CAAA,mBAAA,CAAA,OAAA,CAAA,sBAAA,CAAA,QAAA,CAAA,oBAAA,CAAA,QAAA,CAAA,oBAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,OAAA,CAAA,qBAAA,CAAA,QAAA,CAAA,qBAAA,CAAA,QAAA,CAAA,kBAAA,CAAA,OAAA,CAAA,eAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,WAAA,CAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,WAAA,CAAA,QAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,QAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,KAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,KAAA,CAAA,QAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,MAAA,CAAA,QAAA,CAAA,SAAA,CAAA,QAAA,CAAA,KAAA,CAAA,QAAA,CAAA,UAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,QAAA,CAAA,SAAA,CAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,mBAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,uBAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,MAAA,CAAA,UAAA,CAAA,MAAA,CAAA,UAAA,CAAA,MAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,aAAA,CAAA,QAAA,CAAA,cAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,SAAA,CAAA,KAAA,CAAA,aAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,cAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,UAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,KAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,cAAA,CAAA,OAAA,CAAA,eAAA,CAAA,OAAA,CAAA,eAAA,CAAA,OAAA,CAAA,gBAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,SAAA,CAAA,QAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,QAAA,CAAA,QAAA,CAAA,oBAAA,CAAA,OAAA,CAAA,wBAAA,CAAA,OAAA,CAAA,QAAA,CAAA,IAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,aAAA,CAAA,OAAA,CAAA,WAAA,CAAA,QAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,MAAA,CAAA,QAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,KAAA,CAAA,OAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,WAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,SAAA,CAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,OAAA,CAAA,KAAA,QAAA,CAAA,SAAA,CAAA,QAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,KAAA,CAAA,OAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,MAAA,CAAA,QAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,KAAA,CAAA,eAAA,CAAA,OAAA,CAAA,mBAAA,CAAA,OAAA,CAAA,mBAAA,CAAA,OAAA,CAAA,iBAAA,CAAA,QAAA,CAAA,cAAA,CAAA,OAAA,CAAA,oBAAA,CAAA,QAAA,CAAA,eAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,KAAA,CAAA,KAAA,CAAA,KAAA,CAAA,KAAA,CAAA,KAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAAA,YAAA,CAAA,QAAA,CAAA,SAAA,CAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,aAAA,CAAA,QAAA,CAAA,UAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,YAAA,CAAA,KAAA,QAAA,CAAA,OAAA,CAAA,KAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,UAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,MAAA,CAAA,KAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,OAAA,CAAA,eAAA,CAAA,OAAA,CAAA,WAAA,CAAA,QAAA,CAAA,WAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,gBAAA,CAAA,OAAA,CAAA,iBAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,iBAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,eAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,KAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,KAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,OAAA,CAAA,aAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,KAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,UAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,KAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,WAAA,CAAA,QAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,WAAA,CAAA,OAAA,CAAA,eAAA,CAAA,OAAA,CAAA,WAAA,CAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,OAAA,CAAA,iBAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,QAAA,CAAA,QAAA,CAAA,SAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,KAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,SAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,WAAA,CAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,SAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,aAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,OAAA,CAAA,UAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,SAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QA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AAA,CAAA,KAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,SAAA,CAAA,MAAA,CAAA,MAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,MAAA,CAAA,OAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,MAAA,CAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,UAAA,CAAA,MAAA,CAAA,UAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA,CAAA,SAAA,CAAA,OAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,SAAA,CAAA,OAAA,CAAA,QAAA,CAAA,uBAAA,CAAA,OAAA,CAAA,iBAAA,CAAA,OAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,QAAA,CAAA,OAAA,CAAA,KAAA,CAAA,QAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,UAAA,CAAA,OAAA,CAAA,OAAA,CAAA,MAAA,CAAA,OAAA,CAAA,MAAA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"}