{"version":3,"file":"THEOplayerUI.node.mjs","sources":["../node_modules/@swc/helpers/esm/_apply_decs_2203_r.js","../node_modules/@swc/helpers/esm/_identity.js","../src/util/Attribute.ts","../src/util/KeyCode.ts","../src/extensions/ExtensionSlot.ts","../src/components/ControlBar.ts","../src/components/Button.ts","../src/components/LinkButton.ts","../src/components/SlotContainer.ts","../src/components/PlayButton.ts","../src/components/MuteButton.ts","../src/components/SeekButton.ts","../src/components/TimeDisplay.ts","../src/components/DurationDisplay.ts","../src/components/RadioButton.ts","../src/components/RadioGroup.ts","../src/components/Menu.ts","../src/components/MenuGroup.ts","../src/components/MenuButton.ts","../src/components/CloseMenuButton.ts","../src/components/MediaTrackRadioButton.ts","../src/components/TrackRadioGroup.ts","../src/components/TextTrackRadioButton.ts","../src/components/TextTrackOffRadioButton.ts","../src/components/TextTrackStyleDisplay.ts","../src/components/TextTrackStyleRadioGroup.ts","../src/components/TextTrackStyleMenu.ts","../src/components/LanguageMenu.ts","../src/components/LanguageMenuButton.ts","../src/components/PlaybackRateRadioGroup.ts","../src/components/PlaybackRateMenuButton.ts","../src/components/PlaybackRateMenu.ts","../src/components/PlaybackRateDisplay.ts","../src/components/ActiveQualityDisplay.ts","../src/components/QualityRadioButton.ts","../src/components/QualityRadioGroup.ts","../src/components/TextTrackStyleResetButton.ts","../src/components/SettingsMenu.ts","../src/components/SettingsMenuButton.ts","../src/components/FullscreenButton.ts","../src/components/VRButton.ts","../src/components/VRCompass.ts","../src/components/Range.ts","../src/components/PreviewThumbnail.ts","../src/components/PreviewTimeDisplay.ts","../src/components/TimeRange.ts","../src/components/VolumeRange.ts","../src/components/ErrorDisplay.ts","../src/components/ChromecastButton.ts","../src/components/ChromecastDisplay.ts","../src/components/AirPlayButton.ts","../src/components/LoadingIndicator.ts","../src/components/GestureReceiver.ts","../src/components/LiveButton.ts","../src/components/ads/AdDisplay.ts","../src/components/ads/AdCountdown.ts","../src/components/ads/AdClickThroughButton.ts","../src/components/ads/AdSkipButton.ts","../src/components/theolive/quality/AbstractQualitySelector.ts","../src/components/theolive/quality/AutomaticQualitySelector.ts","../src/components/theolive/quality/BadNetworkModeButton.ts","../src/components/theolive/quality/BadNetworkModeSelector.ts","../src/components/theolive/quality/BadNetworkModeMenu.ts","../src/UIContainer.ts","../src/DefaultUI.ts","../src/THEOliveDefaultUI.ts","../node_modules/@swc/helpers/esm/_class_private_field_loose_base.js","../node_modules/@swc/helpers/esm/_class_private_field_loose_key.js","../src/util/CommonUtils.ts","../src/components/StateReceiverMixin.ts","../src/i18n/DurationFormatter.ts","../src/i18n/PercentageFormatter.ts","../src/i18n/BandwidthFormatter.ts","../src/i18n/LanguageFormatter.ts","../src/i18n/Locale.ts","../src/i18n/LocaleRegistry.ts","../src/util/TimeUtils.ts","../src/util/EventUtils.ts","../src/util/GeometryUtils.ts","../src/util/KeyboardNavigation.ts","../src/events/CloseMenuEvent.ts","../src/events/MenuChangeEvent.ts","../src/events/ToggleMenuEvent.ts","../src/util/TrackUtils.ts","../src/util/TextTrackStylePresets.ts","../src/util/ColorUtils.ts","../src/events/EnterFullscreenEvent.ts","../src/events/ExitFullscreenEvent.ts","../node_modules/@webcomponents/shadycss/src/interface.js","../src/util/ColorStops.ts","../src/events/PreviewTimeChangeEvent.ts","../src/util/AdUtils.ts","../src/components/CastButton.ts","../src/components/ChromecastButton.html.ts","../src/components/AirPlayButton.html.ts","../src/components/LoadingIndicator.html.ts","../src/extensions/ExtensionRegistry.ts","../src/util/FullscreenUtils.ts","../src/util/Environment.ts","../src/events/UserIdleChangeEvent.ts","../src/events/ReadyEvent.ts","../src/Global.ts","../src/events/StreamTypeChangeEvent.ts","../src/util/Constants.ts","../src/version.ts"],"sourcesContent":["/* @minVersion 7.20.0 */\n\n/**\n  Enums are used in this file, but not assigned to vars to avoid non-hoistable values\n\n  CONSTRUCTOR = 0;\n  PUBLIC = 1;\n  PRIVATE = 2;\n\n  FIELD = 0;\n  ACCESSOR = 1;\n  METHOD = 2;\n  GETTER = 3;\n  SETTER = 4;\n\n  STATIC = 5;\n\n  CLASS = 10; // only used in assertValidReturnValue\n*/\n\nfunction _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {\n    function createAddInitializerMethod(initializers, decoratorFinishedRef) {\n        return function addInitializer(initializer) {\n            assertNotFinished(decoratorFinishedRef, \"addInitializer\");\n            assertCallable(initializer, \"An initializer\");\n            initializers.push(initializer);\n        };\n    }\n\n    function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {\n        var kindStr;\n\n        switch (kind) {\n            case 1 /* ACCESSOR */:\n                kindStr = \"accessor\";\n                break;\n            case 2 /* METHOD */:\n                kindStr = \"method\";\n                break;\n            case 3 /* GETTER */:\n                kindStr = \"getter\";\n                break;\n            case 4 /* SETTER */:\n                kindStr = \"setter\";\n                break;\n            default:\n                kindStr = \"field\";\n        }\n\n        var ctx = { kind: kindStr, name: isPrivate ? \"#\" + name : name, static: isStatic, private: isPrivate, metadata: metadata };\n\n        var decoratorFinishedRef = { v: false };\n\n        ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);\n\n        var get, set;\n        if (kind === 0 /* FIELD */) {\n            if (isPrivate) {\n                get = desc.get;\n                set = desc.set;\n            } else {\n                get = function() {\n                    return this[name];\n                };\n                set = function(v) {\n                    this[name] = v;\n                };\n            }\n        } else if (kind === 2 /* METHOD */) {\n            get = function() {\n                return desc.value;\n            };\n        } else {\n            // replace with values that will go through the final getter and setter\n            if (kind === 1 /* ACCESSOR */ || kind === 3 /* GETTER */) {\n                get = function() {\n                    return desc.get.call(this);\n                };\n            }\n\n            if (kind === 1 /* ACCESSOR */ || kind === 4 /* SETTER */) {\n                set = function(v) {\n                    desc.set.call(this, v);\n                };\n            }\n        }\n\n        if (get) {\n            var originalGet = get;\n            get = function(target) {\n                if (arguments.length === 0) {\n                    target = this;\n                }\n                return originalGet.call(target);\n            };\n        }\n\n        if (set) {\n            var originalSet = set;\n            set = function(target, value) {\n                if (arguments.length === 1) {\n                    value = target;\n                    target = this;\n                }\n                return originalSet.call(target, value);\n            };\n        }\n\n        if (isPrivate) {\n            ctx.access = get && set ? { get: get, set: set } : get ? { get: get } : { set: set };\n        } else {\n            var has = function(target) {\n                return name in target;\n            };\n            ctx.access = get && set ? { has: has, get: get, set: set } : get ? { has: has, get: get } : { has: has, set: set };\n        }\n\n        var newValue = dec(value, ctx);\n        decoratorFinishedRef.v = true;\n        return newValue;\n    }\n\n    function assertNotFinished(decoratorFinishedRef, fnName) {\n        if (decoratorFinishedRef.v) {\n            throw new Error(\"attempted to call \" + fnName + \" after decoration was finished\");\n        }\n    }\n\n    function assertCallable(fn, hint) {\n        if (typeof fn !== \"function\") {\n            throw new TypeError(hint + \" must be a function\");\n        }\n    }\n\n    function assertValidReturnValue(kind, value) {\n        var type = typeof value;\n\n        if (kind === 1 /* ACCESSOR */) {\n            if (type !== \"object\" || value === null) {\n                throw new TypeError(\"accessor decorators must return an object with get, set, or init properties or void 0\");\n            }\n            if (value.get !== undefined) {\n                assertCallable(value.get, \"accessor.get\");\n            }\n            if (value.set !== undefined) {\n                assertCallable(value.set, \"accessor.set\");\n            }\n            if (value.init !== undefined) {\n                assertCallable(value.init, \"accessor.init\");\n            }\n        } else if (type !== \"function\") {\n            var hint;\n            if (kind === 0 /* FIELD */) {\n                hint = \"field\";\n            } else if (kind === 10 /* CLASS */) {\n                hint = \"class\";\n            } else {\n                hint = \"method\";\n            }\n            throw new TypeError(hint + \" decorators must return a function or void 0\");\n        }\n    }\n\n    function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {\n        var decs = decInfo[0];\n\n        var desc, init, value;\n\n        if (isPrivate) {\n            if (kind === 0 /* FIELD */ || kind === 1 /* ACCESSOR */) {\n                desc = { get: decInfo[3], set: decInfo[4] };\n            } else if (kind === 3 /* GETTER */) {\n                desc = { get: decInfo[3] };\n            } else if (kind === 4 /* SETTER */) {\n                desc = { set: decInfo[3] };\n            } else {\n                desc = { value: decInfo[3] };\n            }\n        } else if (kind !== 0 /* FIELD */) {\n            desc = Object.getOwnPropertyDescriptor(base, name);\n        }\n\n        if (kind === 1 /* ACCESSOR */) {\n            value = { get: desc.get, set: desc.set };\n        } else if (kind === 2 /* METHOD */) {\n            value = desc.value;\n        } else if (kind === 3 /* GETTER */) {\n            value = desc.get;\n        } else if (kind === 4 /* SETTER */) {\n            value = desc.set;\n        }\n\n        var newValue, get, set;\n\n        if (typeof decs === \"function\") {\n            newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);\n\n            if (newValue !== void 0) {\n                assertValidReturnValue(kind, newValue);\n\n                if (kind === 0 /* FIELD */) {\n                    init = newValue;\n                } else if (kind === 1 /* ACCESSOR */) {\n                    init = newValue.init;\n                    get = newValue.get || value.get;\n                    set = newValue.set || value.set;\n\n                    value = { get: get, set: set };\n                } else {\n                    value = newValue;\n                }\n            }\n        } else {\n            for (var i = decs.length - 1; i >= 0; i--) {\n                var dec = decs[i];\n\n                newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);\n\n                if (newValue !== void 0) {\n                    assertValidReturnValue(kind, newValue);\n                    var newInit;\n\n                    if (kind === 0 /* FIELD */) {\n                        newInit = newValue;\n                    } else if (kind === 1 /* ACCESSOR */) {\n                        newInit = newValue.init;\n                        get = newValue.get || value.get;\n                        set = newValue.set || value.set;\n\n                        value = { get: get, set: set };\n                    } else {\n                        value = newValue;\n                    }\n\n                    if (newInit !== void 0) {\n                        if (init === void 0) {\n                            init = newInit;\n                        } else if (typeof init === \"function\") {\n                            init = [init, newInit];\n                        } else {\n                            init.push(newInit);\n                        }\n                    }\n                }\n            }\n        }\n\n        if (kind === 0 /* FIELD */ || kind === 1 /* ACCESSOR */) {\n            if (init === void 0) {\n                // If the initializer was void 0, sub in a dummy initializer\n                init = function(instance, init) {\n                    return init;\n                };\n            } else if (typeof init !== \"function\") {\n                var ownInitializers = init;\n\n                init = function(instance, init) {\n                    var value = init;\n\n                    for (var i = 0; i < ownInitializers.length; i++) value = ownInitializers[i].call(instance, value);\n\n                    return value;\n                };\n            } else {\n                var originalInitializer = init;\n\n                init = function(instance, init) {\n                    return originalInitializer.call(instance, init);\n                };\n            }\n\n            ret.push(init);\n        }\n\n        if (kind !== 0 /* FIELD */) {\n            if (kind === 1 /* ACCESSOR */) {\n                desc.get = value.get;\n                desc.set = value.set;\n            } else if (kind === 2 /* METHOD */) {\n                desc.value = value;\n            } else if (kind === 3 /* GETTER */) {\n                desc.get = value;\n            } else if (kind === 4 /* SETTER */) {\n                desc.set = value;\n            }\n\n            if (isPrivate) {\n                if (kind === 1 /* ACCESSOR */) {\n                    ret.push(function(instance, args) {\n                        return value.get.call(instance, args);\n                    });\n                    ret.push(function(instance, args) {\n                        return value.set.call(instance, args);\n                    });\n                } else if (kind === 2 /* METHOD */) {\n                    ret.push(value);\n                } else {\n                    ret.push(function(instance, args) {\n                        return value.call(instance, args);\n                    });\n                }\n            } else {\n                Object.defineProperty(base, name, desc);\n            }\n        }\n    }\n\n    function applyMemberDecs(Class, decInfos, metadata) {\n        var ret = [];\n        var protoInitializers;\n        var staticInitializers;\n\n        var existingProtoNonFields = new Map();\n        var existingStaticNonFields = new Map();\n\n        for (var i = 0; i < decInfos.length; i++) {\n            var decInfo = decInfos[i];\n\n            // skip computed property names\n            if (!Array.isArray(decInfo)) continue;\n\n            var kind = decInfo[1];\n            var name = decInfo[2];\n            var isPrivate = decInfo.length > 3;\n\n            var isStatic = kind >= 5; /* STATIC */\n            var base;\n            var initializers;\n\n            if (isStatic) {\n                base = Class;\n                kind = kind - 5 /* STATIC */;\n                // initialize staticInitializers when we see a non-field static member\n                staticInitializers = staticInitializers || [];\n                initializers = staticInitializers;\n            } else {\n                base = Class.prototype;\n                // initialize protoInitializers when we see a non-field member\n                protoInitializers = protoInitializers || [];\n                initializers = protoInitializers;\n            }\n\n            if (kind !== 0 /* FIELD */ && !isPrivate) {\n                var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;\n\n                var existingKind = existingNonFields.get(name) || 0;\n\n                if (existingKind === true || (existingKind === 3 /* GETTER */ && kind !== 4) /* SETTER */ || (existingKind === 4 /* SETTER */ && kind !== 3) /* GETTER */) {\n                    throw new Error(\n                        \"Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: \"\n                            + name\n                    );\n                } else if (!existingKind && kind > 2 /* METHOD */) {\n                    existingNonFields.set(name, kind);\n                } else {\n                    existingNonFields.set(name, true);\n                }\n            }\n\n            applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);\n        }\n\n        pushInitializers(ret, protoInitializers);\n        pushInitializers(ret, staticInitializers);\n        return ret;\n    }\n\n    function pushInitializers(ret, initializers) {\n        if (initializers) {\n            ret.push(function(instance) {\n                for (var i = 0; i < initializers.length; i++) initializers[i].call(instance);\n                return instance;\n            });\n        }\n    }\n\n    function applyClassDecs(targetClass, classDecs, metadata) {\n        if (classDecs.length > 0) {\n            var initializers = [];\n            var newClass = targetClass;\n            var name = targetClass.name;\n\n            for (var i = classDecs.length - 1; i >= 0; i--) {\n                var decoratorFinishedRef = { v: false };\n\n                var nextNewClass = classDecs[i](newClass, { kind: \"class\", name: name, addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef), metadata });\n                decoratorFinishedRef.v = true;\n\n                if (nextNewClass !== undefined) {\n                    assertValidReturnValue(10, /* CLASS */ nextNewClass);\n                    newClass = nextNewClass;\n                }\n            }\n\n            return [defineMetadata(newClass, metadata), function() {\n                for (var i = 0; i < initializers.length; i++) initializers[i].call(newClass);\n            }];\n        }\n        // The transformer will not emit assignment when there are no class decorators,\n        // so we don't have to return an empty array here.\n    }\n\n    function defineMetadata(Class, metadata) {\n        return Object.defineProperty(Class, Symbol.metadata || Symbol.for(\"Symbol.metadata\"), { configurable: true, enumerable: true, value: metadata });\n    }\n\n    /**\n    Basic usage:\n\n    applyDecs(\n      Class,\n      [\n        // member decorators\n        [\n          dec,                // dec or array of decs\n          0,                  // kind of value being decorated\n          'prop',             // name of public prop on class containing the value being decorated,\n          '#p',               // the name of the private property (if is private, void 0 otherwise),\n        ]\n      ],\n      [\n        // class decorators\n        dec1, dec2\n      ]\n    )\n    ```\n\n    Fully transpiled example:\n\n    ```js\n    @dec\n    class Class {\n      @dec\n      a = 123;\n\n      @dec\n      #a = 123;\n\n      @dec\n      @dec2\n      accessor b = 123;\n\n      @dec\n      accessor #b = 123;\n\n      @dec\n      c() { console.log('c'); }\n\n      @dec\n      #c() { console.log('privC'); }\n\n      @dec\n      get d() { console.log('d'); }\n\n      @dec\n      get #d() { console.log('privD'); }\n\n      @dec\n      set e(v) { console.log('e'); }\n\n      @dec\n      set #e(v) { console.log('privE'); }\n    }\n\n\n    // becomes\n    let initializeInstance;\n    let initializeClass;\n\n    let initA;\n    let initPrivA;\n\n    let initB;\n    let initPrivB, getPrivB, setPrivB;\n\n    let privC;\n    let privD;\n    let privE;\n\n    let Class;\n    class _Class {\n      static {\n        let ret = applyDecs(\n          this,\n          [\n            [dec, 0, 'a'],\n            [dec, 0, 'a', (i) => i.#a, (i, v) => i.#a = v],\n            [[dec, dec2], 1, 'b'],\n            [dec, 1, 'b', (i) => i.#privBData, (i, v) => i.#privBData = v],\n            [dec, 2, 'c'],\n            [dec, 2, 'c', () => console.log('privC')],\n            [dec, 3, 'd'],\n            [dec, 3, 'd', () => console.log('privD')],\n            [dec, 4, 'e'],\n            [dec, 4, 'e', () => console.log('privE')],\n          ],\n          [\n            dec\n          ]\n        )\n\n        initA = ret[0];\n\n        initPrivA = ret[1];\n\n        initB = ret[2];\n\n        initPrivB = ret[3];\n        getPrivB = ret[4];\n        setPrivB = ret[5];\n\n        privC = ret[6];\n\n        privD = ret[7];\n\n        privE = ret[8];\n\n        initializeInstance = ret[9];\n\n        Class = ret[10]\n\n        initializeClass = ret[11];\n      }\n\n      a = (initializeInstance(this), initA(this, 123));\n\n      #a = initPrivA(this, 123);\n\n      #bData = initB(this, 123);\n      get b() { return this.#bData }\n      set b(v) { this.#bData = v }\n\n      #privBData = initPrivB(this, 123);\n      get #b() { return getPrivB(this); }\n      set #b(v) { setPrivB(this, v); }\n\n      c() { console.log('c'); }\n\n      #c(...args) { return privC(this, ...args) }\n\n      get d() { console.log('d'); }\n\n      get #d() { return privD(this); }\n\n      set e(v) { console.log('e'); }\n\n      set #e(v) { privE(this, v); }\n    }\n\n    initializeClass(Class);\n   */\n\n    _apply_decs_2203_r = function(targetClass, memberDecs, classDecs, parentClass) {\n        if (parentClass !== void 0) {\n            var parentMetadata = parentClass[Symbol.metadata || Symbol.for(\"Symbol.metadata\")];\n        }\n        var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);\n        var e = applyMemberDecs(targetClass, memberDecs, metadata);\n        if (!classDecs.length) defineMetadata(targetClass, metadata);\n        return {\n            e: e,\n            // Lazily apply class decorations so that member init locals can be properly bound.\n            get c() {\n                return applyClassDecs(targetClass, classDecs, metadata);\n            }\n        };\n    };\n\n    return _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass);\n}\n\nexport { _apply_decs_2203_r as _ };\n","function _identity(x) {\n    return x;\n}\n\nexport { _identity as _ };\n","export enum Attribute {\n    CONFIGURATION = 'configuration',\n    SOURCE = 'source',\n    AUTOPLAY = 'autoplay',\n    MUTED = 'muted',\n    FULLSCREEN = 'fullscreen',\n    FULLWINDOW = 'fullwindow',\n    FLUID = 'fluid',\n    DEVICE_TYPE = 'device-type',\n    MOBILE = 'mobile',\n    TV = 'tv',\n    TV_FOCUS = 'tv-focus',\n    MOBILE_ONLY = 'mobile-only',\n    MOBILE_HIDDEN = 'mobile-hidden',\n    TV_ONLY = 'tv-only',\n    TV_HIDDEN = 'tv-hidden',\n    USER_IDLE = 'user-idle',\n    USER_IDLE_TIMEOUT = 'user-idle-timeout',\n    NO_AUTO_HIDE = 'no-auto-hide',\n    DISABLED = 'disabled',\n    INERT = 'inert',\n    HIDDEN = 'hidden',\n    PAUSED = 'paused',\n    ENDED = 'ended',\n    VOLUME_LEVEL = 'volume-level',\n    CASTING = 'casting',\n    LOADING = 'loading',\n    STREAM_TYPE = 'stream-type',\n    LIVE = 'live',\n    LIVE_ONLY = 'live-only',\n    LIVE_HIDDEN = 'live-hidden',\n    LIVE_THRESHOLD = 'live-threshold',\n    DVR_THRESHOLD = 'dvr-threshold',\n    REMAINING = 'remaining',\n    REMAINING_WHEN_LIVE = 'remaining-when-live',\n    SHOW_DURATION = 'show-duration',\n    STEREO = 'stereo',\n    SEEK_OFFSET = 'seek-offset',\n    MENU = 'menu',\n    MENU_OPENED = 'menu-opened',\n    MENU_CLOSE_ON_INPUT = 'menu-close-on-input',\n    ARIA_LABEL = 'aria-label',\n    ARIA_LIVE = 'aria-live',\n    ARIA_CHECKED = 'aria-checked',\n    HAS_AUDIO = 'has-audio',\n    HAS_SUBTITLES = 'has-subtitles',\n    HAS_ERROR = 'has-error',\n    HAS_FIRST_PLAY = 'has-first-play',\n    CAST_STATE = 'cast-state',\n    TRACK_TYPE = 'track-type',\n    SHOW_OFF = 'show-off',\n    PLAYING_AD = 'playing-ad',\n    SHOW_AD_MARKERS = 'show-ad-markers',\n    CLICKTHROUGH = 'clickthrough',\n    PROPERTY = 'property',\n    VALUE = 'value',\n    LANG = 'lang'\n}\n","export enum KeyCode {\n    ENTER = 13,\n    ESCAPE = 27,\n    SPACE = 32,\n    END = 35,\n    HOME = 36,\n    LEFT = 37,\n    UP = 38,\n    RIGHT = 39,\n    DOWN = 40,\n    // Multiple back key configurations depending on the platform\n    // https://suite.st/docs/faq/tv-specific-keys-in-browser/\n    BACK_SAMSUNG = 88,\n    BACK_WEBOS = 461,\n    BACK_TIZEN = 10009\n}\n\nexport type ArrowKeyCode = KeyCode.LEFT | KeyCode.UP | KeyCode.RIGHT | KeyCode.DOWN;\nexport type BackKeyCode = KeyCode.BACK_TIZEN | KeyCode.ESCAPE | KeyCode.BACK_SAMSUNG | KeyCode.BACK_WEBOS;\nexport type ActivationKeyCode = KeyCode.ENTER | KeyCode.SPACE;\n\nexport function isArrowKey(keyCode: number): keyCode is ArrowKeyCode {\n    return KeyCode.LEFT <= keyCode && keyCode <= KeyCode.DOWN;\n}\n\nexport function isBackKey(keyCode: number): keyCode is BackKeyCode {\n    return keyCode === KeyCode.BACK_TIZEN || keyCode === KeyCode.ESCAPE || keyCode === KeyCode.BACK_SAMSUNG || keyCode === KeyCode.BACK_WEBOS;\n}\n\nexport function isActivationKey(keyCode: number): keyCode is ActivationKeyCode {\n    return keyCode === KeyCode.ENTER || keyCode === KeyCode.SPACE;\n}\n","export enum ExtensionSlot {\n    TopControlBar = 'top-control-bar',\n    BottomControlBar = 'bottom-control-bar',\n    Menu = 'menu'\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport controlBarCss from './ControlBar.css';\n\n/**\n * A horizontal control bar that can contain other controls.\n */\n@customElement('theoplayer-control-bar')\nexport class ControlBar extends LitElement {\n    static override styles = [controlBarCss];\n    static override shadowRootOptions: ShadowRootInit = {\n        ...LitElement.shadowRootOptions,\n        delegatesFocus: true\n    };\n\n    protected override render(): HTMLTemplateResult {\n        return html`<slot></slot>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-control-bar': ControlBar;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { templateContent } from 'lit/directives/template-content.js';\nimport buttonCss from './Button.css';\nimport { Attribute } from '../util/Attribute';\nimport { isActivationKey } from '../util/KeyCode';\n\n/** @deprecated */\nexport interface ButtonOptions {\n    /**\n     * @deprecated Override {@link Button.render} instead.\n     */\n    template?: HTMLTemplateElement;\n}\n\n/**\n * @deprecated Override {@link Button.render} instead.\n */\nexport function buttonTemplate(button: string, extraCss: string = ''): string {\n    return `<style>${extraCss}</style>${button}`;\n}\n\n/**\n * A basic button.\n *\n * @cssproperty `--theoplayer-control-height` - The height of the button's control area (and default icon size). Defaults to `24px`.\n * @cssproperty `--theoplayer-control-padding` - The padding around the button's content. Defaults to `10px`.\n * @cssproperty `--theoplayer-control-background` - The background of the button. Defaults to `transparent`.\n * @cssproperty `--theoplayer-control-hover-background` - The background of the button when hovered.\n *   Defaults to `--theoplayer-control-background`.\n * @cssproperty `--theoplayer-text-color` - The text color of the button. Defaults to `#fff`.\n * @cssproperty `--theoplayer-text-font-size` - The font size of the button's text. Defaults to `14px`.\n * @cssproperty `--theoplayer-text-content-height` - The line-height of the button's text. Defaults to `--theoplayer-control-height`.\n * @cssproperty `--theoplayer-icon-color` - The color of the button's icon. Defaults to `#fff`.\n * @cssproperty `--theoplayer-focus-ring-color` - The color of the focus ring around focused buttons. Defaults to `rgba(27, 127, 204, 0.9)`.\n * @cssproperty `--theoplayer-button-text-color` - The text color of the button. Defaults to `--theoplayer-text-color`.\n * @cssproperty `--theoplayer-button-icon-width` - The width of the button's icon. Defaults to `--theoplayer-control-height`.\n * @cssproperty `--theoplayer-button-icon-height` - The height of the button's icon. Defaults to `--theoplayer-control-height`.\n * @cssproperty `--theoplayer-button-icon-transition` - The CSS transition applied to the button's icon. Defaults to `none`.\n * @cssproperty `--theoplayer-button-icon-shadow` - A drop-shadow applied to the icon. Defaults to `none`.\n * @cssproperty `--theoplayer-button-hover-icon-shadow` - A drop-shadow applied to the icon on hover. Defaults to `0 0 4px rgba(255, 255, 255, 0.5)`.\n * @cssproperty `--theoplayer-button-checked-background` - The background of a toggled-on button (e.g. mute, fullscreen). Defaults to `#fff`.\n * @cssproperty `--theoplayer-button-checked-color` - The color of a toggled-on button. Defaults to `#000`.\n * @cssproperty `--theoplayer-button-disabled-text-color` - The text color of a disabled button. Defaults to `#ccc`.\n * @cssproperty `--theoplayer-before-first-play-display` - The CSS `display` of the button before first play.\n *   The {@link UIContainer | `<theoplayer-ui>`} will set this to `none` to hide all buttons until playback begins,\n *   after which this becomes `unset` and the button reverts back to its initial CSS `display`.\n */\n// Based on howto-toggle-button\n// https://github.com/GoogleChromeLabs/howto-components/blob/079d0fa34ff9038b26ea8883b1db5dd6b677d7ba/elements/howto-toggle-button/howto-toggle-button.js\n@customElement('theoplayer-button')\nexport class Button extends LitElement {\n    static styles = [buttonCss];\n\n    private readonly _template: HTMLTemplateElement | undefined;\n    private _disabled: boolean = false;\n\n    /**\n     * Creates a basic button.\n     *\n     * By default, the button renders the contents of its direct children (i.e. it has a single unnamed `<slot>`).\n     * Subclasses can override this by overriding {@link render}.\n     */\n    constructor(options?: ButtonOptions) {\n        super();\n        this._template = options?.template;\n        if (this._template) {\n            // Render immediately to populate the shadow DOM.\n            this.performUpdate();\n        }\n    }\n\n    connectedCallback(): void {\n        super.connectedCallback();\n\n        if (!this.hasAttribute('role')) {\n            this.setAttribute('role', 'button');\n        }\n        if (!this.hasAttribute('tabindex')) {\n            this.setAttribute('tabindex', '0');\n        }\n        if (!this.hasAttribute(Attribute.ARIA_LIVE)) {\n            // Let the screen reader user know that the text of the button may change\n            this.setAttribute(Attribute.ARIA_LIVE, 'polite');\n        }\n        if (!this._disabled) {\n            this._enable();\n        }\n    }\n\n    disconnectedCallback(): void {\n        this.removeEventListener('click', this._onClick);\n        this.removeEventListener('keydown', this._onKeyDown);\n        this.removeEventListener('keyup', this._onKeyUp);\n    }\n\n    /**\n     * Whether the button is disabled.\n     *\n     * When disabled, the button cannot be clicked.\n     */\n    get disabled(): boolean {\n        return this._disabled;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.DISABLED })\n    set disabled(value: boolean) {\n        this._disabled = value;\n        if (value) {\n            this._disable();\n        } else {\n            this._enable();\n        }\n    }\n\n    @property({ reflect: true, state: true, type: String, attribute: Attribute.ARIA_LABEL })\n    override accessor ariaLabel: string | null = null;\n\n    private _enable(): void {\n        this.removeEventListener('click', this._onClick);\n        this.removeEventListener('keydown', this._onKeyDown);\n        this.removeEventListener('keyup', this._onKeyUp);\n        this.addEventListener('click', this._onClick);\n        this.addEventListener('keydown', this._onKeyDown);\n\n        this.setAttribute('aria-disabled', 'false');\n        this.setAttribute('tabindex', '0');\n    }\n\n    private _disable(): void {\n        this.removeEventListener('click', this._onClick);\n        this.removeEventListener('keydown', this._onKeyDown);\n        this.removeEventListener('keyup', this._onKeyUp);\n\n        this.setAttribute('aria-disabled', 'true');\n\n        // The `tabindex` attribute does not provide a way to fully remove focusability from an element.\n        // Elements with `tabindex=-1` can still be focused with a mouse or by calling `focus()`.\n        // To make sure an element is disabled and not focusable, remove the `tabindex` attribute.\n        this.removeAttribute('tabindex');\n\n        // If the focus is currently on this element, unfocus it by calling the `HTMLElement.blur()` method.\n        this.blur();\n    }\n\n    private readonly _onClick = () => {\n        this.handleClick();\n    };\n\n    protected readonly _onKeyDown = (e: KeyboardEvent) => {\n        if (isActivationKey(e.keyCode) && !e.metaKey && !e.altKey) {\n            this.addEventListener('keyup', this._onKeyUp);\n        } else {\n            this.removeEventListener('keyup', this._onKeyUp);\n        }\n    };\n\n    protected readonly _onKeyUp = (e: KeyboardEvent) => {\n        this.removeEventListener('keyup', this._onKeyUp);\n        if (isActivationKey(e.keyCode)) {\n            this.handleClick();\n        }\n    };\n\n    protected render(): HTMLTemplateResult {\n        if (this._template) {\n            return html`${templateContent(this._template)}`;\n        }\n        return html`<slot></slot>`;\n    }\n\n    /**\n     * Handle a button click.\n     *\n     * By default, this does nothing. Subclasses can override this method to add behavior to the button.\n     */\n    protected handleClick(): void {}\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-button': Button;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { templateContent } from 'lit/directives/template-content.js';\nimport linkButtonCss from './LinkButton.css';\nimport { Attribute } from '../util/Attribute';\nimport { KeyCode } from '../util/KeyCode';\nimport { createRef, ref, type Ref } from 'lit/directives/ref.js';\nimport { type ButtonOptions, buttonTemplate } from './Button';\n\n/**\n * @deprecated Override {@link LinkButton.render} instead.\n */\nexport function linkButtonTemplate(button: string, extraCss: string = ''): string {\n    return buttonTemplate(`<a>${button}</a>`, extraCss);\n}\n\n/**\n * A {@link Button | button} that opens a hyperlink.\n */\n@customElement('theoplayer-link-button')\nexport class LinkButton extends LitElement {\n    static styles = [linkButtonCss];\n\n    private readonly _template: HTMLTemplateElement | undefined;\n    private _disabled: boolean = false;\n\n    private readonly _linkRef: Ref<HTMLAnchorElement> = createRef<HTMLAnchorElement>();\n\n    constructor(options?: ButtonOptions) {\n        super();\n        this._template = options?.template;\n        if (this._template) {\n            // Render immediately to populate the shadow DOM.\n            this.performUpdate();\n        }\n    }\n\n    connectedCallback(): void {\n        super.connectedCallback();\n\n        if (!this.hasAttribute('role')) {\n            this.setAttribute('role', 'button');\n        }\n        if (!this.hasAttribute('tabindex')) {\n            this.setAttribute('tabindex', '0');\n        }\n        if (!this.hasAttribute(Attribute.ARIA_LIVE)) {\n            // Let the screen reader user know that the text of the button may change\n            this.setAttribute(Attribute.ARIA_LIVE, 'polite');\n        }\n        if (!this.hasAttribute(Attribute.DISABLED)) {\n            this._enable();\n        }\n    }\n\n    /**\n     * Whether the button is disabled.\n     *\n     * When disabled, the button cannot be clicked.\n     */\n    get disabled(): boolean {\n        return this._disabled;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.DISABLED })\n    set disabled(value: boolean) {\n        this._disabled = value;\n        if (value) {\n            this._disable();\n        } else {\n            this._enable();\n        }\n    }\n\n    @state()\n    protected accessor href: string = '';\n\n    @state()\n    protected accessor target: string = '';\n\n    private _enable(): void {\n        this.setAttribute('aria-disabled', 'false');\n        this.setAttribute('tabindex', '0');\n    }\n\n    private _disable(): void {\n        this.setAttribute('aria-disabled', 'true');\n\n        // The `tabindex` attribute does not provide a way to fully remove focusability from an element.\n        // Elements with `tabindex=-1` can still be focused with a mouse or by calling `focus()`.\n        // To make sure an element is disabled and not focusable, remove the `tabindex` attribute.\n        this.removeAttribute('tabindex');\n\n        // If the focus is currently on this element, unfocus it by calling the `HTMLElement.blur()` method.\n        this.blur();\n    }\n\n    private readonly _onKeyDown = (event: KeyboardEvent) => {\n        // Don't handle modifier shortcuts typically used by assistive technology.\n        if (event.metaKey || event.altKey) return;\n\n        switch (event.keyCode) {\n            // Enter is already handled by the browser.\n            // case KeyCode.ENTER:\n            case KeyCode.SPACE:\n                event.preventDefault();\n                this._linkRef.value?.click();\n                break;\n            // Any other key press is ignored and passed back to the browser.\n            default:\n                return;\n        }\n    };\n\n    private readonly _onClick = () => {\n        if (this.disabled) {\n            return;\n        }\n        this.handleClick();\n    };\n\n    protected override render(): HTMLTemplateResult {\n        if (this._template) {\n            return html`${templateContent(this._template)}`;\n        }\n        return html`<a ${ref(this._linkRef)} href=${this.href} target=${this.target} @keydown=${this._onKeyDown} @click=${this._onClick}\n            >${this.renderLinkContent()}</a\n        >`;\n    }\n\n    protected renderLinkContent(): HTMLTemplateResult {\n        return html`<slot></slot>`;\n    }\n\n    protected handleClick(): void {}\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-link-button': LinkButton;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport slotContainerCss from './SlotContainer.css';\n\n/**\n * A container that can be assigned to a slot,\n * and behaves as if all its children are directly assigned to that slot.\n *\n * This behaves approximately like a regular `<div>` with style `display: contents`,\n * but receives some special treatment from e.g. {@link MenuGroup | `<theoplayer-menu-group>`}\n * which normally expects its {@link Menu | menu}s to be slotted in as direct children.\n * Those menus can also be children of a `<theoplayer-slot-container>` instead.\n *\n * This is an internal component, used mainly by Open Video UI for React.\n * You shouldn't need this under normal circumstances.\n * @internal\n */\n@customElement('theoplayer-slot-container')\nexport class SlotContainer extends LitElement {\n    static override styles = [slotContainerCss];\n\n    protected override render(): HTMLTemplateResult {\n        return html`<slot></slot>`;\n    }\n}\n\nexport function isSlotContainer(element: Element): element is SlotContainer {\n    return element.nodeName.toLowerCase() === 'theoplayer-slot-container';\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-slot-container': SlotContainer;\n    }\n}\n","import { html, type HTMLTemplateResult, type PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { Button } from './Button';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport playButtonCss from './PlayButton.css';\nimport playIcon from '../icons/play.svg';\nimport pauseIcon from '../icons/pause.svg';\nimport replayIcon from '../icons/replay.svg';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\nimport { getLocale } from '../i18n';\n\nconst PLAYER_EVENTS = ['seeking', 'seeked', 'ended', 'emptied', 'sourcechange'] as const;\n\n/**\n * A button that toggles whether the player is playing or paused.\n *\n * @cssproperty `--theoplayer-play-button-icon-color` - The icon color of the play button.\n *   Overrides `--theoplayer-icon-color` for this button. Defaults to `unset`.\n */\n@customElement('theoplayer-play-button')\n@stateReceiver(['player', 'lang'])\nexport class PlayButton extends Button {\n    static styles = [...Button.styles, playButtonCss];\n\n    private _player: ChromelessPlayer | undefined;\n\n    override connectedCallback(): void {\n        super.connectedCallback();\n        this._updateFromPlayer();\n        this._updateAriaLabel();\n    }\n\n    /**\n     * Whether the player is paused.\n     *\n     * This reflects `player.paused`.\n     */\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.PAUSED })\n    accessor paused: boolean = false;\n\n    /**\n     * Whether the player is ended.\n     *\n     * This reflects `player.ended`.\n     */\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.ENDED })\n    accessor ended: boolean = false;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._player !== undefined) {\n            this._player.removeEventListener('play', this._onPlay);\n            this._player.removeEventListener('pause', this._onPause);\n            this._player.removeEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n        }\n        this._player = player;\n        this._updateFromPlayer();\n        if (this._player !== undefined) {\n            this._player.addEventListener('play', this._onPlay);\n            this._player.addEventListener('pause', this._onPause);\n            this._player.addEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n        }\n    }\n\n    private readonly _onPlay = (): void => {\n        this.paused = false;\n        this._updateEnded();\n    };\n\n    private readonly _onPause = (): void => {\n        this.paused = true;\n        this._updateEnded();\n    };\n\n    private readonly _updateFromPlayer = (): void => {\n        this.paused = this._player?.paused ?? true;\n        this._updateEnded();\n        this._updateDisabled();\n    };\n\n    private _updateEnded(): void {\n        this.ended = this._player?.ended ?? false;\n    }\n\n    private readonly _updateDisabled = () => {\n        this.disabled = this._player?.source === undefined;\n    };\n\n    protected override handleClick() {\n        if (this._player !== undefined) {\n            if (this._player.source === undefined) {\n                // Do nothing if the player has no source.\n                return;\n            }\n            if (this._player.paused) {\n                this._player.play();\n            } else {\n                this._player.pause();\n            }\n            const vr = this._player.vr;\n            if (vr !== undefined && vr.state !== 'unavailable') {\n                vr.useDeviceMotionControls = true;\n            }\n        }\n    }\n\n    override willUpdate(changedProperties: PropertyValues) {\n        super.willUpdate(changedProperties);\n        this._updateAriaLabel();\n    }\n\n    private _updateAriaLabel(): void {\n        const locale = getLocale(this.lang);\n        this.ariaLabel = this.ended ? locale.replayAria : this.paused ? locale.playAria : locale.pauseAria;\n    }\n\n    protected override render(): HTMLTemplateResult {\n        return html`\n            <span part=\"play-icon\"><slot name=\"play-icon\">${unsafeSVG(playIcon)}</slot></span>\n            <span part=\"pause-icon\"><slot name=\"pause-icon\">${unsafeSVG(pauseIcon)}</slot></span>\n            <span part=\"replay-icon\"><slot name=\"replay-icon\">${unsafeSVG(replayIcon)}</slot></span>\n        `;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-play-button': PlayButton;\n    }\n}\n","import { html, type HTMLTemplateResult, type PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { Button } from './Button';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport muteButtonCss from './MuteButton.css';\nimport offIcon from '../icons/volume-off.svg';\nimport lowIcon from '../icons/volume-low.svg';\nimport highIcon from '../icons/volume-high.svg';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\nimport { getLocale } from '../i18n';\n\nexport type VolumeLevel = 'off' | 'low' | 'high';\n\nconst PLAYER_EVENTS = ['volumechange'] as const;\n\n/**\n * A button that toggles whether audio is muted or not.\n */\n@customElement('theoplayer-mute-button')\n@stateReceiver(['player', 'lang'])\nexport class MuteButton extends Button {\n    static styles = [...Button.styles, muteButtonCss];\n\n    private _player: ChromelessPlayer | undefined;\n\n    override connectedCallback(): void {\n        super.connectedCallback();\n        this._updateFromPlayer();\n        this._updateAriaLabel();\n    }\n\n    /**\n     * The volume level of the player.\n     *\n     * Can be \"off\" (muted), \"low\" (volume < 50%) or \"high\" (volume >= 50%).\n     */\n    @property({ reflect: true, state: true, type: String, attribute: Attribute.VOLUME_LEVEL })\n    accessor volumeLevel: VolumeLevel = 'off';\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._player !== undefined) {\n            this._player.removeEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n        }\n        this._player = player;\n        this._updateFromPlayer();\n        if (this._player !== undefined) {\n            this._player.addEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n        }\n    }\n\n    private readonly _updateFromPlayer = () => {\n        if (this._player !== undefined) {\n            const volume = this._player.volume;\n            const muted = this._player.muted;\n            if (muted) {\n                this.volumeLevel = 'off';\n            } else if (volume < 0.5) {\n                this.volumeLevel = 'low';\n            } else {\n                this.volumeLevel = 'high';\n            }\n        } else {\n            this.volumeLevel = 'off';\n        }\n    };\n\n    protected override handleClick() {\n        if (this._player !== undefined) {\n            this._player.muted = !this._player.muted;\n            this._updateFromPlayer();\n        }\n    }\n\n    override willUpdate(changedProperties: PropertyValues) {\n        super.willUpdate(changedProperties);\n        this._updateAriaLabel();\n    }\n\n    private _updateAriaLabel(): void {\n        const locale = getLocale(this.lang);\n        this.ariaLabel = this.volumeLevel === 'off' ? locale.unmuteAria : locale.muteAria;\n    }\n\n    protected override render(): HTMLTemplateResult {\n        return html`<span part=\"off-icon\"><slot name=\"off-icon\">${unsafeSVG(offIcon)}</slot></span\n            ><span part=\"low-icon\"><slot name=\"low-icon\">${unsafeSVG(lowIcon)}</slot></span\n            ><span part=\"high-icon\"><slot name=\"high-icon\">${unsafeSVG(highIcon)}</slot></span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-mute-button': MuteButton;\n    }\n}\n","import { html, type PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Button } from './Button';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport seekButtonCss from './SeekButton.css';\nimport seekForwardIcon from '../icons/seek-forward.svg';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { getLocale } from '../i18n';\nimport { toDuration } from '../util/TimeUtils';\n\nconst DEFAULT_SEEK_OFFSET = 10;\n\n/**\n * A button that seeks forward or backward by a fixed offset.\n *\n * @cssproperty `--theoplayer-seek-button-font-size` - The font size of the offset number rendered inside the seek icon. Defaults to `calc(0.3 * --theoplayer-button-icon-height)`.\n */\n@customElement('theoplayer-seek-button')\n@stateReceiver(['player', 'lang'])\nexport class SeekButton extends Button {\n    static styles = [...Button.styles, seekButtonCss];\n\n    private _player: ChromelessPlayer | undefined;\n\n    /**\n     * The offset (in seconds) by which to seek forward (if positive) or backward (if negative).\n     */\n    @property({ reflect: true, type: Number, attribute: Attribute.SEEK_OFFSET })\n    accessor seekOffset: number = DEFAULT_SEEK_OFFSET;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        this._player = player;\n    }\n\n    protected override handleClick() {\n        if (this._player === undefined) {\n            return;\n        }\n        const duration = this._player.duration;\n        if (isNaN(duration)) {\n            return;\n        }\n        this._player.currentTime = Math.max(0, Math.min(duration, this._player.currentTime + this.seekOffset));\n    }\n\n    override willUpdate(changedProperties: PropertyValues) {\n        super.willUpdate(changedProperties);\n        this._updateAriaLabel();\n    }\n\n    private _updateAriaLabel(): void {\n        const locale = getLocale(this.lang);\n        const seekOffset = this.seekOffset;\n        const duration = locale.formatDuration(toDuration(Math.abs(seekOffset)));\n        this.ariaLabel = seekOffset >= 0 ? locale.seekForwardAria(duration) : locale.seekBackwardAria(duration);\n    }\n\n    protected override render() {\n        return html`<span part=\"icon\"><slot name=\"icon\">${unsafeSVG(seekForwardIcon)}</slot></span\n            ><span part=\"offset\">${String(Math.abs(this.seekOffset))}</span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-seek-button': SeekButton;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport textDisplayCss from './TextDisplay.css';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { formatAsTimePhrase, formatTime } from '../util/TimeUtils';\nimport { Attribute } from '../util/Attribute';\nimport type { StreamType } from '../util/StreamType';\nimport { getLocale } from '../i18n';\n\nconst PLAYER_EVENTS = ['timeupdate', 'seeking', 'seeked', 'durationchange'] as const;\n\n/**\n * A control that displays the current time of the stream.\n */\n@customElement('theoplayer-time-display')\n@stateReceiver(['player', 'streamType', 'lang'])\nexport class TimeDisplay extends LitElement {\n    static override styles = [textDisplayCss];\n\n    private _player: ChromelessPlayer | undefined;\n\n    connectedCallback(): void {\n        super.connectedCallback();\n\n        if (!this.hasAttribute('role')) {\n            this.setAttribute('role', 'progressbar');\n        }\n        if (!this.hasAttribute(Attribute.ARIA_LIVE)) {\n            // Tell screen readers not to automatically read the time as it changes\n            this.setAttribute(Attribute.ARIA_LIVE, 'off');\n        }\n    }\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._player !== undefined) {\n            this._player.removeEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n        }\n        this._player = player;\n        this._updateFromPlayer();\n        if (this._player !== undefined) {\n            this._player.addEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n        }\n    }\n\n    /**\n     * If set, shows the remaining time of the stream. Not compatible with {@link showDuration}.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.REMAINING })\n    accessor remaining: boolean = false;\n\n    /**\n     * If set, and the stream is a livestream, shows the remaining time (until the live point) of the stream.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.REMAINING_WHEN_LIVE })\n    accessor remainingWhenLive: boolean = false;\n\n    /**\n     * If set, also shows the duration of the stream.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.SHOW_DURATION })\n    accessor showDuration: boolean = false;\n\n    /**\n     * The stream type, either \"vod\", \"live\" or \"dvr\".\n     */\n    @property({ reflect: true, type: String, attribute: Attribute.STREAM_TYPE })\n    accessor streamType: StreamType = 'vod';\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    @state()\n    private accessor _currentTime: number = 0;\n\n    @state()\n    private accessor _duration: number = NaN;\n\n    @state()\n    private accessor _endTime: number = 0;\n\n    private readonly _updateFromPlayer = () => {\n        const currentTime = this._player ? this._player.currentTime : 0;\n        const duration = this._player ? this._player.duration : NaN;\n        const seekable = this._player?.seekable;\n        const endTime = isFinite(duration) ? duration : seekable && seekable.length > 0 ? seekable.end(0) : NaN;\n        this._currentTime = currentTime;\n        this._duration = duration;\n        this._endTime = endTime;\n    };\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        const remaining = this.remaining || (this.remainingWhenLive && this.streamType !== 'vod');\n        let time = this._currentTime;\n        const endTime = this._endTime;\n        if (remaining) {\n            time = -((this._endTime || 0) - time);\n        }\n        let text: string;\n        if (this.showDuration && !remaining) {\n            text = `${formatTime(time, endTime, remaining)} / ${formatTime(endTime)}`;\n        } else {\n            text = formatTime(time, endTime, remaining);\n        }\n\n        let ariaValueText: string;\n        if (isNaN(this._duration)) {\n            ariaValueText = locale.unknownTimeAria;\n        } else if (this.showDuration) {\n            ariaValueText = locale.timeOfTotalAria(formatAsTimePhrase(locale, time, remaining), formatAsTimePhrase(locale, endTime));\n        } else {\n            ariaValueText = formatAsTimePhrase(locale, time, remaining);\n        }\n        this.setAttribute('aria-label', locale.playbackTimeAria);\n        this.setAttribute('aria-valuetext', ariaValueText);\n\n        return html`<span>${text}</span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-time-display': TimeDisplay;\n    }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport textDisplayCss from './TextDisplay.css';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { formatTime } from '../util/TimeUtils';\nimport { Attribute } from '../util/Attribute';\n\nconst PLAYER_EVENTS = ['durationchange'] as const;\n\n/**\n * A control that displays the duration of the stream.\n */\n@customElement('theoplayer-duration-display')\n@stateReceiver(['player'])\nexport class DurationDisplay extends LitElement {\n    static override styles = [textDisplayCss];\n\n    private _player: ChromelessPlayer | undefined;\n\n    connectedCallback(): void {\n        super.connectedCallback();\n\n        if (!this.hasAttribute(Attribute.ARIA_LIVE)) {\n            // Tell screen readers not to automatically read the duration as it changes\n            this.setAttribute(Attribute.ARIA_LIVE, 'off');\n        }\n    }\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._player !== undefined) {\n            this._player.removeEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n        }\n        this._player = player;\n        this._updateFromPlayer();\n        if (this._player !== undefined) {\n            this._player.addEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n        }\n    }\n\n    /**\n     * The current duration.\n     */\n    @state()\n    accessor duration: number = NaN;\n\n    private readonly _updateFromPlayer = () => {\n        this.duration = this._player ? this._player.duration : NaN;\n    };\n\n    protected override render() {\n        return html`<span>${formatTime(this.duration)}</span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-duration-display': DurationDisplay;\n    }\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport { Button } from './Button';\nimport { Attribute } from '../util/Attribute';\nimport { createEvent } from '../util/EventUtils';\nimport type { RadioGroup } from './RadioGroup';\n\n/**\n * A button that can be checked.\n *\n * When part of a {@link RadioGroup}, at most one button in the group can be checked.\n */\n@customElement('theoplayer-radio-button')\nexport class RadioButton extends Button {\n    private _checked: boolean = false;\n\n    override connectedCallback() {\n        if (!this.hasAttribute('role')) {\n            this.setAttribute('role', 'radio');\n        }\n        if (!this.hasAttribute('tabindex')) {\n            this.setAttribute('tabindex', '-1');\n        }\n\n        super.connectedCallback();\n    }\n\n    /**\n     * Whether this radio button is checked.\n     */\n    get checked(): boolean {\n        return this._checked;\n    }\n\n    @property({\n        reflect: true,\n        type: Boolean,\n        attribute: Attribute.ARIA_CHECKED,\n        converter: {\n            fromAttribute: (value: string | null) => value != null && value !== 'false',\n            toAttribute: (value: boolean) => String(value)\n        }\n    })\n    set checked(checked: boolean) {\n        if (this._checked !== checked) {\n            this._checked = checked;\n            this.handleChange();\n            this.dispatchEvent(createEvent('change', { bubbles: true }));\n        }\n    }\n\n    /**\n     * The value associated with this radio button.\n     */\n    @property({ attribute: Attribute.VALUE })\n    accessor value: any = undefined;\n\n    protected handleClick(): void {\n        this.checked = true;\n        this.dispatchEvent(createEvent('input', { bubbles: true, composed: true }));\n    }\n\n    protected handleChange(): void {}\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-radio-button': RadioButton;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { createRef, ref, type Ref } from 'lit/directives/ref.js';\nimport { isArrowKey, KeyCode } from '../util/KeyCode';\nimport { RadioButton } from './RadioButton';\nimport { createEvent } from '../util/EventUtils';\nimport { arrayFind, getSlottedElements, noOp, upgradeCustomElementIfNeeded } from '../util/CommonUtils';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\nimport type { DeviceType } from '../util/DeviceType';\nimport { navigateByArrowKey } from '../util/KeyboardNavigation';\n\n/**\n * A group of {@link RadioButton}s. At most one button in the group can be checked.\n *\n * ## Behavior\n * This radio group implements the [roving tabindex](https://www.w3.org/WAI/ARIA/apg/example-index/radio/radio.html) pattern.\n *  - `Tab` moves focus in or out of the radio group.\n *  - `Up`/`Left` arrow moves focus to the previous radio button.\n *  - `Down`/`Right` arrow moves focus to the next radio button.\n *  - `Home` moves focus to the first radio button.\n *  - `End` moves focus to the last radio button.\n */\n// Based on howto-radio-group\n// https://github.com/GoogleChromeLabs/howto-components/blob/079d0fa34ff9038b26ea8883b1db5dd6b677d7ba/elements/howto-radio-group/howto-radio-group.js\n@customElement('theoplayer-radio-group')\n@stateReceiver(['deviceType'])\nexport class RadioGroup extends LitElement {\n    private readonly _slotRef: Ref<HTMLSlotElement> = createRef<HTMLSlotElement>();\n    private _radioButtons: RadioButton[] = [];\n    private _value: any = undefined;\n\n    constructor() {\n        super();\n    }\n\n    connectedCallback(): void {\n        super.connectedCallback();\n\n        if (!this.hasAttribute('role')) {\n            this.setAttribute('role', 'radiogroup');\n        }\n\n        this.addEventListener('keydown', this._onKeyDown);\n        this._onSlotChange();\n    }\n\n    disconnectedCallback(): void {\n        super.disconnectedCallback();\n        this.removeEventListener('keydown', this._onKeyDown);\n    }\n\n    protected override firstUpdated(): void {\n        this._onSlotChange();\n    }\n\n    protected override createRenderRoot(): HTMLElement | DocumentFragment {\n        const root = super.createRenderRoot();\n        root.addEventListener('change', this._onButtonChange);\n        return root;\n    }\n\n    /**\n     * The device type, either \"desktop\", \"mobile\" or \"tv\".\n     */\n    @property({ reflect: true, type: String, attribute: Attribute.DEVICE_TYPE })\n    accessor deviceType: DeviceType = 'desktop';\n\n    /**\n     * The selected value.\n     */\n    get value(): any {\n        return this._value;\n    }\n\n    @property({ attribute: Attribute.VALUE })\n    set value(value: any) {\n        if (this._value === value) {\n            return;\n        }\n        this._value = value;\n        this.updateCheckedButton();\n        this.dispatchEvent(createEvent('change', { bubbles: true }));\n    }\n\n    private readonly _onSlotChange = () => {\n        const slot = this._slotRef.value;\n        if (!slot) return;\n        const children = getSlottedElements(slot);\n        const upgradePromises: Array<Promise<unknown>> = [];\n        for (const child of children) {\n            if (!isRadioButton(child)) {\n                const promise = upgradeCustomElementIfNeeded(child);\n                if (promise) {\n                    upgradePromises.push(promise);\n                }\n            }\n        }\n        if (upgradePromises.length > 0) {\n            Promise.all(upgradePromises).then(this._onSlotChange, noOp);\n        }\n\n        this._radioButtons = children.filter(isRadioButton);\n\n        let firstFocusedButton = this.focusedRadioButton;\n        if (!firstFocusedButton) {\n            this.firstRadioButton?.setAttribute('tabindex', '0');\n        }\n\n        this.updateCheckedButton();\n    };\n\n    private readonly _onKeyDown = (event: KeyboardEvent) => {\n        if (this.deviceType === 'tv' && isArrowKey(event.keyCode)) {\n            if (navigateByArrowKey(this, this._radioButtons, event.keyCode)) {\n                event.preventDefault();\n                event.stopPropagation();\n            }\n            return;\n        }\n        switch (event.keyCode) {\n            case KeyCode.UP:\n            case KeyCode.LEFT: {\n                if (this._focusPrevButton()) {\n                    event.preventDefault();\n                }\n                break;\n            }\n            case KeyCode.DOWN:\n            case KeyCode.RIGHT: {\n                if (this._focusNextButton()) {\n                    event.preventDefault();\n                }\n                break;\n            }\n            case KeyCode.HOME: {\n                event.preventDefault();\n                this.setFocusedRadioButton(this.firstRadioButton);\n                break;\n            }\n            case KeyCode.END: {\n                event.preventDefault();\n                this.setFocusedRadioButton(this.lastRadioButton);\n                break;\n            }\n            default: {\n                break;\n            }\n        }\n    };\n\n    get focusedRadioButton(): RadioButton | null {\n        return arrayFind(this._radioButtons, (button) => button.tabIndex === 0) ?? null;\n    }\n\n    get checkedRadioButton(): RadioButton | null {\n        return arrayFind(this._radioButtons, (button) => button.checked) ?? null;\n    }\n\n    get firstRadioButton(): RadioButton | null {\n        return this._radioButtons[0] ?? null;\n    }\n\n    get lastRadioButton(): RadioButton | null {\n        const radioButtons = this._radioButtons;\n        return radioButtons.length > 0 ? radioButtons[radioButtons.length - 1] : null;\n    }\n\n    allRadioButtons(): readonly RadioButton[] {\n        return this._radioButtons;\n    }\n\n    private _prevRadioButton(node: RadioButton): RadioButton | null {\n        const index = this._radioButtons.indexOf(node);\n        if (index > 0) {\n            return this._radioButtons[index - 1];\n        }\n        return null;\n    }\n\n    private _nextRadioButton(node: RadioButton): RadioButton | null {\n        const index = this._radioButtons.indexOf(node);\n        if (index >= 0 && index < this._radioButtons.length - 1) {\n            return this._radioButtons[index + 1];\n        }\n        return null;\n    }\n\n    private _focusPrevButton(): boolean {\n        let focusedButton = this.focusedRadioButton || this.firstRadioButton;\n        if (!focusedButton) {\n            return false;\n        }\n        if (focusedButton === this.firstRadioButton) {\n            this.setFocusedRadioButton(this.lastRadioButton);\n        } else {\n            this.setFocusedRadioButton(this._prevRadioButton(focusedButton));\n        }\n        return true;\n    }\n\n    private _focusNextButton(): boolean {\n        let focusedButton = this.focusedRadioButton || this.firstRadioButton;\n        if (!focusedButton) {\n            return false;\n        }\n        if (focusedButton === this.lastRadioButton) {\n            this.setFocusedRadioButton(this.firstRadioButton);\n        } else {\n            this.setFocusedRadioButton(this._nextRadioButton(focusedButton));\n        }\n        return true;\n    }\n\n    private setFocusedRadioButton(button: RadioButton | null): void {\n        this._unfocusAll();\n        if (button) {\n            button.tabIndex = 0;\n            button.focus();\n        }\n    }\n\n    private _unfocusAll(): void {\n        for (const button of this.allRadioButtons()) {\n            button.tabIndex = -1;\n        }\n    }\n\n    private setCheckedRadioButton(checkedButton: RadioButton | null): void {\n        for (const button of this.allRadioButtons()) {\n            button.checked = button === checkedButton;\n        }\n    }\n\n    private updateCheckedButton(): void {\n        const button = this.allRadioButtons().find((button) => {\n            // Allow '1' == 1\n            return button.value == this.value;\n        });\n        this.setCheckedRadioButton(button ?? null);\n    }\n\n    private readonly _onButtonChange = (event: Event) => {\n        const button = event.target as RadioButton | null;\n        if (button !== null && button.checked) {\n            this.value = button.value;\n        }\n    };\n\n    protected override render(): HTMLTemplateResult {\n        return html`<slot ${ref(this._slotRef)} @slotchange=${this._onSlotChange}></slot>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-radio-group': RadioGroup;\n    }\n}\n\nfunction isRadioButton(node: Node): node is RadioButton {\n    return node instanceof RadioButton;\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport menuCss from './Menu.css';\nimport { CLOSE_MENU_EVENT, type CloseMenuEvent } from '../events/CloseMenuEvent';\nimport { MENU_CHANGE_EVENT, type MenuChangeEvent } from '../events/MenuChangeEvent';\nimport { createCustomEvent } from '../util/EventUtils';\nimport { Attribute } from '../util/Attribute';\nimport { toggleAttribute } from '../util/CommonUtils';\nimport { templateContent } from 'lit/directives/template-content.js';\n\n/** @deprecated */\nexport interface MenuOptions {\n    /**\n     * @deprecated Override {@link Menu.render} instead.\n     */\n    template?: HTMLTemplateElement;\n}\n\n/**\n * @deprecated Override {@link Menu.render} instead.\n */\nexport function menuTemplate(heading: string, content: string, extraCss: string = ''): string {\n    return (\n        `<style>${extraCss}</style>` +\n        `<div part=\"heading\"><theoplayer-menu-close-button></theoplayer-menu-close-button>${heading}</div>` +\n        `<div part=\"content\">${content}</div>`\n    );\n}\n\n/**\n * A menu that can be opened on top of the player.\n *\n * The menu has a heading at the top, with a {@link CloseMenuButton | close button} and a heading text.\n *\n * @slot `heading` - A slot for the menu's heading.\n *\n * @cssproperty `--theoplayer-menu-color` - The text color of menu items. Defaults to `#fff`.\n * @cssproperty `--theoplayer-menu-control-hover-background` - The background of a menu item when hovered. Defaults to `rgba(255, 255, 255, 0.3)`.\n * @cssproperty `--theoplayer-menu-margin` - The margin around the menu. Defaults to `10px`.\n * @cssproperty `--theoplayer-menu-min-width` - The minimum width of the menu. Defaults to `80%`.\n * @cssproperty `--theoplayer-menu-max-width` - The maximum width of the menu. Defaults to `100%`.\n */\n@customElement('theoplayer-menu')\nexport class Menu extends LitElement {\n    static override styles = [menuCss];\n    static override shadowRootOptions: ShadowRootInit = {\n        ...LitElement.shadowRootOptions,\n        delegatesFocus: true\n    };\n\n    private readonly _template: HTMLTemplateElement | undefined;\n    private _menuOpened: boolean = false;\n\n    /**\n     * Creates a menu.\n     *\n     * By default, the button has an unnamed `<slot>` for its contents, and a named `\"heading\"` `<slot>` for its heading text.\n     * Subclasses can override this by overriding {@link renderMenuHeading} and/or {@link renderMenuContent}.\n     */\n    constructor(options?: MenuOptions) {\n        super();\n        this._template = options?.template;\n        if (this._template) {\n            // Render immediately to populate the shadow DOM.\n            this.performUpdate();\n        }\n    }\n\n    connectedCallback(): void {\n        super.connectedCallback();\n\n        if (!this.menuOpened_) {\n            this.setAttribute(Attribute.HIDDEN, '');\n        }\n    }\n\n    /**\n     * Whether to automatically close the menu whenever one of its controls\n     * receives an input (e.g. when a radio button is clicked).\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.MENU_CLOSE_ON_INPUT })\n    accessor closeOnInput: boolean = false;\n\n    /**\n     * Whether the menu is currently open.\n     */\n    private get menuOpened_(): boolean {\n        return this._menuOpened;\n    }\n\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.MENU_OPENED })\n    private set menuOpened_(menuOpened: boolean) {\n        if (this._menuOpened === menuOpened) return;\n        this._menuOpened = menuOpened;\n        toggleAttribute(this, Attribute.HIDDEN, !menuOpened);\n        const changeEvent: MenuChangeEvent = createCustomEvent(MENU_CHANGE_EVENT, { bubbles: true });\n        this.dispatchEvent(changeEvent);\n    }\n\n    /**\n     * Open the menu.\n     */\n    openMenu(): void {\n        this.menuOpened_ = true;\n    }\n\n    /**\n     * Close the menu.\n     */\n    closeMenu(): void {\n        this.menuOpened_ = false;\n    }\n\n    private readonly _onContentInput = (): void => {\n        // Close menu when clicking any button\n        if (this.closeOnInput) {\n            const event: CloseMenuEvent = createCustomEvent(CLOSE_MENU_EVENT, {\n                bubbles: true,\n                composed: true\n            });\n            this.dispatchEvent(event);\n        }\n    };\n\n    protected override render(): HTMLTemplateResult {\n        if (this._template) {\n            return html`${templateContent(this._template)}`;\n        }\n        return html`<div part=\"heading\">\n                <theoplayer-menu-close-button></theoplayer-menu-close-button>\n                ${this.renderMenuHeading()}\n            </div>\n            <div part=\"content\" @input=${this._onContentInput}>${this.renderMenuContent()}</div>`;\n    }\n\n    protected renderMenuHeading(): HTMLTemplateResult {\n        return html`<slot name=\"heading\"></slot>`;\n    }\n\n    protected renderMenuContent(): HTMLTemplateResult {\n        return html`<slot></slot>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-menu': Menu;\n    }\n}\n","import { html, LitElement, type TemplateResult } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport menuGroupCss from './MenuGroup.css';\nimport { Attribute } from '../util/Attribute';\nimport {\n    arrayFind,\n    arrayFindIndex,\n    fromArrayLike,\n    getSlottedElements,\n    isHTMLElement,\n    noOp,\n    toggleAttribute,\n    upgradeCustomElementIfNeeded\n} from '../util/CommonUtils';\nimport { CLOSE_MENU_EVENT, type CloseMenuEvent } from '../events/CloseMenuEvent';\nimport { TOGGLE_MENU_EVENT, type ToggleMenuEvent } from '../events/ToggleMenuEvent';\nimport { isBackKey } from '../util/KeyCode';\nimport { createCustomEvent } from '../util/EventUtils';\nimport type { MenuChangeEvent } from '../events/MenuChangeEvent';\nimport { MENU_CHANGE_EVENT } from '../events/MenuChangeEvent';\nimport { Menu } from './Menu';\nimport { templateContent } from 'lit/directives/template-content.js';\n\n/** @deprecated */\nexport interface MenuGroupOptions {\n    /**\n     * @deprecated Override {@link MenuGroup.render} instead.\n     */\n    template?: HTMLTemplateElement;\n}\n\n/**\n * @deprecated Override {@link MenuGroup.render} instead.\n */\nexport function menuGroupTemplate(content: string, extraCss: string = ''): string {\n    return `<style>${extraCss}</style>${content}`;\n}\n\ninterface OpenMenuEntry {\n    menu: Menu | MenuGroup;\n    opener: HTMLElement | undefined;\n}\n\n/**\n * A group of {@link Menu}s.\n *\n * This can contain multiple other menus, which can be opened with {@link openMenu}.\n * When a {@link MenuButton} in one menu opens another menu in this group, it is opened as a \"submenu\".\n * When a submenu is closed, the menu that originally opened it is shown again.\n */\n@customElement('theoplayer-menu-group')\nexport class MenuGroup extends LitElement {\n    static styles = [menuGroupCss];\n    static override shadowRootOptions: ShadowRootInit = {\n        ...LitElement.shadowRootOptions,\n        delegatesFocus: true\n    };\n\n    private readonly _template: HTMLTemplateElement | undefined;\n\n    constructor(options?: MenuGroupOptions) {\n        super();\n        this._template = options?.template;\n        if (this._template) {\n            // Render immediately to populate the shadow DOM.\n            this.performUpdate();\n        }\n    }\n\n    private _menuOpened: boolean = false;\n\n    /**\n     * Whether any menu in the group is currently open.\n     */\n    private get menuOpened_(): boolean {\n        return this._menuOpened;\n    }\n\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.MENU_OPENED })\n    private set menuOpened_(menuOpened: boolean) {\n        if (this._menuOpened === menuOpened) return;\n        this._menuOpened = menuOpened;\n        toggleAttribute(this, Attribute.MENU_OPENED, menuOpened);\n        if (menuOpened) {\n            this.removeAttribute(Attribute.HIDDEN);\n            this.removeEventListener('keydown', this._onKeyDown);\n            this.addEventListener('keydown', this._onKeyDown);\n        } else {\n            this.setAttribute(Attribute.HIDDEN, '');\n            this.removeEventListener('keydown', this._onKeyDown);\n        }\n        const changeEvent: MenuChangeEvent = createCustomEvent(MENU_CHANGE_EVENT, { bubbles: true });\n        this.dispatchEvent(changeEvent);\n    }\n\n    @query('slot')\n    private accessor _menuSlot: HTMLSlotElement | null = null;\n    private _menus: Array<Menu | MenuGroup> = [];\n    private readonly _openMenuStack: OpenMenuEntry[] = [];\n\n    connectedCallback(): void {\n        super.connectedCallback();\n\n        if (!this.menuOpened_) {\n            this.setAttribute(Attribute.HIDDEN, '');\n        }\n    }\n\n    protected createRenderRoot() {\n        const root = super.createRenderRoot();\n        root.addEventListener(TOGGLE_MENU_EVENT, this._onToggleMenu);\n        root.addEventListener(CLOSE_MENU_EVENT, this._onCloseMenu);\n        root.addEventListener(MENU_CHANGE_EVENT, this._onMenuChange);\n        return root;\n    }\n\n    protected render(): TemplateResult {\n        if (this._template) {\n            return html`${templateContent(this._template)}`;\n        }\n        return html`<slot @slotchange=${this._onMenuListChange}></slot>`;\n    }\n\n    protected override firstUpdated(): void {\n        this._onMenuListChange();\n    }\n\n    /**\n     * Get the menu with the given ID.\n     *\n     * @param [menuId] - The ID of the menu. If unset, returns this menu group.\n     */\n    getMenuById(menuId?: string): Menu | MenuGroup | undefined {\n        if (!menuId || menuId === this.id) {\n            return this;\n        }\n        return arrayFind(this._menus, (menu) => menu.id === menuId);\n    }\n\n    /**\n     * Open the menu with the given ID.\n     *\n     * If no ID is given, the first menu in the group is opened.\n     *\n     * If there's already an open menu, then the new menu is opened as a \"submenu\".\n     * When it closed, the previous menu is opened.\n     *\n     * @param [menuId] - The ID of the menu to open.\n     * @param [opener] - The control that opened the menu. When the menu is closed, focus is moved back to this control.\n     * @returns True if the given menu was found.\n     */\n    openMenu(menuId?: string, opener?: HTMLElement): boolean {\n        let menuToOpen = this.getMenuById(menuId);\n        if (menuToOpen === this) {\n            menuToOpen = this._menus[0];\n        }\n        if (!menuToOpen) {\n            return false;\n        }\n\n        const previousEntry = this.getCurrentMenu_();\n        const index = arrayFindIndex(this._openMenuStack, (entry) => entry.menu === menuToOpen);\n        if (index >= 0) {\n            // Already open.\n            // Close subsequent menus to move menu back to top of the stack.\n            this.closeMenusFromIndex_(index + 1);\n        } else {\n            // Not yet open, add to top of the stack.\n            this._openMenuStack.push({ menu: menuToOpen, opener });\n        }\n\n        if (previousEntry) {\n            previousEntry.menu.closeMenu();\n        }\n        menuToOpen.openMenu();\n        this.menuOpened_ = true;\n\n        menuToOpen.focus();\n        return true;\n    }\n\n    /**\n     * Closes the menu with the given ID.\n     *\n     * If no ID is given, then the entire menu group is closed.\n     *\n     * If the given menu has opened one or more submenus, then those are also closed.\n     * If the last open menu is closed, then the menu group also becomes closed.\n     *\n     * @param [menuId] - The ID of the menu to close.\n     * @returns True if the given menu was found and closed.\n     */\n    closeMenu(menuId?: string): boolean {\n        let menuToClose = this.getMenuById(menuId);\n        if (menuToClose === this) {\n            menuToClose = this._openMenuStack[0]?.menu;\n        }\n        if (!menuToClose) {\n            return false;\n        }\n        const index = arrayFindIndex(this._openMenuStack, (entry) => entry.menu === menuToClose);\n        if (index < 0) {\n            return false;\n        }\n\n        const oldEntry = this._openMenuStack[index];\n        // Close this menu and all subsequent menus\n        this.closeMenusFromIndex_(index);\n\n        const nextEntry = this.getCurrentMenu_();\n        if (nextEntry !== undefined) {\n            nextEntry.menu.openMenu();\n            this.menuOpened_ = true;\n            if (oldEntry.opener && nextEntry.menu.contains(oldEntry.opener)) {\n                oldEntry.opener.focus();\n            } else {\n                nextEntry.menu.focus();\n            }\n            return true;\n        }\n\n        this.menuOpened_ = false;\n        oldEntry.opener?.focus();\n        return true;\n    }\n\n    private closeMenusFromIndex_(index: number): void {\n        const menusToClose = this._openMenuStack.length - index;\n        for (let i = this._openMenuStack.length - 1; i >= index; i--) {\n            this._openMenuStack[i].menu.closeMenu();\n        }\n        this._openMenuStack.splice(index, menusToClose);\n    }\n\n    /**\n     * Whether this menu group has a currently open menu.\n     */\n    hasCurrentMenu(): boolean {\n        return this._openMenuStack.length > 0;\n    }\n\n    private getCurrentMenu_(): OpenMenuEntry | undefined {\n        return this._openMenuStack.length > 0 ? this._openMenuStack[this._openMenuStack.length - 1] : undefined;\n    }\n\n    /**\n     * Close the current menu.\n     */\n    closeCurrentMenu(): boolean {\n        const currentMenu = this.getCurrentMenu_();\n        if (currentMenu !== undefined) {\n            this.closeMenu(currentMenu.menu.id);\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Whether the menu with the given ID is currently open.\n     *\n     * @param [menuId] - The ID of the menu.\n     */\n    isMenuOpen(menuId?: string): boolean {\n        const menu = this.getMenuById(menuId);\n        if (!menu) {\n            return false;\n        }\n        return this._openMenuStack.some((entry) => entry.menu === menu);\n    }\n\n    /**\n     * Update the list of menus whenever the `<slot>` contents change.\n     * Note: the `slotchange` event bubbles up, so we don't have to manually attach\n     * this listener to each nested `<slot>`.\n     */\n    private readonly _onMenuListChange = () => {\n        const children: Element[] = [...fromArrayLike(this.shadowRoot!.children), ...(this._menuSlot ? getSlottedElements(this._menuSlot) : [])];\n        const upgradePromises: Array<Promise<unknown>> = [];\n        for (const child of children) {\n            if (!isMenuElement(child)) {\n                const promise = upgradeCustomElementIfNeeded(child);\n                if (promise) {\n                    upgradePromises.push(promise);\n                }\n            }\n        }\n        if (upgradePromises.length > 0) {\n            Promise.all(upgradePromises).then(this._onMenuListChange, noOp);\n        }\n        const newMenus = children.filter(isMenuElement);\n        // Close all removed menus\n        for (const oldMenu of this._menus) {\n            if (newMenus.indexOf(oldMenu) < 0) {\n                this.closeMenu(oldMenu.id);\n            }\n        }\n        // Ensure newly added menus start as closed\n        for (const newMenu of newMenus) {\n            if (this._menus.indexOf(newMenu) < 0) {\n                newMenu.closeMenu();\n            }\n        }\n        this._menus = newMenus;\n    };\n\n    private readonly _onToggleMenu = (rawEvent: Event): void => {\n        const event = rawEvent as ToggleMenuEvent;\n        const menuId = event.detail.menu;\n        if (!this.getMenuById(menuId)) {\n            // Not our menu, allow event to bubble further up.\n            return;\n        }\n        event.stopPropagation();\n        const opener = isHTMLElement(event.target) ? event.target : undefined;\n        if (this.isMenuOpen(menuId)) {\n            this.closeMenu(menuId);\n        } else {\n            this.openMenu(menuId, opener);\n        }\n    };\n\n    private readonly _onCloseMenu = (rawEvent: Event): void => {\n        const event = rawEvent as CloseMenuEvent;\n        if (this.closeCurrentMenu()) {\n            event.preventDefault();\n            event.stopPropagation();\n        }\n    };\n\n    private readonly _onMenuChange = (rawEvent: Event): void => {\n        const event = rawEvent as MenuChangeEvent;\n        const currentMenu = this.getCurrentMenu_();\n        // If the current menu is another menu container which no longer has an open menu, close it\n        if (currentMenu && currentMenu.menu === event.target && currentMenu.menu instanceof MenuGroup && !currentMenu.menu.hasCurrentMenu()) {\n            this.closeCurrentMenu();\n        }\n    };\n\n    private readonly _onKeyDown = (event: KeyboardEvent) => {\n        // Don't handle modifier shortcuts typically used by assistive technology.\n        if (event.altKey) return;\n\n        if (isBackKey(event.keyCode)) {\n            if (this.closeCurrentMenu()) {\n                event.preventDefault();\n                event.stopPropagation();\n            }\n        }\n    };\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-menu-group': MenuGroup;\n    }\n}\n\nfunction isMenuElement(element: Node): element is Menu | MenuGroup {\n    if (!isHTMLElement(element)) {\n        return false;\n    }\n    return element instanceof Menu || element instanceof MenuGroup;\n}\n","import { Button } from './Button';\nimport { createCustomEvent } from '../util/EventUtils';\nimport { TOGGLE_MENU_EVENT, type ToggleMenuEvent } from '../events/ToggleMenuEvent';\nimport { Attribute } from '../util/Attribute';\nimport { customElement, property } from 'lit/decorators.js';\n\n/**\n * A menu button that opens a {@link Menu}.\n */\n@customElement('theoplayer-menu-button')\nexport class MenuButton extends Button {\n    private _menuId: string | null = null;\n\n    override connectedCallback() {\n        super.connectedCallback();\n\n        if (!this.hasAttribute('aria-haspopup')) {\n            this.setAttribute('aria-haspopup', 'true');\n        }\n    }\n\n    /**\n     * The ID of the menu to open.\n     */\n    get menu(): string | null {\n        return this._menuId;\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.MENU })\n    set menu(menuId: string | null) {\n        if (menuId) {\n            if (this._ariaControls == null || this._ariaControls === this._menuId) {\n                this._ariaControls = menuId;\n            }\n        } else {\n            if (this._ariaControls === this._menuId) {\n                this._ariaControls = null;\n            }\n        }\n        this._menuId = menuId;\n    }\n\n    @property({ reflect: true, state: true, type: String, attribute: 'aria-controls' })\n    private accessor _ariaControls: string | null = null;\n\n    protected override handleClick() {\n        const menu = this.menu;\n        if (menu) {\n            const event: ToggleMenuEvent = createCustomEvent(TOGGLE_MENU_EVENT, {\n                bubbles: true,\n                composed: true,\n                detail: { menu }\n            });\n            this.dispatchEvent(event);\n        }\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-menu-button': MenuButton;\n    }\n}\n","import { html, type HTMLTemplateResult, type PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { Button } from './Button';\nimport backIcon from '../icons/back.svg';\nimport { createCustomEvent } from '../util/EventUtils';\nimport { CLOSE_MENU_EVENT, type CloseMenuEvent } from '../events/CloseMenuEvent';\nimport { getLocale } from '../i18n';\nimport { Attribute } from '../util/Attribute';\nimport { stateReceiver } from './StateReceiverMixin';\n\n/**\n * A button that closes its parent menu.\n *\n * This button must be placed inside a {@link Menu | `<theoplayer-menu>`}.\n */\n@customElement('theoplayer-menu-close-button')\n@stateReceiver(['lang'])\nexport class CloseMenuButton extends Button {\n    protected override handleClick() {\n        const event: CloseMenuEvent = createCustomEvent(CLOSE_MENU_EVENT, {\n            bubbles: true,\n            composed: true\n        });\n        this.dispatchEvent(event);\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    override willUpdate(changedProperties: PropertyValues) {\n        super.willUpdate(changedProperties);\n        this._updateAriaLabel();\n    }\n\n    private _updateAriaLabel(): void {\n        const locale = getLocale(this.lang);\n        this.ariaLabel = locale.closeMenuAria;\n    }\n\n    protected override render(): HTMLTemplateResult {\n        return html`<span part=\"icon\"><slot>${unsafeSVG(backIcon)}</slot></span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-menu-close-button': CloseMenuButton;\n    }\n}\n","import { html, type HTMLTemplateResult } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { RadioButton } from './RadioButton';\nimport type { MediaTrack } from 'theoplayer/chromeless';\nimport { Attribute } from '../util/Attribute';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { defaultLocale, getLocale, type Locale } from '../i18n';\n\nconst TRACK_EVENTS = ['change', 'update'] as const;\n\n/**\n * A radio button that shows the label of a given media track,\n * and switches to that track when clicked.\n */\n@customElement('theoplayer-media-track-radio-button')\n@stateReceiver(['lang'])\nexport class MediaTrackRadioButton extends RadioButton {\n    @state()\n    private accessor _track: MediaTrack | undefined = undefined;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    /**\n     * The media track that is controlled by this radio button.\n     */\n    get track(): MediaTrack | undefined {\n        return this._track;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set track(track: MediaTrack | undefined) {\n        if (this._track === track) {\n            return;\n        }\n        if (this._track) {\n            this._track.removeEventListener(TRACK_EVENTS, this._onTrackChange);\n        }\n        this._track = track;\n        this._updateFromTrack();\n        if (track) {\n            track.addEventListener(TRACK_EVENTS, this._onTrackChange);\n        }\n    }\n\n    private _updateFromTrack(): void {\n        this.checked = this._track ? this._track.enabled : false;\n        this.requestUpdate();\n    }\n\n    private _updateTrack(): void {\n        if (this._track) {\n            this._track.enabled = this.checked;\n        }\n    }\n\n    private readonly _onTrackChange = () => {\n        this._updateFromTrack();\n    };\n\n    protected override handleChange(): void {\n        this._updateTrack();\n    }\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        const label = this._track ? formatMediaTrackLabel(locale, this._track) : '';\n        return html`<slot>${label}</slot>`;\n    }\n}\n\nfunction formatMediaTrackLabel(locale: Locale, track: MediaTrack): string {\n    let label = track.label;\n    let languageCode = track.language;\n    if (label) {\n        if (languageCode && (label === languageCode || label === defaultLocale.formatLanguage(languageCode))) {\n            // Ignore default label with just the language code or non-localized language name.\n        } else {\n            return label;\n        }\n    }\n    let localizedLanguageName = languageCode && locale.formatLanguage(languageCode);\n    if (localizedLanguageName) {\n        return localizedLanguageName;\n    }\n    return label || languageCode || '';\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-media-track-radio-button': MediaTrackRadioButton;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport verticalRadioGroupCss from './VerticalRadioGroup.css';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer, MediaTrack, MediaTrackList, TextTrack, TextTracksList } from 'theoplayer/chromeless';\nimport { Attribute } from '../util/Attribute';\nimport { isNonForcedSubtitleTrack } from '../util/TrackUtils';\nimport { createEvent } from '../util/EventUtils';\nimport { repeat } from 'lit/directives/repeat.js';\n\nconst TRACK_EVENTS = ['addtrack', 'removetrack'] as const;\n\nexport type TrackType = 'audio' | 'video' | 'subtitles';\n\n/**\n * A radio group that shows a list of media or text tracks,\n * from which the user can choose an active track.\n */\n@customElement('theoplayer-track-radio-group')\n@stateReceiver(['player', 'lang'])\nexport class TrackRadioGroup extends LitElement {\n    static override styles = [verticalRadioGroupCss];\n\n    private _player: ChromelessPlayer | undefined;\n    private _trackType: TrackType = 'audio';\n\n    @state()\n    private accessor _tracksList: MediaTrackList | TextTracksList | undefined;\n\n    /**\n     * The track type of the available tracks.\n     *\n     * Can be \"audio\", \"video\" or \"subtitles\".\n     */\n    get trackType(): TrackType {\n        return this._trackType;\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.TRACK_TYPE })\n    set trackType(trackType: TrackType) {\n        this._trackType = trackType;\n        this._updateTracksList();\n    }\n\n    /**\n     * If set, shows an \"off\" button to disable all tracks.\n     *\n     * Can only be used with the `\"subtitles\"` track type.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.SHOW_OFF })\n    accessor showOffButton: boolean = false;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        this._player = player;\n        this._updateTracksList();\n        this._updateTracks();\n    }\n\n    private _getTracksList(): MediaTrackList | TextTracksList | undefined {\n        if (this._player === undefined) {\n            return undefined;\n        }\n        const trackType = this.trackType;\n        if (trackType === 'audio') {\n            return this._player.audioTracks;\n        } else if (trackType === 'video') {\n            return this._player.videoTracks;\n        } else if (trackType === 'subtitles') {\n            return this._player.textTracks;\n        } else {\n            return undefined;\n        }\n    }\n\n    private _updateTracksList(): void {\n        const oldList = this._tracksList;\n        const newList = this._getTracksList();\n        if (oldList !== newList) {\n            oldList?.removeEventListener(TRACK_EVENTS, this._updateTracks);\n            newList?.addEventListener(TRACK_EVENTS, this._updateTracks);\n            this._tracksList = newList;\n        }\n    }\n\n    private _getTracks(): readonly (MediaTrack | TextTrack)[] {\n        if (this._player === undefined) {\n            return [];\n        }\n        const trackType = this.trackType;\n        if (trackType === 'audio') {\n            return this._player.audioTracks;\n        } else if (trackType === 'video') {\n            return this._player.videoTracks;\n        } else if (trackType === 'subtitles') {\n            return this._player.textTracks.filter(isNonForcedSubtitleTrack);\n        } else {\n            return [];\n        }\n    }\n\n    private readonly _updateTracks = (): void => this.requestUpdate();\n\n    private readonly _onChange = () => {\n        this.dispatchEvent(createEvent('change', { bubbles: true }));\n    };\n\n    protected override render(): HTMLTemplateResult {\n        const tracks = this._getTracks();\n        const isSubtitles = this.trackType === 'subtitles';\n        // FIXME: UIContainer doesn't push `lang` through shadow DOM children?\n        return html`<theoplayer-radio-group @change=${this._onChange}>\n            ${\n                /* \"Off\" button */\n                this.showOffButton && isSubtitles\n                    ? html`<theoplayer-text-track-off-radio-button\n                          .trackList=${this._tracksList}\n                          lang=${this.lang}\n                      ></theoplayer-text-track-off-radio-button>`\n                    : undefined\n            }\n            ${\n                /* Track buttons */\n                repeat(\n                    tracks as ReadonlyArray<MediaTrack | TextTrack>,\n                    (track) => track.uid,\n                    (track) =>\n                        isSubtitles\n                            ? html`<theoplayer-text-track-radio-button .track=${track} lang=${this.lang}></theoplayer-text-track-radio-button>`\n                            : html`<theoplayer-media-track-radio-button .track=${track} lang=${this.lang}></theoplayer-media-track-radio-button>`\n                )\n            }\n        </theoplayer-radio-group>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-track-radio-group': TrackRadioGroup;\n    }\n}\n","import { RadioButton } from './RadioButton';\nimport type { TextTrack } from 'theoplayer/chromeless';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { html, type HTMLTemplateResult } from 'lit';\nimport { Attribute } from '../util/Attribute';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { defaultLocale, getLocale, type Locale } from '../i18n';\n\nconst TRACK_EVENTS = ['change', 'update'] as const;\n\n/**\n * `<theoplayer-text-track-radio-button>` -A radio button that shows the label of a given text track, and switches to that track when clicked.\n */\n@customElement('theoplayer-text-track-radio-button')\n@stateReceiver(['lang'])\nexport class TextTrackRadioButton extends RadioButton {\n    @state()\n    private accessor _track: TextTrack | undefined = undefined;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    /**\n     * The text track that is controlled by this radio button.\n     */\n    get track(): TextTrack | undefined {\n        return this._track;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set track(track: TextTrack | undefined) {\n        if (this._track === track) {\n            return;\n        }\n        if (this._track) {\n            this._track.removeEventListener(TRACK_EVENTS, this._onTrackChange);\n        }\n        this._track = track;\n        this._updateFromTrack();\n        if (track) {\n            track.addEventListener(TRACK_EVENTS, this._onTrackChange);\n        }\n    }\n\n    private _updateFromTrack(): void {\n        this.checked = this._track ? this._track.mode === 'showing' : false;\n        this.requestUpdate();\n    }\n\n    private _updateTrack(): void {\n        if (this._track) {\n            this._track.mode = this.checked ? 'showing' : 'disabled';\n        }\n    }\n\n    private readonly _onTrackChange = () => {\n        this._updateFromTrack();\n    };\n\n    protected override handleChange(): void {\n        this._updateTrack();\n    }\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        const label = this._track ? formatTextTrackLabel(locale, this._track) : '';\n        return html`<slot>${label}</slot>`;\n    }\n}\n\nfunction formatTextTrackLabel(locale: Locale, track: TextTrack): string {\n    let label = track.label;\n    let languageCode = track.language;\n    if (label) {\n        if (languageCode && (label === languageCode || label === defaultLocale.formatLanguage(languageCode))) {\n            // Ignore default label with just the language code or non-localized language name.\n        } else if (track.type === 'cea608' && /^CC\\d+$/.test(track.label)) {\n            // Ignore default label with just the caption channel.\n        } else {\n            return label;\n        }\n    }\n    let localizedLanguageName = languageCode && locale.formatLanguage(languageCode);\n    if (localizedLanguageName) {\n        return localizedLanguageName;\n    }\n    if (track.type === 'cea608' && typeof track.captionChannel === 'number') {\n        return `CC${track.captionChannel}`;\n    }\n    return label || languageCode || '';\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-text-track-radio-button': TextTrackRadioButton;\n    }\n}\n","import { html, type HTMLTemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { RadioButton } from './RadioButton';\nimport type { TextTracksList } from 'theoplayer/chromeless';\nimport { isNonForcedSubtitleTrack, isSubtitleTrack } from '../util/TrackUtils';\nimport { getLocale } from '../i18n';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\n\nconst TRACK_EVENTS = ['change'] as const;\n\n/**\n * A radio button that disables the active subtitle track when clicked.\n */\n@customElement('theoplayer-text-track-off-radio-button')\n@stateReceiver(['lang'])\nexport class TextTrackOffRadioButton extends RadioButton {\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    private _trackList: TextTracksList | undefined = undefined;\n\n    get trackList(): TextTracksList | undefined {\n        return this._trackList;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set trackList(trackList: TextTracksList | undefined) {\n        if (this._trackList) {\n            this._trackList.removeEventListener(TRACK_EVENTS, this._onTrackChange);\n        }\n        this._trackList = trackList;\n        this._updateFromTrackList();\n        if (trackList) {\n            trackList.addEventListener(TRACK_EVENTS, this._onTrackChange);\n        }\n    }\n\n    private _updateFromTrackList(): void {\n        this.checked = this._trackList ? !hasShowingSubtitleTrack(this._trackList) : true;\n    }\n\n    private _updateTrackList(): void {\n        if (this._trackList && this.checked) {\n            disableSubtitleTracks(this._trackList);\n        }\n    }\n\n    private readonly _onTrackChange = () => {\n        this._updateFromTrackList();\n    };\n\n    protected override handleChange() {\n        this._updateTrackList();\n    }\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        return html`<slot>${locale.subtitleOff}</slot>`;\n    }\n}\n\nfunction hasShowingSubtitleTrack(trackList: TextTracksList): boolean {\n    return trackList.some((track) => isNonForcedSubtitleTrack(track) && track.mode === 'showing');\n}\n\nfunction disableSubtitleTracks(trackList: TextTracksList): void {\n    for (const track of trackList) {\n        if (isSubtitleTrack(track) && track.mode === 'showing') {\n            track.mode = 'disabled';\n        }\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-text-track-off-radio-button': TextTrackOffRadioButton;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer, EdgeStyle, TextTrackStyle } from 'theoplayer/chromeless';\nimport { Attribute } from '../util/Attribute';\nimport { parseColor, toRgb } from '../util/ColorUtils';\nimport type { TextTrackStyleOption } from './TextTrackStyleRadioGroup';\nimport { arrayFind } from '../util/CommonUtils';\nimport { colorOptions, fontFamilyOptions } from '../util/TextTrackStylePresets';\nimport { getLocale, type Locale } from '../i18n';\n\n/**\n * A control that displays the value of a single text track style option\n * in a human-readable format.\n */\n@customElement('theoplayer-text-track-style-display')\n@stateReceiver(['player', 'lang'])\nexport class TextTrackStyleDisplay extends LitElement {\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    private _player: ChromelessPlayer | undefined;\n    private _property: TextTrackStyleOption = 'fontColor';\n    private _textTrackStyle: TextTrackStyle | undefined;\n\n    /**\n     * The property name of the text track style option.\n     *\n     * One of {@link TextTrackStyleOption}.\n     */\n    get property(): TextTrackStyleOption {\n        return this._property;\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.PROPERTY })\n    set property(property: TextTrackStyleOption) {\n        this._property = property;\n        this._updateFromPlayer();\n    }\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        this._textTrackStyle?.removeEventListener('change', this._updateFromPlayer);\n        this._player = player;\n        this._textTrackStyle = player?.textTrackStyle;\n        this._updateFromPlayer();\n        this._textTrackStyle?.addEventListener('change', this._updateFromPlayer);\n    }\n\n    private readonly _updateFromPlayer = () => this.requestUpdate();\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        return html`<span>${this.renderValue(locale)}</span>`;\n    }\n\n    private renderValue(locale: Locale): string {\n        if (this._player === undefined) {\n            return '';\n        }\n        const property = this.property;\n        switch (property) {\n            case 'fontFamily': {\n                return getFontFamilyLabel(this._player.textTrackStyle.fontFamily, locale);\n            }\n            case 'fontColor':\n            case 'backgroundColor':\n            case 'windowColor': {\n                return getColorLabel(this._player.textTrackStyle[property], locale);\n            }\n            case 'fontOpacity': {\n                return getOpacityLabel(this._player.textTrackStyle.fontColor, locale);\n            }\n            case 'backgroundOpacity': {\n                return getOpacityLabel(this._player.textTrackStyle.backgroundColor, locale);\n            }\n            case 'windowOpacity': {\n                return getOpacityLabel(this._player.textTrackStyle.windowColor, locale);\n            }\n            case 'edgeStyle': {\n                return getEdgeStyleLabel(this._player.textTrackStyle.edgeStyle, locale);\n            }\n            default: {\n                const value = this._player.textTrackStyle[property];\n                return value ? value : locale.textTrackStyleDefaultLabel;\n            }\n        }\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-text-track-style-display': TextTrackStyleDisplay;\n    }\n}\n\nfunction getFontFamilyLabel(fontFamily: string | null | undefined, locale: Locale): string {\n    if (!fontFamily) {\n        return locale.textTrackStyleDefaultLabel;\n    }\n    const knownFontFamily = arrayFind(fontFamilyOptions, ({ value }) => value === fontFamily);\n    if (knownFontFamily) {\n        return locale.fontFamilyLabels[knownFontFamily.label] ?? knownFontFamily.label;\n    }\n    return locale.textTrackStyleCustomLabel;\n}\n\nfunction getColorLabel(color: string | null | undefined, locale: Locale): string {\n    if (!color) {\n        return locale.textTrackStyleDefaultLabel;\n    }\n    const parsedColor = parseColor(color);\n    if (parsedColor) {\n        const colorRgb = toRgb(parsedColor);\n        const knownColor = arrayFind(colorOptions, ({ value }) => value === colorRgb);\n        if (knownColor) {\n            return locale.colorLabels[knownColor.label] ?? knownColor.label;\n        }\n    }\n    return locale.textTrackStyleCustomLabel;\n}\n\nfunction getOpacityLabel(color: string | null | undefined, locale: Locale): string {\n    if (!color) {\n        return locale.textTrackStyleDefaultLabel;\n    }\n    const parsedColor = parseColor(color);\n    if (parsedColor) {\n        return locale.formatPercentage(parsedColor.a_);\n    }\n    return locale.textTrackStyleCustomLabel;\n}\n\nfunction getEdgeStyleLabel(edgeStyle: EdgeStyle | null | undefined, locale: Locale): string {\n    if (!edgeStyle) {\n        return locale.textTrackStyleDefaultLabel;\n    }\n    return locale.edgeStyleLabels[edgeStyle] ?? locale.textTrackStyleCustomLabel;\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { createRef, ref, type Ref } from 'lit/directives/ref.js';\nimport { RadioGroup } from './RadioGroup';\nimport verticalRadioGroupCss from './VerticalRadioGroup.css';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer, EdgeStyle, TextTrackStyle } from 'theoplayer/chromeless';\nimport type { RadioButton } from './RadioButton';\nimport { createEvent } from '../util/EventUtils';\nimport { Attribute } from '../util/Attribute';\nimport { COLOR_BLACK, COLOR_WHITE, colorWithAlpha, parseColor, type RgbaColor, rgbEquals, toRgb, toRgba } from '../util/ColorUtils';\n\nexport interface TextTrackStyleMap {\n    fontFamily: string | undefined;\n    fontColor: string | undefined;\n    fontOpacity: number | undefined;\n    fontSize: string | undefined;\n    backgroundColor: string | undefined;\n    backgroundOpacity: number | undefined;\n    windowColor: string | undefined;\n    windowOpacity: number | undefined;\n    edgeStyle: EdgeStyle | undefined;\n}\n\nexport type TextTrackStyleOption = keyof TextTrackStyleMap;\n\n/**\n * A radio group that shows a list of values for a text track style option,\n * from which the user can choose a desired value.\n *\n * @slot {@link RadioButton} - The possible options for the text track style option.\n *   For example: `<theoplayer-radio-button value=\"#ff0000\">Red</theoplayer-radio-button>`\n */\n@customElement('theoplayer-text-track-style-radio-group')\n@stateReceiver(['player'])\nexport class TextTrackStyleRadioGroup extends LitElement {\n    static override styles = [verticalRadioGroupCss];\n\n    private readonly _radioGroupRef: Ref<RadioGroup> = createRef<RadioGroup>();\n    private _player: ChromelessPlayer | undefined;\n    private _textTrackStyle: TextTrackStyle | undefined;\n    private _property: TextTrackStyleOption = 'fontColor';\n    private _value: any;\n\n    protected override firstUpdated(): void {\n        const radioGroup = this._radioGroupRef.value!;\n        if (!(radioGroup instanceof RadioGroup)) {\n            customElements.upgrade(radioGroup);\n        }\n        radioGroup.value = this.value;\n    }\n\n    /**\n     * The property name of the text track style option.\n     *\n     * One of {@link TextTrackStyleOption}.\n     */\n    get property(): TextTrackStyleOption {\n        return this._property;\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.PROPERTY })\n    set property(property: TextTrackStyleOption) {\n        if (this._property === property) return;\n        this._property = property;\n        this._updateFromPlayer();\n    }\n\n    /**\n     * The currently chosen value for the text track style option.\n     */\n    get value(): string {\n        return this._value;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set value(value: string) {\n        if (this._value === value) {\n            return;\n        }\n        this._value = value;\n        this._updateToPlayer();\n        const radioGroup = this._radioGroupRef.value;\n        if (radioGroup) {\n            radioGroup.value = value;\n        }\n        this.dispatchEvent(createEvent('change', { bubbles: true }));\n    }\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        this._textTrackStyle?.removeEventListener('change', this._updateFromPlayer);\n        this._player = player;\n        this._textTrackStyle = player?.textTrackStyle;\n        this._updateFromPlayer();\n        this._textTrackStyle?.addEventListener('change', this._updateFromPlayer);\n    }\n\n    private readonly _onChange = (): void => {\n        const radioGroup = this._radioGroupRef.value;\n        if (!radioGroup) return;\n        this.value = radioGroup.value;\n    };\n\n    private readonly _updateFromPlayer = (): void => {\n        if (this._player === undefined) {\n            return;\n        }\n        switch (this.property) {\n            case 'fontColor': {\n                const color = this._player.textTrackStyle.fontColor;\n                this.value = color ? toRgb(parseColor(color) ?? COLOR_WHITE) : '';\n                break;\n            }\n            case 'backgroundColor': {\n                const color = this._player.textTrackStyle.backgroundColor;\n                this.value = color ? toRgb(parseColor(color) ?? COLOR_BLACK) : '';\n                break;\n            }\n            case 'windowColor': {\n                const color = this._player.textTrackStyle.windowColor;\n                this.value = color ? toRgb(parseColor(color) ?? COLOR_BLACK) : '';\n                break;\n            }\n            case 'fontOpacity': {\n                const color = this._player.textTrackStyle.fontColor;\n                this.value = color ? String((parseColor(color)?.a_ ?? 1) * 100) : '';\n                break;\n            }\n            case 'backgroundOpacity': {\n                const color = this._player.textTrackStyle.backgroundColor;\n                this.value = color ? String((parseColor(color)?.a_ ?? 1) * 100) : '';\n                break;\n            }\n            case 'windowOpacity': {\n                const color = this._player.textTrackStyle.windowColor;\n                this.value = color ? String((parseColor(color)?.a_ ?? 1) * 100) : '';\n                break;\n            }\n            default: {\n                this.value = this._player.textTrackStyle[this.property] ?? '';\n                break;\n            }\n        }\n    };\n\n    private _updateToPlayer(): void {\n        if (this._player === undefined) {\n            return;\n        }\n        switch (this.property) {\n            case 'fontColor': {\n                this._player.textTrackStyle.fontColor = updateColor(this.value, this._player.textTrackStyle.fontColor, COLOR_WHITE);\n                break;\n            }\n            case 'backgroundColor': {\n                this._player.textTrackStyle.backgroundColor = updateColor(this.value, this._player.textTrackStyle.backgroundColor, COLOR_BLACK);\n                break;\n            }\n            case 'windowColor': {\n                this._player.textTrackStyle.windowColor = updateColor(this.value, this._player.textTrackStyle.windowColor, COLOR_BLACK);\n                break;\n            }\n            case 'fontOpacity': {\n                this._player.textTrackStyle.fontColor = updateOpacity(this.value, this._player.textTrackStyle.fontColor, COLOR_WHITE);\n                break;\n            }\n            case 'backgroundOpacity': {\n                this._player.textTrackStyle.backgroundColor = updateOpacity(this.value, this._player.textTrackStyle.backgroundColor, COLOR_BLACK);\n                break;\n            }\n            case 'windowOpacity': {\n                this._player.textTrackStyle.windowColor = updateOpacity(this.value, this._player.textTrackStyle.windowColor, COLOR_BLACK);\n                break;\n            }\n            default: {\n                this._player.textTrackStyle[this.property] = this.value == '' ? undefined : (this.value as any);\n                break;\n            }\n        }\n    }\n\n    protected override render(): HTMLTemplateResult {\n        return html`<theoplayer-radio-group ${ref(this._radioGroupRef)} @change=${this._onChange}><slot></slot></theoplayer-radio-group>`;\n    }\n}\n\nfunction updateColor(colorValue: string, previousColor: string | undefined, defaultColor: RgbaColor): string | undefined {\n    const alpha = parseColor(previousColor)?.a_ ?? 1;\n    if (colorValue === '' && alpha === 1) {\n        return undefined;\n    } else {\n        const color = parseColor(colorValue) ?? defaultColor;\n        return toRgba(colorWithAlpha(color, alpha));\n    }\n}\n\nfunction updateOpacity(opacityValue: string, colorValue: string | undefined, defaultColor: RgbaColor): string | undefined {\n    const color = parseColor(colorValue) ?? defaultColor;\n    if (opacityValue === '' && rgbEquals(color, defaultColor)) {\n        return undefined;\n    } else {\n        const alpha = opacityValue == '' ? 1 : Number(opacityValue) / 100;\n        return toRgba(colorWithAlpha(color, alpha));\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-text-track-style-radio-group': TextTrackStyleRadioGroup;\n    }\n}\n","import { html, type TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { MenuGroup } from './MenuGroup';\nimport textTrackStyleMenuCss from './TextTrackStyleMenu.css';\nimport menuTableCss from './MenuTable.css';\nimport { colorOptions, edgeStyleOptions, fontFamilyOptions, opacityOptions, sizeOptions } from '../util/TextTrackStylePresets';\nimport { getLocale } from '../i18n';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\n\n// Load components used in template\nimport './TextTrackStyleDisplay';\nimport './TextTrackStyleRadioGroup';\n\n/**\n * A menu to change the {@link theoplayer!TextTrackStyle | text track style} of the player.\n *\n * @slot `heading` - A slot for the menu's heading.\n */\n@customElement('theoplayer-text-track-style-menu')\n@stateReceiver(['lang'])\nexport class TextTrackStyleMenu extends MenuGroup {\n    static styles = [...MenuGroup.styles, menuTableCss, textTrackStyleMenuCss];\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    protected override render(): TemplateResult {\n        const locale = getLocale(this.lang);\n        return html`\n            <theoplayer-menu class=\"theoplayer-text-track-style-menu\">\n                <span class=\"theoplayer-menu-heading\" slot=\"heading\"><slot name=\"heading\">${locale.textTrackStyleMenuHeading}</slot></span>\n                <theoplayer-text-track-style-reset-button\n                    class=\"theoplayer-menu-heading-button\"\n                    slot=\"heading\"\n                ></theoplayer-text-track-style-reset-button>\n                <table>\n                    <tr>\n                        <td><span>${locale.textTrackStyleFontFamily}</span></td>\n                        <td>\n                            <theoplayer-menu-button menu=\"font-family-menu\">\n                                <theoplayer-text-track-style-display property=\"fontFamily\"></theoplayer-text-track-style-display>\n                            </theoplayer-menu-button>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><span>${locale.textTrackStyleFontColor}</span></td>\n                        <td>\n                            <theoplayer-menu-button menu=\"font-color-menu\">\n                                <theoplayer-text-track-style-display property=\"fontColor\"></theoplayer-text-track-style-display>\n                            </theoplayer-menu-button>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><span>${locale.textTrackStyleFontOpacity}</span></td>\n                        <td>\n                            <theoplayer-menu-button menu=\"font-opacity-menu\">\n                                <theoplayer-text-track-style-display property=\"fontOpacity\"></theoplayer-text-track-style-display>\n                            </theoplayer-menu-button>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><span>${locale.textTrackStyleFontSize}</span></td>\n                        <td>\n                            <theoplayer-menu-button menu=\"font-size-menu\">\n                                <theoplayer-text-track-style-display property=\"fontSize\"></theoplayer-text-track-style-display>\n                            </theoplayer-menu-button>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><span>${locale.textTrackStyleBackgroundColor}</span></td>\n                        <td>\n                            <theoplayer-menu-button menu=\"background-color-menu\">\n                                <theoplayer-text-track-style-display property=\"backgroundColor\"></theoplayer-text-track-style-display>\n                            </theoplayer-menu-button>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><span>${locale.textTrackStyleBackgroundOpacity}</span></td>\n                        <td>\n                            <theoplayer-menu-button menu=\"background-opacity-menu\">\n                                <theoplayer-text-track-style-display property=\"backgroundOpacity\"></theoplayer-text-track-style-display>\n                            </theoplayer-menu-button>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><span>${locale.textTrackStyleWindowColor}</span></td>\n                        <td>\n                            <theoplayer-menu-button menu=\"window-color-menu\">\n                                <theoplayer-text-track-style-display property=\"windowColor\"></theoplayer-text-track-style-display>\n                            </theoplayer-menu-button>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><span>${locale.textTrackStyleWindowOpacity}</span></td>\n                        <td>\n                            <theoplayer-menu-button menu=\"window-opacity-menu\">\n                                <theoplayer-text-track-style-display property=\"windowOpacity\"></theoplayer-text-track-style-display>\n                            </theoplayer-menu-button>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><span>${locale.textTrackStyleEdgeStyle}</span></td>\n                        <td>\n                            <theoplayer-menu-button menu=\"edge-style-menu\">\n                                <theoplayer-text-track-style-display property=\"edgeStyle\"></theoplayer-text-track-style-display>\n                            </theoplayer-menu-button>\n                        </td>\n                    </tr>\n                </table>\n            </theoplayer-menu>\n            <theoplayer-menu id=\"font-family-menu\" menu-close-on-input hidden>\n                <span slot=\"heading\">${locale.textTrackStyleFontFamily}</span>\n                <theoplayer-text-track-style-radio-group property=\"fontFamily\">\n                    <theoplayer-radio-button value=\"\">${locale.textTrackStyleDefaultLabel}</theoplayer-radio-button>\n                    ${fontFamilyOptions.map(\n                        ({ label, value }) =>\n                            html`<theoplayer-radio-button value=${value}>${locale.fontFamilyLabels[label] ?? label}</theoplayer-radio-button> `\n                    )}\n                </theoplayer-text-track-style-radio-group>\n            </theoplayer-menu>\n            <theoplayer-menu id=\"font-color-menu\" menu-close-on-input hidden>\n                <span slot=\"heading\">${locale.textTrackStyleFontColor}</span>\n                <theoplayer-text-track-style-radio-group property=\"fontColor\">\n                    <theoplayer-radio-button value=\"\">${locale.textTrackStyleDefaultLabel}</theoplayer-radio-button>\n                    ${colorOptions.map(\n                        ({ label, value }) =>\n                            html`<theoplayer-radio-button value=${value}>${locale.colorLabels[label] ?? label}</theoplayer-radio-button> `\n                    )}\n                </theoplayer-text-track-style-radio-group>\n            </theoplayer-menu>\n            <theoplayer-menu id=\"font-opacity-menu\" menu-close-on-input hidden>\n                <span slot=\"heading\">${locale.textTrackStyleFontOpacity}</span>\n                <theoplayer-text-track-style-radio-group property=\"fontOpacity\">\n                    <theoplayer-radio-button value=\"\">${locale.textTrackStyleDefaultLabel}</theoplayer-radio-button>\n                    ${opacityOptions.map(\n                        (value) => html`<theoplayer-radio-button value=${value * 100}>${locale.formatPercentage(value)}</theoplayer-radio-button> `\n                    )}\n                </theoplayer-text-track-style-radio-group>\n            </theoplayer-menu>\n            <theoplayer-menu id=\"font-size-menu\" menu-close-on-input hidden>\n                <span slot=\"heading\">${locale.textTrackStyleFontSize}</span>\n                <theoplayer-text-track-style-radio-group property=\"fontSize\">\n                    <theoplayer-radio-button value=\"\">${locale.textTrackStyleDefaultLabel}</theoplayer-radio-button>\n                    ${sizeOptions.map(\n                        (value) => html`<theoplayer-radio-button value=${value * 100}>${locale.formatPercentage(value)}</theoplayer-radio-button> `\n                    )}\n                </theoplayer-text-track-style-radio-group>\n            </theoplayer-menu>\n            <theoplayer-menu id=\"background-color-menu\" menu-close-on-input hidden>\n                <span slot=\"heading\">${locale.textTrackStyleBackgroundColor}</span>\n                <theoplayer-text-track-style-radio-group property=\"backgroundColor\">\n                    <theoplayer-radio-button value=\"\">${locale.textTrackStyleDefaultLabel}</theoplayer-radio-button>\n                    ${colorOptions.map(\n                        ({ label, value }) =>\n                            html`<theoplayer-radio-button value=${value}>${locale.colorLabels[label] ?? label}</theoplayer-radio-button> `\n                    )}\n                </theoplayer-text-track-style-radio-group>\n            </theoplayer-menu>\n            <theoplayer-menu id=\"background-opacity-menu\" menu-close-on-input hidden>\n                <span slot=\"heading\">${locale.textTrackStyleBackgroundOpacity}</span>\n                <theoplayer-text-track-style-radio-group property=\"backgroundOpacity\">\n                    <theoplayer-radio-button value=\"\">${locale.textTrackStyleDefaultLabel}</theoplayer-radio-button>\n                    ${opacityOptions.map(\n                        (value) => html`<theoplayer-radio-button value=${value * 100}>${locale.formatPercentage(value)}</theoplayer-radio-button> `\n                    )}\n                </theoplayer-text-track-style-radio-group>\n            </theoplayer-menu>\n            <theoplayer-menu id=\"window-color-menu\" menu-close-on-input hidden>\n                <span slot=\"heading\">${locale.textTrackStyleWindowColor}</span>\n                <theoplayer-text-track-style-radio-group property=\"windowColor\">\n                    <theoplayer-radio-button value=\"\">${locale.textTrackStyleDefaultLabel}</theoplayer-radio-button>\n                    ${colorOptions.map(\n                        ({ label, value }) =>\n                            html`<theoplayer-radio-button value=${value}>${locale.colorLabels[label] ?? label}</theoplayer-radio-button> `\n                    )}\n                </theoplayer-text-track-style-radio-group>\n            </theoplayer-menu>\n            <theoplayer-menu id=\"window-opacity-menu\" menu-close-on-input hidden>\n                <span slot=\"heading\">${locale.textTrackStyleWindowOpacity}</span>\n                <theoplayer-text-track-style-radio-group property=\"windowOpacity\">\n                    <theoplayer-radio-button value=\"\">${locale.textTrackStyleDefaultLabel}</theoplayer-radio-button>\n                    ${opacityOptions.map(\n                        (value) => html`<theoplayer-radio-button value=${value * 100}>${locale.formatPercentage(value)}</theoplayer-radio-button> `\n                    )}\n                </theoplayer-text-track-style-radio-group>\n            </theoplayer-menu>\n            <theoplayer-menu id=\"edge-style-menu\" menu-close-on-input hidden>\n                <span slot=\"heading\">${locale.textTrackStyleEdgeStyle}</span>\n                <theoplayer-text-track-style-radio-group property=\"edgeStyle\">\n                    <theoplayer-radio-button value=\"\">${locale.textTrackStyleDefaultLabel}</theoplayer-radio-button>\n                    ${edgeStyleOptions.map(\n                        (value) => html`<theoplayer-radio-button value=${value}>${locale.edgeStyleLabels[value] ?? value}</theoplayer-radio-button> `\n                    )}\n                </theoplayer-text-track-style-radio-group>\n            </theoplayer-menu>\n        `;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-text-track-style-menu': TextTrackStyleMenu;\n    }\n}\n","import { html, type TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { MenuGroup } from './MenuGroup';\nimport languageMenuCss from './LanguageMenu.css';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer, MediaTrack, MediaTrackList, TextTrack, TextTracksList } from 'theoplayer/chromeless';\nimport { isNonForcedSubtitleTrack } from '../util/TrackUtils';\nimport { Attribute } from '../util/Attribute';\nimport { getLocale } from '../i18n';\n\n// Load components used in template\nimport './TrackRadioGroup';\nimport './TextTrackStyleMenu';\n\nconst TRACK_EVENTS = ['addtrack', 'removetrack'] as const;\n\n/**\n * A menu to change the spoken language and subtitles of the stream.\n *\n * @slot `heading` - A slot for the menu's heading.\n */\n@customElement('theoplayer-language-menu')\n@stateReceiver(['player', 'lang'])\nexport class LanguageMenu extends MenuGroup {\n    static styles = [...MenuGroup.styles, languageMenuCss];\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    private _player: ChromelessPlayer | undefined;\n    private _audioTrackList: MediaTrackList | undefined;\n    private _textTrackList: TextTracksList | undefined;\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ state: true })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        this._audioTrackList?.removeEventListener(TRACK_EVENTS, this._updateAudioTracks);\n        this._textTrackList?.removeEventListener(TRACK_EVENTS, this._updateTextTracks);\n        this._player = player;\n        this._audioTrackList = player?.audioTracks;\n        this._textTrackList = player?.textTracks;\n        this._updateAudioTracks();\n        this._updateTextTracks();\n        this._audioTrackList?.addEventListener(TRACK_EVENTS, this._updateAudioTracks);\n        this._textTrackList?.addEventListener(TRACK_EVENTS, this._updateTextTracks);\n    }\n\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.HAS_AUDIO })\n    private accessor _hasAudioTracks: boolean = false;\n\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.HAS_SUBTITLES })\n    private accessor _hasSubtitles: boolean = false;\n\n    private readonly _updateAudioTracks = (): void => {\n        const newAudioTracks: readonly MediaTrack[] = this._player?.audioTracks ?? [];\n        // Hide audio track selection if there's only one track.\n        this._hasAudioTracks = newAudioTracks.length > 1;\n    };\n\n    private readonly _updateTextTracks = (): void => {\n        const newSubtitleTracks: readonly TextTrack[] = this._player?.textTracks.filter(isNonForcedSubtitleTrack) ?? [];\n        // Hide subtitle track selection if there are no tracks. If there's one, we still show an \"off\" option.\n        this._hasSubtitles = newSubtitleTracks.length > 0;\n    };\n\n    protected override render(): TemplateResult {\n        const locale = getLocale(this.lang);\n        // FIXME: UIContainer doesn't push `lang` through shadow DOM children?\n        return html`\n            <theoplayer-menu>\n                <span class=\"theoplayer-menu-heading\" slot=\"heading\"><slot name=\"heading\">${locale.languageMenuHeading}</slot></span>\n                <theoplayer-settings-menu-button\n                    class=\"theoplayer-menu-heading-button\"\n                    menu=\"subtitle-options-menu\"\n                    slot=\"heading\"\n                    lang=${this.lang}\n                ></theoplayer-settings-menu-button>\n                <div part=\"content\">\n                    <div part=\"audio\">\n                        <h2>${locale.audioMenuHeading}</h2>\n                        <theoplayer-track-radio-group track-type=\"audio\" lang=${this.lang}></theoplayer-track-radio-group>\n                    </div>\n                    <div part=\"subtitles\">\n                        <h2>${locale.subtitleMenuHeading}</h2>\n                        <theoplayer-track-radio-group track-type=\"subtitles\" show-off lang=${this.lang}></theoplayer-track-radio-group>\n                    </div>\n                </div>\n            </theoplayer-menu>\n            <theoplayer-text-track-style-menu id=\"subtitle-options-menu\" lang=${this.lang}></theoplayer-text-track-style-menu>\n        `;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-language-menu': LanguageMenu;\n    }\n}\n","import { html, type HTMLTemplateResult, type PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { MenuButton } from './MenuButton';\nimport languageIcon from '../icons/language.svg';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer, MediaTrackList, TextTracksList } from 'theoplayer/chromeless';\nimport { isNonForcedSubtitleTrack } from '../util/TrackUtils';\nimport { Attribute } from '../util/Attribute';\nimport { toggleAttribute } from '../util/CommonUtils';\nimport { getLocale } from '../i18n';\n\nconst TRACK_EVENTS = ['addtrack', 'removetrack'] as const;\n\n/**\n * A menu button that opens a {@link LanguageMenu}.\n *\n * When there are no alternative audio languages or subtitles, this button automatically hides itself.\n */\n@customElement('theoplayer-language-menu-button')\n@stateReceiver(['player', 'lang'])\nexport class LanguageMenuButton extends MenuButton {\n    private _player: ChromelessPlayer | undefined;\n    private _audioTrackList: MediaTrackList | undefined;\n    private _textTrackList: TextTracksList | undefined;\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        this._audioTrackList?.removeEventListener(TRACK_EVENTS, this._updateTracks);\n        this._textTrackList?.removeEventListener(TRACK_EVENTS, this._updateTracks);\n        this._player = player;\n        this._audioTrackList = player?.audioTracks;\n        this._textTrackList = player?.textTracks;\n        this._updateTracks();\n        this._audioTrackList?.addEventListener(TRACK_EVENTS, this._updateTracks);\n        this._textTrackList?.addEventListener(TRACK_EVENTS, this._updateTracks);\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    private readonly _updateTracks = (): void => {\n        const hasTracks =\n            this._player !== undefined && (this._player.audioTracks.length >= 2 || this._player.textTracks.some(isNonForcedSubtitleTrack));\n        toggleAttribute(this, Attribute.HIDDEN, !hasTracks);\n    };\n\n    override willUpdate(changedProperties: PropertyValues) {\n        super.willUpdate(changedProperties);\n        this._updateAriaLabel();\n    }\n\n    private _updateAriaLabel(): void {\n        const locale = getLocale(this.lang);\n        this.ariaLabel = locale.openLanguageMenuAria;\n    }\n\n    protected override render(): HTMLTemplateResult {\n        return html`<span part=\"icon\"><slot>${unsafeSVG(languageIcon)}</slot></span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-language-menu-button': LanguageMenuButton;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { createRef, ref, type Ref } from 'lit/directives/ref.js';\nimport { RadioGroup } from './RadioGroup';\nimport verticalRadioGroupCss from './VerticalRadioGroup.css';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport type { RadioButton } from './RadioButton';\nimport { createEvent } from '../util/EventUtils';\n\n/**\n * A radio group that shows a list of playback rates,\n * from which the user can choose a desired playback rate.\n *\n * @slot {@link RadioButton} - The possible options for the playback rate.\n *   The value of each radio button must be a valid number.\n *   For example: `<theoplayer-radio-button value=\"2\">2x</theoplayer-radio-button>`\n */\n@customElement('theoplayer-playback-rate-radio-group')\n@stateReceiver(['player'])\nexport class PlaybackRateRadioGroup extends LitElement {\n    static override styles = [verticalRadioGroupCss];\n\n    private readonly _radioGroupRef: Ref<RadioGroup> = createRef<RadioGroup>();\n    private _player: ChromelessPlayer | undefined;\n    private _value: number = 1;\n\n    protected override firstUpdated(): void {\n        const radioGroup = this._radioGroupRef.value!;\n        if (!(radioGroup instanceof RadioGroup)) {\n            customElements.upgrade(radioGroup);\n        }\n        radioGroup.value = String(this.value);\n    }\n\n    /**\n     * The currently chosen playback rate.\n     */\n    get value(): number {\n        return this._value;\n    }\n\n    @state()\n    set value(value: number) {\n        value = Number(value);\n        if (this._value === value) {\n            return;\n        }\n        this._value = value;\n        if (this._player !== undefined && this._player.playbackRate !== value) {\n            this._player.playbackRate = value;\n        }\n        const radioGroup = this._radioGroupRef.value;\n        if (radioGroup) {\n            radioGroup.value = String(value);\n        }\n        this.dispatchEvent(createEvent('change', { bubbles: true }));\n    }\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @state()\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._player !== undefined) {\n            this._player.removeEventListener('ratechange', this._updateFromPlayer);\n        }\n        this._player = player;\n        this._updateFromPlayer();\n        if (this._player !== undefined) {\n            this._player.addEventListener('ratechange', this._updateFromPlayer);\n        }\n    }\n\n    private readonly _onChange = (): void => {\n        const radioGroup = this._radioGroupRef.value;\n        if (!radioGroup) return;\n        this.value = Number(radioGroup.value);\n    };\n\n    private readonly _updateFromPlayer = (): void => {\n        if (this._player !== undefined) {\n            this.value = this._player.playbackRate;\n        }\n    };\n\n    protected override render(): HTMLTemplateResult {\n        return html`<theoplayer-radio-group ${ref(this._radioGroupRef)} @change=${this._onChange}><slot></slot></theoplayer-radio-group>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-playback-rate-radio-group': PlaybackRateRadioGroup;\n    }\n}\n","import { html, type HTMLTemplateResult, type PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { MenuButton } from './MenuButton';\nimport speedIcon from '../icons/speed.svg';\nimport { getLocale } from '../i18n';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\n\n/**\n * A menu button that opens a [playback rate menu]{@link PlaybackRateMenu}.\n *\n * @attribute menu - The ID of the playback rate menu.\n */\n@customElement('theoplayer-playback-rate-menu-button')\n@stateReceiver(['lang'])\nexport class PlaybackRateMenuButton extends MenuButton {\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    override willUpdate(changedProperties: PropertyValues) {\n        super.willUpdate(changedProperties);\n        this._updateAriaLabel();\n    }\n\n    private _updateAriaLabel(): void {\n        const locale = getLocale(this.lang);\n        this.ariaLabel = locale.openPlaybackRateMenuAria;\n    }\n\n    protected override render(): HTMLTemplateResult {\n        return html`<span part=\"icon\"><slot>${unsafeSVG(speedIcon)}</slot></span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-playback-rate-menu-button': PlaybackRateMenuButton;\n    }\n}\n","import { html, type HTMLTemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Menu } from './Menu';\nimport { getLocale } from '../i18n';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\n\n// Load components used in template\nimport './PlaybackRateRadioGroup';\n\nconst PLAYBACK_RATES = [0.25, 0.5, 1, 1.25, 1.5, 2];\n\n/**\n * A menu to change the playback rate of the player.\n *\n * @slot `heading` - A slot for the menu's heading.\n */\n@customElement('theoplayer-playback-rate-menu')\n@stateReceiver(['lang'])\nexport class PlaybackRateMenu extends Menu {\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    protected override renderMenuHeading(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        return html`<span slot=\"heading\"><slot name=\"heading\">${locale.playbackRateMenuHeading}</slot></span>`;\n    }\n\n    protected override renderMenuContent(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        return html`<theoplayer-playback-rate-radio-group>\n            ${PLAYBACK_RATES.map((rate) => html`<theoplayer-radio-button value=${rate}>${locale.formatPlaybackRate(rate)}</theoplayer-radio-button>`)}\n        </theoplayer-playback-rate-radio-group>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-playback-rate-menu': PlaybackRateMenu;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { getLocale } from '../i18n';\nimport { Attribute } from '../util/Attribute';\n\n/**\n * A control that displays the current playback rate of the player.\n */\n@customElement('theoplayer-playback-rate-display')\n@stateReceiver(['playbackRate', 'lang'])\nexport class PlaybackRateDisplay extends LitElement {\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    /**\n     * The current playback rate.\n     */\n    @state()\n    accessor playbackRate: number = 1;\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        return html`<span>${locale.formatPlaybackRate(this.playbackRate)}</span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-playback-rate-display': PlaybackRateDisplay;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { VideoQuality } from 'theoplayer/chromeless';\nimport { formatQualityLabel } from '../util/TrackUtils';\nimport { Attribute } from '../util/Attribute';\nimport { getLocale } from '../i18n';\n\n/**\n * A control that displays the name of the active video quality.\n */\n@customElement('theoplayer-active-quality-display')\n@stateReceiver(['activeVideoQuality', 'targetVideoQualities'])\nexport class ActiveQualityDisplay extends LitElement {\n    /**\n     * The currently active video quality.\n     */\n    @property({ reflect: false, attribute: false })\n    accessor activeVideoQuality: VideoQuality | undefined = undefined;\n\n    /**\n     * The list of target video qualities.\n     */\n    @property({ reflect: false, attribute: false })\n    accessor targetVideoQualities: VideoQuality[] | undefined = undefined;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        // If no target quality is selected, or more than one target quality is selected,\n        // treat as \"automatic\" quality selection.\n        const hasSingleTargetQuality = this.targetVideoQualities !== undefined && this.targetVideoQualities.length === 1;\n        const targetQuality = hasSingleTargetQuality ? this.targetVideoQualities![0] : undefined;\n        // Always show the target quality immediately, even if it's not the active quality yet.\n        const selectedQuality = targetQuality ?? this.activeVideoQuality;\n        const qualityLabel = formatQualityLabel(locale, selectedQuality);\n        let label: string;\n        if (hasSingleTargetQuality) {\n            // Manual quality selection: \"720p\" or \"Unknown\"\n            label = qualityLabel ?? locale.unknownQualityLabel;\n        } else {\n            // Automatic quality selection: \"Automatic\" or \"Automatic (720p)\"\n            label = `${locale.automaticQualityLabel}${qualityLabel ? ` (${qualityLabel})` : ''}`;\n        }\n        return html`<span>${label}</span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-active-quality-display': ActiveQualityDisplay;\n    }\n}\n","import { html, type HTMLTemplateResult } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { RadioButton } from './RadioButton';\nimport type { MediaTrack, VideoQuality } from 'theoplayer/chromeless';\nimport { formatQualityLabel } from '../util/TrackUtils';\nimport { getLocale } from '../i18n';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\n\nconst TRACK_EVENTS = ['activequalitychanged', 'targetqualitychanged'] as const;\nconst QUALITY_EVENTS = ['update'] as const;\n\n/**\n * A radio button that shows the label of a given video quality,\n * and switches the video track's {@link theoplayer!MediaTrack.targetQuality | target quality} to that quality when clicked.\n */\n@customElement('theoplayer-quality-radio-button')\n@stateReceiver(['lang'])\nexport class QualityRadioButton extends RadioButton {\n    private _track: MediaTrack | undefined = undefined;\n\n    @state()\n    private accessor _quality: VideoQuality | undefined = undefined;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    /**\n     * The video track containing the quality being controlled.\n     */\n    get track(): MediaTrack | undefined {\n        return this._track;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set track(track: MediaTrack | undefined) {\n        if (this._track === track) {\n            return;\n        }\n        if (this._track) {\n            this._track.removeEventListener(TRACK_EVENTS, this._updateFromTrack);\n        }\n        this._track = track;\n        this._updateFromTrack();\n        if (track) {\n            track.addEventListener(TRACK_EVENTS, this._updateFromTrack);\n        }\n    }\n\n    /**\n     * The video quality being controlled.\n     */\n    get quality(): VideoQuality | undefined {\n        return this._quality;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set quality(quality: VideoQuality | undefined) {\n        if (this._quality === quality) {\n            return;\n        }\n        if (this._quality) {\n            this._quality.removeEventListener(QUALITY_EVENTS, this._updateFromQuality);\n        }\n        this._quality = quality;\n        this._updateFromTrack();\n        if (quality) {\n            quality.addEventListener(QUALITY_EVENTS, this._updateFromQuality);\n        }\n    }\n\n    private readonly _updateFromTrack = () => {\n        if (this._track !== undefined) {\n            let targetQualities = this._track.targetQuality;\n            if (Array.isArray(targetQualities)) {\n                if (targetQualities.length === 1) {\n                    targetQualities = targetQualities[0];\n                } else {\n                    targetQualities = undefined;\n                }\n            }\n            if (this._quality === undefined) {\n                this.checked = targetQualities === undefined;\n            } else {\n                this.checked = targetQualities === this._quality;\n            }\n        }\n        this._updateFromQuality();\n    };\n\n    private readonly _updateFromQuality = () => {\n        this.requestUpdate();\n    };\n\n    protected override handleChange(): void {\n        this._updateTargetQuality();\n    }\n\n    private _updateTargetQuality(): void {\n        if (this._track && this.checked) {\n            this._track.targetQuality = this._quality;\n        }\n    }\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        const label =\n            this._quality === undefined ? locale.automaticQualityLabel : (formatQualityLabel(locale, this._quality) ?? locale.unknownQualityLabel);\n        return html`<slot>${label}</slot>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-quality-radio-button': QualityRadioButton;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport verticalRadioGroupCss from './VerticalRadioGroup.css';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer, MediaTrack, MediaTrackList, Quality, VideoQuality } from 'theoplayer/chromeless';\nimport { arrayFind } from '../util/CommonUtils';\nimport { createEvent } from '../util/EventUtils';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { Attribute } from '../util/Attribute';\n\nconst TRACK_EVENTS = ['addtrack', 'removetrack', 'change'] as const;\n\n/**\n * A radio group that shows a list of available video qualities,\n * from which the user can choose a desired target quality.\n */\n@customElement('theoplayer-quality-radio-group')\n@stateReceiver(['player', 'lang'])\nexport class QualityRadioGroup extends LitElement {\n    static override styles = [verticalRadioGroupCss];\n\n    private _player: ChromelessPlayer | undefined;\n    private _videoTracks: MediaTrackList | undefined;\n\n    @state()\n    private accessor _track: MediaTrack | undefined;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    protected override firstUpdated(): void {\n        this._updateTrack();\n    }\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @state()\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        this._videoTracks?.removeEventListener(TRACK_EVENTS, this._updateTrack);\n        this._player = player;\n        this._videoTracks = player?.videoTracks;\n        this._updateTrack();\n        this._videoTracks?.addEventListener(TRACK_EVENTS, this._updateTrack);\n    }\n\n    private readonly _onChange = () => {\n        this.dispatchEvent(createEvent('change', { bubbles: true }));\n    };\n\n    private readonly _updateTrack = (): void => {\n        const track = this._player ? arrayFind(this._player.videoTracks, (track) => track.enabled) : undefined;\n        if (this._track === track) {\n            return;\n        }\n        this._track?.removeEventListener('update', this._update);\n        this._track = track;\n        this._track?.addEventListener('update', this._update);\n        this._update();\n    };\n\n    private _update = () => this.requestUpdate();\n\n    protected override render(): HTMLTemplateResult {\n        const qualities: VideoQuality[] = this._track ? (this._track.qualities as Quality[] as VideoQuality[]) : [];\n        // FIXME: UIContainer doesn't push `lang` through shadow DOM children?\n        return html`\n            <theoplayer-radio-group @change=${this._onChange}>\n                <theoplayer-quality-radio-button lang=${this.lang} .track=${this._track} .quality=${undefined}></theoplayer-quality-radio-button>\n                ${\n                    /* If there is only one available quality, *only* show the \"Automatic\" option (without the single quality). */\n                    qualities.length !== 1 &&\n                    repeat(\n                        qualities,\n                        (quality) => quality.uid,\n                        (quality) =>\n                            html`<theoplayer-quality-radio-button\n                                lang=${this.lang}\n                                .track=${this._track}\n                                .quality=${quality}\n                            ></theoplayer-quality-radio-button>`\n                    )\n                }\n            </theoplayer-radio-group>\n        `;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-quality-radio-group': QualityRadioGroup;\n    }\n}\n","import { html, type HTMLTemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Button } from './Button';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { getLocale } from '../i18n';\nimport { Attribute } from '../util/Attribute';\n\n/**\n * A button that resets the text track style.\n */\n@customElement('theoplayer-text-track-style-reset-button')\n@stateReceiver(['player', 'lang'])\nexport class TextTrackStyleResetButton extends Button {\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    private _player: ChromelessPlayer | undefined;\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    set player(player: ChromelessPlayer | undefined) {\n        this._player = player;\n    }\n\n    protected override handleClick() {\n        if (this._player === undefined) {\n            return;\n        }\n        const { textTrackStyle } = this._player;\n        textTrackStyle.fontFamily = undefined;\n        textTrackStyle.fontColor = undefined;\n        textTrackStyle.fontSize = undefined;\n        textTrackStyle.backgroundColor = undefined;\n        textTrackStyle.windowColor = undefined;\n        textTrackStyle.edgeStyle = undefined;\n    }\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        return html`<slot>${locale.textTrackStyleResetLabel}</slot>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-text-track-style-reset-button': TextTrackStyleResetButton;\n    }\n}\n","import { html, type TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { MenuGroup } from './MenuGroup';\nimport menuTableCss from './MenuTable.css';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { getLocale } from '../i18n';\nimport { Attribute } from '../util/Attribute';\n\n// Load components used in template\nimport './ActiveQualityDisplay';\nimport './PlaybackRateDisplay';\nimport './PlaybackRateMenu';\n\n/**\n * A menu to change the settings of the player,\n * such as the active video quality and the playback speed.\n *\n * @slot `heading` - A slot for the menu's heading.\n */\n@customElement('theoplayer-settings-menu')\n@stateReceiver(['lang'])\nexport class SettingsMenu extends MenuGroup {\n    static styles = [...MenuGroup.styles, menuTableCss];\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    protected override render(): TemplateResult {\n        const locale = getLocale(this.lang);\n        // FIXME: UIContainer doesn't push `lang` through shadow DOM children?\n        return html`\n            <theoplayer-menu>\n                <span slot=\"heading\"><slot name=\"heading\">${locale.settingsMenuHeading}</slot></span>\n                <table>\n                    <tr>\n                        <td><span>${locale.qualityMenuHeading}</span></td>\n                        <td>\n                            <theoplayer-menu-button menu=\"quality-menu\">\n                                <theoplayer-active-quality-display lang=${this.lang}></theoplayer-active-quality-display>\n                            </theoplayer-menu-button>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><span>${locale.playbackRateMenuHeading}</span></td>\n                        <td>\n                            <theoplayer-menu-button menu=\"playback-rate-menu\">\n                                <theoplayer-playback-rate-display lang=${this.lang}></theoplayer-playback-rate-display>\n                            </theoplayer-menu-button>\n                        </td>\n                    </tr>\n                </table>\n            </theoplayer-menu>\n            <theoplayer-menu id=\"quality-menu\" menu-close-on-input hidden>\n                <span slot=\"heading\">${locale.qualityMenuHeading}</span>\n                <theoplayer-quality-radio-group lang=${this.lang}></theoplayer-quality-radio-group>\n            </theoplayer-menu>\n            <theoplayer-playback-rate-menu id=\"playback-rate-menu\" lang=${this.lang} menu-close-on-input hidden></theoplayer-playback-rate-menu>\n        `;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-settings-menu': SettingsMenu;\n    }\n}\n","import { html, type HTMLTemplateResult, type PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { MenuButton } from './MenuButton';\nimport settingsIcon from '../icons/settings.svg';\nimport { getLocale } from '../i18n';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\n\n/**\n * A menu button that opens a {@link SettingsMenu}.\n *\n * @attribute `menu` - The ID of the settings menu.\n */\n@customElement('theoplayer-settings-menu-button')\n@stateReceiver(['lang'])\nexport class SettingsMenuButton extends MenuButton {\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    override willUpdate(changedProperties: PropertyValues) {\n        super.willUpdate(changedProperties);\n        this._updateAriaLabel();\n    }\n\n    private _updateAriaLabel(): void {\n        const locale = getLocale(this.lang);\n        this.ariaLabel = locale.openSettingsMenuAria;\n    }\n\n    protected override render(): HTMLTemplateResult {\n        return html`<span part=\"icon\"><slot>${unsafeSVG(settingsIcon)}</slot></span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-settings-menu-button': SettingsMenuButton;\n    }\n}\n","import { html, type HTMLTemplateResult, type PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { Button } from './Button';\nimport fullscreenButtonCss from './FullscreenButton.css';\nimport enterIcon from '../icons/fullscreen-enter.svg';\nimport exitIcon from '../icons/fullscreen-exit.svg';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { createCustomEvent } from '../util/EventUtils';\nimport { ENTER_FULLSCREEN_EVENT, type EnterFullscreenEvent } from '../events/EnterFullscreenEvent';\nimport { EXIT_FULLSCREEN_EVENT, type ExitFullscreenEvent } from '../events/ExitFullscreenEvent';\nimport { Attribute } from '../util/Attribute';\nimport { getLocale } from '../i18n';\n\n/**\n * A button that toggles fullscreen.\n */\n@customElement('theoplayer-fullscreen-button')\n@stateReceiver(['fullscreen', 'lang'])\nexport class FullscreenButton extends Button {\n    static styles = [...Button.styles, fullscreenButtonCss];\n\n    override connectedCallback() {\n        super.connectedCallback();\n        this._updateAriaLabel();\n    }\n\n    /**\n     * Whether the player is in fullscreen mode.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.FULLSCREEN })\n    accessor fullscreen: boolean = false;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    protected override handleClick(): void {\n        if (!this.fullscreen) {\n            const event: EnterFullscreenEvent = createCustomEvent(ENTER_FULLSCREEN_EVENT, {\n                bubbles: true,\n                composed: true\n            });\n            this.dispatchEvent(event);\n        } else {\n            const event: ExitFullscreenEvent = createCustomEvent(EXIT_FULLSCREEN_EVENT, {\n                bubbles: true,\n                composed: true\n            });\n            this.dispatchEvent(event);\n        }\n    }\n\n    override willUpdate(changedProperties: PropertyValues) {\n        super.willUpdate(changedProperties);\n        this._updateAriaLabel();\n    }\n\n    private _updateAriaLabel(): void {\n        const locale = getLocale(this.lang);\n        this.ariaLabel = this.fullscreen ? locale.fullscreenExitAria : locale.fullscreenAria;\n    }\n\n    protected override render(): HTMLTemplateResult {\n        return html`<span part=\"enter-icon\"><slot name=\"enter-icon\">${unsafeSVG(enterIcon)}</slot></span>\n            <span part=\"exit-icon\"><slot name=\"exit-icon\">${unsafeSVG(exitIcon)}</slot></span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-fullscreen-button': FullscreenButton;\n    }\n}\n","import { html, type HTMLTemplateResult, type PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { Button } from './Button';\nimport vrIcon from '../icons/vr.svg';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\nimport { getLocale } from '../i18n';\n\nconst VR_EVENTS = ['statechange', 'stereochange'] as const;\n\n/**\n * A button that toggles stereoscopic VR mode.\n *\n * The button is only shown when the current source supports VR (e.g. a 360° video),\n * and is disabled when the device cannot present VR content.\n */\n@customElement('theoplayer-vr-button')\n@stateReceiver(['player', 'lang'])\nexport class VRButton extends Button {\n    private _player: ChromelessPlayer | undefined;\n\n    override connectedCallback() {\n        super.connectedCallback();\n        this._updateFromPlayer();\n        this._updateAriaLabel();\n    }\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        this._player?.vr?.removeEventListener(VR_EVENTS, this._updateFromPlayer);\n        this._player = player;\n        this._player?.vr?.addEventListener(VR_EVENTS, this._updateFromPlayer);\n        this._updateFromPlayer();\n    }\n\n    /**\n     * Whether stereoscopic VR mode is currently active.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.STEREO })\n    accessor stereo: boolean = false;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    private readonly _updateFromPlayer = (): void => {\n        const vr = this._player?.vr;\n        if (!vr || vr.state === 'unavailable') {\n            this.stereo = false;\n            this.hidden = true;\n            return;\n        }\n        this.hidden = false;\n        this.disabled = !vr.canPresentVR;\n        this.stereo = vr.stereo;\n    };\n\n    protected override handleClick(): void {\n        const vr = this._player?.vr;\n        if (!vr || !vr.canPresentVR) {\n            return;\n        }\n        vr.stereo = !vr.stereo;\n        this.stereo = vr.stereo;\n    }\n\n    override willUpdate(changedProperties: PropertyValues) {\n        super.willUpdate(changedProperties);\n        this._updateAriaLabel();\n    }\n\n    private _updateAriaLabel(): void {\n        const locale = getLocale(this.lang);\n        if (this.stereo) {\n            this.ariaLabel = locale.vrExitAria;\n        } else if (this.disabled) {\n            this.ariaLabel = locale.vrUnavailableAria;\n        } else {\n            this.ariaLabel = locale.vrAria;\n        }\n    }\n\n    protected override render(): HTMLTemplateResult {\n        return html`<span part=\"icon\"><slot>${unsafeSVG(vrIcon)}</slot></span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-vr-button': VRButton;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { stateReceiver } from './StateReceiverMixin';\nimport vrCompassCss from './VRCompass.css';\n\nconst VR_EVENTS = ['statechange', 'directionchange'] as const;\nconst FOV_SLICE_ANGLE = 80; // degrees\n\n/**\n * A compass that indicates the current viewing direction of a 360° (VR) video.\n *\n * @cssproperty `--theoplayer-vr-compass-size` - The size (diameter) of the compass. Defaults to `26px`.\n * @cssproperty `--theoplayer-vr-compass-color` - The color of the compass border, center dot and pointer.\n *   Defaults to `#fff`.\n * @cssproperty `--theoplayer-vr-compass-fov-color` - The color of the field-of-view indicator.\n *   Defaults to `rgba(255, 255, 255, 0.75)`.\n */\n@customElement('theoplayer-vr-compass')\n@stateReceiver(['player'])\nexport class VRCompass extends LitElement {\n    static override styles = [vrCompassCss];\n\n    private _player: ChromelessPlayer | undefined;\n\n    @state()\n    private accessor _yaw: number = 0;\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._player !== undefined) {\n            this._player.vr?.removeEventListener(VR_EVENTS, this._updateFromPlayer);\n            this._player.removeEventListener('sourcechange', this._updateFromPlayer);\n        }\n        this._player = player;\n        if (this._player !== undefined) {\n            this._player.vr?.addEventListener(VR_EVENTS, this._updateFromPlayer);\n            this._player.addEventListener('sourcechange', this._updateFromPlayer);\n        }\n        this._updateFromPlayer();\n    }\n\n    private readonly _updateFromPlayer = (): void => {\n        const vr = this._player?.vr;\n        // Like the classic UI, only show the compass for non-native 360° VR sources.\n        // Native VR sources are rendered by the platform, so there's no JS viewing direction.\n        if (!vr || vr.state === 'unavailable' || this._player?.source?.vr?.nativeVR) {\n            this.hidden = true;\n            return;\n        }\n        this.hidden = false;\n        this._yaw = vr.direction.yaw;\n    };\n\n    protected override render(): HTMLTemplateResult {\n        const transformAngle = -this._yaw + FOV_SLICE_ANGLE / 2;\n        const transformSkew = FOV_SLICE_ANGLE - 90;\n        const fovStyles = {\n            transform: `scale(0.875) rotate(${transformAngle}deg) skew(${transformSkew}deg)`\n        };\n        return html`<div part=\"dial\"><div part=\"fov\" style=${styleMap(fovStyles)}></div></div>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-vr-compass': VRCompass;\n    }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport rangeCss from './Range.css';\nimport { Attribute } from '../util/Attribute';\nimport { ColorStops } from '../util/ColorStops';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { DeviceType } from '../util/DeviceType';\nimport { isArrowKey, KeyCode } from '../util/KeyCode';\nimport { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { createRef, ref, type Ref } from 'lit/directives/ref.js';\nimport { property, state } from 'lit/decorators.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\n/**\n * A slider to select a value from a range.\n *\n * @cssproperty `--theoplayer-range-bar-color` - The color of the filled portion of the range track. Defaults to `#fff`.\n * @cssproperty `--theoplayer-range-track-height` - The height of the range track. Defaults to `4px`.\n * @cssproperty `--theoplayer-range-track-width` - The width of the range track. Defaults to `100%`.\n * @cssproperty `--theoplayer-range-track-background` - The background of the unfilled portion of the track. Defaults to `rgba(255, 255, 255, 0.2)`.\n * @cssproperty `--theoplayer-range-track-border` - The border of the track. Defaults to `none`.\n * @cssproperty `--theoplayer-range-track-border-radius` - The border radius of the track. Defaults to `0`.\n * @cssproperty `--theoplayer-range-track-box-shadow` - The box-shadow of the track. Defaults to `none`.\n * @cssproperty `--theoplayer-range-track-transition` - The CSS transition applied to the track. Defaults to `none`.\n * @cssproperty `--theoplayer-range-track-translate-x` - Horizontal translation of the track. Defaults to `0`.\n * @cssproperty `--theoplayer-range-track-translate-y` - Vertical translation of the track. Defaults to `0`.\n * @cssproperty `--theoplayer-range-track-outline` - The outline of the track.\n * @cssproperty `--theoplayer-range-track-outline-offset` - The outline offset of the track.\n * @cssproperty `--theoplayer-range-track-pointer-background` - The background of the hover/preview pointer indicator on the track. Defaults to `transparent`.\n * @cssproperty `--theoplayer-range-track-pointer-border-right` - The right border of the pointer indicator. Defaults to `none`.\n * @cssproperty `--theoplayer-range-thumb-width` - The width of the slider thumb. Defaults to `10px`.\n * @cssproperty `--theoplayer-range-thumb-height` - The height of the slider thumb. Defaults to `10px`.\n * @cssproperty `--theoplayer-range-thumb-background` - The background of the slider thumb. Defaults to `#fff`.\n * @cssproperty `--theoplayer-range-thumb-border` - The border of the slider thumb. Defaults to `none`.\n * @cssproperty `--theoplayer-range-thumb-border-radius` - The border radius of the slider thumb. Defaults to `10px`.\n * @cssproperty `--theoplayer-range-thumb-box-shadow` - The box-shadow of the slider thumb. Defaults to `1px 1px 1px transparent`.\n * @cssproperty `--theoplayer-range-thumb-transition` - The CSS transition applied to the slider thumb. Defaults to `none`.\n * @cssproperty `--theoplayer-range-thumb-transform` - The CSS transform applied to the slider thumb. Defaults to `none`.\n * @cssproperty `--theoplayer-range-thumb-opacity` - The opacity of the slider thumb. Defaults to `1`.\n * @cssproperty `--theoplayer-range-padding` - The padding around the range. Defaults to `--theoplayer-control-padding`.\n * @cssproperty `--theoplayer-range-padding-left` - The left padding around the range. Defaults to `--theoplayer-range-padding`.\n * @cssproperty `--theoplayer-range-padding-right` - The right padding around the range. Defaults to `--theoplayer-range-padding`.\n *\n * @group Components\n */\n@stateReceiver(['deviceType'])\nexport abstract class Range extends LitElement {\n    static override styles = [rangeCss];\n\n    protected readonly _rangeRef: Ref<HTMLInputElement> = createRef<HTMLInputElement>();\n\n    private _min: number = 0;\n    private _max: number = 100;\n    private _value: number = 0;\n    private _disabled: boolean = false;\n    private _hidden: boolean = false;\n    private _inert: boolean = false;\n\n    private _rangeWidth: number = 0;\n    private _thumbWidth: number = 10;\n\n    @state()\n    private accessor _pointerWidth: number = 0;\n\n    connectedCallback(): void {\n        super.connectedCallback();\n\n        this._updateRange();\n        this.addEventListener('pointermove', this._updatePointerBar);\n    }\n\n    disconnectedCallback(): void {\n        this.removeEventListener('pointermove', this._updatePointerBar);\n    }\n\n    /**\n     * Whether the range is disabled.\n     *\n     * When disabled, the slider value cannot be changed, and the slider thumb is hidden.\n     */\n    get disabled(): boolean {\n        return this._disabled;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.DISABLED })\n    set disabled(disabled: boolean) {\n        if (this._disabled === disabled) return;\n        this._disabled = disabled;\n        this.setAttribute('aria-disabled', this._disabled ? 'true' : 'false');\n    }\n\n    /**\n     * Whether the range is hidden.\n     */\n    get hidden(): boolean {\n        return this._hidden;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.HIDDEN })\n    set hidden(hidden: boolean) {\n        if (this._hidden === hidden) return;\n        this._hidden = hidden;\n        this._updateRange();\n    }\n\n    /**\n     * Whether the range is inert.\n     *\n     * When inert, the slider value cannot be changed, but the slider thumb is still visible.\n     */\n    get inert() {\n        return this._inert;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.INERT })\n    set inert(inert: boolean) {\n        this._inert = inert;\n    }\n\n    /**\n     * The current value.\n     */\n    get value(): number {\n        return this.rawValue;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set value(value: number) {\n        let newValue = value;\n        if (!isNaN(this.min)) {\n            newValue = Math.max(this.min, newValue);\n        }\n        if (!isNaN(this.max)) {\n            newValue = Math.min(this.max, newValue);\n        }\n        if (this.rawValue === newValue) return;\n        this.rawValue = newValue;\n        this.handleInput();\n    }\n\n    /**\n     * The current value.\n     *\n     * Setting this property does *not* trigger {@link handleInput}.\n     * This should be used when synchronizing the range with external state,\n     * e.g. when updating the value of a time range with the player's current time.\n     */\n    protected get rawValue() {\n        return this._value;\n    }\n\n    @state()\n    protected set rawValue(value: number) {\n        this._value = value;\n    }\n\n    /**\n     * The minimum allowed value.\n     */\n    get min(): number {\n        return this._min;\n    }\n\n    @property({ reflect: true, type: Number, attribute: 'min' })\n    set min(min: number) {\n        this._min = min;\n        this._updateRange();\n    }\n\n    /**\n     * The maximum allowed value.\n     */\n    get max(): number {\n        return this._max;\n    }\n\n    @property({ reflect: true, type: Number, attribute: 'max' })\n    set max(max: number) {\n        this._max = max;\n        this._updateRange();\n    }\n\n    /**\n     * The granularity at which the value can change.\n     *\n     * If set to `\"any\"`, the value can change with arbitrary precision.\n     */\n    @property({\n        reflect: true,\n        attribute: 'step',\n        converter: {\n            fromAttribute: (value): number | 'any' => (value == null || value === 'any' ? 'any' : Number(value))\n        }\n    })\n    accessor step: number | 'any' = 'any';\n\n    /**\n     * The device type, either \"desktop\", \"mobile\" or \"tv\".\n     */\n    @property({ reflect: true, type: String, attribute: Attribute.DEVICE_TYPE })\n    accessor deviceType: DeviceType = 'desktop';\n\n    @property({ reflect: true, type: String, attribute: 'aria-live' })\n    accessor ariaLive: string | null = null;\n\n    private readonly _onInput = (event: Event) => {\n        this.value = (event.target as HTMLInputElement).valueAsNumber;\n    };\n\n    protected handleInput(): void {\n        this._updateRange();\n    }\n\n    protected _updateRange(useCachedWidth?: boolean): void {\n        if (this.hidden) {\n            return;\n        }\n        if (!useCachedWidth) {\n            this.updateCachedWidths_();\n        }\n        this.updateBar_();\n    }\n\n    /**\n     * The value for the `aria-label` attribute of the `<input type=\"range\">` element.\n     */\n    protected abstract getAriaLabel(): string;\n\n    /**\n     * The value for the `aria-valuetext` attribute of the `<input type=\"range\">` element.\n     */\n    protected abstract getAriaValueText(): string;\n\n    /**\n     * Native ranges have a single color for the whole track, which is different\n     * from most video players that have a colored \"bar\" to the left of the handle\n     * showing playback progress or volume level. Here we're building that bar\n     * by using a background gradient that moves with the range value.\n     */\n    private updateBar_() {\n        const gradientStops = this.getBarColors().toGradientStops();\n        shadyCss.styleSubtree(this, {\n            '--theoplayer-range-track-progress-internal': `linear-gradient(to right, ${gradientStops})`\n        });\n    }\n\n    /**\n     * Build the color gradient for the range bar.\n     * Creating an array so progress-bar can insert the buffered bar.\n     */\n    protected getBarColors(): ColorStops {\n        const { value, min, max } = this;\n        const relativeValue = value - min;\n        const relativeMax = max - min;\n        let rangePercent = (relativeValue / relativeMax) * 100;\n        if (isNaN(rangePercent)) {\n            rangePercent = 0;\n        }\n\n        let thumbPercent = 0;\n        // If the range thumb is at min or max don't correct the time range.\n        // Ideally the thumb center would go all the way to min and max values\n        // but input[type=range] doesn't play like that.\n        if (min < value && value < max) {\n            const thumbOffset = this._thumbWidth * (0.5 - rangePercent / 100);\n            thumbPercent = (thumbOffset / this._rangeWidth) * 100;\n        }\n\n        const stops = new ColorStops();\n        stops.add('var(--theoplayer-range-bar-color, #fff)', 0, rangePercent + thumbPercent);\n        return stops;\n    }\n\n    private updateCachedWidths_(): void {\n        // Use the last non-zero range width, in case the range is temporarily hidden.\n        const rangeWidth = this._rangeRef.value?.offsetWidth ?? 0;\n        if (rangeWidth > 0) {\n            this._rangeWidth = rangeWidth;\n        }\n        const thumbWidth = parseInt(getComputedStyle(this).getPropertyValue('--theoplayer-range-thumb-width') || '10px');\n        if (thumbWidth > 0) {\n            this._thumbWidth = thumbWidth;\n        }\n    }\n\n    protected getMinimumStepForVisibleChange_(): number {\n        // The smallest visible change is 1 pixel.\n        // Compute how much the value needs to change for that.\n        const { min, max } = this;\n        const relativeMax = max - min;\n        if (relativeMax <= 0) {\n            return NaN;\n        }\n        return relativeMax / this._rangeWidth;\n    }\n\n    private readonly _updatePointerBar = (e: PointerEvent): void => {\n        const rangeEl = this._rangeRef.value;\n        if (this.disabled || this.inert || !rangeEl) {\n            return;\n        }\n        // Get mouse position percent\n        const rangeRect = rangeEl.getBoundingClientRect();\n        let mousePercent = (e.clientX - rangeRect.left) / rangeRect.width;\n        // Lock between 0 and 1\n        mousePercent = Math.max(0, Math.min(1, mousePercent));\n        this.updatePointer_(mousePercent, rangeRect);\n    };\n\n    protected updatePointer_(mousePercent: number, rangeRect: DOMRectReadOnly): void {\n        this._pointerWidth = mousePercent * rangeRect.width;\n    }\n\n    private readonly _onKeyDown = (e: KeyboardEvent): void => {\n        this.handleKeyDown_(e);\n    };\n\n    protected handleKeyDown_(e: KeyboardEvent) {\n        if (this.deviceType === 'tv' && isArrowKey(e.keyCode)) {\n            // On TV devices, only allow left/right arrow keys to move the slider.\n            if (e.keyCode === KeyCode.LEFT || e.keyCode === KeyCode.RIGHT) {\n                // Stop propagation, to prevent <theoplayer-ui> from navigating to a different control\n                // while we're moving the slider.\n                e.stopPropagation();\n            } else if (e.keyCode === KeyCode.UP || e.keyCode === KeyCode.DOWN) {\n                // Prevent default, to stop the browser from moving the slider.\n                e.preventDefault();\n            }\n        }\n    }\n\n    protected override render(): HTMLTemplateResult {\n        return html`<div part=\"container\">\n            <div part=\"background\"></div>\n            <div part=\"pointer\" style=${styleMap({ width: `${this._pointerWidth}px` })}></div>\n            <input\n                type=\"range\"\n                ${ref(this._rangeRef)}\n                .min=${this.min}\n                .max=${this.max}\n                .step=${this.step}\n                .valueAsNumber=${this.rawValue}\n                .disabled=${this.disabled || this.inert}\n                aria-label=\"${this.getAriaLabel()}\"\n                aria-valuetext=${this.getAriaValueText()}\n                aria-live=${this.ariaLive}\n                @input=${this._onInput}\n                @change=${\n                    /* Internet Explorer does not fire 'input' events for <input> elements... use 'change' instead. */\n                    this._onInput\n                }\n                @keydown=${this._onKeyDown}\n            />\n            ${this.renderRangeExtras()}\n        </div>`;\n    }\n\n    protected renderRangeExtras(): HTMLTemplateResult {\n        return html``;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { createRef, ref, type Ref } from 'lit/directives/ref.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport previewThumbnailCss from './PreviewThumbnail.css';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer, TextTrack, TextTrackCue, TextTrackCueList, TextTracksList } from 'theoplayer/chromeless';\nimport { arrayFind, noOp } from '../util/CommonUtils';\n\nconst TRACK_EVENTS = ['addtrack', 'removetrack'] as const;\n\n/**\n * A display that shows the thumbnail image at the current preview time\n * of a {@link TimeRange | `<theoplayer-time-range>`}.\n *\n * The first `metadata` text track whose label equals `\"thumbnails\"` is used as source for the thumbnails.\n * This track is expected to contain cues whose content is the URL for the thumbnail image.\n * If the thumbnail image URL ends with a [spatial fragment](https://www.w3.org/TR/media-frags/#naming-space)\n * (e.g. `#xywh=180,80,60,40`), then the thumbnail is clipped to the rectangle defined by that fragment.\n *\n * If the stream does not contain thumbnails, then this display shows nothing.\n *\n * @cssproperty `--theoplayer-preview-thumbnail-background` - The background of the preview thumbnail container. Defaults to `#fff`.\n * @cssproperty `--theoplayer-preview-thumbnail-padding` - The padding around the preview thumbnail. Defaults to `2px`.\n */\n@customElement('theoplayer-preview-thumbnail')\n@stateReceiver(['player', 'previewTime'])\nexport class PreviewThumbnail extends LitElement {\n    static override styles = [previewThumbnailCss];\n\n    private readonly _canvasRef: Ref<HTMLCanvasElement> = createRef<HTMLCanvasElement>();\n    private _canvasContext: CanvasRenderingContext2D | undefined;\n    private readonly _thumbnailImageSource: HTMLImageElement;\n\n    private _player: ChromelessPlayer | undefined;\n    private _textTrackList: TextTracksList | undefined;\n    private _previewTime: number = NaN;\n    private _thumbnailTextTrack: TextTrack | undefined;\n    private _lastLoadedThumbnailUrl: string | undefined;\n\n    @state()\n    private accessor _thumbnailVisible: boolean = false;\n\n    constructor() {\n        super();\n\n        this._thumbnailImageSource = document.createElement('img');\n        this._thumbnailImageSource.decoding = 'async';\n    }\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        this._textTrackList?.removeEventListener(TRACK_EVENTS, this._updateThumbnailTextTrack);\n        this._player = player;\n        this._textTrackList = player?.textTracks;\n        this._updateThumbnailTextTrack();\n        this._textTrackList?.addEventListener(TRACK_EVENTS, this._updateThumbnailTextTrack);\n    }\n\n    get previewTime(): number {\n        return this._previewTime;\n    }\n\n    @state()\n    set previewTime(previewTime: number) {\n        this._previewTime = previewTime;\n        this.updateThumbnail_();\n    }\n\n    private readonly _updateThumbnailTextTrack = (): void => {\n        const oldTrack = this._thumbnailTextTrack;\n        const newTrack = this._player ? arrayFind(this._player.textTracks, isThumbnailTextTrack) : undefined;\n        if (oldTrack === newTrack) {\n            return;\n        }\n        this._thumbnailTextTrack = newTrack;\n        this.updateThumbnail_();\n    };\n\n    private updateThumbnail_(): void {\n        const track = this._thumbnailTextTrack;\n        if (track === undefined) {\n            this.hideThumbnail_();\n            return;\n        }\n        if (track.mode === 'disabled') {\n            track.mode = 'hidden';\n        }\n        const cue = getCueAtTime(track.cues!, this._previewTime);\n        if (cue === undefined) {\n            this.hideThumbnail_();\n            return;\n        }\n        const content = (cue.content as string).trim();\n        const sprite = parseSpriteUrl(content);\n        // Resolve relative URLs against track's URL (or page URL)\n        let thumbnailUrl = sprite ? sprite.url : content;\n        thumbnailUrl = new URL(thumbnailUrl, track.src || location.href).href;\n        // Load thumbnail image, if not yet loaded\n        if (this._lastLoadedThumbnailUrl !== thumbnailUrl) {\n            this.loadThumbnailImage_(thumbnailUrl);\n            return;\n        }\n        this.showThumbnail_(sprite);\n    }\n\n    private loadThumbnailImage_(url: string): void {\n        if (this._thumbnailImageSource.src === url) {\n            // Already loading this URL, wait for the current load to complete.\n            return;\n        }\n        const onLoad = () => {\n            this._lastLoadedThumbnailUrl = url;\n            this.updateThumbnail_();\n        };\n        if (typeof this._thumbnailImageSource.decode === 'function') {\n            // Load and decode in parallel\n            this._thumbnailImageSource.src = url;\n            this._thumbnailImageSource.decode().then(onLoad, noOp);\n        } else {\n            // Load in parallel, decode synchronously\n            this._thumbnailImageSource.onload = onLoad;\n            // Reset `src` to ensure `onload` will be triggered.\n            this._thumbnailImageSource.src = '';\n            this._thumbnailImageSource.src = url;\n        }\n    }\n\n    private showThumbnail_(sprite: Sprite | undefined): void {\n        const canvas = this._canvasRef.value;\n        if (!canvas) return;\n        this._canvasContext ??= canvas.getContext('2d') ?? undefined;\n        if (!this._canvasContext) return;\n        if (sprite) {\n            // Draw part of image\n            canvas.width = sprite.w;\n            canvas.height = sprite.h;\n            this._canvasContext.drawImage(this._thumbnailImageSource, sprite.x, sprite.y, sprite.w, sprite.h, 0, 0, sprite.w, sprite.h);\n        } else {\n            // Draw entire image\n            canvas.width = this._thumbnailImageSource.naturalWidth;\n            canvas.height = this._thumbnailImageSource.naturalHeight;\n            this._canvasContext.drawImage(this._thumbnailImageSource, 0, 0);\n        }\n        this._thumbnailVisible = true;\n    }\n\n    private hideThumbnail_(): void {\n        this._thumbnailVisible = false;\n    }\n\n    protected override render(): HTMLTemplateResult {\n        const canvasStyle = { display: this._thumbnailVisible ? 'block' : 'none' };\n        return html`<canvas ${ref(this._canvasRef)} style=${styleMap(canvasStyle)}></canvas>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-preview-thumbnail': PreviewThumbnail;\n    }\n}\n\nfunction isThumbnailTextTrack(track: TextTrack): boolean {\n    return track.kind === 'metadata' && track.label === 'thumbnails';\n}\n\nfunction getCueAtTime(cues: TextTrackCueList, time: number): TextTrackCue | undefined {\n    if (cues.length === 0) {\n        return undefined;\n    }\n    let result = cues[0];\n    for (let cue of cues) {\n        if (cue.startTime <= time) {\n            result = cue;\n        } else if (time >= cue.endTime) {\n            return result;\n        }\n    }\n    return result;\n}\n\ninterface Sprite {\n    url: string;\n    x: number;\n    y: number;\n    w: number;\n    h: number;\n}\n\nfunction parseSpriteUrl(spriteUrl: string): Sprite | undefined {\n    const match = spriteUrl.match(/^(.+)#xywh=(\\d+),(\\d+),(\\d+),(\\d+)$/);\n    if (!match) {\n        return undefined;\n    }\n    const [, url, x, y, w, h] = match;\n    return {\n        url,\n        x: +x,\n        y: +y,\n        w: +w,\n        h: +h\n    };\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport textDisplayCss from './TextDisplay.css';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { formatTime } from '../util/TimeUtils';\nimport { Attribute } from '../util/Attribute';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport type { StreamType } from '../util/StreamType';\n\nconst PLAYER_EVENTS = ['timeupdate', 'seeking', 'seeked', 'durationchange'] as const;\n\n/**\n * A display that shows the current preview time of a {@link TimeRange | `<theoplayer-time-range>`}.\n */\n@customElement('theoplayer-preview-time-display')\n@stateReceiver(['player', 'previewTime', 'streamType'])\nexport class PreviewTimeDisplay extends LitElement {\n    static override styles = [textDisplayCss];\n\n    private _player: ChromelessPlayer | undefined;\n\n    connectedCallback(): void {\n        super.connectedCallback();\n        this._updateFromPlayer();\n    }\n\n    @state()\n    accessor previewTime: number = NaN;\n\n    /**\n     * If set, shows the remaining time of the stream.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.REMAINING })\n    accessor remaining: boolean = false;\n\n    /**\n     * If set, and the stream is a livestream, shows the remaining time (until the live point) of the stream.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.REMAINING_WHEN_LIVE })\n    accessor remainingWhenLive: boolean = false;\n\n    /**\n     * The stream type, either \"vod\", \"live\" or \"dvr\".\n     */\n    @property({ reflect: true, type: String, attribute: Attribute.STREAM_TYPE })\n    accessor streamType: StreamType = 'vod';\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._player !== undefined) {\n            this._player.removeEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n        }\n        this._player = player;\n        this._updateFromPlayer();\n        if (this._player !== undefined) {\n            this._player.addEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n        }\n    }\n\n    @state()\n    private accessor _endTime: number = 0;\n\n    private readonly _updateFromPlayer = (): void => {\n        const duration = this._player ? this._player.duration : NaN;\n        const seekable = this._player?.seekable;\n        this._endTime = isFinite(duration) ? duration : seekable && seekable.length > 0 ? seekable.end(0) : NaN;\n    };\n\n    protected override render(): HTMLTemplateResult {\n        let previewTime = this.previewTime;\n        const endTime = this._endTime;\n        const remaining = this.remaining || (this.remainingWhenLive && this.streamType !== 'vod');\n        if (remaining) {\n            previewTime = -((endTime || 0) - previewTime);\n        }\n        return html`<span>${formatTime(previewTime, endTime, remaining)}</span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-preview-time-display': PreviewTimeDisplay;\n    }\n}\n","import { html, type HTMLTemplateResult, type PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { createRef, type Ref, ref } from 'lit/directives/ref.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { Range } from './Range';\nimport timeRangeCss from './TimeRange.css';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { Ads, ChromelessPlayer, TimeRanges } from 'theoplayer/chromeless';\nimport { formatAsTimePhrase } from '../util/TimeUtils';\nimport { createCustomEvent } from '../util/EventUtils';\nimport type { PreviewTimeChangeEvent } from '../events/PreviewTimeChangeEvent';\nimport { PREVIEW_TIME_CHANGE_EVENT } from '../events/PreviewTimeChangeEvent';\nimport { Attribute } from '../util/Attribute';\nimport type { StreamType } from '../util/StreamType';\nimport { isLinearAd } from '../util/AdUtils';\nimport type { ColorStops } from '../util/ColorStops';\nimport { KeyCode } from '../util/KeyCode';\nimport { getLocale } from '../i18n';\n\n// Load components used in template\nimport './PreviewThumbnail';\nimport './PreviewTimeDisplay';\n\nconst UPDATE_EVENTS = ['timeupdate', 'durationchange', 'ratechange', 'seeking', 'seeked'] as const;\nconst AUTO_ADVANCE_EVENTS = ['play', 'pause', 'ended', 'durationchange', 'readystatechange', 'error'] as const;\nconst AD_EVENTS = ['adbreakbegin', 'adbreakend', 'adbreakchange', 'updateadbreak', 'adbegin', 'adend', 'adskip', 'addad', 'updatead'] as const;\n\n/**\n * Width of an ad marker on the progress bar, in percent of the total bar width.\n */\nconst AD_MARKER_WIDTH = 1;\n\n/**\n * A seek bar, showing the current time of the player,\n * and which seeks the player when clicked or dragged.\n *\n * @slot `preview` - A slot holding a preview of the seek time, shown while hovering the seek bar.\n *   By default, this shows the {@link PreviewTimeDisplay | preview time} and\n *   the {@link PreviewThumbnail | preview thumbnail}.\n *\n * @cssproperty `--theoplayer-preview-text-shadow` - The text shadow applied to the preview box shown while hovering the seek bar.\n *   Defaults to `0 0 4px rgba(0, 0, 0, 0.75)`.\n */\n@customElement('theoplayer-time-range')\n@stateReceiver(['player', 'streamType', 'deviceType', 'lang'])\nexport class TimeRange extends Range {\n    static override styles = [...Range.styles, timeRangeCss];\n\n    private readonly _previewBoxEl: Ref<HTMLElement> = createRef<HTMLElement>();\n\n    private _player: ChromelessPlayer | undefined;\n    private _streamType: StreamType = 'vod';\n    private _showAdMarkers: boolean = false;\n    private _ads: Ads | undefined;\n    private _pausedWhileScrubbing: boolean = false;\n\n    private _autoAdvanceId: number = 0;\n    private _lastUpdateTime: number = 0;\n    private _lastCurrentTime: number = 0;\n    private _lastPlaybackRate: number = 0;\n\n    constructor() {\n        super();\n    }\n\n    override connectedCallback(): void {\n        super.connectedCallback();\n\n        if (!this.hasAttribute('min')) {\n            this.min = 0;\n        }\n        if (!this.hasAttribute('max')) {\n            this.max = 1000;\n        }\n        if (!this.hasAttribute(Attribute.ARIA_LIVE)) {\n            this.ariaLive = 'off';\n        }\n\n        this._toggleAutoAdvance();\n    }\n\n    protected override firstUpdated(_changedProperties: PropertyValues) {\n        this._rangeRef.value?.addEventListener('mousedown', this._pauseOnScrubStart);\n        this._rangeRef.value?.addEventListener('pointerdown', this._pauseOnScrubStart);\n    }\n\n    override disconnectedCallback(): void {\n        super.disconnectedCallback();\n\n        this._rangeRef.value?.removeEventListener('mousedown', this._pauseOnScrubStart);\n        this._rangeRef.value?.removeEventListener('pointerdown', this._pauseOnScrubStart);\n\n        this._toggleAutoAdvance();\n    }\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._player !== undefined) {\n            this._player.removeEventListener(UPDATE_EVENTS, this._updateFromPlayer);\n            this._player.removeEventListener(AUTO_ADVANCE_EVENTS, this._toggleAutoAdvance);\n        }\n        this._ads?.removeEventListener(AD_EVENTS, this._onAdChange);\n        this._player = player;\n        this._ads = player?.ads;\n        this._updateFromPlayer();\n        this._toggleAutoAdvance();\n        if (this._player !== undefined) {\n            this._player.addEventListener(UPDATE_EVENTS, this._updateFromPlayer);\n            this._player.addEventListener(AUTO_ADVANCE_EVENTS, this._toggleAutoAdvance);\n        }\n        this._ads?.addEventListener(AD_EVENTS, this._onAdChange);\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    /**\n     * The stream type, either \"vod\", \"live\" or \"dvr\".\n     */\n    get streamType(): StreamType {\n        return this._streamType;\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.STREAM_TYPE })\n    set streamType(streamType: StreamType) {\n        this._streamType = streamType;\n        this.updateDisabled_();\n    }\n\n    /**\n     * Whether to show markers for advertisements on the seek bar.\n     */\n    get showAdMarkers(): boolean {\n        return this._showAdMarkers;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.SHOW_AD_MARKERS })\n    set showAdMarkers(showAdMarkers: boolean) {\n        this._showAdMarkers = showAdMarkers;\n        this._updateRange();\n    }\n\n    private readonly _updateFromPlayer = () => {\n        if (this._player === undefined) {\n            return;\n        }\n        this._lastUpdateTime = performance.now();\n        this._lastCurrentTime = this._player.currentTime;\n        this._lastPlaybackRate = this._player.playbackRate;\n        const seekable = this._player.seekable;\n        let min: number;\n        let max: number;\n        let value: number = this._lastCurrentTime;\n        if (seekable.length !== 0) {\n            min = seekable.start(0);\n            max = seekable.end(0);\n        } else {\n            min = 0;\n            max = this._player.duration;\n        }\n        if (!isFinite(this._lastCurrentTime)) {\n            const isLive = this._player.duration === Infinity;\n            value = isLive ? max : min;\n        }\n        this.min = min;\n        this.max = max;\n        this.rawValue = value;\n        this.updateDisabled_(seekable);\n        this._updateRange();\n    };\n\n    private updateDisabled_(seekable: TimeRanges | undefined = this._player?.seekable) {\n        let disabled = this.streamType === 'live';\n        if (seekable !== undefined) {\n            disabled ||= seekable.length === 0;\n        }\n        this.disabled = disabled;\n    }\n\n    protected override getAriaLabel(): string {\n        return getLocale(this.lang).seekAria;\n    }\n\n    protected override getAriaValueText(): string {\n        const locale = getLocale(this.lang);\n        const currentTimePhrase = formatAsTimePhrase(locale, this.value);\n        const totalTimePhrase = formatAsTimePhrase(locale, this.max);\n        if (currentTimePhrase && totalTimePhrase) {\n            return locale.timeOfTotalAria(currentTimePhrase, totalTimePhrase);\n        }\n        return locale.unknownTimeAria;\n    }\n\n    protected override handleInput(): void {\n        if (this._player !== undefined && this._player.currentTime !== this.value) {\n            this._player.currentTime = this.value;\n        }\n        super.handleInput();\n    }\n\n    private readonly _pauseOnScrubStart = () => {\n        if (this._pausedWhileScrubbing) {\n            // Already scrubbing.\n            return;\n        }\n        if (this.disabled || this.inert) {\n            return;\n        }\n        if (this._player === undefined || this._player.paused) {\n            // Player is already paused.\n            return;\n        }\n        this._pausedWhileScrubbing = true;\n        this._player.pause();\n        document.addEventListener('mouseup', this._playOnScrubEnd);\n        document.addEventListener('pointerup', this._playOnScrubEnd);\n        document.addEventListener('pointercancel', this._playOnScrubEnd);\n    };\n\n    private readonly _playOnScrubEnd = () => {\n        if (!this._pausedWhileScrubbing) {\n            return;\n        }\n        this._pausedWhileScrubbing = false;\n        document.removeEventListener('mouseup', this._playOnScrubEnd);\n        document.removeEventListener('pointerup', this._playOnScrubEnd);\n        document.removeEventListener('pointercancel', this._playOnScrubEnd);\n        if (this._player !== undefined && this._player.paused) {\n            this._player.play();\n        }\n    };\n\n    private shouldAutoAdvance_(): boolean {\n        return (\n            this.isConnected &&\n            this._player !== undefined &&\n            !this._player.paused &&\n            !this._player.ended &&\n            !this._player.errorObject &&\n            this._player.readyState >= 3 &&\n            isFinite(this._lastCurrentTime) &&\n            this.needToUpdateEveryFrame_()\n        );\n    }\n\n    private needToUpdateEveryFrame_(): boolean {\n        // The player fires at least one timeupdate event every 250ms.\n        // If it takes more than 250ms to advance the playhead by 1 pixel,\n        // then we definitely don't need to update every frame.\n        const minimumStep = this.getMinimumStepForVisibleChange_();\n        const timeUpdateStep = 0.25 * this._lastPlaybackRate;\n        return minimumStep < timeUpdateStep;\n    }\n\n    private readonly _toggleAutoAdvance = () => {\n        if (this.shouldAutoAdvance_()) {\n            if (this._autoAdvanceId === 0) {\n                this._updateFromPlayer();\n                this._autoAdvanceId = requestAnimationFrame(this._autoAdvanceWhilePlaying);\n            }\n        } else {\n            if (this._autoAdvanceId !== 0) {\n                this._updateFromPlayer();\n                cancelAnimationFrame(this._autoAdvanceId);\n                this._autoAdvanceId = 0;\n            }\n        }\n    };\n\n    private readonly _autoAdvanceWhilePlaying = () => {\n        if (!this.shouldAutoAdvance_()) {\n            this._autoAdvanceId = 0;\n            return;\n        }\n\n        const delta = (performance.now() - this._lastUpdateTime) / 1000;\n        const newValue = this._lastCurrentTime + delta * this._lastPlaybackRate;\n        if (Math.abs(newValue - this.value) >= this.getMinimumStepForVisibleChange_()) {\n            this.rawValue = newValue;\n\n            // Use cached width to avoid synchronous layout\n            this._updateRange(/* useCachedWidth = */ true);\n        }\n\n        this._autoAdvanceId = requestAnimationFrame(this._autoAdvanceWhilePlaying);\n    };\n\n    @state()\n    private accessor _previewRailTransform: string = '';\n\n    protected override updatePointer_(mousePercent: number, rangeRect: DOMRectReadOnly): void {\n        super.updatePointer_(mousePercent, rangeRect);\n\n        // Update preview rail, keeping the preview box within bounds\n        let previewPos = rangeRect.left + mousePercent * rangeRect.width;\n        const previewBoxEl = this._previewBoxEl.value;\n        if (previewBoxEl) {\n            const previewBoxRect = previewBoxEl.getBoundingClientRect();\n            const minPreviewPos = rangeRect.left + previewBoxRect.width / 2;\n            const maxPreviewPos = rangeRect.right - previewBoxRect.width / 2;\n            previewPos = Math.max(minPreviewPos, Math.min(maxPreviewPos, previewPos));\n            const previewPosFraction = (previewPos - rangeRect.left) / rangeRect.width;\n            this._previewRailTransform = `translateX(${(previewPosFraction * 100 * 100).toFixed(6)}%)`;\n        }\n\n        // Propagate preview time to parent\n        if (this._player === undefined) {\n            return;\n        }\n        const { min, max } = this;\n        const previewTime = min + mousePercent * (max - min);\n        const previewTimeChangeEvent: PreviewTimeChangeEvent = createCustomEvent(PREVIEW_TIME_CHANGE_EVENT, {\n            bubbles: true,\n            composed: true,\n            detail: { previewTime }\n        });\n        this.dispatchEvent(previewTimeChangeEvent);\n    }\n\n    protected override getBarColors(): ColorStops {\n        const colorStops = super.getBarColors();\n        if (!this.showAdMarkers || !this._player || !this._player.ads) {\n            return colorStops;\n        }\n        if (this._player.ads.playing) {\n            // Currently playing a linear ad\n            return colorStops;\n        }\n        const { min, max } = this;\n        for (const adBreak of this._player.ads.scheduledAdBreaks) {\n            if (adBreak.ads !== undefined && adBreak.ads.length > 0 && !adBreak.ads.some(isLinearAd)) {\n                // Ad break definitely does not contain any linear ads\n                continue;\n            }\n            let adBreakTime = adBreak.timeOffset;\n            if (adBreakTime < 0) {\n                // Post-rolls have timeOffset == -1\n                adBreakTime = this._player.duration;\n            }\n            if (min <= adBreakTime && adBreakTime <= max) {\n                const adBreakPercent = ((adBreakTime - min) / (max - min)) * 100;\n                let adBreakFrom: number;\n                let adBreakTo: number;\n                if (adBreakPercent + AD_MARKER_WIDTH < 100) {\n                    adBreakFrom = adBreakPercent;\n                    adBreakTo = adBreakPercent + AD_MARKER_WIDTH;\n                } else {\n                    adBreakFrom = 100 - AD_MARKER_WIDTH;\n                    adBreakTo = 100;\n                }\n                colorStops.add('var(--theoplayer-time-range-ad-marker-color, #ffc50f)', adBreakFrom, adBreakTo);\n            }\n        }\n        return colorStops;\n    }\n\n    private readonly _onAdChange = () => {\n        this._updateRange();\n    };\n\n    protected override handleKeyDown_(e: KeyboardEvent) {\n        super.handleKeyDown_(e);\n        if (this.deviceType === 'tv' && e.keyCode === KeyCode.ENTER) {\n            if (this._player !== undefined) {\n                if (this._player.paused) {\n                    this._player.play();\n                } else {\n                    this._player.pause();\n                }\n            }\n        }\n    }\n\n    protected override renderRangeExtras(): HTMLTemplateResult {\n        return html`\n            <div class=\"theoplayer-time-range-preview-rail\" style=${styleMap({ transform: this._previewRailTransform })}>\n                <div part=\"box preview-box\" ${ref(this._previewBoxEl)}>\n                    <slot name=\"preview\">\n                        <theoplayer-preview-thumbnail></theoplayer-preview-thumbnail>\n                        <theoplayer-preview-time-display remaining-when-live></theoplayer-preview-time-display>\n                    </slot>\n                </div>\n            </div>\n        `;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-time-range': TimeRange;\n    }\n}\n","import { Range } from './Range';\nimport { customElement, property } from 'lit/decorators.js';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { Attribute } from '../util/Attribute';\nimport { getLocale } from '../i18n';\n\n/**\n * A volume slider, showing the current audio volume of the player,\n * and which changes the volume when clicked or dragged.\n */\n@customElement('theoplayer-volume-range')\n@stateReceiver(['player', 'deviceType', 'lang'])\nexport class VolumeRange extends Range {\n    private _player: ChromelessPlayer | undefined;\n\n    constructor() {\n        super();\n    }\n\n    override connectedCallback(): void {\n        super.connectedCallback();\n\n        if (!this.hasAttribute('min')) {\n            this.min = 0;\n        }\n        if (!this.hasAttribute('max')) {\n            this.max = 1;\n        }\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._player !== undefined) {\n            this._player.removeEventListener('volumechange', this._updateFromPlayer);\n        }\n        this._player = player;\n        this._updateFromPlayer();\n        if (this._player !== undefined) {\n            this._player.addEventListener('volumechange', this._updateFromPlayer);\n        }\n    }\n\n    private readonly _updateFromPlayer = () => {\n        if (this._player !== undefined) {\n            this.rawValue = this._player.volume;\n            this._updateRange();\n        }\n    };\n\n    protected override getAriaLabel(): string {\n        return getLocale(this.lang).volumeAria;\n    }\n\n    protected override getAriaValueText(): string {\n        return getLocale(this.lang).formatPercentage(this.value / this.max);\n    }\n\n    protected override handleInput(): void {\n        if (this._player !== undefined && this._player.volume !== this.value) {\n            this._player.volume = this.value;\n        }\n        super.handleInput();\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-volume-range': VolumeRange;\n    }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport errorDisplayCss from './ErrorDisplay.css';\nimport errorIcon from '../icons/error.svg';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { THEOplayerError } from 'theoplayer/chromeless';\nimport { Attribute } from '../util/Attribute';\nimport { getLocale } from '../i18n';\n\n/**\n * A screen that shows the details of a fatal player error.\n *\n * @cssproperty `--theoplayer-error-icon-color` - The color of the error icon. Defaults to `--theoplayer-icon-color`.\n * @cssproperty `--theoplayer-error-icon-width` - The width of the error icon. Defaults to `48px`.\n * @cssproperty `--theoplayer-error-icon-height` - The height of the error icon. Defaults to `48px`.\n * @cssproperty `--theoplayer-error-icon-gap` - The gap between the error icon and the text. Defaults to `10px`.\n * @cssproperty `--theoplayer-error-heading-color` - The text color of the error heading. Defaults to `#fff`.\n * @cssproperty `--theoplayer-error-heading-margin` - The margin around the error heading. Defaults to `0 0 10px`.\n * @cssproperty `--theoplayer-error-message-color` - The text color of the error message. Defaults to `#fff`.\n * @cssproperty `--theoplayer-error-message-margin` - The margin around the error message. Defaults to `0`.\n * @cssproperty `--theoplayer-error-min-width` - The minimum width of the error display. Defaults to `0`.\n * @cssproperty `--theoplayer-error-max-width` - The maximum width of the error display. Defaults to `80%`.\n */\n@customElement('theoplayer-error-display')\n@stateReceiver(['error', 'fullscreen', 'lang'])\nexport class ErrorDisplay extends LitElement {\n    static override styles = [errorDisplayCss];\n    static override shadowRootOptions: ShadowRootInit = {\n        ...LitElement.shadowRootOptions,\n        delegatesFocus: true\n    };\n\n    /**\n     * The error.\n     */\n    @property({ reflect: false, attribute: false })\n    accessor error: THEOplayerError | undefined;\n\n    /**\n     * Whether the player is in fullscreen mode.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.FULLSCREEN })\n    accessor fullscreen: boolean = false;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    protected override render() {\n        const locale = getLocale(this.lang);\n        const error = this.error;\n        const message = error ? locale.errorMessage(error) : '';\n        return html`<div part=\"icon\"><slot name=\"icon\">${unsafeSVG(errorIcon)}</slot></div>\n            <div part=\"text\">\n                <h1 part=\"heading\"><slot name=\"heading\">${locale.errorHeading}</slot></h1>\n                <p part=\"message\"><slot name=\"message\">${message}</slot></p>\n            </div>\n            <div part=\"fullscreen-controls\">\n                <slot name=\"fullscreen-controls\"><theoplayer-fullscreen-button></theoplayer-fullscreen-button></slot>\n            </div>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-error-display': ErrorDisplay;\n    }\n}\n","import { type PropertyValues } from 'lit';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { CastButton } from './CastButton';\nimport chromecastButtonHtml from './ChromecastButton.html';\nimport chromecastButtonCss from './ChromecastButton.css';\nimport { customElement, property } from 'lit/decorators.js';\nimport { getLocale } from '../i18n';\nimport { Attribute } from '../util/Attribute';\n\nlet chromecastButtonId = 0;\n\n/**\n * A button to start and stop casting using Chromecast.\n */\n@customElement('theoplayer-chromecast-button')\n@stateReceiver(['player', 'lang'])\nexport class ChromecastButton extends CastButton {\n    static styles = [...CastButton.styles, chromecastButtonCss];\n\n    private _player: ChromelessPlayer | undefined;\n    private readonly _buttonId = ++chromecastButtonId;\n\n    constructor() {\n        super();\n    }\n\n    override connectedCallback() {\n        super.connectedCallback();\n        this._updateAriaLabel();\n    }\n\n    get player() {\n        return this._player;\n    }\n\n    set player(player: ChromelessPlayer | undefined) {\n        this._player = player;\n        this.castApi = player?.cast?.chromecast;\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    override willUpdate(changedProperties: PropertyValues) {\n        super.willUpdate(changedProperties);\n        this._updateAriaLabel();\n    }\n\n    private _updateAriaLabel(): void {\n        const locale = getLocale(this.lang);\n        this.ariaLabel = this.castState === 'connecting' || this.castState === 'connected' ? locale.chromecastConnectedAria : locale.chromecastAria;\n    }\n\n    protected override render() {\n        return chromecastButtonHtml(this._buttonId);\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-chromecast-button': ChromecastButton;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport chromecastDisplayCss from './ChromecastDisplay.css';\nimport chromecastIcon from '../icons/chromecast-48px.svg';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { Chromecast, ChromelessPlayer } from 'theoplayer/chromeless';\nimport { Attribute } from '../util/Attribute';\nimport { getLocale } from '../i18n';\n\nconst CAST_EVENTS = ['statechange'] as const;\n\n/**\n * A control that displays the casting status while using Chromecast.\n *\n * @cssproperty `--theoplayer-chromecast-display-icon-color` - The color of the Chromecast icon. Defaults to `--theoplayer-icon-color`.\n * @cssproperty `--theoplayer-chromecast-display-icon-width` - The width of the Chromecast icon. Defaults to `48px`.\n * @cssproperty `--theoplayer-chromecast-display-icon-height` - The height of the Chromecast icon. Defaults to `48px`.\n * @cssproperty `--theoplayer-chromecast-display-icon-gap` - The gap between the icon and the heading. Defaults to `10px`.\n * @cssproperty `--theoplayer-chromecast-display-heading-color` - The color of the heading text. Defaults to `#fff`.\n * @cssproperty `--theoplayer-chromecast-display-heading-font-size` - The font size of the heading text. Defaults to `--theoplayer-text-font-size`.\n * @cssproperty `--theoplayer-chromecast-display-heading-margin` - The margin around the heading text. Defaults to `0`.\n * @cssproperty `--theoplayer-chromecast-display-receiver-color` - The color of the receiver name text. Defaults to `#fff`.\n * @cssproperty `--theoplayer-chromecast-display-receiver-font-size` - The font size of the receiver name text. Defaults to `calc(1.25 * var(--theoplayer-text-font-size, 14px))`.\n * @cssproperty `--theoplayer-chromecast-display-receiver-margin` - The margin around the receiver name text. Defaults to `0`.\n */\n@customElement('theoplayer-chromecast-display')\n@stateReceiver(['player', 'lang'])\nexport class ChromecastDisplay extends LitElement {\n    static styles = [chromecastDisplayCss];\n\n    private _player: ChromelessPlayer | undefined;\n    private _castApi: Chromecast | undefined;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    @state()\n    private accessor _receiverName: string = '';\n\n    connectedCallback(): void {\n        super.connectedCallback();\n        if (!this.hasAttribute(Attribute.HIDDEN)) {\n            this.setAttribute(Attribute.HIDDEN, '');\n        }\n        this._updateFromPlayer();\n    }\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._castApi !== undefined) {\n            this._castApi.removeEventListener(CAST_EVENTS, this._updateFromPlayer);\n        }\n        this._player = player;\n        this._castApi = player?.cast?.chromecast;\n        this._updateFromPlayer();\n        if (this._castApi !== undefined) {\n            this._castApi.addEventListener(CAST_EVENTS, this._updateFromPlayer);\n        }\n    }\n\n    private readonly _updateFromPlayer = () => {\n        const chromecast = this._player?.cast?.chromecast;\n        if (chromecast === undefined || chromecast.state !== 'connected') {\n            this.setAttribute(Attribute.HIDDEN, '');\n        } else {\n            this._receiverName = chromecast.receiverName || '';\n            this.removeAttribute(Attribute.HIDDEN);\n        }\n    };\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        return html`<div part=\"icon\"><slot name=\"icon\">${unsafeSVG(chromecastIcon)}</slot></div>\n            <div part=\"text\">\n                <p part=\"heading\"><slot name=\"heading\">${locale.chromecastHeading}</slot></p>\n                <p part=\"receiver\">${this._receiverName || locale.chromecastDefaultReceiverName}</p>\n            </div>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-chromecast-display': ChromecastDisplay;\n    }\n}\n","import { type PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { CastButton } from './CastButton';\nimport airPlayButtonHtml from './AirPlayButton.html';\nimport airPlayButtonCss from './AirPlayButton.css';\nimport { getLocale } from '../i18n';\nimport { Attribute } from '../util/Attribute';\n\n/**\n * A button to start and stop casting using AirPlay.\n */\n@customElement('theoplayer-airplay-button')\n@stateReceiver(['player', 'lang'])\nexport class AirPlayButton extends CastButton {\n    static styles = [...CastButton.styles, airPlayButtonCss];\n\n    private _player: ChromelessPlayer | undefined;\n\n    override connectedCallback() {\n        super.connectedCallback();\n        this._updateAriaLabel();\n    }\n\n    get player() {\n        return this._player;\n    }\n\n    set player(player: ChromelessPlayer | undefined) {\n        this._player = player;\n        this.castApi = player?.cast?.airplay;\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    override willUpdate(changedProperties: PropertyValues) {\n        super.willUpdate(changedProperties);\n        this._updateAriaLabel();\n    }\n\n    private _updateAriaLabel(): void {\n        const locale = getLocale(this.lang);\n        this.ariaLabel = this.castState === 'connecting' || this.castState === 'connected' ? locale.airplayConnectedAria : locale.airplayAria;\n    }\n\n    protected override render() {\n        return airPlayButtonHtml;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-airplay-button': AirPlayButton;\n    }\n}\n","import loadingIndicatorCss from './LoadingIndicator.css';\nimport loadingIndicatorHtml from './LoadingIndicator.html';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { Attribute } from '../util/Attribute';\nimport { customElement, property } from 'lit/decorators.js';\nimport { type HTMLTemplateResult, LitElement } from 'lit';\n\nconst PLAYER_EVENTS = ['readystatechange', 'play', 'pause', 'playing', 'seeking', 'seeked'] as const;\n\n/**\n * An indicator that shows whether the player is currently waiting for more data to resume playback.\n *\n * @cssproperty `--theoplayer-loading-delay` - The delay before the loading spinner is shown. Defaults to `0.5s`.\n * @cssproperty `--theoplayer-loading-icon-color` - The color of the loading spinner. Defaults to `--theoplayer-icon-color`.\n * @cssproperty `--theoplayer-loading-icon-width` - The width of the loading spinner. Defaults to `48px`.\n * @cssproperty `--theoplayer-loading-icon-height` - The height of the loading spinner. Defaults to `--theoplayer-loading-icon-width`.\n */\n@customElement('theoplayer-loading-indicator')\n@stateReceiver(['player'])\nexport class LoadingIndicator extends LitElement {\n    static override styles = [loadingIndicatorCss];\n\n    private _player: ChromelessPlayer | undefined;\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._player !== undefined) {\n            this._player.removeEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n        }\n        this._player = player;\n        this._updateFromPlayer();\n        if (this._player !== undefined) {\n            this._player.addEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n        }\n    }\n\n    /**\n     * Whether the player is waiting for more data. If set, the indicator is shown.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.LOADING })\n    accessor loading: boolean = false;\n\n    private readonly _updateFromPlayer = () => {\n        this.loading = this._player !== undefined && !this._player.paused && (this._player.seeking || this._player.readyState < 3);\n    };\n\n    protected override render(): HTMLTemplateResult {\n        return loadingIndicatorHtml;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-loading-indicator': LoadingIndicator;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport gestureReceiverCss from './GestureReceiver.css';\nimport { stateReceiver } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport type { DeviceType } from '../util/DeviceType';\n\n/**\n * An overlay that receives and handles gestures on the player.\n *\n * On desktop devices, this plays or pauses the player whenever it is clicked.\n * On mobile devices, this currently does nothing.\n */\n@customElement('theoplayer-gesture-receiver')\n@stateReceiver(['player', 'deviceType'])\nexport class GestureReceiver extends LitElement {\n    static override styles = [gestureReceiverCss];\n\n    private _player: ChromelessPlayer | undefined;\n    private _playerElement: HTMLElement | undefined;\n    private _pointerType: string = '';\n\n    connectedCallback(): void {\n        super.connectedCallback();\n\n        this.setAttribute('tabindex', '-1');\n        this.setAttribute('aria-hidden', 'true');\n    }\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._playerElement !== undefined) {\n            this._playerElement.removeEventListener('pointerdown', this._onPointerDown);\n            this._playerElement.removeEventListener('click', this._onClick);\n        }\n        this._player = player;\n        this._playerElement = player?.element;\n        if (this._playerElement !== undefined) {\n            this._playerElement.addEventListener('pointerdown', this._onPointerDown);\n            this._playerElement.addEventListener('click', this._onClick);\n        }\n    }\n\n    /**\n     * The device type, either \"desktop\", \"mobile\" or \"tv\".\n     */\n    @property({ reflect: false, attribute: false })\n    accessor deviceType: DeviceType = 'desktop';\n\n    private readonly _onPointerDown = (event: PointerEvent) => {\n        this._pointerType = event.pointerType;\n    };\n\n    private readonly _onClick = (event: MouseEvent) => {\n        // If the browser doesn't yet support `pointerType` on `click` events,\n        // we use the type from the previous `pointerdown` event.\n        const pointerType = (event as PointerEvent).pointerType ?? this._pointerType;\n        if (pointerType === 'touch') {\n            this.handleTap(event);\n        } else if (pointerType === 'mouse') {\n            this.handleMouseClick(event);\n        }\n    };\n\n    handleTap(_event: MouseEvent): void {\n        // Do nothing.\n    }\n\n    handleMouseClick(_event: MouseEvent): void {\n        if (this.deviceType !== 'desktop') return;\n        // Toggle play/pause.\n        if (this._player !== undefined) {\n            if (this._player.source === undefined) {\n                // Do nothing if the player has no source.\n                return;\n            }\n            if (this._player.ads?.playing) {\n                // Clicking during a linear ad should open the ad's clickthrough URL instead.\n                return;\n            }\n            if (this._player.vr && this._player.vr.state !== 'unavailable') {\n                // While VR is active, mouse drags are used to look around the 360° video,\n                // so a click should not toggle play/pause.\n                return;\n            }\n            if (this._player.paused) {\n                this._player.play();\n            } else {\n                this._player.pause();\n            }\n        }\n    }\n\n    protected override render(): HTMLTemplateResult {\n        return html``;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-gesture-receiver': GestureReceiver;\n    }\n}\n","import { html, type HTMLTemplateResult, type PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { Button } from './Button';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport liveButtonCss from './LiveButton.css';\nimport liveIcon from '../icons/live.svg';\nimport { stateReceiver } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\nimport type { StreamType } from '../util/StreamType';\nimport { getLocale } from '../i18n';\n\nconst PAUSED_EVENTS = ['play', 'pause', 'playing', 'emptied'] as const;\nconst LIVE_EVENTS = ['seeking', 'seeked', 'timeupdate', 'durationchange', 'emptied'] as const;\n\nconst DEFAULT_LIVE_THRESHOLD = 10;\n\n/**\n * A button that shows whether the player is currently playing at the live point,\n * and seeks to the live point when clicked.\n *\n * @cssproperty `--theoplayer-live-button-color` - The color of the live indicator when not at the live point. Defaults to `rgb(140, 140, 140)`.\n * @cssproperty `--theoplayer-live-button-active-color` - The color of the live indicator when playing at the live point. Defaults to `red`.\n */\n@customElement('theoplayer-live-button')\n@stateReceiver(['player', 'streamType', 'lang'])\nexport class LiveButton extends Button {\n    static styles = [...Button.styles, liveButtonCss];\n\n    private _player: ChromelessPlayer | undefined;\n    private _liveThreshold: number = DEFAULT_LIVE_THRESHOLD;\n\n    /**\n     * Whether the player is paused.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.PAUSED })\n    accessor paused: boolean = false;\n\n    /**\n     * The stream type, either \"vod\", \"live\" or \"dvr\".\n     */\n    @property({ reflect: true, type: String, attribute: Attribute.STREAM_TYPE })\n    accessor streamType: StreamType = 'vod';\n\n    /**\n     * The maximum distance (in seconds) from the live point that the player's current time\n     * can be for it to still be considered \"at the live point\".\n     *\n     * If unset, defaults to 10 seconds.\n     */\n    get liveThreshold(): number {\n        return this._liveThreshold;\n    }\n\n    @property({ reflect: true, type: Number, attribute: Attribute.LIVE_THRESHOLD, useDefault: true })\n    set liveThreshold(value: number) {\n        this._liveThreshold = isNaN(value) ? 0 : value;\n        this._updateLive();\n    }\n\n    /**\n     * Whether the player is considered to be playing at the live point.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.LIVE })\n    accessor live: boolean = false;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._player !== undefined) {\n            this._player.removeEventListener(PAUSED_EVENTS, this._updatePaused);\n            this._player.removeEventListener(LIVE_EVENTS, this._updateLive);\n        }\n        this._player = player;\n        this._updatePaused();\n        this._updateLive();\n        if (this._player !== undefined) {\n            this._player.addEventListener(PAUSED_EVENTS, this._updatePaused);\n            this._player.addEventListener(LIVE_EVENTS, this._updateLive);\n        }\n    }\n\n    private readonly _updatePaused = () => {\n        this.paused = this._player !== undefined ? this._player.paused : true;\n    };\n\n    private readonly _updateLive = () => {\n        this.live = this._player !== undefined ? isLive(this._player, this.liveThreshold) : false;\n    };\n\n    protected override handleClick() {\n        if (this._player === undefined) {\n            return;\n        }\n        if (this._player.hesp && this._player.hesp.manifest !== undefined) {\n            this._player.hesp.goLive();\n        } else {\n            this._player.currentTime = Infinity;\n            this._player.play();\n        }\n    }\n\n    override willUpdate(changedProperties: PropertyValues) {\n        super.willUpdate(changedProperties);\n        this._updateAriaLabel();\n    }\n\n    private _updateAriaLabel(): void {\n        const locale = getLocale(this.lang);\n        this.ariaLabel = locale.seekToLiveAria;\n    }\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        return html`<span part=\"icon\"><slot name=\"icon\">${unsafeSVG(liveIcon)}</slot></span\n            ><slot name=\"spacer\"> </slot><span part=\"text\"><slot name=\"text\">${locale.live}</slot></span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-live-button': LiveButton;\n    }\n}\n\nfunction isLive(player: ChromelessPlayer, threshold: number): boolean {\n    if (player.duration === Infinity) {\n        const seekable = player.seekable;\n        if (seekable.length > 0) {\n            return seekable.end(seekable.length - 1) - player.currentTime <= threshold;\n        } else {\n            return true;\n        }\n    }\n    return false;\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport textDisplayCss from '../TextDisplay.css';\nimport adDisplayCss from './AdDisplay.css';\nimport { stateReceiver } from '../StateReceiverMixin';\nimport type { Ads, ChromelessPlayer } from 'theoplayer/chromeless';\nimport { arrayFind } from '../../util/CommonUtils';\nimport { isLinearAd } from '../../util/AdUtils';\nimport { getLocale } from '../../i18n';\nimport { Attribute } from '../../util/Attribute';\n\nconst AD_EVENTS = ['adbreakbegin', 'adbreakend', 'adbreakchange', 'updateadbreak', 'adbegin', 'adend', 'adskip', 'addad', 'updatead'] as const;\n\n/**\n * A control that shows when an advertisement is playing,\n * and the number of the current ad in the ad break (if the break has multiple ads).\n *\n * @cssproperty `--theoplayer-ad-display-background` - The background of the ad display. Defaults to `#ffc50f`.\n * @cssproperty `--theoplayer-ad-display-border-radius` - The border radius of the ad display. Defaults to `2px`.\n * @cssproperty `--theoplayer-ad-display-padding` - The padding of the ad display. Defaults to `--theoplayer-control-padding`.\n * @cssproperty `--theoplayer-ad-display-text-color` - The text color of the ad display. Defaults to `#000`.\n */\n@customElement('theoplayer-ad-display')\n@stateReceiver(['player', 'lang'])\nexport class AdDisplay extends LitElement {\n    static styles = [textDisplayCss, adDisplayCss];\n\n    private _player: ChromelessPlayer | undefined;\n    private _ads: Ads | undefined;\n\n    @state()\n    private accessor _currentAd: number = 0;\n\n    @state()\n    private accessor _totalAds: number = 0;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    connectedCallback(): void {\n        super.connectedCallback();\n        this._updateFromPlayer();\n    }\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        this._ads?.removeEventListener(AD_EVENTS, this._updateFromPlayer);\n        this._player = player;\n        this._ads = player?.ads;\n        this._updateFromPlayer();\n        this._ads?.addEventListener(AD_EVENTS, this._updateFromPlayer);\n    }\n\n    private readonly _updateFromPlayer = () => {\n        const ads = this._player?.ads;\n        const linearAds = (ads?.currentAdBreak?.ads ?? []).filter(isLinearAd);\n        if (ads === undefined || !ads.playing || linearAds.length === 0) {\n            this._currentAd = 0;\n            this._totalAds = 0;\n            this.style.display = 'none';\n            return;\n        }\n        let currentAd = 0;\n        if (linearAds.length > 1) {\n            const currentAds = this._player!.ads!.currentAds || [];\n            const currentLinearAd = arrayFind(currentAds, isLinearAd);\n            if (currentLinearAd) {\n                const currentAdIndex = linearAds.indexOf(currentLinearAd);\n                if (currentAdIndex >= 0) {\n                    currentAd = currentAdIndex + 1;\n                }\n            }\n        }\n        this._currentAd = currentAd;\n        this._totalAds = linearAds.length;\n        this.style.display = '';\n    };\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        const text = this._totalAds > 1 ? locale.adBreakText(this._currentAd, this._totalAds) : locale.adText;\n        return html`<span>${text}</span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-ad-display': AdDisplay;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport textDisplayCss from '../TextDisplay.css';\nimport adCountdownCss from './AdCountdown.css';\nimport { stateReceiver } from '../StateReceiverMixin';\nimport type { Ads, ChromelessPlayer } from 'theoplayer/chromeless';\nimport { getLocale } from '../../i18n';\nimport { toDuration } from '../../util/TimeUtils';\nimport { Attribute } from '../../util/Attribute';\n\nconst AD_EVENTS = ['adbreakbegin', 'adbreakend', 'adbreakchange', 'updateadbreak'] as const;\n\n/**\n * A control that displays the remaining time of the current ad break.\n */\n@customElement('theoplayer-ad-countdown')\n@stateReceiver(['player', 'lang'])\nexport class AdCountdown extends LitElement {\n    static override styles = [textDisplayCss, adCountdownCss];\n\n    private _player: ChromelessPlayer | undefined;\n    private _ads: Ads | undefined;\n\n    @state()\n    private accessor _maxRemainingDuration: number = 0;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        this._player?.removeEventListener('timeupdate', this._update);\n        this._ads?.removeEventListener(AD_EVENTS, this._onAdChange);\n        this._player = player;\n        this._ads = player?.ads;\n        this._onAdChange();\n        this._ads?.addEventListener(AD_EVENTS, this._onAdChange);\n    }\n\n    private readonly _onAdChange = () => {\n        if (this._player?.ads?.playing) {\n            this._player.removeEventListener('timeupdate', this._update);\n            this._player.addEventListener('timeupdate', this._update);\n        } else {\n            this._player?.removeEventListener('timeupdate', this._update);\n        }\n        this._update();\n    };\n\n    private readonly _update = (): void => {\n        const ads = this._player?.ads;\n        let maxRemainingDuration = ads?.currentAdBreak?.maxRemainingDuration;\n        if (ads === undefined || !ads.playing || maxRemainingDuration === undefined || maxRemainingDuration < 0) {\n            this._maxRemainingDuration = 0;\n            this.style.display = 'none';\n        } else {\n            this._maxRemainingDuration = Math.ceil(maxRemainingDuration);\n            this.style.display = '';\n        }\n    };\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        const remainingDuration = locale.formatNarrowDuration(toDuration(this._maxRemainingDuration));\n        return html`<span>${locale.adCountdownText(remainingDuration)}</span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-ad-countdown': AdCountdown;\n    }\n}\n","import { html, type HTMLTemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { LinkButton } from '../LinkButton';\nimport { stateReceiver } from '../StateReceiverMixin';\nimport { Attribute } from '../../util/Attribute';\nimport type { Ads, ChromelessPlayer } from 'theoplayer/chromeless';\nimport { arrayFind } from '../../util/CommonUtils';\nimport { isLinearAd } from '../../util/AdUtils';\nimport { getLocale } from '../../i18n';\n\nconst AD_EVENTS = ['adbegin', 'adend', 'adloaded', 'updatead', 'adskip'] as const;\n\n/**\n * A button to open the advertisement's click-through webpage.\n */\n@customElement('theoplayer-ad-clickthrough-button')\n@stateReceiver(['player', 'lang'])\nexport class AdClickThroughButton extends LinkButton {\n    private _player: ChromelessPlayer | undefined;\n    private _ads: Ads | undefined;\n    private _clickThrough: string | null = null;\n\n    constructor() {\n        super();\n    }\n\n    override connectedCallback(): void {\n        super.connectedCallback();\n        this._updateFromPlayer();\n\n        if (this.clickThrough == null) {\n            this.disabled = true;\n            this.style.display = 'none';\n        }\n    }\n\n    /**\n     * The click-through URL of the advertisement.\n     */\n    get clickThrough(): string | null {\n        return this._clickThrough;\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.CLICKTHROUGH })\n    set clickThrough(clickThrough: string | null) {\n        if (this._clickThrough === clickThrough) {\n            return;\n        }\n        this._clickThrough = clickThrough;\n        this.href = clickThrough ? String(clickThrough).trim() : '#';\n        this.target = '_blank';\n        this.disabled = clickThrough == null;\n        this.style.display = clickThrough != null ? '' : 'none';\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        this._ads?.removeEventListener(AD_EVENTS, this._updateFromPlayer);\n        this._player = player;\n        this._ads = player?.ads;\n        this._updateFromPlayer();\n        this._ads?.addEventListener(AD_EVENTS, this._updateFromPlayer);\n    }\n\n    private readonly _updateFromPlayer = () => {\n        const ads = this._player?.ads;\n        if (!ads || !ads.playing) {\n            // No ads playing.\n            this.clickThrough = null;\n            return;\n        }\n        const linearAd = arrayFind(ads.currentAds ?? [], isLinearAd);\n        if (linearAd === undefined) {\n            // No linear ad\n            this.clickThrough = null;\n            return;\n        }\n        if (linearAd.integration === 'google-ima') {\n            // Google IMA always shows their own clickthrough button.\n            this.clickThrough = null;\n            return;\n        }\n        const clickThrough = linearAd.clickThrough;\n        if (!clickThrough) {\n            // Linear ad has no clickthrough URL.\n            this.clickThrough = null;\n            return;\n        }\n        this.clickThrough = clickThrough;\n    };\n\n    protected override handleClick(): void {\n        this._player?.pause();\n    }\n\n    protected override renderLinkContent(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        return html`<slot>${locale.adClickThroughText}</slot>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-ad-clickthrough-button': AdClickThroughButton;\n    }\n}\n","import { html, type HTMLTemplateResult } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { Button } from '../Button';\nimport adSkipButtonCss from './AdSkipButton.css';\nimport skipNextIcon from '../../icons/skip-next.svg';\nimport { stateReceiver } from '../StateReceiverMixin';\nimport { Attribute } from '../../util/Attribute';\nimport type { Ads, ChromelessPlayer } from 'theoplayer/chromeless';\nimport { arrayFind } from '../../util/CommonUtils';\nimport { isLinearAd } from '../../util/AdUtils';\nimport { getLocale } from '../../i18n';\nimport { toDuration } from '../../util/TimeUtils';\n\nconst AD_EVENTS = ['adbegin', 'adend', 'adloaded', 'updatead', 'adskip'] as const;\n\n/**\n * A button that skips the current advertisement (if skippable).\n * If the ad cannot be skipped yet, it shows the remaining time until it can be skipped.\n *\n * @cssproperty `--theoplayer-ad-skip-background` - The background of the skip button. Defaults to `rgba(0, 0, 0, 0.7)`.\n * @cssproperty `--theoplayer-ad-skip-color` - The text color of the skip button. Defaults to `#fff`.\n * @cssproperty `--theoplayer-ad-skip-border` - The border of the skip button. Defaults to `1px solid rgba(255, 255, 255, 0.5)`.\n * @cssproperty `--theoplayer-ad-skip-hover-background` - The background of the skip button when hovered. Defaults to `rgba(0, 0, 0, 0.9)`.\n * @cssproperty `--theoplayer-ad-skip-hover-color` - The text color of the skip button when hovered. Defaults to `--theoplayer-ad-skip-color`.\n * @cssproperty `--theoplayer-ad-skip-hover-border` - The border of the skip button when hovered. Defaults to `1px solid #fff`.\n * @cssproperty `--theoplayer-ad-skip-countdown-background` - The background of the countdown shown before the ad is skippable. Defaults to `transparent`.\n * @cssproperty `--theoplayer-ad-skip-countdown-color` - The text color of the countdown. Defaults to `--theoplayer-ad-skip-color`.\n * @cssproperty `--theoplayer-ad-skip-countdown-border` - The border of the countdown. Defaults to `1px solid transparent`.\n * @cssproperty `--theoplayer-ad-skip-font-size` - The font size of the skip button text. Defaults to `--theoplayer-text-font-size`.\n * @cssproperty `--theoplayer-ad-skip-line-height` - The line height of the skip button text. Defaults to `--theoplayer-text-content-height`.\n * @cssproperty `--theoplayer-ad-skip-icon-width` - The width of the skip button icon. Defaults to `--theoplayer-control-height`.\n * @cssproperty `--theoplayer-ad-skip-icon-height` - The height of the skip button icon. Defaults to `--theoplayer-control-height`.\n */\n@customElement('theoplayer-ad-skip-button')\n@stateReceiver(['player', 'lang'])\nexport class AdSkipButton extends Button {\n    static styles = [...Button.styles, adSkipButtonCss];\n\n    private _player: ChromelessPlayer | undefined;\n    private _ads: Ads | undefined;\n\n    @state()\n    private accessor _showCountdown: boolean = false;\n\n    @state()\n    private accessor _timeToSkip: number = 0;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    override connectedCallback(): void {\n        super.connectedCallback();\n        this._update();\n    }\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        this._player?.removeEventListener('timeupdate', this._update);\n        this._ads?.removeEventListener(AD_EVENTS, this._onAdChange);\n        this._player = player;\n        this._ads = player?.ads;\n        this._onAdChange();\n        this._ads?.addEventListener(AD_EVENTS, this._onAdChange);\n    }\n\n    protected override handleClick(): void {\n        this._player?.ads?.skip();\n    }\n\n    private readonly _onAdChange = () => {\n        if (this._player?.ads?.playing) {\n            this._player.removeEventListener('timeupdate', this._update);\n            this._player.addEventListener('timeupdate', this._update);\n        } else {\n            this._player?.removeEventListener('timeupdate', this._update);\n        }\n        this._update();\n    };\n\n    private readonly _update = (): void => {\n        const ads = this._player?.ads;\n        if (!ads || !ads.playing) {\n            // No ads playing.\n            this.style.display = 'none';\n            return;\n        }\n        const linearAd = arrayFind(ads.currentAds ?? [], isLinearAd);\n        if (linearAd === undefined) {\n            // No linear ad.\n            this.style.display = 'none';\n            return;\n        }\n        if (linearAd.integration === 'google-ima') {\n            // Google IMA always shows their own skip button.\n            this.style.display = 'none';\n            return;\n        }\n        const skipOffset = linearAd.skipOffset;\n        if (skipOffset === undefined || skipOffset < 0 || (linearAd.duration !== undefined && skipOffset >= linearAd.duration)) {\n            // Linear ad is not skippable.\n            this.style.display = 'none';\n            return;\n        }\n        const currentTime = this._player!.currentTime;\n        if (currentTime < skipOffset) {\n            // Show countdown.\n            this._showCountdown = true;\n            this._timeToSkip = Math.ceil(skipOffset - currentTime);\n            this.style.display = '';\n            this.setAttribute(Attribute.DISABLED, '');\n            this.setAttribute(Attribute.ARIA_LIVE, 'off');\n        } else {\n            // Show skip button.\n            this._showCountdown = false;\n            this.style.display = '';\n            this.removeAttribute(Attribute.DISABLED);\n            this.setAttribute(Attribute.ARIA_LIVE, 'polite');\n        }\n    };\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        const countdownStyles = {\n            visibility: this._showCountdown ? 'visible' : 'hidden'\n        };\n        const skipStyles = {\n            visibility: this._showCountdown ? 'hidden' : 'visible',\n            pointerEvents: this._showCountdown ? 'none' : ''\n        };\n        const timeToSkip = locale.formatNarrowDuration(toDuration(this._timeToSkip));\n        return html`<span part=\"countdown\" style=${styleMap(countdownStyles)}>${locale.adSkipCountdownText(timeToSkip)}</span>\n            <span part=\"skip\" style=${styleMap(skipStyles)}>\n                <span part=\"skip-text\"><slot name=\"skip-text\">${locale.adSkipButtonText}</slot></span>\n                <span part=\"skip-icon\"><slot name=\"skip-icon\">${unsafeSVG(skipNextIcon)}</slot></span>\n            </span>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-ad-skip-button': AdSkipButton;\n    }\n}\n","import type { ChromelessPlayer, TheoLiveApi } from 'theoplayer/chromeless';\nimport { stateReceiver } from '../../StateReceiverMixin';\nimport { RadioButton } from '../../RadioButton';\nimport { property } from 'lit/decorators.js';\nimport { Attribute } from '../../../util/Attribute';\n\n/**\n * A radio button that shows the label of a given video quality, and switches the video track's\n * {@link theoplayer!MediaTrack.targetQuality | target quality} to that quality when clicked.\n */\n@stateReceiver(['player', 'lang'])\nexport abstract class AbstractQualitySelector extends RadioButton {\n    private _player: ChromelessPlayer | undefined;\n    private _theoLive: TheoLiveApi | undefined;\n    protected _badNetworkMode: boolean = false;\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    set player(player: ChromelessPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._theoLive) {\n            this._theoLive.removeEventListener('enterbadnetworkmode', this.handleEnterBadNetworkMode_);\n            this._theoLive.removeEventListener('exitbadnetworkmode', this.handleExitBadNetworkMode_);\n        }\n        this._player = player;\n        this._theoLive = player?.theoLive;\n        this._badNetworkMode = this._theoLive?.badNetworkMode ?? false;\n        if (this._theoLive) {\n            this._theoLive.addEventListener('enterbadnetworkmode', this.handleEnterBadNetworkMode_);\n            this._theoLive.addEventListener('exitbadnetworkmode', this.handleExitBadNetworkMode_);\n        }\n        this.handlePlayer();\n    }\n\n    private readonly handleEnterBadNetworkMode_ = () => {\n        this._badNetworkMode = true;\n        this.handleEnterBadNetworkMode();\n    };\n\n    private readonly handleExitBadNetworkMode_ = () => {\n        this._badNetworkMode = false;\n        this.handleExitBadNetworkMode();\n    };\n\n    handleEnterBadNetworkMode(): void {\n        // do nothing\n    }\n\n    handleExitBadNetworkMode(): void {\n        // do nothing\n    }\n\n    protected abstract handlePlayer(): void;\n}\n","import { AbstractQualitySelector } from './AbstractQualitySelector';\nimport { html, type HTMLTemplateResult } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { getLocale } from '../../../i18n';\n\n@customElement('theolive-automatic-quality-selector')\nexport class AutomaticQualitySelector extends AbstractQualitySelector {\n    handleEnterBadNetworkMode() {\n        this.update_();\n    }\n\n    handleExitBadNetworkMode() {\n        this.update_();\n    }\n\n    protected handlePlayer() {\n        this.update_();\n    }\n\n    private update_() {\n        const newChecked = this.player?.theoLive?.badNetworkMode !== true;\n        if (this.checked !== newChecked) {\n            this.checked = newChecked;\n        }\n    }\n\n    protected handleChange() {\n        if (this.checked && this.player && this.player.theoLive) {\n            this.player.theoLive.badNetworkMode = false;\n        }\n    }\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        return html`<slot>${locale.highQualityLabel}</slot>`;\n    }\n}\n","import { html, type HTMLTemplateResult, type PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport { ChromelessPlayer as TheoPlayer, type TheoLiveApi } from 'theoplayer/chromeless';\nimport badNetworkModeButtonCss from './BadNetworkModeButton.css';\nimport settingsIcon from '../../../icons/settings.svg';\nimport warningIcon from '../../../icons/warning.svg';\nimport { stateReceiver } from '../../StateReceiverMixin';\nimport { MenuButton } from '../../MenuButton';\nimport type { BadNetworkModeMenu } from './BadNetworkModeMenu';\nimport { getLocale } from '../../../i18n';\nimport { Attribute } from '../../../util/Attribute';\n\n/**\n * A menu button that opens a {@link BadNetworkModeMenu}.\n *\n * @attribute `menu` - The ID of the bad network menu.\n */\n@customElement('theolive-bad-network-button')\n@stateReceiver(['player', 'lang'])\nexport class BadNetworkModeButton extends MenuButton {\n    static styles = [...MenuButton.styles, badNetworkModeButtonCss];\n\n    private _player: TheoPlayer | undefined;\n    private _theoLive: TheoLiveApi | undefined;\n\n    @state()\n    private accessor _inBadNetworkMode = false;\n\n    private readonly handleEnterBadNetworkMode_ = () => {\n        this._inBadNetworkMode = true;\n    };\n\n    private readonly handleExitBadNetworkMode_ = () => {\n        this._inBadNetworkMode = false;\n    };\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    accessor lang: string = '';\n\n    get player(): TheoPlayer | undefined {\n        return this._player;\n    }\n\n    @property({ reflect: false, attribute: false })\n    set player(player: TheoPlayer | undefined) {\n        if (this._player === player) {\n            return;\n        }\n        if (this._theoLive) {\n            this._theoLive.removeEventListener('enterbadnetworkmode', this.handleEnterBadNetworkMode_);\n            this._theoLive.removeEventListener('exitbadnetworkmode', this.handleExitBadNetworkMode_);\n        }\n        this._player = player;\n        this._theoLive = player?.theoLive;\n        if (this._theoLive) {\n            this._theoLive.addEventListener('enterbadnetworkmode', this.handleEnterBadNetworkMode_);\n            this._theoLive.addEventListener('exitbadnetworkmode', this.handleExitBadNetworkMode_);\n        }\n    }\n\n    override willUpdate(changedProperties: PropertyValues) {\n        super.willUpdate(changedProperties);\n        this._updateAriaLabel();\n    }\n\n    private _updateAriaLabel(): void {\n        const locale = getLocale(this.lang);\n        this.ariaLabel = locale.openBadNetworkModeMenuAria;\n    }\n\n    protected override render(): HTMLTemplateResult {\n        const warningStyles = {\n            display: this._inBadNetworkMode ? '' : 'none'\n        };\n        return html`<span part=\"icon\"\n            >${unsafeSVG(settingsIcon)}<span part=\"warning-icon\" style=${styleMap(warningStyles)}>${unsafeSVG(warningIcon)}</span></span\n        >`;\n    }\n}\n","import { AbstractQualitySelector } from './AbstractQualitySelector';\nimport { html, type HTMLTemplateResult } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { getLocale } from '../../../i18n';\n\n@customElement('theolive-bad-network-quality-selector')\nexport class BadNetworkModeSelector extends AbstractQualitySelector {\n    handleEnterBadNetworkMode() {\n        this.update_();\n    }\n\n    handleExitBadNetworkMode() {\n        this.update_();\n    }\n\n    protected handlePlayer() {\n        this.update_();\n    }\n\n    private update_() {\n        const newChecked = this.player?.theoLive?.badNetworkMode === true;\n        if (this.checked !== newChecked) {\n            this.checked = newChecked;\n        }\n    }\n\n    protected handleChange(): void {\n        if (this.checked && this.player && this.player.theoLive) {\n            this.player.theoLive.badNetworkMode = true;\n        }\n    }\n\n    protected override render(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        return html`<slot>${locale.lowQualityLabel}</slot>`;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { createRef, ref, type Ref } from 'lit/directives/ref.js';\nimport verticalRadioGroupCss from '../../VerticalRadioGroup.css';\nimport './AutomaticQualitySelector';\nimport './BadNetworkModeSelector';\nimport { RadioGroup } from '../../RadioGroup';\n\n@customElement('theolive-bad-network-menu')\nexport class BadNetworkModeMenu extends LitElement {\n    static styles = [verticalRadioGroupCss];\n\n    private readonly _radioGroupRef: Ref<RadioGroup> = createRef<RadioGroup>();\n\n    protected firstUpdated() {\n        if (this._radioGroupRef.value && !(this._radioGroupRef.value instanceof RadioGroup)) {\n            customElements.upgrade(this._radioGroupRef.value);\n        }\n    }\n\n    private readonly _onChange = () => {\n        this.dispatchEvent(new Event('change', { bubbles: true }));\n    };\n\n    protected override render(): HTMLTemplateResult {\n        return html`<theoplayer-radio-group ${ref(this._radioGroupRef)} @change=${this._onChange}>\n            <theolive-automatic-quality-selector></theolive-automatic-quality-selector>\n            <theolive-bad-network-quality-selector></theolive-bad-network-quality-selector>\n        </theoplayer-radio-group>`;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theolive-bad-network-menu': BadNetworkModeMenu;\n    }\n}\n","import { html, type HTMLTemplateResult, LitElement, type PropertyValues } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { createRef, ref, type Ref } from 'lit/directives/ref.js';\nimport * as shadyCss from '@webcomponents/shadycss';\nimport { ChromelessPlayer, type MediaTrack, type SourceDescription, type UIPlayerConfiguration, type VideoQuality } from 'theoplayer/chromeless';\nimport elementCss from './UIContainer.css';\nimport {\n    arrayFind,\n    arrayRemove,\n    closestRecursive,\n    containsComposedNode,\n    getFocusableChildren,\n    getSlottedElements,\n    getTvFocusChildren,\n    isElement,\n    isHTMLElement,\n    noOp,\n    toggleAttribute\n} from './util/CommonUtils';\nimport { forEachStateReceiverElement, type StateReceiverElement, StateReceiverProps } from './components/StateReceiverMixin';\nimport { TOGGLE_MENU_EVENT, type ToggleMenuEvent } from './events/ToggleMenuEvent';\nimport { ENTER_FULLSCREEN_EVENT, type EnterFullscreenEvent } from './events/EnterFullscreenEvent';\nimport { EXIT_FULLSCREEN_EVENT, type ExitFullscreenEvent } from './events/ExitFullscreenEvent';\nimport { fullscreenAPI } from './util/FullscreenUtils';\nimport { Attribute } from './util/Attribute';\nimport { isIOS, isMobile, isTv } from './util/Environment';\nimport { Rectangle } from './util/GeometryUtils';\nimport { PREVIEW_TIME_CHANGE_EVENT, type PreviewTimeChangeEvent } from './events/PreviewTimeChangeEvent';\nimport type { StreamType } from './util/StreamType';\nimport type { StreamTypeChangeEvent } from './events/StreamTypeChangeEvent';\nimport { STREAM_TYPE_CHANGE_EVENT } from './events/StreamTypeChangeEvent';\nimport { USER_IDLE_CHANGE_EVENT } from './events/UserIdleChangeEvent';\nimport { createCustomEvent } from './util/EventUtils';\nimport { getTargetQualities } from './util/TrackUtils';\nimport { MenuGroup } from './components/MenuGroup';\nimport type { DeviceType } from './util/DeviceType';\nimport { getFocusedChild, navigateByArrowKey } from './util/KeyboardNavigation';\nimport { isArrowKey, isBackKey, KeyCode } from './util/KeyCode';\nimport { READY_EVENT } from './events/ReadyEvent';\nimport { addGlobalStyles } from './Global';\nimport { ACCIDENTAL_CLICK_DELAY } from './util/Constants';\nimport { type addLocale, type Locale } from './i18n';\n\n// Load components used in template\nimport './components/GestureReceiver';\n\nexport const DEFAULT_USER_IDLE_TIMEOUT = 2;\nexport const DEFAULT_TV_USER_IDLE_TIMEOUT = 5;\nexport const DEFAULT_DVR_THRESHOLD = 60;\nexport const FULL_WINDOW_ROOT_CLASS = 'theoplayer-ui-full-window';\n\n/**\n * The container element for a THEOplayer UI.\n *\n * This element provides a basic layout structure for a general player UI, and handles the creation and management\n * of a {@link theoplayer!ChromelessPlayer | THEOplayer player instance} for this UI.\n *\n * ## Usage\n *\n * 1. Create a `<theoplayer-ui>` element.\n * 2. Place your UI elements as children of the `<theoplayer-ui>`.\n *    Set their `slot` attribute to one of the defined slots (see below) to place them in the layout.\n * 3. Set its `configuration` attribute or property to a valid player configuration.\n * 4. Set its `source` attribute or property to a valid stream source.\n *\n * ## Customization\n *\n * This element does not provide any UI elements by default, you need to add all elements as children of\n * the `<theoplayer-ui>` element. If you're looking for a simple out-of-the-box player experience instead,\n * see {@link DefaultUI | `<theoplayer-default-ui>`}.\n *\n * The styling can be controlled using CSS custom properties (see below).\n *\n * @slot `(no` name, default slot) - A slot for controls at the bottom of the player.\n *   Can be used for controls such as a play button ({@link PlayButton | `<theoplayer-play-button>`}) or a seek bar\n *   ({@link TimeRange | `<theoplayer-time-range>`}).\n * @slot `top-chrome` - A slot for controls at the top of the player.\n *   Can be used to display the stream's title, or for a cast button ({@link ChromecastButton | `<theoplayer-chromecast-button>`}).\n * @slot `middle-chrome` - A slot for controls in the middle of the player (between the top and bottom chrome).\n * @slot `centered-chrome` - A slot for controls in the center of the player, layered on top of other controls.\n * @slot `centered-loading` - A slot for a loading indicator in the center of the player, layered on top of other controls\n *   but behind the centered chrome.\n * @slot `menu` - A slot for extra menus (see {@link Menu | `<theoplayer-menu>`}).\n * @slot `error` - A slot for an error display, to show when the player encounters a fatal error\n *   (see {@link ErrorDisplay | `<theoplayer-error-display>`}).\n *\n * @cssproperty `--theoplayer-min-width` - The minimum width of the player. Defaults to `300px`.\n * @cssproperty `--theoplayer-height` - The height of the player. Defaults to `unset`.\n *   Ignored when `--theoplayer-aspect-ratio` is set.\n * @cssproperty `--theoplayer-aspect-ratio` - The aspect ratio of the player. Defaults to `16 / 9`.\n *   When {@link fluid} is set, this is automatically set to the video's natural aspect ratio.\n *   Set this to `none` (or any invalid `<length>`) to disable, for example when you want to use `--theoplayer-height` instead.\n * @cssproperty `--theoplayer-background` - The background color of the player. Defaults to `#000`.\n * @cssproperty `--theoplayer-text-color` - The text color of a control. Defaults to `#fff`.\n * @cssproperty `--theoplayer-text-font-size` - The font size of any text inside a control. Defaults to `14px`.\n * @cssproperty `--theoplayer-control-height` - The height of a control. Defaults to `24px`.\n * @cssproperty `--theoplayer-control-padding` - The padding around a control. Defaults to `10px`.\n * @cssproperty `--theoplayer-video-border-radius` - The border radius of the `<video>` element. Defaults to `0`.\n * @cssproperty `--theoplayer-video-object-fit` - The `object-fit` of the `<video>` element. Defaults to `contain`.\n * @cssproperty `--theoplayer-control-backdrop-background` - The background shown behind all controls. Defaults to `transparent`.\n * @cssproperty `--theoplayer-menu-backdrop-background` - The background of the menu layer. Defaults to `rgba(0, 0, 0, 0.5)`.\n * @cssproperty `--theoplayer-menu-layer-padding` - Padding of the menu layer. Defaults to `10px`.\n * @cssproperty `--theoplayer-menu-min-width` - Minimum width of the menu (desktop). Defaults to `200px`.\n * @cssproperty `--theoplayer-error-background` - The background of the error layer shown when the player has a fatal error. Defaults to `rgba(0, 0, 0, 0.5)`.\n */\n@customElement('theoplayer-ui')\nexport class UIContainer extends LitElement {\n    static override styles = [elementCss];\n    static override shadowRootOptions: ShadowRootInit = {\n        ...LitElement.shadowRootOptions,\n        delegatesFocus: true\n    };\n\n    /**\n     * Fired when the backing player is created, and the {@link UIContainer.player} property is set.\n     *\n     * @group Events\n     */\n    static READY_EVENT: typeof READY_EVENT = READY_EVENT;\n\n    private _configuration: UIPlayerConfiguration = {};\n    private readonly _playerRef: Ref<HTMLElement> = createRef<HTMLElement>();\n    private readonly _menuRef: Ref<HTMLElement> = createRef<HTMLElement>();\n    private readonly _menuGroupRef: Ref<MenuGroup> = createRef<MenuGroup>();\n    private _menuOpened: boolean = false;\n    private _menuOpener: HTMLElement | undefined;\n    private readonly _topChromeRef: Ref<HTMLElement> = createRef<HTMLElement>();\n    private readonly _topChromeSlotRef: Ref<HTMLSlotElement> = createRef<HTMLSlotElement>();\n    private readonly _bottomChromeRef: Ref<HTMLElement> = createRef<HTMLElement>();\n    private readonly _bottomChromeSlotRef: Ref<HTMLSlotElement> = createRef<HTMLSlotElement>();\n\n    private _pointerType: string = '';\n    private _lastPointerUpTime: number = 0;\n    private readonly _mutationObserver: MutationObserver;\n    private readonly _resizeObserver: ResizeObserver | undefined;\n    private readonly _stateReceivers: StateReceiverElement[] = [];\n    private _player: ChromelessPlayer | undefined = undefined;\n    private _source: SourceDescription | undefined = undefined;\n    private _muted: boolean = false;\n    private _autoplay: boolean = false;\n    private _fullscreen: boolean = false;\n    private _deviceType: DeviceType = 'desktop';\n    private _streamType: StreamType = 'vod';\n    private _fluid: boolean = false;\n    private _language: string = '';\n    private _userIdle: boolean = false;\n    private _userIdleTimeout: number | undefined = undefined;\n    private _isUserActive: boolean = false;\n    private _userIdleTimer: number = 0;\n    private _paused: boolean = false;\n    private _ended: boolean = false;\n    private _casting: boolean = false;\n    private _dvrThreshold: number = DEFAULT_DVR_THRESHOLD;\n    private _previewTime: number = NaN;\n    private _activeVideoTrack: MediaTrack | undefined = undefined;\n\n    /**\n     * Creates a new THEOplayer UI container element.\n     *\n     * @param configuration - The player configuration.\n     *   Will be passed to the {@link theoplayer!ChromelessPlayer | ChromelessPlayer} constructor to create\n     *   the underlying THEOplayer instance.\n     *   Can also be set later on through the {@link UIContainer.configuration} property.\n     */\n    constructor(configuration: UIPlayerConfiguration = {}) {\n        super();\n        this._configuration = configuration;\n\n        this._mutationObserver = new MutationObserver(this._onMutation);\n        if (typeof ResizeObserver !== 'undefined') {\n            this._resizeObserver = new ResizeObserver(this._updateTextTrackMargins);\n        }\n\n        this.tryInitializePlayer_();\n    }\n\n    /**\n     * The underlying THEOplayer player instance.\n     *\n     * This is constructed automatically as soon as a valid {@link configuration} is set.\n     */\n    get player(): ChromelessPlayer | undefined {\n        return this._player;\n    }\n\n    /**\n     * The player configuration.\n     *\n     * Used to create the underlying THEOplayer instance.\n     */\n    get configuration(): UIPlayerConfiguration {\n        return this._configuration;\n    }\n\n    @property({\n        reflect: false,\n        attribute: Attribute.CONFIGURATION,\n        converter: {\n            fromAttribute: (value: string | null) => (value ? (JSON.parse(value) as UIPlayerConfiguration) : {})\n        }\n    })\n    set configuration(playerConfiguration: UIPlayerConfiguration) {\n        this._setConfiguration(playerConfiguration);\n    }\n\n    private _setConfiguration(playerConfiguration: UIPlayerConfiguration): void {\n        this._configuration = playerConfiguration ?? {};\n        this.tryInitializePlayer_();\n    }\n\n    /**\n     * The player's current source.\n     */\n    get source(): SourceDescription | undefined {\n        return this._player ? this._player.source : this._source;\n    }\n\n    @property({\n        reflect: false,\n        attribute: Attribute.SOURCE,\n        converter: {\n            fromAttribute: (value: string | null) => (value ? (JSON.parse(value) as SourceDescription) : undefined)\n        }\n    })\n    set source(value: SourceDescription | undefined) {\n        this._setSource(value);\n    }\n\n    private _setSource(value: SourceDescription | undefined): void {\n        if (this._player) {\n            this._player.source = value;\n        } else {\n            this._source = value;\n        }\n    }\n\n    /**\n     * Whether to automatically adjusts the player's height to fit the video's aspect ratio.\n     */\n    get fluid(): boolean {\n        return this._fluid;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.FLUID })\n    set fluid(value: boolean) {\n        this._fluid = value;\n        this._updateAspectRatio();\n    }\n\n    /**\n     * The language of this element.\n     *\n     * When set, this also updates the {@link Locale} of the UI if one is registered with {@link addLocale}.\n     *\n     * @see {@link HTMLElement.lang}\n     */\n    get lang(): string {\n        return this._language;\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    set lang(value: string | null) {\n        this._language = value ?? '';\n        for (const receiver of this._stateReceivers) {\n            if (receiver[StateReceiverProps].indexOf('lang') >= 0) {\n                receiver.lang = this._language;\n            }\n        }\n    }\n\n    /**\n     * Whether the player's audio is muted.\n     */\n    get muted(): boolean {\n        return this._muted;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.MUTED })\n    set muted(value: boolean) {\n        this._muted = value;\n        if (this._player && this._player.muted !== value) {\n            this._player.muted = value;\n        }\n    }\n\n    /**\n     * Whether the player should attempt to automatically start playback.\n     */\n    get autoplay(): boolean {\n        return this._autoplay;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.AUTOPLAY })\n    set autoplay(value: boolean) {\n        this._autoplay = value;\n        if (this._player && this._player.autoplay !== value) {\n            this._player.autoplay = value;\n        }\n    }\n\n    /**\n     * Whether the UI is in fullscreen mode.\n     */\n    get fullscreen(): boolean {\n        return this._fullscreen;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.FULLSCREEN })\n    private set fullscreen(value: boolean) {\n        if (this._fullscreen === value) return;\n        this._fullscreen = value;\n        for (const receiver of this._stateReceivers) {\n            if (receiver[StateReceiverProps].indexOf('fullscreen') >= 0) {\n                receiver.fullscreen = value;\n            }\n        }\n    }\n\n    /**\n     * Whether the player is paused.\n     *\n     * This reflects `player.paused`\n     */\n    get paused(): boolean {\n        return this._paused;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.PAUSED })\n    private set paused(value: boolean) {\n        this._paused = value;\n        this.updateUserIdle_();\n    }\n\n    /**\n     * Whether the player is ended.\n     *\n     * This reflects `player.ended`\n     */\n    get ended(): boolean {\n        return this._ended;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.ENDED })\n    private set ended(value: boolean) {\n        this._ended = value;\n    }\n\n    /**\n     * Whether the player is casting to a remote receiver.\n     *\n     * This reflects `player.cast.casting`\n     */\n    get casting(): boolean {\n        return this._casting;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.CASTING })\n    private set casting(value: boolean) {\n        this._casting = value;\n        this.updateUserIdle_();\n    }\n\n    /**\n     * Whether the user has stopped interacting with the UI and is considered to be \"idle\".\n     */\n    get userIdle(): boolean {\n        return this._userIdle;\n    }\n\n    @property({ reflect: true, type: Boolean, attribute: Attribute.USER_IDLE })\n    private set userIdle(value: boolean) {\n        if (this._userIdle === value) return;\n        this._userIdle = value;\n        this.dispatchEvent(createCustomEvent(USER_IDLE_CHANGE_EVENT));\n    }\n\n    /**\n     * The timeout (in seconds) between when the user stops interacting with the UI,\n     * and when the user is considered to be \"idle\".\n     */\n    get userIdleTimeout(): number {\n        return this._userIdleTimeout ?? (this.deviceType === 'tv' ? DEFAULT_TV_USER_IDLE_TIMEOUT : DEFAULT_USER_IDLE_TIMEOUT);\n    }\n\n    @property({ reflect: true, type: Number, attribute: Attribute.USER_IDLE_TIMEOUT, useDefault: true })\n    set userIdleTimeout(value: number | undefined) {\n        this._userIdleTimeout = value === undefined || isNaN(value) ? undefined : value;\n    }\n\n    /**\n     * The device type, either \"desktop\", \"mobile\" or \"tv\".\n     */\n    get deviceType(): DeviceType {\n        return this._deviceType;\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.DEVICE_TYPE })\n    set deviceType(value: DeviceType) {\n        if (this._deviceType === value) return;\n        this._deviceType = value;\n        this.mobile = value === 'mobile';\n        this.tv = value === 'tv';\n\n        window.removeEventListener('keydown', this._onTvKeyDown);\n        if (value === 'tv') {\n            window.addEventListener('keydown', this._onTvKeyDown);\n        }\n\n        for (const receiver of this._stateReceivers) {\n            if (receiver[StateReceiverProps].indexOf('deviceType') >= 0) {\n                receiver.deviceType = value;\n            }\n        }\n    }\n\n    /**\n     * Whether the user is on a mobile device.\n     *\n     * Equivalent to `deviceType == \"mobile\"`.\n     */\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.MOBILE })\n    private accessor mobile: boolean = false;\n\n    /**\n     * Whether the user is on a TV device.\n     *\n     * Equivalent to `deviceType == \"tv\"`.\n     */\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.TV })\n    private accessor tv: boolean = false;\n\n    /**\n     * The stream type, either \"vod\", \"live\" or \"dvr\".\n     *\n     * If you know in advance that the source will be a livestream, you can set this property to avoid a screen flicker\n     * when the player switches between its VOD-specific and live-only controls.\n     */\n    get streamType(): StreamType {\n        return this._streamType;\n    }\n\n    /**\n     * @deprecated use {@link SourceDescription.streamType} instead.\n     */\n    @property({ reflect: true, type: String, attribute: Attribute.STREAM_TYPE })\n    set streamType(streamType: StreamType) {\n        if (this._streamType === streamType) return;\n        this._streamType = streamType;\n        for (const receiver of this._stateReceivers) {\n            if (receiver[StateReceiverProps].indexOf('streamType') >= 0) {\n                receiver.streamType = streamType;\n            }\n        }\n        const streamTypeChangeEvent: StreamTypeChangeEvent = createCustomEvent(STREAM_TYPE_CHANGE_EVENT, {\n            bubbles: true,\n            composed: true,\n            detail: { streamType: streamType }\n        });\n        this.dispatchEvent(streamTypeChangeEvent);\n    }\n\n    /**\n     * The minimum length (in seconds) of a livestream's sliding window for the stream to be DVR\n     * and its stream type to be set to \"dvr\".\n     */\n    get dvrThreshold(): number {\n        return this._dvrThreshold;\n    }\n\n    @property({ reflect: true, type: Number, attribute: Attribute.DVR_THRESHOLD, useDefault: true })\n    set dvrThreshold(value: number) {\n        this._dvrThreshold = isNaN(value) ? 0 : value;\n        this._updateStreamType();\n    }\n\n    /**\n     * Whether the player has (previously) started playback for this stream.\n     *\n     * Can be used in CSS to show/hide certain initial controls, such as a poster image or a centered play button.\n     */\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.HAS_FIRST_PLAY })\n    private accessor _hasFirstPlay: boolean = false;\n\n    /**\n     * Whether the player is playing a linear ad.\n     *\n     * This reflects `player.ads.playing`.\n     */\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.PLAYING_AD })\n    private accessor _isPlayingAd: boolean = false;\n\n    /**\n     * Whether the player has encountered a fatal error.\n     */\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.HAS_ERROR })\n    private accessor _hasError: boolean = false;\n\n    /**\n     * Whether the player is in \"full window\" mode,\n     * as a fallback when the player cannot use the \"native\" fullscreen mode.\n     */\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.FULLWINDOW })\n    private accessor _isFullWindow: boolean = false;\n\n    connectedCallback(): void {\n        super.connectedCallback();\n        addGlobalStyles();\n\n        if (!this.hasAttribute(Attribute.LANG)) {\n            this.lang = closestRecursive<HTMLElement>(this, '[lang]')?.lang ?? '';\n        }\n        if (!this.hasAttribute(Attribute.DEVICE_TYPE)) {\n            this.deviceType = isMobile() ? 'mobile' : isTv() ? 'tv' : 'desktop';\n        }\n        if (!this.hasAttribute(Attribute.PAUSED)) {\n            this.paused = true;\n        }\n\n        this.tryInitializePlayer_();\n\n        for (const receiver of this._stateReceivers) {\n            this.propagateStateToReceiver_(receiver);\n        }\n        this._mutationObserver.observe(this, { childList: true, subtree: true });\n        this.shadowRoot!.addEventListener('slotchange', this._onSlotChange);\n\n        this._resizeObserver?.observe(this);\n        this._updateTextTrackMargins();\n\n        if (fullscreenAPI !== undefined) {\n            document.addEventListener(fullscreenAPI.fullscreenchange_, this._onFullscreenChange);\n            document.addEventListener(fullscreenAPI.fullscreenerror_, this._onFullscreenChange);\n            this._onFullscreenChange();\n        }\n\n        this.setUserIdle_();\n        if (this.deviceType === 'tv') {\n            window.addEventListener('keydown', this._onTvKeyDown);\n        }\n        if (this._isFullWindow) {\n            window.addEventListener('keydown', this._exitFullscreenOnEsc);\n        }\n        this.addEventListener('keyup', this._onKeyUp);\n        this.addEventListener('pointerup', this._onPointerUp);\n        this.addEventListener('pointermove', this._onPointerMove);\n        this.addEventListener('mouseleave', this._onMouseLeave);\n    }\n\n    private tryInitializePlayer_(): void {\n        if (this._player !== undefined) {\n            return;\n        }\n        if (this._playerRef.value === undefined) {\n            return;\n        }\n        if (this._configuration.license === undefined && this._configuration.licenseUrl === undefined) {\n            return;\n        }\n\n        this._player = new ChromelessPlayer(this._playerRef.value, this._configuration);\n        if (this._source) {\n            this._player.source = this._source;\n            this._source = undefined;\n        }\n        if (this._player.muted !== this.muted) {\n            this._player.muted = this.muted;\n        }\n        if (this._player.autoplay !== this.autoplay) {\n            this._player.autoplay = this.autoplay;\n        }\n\n        this._updateAspectRatio();\n        this._updateError();\n        this._updatePausedAndEnded();\n        this._updateCasting();\n        this.addPlayerListeners_(this._player);\n        this.propagatePlayerToAllReceivers_();\n\n        this.dispatchEvent(createCustomEvent(READY_EVENT));\n    }\n\n    protected override createRenderRoot(): HTMLElement | DocumentFragment {\n        const root = super.createRenderRoot();\n        root.addEventListener(TOGGLE_MENU_EVENT, this._onToggleMenu);\n        root.addEventListener(ENTER_FULLSCREEN_EVENT, this._onEnterFullscreen);\n        root.addEventListener(EXIT_FULLSCREEN_EVENT, this._onExitFullscreen);\n        root.addEventListener(PREVIEW_TIME_CHANGE_EVENT, this._onPreviewTimeChange);\n        return root;\n    }\n\n    protected override firstUpdated() {\n        if (this._menuGroupRef.value && !(this._menuGroupRef instanceof MenuGroup)) {\n            customElements.upgrade(this._menuGroupRef.value);\n        }\n\n        this.tryInitializePlayer_();\n\n        if (this._playerRef.value) {\n            void forEachStateReceiverElement(this, this._playerRef.value, this.registerStateReceiver_);\n        }\n    }\n\n    protected override updated(): void {\n        // Update the text track margins after the relevant attributes have been reflected to the DOM.\n        this._updateTextTrackMargins();\n    }\n\n    disconnectedCallback(): void {\n        super.disconnectedCallback();\n\n        this._resizeObserver?.disconnect();\n        this._mutationObserver.disconnect();\n        this.shadowRoot!.removeEventListener('slotchange', this._onSlotChange);\n\n        if (fullscreenAPI !== undefined) {\n            document.removeEventListener(fullscreenAPI.fullscreenchange_, this._onFullscreenChange);\n            document.removeEventListener(fullscreenAPI.fullscreenerror_, this._onFullscreenChange);\n        }\n\n        window.removeEventListener('keydown', this._onTvKeyDown);\n        window.removeEventListener('keydown', this._exitFullscreenOnEsc);\n        this.removeEventListener('keyup', this._onKeyUp);\n        this.removeEventListener('pointerup', this._onPointerUp);\n        this.removeEventListener('click', this._onClickAfterPointerUp, true);\n        this.removeEventListener('pointermove', this._onPointerMove);\n        this.removeEventListener('mouseleave', this._onMouseLeave);\n\n        if (this._player) {\n            this.removePlayerListeners_(this._player);\n            this._player.destroy();\n            this._player = undefined;\n            this.propagatePlayerToAllReceivers_();\n        }\n\n        this._stateReceivers.length = 0;\n    }\n\n    private readonly _onMutation = (mutations: MutationRecord[]): void => {\n        const playerElement = this._playerRef.value;\n        if (!playerElement) return;\n        for (const mutation of mutations) {\n            if (mutation.type === 'childList') {\n                const { addedNodes, removedNodes } = mutation;\n                for (let i = 0; i < addedNodes.length; i++) {\n                    const node = addedNodes[i];\n                    if (isElement(node)) {\n                        void forEachStateReceiverElement(node, playerElement, this.registerStateReceiver_);\n                    }\n                }\n                for (let i = 0; i < removedNodes.length; i++) {\n                    const node = removedNodes[i];\n                    if (isElement(node)) {\n                        void forEachStateReceiverElement(node, playerElement, this.unregisterStateReceiver_);\n                    }\n                }\n            }\n        }\n    };\n\n    private readonly _onSlotChange = (): void => {\n        if (this._playerRef.value) {\n            void forEachStateReceiverElement(this, this._playerRef.value, this.registerStateReceiver_);\n        }\n        this._updateTextTrackMargins();\n    };\n\n    private readonly registerStateReceiver_ = (receiver: StateReceiverElement): void => {\n        if (this._stateReceivers.indexOf(receiver) >= 0) {\n            return;\n        }\n        this._stateReceivers.push(receiver);\n        this.propagateStateToReceiver_(receiver);\n    };\n\n    private readonly unregisterStateReceiver_ = (receiver: StateReceiverElement): void => {\n        if (!arrayRemove(this._stateReceivers, receiver)) {\n            return;\n        }\n        this.removeStateFromReceiver_(receiver);\n    };\n\n    private propagateStateToReceiver_(receiver: StateReceiverElement): void {\n        const receiverProps = receiver[StateReceiverProps];\n        if (receiverProps.indexOf('player') >= 0) {\n            receiver.player = this._player;\n        }\n        if (receiverProps.indexOf('lang') >= 0) {\n            receiver.lang = this.lang;\n        }\n        if (receiverProps.indexOf('fullscreen') >= 0) {\n            receiver.fullscreen = this.fullscreen;\n        }\n        if (receiverProps.indexOf('deviceType') >= 0) {\n            receiver.deviceType = this.deviceType;\n        }\n        if (receiverProps.indexOf('streamType') >= 0) {\n            receiver.streamType = this.streamType;\n        }\n        if (this._player !== undefined) {\n            if (receiverProps.indexOf('playbackRate') >= 0) {\n                receiver.playbackRate = this._player.playbackRate;\n            }\n            if (receiverProps.indexOf('error') >= 0) {\n                receiver.error = this._player.errorObject;\n            }\n            if (receiverProps.indexOf('activeVideoQuality') >= 0) {\n                receiver.activeVideoQuality = this._activeVideoTrack?.activeQuality as VideoQuality | undefined;\n            }\n            if (receiverProps.indexOf('targetVideoQualities') >= 0) {\n                receiver.targetVideoQualities = getTargetQualities(this._activeVideoTrack) as VideoQuality[] | undefined;\n            }\n        }\n        if (receiverProps.indexOf('previewTime') >= 0) {\n            receiver.previewTime = this._previewTime;\n        }\n    }\n\n    private propagatePlayerToAllReceivers_(): void {\n        for (const receiver of this._stateReceivers) {\n            const receiverProps = receiver[StateReceiverProps];\n            if (receiverProps.indexOf('player') >= 0) {\n                receiver.player = this._player;\n            }\n        }\n    }\n\n    private removeStateFromReceiver_(receiver: StateReceiverElement): void {\n        const receiverProps = receiver[StateReceiverProps];\n        if (receiverProps.indexOf('player') >= 0) {\n            receiver.player = undefined;\n        }\n    }\n\n    /**\n     * Whether any {@link Menu | menu} is currently open.\n     */\n    private get menuOpened_(): boolean {\n        return this._menuOpened;\n    }\n\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.MENU_OPENED })\n    private set menuOpened_(menuOpened: boolean) {\n        if (this._menuOpened === menuOpened) return;\n        this._menuOpened = menuOpened;\n        // Toggle manually, so the menu layer immediately becomes visible and can receive focus.\n        toggleAttribute(this, Attribute.MENU_OPENED, menuOpened);\n    }\n\n    private openMenu_(menuToOpen: string, opener: HTMLElement | undefined): void {\n        const topChromeRect = Rectangle.fromRect(this._topChromeRef.value!.getBoundingClientRect());\n        const bottomChromeRect = Rectangle.fromRect(this._bottomChromeRef.value!.getBoundingClientRect());\n\n        // Open menu in same quadrant as its opener\n        // If there's no opener, open in bottom right corner by default\n        let alignBottom: boolean = true;\n        let alignRight: boolean = true;\n        if (opener !== undefined) {\n            const playerRect = Rectangle.fromRect(this.getBoundingClientRect());\n            const openerRect = Rectangle.fromRect(opener.getBoundingClientRect());\n            if (playerRect.width > 0 && playerRect.height > 0) {\n                alignBottom = openerRect.top >= playerRect.top + playerRect.height / 2;\n                alignRight = openerRect.left >= playerRect.left + playerRect.width / 2;\n            }\n        }\n\n        this._menuGroupRef.value!.openMenu(menuToOpen, opener);\n        this._menuOpener = opener;\n\n        const props = {\n            '--theoplayer-menu-offset-top': `${Math.round(topChromeRect.height)}px`,\n            '--theoplayer-menu-offset-bottom': `${Math.round(bottomChromeRect.height)}px`,\n            '--theoplayer-menu-margin-top': alignBottom ? 'auto' : '0',\n            '--theoplayer-menu-margin-bottom': alignBottom ? '0' : 'auto',\n            '--theoplayer-menu-margin-left': alignRight ? 'auto' : '0',\n            '--theoplayer-menu-margin-right': alignRight ? '0' : 'auto'\n        };\n        shadyCss.styleSubtree(this, props);\n    }\n\n    private closeMenu_(): void {\n        // Menu group might not be upgraded yet\n        this._menuGroupRef.value?.closeMenu?.();\n        this._menuOpener?.focus();\n        this._menuOpener = undefined;\n    }\n\n    private readonly _onToggleMenu = (rawEvent: Event): void => {\n        const event = rawEvent as ToggleMenuEvent;\n        event.stopPropagation();\n        const menuId = event.detail.menu;\n        const menuGroup = this._menuGroupRef.value;\n        if (!menuGroup) return;\n        if (!menuGroup.getMenuById(menuId)) {\n            console.error(`<theoplayer-ui>: cannot find menu with ID \"${menuId}\"`);\n            return;\n        }\n        const opener = isHTMLElement(event.target) ? event.target : undefined;\n        if (menuGroup.isMenuOpen(menuId)) {\n            this.closeMenu_();\n        } else {\n            // Always close the previous menu first\n            this.closeMenu_();\n            this.openMenu_(menuId, opener);\n        }\n    };\n\n    private readonly _onCloseMenu = (event: Event): void => {\n        event.stopPropagation();\n        this.closeMenu_();\n    };\n\n    private readonly _onMenuChange = (): void => {\n        const menuEl = this._menuRef.value!;\n        menuEl.removeEventListener('pointerdown', this._onMenuPointerDown);\n        menuEl.removeEventListener('click', this._onMenuClick);\n        if (this._menuGroupRef.value!.hasCurrentMenu()) {\n            menuEl.addEventListener('pointerdown', this._onMenuPointerDown);\n            menuEl.addEventListener('click', this._onMenuClick);\n            this.menuOpened_ = true;\n        } else {\n            this.menuOpened_ = false;\n        }\n        this.updateUserIdle_();\n    };\n\n    private readonly _onMenuPointerDown = (event: PointerEvent) => {\n        this._pointerType = event.pointerType;\n    };\n\n    private readonly _onMenuClick = (event: MouseEvent) => {\n        // If the browser doesn't support yet `pointerType` on `click` events,\n        // we use the type from the previous `pointerdown` event.\n        const pointerType = (event as PointerEvent).pointerType ?? this._pointerType;\n        if (event.target === this._menuRef.value && pointerType === 'mouse') {\n            // Close menu when clicking (with mouse) on menu backdrop\n            if (this._menuGroupRef.value!.closeCurrentMenu()) {\n                event.preventDefault();\n            }\n        }\n    };\n\n    private readonly _onEnterFullscreen = (rawEvent: Event): void => {\n        const event = rawEvent as EnterFullscreenEvent;\n        event.stopPropagation();\n        this._enterFullscreen();\n    };\n\n    private _enterFullscreen(): void {\n        if (fullscreenAPI && document[fullscreenAPI.fullscreenEnabled_] && this[fullscreenAPI.requestFullscreen_]) {\n            const promise = this[fullscreenAPI.requestFullscreen_]({\n                navigationUI: 'hide',\n                ...this._configuration?.ui?.fullscreenOptions\n            });\n            if (promise && promise.then) {\n                promise.then(noOp, noOp);\n            }\n        } else if (this._player && this._player.presentation.supportsMode('fullscreen')) {\n            this._player.presentation.requestMode('fullscreen');\n        } else if (!this._isFullWindow) {\n            this._isFullWindow = true;\n            document.documentElement.classList.add(FULL_WINDOW_ROOT_CLASS);\n            window.addEventListener('keydown', this._exitFullscreenOnEsc);\n            this._onFullscreenChange();\n        }\n    }\n\n    private readonly _onExitFullscreen = (rawEvent: Event): void => {\n        const event = rawEvent as ExitFullscreenEvent;\n        event.stopPropagation();\n        this._exitFullscreen();\n    };\n\n    private _exitFullscreen(): void {\n        if (fullscreenAPI) {\n            const promise = document[fullscreenAPI.exitFullscreen_]();\n            if (promise && promise.then) {\n                promise.then(noOp, noOp);\n            }\n        }\n        if (this._player && this._player.presentation.currentMode === 'fullscreen') {\n            this._player.presentation.requestMode('inline');\n        }\n        if (this._isFullWindow) {\n            this._isFullWindow = false;\n            document.documentElement.classList.remove(FULL_WINDOW_ROOT_CLASS);\n            window.removeEventListener('keydown', this._exitFullscreenOnEsc);\n            this._onFullscreenChange();\n        }\n    }\n\n    /**\n     * On iOS, presenting stereoscopic VR requires the player to fill the screen.\n     */\n    private _vrFullscreen: boolean = false;\n    private _vrWasFullscreen: boolean = false;\n\n    private readonly _onVrStateChange = (): void => {\n        if (!isIOS()) {\n            return;\n        }\n        const presenting = this._player?.vr?.state === 'presenting';\n        if (presenting && !this._vrFullscreen) {\n            this._vrFullscreen = true;\n            this._vrWasFullscreen = this.fullscreen;\n            if (!this.fullscreen) {\n                this._enterFullscreen();\n            }\n        } else if (!presenting && this._vrFullscreen) {\n            this._vrFullscreen = false;\n            if (!this._vrWasFullscreen) {\n                this._exitFullscreen();\n            }\n        }\n    };\n\n    private readonly _onFullscreenChange = (): void => {\n        let isFullscreen: boolean = false;\n        if (fullscreenAPI !== undefined) {\n            const fullscreenElement = document[fullscreenAPI.fullscreenElement_];\n            if (fullscreenElement) {\n                // If <theoplayer-ui> is nested within another custom element,\n                // then document.fullscreenElement will equal that other custom element.\n                // Look for the nearest shadow host that is contained in the fullscreen element.\n                isFullscreen = containsComposedNode(fullscreenElement, this);\n            }\n        }\n        if (!isFullscreen && this._player !== undefined && this._player.presentation.currentMode === 'fullscreen') {\n            isFullscreen = true;\n        }\n        if (this._isFullWindow) {\n            isFullscreen = true;\n        }\n        this.fullscreen = isFullscreen;\n    };\n\n    private readonly _exitFullscreenOnEsc = (event: KeyboardEvent): void => {\n        if (event.keyCode == KeyCode.ESCAPE) {\n            this._onExitFullscreen(event);\n        }\n    };\n\n    private readonly _updateAspectRatio = (): void => {\n        if (this._player === undefined) {\n            return;\n        }\n        const { videoWidth, videoHeight } = this._player;\n        if (videoWidth > 0 && videoHeight > 0) {\n            shadyCss.styleSubtree(this, {\n                '--theoplayer-video-width': `${videoWidth}`,\n                '--theoplayer-video-height': `${videoHeight}`\n            });\n        } else {\n            shadyCss.styleSubtree(this, {\n                '--theoplayer-video-width': '',\n                '--theoplayer-video-height': ''\n            });\n        }\n    };\n\n    private readonly _updateError = (): void => {\n        const error = this._player?.errorObject;\n        this._hasError = error !== undefined;\n        for (const receiver of this._stateReceivers) {\n            if (receiver[StateReceiverProps].indexOf('error') >= 0) {\n                receiver.error = error;\n            }\n        }\n    };\n\n    private readonly _onPlay = (): void => {\n        this._hasFirstPlay = true;\n        this.paused = false;\n        this._updateEnded();\n    };\n\n    private readonly _onPause = (): void => {\n        this.paused = true;\n        this._updateEnded();\n    };\n\n    private readonly _updatePausedAndEnded = (): void => {\n        this.paused = this._player ? this._player.paused : true;\n        this._updateEnded();\n    };\n\n    private readonly _updateEnded = (): void => {\n        this.ended = this._player ? this._player.ended : false;\n    };\n\n    private readonly _updateStreamType = (): void => {\n        if (this._player === undefined) {\n            return;\n        }\n        this.streamType = this.computeStreamType_();\n    };\n\n    private computeStreamType_(): StreamType {\n        const source = this.source;\n        const streamType = source?.streamType ?? (this.getAttribute(Attribute.STREAM_TYPE) as StreamType | null);\n        const duration = this._player?.duration;\n        if (duration === undefined || isNaN(duration)) {\n            // No duration yet...\n            // Use hinted stream type if available.\n            if (streamType) {\n                return streamType;\n            }\n            // Assume VOD.\n            return 'vod';\n        } else if (duration === Infinity) {\n            // It's a live stream.\n            if (streamType === 'live' || streamType === 'dvr') {\n                // Follow the hinted stream type.\n                return streamType;\n            } else {\n                const dvrThreshold = this.dvrThreshold;\n                if (dvrThreshold <= 0) {\n                    return 'dvr';\n                }\n                const seekable = this._player?.seekable;\n                if (seekable && seekable.length > 0) {\n                    // Check if the DVR window is large enough.\n                    const dvrWindow = seekable.end(seekable.length - 1) - seekable.start(0);\n                    if (dvrWindow >= dvrThreshold) {\n                        return 'dvr';\n                    }\n                }\n            }\n            // Otherwise, it's a regular live stream.\n            return 'live';\n        } else {\n            // It's a VOD.\n            return 'vod';\n        }\n    }\n\n    private readonly _updatePlaybackRate = (): void => {\n        if (this._player === undefined) {\n            return;\n        }\n        const playbackRate = this._player.playbackRate;\n        for (const receiver of this._stateReceivers) {\n            if (receiver[StateReceiverProps].indexOf('playbackRate') >= 0) {\n                receiver.playbackRate = playbackRate;\n            }\n        }\n    };\n\n    private readonly _updateMuted = (): void => {\n        if (this._player === undefined) {\n            return;\n        }\n        this.muted = this._player.muted;\n    };\n\n    private readonly _updateActiveVideoTrack = (): void => {\n        if (this._player === undefined) {\n            return;\n        }\n        const activeVideoTrack = arrayFind(this._player.videoTracks, (track) => track.enabled);\n        if (this._activeVideoTrack !== activeVideoTrack) {\n            this._activeVideoTrack?.removeEventListener('activequalitychanged', this._updateActiveVideoQuality);\n            this._activeVideoTrack?.removeEventListener('targetqualitychanged', this._updateTargetVideoQualities);\n            this._activeVideoTrack = activeVideoTrack;\n            this._updateActiveVideoQuality();\n            this._updateTargetVideoQualities();\n            this._activeVideoTrack?.addEventListener('activequalitychanged', this._updateActiveVideoQuality);\n            this._activeVideoTrack?.addEventListener('targetqualitychanged', this._updateTargetVideoQualities);\n        }\n    };\n\n    private readonly _updateActiveVideoQuality = (): void => {\n        const activeVideoQuality = this._activeVideoTrack?.activeQuality as VideoQuality | undefined;\n        for (const receiver of this._stateReceivers) {\n            if (receiver[StateReceiverProps].indexOf('activeVideoQuality') >= 0) {\n                receiver.activeVideoQuality = activeVideoQuality;\n            }\n        }\n    };\n\n    private readonly _updateTargetVideoQualities = (): void => {\n        const targetVideoQualities = getTargetQualities(this._activeVideoTrack) as VideoQuality[] | undefined;\n        for (const receiver of this._stateReceivers) {\n            if (receiver[StateReceiverProps].indexOf('targetVideoQualities') >= 0) {\n                receiver.targetVideoQualities = targetVideoQualities;\n            }\n        }\n    };\n\n    private readonly _updateCasting = (): void => {\n        this.casting = this._player?.cast?.casting ?? false;\n    };\n\n    private readonly _updatePlayingAd = (): void => {\n        this._isPlayingAd = this._player?.ads?.playing ?? false;\n    };\n\n    private readonly _onSourceChange = (): void => {\n        this.closeMenu_();\n        this._hasFirstPlay = this._player !== undefined && !this._player.paused;\n    };\n\n    private isUserIdle_(): boolean {\n        return (\n            !this._isUserActive && !this.paused && !this.casting && (this._menuGroupRef.value ? !this._menuGroupRef.value.hasCurrentMenu() : false)\n        );\n    }\n\n    private setUserActive_(): void {\n        clearTimeout(this._userIdleTimer);\n        this._isUserActive = true;\n        this.updateUserIdle_();\n    }\n\n    private readonly setUserIdle_ = (): void => {\n        clearTimeout(this._userIdleTimer);\n        this._userIdleTimer = 0;\n\n        if (this.userIdleTimeout < 0) {\n            return;\n        }\n        this._isUserActive = false;\n        this.updateUserIdle_();\n\n        if (this.deviceType == 'tv' && this.isUserIdle_()) {\n            // Blur active element so that first key press on TV doesn't result in an action.\n            const focusedChild = getFocusedChild();\n            if (focusedChild !== null) {\n                focusedChild.blur();\n            }\n        }\n    };\n\n    private readonly scheduleUserIdle_ = (): void => {\n        this.setUserActive_();\n\n        clearTimeout(this._userIdleTimer);\n\n        // Setting the timeout to -1 turns off idle detection.\n        if (this.userIdleTimeout < 0) {\n            this._userIdleTimer = 0;\n            return;\n        }\n\n        this._userIdleTimer = setTimeout(this.setUserIdle_, this.userIdleTimeout * 1000);\n    };\n\n    private updateUserIdle_(): void {\n        this.userIdle = this.isUserIdle_();\n    }\n\n    private isPlayerOrMedia_(node: Node): boolean {\n        return node === this || this._playerRef.value!.contains(node);\n    }\n\n    private readonly _onTvKeyDown = (event: KeyboardEvent): void => {\n        if (isBackKey(event.keyCode)) {\n            this.setUserIdle_();\n            return;\n        }\n        const tvFocusChildren = getTvFocusChildren(this);\n        const focusableChildren = getFocusableChildren(this);\n        let focusedChild = getFocusedChild();\n        if (!focusedChild) {\n            const children = tvFocusChildren ?? focusableChildren;\n            if (children.length > 0) {\n                children[0].focus();\n                focusedChild = children[0];\n            }\n        }\n\n        if (this.isUserIdle_()) {\n            // First button press should only make the UI visible\n            return;\n        }\n        if (event.keyCode === KeyCode.ENTER) {\n            if (focusedChild !== null) {\n                event.preventDefault();\n                focusedChild.click();\n            }\n        } else if (isArrowKey(event.keyCode) && navigateByArrowKey(this, focusableChildren, event.keyCode)) {\n            event.preventDefault();\n            event.stopPropagation();\n        }\n    };\n\n    private readonly _onKeyUp = (event: KeyboardEvent): void => {\n        // Show the controls while navigating with the keyboard.\n        if (!isBackKey(event.keyCode)) {\n            this.scheduleUserIdle_();\n        }\n    };\n\n    private readonly _onPointerUp = (event: PointerEvent): void => {\n        if (event.pointerType === 'mouse') {\n            this.scheduleUserIdle_();\n        } else if (event.pointerType === 'touch') {\n            // On mobile, when you tap the media while the controls are showing, immediately hide the controls.\n            // Otherwise, show the controls (and schedule a timer to hide them again later on).\n            if (this.isPlayerOrMedia_(event.target! as Node) && this._isUserActive) {\n                this.setUserIdle_();\n            } else {\n                if (this.isUserIdle_()) {\n                    // Ignore the next \"click\" event, to prevent accidental button clicks\n                    // when the user only intended to show the controls.\n                    this._lastPointerUpTime = performance.now();\n                    this.addEventListener('click', this._onClickAfterPointerUp, true);\n                }\n                this.scheduleUserIdle_();\n            }\n        }\n    };\n\n    private readonly _onClickAfterPointerUp = (event: MouseEvent): void => {\n        this.removeEventListener('click', this._onClickAfterPointerUp, true);\n        if (performance.now() - this._lastPointerUpTime < ACCIDENTAL_CLICK_DELAY) {\n            event.preventDefault();\n            event.stopPropagation();\n        }\n    };\n\n    private readonly _onPointerMove = (event: PointerEvent): void => {\n        // \"pointermove\" doesn't happen with touch on taps on iOS, but does on Android. Therefore, only run for mouse.\n        if (event.pointerType !== 'mouse') return;\n\n        this.setUserActive_();\n\n        // If hovering a control, keep the user active even when they stop moving.\n        // Otherwise, when hovering the media, we can consider the user to be idle.\n        if (this.isPlayerOrMedia_(event.target! as Node)) {\n            this.scheduleUserIdle_();\n        }\n    };\n\n    private readonly _onMouseLeave = (): void => {\n        // Immediately hide the controls when mouse leaves the player.\n        this.setUserIdle_();\n    };\n\n    private readonly _onChromeSlotTransition = (event: TransitionEvent): void => {\n        // When the control bars become visible, move the text tracks out of the way.\n        // When they become invisible, move the text tracks back.\n        if (event.propertyName === 'opacity') {\n            this._updateTextTrackMargins();\n        }\n    };\n\n    private readonly _updateTextTrackMargins = (): void => {\n        const player = this._player;\n        if (player === undefined) {\n            return;\n        }\n        const topChromeRect = this._topChromeSlotRef.value && getVisibleRect(this._topChromeSlotRef.value);\n        const bottomChromeRect = this._bottomChromeSlotRef.value && getVisibleRect(this._bottomChromeSlotRef.value);\n        player.textTrackStyle.marginTop = topChromeRect?.height;\n        player.textTrackStyle.marginBottom = bottomChromeRect?.height;\n    };\n\n    private readonly _onPreviewTimeChange = (rawEvent: Event): void => {\n        const event = rawEvent as PreviewTimeChangeEvent;\n        this._previewTime = event.detail.previewTime;\n\n        for (const receiver of this._stateReceivers) {\n            if (receiver[StateReceiverProps].indexOf('previewTime') >= 0) {\n                receiver.previewTime = this._previewTime;\n            }\n        }\n    };\n\n    private addPlayerListeners_(player: ChromelessPlayer): void {\n        player.addEventListener('destroy', this._onDestroy);\n        player.addEventListener('resize', this._updateAspectRatio);\n        player.addEventListener(['error', 'sourcechange', 'emptied'], this._updateError);\n        player.addEventListener('volumechange', this._updateMuted);\n        player.addEventListener('play', this._onPlay);\n        player.addEventListener('pause', this._onPause);\n        player.addEventListener(['ended', 'emptied'], this._updatePausedAndEnded);\n        player.addEventListener(['durationchange', 'sourcechange', 'emptied'], this._updateStreamType);\n        player.addEventListener('ratechange', this._updatePlaybackRate);\n        player.addEventListener('sourcechange', this._onSourceChange);\n        player.addEventListener(['durationchange', 'sourcechange', 'emptied'], this._updatePlayingAd);\n\n        player.theoLive?.addEventListener(['distributionloadstart', 'publicationloadstart' as never], this._onSourceChange);\n        player.videoTracks.addEventListener(['addtrack', 'removetrack', 'change'], this._updateActiveVideoTrack);\n        player.cast?.addEventListener('castingchange', this._updateCasting);\n        player.ads?.addEventListener(['adbreakbegin', 'adbreakend', 'adbegin', 'adend', 'adskip'], this._updatePlayingAd);\n        player.vr?.addEventListener('statechange', this._onVrStateChange);\n    }\n\n    private removePlayerListeners_(player: ChromelessPlayer): void {\n        player.removeEventListener('destroy', this._onDestroy);\n        player.removeEventListener('resize', this._updateAspectRatio);\n        player.removeEventListener(['error', 'sourcechange', 'emptied'], this._updateError);\n        player.removeEventListener('volumechange', this._updateMuted);\n        player.removeEventListener('play', this._onPlay);\n        player.removeEventListener('pause', this._onPause);\n        player.removeEventListener(['ended', 'emptied'], this._updatePausedAndEnded);\n        player.removeEventListener(['durationchange', 'sourcechange', 'emptied'], this._updateStreamType);\n        player.removeEventListener('ratechange', this._updatePlaybackRate);\n        player.removeEventListener('sourcechange', this._onSourceChange);\n        player.removeEventListener(['durationchange', 'sourcechange', 'emptied'], this._updatePlayingAd);\n\n        try {\n            player.theoLive?.removeEventListener(['distributionloadstart', 'publicationloadstart' as never], this._onSourceChange);\n            player.videoTracks.removeEventListener(['addtrack', 'removetrack', 'change'], this._updateActiveVideoTrack);\n            player.cast?.removeEventListener('castingchange', this._updateCasting);\n            player.ads?.removeEventListener(['adbreakbegin', 'adbreakend', 'adbegin', 'adend', 'adskip'], this._updatePlayingAd);\n            player.vr?.removeEventListener('statechange', this._onVrStateChange);\n        } catch {\n            // Ignore errors from accessing player.ads when the player is already destroyed.\n        }\n    }\n\n    private readonly _onDestroy = (): void => {\n        if (this._player) {\n            this.removePlayerListeners_(this._player);\n            this._player = undefined;\n            this.propagatePlayerToAllReceivers_();\n        }\n    };\n\n    protected override render(): HTMLTemplateResult {\n        return html`\n            <div part=\"layer media-layer\" ${ref(this._playerRef)}></div>\n            <div part=\"layer gesture-layer\">\n                <theoplayer-gesture-receiver></theoplayer-gesture-receiver>\n            </div>\n            <div part=\"layer vertical-layer\">\n                <div part=\"top chrome\" ${ref(this._topChromeRef)}>\n                    <slot\n                        name=\"top-chrome\"\n                        ${ref(this._topChromeSlotRef)}\n                        @transitionstart=${this._onChromeSlotTransition}\n                        @transitionend=${this._onChromeSlotTransition}\n                    ></slot>\n                </div>\n                <div part=\"middle chrome\">\n                    <slot name=\"middle-chrome\"></slot>\n                </div>\n                <div part=\"layer centered-layer centered loading\">\n                    <slot name=\"centered-loading\"></slot>\n                </div>\n                <div part=\"layer centered-layer centered chrome\">\n                    <slot name=\"centered-chrome\"></slot>\n                </div>\n                <div part=\"bottom chrome\" ${ref(this._bottomChromeRef)}>\n                    <slot\n                        ${ref(this._bottomChromeSlotRef)}\n                        @transitionstart=${this._onChromeSlotTransition}\n                        @transitionend=${this._onChromeSlotTransition}\n                        ><!-- default, effectively \"bottom-chrome\" --></slot\n                    >\n                </div>\n            </div>\n            <div part=\"layer menu-layer\" ${ref(this._menuRef)}>\n                <theoplayer-menu-group\n                    ${ref(this._menuGroupRef)}\n                    part=\"menu\"\n                    @theoplayermenuclose=${this._onCloseMenu}\n                    @theoplayermenuchange=${this._onMenuChange}\n                >\n                    <slot name=\"menu\"></slot>\n                </theoplayer-menu-group>\n            </div>\n            <div part=\"layer error-layer\">\n                <slot name=\"error\"></slot>\n            </div>\n        `;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-ui': UIContainer;\n    }\n}\n\nfunction getVisibleRect(slot: HTMLSlotElement): Rectangle | undefined {\n    let result: Rectangle | undefined;\n    const children = getSlottedElements(slot).filter(isHTMLElement);\n    for (const child of children) {\n        if (getComputedStyle(child).opacity !== '0') {\n            const childRect = Rectangle.fromRect(child.getBoundingClientRect());\n            if (childRect.width > 0 && childRect.height > 0) {\n                result = result ? result.union(childRect) : childRect;\n            }\n        }\n    }\n    return result;\n}\n","import { html, type HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property, queryAssignedNodes, state } from 'lit/decorators.js';\nimport { createRef, ref, type Ref } from 'lit/directives/ref.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport type { ChromelessPlayer, SourceDescription, UIPlayerConfiguration } from 'theoplayer/chromeless';\nimport { DEFAULT_DVR_THRESHOLD, DEFAULT_TV_USER_IDLE_TIMEOUT, DEFAULT_USER_IDLE_TIMEOUT, type UIContainer } from './UIContainer';\nimport defaultUiCss from './DefaultUI.css';\nimport { Attribute } from './util/Attribute';\nimport { applyExtensions } from './extensions/ExtensionRegistry';\nimport { isMobile, isTv } from './util/Environment';\nimport type { DeviceType } from './util/DeviceType';\nimport type { StreamType } from './util/StreamType';\nimport { USER_IDLE_CHANGE_EVENT } from './events/UserIdleChangeEvent';\nimport { READY_EVENT } from './events/ReadyEvent';\nimport { ACCIDENTAL_CLICK_DELAY } from './util/Constants';\nimport { closestRecursive } from './util/CommonUtils';\nimport { createCustomEvent } from './util/EventUtils';\n\n/**\n * A default UI for THEOplayer.\n *\n * This default UI provides a great player experience out-of-the-box, that works well on all types of devices\n * and for all types of streams. It provides all the common playback controls for playing, seeking,\n * changing languages and qualities. It also supports advertisements and casting.\n *\n * ## Usage\n *\n * 1. Create a `<theoplayer-default-ui>` element.\n * 2. Set its `configuration` attribute or property to a valid player configuration.\n * 3. Set its `source` attribute or property to a valid stream source.\n * 4. Optionally, customize the player using CSS custom properties and/or extra controls.\n *\n * ## Customization\n *\n * The styling can be controlled using CSS custom properties (see {@link UIContainer | `<theoplayer-ui>`}).\n * Additional controls can be added to the `top-control-bar` and `bottom-control-bar` slots.\n * For more extensive customizations, we recommend defining your own custom UI using\n * a {@link UIContainer | `<theoplayer-ui>`}.\n *\n * @slot `title` - A slot for the stream's title in the top control bar.\n * @slot `top-control-bar` - A slot for extra UI controls in the top control bar.\n * @slot `centered-chrome` - A slot to replace the controls in the center of the player,\n *   layered on top of other controls.\n * @slot `bottom-control-bar` - A slot for extra UI controls in the bottom control bar.\n * @slot `menu` - A slot for extra menus (see {@link Menu | `<theoplayer-menu>`}).\n * @slot `error` - A slot for an error display, to show when the player encounters a fatal error.\n *   By default, this shows an {@link ErrorDisplay | `<theoplayer-error-display>`}.\n *\n * @cssproperty `--theoplayer-text-color` - The text color of a control. Defaults to `#fff`.\n * @cssproperty `--theoplayer-text-font-size` - The font size of any text inside a control. Defaults to `14px`.\n * @cssproperty `--theoplayer-control-height` - The height of a control. Defaults to `24px`.\n * @cssproperty `--theoplayer-control-padding` - The padding around a control. Defaults to `10px`.\n * @cssproperty `--theoplayer-control-background-gradient-stops` - The gradient stops used for the subtle\n *   backdrop gradient behind the top and bottom control bars on desktop. Defaults to a smooth\n *   transparent-to-black gradient.\n * @cssproperty `--theoplayer-mobile-control-backdrop-background` - The background applied to the entire player\n *   on mobile when the controls are shown. Defaults to `rgba(0, 0, 0, 0.5)`.\n * @cssproperty `--theoplayer-centered-chrome-button-icon-width` - The icon width of buttons in the centered\n *   chrome slot. Defaults to `48px`.\n * @cssproperty `--theoplayer-centered-chrome-control-height` - The control height of elements in the centered\n *   chrome slot. Defaults to `48px`.\n * @cssproperty `--theoplayer-center-play-button-icon-color` - The icon color of the centered play button.\n *   Overrides `--theoplayer-play-button-icon-color` for this button. Defaults to `unset`.\n * @cssproperty `--theoplayer-time-range-control-height` - The control height of the time range (seek bar).\n *   Defaults to `12px`.\n * @cssproperty `--theoplayer-time-range-track-pointer-background` - The background of the hover/preview pointer\n *   on the time range. Defaults to `rgba(255, 255, 255, 0.5)`.\n * @cssproperty `--theoplayer-volume-range-track-width` - The width of the volume range track when expanded on hover.\n *   Defaults to `70px`.\n * @cssproperty `--theoplayer-ad-chrome-control-height` - The control height for elements inside the ad chrome.\n *   Defaults to `12px`.\n * @cssproperty `--theoplayer-ad-control-height` - The control height of playback controls while an ad is playing.\n *   Defaults to `16px`.\n */\n@customElement('theoplayer-default-ui')\nexport class DefaultUI extends LitElement {\n    static override styles = [defaultUiCss];\n    static override shadowRootOptions: ShadowRootInit = {\n        ...LitElement.shadowRootOptions,\n        delegatesFocus: true\n    };\n\n    /**\n     * Fired when the backing player is created, and the {@link DefaultUI.player} property is set.\n     *\n     * @group Events\n     */\n    static READY_EVENT: typeof READY_EVENT = READY_EVENT;\n\n    protected readonly _uiRef: Ref<UIContainer> = createRef<UIContainer>();\n    @state()\n    private accessor _timeRangeInert: boolean = false;\n    private _timeRangeInertTimeout: number = 0;\n    private _appliedExtensions: boolean = false;\n\n    private _configuration: UIPlayerConfiguration = {};\n    private _source: SourceDescription | undefined = undefined;\n    private _language: string = '';\n    private _userIdleTimeout: number | undefined = undefined;\n    private _deviceType: DeviceType = 'desktop';\n    private _dvrThreshold: number = DEFAULT_DVR_THRESHOLD;\n\n    @queryAssignedNodes({ slot: 'title', flatten: true })\n    private accessor titleSlotNodes!: Array<Node>;\n\n    /**\n     * Creates a new THEOplayer default UI.\n     *\n     * @param configuration - The player configuration.\n     *   Will be passed to the {@link theoplayer!ChromelessPlayer | ChromelessPlayer} constructor to create\n     *   the underlying THEOplayer instance.\n     *   Can also be set later on through the {@link DefaultUI.configuration} property.\n     */\n    constructor(configuration: UIPlayerConfiguration = {}) {\n        super();\n        this.configuration = configuration;\n    }\n\n    /**\n     * The underlying THEOplayer player instance.\n     *\n     * This is constructed automatically as soon as a valid {@link configuration} is set.\n     */\n    get player(): ChromelessPlayer | undefined {\n        return this._uiRef.value?.player;\n    }\n\n    /**\n     * The player's {@link theoplayer!UIPlayerConfiguration | configuration}.\n     *\n     * Used to create the underlying THEOplayer instance.\n     * When set as an attribute, this must be a JSON string.\n     */\n    get configuration(): UIPlayerConfiguration {\n        return this._configuration;\n    }\n\n    @property({\n        reflect: false,\n        attribute: Attribute.CONFIGURATION,\n        converter: {\n            fromAttribute: (value: string | null) => (value ? (JSON.parse(value) as UIPlayerConfiguration) : {})\n        }\n    })\n    set configuration(configuration: UIPlayerConfiguration) {\n        this._configuration = {\n            ...configuration,\n            ads: {\n                ...(configuration.ads ?? {}),\n                // Always disable Google IMA's own ad countdown,\n                // since we show our own countdown in the default UI.\n                showCountdown: false\n            }\n        };\n    }\n\n    /**\n     * The player's {@link theoplayer!SourceDescription | current source}.\n     *\n     * When set as an attribute, this must be a JSON string.\n     */\n    get source() {\n        return this._uiRef.value ? this._uiRef.value.source : this._source;\n    }\n\n    @property({\n        reflect: false,\n        attribute: Attribute.SOURCE,\n        converter: {\n            fromAttribute: (value: string | null) => (value ? (JSON.parse(value) as SourceDescription) : undefined)\n        }\n    })\n    set source(source: SourceDescription | undefined) {\n        if (this._uiRef.value) {\n            this._source = undefined;\n            this._uiRef.value.source = source;\n        } else {\n            this._source = source;\n        }\n    }\n\n    /**\n     * Whether to automatically adjust the player's height to fit the video's aspect ratio.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.FLUID })\n    accessor fluid: boolean = false;\n\n    /**\n     * The language of this element.\n     *\n     * When set, this also updates the {@link Locale} of the UI if one is registered with {@link addLocale}.\n     *\n     * @see {@link HTMLElement.lang}\n     */\n    get lang(): string {\n        return this._uiRef.value?.lang ?? this._language;\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.LANG })\n    set lang(value: string | null) {\n        this._language = value ?? '';\n        if (this._uiRef.value) {\n            this._uiRef.value.lang = this._language;\n        }\n    }\n\n    /**\n     * Whether the player's audio is muted.\n     *\n     * This reflects `player.muted`.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.MUTED })\n    accessor muted: boolean = false;\n\n    /**\n     * Whether the player should attempt to automatically start playback.\n     */\n    @property({ reflect: true, type: Boolean, attribute: Attribute.AUTOPLAY })\n    accessor autoplay: boolean = false;\n\n    /**\n     * The stream type, either \"vod\", \"live\" or \"dvr\".\n     *\n     * If you know in advance that the source will be a livestream, you can set this property to avoid a screen flicker\n     * when the player switches between its VOD-specific and live-only controls.\n     *\n     * Can be used to show/hide certain UI controls specific for livestreams, such as\n     * a {@link LiveButton | `<theoplayer-live-button>`}.\n     */\n    @property({ reflect: true, type: String, attribute: Attribute.STREAM_TYPE })\n    accessor streamType: StreamType = 'vod';\n\n    /**\n     * Whether the user has stopped interacting with the UI and is considered to be \"idle\".\n     */\n    get userIdle(): boolean {\n        return this._uiRef.value ? this._uiRef.value.userIdle : false;\n    }\n\n    /**\n     * The timeout (in seconds) between when the user stops interacting with the UI,\n     * and when the user is considered to be \"idle\".\n     */\n    get userIdleTimeout(): number {\n        return this._userIdleTimeout ?? (this.deviceType === 'tv' ? DEFAULT_TV_USER_IDLE_TIMEOUT : DEFAULT_USER_IDLE_TIMEOUT);\n    }\n\n    @property({ reflect: true, type: Number, attribute: Attribute.USER_IDLE_TIMEOUT, useDefault: true })\n    set userIdleTimeout(value: number | undefined) {\n        this._userIdleTimeout = value === undefined || isNaN(value) ? undefined : value;\n    }\n\n    /**\n     * The device type, either \"desktop\", \"mobile\" or \"tv\".\n     *\n     * This attribute can be used in CSS to show/hide certain device-specific UI controls.\n     */\n    get deviceType(): DeviceType {\n        return this._deviceType;\n    }\n\n    @property({ reflect: true, type: String, attribute: Attribute.DEVICE_TYPE })\n    set deviceType(value: DeviceType) {\n        if (this._deviceType === value) return;\n        this._deviceType = value;\n        this.mobile = value === 'mobile';\n        this.tv = value === 'tv';\n    }\n\n    /**\n     * Whether the user is on a mobile device.\n     *\n     * Equivalent to `deviceType == \"mobile\"`.\n     */\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.MOBILE })\n    private accessor mobile: boolean = false;\n\n    /**\n     * Whether the user is on a TV device.\n     *\n     * Equivalent to `deviceType == \"tv\"`.\n     */\n    @property({ reflect: true, state: true, type: Boolean, attribute: Attribute.TV })\n    private accessor tv: boolean = false;\n\n    /**\n     * The minimum length (in seconds) of a livestream's sliding window for the stream to be DVR\n     * and its stream type to be set to \"dvr\".\n     */\n    get dvrThreshold(): number {\n        return this._dvrThreshold;\n    }\n\n    @property({ reflect: true, type: Number, attribute: Attribute.DVR_THRESHOLD, useDefault: true })\n    set dvrThreshold(value: number) {\n        this._dvrThreshold = isNaN(value) ? 0 : value;\n    }\n\n    @state()\n    private accessor _hasTitle: boolean = false;\n\n    connectedCallback(): void {\n        super.connectedCallback();\n\n        if (!this.hasAttribute(Attribute.LANG)) {\n            this.lang = closestRecursive<HTMLElement>(this, '[lang]')?.lang ?? '';\n        }\n        if (!this.hasAttribute(Attribute.DEVICE_TYPE)) {\n            this.deviceType = isMobile() ? 'mobile' : isTv() ? 'tv' : 'desktop';\n        }\n\n        if (!this._appliedExtensions) {\n            this._appliedExtensions = true;\n            applyExtensions(this);\n        }\n\n        this._onTitleSlotChange();\n    }\n\n    disconnectedCallback(): void {\n        clearTimeout(this._timeRangeInertTimeout);\n    }\n\n    protected override firstUpdated() {\n        if (this._source) {\n            this._uiRef.value!.source = this._source;\n            this._source = undefined;\n        }\n    }\n\n    protected _onUiReady(): void {\n        this.dispatchEvent(createCustomEvent(READY_EVENT));\n    }\n\n    private readonly _updateStreamType = () => {\n        if (this._uiRef.value) {\n            this.streamType = this._uiRef.value.streamType;\n        }\n    };\n\n    private readonly _updateUserIdle = () => {\n        clearTimeout(this._timeRangeInertTimeout);\n        if (this.userIdle) {\n            // Disable seekbar when user is idle\n            this._timeRangeInert = true;\n        } else {\n            // Re-enable seekbar when user is active,\n            // but wait a little bit to prevent accidentally clicking the seekbar.\n            this._timeRangeInertTimeout = setTimeout(() => {\n                this._timeRangeInert = false;\n            }, ACCIDENTAL_CLICK_DELAY);\n        }\n        this.dispatchEvent(createCustomEvent(USER_IDLE_CHANGE_EVENT));\n    };\n\n    private readonly _onTitleSlotChange = () => {\n        this._hasTitle = this.titleSlotNodes.length > 0;\n    };\n\n    protected override render(): HTMLTemplateResult {\n        return html`<theoplayer-ui\n            ${ref(this._uiRef)}\n            .configuration=${this.configuration}\n            .lang=${this.lang}\n            .fluid=${this.fluid}\n            .muted=${this.muted}\n            .autoplay=${this.autoplay}\n            .deviceType=${this.deviceType}\n            .streamType=${this.streamType}\n            .userIdleTimeout=${this.userIdleTimeout}\n            .dvrThreshold=${this.dvrThreshold}\n            @theoplayerready=${this._onUiReady}\n            @theoplayeruseridlechange=${this._updateUserIdle}\n            @theoplayerstreamtypechange=${this._updateStreamType}\n            >${this.renderUiContent()}\n        </theoplayer-ui>`;\n    }\n\n    protected renderUiContent(): HTMLTemplateResult {\n        return html`\n            <theoplayer-control-bar slot=\"top-chrome\" part=\"top-chrome\">\n                <div part=\"title\" ad-hidden style=${styleMap({ display: this._hasTitle ? '' : 'none' })}>\n                    <slot name=\"title\" @slotchange=${this._onTitleSlotChange}></slot>\n                </div>\n                <span class=\"theoplayer-spacer\"></span>\n                <theoplayer-language-menu-button menu=\"language-menu\" mobile-only ad-hidden></theoplayer-language-menu-button>\n                <theoplayer-airplay-button mobile-only ad-hidden></theoplayer-airplay-button>\n                <theoplayer-chromecast-button mobile-only ad-hidden></theoplayer-chromecast-button>\n                <slot name=\"top-control-bar\"></slot>\n                <theoplayer-settings-menu-button menu=\"settings-menu\" mobile-only ad-hidden></theoplayer-settings-menu-button>\n                <theoplayer-ad-clickthrough-button ad-only></theoplayer-ad-clickthrough-button>\n            </theoplayer-control-bar>\n            <theoplayer-loading-indicator slot=\"centered-loading\" no-auto-hide></theoplayer-loading-indicator>\n            <div slot=\"centered-chrome\" part=\"centered-chrome\">\n                <slot name=\"centered-chrome\">\n                    <theoplayer-seek-button\n                        part=\"seek-back-button seek-button center-button\"\n                        seek-offset=\"-10\"\n                        mobile-only\n                        ad-hidden\n                    ></theoplayer-seek-button>\n                    <theoplayer-play-button part=\"center-play-button play-button center-button\"></theoplayer-play-button>\n                    <theoplayer-seek-button\n                        part=\"seek-forward-button seek-button center-button\"\n                        seek-offset=\"10\"\n                        mobile-only\n                        ad-hidden\n                    ></theoplayer-seek-button>\n                </slot>\n            </div>\n            <div slot=\"middle-chrome\" part=\"middle-chrome\">\n                <theoplayer-chromecast-display></theoplayer-chromecast-display>\n                <theoplayer-vr-compass></theoplayer-vr-compass>\n            </div>\n            <div part=\"bottom-chrome\">\n                <theoplayer-control-bar part=\"ad-chrome\" ad-only>\n                    <theoplayer-ad-display></theoplayer-ad-display>\n                    <theoplayer-ad-countdown></theoplayer-ad-countdown>\n                    <span class=\"theoplayer-spacer\"></span>\n                    <theoplayer-ad-skip-button></theoplayer-ad-skip-button>\n                </theoplayer-control-bar>\n                <theoplayer-control-bar>\n                    <theoplayer-play-button part=\"play-button\" mobile-hidden ad-only class=\"theoplayer-ad-control\"></theoplayer-play-button>\n                    <theoplayer-mute-button part=\"mute-button\" ad-only class=\"theoplayer-ad-control\"></theoplayer-mute-button>\n                    <theoplayer-time-range\n                        part=\"time-range\"\n                        show-ad-markers\n                        tv-focus\n                        .inert=${this._timeRangeInert}\n                        class=\"theoplayer-ad-control\"\n                        style=${styleMap({\n                            // Hide seekbar when stream is live with no DVR\n                            display: this.streamType === 'live' ? 'none' : ''\n                        })}\n                    ></theoplayer-time-range>\n                    <theoplayer-chromecast-button tv-hidden ad-only class=\"theoplayer-ad-control\"></theoplayer-chromecast-button>\n                    <theoplayer-fullscreen-button ad-only class=\"theoplayer-ad-control\"></theoplayer-fullscreen-button>\n                </theoplayer-control-bar>\n                <theoplayer-control-bar ad-hidden>\n                    <theoplayer-play-button part=\"play-button\" mobile-hidden></theoplayer-play-button>\n                    <theoplayer-mute-button part=\"mute-button\" tv-hidden></theoplayer-mute-button>\n                    <theoplayer-volume-range part=\"volume-range\" mobile-hidden tv-hidden></theoplayer-volume-range>\n                    <theoplayer-live-button part=\"live-button\" live-only ad-hidden></theoplayer-live-button>\n                    <theoplayer-time-display show-duration remaining-when-live></theoplayer-time-display>\n                    <span class=\"theoplayer-spacer\" style=\"pointer-events: auto\"></span>\n                    <theoplayer-language-menu-button menu=\"language-menu\" mobile-hidden ad-hidden></theoplayer-language-menu-button>\n                    <theoplayer-airplay-button tv-hidden mobile-hidden ad-hidden></theoplayer-airplay-button>\n                    <theoplayer-chromecast-button tv-hidden mobile-hidden ad-hidden></theoplayer-chromecast-button>\n                    <slot name=\"bottom-control-bar\"></slot>\n                    <theoplayer-vr-button tv-hidden ad-hidden></theoplayer-vr-button>\n                    <theoplayer-settings-menu-button menu=\"settings-menu\" mobile-hidden ad-hidden></theoplayer-settings-menu-button>\n                    <theoplayer-fullscreen-button part=\"fullscreen-button\" tv-hidden></theoplayer-fullscreen-button>\n                </theoplayer-control-bar>\n            </div>\n            <theoplayer-language-menu id=\"language-menu\" slot=\"menu\" hidden></theoplayer-language-menu>\n            <theoplayer-settings-menu id=\"settings-menu\" slot=\"menu\" hidden></theoplayer-settings-menu>\n            <slot name=\"error\" slot=\"error\"><theoplayer-error-display></theoplayer-error-display></slot>\n            <slot name=\"menu\" slot=\"menu\"></slot>\n        `;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theoplayer-default-ui': DefaultUI;\n    }\n}\n","import { html, type HTMLTemplateResult } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport './components/theolive/quality/BadNetworkModeButton';\nimport './components/theolive/quality/BadNetworkModeMenu';\nimport css from './THEOliveDefaultUI.css';\nimport type { ErrorEvent, UIPlayerConfiguration } from 'theoplayer/chromeless';\nimport { DefaultUI } from './DefaultUI';\nimport { Attribute } from './util/Attribute';\nimport { getLocale } from './i18n';\n\n/**\n * `<theolive-default-ui>` - A default UI for THEOlive.\n */\n@customElement('theolive-default-ui')\nexport class THEOliveDefaultUI extends DefaultUI {\n    static override styles = [css];\n\n    @state()\n    private accessor _announcementType: 'loading' | 'offline' | 'announcement' | '' = '';\n    @state()\n    private accessor _announcementMessage: string = '';\n    @state()\n    private accessor _hidePlayButton: boolean = false;\n    @state()\n    private accessor _hideErrorDisplay: boolean = false;\n\n    constructor(configuration: UIPlayerConfiguration = {}) {\n        super(configuration);\n    }\n\n    protected override _onUiReady() {\n        super._onUiReady();\n        const player = this.player;\n        if (player) {\n            player.theoLive?.addEventListener(['distributionloadstart', 'publicationloadstart' as never], this.onLoadChannelStart);\n            player.theoLive?.addEventListener(['distributionoffline', 'publicationoffline' as never], this.onChannelOffline);\n            player.theoLive?.addEventListener(['endpointloaded', 'publicationloaded' as never], this.onChannelLoaded);\n            player.addEventListener('error', this.onError);\n        }\n    }\n\n    private onLoadChannelStart = () => {\n        this.showMessage_('loading', undefined);\n    };\n\n    private onChannelOffline = () => {\n        this.showMessage_('offline', undefined);\n    };\n\n    private onChannelLoaded = () => {\n        this.hidePlayerError();\n        this.hideMessage_();\n    };\n\n    private onError = (e: ErrorEvent) => {\n        const errorCode = e.errorObject.code;\n        if (errorCode < 13_000 || errorCode >= 14_000) {\n            this.showMessage_('offline', undefined);\n            return;\n        }\n        this.stopHidingPlayerError();\n        this.hideMessage_();\n    };\n\n    private hidePlayerError(): void {\n        this._uiRef.value?.removeAttribute(Attribute.HAS_ERROR);\n        this._hideErrorDisplay = true;\n    }\n\n    private stopHidingPlayerError(): void {\n        this._uiRef.value?.setAttribute(Attribute.HAS_ERROR, '');\n        this._hideErrorDisplay = false;\n    }\n\n    private showMessage_(type: 'offline' | 'loading' | 'announcement', text: string | undefined): void {\n        this.hidePlayerError();\n        this._announcementType = type;\n        this._announcementMessage = text ?? '';\n        this._hidePlayButton = true;\n    }\n\n    private hideMessage_(): void {\n        this._announcementType = '';\n        this._announcementMessage = '';\n        this._hidePlayButton = false;\n    }\n\n    protected override renderUiContent(): HTMLTemplateResult {\n        const locale = getLocale(this.lang);\n        const loadingStyles = { display: this._announcementType === 'loading' ? '' : 'none' };\n        const offlineStyles = { display: this._announcementType === 'offline' ? '' : 'none' };\n        const announcementStyles = { display: this._announcementType === 'announcement' ? '' : 'none' };\n        const playButtonStyles = { display: this._hidePlayButton ? 'none' : '' };\n        const errorDisplayStyles = { display: this._hideErrorDisplay ? 'none' : '' };\n        return html`\n            <p id=\"loading-announcement\" no-auto-hide slot=\"centered-chrome\" style=${styleMap(loadingStyles)}>\n                <slot name=\"loading-announcement\">${locale.liveStreamLoading}</slot>\n            </p>\n            <p id=\"offline-announcement\" no-auto-hide slot=\"centered-chrome\" style=${styleMap(offlineStyles)}>\n                <slot name=\"offline-announcement\">${locale.liveStreamOffline}</slot>\n            </p>\n            <p id=\"announcement\" no-auto-hide slot=\"centered-chrome\" style=${styleMap(announcementStyles)}>${this._announcementMessage}</p>\n            <theoplayer-loading-indicator slot=\"centered-loading\" no-auto-hide part=\"loading-indicator\"></theoplayer-loading-indicator>\n            <div slot=\"centered-chrome\" part=\"centered-chrome\">\n                <theoplayer-play-button\n                    part=\"center-play-button play-button center-button\"\n                    style=${styleMap(playButtonStyles)}\n                ></theoplayer-play-button>\n            </div>\n            <div part=\"bottom-chrome\">\n                <theoplayer-control-bar>\n                    <theoplayer-play-button mobile-hidden part=\"play-button\" style=${styleMap(playButtonStyles)}></theoplayer-play-button>\n                    <theoplayer-mute-button part=\"mute-button\"></theoplayer-mute-button>\n                    <theoplayer-volume-range mobile-hidden part=\"volume-range\"></theoplayer-volume-range>\n                    <theoplayer-live-button ad-hidden live-only part=\"live-button\"></theoplayer-live-button>\n                    <span class=\"theoplayer-spacer\"></span>\n                    <theoplayer-settings-menu-button ad-hidden menu=\"all-quality-menu\" part=\"quality-button\"></theoplayer-settings-menu-button>\n                    <theolive-bad-network-button ad-hidden menu=\"quality-menu\" part=\"theolive-bad-network-button\"></theolive-bad-network-button>\n                    <theoplayer-fullscreen-button part=\"fullscreen-button\"></theoplayer-fullscreen-button>\n                </theoplayer-control-bar>\n            </div>\n            <theoplayer-menu id=\"quality-menu\" slot=\"menu\" menu-close-on-input hidden>\n                <theolive-bad-network-menu></theolive-bad-network-menu>\n            </theoplayer-menu>\n            <theoplayer-menu id=\"all-quality-menu\" slot=\"menu\" menu-close-on-input hidden>\n                <theoplayer-quality-radio-group></theoplayer-quality-radio-group>\n            </theoplayer-menu>\n            <theoplayer-error-display slot=\"error\" part=\"error-display\" style=${styleMap(errorDisplayStyles)}></theoplayer-error-display>\n        `;\n    }\n}\n\ndeclare global {\n    interface HTMLElementTagNameMap {\n        'theolive-default-ui': THEOliveDefaultUI;\n    }\n}\n","function _class_private_field_loose_base(receiver, privateKey) {\n    if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {\n        throw new TypeError(\"attempted to use private field on non-instance\");\n    }\n\n    return receiver;\n}\nexport { _class_private_field_loose_base as _ };\n","var id = 0;\n\nfunction _class_private_field_loose_key(name) {\n    return \"__private_\" + id++ + \"_\" + name;\n}\nexport { _class_private_field_loose_key as _ };\n","import { Attribute } from './Attribute';\nimport { isSlotContainer } from '../components/SlotContainer';\n\nexport type Constructor<T> = abstract new (...args: any[]) => T;\n\nexport function noOp(): void {\n    return;\n}\n\nexport function isElement(node: Node): node is Element {\n    return node.nodeType === Node.ELEMENT_NODE;\n}\n\nexport function isHTMLElement(node: unknown): node is HTMLElement {\n    return node instanceof HTMLElement;\n}\n\nexport function isHTMLSlotElement(element: Element): element is HTMLSlotElement {\n    return element.localName.toLowerCase() === 'slot';\n}\n\nexport const isArray: (arg: unknown) => arg is any[] =\n    typeof Array.isArray === 'function'\n        ? Array.isArray\n        : (arg): arg is any[] => {\n              return Object.prototype.toString.call(arg) === '[object Array]';\n          };\n\nexport const fromArrayLike: <T>(arrayLike: ArrayLike<T>) => T[] =\n    typeof Array.from === 'function'\n        ? (arrayLike) => {\n              return Array.from(arrayLike);\n          }\n        : (arrayLike) => {\n              return Array.prototype.slice.call(arrayLike);\n          };\n\nexport const arrayFind: <T>(array: readonly T[], predicate: (element: T, index: number, array: readonly T[]) => boolean) => T | undefined =\n    typeof Array.prototype.find === 'function'\n        ? (array, predicate) => array.find(predicate)\n        : (array, predicate) => {\n              for (let i = 0; i < array.length; i++) {\n                  if (predicate(array[i], i, array)) {\n                      return array[i];\n                  }\n              }\n              return undefined;\n          };\n\nexport const arrayFindIndex: <T>(array: readonly T[], predicate: (element: T, index: number, array: readonly T[]) => boolean) => number =\n    typeof Array.prototype.findIndex === 'function'\n        ? (array, predicate) => array.findIndex(predicate)\n        : (array, predicate) => {\n              for (let i = 0; i < array.length; i++) {\n                  if (predicate(array[i], i, array)) {\n                      return i;\n                  }\n              }\n              return -1;\n          };\n\nexport function arrayRemove<T>(array: T[], element: T): boolean {\n    const index = array.indexOf(element);\n    if (index < 0) {\n        return false;\n    }\n    arrayRemoveAt(array, index);\n    return true;\n}\n\nexport function arrayRemoveAt<T>(array: T[], index: number): void {\n    array.splice(index, 1);\n}\n\nexport type Comparator<T, U = T> = (a: T, b: U) => number;\n\nexport function arrayMinByKey<T>(array: ReadonlyArray<T>, keySelector: (element: T) => number): T | undefined {\n    return arrayMinBy(array, (first, second) => keySelector(first) - keySelector(second));\n}\n\nexport function arrayMaxByKey<T>(array: ReadonlyArray<T>, keySelector: (element: T) => number): T | undefined {\n    return arrayMaxBy(array, (first, second) => keySelector(first) - keySelector(second));\n}\n\nexport function arrayMinBy<T>(array: ReadonlyArray<T>, comparator: Comparator<T>): T | undefined {\n    if (array.length === 0) {\n        return undefined;\n    }\n    return array.reduce((first, second) => (comparator(first, second) <= 0 ? first : second));\n}\n\nexport function arrayMaxBy<T>(array: ReadonlyArray<T>, comparator: Comparator<T>): T | undefined {\n    const minComparator = (a: T, b: T) => comparator(b, a);\n    return arrayMinBy(array, minComparator);\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\nexport const stringStartsWith: (string: string, search: string) => boolean =\n    typeof String.prototype.startsWith === 'function'\n        ? (string, search) => string.startsWith(search)\n        : (string, search) => string.substring(0, search.length) === search;\n\nexport function setTextContent(el: HTMLElement, text: string): void {\n    if (typeof el.textContent === 'undefined') {\n        el.innerText = text;\n    } else {\n        el.textContent = text;\n    }\n}\n\nexport function containsComposedNode(rootNode: Node, childNode: Node): boolean {\n    if (!rootNode || !childNode) {\n        return false;\n    }\n    if (rootNode.contains(childNode)) {\n        return true;\n    }\n    const childRoot = childNode.getRootNode();\n    if ((childRoot as ShadowRoot).host) {\n        return containsComposedNode(rootNode, (childRoot as ShadowRoot).host);\n    }\n    return false;\n}\n\nexport function toggleAttribute(element: Element, attribute: string, enabled: boolean): void {\n    if (enabled) {\n        element.setAttribute(attribute, '');\n    } else {\n        element.removeAttribute(attribute);\n    }\n}\n\nexport function getChildren(element: Element): ArrayLike<Element> {\n    if (element.shadowRoot) {\n        return element.shadowRoot.children;\n    }\n    if (isHTMLSlotElement(element)) {\n        const assignedNodes = element.assignedNodes();\n        if (assignedNodes.length > 0) {\n            return assignedNodes.filter(isElement);\n        }\n    }\n    if (isHTMLElement(element)) {\n        // Element.children does not exist for SVG elements in Internet Explorer.\n        // Assume those won't contain any state receivers.\n        return element.children;\n    }\n    return [];\n}\n\nexport function getSlottedElements(slot: HTMLSlotElement): Element[] {\n    const elements: Element[] = [];\n    for (const node of slot.assignedNodes({ flatten: true })) {\n        if (isElement(node)) {\n            elements.push(node);\n            if (isSlotContainer(node)) {\n                elements.push(...fromArrayLike(node.children));\n            }\n        }\n    }\n    return elements;\n}\n\nexport function getTvFocusChildren(element: Element): HTMLElement[] | undefined {\n    if (!isHTMLElement(element)) {\n        return;\n    }\n    if (getComputedStyle(element).display === 'none') {\n        return;\n    }\n    if (element.getAttribute(Attribute.TV_FOCUS) !== null) {\n        return getFocusableChildren(element);\n    }\n\n    const children = getChildren(element);\n    for (let i = 0; i < children.length; i++) {\n        const result = getTvFocusChildren(children[i]);\n        if (result) {\n            return result;\n        }\n    }\n}\n\nexport function getFocusableChildren(element: HTMLElement): HTMLElement[] {\n    const result: HTMLElement[] = [];\n    collectFocusableChildren(element, result);\n    return result;\n}\n\nfunction collectFocusableChildren(element: Element, result: HTMLElement[]) {\n    if (!isHTMLElement(element)) {\n        return;\n    }\n    if (getComputedStyle(element).display === 'none') {\n        return;\n    }\n    if (element.hasAttribute('tabindex') && Number(element.getAttribute('tabindex')) >= 0) {\n        result.push(element);\n        return;\n    }\n    switch (element.tagName.toLowerCase()) {\n        case 'button':\n        case 'input':\n        case 'textarea':\n        case 'select':\n        case 'details': {\n            result.push(element);\n            break;\n        }\n        case 'a': {\n            if ((element as HTMLAnchorElement).href) {\n                result.push(element);\n            }\n            break;\n        }\n        default: {\n            const children = getChildren(element);\n            for (let i = 0; i < children.length; i++) {\n                collectFocusableChildren(children[i], result);\n            }\n            break;\n        }\n    }\n}\n\nexport function getActiveElement(): Element | null {\n    let activeElement = document.activeElement;\n    if (activeElement == null) {\n        return null;\n    }\n    let nextActiveElement: Element | null | undefined;\n    while ((nextActiveElement = activeElement.shadowRoot?.activeElement) != null) {\n        activeElement = nextActiveElement;\n    }\n    return activeElement;\n}\n\nexport function upgradeCustomElementIfNeeded(element: Element): Promise<unknown> | undefined {\n    const elementName = element.nodeName.toLowerCase();\n    if (elementName.indexOf('-') >= 0) {\n        if (customElements.get(elementName)) {\n            customElements.upgrade(element);\n        } else {\n            return customElements.whenDefined(elementName);\n        }\n    }\n    return undefined;\n}\n\nexport function closestRecursive<E extends Element>(element: Element, selector: string): E | null {\n    if (!element.closest) return null;\n    const closest = element.closest<E>(selector);\n    if (closest) return closest;\n    const host = (element.getRootNode?.() as ShadowRoot | null)?.host;\n    if (host) return closestRecursive<E>(host, selector);\n    return null;\n}\n","import { type Constructor, fromArrayLike, getChildren, isArray } from '../util/CommonUtils';\nimport type { ChromelessPlayer, THEOplayerError, VideoQuality } from 'theoplayer/chromeless';\nimport type { DeviceType } from '../util/DeviceType';\nimport type { StreamType } from '../util/StreamType';\n\n/** @internal */\nexport const StateReceiverProps = 'theoplayerUiObservedProperties' as const;\n\nexport interface StateReceiverPropertyMap {\n    player: ChromelessPlayer | undefined;\n    fullscreen: boolean;\n    deviceType: DeviceType;\n    streamType: StreamType;\n    playbackRate: number;\n    activeVideoQuality: VideoQuality | undefined;\n    targetVideoQualities: VideoQuality[] | undefined;\n    error: THEOplayerError | undefined;\n    previewTime: number;\n    lang: string;\n}\n\n/**\n * A custom element that automatically receives selected state updates\n * from an ancestor {@link UIContainer | `<theoplayer-ui>`} element.\n *\n * Do not implement this interface directly, instead use {@link stateReceiver} or {@link StateReceiverMixin}.\n *\n * @see {@link stateReceiver}\n * @see {@link StateReceiverMixin}\n */\nexport interface StateReceiverElement extends Partial<StateReceiverPropertyMap>, Element {\n    /**\n     * The names of the properties this element will receive.\n     */\n    readonly [StateReceiverProps]: Array<keyof StateReceiverPropertyMap>;\n}\n\n/** @internal */\nexport function isStateReceiverElement(element: Element): element is StateReceiverElement {\n    return StateReceiverProps in element && isArray((element as Partial<StateReceiverElement>)[StateReceiverProps]);\n}\n\n/**\n * Decorates a custom element class, such that it will automatically receive selected state updates\n * from an ancestor {@link UIContainer | `<theoplayer-ui>`} element.\n *\n * For each property name in `props`, the custom element *MUST* implement a corresponding property with a setter.\n * For example, if `props` equals `[\"player\", \"fullscreen\"]`, then the element must have writable `player` and `fullscreen`\n * properties.\n *\n * @param props - The names of the properties this element will receive.\n * @returns A class decorator.\n * @see {@link StateReceiverElement}\n */\nexport const stateReceiver =\n    (props: Array<keyof StateReceiverPropertyMap>) =>\n    (target: Constructor<Element>, _context: ClassDecoratorContext<Constructor<Element>>): void => {\n        Object.defineProperty(target.prototype, StateReceiverProps, {\n            value: props\n        });\n    };\n\n/**\n * A [mixin class](https://www.typescriptlang.org/docs/handbook/mixins.html) to apply on the superclass of a custom element,\n * such that it will automatically receive selected state updates from an ancestor {@link UIContainer | `<theoplayer-ui>`} element.\n *\n * For each property name in `props`, the custom element *MUST* implement a corresponding property with a setter.\n * For example, if `props` equals `[\"player\", \"fullscreen\"]`, then the element must have writable `player` and `fullscreen`\n * properties.\n *\n * @param base - The superclass for the new element class.\n * @param props - The names of the properties this element will receive.\n * @returns A class constructor that extends `base` and implements {@link StateReceiverElement}.\n * @see {@link StateReceiverElement}\n * @deprecated Use {@link stateReceiver} decorator instead.\n */\nexport function StateReceiverMixin<T extends Constructor<Element>>(\n    base: T,\n    props: Array<keyof StateReceiverPropertyMap>\n): T & Constructor<StateReceiverElement> {\n    @stateReceiver(props)\n    abstract class StateReceiver extends base implements StateReceiverElement {\n        declare readonly [StateReceiverProps]: Array<keyof StateReceiverPropertyMap>;\n    }\n\n    return StateReceiver;\n}\n\n/** @internal */\nexport async function forEachStateReceiverElement(\n    element: Element,\n    playerElement: HTMLElement,\n    callback: (receiver: StateReceiverElement) => void\n): Promise<void> {\n    // Don't look inside the THEOplayer chromeless player\n    if (playerElement.contains(element)) {\n        return;\n    }\n    // Upgrade custom elements if needed\n    if (element.nodeName.indexOf('-') >= 0 && !isStateReceiverElement(element)) {\n        // web-components-polyfill does not correctly resolve `whenDefined()`\n        // when called during an upgrade reaction such as `connectedCallback()`.\n        // Workaround by waiting one microtask.\n        await Promise.resolve();\n        await customElements.whenDefined(element.nodeName.toLowerCase());\n        customElements.upgrade(element);\n    }\n    // Check the element\n    if (isStateReceiverElement(element)) {\n        callback(element);\n    }\n    // Check all its children\n    const children = getChildren(element);\n    if (children.length > 0) {\n        await Promise.all(fromArrayLike(children).map((child) => forEachStateReceiverElement(child, playerElement, callback)));\n    }\n}\n","import type { Duration } from './Locale';\n\nexport type DurationFormatter = (duration: Duration) => string;\n\nexport function durationFormatterForLocale(locale: string, style: 'long' | 'narrow'): DurationFormatter {\n    try {\n        // Use Intl.DurationFormat (if supported).\n        const formatter = new Intl.DurationFormat(locale, { style });\n        const zeroFormat = new Intl.DurationFormat(locale, { style, secondsDisplay: 'always' }).format({ seconds: 0 });\n        return (duration) => {\n            // If duration is zero, shows \"0 seconds\".\n            return duration.hours === 0 && duration.minutes === 0 && duration.seconds === 0 ? zeroFormat : formatter.format(duration);\n        };\n    } catch {\n        // Fall back to English.\n        return style === 'narrow' ? defaultNarrowFormatDuration : defaultFormatDuration;\n    }\n}\n\nexport function defaultFormatDuration({ hours, minutes, seconds }: Duration): string {\n    let s = '';\n    if (hours !== 0) {\n        s += `${hours} hour${hours === 1 ? '' : 's'}`;\n    }\n    if (minutes !== 0) {\n        if (s !== '') s += ', ';\n        s += `${minutes} minute${minutes === 1 ? '' : 's'}`;\n    }\n    if (seconds !== 0 || s === '') {\n        if (s !== '') s += ', ';\n        s += `${seconds} second${seconds === 1 ? '' : 's'}`;\n    }\n    return s;\n}\n\nexport function defaultNarrowFormatDuration({ hours, minutes, seconds }: Duration): string {\n    let s = '';\n    if (hours !== 0) {\n        s += `${hours}h`;\n    }\n    if (minutes !== 0) {\n        if (s !== '') s += ' ';\n        s += `${minutes}m`;\n    }\n    if (seconds !== 0 || s === '') {\n        if (s !== '') s += ' ';\n        s += `${seconds}s`;\n    }\n    return s;\n}\n","export type PercentageFormatter = (percentage: number) => string;\n\nexport function percentageFormatterForLocale(locale: string): PercentageFormatter {\n    try {\n        // Use Intl.NumberFormat (if supported).\n        const formatter = new Intl.NumberFormat(locale, { style: 'percent' });\n        return (percentage) => formatter.format(percentage);\n    } catch {\n        // Fall back to English.\n        return defaultPercentageFormatter;\n    }\n}\n\nexport function defaultPercentageFormatter(percentage: number): string {\n    return `${Math.round(percentage * 100)}%`;\n}\n","export type BandwidthFormatter = (bandwidth: number) => string;\n\nexport function bandwidthFormatterForLocale(locale: string): BandwidthFormatter {\n    try {\n        // Use Intl.Number (if supported).\n        const options: Intl.NumberFormatOptions = {\n            style: 'unit',\n            unitDisplay: 'narrow'\n        };\n        const kbpsFormatter = new Intl.NumberFormat(locale, {\n            ...options,\n            unit: 'kilobit-per-second',\n            maximumFractionDigits: 0\n        });\n        const mbpsFormatter = new Intl.NumberFormat(locale, {\n            ...options,\n            unit: 'megabit-per-second',\n            minimumSignificantDigits: 2,\n            maximumFractionDigits: 1,\n            roundingPriority: 'lessPrecision'\n        });\n        return (bandwidth) => {\n            if (bandwidth > 1e6) {\n                return mbpsFormatter.format(bandwidth / 1e6);\n            } else {\n                return kbpsFormatter.format(bandwidth / 1e3);\n            }\n        };\n    } catch {\n        return defaultBandwidthFormatter;\n    }\n}\n\nfunction defaultBandwidthFormatter(bandwidth: number): string {\n    if (bandwidth > 1e7) {\n        return `${(bandwidth / 1e6).toFixed(0)}Mb/s`;\n    } else if (bandwidth > 1e6) {\n        return `${(bandwidth / 1e6).toFixed(1)}Mb/s`;\n    } else {\n        return `${(bandwidth / 1e3).toFixed(0)}kb/s`;\n    }\n}\n","export type LanguageFormatter = (languageCode: string) => string | undefined;\n\nexport function languageFormatterForLocale(locale: string): LanguageFormatter {\n    try {\n        // Use Intl.DisplayNames (if supported).\n        const displayNames = new Intl.DisplayNames([locale, 'en'], { type: 'language', fallback: 'none' });\n        return (languageCode) => {\n            try {\n                return displayNames.of(languageCode);\n            } catch {\n                return undefined;\n            }\n        };\n    } catch {\n        return (_languageCode) => undefined;\n    }\n}\n","import { durationFormatterForLocale } from './DurationFormatter';\nimport { percentageFormatterForLocale } from './PercentageFormatter';\nimport { bandwidthFormatterForLocale } from './BandwidthFormatter';\nimport { languageFormatterForLocale } from './LanguageFormatter';\nimport type { EdgeStyle, THEOplayerError } from 'theoplayer/chromeless';\nimport type {\n    ActiveQualityDisplay,\n    AdClickThroughButton,\n    AdCountdown,\n    AdDisplay,\n    AdSkipButton,\n    AirPlayButton,\n    AutomaticQualitySelector,\n    BadNetworkModeButton,\n    BadNetworkModeMenu,\n    BadNetworkModeSelector,\n    ChromecastButton,\n    ChromecastDisplay,\n    CloseMenuButton,\n    ErrorDisplay,\n    FullscreenButton,\n    LanguageMenu,\n    LanguageMenuButton,\n    LiveButton,\n    MuteButton,\n    PlaybackRateDisplay,\n    PlaybackRateMenu,\n    PlaybackRateMenuButton,\n    PlayButton,\n    QualityRadioButton,\n    SeekButton,\n    SettingsMenu,\n    SettingsMenuButton,\n    TextTrackOffRadioButton,\n    TextTrackStyleDisplay,\n    TextTrackStyleMenu,\n    TextTrackStyleRadioGroup,\n    TextTrackStyleResetButton,\n    TimeDisplay,\n    TimeRange,\n    VolumeRange,\n    VRButton\n} from '../components';\nimport type { THEOliveDefaultUI } from '../THEOliveDefaultUI';\n\nexport interface Locale {\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link PlayButton} when it is showing a \"play\" button,\n     * i.e. when the player is paused.\n     */\n    playAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link PlayButton} when it is showing a \"pause\" button\n     * i.e. when the player is playing.\n     */\n    pauseAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link PlayButton} when it is showing a \"replay\" button\n     * i.e. when the player is paused at the end of the stream.\n     */\n    replayAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link MuteButton} when it is showing a \"mute\" button.\n     */\n    muteAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link MuteButton} when it is showing an \"unmute\" button.\n     */\n    unmuteAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link VolumeRange}.\n     */\n    volumeAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link TimeRange}.\n     */\n    seekAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link SeekButton} with a positive {@link SeekButton.seekOffset}.\n     *\n     * @param offset An offset that was formatted with {@link formatDuration}.\n     */\n    seekForwardAria(offset: string): string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link SeekButton} with a negative {@link SeekButton.seekOffset}.\n     *\n     * @param offset An offset that was formatted with {@link formatDuration}.\n     */\n    seekBackwardAria(offset: string): string;\n    /**\n     * The text on a {@link LiveButton}, e.g. \"LIVE\".\n     */\n    live: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link LiveButton}.\n     */\n    seekToLiveAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link FullscreenButton}.\n     */\n    fullscreenAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link FullscreenButton} when in fullscreen mode.\n     */\n    fullscreenExitAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link VRButton}.\n     */\n    vrAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link VRButton} when VR (stereo) mode is active.\n     */\n    vrExitAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link VRButton} when no VR capable device is available.\n     */\n    vrUnavailableAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for an {@link AirPlayButton}.\n     */\n    airplayAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for an {@link AirPlayButton} when it is connected to AirPlay.\n     */\n    airplayConnectedAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link ChromecastButton}.\n     */\n    chromecastAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link ChromecastButton} when it is connected to Chromecast.\n     */\n    chromecastConnectedAria: string;\n    /**\n     * The heading for a {@link ChromecastDisplay} when playing on Chromecast.\n     * This heading precedes the name of the connected Chromecast receiver.\n     */\n    chromecastHeading: string;\n    /**\n     * The default receiver name for a {@link ChromecastDisplay} when playing on a Chromecast receiver with an unknown name.\n     * This follows the {@link chromecastHeading}.\n     */\n    chromecastDefaultReceiverName: string;\n    /**\n     * The {@link HTMLElement.ariaValueText | `aria-valuetext`} for a {@link TimeDisplay} and {@link TimeRange}\n     * when it has both a valid time and duration to display.\n     *\n     * Examples:\n     * - \"5 seconds\" and \"10 seconds\" &rarr; \"5 seconds of 10 seconds\"\n     *\n     * @param time A time duration that was formatted with {@link formatDuration} or {@link formatRemainingDuration}.\n     * @param totalDuration A total duration that was formatted with {@link formatDuration} or {@link formatRemainingDuration}.\n     */\n    timeOfTotalAria(time: string, totalDuration: string): string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link TimeDisplay}.\n     */\n    playbackTimeAria: string;\n    /**\n     * The {@link HTMLElement.ariaValueText | `aria-valuetext`} for a {@link TimeDisplay} and {@link TimeRange}\n     * when it does not have a valid time to display.\n     */\n    unknownTimeAria: string;\n    /**\n     * The text on an {@link AdDisplay}, e.g. \"Ad\".\n     */\n    adText: string;\n    /**\n     * The text on an {@link AdDisplay} when playing multiple ads in an ad break, e.g. \"Ad X of Y\".\n     *\n     * @param currentAd The number of the currently playing ad.\n     * @param totalAds The total number of ads in the current ad break.\n     */\n    adBreakText(currentAd: number, totalAds: number): string;\n    /**\n     * The text on an {@link AdClickThroughButton}, e.g. \"Visit Advertiser\".\n     */\n    adClickThroughText: string;\n    /**\n     * The text on an {@link AdCountdown}, e.g. \"Content will resume in X seconds\".\n     *\n     * @param remainingDuration The remaining time until the content can be resumed, after being formatted with {@link formatNarrowDuration}.\n     */\n    adCountdownText(remainingDuration: string): string;\n    /**\n     * The text on an {@link AdSkipButton}, e.g. \"Skip Ad\".\n     */\n    adSkipButtonText: string;\n    /**\n     * The text on an {@link AdSkipButton} when it is showing a countdown.\n     *\n     * @param remainingDuration The remaining time until the ad can be skipped, after being formatted with {@link formatNarrowDuration}.\n     */\n    adSkipCountdownText(remainingDuration: string): string;\n    /**\n     * The announcement message on a {@link THEOliveDefaultUI} when the stream is loading.\n     */\n    liveStreamLoading: string;\n    /**\n     * The announcement message on a {@link THEOliveDefaultUI} when the stream is offline and hasn't started yet.\n     */\n    liveStreamOffline: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link CloseMenuButton}.\n     */\n    closeMenuAria: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link LanguageMenuButton}.\n     */\n    openLanguageMenuAria: string;\n    /**\n     * The heading for a {@link LanguageMenu}.\n     */\n    languageMenuHeading: string;\n    /**\n     * The section header for audio tracks in a {@link LanguageMenu}.\n     */\n    audioMenuHeading: string;\n    /**\n     * The section header for subtitle tracks in a {@link LanguageMenu}.\n     */\n    subtitleMenuHeading: string;\n    /**\n     * The label for a {@link TextTrackOffRadioButton} to disable the active subtitle track.\n     */\n    subtitleOff: string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link PlaybackRateMenuButton}.\n     */\n    openPlaybackRateMenuAria: string;\n    /**\n     * The heading for a {@link PlaybackRateMenu}.\n     */\n    playbackRateMenuHeading: string;\n    /**\n     * Formats the given playback rate for a {@link PlaybackRateMenu} and {@link PlaybackRateDisplay}.\n     *\n     * Examples:\n     * - `1` &rarr; \"Normal\"\n     * - `1.5` &rarr; \"1.5x\"\n     *\n     * @param rate The playback rate.\n     */\n    formatPlaybackRate(rate: number): string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link SettingsMenuButton}.\n     */\n    openSettingsMenuAria: string;\n    /**\n     * The heading for a {@link SettingsMenu}.\n     */\n    settingsMenuHeading: string;\n    /**\n     * The text for the quality option in a {@link SettingsMenu}.\n     */\n    qualityMenuHeading: string;\n    /**\n     * The heading for a {@link TextTrackStyleMenu}.\n     */\n    textTrackStyleMenuHeading: string;\n    /**\n     * The heading for the font family style option in a {@link TextTrackStyleMenu}.\n     */\n    textTrackStyleFontFamily: string;\n    /**\n     * The heading for the font color style option in a {@link TextTrackStyleMenu}.\n     */\n    textTrackStyleFontColor: string;\n    /**\n     * The heading for the font opacity style option in a {@link TextTrackStyleMenu}.\n     */\n    textTrackStyleFontOpacity: string;\n    /**\n     * The heading for the font size style option in a {@link TextTrackStyleMenu}.\n     */\n    textTrackStyleFontSize: string;\n    /**\n     * The heading for the background color style option in a {@link TextTrackStyleMenu}.\n     */\n    textTrackStyleBackgroundColor: string;\n    /**\n     * The heading for the background opacity style option in a {@link TextTrackStyleMenu}.\n     */\n    textTrackStyleBackgroundOpacity: string;\n    /**\n     * The heading for the window color style option in a {@link TextTrackStyleMenu}.\n     */\n    textTrackStyleWindowColor: string;\n    /**\n     * The heading for the window opacity style option in a {@link TextTrackStyleMenu}.\n     */\n    textTrackStyleWindowOpacity: string;\n    /**\n     * The heading for the edge style option in a {@link TextTrackStyleMenu}.\n     */\n    textTrackStyleEdgeStyle: string;\n    /**\n     * The label for the default style option in a {@link TextTrackStyleRadioGroup}.\n     */\n    textTrackStyleDefaultLabel: string;\n    /**\n     * The label for a {@link TextTrackStyleDisplay} when it is showing a style option\n     * that does not match any predefined values.\n     */\n    textTrackStyleCustomLabel: string;\n    /**\n     * The label for a {@link TextTrackStyleResetButton} to reset the text track style.\n     */\n    textTrackStyleResetLabel: string;\n    /**\n     * The labels for font family style options in a {@link TextTrackStyleRadioGroup},\n     * keyed by the original English label (e.g. \"Default\" or \"Monospace Serif\").\n     */\n    fontFamilyLabels: Record<KnownFontFamily, string>;\n    /**\n     * The labels for color style options in a {@link TextTrackStyleRadioGroup},\n     * keyed by the original English label (e.g. \"White\", \"Black\" or \"Red\").\n     */\n    colorLabels: Record<KnownColor, string>;\n    /**\n     * The labels for edge style options in a {@link TextTrackStyleRadioGroup},\n     * keyed by an {@link EdgeStyle} value.\n     */\n    edgeStyleLabels: Record<EdgeStyle, string>;\n    /**\n     * The label for an {@link ActiveQualityDisplay} or {@link QualityRadioButton} when it is showing the \"Automatic\" quality selection option.\n     */\n    automaticQualityLabel: string;\n    /**\n     * The label for a {@link ActiveQualityDisplay} when it is showing a quality selection option\n     * without any usable label.\n     */\n    unknownQualityLabel: string;\n    /**\n     * The label for an {@link AutomaticQualitySelector} for THEOlive's {@link BadNetworkModeMenu}.\n     */\n    highQualityLabel: string;\n    /**\n     * The label for a {@link BadNetworkModeSelector} for THEOlive's {@link BadNetworkModeMenu}.\n     */\n    lowQualityLabel: string;\n    /**\n     * The heading for an {@link ErrorDisplay}.\n     */\n    errorHeading: string;\n    /**\n     * The error message for an {@link ErrorDisplay}.\n     *\n     * This is optional. If not provided, the original `error.message` is used.\n     *\n     * @param error A player error.\n     */\n    errorMessage(error: THEOplayerError): string;\n    /**\n     * The {@link HTMLElement.ariaLabel | `aria-label`} for a {@link BadNetworkModeButton}.\n     */\n    openBadNetworkModeMenuAria: string;\n    /**\n     * Formats the given time duration as a human-readable string.\n     *\n     * This is optional. If not provided, a default {@link Intl.DurationFormat} with the {@link Intl.DurationFormatStyle | `\"long\"` style} is used.\n     *\n     * Examples:\n     * - `{ seconds: 5 }` &rarr; \"5 seconds\"\n     * - `{ minutes: 2, seconds: 10 }` &rarr; \"2 minutes and 10 seconds\"\n     *\n     * @param duration A duration, compatible with {@link Intl.DurationFormat.format}.\n     */\n    formatDuration(duration: Duration): string;\n    /**\n     * Formats the given time duration as a narrow human-readable string.\n     *\n     * This is optional. If not provided, a default {@link Intl.DurationFormat} with the {@link Intl.DurationFormatStyle | `\"narrow\"` style} is used.\n     *\n     * Examples:\n     * - `{ seconds: 5 }` &rarr; \"5s\"\n     * - `{ minutes: 2, seconds: 10 }` &rarr; \"2m 10s\"\n     *\n     * @param duration A duration, compatible with {@link Intl.DurationFormat.format}.\n     */\n    formatNarrowDuration(duration: Duration): string;\n    /**\n     * Formats the given remaining time duration as a human-readable string.\n     *\n     * Examples:\n     * - \"5 seconds\" &rarr; \"5 seconds remaining\"\n     * - \"2 minutes and 10 seconds\" &rarr; \"2 minutes and 10 seconds remaining\"\n     *\n     * @param duration A duration that was formatted with {@link formatDuration}.\n     */\n    formatRemainingDuration(duration: string): string;\n    /**\n     * Formats the given percentage as a human-readable string.\n     *\n     * This is optional. If not provided, a default {@link Intl.NumberFormat} with the {@link Intl.NumberFormatOptions.style | `\"percent\"` style} is used.\n     *\n     * Examples:\n     * - `0.75` &rarr; \"75%\"\n     * - `1.0` &rarr; \"100%\"\n     *\n     * @param percentage A percentage, between `0.0` and `1.0`.\n     */\n    formatPercentage(percentage: number): string;\n    /**\n     * Formats a bandwidth value.\n     *\n     * This is optional. If not provided, a default {@link Intl.NumberFormat} with the {@link Intl.NumberFormatOptions.style | `\"unit\"` style} is used\n     * that dynamically picks between the `\"kilobit-per-second\"` or `\"megabit-per-second\"` {@link Intl.NumberFormatOptions.unit | unit}s.\n     *\n     * Examples:\n     * - `150_000` &rarr; \"150kb/s\"\n     * - `2_500_000` &rarr; \"2.5Mb/s\"\n     *\n     * @param bandwidth A bandwidth value, in bits per second.\n     */\n    formatBandwidth(bandwidth: number): string;\n    /**\n     * Formats a language name.\n     *\n     * This is optional. If not provided, a default {@link Intl.DisplayNames} with the {@link Intl.DisplayNamesOptions.type | `\"language\"` type} is used.\n     *\n     * Examples for an English locale:\n     * - `\"en\"` &rarr; \"English\"\n     * - `\"fr\"` &rarr; \"French\"\n     * - `\"pt-BR\"` &rarr; \"Brazilian Portuguese\"\n     *\n     * Examples for a French locale:\n     * - `\"en\"` &rarr; \"anglais\"\n     * - `\"fr\"` &rarr; \"français\"\n     * - `\"pt-BR\"` &rarr; \"portugais brésilien\"\n     *\n     * @param languageCode\n     * @return A localized language name, or `undefined` if the language code is unknown.\n     */\n    formatLanguage(languageCode: string): string | undefined;\n}\n\n/**\n * A duration, compatible with {@link Intl.DurationFormat.format} and {@link Temporal.Duration}.\n */\nexport interface Duration {\n    hours: number;\n    minutes: number;\n    seconds: number;\n}\n\n/**\n * The known font families for a {@link TextTrackStyleRadioGroup}.\n */\nexport type KnownFontFamily = 'Monospace Serif' | 'Proportional Serif' | 'Monospace Sans' | 'Proportional Sans';\n\n/**\n * The known colors for a {@link TextTrackStyleRadioGroup}.\n */\nexport type KnownColor = 'White' | 'Yellow' | 'Green' | 'Cyan' | 'Blue' | 'Magenta' | 'Red' | 'Black';\n\n/**\n * A partial {@link Locale}.\n */\nexport type PartialLocale = Partial<Locale> & {\n    fontFamilyLabels?: Partial<Locale['fontFamilyLabels']>;\n    colorLabels?: Partial<Locale['colorLabels']>;\n    edgeStyleLabels?: Partial<Locale['edgeStyleLabels']>;\n};\n\nexport const defaultLocaleName = 'en';\nexport const defaultLocale: Locale = {\n    playAria: 'play',\n    pauseAria: 'pause',\n    replayAria: 'replay',\n    muteAria: 'mute',\n    unmuteAria: 'unmute',\n    volumeAria: 'volume',\n    seekAria: 'seek',\n    seekForwardAria: (offset) => `seek forward by ${offset}`,\n    seekBackwardAria: (offset) => `seek backward by ${offset}`,\n    live: 'LIVE',\n    seekToLiveAria: 'seek to live',\n    fullscreenAria: 'enter fullscreen',\n    fullscreenExitAria: 'exit fullscreen',\n    vrAria: 'watch in VR',\n    vrExitAria: 'stop watching in VR',\n    vrUnavailableAria: 'no VR capable device found',\n    airplayAria: 'start playing on AirPlay',\n    airplayConnectedAria: 'stop playing on AirPlay',\n    chromecastAria: 'start casting to Chromecast',\n    chromecastConnectedAria: 'stop casting to Chromecast',\n    chromecastHeading: 'Playing on',\n    chromecastDefaultReceiverName: 'Chromecast',\n    timeOfTotalAria: (currentTime: string, totalDuration: string) => `${currentTime} of ${totalDuration}`,\n    playbackTimeAria: 'playback time',\n    unknownTimeAria: 'video not loaded, unknown time',\n    adText: 'Ad',\n    adBreakText: (currentAd: number, totalAds: number) => `Ad ${currentAd} of ${totalAds}`,\n    adClickThroughText: 'Visit Advertiser',\n    adCountdownText: (remainingDuration: string) => `Content will resume in ${remainingDuration}`,\n    adSkipButtonText: 'Skip Ad',\n    adSkipCountdownText: (remainingDuration: string) => `Skip in ${remainingDuration}`,\n    liveStreamLoading: 'Loading...',\n    liveStreamOffline: `The live stream hasn't started yet`,\n    closeMenuAria: 'close menu',\n    openLanguageMenuAria: 'open language menu',\n    languageMenuHeading: 'Language',\n    audioMenuHeading: 'Audio',\n    subtitleMenuHeading: 'Subtitles',\n    subtitleOff: 'Off',\n    openPlaybackRateMenuAria: 'open playback speed menu',\n    playbackRateMenuHeading: 'Playback speed',\n    formatPlaybackRate: (rate: number) => (rate === 1 ? 'Normal' : `${rate}x`),\n    openSettingsMenuAria: 'open settings menu',\n    settingsMenuHeading: 'Settings',\n    qualityMenuHeading: 'Quality',\n    textTrackStyleMenuHeading: 'Subtitle options',\n    textTrackStyleFontFamily: 'Font family',\n    textTrackStyleFontColor: 'Font color',\n    textTrackStyleFontOpacity: 'Font opacity',\n    textTrackStyleFontSize: 'Font size',\n    textTrackStyleBackgroundColor: 'Background color',\n    textTrackStyleBackgroundOpacity: 'Background opacity',\n    textTrackStyleWindowColor: 'Window color',\n    textTrackStyleWindowOpacity: 'Window opacity',\n    textTrackStyleEdgeStyle: 'Character edge style',\n    textTrackStyleDefaultLabel: 'Default',\n    textTrackStyleCustomLabel: 'Custom',\n    textTrackStyleResetLabel: 'Reset',\n    fontFamilyLabels: {\n        'Monospace Serif': 'Monospace Serif',\n        'Proportional Serif': 'Proportional Serif',\n        'Monospace Sans': 'Monospace Sans',\n        'Proportional Sans': 'Proportional Sans'\n    },\n    colorLabels: {\n        White: 'White',\n        Yellow: 'Yellow',\n        Green: 'Green',\n        Cyan: 'Cyan',\n        Blue: 'Blue',\n        Magenta: 'Magenta',\n        Red: 'Red',\n        Black: 'Black'\n    },\n    edgeStyleLabels: {\n        none: 'None',\n        dropshadow: 'Drop shadow',\n        raised: 'Raised',\n        depressed: 'Depressed',\n        uniform: 'Uniform'\n    },\n    automaticQualityLabel: 'Automatic',\n    unknownQualityLabel: 'Unknown',\n    highQualityLabel: 'High Quality',\n    lowQualityLabel: 'Low Quality',\n    errorHeading: 'An error occurred',\n    errorMessage: (error) => error.message,\n    openBadNetworkModeMenuAria: 'open bad network mode menu',\n    formatDuration: durationFormatterForLocale(defaultLocaleName, 'long'),\n    formatNarrowDuration: durationFormatterForLocale(defaultLocaleName, 'narrow'),\n    formatRemainingDuration: (duration: string) => `${duration} remaining`,\n    formatPercentage: percentageFormatterForLocale(defaultLocaleName),\n    formatBandwidth: bandwidthFormatterForLocale(defaultLocaleName),\n    formatLanguage: languageFormatterForLocale(defaultLocaleName)\n};\n","import { defaultLocale, type Locale, type PartialLocale } from './Locale';\nimport { durationFormatterForLocale } from './DurationFormatter';\nimport { percentageFormatterForLocale } from './PercentageFormatter';\nimport { bandwidthFormatterForLocale } from './BandwidthFormatter';\nimport { languageFormatterForLocale } from './LanguageFormatter';\n\nconst localesByName: Record<string, Locale> = {};\n\nexport function getLocale(name: string): Locale {\n    return localesByName[name] ?? defaultLocale;\n}\n\n/**\n * Register a new locale with the given name.\n *\n * The locale's name should preferably be a BCP 47 language identifier, so it can be set as\n * a valid [`lang` attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/lang)\n * of the UI.\n *\n * @param name The name of the locale.\n * @param locale The locale.\n */\nexport function addLocale(name: string, locale: PartialLocale) {\n    // TODO Re-render all components that use this locale?\n    localesByName[name] = {\n        ...defaultLocale,\n        ...locale,\n        fontFamilyLabels: {\n            ...defaultLocale.fontFamilyLabels,\n            ...locale.fontFamilyLabels\n        },\n        colorLabels: {\n            ...defaultLocale.colorLabels,\n            ...locale.colorLabels\n        },\n        edgeStyleLabels: {\n            ...defaultLocale.edgeStyleLabels,\n            ...locale.edgeStyleLabels\n        },\n        formatDuration: locale.formatDuration ?? durationFormatterForLocale(name, 'long'),\n        formatNarrowDuration: locale.formatNarrowDuration ?? durationFormatterForLocale(name, 'narrow'),\n        formatPercentage: locale.formatPercentage ?? percentageFormatterForLocale(name),\n        formatBandwidth: locale.formatBandwidth ?? bandwidthFormatterForLocale(name),\n        formatLanguage: locale.formatLanguage ?? languageFormatterForLocale(name)\n    };\n}\n","import { type Duration, type Locale } from '../i18n';\n\nfunction isValidNumber(x: number): boolean {\n    return !isNaN(x) && isFinite(x);\n}\n\nexport function formatTime(time: number, guide: number = 0, preferNegative?: boolean): string {\n    // Handle negative values at the end\n    let negative = time < 0 || (preferNegative && time === 0);\n    time = Math.abs(time);\n\n    const guideMinutes = Math.floor((guide / 60) % 60);\n    const guideHours = Math.floor(guide / 3600);\n\n    let timeParts: string[];\n    if (!isValidNumber(time)) {\n        timeParts = [guideHours > 0 ? '--' : '', '--', '--'];\n    } else {\n        const seconds = Math.floor(time % 60);\n        const minutes = Math.floor((time / 60) % 60);\n        const hours = Math.floor(time / 3600);\n        // Check if we need to show hours.\n        const showHours = hours > 0 || guideHours > 0;\n        // If hours are showing, we may need to add a leading zero to minutes.\n        // Always show at least one digit of minutes.\n        const showMinutesLeadingZero = showHours || guideMinutes >= 0;\n        timeParts = [\n            showHours ? `${hours}` : '',\n            showMinutesLeadingZero && minutes < 10 ? `0${minutes}` : `${minutes}`,\n            seconds < 10 ? `0${seconds}` : `${seconds}`\n        ];\n    }\n\n    const timePhrase = timeParts.filter((part) => part !== '').join(':');\n    return `${negative ? '-' : ''}${timePhrase}`;\n}\n\nexport function toDuration(seconds: number): Duration {\n    return {\n        hours: Math.floor(seconds / 3600),\n        minutes: Math.floor(seconds / 60) % 60,\n        seconds: Math.floor(seconds % 60)\n    };\n}\n\nexport function formatAsTimePhrase(locale: Locale, time: number, preferNegative?: boolean): string {\n    if (!isValidNumber(time)) return '';\n    const negative = time < 0 || (preferNegative && time === 0);\n    const duration = locale.formatDuration(toDuration(Math.abs(time)));\n\n    // If the time was negative, assume it represents some remaining amount of time/\"count down\".\n    return negative ? locale.formatRemainingDuration(duration) : duration;\n}\n","// https://github.com/webmodules/custom-event/blob/master/index.js\n\n// Modern browsers\nfunction supportsNativeEvent() {\n    try {\n        const event = new Event('change');\n        return 'change' === event.type;\n    } catch (e) {}\n    return false;\n}\n\nfunction supportsNativeCustomEvent() {\n    try {\n        const event = new CustomEvent('cat', { detail: { foo: 'bar' } });\n        return 'cat' === event.type && 'bar' === event.detail.foo;\n    } catch (e) {}\n    return false;\n}\n\nfunction createWithNativeEvent(type: string, eventInitDict?: EventInit): Event {\n    return new Event(type, eventInitDict);\n}\n\nfunction createWithNativeCustomEvent(type: string, eventInitDict?: CustomEventInit): CustomEvent {\n    return new CustomEvent(type, eventInitDict);\n}\n\n// IE >= 9\nfunction createEventWithCreateEvent(type: string, eventInitDict?: EventInit): Event {\n    const e = document.createEvent('Event');\n    e.initEvent(type, eventInitDict?.bubbles || false, eventInitDict?.cancelable || false);\n    return e;\n}\n\nfunction createCustomEventWithCreateEvent(type: string, eventInitDict?: CustomEventInit): CustomEvent {\n    const e = document.createEvent('CustomEvent');\n    e.initCustomEvent(type, eventInitDict?.bubbles || false, eventInitDict?.cancelable || false, eventInitDict?.detail);\n    return e;\n}\n\nexport type EventFactory = <TType extends string = string>(type: TType, eventInitDict?: EventInit) => Event & { readonly type: TType };\n\nexport type CustomEventFactory = <TType extends string = string, TDetail = any>(\n    type: TType,\n    eventInitDict?: CustomEventInit<TDetail>\n) => CustomEvent<TDetail> & { readonly type: TType };\n\n/**\n * Cross-browser `Event` constructor.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Event/Event\n */\nexport const createEvent: EventFactory = (supportsNativeEvent() ? createWithNativeEvent : createEventWithCreateEvent) as EventFactory;\n\n/**\n * Cross-browser `CustomEvent` constructor.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n */\nexport const createCustomEvent: CustomEventFactory = (\n    supportsNativeCustomEvent() ? createWithNativeCustomEvent : createCustomEventWithCreateEvent\n) as CustomEventFactory;\n","export class Rectangle implements DOMRect {\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n\n    constructor(x: number, y: number, width: number, height: number) {\n        this.x = x;\n        this.y = y;\n        this.width = width;\n        this.height = height;\n    }\n\n    get left(): number {\n        return this.x;\n    }\n\n    set left(value: number) {\n        this.x = value;\n    }\n\n    get right(): number {\n        return this.x + this.width;\n    }\n\n    set right(value: number) {\n        this.x = value - this.width;\n    }\n\n    get top(): number {\n        return this.y;\n    }\n\n    set top(value: number) {\n        this.y = value;\n    }\n\n    get bottom(): number {\n        return this.y + this.height;\n    }\n\n    set bottom(value: number) {\n        this.y = value - this.height;\n    }\n\n    static fromRect(rect: Partial<DOMRectReadOnly>): Rectangle {\n        // Note: Internet Explorer doesn't support DOMRect.x and .y, only .left and .top\n        return new Rectangle(rect.left ?? rect.x ?? 0, rect.top ?? rect.y ?? 0, rect.width ?? 0, rect.height ?? 0);\n    }\n\n    overlaps(other: DOMRectReadOnly): boolean {\n        return this.x < other.right && this.right > other.x && this.y < other.bottom && this.bottom > other.y;\n    }\n\n    contains(other: DOMRectReadOnly): boolean {\n        return this.x <= other.x && other.right <= this.right && this.y <= other.y && other.bottom <= this.bottom;\n    }\n\n    union(other: DOMRectReadOnly): Rectangle {\n        const x = Math.min(this.x, other.x);\n        const y = Math.min(this.y, other.y);\n        const width = Math.max(this.right, other.right) - x;\n        const height = Math.max(this.bottom, other.bottom) - y;\n        return new Rectangle(x, y, width, height);\n    }\n\n    snapToPixels(): Rectangle {\n        return new Rectangle(Math.round(this.x), Math.round(this.y), Math.round(this.width), Math.round(this.height));\n    }\n\n    clone(): Rectangle {\n        return new Rectangle(this.x, this.y, this.width, this.height);\n    }\n\n    toJSON(): any {\n        return {\n            x: this.x,\n            y: this.y,\n            width: this.width,\n            height: this.height,\n            left: this.left,\n            right: this.right,\n            top: this.top,\n            bottom: this.bottom\n        };\n    }\n}\n","import { type ArrowKeyCode, KeyCode } from './KeyCode';\nimport { arrayMinByKey, getActiveElement, isHTMLElement } from './CommonUtils';\nimport { Rectangle } from './GeometryUtils';\n\nexport function getFocusedChild(): HTMLElement | null {\n    const focusedChild = getActiveElement();\n    if (!focusedChild || focusedChild === document.body || !isHTMLElement(focusedChild)) {\n        return null;\n    }\n    return focusedChild;\n}\n\nexport function navigateByArrowKey(container: HTMLElement, children: HTMLElement[], key: ArrowKeyCode): boolean {\n    const focusedChild = getFocusedChild();\n    if (focusedChild === null) {\n        return false;\n    }\n    const containerRect = Rectangle.fromRect(container.getBoundingClientRect()).snapToPixels();\n    const focusedRect = Rectangle.fromRect(focusedChild.getBoundingClientRect()).snapToPixels();\n    const childrenWithRects = children\n        .map(\n            (child): ChildWithRect => ({\n                child,\n                rect: Rectangle.fromRect(child.getBoundingClientRect()).snapToPixels()\n            })\n        )\n        .filter((x) => x.rect.width > 0 && x.rect.height > 0);\n    // Find focusable children next to the focused child along the key's direction\n    let candidates: ChildWithRect[];\n    if (key === KeyCode.LEFT || key === KeyCode.RIGHT) {\n        const bounds = focusedRect.clone();\n        if (key === KeyCode.LEFT) {\n            bounds.left = containerRect.left;\n            bounds.width = focusedRect.left - containerRect.left;\n        } else {\n            bounds.left = focusedRect.right;\n            bounds.width = containerRect.right - focusedRect.right;\n        }\n        candidates = childrenWithRects.filter((x) => bounds.overlaps(x.rect));\n        if (candidates.length === 0) {\n            bounds.top = containerRect.top;\n            bounds.height = containerRect.height;\n            candidates = childrenWithRects.filter((x) => bounds.overlaps(x.rect));\n        }\n    } else {\n        const bounds = focusedRect.clone();\n        if (key === KeyCode.UP) {\n            bounds.top = containerRect.top;\n            bounds.height = focusedRect.top - containerRect.top;\n        } else {\n            bounds.top = focusedRect.bottom;\n            bounds.height = containerRect.bottom - focusedRect.bottom;\n        }\n        candidates = childrenWithRects.filter((x) => bounds.overlaps(x.rect));\n        if (candidates.length === 0) {\n            bounds.left = containerRect.left;\n            bounds.width = containerRect.width;\n            candidates = childrenWithRects.filter((x) => bounds.overlaps(x.rect));\n        }\n    }\n    // Find the candidate closest to the currently focused child\n    const closestCandidate = arrayMinByKey(candidates, (x) => manhattanDistanceBetweenRects(x.rect, focusedRect));\n    if (closestCandidate === undefined) {\n        return false;\n    }\n    // Focus it\n    closestCandidate.child.focus();\n    return true;\n}\n\ninterface ChildWithRect {\n    child: HTMLElement;\n    rect: DOMRectReadOnly;\n}\n\nfunction manhattanDistanceBetweenRects(a: DOMRectReadOnly, b: DOMRectReadOnly): number {\n    let distance = 0;\n    if (a.right < b.left) {\n        distance += b.left - a.right;\n    } else if (b.right < a.left) {\n        distance += a.left - b.right;\n    }\n    if (a.bottom < b.top) {\n        distance += b.top - a.bottom;\n    } else if (b.bottom < a.top) {\n        distance += a.top - b.bottom;\n    }\n    return distance;\n}\n","export const CLOSE_MENU_EVENT = 'theoplayermenuclose' as const;\n\nexport interface CloseMenuEvent extends CustomEvent<OpenMenuEventDetail> {\n    type: typeof CLOSE_MENU_EVENT;\n}\n\nexport interface OpenMenuEventDetail {\n    menu: string;\n}\n","export const MENU_CHANGE_EVENT = 'theoplayermenuchange' as const;\n\nexport interface MenuChangeEvent extends CustomEvent {\n    type: typeof MENU_CHANGE_EVENT;\n}\n","export const TOGGLE_MENU_EVENT = 'theoplayermenutoggle' as const;\n\nexport interface ToggleMenuEvent extends CustomEvent<OpenMenuEventDetail> {\n    type: typeof TOGGLE_MENU_EVENT;\n}\n\nexport interface OpenMenuEventDetail {\n    menu: string;\n}\n","import type { MediaTrack, Quality, TextTrack, VideoQuality } from 'theoplayer/chromeless';\nimport type { Locale } from '../i18n';\n\nexport function isSubtitleTrack(track: TextTrack): boolean {\n    return track.kind === 'subtitles' || track.kind === 'captions';\n}\n\nexport function isNonForcedSubtitleTrack(track: TextTrack): boolean {\n    return isSubtitleTrack(track) && !track.forced;\n}\n\nexport function getTargetQualities(videoTrack: MediaTrack | undefined): Quality[] | undefined {\n    let targetQualities = videoTrack?.targetQuality;\n    if (targetQualities !== undefined && !Array.isArray(targetQualities)) {\n        targetQualities = [targetQualities];\n    }\n    return targetQualities;\n}\n\nexport function formatQualityLabel(locale: Locale, quality: VideoQuality | undefined): string | undefined {\n    if (!quality) {\n        return undefined;\n    }\n    if (quality.label && quality.label !== '') {\n        return quality.label;\n    }\n    if (quality.height) {\n        return `${quality.height}p`;\n    }\n    if (quality.bandwidth) {\n        return locale.formatBandwidth(quality.bandwidth);\n    }\n    return undefined;\n}\n","import type { EdgeStyle } from 'theoplayer/chromeless';\nimport type { KnownColor, KnownFontFamily } from '../i18n';\n\nexport const colorOptions: ReadonlyArray<{ label: KnownColor; value: `rgb(${number},${number},${number})` | '' }> = [\n    { label: 'White', value: 'rgb(255,255,255)' },\n    { label: 'Yellow', value: 'rgb(255,255,0)' },\n    { label: 'Green', value: 'rgb(0,255,0)' },\n    { label: 'Cyan', value: 'rgb(0,255,255)' },\n    { label: 'Blue', value: 'rgb(0,0,255)' },\n    { label: 'Magenta', value: 'rgb(255,0,255)' },\n    { label: 'Red', value: 'rgb(255,0,0)' },\n    { label: 'Black', value: 'rgb(0,0,0)' }\n];\nexport const fontFamilyOptions: ReadonlyArray<{ label: KnownFontFamily; value: string }> = [\n    { label: 'Monospace Serif', value: '\"Courier New\", Courier, \"Nimbus Mono L\", \"Cutive Mono\", monospace' },\n    { label: 'Proportional Serif', value: '\"Times New Roman\", Times, Georgia, Cambria, \"PT Serif Caption\", serif' },\n    { label: 'Monospace Sans', value: '\"Deja Vu Sans Mono\", \"Lucida Console\", Monaco, Consolas, \"PT Mono\", monospace' },\n    { label: 'Proportional Sans', value: 'Arial, Helvetica, Verdana, \"PT Sans Caption\", sans-serif' }\n];\nexport const sizeOptions: ReadonlyArray<number> = [0.5, 0.75, 1.0, 1.5, 2.0];\nexport const opacityOptions: ReadonlyArray<number> = [0.25, 0.5, 0.75, 1.0];\nexport const edgeStyleOptions: ReadonlyArray<EdgeStyle> = ['none', 'dropshadow', 'raised', 'depressed', 'uniform'];\n","import { stringStartsWith } from './CommonUtils';\n\nexport interface RgbaColor {\n    r_: number; // 0..255\n    g_: number; // 0..255\n    b_: number; // 0..255\n    a_: number; // 0..1\n}\n\nfunction parseHexColor(hex: string): RgbaColor | null {\n    const m = hex.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n    return m\n        ? {\n              r_: parseInt(m[1], 16),\n              g_: parseInt(m[2], 16),\n              b_: parseInt(m[3], 16),\n              a_: 1\n          }\n        : null;\n}\n\nfunction parseRgbaColor(rgbaString: string): RgbaColor | null {\n    const m = rgbaString.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([0-9.]+))?\\)$/i);\n    return m\n        ? {\n              r_: parseInt(m[1], 10),\n              g_: parseInt(m[2], 10),\n              b_: parseInt(m[3], 10),\n              a_: m[4] ? parseFloat(m[4]) : 1\n          }\n        : null;\n}\n\nexport function parseColor(colorString: string | null | undefined): RgbaColor | null {\n    if (!colorString) {\n        return null;\n    } else if (stringStartsWith(colorString, 'rgb')) {\n        return parseRgbaColor(colorString);\n    } else if (stringStartsWith(colorString, '#')) {\n        return parseHexColor(colorString);\n    } else {\n        return null;\n    }\n}\n\nexport function toRgba(color: RgbaColor): string {\n    return `rgba(${color.r_},${color.g_},${color.b_},${color.a_})`;\n}\n\nexport function toRgb(color: RgbaColor): string {\n    return `rgb(${color.r_},${color.g_},${color.b_})`;\n}\n\nexport function colorWithAlpha(color: RgbaColor, alpha: number): RgbaColor {\n    return {\n        r_: color.r_,\n        g_: color.g_,\n        b_: color.b_,\n        a_: alpha\n    };\n}\n\nexport function rgbEquals(left: RgbaColor, right: RgbaColor): boolean {\n    return left.r_ === right.r_ && left.g_ === right.g_ && left.b_ === right.b_;\n}\n\nexport const COLOR_WHITE: RgbaColor = parseColor('#ffffff')!;\nexport const COLOR_BLACK: RgbaColor = parseColor('#000000')!;\n","export const ENTER_FULLSCREEN_EVENT = 'theoplayerfullscreenenter' as const;\n\nexport interface EnterFullscreenEvent extends CustomEvent {\n    type: typeof ENTER_FULLSCREEN_EVENT;\n}\n","export const EXIT_FULLSCREEN_EVENT = 'theoplayerfullscreenexit' as const;\n\nexport interface ExitFullscreenEvent extends CustomEvent {\n    type: typeof EXIT_FULLSCREEN_EVENT;\n}\n","/**\n * @license\n * Copyright (c) 2020 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nfunction setProperties(element, properties) {\n    const style = element.style;\n    for (const [propertyName, value] of Object.entries(properties)) {\n        style.setProperty(propertyName, value);\n    }\n}\n/**\n * True if the ShadyCSS scoped style polyfill is loaded and active.\n *\n * Note that the other functions in this module are safe to call even if the\n * polyfills are not loaded.\n */\nfunction scopedStylesArePolyfilled() {\n    return (window.ShadyCSS !== undefined && window.ShadyCSS.nativeShadow === false);\n}\n/**\n * True if the ShadyCSS custom properties polyfill is loaded and active.\n *\n * Note that the other functions in this module are safe to call even if the\n * polyfills are not loaded.\n */\nfunction customPropertiesArePolyfilled() {\n    return window.ShadyCSS !== undefined && window.ShadyCSS.nativeCss === false;\n}\n/**\n * Prepare the given custom element template for use with the ShadyCSS style\n * scoping polyfill. You only need to do this once per template.\n *\n * If ShadyCSS is not active, then this function does nothing.\n *\n * If ShadyCSS is active, then after styleElement is called on the first\n * instance of this element, <style> tags within this template will be moved to\n * the <head> and re-written to use globally scoped rules that emulate scoped\n * behavior.\n *\n * Note that LitElement and Polymer Library users do not typically need to call\n * this function, because it is called automatically.\n */\nexport function prepareTemplate(template, customElementName) {\n    if (scopedStylesArePolyfilled()) {\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        window.ShadyCSS.prepareTemplate(template, customElementName);\n    }\n}\n/**\n * Activate scoped styles for the given element instance. This function should\n * typically be called inside connectedCallback. The template of this element\n * class must already have been registered with prepareTemplate.\n *\n * If ShadyCSS is not active, then this function does nothing.\n *\n * Note that LitElement and Polymer Library users do not typically need to call\n * this function, because it is called automatically.\n */\nexport function styleElement(element) {\n    if (scopedStylesArePolyfilled()) {\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        window.ShadyCSS.styleElement(element);\n    }\n}\n/**\n * Propagate CSS custom properties on this element to all descendant shadow\n * roots, and optionally set new ones.\n *\n * Uses ShadyCSS custom property emulation if the polyfill is active, otherwise\n * calls native style.setProperty.\n */\nexport function styleSubtree(element, properties) {\n    if (customPropertiesArePolyfilled()) {\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        window.ShadyCSS.styleSubtree(element, properties);\n    }\n    else if (properties != null) {\n        setProperties(element, properties);\n    }\n}\n//# sourceMappingURL=interface.js.map","import { arrayFindIndex } from './CommonUtils';\n\nexport type ColorStop = [color: string, percent: number];\n\nexport class ColorStops {\n    private _stops: ColorStop[] = [['transparent', 100]];\n\n    constructor() {}\n\n    add(color: string, from: number, to: number): void {\n        from = Math.max(from, 0);\n        to = Math.min(to, 100);\n        if (from >= to) {\n            return;\n        }\n        const previousIndex = arrayFindIndex(this._stops, ([, percent]) => from <= percent);\n        if (previousIndex < 0) {\n            return;\n        }\n        const [previousColor, previousPercent] = this._stops[previousIndex];\n        const newStops: ColorStop[] = [];\n        if (from > 0) {\n            newStops.push([previousColor, from]);\n        }\n        newStops.push([color, to]);\n        if (to < previousPercent) {\n            // New stop is fully contained within previous stop\n            // Split previous stop\n            newStops.push([previousColor, previousPercent]);\n            this._stops.splice(previousIndex, 1, ...newStops);\n        } else {\n            // New stop extends beyond previous stop\n            // Remove overlapping stops\n            let nextIndex = previousIndex + 1;\n            while (nextIndex < this._stops.length) {\n                if (to < this._stops[nextIndex][1]) {\n                    break;\n                }\n                nextIndex++;\n            }\n            this._stops.splice(previousIndex, nextIndex - previousIndex, ...newStops);\n        }\n    }\n\n    toGradientStops(): string {\n        const gradientStops: string[] = [];\n        let prevPercent = 0;\n        for (const [color, percent] of this._stops) {\n            if (percent < prevPercent) continue;\n            gradientStops.push(`${color} ${prevPercent}%`);\n            gradientStops.push(`${color} ${percent}%`);\n            prevPercent = percent;\n        }\n        return gradientStops.join(', ');\n    }\n}\n","export const PREVIEW_TIME_CHANGE_EVENT = 'theoplayerpreviewtimechange' as const;\n\nexport interface PreviewTimeChangeEvent extends CustomEvent<PreviewTimeChangeEventDetail> {\n    type: typeof PREVIEW_TIME_CHANGE_EVENT;\n}\n\nexport interface PreviewTimeChangeEventDetail {\n    previewTime: number;\n}\n","import type { Ad } from 'theoplayer/chromeless';\n\nexport function isLinearAd(ad: Ad): boolean {\n    return ad.type === 'linear';\n}\n","import { Button, type ButtonOptions } from './Button';\nimport { property, state } from 'lit/decorators.js';\nimport { Attribute } from '../util/Attribute';\nimport type { CastState, VendorCast } from 'theoplayer/chromeless';\n\n/**\n * A generic button to start and stop casting.\n *\n * For a concrete implementation, see {@link ChromecastButton} and {@link AirPlayButton}.\n * @group Components\n */\nexport class CastButton extends Button {\n    private _castApi: VendorCast | undefined;\n    private _castState: CastState = 'unavailable';\n\n    constructor(options?: ButtonOptions) {\n        super(options);\n    }\n\n    override connectedCallback() {\n        super.connectedCallback();\n        this._updateCastState();\n    }\n\n    /**\n     * The cast API for this cast button.\n     */\n    get castApi(): VendorCast | undefined {\n        return this._castApi;\n    }\n\n    @state()\n    set castApi(castApi: VendorCast | undefined) {\n        if (this._castApi !== undefined) {\n            this._castApi.removeEventListener('statechange', this._updateCastState);\n        }\n        this._castApi = castApi;\n        this._updateCastState();\n        if (this._castApi !== undefined) {\n            this._castApi.addEventListener('statechange', this._updateCastState);\n        }\n    }\n\n    /**\n     * The current cast state.\n     */\n    get castState(): CastState {\n        return this._castState;\n    }\n\n    @property({ reflect: true, state: true, type: String, attribute: Attribute.CAST_STATE })\n    private set castState(castState: CastState) {\n        this._castState = castState;\n    }\n\n    protected override handleClick(): void {\n        if (this._castApi) {\n            this._updateCastState();\n            const state = this.castState;\n            if (state === 'available') {\n                this._castApi.start();\n            } else if (state === 'connecting' || state === 'connected') {\n                this._castApi.stop();\n            }\n        }\n    }\n\n    private readonly _updateCastState = (): void => {\n        this.castState = this._castApi ? this._castApi.state : 'unavailable';\n    };\n}\n","import { html } from 'lit';\n\nexport default (id: number) =>\n    html`<span part=\"icon\">\n        <svg aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\" height=\"24\" width=\"24\">\n            <defs>\n                <clipPath id=\"theoplayer-chromecast-rings-mask-${id}\">\n                    <path d=\"M0-36h44V0H0z\" />\n                </clipPath>\n            </defs>\n            <path class=\"theoplayer-chromecast-outer\" d=\"M2 10a4 4 0 0 1 4-4h36a4 4 0 0 1 4 4v28a4 4 0 0 1-4 4H28v-4h14V10H6v6H2z\" />\n            <path class=\"theoplayer-chromecast-inner\" d=\"M10 14h28v20H26.74A26 26 0 0 0 10 17.26z\" />\n            <g\n                class=\"theoplayer-chromecast-rings\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                stroke-width=\"4\"\n                transform=\"translate(2 42)\"\n                clip-path=\"url(#theoplayer-chromecast-rings-mask-${id})\"\n            >\n                <circle stroke=\"none\" cx=\"0\" cy=\"0\" r=\"30\" />\n                <circle class=\"theoplayer-chromecast-ring theoplayer-chromecast-ring1\" stroke-width=\"6\" cx=\"0\" cy=\"0\" r=\"3\" />\n                <circle class=\"theoplayer-chromecast-ring theoplayer-chromecast-ring2\" cx=\"0\" cy=\"0\" r=\"12\" />\n                <circle class=\"theoplayer-chromecast-ring theoplayer-chromecast-ring3\" cx=\"0\" cy=\"0\" r=\"20\" />\n                <path class=\"theoplayer-chromecast-ring theoplayer-chromecast-ring4\" stroke-linecap=\"round\" d=\"M0-20A20 20 0 0 1 20 0\" />\n            </g>\n        </svg>\n    </span>`;\n","import { html } from 'lit';\n\nexport default html`<span part=\"icon\">\n    <svg aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" height=\"24\" width=\"24\">\n        <path class=\"theoplayer-airplay-inner\" d=\"M5 7h14v8H5z\" />\n        <path d=\"M6 22h12l-6-6zM21 3H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h4v-2H3V5h18v12h-4v2h4c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\" />\n    </svg>\n</span>`;\n","import { html } from 'lit';\n\nexport default html`<div part=\"icon\">\n    <slot name=\"icon\">\n        <div aria-hidden=\"true\" class=\"theoplayer-loading-progress\">\n            <div class=\"theoplayer-loading-spinner\">\n                <div class=\"theoplayer-loading-circle-clipper theoplayer-loading-circle-left\">\n                    <svg viewBox=\"0 0 48 48\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <circle cx=\"24\" cy=\"24\" r=\"18\" fill=\"none\" stroke-dasharray=\"113.097\" stroke-dashoffset=\"56.549\" stroke-width=\"4\" />\n                    </svg>\n                </div>\n                <div class=\"theoplayer-loading-gap-patch\">\n                    <svg viewBox=\"0 0 48 48\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <circle cx=\"24\" cy=\"24\" r=\"18\" fill=\"none\" stroke-dasharray=\"113.097\" stroke-dashoffset=\"56.549\" stroke-width=\"3.2\" />\n                    </svg>\n                </div>\n                <div class=\"theoplayer-loading-circle-clipper theoplayer-loading-circle-right\">\n                    <svg viewBox=\"0 0 48 48\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <circle cx=\"24\" cy=\"24\" r=\"18\" fill=\"none\" stroke-dasharray=\"113.097\" stroke-dashoffset=\"56.549\" stroke-width=\"4\" />\n                    </svg>\n                </div>\n            </div>\n        </div>\n    </slot>\n</div>`;\n","import type { DefaultUI } from '../DefaultUI';\n\n/**\n * An extension for the default UI.\n *\n * This is called whenever a `<theoplayer-default-ui>` element is created.\n * The extension can then choose to modify this element, for example by appending extra elements\n * or attaching extra event listeners.\n *\n * @example\n * The following extension adds an extra button to the bottom control bar of every default UI:\n * ```javascript\n * THEOplayerUI.registerExtension((ui) => {\n *     // Create a new button\n *     const button = new THEOplayerUI.Button();\n *     button.innerHTML = \"Click me!\";\n *     button.addEventListener(\"click\", () => alert(\"I was clicked!\"));\n *     // Place it in the bottom control bar\n *     button.slot = \"bottom-control-bar\";\n *     ui.appendChild(button);\n * });\n * ```\n * See the documentation of `<theoplayer-default-ui>` for more information about the available slots\n * in which you can add extra elements.\n */\nexport type Extension = (ui: DefaultUI) => void;\n\nconst extensionRegistry: Extension[] = [];\n\n/**\n * Registers an extension for the default UI.\n *\n * @param extension The extension.\n * @see {@link Extension}\n */\nexport function registerExtension(extension: Extension): void {\n    extensionRegistry.push(extension);\n}\n\nexport function applyExtensions(ui: DefaultUI): void {\n    for (const extension of extensionRegistry) {\n        extension(ui);\n    }\n}\n","export interface FullscreenAPIMap {\n    requestFullscreen_: 'requestFullscreen';\n    exitFullscreen_: 'exitFullscreen';\n    fullscreenElement_: 'fullscreenElement';\n    fullscreenEnabled_: 'fullscreenEnabled';\n    fullscreenchange_: 'fullscreenchange';\n    fullscreenerror_: 'fullscreenerror';\n}\n\nexport const fullscreenAPI: FullscreenAPIMap | undefined = (() => {\n    if (typeof document === 'undefined') {\n        return;\n    }\n\n    // browser API methods\n    // map approach from Screenful.js - https://github.com/sindresorhus/screenfull.js\n    const apiMap: string[][] = [\n        // Spec: https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html\n        ['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'],\n        // WebKit\n        [\n            'webkitRequestFullscreen',\n            'webkitExitFullscreen',\n            'webkitFullscreenElement',\n            'webkitFullscreenEnabled',\n            'webkitfullscreenchange',\n            'webkitfullscreenerror'\n        ],\n        // Old WebKit (Safari 5.1)\n        [\n            'webkitRequestFullScreen',\n            'webkitCancelFullScreen',\n            'webkitCurrentFullScreenElement',\n            'webkitCancelFullScreen',\n            'webkitfullscreenchange',\n            'webkitfullscreenerror'\n        ],\n        // Mozilla\n        ['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'],\n        // Microsoft\n        ['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']\n    ];\n\n    for (let browserMap of apiMap) {\n        // check for exitFullscreen function\n        if (browserMap[1] in document) {\n            return {\n                requestFullscreen_: browserMap[0],\n                exitFullscreen_: browserMap[1],\n                fullscreenElement_: browserMap[2],\n                fullscreenEnabled_: browserMap[3],\n                fullscreenchange_: browserMap[4],\n                fullscreenerror_: browserMap[5]\n            } as FullscreenAPIMap;\n        }\n    }\n\n    return undefined;\n})();\n","/**\n * User-Agent Client Hints\n * https://wicg.github.io/ua-client-hints/\n */\ninterface NavigatorUA extends Navigator {\n    readonly userAgentData: NavigatorUAData;\n}\n\ninterface NavigatorUAData {\n    readonly mobile: boolean;\n}\n\nexport function isMobile(): boolean {\n    if (typeof navigator !== 'object') {\n        return false;\n    }\n    if ((navigator as NavigatorUA).userAgentData) {\n        return (navigator as NavigatorUA).userAgentData.mobile;\n    }\n    const userAgent = navigator.userAgent;\n    if (!userAgent) {\n        return false;\n    }\n    return /Android|iPhone|iPad|iPod|Mobile Safari|Windows Phone/i.test(userAgent);\n}\n\nexport function isIOS(): boolean {\n    if (typeof navigator !== 'object') {\n        return false;\n    }\n    const userAgent = navigator.userAgent;\n    if (!userAgent) {\n        return false;\n    }\n    // iPadOS 13+ reports as \"Macintosh\", so also detect it via touch support.\n    return /iPad|iPhone|iPod/.test(userAgent) || (/Macintosh/.test(userAgent) && navigator.maxTouchPoints > 1);\n}\n\nexport function isTv(): boolean {\n    if (typeof navigator !== 'object') {\n        return false;\n    }\n    const userAgent = navigator.userAgent;\n    if (!userAgent) {\n        return false;\n    }\n    return /\\b(tv|smart-tv|smarttv|appletv|crkey|googletv|hbbtv|pov_tv|roku|viera|nettv|philipstv)\\b/i.test(userAgent);\n}\n","export const USER_IDLE_CHANGE_EVENT = 'theoplayeruseridlechange' as const;\n\nexport interface UserIdleChangeEvent extends CustomEvent {\n    type: typeof USER_IDLE_CHANGE_EVENT;\n}\n","export const READY_EVENT = 'theoplayerready' as const;\n\nexport interface ReadyEvent extends CustomEvent<undefined> {\n    type: typeof READY_EVENT;\n}\n","import globalCss from './Global.css';\nimport { setTextContent } from './util/CommonUtils';\nimport { supportsAdoptingStyleSheets } from 'lit';\n\nconst GLOBAL_STYLE_ID = 'theoplayer-ui-global-styles';\n\nlet globalStylesAdded = false;\n\nexport function addGlobalStyles() {\n    if (globalStylesAdded) {\n        return;\n    }\n    if (supportsAdoptingStyleSheets) {\n        document.adoptedStyleSheets.push(globalCss.styleSheet!);\n    } else if (!document.getElementById(GLOBAL_STYLE_ID)) {\n        const styleEl = document.createElement('style');\n        styleEl.id = GLOBAL_STYLE_ID;\n        // See https://lit.dev/docs/api/LitElement/#LitElement.styles\n        const nonce = (window as any)['litNonce'];\n        if (nonce !== undefined) {\n            styleEl.setAttribute('nonce', nonce);\n        }\n        setTextContent(styleEl, globalCss.cssText);\n        document.head.appendChild(styleEl);\n    }\n    globalStylesAdded = true;\n}\n","import type { StreamType } from '../util/StreamType';\n\nexport const STREAM_TYPE_CHANGE_EVENT = 'theoplayerstreamtypechange' as const;\n\nexport interface StreamTypeChangeEvent extends CustomEvent<StreamTypeChangeEventDetail> {\n    type: typeof STREAM_TYPE_CHANGE_EVENT;\n}\n\nexport interface StreamTypeChangeEventDetail {\n    streamType: StreamType;\n}\n","/**\n * The delay before we should start handling clicks\n * after the user becomes active again (in milliseconds).\n *\n * When the user is idle and then touches the player, that first touch\n * should not trigger any accidental clicks on UI controls. Therefore,\n * we will keep all UI controls inactive for a little bit longer\n * after that first touch, until this delay has passed.\n */\nexport const ACCIDENTAL_CLICK_DELAY = 50;\n","import { version as packageVersion } from '../package.json';\n\n/**\n * The version of Open Video UI for Web.\n */\nexport const version: string = packageVersion;\n"],"names":["_apply_decs_2203_r","targetClass","memberDecs","classDecs","parentClass","createAddInitializerMethod","initializers","decoratorFinishedRef","initializer","assertNotFinished","fnName","v","Error","assertCallable","push","memberDec","dec","name","desc","kind","isStatic","isPrivate","metadata","value","kindStr","get","set","ctx","static","private","addInitializer","call","originalGet","target","arguments","length","originalSet","access","has","newValue","fn","hint","TypeError","assertValidReturnValue","type","undefined","init","pushInitializers","ret","instance","i","defineMetadata","Class","Object","defineProperty","Symbol","for","configurable","enumerable","parentMetadata","create","e","applyMemberDecs","decInfos","existingProtoNonFields","Map","existingStaticNonFields","protoInitializers","staticInitializers","base","decInfo","Array","isArray","prototype","existingNonFields","existingKind","applyMemberDec","newInit","decs","getOwnPropertyDescriptor","ownInitializers","originalInitializer","args","c","applyClassDecs","newClass","nextNewClass","_identity","x","Attribute","KeyCode","ExtensionSlot","LitElement","ariaLabel","_init_ariaLabel","href","_init_target","paused","ended","lang","Button","_init_paused","_init_lang","volumeLevel","seekOffset","remaining","remainingWhenLive","showDuration","streamType","_currentTime","_duration","_endTime","_init_remaining","_init_remainingWhenLive","_init_showDuration","_init__currentTime","_init__endTime","duration","_init_duration","_init_value","_init_deviceType","deviceType","closeOnInput","_init_closeOnInput","_menuSlot","_init__menuSlot","_init__ariaControls","_ariaControls","RadioButton","_track","_tracksList","showOffButton","_init__tracksList","MenuGroup","_hasAudioTracks","_hasSubtitles","_init__hasAudioTracks","_init__hasSubtitles","MenuButton","Menu","_init_playbackRate","playbackRate","_init_activeVideoQuality","targetVideoQualities","_quality","fullscreen","stereo","_yaw","_init__yaw","_pointerWidth","step","ariaLive","_init__pointerWidth","_init_step","_init_ariaLive","_thumbnailVisible","_init__thumbnailVisible","previewTime","_init_previewTime","_previewRailTransform","Range","_init__previewRailTransform","error","_init_error","CastButton","_receiverName","_init__receiverName","loading","_init_loading","live","_init_streamType","_currentAd","_totalAds","_init__currentAd","_init__totalAds","_maxRemainingDuration","LinkButton","_showCountdown","_timeToSkip","_init__showCountdown","_init__timeToSkip","AbstractQualitySelector","_inBadNetworkMode","mobile","tv","_hasFirstPlay","_isPlayingAd","_hasError","_isFullWindow","_init_mobile","_init_tv","_init__hasFirstPlay","_init__isPlayingAd","_init__hasError","_init__isFullWindow","_timeRangeInert","titleSlotNodes","fluid","muted","autoplay","_hasTitle","_init_fluid","_init_muted","_init_autoplay","_init__hasTitle","_announcementType","_announcementMessage","_hidePlayButton","_hideErrorDisplay","DefaultUI","_init__announcementType","_init__hideErrorDisplay","_class_private_field_loose_base","receiver","privateKey","hasOwnProperty","customElement","ControlBar","styles","controlBarCss","shadowRootOptions","delegatesFocus","_initClass","render","html","id","_class_private_field_loose_key","isArrowKey","keyCode","isBackKey","isActivationKey","buttonTemplate","button","extraCss","property","reflect","Boolean","attribute","DISABLED","_dec2","state","String","ARIA_LABEL","buttonCss","connectedCallback","hasAttribute","setAttribute","ARIA_LIVE","_disabled","_enable","disconnectedCallback","removeEventListener","_onClick","_onKeyDown","_onKeyUp","disabled","_disable","addEventListener","removeAttribute","blur","_template","templateContent","handleClick","options","metaKey","altKey","template","performUpdate","linkButtonTemplate","linkButtonCss","ref","_linkRef","renderLinkContent","createRef","event","SPACE","_this__linkRef_value","preventDefault","click","noOp","isElement","node","nodeType","Node","ELEMENT_NODE","isHTMLElement","HTMLElement","SlotContainer","slotContainerCss","arg","toString","fromArrayLike","from","arrayLike","slice","arrayFind","find","array","predicate","arrayFindIndex","findIndex","stringStartsWith","startsWith","string","search","substring","toggleAttribute","element","enabled","getChildren","shadowRoot","children","localName","toLowerCase","assignedNodes","filter","getSlottedElements","slot","elements","flatten","isSlotContainer","nodeName","getFocusableChildren","result","collectFocusableChildren","getComputedStyle","display","Number","getAttribute","tagName","upgradeCustomElementIfNeeded","elementName","indexOf","customElements","whenDefined","upgrade","closestRecursive","selector","closest","host","getRootNode","_element_getRootNode","StateReceiverProps","isStateReceiverElement","stateReceiver","props","_context","StateReceiverMixin","StateReceiver","forEachStateReceiverElement","playerElement","callback","contains","Promise","resolve","all","map","child","durationFormatterForLocale","locale","style","formatter","Intl","DurationFormat","zeroFormat","secondsDisplay","format","seconds","hours","minutes","defaultNarrowFormatDuration","defaultFormatDuration","s","percentageFormatterForLocale","NumberFormat","percentage","defaultPercentageFormatter","Math","round","bandwidthFormatterForLocale","unitDisplay","kbpsFormatter","unit","maximumFractionDigits","mbpsFormatter","minimumSignificantDigits","roundingPriority","bandwidth","defaultBandwidthFormatter","toFixed","languageFormatterForLocale","displayNames","DisplayNames","fallback","languageCode","of","_languageCode","defaultLocale","playAria","pauseAria","replayAria","muteAria","unmuteAria","volumeAria","seekAria","seekForwardAria","offset","seekBackwardAria","seekToLiveAria","fullscreenAria","fullscreenExitAria","vrAria","vrExitAria","vrUnavailableAria","airplayAria","airplayConnectedAria","chromecastAria","chromecastConnectedAria","chromecastHeading","chromecastDefaultReceiverName","timeOfTotalAria","currentTime","totalDuration","playbackTimeAria","unknownTimeAria","adText","adBreakText","currentAd","totalAds","adClickThroughText","adCountdownText","remainingDuration","adSkipButtonText","adSkipCountdownText","liveStreamLoading","liveStreamOffline","closeMenuAria","openLanguageMenuAria","languageMenuHeading","audioMenuHeading","subtitleMenuHeading","subtitleOff","openPlaybackRateMenuAria","playbackRateMenuHeading","formatPlaybackRate","rate","openSettingsMenuAria","settingsMenuHeading","qualityMenuHeading","textTrackStyleMenuHeading","textTrackStyleFontFamily","textTrackStyleFontColor","textTrackStyleFontOpacity","textTrackStyleFontSize","textTrackStyleBackgroundColor","textTrackStyleBackgroundOpacity","textTrackStyleWindowColor","textTrackStyleWindowOpacity","textTrackStyleEdgeStyle","textTrackStyleDefaultLabel","textTrackStyleCustomLabel","textTrackStyleResetLabel","fontFamilyLabels","colorLabels","White","Yellow","Green","Cyan","Blue","Magenta","Red","Black","edgeStyleLabels","none","dropshadow","raised","depressed","uniform","automaticQualityLabel","unknownQualityLabel","highQualityLabel","lowQualityLabel","errorHeading","errorMessage","message","openBadNetworkModeMenuAria","formatDuration","formatNarrowDuration","formatRemainingDuration","formatPercentage","formatBandwidth","formatLanguage","localesByName","getLocale","addLocale","PLAYER_EVENTS","PAUSED","_dec3","ENDED","_dec4","LANG","PlayButton","playButtonCss","_updateFromPlayer","_updateAriaLabel","player","_player","_onPlay","_onPause","_updateEnded","_this__player","_ref","source","play","pause","vr","useDeviceMotionControls","willUpdate","changedProperties","unsafeSVG","_updateDisabled","VOLUME_LEVEL","MuteButton","muteButtonCss","volume","isValidNumber","isNaN","isFinite","formatTime","time","guide","preferNegative","timeParts","negative","guideMinutes","floor","guideHours","abs","showHours","showMinutesLeadingZero","timePhrase","part","join","toDuration","formatAsTimePhrase","SEEK_OFFSET","SeekButton","seekButtonCss","max","min","DEFAULT_SEEK_OFFSET","REMAINING","REMAINING_WHEN_LIVE","_dec5","SHOW_DURATION","_dec6","STREAM_TYPE","_dec7","_dec8","TimeDisplay","textDisplayCss","text","ariaValueText","endTime","NaN","seekable","end","DurationDisplay","createEvent","supportsNativeEvent","Event","eventInitDict","document","initEvent","bubbles","cancelable","createCustomEvent","supportsNativeCustomEvent","CustomEvent","detail","foo","initCustomEvent","ARIA_CHECKED","converter","fromAttribute","toAttribute","VALUE","checked","_checked","handleChange","dispatchEvent","composed","Rectangle","left","right","width","top","y","bottom","height","fromRect","rect","overlaps","other","union","snapToPixels","clone","toJSON","getFocusedChild","focusedChild","getActiveElement","activeElement","nextActiveElement","body","navigateByArrowKey","container","key","keySelector","candidates","containerRect","getBoundingClientRect","focusedRect","childrenWithRects","LEFT","RIGHT","bounds","UP","closestCandidate","a","b","distance","arrayMinBy","comparator","reduce","first","second","focus","DEVICE_TYPE","RadioGroup","_onSlotChange","firstUpdated","createRenderRoot","root","_onButtonChange","_value","updateCheckedButton","focusedRadioButton","_radioButtons","tabIndex","checkedRadioButton","firstRadioButton","_this__radioButtons_","lastRadioButton","radioButtons","allRadioButtons","_prevRadioButton","index","_nextRadioButton","_focusPrevButton","focusedButton","setFocusedRadioButton","_focusNextButton","_unfocusAll","setCheckedRadioButton","checkedButton","_slotRef","upgradePromises","isRadioButton","promise","then","_this_firstRadioButton","stopPropagation","DOWN","HOME","END","CLOSE_MENU_EVENT","MENU_CHANGE_EVENT","menuTemplate","heading","content","MENU_CLOSE_ON_INPUT","MENU_OPENED","menuCss","menuOpened_","HIDDEN","_menuOpened","menuOpened","changeEvent","openMenu","closeMenu","renderMenuHeading","_onContentInput","renderMenuContent","TOGGLE_MENU_EVENT","menuGroupTemplate","isMenuElement","query","menuGroupCss","_onToggleMenu","_onCloseMenu","_onMenuChange","_onMenuListChange","getMenuById","menuId","_menus","menu","opener","menuToOpen","previousEntry","getCurrentMenu_","_openMenuStack","entry","closeMenusFromIndex_","oldEntry","_this__openMenuStack_","menuToClose","nextEntry","menusToClose","splice","hasCurrentMenu","closeCurrentMenu","currentMenu","isMenuOpen","some","newMenus","oldMenu","newMenu","rawEvent","MENU","_menuId","CloseMenuButton","TRACK_EVENTS","MediaTrackRadioButton","track","_onTrackChange","_updateFromTrack","requestUpdate","_updateTrack","label","formatMediaTrackLabel","language","localizedLanguageName","isSubtitleTrack","isNonForcedSubtitleTrack","forced","getTargetQualities","videoTrack","targetQualities","targetQuality","formatQualityLabel","quality","TRACK_TYPE","SHOW_OFF","TrackRadioGroup","verticalRadioGroupCss","trackType","_trackType","_updateTracksList","_updateTracks","_getTracksList","audioTracks","videoTracks","textTracks","oldList","newList","_getTracks","tracks","isSubtitles","_onChange","repeat","uid","TextTrackRadioButton","mode","formatTextTrackLabel","test","captionChannel","TextTrackOffRadioButton","trackList","_trackList","_updateFromTrackList","_updateTrackList","disableSubtitleTracks","colorOptions","fontFamilyOptions","sizeOptions","opacityOptions","edgeStyleOptions","parseColor","colorString","m","rgbaString","match","r_","parseInt","g_","b_","a_","parseFloat","hex","toRgba","color","toRgb","colorWithAlpha","alpha","COLOR_WHITE","COLOR_BLACK","PROPERTY","TextTrackStyleDisplay","_property","_this__textTrackStyle","_this__textTrackStyle1","_textTrackStyle","textTrackStyle","renderValue","edgeStyle","fontFamily","knownFontFamily","getColorLabel","parsedColor","colorRgb","knownColor","getOpacityLabel","fontColor","backgroundColor","windowColor","updateColor","colorValue","previousColor","defaultColor","updateOpacity","opacityValue","TextTrackStyleRadioGroup","radioGroup","_radioGroupRef","_updateToPlayer","_this__player_textTrackStyle_this_property","_ref1","_ref2","TextTrackStyleMenu","menuTableCss","textTrackStyleMenuCss","HAS_AUDIO","HAS_SUBTITLES","LanguageMenu","languageMenuCss","_this__audioTrackList","_this__textTrackList","_this__audioTrackList1","_this__textTrackList1","_audioTrackList","_updateAudioTracks","_textTrackList","_updateTextTracks","newAudioTracks","newSubtitleTracks","LanguageMenuButton","hasTracks","PlaybackRateRadioGroup","PlaybackRateMenuButton","PLAYBACK_RATES","PlaybackRateMenu","PlaybackRateDisplay","activeVideoQuality","ActiveQualityDisplay","hasSingleTargetQuality","qualityLabel","QUALITY_EVENTS","QualityRadioButton","_updateFromQuality","_updateTargetQuality","QualityRadioGroup","_this__videoTracks","_this__videoTracks1","_videoTracks","qualities","_this__track","_this__track1","_update","TextTrackStyleResetButton","fontSize","SettingsMenu","SettingsMenuButton","settingsIcon","ENTER_FULLSCREEN_EVENT","EXIT_FULLSCREEN_EVENT","FULLSCREEN","FullscreenButton","fullscreenButtonCss","VR_EVENTS","STEREO","VRButton","_this__player_vr","_this__player_vr1","_this__player1","canPresentVR","hidden","styleSubtree","properties","window","ShadyCSS","nativeCss","setProperties","propertyName","entries","setProperty","VRCompass","vrCompassCss","transformAngle","FOV_SLICE_ANGLE","fovStyles","transform","styleMap","_this__player_source_vr","_this__player_source","nativeVR","direction","yaw","ColorStops","add","to","previousIndex","_stops","percent","previousPercent","newStops","nextIndex","toGradientStops","gradientStops","prevPercent","_dec1","INERT","_dec9","_dec10","_dec11","rangeCss","_updateRange","_updatePointerBar","_hidden","inert","_inert","rawValue","handleInput","_min","_max","useCachedWidth","updateCachedWidths_","updateBar_","getBarColors","shadyCss","rangePercent","relativeValue","thumbPercent","thumbOffset","_thumbWidth","_rangeWidth","stops","_this__rangeRef_value","rangeWidth","_rangeRef","offsetWidth","thumbWidth","getPropertyValue","getMinimumStepForVisibleChange_","relativeMax","updatePointer_","mousePercent","rangeRect","handleKeyDown_","getAriaLabel","getAriaValueText","_onInput","renderRangeExtras","valueAsNumber","rangeEl","clientX","PREVIEW_TIME_CHANGE_EVENT","isLinearAd","ad","isThumbnailTextTrack","PreviewThumbnail","previewThumbnailCss","_updateThumbnailTextTrack","_previewTime","updateThumbnail_","_thumbnailTextTrack","hideThumbnail_","cue","getCueAtTime","cues","startTime","trim","sprite","parseSpriteUrl","spriteUrl","url","w","h","thumbnailUrl","URL","src","location","_lastLoadedThumbnailUrl","loadThumbnailImage_","showThumbnail_","_thumbnailImageSource","onLoad","decode","onload","canvas","_canvasRef","_canvasContext","getContext","drawImage","naturalWidth","naturalHeight","canvasStyle","oldTrack","newTrack","createElement","decoding","PreviewTimeDisplay","UPDATE_EVENTS","AUTO_ADVANCE_EVENTS","AD_EVENTS","SHOW_AD_MARKERS","TimeRange","timeRangeCss","_toggleAutoAdvance","_changedProperties","_this__rangeRef_value1","_pauseOnScrubStart","_this__ads","_this__ads1","_ads","_onAdChange","ads","_streamType","updateDisabled_","showAdMarkers","_showAdMarkers","currentTimePhrase","totalTimePhrase","shouldAutoAdvance_","isConnected","errorObject","readyState","_lastCurrentTime","needToUpdateEveryFrame_","minimumStep","_lastPlaybackRate","previewPos","previewBoxEl","_previewBoxEl","previewBoxRect","previewPosFraction","previewTimeChangeEvent","colorStops","playing","adBreak","scheduledAdBreaks","adBreakTime","timeOffset","adBreakFrom","adBreakTo","adBreakPercent","ENTER","_pausedWhileScrubbing","_autoAdvanceId","_lastUpdateTime","performance","now","start","isLive","Infinity","_playOnScrubEnd","requestAnimationFrame","_autoAdvanceWhilePlaying","cancelAnimationFrame","delta","VolumeRange","ErrorDisplay","errorDisplayCss","CAST_STATE","_updateCastState","castApi","_castApi","castState","_castState","stop","chromecastButtonId","ChromecastButton","chromecastButtonCss","cast","chromecast","_buttonId","CAST_EVENTS","ChromecastDisplay","chromecastDisplayCss","_this__player_cast","receiverName","airPlayButtonHtml","AirPlayButton","airPlayButtonCss","airplay","loadingIndicatorHtml","LOADING","LoadingIndicator","loadingIndicatorCss","seeking","GestureReceiver","gestureReceiverCss","_playerElement","_onPointerDown","handleTap","_event","handleMouseClick","_this__player_ads","_pointerType","pointerType","_event_pointerType","PAUSED_EVENTS","LIVE_EVENTS","LIVE_THRESHOLD","useDefault","LIVE","LiveButton","liveButtonCss","liveThreshold","_liveThreshold","_updateLive","_updatePaused","hesp","manifest","goLive","threshold","AdDisplay","adDisplayCss","linearAds","currentAdBreak","currentLinearAd","currentAds","currentAdIndex","AdCountdown","adCountdownCss","maxRemainingDuration","ceil","CLICKTHROUGH","AdClickThroughButton","clickThrough","_clickThrough","linearAd","integration","AdSkipButton","adSkipButtonCss","skip","countdownStyles","visibility","skipStyles","pointerEvents","timeToSkip","skipOffset","_this__theoLive","_theoLive","handleEnterBadNetworkMode_","handleExitBadNetworkMode_","theoLive","_badNetworkMode","badNetworkMode","handlePlayer","handleEnterBadNetworkMode","handleExitBadNetworkMode","AutomaticQualitySelector","update_","_this_player_theoLive","_this_player","newChecked","BadNetworkModeButton","badNetworkModeButtonCss","warningStyles","BadNetworkModeSelector","BadNetworkModeMenu","extensionRegistry","registerExtension","extension","fullscreenAPI","browserMap","requestFullscreen_","exitFullscreen_","fullscreenElement_","fullscreenEnabled_","fullscreenchange_","fullscreenerror_","isMobile","navigator","userAgentData","userAgent","isTv","USER_IDLE_CHANGE_EVENT","READY_EVENT","GLOBAL_STYLE_ID","globalStylesAdded","FULL_WINDOW_ROOT_CLASS","getVisibleRect","opacity","childRect","CONFIGURATION","JSON","parse","SOURCE","FLUID","MUTED","AUTOPLAY","CASTING","USER_IDLE","_dec12","USER_IDLE_TIMEOUT","_dec13","_dec14","MOBILE","_dec15","TV","_dec16","_dec17","DVR_THRESHOLD","_dec18","HAS_FIRST_PLAY","_dec19","PLAYING_AD","_dec20","HAS_ERROR","_dec21","FULLWINDOW","_dec22","UIContainer","elementCss","configuration","_configuration","playerConfiguration","_setConfiguration","tryInitializePlayer_","_source","_setSource","_fluid","_updateAspectRatio","_language","_stateReceivers","_muted","_autoplay","_fullscreen","_paused","updateUserIdle_","_ended","casting","_casting","userIdle","_userIdle","userIdleTimeout","_this__userIdleTimeout","_userIdleTimeout","_deviceType","_onTvKeyDown","streamTypeChangeEvent","dvrThreshold","_dvrThreshold","_updateStreamType","_this__resizeObserver","supportsAdoptingStyleSheets","adoptedStyleSheets","globalCss","styleSheet","getElementById","styleEl","nonce","cssText","el","textContent","innerText","head","appendChild","propagateStateToReceiver_","_mutationObserver","observe","childList","subtree","_resizeObserver","_updateTextTrackMargins","_onFullscreenChange","setUserIdle_","_exitFullscreenOnEsc","_onPointerUp","_onPointerMove","_onMouseLeave","_playerRef","license","licenseUrl","ChromelessPlayer","_updateError","_updatePausedAndEnded","_updateCasting","addPlayerListeners_","propagatePlayerToAllReceivers_","_onEnterFullscreen","_onExitFullscreen","_onPreviewTimeChange","_menuGroupRef","registerStateReceiver_","updated","disconnect","_onClickAfterPointerUp","removePlayerListeners_","destroy","receiverProps","_this__activeVideoTrack","_activeVideoTrack","activeQuality","removeStateFromReceiver_","openMenu_","topChromeRect","_topChromeRef","bottomChromeRect","_bottomChromeRef","alignBottom","alignRight","playerRect","openerRect","_menuOpener","closeMenu_","_this__menuGroupRef_value_closeMenu","_this__menuGroupRef_value","_this__menuOpener","_enterFullscreen","_this__configuration_ui","_this__configuration","navigationUI","ui","fullscreenOptions","presentation","supportsMode","requestMode","documentElement","classList","_exitFullscreen","currentMode","remove","computeStreamType_","dvrWindow","isUserIdle_","_isUserActive","setUserActive_","clearTimeout","_userIdleTimer","isPlayerOrMedia_","_onDestroy","_updateMuted","_updatePlaybackRate","_onSourceChange","_updatePlayingAd","_updateActiveVideoTrack","_onVrStateChange","_topChromeSlotRef","_onChromeSlotTransition","_bottomChromeSlotRef","_menuRef","_lastPointerUpTime","_onMutation","mutations","mutation","addedNodes","removedNodes","unregisterStateReceiver_","menuGroup","console","menuEl","_onMenuPointerDown","_onMenuClick","_vrFullscreen","_vrWasFullscreen","isIOS","maxTouchPoints","presenting","isFullscreen","fullscreenElement","containsComposedNode","rootNode","childNode","childRoot","ESCAPE","videoWidth","videoHeight","activeVideoTrack","_this__activeVideoTrack1","_this__activeVideoTrack2","_this__activeVideoTrack3","_updateActiveVideoQuality","_updateTargetVideoQualities","scheduleUserIdle_","setTimeout","tvFocusChildren","getTvFocusChildren","TV_FOCUS","focusableChildren","marginTop","marginBottom","MutationObserver","ResizeObserver","queryAssignedNodes","defaultUiCss","_this__uiRef_value","_uiRef","showCountdown","_appliedExtensions","_onTitleSlotChange","_timeRangeInertTimeout","_onUiReady","_updateUserIdle","renderUiContent","DEFAULT_DVR_THRESHOLD","THEOliveDefaultUI","css","onLoadChannelStart","onChannelOffline","onChannelLoaded","onError","hidePlayerError","stopHidingPlayerError","showMessage_","hideMessage_","loadingStyles","offlineStyles","announcementStyles","playButtonStyles","errorDisplayStyles","errorCode","code","version"],"mappings":"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","x_google_ignoreList":[0,1,66,67,88]}