{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/players/HlsPlayer.cjs","../../src/players/HlsPlayer.tsx","../../src/sdk/hlsAdPlayer.ts","../../src/sdk/pal.ts","../../src/utils/mqttClient.ts","../../src/utils/mqttConfig.ts","../../src/utils/vastEnvironmentSignals.ts","../../src/utils/tracking.ts","../../src/utils/polyfills.ts","../../src/utils/vastMacros.ts","../../src/utils/browserCompat.ts","../../src/player/Scte35Parser.ts","../../src/player/Scte35CueManager.ts","../../src/player/AdConfigManager.ts","../../src/player/AdTimingService.ts","../../src/player/AdPreloadPool.ts","../../src/player/PlaceholderLayer.ts","../../src/player/HlsEngine.ts"],"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","__toCommonJS","value","HlsPlayer_exports","default","HlsPlayer","module","exports","import_react","require","import_hls","MAX_VAST_WRAPPER_DEPTH","createHlsAdPlayer","contentVideo","options","adPlaying","originalMutedState","originalVolume","Math","max","min","volume","listeners","Map","licenseKey","mainHlsInstance","adVideoElement","adHls","adContainerEl","currentAd","sessionId","preloadedAds","preloadingAds","destroyed","pendingTimeouts","trackingFired","impression","start","firstQuartile","midpoint","thirdQuartile","complete","emit","event","payload","set","Array","fn","error","console","warn","generateSessionId","Date","now","random","toString","substr","fireTrackingPixels","urls","length","forEach","url","trackingUrl","includes","img","Image","src","log","getMainStreamQuality","levels","currentLevel","autoLevel","loadLevel","level","width","height","bitrate","selectBestMediaFile","mediaFiles","Error","firstFile","mainQuality","heightDiff","abs","file","fileBitrate","bitrateDiff","score","resolutionDiff","scoredFiles","sort","a","b","bestMatch","resolution","isHlsMediaFile","mediaFile","type","toLowerCase","isProgressiveMediaFile","startsWith","endsWith","createEmptyTrackingUrls","mute","unmute","pause","resume","fullscreen","exitFullscreen","skip","extractTrackingUrls","xmlDoc","trackingUrls","querySelectorAll","el","push","getAttribute","textContent","trim","eventKey","mergeTrackingUrls","source","keys","concat","parseVastXml","xmlString","parser","DOMParser","parseFromString","parserError","querySelector","adElement","adId","title","clickThrough","wrapperUri","vastAdTagUri","isNoAdAvailable","durationText","durationParts","split","duration","parseInt","mediaFileElements","mf","index","bitrateAttr","bitrateValue","ad","id","fetchVastXml","vastTagUrl","response","fetch","mode","credentials","headers","referrerPolicy","ok","statusText","text","fetchAndParseVastAd","depth","accumulatedTracking","vastXml","parsed","substring","createAdVideoElement","video","document","createElement","style","position","left","top","objectFit","backgroundColor","playsInline","muted","setupAdEventListeners","addEventListener","progress","currentTime","handleAdComplete","e","handleAdError","ended","setAdPlayingFlag","isPlaying","dataset","stormcloudAdPlaying","display","pointerEvents","continueLiveStreamDuringAds","paused","play","catch","container","justifyContent","initialize","right","bottom","alignItems","zIndex","parentElement","appendChild","requestAds","Promise","reject","has","delete","resolve","contentVolume","isHlsAd","Hls","isSupported","destroy","enableWorker","lowLatencyMode","loadSource","on","Events","MANIFEST_PARSED","ERROR","data","fatal","canPlayType","load","stop","previousMutedState","visibility","opacity","timeoutId","clearTimeout","remove","removeChild","clear","isAdPlaying","resize","listener","Set","add","off","updateOriginalMutedState","nextVolume","Number","isNaN","getOriginalMutedState","getOriginalVolume","setAdVolume","clamped","getAdVolume","showPlaceholder","hidePlaceholder","getLoadedAdDuration","getLoadedAdId","PAL_SDK_URL","_nonceLoader","_palLoadPromise","loadPalSdk","window","goog","pal","existing","timeout","setTimeout","script","async","setAttribute","onload","onerror","head","getOrCreateNonceLoader","consentSettings","ConsentSettings","allowStorage","NonceLoader","createPalNonceManager","currentNonce","currentNonceManager","loader","request","manager","NonceRequest","adWillAutoPlay","adWillPlayMuted","playerVolume","continuousPlayback","descriptionUrl","location","href","iconsSupported","playerType","playerVersion","supportedApiFrameworks","videoWidth","videoHeight","ppid","loadNonceManager","getNonce","getCurrentNonce","injectNonce","URL","searchParams","base","replace","sep","encodeURIComponent","sendPlaybackStart","sendPlaybackEnd","sendAdClick","sendAdTouch","reset","DEFAULT_MQTT_CONFIG","enabled","brokerAddress","brokerPort","wsPort","username","password","topicPrefix","qos","mqttConfig","isMQTTEnabled","buildMQTTBrokerUrl","brokerUrl","buildPlayerTopic","channel","import_mqtt","LOG","client","status","initMQTTClient","clientId","slice","mqtt","connect","keepalive","clean","reconnectPeriod","connectTimeout","queueQoSZero","err","info","publish","message","ensureMQTTClient","topic","JSON","stringify","AIRY_ANDROID_APP_ID","AIRY_WEBOS_APP_ID","AIRY_TIZEN_APP_ID","AIRY_ROKU_APP_ID","AIRY_APP_NAME","AIRY_DEFAULT_CONTENT_URL","CTV_SESSION_STORAGE_KEY","PLAYER_ID_STORAGE_KEY","LG_TEST_APP_ID","LG_TEST_APP_NAME","LG_TEST_CONTENT_URL","_lgTestDeviceId","getLgTestDeviceId","createUuid","navigator","isLgWebOS","test","userAgent","getDefaultAppId","ua","DEVICE_ID_STORAGE_KEYS","ANDROID_ID_TYPES","resolveVastEnvironmentSignals","isCtv","platformLat","lg","deviceId","bridgeSignals","readStoredDeviceId","platformDevice","limitAdTracking","readStoredLimitAdTracking","contentUrl","appId","readStoredString","appName","deviceIdType","deviceTypeHint","inferDeviceIdType","isEquivalentDeviceIdType","tagType","runtimeType","tag","runtime","readNativeBridgeSignals","readPlatformNativeDeviceId","isMacroPlaceholder","isZeroedAdId","getOrCreateStoredUuid","storageKey","localStorage","setItem","getOrCreateCtvSessionId","crypto","randomUUID","char","floor","nibble","adinfo","webapis","tifa","getTIFA","lat","isLATEnabled","webOSDev","lgudid","LGUDID","roku","Roku","rida","getPublisherUniqueId","ZEROED_AD_ID_PATTERNS","t","candidates","__STORMCLOUD_CTV_AD_INFO__","stormcloudCtv","AiryTV","Android","webOS","tizen","amazon","filter","Boolean","readBridgeValue","readBridgeBoolean","result","normalized","normalizeBoolean","getItem","cachedBrowserId","getClientInfo","screen","platform","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","screenInfo","availWidth","availHeight","orientation","pixelDepth","deviceType","brand","os","model","isSmartTV","isAndroid","isWebView","isWebApp","webosMatch","match","tizenMatch","tvMatch","androidModelMatch","outerHeight","outerWidth","matchMedia","matches","standalone","angle","domain","hostname","origin","path","pathname","language","languages","join","cookieEnabled","doNotTrack","referrer","visibilityState","sha256Hex","input","encodedData","utf8","buffer","i","hashBuffer","hash","fallbackHash","timestamp","subtle","digest","Uint8Array","TextEncoder","encode","unescape","charCodeAt","map","padStart","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","resolveNativeDeviceId","persistedId","getBrowserID","canPublish","buildPlayerMetricEvent","context","flags","playerId","captureAt","toISOString","player_id","device_type","ad_loaded","adLoaded","ad_detect","adDetect","capture_at","inputStreamType","input_stream_type","publishTracking","body","publishMQTT","sendInitialTracking","metricEvent","events","sendAdDetectTracking","adDetectInfo","sendHeartbeat","sendAdLoadedTracking","adLoadedInfo","sendAdImpressionTracking","adImpressionInfo","ad_played_count","ad_url","adUrl","heartbeatData","polyfillURLSearchParams","URLSearchParams","URLSearchParamsPolyfill","init","params","parseQueryString","append","query","cleanQuery","param","decodedKey","safeDecodeURIComponent","decodedValue","str","decodeURIComponent","values","String","getAll","callback","parts","polyfillTextEncoder","TextEncoderPolyfill","encoding","charcode","polyfillPromiseFinally","finally","constructor","then","reason","polyfillObjectAssign","assign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","items","arrayLike","len","mapFn","thisArg","polyfillStringStartsWith","search","pos","polyfillStringEndsWith","polyfillStringIncludes","indexOf","initializePolyfills","UNEXPANDED_MACRO_PATTERN","EXAMPLE_COM_URL","CTV_UNSUPPORTED_PARAMS","INLINE_DEVICE_MACRO_REPLACEMENTS","pattern","getValue","ctx","correlator","trimmed","getRandomValues","buf","Uint32Array","MAX_SAFE_INTEGER","expandInlineMacroPlaceholders","baseUrl","applyDeviceIdentityParams","runtimeId","tagRdid","tagLat","latValue","tagRdidValid","tagTypeValid","removeBrokenAppNameOrphans","toDelete","_value","INVALID_VAST_PARAM_KEY","suffix","trimStart","normalizeVastTagUrl","raw","anValue","orphanFragments","reconstructed","trimEnd","_match","prefix","val","applyVastMacros","expandedUrl","replaceCorrelatorFallback","streamCorrelator","pod","adPosition","requestUrl","pageUrl","existingUrl","consent","gdpr","gdprConsent","usPrivacy","adTest","staleKeys","correlatorRegex","fetchConsentSignals","timeoutMs","signals","tasks","tcfApi","__tcfapi","settled","tcData","success","eventStatus","gdprApplies","tcString","listenerId","uspApi","__uspapi","uspString","webOSVersion","majorVersion","getChromeVersion","chromeVersion","getWebKitVersion","getPlatform","userAgentData","detectBrowser","version","isLegacyTV","supportsModernJS","chromeVersionNum","webkitVersion","tizenVersion","getBrowserConfigOverrides","browser","overrides","allowNativeHls","logBrowserInfo","debug","parseCueOutDuration","num","parseFloat","dStr","d","parseCueOutCont","res","durationMatch","elapsedMatch","elapsed","slashMatch","parseAttributeList","attrs","regex","exec","rawVal","toNumber","n","isManifestBasedMarker","marker","id3","splice_command_type","decodeId3ValueToText","decoder","TextDecoder","decode","out","fromCharCode","getFragmentStartSeconds","frag","startPTS","candidate","isFinite","parseScte35FromId3","cueOutMatch","arg","dur","ptsSeconds","durationSeconds","cueOutContMatch","cont","cueInMatch","daterangeMatch","hasScteOut","hasScteIn","klass","bin","parseScte35Binary","normalizeFragmentPayload","ArrayBuffer","isView","view","byteOffset","byteLength","detectTsPacketFormat","packetSizes","packetSize","tsPayloadOffset","offset","matchedPackets","packetStart","getPsiSectionStart","payloadUnitStart","pointerField","sectionStart","getPsiSectionLength","parsePatSection","pmtPids","sectionLength","sectionEnd","programNumber","pid","descriptorsIdentifyScte35","end","descriptorStart","descriptorEnd","registration","parsePmtSection","tsScte35Pids","programInfoLength","streamType","elementaryPid","esInfoLength","hasProcessedTsScte35Section","section","processedSections","checksum","size","firstKey","next","addScte35SectionMarker","markers","appendScte35Bytes","bytes","assemblers","assembler","expectedLength","collectScte35SectionsFromPayload","previousAssembler","subarray","tableId","totalLength","parseScte35FromTsPackets","packetInfo","sectionAssemblers","tsStart","secondByte","fourthByte","thirdByte","adaptationFieldControl","hasPayload","payloadStart","adaptationLength","payloadEnd","BitReader","bytePos","bitPos","readBits","numBits","remainingInByte","toRead","currentByte","shift","mask","bits","skipBits","bytePosition","readSpliceTime","r","ptsAdjustmentTicks","timeSpecifiedFlag","high","low","ptsTicks","markerTypeFromSegmentationTypeId","segmentationTypeId","parseScte35SegmentationDescriptor","descriptor","identifier","segmentationEventId","cancelIndicator","programSegmentationFlag","segmentationDurationFlag","componentCount","durationTicks","segmentationUpidLength","markerType","programSpliceFlag","parseScte35SegmentationDescriptors","descriptorDataEnd","commandBodyStart","descriptorLoopLength","descriptorOffset","descriptorTag","descriptorLength","descriptorDataStart","descriptorMarker","ptsAdjLow","ptsAdjHigh","spliceCommandLength","spliceCommandType","spliceEventId","cancel","outOfNetwork","durationFlag","spliceImmediateFlag","componentPtsSeconds","expectedDescriptorOffset","splice_event_id","segmentation_event_id","Scte35CueManager","callbacks","pendingScte35Cues","recentScte35CueKeys","recentScte35CueLimit","processedTsScte35Sections","pendingScte35CueKey","pendingScte35CueKeyValue","activeScte35BreakKeyValue","scheduledScte35BreakKey","scheduledScte35BreakKeyValue","createScte35CueContext","readiness","sn","fragmentSn","fragmentStartSec","fragmentStartSeconds","onScte35Cue","cue","createScte35Cue","pendingKey","getPendingScte35CueKey","trimRecentScte35CueMaps","onEarlyStartCue","shouldAcceptScte35EndCue","activeScte35BreakKey","inAdBreak","isInAdBreak","hasRecentlyHandledScte35Cue","markScte35CueHandled","onPlaybackCue","activatePendingScte35CuesForFragment","matchingCues","entries","getScte35CueKey","getScte35MarkerRaw","toIdentityString","daterangeId","scteValue","round","isStrongScte35CueKey","recentKey","AdConfigManager","config","vmapBreaks","consumedVmapBreakIds","generateCorrelator","consentSignals","podCounter","podAssignedByPrefetch","adRequestPositionInBreak","lastHeartbeatTime","debugAdTiming","isVmapEnabled","isVmap","vmapUrl","fetchAdConfiguration","fetchAndParseVmap","vastMode","vastEndpoint","apiVastTagUrl","apiUrl","json","imaPayload","ima","decodedPayload","numberAds","vast","cue_tones","number_ads","apiNumberAds","vmapXml","parseVmapToBreaks","doc","VMAP_NS","adBreakNodes","getElementsByTagNameNS","getElementsByTagName","localName","timeOffsetRaw","node","startTimeMs","parseVmapTimeOffsetToMs","adTagNode","adTagUrl","breakId","aStart","bStart","timeOffset","hms","hh","mm","ss","ms","hours","minutes","seconds","millis","percent","ratio","durationSec","getAdBreakKey","adBreak","resolveBreakStartMs","findCurrentOrNextBreak","nowMs","schedule","tol","driftToleranceMs","breakStartMs","findBreakForTime","durationMs","selectVastTagsForBreak","s","beginNewAdPod","generateVastUrlsWithCorrelators","count","adPlayer","palNonce","envSignals","ctvAdRequest","urlWithMacros","autoplay","finalUrl","initializeTracking","heartbeatInterval","setInterval","sendHeartbeatIfNeeded","destroyTracking","clearInterval","AdTimingService","adRequestWatchdogToken","adFailsafeToken","ptsDriftEmaMs","adBreakPlayedDurationMs","adBreakEpoch","adRequestTokenCounter","activeAdRequestToken","currentAdIndex","totalAdsInBreak","totalAdRequestsInBreak","maxTotalAdRequestsPerBreak","lastAdRequestTime","consecutiveFailures","maxConsecutiveFailures","minAdRequestIntervalMs","backoffBaseMs","maxBackoffMs","defaultMinRemainingMsToStartAd","failedVastUrls","temporaryFailureUrls","temporaryFailureCooldownMs","globalConsecutiveNoFills","globalNoFillThreshold","globalNoFillCooldownUntil","globalNoFillBackoffBaseMs","globalNoFillBackoffMaxMs","globalLastGamRequestTime","globalMinGamIntervalMs","scheduleAdStartIn","adStartTimerId","nowWallClockMs","getAdBreakEndWallClockMs","adFitsRemainingBudget","logAdDurationDecision","scheduleAdStopCountdown","remainingMs","clearAdStopTimer","ensureAdStoppedByTimer","adStopTimerId","onAdStopTimerFired","delayMs","cueKey","clearAdStartTimer","onAdStartTimerFired","updatePtsDrift","ptsSecondsSample","sampleMs","alpha","resolveScteBreakStartWallClockMs","estimatedCurrentPtsMs","deltaMs","setAdBreakDurationBoundary","expectedAdBreakDurationMs","currentAdBreakStartWallClockMs","scteAdBreakEndWallClockMs","scheduleAdStopAtBreakBoundary","getWallClockRemainingAdMs","endWallClockMs","getDurationBudgetRemainingMs","getLoadedAdDurationMs","adController","accepted","remainingBudget","recordPlayedAdDuration","ensureLoadedAdFitsBudget","fits","rejectLoadedAdForDuration","markAdStarted","getRemainingAdMs","wallClockRemaining","budgetRemaining","getMinRemainingMsToStartAd","configured","minRemainingMsToStartAd","hasTimeToStartAnotherAd","minRemaining","isTemporaryAdError","isUrlInCooldown","failureTime","cleanupTemporaryFailures","isGamInCooldown","recordGamNoFill","resetGamNoFillCounter","exponent","backoff","pow","enforceGlobalRateLimit","waitMs","startAdRequestWatchdog","token","clearAdRequestWatchdog","adFailsafeTimeoutMs","adRequestWatchdogId","logAdState","onWatchdogTimeout","startAdFailsafeTimer","clearAdFailsafeTimer","failsafeMs","adFailsafeTimerId","onFailsafeTimeout","AdPreloadPool","startPreloadPool","startLoopImmediately","extra","showAds","resetForBreakEnd","deps","pool","maxPoolSize","poolActive","loopRunning","isLoopRunning","baseVastUrl","initialUrls","preloadAdIntoPool","preloadPoolLoop","vastUrl","timing","epoch","loadPromise","some","entry","hasAdError","adErrorPayload","errorListenerCleanup","preloadAd","errorListener","isNoFill","poolEntry","loadedDuration","lateErrorListener","createAdPlayer","code","vastErrorCode","isReady","findIndex","splice","newUrls","newUrl","getPendingAdBreak","getPreloadedAd","transition","PlaceholderLayer","ensureContainer","show","wasHidden","offsetHeight","requestAnimationFrame","hide","HlsEngine","cueManager","isLiveStream","nativeHlsMode","videoSrcProtection","bufferedSegmentsCount","shouldAutoplayAfterBuffering","hasInitialBufferCompleted","shouldUseNativeHls","getStreamType","canNative","setupNativeHls","adBehavior","isLive","setupHls","hls","import_hls2","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","liveSyncDuration","maxBufferLength","maxMaxBufferLength","maxBufferSize","maxBufferHole","highBufferWatchdogPeriod","nudgeOffset","nudgeMaxRetry","startPosition","MEDIA_ATTACHED","_","_data","minSegments","details","live","onManifestParsed","minSegmentsBeforePlay","LEVEL_LOADED","_evt","hasPendingAdBreak","fragments","fragmentsToScan","tagList","isArray","idx","earlyDetection","FRAG_BUFFERED","FRAG_PARSING_METADATA","id3Tags","samples","onId3Tag","processFragmentScte35Payload","FRAG_DECRYPTED","FRAG_CHANGED","activatePendingCuesForFragment","prog","ErrorTypes","NETWORK_ERROR","startLoad","MEDIA_ERROR","recoverMediaError","attachMedia","pts"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/players/HlsPlayer.tsx\nvar HlsPlayer_exports = {};\n__export(HlsPlayer_exports, {\n  default: () => HlsPlayer\n});\nmodule.exports = __toCommonJS(HlsPlayer_exports);\nvar import_react = require(\"react\");\n\n// src/sdk/hlsAdPlayer.ts\nvar import_hls = __toESM(require(\"hls.js\"), 1);\nvar MAX_VAST_WRAPPER_DEPTH = 5;\nfunction createHlsAdPlayer(contentVideo, options) {\n  let adPlaying = false;\n  let originalMutedState = false;\n  let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n  const listeners = /* @__PURE__ */ new Map();\n  const licenseKey = options?.licenseKey;\n  const mainHlsInstance = options?.mainHlsInstance;\n  let adVideoElement;\n  let adHls;\n  let adContainerEl;\n  let currentAd;\n  let sessionId;\n  const preloadedAds = /* @__PURE__ */ new Map();\n  const preloadingAds = /* @__PURE__ */ new Map();\n  let destroyed = false;\n  let pendingTimeouts = [];\n  let trackingFired = {\n    impression: false,\n    start: false,\n    firstQuartile: false,\n    midpoint: false,\n    thirdQuartile: false,\n    complete: false\n  };\n  function emit(event, payload) {\n    const set = listeners.get(event);\n    if (!set) return;\n    for (const fn of Array.from(set)) {\n      try {\n        fn(payload);\n      } catch (error) {\n        console.warn(\n          `[HlsAdPlayer] Error in event listener for ${event}:`,\n          error\n        );\n      }\n    }\n  }\n  function generateSessionId() {\n    return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n  function fireTrackingPixels(urls) {\n    if (!urls || urls.length === 0) return;\n    urls.forEach((url) => {\n      try {\n        let trackingUrl = url;\n        if (sessionId) {\n          trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}session_id=${sessionId}`;\n        }\n        if (licenseKey) {\n          trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}license_key=${licenseKey}`;\n        }\n        const img = new Image(1, 1);\n        img.src = trackingUrl;\n        console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n      } catch (error) {\n        console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n      }\n    });\n  }\n  function getMainStreamQuality() {\n    if (!mainHlsInstance || !mainHlsInstance.levels) {\n      return null;\n    }\n    const currentLevel = mainHlsInstance.currentLevel;\n    if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n      const autoLevel = mainHlsInstance.loadLevel;\n      if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n        const level2 = mainHlsInstance.levels[autoLevel];\n        return {\n          width: level2.width || 1920,\n          height: level2.height || 1080,\n          bitrate: level2.bitrate || 5e6\n        };\n      }\n      return null;\n    }\n    const level = mainHlsInstance.levels[currentLevel];\n    return {\n      width: level.width || 1920,\n      height: level.height || 1080,\n      bitrate: level.bitrate || 5e6\n    };\n  }\n  function selectBestMediaFile(mediaFiles) {\n    if (mediaFiles.length === 0) {\n      throw new Error(\"No media files available\");\n    }\n    const firstFile = mediaFiles[0];\n    if (!firstFile) {\n      throw new Error(\"No media files available\");\n    }\n    if (mediaFiles.length === 1) {\n      return firstFile;\n    }\n    const mainQuality = getMainStreamQuality();\n    if (!mainQuality) {\n      console.log(\n        \"[HlsAdPlayer] No main stream quality info, using first media file\"\n      );\n      return firstFile;\n    }\n    console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n    const scoredFiles = mediaFiles.map((file) => {\n      const widthDiff = Math.abs(file.width - mainQuality.width);\n      const heightDiff = Math.abs(file.height - mainQuality.height);\n      const resolutionDiff = widthDiff + heightDiff;\n      const fileBitrate = (file.bitrate || 5e3) * 1e3;\n      const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n      const score = resolutionDiff * 2 + bitrateDiff / 1e3;\n      return { file, score, resolutionDiff, bitrateDiff };\n    });\n    scoredFiles.sort((a, b) => a.score - b.score);\n    const bestMatch = scoredFiles[0];\n    if (!bestMatch) {\n      console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n      return firstFile;\n    }\n    console.log(\"[HlsAdPlayer] Selected media file:\", {\n      url: bestMatch.file.url,\n      resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n      bitrate: bestMatch.file.bitrate,\n      score: bestMatch.score,\n      resolutionDiff: bestMatch.resolutionDiff,\n      bitrateDiff: bestMatch.bitrateDiff\n    });\n    return bestMatch.file;\n  }\n  function isHlsMediaFile(mediaFile) {\n    const type = mediaFile.type.toLowerCase();\n    const url = mediaFile.url.toLowerCase();\n    return type === \"application/x-mpegurl\" || type === \"application/vnd.apple.mpegurl\" || type.includes(\"mpegurl\") || url.includes(\".m3u8\");\n  }\n  function isProgressiveMediaFile(mediaFile) {\n    const type = mediaFile.type.toLowerCase();\n    const url = mediaFile.url.toLowerCase();\n    return type.startsWith(\"video/\") || url.endsWith(\".mp4\") || url.includes(\".mp4?\");\n  }\n  function createEmptyTrackingUrls() {\n    return {\n      impression: [],\n      start: [],\n      firstQuartile: [],\n      midpoint: [],\n      thirdQuartile: [],\n      complete: [],\n      mute: [],\n      unmute: [],\n      pause: [],\n      resume: [],\n      fullscreen: [],\n      exitFullscreen: [],\n      skip: [],\n      error: []\n    };\n  }\n  function extractTrackingUrls(xmlDoc) {\n    const trackingUrls = createEmptyTrackingUrls();\n    xmlDoc.querySelectorAll(\"Impression\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.impression.push(url);\n    });\n    xmlDoc.querySelectorAll(\"Tracking\").forEach((el) => {\n      const event = el.getAttribute(\"event\");\n      const url = el.textContent?.trim();\n      if (event && url) {\n        const eventKey = event;\n        if (trackingUrls[eventKey]) {\n          trackingUrls[eventKey].push(url);\n        }\n      }\n    });\n    xmlDoc.querySelectorAll(\"Error\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.error.push(url);\n    });\n    return trackingUrls;\n  }\n  function mergeTrackingUrls(target, source) {\n    Object.keys(target).forEach((key) => {\n      if (source[key] && source[key].length > 0) {\n        target[key] = target[key].concat(source[key]);\n      }\n    });\n    return target;\n  }\n  function parseVastXml(xmlString) {\n    try {\n      const parser = new DOMParser();\n      const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n      const parserError = xmlDoc.querySelector(\"parsererror\");\n      if (parserError) {\n        console.error(\n          \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n          parserError.textContent\n        );\n        return { type: \"empty\" };\n      }\n      const adElement = xmlDoc.querySelector(\"Ad\");\n      if (!adElement) {\n        console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n        return { type: \"empty\" };\n      }\n      const adId = adElement.getAttribute(\"id\") || \"unknown\";\n      const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n      const clickThrough = xmlDoc.querySelector(\"ClickThrough\")?.textContent?.trim();\n      const wrapperUri = xmlDoc.querySelector(\"VASTAdTagURI\")?.textContent?.trim();\n      if (wrapperUri) {\n        console.log(\n          `[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ${wrapperUri}`\n        );\n        return {\n          type: \"wrapper\",\n          vastAdTagUri: wrapperUri,\n          trackingUrls: extractTrackingUrls(xmlDoc),\n          clickThrough\n        };\n      }\n      const isNoAdAvailable = adId === \"empty\" || title.toLowerCase().includes(\"no ad available\") || title.toLowerCase() === \"no ad available\";\n      const durationText = xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n      const durationParts = durationText.split(\":\");\n      const duration = parseInt(durationParts[0] || \"0\", 10) * 3600 + parseInt(durationParts[1] || \"0\", 10) * 60 + parseInt(durationParts[2] || \"0\", 10);\n      const mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n      const mediaFiles = [];\n      console.log(\n        `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n      );\n      mediaFileElements.forEach((mf, index) => {\n        const type = mf.getAttribute(\"type\") || \"\";\n        const url = mf.textContent?.trim() || \"\";\n        const width = mf.getAttribute(\"width\") || \"\";\n        const height = mf.getAttribute(\"height\") || \"\";\n        console.log(\n          `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n        );\n        const mediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: void 0\n        };\n        if (!url) {\n          console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n          return;\n        }\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n        mediaFile.bitrate = bitrateValue && bitrateValue > 0 ? bitrateValue : void 0;\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n          console.log(\n            `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n          );\n        } else {\n          console.log(\n            `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n          );\n        }\n      });\n      if (mediaFiles.length === 0) {\n        if (isNoAdAvailable) {\n          console.warn(\n            \"[HlsAdPlayer] No ads available (VAST response indicates no ads)\"\n          );\n        } else {\n          console.warn(\"[HlsAdPlayer] No supported media files found in VAST XML\");\n        }\n        return { type: \"empty\" };\n      }\n      return {\n        type: \"inline\",\n        ad: {\n          id: adId,\n          title,\n          duration,\n          mediaFiles,\n          trackingUrls: extractTrackingUrls(xmlDoc),\n          clickThrough\n        }\n      };\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n      return { type: \"empty\" };\n    }\n  }\n  async function fetchVastXml(vastTagUrl) {\n    const response = await fetch(vastTagUrl, {\n      mode: \"cors\",\n      credentials: \"include\",\n      headers: {\n        \"Accept\": \"application/xml, text/xml, */*\"\n      },\n      referrerPolicy: \"no-referrer-when-downgrade\"\n    });\n    if (!response.ok) {\n      throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n    }\n    return response.text();\n  }\n  async function fetchAndParseVastAd(vastTagUrl, depth = 0, accumulatedTracking = createEmptyTrackingUrls()) {\n    const vastXml = await fetchVastXml(vastTagUrl);\n    console.log(\"[HlsAdPlayer] VAST XML received\");\n    console.log(\n      \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n      vastXml.substring(0, 2e3)\n    );\n    const parsed = parseVastXml(vastXml);\n    if (parsed.type === \"empty\") {\n      return null;\n    }\n    if (parsed.type === \"wrapper\") {\n      if (depth >= MAX_VAST_WRAPPER_DEPTH) {\n        console.warn(\n          `[HlsAdPlayer] VAST wrapper depth limit (${MAX_VAST_WRAPPER_DEPTH}) reached, aborting redirect chain`\n        );\n        return null;\n      }\n      mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);\n      return fetchAndParseVastAd(\n        parsed.vastAdTagUri,\n        depth + 1,\n        accumulatedTracking\n      );\n    }\n    mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);\n    return parsed.ad;\n  }\n  function createAdVideoElement() {\n    const video = document.createElement(\"video\");\n    video.style.position = \"absolute\";\n    video.style.left = \"0\";\n    video.style.top = \"0\";\n    video.style.width = \"100%\";\n    video.style.height = \"100%\";\n    video.style.objectFit = \"contain\";\n    video.style.backgroundColor = \"#000\";\n    video.playsInline = true;\n    video.muted = false;\n    video.volume = 1;\n    console.log(\n      `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n    );\n    return video;\n  }\n  function setupAdEventListeners() {\n    if (!adVideoElement || !currentAd) return;\n    adVideoElement.addEventListener(\"timeupdate\", () => {\n      if (!currentAd || !adVideoElement) return;\n      const progress = adVideoElement.currentTime / currentAd.duration;\n      if (progress >= 0.25 && !trackingFired.firstQuartile) {\n        trackingFired.firstQuartile = true;\n        fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n      }\n      if (progress >= 0.5 && !trackingFired.midpoint) {\n        trackingFired.midpoint = true;\n        fireTrackingPixels(currentAd.trackingUrls.midpoint);\n      }\n      if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n        trackingFired.thirdQuartile = true;\n        fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n      }\n    });\n    adVideoElement.addEventListener(\"playing\", () => {\n      if (!currentAd || trackingFired.start) return;\n      trackingFired.start = true;\n      fireTrackingPixels(currentAd.trackingUrls.start);\n      console.log(\"[HlsAdPlayer] Ad started playing\");\n    });\n    adVideoElement.addEventListener(\"ended\", () => {\n      if (!currentAd || trackingFired.complete) return;\n      trackingFired.complete = true;\n      fireTrackingPixels(currentAd.trackingUrls.complete);\n      console.log(\"[HlsAdPlayer] Ad completed\");\n      handleAdComplete();\n    });\n    adVideoElement.addEventListener(\"error\", (e) => {\n      if (!adPlaying) return;\n      console.error(\"[HlsAdPlayer] Ad video error:\", e);\n      if (currentAd) {\n        fireTrackingPixels(currentAd.trackingUrls.error);\n      }\n      handleAdError();\n    });\n    adVideoElement.addEventListener(\"volumechange\", () => {\n      if (!currentAd) return;\n      if (adVideoElement.muted) {\n        fireTrackingPixels(currentAd.trackingUrls.mute);\n      } else {\n        fireTrackingPixels(currentAd.trackingUrls.unmute);\n      }\n    });\n    adVideoElement.addEventListener(\"pause\", () => {\n      if (currentAd && !adVideoElement.ended) {\n        fireTrackingPixels(currentAd.trackingUrls.pause);\n      }\n    });\n    adVideoElement.addEventListener(\"play\", () => {\n      if (currentAd && adVideoElement.currentTime > 0) {\n        fireTrackingPixels(currentAd.trackingUrls.resume);\n      }\n    });\n  }\n  function setAdPlayingFlag(isPlaying) {\n    if (isPlaying) {\n      contentVideo.dataset.stormcloudAdPlaying = \"true\";\n    } else {\n      delete contentVideo.dataset.stormcloudAdPlaying;\n    }\n  }\n  function handleAdComplete() {\n    console.log(\"[HlsAdPlayer] Handling ad completion\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n    contentVideo.muted = true;\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\n    }\n    if (options?.continueLiveStreamDuringAds) {\n      if (contentVideo.paused) {\n        console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n        contentVideo.play().catch(() => {\n        });\n      } else {\n        console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n      }\n    }\n    emit(\"content_resume\");\n  }\n  function handleAdError() {\n    console.log(\"[HlsAdPlayer] Handling ad error\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n    contentVideo.muted = true;\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\n    }\n    emit(\"ad_error\");\n  }\n  return {\n    initialize() {\n      console.log(\"[HlsAdPlayer] Initializing\");\n      if (!adContainerEl) {\n        const container = document.createElement(\"div\");\n        container.style.position = \"absolute\";\n        container.style.left = \"0\";\n        container.style.top = \"0\";\n        container.style.right = \"0\";\n        container.style.bottom = \"0\";\n        container.style.display = \"none\";\n        container.style.alignItems = \"center\";\n        container.style.justifyContent = \"center\";\n        container.style.pointerEvents = \"none\";\n        container.style.zIndex = \"30\";\n        container.style.backgroundColor = \"#000\";\n        contentVideo.parentElement?.appendChild(container);\n        adContainerEl = container;\n      }\n    },\n    async requestAds(vastTagUrl) {\n      console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n      if (adPlaying) {\n        console.warn(\n          \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n        );\n        return Promise.reject(new Error(\"Ad already playing\"));\n      }\n      try {\n        sessionId = generateSessionId();\n        let ad;\n        if (preloadedAds.has(vastTagUrl)) {\n          ad = preloadedAds.get(vastTagUrl);\n          preloadedAds.delete(vastTagUrl);\n          console.log(\n            \"[HlsAdPlayer] Using preloaded VAST response:\",\n            vastTagUrl\n          );\n        } else {\n          ad = await fetchAndParseVastAd(vastTagUrl);\n        }\n        if (!ad) {\n          console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n          emit(\"ad_error\");\n          return Promise.reject(new Error(\"No ads available from VAST response\"));\n        }\n        currentAd = ad;\n        console.log(\n          `[HlsAdPlayer] Ad parsed: ${ad.title}, duration: ${ad.duration}s`\n        );\n        fireTrackingPixels(ad.trackingUrls.impression);\n        trackingFired.impression = true;\n        return Promise.resolve();\n      } catch (error) {\n        console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n        emit(\"ad_error\");\n        return Promise.reject(error);\n      }\n    },\n    async play() {\n      if (!currentAd) {\n        console.warn(\n          \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n        );\n        return Promise.reject(new Error(\"No ad loaded\"));\n      }\n      console.log(\"[HlsAdPlayer] Starting ad playback\");\n      try {\n        if (!adVideoElement) {\n          adVideoElement = createAdVideoElement();\n          adContainerEl?.appendChild(adVideoElement);\n          setupAdEventListeners();\n        }\n        trackingFired = {\n          impression: trackingFired.impression,\n          start: false,\n          firstQuartile: false,\n          midpoint: false,\n          thirdQuartile: false,\n          complete: false\n        };\n        const contentVolume = contentVideo.volume;\n        originalVolume = Math.max(\n          0,\n          Math.min(1, contentVolume || originalVolume)\n        );\n        if (!options?.continueLiveStreamDuringAds) {\n          contentVideo.pause();\n          console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n        } else {\n          console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n        }\n        console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n        contentVideo.muted = true;\n        adPlaying = true;\n        setAdPlayingFlag(true);\n        if (adVideoElement) {\n          adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n          adVideoElement.muted = originalMutedState;\n          console.log(\n            `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n          );\n        }\n        const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n        if (!mediaFile) {\n          throw new Error(\"No media file available for ad\");\n        }\n        if (adContainerEl) {\n          adContainerEl.style.display = \"flex\";\n          adContainerEl.style.pointerEvents = \"auto\";\n        }\n        emit(\"content_pause\");\n        const isHlsAd = isHlsMediaFile(mediaFile);\n        console.log(\n          `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad from: ${mediaFile.url}`\n        );\n        if (isHlsAd && import_hls.default.isSupported()) {\n          if (adHls) {\n            adHls.destroy();\n          }\n          adHls = new import_hls.default({\n            enableWorker: true,\n            lowLatencyMode: false\n          });\n          adHls.loadSource(mediaFile.url);\n          adHls.attachMedia(adVideoElement);\n          adHls.on(import_hls.default.Events.MANIFEST_PARSED, () => {\n            console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n            adVideoElement.play().catch((error) => {\n              console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n              handleAdError();\n            });\n          });\n          adHls.on(import_hls.default.Events.ERROR, (event, data) => {\n            console.error(\"[HlsAdPlayer] HLS error:\", data);\n            if (data.fatal) {\n              handleAdError();\n            }\n          });\n        } else if (isHlsAd && adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")) {\n          adVideoElement.src = mediaFile.url;\n          adVideoElement.play().catch((error) => {\n            console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n            handleAdError();\n          });\n        } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n          if (adHls) {\n            adHls.destroy();\n            adHls = void 0;\n          }\n          adVideoElement.src = mediaFile.url;\n          adVideoElement.load();\n          adVideoElement.play().catch((error) => {\n            console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n            handleAdError();\n          });\n        } else {\n          throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n        }\n        return Promise.resolve();\n      } catch (error) {\n        console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n        handleAdError();\n        return Promise.reject(error);\n      }\n    },\n    pause() {\n      if (!adPlaying || !adVideoElement) {\n        return;\n      }\n      try {\n        if (adVideoElement && !adVideoElement.paused) {\n          adVideoElement.pause();\n        }\n      } catch (error) {\n        console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n      }\n    },\n    resume() {\n      if (!adPlaying || !adVideoElement) {\n        return;\n      }\n      try {\n        if (adVideoElement && adVideoElement.paused) {\n          adVideoElement.play().catch(() => {\n          });\n        }\n      } catch (error) {\n        console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n      }\n    },\n    async stop() {\n      console.log(\"[HlsAdPlayer] Stopping ad\");\n      adPlaying = false;\n      setAdPlayingFlag(false);\n      const previousMutedState = contentVideo.muted;\n      contentVideo.muted = originalMutedState;\n      contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n      console.log(\n        `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}, volume: ${contentVideo.volume}`\n      );\n      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\n      contentVideo.style.visibility = \"visible\";\n      contentVideo.style.opacity = \"1\";\n      if (options?.continueLiveStreamDuringAds) {\n        if (contentVideo.paused) {\n          console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n          contentVideo.play().catch(() => {\n          });\n        }\n      }\n      if (adHls) {\n        adHls.destroy();\n        adHls = void 0;\n      }\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n      }\n      currentAd = void 0;\n    },\n    destroy() {\n      console.log(\"[HlsAdPlayer] Destroying\");\n      destroyed = true;\n      for (const timeoutId of pendingTimeouts) {\n        clearTimeout(timeoutId);\n      }\n      pendingTimeouts = [];\n      adPlaying = false;\n      setAdPlayingFlag(false);\n      contentVideo.muted = originalMutedState;\n      contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n      if (adHls) {\n        adHls.destroy();\n        adHls = void 0;\n      }\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n        adVideoElement.remove();\n        adVideoElement = void 0;\n      }\n      if (adContainerEl?.parentElement) {\n        adContainerEl.parentElement.removeChild(adContainerEl);\n      }\n      adContainerEl = void 0;\n      currentAd = void 0;\n      listeners.clear();\n      preloadedAds.clear();\n      preloadingAds.clear();\n    },\n    isAdPlaying() {\n      return adPlaying;\n    },\n    resize(width, height) {\n      console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n      if (adContainerEl) {\n        adContainerEl.style.width = `${width}px`;\n        adContainerEl.style.height = `${height}px`;\n      }\n      if (adVideoElement) {\n        adVideoElement.style.width = `${width}px`;\n        adVideoElement.style.height = `${height}px`;\n      }\n    },\n    on(event, listener) {\n      if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());\n      listeners.get(event).add(listener);\n    },\n    off(event, listener) {\n      listeners.get(event)?.delete(listener);\n    },\n    updateOriginalMutedState(muted, volume) {\n      const nextVolume = typeof volume === \"number\" && !Number.isNaN(volume) ? Math.max(0, Math.min(1, volume)) : originalVolume;\n      console.log(\n        `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n      );\n      originalMutedState = muted;\n      originalVolume = nextVolume;\n    },\n    getOriginalMutedState() {\n      return originalMutedState;\n    },\n    getOriginalVolume() {\n      return originalVolume;\n    },\n    setAdVolume(volume) {\n      if (adVideoElement && adPlaying) {\n        const clamped = Math.max(0, Math.min(1, volume));\n        adVideoElement.volume = clamped;\n        adVideoElement.muted = clamped === 0;\n      }\n    },\n    getAdVolume() {\n      if (adVideoElement && adPlaying) {\n        return adVideoElement.volume;\n      }\n      return 1;\n    },\n    showPlaceholder() {\n      contentVideo.style.opacity = \"0\";\n      contentVideo.style.visibility = \"hidden\";\n      if (!adContainerEl) {\n        const container = document.createElement(\"div\");\n        container.style.position = \"absolute\";\n        container.style.left = \"0\";\n        container.style.top = \"0\";\n        container.style.right = \"0\";\n        container.style.bottom = \"0\";\n        container.style.display = \"none\";\n        container.style.alignItems = \"center\";\n        container.style.justifyContent = \"center\";\n        container.style.pointerEvents = \"none\";\n        container.style.zIndex = \"10\";\n        container.style.backgroundColor = \"#000\";\n        contentVideo.parentElement?.appendChild(container);\n        adContainerEl = container;\n      }\n      if (adContainerEl) {\n        adContainerEl.style.display = \"flex\";\n        adContainerEl.style.pointerEvents = \"auto\";\n      }\n    },\n    hidePlaceholder() {\n      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\n      if (!adPlaying) {\n        contentVideo.style.visibility = \"visible\";\n        contentVideo.style.opacity = \"1\";\n      }\n    },\n    getLoadedAdDuration() {\n      return currentAd?.duration;\n    },\n    getLoadedAdId() {\n      return currentAd?.id;\n    }\n  };\n}\n\n// src/sdk/pal.ts\nvar PAL_SDK_URL = \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\nvar _nonceLoader;\nvar _palLoadPromise;\nfunction loadPalSdk() {\n  if (typeof window !== \"undefined\" && window.goog?.pal) {\n    return Promise.resolve();\n  }\n  if (_palLoadPromise) return _palLoadPromise;\n  _palLoadPromise = new Promise((resolve, reject) => {\n    const existing = document.querySelector(\n      'script[data-pal=\"true\"]'\n    );\n    if (existing) {\n      if (window.goog?.pal) {\n        resolve();\n        return;\n      }\n      const timeout = setTimeout(\n        () => reject(new Error(\"PAL SDK load timeout\")),\n        1e4\n      );\n      existing.addEventListener(\"load\", () => {\n        clearTimeout(timeout);\n        resolve();\n      });\n      existing.addEventListener(\"error\", () => {\n        clearTimeout(timeout);\n        reject(new Error(\"PAL SDK load failed\"));\n      });\n      return;\n    }\n    const script = document.createElement(\"script\");\n    script.src = PAL_SDK_URL;\n    script.async = true;\n    script.setAttribute(\"data-pal\", \"true\");\n    script.onload = () => resolve();\n    script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n    document.head.appendChild(script);\n  });\n  return _palLoadPromise;\n}\nfunction getOrCreateNonceLoader() {\n  if (_nonceLoader) return _nonceLoader;\n  const goog = window.goog;\n  const consentSettings = new goog.pal.ConsentSettings();\n  consentSettings.allowStorage = true;\n  _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n  return _nonceLoader;\n}\nfunction createPalNonceManager() {\n  let currentNonce = \"\";\n  let currentNonceManager;\n  return {\n    async generateNonce(options = {}) {\n      try {\n        await loadPalSdk();\n        const loader = getOrCreateNonceLoader();\n        const goog = window.goog;\n        const request = new goog.pal.NonceRequest();\n        request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n        request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n        request.playerVolume = options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n        request.continuousPlayback = options.continuousPlayback ?? true;\n        request.descriptionUrl = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.iconsSupported = true;\n        request.playerType = \"StormcloudVideoPlayer\";\n        request.playerVersion = \"1.0\";\n        request.supportedApiFrameworks = \"2,7,9\";\n        request.url = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.videoWidth = options.videoWidth || 640;\n        request.videoHeight = options.videoHeight || 480;\n        if (options.ppid) request.ppid = options.ppid;\n        if (options.sessionId) request.sessionId = options.sessionId;\n        const manager = await loader.loadNonceManager(request);\n        currentNonceManager = manager;\n        currentNonce = manager.getNonce();\n        console.log(\"[PAL] Nonce generated successfully\");\n        return currentNonce;\n      } catch (error) {\n        console.warn(\"[PAL] Failed to generate nonce:\", error);\n        currentNonce = \"\";\n        currentNonceManager = void 0;\n        return \"\";\n      }\n    },\n    getCurrentNonce() {\n      return currentNonce;\n    },\n    injectNonce(vastTagUrl) {\n      if (!currentNonce || !vastTagUrl) return vastTagUrl;\n      try {\n        const url = new URL(vastTagUrl);\n        url.searchParams.delete(\"paln\");\n        url.searchParams.set(\"givn\", currentNonce);\n        return url.toString();\n      } catch {\n        let base = vastTagUrl.replace(/([?&])paln=[^&]*/g, \"\").replace(/[?&]$/, \"\");\n        const sep = base.includes(\"?\") ? \"&\" : \"?\";\n        return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n      }\n    },\n    sendPlaybackStart() {\n      try {\n        currentNonceManager?.sendPlaybackStart();\n      } catch {\n      }\n    },\n    sendPlaybackEnd() {\n      try {\n        currentNonceManager?.sendPlaybackEnd();\n      } catch {\n      }\n    },\n    sendAdClick() {\n      try {\n        currentNonceManager?.sendAdClick();\n      } catch {\n      }\n    },\n    sendAdTouch(event) {\n      try {\n        currentNonceManager?.sendAdTouch(event);\n      } catch {\n      }\n    },\n    reset() {\n      currentNonce = \"\";\n      currentNonceManager = void 0;\n    }\n  };\n}\n\n// src/utils/mqttConfig.ts\nvar DEFAULT_MQTT_CONFIG = {\n  enabled: true,\n  brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n  brokerPort: 8883,\n  wsPort: 8084,\n  username: \"for-sonifi\",\n  password: \"sonifi-mqtt\",\n  topicPrefix: \"adstorm/players\",\n  qos: 1\n};\nvar mqttConfig = { ...DEFAULT_MQTT_CONFIG };\nfunction isMQTTEnabled() {\n  return mqttConfig.enabled;\n}\nfunction buildMQTTBrokerUrl() {\n  if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n  return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\nfunction buildPlayerTopic(licenseKey, channel) {\n  return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n\n// src/utils/mqttClient.ts\nvar import_mqtt = __toESM(require(\"mqtt\"), 1);\nvar LOG = \"[StormcloudVideoPlayer][MQTT]\";\nvar client = null;\nvar status = \"disconnected\";\nfunction initMQTTClient() {\n  if (client || !isMQTTEnabled()) return;\n  const url = buildMQTTBrokerUrl();\n  status = \"connecting\";\n  const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n  try {\n    client = import_mqtt.default.connect(url, {\n      clientId,\n      username: mqttConfig.username,\n      password: mqttConfig.password,\n      keepalive: 60,\n      clean: true,\n      reconnectPeriod: 5e3,\n      connectTimeout: 1e4,\n      queueQoSZero: false\n    });\n  } catch (err) {\n    status = \"error\";\n    console.warn(`${LOG} connect() threw:`, err);\n    return;\n  }\n  client.on(\"connect\", () => {\n    status = \"connected\";\n    console.info(`${LOG} connected to ${url}`);\n  });\n  client.on(\"reconnect\", () => {\n    status = \"connecting\";\n    console.info(`${LOG} reconnecting\\u2026`);\n  });\n  client.on(\"offline\", () => {\n    status = \"disconnected\";\n    console.warn(`${LOG} offline`);\n  });\n  client.on(\"error\", (err) => {\n    status = \"error\";\n    console.warn(`${LOG} error:`, err.message);\n  });\n  client.on(\"close\", () => {\n    if (status === \"connected\") {\n      status = \"disconnected\";\n    }\n  });\n}\nfunction ensureMQTTClient() {\n  if (isMQTTEnabled() && !client) {\n    initMQTTClient();\n  }\n}\nfunction publishMQTT(topic, payload) {\n  if (!isMQTTEnabled()) {\n    return false;\n  }\n  ensureMQTTClient();\n  if (!client) {\n    return false;\n  }\n  try {\n    client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n    return true;\n  } catch (err) {\n    console.warn(`${LOG} publish failed on ${topic}:`, err);\n    return false;\n  }\n}\n\n// src/utils/vastEnvironmentSignals.ts\nvar AIRY_ANDROID_APP_ID = \"com.freeairytv.android\";\nvar AIRY_WEBOS_APP_ID = \"com.freeairytv.webos\";\nvar AIRY_TIZEN_APP_ID = \"com.freeairytv.samsung\";\nvar AIRY_ROKU_APP_ID = \"com.freeairytv.roku\";\nvar AIRY_APP_NAME = \"AiryTV Movies & TV\";\nvar AIRY_DEFAULT_CONTENT_URL = \"https://live.airy.tv\";\nvar CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nvar PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\nvar LG_TEST_APP_ID = \"com.hulu.plus\";\nvar LG_TEST_APP_NAME = \"Hulu\";\nvar LG_TEST_CONTENT_URL = \"https://www.hulu.com/live-tv\";\nvar _lgTestDeviceId;\nfunction getLgTestDeviceId() {\n  if (!_lgTestDeviceId) _lgTestDeviceId = createUuid();\n  return _lgTestDeviceId;\n}\nfunction isLgWebOS() {\n  if (typeof navigator === \"undefined\") return false;\n  return /Web0S|webOS|LG Browser|LGSTB|LGE/i.test(navigator.userAgent);\n}\nfunction getDefaultAppId() {\n  if (typeof navigator === \"undefined\") return AIRY_ANDROID_APP_ID;\n  const ua = navigator.userAgent;\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;\n  if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;\n  if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;\n  return AIRY_ANDROID_APP_ID;\n}\nvar DEVICE_ID_STORAGE_KEYS = [\n  \"rdid\",\n  \"ifa\",\n  \"advertisingId\",\n  \"advertising_id\",\n  \"deviceAdvertisingId\",\n  \"aaid\",\n  \"adid\",\n  \"rida\",\n  \"tifa\",\n  \"lgudid\"\n];\nvar ANDROID_ID_TYPES = /* @__PURE__ */ new Set([\"aaid\", \"adid\"]);\nfunction resolveVastEnvironmentSignals(isCtv) {\n  const bridgeSignals = readNativeBridgeSignals();\n  const platformDevice = readPlatformNativeDeviceId();\n  const lg = isCtv && isLgWebOS();\n  const deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId || (lg && platformDevice.limitAdTracking !== true ? getLgTestDeviceId() : void 0);\n  const deviceIdType = bridgeSignals.deviceIdType || readStoredString(\"deviceIdType\") || readStoredString(\"idtype\") || platformDevice.deviceIdType || inferDeviceIdType() || (lg ? \"lgudid\" : void 0);\n  const platformLat = bridgeSignals.deviceId ? bridgeSignals.limitAdTracking : platformDevice.limitAdTracking;\n  const limitAdTracking = deviceId != null ? platformLat ?? readStoredLimitAdTracking() ?? false : void 0;\n  if (isCtv) {\n    return {\n      isCtv: true,\n      contentUrl: bridgeSignals.contentUrl || readStoredString(\"contentUrl\") || (lg ? LG_TEST_CONTENT_URL : AIRY_DEFAULT_CONTENT_URL),\n      appId: bridgeSignals.appId || readStoredString(\"appId\") || readStoredString(\"msid\") || (lg ? LG_TEST_APP_ID : getDefaultAppId()),\n      appName: bridgeSignals.appName || readStoredString(\"appName\") || readStoredString(\"an\") || (lg ? LG_TEST_APP_NAME : AIRY_APP_NAME),\n      sessionId: getOrCreateCtvSessionId(),\n      ...deviceId ? { deviceId } : {},\n      ...deviceIdType ? { deviceIdType } : {},\n      ...limitAdTracking != null ? { limitAdTracking } : {},\n      deviceTypeHint: 5\n    };\n  }\n  return {\n    isCtv: false,\n    ...deviceId ? { deviceId } : {},\n    ...deviceIdType ? { deviceIdType } : {},\n    ...limitAdTracking != null ? { limitAdTracking } : {}\n  };\n}\nfunction inferDeviceIdType() {\n  if (typeof navigator === \"undefined\") {\n    return void 0;\n  }\n  const ua = navigator.userAgent;\n  if (/Roku/i.test(ua)) return \"rida\";\n  if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n  if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n  if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n  if (/Android|Google TV/i.test(ua)) return \"aaid\";\n  if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n  return void 0;\n}\nfunction isEquivalentDeviceIdType(tagType, runtimeType) {\n  if (!tagType || !runtimeType) return false;\n  const tag = tagType.toLowerCase();\n  const runtime = runtimeType.toLowerCase();\n  if (tag === runtime) return true;\n  return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\nfunction resolveNativeDeviceId() {\n  const bridgeSignals = readNativeBridgeSignals();\n  const platformDevice = readPlatformNativeDeviceId();\n  const deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId;\n  if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n    return void 0;\n  }\n  return deviceId;\n}\nfunction getOrCreateStoredUuid(storageKey) {\n  if (typeof window === \"undefined\") {\n    return void 0;\n  }\n  const existing = readStoredString(storageKey);\n  if (existing) {\n    return existing;\n  }\n  const id = createUuid();\n  try {\n    window.localStorage?.setItem(storageKey, id);\n  } catch {\n  }\n  return id;\n}\nfunction getOrCreateCtvSessionId() {\n  const existing = readStoredString(CTV_SESSION_STORAGE_KEY);\n  if (existing) {\n    return existing;\n  }\n  const sessionId = createUuid();\n  try {\n    window.localStorage?.setItem(CTV_SESSION_STORAGE_KEY, sessionId);\n  } catch {\n  }\n  return sessionId;\n}\nfunction createUuid() {\n  if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n    return crypto.randomUUID();\n  }\n  return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (char) => {\n    const value = Math.floor(Math.random() * 16);\n    const nibble = char === \"x\" ? value : value & 3 | 8;\n    return nibble.toString(16);\n  });\n}\nfunction readPlatformNativeDeviceId() {\n  if (typeof window === \"undefined\") return {};\n  try {\n    const adinfo = window.webapis?.adinfo;\n    if (adinfo) {\n      const tifa = typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n      if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n        const lat = typeof adinfo.isLATEnabled === \"function\" ? adinfo.isLATEnabled() : void 0;\n        return {\n          deviceId: tifa,\n          deviceIdType: \"tifa\",\n          ...typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}\n        };\n      }\n    }\n  } catch {\n  }\n  try {\n    const webOSDev = window.webOSDev;\n    if (webOSDev) {\n      const lgudid = typeof webOSDev.LGUDID === \"function\" ? webOSDev.LGUDID() : webOSDev.lgudid ?? webOSDev.LGUDID;\n      if (typeof lgudid === \"string\" && lgudid) {\n        if (isZeroedAdId(lgudid)) {\n          return { deviceIdType: \"lgudid\", limitAdTracking: true };\n        }\n        if (!isMacroPlaceholder(lgudid)) {\n          return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n        }\n      }\n    }\n  } catch {\n  }\n  try {\n    const roku = window.Roku;\n    if (roku) {\n      const rida = typeof roku.getPublisherUniqueId === \"function\" ? roku.getPublisherUniqueId() : roku.rida;\n      if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n        return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n      }\n    }\n  } catch {\n  }\n  return {};\n}\nvar ZEROED_AD_ID_PATTERNS = /* @__PURE__ */ new Set([\n  \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n  \"00000000-0000-0000-0000-000000000000\"\n]);\nfunction isMacroPlaceholder(value) {\n  const t = value.trim();\n  return !t || /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) || /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) || ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\nfunction isZeroedAdId(value) {\n  return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\nfunction readNativeBridgeSignals() {\n  if (typeof window === \"undefined\") {\n    return {};\n  }\n  const candidates = [\n    window.__STORMCLOUD_CTV_AD_INFO__,\n    window.__STORMCLOUD_CTV__,\n    window.stormcloudCtv,\n    window.AiryTV,\n    window.Android,\n    window.webOS,\n    window.tizen,\n    window.amazon\n  ].filter(Boolean);\n  for (const source of candidates) {\n    const contentUrl = readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) || void 0;\n    const appId = readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) || void 0;\n    const appName = readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || void 0;\n    const deviceId = readBridgeValue(source, [\n      \"rdid\",\n      \"ifa\",\n      \"advertisingId\",\n      \"adId\",\n      \"deviceId\",\n      \"lgudid\",\n      \"LGUDID\",\n      \"tifa\",\n      \"rida\",\n      \"afai\",\n      \"aaid\"\n    ]) || void 0;\n    if (!contentUrl && !deviceId && !appId && !appName) continue;\n    const deviceIdType = readBridgeValue(source, [\n      \"idtype\",\n      \"deviceIdType\",\n      \"advertisingIdType\",\n      \"idType\"\n    ]) || inferDeviceIdType();\n    const limitAdTracking = readBridgeBoolean(source, [\n      \"is_lat\",\n      \"limitAdTracking\",\n      \"limitedAdTracking\",\n      \"lat\"\n    ]);\n    return {\n      ...contentUrl ? { contentUrl } : {},\n      ...appId ? { appId } : {},\n      ...appName ? { appName } : {},\n      ...deviceId ? { deviceId } : {},\n      ...deviceId && deviceIdType ? { deviceIdType } : {},\n      ...deviceId && limitAdTracking != null ? { limitAdTracking } : {}\n    };\n  }\n  return {};\n}\nfunction readBridgeValue(source, keys) {\n  for (const key of keys) {\n    const value = source?.[key];\n    if (typeof value === \"string\" && value) {\n      return value;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = value.call(source);\n        if (typeof result === \"string\" && result) {\n          return result;\n        }\n      } catch {\n      }\n    }\n  }\n  return void 0;\n}\nfunction readBridgeBoolean(source, keys) {\n  for (const key of keys) {\n    const value = source?.[key];\n    const normalized = normalizeBoolean(value);\n    if (normalized != null) {\n      return normalized;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = normalizeBoolean(value.call(source));\n        if (result != null) {\n          return result;\n        }\n      } catch {\n      }\n    }\n  }\n  return void 0;\n}\nfunction readStoredDeviceId() {\n  for (const key of DEVICE_ID_STORAGE_KEYS) {\n    const value = readStoredString(key);\n    if (value) {\n      return value;\n    }\n  }\n  return void 0;\n}\nfunction readStoredString(key) {\n  if (typeof window === \"undefined\") {\n    return void 0;\n  }\n  try {\n    const value = window.localStorage?.getItem(key);\n    return value || void 0;\n  } catch {\n    return void 0;\n  }\n}\nfunction readStoredLimitAdTracking() {\n  return normalizeBoolean(\n    readStoredString(\"limitAdTracking\") || readStoredString(\"limitedAdTracking\") || readStoredString(\"is_lat\")\n  );\n}\nfunction normalizeBoolean(value) {\n  if (typeof value === \"boolean\") {\n    return value;\n  }\n  if (typeof value === \"number\") {\n    return value === 1;\n  }\n  if (typeof value === \"string\") {\n    const normalized = value.toLowerCase();\n    if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n      return true;\n    }\n    if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n      return false;\n    }\n  }\n  return void 0;\n}\n\n// src/utils/tracking.ts\nvar cachedBrowserId = null;\nfunction getClientInfo() {\n  const ua = navigator.userAgent;\n  const platform = navigator.platform;\n  const vendor = navigator.vendor || \"\";\n  const maxTouchPoints = navigator.maxTouchPoints || 0;\n  const memory = navigator.deviceMemory || null;\n  const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n  const screenInfo = {\n    width: screen?.width,\n    height: screen?.height,\n    availWidth: screen?.availWidth,\n    availHeight: screen?.availHeight,\n    orientation: screen?.orientation?.type || \"\",\n    pixelDepth: screen?.pixelDepth\n  };\n  let deviceType = \"desktop\";\n  let brand = \"Unknown\";\n  let os = \"Unknown\";\n  let model = \"\";\n  let isSmartTV = false;\n  let isAndroid = false;\n  let isWebView = false;\n  let isWebApp = false;\n  if (ua.includes(\"Web0S\")) {\n    brand = \"LG\";\n    os = \"webOS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n    const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n    model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n  } else if (ua.includes(\"Tizen\")) {\n    brand = \"Samsung\";\n    os = \"Tizen\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n    const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n    const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n    model = tizenMatch ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim() : \"Tizen TV\";\n  } else if (ua.includes(\"Philips\")) {\n    brand = \"Philips\";\n    os = \"Saphi\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n    brand = \"Sharp\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"Android\") && (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))) {\n    brand = \"Sony\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"Android\") && (ua.includes(\"NetCast\") || ua.includes(\"LG\"))) {\n    brand = \"LG\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n    brand = \"Roku\";\n    os = \"Roku OS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"AppleTV\")) {\n    brand = \"Apple\";\n    os = \"tvOS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  }\n  if (ua.includes(\"Android\")) {\n    isAndroid = true;\n    os = \"Android\";\n    deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n    if (ua.includes(\"Android\") && (maxTouchPoints === 0 || ua.includes(\"Google TV\") || ua.includes(\"XiaoMi\"))) {\n      deviceType = \"tv\";\n      isSmartTV = true;\n      brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n    }\n    const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n    if (androidModelMatch && androidModelMatch[1]) {\n      model = androidModelMatch[1];\n    }\n  }\n  if (/iPad|iPhone|iPod/.test(ua)) {\n    os = \"iOS\";\n    deviceType = \"mobile\";\n    brand = \"Apple\";\n    if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n      deviceType = \"tablet\";\n    }\n  }\n  if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n    if (ua.includes(\"Windows\")) {\n      os = \"Windows\";\n      deviceType = \"desktop\";\n    } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n      os = \"macOS\";\n      deviceType = \"desktop\";\n      if (maxTouchPoints > 1) deviceType = \"tablet\";\n    } else if (ua.includes(\"Linux\")) {\n      os = \"Linux\";\n      deviceType = \"desktop\";\n    }\n  }\n  if (brand === \"Unknown\") {\n    if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n    if (vendor.includes(\"Apple\")) brand = \"Apple\";\n    if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n  }\n  isWebView = /wv|WebView|Linux; U;/.test(ua);\n  if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n    isWebView = true;\n  }\n  isWebApp = window.matchMedia(\"(display-mode: standalone)\").matches || window.navigator.standalone === true || window.screen?.orientation?.angle !== void 0;\n  return {\n    brand,\n    os,\n    model: model || ua.substring(0, 50) + \"...\",\n    deviceType,\n    isSmartTV,\n    isAndroid,\n    isWebView,\n    isWebApp,\n    domain: window.location.hostname,\n    origin: window.location.origin,\n    path: window.location.pathname,\n    userAgent: ua,\n    vendor,\n    platform,\n    screen: screenInfo,\n    hardwareConcurrency,\n    deviceMemory: memory,\n    maxTouchPoints,\n    language: navigator.language,\n    languages: navigator.languages?.join(\",\") || \"\",\n    cookieEnabled: navigator.cookieEnabled,\n    doNotTrack: navigator.doNotTrack || \"\",\n    referrer: document.referrer,\n    visibilityState: document.visibilityState\n  };\n}\nasync function sha256Hex(input) {\n  if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n    try {\n      await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n      let encodedData;\n      if (typeof TextEncoder !== \"undefined\") {\n        encodedData = new TextEncoder().encode(input);\n      } else {\n        const utf8 = unescape(encodeURIComponent(input));\n        const buffer = new Uint8Array(utf8.length);\n        for (let i = 0; i < utf8.length; i++) {\n          buffer[i] = utf8.charCodeAt(i);\n        }\n        encodedData = buffer;\n      }\n      const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n      return Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n    } catch {\n      console.warn(\n        \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n      );\n    }\n  }\n  let hash = 0;\n  for (let i = 0; i < input.length; i++) {\n    const char = input.charCodeAt(i);\n    hash = (hash << 5) - hash + char;\n    hash = hash & hash;\n  }\n  const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n  const timestamp = Date.now().toString(16).padStart(12, \"0\");\n  const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n  return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\nfunction resolvePlayerIdentitySeed(clientInfo) {\n  const nativeDeviceId = resolveNativeDeviceId();\n  if (nativeDeviceId) {\n    return `device:${nativeDeviceId}`;\n  }\n  const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n  if (persistedId) {\n    return `persisted:${persistedId}`;\n  }\n  return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\nasync function getBrowserID(clientInfo) {\n  if (cachedBrowserId) {\n    return cachedBrowserId;\n  }\n  cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n  return cachedBrowserId;\n}\nfunction canPublish(licenseKey) {\n  return Boolean(isMQTTEnabled() && licenseKey);\n}\nasync function buildPlayerMetricEvent(context = {}, flags = {}) {\n  const clientInfo = getClientInfo();\n  const playerId = await getBrowserID(clientInfo);\n  const captureAt = flags.captureAt ?? (/* @__PURE__ */ new Date()).toISOString();\n  return {\n    player_id: playerId,\n    device_type: clientInfo.deviceType,\n    os: clientInfo.os.toLowerCase(),\n    ad_loaded: flags.adLoaded ?? false,\n    ad_detect: flags.adDetect ?? false,\n    capture_at: captureAt,\n    ...context.inputStreamType ? { input_stream_type: context.inputStreamType } : {}\n  };\n}\nfunction publishTracking(licenseKey, channel, body) {\n  ensureMQTTClient();\n  publishMQTT(buildPlayerTopic(licenseKey, channel), body);\n}\nasync function sendInitialTracking(licenseKey, context = {}) {\n  if (!canPublish(licenseKey)) return;\n  try {\n    const metricEvent = await buildPlayerMetricEvent(context, {\n      adLoaded: false,\n      adDetect: false\n    });\n    publishTracking(licenseKey, \"metrics\", {\n      events: [metricEvent]\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n      error\n    );\n  }\n}\nasync function sendAdDetectTracking(licenseKey, adDetectInfo, context = {}) {\n  try {\n    await sendHeartbeat(licenseKey, context, {\n      adDetect: true,\n      captureAt: adDetectInfo.timestamp\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n      error\n    );\n  }\n}\nasync function sendAdLoadedTracking(licenseKey, adLoadedInfo, context = {}) {\n  try {\n    await sendHeartbeat(licenseKey, context, {\n      adLoaded: true,\n      captureAt: adLoadedInfo.timestamp\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n      error\n    );\n  }\n}\nasync function sendAdImpressionTracking(licenseKey, adImpressionInfo, context = {}) {\n  if (!canPublish(licenseKey)) return;\n  try {\n    const metricEvent = await buildPlayerMetricEvent(context, {\n      captureAt: adImpressionInfo.timestamp\n    });\n    publishTracking(licenseKey, \"heartbeat\", metricEvent);\n    publishTracking(licenseKey, \"impressions\", {\n      events: [\n        {\n          player_id: metricEvent.player_id,\n          ad_played_count: 1,\n          ad_url: adImpressionInfo.adUrl,\n          capture_at: adImpressionInfo.timestamp\n        }\n      ]\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n      error\n    );\n  }\n}\nasync function sendHeartbeat(licenseKey, context = {}, flags = {}) {\n  if (!canPublish(licenseKey)) return;\n  try {\n    const heartbeatData = await buildPlayerMetricEvent(context, flags);\n    publishTracking(licenseKey, \"heartbeat\", heartbeatData);\n  } catch (error) {\n    console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n  }\n}\n\n// src/utils/polyfills.ts\nfunction polyfillURLSearchParams() {\n  if (typeof URLSearchParams !== \"undefined\") {\n    return;\n  }\n  class URLSearchParamsPolyfill {\n    constructor(init) {\n      this.params = /* @__PURE__ */ new Map();\n      if (typeof init === \"string\") {\n        this.parseQueryString(init);\n      } else if (init instanceof URLSearchParamsPolyfill) {\n        init.forEach((value, key) => {\n          this.append(key, value);\n        });\n      }\n    }\n    parseQueryString(query) {\n      const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n      if (!cleanQuery) return;\n      cleanQuery.split(\"&\").forEach((param) => {\n        const [key, value] = param.split(\"=\");\n        if (key) {\n          const decodedKey = this.safeDecodeURIComponent(key);\n          const decodedValue = value ? this.safeDecodeURIComponent(value) : \"\";\n          this.append(decodedKey, decodedValue);\n        }\n      });\n    }\n    safeDecodeURIComponent(str) {\n      try {\n        return decodeURIComponent(str.replace(/\\+/g, \" \"));\n      } catch (e) {\n        return str;\n      }\n    }\n    append(name, value) {\n      const values = this.params.get(name) || [];\n      values.push(String(value));\n      this.params.set(name, values);\n    }\n    delete(name) {\n      this.params.delete(name);\n    }\n    get(name) {\n      const values = this.params.get(name);\n      return values && values.length > 0 && values[0] !== void 0 ? values[0] : null;\n    }\n    getAll(name) {\n      return this.params.get(name) || [];\n    }\n    has(name) {\n      return this.params.has(name);\n    }\n    set(name, value) {\n      this.params.set(name, [String(value)]);\n    }\n    forEach(callback) {\n      this.params.forEach((values, key) => {\n        values.forEach((value) => {\n          callback(value, key, this);\n        });\n      });\n    }\n    toString() {\n      const parts = [];\n      this.params.forEach((values, key) => {\n        values.forEach((value) => {\n          parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n        });\n      });\n      return parts.join(\"&\");\n    }\n  }\n  window.URLSearchParams = URLSearchParamsPolyfill;\n}\nfunction polyfillTextEncoder() {\n  if (typeof TextEncoder !== \"undefined\") {\n    return;\n  }\n  class TextEncoderPolyfill {\n    constructor() {\n      this.encoding = \"utf-8\";\n    }\n    encode(str) {\n      const utf8 = [];\n      for (let i = 0; i < str.length; i++) {\n        let charcode = str.charCodeAt(i);\n        if (charcode < 128) {\n          utf8.push(charcode);\n        } else if (charcode < 2048) {\n          utf8.push(192 | charcode >> 6, 128 | charcode & 63);\n        } else if (charcode < 55296 || charcode >= 57344) {\n          utf8.push(\n            224 | charcode >> 12,\n            128 | charcode >> 6 & 63,\n            128 | charcode & 63\n          );\n        } else {\n          i++;\n          charcode = 65536 + ((charcode & 1023) << 10 | str.charCodeAt(i) & 1023);\n          utf8.push(\n            240 | charcode >> 18,\n            128 | charcode >> 12 & 63,\n            128 | charcode >> 6 & 63,\n            128 | charcode & 63\n          );\n        }\n      }\n      return new Uint8Array(utf8);\n    }\n  }\n  window.TextEncoder = TextEncoderPolyfill;\n}\nfunction polyfillPromiseFinally() {\n  if (typeof Promise !== \"undefined\" && !Promise.prototype.finally) {\n    Promise.prototype.finally = function(callback) {\n      const constructor = this.constructor;\n      return this.then(\n        (value) => constructor.resolve(callback()).then(() => value),\n        (reason) => constructor.resolve(callback()).then(() => {\n          throw reason;\n        })\n      );\n    };\n  }\n}\nfunction polyfillObjectAssign() {\n  if (typeof Object.assign !== \"function\") {\n    Object.assign = function(target, ...sources) {\n      if (target == null) {\n        throw new TypeError(\"Cannot convert undefined or null to object\");\n      }\n      const to = Object(target);\n      for (let i = 0; i < sources.length; i++) {\n        const nextSource = sources[i];\n        if (nextSource != null) {\n          for (const nextKey in nextSource) {\n            if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n              to[nextKey] = nextSource[nextKey];\n            }\n          }\n        }\n      }\n      return to;\n    };\n  }\n}\nfunction polyfillArrayFrom() {\n  if (!Array.from) {\n    Array.from = function(arrayLike, mapFn, thisArg) {\n      const items = Object(arrayLike);\n      if (arrayLike == null) {\n        throw new TypeError(\"Array.from requires an array-like object\");\n      }\n      const len = items.length >>> 0;\n      const result = new Array(len);\n      for (let i = 0; i < len; i++) {\n        if (mapFn) {\n          result[i] = mapFn.call(thisArg, items[i], i);\n        } else {\n          result[i] = items[i];\n        }\n      }\n      return result;\n    };\n  }\n}\nfunction polyfillStringStartsWith() {\n  if (!String.prototype.startsWith) {\n    String.prototype.startsWith = function(search, pos) {\n      pos = !pos || pos < 0 ? 0 : +pos;\n      return this.substring(pos, pos + search.length) === search;\n    };\n  }\n}\nfunction polyfillStringEndsWith() {\n  if (!String.prototype.endsWith) {\n    String.prototype.endsWith = function(search, length) {\n      if (length === void 0 || length > this.length) {\n        length = this.length;\n      }\n      return this.substring(length - search.length, length) === search;\n    };\n  }\n}\nfunction polyfillStringIncludes() {\n  if (!String.prototype.includes) {\n    String.prototype.includes = function(search, start) {\n      if (typeof start !== \"number\") {\n        start = 0;\n      }\n      if (start + search.length > this.length) {\n        return false;\n      }\n      return this.indexOf(search, start) !== -1;\n    };\n  }\n}\nfunction initializePolyfills() {\n  polyfillObjectAssign();\n  polyfillArrayFrom();\n  polyfillStringStartsWith();\n  polyfillStringEndsWith();\n  polyfillStringIncludes();\n  polyfillURLSearchParams();\n  polyfillTextEncoder();\n  polyfillPromiseFinally();\n}\n\n// src/utils/vastMacros.ts\nvar UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nvar INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nvar EXAMPLE_COM_URL = /example\\.com/i;\nvar CTV_UNSUPPORTED_PARAMS = [\n  \"description_url\",\n  \"tfcd\",\n  \"npa\",\n  \"min_ad_duration\",\n  \"max_ad_duration\",\n  \"unviewed_position_start\",\n  \"impl\",\n  \"vad_type\",\n  \"gdpr\",\n  \"gdpr_consent\",\n  \"us_privacy\"\n];\nvar INLINE_DEVICE_MACRO_REPLACEMENTS = [\n  { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n  { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n  { pattern: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n  { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\n  { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n  { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator }\n];\nfunction isMacroPlaceholder2(value) {\n  if (value == null) return true;\n  const trimmed = value.trim();\n  if (!trimmed) return true;\n  if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n  return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\nfunction generateCorrelator() {\n  if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n    try {\n      const buf = new Uint32Array(2);\n      crypto.getRandomValues(buf);\n      const value = (buf[0] ?? 0) * 2097152 + ((buf[1] ?? 0) & 2097151);\n      if (value > 0) {\n        return String(value);\n      }\n    } catch {\n    }\n  }\n  return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\nfunction expandInlineMacroPlaceholders(baseUrl, ctx) {\n  let url = baseUrl;\n  for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n    const value = getValue(ctx);\n    if (value != null && value !== \"\") {\n      url = url.replace(pattern, encodeURIComponent(value));\n    }\n  }\n  return url;\n}\nfunction applyDeviceIdentityParams(params, ctx) {\n  const runtimeId = ctx.deviceId?.trim();\n  const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n  const tagRdid = params.get(\"rdid\");\n  const tagType = params.get(\"idtype\");\n  const tagLat = params.get(\"is_lat\");\n  const latValue = ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0;\n  if (runtimeId) {\n    params.set(\"rdid\", runtimeId);\n    params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n    params.set(\"is_lat\", latValue ?? (isMacroPlaceholder2(tagLat) ? \"0\" : tagLat));\n    return;\n  }\n  const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder2(tagRdid));\n  const tagTypeValid = Boolean(tagType && !isMacroPlaceholder2(tagType));\n  if (tagRdidValid && tagTypeValid && runtimeType && !isEquivalentDeviceIdType(tagType, runtimeType)) {\n    params.delete(\"rdid\");\n    params.delete(\"idtype\");\n    params.delete(\"is_lat\");\n    return;\n  }\n  if (tagRdidValid) {\n    if (isMacroPlaceholder2(tagType) && runtimeType) {\n      params.set(\"idtype\", runtimeType);\n    }\n    if (isMacroPlaceholder2(tagLat)) {\n      params.set(\"is_lat\", latValue ?? \"0\");\n    }\n    return;\n  }\n  params.delete(\"rdid\");\n  params.delete(\"idtype\");\n  params.delete(\"is_lat\");\n}\nfunction removeBrokenAppNameOrphans(params, appName) {\n  const toDelete = [];\n  params.forEach((_value, key) => {\n    if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n      toDelete.push(key);\n    }\n  });\n  if (appName && appName.includes(\"&\")) {\n    for (const suffix of appName.split(\"&\").slice(1)) {\n      const trimmed = suffix.trimStart();\n      if (!trimmed) continue;\n      toDelete.push(suffix, ` ${trimmed}`, trimmed);\n    }\n  }\n  for (const key of new Set(toDelete)) {\n    if (key) params.delete(key);\n  }\n}\nfunction normalizeVastTagUrl(raw) {\n  if (!raw) return raw;\n  try {\n    const url = new URL(raw);\n    const anValue = url.searchParams.get(\"an\");\n    if (anValue !== null) {\n      const orphanFragments = [];\n      url.searchParams.forEach((_value, key) => {\n        if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n          orphanFragments.push(key.trim());\n        }\n      });\n      if (orphanFragments.length > 0) {\n        const reconstructed = [anValue.trimEnd(), ...orphanFragments].filter(Boolean).join(\" & \");\n        url.searchParams.forEach((_value, key) => {\n          if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n            url.searchParams.delete(key);\n          }\n        });\n        url.searchParams.set(\"an\", reconstructed);\n        return url.toString().replace(\n          /([?&]an=)([^&]*)/,\n          (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n        );\n      }\n    }\n    removeBrokenAppNameOrphans(url.searchParams);\n    return url.toString();\n  } catch {\n    return raw;\n  }\n}\nfunction applyVastMacros(baseUrl, ctx) {\n  const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n  let url;\n  try {\n    url = new URL(normalizeVastTagUrl(expandedUrl));\n  } catch {\n    return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n  }\n  const params = url.searchParams;\n  removeBrokenAppNameOrphans(params, ctx.appName);\n  params.set(\"correlator\", ctx.correlator);\n  params.set(\"scor\", ctx.streamCorrelator);\n  if (ctx.isCtv) {\n    for (const key of CTV_UNSUPPORTED_PARAMS) {\n      params.delete(key);\n    }\n  }\n  if (ctx.pod != null) {\n    params.set(\"pod\", String(ctx.pod));\n  }\n  if (ctx.adPosition != null) {\n    params.set(\"ppos\", String(ctx.adPosition));\n  }\n  const requestUrl = ctx.contentUrl || ctx.pageUrl;\n  if (requestUrl) {\n    params.set(\"url\", requestUrl);\n    if (!ctx.isCtv) {\n      params.set(\"description_url\", requestUrl);\n    }\n  } else {\n    const existingUrl = params.get(\"url\") || \"\";\n    if (EXAMPLE_COM_URL.test(existingUrl)) {\n      params.delete(\"url\");\n      params.delete(\"description_url\");\n    }\n  }\n  if (ctx.adWillPlayMuted != null) {\n    params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n  }\n  if (ctx.adWillAutoPlay != null) {\n    params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n  }\n  if (ctx.appId) {\n    params.set(\"msid\", ctx.appId);\n  }\n  if (ctx.appName) {\n    removeBrokenAppNameOrphans(params, ctx.appName);\n    params.set(\"an\", ctx.appName);\n  }\n  if (ctx.sessionId) {\n    params.set(\"sid\", ctx.sessionId);\n  }\n  if (ctx.deviceTypeHint != null) {\n    params.set(\"dth\", String(ctx.deviceTypeHint));\n  } else if (ctx.isCtv) {\n    params.set(\"dth\", \"5\");\n  }\n  applyDeviceIdentityParams(params, ctx);\n  if (!ctx.isCtv) {\n    const consent = ctx.consent;\n    if (consent?.gdpr != null) {\n      params.set(\"gdpr\", consent.gdpr);\n    }\n    if (consent?.gdprConsent != null) {\n      params.set(\"gdpr_consent\", consent.gdprConsent);\n    }\n    if (consent?.usPrivacy != null) {\n      params.set(\"us_privacy\", consent.usPrivacy);\n    }\n  }\n  if (ctx.adTest) {\n    params.set(\"adtest\", \"on\");\n  }\n  const staleKeys = [];\n  params.forEach((value, key) => {\n    if (isMacroPlaceholder2(value)) {\n      staleKeys.push(key);\n    }\n  });\n  for (const key of staleKeys) {\n    params.delete(key);\n  }\n  removeBrokenAppNameOrphans(params, ctx.appName);\n  return url.toString();\n}\nfunction replaceCorrelatorFallback(baseUrl, correlator) {\n  const correlatorRegex = /([?&])correlator=([^&]*)/;\n  if (correlatorRegex.test(baseUrl)) {\n    return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n  }\n  const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n  return `${baseUrl}${sep}correlator=${correlator}`;\n}\nfunction fetchConsentSignals(timeoutMs = 1500) {\n  const signals = {};\n  if (typeof window === \"undefined\") {\n    return Promise.resolve(signals);\n  }\n  const tasks = [];\n  const tcfApi = window.__tcfapi;\n  if (typeof tcfApi === \"function\") {\n    tasks.push(\n      new Promise((resolve) => {\n        let settled = false;\n        try {\n          tcfApi(\"addEventListener\", 2, (tcData, success) => {\n            if (settled) return;\n            if (success && tcData && (tcData.eventStatus === \"tcloaded\" || tcData.eventStatus === \"useractioncomplete\")) {\n              settled = true;\n              signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n              if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n                signals.gdprConsent = tcData.tcString;\n              }\n              try {\n                tcfApi(\"removeEventListener\", 2, () => {\n                }, tcData.listenerId);\n              } catch {\n              }\n              resolve();\n            }\n          });\n        } catch {\n          resolve();\n        }\n        setTimeout(() => {\n          if (!settled) {\n            settled = true;\n            resolve();\n          }\n        }, timeoutMs);\n      })\n    );\n  }\n  const uspApi = window.__uspapi;\n  if (typeof uspApi === \"function\") {\n    tasks.push(\n      new Promise((resolve) => {\n        try {\n          uspApi(\"getUSPData\", 1, (data, success) => {\n            if (success && typeof data?.uspString === \"string\" && data.uspString) {\n              signals.usPrivacy = data.uspString;\n            }\n            resolve();\n          });\n        } catch {\n          resolve();\n        }\n        setTimeout(resolve, timeoutMs);\n      })\n    );\n  }\n  if (tasks.length === 0) {\n    return Promise.resolve(signals);\n  }\n  return Promise.all(tasks).then(() => signals);\n}\n\n// src/utils/browserCompat.ts\nfunction getChromeVersion(ua) {\n  const match = ua.match(/Chrome\\/(\\d+)/);\n  return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getWebKitVersion(ua) {\n  const match = ua.match(/AppleWebKit\\/(\\d+)/);\n  return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getPlatform() {\n  if (\"userAgentData\" in navigator && navigator.userAgentData?.platform) {\n    return navigator.userAgentData.platform;\n  }\n  const ua = navigator.userAgent;\n  if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n    return /iPhone|iPad|iPod/i.test(ua) ? \"iPhone\" : \"MacIntel\";\n  }\n  if (/Win/i.test(ua)) {\n    return \"Win32\";\n  }\n  if (/Linux/i.test(ua)) {\n    return /Android/i.test(ua) ? \"Linux armv8l\" : \"Linux x86_64\";\n  }\n  if (/CrOS/i.test(ua)) {\n    return \"CrOS\";\n  }\n  return navigator.platform || \"Unknown\";\n}\nfunction detectBrowser() {\n  const ua = navigator.userAgent;\n  const platform = getPlatform();\n  let name = \"Unknown\";\n  let version = \"0\";\n  let majorVersion = 0;\n  let isSmartTV = false;\n  let isLegacyTV = false;\n  let supportsModernJS = true;\n  let webOSVersion;\n  let tizenVersion;\n  let chromeVersionNum;\n  const chromeVersion = getChromeVersion(ua);\n  const webkitVersion = getWebKitVersion(ua);\n  chromeVersionNum = chromeVersion > 0 ? chromeVersion : void 0;\n  if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n    name = \"LG WebOS\";\n    isSmartTV = true;\n    let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n    if (!match || !match[1]) {\n      match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n    }\n    if (match && match[1]) {\n      version = match[1];\n      const parts = version.split(\".\");\n      majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n      webOSVersion = majorVersion;\n    } else if (chromeVersion > 0) {\n      if (chromeVersion >= 79) {\n        webOSVersion = 6;\n        version = \"6.0\";\n        majorVersion = 6;\n      } else if (chromeVersion >= 68) {\n        webOSVersion = 5;\n        version = \"5.0\";\n        majorVersion = 5;\n      } else if (chromeVersion >= 53) {\n        webOSVersion = 4;\n        version = \"4.0\";\n        majorVersion = 4;\n      } else if (chromeVersion >= 38) {\n        webOSVersion = 3;\n        version = \"3.0\";\n        majorVersion = 3;\n      } else {\n        webOSVersion = 2;\n        version = \"2.0\";\n        majorVersion = 2;\n      }\n    } else {\n      version = \"Unknown\";\n      webOSVersion = void 0;\n    }\n    isLegacyTV = webOSVersion !== void 0 && webOSVersion < 3;\n  } else if (/Tizen/i.test(ua)) {\n    name = \"Samsung Tizen\";\n    isSmartTV = true;\n    const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n    version = match && match[1] ? match[1] : \"Unknown\";\n    if (version !== \"Unknown\") {\n      const parts = version.split(\".\");\n      majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n      tizenVersion = majorVersion;\n    }\n    isLegacyTV = tizenVersion !== void 0 && tizenVersion < 3;\n  } else if (/SMART-TV|SmartTV/i.test(ua)) {\n    name = \"Smart TV\";\n    isSmartTV = true;\n    isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n  } else if (/NetCast/i.test(ua)) {\n    name = \"LG NetCast\";\n    isSmartTV = true;\n    isLegacyTV = true;\n  } else if (/BRAVIA/i.test(ua)) {\n    name = \"Sony BRAVIA\";\n    isSmartTV = true;\n    isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n  } else {\n    if (chromeVersion > 0) {\n      name = \"Chrome\";\n      version = chromeVersion.toString();\n      majorVersion = chromeVersion;\n      if (chromeVersion < 50) {\n        supportsModernJS = false;\n      }\n    }\n    if (webkitVersion > 0 && webkitVersion < 600) {\n      supportsModernJS = false;\n    }\n  }\n  if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n    supportsModernJS = false;\n  }\n  if (typeof URLSearchParams === \"undefined\") {\n    supportsModernJS = false;\n  }\n  return {\n    name,\n    version,\n    majorVersion,\n    isSmartTV,\n    isLegacyTV,\n    platform,\n    supportsModernJS,\n    webOSVersion,\n    tizenVersion,\n    chromeVersion: chromeVersionNum\n  };\n}\nfunction getBrowserConfigOverrides() {\n  const browser = detectBrowser();\n  const overrides = {};\n  if (browser.isSmartTV) {\n    overrides.allowNativeHls = true;\n  }\n  return overrides;\n}\nfunction logBrowserInfo(debug = false) {\n  if (!debug) return;\n  const browser = detectBrowser();\n  console.log(\"[StormcloudVideoPlayer] Browser Compatibility Info:\", {\n    browser: `${browser.name} ${browser.version}`,\n    platform: browser.platform,\n    isSmartTV: browser.isSmartTV,\n    isLegacyTV: browser.isLegacyTV,\n    supportsModernJS: browser.supportsModernJS,\n    ...browser.webOSVersion !== void 0 ? { webOSVersion: browser.webOSVersion } : {},\n    ...browser.tizenVersion !== void 0 ? { tizenVersion: browser.tizenVersion } : {},\n    ...browser.chromeVersion !== void 0 ? { chromeVersion: browser.chromeVersion } : {},\n    userAgent: navigator.userAgent\n  });\n}\n\n// src/player/Scte35Parser.ts\nfunction parseCueOutDuration(value) {\n  const num = parseFloat(value.trim());\n  if (!Number.isNaN(num)) return num;\n  const match = value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) || value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n  if (match && match[1] != null) {\n    const dStr = match[1];\n    const d = parseFloat(dStr);\n    return Number.isNaN(d) ? void 0 : d;\n  }\n  return void 0;\n}\nfunction parseCueOutCont(value) {\n  const res = {};\n  const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n  const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n  if (elapsedMatch && elapsedMatch[1] != null) {\n    const e = parseFloat(elapsedMatch[1]);\n    if (!Number.isNaN(e)) res.elapsed = e;\n  }\n  if (durationMatch && durationMatch[1] != null) {\n    const d = parseFloat(durationMatch[1]);\n    if (!Number.isNaN(d)) res.duration = d;\n  }\n  if (!(\"elapsed\" in res) || !(\"duration\" in res)) {\n    const slashMatch = value.match(/([0-9.]+)\\s*\\/\\s*([0-9.]+)/);\n    if (slashMatch && slashMatch[1] && slashMatch[2]) {\n      const elapsed = parseFloat(slashMatch[1]);\n      const duration = parseFloat(slashMatch[2]);\n      if (!Number.isNaN(elapsed) && !(\"elapsed\" in res)) res.elapsed = elapsed;\n      if (!Number.isNaN(duration) && !(\"duration\" in res)) res.duration = duration;\n    }\n  }\n  if (\"elapsed\" in res || \"duration\" in res) return res;\n  return void 0;\n}\nfunction parseAttributeList(value) {\n  const attrs = {};\n  const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n  let match;\n  while ((match = regex.exec(value)) !== null) {\n    const key = match[1] ?? \"\";\n    let rawVal = match[3] ?? match[4] ?? \"\";\n    if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n      rawVal = rawVal.slice(1, -1);\n    }\n    if (key) {\n      attrs[key] = rawVal;\n    }\n  }\n  return attrs;\n}\nfunction toNumber(val) {\n  if (val == null) return void 0;\n  const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n  return Number.isNaN(n) ? void 0 : n;\n}\nfunction isManifestBasedMarker(marker) {\n  const raw = marker.raw;\n  if (!raw) return false;\n  if (raw.tag) {\n    const tag = String(raw.tag);\n    return tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-CUE-IN\") || tag.includes(\"EXT-X-DATERANGE\");\n  }\n  if (raw.id3) return false;\n  if (raw.splice_command_type) return false;\n  return false;\n}\nfunction decodeId3ValueToText(value) {\n  try {\n    if (typeof value === \"string\") return value;\n    const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n    const text = decoder.decode(value);\n    if (text && /[\\x20-\\x7E]/.test(text)) return text;\n    let out = \"\";\n    for (let i = 0; i < value.length; i++)\n      out += String.fromCharCode(value[i]);\n    return out;\n  } catch {\n    return void 0;\n  }\n}\nfunction getFragmentStartSeconds(frag) {\n  const candidates = [frag?.start, frag?.startPTS];\n  for (const candidate of candidates) {\n    if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n      return candidate;\n    }\n  }\n  return void 0;\n}\nfunction parseScte35FromId3(tag) {\n  const text = decodeId3ValueToText(tag.value);\n  if (!text) return void 0;\n  const cueOutMatch = text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) || text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n  if (cueOutMatch) {\n    const arg = (cueOutMatch[1] ?? \"\").trim();\n    const dur = parseCueOutDuration(arg);\n    const marker = {\n      type: \"start\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      ...dur !== void 0 ? { durationSeconds: dur } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n  if (cueOutContMatch) {\n    const arg = (cueOutContMatch[1] ?? \"\").trim();\n    const cont = parseCueOutCont(arg);\n    const marker = {\n      type: \"progress\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      ...cont?.duration !== void 0 ? { durationSeconds: cont.duration } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n  if (cueInMatch) {\n    const marker = {\n      type: \"end\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  const daterangeMatch = text.match(/EXT-X-DATERANGE:([^\\r\\n]*)/i);\n  if (daterangeMatch) {\n    const attrs = parseAttributeList(daterangeMatch[1] ?? \"\");\n    const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n    const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n    const klass = String(attrs[\"CLASS\"] ?? \"\");\n    const duration = toNumber(attrs[\"DURATION\"]);\n    if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n      const marker = {\n        type: \"start\",\n        ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n        ...duration !== void 0 ? { durationSeconds: duration } : {},\n        raw: { id3: text, attrs }\n      };\n      return marker;\n    }\n    if (hasScteIn) {\n      const marker = {\n        type: \"end\",\n        ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n        raw: { id3: text, attrs }\n      };\n      return marker;\n    }\n  }\n  if (/SCTE35-OUT/i.test(text)) {\n    const marker = {\n      type: \"start\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  if (/SCTE35-IN/i.test(text)) {\n    const marker = {\n      type: \"end\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  if (tag.value instanceof Uint8Array) {\n    const bin = parseScte35Binary(tag.value);\n    if (bin) return bin;\n  }\n  return void 0;\n}\nfunction normalizeFragmentPayload(payload) {\n  if (payload instanceof Uint8Array) {\n    return payload;\n  }\n  if (payload instanceof ArrayBuffer) {\n    return new Uint8Array(payload);\n  }\n  if (ArrayBuffer.isView(payload)) {\n    const view = payload;\n    return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n  }\n  return void 0;\n}\nfunction detectTsPacketFormat(data) {\n  const packetSizes = [188, 192, 204];\n  for (const packetSize of packetSizes) {\n    const tsPayloadOffset = packetSize === 192 ? 4 : 0;\n    for (let offset = 0; offset < packetSize; offset++) {\n      let matchedPackets = 0;\n      for (let packetStart = offset; packetStart + tsPayloadOffset < data.length && matchedPackets < 5; packetStart += packetSize) {\n        if (data[packetStart + tsPayloadOffset] !== 71) {\n          break;\n        }\n        matchedPackets++;\n      }\n      if (matchedPackets >= 2) {\n        return { offset, packetSize, tsPayloadOffset };\n      }\n    }\n  }\n  return void 0;\n}\nfunction getPsiSectionStart(payload, payloadUnitStart) {\n  if (!payloadUnitStart) {\n    return void 0;\n  }\n  const pointerField = payload[0];\n  if (pointerField == null) {\n    return void 0;\n  }\n  const sectionStart = 1 + pointerField;\n  return sectionStart < payload.length ? sectionStart : void 0;\n}\nfunction getPsiSectionLength(data, offset) {\n  return ((data[offset + 1] ?? 0) & 15) << 8 | (data[offset + 2] ?? 0);\n}\nfunction parsePatSection(payload, payloadUnitStart, pmtPids) {\n  const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n  if (sectionStart == null || sectionStart + 8 >= payload.length) {\n    return;\n  }\n  if (payload[sectionStart] !== 0) {\n    return;\n  }\n  const sectionLength = getPsiSectionLength(payload, sectionStart);\n  const sectionEnd = Math.min(\n    payload.length,\n    sectionStart + 3 + sectionLength\n  );\n  for (let offset = sectionStart + 8; offset + 4 <= sectionEnd - 4; offset += 4) {\n    const programNumber = (payload[offset] ?? 0) << 8 | (payload[offset + 1] ?? 0);\n    const pid = ((payload[offset + 2] ?? 0) & 31) << 8 | (payload[offset + 3] ?? 0);\n    if (programNumber !== 0) {\n      pmtPids.add(pid);\n    }\n  }\n}\nfunction descriptorsIdentifyScte35(data, start, end) {\n  let offset = start;\n  while (offset + 2 <= end) {\n    const tag = data[offset] ?? 0;\n    const length = data[offset + 1] ?? 0;\n    const descriptorStart = offset + 2;\n    const descriptorEnd = descriptorStart + length;\n    if (descriptorEnd > end) {\n      return false;\n    }\n    const registration = length >= 4 ? String.fromCharCode(\n      data[descriptorStart] ?? 0,\n      data[descriptorStart + 1] ?? 0,\n      data[descriptorStart + 2] ?? 0,\n      data[descriptorStart + 3] ?? 0\n    ) : \"\";\n    if (tag === 138 || registration === \"CUEI\" || registration === \"SCTE\") {\n      return true;\n    }\n    offset = descriptorEnd;\n  }\n  return false;\n}\nfunction parsePmtSection(payload, payloadUnitStart, tsScte35Pids) {\n  const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n  if (sectionStart == null || sectionStart + 12 >= payload.length) {\n    return;\n  }\n  if (payload[sectionStart] !== 2) {\n    return;\n  }\n  const sectionLength = getPsiSectionLength(payload, sectionStart);\n  const sectionEnd = Math.min(\n    payload.length,\n    sectionStart + 3 + sectionLength\n  );\n  const programInfoLength = ((payload[sectionStart + 10] ?? 0) & 15) << 8 | (payload[sectionStart + 11] ?? 0);\n  let offset = sectionStart + 12 + programInfoLength;\n  while (offset + 5 <= sectionEnd - 4) {\n    const streamType = payload[offset] ?? 0;\n    const elementaryPid = ((payload[offset + 1] ?? 0) & 31) << 8 | (payload[offset + 2] ?? 0);\n    const esInfoLength = ((payload[offset + 3] ?? 0) & 15) << 8 | (payload[offset + 4] ?? 0);\n    const descriptorStart = offset + 5;\n    const descriptorEnd = Math.min(descriptorStart + esInfoLength, sectionEnd - 4);\n    if (streamType === 134 || streamType === 6 && descriptorsIdentifyScte35(payload, descriptorStart, descriptorEnd)) {\n      tsScte35Pids.add(elementaryPid);\n    }\n    offset = descriptorStart + esInfoLength;\n  }\n}\nfunction hasProcessedTsScte35Section(section, processedSections) {\n  let checksum = 0;\n  for (let i = 0; i < section.length; i++) {\n    checksum = checksum * 31 + (section[i] ?? 0) >>> 0;\n  }\n  const key = `${section.length}:${checksum}`;\n  if (processedSections.has(key)) {\n    return true;\n  }\n  processedSections.add(key);\n  if (processedSections.size > 200) {\n    const firstKey = processedSections.values().next().value;\n    if (firstKey) {\n      processedSections.delete(firstKey);\n    }\n  }\n  return false;\n}\nfunction addScte35SectionMarker(section, markers, processedSections) {\n  if (section[0] !== 252 || hasProcessedTsScte35Section(section, processedSections)) {\n    return;\n  }\n  const marker = parseScte35Binary(section);\n  if (!marker) {\n    return;\n  }\n  marker.raw = {\n    ...typeof marker.raw === \"object\" && marker.raw ? marker.raw : {},\n    source: \"ts-packet\"\n  };\n  markers.push(marker);\n}\nfunction appendScte35Bytes(pid, bytes, assemblers, markers, processedSections) {\n  const assembler = assemblers.get(pid);\n  if (!assembler) {\n    return;\n  }\n  for (let i = 0; i < bytes.length && assembler.bytes.length < assembler.expectedLength; i++) {\n    assembler.bytes.push(bytes[i] ?? 0);\n  }\n  if (assembler.bytes.length >= assembler.expectedLength) {\n    assemblers.delete(pid);\n    addScte35SectionMarker(new Uint8Array(assembler.bytes), markers, processedSections);\n  }\n}\nfunction collectScte35SectionsFromPayload(pid, payload, payloadUnitStart, assemblers, markers, processedSections) {\n  if (payload.length === 0) {\n    return;\n  }\n  let offset = 0;\n  if (payloadUnitStart) {\n    const pointerField = payload[0] ?? 0;\n    const previousAssembler = assemblers.get(pid);\n    if (previousAssembler && pointerField > 0) {\n      appendScte35Bytes(\n        pid,\n        payload.subarray(1, Math.min(1 + pointerField, payload.length)),\n        assemblers,\n        markers,\n        processedSections\n      );\n    }\n    assemblers.delete(pid);\n    offset = 1 + pointerField;\n  } else {\n    appendScte35Bytes(pid, payload, assemblers, markers, processedSections);\n    return;\n  }\n  while (offset + 3 <= payload.length) {\n    const tableId = payload[offset];\n    if (tableId == null || tableId === 255) {\n      return;\n    }\n    const sectionLength = getPsiSectionLength(payload, offset);\n    const totalLength = 3 + sectionLength;\n    if (sectionLength <= 0 || totalLength <= 3) {\n      return;\n    }\n    if (offset + totalLength <= payload.length) {\n      addScte35SectionMarker(\n        payload.subarray(offset, offset + totalLength),\n        markers,\n        processedSections\n      );\n      offset += totalLength;\n    } else {\n      assemblers.set(pid, {\n        bytes: Array.from(payload.subarray(offset)),\n        expectedLength: totalLength\n      });\n      return;\n    }\n  }\n}\nfunction parseScte35FromTsPackets(data, tsScte35Pids, pmtPids, processedSections) {\n  const packetInfo = detectTsPacketFormat(data);\n  if (!packetInfo) {\n    return [];\n  }\n  const markers = [];\n  const sectionAssemblers = /* @__PURE__ */ new Map();\n  for (let packetStart = packetInfo.offset; packetStart + packetInfo.packetSize <= data.length; packetStart += packetInfo.packetSize) {\n    const tsStart = packetStart + packetInfo.tsPayloadOffset;\n    if (data[tsStart] !== 71) {\n      continue;\n    }\n    const secondByte = data[tsStart + 1];\n    const thirdByte = data[tsStart + 2];\n    const fourthByte = data[tsStart + 3];\n    if (secondByte == null || thirdByte == null || fourthByte == null || (secondByte & 128) !== 0) {\n      continue;\n    }\n    const payloadUnitStart = (secondByte & 64) !== 0;\n    const pid = (secondByte & 31) << 8 | thirdByte;\n    const adaptationFieldControl = fourthByte >> 4 & 3;\n    const hasPayload = adaptationFieldControl === 1 || adaptationFieldControl === 3;\n    if (!hasPayload) {\n      continue;\n    }\n    let payloadStart = tsStart + 4;\n    if (adaptationFieldControl === 3) {\n      const adaptationLength = data[payloadStart];\n      if (adaptationLength == null) {\n        continue;\n      }\n      payloadStart += 1 + adaptationLength;\n    }\n    const payloadEnd = Math.min(tsStart + 188, data.length);\n    if (payloadStart >= payloadEnd || payloadStart >= data.length) {\n      continue;\n    }\n    const payload = data.subarray(payloadStart, payloadEnd);\n    if (pid === 0) {\n      parsePatSection(payload, payloadUnitStart, pmtPids);\n    } else if (pmtPids.has(pid)) {\n      parsePmtSection(payload, payloadUnitStart, tsScte35Pids);\n    } else if (tsScte35Pids.has(pid)) {\n      collectScte35SectionsFromPayload(\n        pid,\n        payload,\n        payloadUnitStart,\n        sectionAssemblers,\n        markers,\n        processedSections\n      );\n    }\n  }\n  return markers;\n}\nvar BitReader = class {\n  constructor(buf) {\n    this.buf = buf;\n    this.bytePos = 0;\n    this.bitPos = 0;\n  }\n  readBits(numBits) {\n    let result = 0;\n    while (numBits > 0) {\n      if (this.bytePos >= this.buf.length) return result;\n      const remainingInByte = 8 - this.bitPos;\n      const toRead = Math.min(numBits, remainingInByte);\n      const currentByte = this.buf[this.bytePos];\n      const shift = remainingInByte - toRead;\n      const mask = (1 << toRead) - 1 & 255;\n      const bits = currentByte >> shift & mask;\n      result = result << toRead | bits;\n      this.bitPos += toRead;\n      if (this.bitPos >= 8) {\n        this.bitPos = 0;\n        this.bytePos += 1;\n      }\n      numBits -= toRead;\n    }\n    return result >>> 0;\n  }\n  skipBits(n) {\n    this.readBits(n);\n  }\n  get bytePosition() {\n    return this.bitPos === 0 ? this.bytePos : this.bytePos + 1;\n  }\n};\nfunction readSpliceTime(r, ptsAdjustmentTicks) {\n  const timeSpecifiedFlag = r.readBits(1) === 1;\n  if (!timeSpecifiedFlag) {\n    r.readBits(7);\n    return void 0;\n  }\n  r.readBits(6);\n  const high = r.readBits(1);\n  const low = r.readBits(32);\n  const ptsTicks = (high * 4294967296 + low + ptsAdjustmentTicks) % 8589934592;\n  return ptsTicks / 9e4;\n}\nfunction markerTypeFromSegmentationTypeId(segmentationTypeId) {\n  switch (segmentationTypeId) {\n    case 16:\n    case 34:\n    case 48:\n    case 50:\n    case 52:\n    case 54:\n      return \"start\";\n    case 17:\n    case 35:\n    case 49:\n    case 51:\n    case 53:\n    case 55:\n      return \"end\";\n    default:\n      return void 0;\n  }\n}\nfunction parseScte35SegmentationDescriptor(descriptor) {\n  if (descriptor.length < 11) {\n    return void 0;\n  }\n  const identifier = String.fromCharCode(\n    descriptor[0] ?? 0,\n    descriptor[1] ?? 0,\n    descriptor[2] ?? 0,\n    descriptor[3] ?? 0\n  );\n  if (identifier !== \"CUEI\") {\n    return void 0;\n  }\n  const segmentationEventId = (descriptor[4] ?? 0) * 16777216 + ((descriptor[5] ?? 0) << 16) + ((descriptor[6] ?? 0) << 8) + (descriptor[7] ?? 0);\n  const cancelIndicator = ((descriptor[8] ?? 0) & 128) !== 0;\n  if (cancelIndicator) {\n    return void 0;\n  }\n  const flags = descriptor[9] ?? 0;\n  const programSegmentationFlag = (flags & 128) !== 0;\n  const segmentationDurationFlag = (flags & 64) !== 0;\n  let offset = 10;\n  if (!programSegmentationFlag) {\n    const componentCount = descriptor[offset] ?? 0;\n    offset += 1 + componentCount * 6;\n    if (offset > descriptor.length) {\n      return void 0;\n    }\n  }\n  let durationSeconds = void 0;\n  if (segmentationDurationFlag) {\n    if (offset + 5 > descriptor.length) {\n      return void 0;\n    }\n    const durationTicks = (descriptor[offset] ?? 0) * 4294967296 + (descriptor[offset + 1] ?? 0) * 16777216 + ((descriptor[offset + 2] ?? 0) << 16) + ((descriptor[offset + 3] ?? 0) << 8) + (descriptor[offset + 4] ?? 0);\n    durationSeconds = durationTicks / 9e4;\n    offset += 5;\n  }\n  if (offset + 2 > descriptor.length) {\n    return void 0;\n  }\n  offset += 1;\n  const segmentationUpidLength = descriptor[offset] ?? 0;\n  offset += 1 + segmentationUpidLength;\n  if (offset >= descriptor.length) {\n    return void 0;\n  }\n  const segmentationTypeId = descriptor[offset] ?? 0;\n  const markerType = markerTypeFromSegmentationTypeId(segmentationTypeId);\n  if (!markerType) {\n    return void 0;\n  }\n  return {\n    type: markerType,\n    ...durationSeconds !== void 0 ? { durationSeconds } : {},\n    segmentationEventId\n  };\n}\nfunction parseScte35SegmentationDescriptors(data, offset) {\n  if (offset + 2 > data.length) {\n    return void 0;\n  }\n  const descriptorLoopLength = (data[offset] ?? 0) << 8 | (data[offset + 1] ?? 0);\n  let descriptorOffset = offset + 2;\n  const descriptorEnd = Math.min(\n    data.length,\n    descriptorOffset + descriptorLoopLength\n  );\n  while (descriptorOffset + 2 <= descriptorEnd) {\n    const descriptorTag = data[descriptorOffset] ?? 0;\n    const descriptorLength = data[descriptorOffset + 1] ?? 0;\n    const descriptorDataStart = descriptorOffset + 2;\n    const descriptorDataEnd = descriptorDataStart + descriptorLength;\n    if (descriptorDataEnd > descriptorEnd) {\n      return void 0;\n    }\n    if (descriptorTag === 2) {\n      const descriptorMarker = parseScte35SegmentationDescriptor(\n        data.subarray(descriptorDataStart, descriptorDataEnd)\n      );\n      if (descriptorMarker) {\n        return descriptorMarker;\n      }\n    }\n    descriptorOffset = descriptorDataEnd;\n  }\n  return void 0;\n}\nfunction parseScte35Binary(data) {\n  const r = new BitReader(data);\n  const tableId = r.readBits(8);\n  if (tableId !== 252) return void 0;\n  r.readBits(1);\n  r.readBits(1);\n  r.readBits(2);\n  const sectionLength = r.readBits(12);\n  if (sectionLength <= 0 || data.length < 3 + sectionLength) {\n    return void 0;\n  }\n  r.readBits(8);\n  r.readBits(1);\n  r.readBits(6);\n  const ptsAdjHigh = r.readBits(1);\n  const ptsAdjLow = r.readBits(32);\n  const ptsAdjustmentTicks = ptsAdjHigh * 4294967296 + ptsAdjLow;\n  r.readBits(8);\n  r.readBits(12);\n  const spliceCommandLength = r.readBits(12);\n  const spliceCommandType = r.readBits(8);\n  let markerType;\n  let durationSeconds = void 0;\n  let ptsSeconds = void 0;\n  let spliceEventId = void 0;\n  const commandBodyStart = r.bytePosition;\n  if (spliceCommandType === 5) {\n    spliceEventId = r.readBits(32);\n    const cancel = r.readBits(1) === 1;\n    r.readBits(7);\n    if (cancel) return void 0;\n    const outOfNetwork = r.readBits(1) === 1;\n    const programSpliceFlag = r.readBits(1) === 1;\n    const durationFlag = r.readBits(1) === 1;\n    const spliceImmediateFlag = r.readBits(1) === 1;\n    r.readBits(4);\n    markerType = outOfNetwork ? \"start\" : \"end\";\n    if (programSpliceFlag && !spliceImmediateFlag) {\n      ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n    } else if (!programSpliceFlag) {\n      const componentCount = r.readBits(8);\n      for (let i = 0; i < componentCount; i++) {\n        r.readBits(8);\n        if (!spliceImmediateFlag) {\n          const componentPtsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n          if (ptsSeconds === void 0) {\n            ptsSeconds = componentPtsSeconds;\n          }\n        }\n      }\n    }\n    if (durationFlag) {\n      r.readBits(6);\n      r.readBits(1);\n      const high = r.readBits(1);\n      const low = r.readBits(32);\n      const durationTicks = high * 4294967296 + low;\n      durationSeconds = durationTicks / 9e4;\n    }\n    r.readBits(16);\n    r.readBits(8);\n    r.readBits(8);\n  } else if (spliceCommandType === 6) {\n    ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n  } else {\n    return void 0;\n  }\n  const expectedDescriptorOffset = spliceCommandLength === 4095 ? r.bytePosition : commandBodyStart + spliceCommandLength;\n  const descriptorMarker = parseScte35SegmentationDescriptors(\n    data,\n    expectedDescriptorOffset\n  );\n  if (descriptorMarker) {\n    markerType = descriptorMarker.type;\n    if (durationSeconds === void 0) {\n      durationSeconds = descriptorMarker.durationSeconds;\n    }\n  }\n  if (!markerType) {\n    return void 0;\n  }\n  const marker = {\n    type: markerType,\n    ...ptsSeconds !== void 0 ? { ptsSeconds } : {},\n    ...durationSeconds !== void 0 ? { durationSeconds } : {},\n    raw: {\n      splice_command_type: spliceCommandType,\n      ...spliceEventId !== void 0 ? { splice_event_id: spliceEventId } : {},\n      ...descriptorMarker?.segmentationEventId !== void 0 ? { segmentation_event_id: descriptorMarker.segmentationEventId } : {}\n    }\n  };\n  return marker;\n}\n\n// src/player/Scte35CueManager.ts\nvar Scte35CueManager = class {\n  constructor(debug, callbacks) {\n    this.pendingScte35Cues = /* @__PURE__ */ new Map();\n    this.recentScte35CueKeys = /* @__PURE__ */ new Map();\n    this.recentScte35CueLimit = 200;\n    this.tsScte35Pids = /* @__PURE__ */ new Set();\n    this.pmtPids = /* @__PURE__ */ new Set();\n    this.processedTsScte35Sections = /* @__PURE__ */ new Set();\n    this.debug = debug;\n    this.callbacks = callbacks;\n  }\n  get pendingScte35CueKey() {\n    return this.pendingScte35CueKeyValue;\n  }\n  set pendingScte35CueKey(value) {\n    this.pendingScte35CueKeyValue = value;\n  }\n  get activeScte35BreakKey() {\n    return this.activeScte35BreakKeyValue;\n  }\n  set activeScte35BreakKey(value) {\n    this.activeScte35BreakKeyValue = value;\n  }\n  get scheduledScte35BreakKey() {\n    return this.scheduledScte35BreakKeyValue;\n  }\n  set scheduledScte35BreakKey(value) {\n    this.scheduledScte35BreakKeyValue = value;\n  }\n  createScte35CueContext(source, readiness, frag) {\n    const context = { source, readiness };\n    if (typeof frag?.sn === \"number\") {\n      context.fragmentSn = frag.sn;\n    }\n    const fragmentStartSec = getFragmentStartSeconds(frag);\n    if (fragmentStartSec !== void 0) {\n      context.fragmentStartSeconds = fragmentStartSec;\n    }\n    return context;\n  }\n  onScte35Cue(marker, context) {\n    const cue = this.createScte35Cue(marker, context);\n    const pendingKey = this.getPendingScte35CueKey(cue);\n    if (context.readiness === \"early\") {\n      this.pendingScte35Cues.set(pendingKey, cue);\n      this.trimRecentScte35CueMaps();\n      if (marker.type === \"start\") {\n        this.callbacks.onEarlyStartCue(marker, context.fragmentSn, cue.key);\n      }\n      return;\n    }\n    if (marker.type === \"end\" && !this.shouldAcceptScte35EndCue(cue)) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ignoring SCTE-35 end cue\", {\n          key: cue.key,\n          activeScte35BreakKey: this.activeScte35BreakKeyValue,\n          inAdBreak: this.callbacks.isInAdBreak(),\n          source: cue.source\n        });\n      }\n      return;\n    }\n    if (marker.type === \"start\" && this.hasRecentlyHandledScte35Cue(cue)) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ignoring duplicate SCTE-35 start cue\", {\n          key: cue.key,\n          source: cue.source\n        });\n      }\n      return;\n    }\n    this.pendingScte35Cues.delete(pendingKey);\n    this.markScte35CueHandled(cue);\n    this.callbacks.onPlaybackCue(marker, cue.key);\n  }\n  activatePendingScte35CuesForFragment(frag) {\n    const fragmentSn = typeof frag?.sn === \"number\" ? frag.sn : void 0;\n    if (fragmentSn === void 0) {\n      return;\n    }\n    const matchingCues = Array.from(this.pendingScte35Cues.entries()).filter(\n      ([, cue]) => cue.fragmentSn === fragmentSn\n    );\n    matchingCues.forEach(([pendingKey, cue]) => {\n      this.pendingScte35Cues.delete(pendingKey);\n      const context = {\n        source: cue.source,\n        readiness: \"playback\"\n      };\n      context.fragmentSn = fragmentSn;\n      const fragmentStartSec = cue.fragmentStartSeconds ?? getFragmentStartSeconds(frag);\n      if (fragmentStartSec !== void 0) {\n        context.fragmentStartSeconds = fragmentStartSec;\n      }\n      this.onScte35Cue(cue.marker, context);\n    });\n  }\n  createScte35Cue(marker, context) {\n    const cue = {\n      marker,\n      source: context.source,\n      readiness: context.readiness,\n      key: this.getScte35CueKey(marker, context)\n    };\n    if (context.fragmentSn !== void 0) {\n      cue.fragmentSn = context.fragmentSn;\n    }\n    if (context.fragmentStartSeconds !== void 0) {\n      cue.fragmentStartSeconds = context.fragmentStartSeconds;\n    }\n    return cue;\n  }\n  getScte35CueKey(marker, context) {\n    const raw = this.getScte35MarkerRaw(marker);\n    const spliceEventId = this.toIdentityString(raw?.splice_event_id);\n    if (spliceEventId) {\n      return `splice:${spliceEventId}`;\n    }\n    const segmentationEventId = this.toIdentityString(raw?.segmentation_event_id);\n    if (segmentationEventId) {\n      return `segmentation:${segmentationEventId}`;\n    }\n    const daterangeId = this.toIdentityString(raw?.attrs?.ID);\n    if (daterangeId) {\n      return `daterange:${daterangeId}`;\n    }\n    const scteValue = this.toIdentityString(raw?.attrs?.[\"SCTE35-OUT\"]) || this.toIdentityString(raw?.attrs?.[\"SCTE35-IN\"]);\n    if (scteValue) {\n      return `daterange-scte:${scteValue}`;\n    }\n    if (typeof marker.ptsSeconds === \"number\" && Number.isFinite(marker.ptsSeconds)) {\n      return `pts:${Math.round(marker.ptsSeconds * 2) / 2}`;\n    }\n    if (context.fragmentSn !== void 0) {\n      return `fragment:${context.fragmentSn}`;\n    }\n    return `${context.source}:wallclock:${Math.floor(Date.now() / 1e3)}`;\n  }\n  getPendingScte35CueKey(cue) {\n    return `${cue.marker.type}:${cue.key}:${cue.fragmentSn !== void 0 ? cue.fragmentSn : \"unknown\"}`;\n  }\n  getScte35MarkerRaw(marker) {\n    return typeof marker.raw === \"object\" && marker.raw !== null ? marker.raw : {};\n  }\n  toIdentityString(value) {\n    if (typeof value === \"number\" && Number.isFinite(value)) {\n      return String(value);\n    }\n    if (typeof value === \"string\" && value.trim().length > 0) {\n      return value.trim();\n    }\n    return void 0;\n  }\n  isStrongScte35CueKey(key) {\n    return !!(key && (key.startsWith(\"splice:\") || key.startsWith(\"segmentation:\") || key.startsWith(\"daterange:\") || key.startsWith(\"daterange-scte:\")));\n  }\n  hasRecentlyHandledScte35Cue(cue) {\n    if (this.activeScte35BreakKeyValue === cue.key || this.scheduledScte35BreakKeyValue === cue.key) {\n      return true;\n    }\n    const recentKey = `${cue.marker.type}:${cue.key}`;\n    return this.recentScte35CueKeys.has(recentKey);\n  }\n  markScte35CueHandled(cue) {\n    this.recentScte35CueKeys.set(`${cue.marker.type}:${cue.key}`, Date.now());\n    this.trimRecentScte35CueMaps();\n  }\n  trimRecentScte35CueMaps() {\n    while (this.recentScte35CueKeys.size > this.recentScte35CueLimit) {\n      const firstKey = this.recentScte35CueKeys.keys().next().value;\n      if (!firstKey) {\n        break;\n      }\n      this.recentScte35CueKeys.delete(firstKey);\n    }\n    while (this.pendingScte35Cues.size > this.recentScte35CueLimit) {\n      const firstKey = this.pendingScte35Cues.keys().next().value;\n      if (!firstKey) {\n        break;\n      }\n      this.pendingScte35Cues.delete(firstKey);\n    }\n  }\n  shouldAcceptScte35EndCue(cue) {\n    if (!this.callbacks.isInAdBreak()) {\n      return false;\n    }\n    if (this.isStrongScte35CueKey(this.activeScte35BreakKeyValue) && this.isStrongScte35CueKey(cue.key) && this.activeScte35BreakKeyValue !== cue.key) {\n      return false;\n    }\n    return true;\n  }\n};\n\n// src/player/AdConfigManager.ts\nvar AdConfigManager = class {\n  constructor(config, video) {\n    this.vmapBreaks = [];\n    this.consumedVmapBreakIds = /* @__PURE__ */ new Set();\n    this.streamCorrelator = generateCorrelator();\n    this.consentSignals = {};\n    this.podCounter = 0;\n    this.podAssignedByPrefetch = false;\n    this.adRequestPositionInBreak = 0;\n    this.lastHeartbeatTime = 0;\n    this.config = config;\n    this.video = video;\n  }\n  get debug() {\n    return !!this.config.debugAdTiming;\n  }\n  isVmapEnabled() {\n    return !!(this.config.isVmap && this.config.vmapUrl?.trim());\n  }\n  async fetchAdConfiguration() {\n    if (this.isVmapEnabled()) {\n      await this.fetchAndParseVmap(this.config.vmapUrl);\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] VMAP mode enabled\");\n      }\n      return;\n    }\n    const vastMode = this.config.vastMode || \"default\";\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] VAST mode:\", vastMode);\n    }\n    if (vastMode === \"adstorm\") {\n      if (!this.config.licenseKey) {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] AdStorm mode requires a license key\"\n          );\n        }\n        return;\n      }\n      const vastEndpoint = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${this.config.licenseKey}`;\n      this.apiVastTagUrl = vastEndpoint;\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Using AdStorm VAST endpoint (adstorm mode):\",\n          vastEndpoint\n        );\n      }\n      return;\n    }\n    if (this.config.vastTagUrl) {\n      this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Using custom VAST tag URL:\",\n          this.apiVastTagUrl\n        );\n      }\n      return;\n    }\n    const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n    if (this.debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] Fetching ad configuration from:\",\n        apiUrl\n      );\n    }\n    const headers = {};\n    if (this.config.licenseKey) {\n      headers[\"Authorization\"] = `Bearer ${this.config.licenseKey}`;\n    }\n    const response = await fetch(apiUrl, { headers });\n    if (!response.ok) {\n      if (this.debug) {\n        console.warn(\n          `[StormcloudVideoPlayer] Failed to fetch ad configuration: ${response.status}`\n        );\n      }\n      return;\n    }\n    const data = await response.json();\n    const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n    if (imaPayload) {\n      let decodedPayload = imaPayload;\n      try {\n        decodedPayload = decodeURIComponent(imaPayload);\n      } catch {\n        console.warn(\"[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:\", imaPayload);\n      }\n      console.log(\"[StormcloudVideoPlayer] Raw VAST tag URL (from API):\", decodedPayload);\n      this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Normalized VAST tag URL:\",\n          this.apiVastTagUrl\n        );\n      }\n    } else {\n      if (this.debug) {\n        console.warn(\n          \"[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response\"\n        );\n      }\n    }\n    const numberAds = data.response?.options?.vast?.cue_tones?.number_ads;\n    if (numberAds != null && numberAds > 0) {\n      this.apiNumberAds = numberAds;\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Number of ads per break from API:\",\n          this.apiNumberAds\n        );\n      }\n    }\n  }\n  async fetchAndParseVmap(vmapUrl) {\n    if (!vmapUrl.trim()) {\n      return;\n    }\n    try {\n      const response = await fetch(vmapUrl);\n      if (!response.ok) {\n        throw new Error(`Failed to fetch VMAP (${response.status})`);\n      }\n      const vmapXml = await response.text();\n      this.vmapBreaks = this.parseVmapToBreaks(vmapXml);\n      this.consumedVmapBreakIds.clear();\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] Loaded ${this.vmapBreaks.length} VMAP ad break(s) from:`,\n          vmapUrl\n        );\n      }\n    } catch (error) {\n      this.vmapBreaks = [];\n      this.consumedVmapBreakIds.clear();\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Failed to load VMAP:\", error);\n      }\n    }\n  }\n  parseVmapToBreaks(vmapXml) {\n    if (typeof DOMParser === \"undefined\") {\n      return [];\n    }\n    const doc = new DOMParser().parseFromString(vmapXml, \"application/xml\");\n    if (doc.querySelector(\"parsererror\")) {\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Invalid VMAP XML received\");\n      }\n      return [];\n    }\n    const VMAP_NS = \"http://www.iab.net/videosuite/vmap\";\n    let adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, \"AdBreak\"));\n    if (adBreakNodes.length === 0) {\n      adBreakNodes = Array.from(\n        doc.querySelectorAll(\"AdBreak, vmap\\\\:AdBreak\")\n      );\n    }\n    if (adBreakNodes.length === 0) {\n      adBreakNodes = Array.from(doc.getElementsByTagName(\"*\")).filter(\n        (el) => el.localName === \"AdBreak\"\n      );\n    }\n    const parsed = [];\n    adBreakNodes.forEach((node, index) => {\n      const timeOffsetRaw = (node.getAttribute(\"timeOffset\") || \"\").trim();\n      const startTimeMs = this.parseVmapTimeOffsetToMs(timeOffsetRaw);\n      if (startTimeMs == null) {\n        return;\n      }\n      let adTagNode = node.getElementsByTagNameNS(VMAP_NS, \"AdTagURI\")[0];\n      if (!adTagNode) {\n        adTagNode = node.querySelector(\"AdTagURI, vmap\\\\:AdTagURI\") ?? void 0;\n      }\n      const adTagUrl = (adTagNode?.textContent || \"\").trim();\n      if (!adTagUrl) {\n        return;\n      }\n      const breakId = node.getAttribute(\"breakId\") || `vmap-break-${index}-${timeOffsetRaw || \"unknown\"}`;\n      parsed.push({\n        id: breakId,\n        startTimeMs,\n        vastTagUrl: adTagUrl\n      });\n    });\n    parsed.sort((a, b) => {\n      const aStart = a.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : a.startTimeMs;\n      const bStart = b.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : b.startTimeMs;\n      return aStart - bStart;\n    });\n    return parsed;\n  }\n  parseVmapTimeOffsetToMs(timeOffset) {\n    if (!timeOffset) {\n      return void 0;\n    }\n    const normalized = timeOffset.trim().toLowerCase();\n    if (normalized === \"start\") {\n      return 0;\n    }\n    if (normalized === \"end\") {\n      return -1;\n    }\n    const hms = timeOffset.match(\n      /^(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?$/\n    );\n    if (hms) {\n      const [, hh, mm, ss, ms = \"0\"] = hms;\n      const hours = Number(hh);\n      const minutes = Number(mm);\n      const seconds = Number(ss);\n      const millis = Number(ms.padEnd(3, \"0\").slice(0, 3));\n      return (hours * 3600 + minutes * 60 + seconds) * 1e3 + millis;\n    }\n    const percent = timeOffset.match(/^(\\d+(?:\\.\\d+)?)%$/);\n    if (percent) {\n      const ratio = Number(percent[1]) / 100;\n      const durationSec = this.video.duration;\n      if (Number.isFinite(durationSec) && durationSec > 0) {\n        return Math.floor(durationSec * 1e3 * ratio);\n      }\n      return void 0;\n    }\n    return void 0;\n  }\n  getAdBreakKey(adBreak) {\n    if (adBreak.id) {\n      return adBreak.id;\n    }\n    return `${adBreak.startTimeMs}-${adBreak.vastTagUrl || \"\"}`;\n  }\n  resolveBreakStartMs(adBreak) {\n    if (adBreak.startTimeMs >= 0) {\n      return adBreak.startTimeMs;\n    }\n    if (adBreak.startTimeMs === -1) {\n      const durationSec = this.video.duration;\n      if (Number.isFinite(durationSec) && durationSec > 0) {\n        return Math.floor(durationSec * 1e3);\n      }\n    }\n    return void 0;\n  }\n  findCurrentOrNextBreak(nowMs) {\n    const schedule = this.vmapBreaks;\n    let candidate;\n    const tol = this.config.driftToleranceMs ?? 1e3;\n    for (const b of schedule) {\n      if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n        continue;\n      }\n      const breakStartMs = this.resolveBreakStartMs(b);\n      if (breakStartMs == null) {\n        continue;\n      }\n      if (breakStartMs <= nowMs + tol && (candidate == null || breakStartMs > (this.resolveBreakStartMs(candidate) ?? 0))) {\n        candidate = b;\n      }\n    }\n    return candidate;\n  }\n  findBreakForTime(nowMs) {\n    const schedule = this.vmapBreaks;\n    for (const b of schedule) {\n      if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n        continue;\n      }\n      const breakStartMs = this.resolveBreakStartMs(b);\n      if (breakStartMs == null) {\n        continue;\n      }\n      if (b.durationMs) {\n        const end = breakStartMs + b.durationMs;\n        if (nowMs >= breakStartMs && nowMs < end) {\n          return b;\n        }\n        continue;\n      }\n      if (nowMs >= breakStartMs) {\n        return b;\n      }\n    }\n    return void 0;\n  }\n  selectVastTagsForBreak(b) {\n    if (!b || !b.vastTagUrl) return void 0;\n    if (b.vastTagUrl.includes(\",\")) {\n      return b.vastTagUrl.split(\",\").map((s) => s.trim()).filter((s) => s.length > 0);\n    }\n    return [b.vastTagUrl];\n  }\n  beginNewAdPod() {\n    this.podCounter++;\n    this.adRequestPositionInBreak = 0;\n  }\n  generateVastUrlsWithCorrelators(baseUrl, count, adPlayer, palNonce, inAdBreak) {\n    const urls = [];\n    for (let i = 0; i < count; i++) {\n      this.adRequestPositionInBreak++;\n      const adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;\n      const envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);\n      const urlWithMacros = applyVastMacros(baseUrl, {\n        correlator: generateCorrelator(),\n        streamCorrelator: this.streamCorrelator,\n        pod: this.podCounter > 0 ? this.podCounter : void 0,\n        adPosition: this.adRequestPositionInBreak,\n        isCtv: envSignals.isCtv,\n        contentUrl: envSignals.contentUrl,\n        pageUrl: !envSignals.isCtv && typeof window !== \"undefined\" ? window.location.href : void 0,\n        adWillPlayMuted,\n        adWillAutoPlay: !!this.config.autoplay,\n        appId: envSignals.appId,\n        appName: envSignals.appName,\n        sessionId: envSignals.sessionId,\n        deviceId: envSignals.deviceId,\n        deviceIdType: envSignals.deviceIdType,\n        limitAdTracking: envSignals.limitAdTracking,\n        deviceTypeHint: envSignals.deviceTypeHint,\n        adTest: this.config.adTest,\n        consent: this.consentSignals\n      });\n      const finalUrl = palNonce.injectNonce(urlWithMacros);\n      console.log(\n        `[StormcloudVideoPlayer] Resolved ad request URL (pod=${this.podCounter}, pos=${this.adRequestPositionInBreak}):`,\n        finalUrl\n      );\n      urls.push(finalUrl);\n    }\n    return urls;\n  }\n  // --- Tracking ---\n  initializeTracking() {\n    sendInitialTracking(this.config.licenseKey).then(() => {\n      this.heartbeatInterval = window.setInterval(() => {\n        this.sendHeartbeatIfNeeded();\n      }, 5e3);\n    }).catch((error) => {\n      if (this.debug) {\n        console.warn(\n          \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n          error\n        );\n      }\n      this.heartbeatInterval = window.setInterval(() => {\n        this.sendHeartbeatIfNeeded();\n      }, 5e3);\n    });\n  }\n  sendHeartbeatIfNeeded() {\n    const now = Date.now();\n    if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 3e4) {\n      this.lastHeartbeatTime = now;\n      sendHeartbeat(this.config.licenseKey).catch((error) => {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n            error\n          );\n        }\n      });\n    }\n  }\n  destroyTracking() {\n    if (this.heartbeatInterval) {\n      clearInterval(this.heartbeatInterval);\n      this.heartbeatInterval = void 0;\n    }\n  }\n};\n\n// src/player/AdTimingService.ts\nvar AdTimingService = class {\n  constructor(config, video, callbacks) {\n    this.adRequestWatchdogToken = null;\n    this.adFailsafeToken = null;\n    this.ptsDriftEmaMs = 0;\n    this.adBreakPlayedDurationMs = 0;\n    this.adBreakEpoch = 0;\n    this.adRequestTokenCounter = 0;\n    this.activeAdRequestToken = null;\n    this.currentAdIndex = 0;\n    this.totalAdsInBreak = 0;\n    this.totalAdRequestsInBreak = 0;\n    this.maxTotalAdRequestsPerBreak = 10;\n    this.lastAdRequestTime = 0;\n    this.consecutiveFailures = 0;\n    this.maxConsecutiveFailures = 5;\n    this.minAdRequestIntervalMs = 3e3;\n    this.backoffBaseMs = 1e3;\n    this.maxBackoffMs = 15e3;\n    this.defaultMinRemainingMsToStartAd = 4e3;\n    this.failedVastUrls = /* @__PURE__ */ new Set();\n    this.temporaryFailureUrls = /* @__PURE__ */ new Map();\n    this.temporaryFailureCooldownMs = 3e4;\n    this.globalConsecutiveNoFills = 0;\n    this.globalNoFillThreshold = 3;\n    this.globalNoFillCooldownUntil = 0;\n    this.globalNoFillBackoffBaseMs = 5e3;\n    this.globalNoFillBackoffMaxMs = 6e4;\n    this.globalLastGamRequestTime = 0;\n    this.globalMinGamIntervalMs = 3e3;\n    this.config = config;\n    this.video = video;\n    this.callbacks = callbacks;\n  }\n  get debug() {\n    return !!this.config.debugAdTiming;\n  }\n  // --- Ad stop timer ---\n  scheduleAdStopCountdown(remainingMs) {\n    this.clearAdStopTimer();\n    const ms = Math.max(0, Math.floor(remainingMs));\n    if (ms === 0) {\n      this.ensureAdStoppedByTimer();\n      return;\n    }\n    this.adStopTimerId = window.setTimeout(() => {\n      this.ensureAdStoppedByTimer();\n    }, ms);\n  }\n  clearAdStopTimer() {\n    if (this.adStopTimerId != null) {\n      clearTimeout(this.adStopTimerId);\n      this.adStopTimerId = void 0;\n    }\n  }\n  ensureAdStoppedByTimer() {\n    this.adStopTimerId = void 0;\n    this.callbacks.onAdStopTimerFired();\n  }\n  // --- Ad start timer ---\n  scheduleAdStartIn(delayMs, marker = { type: \"start\" }, cueKey) {\n    this.clearAdStartTimer();\n    const ms = Math.max(0, Math.floor(delayMs));\n    if (ms === 0) {\n      this.callbacks.onAdStartTimerFired(marker, cueKey);\n      return;\n    }\n    this.adStartTimerId = window.setTimeout(() => {\n      this.callbacks.onAdStartTimerFired(marker, cueKey);\n    }, ms);\n  }\n  clearAdStartTimer() {\n    if (this.adStartTimerId != null) {\n      clearTimeout(this.adStartTimerId);\n      this.adStartTimerId = void 0;\n    }\n  }\n  // --- PTS drift ---\n  updatePtsDrift(ptsSecondsSample) {\n    const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1e3;\n    if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 6e4) return;\n    const alpha = 0.1;\n    this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n  }\n  resolveScteBreakStartWallClockMs(marker) {\n    const nowWallClockMs = Date.now();\n    if (typeof marker.ptsSeconds !== \"number\") {\n      return nowWallClockMs;\n    }\n    const nowMs = this.video.currentTime * 1e3;\n    const estimatedCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n    const deltaMs = marker.ptsSeconds * 1e3 - estimatedCurrentPtsMs;\n    if (!Number.isFinite(deltaMs)) {\n      return nowWallClockMs;\n    }\n    return nowWallClockMs + Math.floor(deltaMs);\n  }\n  // --- Duration boundary ---\n  setAdBreakDurationBoundary(durationMs) {\n    this.expectedAdBreakDurationMs = durationMs;\n    if (durationMs != null && this.currentAdBreakStartWallClockMs != null) {\n      this.scteAdBreakEndWallClockMs = this.currentAdBreakStartWallClockMs + durationMs;\n    } else {\n      this.scteAdBreakEndWallClockMs = void 0;\n    }\n  }\n  scheduleAdStopAtBreakBoundary() {\n    if (this.expectedAdBreakDurationMs == null) {\n      return;\n    }\n    this.scheduleAdStopCountdown(this.getWallClockRemainingAdMs());\n  }\n  // --- Duration budget ---\n  getWallClockRemainingAdMs() {\n    const endWallClockMs = this.getAdBreakEndWallClockMs();\n    if (endWallClockMs != null) {\n      return Math.max(0, endWallClockMs - Date.now());\n    }\n    return 0;\n  }\n  getAdBreakEndWallClockMs() {\n    if (this.scteAdBreakEndWallClockMs != null) {\n      return this.scteAdBreakEndWallClockMs;\n    }\n    if (this.expectedAdBreakDurationMs == null || this.currentAdBreakStartWallClockMs == null) {\n      return void 0;\n    }\n    return this.currentAdBreakStartWallClockMs + this.expectedAdBreakDurationMs;\n  }\n  getDurationBudgetRemainingMs() {\n    if (this.expectedAdBreakDurationMs == null) {\n      return 0;\n    }\n    return Math.max(0, this.expectedAdBreakDurationMs - this.adBreakPlayedDurationMs);\n  }\n  getLoadedAdDurationMs(adController) {\n    const durationSec = adController.getLoadedAdDuration?.();\n    if (durationSec == null || durationSec <= 0) {\n      return 0;\n    }\n    return Math.round(durationSec * 1e3);\n  }\n  adFitsRemainingBudget(durationMs) {\n    if (durationMs <= 0) {\n      return true;\n    }\n    return durationMs <= this.getDurationBudgetRemainingMs();\n  }\n  logAdDurationDecision(accepted, durationMs, adController) {\n    if (!this.debug) {\n      return;\n    }\n    const remainingBudget = this.getDurationBudgetRemainingMs();\n    const adId = adController.getLoadedAdId?.() ?? \"unknown\";\n    if (accepted) {\n      console.log(\n        `[AD-DURATION] Accepted ad id=${adId}, duration=${durationMs}ms, budget remaining after play=${Math.max(0, remainingBudget - durationMs)}ms`\n      );\n    } else {\n      console.log(\n        `[AD-DURATION] Rejected ad id=${adId}, duration=${durationMs}ms exceeds remaining budget=${remainingBudget}ms \\u2014 requesting another ad`\n      );\n    }\n  }\n  recordPlayedAdDuration(adController) {\n    const durationMs = this.getLoadedAdDurationMs(adController);\n    if (durationMs <= 0) {\n      return;\n    }\n    this.adBreakPlayedDurationMs += durationMs;\n    if (this.debug) {\n      console.log(\n        `[AD-DURATION] Played ${durationMs}ms \\u2014 total played=${this.adBreakPlayedDurationMs}ms / ${this.expectedAdBreakDurationMs ?? \"?\"}ms`\n      );\n    }\n  }\n  ensureLoadedAdFitsBudget(adController) {\n    const durationMs = this.getLoadedAdDurationMs(adController);\n    const fits = this.adFitsRemainingBudget(durationMs);\n    this.logAdDurationDecision(fits, durationMs, adController);\n    return fits;\n  }\n  rejectLoadedAdForDuration(adController) {\n    try {\n      adController.destroy();\n    } catch {\n    }\n  }\n  markAdStarted() {\n    this.currentAdIndex++;\n    this.totalAdsInBreak = this.currentAdIndex;\n    this.totalAdRequestsInBreak++;\n    this.lastAdRequestTime = Date.now();\n  }\n  getRemainingAdMs() {\n    const wallClockRemaining = this.getWallClockRemainingAdMs();\n    const budgetRemaining = this.getDurationBudgetRemainingMs();\n    if (this.expectedAdBreakDurationMs == null) {\n      return wallClockRemaining;\n    }\n    return Math.min(wallClockRemaining, budgetRemaining);\n  }\n  getMinRemainingMsToStartAd() {\n    const configured = this.config.minRemainingMsToStartAd;\n    if (typeof configured === \"number\" && configured >= 0) {\n      return configured;\n    }\n    return this.defaultMinRemainingMsToStartAd;\n  }\n  hasTimeToStartAnotherAd() {\n    const minRemaining = this.getMinRemainingMsToStartAd();\n    return this.getWallClockRemainingAdMs() > minRemaining && this.getDurationBudgetRemainingMs() > minRemaining;\n  }\n  // --- Circuit breaker ---\n  isTemporaryAdError(error) {\n    const message = error?.message?.toLowerCase() || \"\";\n    if (message.includes(\"no ads available\") || message.includes(\"no fill\") || message.includes(\"nofill\")) {\n      return true;\n    }\n    if (message.includes(\"timeout\")) {\n      return true;\n    }\n    if (message.includes(\"rate limit\") || message.includes(\"too many requests\")) {\n      return true;\n    }\n    if (message.includes(\"ad playback error\")) {\n      return true;\n    }\n    return false;\n  }\n  isUrlInCooldown(vastTagUrl) {\n    const failureTime = this.temporaryFailureUrls.get(vastTagUrl);\n    if (failureTime == null) {\n      return false;\n    }\n    const elapsed = Date.now() - failureTime;\n    if (elapsed >= this.temporaryFailureCooldownMs) {\n      this.temporaryFailureUrls.delete(vastTagUrl);\n      return false;\n    }\n    return true;\n  }\n  cleanupTemporaryFailures() {\n    const now = Date.now();\n    for (const [url, timestamp] of this.temporaryFailureUrls) {\n      if (now - timestamp >= this.temporaryFailureCooldownMs) {\n        this.temporaryFailureUrls.delete(url);\n      }\n    }\n  }\n  isGamInCooldown() {\n    return Date.now() < this.globalNoFillCooldownUntil;\n  }\n  recordGamNoFill() {\n    this.globalConsecutiveNoFills++;\n    if (this.globalConsecutiveNoFills >= this.globalNoFillThreshold) {\n      const exponent = this.globalConsecutiveNoFills - this.globalNoFillThreshold;\n      const backoff = Math.min(\n        this.globalNoFillBackoffBaseMs * Math.pow(2, exponent),\n        this.globalNoFillBackoffMaxMs\n      );\n      this.globalNoFillCooldownUntil = Date.now() + backoff;\n      if (this.debug) {\n        console.log(\n          `[CIRCUIT-BREAKER] GAM cooldown activated: ${backoff}ms (${this.globalConsecutiveNoFills} consecutive no-fills)`\n        );\n      }\n    }\n  }\n  resetGamNoFillCounter() {\n    if (this.globalConsecutiveNoFills > 0 && this.debug) {\n      console.log(\n        `[CIRCUIT-BREAKER] Resetting no-fill counter (was ${this.globalConsecutiveNoFills})`\n      );\n    }\n    this.globalConsecutiveNoFills = 0;\n    this.globalNoFillCooldownUntil = 0;\n  }\n  async enforceGlobalRateLimit() {\n    const now = Date.now();\n    const elapsed = now - this.globalLastGamRequestTime;\n    if (elapsed < this.globalMinGamIntervalMs) {\n      const waitMs = this.globalMinGamIntervalMs - elapsed;\n      if (this.debug) {\n        console.log(`[RATE-LIMIT] Waiting ${waitMs}ms before next GAM request`);\n      }\n      await new Promise((resolve) => setTimeout(resolve, waitMs));\n    }\n    this.globalLastGamRequestTime = Date.now();\n  }\n  // --- Watchdog ---\n  startAdRequestWatchdog(token) {\n    this.clearAdRequestWatchdog();\n    const timeoutMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n    this.adRequestWatchdogToken = token;\n    this.adRequestWatchdogId = window.setTimeout(() => {\n      if (this.adRequestWatchdogToken !== token) {\n        return;\n      }\n      this.adRequestWatchdogId = void 0;\n      this.adRequestWatchdogToken = null;\n      if (this.activeAdRequestToken === token) {\n        this.activeAdRequestToken = null;\n      }\n      this.logAdState(\"ad_request_timeout\", { token, timeoutMs });\n      this.callbacks.onWatchdogTimeout();\n    }, timeoutMs);\n    this.logAdState(\"ad_request_watchdog_started\", { token, timeoutMs });\n  }\n  clearAdRequestWatchdog() {\n    if (this.adRequestWatchdogId != null) {\n      clearTimeout(this.adRequestWatchdogId);\n      this.adRequestWatchdogId = void 0;\n    }\n    if (this.adRequestWatchdogToken != null) {\n      this.logAdState(\"ad_request_watchdog_cleared\", {\n        token: this.adRequestWatchdogToken\n      });\n      this.adRequestWatchdogToken = null;\n    }\n  }\n  // --- Failsafe ---\n  startAdFailsafeTimer(token) {\n    this.clearAdFailsafeTimer();\n    const failsafeMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n    this.adFailsafeToken = token;\n    this.adFailsafeTimerId = window.setTimeout(() => {\n      if (this.adFailsafeToken !== token) {\n        return;\n      }\n      this.adFailsafeTimerId = void 0;\n      this.adFailsafeToken = null;\n      if (this.activeAdRequestToken === token) {\n        this.activeAdRequestToken = null;\n      }\n      this.logAdState(\"ad_failsafe_triggered\", {\n        token,\n        failsafeMs,\n        videoPaused: this.video.paused\n      });\n      this.callbacks.onFailsafeTimeout();\n    }, failsafeMs);\n    this.logAdState(\"ad_failsafe_started\", { token, failsafeMs });\n  }\n  clearAdFailsafeTimer() {\n    if (this.adFailsafeTimerId != null) {\n      clearTimeout(this.adFailsafeTimerId);\n      this.logAdState(\"ad_failsafe_cleared\", { token: this.adFailsafeToken });\n      this.adFailsafeTimerId = void 0;\n    }\n    this.adFailsafeToken = null;\n  }\n  logAdState(event, extra = {}, adPlayer, inAdBreak, showAds) {\n    if (!this.debug) {\n      return;\n    }\n    console.log(\"[StormcloudVideoPlayer][AdState]\", {\n      event,\n      timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n      showAds: showAds ?? false,\n      adPlaying: adPlayer?.isAdPlaying() ?? false,\n      inAdBreak: inAdBreak ?? false,\n      activeAdRequestToken: this.activeAdRequestToken,\n      ...extra\n    });\n  }\n  // --- Reset for ad break end ---\n  resetForBreakEnd() {\n    this.clearAdStopTimer();\n    this.clearAdStartTimer();\n    this.clearAdRequestWatchdog();\n    this.clearAdFailsafeTimer();\n    this.activeAdRequestToken = null;\n    this.expectedAdBreakDurationMs = void 0;\n    this.currentAdBreakStartWallClockMs = void 0;\n    this.scteAdBreakEndWallClockMs = void 0;\n    this.adBreakPlayedDurationMs = 0;\n    this.currentAdIndex = 0;\n    this.totalAdsInBreak = 0;\n    this.consecutiveFailures = 0;\n    this.globalConsecutiveNoFills = 0;\n    this.adBreakEpoch++;\n  }\n  destroy() {\n    this.clearAdStopTimer();\n    this.clearAdStartTimer();\n    this.clearAdFailsafeTimer();\n    this.clearAdRequestWatchdog();\n  }\n};\n\n// src/player/AdPreloadPool.ts\nvar AdPreloadPool = class {\n  constructor(deps) {\n    this.pool = [];\n    this.maxPoolSize = 2;\n    this.poolActive = false;\n    this.loopRunning = false;\n    this.deps = deps;\n  }\n  get active() {\n    return this.poolActive;\n  }\n  set active(value) {\n    this.poolActive = value;\n  }\n  get isLoopRunning() {\n    return this.loopRunning;\n  }\n  startPreloadPool(baseVastUrl, initialUrls, startLoopImmediately = true) {\n    if (this.poolActive) {\n      if (this.deps.debug) {\n        console.log(\"[PRELOAD-POOL] Already active, skipping duplicate start\");\n      }\n      return;\n    }\n    this.poolActive = true;\n    if (this.deps.debug) {\n      console.log(`[PRELOAD-POOL] Starting preload pool EARLY (target size: ${this.maxPoolSize})`);\n      console.log(`[PRELOAD-POOL] Ad break hasn't started yet, but preloading ads in advance`);\n    }\n    for (const url of initialUrls) {\n      if (this.pool.length < this.maxPoolSize) {\n        this.preloadAdIntoPool(url);\n      }\n    }\n    if (startLoopImmediately) {\n      this.preloadPoolLoop(baseVastUrl);\n    } else if (this.deps.debug) {\n      console.log(\n        \"[PRELOAD-POOL] Pre-break mode: preloaded once, waiting for SCTE start to continue fetching\"\n      );\n    }\n  }\n  async preloadAdIntoPool(vastUrl) {\n    const timing = this.deps.timing;\n    if (timing.isGamInCooldown()) {\n      if (this.deps.debug) {\n        console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping preload\");\n      }\n      return;\n    }\n    if (this.pool.some((entry) => entry.vastUrl === vastUrl) || timing.failedVastUrls.has(vastUrl) || timing.isUrlInCooldown(vastUrl)) {\n      return;\n    }\n    if (this.pool.length >= this.maxPoolSize) {\n      return;\n    }\n    if (this.deps.debug) {\n      console.log(`[PRELOAD-POOL] Preloading ad into pool: ${vastUrl}`);\n    }\n    const epoch = timing.adBreakEpoch;\n    const loadPromise = (async () => {\n      let hasAdError = false;\n      let adErrorPayload = null;\n      let errorListenerCleanup = null;\n      try {\n        const continueLiveStreamDuringAds = this.deps.shouldContinueLiveStreamDuringAds();\n        const preloadAd = this.deps.createAdPlayer(continueLiveStreamDuringAds);\n        preloadAd.initialize();\n        const errorListener = (payload) => {\n          hasAdError = true;\n          adErrorPayload = payload;\n        };\n        preloadAd.on(\"ad_error\", errorListener);\n        errorListenerCleanup = () => preloadAd.off(\"ad_error\", errorListener);\n        await timing.enforceGlobalRateLimit();\n        await preloadAd.requestAds(vastUrl);\n        preloadAd.pause();\n        await new Promise((resolve) => setTimeout(resolve, 1500));\n        preloadAd.pause();\n        if (hasAdError) {\n          const isNoFill = adErrorPayload?.isNoFill || adErrorPayload?.code === 303 || adErrorPayload?.vastErrorCode === 303;\n          if (errorListenerCleanup) {\n            errorListenerCleanup();\n          }\n          preloadAd.destroy();\n          timing.recordGamNoFill();\n          if (isNoFill) {\n            if (this.deps.debug) {\n              console.log(`[PRELOAD-POOL] Ad preload returned no-fill: ${vastUrl}`);\n            }\n            timing.temporaryFailureUrls.set(vastUrl, Date.now());\n          } else {\n            if (this.deps.debug) {\n              console.log(`[PRELOAD-POOL] Ad preload failed with error: ${vastUrl}`, adErrorPayload);\n            }\n            if (adErrorPayload && !timing.isTemporaryAdError(adErrorPayload)) {\n              timing.failedVastUrls.add(vastUrl);\n            } else {\n              timing.temporaryFailureUrls.set(vastUrl, Date.now());\n            }\n          }\n          return;\n        }\n        if (!this.poolActive || epoch !== timing.adBreakEpoch) {\n          if (this.deps.debug) {\n            console.log(\n              \"[PRELOAD-POOL] Discarding preloaded ad - break ended during fetch\"\n            );\n          }\n          if (errorListenerCleanup) {\n            errorListenerCleanup();\n          }\n          try {\n            preloadAd.destroy();\n          } catch {\n          }\n          return;\n        }\n        const poolEntry = {\n          vastUrl,\n          adController: preloadAd,\n          loadedAt: Date.now(),\n          isReady: true,\n          loadPromise: Promise.resolve()\n        };\n        const loadedDuration = preloadAd.getLoadedAdDuration?.();\n        if (loadedDuration != null && loadedDuration > 0) {\n          poolEntry.durationSeconds = loadedDuration;\n        }\n        const lateErrorListener = (payload) => {\n          const index = this.pool.findIndex((entry) => entry.vastUrl === vastUrl);\n          if (index >= 0) {\n            this.pool.splice(index, 1);\n            if (this.deps.debug) {\n              console.log(`[PRELOAD-POOL] Late error detected, removed from pool: ${vastUrl}`, payload);\n            }\n            try {\n              preloadAd.destroy();\n            } catch {\n            }\n          }\n        };\n        preloadAd.on(\"ad_error\", lateErrorListener);\n        this.pool.push(poolEntry);\n        if (this.deps.debug) {\n          console.log(`[PRELOAD-POOL] Ad preloaded (no errors detected within timeout) (pool size: ${this.pool.length}/${this.maxPoolSize}, duration=${poolEntry.durationSeconds ?? \"?\"}s)`);\n        }\n        if (errorListenerCleanup) {\n          errorListenerCleanup();\n        }\n      } catch (error) {\n        if (errorListenerCleanup) {\n          errorListenerCleanup();\n        }\n        timing.recordGamNoFill();\n        if (this.deps.debug) {\n          console.warn(`[PRELOAD-POOL] Failed to preload ad: ${vastUrl}`, error);\n        }\n        if (error instanceof Error && !timing.isTemporaryAdError(error)) {\n          timing.failedVastUrls.add(vastUrl);\n        } else if (error instanceof Error && timing.isTemporaryAdError(error)) {\n          timing.temporaryFailureUrls.set(vastUrl, Date.now());\n        }\n      }\n    })();\n    loadPromise.catch(() => {\n    });\n  }\n  async preloadPoolLoop(baseVastUrl) {\n    if (this.loopRunning) {\n      return;\n    }\n    this.loopRunning = true;\n    const epoch = this.deps.timing.adBreakEpoch;\n    if (this.deps.debug) {\n      console.log(\"[PRELOAD-POOL] Starting continuous preload loop\");\n    }\n    while (this.poolActive && epoch === this.deps.timing.adBreakEpoch) {\n      if (this.deps.timing.isGamInCooldown()) {\n        if (this.deps.debug) {\n          console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping preload pool loop\");\n        }\n        break;\n      }\n      if (!this.deps.isInAdBreak() && this.pool.length >= this.maxPoolSize) {\n        await new Promise((resolve) => setTimeout(resolve, 2e3));\n        continue;\n      }\n      if (!this.deps.isInAdBreak() && this.deps.getPendingAdBreak() === null) {\n        if (this.deps.debug) {\n          console.log(\"[PRELOAD-POOL] Ad break cancelled, stopping preload pool\");\n        }\n        break;\n      }\n      while (this.pool.length < this.maxPoolSize) {\n        if (!this.poolActive || epoch !== this.deps.timing.adBreakEpoch || this.deps.timing.isGamInCooldown()) {\n          break;\n        }\n        if (this.deps.isInAdBreak() && !this.deps.timing.hasTimeToStartAnotherAd()) {\n          if (this.deps.debug) {\n            console.log(\"[PRELOAD-POOL] Not enough ad break time left, stopping preload\");\n          }\n          break;\n        }\n        const newUrls = this.deps.generateVastUrlsWithCorrelators(baseVastUrl, 1);\n        const newUrl = newUrls[0];\n        if (newUrl && !this.deps.timing.failedVastUrls.has(newUrl) && !this.deps.timing.isUrlInCooldown(newUrl)) {\n          await this.preloadAdIntoPool(newUrl);\n        }\n        await new Promise((resolve) => setTimeout(resolve, 1e3));\n      }\n      await new Promise((resolve) => setTimeout(resolve, 2e3));\n    }\n    this.loopRunning = false;\n    if (this.deps.debug) {\n      console.log(\"[PRELOAD-POOL] Preload loop ended\");\n    }\n  }\n  getPreloadedAd() {\n    if (this.pool.length === 0) {\n      return null;\n    }\n    const entry = this.pool.shift();\n    if (!entry || !entry.isReady) {\n      return null;\n    }\n    if (this.deps.debug) {\n      console.log(`[PRELOAD-POOL] Using preloaded ad from pool (${this.pool.length} remaining)`);\n    }\n    return {\n      vastUrl: entry.vastUrl,\n      adController: entry.adController\n    };\n  }\n  stop() {\n    this.poolActive = false;\n    this.loopRunning = false;\n    for (const entry of this.pool) {\n      try {\n        entry.adController.destroy();\n      } catch (error) {\n        if (this.deps.debug) {\n          console.warn(\"[PRELOAD-POOL] Error destroying preloaded controller:\", error);\n        }\n      }\n    }\n    this.pool = [];\n    if (this.deps.debug) {\n      console.log(\"[PRELOAD-POOL] Preload pool stopped and cleaned up\");\n    }\n  }\n};\n\n// src/player/PlaceholderLayer.ts\nvar PlaceholderLayer = class {\n  constructor(video, debug) {\n    this.video = video;\n    this.debug = debug;\n  }\n  ensureContainer() {\n    if (this.container) {\n      return;\n    }\n    const el = document.createElement(\"div\");\n    el.style.position = \"absolute\";\n    el.style.left = \"0\";\n    el.style.top = \"0\";\n    el.style.right = \"0\";\n    el.style.bottom = \"0\";\n    el.style.display = \"none\";\n    el.style.alignItems = \"center\";\n    el.style.justifyContent = \"center\";\n    el.style.pointerEvents = \"none\";\n    el.style.zIndex = \"5\";\n    el.style.backgroundColor = \"#000\";\n    el.style.transition = \"opacity 0.3s ease-in-out\";\n    el.style.opacity = \"0\";\n    if (!this.video.parentElement) {\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Video element has no parent for placeholder container\");\n      }\n      return;\n    }\n    this.video.parentElement.appendChild(el);\n    this.container = el;\n  }\n  show() {\n    this.ensureContainer();\n    if (!this.container) {\n      return;\n    }\n    if (!this.video.muted) {\n      this.video.muted = true;\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Muted video when showing placeholder\");\n      }\n    }\n    const wasHidden = this.container.style.display === \"none\" || this.container.style.opacity === \"0\";\n    if (wasHidden) {\n      this.container.style.transition = \"none\";\n    } else {\n      this.container.style.transition = \"opacity 0.3s ease-in-out\";\n    }\n    this.container.style.backgroundColor = \"#000\";\n    this.container.style.display = \"flex\";\n    this.container.offsetHeight;\n    this.container.style.opacity = \"1\";\n    this.container.style.pointerEvents = \"auto\";\n    if (wasHidden) {\n      requestAnimationFrame(() => {\n        if (this.container) {\n          this.container.style.transition = \"opacity 0.3s ease-in-out\";\n        }\n      });\n    }\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Showing placeholder layer (between content and ad layer)\");\n    }\n  }\n  hide() {\n    if (!this.container) {\n      return;\n    }\n    this.container.style.opacity = \"0\";\n    setTimeout(() => {\n      if (this.container) {\n        this.container.style.display = \"none\";\n        this.container.style.pointerEvents = \"none\";\n        this.container.style.backgroundColor = \"#000\";\n      }\n    }, 300);\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Hiding placeholder layer\");\n    }\n  }\n  destroy() {\n    if (this.container) {\n      if (this.container.parentElement) {\n        this.container.parentElement.removeChild(this.container);\n      }\n      this.container = void 0;\n    }\n  }\n};\n\n// src/player/HlsEngine.ts\nvar import_hls2 = __toESM(require(\"hls.js\"), 1);\nvar HlsEngine = class {\n  constructor(config, video, cueManager, timing, callbacks) {\n    this.isLiveStream = false;\n    this.nativeHlsMode = false;\n    this.videoSrcProtection = null;\n    this.bufferedSegmentsCount = 0;\n    this.shouldAutoplayAfterBuffering = false;\n    this.hasInitialBufferCompleted = false;\n    this.config = config;\n    this.video = video;\n    this.cueManager = cueManager;\n    this.timing = timing;\n    this.callbacks = callbacks;\n  }\n  get debug() {\n    return !!this.config.debugAdTiming;\n  }\n  shouldUseNativeHls(getStreamType) {\n    const streamType = getStreamType();\n    if (streamType === \"other\") {\n      return true;\n    }\n    const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n    return !!(this.config.allowNativeHls && canNative);\n  }\n  async setupNativeHls() {\n    this.nativeHlsMode = true;\n    this.videoSrcProtection = this.config.src;\n    this.video.src = this.config.src;\n    this.isLiveStream = this.config.isLiveStream ?? (this.config.lowLatencyMode ?? false);\n    if (this.debug) {\n      const adBehavior = this.isLiveStream ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n      console.log(\n        \"[StormcloudVideoPlayer] Using native HLS playback:\",\n        {\n          isLive: this.isLiveStream,\n          allowNativeHls: this.config.allowNativeHls,\n          adBehavior\n        }\n      );\n    }\n    if (this.config.autoplay) {\n      await this.video.play()?.catch(() => {\n      });\n    }\n  }\n  setupHls() {\n    this.hls = new import_hls2.default({\n      enableWorker: true,\n      backBufferLength: 30,\n      liveDurationInfinity: true,\n      lowLatencyMode: !!this.config.lowLatencyMode,\n      maxLiveSyncPlaybackRate: this.config.lowLatencyMode ? 1.5 : 1,\n      ...this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {},\n      maxBufferLength: 30,\n      maxMaxBufferLength: 600,\n      maxBufferSize: 60 * 1e3 * 1e3,\n      maxBufferHole: 0.5,\n      highBufferWatchdogPeriod: 2,\n      nudgeOffset: 0.1,\n      nudgeMaxRetry: 3,\n      startPosition: -1\n    });\n    this.hls.on(import_hls2.default.Events.MEDIA_ATTACHED, () => {\n      this.hls?.loadSource(this.config.src);\n    });\n    this.hls.on(import_hls2.default.Events.MANIFEST_PARSED, async (_, _data) => {\n      this.isLiveStream = this.config.isLiveStream ?? (this.hls?.levels?.some(\n        (level) => level?.details?.live === true || level?.details?.type === \"LIVE\"\n      ) ?? false);\n      await this.callbacks.onManifestParsed(this.isLiveStream);\n      this.bufferedSegmentsCount = 0;\n      this.hasInitialBufferCompleted = false;\n      this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n      const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Waiting for\",\n          minSegments,\n          \"segments to buffer before playback\"\n        );\n      }\n      if (minSegments === 0 || !this.config.autoplay) {\n        this.hasInitialBufferCompleted = true;\n        if (this.config.autoplay) {\n          await this.video.play()?.catch(() => {\n          });\n        }\n      }\n    });\n    this.hls.on(import_hls2.default.Events.LEVEL_LOADED, (_evt, data) => {\n      if (this.callbacks.isInAdBreak() || this.callbacks.hasPendingAdBreak()) {\n        return;\n      }\n      const details = data?.details;\n      if (!details || !details.fragments || details.fragments.length === 0) {\n        return;\n      }\n      const fragmentsToScan = Math.min(5, details.fragments.length);\n      for (let i = 0; i < fragmentsToScan; i++) {\n        const frag = details.fragments[i];\n        const tagList = frag?.tagList;\n        if (!Array.isArray(tagList)) continue;\n        for (const entry of tagList) {\n          let tag = \"\";\n          let value = \"\";\n          if (Array.isArray(entry)) {\n            tag = String(entry[0] ?? \"\");\n            value = String(entry[1] ?? \"\");\n          } else if (typeof entry === \"string\") {\n            const idx = entry.indexOf(\":\");\n            if (idx >= 0) {\n              tag = entry.substring(0, idx);\n              value = entry.substring(idx + 1);\n            } else {\n              tag = entry;\n            }\n          }\n          if (!tag) continue;\n          if (tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-DATERANGE\")) {\n            const attrs = tag.includes(\"EXT-X-DATERANGE\") ? parseAttributeList(value) : {};\n            const hasScteOut = tag.includes(\"EXT-X-CUE-OUT\") || \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n            if (hasScteOut) {\n              const durationSeconds = parseCueOutDuration(value);\n              const marker = {\n                type: \"start\",\n                ...durationSeconds !== void 0 ? { durationSeconds } : {},\n                raw: { tag, value, earlyDetection: true }\n              };\n              if (this.debug) {\n                console.log(\"[StormcloudVideoPlayer] EARLY SCTE-35 DETECTION: Ad break marker found in fragment\", i, \"- starting pre-fetch (NOT playing yet)\");\n              }\n              this.callbacks.onScte35Cue(marker, {\n                ...this.cueManager.createScte35CueContext(\"manifest\", \"early\", frag)\n              });\n              return;\n            }\n          }\n        }\n      }\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_BUFFERED, async (_evt, _data) => {\n      if (this.hasInitialBufferCompleted) {\n        return;\n      }\n      this.bufferedSegmentsCount++;\n      const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n        );\n      }\n      if (this.bufferedSegmentsCount >= minSegments) {\n        this.hasInitialBufferCompleted = true;\n        if (this.shouldAutoplayAfterBuffering) {\n          if (this.debug) {\n            console.log(\n              `[StormcloudVideoPlayer] Initial buffer complete (${this.bufferedSegmentsCount} segments). Starting playback.`\n            );\n          }\n          await this.video.play()?.catch((err) => {\n            if (this.debug) {\n              console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n            }\n          });\n        }\n      }\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_PARSING_METADATA, (_evt, data) => {\n      const id3Tags = (data?.samples || []).map((s) => ({\n        key: \"ID3\",\n        value: s?.data,\n        ptsSeconds: s?.pts\n      }));\n      id3Tags.forEach((tag) => this.onId3Tag(tag));\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_LOADED, (_evt, data) => {\n      this.processFragmentScte35Payload(\n        data?.payload,\n        typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n        getFragmentStartSeconds(data?.frag)\n      );\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_DECRYPTED, (_evt, data) => {\n      this.processFragmentScte35Payload(\n        data?.payload,\n        typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n        getFragmentStartSeconds(data?.frag)\n      );\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_CHANGED, (_evt, data) => {\n      const frag = data?.frag;\n      const tagList = frag?.tagList;\n      if (!Array.isArray(tagList)) {\n        this.callbacks.activatePendingCuesForFragment(frag);\n        return;\n      }\n      for (const entry of tagList) {\n        let tag = \"\";\n        let value = \"\";\n        if (Array.isArray(entry)) {\n          tag = String(entry[0] ?? \"\");\n          value = String(entry[1] ?? \"\");\n        } else if (typeof entry === \"string\") {\n          const idx = entry.indexOf(\":\");\n          if (idx >= 0) {\n            tag = entry.substring(0, idx);\n            value = entry.substring(idx + 1);\n          } else {\n            tag = entry;\n            value = \"\";\n          }\n        }\n        if (!tag) continue;\n        if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n          const prog = parseCueOutCont(value);\n          const marker = {\n            type: \"progress\",\n            ...prog?.duration !== void 0 ? { durationSeconds: prog.duration } : {},\n            ...prog?.elapsed !== void 0 ? { ptsSeconds: prog.elapsed } : {},\n            raw: { tag, value }\n          };\n          this.callbacks.onScte35Cue(marker, {\n            ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n          });\n        } else if (tag.includes(\"EXT-X-CUE-OUT\")) {\n          const durationSeconds = parseCueOutDuration(value);\n          const marker = {\n            type: \"start\",\n            ...durationSeconds !== void 0 ? { durationSeconds } : {},\n            raw: { tag, value }\n          };\n          this.callbacks.onScte35Cue(marker, {\n            ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n          });\n        } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n          this.callbacks.onScte35Cue(\n            { type: \"end\", raw: { tag, value } },\n            {\n              ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n            }\n          );\n        } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n          const attrs = parseAttributeList(value);\n          const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n          const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n          const klass = String(attrs[\"CLASS\"] ?? \"\");\n          const duration = toNumber(attrs[\"DURATION\"]);\n          if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n            const marker = {\n              type: \"start\",\n              ...duration !== void 0 ? { durationSeconds: duration } : {},\n              raw: { tag, value, attrs }\n            };\n            this.callbacks.onScte35Cue(marker, {\n              ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n            });\n          }\n          if (hasScteIn) {\n            this.callbacks.onScte35Cue(\n              { type: \"end\", raw: { tag, value, attrs } },\n              {\n                ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n              }\n            );\n          }\n        }\n      }\n      this.callbacks.activatePendingCuesForFragment(frag);\n    });\n    this.hls.on(import_hls2.default.Events.ERROR, (_evt, data) => {\n      if (data?.fatal) {\n        switch (data.type) {\n          case import_hls2.default.ErrorTypes.NETWORK_ERROR:\n            this.hls?.startLoad();\n            break;\n          case import_hls2.default.ErrorTypes.MEDIA_ERROR:\n            this.hls?.recoverMediaError();\n            break;\n          default:\n            this.callbacks.onFatalDestroy();\n            break;\n        }\n      }\n    });\n    this.hls.attachMedia(this.video);\n  }\n  onId3Tag(tag) {\n    if (typeof tag.ptsSeconds === \"number\") {\n      this.timing.updatePtsDrift(tag.ptsSeconds);\n    }\n    const marker = parseScte35FromId3(tag);\n    if (marker) {\n      this.callbacks.onScte35Cue(marker, {\n        source: \"id3\",\n        readiness: \"playback\"\n      });\n    }\n  }\n  processFragmentScte35Payload(payloadData, fragmentSn, fragmentStartSeconds) {\n    const payload = normalizeFragmentPayload(payloadData);\n    if (!payload) {\n      return;\n    }\n    const markers = parseScte35FromTsPackets(\n      payload,\n      this.cueManager.tsScte35Pids,\n      this.cueManager.pmtPids,\n      this.cueManager.processedTsScte35Sections\n    );\n    markers.forEach((marker) => {\n      const context = {\n        source: \"ts\",\n        readiness: \"early\"\n      };\n      if (fragmentSn !== void 0) {\n        context.fragmentSn = fragmentSn;\n      }\n      if (fragmentStartSeconds !== void 0) {\n        context.fragmentStartSeconds = fragmentStartSeconds;\n      }\n      this.callbacks.onScte35Cue(marker, context);\n    });\n  }\n  getLiveSyncPosition() {\n    const pos = this.hls?.liveSyncPosition;\n    return typeof pos === \"number\" && Number.isFinite(pos) ? pos : void 0;\n  }\n  destroy() {\n    this.hls?.destroy();\n    this.hls = void 0;\n  }\n};\n\n// src/player/PlayerControls.ts\nfunction getAdAudioVolume(adPlayer) {\n  return adPlayer.getOriginalMutedState() ? 0 : adPlayer.getOriginalVolume();\n}\nfunction toggleMute(video, adPlayer, debug) {\n  if (adPlayer.isAdPlaying()) {\n    const newMutedState = !adPlayer.getOriginalMutedState();\n    const restoreVolume = adPlayer.getOriginalVolume() || 1;\n    adPlayer.updateOriginalMutedState(newMutedState, video.volume);\n    adPlayer.setAdVolume(newMutedState ? 0 : restoreVolume);\n    if (debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] Mute toggle during ad - immediately applied:\",\n        newMutedState\n      );\n    }\n  } else {\n    video.muted = !video.muted;\n    adPlayer.updateOriginalMutedState(video.muted, video.volume);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] Muted:\", video.muted);\n    }\n  }\n}\nfunction toggleFullscreen(video, debug) {\n  return new Promise((resolve, reject) => {\n    if (!document.fullscreenElement) {\n      const container = video.parentElement;\n      if (!container) {\n        reject(new Error(\"No parent container found for fullscreen\"));\n        return;\n      }\n      container.requestFullscreen().then(() => {\n        if (debug) {\n          console.log(\"[StormcloudVideoPlayer] Entered fullscreen\");\n        }\n        resolve();\n      }).catch((err) => {\n        if (debug) {\n          console.error(\"[StormcloudVideoPlayer] Fullscreen error:\", err);\n        }\n        reject(err);\n      });\n    } else {\n      document.exitFullscreen().then(() => {\n        if (debug) {\n          console.log(\"[StormcloudVideoPlayer] Exited fullscreen\");\n        }\n        resolve();\n      }).catch((err) => {\n        if (debug) {\n          console.error(\n            \"[StormcloudVideoPlayer] Exit fullscreen error:\",\n            err\n          );\n        }\n        reject(err);\n      });\n    }\n  });\n}\nfunction isMuted(video, adPlayer) {\n  if (adPlayer.isAdPlaying()) {\n    return adPlayer.getOriginalMutedState();\n  }\n  return video.muted;\n}\nfunction setMuted(video, adPlayer, muted, debug) {\n  const adPlaying = adPlayer.isAdPlaying();\n  if (adPlaying && muted === video.muted) {\n    if (debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] setMuted reflective update during ad ignored\",\n        { muted }\n      );\n    }\n    return;\n  }\n  video.muted = muted;\n  if (adPlaying) {\n    adPlayer.updateOriginalMutedState(muted, video.volume);\n    adPlayer.setAdVolume(muted ? 0 : 1);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] setMuted applied during ad\", {\n        muted\n      });\n    }\n    return;\n  }\n  adPlayer.updateOriginalMutedState(muted, video.volume);\n  if (debug) {\n    console.log(\"[StormcloudVideoPlayer] setMuted called:\", muted);\n  }\n}\nfunction setVolume(video, adPlayer, volume, debug) {\n  const clampedVolume = Math.max(0, Math.min(1, volume));\n  const adPlaying = adPlayer.isAdPlaying();\n  if (adPlaying) {\n    adPlayer.setAdVolume(clampedVolume);\n    adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] setVolume applied during ad\", {\n        volume: clampedVolume\n      });\n    }\n  } else {\n    video.volume = clampedVolume;\n    video.muted = clampedVolume === 0;\n    adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] setVolume called:\", clampedVolume);\n    }\n  }\n}\nfunction getVolume(video, adPlayer) {\n  const adPlaying = adPlayer.isAdPlaying();\n  if (adPlaying) {\n    return adPlayer.getAdVolume();\n  }\n  return video.volume;\n}\nfunction isFullscreen() {\n  return !!document.fullscreenElement;\n}\nfunction resizePlayer(video, adPlayer, debug) {\n  if (debug) {\n    console.log(\"[StormcloudVideoPlayer] Resizing player\");\n  }\n  if (adPlayer && adPlayer.isAdPlaying()) {\n    const width = video.clientWidth || 640;\n    const height = video.clientHeight || 480;\n    if (debug) {\n      console.log(\n        `[StormcloudVideoPlayer] Resizing ads manager to ${width}x${height}`\n      );\n    }\n    adPlayer.resize(width, height);\n  }\n}\n\n// src/player/AdBreakOrchestrator.ts\nvar AdBreakOrchestrator = class {\n  constructor(host, timing, preloadPool, adConfig, cueManager, placeholder) {\n    this.inAdBreak = false;\n    this.showAds = false;\n    this.isShowingPlaceholder = false;\n    this.adDetectSentForCurrentBreak = false;\n    this.continuousFetchingActive = false;\n    this.continuousFetchLoopRunning = false;\n    this.adRequestQueue = [];\n    this.adPodQueue = [];\n    this.maxPlaceholderDurationMs = 5e3;\n    this.pendingAdBreak = null;\n    this.host = host;\n    this.timing = timing;\n    this.preloadPool = preloadPool;\n    this.adConfig = adConfig;\n    this.cueManager = cueManager;\n    this.placeholder = placeholder;\n  }\n  get debug() {\n    return !!this.host.config.debugAdTiming;\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  IMA event listeners\n  // ───────────────────────────────────────────────────────────────\n  attachImaEventListeners() {\n    const adPlayer = this.host.getAdPlayer();\n    adPlayer.on(\"all_ads_completed\", () => {\n      sendAdImpressionTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() }\n      ).catch(() => {\n      });\n      this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n      const remaining = this.timing.getRemainingAdMs();\n      this.timing.consecutiveFailures = 0;\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] all_ads_completed event received - remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n          this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n        );\n      }\n      if (this.inAdBreak) {\n        if (this.timing.hasTimeToStartAnotherAd()) {\n          this.tryNextAvailableAdWithRateLimit();\n        } else {\n          this.handleAdPodComplete();\n        }\n      }\n    });\n    adPlayer.on(\"ad_error\", (errorPayload) => {\n      let errorMessage = \"Ad playback failed\";\n      if (errorPayload) {\n        const errorCode = errorPayload.code || errorPayload.errorCode || \"unknown\";\n        const vastErrorCode = errorPayload.vastErrorCode;\n        const message = errorPayload.message || errorPayload.errorMessage || \"Unknown error\";\n        const cause = errorPayload.cause || errorPayload.innerError || errorPayload.error;\n        errorMessage = `Ad error: AdError ${errorCode}: ${message}`;\n        if (vastErrorCode && vastErrorCode !== \"N/A\" && vastErrorCode !== errorCode) {\n          errorMessage += ` (VAST Error Code: ${vastErrorCode})`;\n        }\n        if (cause) {\n          const causeMessage = typeof cause === \"string\" ? cause : cause.message || String(cause);\n          errorMessage += `. Caused by: ${causeMessage}`;\n        }\n      }\n      console.error(\"[AD-ERROR]\", errorMessage, errorPayload || \"\");\n      this.handleAdFailure();\n    });\n    adPlayer.on(\"content_pause\", () => {\n      this.timing.clearAdFailsafeTimer();\n      this.timing.clearAdRequestWatchdog();\n      this.timing.activeAdRequestToken = null;\n      this.showAds = true;\n      this.timing.resetGamNoFillCounter();\n      if (this.inAdBreak && this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n        this.timing.scheduleAdStopAtBreakBoundary();\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Starting ad break timer on content_pause (first ad starting)\");\n        }\n      }\n      this.host.getAdPlayer().setAdVolume(getAdAudioVolume(this.host.getAdPlayer()));\n      if (this.isShowingPlaceholder) {\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Hiding placeholder - new ads starting\");\n        }\n        this.host.getAdPlayer().hidePlaceholder();\n        this.isShowingPlaceholder = false;\n      }\n    });\n    adPlayer.on(\"content_resume\", () => {\n      sendAdImpressionTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() }\n      ).catch(() => {\n      });\n      if (!this.host.video.muted) {\n        this.host.video.muted = true;\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Muted video on content_resume (ad ended, gap between ads)\");\n        }\n      }\n      this.timing.clearAdFailsafeTimer();\n      this.timing.clearAdRequestWatchdog();\n      this.timing.activeAdRequestToken = null;\n      this.showAds = false;\n      if (!this.inAdBreak) {\n        return;\n      }\n      this.timing.consecutiveFailures = 0;\n      this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n      const remaining = this.timing.getRemainingAdMs();\n      if (this.debug) {\n        console.log(\n          `[CONTINUOUS-FETCH] content_resume event: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n          this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n        );\n      }\n      if (this.timing.hasTimeToStartAnotherAd()) {\n        this.tryNextAvailableAdWithRateLimit();\n      } else {\n        this.handleAdPodComplete();\n      }\n    });\n  }\n  recreateAdController() {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Recreating AdController for new ad\");\n    }\n    const shouldShowPlaceholder = this.inAdBreak && this.showAds;\n    const adPlayer = this.host.getAdPlayer();\n    if (shouldShowPlaceholder && adPlayer) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Showing placeholder before destroying old AdController\");\n      }\n      this.placeholder.show();\n      adPlayer.showPlaceholder();\n      this.isShowingPlaceholder = true;\n    }\n    const preservedMutedState = adPlayer.getOriginalMutedState();\n    const preservedVolumeState = adPlayer.getOriginalVolume();\n    if (adPlayer) {\n      try {\n        adPlayer.destroy();\n        this.host.video.muted = true;\n      } catch (error) {\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] Error destroying old AdController:\", error);\n        }\n      }\n    }\n    const continueLiveStreamDuringAds = this.host.shouldContinueLiveStreamDuringAds();\n    const newAdPlayer = this.host.createAdPlayer(continueLiveStreamDuringAds);\n    this.host.setAdPlayer(newAdPlayer);\n    newAdPlayer.initialize();\n    newAdPlayer.updateOriginalMutedState(preservedMutedState, preservedVolumeState);\n    this.attachImaEventListeners();\n    if (shouldShowPlaceholder) {\n      this.placeholder.show();\n      newAdPlayer.showPlaceholder();\n      this.isShowingPlaceholder = true;\n    }\n  }\n  clearPendingAdBreak() {\n    if (this.prefetchTimerId != null) {\n      clearTimeout(this.prefetchTimerId);\n      this.prefetchTimerId = void 0;\n    }\n    this.pendingAdBreak = null;\n    this.cueManager.pendingScte35CueKey = void 0;\n    this.adConfig.podAssignedByPrefetch = false;\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Ad break start\n  // ───────────────────────────────────────────────────────────────\n  async handleAdStart(_marker) {\n    const scheduled = this.adConfig.findCurrentOrNextBreak(\n      this.host.video.currentTime * 1e3\n    );\n    if (scheduled) {\n      this.adConfig.consumedVmapBreakIds.add(this.adConfig.getAdBreakKey(scheduled));\n    }\n    const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n    let baseVastUrl;\n    if (tags && tags.length > 0 && tags[0]) {\n      baseVastUrl = tags[0];\n    } else if (this.adConfig.apiVastTagUrl) {\n      baseVastUrl = this.adConfig.apiVastTagUrl;\n    } else {\n      this.clearPendingAdBreak();\n      return;\n    }\n    const adBreakDurationMs = _marker.durationSeconds != null ? _marker.durationSeconds * 1e3 : scheduled?.durationMs;\n    if (this.debug) {\n      const mode = this.host.config.isLiveStream ? \"LIVE\" : \"VOD\";\n      console.log(\n        `[CONTINUOUS-FETCH] ${mode} MODE: Target duration=${adBreakDurationMs}ms`\n      );\n    }\n    this.timing.failedVastUrls.clear();\n    this.timing.temporaryFailureUrls.clear();\n    this.timing.consecutiveFailures = 0;\n    this.continuousFetchingActive = true;\n    this.isShowingPlaceholder = false;\n    this.timing.totalAdRequestsInBreak = 0;\n    if (this.adConfig.podAssignedByPrefetch) {\n      this.adConfig.podAssignedByPrefetch = false;\n    } else {\n      this.adConfig.beginNewAdPod();\n    }\n    const currentMuted = this.host.video.muted;\n    const currentVolume = this.host.video.volume;\n    this.host.getAdPlayer().updateOriginalMutedState(currentMuted, currentVolume);\n    this.inAdBreak = true;\n    this.timing.adBreakPlayedDurationMs = 0;\n    this.timing.currentAdIndex = 0;\n    this.timing.totalAdsInBreak = 0;\n    this.adPodQueue = [];\n    this.showAds = false;\n    if (this.timing.expectedAdBreakDurationMs == null && adBreakDurationMs != null) {\n      this.timing.expectedAdBreakDurationMs = adBreakDurationMs;\n    }\n    let firstAdUrl;\n    let usePreloadedAd = false;\n    let preloadedController;\n    const preloaded = this.preloadPool.getPreloadedAd();\n    if (preloaded) {\n      firstAdUrl = preloaded.vastUrl;\n      preloadedController = preloaded.adController;\n      usePreloadedAd = true;\n      sendAdLoadedTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", vastUrl: firstAdUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() }\n      ).catch(() => {\n      });\n      if (this.debug) {\n        console.log(\"[CONTINUOUS-FETCH] Using preloaded ad from pool (preloaded in advance, ready immediately!)\");\n      }\n    } else if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {\n      this.adRequestQueue = [...this.pendingAdBreak.vastUrls];\n      firstAdUrl = this.adRequestQueue.shift();\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Pool empty, using prefetched URLs (${this.adRequestQueue.length + 1} available)`);\n      }\n      this.clearPendingAdBreak();\n    } else {\n      if (this.debug) {\n        console.log(\"[CONTINUOUS-FETCH] Generating new ad URLs...\");\n      }\n      const firstAdUrlArray = this.host.generateVastUrls(baseVastUrl, 1);\n      firstAdUrl = firstAdUrlArray[0];\n      this.adRequestQueue = [];\n    }\n    if (!firstAdUrl) {\n      if (this.debug) {\n        console.warn(\"[CONTINUOUS-FETCH] Failed to get first ad URL\");\n      }\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.debug) {\n      console.log(\"[CONTINUOUS-FETCH] First VAST URL:\", firstAdUrl);\n    }\n    try {\n      if (usePreloadedAd && preloadedController) {\n        if (!this.timing.ensureLoadedAdFitsBudget(preloadedController)) {\n          this.timing.rejectLoadedAdForDuration(preloadedController);\n          this.startContinuousFetching(baseVastUrl);\n          await this.tryNextAvailableAdWithRateLimit();\n          return;\n        }\n        const adPlayer = this.host.getAdPlayer();\n        const preservedMuted = adPlayer.getOriginalMutedState();\n        const preservedVolume = adPlayer.getOriginalVolume();\n        adPlayer.destroy();\n        this.host.video.muted = true;\n        this.host.setAdPlayer(preloadedController);\n        preloadedController.updateOriginalMutedState(preservedMuted, preservedVolume);\n        this.attachImaEventListeners();\n        if (this.debug) {\n          console.log(\"[CONTINUOUS-FETCH] Using preloaded ad, resuming and starting playback immediately (no request delay!)\");\n        }\n        preloadedController.resume();\n        this.timing.consecutiveFailures = 0;\n        this.startContinuousFetching(baseVastUrl);\n        if (!this.preloadPool.active) {\n          this.preloadPool.active = true;\n        }\n        if (!this.preloadPool.isLoopRunning) {\n          this.preloadPool.preloadPoolLoop(baseVastUrl);\n        }\n        await preloadedController.play();\n        this.timing.markAdStarted();\n        if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n          this.timing.scheduleAdStopAtBreakBoundary();\n        }\n        const adVolume = currentMuted ? 0 : currentVolume;\n        preloadedController.setAdVolume(adVolume);\n      } else {\n        const adPlayer = this.host.getAdPlayer();\n        await this.timing.enforceGlobalRateLimit();\n        this.timing.lastAdRequestTime = Date.now();\n        await adPlayer.requestAds(firstAdUrl);\n        sendAdLoadedTracking(\n          this.host.config.licenseKey,\n          { source: \"hls\", vastUrl: firstAdUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() }\n        ).catch(() => {\n        });\n        if (this.debug) {\n          console.log(\"[CONTINUOUS-FETCH] First ad request successful, starting playback\");\n        }\n        if (!this.timing.ensureLoadedAdFitsBudget(adPlayer)) {\n          this.timing.rejectLoadedAdForDuration(adPlayer);\n          this.recreateAdController();\n          this.startContinuousFetching(baseVastUrl);\n          await this.tryNextAvailableAdWithRateLimit();\n          return;\n        }\n        this.timing.consecutiveFailures = 0;\n        this.startContinuousFetching(baseVastUrl);\n        if (!this.preloadPool.active) {\n          this.preloadPool.startPreloadPool(baseVastUrl, []);\n        }\n        await adPlayer.play();\n        this.timing.markAdStarted();\n        if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n          this.timing.scheduleAdStopAtBreakBoundary();\n        }\n        const adVolume = currentMuted ? 0 : currentVolume;\n        adPlayer.setAdVolume(adVolume);\n      }\n    } catch (error) {\n      if (this.debug) {\n        console.warn(\"[CONTINUOUS-FETCH] First ad request failed:\", error);\n      }\n      if (!usePreloadedAd) {\n        const fallbackPreloaded = this.preloadPool.getPreloadedAd();\n        if (fallbackPreloaded) {\n          if (this.debug) {\n            console.log(\"[CONTINUOUS-FETCH] First ad failed, using preloaded fallback\");\n          }\n          try {\n            if (!this.timing.ensureLoadedAdFitsBudget(fallbackPreloaded.adController)) {\n              this.timing.rejectLoadedAdForDuration(fallbackPreloaded.adController);\n              this.startContinuousFetching(baseVastUrl);\n              await this.tryNextAvailableAdWithRateLimit();\n              return;\n            }\n            this.swapToPreloadedAdPlayer(fallbackPreloaded.adController);\n            this.timing.consecutiveFailures = 0;\n            this.startContinuousFetching(baseVastUrl);\n            if (!this.preloadPool.active) {\n              this.preloadPool.active = true;\n              this.preloadPool.preloadPoolLoop(baseVastUrl);\n            }\n            const ap = this.host.getAdPlayer();\n            await ap.play();\n            this.timing.markAdStarted();\n            if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n              this.timing.scheduleAdStopAtBreakBoundary();\n            }\n            const adVolume = currentMuted ? 0 : currentVolume;\n            ap.setAdVolume(adVolume);\n            return;\n          } catch (fallbackError) {\n            if (this.debug) {\n              console.warn(\"[CONTINUOUS-FETCH] Preloaded fallback also failed:\", fallbackError);\n            }\n          }\n        }\n      }\n      if (this.timing.isTemporaryAdError(error)) {\n        this.timing.temporaryFailureUrls.set(firstAdUrl, Date.now());\n        if (this.debug) {\n          console.log(\"[CONTINUOUS-FETCH] First ad had temporary error (no-fill) - will try alternatives\");\n        }\n      } else {\n        this.timing.failedVastUrls.add(firstAdUrl);\n        if (this.debug) {\n          console.log(\"[CONTINUOUS-FETCH] First ad had permanent error - URL blacklisted\");\n        }\n      }\n      this.timing.consecutiveFailures++;\n      this.startContinuousFetching(baseVastUrl);\n      await this.tryNextAvailableAdWithRateLimit();\n    }\n  }\n  swapToPreloadedAdPlayer(preloadedController) {\n    const adPlayer = this.host.getAdPlayer();\n    const preservedMuted = adPlayer.getOriginalMutedState();\n    const preservedVolume = adPlayer.getOriginalVolume();\n    adPlayer.destroy();\n    this.host.video.muted = true;\n    this.host.setAdPlayer(preloadedController);\n    this.attachImaEventListeners();\n    preloadedController.updateOriginalMutedState(preservedMuted, preservedVolume);\n    preloadedController.resume();\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Continuous fetching\n  // ───────────────────────────────────────────────────────────────\n  startContinuousFetching(baseVastUrl) {\n    if (!this.continuousFetchingActive) {\n      return;\n    }\n    if (this.continuousFetchLoopRunning) {\n      if (this.debug) {\n        console.log(\"[CONTINUOUS-FETCH] Fetch loop already running, skipping duplicate start\");\n      }\n      return;\n    }\n    if (this.debug) {\n      console.log(\"[CONTINUOUS-FETCH] Starting continuous ad fetching loop\");\n    }\n    this.continuousFetchLoopRunning = true;\n    this.continuousFetchLoop(baseVastUrl);\n  }\n  async continuousFetchLoop(baseVastUrl) {\n    const epoch = this.timing.adBreakEpoch;\n    while (this.continuousFetchingActive && this.inAdBreak && epoch === this.timing.adBreakEpoch) {\n      const remaining = Math.min(\n        this.timing.getWallClockRemainingAdMs(),\n        this.timing.getDurationBudgetRemainingMs()\n      );\n      if (remaining <= this.timing.getMinRemainingMsToStartAd()) {\n        if (this.debug) {\n          console.log(`[CONTINUOUS-FETCH] Not enough ad break time left (wall=${this.timing.getWallClockRemainingAdMs()}ms, budget=${this.timing.getDurationBudgetRemainingMs()}ms), stopping URL generation`);\n        }\n        break;\n      }\n      if (this.timing.isGamInCooldown()) {\n        if (this.debug) {\n          console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping URL generation\");\n        }\n        break;\n      }\n      if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n        if (this.debug) {\n          console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), stopping URL generation`);\n        }\n        break;\n      }\n      if (this.timing.totalAdRequestsInBreak >= this.timing.maxTotalAdRequestsPerBreak) {\n        if (this.debug) {\n          console.log(`[CONTINUOUS-FETCH] Maximum ad requests reached (${this.timing.maxTotalAdRequestsPerBreak}), stopping`);\n        }\n        break;\n      }\n      const maxQueueSize = 5;\n      if (this.adRequestQueue.length >= maxQueueSize) {\n        if (this.debug) {\n          console.log(`[CONTINUOUS-FETCH] URL queue full (${this.adRequestQueue.length}), waiting...`);\n        }\n        await new Promise((resolve) => setTimeout(resolve, 1e3));\n        continue;\n      }\n      const newAdUrl = this.host.generateVastUrls(baseVastUrl, 1)[0];\n      if (!newAdUrl || this.timing.failedVastUrls.has(newAdUrl) || this.timing.isUrlInCooldown(newAdUrl)) {\n        await new Promise((resolve) => setTimeout(resolve, 500));\n        continue;\n      }\n      if (this.debug) {\n        const queuedUrlsPreview = [...this.adRequestQueue, newAdUrl];\n        console.log(\n          `[CONTINUOUS-FETCH] Queued VAST URL (queue size: ${queuedUrlsPreview.length})`,\n          { queuedUrls: queuedUrlsPreview }\n        );\n      }\n      this.adRequestQueue.push(newAdUrl);\n      const generationDelay = this.timing.consecutiveFailures > 0 ? Math.min(1e3 * Math.pow(2, this.timing.consecutiveFailures), 5e3) : 500;\n      await new Promise((resolve) => setTimeout(resolve, generationDelay));\n    }\n    this.continuousFetchLoopRunning = false;\n    if (this.debug) {\n      console.log(\n        `[CONTINUOUS-FETCH] URL generation loop ended (queued: ${this.adRequestQueue.length})`,\n        this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n      );\n    }\n  }\n  stopContinuousFetching() {\n    this.continuousFetchingActive = false;\n    this.continuousFetchLoopRunning = false;\n    this.placeholder.hide();\n    if (this.debug) {\n      console.log(\"[CONTINUOUS-FETCH] Stopping continuous ad fetching\");\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Ad iteration\n  // ───────────────────────────────────────────────────────────────\n  async tryNextAvailableAdWithRateLimit() {\n    if (!this.inAdBreak) {\n      return;\n    }\n    const epoch = this.timing.adBreakEpoch;\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n      }\n      this.handleAdPodComplete();\n      return;\n    }\n    const backoffMultiplier = Math.pow(2, this.timing.consecutiveFailures);\n    const backoffDelay = Math.min(this.timing.backoffBaseMs * backoffMultiplier, this.timing.maxBackoffMs);\n    const effectiveMinInterval = this.timing.minAdRequestIntervalMs + (this.timing.consecutiveFailures > 0 ? backoffDelay : 0);\n    const timeSinceLastRequest = Date.now() - this.timing.lastAdRequestTime;\n    if (timeSinceLastRequest < effectiveMinInterval) {\n      const waitTime = effectiveMinInterval - timeSinceLastRequest;\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Rate limiting: waiting ${waitTime}ms before next request (backoff: ${this.timing.consecutiveFailures} failures)`);\n      }\n      await new Promise((resolve) => setTimeout(resolve, waitTime));\n    }\n    if (!this.inAdBreak || epoch !== this.timing.adBreakEpoch) {\n      return;\n    }\n    return this.tryNextAvailableAd(0);\n  }\n  async tryNextAvailableAd(retryCount = 0) {\n    if (!this.inAdBreak) {\n      return;\n    }\n    const remaining = this.timing.getRemainingAdMs();\n    if (!this.timing.hasTimeToStartAnotherAd()) {\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Not enough time remaining (${remaining}ms) to start another ad, ending ad break`);\n      }\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.timing.isGamInCooldown()) {\n      if (this.debug) {\n        console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, ending ad break gracefully\");\n      }\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break`);\n      }\n      this.handleAdPodComplete();\n      return;\n    }\n    this.timing.cleanupTemporaryFailures();\n    const preloaded = this.preloadPool.getPreloadedAd();\n    if (preloaded) {\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Using preloaded ad from pool`);\n      }\n      sendAdLoadedTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", vastUrl: preloaded.vastUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() }\n      ).catch(() => {\n      });\n      try {\n        if (!this.timing.ensureLoadedAdFitsBudget(preloaded.adController)) {\n          this.timing.rejectLoadedAdForDuration(preloaded.adController);\n          await this.tryNextAvailableAdWithRateLimit();\n          return;\n        }\n        this.swapToPreloadedAdPlayer(preloaded.adController);\n        const ap = this.host.getAdPlayer();\n        await ap.play();\n        this.timing.markAdStarted();\n        if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n          this.timing.scheduleAdStopAtBreakBoundary();\n        }\n        ap.setAdVolume(getAdAudioVolume(ap));\n        this.timing.consecutiveFailures = 0;\n        return;\n      } catch (error) {\n        if (this.debug) {\n          console.warn(\"[CONTINUOUS-FETCH] Preloaded ad failed to play:\", error);\n        }\n      }\n    }\n    while (this.adRequestQueue.length > 0) {\n      const nextAdUrl = this.adRequestQueue.shift();\n      if (!nextAdUrl) continue;\n      if (this.timing.failedVastUrls.has(nextAdUrl)) {\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping permanently-failed URL, trying next...\");\n        continue;\n      }\n      if (this.timing.isUrlInCooldown(nextAdUrl)) {\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping URL in cooldown (recent no-fill), trying next...\");\n        continue;\n      }\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Requesting next ad via HLS ad player (${this.timing.currentAdIndex + 1}, ${this.adRequestQueue.length} remaining in queue)`);\n      }\n      try {\n        await this.playSingleAd(nextAdUrl);\n        this.timing.consecutiveFailures = 0;\n      } catch (error) {\n        const errorMessage = error.message;\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad request failed:\", errorMessage);\n        if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n          await this.tryNextAvailableAdWithRateLimit();\n          return;\n        }\n        if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n          this.timing.consecutiveFailures++;\n        }\n        await this.tryNextAvailableAdWithRateLimit();\n      }\n      return;\n    }\n    const maxRetries = 3;\n    if (this.continuousFetchingActive && retryCount < maxRetries && remaining > 2e3) {\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Queue empty, waiting for URLs... (${retryCount + 1}/${maxRetries})`);\n      }\n      await new Promise((resolve) => setTimeout(resolve, 500));\n      await this.tryNextAvailableAd(retryCount + 1);\n      return;\n    }\n    if (!this.isShowingPlaceholder && remaining > 1e3) {\n      this.showPlaceholderAndWaitForAds();\n    } else {\n      if (this.debug) console.log(\"[CONTINUOUS-FETCH] No more ads available, ending ad break\");\n      this.handleAdPodComplete();\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Single ad playback\n  // ───────────────────────────────────────────────────────────────\n  async playSingleAd(vastTagUrl) {\n    const adPlayer = this.host.getAdPlayer();\n    if (adPlayer.isAdPlaying()) return;\n    if (this.timing.failedVastUrls.has(vastTagUrl)) {\n      if (this.debug) console.warn(\"[AD-ERROR] Skipping permanently-failed VAST URL:\", vastTagUrl);\n      throw new Error(\"VAST URL permanently failed\");\n    }\n    if (this.timing.isUrlInCooldown(vastTagUrl)) {\n      if (this.debug) console.warn(\"[AD-ERROR] Skipping URL in cooldown (recent no-fill):\", vastTagUrl);\n      throw new Error(\"VAST URL in cooldown after no-fill\");\n    }\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) console.warn(\"[AD-ERROR] Too many consecutive failures, not requesting more ads\");\n      throw new Error(\"Too many consecutive failures\");\n    }\n    if (this.timing.isGamInCooldown()) {\n      if (this.debug) console.warn(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping ad request\");\n      throw new Error(\"GAM in cooldown\");\n    }\n    this.recreateAdController();\n    const requestToken = ++this.timing.adRequestTokenCounter;\n    this.timing.activeAdRequestToken = requestToken;\n    this.timing.startAdRequestWatchdog(requestToken);\n    try {\n      await this.timing.enforceGlobalRateLimit();\n      this.timing.lastAdRequestTime = Date.now();\n      const ap = this.host.getAdPlayer();\n      await ap.requestAds(vastTagUrl);\n      sendAdLoadedTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", vastUrl: vastTagUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() }\n      ).catch(() => {\n      });\n      this.timing.clearAdRequestWatchdog();\n      if (this.timing.activeAdRequestToken !== requestToken) return;\n      if (!this.timing.ensureLoadedAdFitsBudget(ap)) {\n        this.timing.rejectLoadedAdForDuration(ap);\n        this.recreateAdController();\n        throw new Error(\"ad_duration_exceeds_budget\");\n      }\n      try {\n        this.timing.startAdFailsafeTimer(requestToken);\n        await ap.play();\n        this.timing.markAdStarted();\n        if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n          this.timing.scheduleAdStopAtBreakBoundary();\n        }\n        ap.setAdVolume(getAdAudioVolume(ap));\n        this.timing.consecutiveFailures = 0;\n        this.timing.temporaryFailureUrls.delete(vastTagUrl);\n      } catch (playError) {\n        if (this.debug) console.error(\"[AD-ERROR] Failed to play ad:\", playError);\n        const preloadedFallback = this.preloadPool.getPreloadedAd();\n        if (preloadedFallback) {\n          if (this.debug) console.log(\"[AD-ERROR] Play failed, trying preloaded fallback ad\");\n          try {\n            if (!this.timing.ensureLoadedAdFitsBudget(preloadedFallback.adController)) {\n              this.timing.rejectLoadedAdForDuration(preloadedFallback.adController);\n              throw playError;\n            }\n            this.timing.clearAdFailsafeTimer();\n            this.swapToPreloadedAdPlayer(preloadedFallback.adController);\n            this.timing.consecutiveFailures = 0;\n            const fbAp = this.host.getAdPlayer();\n            await fbAp.play();\n            this.timing.markAdStarted();\n            if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n              this.timing.scheduleAdStopAtBreakBoundary();\n            }\n            fbAp.setAdVolume(getAdAudioVolume(fbAp));\n            return;\n          } catch (fallbackError) {\n            if (this.debug) console.warn(\"[AD-ERROR] Preloaded fallback also failed:\", fallbackError);\n          }\n        }\n        if (this.timing.isTemporaryAdError(playError)) {\n          this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n          if (this.debug) console.log(\"[AD-ERROR] Temporary play error - URL can be retried after cooldown\");\n        } else {\n          this.timing.failedVastUrls.add(vastTagUrl);\n          if (this.debug) console.log(\"[AD-ERROR] Permanent play error - URL blacklisted\");\n        }\n        this.timing.clearAdFailsafeTimer();\n        if (this.timing.activeAdRequestToken === requestToken) {\n          this.timing.activeAdRequestToken = null;\n        }\n        throw playError;\n      }\n    } catch (error) {\n      const errorMessage = error?.message || \"\";\n      if (this.debug) console.error(\"[AD-ERROR] Ad request failed:\", errorMessage);\n      const preloadedFallback = this.preloadPool.getPreloadedAd();\n      if (preloadedFallback) {\n        if (this.debug) console.log(\"[AD-ERROR] Request failed, trying preloaded fallback ad\");\n        try {\n          if (!this.timing.ensureLoadedAdFitsBudget(preloadedFallback.adController)) {\n            this.timing.rejectLoadedAdForDuration(preloadedFallback.adController);\n            throw error;\n          }\n          this.timing.clearAdRequestWatchdog();\n          this.timing.clearAdFailsafeTimer();\n          this.swapToPreloadedAdPlayer(preloadedFallback.adController);\n          this.timing.consecutiveFailures = 0;\n          const fbAp = this.host.getAdPlayer();\n          await fbAp.play();\n          this.timing.markAdStarted();\n          fbAp.setAdVolume(getAdAudioVolume(fbAp));\n          return;\n        } catch (fallbackError) {\n          if (this.debug) console.warn(\"[AD-ERROR] Preloaded fallback also failed:\", fallbackError);\n        }\n      }\n      if (this.timing.isTemporaryAdError(error)) {\n        this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n        if (this.debug) console.log(\"[AD-ERROR] Temporary error (no-fill/timeout) - URL can be retried after cooldown\");\n      } else {\n        this.timing.failedVastUrls.add(vastTagUrl);\n        if (this.debug) console.log(\"[AD-ERROR] Permanent error - URL blacklisted:\", errorMessage);\n      }\n      this.timing.clearAdRequestWatchdog();\n      this.timing.clearAdFailsafeTimer();\n      if (this.timing.activeAdRequestToken === requestToken) {\n        this.timing.activeAdRequestToken = null;\n      }\n      throw error;\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Placeholder wait\n  // ───────────────────────────────────────────────────────────────\n  async showPlaceholderAndWaitForAds() {\n    const remaining = this.timing.getRemainingAdMs();\n    const waitTime = Math.min(this.maxPlaceholderDurationMs, remaining);\n    if (this.timing.isGamInCooldown()) {\n      if (this.debug) console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping placeholder wait\");\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping placeholder - too many consecutive failures\");\n      this.handleAdPodComplete();\n      return;\n    }\n    if (waitTime < 1e3) {\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.debug) {\n      console.log(`[CONTINUOUS-FETCH] Showing placeholder for ${waitTime}ms while waiting for ad URLs`);\n    }\n    this.isShowingPlaceholder = true;\n    this.host.getAdPlayer().showPlaceholder();\n    const checkInterval = 300;\n    const maxChecks = Math.floor(waitTime / checkInterval);\n    for (let i = 0; i < maxChecks; i++) {\n      await new Promise((resolve) => setTimeout(resolve, checkInterval));\n      if (!this.inAdBreak) return;\n      if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Too many failures during placeholder wait\");\n        break;\n      }\n      if (!this.timing.hasTimeToStartAnotherAd()) {\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Not enough time remaining during placeholder wait, ending ad break\");\n        break;\n      }\n      while (this.adRequestQueue.length > 0) {\n        if (!this.timing.hasTimeToStartAnotherAd()) break;\n        const nextAdUrl = this.adRequestQueue.shift();\n        if (!nextAdUrl) continue;\n        if (this.timing.failedVastUrls.has(nextAdUrl)) continue;\n        if (this.timing.isUrlInCooldown(nextAdUrl)) continue;\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad URL available, requesting via HLS ad player\");\n        this.isShowingPlaceholder = false;\n        this.host.getAdPlayer().hidePlaceholder();\n        try {\n          await this.playSingleAd(nextAdUrl);\n          this.timing.consecutiveFailures = 0;\n        } catch (error) {\n          const errorMessage = error.message;\n          if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n            await this.tryNextAvailableAdWithRateLimit();\n            return;\n          }\n          if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n            this.timing.consecutiveFailures++;\n          }\n          await this.tryNextAvailableAdWithRateLimit();\n        }\n        return;\n      }\n    }\n    if (this.debug) console.log(\"[CONTINUOUS-FETCH] Placeholder timeout, ending ad break\");\n    this.isShowingPlaceholder = false;\n    this.host.getAdPlayer().hidePlaceholder();\n    this.handleAdPodComplete();\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Ad break completion\n  // ───────────────────────────────────────────────────────────────\n  handleAdPodComplete() {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Ad pod complete - cleaning up\");\n    }\n    this.timing.resetForBreakEnd();\n    this.stopContinuousFetching();\n    this.preloadPool.stop();\n    this.clearPendingAdBreak();\n    if (this.isShowingPlaceholder) {\n      this.host.getAdPlayer().hidePlaceholder();\n      this.isShowingPlaceholder = false;\n    }\n    this.adRequestQueue = [];\n    this.inAdBreak = false;\n    this.adDetectSentForCurrentBreak = false;\n    this.cueManager.activeScte35BreakKey = void 0;\n    this.cueManager.scheduledScte35BreakKey = void 0;\n    this.adPodQueue = [];\n    this.showAds = false;\n    this.host.getAdPlayer().stop().catch(() => {\n    });\n    const restoredMuted = this.host.getAdPlayer().getOriginalMutedState();\n    const restoredVolume = this.host.getAdPlayer().getOriginalVolume();\n    if (this.host.video.muted !== restoredMuted) {\n      this.host.video.muted = restoredMuted;\n    }\n    if (Math.abs(this.host.video.volume - restoredVolume) > 0.01) {\n      this.host.video.volume = restoredVolume;\n    }\n    if (this.host.shouldContinueLiveStreamDuringAds()) {\n      const liveSyncPos = this.host.getLiveSyncPosition();\n      if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {\n        if (this.debug) {\n          console.log(\n            `[StormcloudVideoPlayer] Live break end \\u2014 snapping to live edge: ${this.host.video.currentTime.toFixed(2)}s \\u2192 ${liveSyncPos.toFixed(2)}s`\n          );\n        }\n        this.host.video.currentTime = liveSyncPos;\n      }\n      if (this.host.video.paused) {\n        if (this.debug) console.log(\"[StormcloudVideoPlayer] Content video paused in live mode after ads, resuming playback\");\n        this.host.video.play()?.catch(() => {\n        });\n      } else {\n        if (this.debug) console.log(\"[StormcloudVideoPlayer] Content video already playing in live mode after ads\");\n      }\n    } else if (this.host.video.paused) {\n      this.host.video.play()?.catch(() => {\n      });\n    }\n  }\n  handleAdFailure() {\n    this.timing.consecutiveFailures++;\n    this.timing.recordGamNoFill();\n    const remaining = this.timing.getRemainingAdMs();\n    if (this.debug) {\n      console.log(\n        `[CONTINUOUS-FETCH] Ad failure: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}, consecutiveFailures=${this.timing.consecutiveFailures}`,\n        this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n      );\n    }\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) console.log(`[CONTINUOUS-FETCH] Max consecutive failures reached (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.timing.hasTimeToStartAnotherAd()) {\n      this.tryNextAvailableAdWithRateLimit();\n    } else {\n      if (this.debug) console.log(\"[AD-ERROR] Ad failed and not enough time remaining for another ad. Failed URLs:\", this.timing.failedVastUrls.size);\n      this.handleAdPodComplete();\n    }\n  }\n};\n\n// src/player/StormcloudVideoPlayer.ts\nvar StormcloudVideoPlayer = class {\n  constructor(config) {\n    this.attached = false;\n    this.palPlaybackStarted = false;\n    initializePolyfills();\n    const browserOverrides = getBrowserConfigOverrides();\n    this.config = { ...browserOverrides, ...config };\n    this.video = config.videoElement;\n    logBrowserInfo(config.debugAdTiming);\n    this.adPlayer = this.createAdPlayer(false);\n    this.palNonce = createPalNonceManager();\n    this.cueManager = new Scte35CueManager(!!this.config.debugAdTiming, {\n      onEarlyStartCue: (marker, fragmentSn, cueKey) => {\n        this.startAdPrefetch(marker, fragmentSn, cueKey);\n      },\n      onPlaybackCue: (marker, cueKey) => {\n        this.onScte35Marker(marker, cueKey);\n      },\n      isInAdBreak: () => this.adBreak.inAdBreak\n    });\n    this.adConfig = new AdConfigManager(this.config, this.video);\n    this.timing = new AdTimingService(this.config, this.video, {\n      onAdStopTimerFired: () => this.onAdStopTimerFired(),\n      onAdStartTimerFired: (marker, cueKey) => {\n        this.startScte35AdBreak(\n          marker,\n          cueKey,\n          marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.timing.expectedAdBreakDurationMs\n        );\n      },\n      onWatchdogTimeout: () => this.adBreak.handleAdFailure(),\n      onFailsafeTimeout: () => this.adBreak.handleAdFailure()\n    });\n    this.preloadPool = new AdPreloadPool({\n      debug: !!this.config.debugAdTiming,\n      createAdPlayer: (c) => this.createAdPlayer(c),\n      shouldContinueLiveStreamDuringAds: () => this.shouldContinueLiveStreamDuringAds(),\n      timing: this.timing,\n      generateVastUrlsWithCorrelators: (base, count) => this.generateVastUrls(base, count),\n      isInAdBreak: () => this.adBreak.inAdBreak,\n      getPendingAdBreak: () => this.adBreak.pendingAdBreak\n    });\n    this.placeholder = new PlaceholderLayer(this.video, !!this.config.debugAdTiming);\n    this.hlsEngine = new HlsEngine(this.config, this.video, this.cueManager, this.timing, {\n      onManifestParsed: async (isLive) => this.onManifestParsed(isLive),\n      onScte35Cue: (marker, context) => this.cueManager.onScte35Cue(marker, context),\n      activatePendingCuesForFragment: (frag) => this.cueManager.activatePendingScte35CuesForFragment(frag),\n      onFatalDestroy: () => this.destroy(),\n      isInAdBreak: () => this.adBreak.inAdBreak,\n      hasPendingAdBreak: () => this.adBreak.pendingAdBreak !== null\n    });\n    this.adBreak = new AdBreakOrchestrator(\n      {\n        config: this.config,\n        video: this.video,\n        getAdPlayer: () => this.adPlayer,\n        setAdPlayer: (p) => {\n          this.adPlayer = p;\n        },\n        createAdPlayer: (c) => this.createAdPlayer(c),\n        shouldContinueLiveStreamDuringAds: () => this.shouldContinueLiveStreamDuringAds(),\n        getLiveSyncPosition: () => this.hlsEngine.getLiveSyncPosition(),\n        generateVastUrls: (base, count) => this.generateVastUrls(base, count)\n      },\n      this.timing,\n      this.preloadPool,\n      this.adConfig,\n      this.cueManager,\n      this.placeholder\n    );\n  }\n  get debug() {\n    return !!this.config.debugAdTiming;\n  }\n  createAdPlayer(continueLiveStreamDuringAds) {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Creating HLS ad player\");\n    }\n    return createHlsAdPlayer(this.video, {\n      continueLiveStreamDuringAds,\n      ...this.config.licenseKey ? { licenseKey: this.config.licenseKey } : {},\n      ...this.hlsEngine?.hls ? { mainHlsInstance: this.hlsEngine.hls } : {}\n    });\n  }\n  generateVastUrls(baseUrl, count) {\n    return this.adConfig.generateVastUrlsWithCorrelators(\n      baseUrl,\n      count,\n      this.adPlayer,\n      this.palNonce,\n      this.adBreak.inAdBreak\n    );\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Lifecycle\n  // ───────────────────────────────────────────────────────────────\n  async load() {\n    if (!this.attached) {\n      this.attach();\n    }\n    try {\n      await this.adConfig.fetchAdConfiguration();\n    } catch (error) {\n      if (this.debug) {\n        console.warn(\n          \"[StormcloudVideoPlayer] Failed to fetch ad configuration:\",\n          error\n        );\n      }\n    }\n    this.palNonce.generateNonce({\n      videoWidth: this.video.offsetWidth || this.video.clientWidth || 640,\n      videoHeight: this.video.offsetHeight || this.video.clientHeight || 480,\n      adWillAutoPlay: !!this.config.autoplay,\n      adWillPlayMuted: true,\n      playerVolume: 0,\n      continuousPlayback: this.config.lowLatencyMode ?? false\n    }).catch(() => {\n    });\n    fetchConsentSignals().then((signals) => {\n      this.adConfig.consentSignals = signals;\n    }).catch(() => {\n    });\n    this.adConfig.initializeTracking();\n    if (this.hlsEngine.shouldUseNativeHls(() => this.getStreamType())) {\n      await this.hlsEngine.setupNativeHls();\n      const continueLiveStreamDuringAds = this.shouldContinueLiveStreamDuringAds();\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Native HLS ad behavior:\", {\n          isLive: this.hlsEngine.isLiveStream,\n          continueLiveStreamDuringAds\n        });\n      }\n      this.adPlayer.destroy();\n      this.adPlayer = this.createAdPlayer(continueLiveStreamDuringAds);\n      this.adPlayer.initialize();\n      return;\n    }\n    this.hlsEngine.setupHls();\n  }\n  async onManifestParsed(isLive) {\n    if (!this.adConfig.isVmapEnabled() && !isLive && this.adConfig.vmapBreaks.length === 0 && this.adConfig.apiVastTagUrl) {\n      const prerollKey = \"synthetic-vod-preroll\";\n      if (!this.adConfig.consumedVmapBreakIds.has(prerollKey)) {\n        this.adConfig.vmapBreaks = [\n          { id: prerollKey, startTimeMs: 0, vastTagUrl: this.adConfig.apiVastTagUrl }\n        ];\n        if (this.debug) {\n          console.log(\n            \"[StormcloudVideoPlayer] Injected synthetic VOD preroll from apiVastTagUrl\"\n          );\n        }\n      }\n    }\n    if (this.debug) {\n      const adBehavior = this.shouldContinueLiveStreamDuringAds() ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n      console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n        isLive,\n        allowNativeHls: this.config.allowNativeHls,\n        adBehavior\n      });\n    }\n    this.adPlayer.destroy();\n    this.adPlayer = this.createAdPlayer(this.shouldContinueLiveStreamDuringAds());\n    this.adPlayer.initialize();\n  }\n  attach() {\n    if (this.attached) return;\n    this.attached = true;\n    this.video.autoplay = !!this.config.autoplay;\n    this.video.muted = !!this.config.muted;\n    this.adPlayer.initialize();\n    this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n    this.adBreak.attachImaEventListeners();\n    this.video.addEventListener(\"play\", () => {\n      if (!this.palPlaybackStarted && !this.adPlayer.isAdPlaying()) {\n        this.palPlaybackStarted = true;\n        this.palNonce.sendPlaybackStart();\n      }\n    });\n    this.endedHandler = () => {\n      if (this.palPlaybackStarted) {\n        this.palPlaybackStarted = false;\n        this.palNonce.sendPlaybackEnd();\n      }\n      this.onVideoEnded();\n    };\n    this.video.addEventListener(\"ended\", this.endedHandler);\n    this.video.addEventListener(\"mousedown\", (e) => {\n      this.palNonce.sendAdTouch(e);\n    });\n    this.video.addEventListener(\"touchstart\", (e) => {\n      this.palNonce.sendAdTouch(e);\n    });\n    this.timeUpdateHandler = () => {\n      this.onTimeUpdate(this.video.currentTime);\n    };\n    this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n    this.emptiedHandler = () => {\n      if (this.hlsEngine.nativeHlsMode && this.hlsEngine.videoSrcProtection && !this.adPlayer.isAdPlaying()) {\n        if (this.debug) {\n          console.log(\n            \"[StormcloudVideoPlayer] Video src was cleared, restoring:\",\n            this.hlsEngine.videoSrcProtection\n          );\n        }\n        const currentTime = this.video.currentTime;\n        const wasPaused = this.video.paused;\n        this.video.src = this.hlsEngine.videoSrcProtection;\n        this.video.currentTime = currentTime;\n        if (!wasPaused) {\n          this.video.play().catch(() => {\n          });\n        }\n      }\n    };\n    this.video.addEventListener(\"emptied\", this.emptiedHandler);\n  }\n  shouldContinueLiveStreamDuringAds() {\n    if (this.hlsEngine.isLiveStream) {\n      return true;\n    }\n    const duration = this.video.duration;\n    if (!Number.isFinite(duration) || duration === Infinity) {\n      return true;\n    }\n    return false;\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  SCTE-35 marker orchestration\n  // ───────────────────────────────────────────────────────────────\n  onScte35Marker(marker, cueKey) {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] SCTE-35 marker detected:\", {\n        type: marker.type,\n        ptsSeconds: marker.ptsSeconds,\n        durationSeconds: marker.durationSeconds,\n        currentTime: this.video.currentTime,\n        raw: marker.raw,\n        hasPendingAdBreak: !!this.adBreak.pendingAdBreak\n      });\n    }\n    if (marker.type === \"start\") {\n      if (this.adBreak.inAdBreak) {\n        if (marker.durationSeconds != null) {\n          const newDurationMs = marker.durationSeconds * 1e3;\n          if (this.timing.expectedAdBreakDurationMs == null || newDurationMs > this.timing.expectedAdBreakDurationMs) {\n            this.timing.setAdBreakDurationBoundary(newDurationMs);\n            this.timing.scheduleAdStopAtBreakBoundary();\n            if (this.debug) {\n              console.log(\n                `[StormcloudVideoPlayer] Updated ad break duration from subsequent marker: ${newDurationMs}ms, remaining: ${this.timing.getWallClockRemainingAdMs()}ms`\n              );\n            }\n          }\n        }\n        return;\n      }\n      if (!this.adBreak.adDetectSentForCurrentBreak) {\n        this.adBreak.adDetectSentForCurrentBreak = true;\n        const detectPayload = {};\n        if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n        if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n        sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }).catch(() => {\n        });\n      }\n      const hasPrefetchedAds = this.adBreak.pendingAdBreak && this.adBreak.pendingAdBreak.vastUrls.length > 0;\n      const durationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.adBreak.pendingAdBreak?.marker.durationSeconds != null ? this.adBreak.pendingAdBreak.marker.durationSeconds * 1e3 : void 0;\n      const isManifest = isManifestBasedMarker(marker);\n      const forceImmediate = this.config.immediateManifestAds ?? true;\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ad start decision:\", {\n          isManifestMarker: isManifest,\n          forceImmediate,\n          hasPts: typeof marker.ptsSeconds === \"number\",\n          hasPrefetchedAds\n        });\n      }\n      if (isManifest && forceImmediate) {\n        if (this.debug) {\n          console.log(\n            `[StormcloudVideoPlayer] Starting ad immediately (manifest-based)${hasPrefetchedAds ? \" with prefetched ads\" : \"\"}`\n          );\n        }\n        this.timing.clearAdStartTimer();\n        this.startScte35AdBreak(marker, cueKey, durationMs);\n      } else if (typeof marker.ptsSeconds === \"number\") {\n        const tol = this.config.driftToleranceMs ?? 1e3;\n        const nowMs = this.video.currentTime * 1e3;\n        const estCurrentPtsMs = nowMs - this.timing.ptsDriftEmaMs;\n        const deltaMs = Math.floor(marker.ptsSeconds * 1e3 - estCurrentPtsMs);\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] PTS-based timing calculation:\", {\n            nowMs,\n            estCurrentPtsMs,\n            markerPtsMs: marker.ptsSeconds * 1e3,\n            deltaMs,\n            tolerance: tol\n          });\n        }\n        if (deltaMs > tol) {\n          if (this.debug) {\n            console.log(`[StormcloudVideoPlayer] Scheduling ad start in ${deltaMs}ms`);\n          }\n          this.timing.expectedAdBreakDurationMs = durationMs;\n          this.cueManager.scheduledScte35BreakKey = cueKey;\n          this.timing.scheduleAdStartIn(deltaMs, marker, cueKey);\n        } else {\n          if (this.debug) {\n            console.log(\"[StormcloudVideoPlayer] Starting ad immediately (within tolerance)\");\n          }\n          this.timing.clearAdStartTimer();\n          this.startScte35AdBreak(marker, cueKey, durationMs);\n        }\n      } else {\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Starting ad immediately (fallback)\");\n        }\n        this.timing.clearAdStartTimer();\n        this.startScte35AdBreak(marker, cueKey, durationMs);\n      }\n      return;\n    }\n    if (marker.type === \"progress\" && this.adBreak.inAdBreak) {\n      if (marker.durationSeconds != null) {\n        this.timing.setAdBreakDurationBoundary(marker.durationSeconds * 1e3);\n      }\n      this.timing.scheduleAdStopAtBreakBoundary();\n      if (!this.adPlayer.isAdPlaying() && this.timing.activeAdRequestToken === null && this.adBreak.adRequestQueue.length > 0 && this.timing.hasTimeToStartAnotherAd()) {\n        this.adBreak.tryNextAvailableAdWithRateLimit();\n      }\n      return;\n    }\n    if (marker.type === \"end\") {\n      if (!this.video.muted) {\n        this.video.muted = true;\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Muted video on SCTE end marker\");\n        }\n      }\n      const remaining = this.timing.getRemainingAdMs();\n      const adPlaying = this.adPlayer.isAdPlaying();\n      const hasQueuedAds = this.adBreak.adRequestQueue.length > 0;\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] SCTE-35 end marker received:\", {\n          remaining,\n          adPlaying,\n          hasQueuedAds,\n          activeAdRequest: this.timing.activeAdRequestToken !== null\n        });\n      }\n      this.timing.scteAdBreakEndWallClockMs = Date.now();\n      this.timing.clearAdStartTimer();\n      this.timing.clearAdStopTimer();\n      if (adPlaying) {\n        this.adPlayer.stop().catch(() => {\n        });\n      }\n      this.adBreak.handleAdPodComplete();\n      return;\n    }\n  }\n  startScte35AdBreak(marker, cueKey, durationMs) {\n    this.adBreak.inAdBreak = true;\n    this.cueManager.activeScte35BreakKey = cueKey ?? this.cueManager.pendingScte35CueKey;\n    this.cueManager.scheduledScte35BreakKey = void 0;\n    this.timing.currentAdBreakStartWallClockMs = this.timing.resolveScteBreakStartWallClockMs(marker);\n    this.timing.setAdBreakDurationBoundary(durationMs);\n    this.adBreak.handleAdStart(marker);\n    this.timing.scheduleAdStopAtBreakBoundary();\n  }\n  onAdStopTimerFired() {\n    if (!this.adBreak.inAdBreak) return;\n    const adPlaying = this.adPlayer.isAdPlaying();\n    const checkIntervalMs = Math.max(\n      250,\n      Math.floor(this.config.adBreakCheckIntervalMs ?? 1e3)\n    );\n    const maxExtensionMsConfig = this.config.maxAdBreakExtensionMs;\n    const maxExtensionMs = typeof maxExtensionMsConfig === \"number\" && maxExtensionMsConfig > 0 ? maxExtensionMsConfig : 0;\n    const endWallClockMs = this.timing.getAdBreakEndWallClockMs() ?? Date.now();\n    const overrunMs = Math.max(0, Date.now() - endWallClockMs);\n    const shouldExtendAdBreak = adPlaying && overrunMs < maxExtensionMs;\n    if (shouldExtendAdBreak) {\n      this.timing.scheduleAdStopCountdown(checkIntervalMs);\n      return;\n    }\n    if (this.debug) {\n      console.log(\n        `[StormcloudVideoPlayer] Ad break boundary reached (overrun=${overrunMs}ms) - hard-stopping ads and resuming stream`\n      );\n    }\n    if (adPlaying) {\n      this.adPlayer.stop().catch(() => {\n      });\n    }\n    this.adBreak.handleAdPodComplete();\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Ad prefetch\n  // ───────────────────────────────────────────────────────────────\n  startAdPrefetch(marker, fragmentSn, cueKey) {\n    if (this.adBreak.pendingAdBreak || this.adBreak.inAdBreak) return;\n    const scheduled = this.adConfig.findCurrentOrNextBreak(this.video.currentTime * 1e3);\n    const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n    let baseVastUrl;\n    if (tags && tags.length > 0 && tags[0]) {\n      baseVastUrl = tags[0];\n    } else if (this.adConfig.apiVastTagUrl) {\n      baseVastUrl = this.adConfig.apiVastTagUrl;\n    } else {\n      if (this.debug) console.warn(\"[StormcloudVideoPlayer] No VAST URL available for prefetch\");\n      return;\n    }\n    this.adConfig.beginNewAdPod();\n    this.adConfig.podAssignedByPrefetch = true;\n    const generatedUrls = this.generateVastUrls(baseVastUrl, 1);\n    this.adBreak.pendingAdBreak = {\n      marker,\n      ...fragmentSn !== void 0 ? { detectedAtFragmentSn: fragmentSn } : {},\n      vastUrls: generatedUrls,\n      isFetching: false,\n      fetchStartTime: Date.now()\n    };\n    this.cueManager.pendingScte35CueKey = cueKey;\n    this.adBreak.adDetectSentForCurrentBreak = true;\n    const detectPayload = {};\n    if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n    if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n    if (fragmentSn !== void 0) detectPayload.detectedAtFragmentSn = fragmentSn;\n    sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }).catch(() => {\n    });\n    if (this.debug) {\n      console.log(\"[PREFETCH] Starting ad prefetch for upcoming ad break\");\n      console.log(`[PREFETCH] Pre-generated ${generatedUrls.length} VAST URLs`);\n    }\n    this.preloadPool.startPreloadPool(baseVastUrl, generatedUrls.slice(0, 1), false);\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  VMAP time-based ad breaks\n  // ───────────────────────────────────────────────────────────────\n  onTimeUpdate(currentTimeSec) {\n    if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n    if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n    const nowMs = currentTimeSec * 1e3;\n    const breakToPlay = this.adConfig.findBreakForTime(nowMs);\n    if (breakToPlay) {\n      void this.handleVmapAdBreak(breakToPlay, nowMs).catch((error) => {\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP ad break failed gracefully:\", error);\n        }\n      });\n    }\n  }\n  onVideoEnded() {\n    if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n    if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n    const durationMs = Number.isFinite(this.video.duration) ? Math.floor(this.video.duration * 1e3) : 0;\n    const postroll = this.adConfig.vmapBreaks.find(\n      (b) => b.startTimeMs === -1 && !this.adConfig.consumedVmapBreakIds.has(this.adConfig.getAdBreakKey(b))\n    );\n    if (postroll) {\n      void this.handleVmapAdBreak(postroll, durationMs).catch((error) => {\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP post-roll failed gracefully:\", error);\n        }\n      });\n    }\n  }\n  async handleVmapAdBreak(adBreak, nowMs) {\n    const key = this.adConfig.getAdBreakKey(adBreak);\n    if (this.adConfig.consumedVmapBreakIds.has(key)) return;\n    const breakStartMs = this.adConfig.resolveBreakStartMs(adBreak);\n    if (breakStartMs == null) return;\n    const durationMs = adBreak.durationMs ?? 0;\n    const endMs = breakStartMs + durationMs;\n    const inWindow = durationMs > 0 ? nowMs >= breakStartMs && nowMs < endMs : nowMs >= breakStartMs;\n    if (inWindow) {\n      this.adConfig.consumedVmapBreakIds.add(key);\n      const tags = this.adConfig.selectVastTagsForBreak(adBreak);\n      if (!tags || tags.length === 0) return;\n      const first = tags[0];\n      const rest = tags.slice(1);\n      this.adBreak.adPodQueue = rest;\n      this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n      this.adBreak.showAds = true;\n      this.adBreak.inAdBreak = true;\n      this.timing.currentAdBreakStartWallClockMs = Date.now();\n      try {\n        await this.adBreak.playSingleAd(first);\n      } catch (error) {\n        this.adBreak.adPodQueue = [];\n        this.adBreak.inAdBreak = false;\n        this.adBreak.showAds = false;\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP ad request failed:\", error);\n        }\n      }\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Public API\n  // ───────────────────────────────────────────────────────────────\n  getCurrentAdIndex() {\n    return this.timing.currentAdIndex;\n  }\n  getTotalAdsInBreak() {\n    return this.timing.totalAdsInBreak;\n  }\n  getAdRemainingMs() {\n    return this.timing.getRemainingAdMs();\n  }\n  isAdPlaying() {\n    return this.adBreak.inAdBreak && this.adPlayer.isAdPlaying();\n  }\n  isShowingAds() {\n    return this.adBreak.showAds;\n  }\n  getStreamType() {\n    const url = this.config.src.toLowerCase();\n    if (url.includes(\".m3u8\") || url.includes(\"/hls/\") || url.includes(\"application/vnd.apple.mpegurl\")) {\n      return \"hls\";\n    }\n    return \"other\";\n  }\n  shouldShowNativeControls() {\n    const streamType = this.getStreamType();\n    if (streamType === \"other\") {\n      return !(this.config.showCustomControls ?? false);\n    }\n    return !!(this.config.allowNativeHls && !(this.config.showCustomControls ?? false));\n  }\n  isLive() {\n    return this.hlsEngine.isLiveStream;\n  }\n  get videoElement() {\n    return this.video;\n  }\n  toggleMute() {\n    toggleMute(this.video, this.adPlayer, this.debug);\n  }\n  toggleFullscreen() {\n    return toggleFullscreen(this.video, this.debug);\n  }\n  isMuted() {\n    return isMuted(this.video, this.adPlayer);\n  }\n  setMuted(muted) {\n    setMuted(this.video, this.adPlayer, muted, this.debug);\n  }\n  setVolume(volume) {\n    setVolume(this.video, this.adPlayer, volume, this.debug);\n  }\n  getVolume() {\n    return getVolume(this.video, this.adPlayer);\n  }\n  isFullscreen() {\n    return isFullscreen();\n  }\n  resize() {\n    resizePlayer(this.video, this.adPlayer, this.debug);\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Destroy\n  // ───────────────────────────────────────────────────────────────\n  destroy() {\n    this.adBreak.stopContinuousFetching();\n    this.preloadPool.stop();\n    this.timing.destroy();\n    this.adBreak.clearPendingAdBreak();\n    this.placeholder.destroy();\n    if (this.timeUpdateHandler) {\n      this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n      delete this.timeUpdateHandler;\n    }\n    if (this.endedHandler) {\n      this.video.removeEventListener(\"ended\", this.endedHandler);\n      delete this.endedHandler;\n    }\n    if (this.emptiedHandler) {\n      this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n      delete this.emptiedHandler;\n    }\n    this.adConfig.destroyTracking();\n    this.hlsEngine.destroy();\n    this.adPlayer?.destroy();\n    if (this.palPlaybackStarted) {\n      this.palPlaybackStarted = false;\n      this.palNonce.sendPlaybackEnd();\n    }\n    this.palNonce.reset();\n    this.adBreak.adRequestQueue = [];\n    this.timing.consecutiveFailures = 0;\n  }\n};\n\n// src/patterns.ts\nvar HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nvar HLS_PATHS = /\\/hls\\//i;\nvar DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nvar VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nvar AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\nvar canPlay = {\n  hls: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n  },\n  dash: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return DASH_EXTENSIONS.test(url);\n  },\n  video: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return VIDEO_EXTENSIONS.test(url);\n  },\n  audio: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return AUDIO_EXTENSIONS.test(url);\n  },\n  file: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n  }\n};\n\n// src/players/HlsPlayer.tsx\nvar HlsPlayer = class extends import_react.Component {\n  constructor() {\n    super(...arguments);\n    this.player = null;\n    this.mounted = false;\n    this.load = async () => {\n      if (!this.props.videoElement || !this.props.src) return;\n      try {\n        if (this.player) {\n          this.player.destroy();\n          this.player = null;\n        }\n        const config = {\n          src: this.props.src,\n          videoElement: this.props.videoElement\n        };\n        if (this.props.autoplay !== void 0)\n          config.autoplay = this.props.autoplay;\n        if (this.props.muted !== void 0) config.muted = this.props.muted;\n        if (this.props.lowLatencyMode !== void 0)\n          config.lowLatencyMode = this.props.lowLatencyMode;\n        if (this.props.allowNativeHls !== void 0)\n          config.allowNativeHls = this.props.allowNativeHls;\n        if (this.props.isLiveStream !== void 0)\n          config.isLiveStream = this.props.isLiveStream;\n        if (this.props.driftToleranceMs !== void 0)\n          config.driftToleranceMs = this.props.driftToleranceMs;\n        if (this.props.immediateManifestAds !== void 0)\n          config.immediateManifestAds = this.props.immediateManifestAds;\n        if (this.props.debugAdTiming !== void 0)\n          config.debugAdTiming = this.props.debugAdTiming;\n        if (this.props.showCustomControls !== void 0)\n          config.showCustomControls = this.props.showCustomControls;\n        if (this.props.onVolumeToggle !== void 0)\n          config.onVolumeToggle = this.props.onVolumeToggle;\n        if (this.props.onFullscreenToggle !== void 0)\n          config.onFullscreenToggle = this.props.onFullscreenToggle;\n        if (this.props.onControlClick !== void 0)\n          config.onControlClick = this.props.onControlClick;\n        if (this.props.licenseKey !== void 0)\n          config.licenseKey = this.props.licenseKey;\n        if (this.props.adFailsafeTimeoutMs !== void 0)\n          config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n        if (this.props.minSegmentsBeforePlay !== void 0)\n          config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n        if (this.props.ctvAdRequest !== void 0)\n          config.ctvAdRequest = this.props.ctvAdRequest;\n        this.player = new StormcloudVideoPlayer(config);\n        this.props.onMount?.(this);\n        await this.player.load();\n        if (this.mounted) {\n          this.props.onReady?.();\n        }\n      } catch (error) {\n        if (this.mounted) {\n          this.props.onError?.(error);\n        }\n      }\n    };\n    this.play = () => {\n      if (this.props.videoElement) {\n        const video = this.props.videoElement;\n        const hasValidSource = video.src || video.currentSrc && video.currentSrc !== \"\" || video.readyState >= 1;\n        if (hasValidSource) {\n          video.play()?.catch((error) => {\n            console.error(\"[HlsPlayer] Failed to play:\", error);\n            this.props.onError?.(error);\n          });\n          this.props.onPlay?.();\n        } else {\n          console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n        }\n      }\n    };\n    this.pause = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.pause();\n        this.props.onPause?.();\n      }\n    };\n    this.stop = () => {\n      this.pause();\n      if (this.props.videoElement) {\n        this.props.videoElement.currentTime = 0;\n      }\n    };\n    this.seekTo = (seconds, keepPlaying) => {\n      if (this.props.videoElement) {\n        this.props.videoElement.currentTime = seconds;\n        if (!keepPlaying) {\n          this.pause();\n        }\n      }\n    };\n    this.setVolume = (volume) => {\n      if (this.props.videoElement) {\n        this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n      }\n    };\n    this.mute = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.muted = true;\n      }\n    };\n    this.unmute = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.muted = false;\n      }\n    };\n    this.setPlaybackRate = (rate) => {\n      if (this.props.videoElement && rate > 0) {\n        this.props.videoElement.playbackRate = rate;\n      }\n    };\n    this.getDuration = () => {\n      if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n        return this.props.videoElement.duration;\n      }\n      return null;\n    };\n    this.getCurrentTime = () => {\n      if (this.props.videoElement && isFinite(this.props.videoElement.currentTime)) {\n        return this.props.videoElement.currentTime;\n      }\n      return null;\n    };\n    this.getSecondsLoaded = () => {\n      if (this.props.videoElement && this.props.videoElement.buffered.length > 0) {\n        return this.props.videoElement.buffered.end(\n          this.props.videoElement.buffered.length - 1\n        );\n      }\n      return null;\n    };\n    this.getInternalPlayer = (key = \"player\") => {\n      if (key === \"player\") return this.player;\n      if (key === \"video\") return this.props.videoElement;\n      if (key === \"hls\" && this.player) return this.player.hls;\n      return null;\n    };\n  }\n  componentDidMount() {\n    this.mounted = true;\n    this.load();\n  }\n  componentWillUnmount() {\n    this.mounted = false;\n    if (this.player) {\n      this.player.destroy();\n      this.player = null;\n    }\n  }\n  componentDidUpdate(prevProps) {\n    if (prevProps.src !== this.props.src) {\n      this.load();\n    }\n  }\n  render() {\n    return null;\n  }\n};\nHlsPlayer.displayName = \"HlsPlayer\";\nHlsPlayer.canPlay = canPlay.hls;\n","import { Component } from \"react\";\nimport { StormcloudVideoPlayer } from \"../player/StormcloudVideoPlayer\";\nimport type { StormcloudVideoPlayerConfig } from \"../types\";\nimport { canPlay } from \"../patterns\";\n\nexport interface HlsPlayerProps extends StormcloudVideoPlayerConfig {\n  onMount?: (player: any) => void;\n  onReady?: () => void;\n  onPlay?: () => void;\n  onPause?: () => void;\n  onEnded?: () => void;\n  onLoaded?: () => void;\n  onError?: (error: any) => void;\n}\n\nexport default class HlsPlayer extends Component<HlsPlayerProps> {\n  static displayName = \"HlsPlayer\";\n\n  static canPlay = canPlay.hls;\n\n  private player: StormcloudVideoPlayer | null = null;\n  private mounted = false;\n\n  componentDidMount() {\n    this.mounted = true;\n    this.load();\n  }\n\n  componentWillUnmount() {\n    this.mounted = false;\n    if (this.player) {\n      this.player.destroy();\n      this.player = null;\n    }\n  }\n\n  componentDidUpdate(prevProps: HlsPlayerProps) {\n    if (prevProps.src !== this.props.src) {\n      this.load();\n    }\n  }\n\n  load = async () => {\n    if (!this.props.videoElement || !this.props.src) return;\n\n    try {\n      if (this.player) {\n        this.player.destroy();\n        this.player = null;\n      }\n\n      const config: StormcloudVideoPlayerConfig = {\n        src: this.props.src,\n        videoElement: this.props.videoElement,\n      };\n\n      if (this.props.autoplay !== undefined)\n        config.autoplay = this.props.autoplay;\n      if (this.props.muted !== undefined) config.muted = this.props.muted;\n      if (this.props.lowLatencyMode !== undefined)\n        config.lowLatencyMode = this.props.lowLatencyMode;\n      if (this.props.allowNativeHls !== undefined)\n        config.allowNativeHls = this.props.allowNativeHls;\n      if (this.props.isLiveStream !== undefined)\n        config.isLiveStream = this.props.isLiveStream;\n      if (this.props.driftToleranceMs !== undefined)\n        config.driftToleranceMs = this.props.driftToleranceMs;\n      if (this.props.immediateManifestAds !== undefined)\n        config.immediateManifestAds = this.props.immediateManifestAds;\n      if (this.props.debugAdTiming !== undefined)\n        config.debugAdTiming = this.props.debugAdTiming;\n      if (this.props.showCustomControls !== undefined)\n        config.showCustomControls = this.props.showCustomControls;\n      if (this.props.onVolumeToggle !== undefined)\n        config.onVolumeToggle = this.props.onVolumeToggle;\n      if (this.props.onFullscreenToggle !== undefined)\n        config.onFullscreenToggle = this.props.onFullscreenToggle;\n      if (this.props.onControlClick !== undefined)\n        config.onControlClick = this.props.onControlClick;\n      if (this.props.licenseKey !== undefined)\n        config.licenseKey = this.props.licenseKey;\n      if (this.props.adFailsafeTimeoutMs !== undefined)\n        config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n      if (this.props.minSegmentsBeforePlay !== undefined)\n        config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n      if (this.props.ctvAdRequest !== undefined)\n        config.ctvAdRequest = this.props.ctvAdRequest;\n\n      this.player = new StormcloudVideoPlayer(config);\n\n      this.props.onMount?.(this);\n\n      await this.player.load();\n\n      if (this.mounted) {\n        this.props.onReady?.();\n      }\n    } catch (error) {\n      if (this.mounted) {\n        this.props.onError?.(error);\n      }\n    }\n  };\n\n  play = () => {\n    if (this.props.videoElement) {\n      const video = this.props.videoElement;\n      const hasValidSource =\n        video.src ||\n        (video.currentSrc && video.currentSrc !== \"\") ||\n        video.readyState >= 1;\n\n      if (hasValidSource) {\n        video.play()?.catch((error) => {\n          console.error(\"[HlsPlayer] Failed to play:\", error);\n          this.props.onError?.(error);\n        });\n        this.props.onPlay?.();\n      } else {\n        console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n      }\n    }\n  };\n\n  pause = () => {\n    if (this.props.videoElement) {\n      this.props.videoElement.pause();\n      this.props.onPause?.();\n    }\n  };\n\n  stop = () => {\n    this.pause();\n    if (this.props.videoElement) {\n      this.props.videoElement.currentTime = 0;\n    }\n  };\n\n  seekTo = (seconds: number, keepPlaying?: boolean) => {\n    if (this.props.videoElement) {\n      this.props.videoElement.currentTime = seconds;\n      if (!keepPlaying) {\n        this.pause();\n      }\n    }\n  };\n\n  setVolume = (volume: number) => {\n    if (this.props.videoElement) {\n      this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n    }\n  };\n\n  mute = () => {\n    if (this.props.videoElement) {\n      this.props.videoElement.muted = true;\n    }\n  };\n\n  unmute = () => {\n    if (this.props.videoElement) {\n      this.props.videoElement.muted = false;\n    }\n  };\n\n  setPlaybackRate = (rate: number) => {\n    if (this.props.videoElement && rate > 0) {\n      this.props.videoElement.playbackRate = rate;\n    }\n  };\n\n  getDuration = (): number | null => {\n    if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n      return this.props.videoElement.duration;\n    }\n    return null;\n  };\n\n  getCurrentTime = (): number | null => {\n    if (\n      this.props.videoElement &&\n      isFinite(this.props.videoElement.currentTime)\n    ) {\n      return this.props.videoElement.currentTime;\n    }\n    return null;\n  };\n\n  getSecondsLoaded = (): number | null => {\n    if (\n      this.props.videoElement &&\n      this.props.videoElement.buffered.length > 0\n    ) {\n      return this.props.videoElement.buffered.end(\n        this.props.videoElement.buffered.length - 1\n      );\n    }\n    return null;\n  };\n\n  getInternalPlayer = (key = \"player\") => {\n    if (key === \"player\") return this.player;\n    if (key === \"video\") return this.props.videoElement;\n    if (key === \"hls\" && this.player) return (this.player as any).hls;\n    return null;\n  };\n\n  render() {\n    return null;\n  }\n}\n","import type { AdController } from \"../types\";\nimport Hls from \"hls.js\";\n\ninterface VastMediaFile {\n  url: string;\n  type: string;\n  width: number;\n  height: number;\n  bitrate?: number | undefined;\n}\n\ninterface VastTrackingUrls {\n  impression: string[];\n  start: string[];\n  firstQuartile: string[];\n  midpoint: string[];\n  thirdQuartile: string[];\n  complete: string[];\n  mute: string[];\n  unmute: string[];\n  pause: string[];\n  resume: string[];\n  fullscreen: string[];\n  exitFullscreen: string[];\n  skip: string[];\n  error: string[];\n}\n\ninterface VastAd {\n  id: string;\n  title: string;\n  duration: number;\n  mediaFiles: VastMediaFile[];\n  trackingUrls: VastTrackingUrls;\n  clickThrough?: string | undefined;\n}\n\ntype VastParseResult =\n  | { type: \"inline\"; ad: VastAd }\n  | {\n      type: \"wrapper\";\n      vastAdTagUri: string;\n      trackingUrls: VastTrackingUrls;\n      clickThrough?: string | undefined;\n    }\n  | { type: \"empty\" };\n\nconst MAX_VAST_WRAPPER_DEPTH = 5;\n\nexport function createHlsAdPlayer(\n  contentVideo: HTMLVideoElement,\n  options?: {\n    continueLiveStreamDuringAds?: boolean;\n    licenseKey?: string;\n    mainHlsInstance?: Hls;\n  }\n): AdController {\n  let adPlaying = false;\n  let originalMutedState = false;\n  let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n  const listeners = new Map<string, Set<(payload?: any) => void>>();\n  const licenseKey = options?.licenseKey;\n  const mainHlsInstance = options?.mainHlsInstance;\n\n  let adVideoElement: HTMLVideoElement | undefined;\n  let adHls: Hls | undefined;\n  let adContainerEl: HTMLDivElement | undefined;\n  let currentAd: VastAd | undefined;\n  let sessionId: string | undefined;\n  const preloadedAds = new Map<string, VastAd>();\n  const preloadingAds = new Map<string, Promise<void>>();\n  let destroyed = false;\n  let pendingTimeouts: number[] = [];\n\n  let trackingFired = {\n    impression: false,\n    start: false,\n    firstQuartile: false,\n    midpoint: false,\n    thirdQuartile: false,\n    complete: false,\n  };\n\n  function emit(event: string, payload?: any): void {\n    const set = listeners.get(event);\n    if (!set) return;\n    for (const fn of Array.from(set)) {\n      try {\n        fn(payload);\n      } catch (error) {\n        console.warn(\n          `[HlsAdPlayer] Error in event listener for ${event}:`,\n          error\n        );\n      }\n    }\n  }\n\n  function generateSessionId(): string {\n    return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n\n  function fireTrackingPixels(urls: string[]): void {\n    if (!urls || urls.length === 0) return;\n\n    urls.forEach((url) => {\n      try {\n        let trackingUrl = url;\n\n        if (sessionId) {\n          trackingUrl = `${trackingUrl}${\n            trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n          }session_id=${sessionId}`;\n        }\n\n        if (licenseKey) {\n          trackingUrl = `${trackingUrl}${\n            trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n          }license_key=${licenseKey}`;\n        }\n\n        const img = new Image(1, 1);\n        img.src = trackingUrl;\n        console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n      } catch (error) {\n        console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n      }\n    });\n  }\n\n  function getMainStreamQuality(): {\n    width: number;\n    height: number;\n    bitrate: number;\n  } | null {\n    if (!mainHlsInstance || !mainHlsInstance.levels) {\n      return null;\n    }\n\n    const currentLevel = mainHlsInstance.currentLevel;\n    if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n      const autoLevel = mainHlsInstance.loadLevel;\n      if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n        const level = mainHlsInstance.levels[autoLevel];\n        return {\n          width: level.width || 1920,\n          height: level.height || 1080,\n          bitrate: level.bitrate || 5000000,\n        };\n      }\n      return null;\n    }\n\n    const level = mainHlsInstance.levels[currentLevel];\n    return {\n      width: level.width || 1920,\n      height: level.height || 1080,\n      bitrate: level.bitrate || 5000000,\n    };\n  }\n\n  function selectBestMediaFile(mediaFiles: VastMediaFile[]): VastMediaFile {\n    if (mediaFiles.length === 0) {\n      throw new Error(\"No media files available\");\n    }\n\n    const firstFile = mediaFiles[0];\n    if (!firstFile) {\n      throw new Error(\"No media files available\");\n    }\n\n    if (mediaFiles.length === 1) {\n      return firstFile;\n    }\n\n    const mainQuality = getMainStreamQuality();\n    if (!mainQuality) {\n      console.log(\n        \"[HlsAdPlayer] No main stream quality info, using first media file\"\n      );\n      return firstFile;\n    }\n\n    console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n\n    const scoredFiles = mediaFiles.map((file) => {\n      const widthDiff = Math.abs(file.width - mainQuality.width);\n      const heightDiff = Math.abs(file.height - mainQuality.height);\n      const resolutionDiff = widthDiff + heightDiff;\n\n      const fileBitrate = (file.bitrate || 5000) * 1000;\n      const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n\n      const score = resolutionDiff * 2 + bitrateDiff / 1000;\n\n      return { file, score, resolutionDiff, bitrateDiff };\n    });\n\n    scoredFiles.sort((a, b) => a.score - b.score);\n\n    const bestMatch = scoredFiles[0];\n    if (!bestMatch) {\n      console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n      return firstFile;\n    }\n\n    console.log(\"[HlsAdPlayer] Selected media file:\", {\n      url: bestMatch.file.url,\n      resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n      bitrate: bestMatch.file.bitrate,\n      score: bestMatch.score,\n      resolutionDiff: bestMatch.resolutionDiff,\n      bitrateDiff: bestMatch.bitrateDiff,\n    });\n\n    return bestMatch.file;\n  }\n\n  function isHlsMediaFile(mediaFile: VastMediaFile): boolean {\n    const type = mediaFile.type.toLowerCase();\n    const url = mediaFile.url.toLowerCase();\n    return (\n      type === \"application/x-mpegurl\" ||\n      type === \"application/vnd.apple.mpegurl\" ||\n      type.includes(\"mpegurl\") ||\n      url.includes(\".m3u8\")\n    );\n  }\n\n  function isProgressiveMediaFile(mediaFile: VastMediaFile): boolean {\n    const type = mediaFile.type.toLowerCase();\n    const url = mediaFile.url.toLowerCase();\n    return (\n      type.startsWith(\"video/\") ||\n      url.endsWith(\".mp4\") ||\n      url.includes(\".mp4?\")\n    );\n  }\n\n  function createEmptyTrackingUrls(): VastTrackingUrls {\n    return {\n      impression: [],\n      start: [],\n      firstQuartile: [],\n      midpoint: [],\n      thirdQuartile: [],\n      complete: [],\n      mute: [],\n      unmute: [],\n      pause: [],\n      resume: [],\n      fullscreen: [],\n      exitFullscreen: [],\n      skip: [],\n      error: [],\n    };\n  }\n\n  function extractTrackingUrls(xmlDoc: Document): VastTrackingUrls {\n    const trackingUrls = createEmptyTrackingUrls();\n\n    xmlDoc.querySelectorAll(\"Impression\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.impression.push(url);\n    });\n\n    xmlDoc.querySelectorAll(\"Tracking\").forEach((el) => {\n      const event = el.getAttribute(\"event\");\n      const url = el.textContent?.trim();\n      if (event && url) {\n        const eventKey = event as keyof VastTrackingUrls;\n        if (trackingUrls[eventKey]) {\n          trackingUrls[eventKey].push(url);\n        }\n      }\n    });\n\n    xmlDoc.querySelectorAll(\"Error\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.error.push(url);\n    });\n\n    return trackingUrls;\n  }\n\n  function mergeTrackingUrls(\n    target: VastTrackingUrls,\n    source: VastTrackingUrls\n  ): VastTrackingUrls {\n    (Object.keys(target) as Array<keyof VastTrackingUrls>).forEach((key) => {\n      if (source[key] && source[key].length > 0) {\n        target[key] = target[key].concat(source[key]);\n      }\n    });\n    return target;\n  }\n\n  function parseVastXml(xmlString: string): VastParseResult {\n    try {\n      const parser = new DOMParser();\n      const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n\n      const parserError = xmlDoc.querySelector(\"parsererror\");\n      if (parserError) {\n        console.error(\n          \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n          parserError.textContent\n        );\n        return { type: \"empty\" };\n      }\n\n      const adElement = xmlDoc.querySelector(\"Ad\");\n      if (!adElement) {\n        console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n        return { type: \"empty\" };\n      }\n\n      const adId = adElement.getAttribute(\"id\") || \"unknown\";\n      const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n\n      const clickThrough = xmlDoc\n        .querySelector(\"ClickThrough\")\n        ?.textContent?.trim();\n\n      const wrapperUri = xmlDoc\n        .querySelector(\"VASTAdTagURI\")\n        ?.textContent?.trim();\n      if (wrapperUri) {\n        console.log(\n          `[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ${wrapperUri}`\n        );\n        return {\n          type: \"wrapper\",\n          vastAdTagUri: wrapperUri,\n          trackingUrls: extractTrackingUrls(xmlDoc),\n          clickThrough,\n        };\n      }\n\n      const isNoAdAvailable =\n        adId === \"empty\" ||\n        title.toLowerCase().includes(\"no ad available\") ||\n        title.toLowerCase() === \"no ad available\";\n\n      const durationText =\n        xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n      const durationParts = durationText.split(\":\");\n      const duration =\n        parseInt(durationParts[0] || \"0\", 10) * 3600 +\n        parseInt(durationParts[1] || \"0\", 10) * 60 +\n        parseInt(durationParts[2] || \"0\", 10);\n\n      const mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n      const mediaFiles: VastMediaFile[] = [];\n\n      console.log(\n        `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n      );\n\n      mediaFileElements.forEach((mf, index) => {\n        const type = mf.getAttribute(\"type\") || \"\";\n        const url = mf.textContent?.trim() || \"\";\n        const width = mf.getAttribute(\"width\") || \"\";\n        const height = mf.getAttribute(\"height\") || \"\";\n\n        console.log(\n          `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n        );\n\n        const mediaFile: VastMediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: undefined,\n        };\n\n        if (!url) {\n          console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n          return;\n        }\n\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr\n          ? parseInt(bitrateAttr, 10)\n          : undefined;\n        mediaFile.bitrate =\n          bitrateValue && bitrateValue > 0 ? bitrateValue : undefined;\n\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n          console.log(\n            `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n          );\n        } else {\n          console.log(\n            `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n          );\n        }\n      });\n\n      if (mediaFiles.length === 0) {\n        if (isNoAdAvailable) {\n          console.warn(\n            \"[HlsAdPlayer] No ads available (VAST response indicates no ads)\"\n          );\n        } else {\n          console.warn(\"[HlsAdPlayer] No supported media files found in VAST XML\");\n        }\n        return { type: \"empty\" };\n      }\n\n      return {\n        type: \"inline\",\n        ad: {\n          id: adId,\n          title,\n          duration,\n          mediaFiles,\n          trackingUrls: extractTrackingUrls(xmlDoc),\n          clickThrough,\n        },\n      };\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n      return { type: \"empty\" };\n    }\n  }\n\n  async function fetchVastXml(vastTagUrl: string): Promise<string> {\n    const response = await fetch(vastTagUrl, {\n      mode: \"cors\",\n      credentials: \"include\",\n      headers: {\n        \"Accept\": \"application/xml, text/xml, */*\",\n      },\n      referrerPolicy: \"no-referrer-when-downgrade\",\n    });\n    if (!response.ok) {\n      throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n    }\n    return response.text();\n  }\n\n  async function fetchAndParseVastAd(\n    vastTagUrl: string,\n    depth = 0,\n    accumulatedTracking: VastTrackingUrls = createEmptyTrackingUrls()\n  ): Promise<VastAd | null> {\n    const vastXml = await fetchVastXml(vastTagUrl);\n    console.log(\"[HlsAdPlayer] VAST XML received\");\n    console.log(\n      \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n      vastXml.substring(0, 2000)\n    );\n\n    const parsed = parseVastXml(vastXml);\n\n    if (parsed.type === \"empty\") {\n      return null;\n    }\n\n    if (parsed.type === \"wrapper\") {\n      if (depth >= MAX_VAST_WRAPPER_DEPTH) {\n        console.warn(\n          `[HlsAdPlayer] VAST wrapper depth limit (${MAX_VAST_WRAPPER_DEPTH}) reached, aborting redirect chain`\n        );\n        return null;\n      }\n\n      mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);\n      return fetchAndParseVastAd(\n        parsed.vastAdTagUri,\n        depth + 1,\n        accumulatedTracking\n      );\n    }\n\n    mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);\n    return parsed.ad;\n  }\n\n  function createAdVideoElement(): HTMLVideoElement {\n    const video = document.createElement(\"video\");\n    video.style.position = \"absolute\";\n    video.style.left = \"0\";\n    video.style.top = \"0\";\n    video.style.width = \"100%\";\n    video.style.height = \"100%\";\n    video.style.objectFit = \"contain\";\n    video.style.backgroundColor = \"#000\";\n    video.playsInline = true;\n    video.muted = false;\n\n    video.volume = 1.0;\n    console.log(\n      `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n    );\n\n    return video;\n  }\n\n  function setupAdEventListeners(): void {\n    if (!adVideoElement || !currentAd) return;\n\n    adVideoElement.addEventListener(\"timeupdate\", () => {\n      if (!currentAd || !adVideoElement) return;\n\n      const progress = adVideoElement.currentTime / currentAd.duration;\n\n      if (progress >= 0.25 && !trackingFired.firstQuartile) {\n        trackingFired.firstQuartile = true;\n        fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n      }\n\n      if (progress >= 0.5 && !trackingFired.midpoint) {\n        trackingFired.midpoint = true;\n        fireTrackingPixels(currentAd.trackingUrls.midpoint);\n      }\n\n      if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n        trackingFired.thirdQuartile = true;\n        fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n      }\n    });\n\n    adVideoElement.addEventListener(\"playing\", () => {\n      if (!currentAd || trackingFired.start) return;\n      trackingFired.start = true;\n      fireTrackingPixels(currentAd.trackingUrls.start);\n      console.log(\"[HlsAdPlayer] Ad started playing\");\n    });\n\n    adVideoElement.addEventListener(\"ended\", () => {\n      if (!currentAd || trackingFired.complete) return;\n      trackingFired.complete = true;\n      fireTrackingPixels(currentAd.trackingUrls.complete);\n      console.log(\"[HlsAdPlayer] Ad completed\");\n\n      handleAdComplete();\n    });\n\n    adVideoElement.addEventListener(\"error\", (e) => {\n      if (!adPlaying) return;\n      console.error(\"[HlsAdPlayer] Ad video error:\", e);\n      if (currentAd) {\n        fireTrackingPixels(currentAd.trackingUrls.error);\n      }\n      handleAdError();\n    });\n\n    adVideoElement.addEventListener(\"volumechange\", () => {\n      if (!currentAd) return;\n      if (adVideoElement!.muted) {\n        fireTrackingPixels(currentAd.trackingUrls.mute);\n      } else {\n        fireTrackingPixels(currentAd.trackingUrls.unmute);\n      }\n    });\n\n    adVideoElement.addEventListener(\"pause\", () => {\n      if (currentAd && !adVideoElement!.ended) {\n        fireTrackingPixels(currentAd.trackingUrls.pause);\n      }\n    });\n\n    adVideoElement.addEventListener(\"play\", () => {\n      if (currentAd && adVideoElement!.currentTime > 0) {\n        fireTrackingPixels(currentAd.trackingUrls.resume);\n      }\n    });\n  }\n\n  function setAdPlayingFlag(isPlaying: boolean): void {\n    if (isPlaying) {\n      contentVideo.dataset.stormcloudAdPlaying = \"true\";\n    } else {\n      delete contentVideo.dataset.stormcloudAdPlaying;\n    }\n  }\n\n  function handleAdComplete(): void {\n    console.log(\"[HlsAdPlayer] Handling ad completion\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n\n    contentVideo.muted = true;\n\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\n    }\n    \n    if (options?.continueLiveStreamDuringAds) {\n      if (contentVideo.paused) {\n        console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n        contentVideo.play().catch(() => {});\n      } else {\n        console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n      }\n    }\n\n    emit(\"content_resume\");\n  }\n\n  function handleAdError(): void {\n    console.log(\"[HlsAdPlayer] Handling ad error\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n\n    contentVideo.muted = true;\n\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\n    }\n\n    emit(\"ad_error\");\n  }\n\n  return {\n    initialize() {\n      console.log(\"[HlsAdPlayer] Initializing\");\n\n      if (!adContainerEl) {\n        const container = document.createElement(\"div\");\n        container.style.position = \"absolute\";\n        container.style.left = \"0\";\n        container.style.top = \"0\";\n        container.style.right = \"0\";\n        container.style.bottom = \"0\";\n        container.style.display = \"none\";\n        container.style.alignItems = \"center\";\n        container.style.justifyContent = \"center\";\n        container.style.pointerEvents = \"none\";\n        container.style.zIndex = \"30\";\n        container.style.backgroundColor = \"#000\";\n\n        contentVideo.parentElement?.appendChild(container);\n        adContainerEl = container;\n      }\n    },\n\n    async requestAds(vastTagUrl: string) {\n      console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n\n      if (adPlaying) {\n        console.warn(\n          \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n        );\n        return Promise.reject(new Error(\"Ad already playing\"));\n      }\n\n      try {\n        sessionId = generateSessionId();\n        let ad: VastAd | null | undefined;\n\n        if (preloadedAds.has(vastTagUrl)) {\n          ad = preloadedAds.get(vastTagUrl);\n          preloadedAds.delete(vastTagUrl);\n          console.log(\n            \"[HlsAdPlayer] Using preloaded VAST response:\",\n            vastTagUrl\n          );\n        } else {\n          ad = await fetchAndParseVastAd(vastTagUrl);\n        }\n\n        if (!ad) {\n          console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n          emit(\"ad_error\");\n          return Promise.reject(new Error(\"No ads available from VAST response\"));\n        }\n\n        currentAd = ad;\n        console.log(\n          `[HlsAdPlayer] Ad parsed: ${ad.title}, duration: ${ad.duration}s`\n        );\n\n        fireTrackingPixels(ad.trackingUrls.impression);\n        trackingFired.impression = true;\n\n        return Promise.resolve();\n      } catch (error) {\n        console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n        emit(\"ad_error\");\n        return Promise.reject(error);\n      }\n    },\n    async play() {\n      if (!currentAd) {\n        console.warn(\n          \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n        );\n        return Promise.reject(new Error(\"No ad loaded\"));\n      }\n\n      console.log(\"[HlsAdPlayer] Starting ad playback\");\n\n      try {\n        if (!adVideoElement) {\n          adVideoElement = createAdVideoElement();\n          adContainerEl?.appendChild(adVideoElement);\n          setupAdEventListeners();\n        }\n\n        trackingFired = {\n          impression: trackingFired.impression,\n          start: false,\n          firstQuartile: false,\n          midpoint: false,\n          thirdQuartile: false,\n          complete: false,\n        };\n\n        const contentVolume = contentVideo.volume;\n        originalVolume = Math.max(\n          0,\n          Math.min(1, contentVolume || originalVolume)\n        );\n\n        if (!options?.continueLiveStreamDuringAds) {\n          contentVideo.pause();\n          console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n        } else {\n          console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n        }\n\n        console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n        contentVideo.muted = true;\n        adPlaying = true;\n        setAdPlayingFlag(true);\n\n        if (adVideoElement) {\n          adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n          adVideoElement.muted = originalMutedState;\n          console.log(\n            `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n          );\n        }\n\n        const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n        if (!mediaFile) {\n          throw new Error(\"No media file available for ad\");\n        }\n\n        if (adContainerEl) {\n          adContainerEl.style.display = \"flex\";\n          adContainerEl.style.pointerEvents = \"auto\";\n        }\n\n        emit(\"content_pause\");\n\n        const isHlsAd = isHlsMediaFile(mediaFile);\n        console.log(\n          `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad from: ${mediaFile.url}`\n        );\n\n        if (isHlsAd && Hls.isSupported()) {\n          if (adHls) {\n            adHls.destroy();\n          }\n\n          adHls = new Hls({\n            enableWorker: true,\n            lowLatencyMode: false,\n          });\n\n          adHls.loadSource(mediaFile.url);\n          adHls.attachMedia(adVideoElement);\n\n          adHls.on(Hls.Events.MANIFEST_PARSED, () => {\n            console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n            adVideoElement!.play().catch((error) => {\n              console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n              handleAdError();\n            });\n          });\n\n          adHls.on(Hls.Events.ERROR, (event, data) => {\n            console.error(\"[HlsAdPlayer] HLS error:\", data);\n            if (data.fatal) {\n              handleAdError();\n            }\n          });\n        } else if (isHlsAd && (\n          adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")\n        )) {\n          adVideoElement.src = mediaFile.url;\n          adVideoElement.play().catch((error) => {\n            console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n            handleAdError();\n          });\n        } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n          if (adHls) {\n            adHls.destroy();\n            adHls = undefined;\n          }\n\n          adVideoElement.src = mediaFile.url;\n          adVideoElement.load();\n          adVideoElement.play().catch((error) => {\n            console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n            handleAdError();\n          });\n        } else {\n          throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n        }\n\n        return Promise.resolve();\n      } catch (error) {\n        console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n        handleAdError();\n        return Promise.reject(error);\n      }\n    },\n    pause() {\n      if (!adPlaying || !adVideoElement) {\n        return;\n      }\n\n      try {\n        if (adVideoElement && !adVideoElement.paused) {\n          adVideoElement.pause();\n        }\n      } catch (error) {\n        console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n      }\n    },\n    resume() {\n      if (!adPlaying || !adVideoElement) {\n        return;\n      }\n\n      try {\n        if (adVideoElement && adVideoElement.paused) {\n          adVideoElement.play().catch(() => {});\n        }\n      } catch (error) {\n        console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n      }\n    },\n    async stop() {\n      console.log(\"[HlsAdPlayer] Stopping ad\");\n      adPlaying = false;\n      setAdPlayingFlag(false);\n\n      const previousMutedState = contentVideo.muted;\n      contentVideo.muted = originalMutedState;\n      contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n      console.log(\n        `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}, volume: ${contentVideo.volume}`\n      );\n\n      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\n\n      contentVideo.style.visibility = \"visible\";\n      contentVideo.style.opacity = \"1\";\n\n      if (options?.continueLiveStreamDuringAds) {\n        if (contentVideo.paused) {\n          console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n          contentVideo.play().catch(() => {});\n        }\n      }\n\n      if (adHls) {\n        adHls.destroy();\n        adHls = undefined;\n      }\n\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n      }\n\n      currentAd = undefined;\n    },\n\n    destroy() {\n      console.log(\"[HlsAdPlayer] Destroying\");\n      destroyed = true;\n      \n      for (const timeoutId of pendingTimeouts) {\n        clearTimeout(timeoutId);\n      }\n      pendingTimeouts = [];\n      \n      adPlaying = false;\n      setAdPlayingFlag(false);\n      contentVideo.muted = originalMutedState;\n      contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n\n      if (adHls) {\n        adHls.destroy();\n        adHls = undefined;\n      }\n\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n        adVideoElement.remove();\n        adVideoElement = undefined;\n      }\n\n      if (adContainerEl?.parentElement) {\n        adContainerEl.parentElement.removeChild(adContainerEl);\n      }\n\n      adContainerEl = undefined;\n      currentAd = undefined;\n      listeners.clear();\n      preloadedAds.clear();\n      preloadingAds.clear();\n    },\n\n    isAdPlaying() {\n      return adPlaying;\n    },\n\n    resize(width: number, height: number) {\n      console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n\n      if (adContainerEl) {\n        adContainerEl.style.width = `${width}px`;\n        adContainerEl.style.height = `${height}px`;\n      }\n\n      if (adVideoElement) {\n        adVideoElement.style.width = `${width}px`;\n        adVideoElement.style.height = `${height}px`;\n      }\n    },\n\n    on(event: string, listener: (payload?: any) => void) {\n      if (!listeners.has(event)) listeners.set(event, new Set());\n      listeners.get(event)!.add(listener);\n    },\n\n    off(event: string, listener: (payload?: any) => void) {\n      listeners.get(event)?.delete(listener);\n    },\n\n    updateOriginalMutedState(muted: boolean, volume?: number) {\n      const nextVolume =\n        typeof volume === \"number\" && !Number.isNaN(volume)\n          ? Math.max(0, Math.min(1, volume))\n          : originalVolume;\n      console.log(\n        `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n      );\n      originalMutedState = muted;\n      originalVolume = nextVolume;\n    },\n\n    getOriginalMutedState() {\n      return originalMutedState;\n    },\n    getOriginalVolume() {\n      return originalVolume;\n    },\n\n    setAdVolume(volume: number) {\n      if (adVideoElement && adPlaying) {\n        const clamped = Math.max(0, Math.min(1, volume));\n        adVideoElement.volume = clamped;\n        adVideoElement.muted = clamped === 0;\n      }\n    },\n\n    getAdVolume(): number {\n      if (adVideoElement && adPlaying) {\n        return adVideoElement.volume;\n      }\n      return 1;\n    },\n    showPlaceholder() {\n      contentVideo.style.opacity = \"0\";\n      contentVideo.style.visibility = \"hidden\";\n      \n      if (!adContainerEl) {\n        const container = document.createElement(\"div\");\n        container.style.position = \"absolute\";\n        container.style.left = \"0\";\n        container.style.top = \"0\";\n        container.style.right = \"0\";\n        container.style.bottom = \"0\";\n        container.style.display = \"none\";\n        container.style.alignItems = \"center\";\n        container.style.justifyContent = \"center\";\n        container.style.pointerEvents = \"none\";\n        container.style.zIndex = \"10\";\n        container.style.backgroundColor = \"#000\";\n\n        contentVideo.parentElement?.appendChild(container);\n        adContainerEl = container;\n      }\n\n      if (adContainerEl) {\n        adContainerEl.style.display = \"flex\";\n        adContainerEl.style.pointerEvents = \"auto\";\n      }\n    },\n    hidePlaceholder() {\n      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\n      \n      if (!adPlaying) {\n        contentVideo.style.visibility = \"visible\";\n        contentVideo.style.opacity = \"1\";\n      }\n    },\n    getLoadedAdDuration() {\n      return currentAd?.duration;\n    },\n    getLoadedAdId() {\n      return currentAd?.id;\n    },\n  };\n}\n","declare global {\n  interface Window {\n    goog?: any;\n  }\n}\n\nconst PAL_SDK_URL =\n  \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\n\nlet _nonceLoader: any | undefined;\nlet _palLoadPromise: Promise<void> | undefined;\n\nfunction loadPalSdk(): Promise<void> {\n  if (typeof window !== \"undefined\" && window.goog?.pal) {\n    return Promise.resolve();\n  }\n\n  if (_palLoadPromise) return _palLoadPromise;\n\n  _palLoadPromise = new Promise<void>((resolve, reject) => {\n    const existing = document.querySelector(\n      'script[data-pal=\"true\"]'\n    ) as HTMLScriptElement | null;\n\n    if (existing) {\n      if (window.goog?.pal) {\n        resolve();\n        return;\n      }\n      const timeout = setTimeout(\n        () => reject(new Error(\"PAL SDK load timeout\")),\n        10000\n      );\n      existing.addEventListener(\"load\", () => {\n        clearTimeout(timeout);\n        resolve();\n      });\n      existing.addEventListener(\"error\", () => {\n        clearTimeout(timeout);\n        reject(new Error(\"PAL SDK load failed\"));\n      });\n      return;\n    }\n\n    const script = document.createElement(\"script\");\n    script.src = PAL_SDK_URL;\n    script.async = true;\n    script.setAttribute(\"data-pal\", \"true\");\n    script.onload = () => resolve();\n    script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n    document.head.appendChild(script);\n  });\n\n  return _palLoadPromise;\n}\n\nfunction getOrCreateNonceLoader(): any {\n  if (_nonceLoader) return _nonceLoader;\n  const goog = window.goog;\n  const consentSettings = new goog.pal.ConsentSettings();\n  consentSettings.allowStorage = true;\n  _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n  return _nonceLoader;\n}\n\nexport interface PalNonceOptions {\n  videoWidth?: number;\n  videoHeight?: number;\n  descriptionUrl?: string;\n  ppid?: string;\n  sessionId?: string;\n  adWillAutoPlay?: boolean;\n  adWillPlayMuted?: boolean;\n  playerVolume?: number;\n  continuousPlayback?: boolean;\n}\n\nexport interface PalNonceManager {\n  generateNonce(options?: PalNonceOptions): Promise<string>;\n\n  getCurrentNonce(): string;\n\n  injectNonce(vastTagUrl: string): string;\n\n  sendPlaybackStart(): void;\n\n  sendPlaybackEnd(): void;\n\n  sendAdClick(): void;\n\n  sendAdTouch(event: MouseEvent | TouchEvent): void;\n\n  reset(): void;\n}\n\nexport function createPalNonceManager(): PalNonceManager {\n  let currentNonce = \"\";\n  let currentNonceManager: any | undefined;\n\n  return {\n    async generateNonce(options: PalNonceOptions = {}): Promise<string> {\n      try {\n        await loadPalSdk();\n\n        const loader = getOrCreateNonceLoader();\n        const goog = window.goog;\n\n        const request = new goog.pal.NonceRequest();\n        request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n        request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n        request.playerVolume =\n          options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n        request.continuousPlayback = options.continuousPlayback ?? true;\n        request.descriptionUrl =\n          options.descriptionUrl ||\n          (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.iconsSupported = true;\n        request.playerType = \"StormcloudVideoPlayer\";\n        request.playerVersion = \"1.0\";\n        request.supportedApiFrameworks = \"2,7,9\";\n        request.url =\n          options.descriptionUrl ||\n          (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.videoWidth = options.videoWidth || 640;\n        request.videoHeight = options.videoHeight || 480;\n\n        if (options.ppid) request.ppid = options.ppid;\n        if (options.sessionId) request.sessionId = options.sessionId;\n\n        const manager = await loader.loadNonceManager(request);\n        currentNonceManager = manager;\n        currentNonce = manager.getNonce() as string;\n\n        console.log(\"[PAL] Nonce generated successfully\");\n        return currentNonce;\n      } catch (error) {\n        console.warn(\"[PAL] Failed to generate nonce:\", error);\n        currentNonce = \"\";\n        currentNonceManager = undefined;\n        return \"\";\n      }\n    },\n\n    getCurrentNonce(): string {\n      return currentNonce;\n    },\n\n    injectNonce(vastTagUrl: string): string {\n      if (!currentNonce || !vastTagUrl) return vastTagUrl;\n\n      try {\n        const url = new URL(vastTagUrl);\n        url.searchParams.delete(\"paln\");\n        url.searchParams.set(\"givn\", currentNonce);\n        return url.toString();\n      } catch {\n        let base = vastTagUrl\n          .replace(/([?&])paln=[^&]*/g, \"\")\n          .replace(/[?&]$/, \"\");\n        const sep = base.includes(\"?\") ? \"&\" : \"?\";\n        return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n      }\n    },\n\n    sendPlaybackStart(): void {\n      try {\n        currentNonceManager?.sendPlaybackStart();\n      } catch {}\n    },\n\n    sendPlaybackEnd(): void {\n      try {\n        currentNonceManager?.sendPlaybackEnd();\n      } catch {}\n    },\n\n    sendAdClick(): void {\n      try {\n        currentNonceManager?.sendAdClick();\n      } catch {}\n    },\n\n    sendAdTouch(event: MouseEvent | TouchEvent): void {\n      try {\n        currentNonceManager?.sendAdTouch(event);\n      } catch {}\n    },\n\n    reset(): void {\n      currentNonce = \"\";\n      currentNonceManager = undefined;\n    },\n  };\n}\n","import mqtt from \"mqtt\";\nimport type { MqttClient } from \"mqtt\";\nimport {\n  applyMQTTConfig,\n  buildMQTTBrokerUrl,\n  isMQTTEnabled,\n  mqttConfig,\n} from \"./mqttConfig\";\nimport type { MQTTConfig } from \"./mqttConfig\";\n\nconst LOG = \"[StormcloudVideoPlayer][MQTT]\";\n\nexport type MQTTStatus = \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n\nlet client: MqttClient | null = null;\nlet status: MQTTStatus = \"disconnected\";\n\nexport function getMQTTStatus(): MQTTStatus {\n  return status;\n}\n\nexport function isMQTTConnected(): boolean {\n  return status === \"connected\" && client !== null && client.connected;\n}\n\nexport function isMQTTConfigured(): boolean {\n  return isMQTTEnabled();\n}\n\nexport function configureMQTT(overrides: Partial<MQTTConfig>): void {\n  applyMQTTConfig(overrides);\n  disconnectMQTT();\n}\n\nexport function initMQTTClient(): void {\n  if (client || !isMQTTEnabled()) return;\n\n  const url = buildMQTTBrokerUrl();\n  status = \"connecting\";\n\n  const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n\n  try {\n    client = mqtt.connect(url, {\n      clientId,\n      username: mqttConfig.username,\n      password: mqttConfig.password,\n      keepalive: 60,\n      clean: true,\n      reconnectPeriod: 5000,\n      connectTimeout: 10_000,\n      queueQoSZero: false,\n    });\n  } catch (err) {\n    status = \"error\";\n    console.warn(`${LOG} connect() threw:`, err);\n    return;\n  }\n\n  client.on(\"connect\", () => {\n    status = \"connected\";\n    console.info(`${LOG} connected to ${url}`);\n  });\n\n  client.on(\"reconnect\", () => {\n    status = \"connecting\";\n    console.info(`${LOG} reconnecting…`);\n  });\n\n  client.on(\"offline\", () => {\n    status = \"disconnected\";\n    console.warn(`${LOG} offline`);\n  });\n\n  client.on(\"error\", (err) => {\n    status = \"error\";\n    console.warn(`${LOG} error:`, err.message);\n  });\n\n  client.on(\"close\", () => {\n    if (status === \"connected\") {\n      status = \"disconnected\";\n    }\n  });\n}\n\nexport function ensureMQTTClient(): void {\n  if (isMQTTEnabled() && !client) {\n    initMQTTClient();\n  }\n}\n\nexport function publishMQTT(\n  topic: string,\n  payload: Record<string, unknown>\n): boolean {\n  if (!isMQTTEnabled()) {\n    return false;\n  }\n\n  ensureMQTTClient();\n\n  if (!client) {\n    return false;\n  }\n\n  try {\n    client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n    return true;\n  } catch (err) {\n    console.warn(`${LOG} publish failed on ${topic}:`, err);\n    return false;\n  }\n}\n\nexport function disconnectMQTT(): void {\n  if (client) {\n    client.end(true);\n    client = null;\n    status = \"disconnected\";\n  }\n}\n","export const MQTT_CA_CERT_FILE = \"src/certs/emqxsl-ca.crt\";\n\nexport type MQTTConfig = {\n  enabled: boolean;\n  brokerAddress: string;\n  brokerPort: number;\n  wsPort: number;\n  username: string;\n  password: string;\n  topicPrefix: string;\n  qos: 0 | 1 | 2;\n  brokerUrl?: string;\n};\n\nexport const DEFAULT_MQTT_CONFIG: MQTTConfig = {\n  enabled: true,\n  brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n  brokerPort: 8883,\n  wsPort: 8084,\n  username: \"for-sonifi\",\n  password: \"sonifi-mqtt\",\n  topicPrefix: \"adstorm/players\",\n  qos: 1,\n};\n\nexport const mqttConfig: MQTTConfig = { ...DEFAULT_MQTT_CONFIG };\n\nexport function applyMQTTConfig(overrides: Partial<MQTTConfig>): void {\n  Object.assign(mqttConfig, overrides);\n}\n\nexport function isMQTTEnabled(): boolean {\n  return mqttConfig.enabled;\n}\n\nexport function buildMQTTBrokerUrl(): string {\n  if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n  return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\n\nexport function buildPlayerTopic(\n  licenseKey: string,\n  channel: \"metrics\" | \"impressions\" | \"heartbeat\"\n): string {\n  return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n","export interface VastEnvironmentSignals {\n  isCtv: boolean;\n  contentUrl?: string;\n  appId?: string;\n  appName?: string;\n  sessionId?: string;\n  deviceId?: string;\n  deviceIdType?: string;\n  limitAdTracking?: boolean;\n  deviceTypeHint?: number;\n}\n\nconst AIRY_ANDROID_APP_ID = \"com.freeairytv.android\";\nconst AIRY_WEBOS_APP_ID    = \"com.freeairytv.webos\";\nconst AIRY_TIZEN_APP_ID    = \"com.freeairytv.samsung\";\nconst AIRY_ROKU_APP_ID     = \"com.freeairytv.roku\";\nconst AIRY_APP_NAME = \"AiryTV Movies & TV\";\nconst AIRY_DEFAULT_CONTENT_URL = \"https://live.airy.tv\";\nconst CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nexport const PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\n\nconst LG_TEST_APP_ID      = \"com.hulu.plus\";\nconst LG_TEST_APP_NAME    = \"Hulu\";\nconst LG_TEST_CONTENT_URL = \"https://www.hulu.com/live-tv\";\n\nlet _lgTestDeviceId: string | undefined;\nfunction getLgTestDeviceId(): string {\n  if (!_lgTestDeviceId) _lgTestDeviceId = createUuid();\n  return _lgTestDeviceId;\n}\n\nfunction isLgWebOS(): boolean {\n  if (typeof navigator === \"undefined\") return false;\n  return /Web0S|webOS|LG Browser|LGSTB|LGE/i.test(navigator.userAgent);\n}\n\nfunction getDefaultAppId(): string {\n  if (typeof navigator === \"undefined\") return AIRY_ANDROID_APP_ID;\n  const ua = navigator.userAgent;\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;\n  if (/Tizen|Samsung/i.test(ua))                       return AIRY_TIZEN_APP_ID;\n  if (/Roku/i.test(ua))                                return AIRY_ROKU_APP_ID;\n  return AIRY_ANDROID_APP_ID;\n}\n\nconst DEVICE_ID_STORAGE_KEYS = [\n  \"rdid\",\n  \"ifa\",\n  \"advertisingId\",\n  \"advertising_id\",\n  \"deviceAdvertisingId\",\n  \"aaid\",\n  \"adid\",\n  \"rida\",\n  \"tifa\",\n  \"lgudid\",\n];\n\nconst ANDROID_ID_TYPES = new Set([\"aaid\", \"adid\"]);\n\nexport function resolveVastEnvironmentSignals(isCtv: boolean): VastEnvironmentSignals {\n  const bridgeSignals  = readNativeBridgeSignals();\n  const platformDevice = readPlatformNativeDeviceId();\n  const lg = isCtv && isLgWebOS();\n\n  const deviceId =\n    bridgeSignals.deviceId  ||\n    readStoredDeviceId()    ||\n    platformDevice.deviceId ||\n    (lg && platformDevice.limitAdTracking !== true ? getLgTestDeviceId() : undefined);\n  const deviceIdType =\n    bridgeSignals.deviceIdType  ||\n    readStoredString(\"deviceIdType\") ||\n    readStoredString(\"idtype\") ||\n    platformDevice.deviceIdType ||\n    inferDeviceIdType() ||\n    (lg ? \"lgudid\" : undefined);\n  const platformLat = bridgeSignals.deviceId\n    ? bridgeSignals.limitAdTracking\n    : platformDevice.limitAdTracking;\n  const limitAdTracking =\n    deviceId != null\n      ? platformLat ?? readStoredLimitAdTracking() ?? false\n      : undefined;\n\n  if (isCtv) {\n    return {\n      isCtv: true,\n      contentUrl:\n        bridgeSignals.contentUrl ||\n        readStoredString(\"contentUrl\") ||\n        (lg ? LG_TEST_CONTENT_URL : AIRY_DEFAULT_CONTENT_URL),\n      appId:\n        bridgeSignals.appId ||\n        readStoredString(\"appId\") ||\n        readStoredString(\"msid\") ||\n        (lg ? LG_TEST_APP_ID : getDefaultAppId()),\n      appName:\n        bridgeSignals.appName ||\n        readStoredString(\"appName\") ||\n        readStoredString(\"an\") ||\n        (lg ? LG_TEST_APP_NAME : AIRY_APP_NAME),\n      sessionId: getOrCreateCtvSessionId(),\n      ...(deviceId ? { deviceId } : {}),\n      ...(deviceIdType ? { deviceIdType } : {}),\n      ...(limitAdTracking != null ? { limitAdTracking } : {}),\n      deviceTypeHint: 5,\n    };\n  }\n\n  return {\n    isCtv: false,\n    ...(deviceId ? { deviceId } : {}),\n    ...(deviceIdType ? { deviceIdType } : {}),\n    ...(limitAdTracking != null ? { limitAdTracking } : {}),\n  };\n}\n\nexport function inferDeviceIdType(): string | undefined {\n  if (typeof navigator === \"undefined\") {\n    return undefined;\n  }\n\n  const ua = navigator.userAgent;\n  if (/Roku/i.test(ua)) return \"rida\";\n  if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n  if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n  if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n  if (/Android|Google TV/i.test(ua)) return \"aaid\";\n  if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n  return undefined;\n}\n\nexport function isEquivalentDeviceIdType(\n  tagType: string | undefined,\n  runtimeType: string | undefined\n): boolean {\n  if (!tagType || !runtimeType) return false;\n  const tag = tagType.toLowerCase();\n  const runtime = runtimeType.toLowerCase();\n  if (tag === runtime) return true;\n  return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\n\nexport function resolveNativeDeviceId(): string | undefined {\n  const bridgeSignals = readNativeBridgeSignals();\n  const platformDevice = readPlatformNativeDeviceId();\n  const deviceId =\n    bridgeSignals.deviceId ||\n    readStoredDeviceId() ||\n    platformDevice.deviceId;\n\n  if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n    return undefined;\n  }\n\n  return deviceId;\n}\n\nexport function getOrCreateStoredUuid(storageKey: string): string | undefined {\n  if (typeof window === \"undefined\") {\n    return undefined;\n  }\n\n  const existing = readStoredString(storageKey);\n  if (existing) {\n    return existing;\n  }\n\n  const id = createUuid();\n  try {\n    window.localStorage?.setItem(storageKey, id);\n  } catch {}\n  return id;\n}\n\nfunction getOrCreateCtvSessionId(): string {\n  const existing = readStoredString(CTV_SESSION_STORAGE_KEY);\n  if (existing) {\n    return existing;\n  }\n\n  const sessionId = createUuid();\n  try {\n    window.localStorage?.setItem(CTV_SESSION_STORAGE_KEY, sessionId);\n  } catch {}\n  return sessionId;\n}\n\nfunction createUuid(): string {\n  if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n    return crypto.randomUUID();\n  }\n\n  return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (char) => {\n    const value = Math.floor(Math.random() * 16);\n    const nibble = char === \"x\" ? value : (value & 0x3) | 0x8;\n    return nibble.toString(16);\n  });\n}\n\nfunction readPlatformNativeDeviceId(): {\n  deviceId?: string;\n  deviceIdType?: string;\n  limitAdTracking?: boolean;\n} {\n  if (typeof window === \"undefined\") return {};\n\n  try {\n    const adinfo = (window as any).webapis?.adinfo;\n    if (adinfo) {\n      const tifa: unknown =\n        typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n      if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n        const lat: unknown =\n          typeof adinfo.isLATEnabled === \"function\"\n            ? adinfo.isLATEnabled()\n            : undefined;\n        return {\n          deviceId: tifa,\n          deviceIdType: \"tifa\",\n          ...(typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}),\n        };\n      }\n    }\n  } catch {}\n\n  try {\n    const webOSDev = (window as any).webOSDev;\n    if (webOSDev) {\n      const lgudid: unknown =\n        typeof webOSDev.LGUDID === \"function\"\n          ? webOSDev.LGUDID()\n          : webOSDev.lgudid ?? webOSDev.LGUDID;\n      if (typeof lgudid === \"string\" && lgudid) {\n        if (isZeroedAdId(lgudid)) {\n          return { deviceIdType: \"lgudid\", limitAdTracking: true };\n        }\n        if (!isMacroPlaceholder(lgudid)) {\n          return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n        }\n      }\n    }\n  } catch {}\n\n  try {\n    const roku = (window as any).Roku;\n    if (roku) {\n      const rida: unknown =\n        typeof roku.getPublisherUniqueId === \"function\"\n          ? roku.getPublisherUniqueId()\n          : roku.rida;\n      if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n        return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n      }\n    }\n  } catch {}\n\n  return {};\n}\n\nconst ZEROED_AD_ID_PATTERNS: ReadonlySet<string> = new Set([\n  \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n  \"00000000-0000-0000-0000-000000000000\",\n]);\n\nfunction isMacroPlaceholder(value: string): boolean {\n  const t = value.trim();\n  return !t ||\n    /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) ||\n    /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) ||\n    ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\n\nfunction isZeroedAdId(value: string): boolean {\n  return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\n\nfunction readNativeBridgeSignals(): {\n  contentUrl?: string;\n  appId?: string;\n  appName?: string;\n  deviceId?: string;\n  deviceIdType?: string;\n  limitAdTracking?: boolean;\n} {\n  if (typeof window === \"undefined\") {\n    return {};\n  }\n\n  const candidates = [\n    (window as any).__STORMCLOUD_CTV_AD_INFO__,\n    (window as any).__STORMCLOUD_CTV__,\n    (window as any).stormcloudCtv,\n    (window as any).AiryTV,\n    (window as any).Android,\n    (window as any).webOS,\n    (window as any).tizen,\n    (window as any).amazon,\n  ].filter(Boolean);\n\n  for (const source of candidates) {\n    const contentUrl =\n      readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) ||\n      undefined;\n    const appId =\n      readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) ||\n      undefined;\n    const appName =\n      readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || undefined;\n    const deviceId =\n      readBridgeValue(source, [\n        \"rdid\",\n        \"ifa\",\n        \"advertisingId\",\n        \"adId\",\n        \"deviceId\",\n        \"lgudid\",\n        \"LGUDID\",\n        \"tifa\",\n        \"rida\",\n        \"afai\",\n        \"aaid\",\n      ]) || undefined;\n\n    if (!contentUrl && !deviceId && !appId && !appName) continue;\n\n    const deviceIdType =\n      readBridgeValue(source, [\n        \"idtype\",\n        \"deviceIdType\",\n        \"advertisingIdType\",\n        \"idType\",\n      ]) || inferDeviceIdType();\n    const limitAdTracking = readBridgeBoolean(source, [\n      \"is_lat\",\n      \"limitAdTracking\",\n      \"limitedAdTracking\",\n      \"lat\",\n    ]);\n\n    return {\n      ...(contentUrl ? { contentUrl } : {}),\n      ...(appId ? { appId } : {}),\n      ...(appName ? { appName } : {}),\n      ...(deviceId ? { deviceId } : {}),\n      ...(deviceId && deviceIdType ? { deviceIdType } : {}),\n      ...(deviceId && limitAdTracking != null ? { limitAdTracking } : {}),\n    };\n  }\n\n  return {};\n}\n\nfunction readBridgeValue(source: any, keys: string[]): string | undefined {\n  for (const key of keys) {\n    const value = source?.[key];\n    if (typeof value === \"string\" && value) {\n      return value;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = value.call(source);\n        if (typeof result === \"string\" && result) {\n          return result;\n        }\n      } catch {}\n    }\n  }\n  return undefined;\n}\n\nfunction readBridgeBoolean(source: any, keys: string[]): boolean | undefined {\n  for (const key of keys) {\n    const value = source?.[key];\n    const normalized = normalizeBoolean(value);\n    if (normalized != null) {\n      return normalized;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = normalizeBoolean(value.call(source));\n        if (result != null) {\n          return result;\n        }\n      } catch {}\n    }\n  }\n  return undefined;\n}\n\nfunction readStoredDeviceId(): string | undefined {\n  for (const key of DEVICE_ID_STORAGE_KEYS) {\n    const value = readStoredString(key);\n    if (value) {\n      return value;\n    }\n  }\n  return undefined;\n}\n\nfunction readStoredString(key: string): string | undefined {\n  if (typeof window === \"undefined\") {\n    return undefined;\n  }\n\n  try {\n    const value = window.localStorage?.getItem(key);\n    return value || undefined;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction readStoredLimitAdTracking(): boolean | undefined {\n  return normalizeBoolean(\n    readStoredString(\"limitAdTracking\") ||\n      readStoredString(\"limitedAdTracking\") ||\n      readStoredString(\"is_lat\")\n  );\n}\n\nfunction normalizeBoolean(value: unknown): boolean | undefined {\n  if (typeof value === \"boolean\") {\n    return value;\n  }\n  if (typeof value === \"number\") {\n    return value === 1;\n  }\n  if (typeof value === \"string\") {\n    const normalized = value.toLowerCase();\n    if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n      return true;\n    }\n    if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n      return false;\n    }\n  }\n  return undefined;\n}\n","import type {\n  ClientInfo,\n  AdDetectInfo,\n  AdLoadedInfo,\n  AdImpressionInfo,\n  PlayerAnalyticsContext,\n} from \"../types\";\nimport { buildPlayerTopic, isMQTTEnabled } from \"./mqttConfig\";\nimport { ensureMQTTClient, publishMQTT } from \"./mqttClient\";\nimport {\n  getOrCreateStoredUuid,\n  PLAYER_ID_STORAGE_KEY,\n  resolveNativeDeviceId,\n} from \"./vastEnvironmentSignals\";\n\nlet cachedBrowserId: string | null = null;\n\nexport function getClientInfo(): ClientInfo {\n  const ua = navigator.userAgent;\n  const platform = navigator.platform;\n  const vendor = navigator.vendor || \"\";\n  const maxTouchPoints = navigator.maxTouchPoints || 0;\n  const memory = (navigator as any).deviceMemory || null;\n  const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n\n  const screenInfo = {\n    width: screen?.width,\n    height: screen?.height,\n    availWidth: screen?.availWidth,\n    availHeight: screen?.availHeight,\n    orientation: (screen?.orientation as any)?.type || \"\",\n    pixelDepth: screen?.pixelDepth,\n  };\n\n  let deviceType: \"tv\" | \"mobile\" | \"tablet\" | \"desktop\" = \"desktop\";\n  let brand = \"Unknown\";\n  let os = \"Unknown\";\n  let model = \"\";\n  let isSmartTV = false;\n  let isAndroid = false;\n  let isWebView = false;\n  let isWebApp = false;\n\n  if (ua.includes(\"Web0S\")) {\n    brand = \"LG\";\n    os = \"webOS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n    const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n    model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n  } else if (ua.includes(\"Tizen\")) {\n    brand = \"Samsung\";\n    os = \"Tizen\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n    const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n    const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n    model = tizenMatch\n      ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim()\n      : \"Tizen TV\";\n  } else if (ua.includes(\"Philips\")) {\n    brand = \"Philips\";\n    os = \"Saphi\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n    brand = \"Sharp\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (\n    ua.includes(\"Android\") &&\n    (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))\n  ) {\n    brand = \"Sony\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (\n    ua.includes(\"Android\") &&\n    (ua.includes(\"NetCast\") || ua.includes(\"LG\"))\n  ) {\n    brand = \"LG\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n    brand = \"Roku\";\n    os = \"Roku OS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"AppleTV\")) {\n    brand = \"Apple\";\n    os = \"tvOS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  }\n\n  if (ua.includes(\"Android\")) {\n    isAndroid = true;\n    os = \"Android\";\n    deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n\n    if (\n      ua.includes(\"Android\") &&\n      (maxTouchPoints === 0 ||\n        ua.includes(\"Google TV\") ||\n        ua.includes(\"XiaoMi\"))\n    ) {\n      deviceType = \"tv\";\n      isSmartTV = true;\n      brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n    }\n\n    const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n    if (androidModelMatch && androidModelMatch[1]) {\n      model = androidModelMatch[1];\n    }\n  }\n\n  if (/iPad|iPhone|iPod/.test(ua)) {\n    os = \"iOS\";\n    deviceType = \"mobile\";\n    brand = \"Apple\";\n    if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n      deviceType = \"tablet\";\n    }\n  }\n\n  if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n    if (ua.includes(\"Windows\")) {\n      os = \"Windows\";\n      deviceType = \"desktop\";\n    } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n      os = \"macOS\";\n      deviceType = \"desktop\";\n      if (maxTouchPoints > 1) deviceType = \"tablet\";\n    } else if (ua.includes(\"Linux\")) {\n      os = \"Linux\";\n      deviceType = \"desktop\";\n    }\n  }\n\n  if (brand === \"Unknown\") {\n    if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n    if (vendor.includes(\"Apple\")) brand = \"Apple\";\n    if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n  }\n\n  isWebView = /wv|WebView|Linux; U;/.test(ua);\n\n  if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n    isWebView = true;\n  }\n\n  isWebApp =\n    window.matchMedia(\"(display-mode: standalone)\").matches ||\n    (window.navigator as any).standalone === true ||\n    window.screen?.orientation?.angle !== undefined;\n\n  return {\n    brand,\n    os,\n    model: model || ua.substring(0, 50) + \"...\",\n    deviceType,\n    isSmartTV,\n    isAndroid,\n    isWebView,\n    isWebApp,\n    domain: window.location.hostname,\n    origin: window.location.origin,\n    path: window.location.pathname,\n    userAgent: ua,\n    vendor,\n    platform,\n    screen: screenInfo,\n    hardwareConcurrency,\n    deviceMemory: memory,\n    maxTouchPoints,\n    language: navigator.language,\n    languages: navigator.languages?.join(\",\") || \"\",\n    cookieEnabled: navigator.cookieEnabled,\n    doNotTrack: navigator.doNotTrack || \"\",\n    referrer: document.referrer,\n    visibilityState: document.visibilityState,\n  };\n}\n\nasync function sha256Hex(input: string): Promise<string> {\n  if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n    try {\n      await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n\n      let encodedData: BufferSource;\n      if (typeof TextEncoder !== \"undefined\") {\n        encodedData = new TextEncoder().encode(input);\n      } else {\n        const utf8 = unescape(encodeURIComponent(input));\n        const buffer = new Uint8Array(utf8.length);\n        for (let i = 0; i < utf8.length; i++) {\n          buffer[i] = utf8.charCodeAt(i);\n        }\n        encodedData = buffer;\n      }\n\n      const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n      return Array.from(new Uint8Array(hashBuffer))\n        .map((b) => b.toString(16).padStart(2, \"0\"))\n        .join(\"\");\n    } catch {\n      console.warn(\n        \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n      );\n    }\n  }\n\n  let hash = 0;\n  for (let i = 0; i < input.length; i++) {\n    const char = input.charCodeAt(i);\n    hash = (hash << 5) - hash + char;\n    hash = hash & hash;\n  }\n\n  const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n  const timestamp = Date.now().toString(16).padStart(12, \"0\");\n  const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n\n  return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\n\nfunction resolvePlayerIdentitySeed(clientInfo: ClientInfo): string {\n  const nativeDeviceId = resolveNativeDeviceId();\n  if (nativeDeviceId) {\n    return `device:${nativeDeviceId}`;\n  }\n\n  const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n  if (persistedId) {\n    return `persisted:${persistedId}`;\n  }\n\n  return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\n\nexport async function getBrowserID(clientInfo: ClientInfo): Promise<string> {\n  if (cachedBrowserId) {\n    return cachedBrowserId;\n  }\n\n  cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n  return cachedBrowserId;\n}\n\ntype PlayerMetricFlags = {\n  adLoaded?: boolean;\n  adDetect?: boolean;\n  captureAt?: string;\n};\n\nfunction canPublish(licenseKey: string | undefined): licenseKey is string {\n  return Boolean(isMQTTEnabled() && licenseKey);\n}\n\nasync function buildPlayerMetricEvent(\n  context: PlayerAnalyticsContext = {},\n  flags: PlayerMetricFlags = {}\n): Promise<Record<string, unknown>> {\n  const clientInfo = getClientInfo();\n  const playerId = await getBrowserID(clientInfo);\n  const captureAt = flags.captureAt ?? new Date().toISOString();\n\n  return {\n    player_id: playerId,\n    device_type: clientInfo.deviceType,\n    os: clientInfo.os.toLowerCase(),\n    ad_loaded: flags.adLoaded ?? false,\n    ad_detect: flags.adDetect ?? false,\n    capture_at: captureAt,\n    ...(context.inputStreamType\n      ? { input_stream_type: context.inputStreamType }\n      : {}),\n  };\n}\n\nfunction publishTracking(\n  licenseKey: string,\n  channel: \"metrics\" | \"impressions\" | \"heartbeat\",\n  body: Record<string, unknown>\n): void {\n  ensureMQTTClient();\n  publishMQTT(buildPlayerTopic(licenseKey, channel), body);\n}\n\nexport async function sendInitialTracking(\n  licenseKey?: string,\n  context: PlayerAnalyticsContext = {}\n): Promise<void> {\n  if (!canPublish(licenseKey)) return;\n\n  try {\n    const metricEvent = await buildPlayerMetricEvent(context, {\n      adLoaded: false,\n      adDetect: false,\n    });\n\n    publishTracking(licenseKey, \"metrics\", {\n      events: [metricEvent],\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n      error\n    );\n  }\n}\n\nexport async function sendAdDetectTracking(\n  licenseKey: string | undefined,\n  adDetectInfo: AdDetectInfo,\n  context: PlayerAnalyticsContext = {}\n): Promise<void> {\n  try {\n    await sendHeartbeat(licenseKey, context, {\n      adDetect: true,\n      captureAt: adDetectInfo.timestamp,\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n      error\n    );\n  }\n}\n\nexport async function sendAdLoadedTracking(\n  licenseKey: string | undefined,\n  adLoadedInfo: AdLoadedInfo,\n  context: PlayerAnalyticsContext = {}\n): Promise<void> {\n  try {\n    await sendHeartbeat(licenseKey, context, {\n      adLoaded: true,\n      captureAt: adLoadedInfo.timestamp,\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n      error\n    );\n  }\n}\n\nexport async function sendAdImpressionTracking(\n  licenseKey: string | undefined,\n  adImpressionInfo: AdImpressionInfo,\n  context: PlayerAnalyticsContext = {}\n): Promise<void> {\n  if (!canPublish(licenseKey)) return;\n\n  try {\n    const metricEvent = await buildPlayerMetricEvent(context, {\n      captureAt: adImpressionInfo.timestamp,\n    });\n\n    publishTracking(licenseKey, \"heartbeat\", metricEvent);\n    publishTracking(licenseKey, \"impressions\", {\n      events: [\n        {\n          player_id: metricEvent.player_id,\n          ad_played_count: 1,\n          ad_url: adImpressionInfo.adUrl,\n          capture_at: adImpressionInfo.timestamp,\n        },\n      ],\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n      error\n    );\n  }\n}\n\nexport async function sendHeartbeat(\n  licenseKey?: string,\n  context: PlayerAnalyticsContext = {},\n  flags: PlayerMetricFlags = {}\n): Promise<void> {\n  if (!canPublish(licenseKey)) return;\n\n  try {\n    const heartbeatData = await buildPlayerMetricEvent(context, flags);\n    publishTracking(licenseKey, \"heartbeat\", heartbeatData);\n  } catch (error) {\n    console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n  }\n}\n","export function polyfillURLSearchParams(): void {\n  if (typeof URLSearchParams !== 'undefined') {\n    return;\n  }\n\n  class URLSearchParamsPolyfill {\n    private params: Map<string, string[]>;\n\n    constructor(init?: string | URLSearchParamsPolyfill) {\n      this.params = new Map();\n\n      if (typeof init === 'string') {\n        this.parseQueryString(init);\n      } else if (init instanceof URLSearchParamsPolyfill) {\n        init.forEach((value, key) => {\n          this.append(key, value);\n        });\n      }\n    }\n\n    private parseQueryString(query: string): void {\n      const cleanQuery = query.startsWith('?') ? query.slice(1) : query;\n      if (!cleanQuery) return;\n\n      cleanQuery.split('&').forEach((param) => {\n        const [key, value] = param.split('=');\n        if (key) {\n          const decodedKey = this.safeDecodeURIComponent(key);\n          const decodedValue = value ? this.safeDecodeURIComponent(value) : '';\n          this.append(decodedKey, decodedValue);\n        }\n      });\n    }\n\n    private safeDecodeURIComponent(str: string): string {\n      try {\n        return decodeURIComponent(str.replace(/\\+/g, ' '));\n      } catch (e) {\n        return str;\n      }\n    }\n\n    append(name: string, value: string): void {\n      const values = this.params.get(name) || [];\n      values.push(String(value));\n      this.params.set(name, values);\n    }\n\n    delete(name: string): void {\n      this.params.delete(name);\n    }\n\n    get(name: string): string | null {\n      const values = this.params.get(name);\n      return values && values.length > 0 && values[0] !== undefined ? values[0] : null;\n    }\n\n    getAll(name: string): string[] {\n      return this.params.get(name) || [];\n    }\n\n    has(name: string): boolean {\n      return this.params.has(name);\n    }\n\n    set(name: string, value: string): void {\n      this.params.set(name, [String(value)]);\n    }\n\n    forEach(callback: (value: string, key: string, parent: URLSearchParamsPolyfill) => void): void {\n      this.params.forEach((values, key) => {\n        values.forEach((value) => {\n          callback(value, key, this);\n        });\n      });\n    }\n\n    toString(): string {\n      const parts: string[] = [];\n      this.params.forEach((values, key) => {\n        values.forEach((value) => {\n          parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n        });\n      });\n      return parts.join('&');\n    }\n  }\n\n  // @ts-ignore\n  window.URLSearchParams = URLSearchParamsPolyfill;\n}\n\nexport function polyfillTextEncoder(): void {\n  if (typeof TextEncoder !== 'undefined') {\n    return;\n  }\n\n  class TextEncoderPolyfill {\n    encoding = 'utf-8';\n\n    encode(str: string): Uint8Array {\n      const utf8: number[] = [];\n      for (let i = 0; i < str.length; i++) {\n        let charcode = str.charCodeAt(i);\n        if (charcode < 0x80) {\n          utf8.push(charcode);\n        } else if (charcode < 0x800) {\n          utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));\n        } else if (charcode < 0xd800 || charcode >= 0xe000) {\n          utf8.push(\n            0xe0 | (charcode >> 12),\n            0x80 | ((charcode >> 6) & 0x3f),\n            0x80 | (charcode & 0x3f)\n          );\n        } else {\n          i++;\n          charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n          utf8.push(\n            0xf0 | (charcode >> 18),\n            0x80 | ((charcode >> 12) & 0x3f),\n            0x80 | ((charcode >> 6) & 0x3f),\n            0x80 | (charcode & 0x3f)\n          );\n        }\n      }\n      return new Uint8Array(utf8);\n    }\n  }\n\n  // @ts-ignore\n  window.TextEncoder = TextEncoderPolyfill;\n}\n\nexport function polyfillPromiseFinally(): void {\n  if (typeof Promise !== 'undefined' && !Promise.prototype.finally) {\n    Promise.prototype.finally = function (callback: () => void) {\n      const constructor = this.constructor as PromiseConstructor;\n      return this.then(\n        (value) => constructor.resolve(callback()).then(() => value),\n        (reason) =>\n          constructor.resolve(callback()).then(() => {\n            throw reason;\n          })\n      );\n    };\n  }\n}\n\nexport function polyfillObjectAssign(): void {\n  if (typeof Object.assign !== 'function') {\n    Object.assign = function (target: any, ...sources: any[]) {\n      if (target == null) {\n        throw new TypeError('Cannot convert undefined or null to object');\n      }\n\n      const to = Object(target);\n\n      for (let i = 0; i < sources.length; i++) {\n        const nextSource = sources[i];\n\n        if (nextSource != null) {\n          for (const nextKey in nextSource) {\n            if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n              to[nextKey] = nextSource[nextKey];\n            }\n          }\n        }\n      }\n\n      return to;\n    };\n  }\n}\n\nexport function polyfillArrayFrom(): void {\n  if (!Array.from) {\n    Array.from = function (arrayLike: any, mapFn?: any, thisArg?: any) {\n      const items = Object(arrayLike);\n      if (arrayLike == null) {\n        throw new TypeError('Array.from requires an array-like object');\n      }\n\n      const len = items.length >>> 0;\n      const result = new Array(len);\n\n      for (let i = 0; i < len; i++) {\n        if (mapFn) {\n          result[i] = mapFn.call(thisArg, items[i], i);\n        } else {\n          result[i] = items[i];\n        }\n      }\n\n      return result;\n    };\n  }\n}\n\nexport function polyfillStringStartsWith(): void {\n  if (!String.prototype.startsWith) {\n    String.prototype.startsWith = function (search: string, pos?: number) {\n      pos = !pos || pos < 0 ? 0 : +pos;\n      return this.substring(pos, pos + search.length) === search;\n    };\n  }\n}\n\nexport function polyfillStringEndsWith(): void {\n  if (!String.prototype.endsWith) {\n    String.prototype.endsWith = function (search: string, length?: number) {\n      if (length === undefined || length > this.length) {\n        length = this.length;\n      }\n      return this.substring(length - search.length, length) === search;\n    };\n  }\n}\n\nexport function polyfillStringIncludes(): void {\n  if (!String.prototype.includes) {\n    String.prototype.includes = function (search: string, start?: number) {\n      if (typeof start !== 'number') {\n        start = 0;\n      }\n      if (start + search.length > this.length) {\n        return false;\n      }\n      return this.indexOf(search, start) !== -1;\n    };\n  }\n}\n\nexport function initializePolyfills(): void {\n  polyfillObjectAssign();\n  polyfillArrayFrom();\n  polyfillStringStartsWith();\n  polyfillStringEndsWith();\n  polyfillStringIncludes();\n  polyfillURLSearchParams();\n  polyfillTextEncoder();\n  polyfillPromiseFinally();\n}\n\n","import {\n  inferDeviceIdType,\n  isEquivalentDeviceIdType,\n} from \"./vastEnvironmentSignals\";\n\nexport interface VastConsentSignals {\n  gdpr?: string | undefined;\n  gdprConsent?: string | undefined;\n  usPrivacy?: string | undefined;\n}\n\nexport interface VastMacroContext {\n  correlator: string;\n  streamCorrelator: string;\n  pod?: number | undefined;\n  adPosition?: number | undefined;\n  isCtv?: boolean | undefined;\n  contentUrl?: string | undefined;\n  pageUrl?: string | undefined;\n  adWillPlayMuted?: boolean | undefined;\n  adWillAutoPlay?: boolean | undefined;\n  appId?: string | undefined;\n  appName?: string | undefined;\n  sessionId?: string | undefined;\n  deviceId?: string | undefined;\n  deviceIdType?: string | undefined;\n  limitAdTracking?: boolean | undefined;\n  deviceTypeHint?: number | undefined;\n  adTest?: boolean | undefined;\n  consent?: VastConsentSignals | undefined;\n}\n\nconst UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nconst INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nconst EXAMPLE_COM_URL = /example\\.com/i;\nconst CTV_UNSUPPORTED_PARAMS = [\n  \"description_url\",\n  \"tfcd\",\n  \"npa\",\n  \"min_ad_duration\",\n  \"max_ad_duration\",\n  \"unviewed_position_start\",\n  \"impl\",\n  \"vad_type\",\n  \"gdpr\",\n  \"gdpr_consent\",\n  \"us_privacy\",\n];\n\nconst INLINE_DEVICE_MACRO_REPLACEMENTS: Array<{\n  pattern: RegExp;\n  getValue: (ctx: VastMacroContext) => string | undefined;\n}> = [\n  { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) =>\n      ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined },\n  { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) =>\n      ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined },\n  { pattern: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n  { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\n  { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n  { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator },\n];\n\nexport function isMacroPlaceholder(value: string | null | undefined): boolean {\n  if (value == null) return true;\n  const trimmed = value.trim();\n  if (!trimmed) return true;\n  if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n  return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\n\nexport function generateCorrelator(): string {\n  if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n    try {\n      const buf = new Uint32Array(2);\n      crypto.getRandomValues(buf);\n      const value = (buf[0] ?? 0) * 0x200000 + ((buf[1] ?? 0) & 0x1fffff);\n      if (value > 0) {\n        return String(value);\n      }\n    } catch {\n    }\n  }\n  return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\n\nfunction expandInlineMacroPlaceholders(baseUrl: string, ctx: VastMacroContext): string {\n  let url = baseUrl;\n  for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n    const value = getValue(ctx);\n    if (value != null && value !== \"\") {\n      url = url.replace(pattern, encodeURIComponent(value));\n    }\n  }\n  return url;\n}\n\nfunction applyDeviceIdentityParams(\n  params: URLSearchParams,\n  ctx: VastMacroContext\n): void {\n  const runtimeId = ctx.deviceId?.trim();\n  const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n  const tagRdid = params.get(\"rdid\");\n  const tagType = params.get(\"idtype\");\n  const tagLat = params.get(\"is_lat\");\n  const latValue =\n    ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined;\n\n  if (runtimeId) {\n    params.set(\"rdid\", runtimeId);\n    params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n    params.set(\"is_lat\", latValue ?? (isMacroPlaceholder(tagLat) ? \"0\" : tagLat!));\n    return;\n  }\n\n  const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder(tagRdid));\n  const tagTypeValid = Boolean(tagType && !isMacroPlaceholder(tagType));\n\n  if (\n    tagRdidValid &&\n    tagTypeValid &&\n    runtimeType &&\n    !isEquivalentDeviceIdType(tagType!, runtimeType)\n  ) {\n    params.delete(\"rdid\");\n    params.delete(\"idtype\");\n    params.delete(\"is_lat\");\n    return;\n  }\n\n  if (tagRdidValid) {\n    if (isMacroPlaceholder(tagType) && runtimeType) {\n      params.set(\"idtype\", runtimeType);\n    }\n    if (isMacroPlaceholder(tagLat)) {\n      params.set(\"is_lat\", latValue ?? \"0\");\n    }\n    return;\n  }\n\n  params.delete(\"rdid\");\n  params.delete(\"idtype\");\n  params.delete(\"is_lat\");\n}\n\nfunction removeBrokenAppNameOrphans(\n  params: URLSearchParams,\n  appName?: string\n): void {\n  const toDelete: string[] = [];\n\n  params.forEach((_value, key) => {\n    if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n      toDelete.push(key);\n    }\n  });\n\n  if (appName && appName.includes(\"&\")) {\n    for (const suffix of appName.split(\"&\").slice(1)) {\n      const trimmed = suffix.trimStart();\n      if (!trimmed) continue;\n      toDelete.push(suffix, ` ${trimmed}`, trimmed);\n    }\n  }\n\n  for (const key of new Set(toDelete)) {\n    if (key) params.delete(key);\n  }\n}\n\nexport function normalizeVastTagUrl(raw: string): string {\n  if (!raw) return raw;\n\n  try {\n    const url = new URL(raw);\n\n    const anValue = url.searchParams.get(\"an\");\n    if (anValue !== null) {\n      const orphanFragments: string[] = [];\n      url.searchParams.forEach((_value, key) => {\n        if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n          orphanFragments.push(key.trim());\n        }\n      });\n      if (orphanFragments.length > 0) {\n        const reconstructed = [anValue.trimEnd(), ...orphanFragments]\n          .filter(Boolean)\n          .join(\" & \");\n\n        url.searchParams.forEach((_value, key) => {\n          if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n            url.searchParams.delete(key);\n          }\n        });\n        url.searchParams.set(\"an\", reconstructed);\n\n        return url.toString().replace(\n          /([?&]an=)([^&]*)/,\n          (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n        );\n      }\n    }\n\n    removeBrokenAppNameOrphans(url.searchParams);\n    return url.toString();\n  } catch {\n    return raw;\n  }\n}\n\nexport function applyVastMacros(\n  baseUrl: string,\n  ctx: VastMacroContext\n): string {\n  const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n  let url: URL;\n  try {\n    url = new URL(normalizeVastTagUrl(expandedUrl));\n  } catch {\n    return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n  }\n\n  const params = url.searchParams;\n\n  removeBrokenAppNameOrphans(params, ctx.appName);\n\n  params.set(\"correlator\", ctx.correlator);\n  params.set(\"scor\", ctx.streamCorrelator);\n  if (ctx.isCtv) {\n    for (const key of CTV_UNSUPPORTED_PARAMS) {\n      params.delete(key);\n    }\n  }\n\n  if (ctx.pod != null) {\n    params.set(\"pod\", String(ctx.pod));\n  }\n  if (ctx.adPosition != null) {\n    params.set(\"ppos\", String(ctx.adPosition));\n  }\n\n  const requestUrl = ctx.contentUrl || ctx.pageUrl;\n  if (requestUrl) {\n    params.set(\"url\", requestUrl);\n    if (!ctx.isCtv) {\n      params.set(\"description_url\", requestUrl);\n    }\n  } else {\n    const existingUrl = params.get(\"url\") || \"\";\n    if (EXAMPLE_COM_URL.test(existingUrl)) {\n      params.delete(\"url\");\n      params.delete(\"description_url\");\n    }\n  }\n\n  if (ctx.adWillPlayMuted != null) {\n    params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n  }\n  if (ctx.adWillAutoPlay != null) {\n    params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n  }\n\n  if (ctx.appId) {\n    params.set(\"msid\", ctx.appId);\n  }\n  if (ctx.appName) {\n    removeBrokenAppNameOrphans(params, ctx.appName);\n    params.set(\"an\", ctx.appName);\n  }\n  if (ctx.sessionId) {\n    params.set(\"sid\", ctx.sessionId);\n  }\n  if (ctx.deviceTypeHint != null) {\n    params.set(\"dth\", String(ctx.deviceTypeHint));\n  } else if (ctx.isCtv) {\n    params.set(\"dth\", \"5\");\n  }\n\n  applyDeviceIdentityParams(params, ctx);\n\n  if (!ctx.isCtv) {\n    const consent = ctx.consent;\n    if (consent?.gdpr != null) {\n      params.set(\"gdpr\", consent.gdpr);\n    }\n    if (consent?.gdprConsent != null) {\n      params.set(\"gdpr_consent\", consent.gdprConsent);\n    }\n    if (consent?.usPrivacy != null) {\n      params.set(\"us_privacy\", consent.usPrivacy);\n    }\n  }\n\n  if (ctx.adTest) {\n    params.set(\"adtest\", \"on\");\n  }\n\n  const staleKeys: string[] = [];\n  params.forEach((value, key) => {\n    if (isMacroPlaceholder(value)) {\n      staleKeys.push(key);\n    }\n  });\n  for (const key of staleKeys) {\n    params.delete(key);\n  }\n\n  removeBrokenAppNameOrphans(params, ctx.appName);\n\n  return url.toString();\n}\n\nfunction replaceCorrelatorFallback(baseUrl: string, correlator: string): string {\n  const correlatorRegex = /([?&])correlator=([^&]*)/;\n  if (correlatorRegex.test(baseUrl)) {\n    return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n  }\n  const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n  return `${baseUrl}${sep}correlator=${correlator}`;\n}\n\nexport function fetchConsentSignals(\n  timeoutMs: number = 1500\n): Promise<VastConsentSignals> {\n  const signals: VastConsentSignals = {};\n  if (typeof window === \"undefined\") {\n    return Promise.resolve(signals);\n  }\n\n  const tasks: Promise<void>[] = [];\n\n  const tcfApi = (window as any).__tcfapi;\n  if (typeof tcfApi === \"function\") {\n    tasks.push(\n      new Promise<void>((resolve) => {\n        let settled = false;\n        try {\n          tcfApi(\"addEventListener\", 2, (tcData: any, success: boolean) => {\n            if (settled) return;\n            if (\n              success &&\n              tcData &&\n              (tcData.eventStatus === \"tcloaded\" ||\n                tcData.eventStatus === \"useractioncomplete\")\n            ) {\n              settled = true;\n              signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n              if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n                signals.gdprConsent = tcData.tcString;\n              }\n              try {\n                tcfApi(\"removeEventListener\", 2, () => {}, tcData.listenerId);\n              } catch {}\n              resolve();\n            }\n          });\n        } catch {\n          resolve();\n        }\n        setTimeout(() => {\n          if (!settled) {\n            settled = true;\n            resolve();\n          }\n        }, timeoutMs);\n      })\n    );\n  }\n\n  const uspApi = (window as any).__uspapi;\n  if (typeof uspApi === \"function\") {\n    tasks.push(\n      new Promise<void>((resolve) => {\n        try {\n          uspApi(\"getUSPData\", 1, (data: any, success: boolean) => {\n            if (success && typeof data?.uspString === \"string\" && data.uspString) {\n              signals.usPrivacy = data.uspString;\n            }\n            resolve();\n          });\n        } catch {\n          resolve();\n        }\n        setTimeout(resolve, timeoutMs);\n      })\n    );\n  }\n\n  if (tasks.length === 0) {\n    return Promise.resolve(signals);\n  }\n\n  return Promise.all(tasks).then(() => signals);\n}\n","interface NavigatorUAData {\n  platform?: string;\n  brands?: Array<{ brand: string; version: string }>;\n  mobile?: boolean;\n}\n\ndeclare global {\n  interface Navigator {\n    userAgentData?: NavigatorUAData;\n  }\n}\n\nexport interface BrowserInfo {\n  name: string;\n  version: string;\n  majorVersion: number;\n  isSmartTV: boolean;\n  isLegacyTV: boolean;\n  platform: string;\n  supportsModernJS: boolean;\n  webOSVersion?: number | undefined;\n  tizenVersion?: number | undefined;\n  chromeVersion?: number | undefined;\n}\n\nfunction getChromeVersion(ua: string): number {\n  const match = ua.match(/Chrome\\/(\\d+)/);\n  return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getWebKitVersion(ua: string): number {\n  const match = ua.match(/AppleWebKit\\/(\\d+)/);\n  return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getPlatform(): string {\n  if ('userAgentData' in navigator && navigator.userAgentData?.platform) {\n    return navigator.userAgentData.platform;\n  }\n\n  const ua = navigator.userAgent;\n  if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n    return /iPhone|iPad|iPod/i.test(ua) ? 'iPhone' : 'MacIntel';\n  }\n  if (/Win/i.test(ua)) {\n    return 'Win32';\n  }\n  if (/Linux/i.test(ua)) {\n    return /Android/i.test(ua) ? 'Linux armv8l' : 'Linux x86_64';\n  }\n  if (/CrOS/i.test(ua)) {\n    return 'CrOS';\n  }\n\n  // eslint-disable-next-line deprecation/deprecation\n  return (navigator as any).platform || 'Unknown';\n}\n\nexport function detectBrowser(): BrowserInfo {\n  const ua = navigator.userAgent;\n  const platform = getPlatform();\n\n  let name = 'Unknown';\n  let version = '0';\n  let majorVersion = 0;\n  let isSmartTV = false;\n  let isLegacyTV = false;\n  let supportsModernJS = true;\n  let webOSVersion: number | undefined;\n  let tizenVersion: number | undefined;\n  let chromeVersionNum: number | undefined;\n\n  const chromeVersion = getChromeVersion(ua);\n  const webkitVersion = getWebKitVersion(ua);\n  chromeVersionNum = chromeVersion > 0 ? chromeVersion : undefined;\n\n  if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n    name = 'LG WebOS';\n    isSmartTV = true;\n\n    let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n\n    if (!match || !match[1]) {\n      match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n    }\n\n    if (match && match[1]) {\n      version = match[1];\n      const parts = version.split('.');\n      majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n      webOSVersion = majorVersion;\n    } else if (chromeVersion > 0) {\n      if (chromeVersion >= 79) {\n        webOSVersion = 6;\n        version = '6.0';\n        majorVersion = 6;\n      } else if (chromeVersion >= 68) {\n        webOSVersion = 5;\n        version = '5.0';\n        majorVersion = 5;\n      } else if (chromeVersion >= 53) {\n        webOSVersion = 4;\n        version = '4.0';\n        majorVersion = 4;\n      } else if (chromeVersion >= 38) {\n        webOSVersion = 3;\n        version = '3.0';\n        majorVersion = 3;\n      } else {\n        webOSVersion = 2;\n        version = '2.0';\n        majorVersion = 2;\n      }\n    } else {\n      version = 'Unknown';\n      webOSVersion = undefined;\n    }\n\n    isLegacyTV = webOSVersion !== undefined && webOSVersion < 3;\n  } else if (/Tizen/i.test(ua)) {\n    name = 'Samsung Tizen';\n    isSmartTV = true;\n    const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n    version = match && match[1] ? match[1] : 'Unknown';\n    if (version !== 'Unknown') {\n      const parts = version.split('.');\n      majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n      tizenVersion = majorVersion;\n    }\n\n    isLegacyTV = tizenVersion !== undefined && tizenVersion < 3;\n  } else if (/SMART-TV|SmartTV/i.test(ua)) {\n    name = 'Smart TV';\n    isSmartTV = true;\n    isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n  } else if (/NetCast/i.test(ua)) {\n    name = 'LG NetCast';\n    isSmartTV = true;\n    isLegacyTV = true;\n  } else if (/BRAVIA/i.test(ua)) {\n    name = 'Sony BRAVIA';\n    isSmartTV = true;\n    isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n  } else {\n    if (chromeVersion > 0) {\n      name = 'Chrome';\n      version = chromeVersion.toString();\n      majorVersion = chromeVersion;\n\n      if (chromeVersion < 50) {\n        supportsModernJS = false;\n      }\n    }\n\n    if (webkitVersion > 0 && webkitVersion < 600) {\n      supportsModernJS = false;\n    }\n  }\n\n  if (typeof Promise === 'undefined' ||\n      typeof Map === 'undefined' ||\n      typeof Set === 'undefined') {\n    supportsModernJS = false;\n  }\n\n  if (typeof URLSearchParams === 'undefined') {\n    supportsModernJS = false;\n  }\n\n  return {\n    name,\n    version,\n    majorVersion,\n    isSmartTV,\n    isLegacyTV,\n    platform,\n    supportsModernJS,\n    webOSVersion,\n    tizenVersion,\n    chromeVersion: chromeVersionNum,\n  };\n}\n\nexport function getBrowserConfigOverrides(): {\n  allowNativeHls?: boolean;\n} {\n  const browser = detectBrowser();\n  const overrides: { allowNativeHls?: boolean } = {};\n\n  if (browser.isSmartTV) {\n    overrides.allowNativeHls = true;\n  }\n\n  return overrides;\n}\n\nexport function supportsModernJS(): boolean {\n  try {\n    return (\n      typeof Promise !== 'undefined' &&\n      typeof Map !== 'undefined' &&\n      typeof Set !== 'undefined' &&\n      typeof Array.from !== 'undefined' &&\n      typeof Object.assign !== 'undefined' &&\n      typeof Array.prototype.forEach !== 'undefined' &&\n      typeof String.prototype.includes !== 'undefined'\n    );\n  } catch (e) {\n    return false;\n  }\n}\n\nexport function logBrowserInfo(debug: boolean = false): void {\n  if (!debug) return;\n\n  const browser = detectBrowser();\n\n  console.log('[StormcloudVideoPlayer] Browser Compatibility Info:', {\n    browser: `${browser.name} ${browser.version}`,\n    platform: browser.platform,\n    isSmartTV: browser.isSmartTV,\n    isLegacyTV: browser.isLegacyTV,\n    supportsModernJS: browser.supportsModernJS,\n    ...(browser.webOSVersion !== undefined ? { webOSVersion: browser.webOSVersion } : {}),\n    ...(browser.tizenVersion !== undefined ? { tizenVersion: browser.tizenVersion } : {}),\n    ...(browser.chromeVersion !== undefined ? { chromeVersion: browser.chromeVersion } : {}),\n    userAgent: navigator.userAgent,\n  });\n}\n\nexport function supportsFeature(feature: string): boolean {\n  switch (feature) {\n    case 'urlsearchparams':\n      return typeof URLSearchParams !== 'undefined';\n    case 'textencoder':\n      return typeof TextEncoder !== 'undefined';\n    case 'promises':\n      return typeof Promise !== 'undefined';\n    case 'fetch':\n      return typeof fetch !== 'undefined';\n    case 'crypto':\n      return typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined';\n    default:\n      return false;\n  }\n}\n","import type { Scte35Marker, Id3TagInfo } from \"../types\";\n\nexport function parseCueOutDuration(value: string): number | undefined {\n  const num = parseFloat(value.trim());\n  if (!Number.isNaN(num)) return num;\n  const match =\n    value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) ||\n    value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n  if (match && match[1] != null) {\n    const dStr = match[1];\n    const d = parseFloat(dStr);\n    return Number.isNaN(d) ? undefined : d;\n  }\n  return undefined;\n}\n\nexport function parseCueOutCont(\n  value: string\n): { elapsed?: number; duration?: number } | undefined {\n  const res: { elapsed?: number; duration?: number } = {};\n\n  const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n  const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n  if (elapsedMatch && elapsedMatch[1] != null) {\n    const e = parseFloat(elapsedMatch[1]);\n    if (!Number.isNaN(e)) res.elapsed = e;\n  }\n  if (durationMatch && durationMatch[1] != null) {\n    const d = parseFloat(durationMatch[1]);\n    if (!Number.isNaN(d)) res.duration = d;\n  }\n\n  if (!(\"elapsed\" in res) || !(\"duration\" in res)) {\n    const slashMatch = value.match(/([0-9.]+)\\s*\\/\\s*([0-9.]+)/);\n    if (slashMatch && slashMatch[1] && slashMatch[2]) {\n      const elapsed = parseFloat(slashMatch[1]);\n      const duration = parseFloat(slashMatch[2]);\n      if (!Number.isNaN(elapsed) && !(\"elapsed\" in res)) res.elapsed = elapsed;\n      if (!Number.isNaN(duration) && !(\"duration\" in res)) res.duration = duration;\n    }\n  }\n\n  if (\"elapsed\" in res || \"duration\" in res) return res;\n  return undefined;\n}\n\nexport function parseAttributeList(value: string): Record<string, string> {\n  const attrs: Record<string, string> = {};\n  const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n  let match: RegExpExecArray | null;\n  while ((match = regex.exec(value)) !== null) {\n    const key: string = (match[1] ?? \"\") as string;\n    let rawVal: string = (match[3] ?? match[4] ?? \"\") as string;\n    if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n      rawVal = rawVal.slice(1, -1);\n    }\n    if (key) {\n      attrs[key] = rawVal;\n    }\n  }\n  return attrs;\n}\n\nexport function toNumber(val: unknown): number | undefined {\n  if (val == null) return undefined;\n  const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n  return Number.isNaN(n) ? undefined : n;\n}\n\nexport function isManifestBasedMarker(marker: Scte35Marker): boolean {\n  const raw = marker.raw as any;\n  if (!raw) return false;\n\n  if (raw.tag) {\n    const tag = String(raw.tag);\n    return (\n      tag.includes(\"EXT-X-CUE-OUT\") ||\n      tag.includes(\"EXT-X-CUE-IN\") ||\n      tag.includes(\"EXT-X-DATERANGE\")\n    );\n  }\n\n  if (raw.id3) return false;\n\n  if (raw.splice_command_type) return false;\n\n  return false;\n}\n\nexport function decodeId3ValueToText(value: string | Uint8Array): string | undefined {\n  try {\n    if (typeof value === \"string\") return value;\n    const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n    const text = decoder.decode(value);\n    if (text && /[\\x20-\\x7E]/.test(text)) return text;\n    let out = \"\";\n    for (let i = 0; i < value.length; i++)\n      out += String.fromCharCode(value[i]!);\n    return out;\n  } catch {\n    return undefined;\n  }\n}\n\nexport function getFragmentStartSeconds(frag: any): number | undefined {\n  const candidates = [frag?.start, frag?.startPTS];\n  for (const candidate of candidates) {\n    if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n      return candidate;\n    }\n  }\n  return undefined;\n}\n\nexport function parseScte35FromId3(tag: Id3TagInfo): Scte35Marker | undefined {\n  const text = decodeId3ValueToText(tag.value);\n  if (!text) return undefined;\n\n  const cueOutMatch =\n    text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) ||\n    text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n  if (cueOutMatch) {\n    const arg = (cueOutMatch[1] ?? \"\").trim();\n    const dur = parseCueOutDuration(arg);\n    const marker: Scte35Marker = {\n      type: \"start\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      ...(dur !== undefined ? { durationSeconds: dur } : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n\n  const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n  if (cueOutContMatch) {\n    const arg = (cueOutContMatch[1] ?? \"\").trim();\n    const cont = parseCueOutCont(arg);\n    const marker: Scte35Marker = {\n      type: \"progress\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      ...(cont?.duration !== undefined\n        ? { durationSeconds: cont.duration }\n        : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n\n  const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n  if (cueInMatch) {\n    const marker: Scte35Marker = {\n      type: \"end\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n\n  const daterangeMatch = text.match(/EXT-X-DATERANGE:([^\\r\\n]*)/i);\n  if (daterangeMatch) {\n    const attrs = parseAttributeList(daterangeMatch[1] ?? \"\");\n    const hasScteOut =\n      \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== undefined;\n    const hasScteIn =\n      \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== undefined;\n    const klass = String(attrs[\"CLASS\"] ?? \"\");\n    const duration = toNumber(attrs[\"DURATION\"]);\n    if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n      const marker: Scte35Marker = {\n        type: \"start\",\n        ...(tag.ptsSeconds !== undefined\n          ? { ptsSeconds: tag.ptsSeconds }\n          : {}),\n        ...(duration !== undefined ? { durationSeconds: duration } : {}),\n        raw: { id3: text, attrs },\n      } as Scte35Marker;\n      return marker;\n    }\n    if (hasScteIn) {\n      const marker: Scte35Marker = {\n        type: \"end\",\n        ...(tag.ptsSeconds !== undefined\n          ? { ptsSeconds: tag.ptsSeconds }\n          : {}),\n        raw: { id3: text, attrs },\n      } as Scte35Marker;\n      return marker;\n    }\n  }\n\n  if (/SCTE35-OUT/i.test(text)) {\n    const marker: Scte35Marker = {\n      type: \"start\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n  if (/SCTE35-IN/i.test(text)) {\n    const marker: Scte35Marker = {\n      type: \"end\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n\n  if (tag.value instanceof Uint8Array) {\n    const bin = parseScte35Binary(tag.value);\n    if (bin) return bin;\n  }\n\n  return undefined;\n}\n\nexport function normalizeFragmentPayload(payload: unknown): Uint8Array | undefined {\n  if (payload instanceof Uint8Array) {\n    return payload;\n  }\n  if (payload instanceof ArrayBuffer) {\n    return new Uint8Array(payload);\n  }\n  if (ArrayBuffer.isView(payload)) {\n    const view = payload as ArrayBufferView;\n    return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n  }\n  return undefined;\n}\n\n// --- Transport Stream SCTE-35 parsing ---\n\nexport function detectTsPacketFormat(\n  data: Uint8Array\n): { offset: number; packetSize: number; tsPayloadOffset: number } | undefined {\n  const packetSizes = [188, 192, 204];\n  for (const packetSize of packetSizes) {\n    const tsPayloadOffset = packetSize === 192 ? 4 : 0;\n    for (let offset = 0; offset < packetSize; offset++) {\n      let matchedPackets = 0;\n      for (\n        let packetStart = offset;\n        packetStart + tsPayloadOffset < data.length &&\n        matchedPackets < 5;\n        packetStart += packetSize\n      ) {\n        if (data[packetStart + tsPayloadOffset] !== 0x47) {\n          break;\n        }\n        matchedPackets++;\n      }\n      if (matchedPackets >= 2) {\n        return { offset, packetSize, tsPayloadOffset };\n      }\n    }\n  }\n  return undefined;\n}\n\nfunction getPsiSectionStart(\n  payload: Uint8Array,\n  payloadUnitStart: boolean\n): number | undefined {\n  if (!payloadUnitStart) {\n    return undefined;\n  }\n  const pointerField = payload[0];\n  if (pointerField == null) {\n    return undefined;\n  }\n  const sectionStart = 1 + pointerField;\n  return sectionStart < payload.length ? sectionStart : undefined;\n}\n\nfunction getPsiSectionLength(data: Uint8Array, offset: number): number {\n  return (((data[offset + 1] ?? 0) & 0x0f) << 8) | (data[offset + 2] ?? 0);\n}\n\nfunction parsePatSection(\n  payload: Uint8Array,\n  payloadUnitStart: boolean,\n  pmtPids: Set<number>\n): void {\n  const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n  if (sectionStart == null || sectionStart + 8 >= payload.length) {\n    return;\n  }\n  if (payload[sectionStart] !== 0x00) {\n    return;\n  }\n\n  const sectionLength = getPsiSectionLength(payload, sectionStart);\n  const sectionEnd = Math.min(\n    payload.length,\n    sectionStart + 3 + sectionLength\n  );\n\n  for (let offset = sectionStart + 8; offset + 4 <= sectionEnd - 4; offset += 4) {\n    const programNumber =\n      ((payload[offset] ?? 0) << 8) | (payload[offset + 1] ?? 0);\n    const pid =\n      (((payload[offset + 2] ?? 0) & 0x1f) << 8) |\n      (payload[offset + 3] ?? 0);\n    if (programNumber !== 0) {\n      pmtPids.add(pid);\n    }\n  }\n}\n\nfunction descriptorsIdentifyScte35(\n  data: Uint8Array,\n  start: number,\n  end: number\n): boolean {\n  let offset = start;\n  while (offset + 2 <= end) {\n    const tag = data[offset] ?? 0;\n    const length = data[offset + 1] ?? 0;\n    const descriptorStart = offset + 2;\n    const descriptorEnd = descriptorStart + length;\n    if (descriptorEnd > end) {\n      return false;\n    }\n\n    const registration =\n      length >= 4\n        ? String.fromCharCode(\n            data[descriptorStart] ?? 0,\n            data[descriptorStart + 1] ?? 0,\n            data[descriptorStart + 2] ?? 0,\n            data[descriptorStart + 3] ?? 0\n          )\n        : \"\";\n    if (tag === 0x8a || registration === \"CUEI\" || registration === \"SCTE\") {\n      return true;\n    }\n\n    offset = descriptorEnd;\n  }\n  return false;\n}\n\nfunction parsePmtSection(\n  payload: Uint8Array,\n  payloadUnitStart: boolean,\n  tsScte35Pids: Set<number>\n): void {\n  const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n  if (sectionStart == null || sectionStart + 12 >= payload.length) {\n    return;\n  }\n  if (payload[sectionStart] !== 0x02) {\n    return;\n  }\n\n  const sectionLength = getPsiSectionLength(payload, sectionStart);\n  const sectionEnd = Math.min(\n    payload.length,\n    sectionStart + 3 + sectionLength\n  );\n  const programInfoLength =\n    (((payload[sectionStart + 10] ?? 0) & 0x0f) << 8) |\n    (payload[sectionStart + 11] ?? 0);\n\n  let offset = sectionStart + 12 + programInfoLength;\n  while (offset + 5 <= sectionEnd - 4) {\n    const streamType = payload[offset] ?? 0;\n    const elementaryPid =\n      (((payload[offset + 1] ?? 0) & 0x1f) << 8) |\n      (payload[offset + 2] ?? 0);\n    const esInfoLength =\n      (((payload[offset + 3] ?? 0) & 0x0f) << 8) |\n      (payload[offset + 4] ?? 0);\n    const descriptorStart = offset + 5;\n    const descriptorEnd = Math.min(descriptorStart + esInfoLength, sectionEnd - 4);\n\n    if (\n      streamType === 0x86 ||\n      (streamType === 0x06 &&\n        descriptorsIdentifyScte35(payload, descriptorStart, descriptorEnd))\n    ) {\n      tsScte35Pids.add(elementaryPid);\n    }\n\n    offset = descriptorStart + esInfoLength;\n  }\n}\n\nfunction hasProcessedTsScte35Section(\n  section: Uint8Array,\n  processedSections: Set<string>\n): boolean {\n  let checksum = 0;\n  for (let i = 0; i < section.length; i++) {\n    checksum = (checksum * 31 + (section[i] ?? 0)) >>> 0;\n  }\n\n  const key = `${section.length}:${checksum}`;\n  if (processedSections.has(key)) {\n    return true;\n  }\n\n  processedSections.add(key);\n  if (processedSections.size > 200) {\n    const firstKey = processedSections.values().next().value;\n    if (firstKey) {\n      processedSections.delete(firstKey);\n    }\n  }\n  return false;\n}\n\nfunction addScte35SectionMarker(\n  section: Uint8Array,\n  markers: Scte35Marker[],\n  processedSections: Set<string>\n): void {\n  if (section[0] !== 0xfc || hasProcessedTsScte35Section(section, processedSections)) {\n    return;\n  }\n\n  const marker = parseScte35Binary(section);\n  if (!marker) {\n    return;\n  }\n\n  marker.raw = {\n    ...(typeof marker.raw === \"object\" && marker.raw ? marker.raw : {}),\n    source: \"ts-packet\",\n  };\n  markers.push(marker);\n}\n\nfunction appendScte35Bytes(\n  pid: number,\n  bytes: Uint8Array,\n  assemblers: Map<number, { bytes: number[]; expectedLength: number }>,\n  markers: Scte35Marker[],\n  processedSections: Set<string>\n): void {\n  const assembler = assemblers.get(pid);\n  if (!assembler) {\n    return;\n  }\n\n  for (let i = 0; i < bytes.length && assembler.bytes.length < assembler.expectedLength; i++) {\n    assembler.bytes.push(bytes[i] ?? 0);\n  }\n\n  if (assembler.bytes.length >= assembler.expectedLength) {\n    assemblers.delete(pid);\n    addScte35SectionMarker(new Uint8Array(assembler.bytes), markers, processedSections);\n  }\n}\n\nfunction collectScte35SectionsFromPayload(\n  pid: number,\n  payload: Uint8Array,\n  payloadUnitStart: boolean,\n  assemblers: Map<number, { bytes: number[]; expectedLength: number }>,\n  markers: Scte35Marker[],\n  processedSections: Set<string>\n): void {\n  if (payload.length === 0) {\n    return;\n  }\n\n  let offset = 0;\n  if (payloadUnitStart) {\n    const pointerField = payload[0] ?? 0;\n    const previousAssembler = assemblers.get(pid);\n    if (previousAssembler && pointerField > 0) {\n      appendScte35Bytes(\n        pid,\n        payload.subarray(1, Math.min(1 + pointerField, payload.length)),\n        assemblers,\n        markers,\n        processedSections\n      );\n    }\n    assemblers.delete(pid);\n    offset = 1 + pointerField;\n  } else {\n    appendScte35Bytes(pid, payload, assemblers, markers, processedSections);\n    return;\n  }\n\n  while (offset + 3 <= payload.length) {\n    const tableId = payload[offset];\n    if (tableId == null || tableId === 0xff) {\n      return;\n    }\n\n    const sectionLength = getPsiSectionLength(payload, offset);\n    const totalLength = 3 + sectionLength;\n    if (sectionLength <= 0 || totalLength <= 3) {\n      return;\n    }\n\n    if (offset + totalLength <= payload.length) {\n      addScte35SectionMarker(\n        payload.subarray(offset, offset + totalLength),\n        markers,\n        processedSections\n      );\n      offset += totalLength;\n    } else {\n      assemblers.set(pid, {\n        bytes: Array.from(payload.subarray(offset)),\n        expectedLength: totalLength,\n      });\n      return;\n    }\n  }\n}\n\nexport function parseScte35FromTsPackets(\n  data: Uint8Array,\n  tsScte35Pids: Set<number>,\n  pmtPids: Set<number>,\n  processedSections: Set<string>\n): Scte35Marker[] {\n  const packetInfo = detectTsPacketFormat(data);\n  if (!packetInfo) {\n    return [];\n  }\n\n  const markers: Scte35Marker[] = [];\n  const sectionAssemblers = new Map<\n    number,\n    { bytes: number[]; expectedLength: number }\n  >();\n\n  for (\n    let packetStart = packetInfo.offset;\n    packetStart + packetInfo.packetSize <= data.length;\n    packetStart += packetInfo.packetSize\n  ) {\n    const tsStart = packetStart + packetInfo.tsPayloadOffset;\n    if (data[tsStart] !== 0x47) {\n      continue;\n    }\n\n    const secondByte = data[tsStart + 1];\n    const thirdByte = data[tsStart + 2];\n    const fourthByte = data[tsStart + 3];\n    if (\n      secondByte == null ||\n      thirdByte == null ||\n      fourthByte == null ||\n      (secondByte & 0x80) !== 0\n    ) {\n      continue;\n    }\n\n    const payloadUnitStart = (secondByte & 0x40) !== 0;\n    const pid = ((secondByte & 0x1f) << 8) | thirdByte;\n    const adaptationFieldControl = (fourthByte >> 4) & 0x03;\n    const hasPayload =\n      adaptationFieldControl === 1 || adaptationFieldControl === 3;\n    if (!hasPayload) {\n      continue;\n    }\n\n    let payloadStart = tsStart + 4;\n    if (adaptationFieldControl === 3) {\n      const adaptationLength = data[payloadStart];\n      if (adaptationLength == null) {\n        continue;\n      }\n      payloadStart += 1 + adaptationLength;\n    }\n\n    const payloadEnd = Math.min(tsStart + 188, data.length);\n    if (payloadStart >= payloadEnd || payloadStart >= data.length) {\n      continue;\n    }\n\n    const payload = data.subarray(payloadStart, payloadEnd);\n    if (pid === 0) {\n      parsePatSection(payload, payloadUnitStart, pmtPids);\n    } else if (pmtPids.has(pid)) {\n      parsePmtSection(payload, payloadUnitStart, tsScte35Pids);\n    } else if (tsScte35Pids.has(pid)) {\n      collectScte35SectionsFromPayload(\n        pid,\n        payload,\n        payloadUnitStart,\n        sectionAssemblers,\n        markers,\n        processedSections\n      );\n    }\n  }\n\n  return markers;\n}\n\n// --- Binary SCTE-35 parsing ---\n\nclass BitReader {\n  private bytePos = 0;\n  private bitPos = 0;\n  constructor(private readonly buf: Uint8Array) {}\n  readBits(numBits: number): number {\n    let result = 0;\n    while (numBits > 0) {\n      if (this.bytePos >= this.buf.length) return result;\n      const remainingInByte = 8 - this.bitPos;\n      const toRead = Math.min(numBits, remainingInByte);\n      const currentByte = this.buf[this.bytePos]!;\n      const shift = remainingInByte - toRead;\n      const mask = ((1 << toRead) - 1) & 0xff;\n      const bits = (currentByte >> shift) & mask;\n      result = (result << toRead) | bits;\n      this.bitPos += toRead;\n      if (this.bitPos >= 8) {\n        this.bitPos = 0;\n        this.bytePos += 1;\n      }\n      numBits -= toRead;\n    }\n    return result >>> 0;\n  }\n  skipBits(n: number): void {\n    this.readBits(n);\n  }\n  get bytePosition(): number {\n    return this.bitPos === 0 ? this.bytePos : this.bytePos + 1;\n  }\n}\n\nfunction readSpliceTime(\n  r: BitReader,\n  ptsAdjustmentTicks: number\n): number | undefined {\n  const timeSpecifiedFlag = r.readBits(1) === 1;\n  if (!timeSpecifiedFlag) {\n    r.readBits(7);\n    return undefined;\n  }\n  r.readBits(6);\n  const high = r.readBits(1);\n  const low = r.readBits(32);\n  const ptsTicks =\n    (high * 0x100000000 + low + ptsAdjustmentTicks) % 0x200000000;\n  return ptsTicks / 90000;\n}\n\nfunction markerTypeFromSegmentationTypeId(\n  segmentationTypeId: number\n): Scte35Marker[\"type\"] | undefined {\n  switch (segmentationTypeId) {\n    case 0x10:\n    case 0x22:\n    case 0x30:\n    case 0x32:\n    case 0x34:\n    case 0x36:\n      return \"start\";\n    case 0x11:\n    case 0x23:\n    case 0x31:\n    case 0x33:\n    case 0x35:\n    case 0x37:\n      return \"end\";\n    default:\n      return undefined;\n  }\n}\n\nfunction parseScte35SegmentationDescriptor(\n  descriptor: Uint8Array\n):\n  | {\n      type: Scte35Marker[\"type\"];\n      durationSeconds?: number;\n      segmentationEventId?: number;\n    }\n  | undefined {\n  if (descriptor.length < 11) {\n    return undefined;\n  }\n\n  const identifier = String.fromCharCode(\n    descriptor[0] ?? 0,\n    descriptor[1] ?? 0,\n    descriptor[2] ?? 0,\n    descriptor[3] ?? 0\n  );\n  if (identifier !== \"CUEI\") {\n    return undefined;\n  }\n\n  const segmentationEventId =\n    ((descriptor[4] ?? 0) * 0x1000000) +\n    ((descriptor[5] ?? 0) << 16) +\n    ((descriptor[6] ?? 0) << 8) +\n    (descriptor[7] ?? 0);\n  const cancelIndicator = ((descriptor[8] ?? 0) & 0x80) !== 0;\n  if (cancelIndicator) {\n    return undefined;\n  }\n\n  const flags = descriptor[9] ?? 0;\n  const programSegmentationFlag = (flags & 0x80) !== 0;\n  const segmentationDurationFlag = (flags & 0x40) !== 0;\n  let offset = 10;\n\n  if (!programSegmentationFlag) {\n    const componentCount = descriptor[offset] ?? 0;\n    offset += 1 + componentCount * 6;\n    if (offset > descriptor.length) {\n      return undefined;\n    }\n  }\n\n  let durationSeconds: number | undefined = undefined;\n  if (segmentationDurationFlag) {\n    if (offset + 5 > descriptor.length) {\n      return undefined;\n    }\n    const durationTicks =\n      ((descriptor[offset] ?? 0) * 0x100000000) +\n      ((descriptor[offset + 1] ?? 0) * 0x1000000) +\n      ((descriptor[offset + 2] ?? 0) << 16) +\n      ((descriptor[offset + 3] ?? 0) << 8) +\n      (descriptor[offset + 4] ?? 0);\n    durationSeconds = durationTicks / 90000;\n    offset += 5;\n  }\n\n  if (offset + 2 > descriptor.length) {\n    return undefined;\n  }\n  offset += 1;\n  const segmentationUpidLength = descriptor[offset] ?? 0;\n  offset += 1 + segmentationUpidLength;\n  if (offset >= descriptor.length) {\n    return undefined;\n  }\n\n  const segmentationTypeId = descriptor[offset] ?? 0;\n  const markerType = markerTypeFromSegmentationTypeId(segmentationTypeId);\n  if (!markerType) {\n    return undefined;\n  }\n\n  return {\n    type: markerType,\n    ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n    segmentationEventId,\n  };\n}\n\nfunction parseScte35SegmentationDescriptors(\n  data: Uint8Array,\n  offset: number\n):\n  | {\n      type: Scte35Marker[\"type\"];\n      durationSeconds?: number;\n      segmentationEventId?: number;\n    }\n  | undefined {\n  if (offset + 2 > data.length) {\n    return undefined;\n  }\n\n  const descriptorLoopLength =\n    ((data[offset] ?? 0) << 8) | (data[offset + 1] ?? 0);\n  let descriptorOffset = offset + 2;\n  const descriptorEnd = Math.min(\n    data.length,\n    descriptorOffset + descriptorLoopLength\n  );\n\n  while (descriptorOffset + 2 <= descriptorEnd) {\n    const descriptorTag = data[descriptorOffset] ?? 0;\n    const descriptorLength = data[descriptorOffset + 1] ?? 0;\n    const descriptorDataStart = descriptorOffset + 2;\n    const descriptorDataEnd = descriptorDataStart + descriptorLength;\n    if (descriptorDataEnd > descriptorEnd) {\n      return undefined;\n    }\n\n    if (descriptorTag === 0x02) {\n      const descriptorMarker = parseScte35SegmentationDescriptor(\n        data.subarray(descriptorDataStart, descriptorDataEnd)\n      );\n      if (descriptorMarker) {\n        return descriptorMarker;\n      }\n    }\n\n    descriptorOffset = descriptorDataEnd;\n  }\n\n  return undefined;\n}\n\nexport function parseScte35Binary(data: Uint8Array): Scte35Marker | undefined {\n  const r = new BitReader(data);\n  const tableId = r.readBits(8);\n  if (tableId !== 0xfc) return undefined;\n  r.readBits(1);\n  r.readBits(1);\n  r.readBits(2);\n  const sectionLength = r.readBits(12);\n  if (sectionLength <= 0 || data.length < 3 + sectionLength) {\n    return undefined;\n  }\n  r.readBits(8);\n  r.readBits(1);\n  r.readBits(6);\n  const ptsAdjHigh = r.readBits(1);\n  const ptsAdjLow = r.readBits(32);\n  const ptsAdjustmentTicks = ptsAdjHigh * 0x100000000 + ptsAdjLow;\n  r.readBits(8);\n  r.readBits(12);\n  const spliceCommandLength = r.readBits(12);\n  const spliceCommandType = r.readBits(8);\n\n  let markerType: Scte35Marker[\"type\"] | undefined;\n  let durationSeconds: number | undefined = undefined;\n  let ptsSeconds: number | undefined = undefined;\n  let spliceEventId: number | undefined = undefined;\n  const commandBodyStart = r.bytePosition;\n\n  if (spliceCommandType === 5) {\n    spliceEventId = r.readBits(32);\n    const cancel = r.readBits(1) === 1;\n    r.readBits(7);\n    if (cancel) return undefined;\n    const outOfNetwork = r.readBits(1) === 1;\n    const programSpliceFlag = r.readBits(1) === 1;\n    const durationFlag = r.readBits(1) === 1;\n    const spliceImmediateFlag = r.readBits(1) === 1;\n    r.readBits(4);\n    markerType = outOfNetwork ? \"start\" : \"end\";\n\n    if (programSpliceFlag && !spliceImmediateFlag) {\n      ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n    } else if (!programSpliceFlag) {\n      const componentCount = r.readBits(8);\n      for (let i = 0; i < componentCount; i++) {\n        r.readBits(8);\n        if (!spliceImmediateFlag) {\n          const componentPtsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n          if (ptsSeconds === undefined) {\n            ptsSeconds = componentPtsSeconds;\n          }\n        }\n      }\n    }\n\n    if (durationFlag) {\n      r.readBits(6);\n      r.readBits(1);\n      const high = r.readBits(1);\n      const low = r.readBits(32);\n      const durationTicks = high * 0x100000000 + low;\n      durationSeconds = durationTicks / 90000;\n    }\n    r.readBits(16);\n    r.readBits(8);\n    r.readBits(8);\n  } else if (spliceCommandType === 6) {\n    ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n  } else {\n    return undefined;\n  }\n\n  const expectedDescriptorOffset =\n    spliceCommandLength === 0x0fff\n      ? r.bytePosition\n      : commandBodyStart + spliceCommandLength;\n  const descriptorMarker = parseScte35SegmentationDescriptors(\n    data,\n    expectedDescriptorOffset\n  );\n\n  if (descriptorMarker) {\n    markerType = descriptorMarker.type;\n    if (durationSeconds === undefined) {\n      durationSeconds = descriptorMarker.durationSeconds;\n    }\n  }\n\n  if (!markerType) {\n    return undefined;\n  }\n\n  const marker: Scte35Marker = {\n    type: markerType,\n    ...(ptsSeconds !== undefined ? { ptsSeconds } : {}),\n    ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n    raw: {\n      splice_command_type: spliceCommandType,\n      ...(spliceEventId !== undefined ? { splice_event_id: spliceEventId } : {}),\n      ...(descriptorMarker?.segmentationEventId !== undefined\n        ? { segmentation_event_id: descriptorMarker.segmentationEventId }\n        : {}),\n    },\n  } as Scte35Marker;\n  return marker;\n}\n","import type { Scte35Marker } from \"../types\";\nimport type {\n  NormalizedScte35Cue,\n  Scte35CueContext,\n  Scte35CueSource,\n  Scte35CueReadiness,\n} from \"./playerTypes\";\nimport { getFragmentStartSeconds } from \"./Scte35Parser\";\n\nexport interface Scte35CueManagerCallbacks {\n  onEarlyStartCue(marker: Scte35Marker, fragmentSn: number | undefined, cueKey: string): void;\n  onPlaybackCue(marker: Scte35Marker, cueKey?: string): void;\n  isInAdBreak(): boolean;\n}\n\nexport class Scte35CueManager {\n  private readonly pendingScte35Cues: Map<string, NormalizedScte35Cue> = new Map();\n  private readonly recentScte35CueKeys: Map<string, number> = new Map();\n  private readonly recentScte35CueLimit: number = 200;\n  private pendingScte35CueKeyValue: string | undefined;\n  private activeScte35BreakKeyValue: string | undefined;\n  private scheduledScte35BreakKeyValue: string | undefined;\n\n  readonly tsScte35Pids: Set<number> = new Set();\n  readonly pmtPids: Set<number> = new Set();\n  readonly processedTsScte35Sections: Set<string> = new Set();\n\n  private debug: boolean;\n  private callbacks: Scte35CueManagerCallbacks;\n\n  constructor(debug: boolean, callbacks: Scte35CueManagerCallbacks) {\n    this.debug = debug;\n    this.callbacks = callbacks;\n  }\n\n  get pendingScte35CueKey(): string | undefined {\n    return this.pendingScte35CueKeyValue;\n  }\n  set pendingScte35CueKey(value: string | undefined) {\n    this.pendingScte35CueKeyValue = value;\n  }\n\n  get activeScte35BreakKey(): string | undefined {\n    return this.activeScte35BreakKeyValue;\n  }\n  set activeScte35BreakKey(value: string | undefined) {\n    this.activeScte35BreakKeyValue = value;\n  }\n\n  get scheduledScte35BreakKey(): string | undefined {\n    return this.scheduledScte35BreakKeyValue;\n  }\n  set scheduledScte35BreakKey(value: string | undefined) {\n    this.scheduledScte35BreakKeyValue = value;\n  }\n\n  createScte35CueContext(\n    source: Scte35CueSource,\n    readiness: Scte35CueReadiness,\n    frag?: any\n  ): Scte35CueContext {\n    const context: Scte35CueContext = { source, readiness };\n    if (typeof frag?.sn === \"number\") {\n      context.fragmentSn = frag.sn;\n    }\n    const fragmentStartSec = getFragmentStartSeconds(frag);\n    if (fragmentStartSec !== undefined) {\n      context.fragmentStartSeconds = fragmentStartSec;\n    }\n    return context;\n  }\n\n  onScte35Cue(marker: Scte35Marker, context: Scte35CueContext): void {\n    const cue = this.createScte35Cue(marker, context);\n    const pendingKey = this.getPendingScte35CueKey(cue);\n\n    if (context.readiness === \"early\") {\n      this.pendingScte35Cues.set(pendingKey, cue);\n      this.trimRecentScte35CueMaps();\n\n      if (marker.type === \"start\") {\n        this.callbacks.onEarlyStartCue(marker, context.fragmentSn, cue.key);\n      }\n      return;\n    }\n\n    if (marker.type === \"end\" && !this.shouldAcceptScte35EndCue(cue)) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ignoring SCTE-35 end cue\", {\n          key: cue.key,\n          activeScte35BreakKey: this.activeScte35BreakKeyValue,\n          inAdBreak: this.callbacks.isInAdBreak(),\n          source: cue.source,\n        });\n      }\n      return;\n    }\n\n    if (marker.type === \"start\" && this.hasRecentlyHandledScte35Cue(cue)) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ignoring duplicate SCTE-35 start cue\", {\n          key: cue.key,\n          source: cue.source,\n        });\n      }\n      return;\n    }\n\n    this.pendingScte35Cues.delete(pendingKey);\n    this.markScte35CueHandled(cue);\n    this.callbacks.onPlaybackCue(marker, cue.key);\n  }\n\n  activatePendingScte35CuesForFragment(frag: any): void {\n    const fragmentSn = typeof frag?.sn === \"number\" ? frag.sn : undefined;\n    if (fragmentSn === undefined) {\n      return;\n    }\n\n    const matchingCues = Array.from(this.pendingScte35Cues.entries()).filter(\n      ([, cue]) => cue.fragmentSn === fragmentSn\n    );\n\n    matchingCues.forEach(([pendingKey, cue]) => {\n      this.pendingScte35Cues.delete(pendingKey);\n      const context: Scte35CueContext = {\n        source: cue.source,\n        readiness: \"playback\",\n      };\n      context.fragmentSn = fragmentSn;\n      const fragmentStartSec =\n        cue.fragmentStartSeconds ?? getFragmentStartSeconds(frag);\n      if (fragmentStartSec !== undefined) {\n        context.fragmentStartSeconds = fragmentStartSec;\n      }\n      this.onScte35Cue(cue.marker, context);\n    });\n  }\n\n  private createScte35Cue(\n    marker: Scte35Marker,\n    context: Scte35CueContext\n  ): NormalizedScte35Cue {\n    const cue: NormalizedScte35Cue = {\n      marker,\n      source: context.source,\n      readiness: context.readiness,\n      key: this.getScte35CueKey(marker, context),\n    };\n    if (context.fragmentSn !== undefined) {\n      cue.fragmentSn = context.fragmentSn;\n    }\n    if (context.fragmentStartSeconds !== undefined) {\n      cue.fragmentStartSeconds = context.fragmentStartSeconds;\n    }\n    return cue;\n  }\n\n  private getScte35CueKey(\n    marker: Scte35Marker,\n    context: Scte35CueContext\n  ): string {\n    const raw = this.getScte35MarkerRaw(marker);\n    const spliceEventId = this.toIdentityString(raw?.splice_event_id);\n    if (spliceEventId) {\n      return `splice:${spliceEventId}`;\n    }\n\n    const segmentationEventId = this.toIdentityString(raw?.segmentation_event_id);\n    if (segmentationEventId) {\n      return `segmentation:${segmentationEventId}`;\n    }\n\n    const daterangeId = this.toIdentityString(raw?.attrs?.ID);\n    if (daterangeId) {\n      return `daterange:${daterangeId}`;\n    }\n\n    const scteValue =\n      this.toIdentityString(raw?.attrs?.[\"SCTE35-OUT\"]) ||\n      this.toIdentityString(raw?.attrs?.[\"SCTE35-IN\"]);\n    if (scteValue) {\n      return `daterange-scte:${scteValue}`;\n    }\n\n    if (typeof marker.ptsSeconds === \"number\" && Number.isFinite(marker.ptsSeconds)) {\n      return `pts:${Math.round(marker.ptsSeconds * 2) / 2}`;\n    }\n\n    if (context.fragmentSn !== undefined) {\n      return `fragment:${context.fragmentSn}`;\n    }\n\n    return `${context.source}:wallclock:${Math.floor(Date.now() / 1000)}`;\n  }\n\n  private getPendingScte35CueKey(cue: NormalizedScte35Cue): string {\n    return `${cue.marker.type}:${cue.key}:${\n      cue.fragmentSn !== undefined ? cue.fragmentSn : \"unknown\"\n    }`;\n  }\n\n  private getScte35MarkerRaw(marker: Scte35Marker): any {\n    return typeof marker.raw === \"object\" && marker.raw !== null\n      ? (marker.raw as any)\n      : {};\n  }\n\n  private toIdentityString(value: unknown): string | undefined {\n    if (typeof value === \"number\" && Number.isFinite(value)) {\n      return String(value);\n    }\n    if (typeof value === \"string\" && value.trim().length > 0) {\n      return value.trim();\n    }\n    return undefined;\n  }\n\n  isStrongScte35CueKey(key: string | undefined): boolean {\n    return !!(\n      key &&\n      (key.startsWith(\"splice:\") ||\n        key.startsWith(\"segmentation:\") ||\n        key.startsWith(\"daterange:\") ||\n        key.startsWith(\"daterange-scte:\"))\n    );\n  }\n\n  private hasRecentlyHandledScte35Cue(cue: NormalizedScte35Cue): boolean {\n    if (\n      this.activeScte35BreakKeyValue === cue.key ||\n      this.scheduledScte35BreakKeyValue === cue.key\n    ) {\n      return true;\n    }\n\n    const recentKey = `${cue.marker.type}:${cue.key}`;\n    return this.recentScte35CueKeys.has(recentKey);\n  }\n\n  private markScte35CueHandled(cue: NormalizedScte35Cue): void {\n    this.recentScte35CueKeys.set(`${cue.marker.type}:${cue.key}`, Date.now());\n    this.trimRecentScte35CueMaps();\n  }\n\n  private trimRecentScte35CueMaps(): void {\n    while (this.recentScte35CueKeys.size > this.recentScte35CueLimit) {\n      const firstKey = this.recentScte35CueKeys.keys().next().value;\n      if (!firstKey) {\n        break;\n      }\n      this.recentScte35CueKeys.delete(firstKey);\n    }\n\n    while (this.pendingScte35Cues.size > this.recentScte35CueLimit) {\n      const firstKey = this.pendingScte35Cues.keys().next().value;\n      if (!firstKey) {\n        break;\n      }\n      this.pendingScte35Cues.delete(firstKey);\n    }\n  }\n\n  private shouldAcceptScte35EndCue(cue: NormalizedScte35Cue): boolean {\n    if (!this.callbacks.isInAdBreak()) {\n      return false;\n    }\n\n    if (\n      this.isStrongScte35CueKey(this.activeScte35BreakKeyValue) &&\n      this.isStrongScte35CueKey(cue.key) &&\n      this.activeScte35BreakKeyValue !== cue.key\n    ) {\n      return false;\n    }\n\n    return true;\n  }\n}\n","import type {\n  StormcloudVideoPlayerConfig,\n  AdBreak,\n  StormcloudApiResponse,\n  AdController,\n} from \"../types\";\nimport type { PalNonceManager } from \"../sdk/pal\";\nimport { applyVastMacros, generateCorrelator, normalizeVastTagUrl } from \"../utils/vastMacros\";\nimport type { VastConsentSignals } from \"../utils/vastMacros\";\nimport { resolveVastEnvironmentSignals } from \"../utils/vastEnvironmentSignals\";\nimport { sendHeartbeat, sendInitialTracking } from \"../utils/tracking\";\n\nexport class AdConfigManager {\n  vmapBreaks: AdBreak[] = [];\n  consumedVmapBreakIds: Set<string> = new Set();\n  apiVastTagUrl: string | undefined;\n  apiNumberAds: number | undefined;\n  readonly streamCorrelator: string = generateCorrelator();\n  consentSignals: VastConsentSignals = {};\n  podCounter: number = 0;\n  podAssignedByPrefetch: boolean = false;\n  adRequestPositionInBreak: number = 0;\n\n  private lastHeartbeatTime: number = 0;\n  private heartbeatInterval: number | undefined;\n\n  private config: StormcloudVideoPlayerConfig;\n  private video: HTMLVideoElement;\n\n  constructor(config: StormcloudVideoPlayerConfig, video: HTMLVideoElement) {\n    this.config = config;\n    this.video = video;\n  }\n\n  get debug(): boolean {\n    return !!this.config.debugAdTiming;\n  }\n\n  isVmapEnabled(): boolean {\n    return !!(this.config.isVmap && this.config.vmapUrl?.trim());\n  }\n\n  async fetchAdConfiguration(): Promise<void> {\n    if (this.isVmapEnabled()) {\n      await this.fetchAndParseVmap(this.config.vmapUrl!);\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] VMAP mode enabled\");\n      }\n      return;\n    }\n\n    const vastMode = this.config.vastMode || \"default\";\n\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] VAST mode:\", vastMode);\n    }\n\n    if (vastMode === \"adstorm\") {\n      if (!this.config.licenseKey) {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] AdStorm mode requires a license key\"\n          );\n        }\n        return;\n      }\n\n      const vastEndpoint = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${this.config.licenseKey}`;\n      this.apiVastTagUrl = vastEndpoint;\n\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Using AdStorm VAST endpoint (adstorm mode):\",\n          vastEndpoint\n        );\n      }\n      return;\n    }\n\n    if (this.config.vastTagUrl) {\n      this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Using custom VAST tag URL:\",\n          this.apiVastTagUrl\n        );\n      }\n      return;\n    }\n\n    const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n\n    if (this.debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] Fetching ad configuration from:\",\n        apiUrl\n      );\n    }\n\n    const headers: Record<string, string> = {};\n    if (this.config.licenseKey) {\n      headers[\"Authorization\"] = `Bearer ${this.config.licenseKey}`;\n    }\n\n    const response = await fetch(apiUrl, { headers });\n    if (!response.ok) {\n      if (this.debug) {\n        console.warn(\n          `[StormcloudVideoPlayer] Failed to fetch ad configuration: ${response.status}`\n        );\n      }\n      return;\n    }\n\n    const data: StormcloudApiResponse = await response.json();\n\n    const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n    if (imaPayload) {\n      let decodedPayload = imaPayload;\n      try {\n        decodedPayload = decodeURIComponent(imaPayload);\n      } catch {\n        console.warn(\"[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:\", imaPayload);\n      }\n      console.log(\"[StormcloudVideoPlayer] Raw VAST tag URL (from API):\", decodedPayload);\n      this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Normalized VAST tag URL:\",\n          this.apiVastTagUrl\n        );\n      }\n    } else {\n      if (this.debug) {\n        console.warn(\n          \"[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response\"\n        );\n      }\n    }\n\n    const numberAds = data.response?.options?.vast?.cue_tones?.number_ads;\n    if (numberAds != null && numberAds > 0) {\n      this.apiNumberAds = numberAds;\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Number of ads per break from API:\",\n          this.apiNumberAds\n        );\n      }\n    }\n  }\n\n  private async fetchAndParseVmap(vmapUrl: string): Promise<void> {\n    if (!vmapUrl.trim()) {\n      return;\n    }\n\n    try {\n      const response = await fetch(vmapUrl);\n      if (!response.ok) {\n        throw new Error(`Failed to fetch VMAP (${response.status})`);\n      }\n\n      const vmapXml = await response.text();\n      this.vmapBreaks = this.parseVmapToBreaks(vmapXml);\n      this.consumedVmapBreakIds.clear();\n\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] Loaded ${this.vmapBreaks.length} VMAP ad break(s) from:`,\n          vmapUrl\n        );\n      }\n    } catch (error) {\n      this.vmapBreaks = [];\n      this.consumedVmapBreakIds.clear();\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Failed to load VMAP:\", error);\n      }\n    }\n  }\n\n  private parseVmapToBreaks(vmapXml: string): AdBreak[] {\n    if (typeof DOMParser === \"undefined\") {\n      return [];\n    }\n\n    const doc = new DOMParser().parseFromString(vmapXml, \"application/xml\");\n    if (doc.querySelector(\"parsererror\")) {\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Invalid VMAP XML received\");\n      }\n      return [];\n    }\n\n    const VMAP_NS = \"http://www.iab.net/videosuite/vmap\";\n    let adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, \"AdBreak\"));\n    if (adBreakNodes.length === 0) {\n      adBreakNodes = Array.from(\n        doc.querySelectorAll(\"AdBreak, vmap\\\\:AdBreak\")\n      );\n    }\n    if (adBreakNodes.length === 0) {\n      adBreakNodes = Array.from(doc.getElementsByTagName(\"*\")).filter(\n        (el) => el.localName === \"AdBreak\"\n      );\n    }\n    const parsed: AdBreak[] = [];\n\n    adBreakNodes.forEach((node, index) => {\n      const timeOffsetRaw = (node.getAttribute(\"timeOffset\") || \"\").trim();\n      const startTimeMs = this.parseVmapTimeOffsetToMs(timeOffsetRaw);\n      if (startTimeMs == null) {\n        return;\n      }\n\n      let adTagNode = node.getElementsByTagNameNS(VMAP_NS, \"AdTagURI\")[0];\n      if (!adTagNode) {\n        adTagNode =\n          (node.querySelector(\"AdTagURI, vmap\\\\:AdTagURI\") as Element | null) ??\n          undefined;\n      }\n      const adTagUrl = (adTagNode?.textContent || \"\").trim();\n      if (!adTagUrl) {\n        return;\n      }\n\n      const breakId =\n        node.getAttribute(\"breakId\") ||\n        `vmap-break-${index}-${timeOffsetRaw || \"unknown\"}`;\n      parsed.push({\n        id: breakId,\n        startTimeMs,\n        vastTagUrl: adTagUrl,\n      });\n    });\n\n    parsed.sort((a, b) => {\n      const aStart = a.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : a.startTimeMs;\n      const bStart = b.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : b.startTimeMs;\n      return aStart - bStart;\n    });\n\n    return parsed;\n  }\n\n  private parseVmapTimeOffsetToMs(timeOffset: string): number | undefined {\n    if (!timeOffset) {\n      return undefined;\n    }\n\n    const normalized = timeOffset.trim().toLowerCase();\n    if (normalized === \"start\") {\n      return 0;\n    }\n\n    if (normalized === \"end\") {\n      return -1;\n    }\n\n    const hms = timeOffset.match(\n      /^(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?$/\n    );\n    if (hms) {\n      const [, hh, mm, ss, ms = \"0\"] = hms;\n      const hours = Number(hh);\n      const minutes = Number(mm);\n      const seconds = Number(ss);\n      const millis = Number(ms.padEnd(3, \"0\").slice(0, 3));\n      return ((hours * 3600 + minutes * 60 + seconds) * 1000) + millis;\n    }\n\n    const percent = timeOffset.match(/^(\\d+(?:\\.\\d+)?)%$/);\n    if (percent) {\n      const ratio = Number(percent[1]) / 100;\n      const durationSec = this.video.duration;\n      if (Number.isFinite(durationSec) && durationSec > 0) {\n        return Math.floor(durationSec * 1000 * ratio);\n      }\n      return undefined;\n    }\n\n    return undefined;\n  }\n\n  getAdBreakKey(adBreak: AdBreak): string {\n    if (adBreak.id) {\n      return adBreak.id;\n    }\n    return `${adBreak.startTimeMs}-${adBreak.vastTagUrl || \"\"}`;\n  }\n\n  resolveBreakStartMs(adBreak: AdBreak): number | undefined {\n    if (adBreak.startTimeMs >= 0) {\n      return adBreak.startTimeMs;\n    }\n\n    if (adBreak.startTimeMs === -1) {\n      const durationSec = this.video.duration;\n      if (Number.isFinite(durationSec) && durationSec > 0) {\n        return Math.floor(durationSec * 1000);\n      }\n    }\n\n    return undefined;\n  }\n\n  findCurrentOrNextBreak(nowMs: number): AdBreak | undefined {\n    const schedule: AdBreak[] = this.vmapBreaks;\n    let candidate: AdBreak | undefined;\n    const tol = this.config.driftToleranceMs ?? 1000;\n    for (const b of schedule) {\n      if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n        continue;\n      }\n      const breakStartMs = this.resolveBreakStartMs(b);\n      if (breakStartMs == null) {\n        continue;\n      }\n      if (\n        breakStartMs <= nowMs + tol &&\n        (candidate == null ||\n          breakStartMs > (this.resolveBreakStartMs(candidate) ?? 0))\n      ) {\n        candidate = b;\n      }\n    }\n    return candidate;\n  }\n\n  findBreakForTime(nowMs: number): AdBreak | undefined {\n    const schedule: AdBreak[] = this.vmapBreaks;\n    for (const b of schedule) {\n      if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n        continue;\n      }\n      const breakStartMs = this.resolveBreakStartMs(b);\n      if (breakStartMs == null) {\n        continue;\n      }\n\n      if (b.durationMs) {\n        const end = breakStartMs + b.durationMs;\n        if (nowMs >= breakStartMs && nowMs < end) {\n          return b;\n        }\n        continue;\n      }\n\n      if (nowMs >= breakStartMs) {\n        return b;\n      }\n    }\n    return undefined;\n  }\n\n  selectVastTagsForBreak(b?: AdBreak): string[] | undefined {\n    if (!b || !b.vastTagUrl) return undefined;\n    if (b.vastTagUrl.includes(\",\")) {\n      return b.vastTagUrl\n        .split(\",\")\n        .map((s) => s.trim())\n        .filter((s) => s.length > 0);\n    }\n    return [b.vastTagUrl];\n  }\n\n  beginNewAdPod(): void {\n    this.podCounter++;\n    this.adRequestPositionInBreak = 0;\n  }\n\n  generateVastUrlsWithCorrelators(\n    baseUrl: string,\n    count: number,\n    adPlayer: AdController,\n    palNonce: PalNonceManager,\n    inAdBreak: boolean\n  ): string[] {\n    const urls: string[] = [];\n\n    for (let i = 0; i < count; i++) {\n      this.adRequestPositionInBreak++;\n\n      const adWillPlayMuted = inAdBreak\n        ? adPlayer.getOriginalMutedState()\n        : this.video.muted;\n      const envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);\n\n      const urlWithMacros = applyVastMacros(baseUrl, {\n        correlator: generateCorrelator(),\n        streamCorrelator: this.streamCorrelator,\n        pod: this.podCounter > 0 ? this.podCounter : undefined,\n        adPosition: this.adRequestPositionInBreak,\n        isCtv: envSignals.isCtv,\n        contentUrl: envSignals.contentUrl,\n        pageUrl:\n          !envSignals.isCtv && typeof window !== \"undefined\"\n            ? window.location.href\n            : undefined,\n        adWillPlayMuted,\n        adWillAutoPlay: !!this.config.autoplay,\n        appId: envSignals.appId,\n        appName: envSignals.appName,\n        sessionId: envSignals.sessionId,\n        deviceId: envSignals.deviceId,\n        deviceIdType: envSignals.deviceIdType,\n        limitAdTracking: envSignals.limitAdTracking,\n        deviceTypeHint: envSignals.deviceTypeHint,\n        adTest: this.config.adTest,\n        consent: this.consentSignals,\n      });\n\n      const finalUrl = palNonce.injectNonce(urlWithMacros);\n      console.log(\n        `[StormcloudVideoPlayer] Resolved ad request URL (pod=${this.podCounter}, pos=${this.adRequestPositionInBreak}):`,\n        finalUrl\n      );\n      urls.push(finalUrl);\n    }\n\n    return urls;\n  }\n\n  // --- Tracking ---\n\n  initializeTracking(): void {\n    sendInitialTracking(this.config.licenseKey)\n      .then(() => {\n        this.heartbeatInterval = window.setInterval(() => {\n          this.sendHeartbeatIfNeeded();\n        }, 5000);\n      })\n      .catch((error) => {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n            error\n          );\n        }\n        this.heartbeatInterval = window.setInterval(() => {\n          this.sendHeartbeatIfNeeded();\n        }, 5000);\n      });\n  }\n\n  private sendHeartbeatIfNeeded(): void {\n    const now = Date.now();\n    if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 30000) {\n      this.lastHeartbeatTime = now;\n      sendHeartbeat(this.config.licenseKey).catch((error) => {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n            error\n          );\n        }\n      });\n    }\n  }\n\n  destroyTracking(): void {\n    if (this.heartbeatInterval) {\n      clearInterval(this.heartbeatInterval);\n      this.heartbeatInterval = undefined;\n    }\n  }\n}\n","import type { AdController, StormcloudVideoPlayerConfig, Scte35Marker } from \"../types\";\n\nexport interface AdTimingCallbacks {\n  onAdStopTimerFired(): void;\n  onAdStartTimerFired(marker: Scte35Marker, cueKey: string | undefined): void;\n  onWatchdogTimeout(): void;\n  onFailsafeTimeout(): void;\n}\n\nexport class AdTimingService {\n  private adStopTimerId: number | undefined;\n  private adStartTimerId: number | undefined;\n  private adFailsafeTimerId: number | undefined;\n  private adRequestWatchdogId: number | undefined;\n  private adRequestWatchdogToken: number | null = null;\n  private adFailsafeToken: number | null = null;\n\n  ptsDriftEmaMs = 0;\n  expectedAdBreakDurationMs: number | undefined;\n  currentAdBreakStartWallClockMs: number | undefined;\n  scteAdBreakEndWallClockMs: number | undefined;\n  adBreakPlayedDurationMs: number = 0;\n  adBreakEpoch: number = 0;\n\n  adRequestTokenCounter = 0;\n  activeAdRequestToken: number | null = null;\n  currentAdIndex: number = 0;\n  totalAdsInBreak: number = 0;\n  totalAdRequestsInBreak: number = 0;\n  readonly maxTotalAdRequestsPerBreak: number = 10;\n  lastAdRequestTime: number = 0;\n  consecutiveFailures: number = 0;\n  readonly maxConsecutiveFailures: number = 5;\n  readonly minAdRequestIntervalMs: number = 3000;\n  readonly backoffBaseMs: number = 1000;\n  readonly maxBackoffMs: number = 15000;\n  private readonly defaultMinRemainingMsToStartAd: number = 4000;\n\n  failedVastUrls: Set<string> = new Set();\n  temporaryFailureUrls: Map<string, number> = new Map();\n  private readonly temporaryFailureCooldownMs: number = 30000;\n\n  private globalConsecutiveNoFills: number = 0;\n  private readonly globalNoFillThreshold: number = 3;\n  private globalNoFillCooldownUntil: number = 0;\n  private readonly globalNoFillBackoffBaseMs: number = 5000;\n  private readonly globalNoFillBackoffMaxMs: number = 60000;\n  private globalLastGamRequestTime: number = 0;\n  private readonly globalMinGamIntervalMs: number = 3000;\n\n  private config: StormcloudVideoPlayerConfig;\n  private video: HTMLVideoElement;\n  private callbacks: AdTimingCallbacks;\n\n  constructor(\n    config: StormcloudVideoPlayerConfig,\n    video: HTMLVideoElement,\n    callbacks: AdTimingCallbacks\n  ) {\n    this.config = config;\n    this.video = video;\n    this.callbacks = callbacks;\n  }\n\n  get debug(): boolean {\n    return !!this.config.debugAdTiming;\n  }\n\n  // --- Ad stop timer ---\n\n  scheduleAdStopCountdown(remainingMs: number): void {\n    this.clearAdStopTimer();\n    const ms = Math.max(0, Math.floor(remainingMs));\n    if (ms === 0) {\n      this.ensureAdStoppedByTimer();\n      return;\n    }\n    this.adStopTimerId = window.setTimeout(() => {\n      this.ensureAdStoppedByTimer();\n    }, ms) as unknown as number;\n  }\n\n  clearAdStopTimer(): void {\n    if (this.adStopTimerId != null) {\n      clearTimeout(this.adStopTimerId);\n      this.adStopTimerId = undefined;\n    }\n  }\n\n  private ensureAdStoppedByTimer(): void {\n    this.adStopTimerId = undefined;\n    this.callbacks.onAdStopTimerFired();\n  }\n\n  // --- Ad start timer ---\n\n  scheduleAdStartIn(\n    delayMs: number,\n    marker: Scte35Marker = { type: \"start\" } as Scte35Marker,\n    cueKey?: string\n  ): void {\n    this.clearAdStartTimer();\n    const ms = Math.max(0, Math.floor(delayMs));\n    if (ms === 0) {\n      this.callbacks.onAdStartTimerFired(marker, cueKey);\n      return;\n    }\n    this.adStartTimerId = window.setTimeout(() => {\n      this.callbacks.onAdStartTimerFired(marker, cueKey);\n    }, ms) as unknown as number;\n  }\n\n  clearAdStartTimer(): void {\n    if (this.adStartTimerId != null) {\n      clearTimeout(this.adStartTimerId);\n      this.adStartTimerId = undefined;\n    }\n  }\n\n  // --- PTS drift ---\n\n  updatePtsDrift(ptsSecondsSample: number): void {\n    const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1000;\n    if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 60000) return;\n    const alpha = 0.1;\n    this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n  }\n\n  resolveScteBreakStartWallClockMs(marker: Scte35Marker): number {\n    const nowWallClockMs = Date.now();\n    if (typeof marker.ptsSeconds !== \"number\") {\n      return nowWallClockMs;\n    }\n\n    const nowMs = this.video.currentTime * 1000;\n    const estimatedCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n    const deltaMs = marker.ptsSeconds * 1000 - estimatedCurrentPtsMs;\n    if (!Number.isFinite(deltaMs)) {\n      return nowWallClockMs;\n    }\n\n    return nowWallClockMs + Math.floor(deltaMs);\n  }\n\n  // --- Duration boundary ---\n\n  setAdBreakDurationBoundary(durationMs: number | undefined): void {\n    this.expectedAdBreakDurationMs = durationMs;\n    if (\n      durationMs != null &&\n      this.currentAdBreakStartWallClockMs != null\n    ) {\n      this.scteAdBreakEndWallClockMs =\n        this.currentAdBreakStartWallClockMs + durationMs;\n    } else {\n      this.scteAdBreakEndWallClockMs = undefined;\n    }\n  }\n\n  scheduleAdStopAtBreakBoundary(): void {\n    if (this.expectedAdBreakDurationMs == null) {\n      return;\n    }\n    this.scheduleAdStopCountdown(this.getWallClockRemainingAdMs());\n  }\n\n  // --- Duration budget ---\n\n  getWallClockRemainingAdMs(): number {\n    const endWallClockMs = this.getAdBreakEndWallClockMs();\n    if (endWallClockMs != null) {\n      return Math.max(0, endWallClockMs - Date.now());\n    }\n    return 0;\n  }\n\n  getAdBreakEndWallClockMs(): number | undefined {\n    if (this.scteAdBreakEndWallClockMs != null) {\n      return this.scteAdBreakEndWallClockMs;\n    }\n    if (\n      this.expectedAdBreakDurationMs == null ||\n      this.currentAdBreakStartWallClockMs == null\n    ) {\n      return undefined;\n    }\n    return this.currentAdBreakStartWallClockMs + this.expectedAdBreakDurationMs;\n  }\n\n  getDurationBudgetRemainingMs(): number {\n    if (this.expectedAdBreakDurationMs == null) {\n      return 0;\n    }\n    return Math.max(0, this.expectedAdBreakDurationMs - this.adBreakPlayedDurationMs);\n  }\n\n  getLoadedAdDurationMs(adController: AdController): number {\n    const durationSec = adController.getLoadedAdDuration?.();\n    if (durationSec == null || durationSec <= 0) {\n      return 0;\n    }\n    return Math.round(durationSec * 1000);\n  }\n\n  adFitsRemainingBudget(durationMs: number): boolean {\n    if (durationMs <= 0) {\n      return true;\n    }\n    return durationMs <= this.getDurationBudgetRemainingMs();\n  }\n\n  logAdDurationDecision(\n    accepted: boolean,\n    durationMs: number,\n    adController: AdController\n  ): void {\n    if (!this.debug) {\n      return;\n    }\n    const remainingBudget = this.getDurationBudgetRemainingMs();\n    const adId = adController.getLoadedAdId?.() ?? \"unknown\";\n    if (accepted) {\n      console.log(\n        `[AD-DURATION] Accepted ad id=${adId}, duration=${durationMs}ms, budget remaining after play=${Math.max(0, remainingBudget - durationMs)}ms`\n      );\n    } else {\n      console.log(\n        `[AD-DURATION] Rejected ad id=${adId}, duration=${durationMs}ms exceeds remaining budget=${remainingBudget}ms — requesting another ad`\n      );\n    }\n  }\n\n  recordPlayedAdDuration(adController: AdController): void {\n    const durationMs = this.getLoadedAdDurationMs(adController);\n    if (durationMs <= 0) {\n      return;\n    }\n    this.adBreakPlayedDurationMs += durationMs;\n    if (this.debug) {\n      console.log(\n        `[AD-DURATION] Played ${durationMs}ms — total played=${this.adBreakPlayedDurationMs}ms / ${this.expectedAdBreakDurationMs ?? \"?\"}ms`\n      );\n    }\n  }\n\n  ensureLoadedAdFitsBudget(adController: AdController): boolean {\n    const durationMs = this.getLoadedAdDurationMs(adController);\n    const fits = this.adFitsRemainingBudget(durationMs);\n    this.logAdDurationDecision(fits, durationMs, adController);\n    return fits;\n  }\n\n  rejectLoadedAdForDuration(adController: AdController): void {\n    try {\n      adController.destroy();\n    } catch {}\n  }\n\n  markAdStarted(): void {\n    this.currentAdIndex++;\n    this.totalAdsInBreak = this.currentAdIndex;\n    this.totalAdRequestsInBreak++;\n    this.lastAdRequestTime = Date.now();\n  }\n\n  getRemainingAdMs(): number {\n    const wallClockRemaining = this.getWallClockRemainingAdMs();\n    const budgetRemaining = this.getDurationBudgetRemainingMs();\n    if (this.expectedAdBreakDurationMs == null) {\n      return wallClockRemaining;\n    }\n    return Math.min(wallClockRemaining, budgetRemaining);\n  }\n\n  getMinRemainingMsToStartAd(): number {\n    const configured = this.config.minRemainingMsToStartAd;\n    if (typeof configured === \"number\" && configured >= 0) {\n      return configured;\n    }\n    return this.defaultMinRemainingMsToStartAd;\n  }\n\n  hasTimeToStartAnotherAd(): boolean {\n    const minRemaining = this.getMinRemainingMsToStartAd();\n    return (\n      this.getWallClockRemainingAdMs() > minRemaining &&\n      this.getDurationBudgetRemainingMs() > minRemaining\n    );\n  }\n\n  // --- Circuit breaker ---\n\n  isTemporaryAdError(error: Error): boolean {\n    const message = error?.message?.toLowerCase() || \"\";\n\n    if (message.includes(\"no ads available\") || message.includes(\"no fill\") || message.includes(\"nofill\")) {\n      return true;\n    }\n    if (message.includes(\"timeout\")) {\n      return true;\n    }\n    if (message.includes(\"rate limit\") || message.includes(\"too many requests\")) {\n      return true;\n    }\n    if (message.includes(\"ad playback error\")) {\n      return true;\n    }\n    return false;\n  }\n\n  isUrlInCooldown(vastTagUrl: string): boolean {\n    const failureTime = this.temporaryFailureUrls.get(vastTagUrl);\n    if (failureTime == null) {\n      return false;\n    }\n\n    const elapsed = Date.now() - failureTime;\n    if (elapsed >= this.temporaryFailureCooldownMs) {\n      this.temporaryFailureUrls.delete(vastTagUrl);\n      return false;\n    }\n\n    return true;\n  }\n\n  cleanupTemporaryFailures(): void {\n    const now = Date.now();\n    for (const [url, timestamp] of this.temporaryFailureUrls) {\n      if (now - timestamp >= this.temporaryFailureCooldownMs) {\n        this.temporaryFailureUrls.delete(url);\n      }\n    }\n  }\n\n  isGamInCooldown(): boolean {\n    return Date.now() < this.globalNoFillCooldownUntil;\n  }\n\n  recordGamNoFill(): void {\n    this.globalConsecutiveNoFills++;\n\n    if (this.globalConsecutiveNoFills >= this.globalNoFillThreshold) {\n      const exponent = this.globalConsecutiveNoFills - this.globalNoFillThreshold;\n      const backoff = Math.min(\n        this.globalNoFillBackoffBaseMs * Math.pow(2, exponent),\n        this.globalNoFillBackoffMaxMs\n      );\n      this.globalNoFillCooldownUntil = Date.now() + backoff;\n\n      if (this.debug) {\n        console.log(\n          `[CIRCUIT-BREAKER] GAM cooldown activated: ${backoff}ms (${this.globalConsecutiveNoFills} consecutive no-fills)`\n        );\n      }\n    }\n  }\n\n  resetGamNoFillCounter(): void {\n    if (this.globalConsecutiveNoFills > 0 && this.debug) {\n      console.log(\n        `[CIRCUIT-BREAKER] Resetting no-fill counter (was ${this.globalConsecutiveNoFills})`\n      );\n    }\n    this.globalConsecutiveNoFills = 0;\n    this.globalNoFillCooldownUntil = 0;\n  }\n\n  async enforceGlobalRateLimit(): Promise<void> {\n    const now = Date.now();\n    const elapsed = now - this.globalLastGamRequestTime;\n    if (elapsed < this.globalMinGamIntervalMs) {\n      const waitMs = this.globalMinGamIntervalMs - elapsed;\n      if (this.debug) {\n        console.log(`[RATE-LIMIT] Waiting ${waitMs}ms before next GAM request`);\n      }\n      await new Promise(resolve => setTimeout(resolve, waitMs));\n    }\n    this.globalLastGamRequestTime = Date.now();\n  }\n\n  // --- Watchdog ---\n\n  startAdRequestWatchdog(token: number): void {\n    this.clearAdRequestWatchdog();\n\n    const timeoutMs = this.config.adFailsafeTimeoutMs ?? 10000;\n    this.adRequestWatchdogToken = token;\n    this.adRequestWatchdogId = window.setTimeout(() => {\n      if (this.adRequestWatchdogToken !== token) {\n        return;\n      }\n\n      this.adRequestWatchdogId = undefined;\n      this.adRequestWatchdogToken = null;\n      if (this.activeAdRequestToken === token) {\n        this.activeAdRequestToken = null;\n      }\n\n      this.logAdState(\"ad_request_timeout\", { token, timeoutMs });\n      this.callbacks.onWatchdogTimeout();\n    }, timeoutMs) as unknown as number;\n\n    this.logAdState(\"ad_request_watchdog_started\", { token, timeoutMs });\n  }\n\n  clearAdRequestWatchdog(): void {\n    if (this.adRequestWatchdogId != null) {\n      clearTimeout(this.adRequestWatchdogId);\n      this.adRequestWatchdogId = undefined;\n    }\n\n    if (this.adRequestWatchdogToken != null) {\n      this.logAdState(\"ad_request_watchdog_cleared\", {\n        token: this.adRequestWatchdogToken,\n      });\n      this.adRequestWatchdogToken = null;\n    }\n  }\n\n  // --- Failsafe ---\n\n  startAdFailsafeTimer(token: number): void {\n    this.clearAdFailsafeTimer();\n\n    const failsafeMs = this.config.adFailsafeTimeoutMs ?? 10000;\n    this.adFailsafeToken = token;\n\n    this.adFailsafeTimerId = window.setTimeout(() => {\n      if (this.adFailsafeToken !== token) {\n        return;\n      }\n\n      this.adFailsafeTimerId = undefined;\n      this.adFailsafeToken = null;\n\n      if (this.activeAdRequestToken === token) {\n        this.activeAdRequestToken = null;\n      }\n\n      this.logAdState(\"ad_failsafe_triggered\", {\n        token,\n        failsafeMs,\n        videoPaused: this.video.paused,\n      });\n\n      this.callbacks.onFailsafeTimeout();\n    }, failsafeMs) as unknown as number;\n\n    this.logAdState(\"ad_failsafe_started\", { token, failsafeMs });\n  }\n\n  clearAdFailsafeTimer(): void {\n    if (this.adFailsafeTimerId != null) {\n      clearTimeout(this.adFailsafeTimerId);\n      this.logAdState(\"ad_failsafe_cleared\", { token: this.adFailsafeToken });\n      this.adFailsafeTimerId = undefined;\n    }\n\n    this.adFailsafeToken = null;\n  }\n\n  logAdState(event: string, extra: Record<string, unknown> = {}, adPlayer?: AdController, inAdBreak?: boolean, showAds?: boolean): void {\n    if (!this.debug) {\n      return;\n    }\n\n    console.log(\"[StormcloudVideoPlayer][AdState]\", {\n      event,\n      timestamp: new Date().toISOString(),\n      showAds: showAds ?? false,\n      adPlaying: adPlayer?.isAdPlaying() ?? false,\n      inAdBreak: inAdBreak ?? false,\n      activeAdRequestToken: this.activeAdRequestToken,\n      ...extra,\n    });\n  }\n\n  // --- Reset for ad break end ---\n\n  resetForBreakEnd(): void {\n    this.clearAdStopTimer();\n    this.clearAdStartTimer();\n    this.clearAdRequestWatchdog();\n    this.clearAdFailsafeTimer();\n    this.activeAdRequestToken = null;\n    this.expectedAdBreakDurationMs = undefined;\n    this.currentAdBreakStartWallClockMs = undefined;\n    this.scteAdBreakEndWallClockMs = undefined;\n    this.adBreakPlayedDurationMs = 0;\n    this.currentAdIndex = 0;\n    this.totalAdsInBreak = 0;\n    this.consecutiveFailures = 0;\n    this.globalConsecutiveNoFills = 0;\n    this.adBreakEpoch++;\n  }\n\n  destroy(): void {\n    this.clearAdStopTimer();\n    this.clearAdStartTimer();\n    this.clearAdFailsafeTimer();\n    this.clearAdRequestWatchdog();\n  }\n}\n","import type { AdController, Scte35Marker } from \"../types\";\nimport type { AdTimingService } from \"./AdTimingService\";\n\nexport interface AdPreloadPoolDeps {\n  debug: boolean;\n  createAdPlayer(continueLiveStreamDuringAds: boolean): AdController;\n  shouldContinueLiveStreamDuringAds(): boolean;\n  timing: AdTimingService;\n  generateVastUrlsWithCorrelators(baseUrl: string, count: number): string[];\n  isInAdBreak(): boolean;\n  getPendingAdBreak(): { marker: Scte35Marker; vastUrls: string[]; isFetching: boolean } | null;\n}\n\nexport class AdPreloadPool {\n  private pool: Array<{\n    vastUrl: string;\n    adController: AdController;\n    loadedAt: number;\n    isReady: boolean;\n    loadPromise: Promise<void>;\n    durationSeconds?: number;\n  }> = [];\n  private readonly maxPoolSize: number = 2;\n  private poolActive: boolean = false;\n  private loopRunning: boolean = false;\n\n  private deps: AdPreloadPoolDeps;\n\n  constructor(deps: AdPreloadPoolDeps) {\n    this.deps = deps;\n  }\n\n  get active(): boolean {\n    return this.poolActive;\n  }\n\n  set active(value: boolean) {\n    this.poolActive = value;\n  }\n\n  get isLoopRunning(): boolean {\n    return this.loopRunning;\n  }\n\n  startPreloadPool(\n    baseVastUrl: string,\n    initialUrls: string[],\n    startLoopImmediately: boolean = true\n  ): void {\n    if (this.poolActive) {\n      if (this.deps.debug) {\n        console.log(\"[PRELOAD-POOL] Already active, skipping duplicate start\");\n      }\n      return;\n    }\n\n    this.poolActive = true;\n\n    if (this.deps.debug) {\n      console.log(`[PRELOAD-POOL] Starting preload pool EARLY (target size: ${this.maxPoolSize})`);\n      console.log(`[PRELOAD-POOL] Ad break hasn't started yet, but preloading ads in advance`);\n    }\n\n    for (const url of initialUrls) {\n      if (this.pool.length < this.maxPoolSize) {\n        this.preloadAdIntoPool(url);\n      }\n    }\n\n    if (startLoopImmediately) {\n      this.preloadPoolLoop(baseVastUrl);\n    } else if (this.deps.debug) {\n      console.log(\n        \"[PRELOAD-POOL] Pre-break mode: preloaded once, waiting for SCTE start to continue fetching\"\n      );\n    }\n  }\n\n  private async preloadAdIntoPool(vastUrl: string): Promise<void> {\n    const timing = this.deps.timing;\n\n    if (timing.isGamInCooldown()) {\n      if (this.deps.debug) {\n        console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping preload\");\n      }\n      return;\n    }\n\n    if (\n      this.pool.some(entry => entry.vastUrl === vastUrl) ||\n      timing.failedVastUrls.has(vastUrl) ||\n      timing.isUrlInCooldown(vastUrl)\n    ) {\n      return;\n    }\n\n    if (this.pool.length >= this.maxPoolSize) {\n      return;\n    }\n\n    if (this.deps.debug) {\n      console.log(`[PRELOAD-POOL] Preloading ad into pool: ${vastUrl}`);\n    }\n\n    const epoch = timing.adBreakEpoch;\n    const loadPromise = (async () => {\n      let hasAdError = false;\n      let adErrorPayload: any = null;\n      let errorListenerCleanup: (() => void) | null = null;\n\n      try {\n        const continueLiveStreamDuringAds = this.deps.shouldContinueLiveStreamDuringAds();\n        const preloadAd = this.deps.createAdPlayer(continueLiveStreamDuringAds);\n        preloadAd.initialize();\n\n        const errorListener = (payload?: any) => {\n          hasAdError = true;\n          adErrorPayload = payload;\n        };\n        preloadAd.on(\"ad_error\", errorListener);\n        errorListenerCleanup = () => preloadAd.off(\"ad_error\", errorListener);\n\n        await timing.enforceGlobalRateLimit();\n        await preloadAd.requestAds(vastUrl);\n\n        preloadAd.pause();\n\n        await new Promise(resolve => setTimeout(resolve, 1500));\n\n        preloadAd.pause();\n\n        if (hasAdError) {\n          const isNoFill = adErrorPayload?.isNoFill ||\n                          adErrorPayload?.code === 303 ||\n                          adErrorPayload?.vastErrorCode === 303;\n\n          if (errorListenerCleanup) {\n            errorListenerCleanup();\n          }\n          preloadAd.destroy();\n\n          timing.recordGamNoFill();\n\n          if (isNoFill) {\n            if (this.deps.debug) {\n              console.log(`[PRELOAD-POOL] Ad preload returned no-fill: ${vastUrl}`);\n            }\n            timing.temporaryFailureUrls.set(vastUrl, Date.now());\n          } else {\n            if (this.deps.debug) {\n              console.log(`[PRELOAD-POOL] Ad preload failed with error: ${vastUrl}`, adErrorPayload);\n            }\n            if (adErrorPayload && !timing.isTemporaryAdError(adErrorPayload as Error)) {\n              timing.failedVastUrls.add(vastUrl);\n            } else {\n              timing.temporaryFailureUrls.set(vastUrl, Date.now());\n            }\n          }\n          return;\n        }\n\n        if (!this.poolActive || epoch !== timing.adBreakEpoch) {\n          if (this.deps.debug) {\n            console.log(\n              \"[PRELOAD-POOL] Discarding preloaded ad - break ended during fetch\"\n            );\n          }\n          if (errorListenerCleanup) {\n            errorListenerCleanup();\n          }\n          try {\n            preloadAd.destroy();\n          } catch {}\n          return;\n        }\n\n        const poolEntry: {\n          vastUrl: string;\n          adController: AdController;\n          loadedAt: number;\n          isReady: boolean;\n          loadPromise: Promise<void>;\n          durationSeconds?: number;\n        } = {\n          vastUrl,\n          adController: preloadAd,\n          loadedAt: Date.now(),\n          isReady: true,\n          loadPromise: Promise.resolve(),\n        };\n        const loadedDuration = preloadAd.getLoadedAdDuration?.();\n        if (loadedDuration != null && loadedDuration > 0) {\n          poolEntry.durationSeconds = loadedDuration;\n        }\n\n        const lateErrorListener = (payload?: any) => {\n          const index = this.pool.findIndex(entry => entry.vastUrl === vastUrl);\n          if (index >= 0) {\n            this.pool.splice(index, 1);\n            if (this.deps.debug) {\n              console.log(`[PRELOAD-POOL] Late error detected, removed from pool: ${vastUrl}`, payload);\n            }\n            try {\n              preloadAd.destroy();\n            } catch {}\n          }\n        };\n        preloadAd.on(\"ad_error\", lateErrorListener);\n\n        this.pool.push(poolEntry);\n\n        if (this.deps.debug) {\n          console.log(`[PRELOAD-POOL] Ad preloaded (no errors detected within timeout) (pool size: ${this.pool.length}/${this.maxPoolSize}, duration=${poolEntry.durationSeconds ?? \"?\"}s)`);\n        }\n\n        if (errorListenerCleanup) {\n          errorListenerCleanup();\n        }\n      } catch (error) {\n        if (errorListenerCleanup) {\n          errorListenerCleanup();\n        }\n\n        timing.recordGamNoFill();\n\n        if (this.deps.debug) {\n          console.warn(`[PRELOAD-POOL] Failed to preload ad: ${vastUrl}`, error);\n        }\n\n        if (error instanceof Error && !timing.isTemporaryAdError(error)) {\n          timing.failedVastUrls.add(vastUrl);\n        } else if (error instanceof Error && timing.isTemporaryAdError(error)) {\n          timing.temporaryFailureUrls.set(vastUrl, Date.now());\n        }\n      }\n    })();\n\n    loadPromise.catch(() => {});\n  }\n\n  async preloadPoolLoop(baseVastUrl: string): Promise<void> {\n    if (this.loopRunning) {\n      return;\n    }\n\n    this.loopRunning = true;\n    const epoch = this.deps.timing.adBreakEpoch;\n\n    if (this.deps.debug) {\n      console.log(\"[PRELOAD-POOL] Starting continuous preload loop\");\n    }\n\n    while (this.poolActive && epoch === this.deps.timing.adBreakEpoch) {\n      if (this.deps.timing.isGamInCooldown()) {\n        if (this.deps.debug) {\n          console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping preload pool loop\");\n        }\n        break;\n      }\n\n      if (!this.deps.isInAdBreak() && this.pool.length >= this.maxPoolSize) {\n        await new Promise(resolve => setTimeout(resolve, 2000));\n        continue;\n      }\n\n      if (!this.deps.isInAdBreak() && this.deps.getPendingAdBreak() === null) {\n        if (this.deps.debug) {\n          console.log(\"[PRELOAD-POOL] Ad break cancelled, stopping preload pool\");\n        }\n        break;\n      }\n\n      while (this.pool.length < this.maxPoolSize) {\n        if (\n          !this.poolActive ||\n          epoch !== this.deps.timing.adBreakEpoch ||\n          this.deps.timing.isGamInCooldown()\n        ) {\n          break;\n        }\n\n        if (this.deps.isInAdBreak() && !this.deps.timing.hasTimeToStartAnotherAd()) {\n          if (this.deps.debug) {\n            console.log(\"[PRELOAD-POOL] Not enough ad break time left, stopping preload\");\n          }\n          break;\n        }\n\n        const newUrls = this.deps.generateVastUrlsWithCorrelators(baseVastUrl, 1);\n        const newUrl = newUrls[0];\n\n        if (newUrl && !this.deps.timing.failedVastUrls.has(newUrl) && !this.deps.timing.isUrlInCooldown(newUrl)) {\n          await this.preloadAdIntoPool(newUrl);\n        }\n\n        await new Promise(resolve => setTimeout(resolve, 1000));\n      }\n\n      await new Promise(resolve => setTimeout(resolve, 2000));\n    }\n\n    this.loopRunning = false;\n\n    if (this.deps.debug) {\n      console.log(\"[PRELOAD-POOL] Preload loop ended\");\n    }\n  }\n\n  getPreloadedAd(): { vastUrl: string; adController: AdController } | null {\n    if (this.pool.length === 0) {\n      return null;\n    }\n\n    const entry = this.pool.shift();\n    if (!entry || !entry.isReady) {\n      return null;\n    }\n\n    if (this.deps.debug) {\n      console.log(`[PRELOAD-POOL] Using preloaded ad from pool (${this.pool.length} remaining)`);\n    }\n\n    return {\n      vastUrl: entry.vastUrl,\n      adController: entry.adController,\n    };\n  }\n\n  stop(): void {\n    this.poolActive = false;\n    this.loopRunning = false;\n\n    for (const entry of this.pool) {\n      try {\n        entry.adController.destroy();\n      } catch (error) {\n        if (this.deps.debug) {\n          console.warn(\"[PRELOAD-POOL] Error destroying preloaded controller:\", error);\n        }\n      }\n    }\n\n    this.pool = [];\n\n    if (this.deps.debug) {\n      console.log(\"[PRELOAD-POOL] Preload pool stopped and cleaned up\");\n    }\n  }\n}\n","export class PlaceholderLayer {\n  private container: HTMLDivElement | undefined;\n  private debug: boolean;\n  private video: HTMLVideoElement;\n\n  constructor(video: HTMLVideoElement, debug: boolean) {\n    this.video = video;\n    this.debug = debug;\n  }\n\n  private ensureContainer(): void {\n    if (this.container) {\n      return;\n    }\n\n    const el = document.createElement(\"div\");\n    el.style.position = \"absolute\";\n    el.style.left = \"0\";\n    el.style.top = \"0\";\n    el.style.right = \"0\";\n    el.style.bottom = \"0\";\n    el.style.display = \"none\";\n    el.style.alignItems = \"center\";\n    el.style.justifyContent = \"center\";\n    el.style.pointerEvents = \"none\";\n    el.style.zIndex = \"5\";\n    el.style.backgroundColor = \"#000\";\n    el.style.transition = \"opacity 0.3s ease-in-out\";\n    el.style.opacity = \"0\";\n\n    if (!this.video.parentElement) {\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Video element has no parent for placeholder container\");\n      }\n      return;\n    }\n\n    this.video.parentElement.appendChild(el);\n    this.container = el;\n  }\n\n  show(): void {\n    this.ensureContainer();\n\n    if (!this.container) {\n      return;\n    }\n\n    if (!this.video.muted) {\n      this.video.muted = true;\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Muted video when showing placeholder\");\n      }\n    }\n\n    const wasHidden = this.container.style.display === \"none\" || this.container.style.opacity === \"0\";\n    if (wasHidden) {\n      this.container.style.transition = \"none\";\n    } else {\n      this.container.style.transition = \"opacity 0.3s ease-in-out\";\n    }\n\n    this.container.style.backgroundColor = \"#000\";\n    this.container.style.display = \"flex\";\n    this.container.offsetHeight;\n    this.container.style.opacity = \"1\";\n    this.container.style.pointerEvents = \"auto\";\n\n    if (wasHidden) {\n      requestAnimationFrame(() => {\n        if (this.container) {\n          this.container.style.transition = \"opacity 0.3s ease-in-out\";\n        }\n      });\n    }\n\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Showing placeholder layer (between content and ad layer)\");\n    }\n  }\n\n  hide(): void {\n    if (!this.container) {\n      return;\n    }\n\n    this.container.style.opacity = \"0\";\n    setTimeout(() => {\n      if (this.container) {\n        this.container.style.display = \"none\";\n        this.container.style.pointerEvents = \"none\";\n        this.container.style.backgroundColor = \"#000\";\n      }\n    }, 300);\n\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Hiding placeholder layer\");\n    }\n  }\n\n  destroy(): void {\n    if (this.container) {\n      if (this.container.parentElement) {\n        this.container.parentElement.removeChild(this.container);\n      }\n      this.container = undefined;\n    }\n  }\n}\n","import Hls from \"hls.js\";\nimport type {\n  StormcloudVideoPlayerConfig,\n  Scte35Marker,\n  Id3TagInfo,\n} from \"../types\";\nimport type { Scte35CueContext } from \"./playerTypes\";\nimport {\n  parseScte35FromId3,\n  parseScte35FromTsPackets,\n  normalizeFragmentPayload,\n  getFragmentStartSeconds,\n  parseCueOutDuration,\n  parseCueOutCont,\n  parseAttributeList,\n  toNumber,\n} from \"./Scte35Parser\";\nimport type { Scte35CueManager } from \"./Scte35CueManager\";\nimport type { AdTimingService } from \"./AdTimingService\";\n\nexport interface HlsEngineCallbacks {\n  onManifestParsed(isLive: boolean): Promise<void>;\n  onScte35Cue(marker: Scte35Marker, context: Scte35CueContext): void;\n  activatePendingCuesForFragment(frag: any): void;\n  onFatalDestroy(): void;\n  isInAdBreak(): boolean;\n  hasPendingAdBreak(): boolean;\n}\n\nexport class HlsEngine {\n  hls: Hls | undefined;\n  isLiveStream: boolean = false;\n  nativeHlsMode: boolean = false;\n  videoSrcProtection: string | null = null;\n\n  private bufferedSegmentsCount: number = 0;\n  private shouldAutoplayAfterBuffering: boolean = false;\n  private hasInitialBufferCompleted: boolean = false;\n\n  private readonly config: StormcloudVideoPlayerConfig;\n  private readonly video: HTMLVideoElement;\n  private readonly cueManager: Scte35CueManager;\n  private readonly timing: AdTimingService;\n  private readonly callbacks: HlsEngineCallbacks;\n\n  constructor(\n    config: StormcloudVideoPlayerConfig,\n    video: HTMLVideoElement,\n    cueManager: Scte35CueManager,\n    timing: AdTimingService,\n    callbacks: HlsEngineCallbacks\n  ) {\n    this.config = config;\n    this.video = video;\n    this.cueManager = cueManager;\n    this.timing = timing;\n    this.callbacks = callbacks;\n  }\n\n  private get debug(): boolean {\n    return !!this.config.debugAdTiming;\n  }\n\n  shouldUseNativeHls(getStreamType: () => \"hls\" | \"other\"): boolean {\n    const streamType = getStreamType();\n    if (streamType === \"other\") {\n      return true;\n    }\n    const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n    return !!(this.config.allowNativeHls && canNative);\n  }\n\n  async setupNativeHls(): Promise<void> {\n    this.nativeHlsMode = true;\n    this.videoSrcProtection = this.config.src;\n    this.video.src = this.config.src;\n\n    this.isLiveStream = this.config.isLiveStream ?? (this.config.lowLatencyMode ?? false);\n\n    if (this.debug) {\n      const adBehavior = this.isLiveStream\n        ? \"live (main video continues muted during ads)\"\n        : \"vod (main video pauses during ads)\";\n      console.log(\n        \"[StormcloudVideoPlayer] Using native HLS playback:\",\n        {\n          isLive: this.isLiveStream,\n          allowNativeHls: this.config.allowNativeHls,\n          adBehavior,\n        }\n      );\n    }\n\n    if (this.config.autoplay) {\n      await this.video.play()?.catch(() => {});\n    }\n  }\n\n  setupHls(): void {\n    this.hls = new Hls({\n      enableWorker: true,\n      backBufferLength: 30,\n      liveDurationInfinity: true,\n      lowLatencyMode: !!this.config.lowLatencyMode,\n      maxLiveSyncPlaybackRate: this.config.lowLatencyMode ? 1.5 : 1.0,\n      ...(this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {}),\n      maxBufferLength: 30,\n      maxMaxBufferLength: 600,\n      maxBufferSize: 60 * 1000 * 1000,\n      maxBufferHole: 0.5,\n      highBufferWatchdogPeriod: 2,\n      nudgeOffset: 0.1,\n      nudgeMaxRetry: 3,\n      startPosition: -1,\n    });\n\n    this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n      this.hls?.loadSource(this.config.src);\n    });\n\n    this.hls.on(Hls.Events.MANIFEST_PARSED, async (_, _data: any) => {\n      this.isLiveStream =\n        this.config.isLiveStream ??\n        (this.hls?.levels?.some(\n          (level) =>\n            level?.details?.live === true || level?.details?.type === \"LIVE\"\n        ) ?? false);\n\n      await this.callbacks.onManifestParsed(this.isLiveStream);\n\n      this.bufferedSegmentsCount = 0;\n      this.hasInitialBufferCompleted = false;\n      this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n\n      const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Waiting for\",\n          minSegments,\n          \"segments to buffer before playback\"\n        );\n      }\n\n      if (minSegments === 0 || !this.config.autoplay) {\n        this.hasInitialBufferCompleted = true;\n        if (this.config.autoplay) {\n          await this.video.play()?.catch(() => {});\n        }\n      }\n    });\n\n    this.hls.on(Hls.Events.LEVEL_LOADED, (_evt, data: any) => {\n      if (this.callbacks.isInAdBreak() || this.callbacks.hasPendingAdBreak()) {\n        return;\n      }\n\n      const details = data?.details;\n      if (!details || !details.fragments || details.fragments.length === 0) {\n        return;\n      }\n\n      const fragmentsToScan = Math.min(5, details.fragments.length);\n\n      for (let i = 0; i < fragmentsToScan; i++) {\n        const frag = details.fragments[i];\n        const tagList: any[] | undefined = frag?.tagList;\n\n        if (!Array.isArray(tagList)) continue;\n\n        for (const entry of tagList) {\n          let tag = \"\";\n          let value = \"\";\n\n          if (Array.isArray(entry)) {\n            tag = String(entry[0] ?? \"\");\n            value = String(entry[1] ?? \"\");\n          } else if (typeof entry === \"string\") {\n            const idx = entry.indexOf(\":\");\n            if (idx >= 0) {\n              tag = entry.substring(0, idx);\n              value = entry.substring(idx + 1);\n            } else {\n              tag = entry;\n            }\n          }\n\n          if (!tag) continue;\n\n          if (tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-DATERANGE\")) {\n            const attrs = tag.includes(\"EXT-X-DATERANGE\")\n              ? parseAttributeList(value)\n              : {};\n            const hasScteOut = tag.includes(\"EXT-X-CUE-OUT\") ||\n              \"SCTE35-OUT\" in attrs ||\n              attrs[\"SCTE35-OUT\"] !== undefined;\n\n            if (hasScteOut) {\n              const durationSeconds = parseCueOutDuration(value);\n              const marker: Scte35Marker = {\n                type: \"start\",\n                ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n                raw: { tag, value, earlyDetection: true },\n              } as Scte35Marker;\n\n              if (this.debug) {\n                console.log(\"[StormcloudVideoPlayer] EARLY SCTE-35 DETECTION: Ad break marker found in fragment\", i, \"- starting pre-fetch (NOT playing yet)\");\n              }\n\n              this.callbacks.onScte35Cue(marker, {\n                ...this.cueManager.createScte35CueContext(\"manifest\", \"early\", frag),\n              });\n              return;\n            }\n          }\n        }\n      }\n    });\n\n    this.hls.on(Hls.Events.FRAG_BUFFERED, async (_evt, _data: any) => {\n      if (this.hasInitialBufferCompleted) {\n        return;\n      }\n\n      this.bufferedSegmentsCount++;\n      const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n        );\n      }\n\n      if (this.bufferedSegmentsCount >= minSegments) {\n        this.hasInitialBufferCompleted = true;\n\n        if (this.shouldAutoplayAfterBuffering) {\n          if (this.debug) {\n            console.log(\n              `[StormcloudVideoPlayer] Initial buffer complete (${this.bufferedSegmentsCount} segments). Starting playback.`\n            );\n          }\n          await this.video.play()?.catch((err) => {\n            if (this.debug) {\n              console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n            }\n          });\n        }\n      }\n    });\n\n    this.hls.on(Hls.Events.FRAG_PARSING_METADATA, (_evt, data: any) => {\n      const id3Tags: Id3TagInfo[] = (data?.samples || []).map((s: any) => ({\n        key: \"ID3\",\n        value: s?.data,\n        ptsSeconds: s?.pts,\n      }));\n      id3Tags.forEach((tag) => this.onId3Tag(tag));\n    });\n\n    this.hls.on(Hls.Events.FRAG_LOADED, (_evt, data: any) => {\n      this.processFragmentScte35Payload(\n        data?.payload,\n        typeof data?.frag?.sn === \"number\" ? data.frag.sn : undefined,\n        getFragmentStartSeconds(data?.frag)\n      );\n    });\n\n    this.hls.on(Hls.Events.FRAG_DECRYPTED, (_evt, data: any) => {\n      this.processFragmentScte35Payload(\n        data?.payload,\n        typeof data?.frag?.sn === \"number\" ? data.frag.sn : undefined,\n        getFragmentStartSeconds(data?.frag)\n      );\n    });\n\n    this.hls.on(Hls.Events.FRAG_CHANGED, (_evt, data: any) => {\n      const frag = data?.frag;\n      const tagList: any[] | undefined = frag?.tagList;\n      if (!Array.isArray(tagList)) {\n        this.callbacks.activatePendingCuesForFragment(frag);\n        return;\n      }\n\n      for (const entry of tagList) {\n        let tag = \"\";\n        let value = \"\";\n        if (Array.isArray(entry)) {\n          tag = String(entry[0] ?? \"\");\n          value = String(entry[1] ?? \"\");\n        } else if (typeof entry === \"string\") {\n          const idx = entry.indexOf(\":\");\n          if (idx >= 0) {\n            tag = entry.substring(0, idx);\n            value = entry.substring(idx + 1);\n          } else {\n            tag = entry;\n            value = \"\";\n          }\n        }\n\n        if (!tag) continue;\n        if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n          const prog = parseCueOutCont(value);\n          const marker: Scte35Marker = {\n            type: \"progress\",\n            ...(prog?.duration !== undefined\n              ? { durationSeconds: prog.duration }\n              : {}),\n            ...(prog?.elapsed !== undefined\n              ? { ptsSeconds: prog.elapsed }\n              : {}),\n            raw: { tag, value },\n          } as Scte35Marker;\n          this.callbacks.onScte35Cue(marker, {\n            ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n          });\n        } else if (tag.includes(\"EXT-X-CUE-OUT\")) {\n          const durationSeconds = parseCueOutDuration(value);\n          const marker: Scte35Marker = {\n            type: \"start\",\n            ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n            raw: { tag, value },\n          } as Scte35Marker;\n          this.callbacks.onScte35Cue(marker, {\n            ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n          });\n        } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n          this.callbacks.onScte35Cue(\n            { type: \"end\", raw: { tag, value } },\n            {\n              ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n            }\n          );\n        } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n          const attrs = parseAttributeList(value);\n          const hasScteOut =\n            \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== undefined;\n          const hasScteIn =\n            \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== undefined;\n          const klass = String(attrs[\"CLASS\"] ?? \"\");\n          const duration = toNumber(attrs[\"DURATION\"]);\n\n          if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n            const marker: Scte35Marker = {\n              type: \"start\",\n              ...(duration !== undefined ? { durationSeconds: duration } : {}),\n              raw: { tag, value, attrs },\n            } as Scte35Marker;\n            this.callbacks.onScte35Cue(marker, {\n              ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n            });\n          }\n          if (hasScteIn) {\n            this.callbacks.onScte35Cue(\n              { type: \"end\", raw: { tag, value, attrs } },\n              {\n                ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n              }\n            );\n          }\n        }\n      }\n      this.callbacks.activatePendingCuesForFragment(frag);\n    });\n\n    this.hls.on(Hls.Events.ERROR, (_evt, data) => {\n      if (data?.fatal) {\n        switch (data.type) {\n          case Hls.ErrorTypes.NETWORK_ERROR:\n            this.hls?.startLoad();\n            break;\n          case Hls.ErrorTypes.MEDIA_ERROR:\n            this.hls?.recoverMediaError();\n            break;\n          default:\n            this.callbacks.onFatalDestroy();\n            break;\n        }\n      }\n    });\n\n    this.hls.attachMedia(this.video);\n  }\n\n  private onId3Tag(tag: Id3TagInfo): void {\n    if (typeof tag.ptsSeconds === \"number\") {\n      this.timing.updatePtsDrift(tag.ptsSeconds);\n    }\n    const marker = parseScte35FromId3(tag);\n    if (marker) {\n      this.callbacks.onScte35Cue(marker, {\n        source: \"id3\",\n        readiness: \"playback\",\n      });\n    }\n  }\n\n  private processFragmentScte35Payload(\n    payloadData: unknown,\n    fragmentSn?: number,\n    fragmentStartSeconds?: number\n  ): void {\n    const payload = normalizeFragmentPayload(payloadData);\n    if (!payload) {\n      return;\n    }\n\n    const markers = parseScte35FromTsPackets(\n      payload,\n      this.cueManager.tsScte35Pids,\n      this.cueManager.pmtPids,\n      this.cueManager.processedTsScte35Sections\n    );\n    markers.forEach((marker) => {\n      const context: Scte35CueContext = {\n        source: \"ts\",\n        readiness: \"early\",\n      };\n      if (fragmentSn !== undefined) {\n        context.fragmentSn = fragmentSn;\n      }\n      if (fragmentStartSeconds !== undefined) {\n        context.fragmentStartSeconds = fragmentStartSeconds;\n      }\n      this.callbacks.onScte35Cue(marker, context);\n    });\n  }\n\n  getLiveSyncPosition(): number | undefined {\n    const pos = this.hls?.liveSyncPosition;\n    return typeof pos === \"number\" && Number.isFinite(pos) ? pos : undefined;\n  }\n\n  destroy(): void {\n    this.hls?.destroy();\n    this.hls = undefined;\n  }\n}\n"]}