{"version":3,"sources":["plyr.polyfilled.js","node_modules/custom-event-polyfill/polyfill.js","node_modules/rangetouch/dist/rangetouch.mjs","node_modules/url-polyfill/url-polyfill.js","src/js/utils/is.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/utils/objects.js","src/js/utils/elements.js","src/js/support.js","src/js/utils/events.js","src/js/utils/promise.js","src/js/utils/arrays.js","src/js/utils/style.js","src/js/html5.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/load-sprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/load-image.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/load-script.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/utils/numbers.js","src/js/plugins/preview-thumbnails.js","src/js/source.js","src/js/plyr.js"],"names":["navigator","global","factory","exports","module","define","amd","globalThis","self","Plyr","this","window","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","Error","e","event","params","evt","origPrevent","bubbles","document","createEvent","initCustomEvent","detail","call","Object","defineProperty","get","prototype","Event","commonjsGlobal","_defineProperty$1","obj","key","value","enumerable","configurable","writable","_defineProperties","t","n","length","r","_defineProperty","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","push","apply","_objectSpread2","arguments","forEach","getOwnPropertyDescriptors","defineProperties","iteratorSupported","Symbol","iterator","error","checkIfIteratorIsSupported","createIterator","items","next","shift","done","serializeParam","encodeURIComponent","replace","deserializeParam","decodeURIComponent","String","URLSearchParams","toString","set","entries","checkIfURLSearchParamsSupported","searchString","typeofSearchString","_fromString","_this","name","append","TypeError","i","entry","hasOwnProperty","proto","_entries","delete","getAll","slice","has","callback","thisArg","values","searchArray","join","polyfillURLSearchParams","sort","a","b","attribute","attributes","split","u","URL","pathname","href","searchParams","checkIfURLIsSupported","_URL","url","base","baseElement","doc","location","toLowerCase","implementation","createHTMLDocument","createElement","head","appendChild","indexOf","err","anchorElement","body","inputElement","type","protocol","test","checkValidity","search","enableSearchUpdate","enableSearchParamsUpdate","methodName","method","attributeName","_anchorElement","linkURLWithAnchorAttribute","_updateSearchParams","origin","expectedPort","addPortToOrigin","port","hostname","password","username","createObjectURL","blob","revokeObjectURL","polyfillURL","getOrigin","setInterval","defaults","addCSS","thumbWidth","watch","matches","Array","from","querySelectorAll","includes","getConstructor","constructor","instanceOf","isNullOrUndefined","isObject","isString","isArray","isNodeList","NodeList","is","Element","round","concat","match","Math","max","getDecimalPlaces","parseFloat","toFixed","RangeTouch","_classCallCheck","element","querySelector","rangeTouch","config","init","_createClass","enabled","style","userSelect","webKitUserSelect","touchAction","listeners","target","changedTouches","o","getAttribute","s","c","getBoundingClientRect","width","clientX","left","disabled","dispatchEvent","trigger","MutationObserver","addedNodes","observe","childList","subtree","map","documentElement","input","Boolean","isFunction","isEmpty","Number","isNaN","nodeType","ownerDocument","KeyboardEvent","TextTrack","kind","Promise","then","string","startsWith","_","transitionEndEvent","events","WebkitTransition","MozTransition","OTransition","transition","find","undefined","repaint","delay","setTimeout","hidden","offsetHeight","browser","isIE","documentMode","isEdge","userAgent","isWebkit","isIPhone","maxTouchPoints","isIos","getDeep","object","path","reduce","extend","sources","source","assign","wrap","elements","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","insertBefore","setAttributes","setAttribute","text","innerText","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","trim","className","parts","charAt","class","id","toggleHidden","hide","toggleClass","force","classList","contains","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","container","getElement","setFocus","tabFocus","focus","preventScroll","classNames","defaultCodecs","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","range","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","supported","options","addEventListener","removeEventListener","toggleListener","toggle","passive","capture","eventListeners","on","off","once","onceCallback","args","triggerEvent","plyr","unbindListeners","item","ready","resolve","silencePromise","dedupe","array","closest","prev","curr","abs","supportsCSS","declaration","CSS","supports","standardRatios","out","x","y","validateAspectRatio","every","reduceAspectRatio","ratio","height","getDivider","w","h","divider","getAspectRatio","parse","embed","videoWidth","videoHeight","setAspectRatio","isVideo","padding","aspectRatio","paddingBottom","isVimeo","vimeo","premium","offsetWidth","parseInt","getComputedStyle","offset","fullscreen","active","transform","add","videoFixedRatio","roundAspectRatio","tolerance","closestRatio","html5","getSources","getQualityOptions","quality","forced","setup","player","speed","onChange","currentTime","paused","preload","readyState","playbackRate","src","play","load","cancelRequests","blankVideo","debug","log","format","replaceAll","RegExp","toTitleCase","toUpperCase","toCamelCase","toPascalCase","getHTML","innerHTML","resources","youtube","i18n","seekTime","title","k","v","Storage","store","localStorage","getItem","json","JSON","storage","setItem","stringify","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","status","open","send","loadSprite","hasId","isCached","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","trunc","formatTime","time","displayHours","inverted","hours","mins","secs","getSeconds","controls","getIconUrl","iconUrl","host","top","cors","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","focusable","use","setAttributeNS","createLabel","attr","createBadge","badge","menu","createButton","buttonType","props","label","labelPressed","iconPressed","some","control","button","createRange","min","step","autocomplete","role","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","checked","flex","children","node","bind","currentTrack","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","setProgress","val","getElementsByTagName","nodeValue","current","buffered","percent","setProperty","updateSeekTooltip","_this$config$markers","_this$config$markers$","tooltips","tipElement","visible","show","clientRect","pageX","point","markers","points","insertAdjacentHTML","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","setMarkers","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","checkMenu","getBadge","sorting","setCaptionsMenu","tracks","getTracks","track","toggled","language","unshift","setSpeedMenu","minimumSpeed","maximumSpeed","popup","p","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","clone","position","opacity","removeAttribute","scrollWidth","scrollHeight","size","restore","propertyName","setDownloadUrl","download","create","defaultAttributes","progressContainer","inner","home","backButton","urls","isEmbed","inject","floor","random","seektime","addProperty","controlPressed","labels","setMediaMetadata","mediaSession","metadata","MediaMetadata","mediaMetadata","artist","album","artwork","_this$config$markers2","_this$config$markers3","containerFragment","createDocumentFragment","pointsFragment","tipVisible","toggleTip","markerElement","marker","tip","parseUrl","safe","parser","buildUrlParams","isYouTube","languages","userLanguage","trackEvents","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","cue","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","advertisement","qualityBadge","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","hash","publisherId","tagUrl","byline","portrait","transparent","customControls","referrerPolicy","rel","showinfo","iv_load_policy","modestbranding","noCookie","providers","types","noop","Console","console","Function","Fullscreen","scrollPosition","scrollX","scrollY","scrollTo","overflow","viewport","property","hasProperty","cleanupViewport","part","activeElement","first","last","shiftKey","forceFallback","native","requestFullscreen","webkitEnterFullscreen","toggleFallback","prefix","navigationUI","webkitExitFullscreen","action","cancelFullScreen","exit","enter","el","parentElement","proxy","trapFocus","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","usingNative","pre","getRootNode","fullscreenElement","shadowRoot","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","controlsElement","recentTouchSeek","lastSeekTime","Date","now","migrateStyles","getPropertyValue","removeProperty","Listeners","timeStamp","focusTimer","lastKeyDown","wasKeyDown","removeCurrent","handleKey","firstTouch","setTabFocus","setGutter","useNativeAspectRatio","maxWidth","margin","viewportWidth","viewportHeight","clientWidth","innerWidth","clientHeight","innerHeight","resized","isAudio","ended","togglePlay","proxyEvents","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","forward","toggleCaptions","rect","currentTarget","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","deltaX","deltaY","direction","sign","increaseVolume","lastKey","altKey","ctrlKey","metaKey","repeat","increment","decreaseVolume","loadjs_umd","fn","createCommonjsModule","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","subscribe","bundleIds","callbackFn","bundleId","depsNotFound","numWaiting","pathsNotFound","publish","q","splice","executeCallbacks","success","loadFile","numTries","isLegacyIECss","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","code","loadFiles","paths","loadjs","arg1","arg2","loadFn","returnPromise","deps","isDefined","loadScript","assurePlaybackState","hasPlayed","Vimeo","frameParams","found","parseHash","hashParam","sidedock","gesture","$2","thumbnail_url","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","fragment","firstChild","stripHTML","getPaused","seconds","getHost","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","onPlaybackRateChange","instance","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","clearInterval","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","google","ima","manager","destroy","displayContainer","remove","startSafetyTimer","managerPromise","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","loader","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","countdownTimer","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","cuePoints","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","initialized","zIndex","handlers","safetyTimer","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","clamp","parseVtt","vttDataString","processedList","frame","line","startTime","lineSplit","matchTimes","endTime","fitRatio","outer","PreviewThumbnails","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","thumbnails","promises","getThumbnail","thumbnail","frames","urlPrefix","substring","lastIndexOf","tempImage","naturalHeight","_this$player$config$m","_this$player$config$m2","percentage","mousePosX","thumb","showImageAtCurrentTime","toggleThumbContainer","mouseDown","toggleScrubbingContainer","ceil","lastTime","scrubbing","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","findIndex","hasThumb","qualityIndex","loadedImages","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","scrubberRect","containerRect","right","clamped","multiplier","lastMouseMoveTime","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","crossorigin","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","original","unload","failed","jQuery","WeakMap","getProviderByUrl","truthy","tabindex","inputIsValid","fauxDuration","realDuration","Infinity","hasAudio","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","setPreviewThumbnails","thumbnailSource","static","inline"],"mappings":"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","file":"plyr.polyfilled.min.js","sourcesContent":["typeof navigator === \"object\" && (function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define('Plyr', factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Plyr = factory());\n})(this, (function () { 'use strict';\n\n // Polyfill for creating CustomEvents on IE9/10/11\n\n // code pulled from:\n // https://github.com/d4tocchini/customevent-polyfill\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\n (function () {\n if (typeof window === 'undefined') {\n return;\n }\n try {\n var ce = new window.CustomEvent('test', {\n cancelable: true\n });\n ce.preventDefault();\n if (ce.defaultPrevented !== true) {\n // IE has problems with .preventDefault() on custom events\n // http://stackoverflow.com/questions/23349191\n throw new Error('Could not prevent default');\n }\n } catch (e) {\n var CustomEvent = function (event, params) {\n var evt, origPrevent;\n params = params || {};\n params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n origPrevent = evt.preventDefault;\n evt.preventDefault = function () {\n origPrevent.call(this);\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function () {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n return evt;\n };\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n })();\n\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n function createCommonjsModule(fn, module) {\n \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n }\n\n (function (global) {\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\n\n var checkIfIteratorIsSupported = function () {\n try {\n return !!Symbol.iterator;\n } catch (error) {\n return false;\n }\n };\n var iteratorSupported = checkIfIteratorIsSupported();\n var createIterator = function (items) {\n var iterator = {\n next: function () {\n var value = items.shift();\n return {\n done: value === void 0,\n value: value\n };\n }\n };\n if (iteratorSupported) {\n iterator[Symbol.iterator] = function () {\n return iterator;\n };\n }\n return iterator;\n };\n\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\n var serializeParam = function (value) {\n return encodeURIComponent(value).replace(/%20/g, '+');\n };\n var deserializeParam = function (value) {\n return decodeURIComponent(String(value).replace(/\\+/g, ' '));\n };\n var polyfillURLSearchParams = function () {\n var URLSearchParams = function (searchString) {\n Object.defineProperty(this, '_entries', {\n writable: true,\n value: {}\n });\n var typeofSearchString = typeof searchString;\n if (typeofSearchString === 'undefined') ; else if (typeofSearchString === 'string') {\n if (searchString !== '') {\n this._fromString(searchString);\n }\n } else if (searchString instanceof URLSearchParams) {\n var _this = this;\n searchString.forEach(function (value, name) {\n _this.append(name, value);\n });\n } else if (searchString !== null && typeofSearchString === 'object') {\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\n for (var i = 0; i < searchString.length; i++) {\n var entry = searchString[i];\n if (Object.prototype.toString.call(entry) === '[object Array]' || entry.length !== 2) {\n this.append(entry[0], entry[1]);\n } else {\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\n }\n }\n } else {\n for (var key in searchString) {\n if (searchString.hasOwnProperty(key)) {\n this.append(key, searchString[key]);\n }\n }\n }\n } else {\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\n }\n };\n var proto = URLSearchParams.prototype;\n proto.append = function (name, value) {\n if (name in this._entries) {\n this._entries[name].push(String(value));\n } else {\n this._entries[name] = [String(value)];\n }\n };\n proto.delete = function (name) {\n delete this._entries[name];\n };\n proto.get = function (name) {\n return name in this._entries ? this._entries[name][0] : null;\n };\n proto.getAll = function (name) {\n return name in this._entries ? this._entries[name].slice(0) : [];\n };\n proto.has = function (name) {\n return name in this._entries;\n };\n proto.set = function (name, value) {\n this._entries[name] = [String(value)];\n };\n proto.forEach = function (callback, thisArg) {\n var entries;\n for (var name in this._entries) {\n if (this._entries.hasOwnProperty(name)) {\n entries = this._entries[name];\n for (var i = 0; i < entries.length; i++) {\n callback.call(thisArg, entries[i], name, this);\n }\n }\n }\n };\n proto.keys = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push(name);\n });\n return createIterator(items);\n };\n proto.values = function () {\n var items = [];\n this.forEach(function (value) {\n items.push(value);\n });\n return createIterator(items);\n };\n proto.entries = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n });\n return createIterator(items);\n };\n if (iteratorSupported) {\n proto[Symbol.iterator] = proto.entries;\n }\n proto.toString = function () {\n var searchArray = [];\n this.forEach(function (value, name) {\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\n });\n return searchArray.join('&');\n };\n global.URLSearchParams = URLSearchParams;\n };\n var checkIfURLSearchParamsSupported = function () {\n try {\n var URLSearchParams = global.URLSearchParams;\n return new URLSearchParams('?a=1').toString() === 'a=1' && typeof URLSearchParams.prototype.set === 'function' && typeof URLSearchParams.prototype.entries === 'function';\n } catch (e) {\n return false;\n }\n };\n if (!checkIfURLSearchParamsSupported()) {\n polyfillURLSearchParams();\n }\n var proto = global.URLSearchParams.prototype;\n if (typeof proto.sort !== 'function') {\n proto.sort = function () {\n var _this = this;\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n if (!_this._entries) {\n _this.delete(name);\n }\n });\n items.sort(function (a, b) {\n if (a[0] < b[0]) {\n return -1;\n } else if (a[0] > b[0]) {\n return +1;\n } else {\n return 0;\n }\n });\n if (_this._entries) {\n // force reset because IE keeps keys index\n _this._entries = {};\n }\n for (var i = 0; i < items.length; i++) {\n this.append(items[i][0], items[i][1]);\n }\n };\n }\n if (typeof proto._fromString !== 'function') {\n Object.defineProperty(proto, '_fromString', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function (searchString) {\n if (this._entries) {\n this._entries = {};\n } else {\n var keys = [];\n this.forEach(function (value, name) {\n keys.push(name);\n });\n for (var i = 0; i < keys.length; i++) {\n this.delete(keys[i]);\n }\n }\n searchString = searchString.replace(/^\\?/, '');\n var attributes = searchString.split('&');\n var attribute;\n for (var i = 0; i < attributes.length; i++) {\n attribute = attributes[i].split('=');\n this.append(deserializeParam(attribute[0]), attribute.length > 1 ? deserializeParam(attribute[1]) : '');\n }\n }\n });\n }\n\n // HTMLAnchorElement\n })(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n (function (global) {\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\n\n var checkIfURLIsSupported = function () {\n try {\n var u = new global.URL('b', 'http://a');\n u.pathname = 'c d';\n return u.href === 'http://a/c%20d' && u.searchParams;\n } catch (e) {\n return false;\n }\n };\n var polyfillURL = function () {\n var _URL = global.URL;\n var URL = function (url, base) {\n if (typeof url !== 'string') url = String(url);\n if (base && typeof base !== 'string') base = String(base);\n\n // Only create another document if the base is different from current location.\n var doc = document,\n baseElement;\n if (base && (global.location === void 0 || base !== global.location.href)) {\n base = base.toLowerCase();\n doc = document.implementation.createHTMLDocument('');\n baseElement = doc.createElement('base');\n baseElement.href = base;\n doc.head.appendChild(baseElement);\n try {\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\n } catch (err) {\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\n }\n }\n var anchorElement = doc.createElement('a');\n anchorElement.href = url;\n if (baseElement) {\n doc.body.appendChild(anchorElement);\n anchorElement.href = anchorElement.href; // force href to refresh\n }\n\n var inputElement = doc.createElement('input');\n inputElement.type = 'url';\n inputElement.value = url;\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || !inputElement.checkValidity() && !base) {\n throw new TypeError('Invalid URL');\n }\n Object.defineProperty(this, '_anchorElement', {\n value: anchorElement\n });\n\n // create a linked searchParams which reflect its changes on URL\n var searchParams = new global.URLSearchParams(this.search);\n var enableSearchUpdate = true;\n var enableSearchParamsUpdate = true;\n var _this = this;\n ['append', 'delete', 'set'].forEach(function (methodName) {\n var method = searchParams[methodName];\n searchParams[methodName] = function () {\n method.apply(searchParams, arguments);\n if (enableSearchUpdate) {\n enableSearchParamsUpdate = false;\n _this.search = searchParams.toString();\n enableSearchParamsUpdate = true;\n }\n };\n });\n Object.defineProperty(this, 'searchParams', {\n value: searchParams,\n enumerable: true\n });\n var search = void 0;\n Object.defineProperty(this, '_updateSearchParams', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function () {\n if (this.search !== search) {\n search = this.search;\n if (enableSearchParamsUpdate) {\n enableSearchUpdate = false;\n this.searchParams._fromString(this.search);\n enableSearchUpdate = true;\n }\n }\n }\n });\n };\n var proto = URL.prototype;\n var linkURLWithAnchorAttribute = function (attributeName) {\n Object.defineProperty(proto, attributeName, {\n get: function () {\n return this._anchorElement[attributeName];\n },\n set: function (value) {\n this._anchorElement[attributeName] = value;\n },\n enumerable: true\n });\n };\n ['hash', 'host', 'hostname', 'port', 'protocol'].forEach(function (attributeName) {\n linkURLWithAnchorAttribute(attributeName);\n });\n Object.defineProperty(proto, 'search', {\n get: function () {\n return this._anchorElement['search'];\n },\n set: function (value) {\n this._anchorElement['search'] = value;\n this._updateSearchParams();\n },\n enumerable: true\n });\n Object.defineProperties(proto, {\n 'toString': {\n get: function () {\n var _this = this;\n return function () {\n return _this.href;\n };\n }\n },\n 'href': {\n get: function () {\n return this._anchorElement.href.replace(/\\?$/, '');\n },\n set: function (value) {\n this._anchorElement.href = value;\n this._updateSearchParams();\n },\n enumerable: true\n },\n 'pathname': {\n get: function () {\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\n },\n set: function (value) {\n this._anchorElement.pathname = value;\n },\n enumerable: true\n },\n 'origin': {\n get: function () {\n // get expected port from protocol\n var expectedPort = {\n 'http:': 80,\n 'https:': 443,\n 'ftp:': 21\n }[this._anchorElement.protocol];\n // add port to origin if, expected port is different than actual port\n // and it is not empty f.e http://foo:8080\n // 8080 != 80 && 8080 != ''\n var addPortToOrigin = this._anchorElement.port != expectedPort && this._anchorElement.port !== '';\n return this._anchorElement.protocol + '//' + this._anchorElement.hostname + (addPortToOrigin ? ':' + this._anchorElement.port : '');\n },\n enumerable: true\n },\n 'password': {\n // TODO\n get: function () {\n return '';\n },\n set: function (value) {},\n enumerable: true\n },\n 'username': {\n // TODO\n get: function () {\n return '';\n },\n set: function (value) {},\n enumerable: true\n }\n });\n URL.createObjectURL = function (blob) {\n return _URL.createObjectURL.apply(_URL, arguments);\n };\n URL.revokeObjectURL = function (url) {\n return _URL.revokeObjectURL.apply(_URL, arguments);\n };\n global.URL = URL;\n };\n if (!checkIfURLIsSupported()) {\n polyfillURL();\n }\n if (global.location !== void 0 && !('origin' in global.location)) {\n var getOrigin = function () {\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? ':' + global.location.port : '');\n };\n try {\n Object.defineProperty(global.location, 'origin', {\n get: getOrigin,\n enumerable: true\n });\n } catch (e) {\n setInterval(function () {\n global.location.origin = getOrigin();\n }, 100);\n }\n }\n })(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n function _defineProperty$1(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n }\n\n function _classCallCheck(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }\n function _defineProperties(e, t) {\n for (var n = 0; n < t.length; n++) {\n var r = t[n];\n r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n }\n }\n function _createClass(e, t, n) {\n return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e;\n }\n function _defineProperty(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n }\n function ownKeys(e, t) {\n var n = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var r = Object.getOwnPropertySymbols(e);\n t && (r = r.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, r);\n }\n return n;\n }\n function _objectSpread2(e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? ownKeys(Object(n), !0).forEach(function (t) {\n _defineProperty(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n return e;\n }\n var defaults$1 = {\n addCSS: !0,\n thumbWidth: 15,\n watch: !0\n };\n function matches$1(e, t) {\n return function () {\n return Array.from(document.querySelectorAll(t)).includes(this);\n }.call(e, t);\n }\n function trigger(e, t) {\n if (e && t) {\n var n = new Event(t, {\n bubbles: !0\n });\n e.dispatchEvent(n);\n }\n }\n var getConstructor$1 = function (e) {\n return null != e ? e.constructor : null;\n },\n instanceOf$1 = function (e, t) {\n return !!(e && t && e instanceof t);\n },\n isNullOrUndefined$1 = function (e) {\n return null == e;\n },\n isObject$1 = function (e) {\n return getConstructor$1(e) === Object;\n },\n isNumber$1 = function (e) {\n return getConstructor$1(e) === Number && !Number.isNaN(e);\n },\n isString$1 = function (e) {\n return getConstructor$1(e) === String;\n },\n isBoolean$1 = function (e) {\n return getConstructor$1(e) === Boolean;\n },\n isFunction$1 = function (e) {\n return getConstructor$1(e) === Function;\n },\n isArray$1 = function (e) {\n return Array.isArray(e);\n },\n isNodeList$1 = function (e) {\n return instanceOf$1(e, NodeList);\n },\n isElement$1 = function (e) {\n return instanceOf$1(e, Element);\n },\n isEvent$1 = function (e) {\n return instanceOf$1(e, Event);\n },\n isEmpty$1 = function (e) {\n return isNullOrUndefined$1(e) || (isString$1(e) || isArray$1(e) || isNodeList$1(e)) && !e.length || isObject$1(e) && !Object.keys(e).length;\n },\n is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$1,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$1,\n nodeList: isNodeList$1,\n element: isElement$1,\n event: isEvent$1,\n empty: isEmpty$1\n };\n function getDecimalPlaces(e) {\n var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n }\n function round(e, t) {\n if (1 > t) {\n var n = getDecimalPlaces(t);\n return parseFloat(e.toFixed(n));\n }\n return Math.round(e / t) * t;\n }\n var RangeTouch = function () {\n function e(t, n) {\n _classCallCheck(this, e), is$1.element(t) ? this.element = t : is$1.string(t) && (this.element = document.querySelector(t)), is$1.element(this.element) && is$1.empty(this.element.rangeTouch) && (this.config = _objectSpread2({}, defaults$1, {}, n), this.init());\n }\n return _createClass(e, [{\n key: \"init\",\n value: function () {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n }\n }, {\n key: \"destroy\",\n value: function () {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n }\n }, {\n key: \"listeners\",\n value: function (e) {\n var t = this,\n n = e ? \"addEventListener\" : \"removeEventListener\";\n [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n t.element[n](e, function (e) {\n return t.set(e);\n }, !1);\n });\n }\n }, {\n key: \"get\",\n value: function (t) {\n if (!e.enabled || !is$1.event(t)) return null;\n var n,\n r = t.target,\n i = t.changedTouches[0],\n o = parseFloat(r.getAttribute(\"min\")) || 0,\n s = parseFloat(r.getAttribute(\"max\")) || 100,\n u = parseFloat(r.getAttribute(\"step\")) || 1,\n c = r.getBoundingClientRect(),\n a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n }\n }, {\n key: \"set\",\n value: function (t) {\n e.enabled && is$1.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n }\n }], [{\n key: \"setup\",\n value: function (t) {\n var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n r = null;\n if (is$1.empty(t) || is$1.string(t) ? r = Array.from(document.querySelectorAll(is$1.string(t) ? t : 'input[type=\"range\"]')) : is$1.element(t) ? r = [t] : is$1.nodeList(t) ? r = Array.from(t) : is$1.array(t) && (r = t.filter(is$1.element)), is$1.empty(r)) return null;\n var i = _objectSpread2({}, defaults$1, {}, n);\n if (is$1.string(t) && i.watch) {\n var o = new MutationObserver(function (n) {\n Array.from(n).forEach(function (n) {\n Array.from(n.addedNodes).forEach(function (n) {\n is$1.element(n) && matches$1(n, t) && new e(n, i);\n });\n });\n });\n o.observe(document.body, {\n childList: !0,\n subtree: !0\n });\n }\n return r.map(function (t) {\n return new e(t, n);\n });\n }\n }, {\n key: \"enabled\",\n get: function () {\n return \"ontouchstart\" in document.documentElement;\n }\n }]), e;\n }();\n\n // ==========================================================================\n // Type checking utils\n // ==========================================================================\n\n const getConstructor = input => input !== null && typeof input !== 'undefined' ? input.constructor : null;\n const instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n const isNullOrUndefined = input => input === null || typeof input === 'undefined';\n const isObject = input => getConstructor(input) === Object;\n const isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\n const isString = input => getConstructor(input) === String;\n const isBoolean = input => getConstructor(input) === Boolean;\n const isFunction = input => typeof input === 'function';\n const isArray = input => Array.isArray(input);\n const isWeakMap = input => instanceOf(input, WeakMap);\n const isNodeList = input => instanceOf(input, NodeList);\n const isTextNode = input => getConstructor(input) === Text;\n const isEvent = input => instanceOf(input, Event);\n const isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\n const isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n const isTrack = input => instanceOf(input, TextTrack) || !isNullOrUndefined(input) && isString(input.kind);\n const isPromise = input => instanceOf(input, Promise) && isFunction(input.then);\n const isElement = input => input !== null && typeof input === 'object' && input.nodeType === 1 && typeof input.style === 'object' && typeof input.ownerDocument === 'object';\n const isEmpty = input => isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;\n const isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (_) {\n return false;\n }\n };\n var is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty\n };\n\n // ==========================================================================\n const transitionEndEvent = (() => {\n const element = document.createElement('span');\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n return is.string(type) ? events[type] : false;\n })();\n\n // Force repaint of element\n function repaint(element, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (_) {\n // Do nothing\n }\n }, delay);\n }\n\n // ==========================================================================\n // Browser sniffing\n // Unfortunately, due to mixed support, UA sniffing is required\n // ==========================================================================\n\n const browser = {\n isIE: Boolean(window.document.documentMode),\n isEdge: /Edge/g.test(navigator.userAgent),\n isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/g.test(navigator.userAgent),\n isIPhone: /iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1,\n isIos: /iPad|iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1\n };\n\n // ==========================================================================\n\n // Clone nested objects\n function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n // Get a nested value in an object\n function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n }\n\n // Deep extend destination object with N more objects\n function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n const source = sources.shift();\n if (!is.object(source)) {\n return target;\n }\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, {\n [key]: {}\n });\n }\n extend(target[key], source[key]);\n } else {\n Object.assign(target, {\n [key]: source[key]\n });\n }\n });\n return extend(target, ...sources);\n }\n\n // ==========================================================================\n\n // Wrap an element\n function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets).reverse().forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n }\n\n // Set attributes\n function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) {\n return;\n }\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes).filter(([, value]) => !is.nullOrUndefined(value)).forEach(([key, value]) => element.setAttribute(key, value));\n }\n\n // Create a DocumentFragment\n function createElement(type, attributes, text) {\n // Create a new \n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n }\n\n // Inaert an element after another\n function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) {\n return;\n }\n target.parentNode.insertBefore(element, target.nextSibling);\n }\n\n // Insert a DocumentFragment\n function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) {\n return;\n }\n parent.appendChild(createElement(type, attributes, text));\n }\n\n // Remove element(s)\n function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n element.parentNode.removeChild(element);\n }\n\n // Remove all child elements\n function emptyElement(element) {\n if (!is.element(element)) {\n return;\n }\n let {\n length\n } = element.childNodes;\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n }\n\n // Replace element\n function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n return null;\n }\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n }\n\n // Get an attribute object from a string selector\n function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) {\n return {};\n }\n const attributes = {};\n const existing = extend({}, existingAttributes);\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n // Get the first character\n const start = selector.charAt(0);\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\n break;\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n case '[':\n // Attribute selector\n attributes[key] = value;\n break;\n }\n });\n return extend(existing, attributes);\n }\n\n // Toggle hidden\n function toggleHidden(element, hidden) {\n if (!is.element(element)) {\n return;\n }\n let hide = hidden;\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\n }\n\n // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n element.classList[method](className);\n return element.classList.contains(className);\n }\n return false;\n }\n\n // Has class name\n function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n }\n\n // Element matches selector\n function matches(element, selector) {\n const {\n prototype\n } = Element;\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n const method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n return method.call(element, selector);\n }\n\n // Closest ancestor element matching selector (also tests element itself)\n function closest$1(element, selector) {\n const {\n prototype\n } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n const method = prototype.closest || closestElement;\n return method.call(element, selector);\n }\n\n // Find all elements\n function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n }\n\n // Find a single element\n function getElement(selector) {\n return this.elements.container.querySelector(selector);\n }\n\n // Set focus and tab focus class\n function setFocus(element = null, tabFocus = false) {\n if (!is.element(element)) {\n return;\n }\n\n // Set regular focus\n element.focus({\n preventScroll: true\n });\n\n // If we want to mimic keyboard focus via tab\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n }\n\n // ==========================================================================\n\n // Default codecs for checking mimetype support\n const defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora'\n };\n\n // Check for feature support\n const support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check(type, provider, playsinline) {\n const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api,\n ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: (() => {\n // While iPhone's support picture-in-picture for some apps, seemingly Safari isn't one of them\n // It will throw the following error when trying to enter picture-in-picture\n // `NotSupportedError: The Picture-in-Picture mode is not supported.`\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n return false;\n })(),\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(input) {\n if (is.empty(input)) {\n return false;\n }\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (_) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches\n };\n\n // ==========================================================================\n\n // Check for passive event listener support\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n const supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (_) {\n // Do nothing\n }\n return supported;\n })();\n\n // Toggle event listener\n function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({\n element,\n type,\n callback,\n options\n });\n }\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n }\n\n // Bind event handler\n function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n }\n\n // Unbind event handler\n function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n }\n\n // Bind once-only event handler\n function once(element, events = '', callback, passive = true, capture = false) {\n const onceCallback = (...args) => {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n };\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n }\n\n // Trigger event\n function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: {\n ...detail,\n plyr: this\n }\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n }\n\n // Unbind all cached event listeners\n function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const {\n element,\n type,\n callback,\n options\n } = item;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n }\n\n // Run method when / if player is ready\n function ready() {\n return new Promise(resolve => this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)).then(() => {});\n }\n\n /**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\n function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n }\n\n // ==========================================================================\n\n // Remove duplicates in an array\n function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n return array.filter((item, index) => array.indexOf(item) === index);\n }\n\n // Get the closest value in an array\n function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n return array.reduce((prev, curr) => Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev);\n }\n\n // ==========================================================================\n\n // Check support for a CSS declaration\n function supportsCSS(declaration) {\n if (!window || !window.CSS) {\n return false;\n }\n return window.CSS.supports(declaration);\n }\n\n // Standard/common aspect ratios\n const standardRatios = [[1, 1], [4, 3], [3, 4], [5, 4], [4, 5], [3, 2], [2, 3], [16, 10], [10, 16], [16, 9], [9, 16], [21, 9], [9, 21], [32, 9], [9, 32]].reduce((out, [x, y]) => ({\n ...out,\n [x / y]: [x, y]\n }), {});\n\n // Validate an aspect ratio\n function validateAspectRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n const ratio = is.array(input) ? input : input.split(':');\n return ratio.map(Number).every(is.number);\n }\n\n // Reduce an aspect ratio to it's lowest form\n function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n const [width, height] = ratio;\n const getDivider = (w, h) => h === 0 ? w : getDivider(h, w % h);\n const divider = getDivider(width, height);\n return [width / divider, height / divider];\n }\n\n // Calculate an aspect ratio\n function getAspectRatio(input) {\n const parse = ratio => validateAspectRatio(ratio) ? ratio.split(':').map(Number) : null;\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({\n ratio\n } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const {\n videoWidth,\n videoHeight\n } = this.media;\n ratio = [videoWidth, videoHeight];\n }\n return reduceAspectRatio(ratio);\n }\n\n // Set aspect ratio for responsive container\n function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n const {\n wrapper\n } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n if (!is.array(ratio)) {\n return {};\n }\n const [x, y] = reduceAspectRatio(ratio);\n const useNative = supportsCSS(`aspect-ratio: ${x}/${y}`);\n const padding = 100 / x * y;\n if (useNative) {\n wrapper.style.aspectRatio = `${x}/${y}`;\n } else {\n wrapper.style.paddingBottom = `${padding}%`;\n }\n\n // For Vimeo we have an extra
to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.add(this.config.classNames.videoFixedRatio);\n }\n return {\n padding,\n ratio\n };\n }\n\n // Round an aspect ratio to closest standard ratio\n function roundAspectRatio(x, y, tolerance = 0.05) {\n const ratio = x / y;\n const closestRatio = closest(Object.keys(standardRatios), ratio);\n\n // Check match is within tolerance\n if (Math.abs(closestRatio - ratio) <= tolerance) {\n return standardRatios[closestRatio];\n }\n\n // No match\n return [x, y];\n }\n\n // Get the size of the viewport\n // https://stackoverflow.com/questions/1248081/how-to-get-the-browser-viewport-dimensions\n function getViewportSize() {\n const width = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);\n const height = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);\n return [width, height];\n }\n\n // ==========================================================================\n const html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources (if type is specified)\n return sources.filter(source => {\n const type = source.getAttribute('type');\n if (is.empty(type)) {\n return true;\n }\n return support.mime.call(this, type);\n });\n },\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\n // Get sizes from elements\n return html5.getSources.call(this).map(source => Number(source.getAttribute('size'))).filter(Boolean);\n },\n setup() {\n if (!this.isHTML5) {\n return;\n }\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(s => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find(s => Number(s.getAttribute('size')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const {\n currentTime,\n paused,\n preload,\n readyState,\n playbackRate\n } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n }\n };\n\n // ==========================================================================\n\n // Generate a random ID\n function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n }\n\n // Format string\n function format(input, ...args) {\n if (is.empty(input)) return input;\n return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n }\n\n // Get percentage\n function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n return (current / max * 100).toFixed(2);\n }\n\n // Replace all occurrences of a string in a string\n const replaceAll = (input = '', find = '', replace = '') => input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n // Convert to title case\n const toTitleCase = (input = '') => input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.slice(1).toLowerCase());\n\n // Convert string to pascalCase\n function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n }\n\n // Convert string to pascalCase\n function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n }\n\n // Remove HTML from a string\n function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n }\n\n // Like outerHTML, but also works for DocumentFragment\n function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n }\n\n // ==========================================================================\n\n // Skip i18n for abbreviations and brand names\n const resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n };\n const i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n let string = getDeep(config.i18n, key);\n if (is.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n return '';\n }\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\n });\n return string;\n }\n };\n\n class Storage {\n constructor(player) {\n _defineProperty$1(this, \"get\", key => {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n const store = window.localStorage.getItem(this.key);\n if (is.empty(store)) {\n return null;\n }\n const json = JSON.parse(store);\n return is.string(key) && key.length ? json[key] : json;\n });\n _defineProperty$1(this, \"set\", object => {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n try {\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n } catch (_) {\n // Do nothing\n }\n });\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (_) {\n return false;\n }\n }\n }\n\n // ==========================================================================\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n // ==========================================================================\n\n function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (_) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n request.send();\n } catch (error) {\n reject(error);\n }\n });\n }\n\n // ==========================================================================\n\n // Load an external SVG sprite\n function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n const exists = () => document.getElementById(id) !== null;\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url).then(result => {\n if (is.empty(result)) {\n return;\n }\n if (useStorage) {\n try {\n window.localStorage.setItem(`${prefix}-${id}`, JSON.stringify({\n content: result\n }));\n } catch (_) {\n // Do nothing\n }\n }\n update(container, result);\n }).catch(() => {});\n }\n }\n\n // ==========================================================================\n\n // Time helpers\n const getHours = value => Math.trunc(value / 60 / 60 % 60, 10);\n const getMinutes = value => Math.trunc(value / 60 % 60, 10);\n const getSeconds = value => Math.trunc(value % 60, 10);\n\n // Format time to UI friendly string\n function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n }\n\n // ==========================================================================\n\n // TODO: Don't export a massive object - break down and create class\n const controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const host = window.location.host ? window.location.host : window.top.location.host;\n const cors = url.host !== host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors\n };\n },\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume)\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration)\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`);\n }\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n // Create \n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n 'aria-hidden': 'true',\n focusable: 'false'\n }));\n\n // Create the to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add to \n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = {\n ...attr,\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n };\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n const badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a
`);\n }\n\n // Set position\n tipElement.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || !this.config.invertTime && this.currentTime) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n if (this.config.markers.enabled) {\n controls.setMarkers.call(this);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n if (is.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}×`;\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n if (!label.length) {\n return `${value}p`;\n }\n return label;\n }\n return toTitleCase(value);\n case 'captions':\n return captions.getLabel.call(this);\n default:\n return null;\n }\n },\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n if (!label.length) {\n return null;\n }\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality.sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language'\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language'\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Filter out invalid speeds\n this.options.speed = this.options.speed.filter(o => o >= this.minimumSpeed && o <= this.maximumSpeed);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const {\n buttons\n } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, tabFocus = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n let target = pane;\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(p => !p.hidden);\n }\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu(input) {\n const {\n popup\n } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const {\n hidden\n } = popup;\n let show = hidden;\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.key === 'Escape') {\n show = false;\n } else if (is.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n return {\n width,\n height\n };\n },\n // Show a panel in the menu\n showMenuPanel(type = '', tabFocus = false) {\n const target = this.elements.container.querySelector(`#plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = {\n class: 'plyr__controls__item'\n };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach(control => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`\n });\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`\n }));\n\n // Buffer progress\n progress.appendChild(createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement('span', {\n class: this.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n this.elements.progress = progress;\n progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let {\n volume\n } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement('div', extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim()\n }));\n this.elements.volume = volume;\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume\n };\n\n // Create the volume range slider\n volume.appendChild(createRange.call(this, 'volume', extend(attributes, {\n id: `plyr-volume-${data.id}`\n })));\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement('div', extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: ''\n }));\n wrapper.appendChild(createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false\n }));\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: ''\n });\n const inner = createElement('div');\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement('button', extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n }));\n\n // Bind menu shortcuts for keyboard users\n bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n showMenuPanel.call(this, type, false);\n });\n const flex = createElement('span', null, i18n.get(type, this.config));\n const value = createElement('span', {\n class: this.config.classNames.menu.value\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: ''\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`\n });\n\n // Visible label\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, this.config)));\n\n // Screen reader label\n backButton.appendChild(createElement('span', {\n class: this.config.classNames.hidden\n }, i18n.get('menuBack', this.config)));\n\n // Go back via keyboard\n on.call(this, pane, 'keydown', event => {\n if (event.key !== 'ArrowLeft') return;\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n showMenuPanel.call(this, 'home', true);\n }, false);\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank'\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n const {\n download\n } = this.config.urls;\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider\n });\n }\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this)\n // TODO: Looping\n // loop: 'None',\n });\n\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n button.setAttribute('aria-pressed', 'false');\n Object.defineProperty(button, 'pressed', {\n configurable: true,\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n button.setAttribute('aria-pressed', pressed ? 'true' : 'false');\n }\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons).filter(Boolean).forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a repaint\n if (browser.isEdge) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const {\n classNames,\n selectors\n } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n // Set media metadata\n setMediaMetadata() {\n try {\n if ('mediaSession' in navigator) {\n navigator.mediaSession.metadata = new window.MediaMetadata({\n title: this.config.mediaMetadata.title,\n artist: this.config.mediaMetadata.artist,\n album: this.config.mediaMetadata.album,\n artwork: this.config.mediaMetadata.artwork\n });\n }\n } catch (_) {\n // Do nothing\n }\n },\n // Add markers\n setMarkers() {\n var _this$config$markers2, _this$config$markers3;\n if (!this.duration || this.elements.markers) return;\n\n // Get valid points\n const points = (_this$config$markers2 = this.config.markers) === null || _this$config$markers2 === void 0 ? void 0 : (_this$config$markers3 = _this$config$markers2.points) === null || _this$config$markers3 === void 0 ? void 0 : _this$config$markers3.filter(({\n time\n }) => time > 0 && time < this.duration);\n if (!(points !== null && points !== void 0 && points.length)) return;\n const containerFragment = document.createDocumentFragment();\n const pointsFragment = document.createDocumentFragment();\n let tipElement = null;\n const tipVisible = `${this.config.classNames.tooltip}--visible`;\n const toggleTip = show => toggleClass(tipElement, tipVisible, show);\n\n // Inject markers to progress container\n points.forEach(point => {\n const markerElement = createElement('span', {\n class: this.config.classNames.marker\n }, '');\n const left = `${point.time / this.duration * 100}%`;\n if (tipElement) {\n // Show on hover\n markerElement.addEventListener('mouseenter', () => {\n if (point.label) return;\n tipElement.style.left = left;\n tipElement.innerHTML = point.label;\n toggleTip(true);\n });\n\n // Hide on leave\n markerElement.addEventListener('mouseleave', () => {\n toggleTip(false);\n });\n }\n markerElement.addEventListener('click', () => {\n this.currentTime = point.time;\n });\n markerElement.style.left = left;\n pointsFragment.appendChild(markerElement);\n });\n containerFragment.appendChild(pointsFragment);\n\n // Inject a tooltip if needed\n if (!this.config.tooltips.seek) {\n tipElement = createElement('span', {\n class: this.config.classNames.tooltip\n }, '');\n containerFragment.appendChild(tipElement);\n }\n this.elements.markers = {\n points: pointsFragment,\n tip: tipElement\n };\n this.elements.progress.appendChild(containerFragment);\n }\n };\n\n // ==========================================================================\n\n /**\n * Parse a string to a URL object\n * @param {String} input - the URL to be parsed\n * @param {Boolean} safe - failsafe parsing\n */\n function parseUrl(input, safe = true) {\n let url = input;\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n try {\n return new URL(url);\n } catch (_) {\n return null;\n }\n }\n\n // Convert object to URLSearchParams\n function buildUrlParams(input) {\n const params = new URLSearchParams();\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n return params;\n }\n\n // ==========================================================================\n const captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n this.elements.captions.setAttribute('dir', 'auto');\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({\n active\n } = this.config.captions);\n }\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const {\n active,\n language,\n meta,\n currentTrackNode\n } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing'\n });\n\n // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n if (this.elements) {\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n }\n\n // Update available languages in list\n if (is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n const {\n toggled\n } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n\n // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\n });\n },\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const {\n language\n } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language\n });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks.filter(track => !this.isHTML5 || update || this.captions.meta.has(track)).filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(t => t.language === language);\n return !track; // Break iteration if there is a match\n });\n\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n return i18n.get('enabled', this.config);\n }\n return i18n.get('disabled', this.config);\n },\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(cue => cue.getCueAsHTML()).map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n };\n\n // ==========================================================================\n // Plyr default config\n // ==========================================================================\n\n const defaults = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n playsinline: true,\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.7.3/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null\n },\n // Set loops\n loop: {\n active: false\n // start: null,\n // end: null,\n },\n\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\n },\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false\n },\n // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n },\n\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress', 'current-time',\n // 'duration',\n 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay',\n // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD'\n }\n },\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/oembed.json?url={0}'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\n }\n },\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange',\n // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready',\n // YouTube\n 'statechange',\n // Quality\n 'qualitychange',\n // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls'\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]'\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]'\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption'\n },\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n marker: 'plyr__progress__marker',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time'\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open'\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active'\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback'\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active'\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active'\n },\n tabFocus: 'plyr__tab-focus',\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n hash: 'data-plyr-embed-hash'\n }\n },\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null,\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false\n },\n // YouTube plugin\n youtube: {\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1,\n // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false // Whether to use an alternative version of YouTube without cookies\n },\n\n // Media Metadata\n mediaMetadata: {\n title: '',\n artist: '',\n album: '',\n artwork: []\n },\n // Markers\n markers: {\n enabled: false,\n points: []\n }\n };\n\n // ==========================================================================\n // Plyr states\n // ==========================================================================\n\n const pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n };\n\n // ==========================================================================\n // Plyr supported types and providers\n // ==========================================================================\n\n const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n };\n const types = {\n audio: 'audio',\n video: 'video'\n };\n\n /**\n * Get provider by URL\n * @param {String} url\n */\n function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n return null;\n }\n\n // ==========================================================================\n // Console wrapper\n // ==========================================================================\n\n const noop = () => {};\n class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }\n\n class Fullscreen {\n constructor(player) {\n _defineProperty$1(this, \"onChange\", () => {\n if (!this.enabled) {\n return;\n }\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n });\n _defineProperty$1(this, \"toggleFallback\", (toggle = false) => {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX || 0,\n y: window.scrollY || 0\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n if (!hasProperty) {\n viewport.content += `,${property}`;\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(part => part.trim() !== property).join(',');\n }\n }\n\n // Toggle button and fire events\n this.onChange();\n });\n _defineProperty$1(this, \"trapFocus\", event => {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab') {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n });\n _defineProperty$1(this, \"update\", () => {\n if (this.enabled) {\n let mode;\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n this.player.debug.log(`${mode} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n });\n _defineProperty$1(this, \"enter\", () => {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.isVimeo) {\n this.player.embed.requestFullscreen();\n } else {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({\n navigationUI: 'hide'\n });\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n });\n _defineProperty$1(this, \"exit\", () => {\n if (!this.enabled) {\n return;\n }\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n });\n _defineProperty$1(this, \"toggle\", () => {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n });\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = {\n x: 0,\n y: 0\n };\n\n // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen = player.config.fullscreen.container && closest$1(this.player.elements.container, player.config.fullscreen.container);\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n this.onChange();\n });\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n this.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', event => this.trapFocus(event));\n\n // Update the UI\n this.update();\n\n // this.toggle = this.toggle.bind(this);\n }\n\n // Determine if native supported\n static get native() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) {\n return '';\n }\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n return false;\n });\n return value;\n }\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is enabled\n get enabled() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n }\n\n // Get active state\n get active() {\n if (!this.enabled) {\n return false;\n }\n\n // Fallback using classname\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n const element = !this.prefix ? this.target.getRootNode().fullscreenElement : this.target.getRootNode()[`${this.prefix}${this.property}Element`];\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen || this.player.elements.container;\n }\n }\n\n // ==========================================================================\n // Load image avoiding xhr/fetch CORS issues\n // Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n // By default it checks if it is at least 1px, but you can add a second argument to change this\n // ==========================================================================\n\n function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src\n });\n });\n }\n\n // ==========================================================================\n const ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Reset duration display\n controls.durationUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add iOS class\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n\n // Media metadata\n if (this.config.mediaMetadata) {\n controls.setMediaMetadata.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\n\n // Wait until ui is ready\n return ready.call(this)\n // Load image\n .then(() => loadImage(poster)).catch(error => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw error;\n }).then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: ''\n });\n ui.togglePoster.call(this, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n Object.assign(target, {\n pressed: this.playing\n });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const {\n controls: controlsElement\n } = this.elements;\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n }\n },\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({\n ...this.media.style\n })\n // We're only fussed about Plyr specific properties\n .filter(key => !is.empty(key) && is.string(key) && key.startsWith('--plyr')).forEach(key => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n }\n };\n\n class Listeners {\n constructor(_player) {\n _defineProperty$1(this, \"firstTouch\", () => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n });\n _defineProperty$1(this, \"setTabFocus\", event => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n const {\n key,\n type,\n timeStamp\n } = event;\n clearTimeout(this.focusTimer);\n\n // Ignore any key other than tab\n if (type === 'keydown' && key !== 'Tab') {\n return;\n }\n\n // Store reference to event timeStamp\n if (type === 'keydown') {\n this.lastKeyDown = timeStamp;\n }\n\n // Remove current classes\n const removeCurrent = () => {\n const className = player.config.classNames.tabFocus;\n const current = getElements.call(player, `.${className}`);\n toggleClass(current, className, false);\n };\n\n // Determine if a key was pressed to trigger this event\n const wasKeyDown = timeStamp - this.lastKeyDown <= 20;\n\n // Ignore focus events if a key was pressed prior\n if (type === 'focus' && !wasKeyDown) {\n return;\n }\n\n // Remove all current\n removeCurrent();\n\n // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n if (type !== 'focusout') {\n this.focusTimer = setTimeout(() => {\n const focused = document.activeElement;\n\n // Ignore if current focus element isn't inside the player\n if (!elements.container.contains(focused)) {\n return;\n }\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n });\n _defineProperty$1(this, \"global\", (toggle = true) => {\n const {\n player\n } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n\n // Tab focus detection\n toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true);\n });\n _defineProperty$1(this, \"container\", () => {\n const {\n player\n } = this;\n const {\n config,\n elements,\n timers\n } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const {\n controls: controlsElement\n } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n let delay = 0;\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Set a gutter for Vimeo\n const setGutter = () => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n const target = elements.wrapper;\n const {\n active\n } = player.fullscreen;\n const [videoWidth, videoHeight] = getAspectRatio.call(player);\n const useNativeAspectRatio = supportsCSS(`aspect-ratio: ${videoWidth} / ${videoHeight}`);\n\n // If not active, remove styles\n if (!active) {\n if (useNativeAspectRatio) {\n target.style.width = null;\n target.style.height = null;\n } else {\n target.style.maxWidth = null;\n target.style.margin = null;\n }\n return;\n }\n\n // Determine which dimension will overflow and constrain view\n const [viewportWidth, viewportHeight] = getViewportSize();\n const overflow = viewportWidth / viewportHeight > videoWidth / videoHeight;\n if (useNativeAspectRatio) {\n target.style.width = overflow ? 'auto' : '100%';\n target.style.height = overflow ? '100%' : 'auto';\n } else {\n target.style.maxWidth = overflow ? `${viewportHeight / videoHeight * videoWidth}px` : null;\n target.style.margin = overflow ? '0 auto' : null;\n }\n };\n\n // Handle resizing\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setGutter, 50);\n };\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', event => {\n const {\n target\n } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n // Set Vimeo gutter\n setGutter();\n\n // Watch for resizes\n const method = event.type === 'enterfullscreen' ? on : off;\n method.call(player, window, 'resize', resized);\n });\n });\n _defineProperty$1(this, \"media\", () => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(player, event));\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n\n // Call pause otherwise IE11 will start playing the video again\n player.pause();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(player, event));\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(player, event));\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n if (player.ended) {\n this.proxy(event, player.restart, 'restart');\n this.proxy(event, () => {\n silencePromise(player.play());\n }, 'play');\n } else {\n this.proxy(event, () => {\n silencePromise(player.togglePlay());\n }, 'play');\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', event => {\n event.preventDefault();\n }, false);\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({\n speed: player.speed\n });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, event => {\n let {\n detail = {}\n } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n });\n _defineProperty$1(this, \"proxy\", (event, defaultHandler, customHandlerKey) => {\n const {\n player\n } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned !== false && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n });\n _defineProperty$1(this, \"bind\", (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const {\n player\n } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n on.call(player, element, type, event => this.proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n });\n _defineProperty$1(this, \"controls\", () => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', () => {\n silencePromise(player.togglePlay());\n }, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n }, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n }, 'fastForward');\n\n // Mute toggle\n this.bind(elements.buttons.mute, 'click', () => {\n player.muted = !player.muted;\n }, 'mute');\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(elements.buttons.download, 'click', () => {\n triggerEvent.call(player, player.media, 'download');\n }, 'download');\n\n // Fullscreen toggle\n this.bind(elements.buttons.fullscreen, 'click', () => {\n player.fullscreen.toggle();\n }, 'fullscreen');\n\n // Picture-in-Picture\n this.bind(elements.buttons.pip, 'click', () => {\n player.pip = 'toggle';\n }, 'pip');\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n controls.toggleMenu.call(player, event);\n }, null, false); // Can't be passive as we're preventing default\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(elements.buttons.settings, 'keyup', event => {\n if (!['Space', 'Enter'].includes(event.key)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (event.key === 'Enter') {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.key === 'Escape') {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const attribute = 'play-on-seeked';\n if (is.keyboardEvent(event) && !['ArrowLeft', 'ArrowRight'].includes(event.key)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an ,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(elements.inputs.seek, inputEvent, event => {\n const seek = event.currentTarget;\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek');\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(player, event));\n\n // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', event => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', event => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n this.bind(elements.progress, 'mouseup touchend', event => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n });\n\n // Polyfill for lower fill in for webkit\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n player.config.invertTime = !player.config.invertTime;\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(elements.inputs.volume, inputEvent, event => {\n player.volume = event.target.value;\n }, 'volume');\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children).filter(c => !c.contains(elements.container)).forEach(child => {\n this.bind(child, 'mouseenter mouseleave', event => {\n if (elements.controls) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }\n });\n });\n }\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const {\n config,\n timers\n } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(elements.inputs.volume, 'wheel', event => {\n // Detect \"natural\" scroll - supported on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => inverted ? -value : value);\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const {\n volume\n } = player.media;\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n });\n this.player = _player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.setTabFocus = this.setTabFocus.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n const {\n key,\n type,\n altKey,\n ctrlKey,\n metaKey,\n shiftKey\n } = event;\n const pressed = type === 'keydown';\n const repeat = pressed && key === this.lastKey;\n\n // Bail if a modifier key is set\n if (altKey || ctrlKey || metaKey || shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the key for whatever reason\n if (!key) {\n return;\n }\n\n // Seek by increment\n const seekByIncrement = increment => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * increment;\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const {\n editable\n } = player.config.selectors;\n const {\n seek\n } = elements.inputs;\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n if (event.key === 'Space' && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keys should we prevent default\n const preventDefault = ['Space', 'ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'c', 'f', 'k', 'l', 'm'];\n\n // If the key is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(key)) {\n event.preventDefault();\n event.stopPropagation();\n }\n switch (key) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n if (!repeat) {\n seekByIncrement(parseInt(key, 10));\n }\n break;\n case 'Space':\n case 'k':\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\n break;\n case 'ArrowUp':\n player.increaseVolume(0.1);\n break;\n case 'ArrowDown':\n player.decreaseVolume(0.1);\n break;\n case 'm':\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n case 'ArrowRight':\n player.forward();\n break;\n case 'ArrowLeft':\n player.rewind();\n break;\n case 'f':\n player.fullscreen.toggle();\n break;\n case 'c':\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n case 'l':\n player.loop = !player.loop;\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (key === 'Escape' && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n }\n\n // Store last key for next cycle\n this.lastKey = key;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n\n // Device is touch enabled\n }\n\n var loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\n var devnull = function () {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n }\n\n /**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n };\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n function loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n numTries = numTries || 0;\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped;\n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function (path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i = 0; i < x; i++) loadFile(paths[i], fn, args);\n }\n\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\n */\n function loadjs(paths, arg1, arg2) {\n var bundleId, args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // resolve Promise\n if (resolve) {\n executeCallbacks({\n success: resolve,\n error: reject\n }, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n if (args.returnPromise) return new Promise(loadFn);else loadFn();\n }\n\n /**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\n loadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n return loadjs;\n };\n\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n\n /**\n * Reset loadjs dependencies statuses\n */\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n };\n\n // export\n return loadjs;\n });\n });\n\n // ==========================================================================\n function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n }\n\n // ==========================================================================\n\n // Parse Vimeo ID from URL\n function parseId$1(url) {\n if (is.empty(url)) {\n return null;\n }\n if (is.number(Number(url))) {\n return url;\n }\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n }\n\n // Try to extract a hash for private videos from the URL\n function parseHash(url) {\n /* This regex matches a hexadecimal hash if given in any of these forms:\n * - [https://player.]vimeo.com/video/{id}/{hash}[?params]\n * - [https://player.]vimeo.com/video/{id}?h={hash}[¶ms]\n * - [https://player.]vimeo.com/video/{id}?[params]&h={hash}\n * - video/{id}/{hash}\n * If matched, the hash is available in capture group 4\n */\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+)(\\?.*&*h=|\\/)+([\\d,a-f]+)/;\n const found = url.match(regex);\n return found && found.length === 5 ? found[4] : null;\n }\n\n // Set playback state and trigger change (only on actual change)\n function assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n const vimeo = {\n setup() {\n const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk).then(() => {\n vimeo.ready.call(player);\n }).catch(error => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const {\n premium,\n referrerPolicy,\n ...frameParams\n } = config;\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n let hash = '';\n // Get from
if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n // hash can also be set as attribute on the
\n hash = player.media.getAttribute(player.config.attributes.embed.hash);\n } else {\n hash = parseHash(source);\n }\n const hashParam = hash ? {\n h: hash\n } : {};\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n // hash has to be added to iframe-URL\n ...hashParam,\n ...frameParams\n });\n const id = parseId$1(source);\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture', 'encrypted-media', 'accelerometer', 'gyroscope'].join('; '));\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then(response => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\n }\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState$1.call(player, true);\n return player.embed.play();\n };\n player.media.pause = () => {\n assurePlaybackState$1.call(player, false);\n return player.embed.pause();\n };\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let {\n currentTime\n } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const {\n embed,\n media,\n paused,\n volume\n } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume)).catch(() => {\n // Do nothing\n });\n }\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed.setPlaybackRate(input).then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n }\n });\n\n // Volume\n let {\n volume\n } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n });\n\n // Muted\n let {\n muted\n } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n });\n\n // Loop\n let {\n loop\n } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n }\n });\n\n // Source\n let currentSrc;\n player.embed.getVideoUrl().then(value => {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n }).catch(error => {\n this.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n }\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n }\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const [width, height] = dimensions;\n player.embed.ratio = roundAspectRatio(width, height);\n setAspectRatio.call(this);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', ({\n cues = []\n }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState$1.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('play', () => {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', () => {\n assurePlaybackState$1.call(player, false);\n });\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\n }\n };\n\n // ==========================================================================\n\n // Parse YouTube ID from URL\n function parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n }\n\n // Set playback state and trigger change (only on actual change)\n function assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n function getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n }\n const youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n fetch(url).then(data => {\n if (is.object(data)) {\n const {\n title,\n height,\n width\n } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = roundAspectRatio(width, height);\n }\n setAspectRatio.call(this);\n }).catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from
if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the