{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/player/StormcloudVideoPlayer.cjs","../../src/player/StormcloudVideoPlayer.ts","../../src/sdk/hlsAdPlayer.ts","../../src/sdk/pal.ts","../../src/utils/mqttClient.ts","../../src/utils/vastEnvironmentSignals.ts","../../src/utils/mqttConfig.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","__copyProps","desc","to","from","except","key","call","enumerable","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","StormcloudVideoPlayer_exports","StormcloudVideoPlayer","module","exports","import_hls","require","MAX_VAST_WRAPPER_DEPTH","createHlsAdPlayer","adPlaying","contentVideo","options","originalVolume","Math","max","min","volume","listeners","Map","licenseKey","mainHlsInstance","adVideoElement","adHls","adContainerEl","sessionId","preloadedAds","preloadingAds","destroyed","pendingTimeouts","trackingFired","impression","start","firstQuartile","midpoint","thirdQuartile","complete","emit","event","payload","set","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","scoredFiles","map","file","widthDiff","abs","heightDiff","resolutionDiff","fileBitrate","bitrateDiff","score","sort","a","b","bestMatch","resolution","isHlsMediaFile","mediaFile","type","toLowerCase","isProgressiveMediaFile","startsWith","endsWith","createEmptyTrackingUrls","pause","fullscreen","exitFullscreen","skip","extractTrackingUrls","trackingUrls","xmlDoc","el","textContent","trim","push","querySelectorAll","getAttribute","eventKey","wrapperUri","mergeTrackingUrls","source","keys","concat","parseVastXml","xmlString","parser","DOMParser","parseFromString","parserError","adElement","querySelector","adId","title","vastAdTagUri","clickThrough","isNoAdAvailable","durationText","durationParts","split","mediaFileElements","mf","index","parseInt","bitrateAttr","bitrateValue","ad","id","duration","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","currentAd","addEventListener","progress","currentTime","handleAdComplete","e","handleAdError","mute","unmute","ended","resume","setAdPlayingFlag","isPlaying","dataset","stormcloudAdPlaying","display","pointerEvents","continueLiveStreamDuringAds","paused","play","catch","initialize","container","right","bottom","alignItems","justifyContent","zIndex","parentElement","appendChild","requestAds","Promise","reject","has","delete","resolve","contentVolume","isHlsAd","originalMutedState","Hls","isSupported","destroy","enableWorker","lowLatencyMode","loadSource","attachMedia","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","generateNonce","loader","request","manager","NonceRequest","adWillAutoPlay","adWillPlayMuted","playerVolume","continuousPlayback","descriptionUrl","location","href","iconsSupported","playerType","playerVersion","supportedApiFrameworks","videoWidth","videoHeight","ppid","loadNonceManager","getNonce","getCurrentNonce","injectNonce","sendPlaybackStart","initMQTTClient","AIRY_TIZEN_APP_ID","URL","searchParams","base","replace","sep","encodeURIComponent","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","clientId","slice","mqtt","connect","keepalive","clean","reconnectPeriod","connectTimeout","queueQoSZero","err","info","message","ensureMQTTClient","publishMQTT","topic","publish","JSON","stringify","AIRY_ANDROID_APP_ID","AIRY_WEBOS_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","_lgTestDeviceId","createUuid","ANDROID_ID_TYPES","LG_TEST_CONTENT_URL","getLgTestDeviceId","isLgWebOS","navigator","test","userAgent","getDefaultAppId","ua","DEVICE_ID_STORAGE_KEYS","resolveVastEnvironmentSignals","isCtv","platformLat","bridgeSignals","readNativeBridgeSignals","platformDevice","readPlatformNativeDeviceId","lg","deviceId","readStoredDeviceId","limitAdTracking","deviceIdType","readStoredString","inferDeviceIdType","readStoredLimitAdTracking","contentUrl","appId","appName","getOrCreateCtvSessionId","deviceTypeHint","isEquivalentDeviceIdType","tagType","runtimeType","tag","runtime","isMacroPlaceholder","isZeroedAdId","resolveNativeDeviceId","storageKey","localStorage","setItem","floor","crypto","randomUUID","char","nibble","adinfo","tifa","getTIFA","lat","isLATEnabled","webOSDev","lgudid","LGUDID","roku","Roku","rida","getPublisherUniqueId","ZEROED_AD_ID_PATTERNS","t","candidates","__STORMCLOUD_CTV_AD_INFO__","__STORMCLOUD_CTV__","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","Array","padStart","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","persistedId","getOrCreateStoredUuid","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","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","arrayLike","mapFn","thisArg","items","len","polyfillStringStartsWith","search","pos","polyfillStringEndsWith","polyfillStringIncludes","indexOf","initializePolyfills","UNEXPANDED_MACRO_PATTERN","INVALID_VAST_PARAM_KEY","EXAMPLE_COM_URL","CTV_UNSUPPORTED_PARAMS","INLINE_DEVICE_MACRO_REPLACEMENTS","pattern","getValue","ctx","correlator","generateCorrelator","applyDeviceIdentityParams","trimmed","getRandomValues","buf","Uint32Array","MAX_SAFE_INTEGER","expandInlineMacroPlaceholders","baseUrl","runtimeId","tagRdid","tagLat","latValue","tagRdidValid","tagTypeValid","removeBrokenAppNameOrphans","toDelete","_value","suffix","trimStart","normalizeVastTagUrl","raw","anValue","orphanFragments","reconstructed","trimEnd","_match","prefix","val","applyVastMacros","expandedUrl","replaceCorrelatorFallback","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","getChromeVersion","getWebKitVersion","getPlatform","userAgentData","detectBrowser","version","majorVersion","supportsModernJS","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","isLegacyTV","getBrowserConfigOverrides","browser","overrides","debug","allowNativeHls","logBrowserInfo","parseCueOutDuration","num","parseFloat","dStr","d","parseCueOutCont","res","elapsedMatch","elapsed","durationMatch","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","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","markers","appendScte35Bytes","bytes","assemblers","assembler","expectedLength","addScte35SectionMarker","collectScte35SectionsFromPayload","previousAssembler","subarray","tableId","totalLength","parseScte35FromTsPackets","packetInfo","sectionAssemblers","tsStart","secondByte","thirdByte","fourthByte","adaptationFieldControl","hasPayload","payloadStart","adaptationLength","payloadEnd","BitReader","bytePos","bitPos","readBits","numBits","remainingInByte","currentByte","shift","toRead","mask","bits","skipBits","bytePosition","readSpliceTime","r","ptsAdjustmentTicks","timeSpecifiedFlag","high","low","ptsTicks","markerTypeFromSegmentationTypeId","segmentationTypeId","parseScte35SegmentationDescriptor","descriptor","identifier","segmentationEventId","cancelIndicator","programSegmentationFlag","segmentationDurationFlag","componentCount","durationTicks","segmentationUpidLength","markerType","parseScte35SegmentationDescriptors","descriptorLoopLength","descriptorOffset","descriptorTag","descriptorLength","descriptorDataStart","descriptorDataEnd","descriptorMarker","parseScte35Binary","ptsAdjHigh","ptsAdjLow","spliceCommandLength","spliceCommandType","commandBodyStart","programSpliceFlag","spliceEventId","cancel","outOfNetwork","durationFlag","spliceImmediateFlag","componentPtsSeconds","expectedDescriptorOffset","splice_event_id","segmentation_event_id","Scte35CueManager","callbacks","pendingScte35Cues","recentScte35CueKeys","recentScte35CueLimit","processedTsScte35Sections","pendingScte35CueKey","pendingScte35CueKeyValue","activeScte35BreakKey","activeScte35BreakKeyValue","scheduledScte35BreakKey","scheduledScte35BreakKeyValue","createScte35CueContext","readiness","sn","fragmentStartSec","fragmentStartSeconds","onScte35Cue","cue","createScte35Cue","pendingKey","getPendingScte35CueKey","trimRecentScte35CueMaps","onEarlyStartCue","fragmentSn","shouldAcceptScte35EndCue","inAdBreak","isInAdBreak","hasRecentlyHandledScte35Cue","markScte35CueHandled","onPlaybackCue","activatePendingScte35CuesForFragment","matchingCues","entries","getScte35CueKey","getScte35MarkerRaw","toIdentityString","daterangeId","ID","scteValue","round","isStrongScte35CueKey","recentKey","AdConfigManager","config","vmapBreaks","consumedVmapBreakIds","streamCorrelator","consentSignals","podCounter","podAssignedByPrefetch","adRequestPositionInBreak","lastHeartbeatTime","debugAdTiming","isVmapEnabled","isVmap","vmapUrl","fetchAdConfiguration","vastMode","vastEndpoint","apiUrl","imaPayload","decodedPayload","numberAds","apiVastTagUrl","json","ima","apiNumberAds","vast","cue_tones","number_ads","fetchAndParseVmap","vmapXml","parseVmapToBreaks","doc","VMAP_NS","adBreakNodes","getElementsByTagNameNS","getElementsByTagName","localName","node","timeOffsetRaw","startTimeMs","parseVmapTimeOffsetToMs","adTagNode","adTagUrl","breakId","aStart","bStart","timeOffset","hms","hh","mm","ss","ms","hours","minutes","seconds","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","scheduleAdStopCountdown","remainingMs","clearAdStopTimer","ensureAdStoppedByTimer","adStopTimerId","onAdStopTimerFired","scheduleAdStartIn","delayMs","cueKey","clearAdStartTimer","onAdStartTimerFired","adStartTimerId","alpha","scheduleAdStopAtBreakBoundary","getMinRemainingMsToStartAd","hasTimeToStartAnotherAd","updatePtsDrift","ptsSecondsSample","sampleMs","resolveScteBreakStartWallClockMs","nowWallClockMs","estimatedCurrentPtsMs","deltaMs","setAdBreakDurationBoundary","expectedAdBreakDurationMs","currentAdBreakStartWallClockMs","scteAdBreakEndWallClockMs","getWallClockRemainingAdMs","endWallClockMs","getAdBreakEndWallClockMs","getDurationBudgetRemainingMs","getLoadedAdDurationMs","adController","adFitsRemainingBudget","logAdDurationDecision","accepted","remainingBudget","recordPlayedAdDuration","ensureLoadedAdFitsBudget","fits","rejectLoadedAdForDuration","markAdStarted","getRemainingAdMs","wallClockRemaining","budgetRemaining","configured","minRemainingMsToStartAd","minRemaining","isTemporaryAdError","isUrlInCooldown","failureTime","cleanupTemporaryFailures","isGamInCooldown","recordGamNoFill","exponent","backoff","pow","resetGamNoFillCounter","enforceGlobalRateLimit","waitMs","startAdRequestWatchdog","token","clearAdRequestWatchdog","adFailsafeTimeoutMs","adRequestWatchdogId","logAdState","clearAdFailsafeTimer","onWatchdogTimeout","startAdFailsafeTimer","failsafeMs","adFailsafeTimerId","videoPaused","onFailsafeTimeout","extra","showAds","resetForBreakEnd","deps","timing","maxPoolSize","AdPreloadPool","pool","poolActive","loopRunning","active","isLoopRunning","startPreloadPool","startLoopImmediately","preloadAdIntoPool","preloadPoolLoop","baseVastUrl","vastUrl","epoch","loadPromise","some","entry","hasAdError","adErrorPayload","errorListenerCleanup","preloadAd","errorListener","isNoFill","poolEntry","loadedDuration","lateErrorListener","shouldContinueLiveStreamDuringAds","createAdPlayer","code","vastErrorCode","loadedAt","isReady","findIndex","splice","newUrls","newUrl","getPendingAdBreak","getPreloadedAd","PlaceholderLayer","ensureContainer","transition","show","hide","wasHidden","offsetHeight","requestAnimationFrame","HlsEngine","cueManager","isLiveStream","nativeHlsMode","videoSrcProtection","bufferedSegmentsCount","shouldAutoplayAfterBuffering","hasInitialBufferCompleted","shouldUseNativeHls","getStreamType","canNative","setupNativeHls","adBehavior","isLive","setupHls","hls","import_hls2","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","liveSyncDuration","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","pts","onId3Tag","FRAG_LOADED","processFragmentScte35Payload","FRAG_DECRYPTED","FRAG_CHANGED","activatePendingCuesForFragment"],"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/player/StormcloudVideoPlayer.ts\nvar StormcloudVideoPlayer_exports = {};\n__export(StormcloudVideoPlayer_exports, {\n  StormcloudVideoPlayer: () => StormcloudVideoPlayer\n});\nmodule.exports = __toCommonJS(StormcloudVideoPlayer_exports);\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// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n  StormcloudVideoPlayer\n});\n","import type {\n  StormcloudVideoPlayerConfig,\n  Scte35Marker,\n  AdController,\n  AdBreak,\n} from \"../types\";\nimport { createHlsAdPlayer } from \"../sdk/hlsAdPlayer\";\nimport { createPalNonceManager } from \"../sdk/pal\";\nimport type { PalNonceManager } from \"../sdk/pal\";\nimport {\n  sendAdDetectTracking,\n} from \"../utils/tracking\";\nimport { initializePolyfills } from \"../utils/polyfills\";\nimport { fetchConsentSignals } from \"../utils/vastMacros\";\nimport {\n  logBrowserInfo,\n  getBrowserConfigOverrides,\n} from \"../utils/browserCompat\";\n\nimport type { Scte35CueContext } from \"./playerTypes\";\nimport { isManifestBasedMarker } from \"./Scte35Parser\";\nimport { Scte35CueManager } from \"./Scte35CueManager\";\nimport { AdConfigManager } from \"./AdConfigManager\";\nimport { AdTimingService } from \"./AdTimingService\";\nimport { AdPreloadPool } from \"./AdPreloadPool\";\nimport { PlaceholderLayer } from \"./PlaceholderLayer\";\nimport { HlsEngine } from \"./HlsEngine\";\nimport { AdBreakOrchestrator } from \"./AdBreakOrchestrator\";\nimport {\n  toggleMute as ctrlToggleMute,\n  toggleFullscreen as ctrlToggleFullscreen,\n  isMuted as ctrlIsMuted,\n  setMuted as ctrlSetMuted,\n  setVolume as ctrlSetVolume,\n  getVolume as ctrlGetVolume,\n  isFullscreen as ctrlIsFullscreen,\n  resizePlayer as ctrlResizePlayer,\n} from \"./PlayerControls\";\n\nexport class StormcloudVideoPlayer {\n  private readonly video: HTMLVideoElement;\n  private readonly config: StormcloudVideoPlayerConfig;\n  private adPlayer: AdController;\n  private attached = false;\n\n  private timeUpdateHandler?: (event: Event) => void;\n  private endedHandler?: (event: Event) => void;\n  private emptiedHandler?: (event: Event) => void;\n\n  private palNonce: PalNonceManager;\n  private palPlaybackStarted: boolean = false;\n\n  private readonly cueManager: Scte35CueManager;\n  private readonly adConfig: AdConfigManager;\n  private readonly timing: AdTimingService;\n  private readonly preloadPool: AdPreloadPool;\n  private readonly placeholder: PlaceholderLayer;\n  private readonly hlsEngine: HlsEngine;\n  private readonly adBreak: AdBreakOrchestrator;\n\n  constructor(config: StormcloudVideoPlayerConfig) {\n    initializePolyfills();\n\n    const browserOverrides = getBrowserConfigOverrides();\n\n    this.config = { ...browserOverrides, ...config };\n    this.video = config.videoElement;\n\n    logBrowserInfo(config.debugAdTiming);\n\n    this.adPlayer = this.createAdPlayer(false);\n    this.palNonce = createPalNonceManager();\n\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\n    this.adConfig = new AdConfigManager(this.config, this.video);\n\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 * 1000 : this.timing.expectedAdBreakDurationMs\n        );\n      },\n      onWatchdogTimeout: () => this.adBreak.handleAdFailure(),\n      onFailsafeTimeout: () => this.adBreak.handleAdFailure(),\n    });\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\n    this.placeholder = new PlaceholderLayer(this.video, !!this.config.debugAdTiming);\n\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\n    this.adBreak = new AdBreakOrchestrator(\n      {\n        config: this.config,\n        video: this.video,\n        getAdPlayer: () => this.adPlayer,\n        setAdPlayer: (p) => { this.adPlayer = p; },\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\n  private get debug(): boolean {\n    return !!this.config.debugAdTiming;\n  }\n\n  private createAdPlayer(continueLiveStreamDuringAds: boolean): AdController {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Creating HLS ad player\");\n    }\n    return createHlsAdPlayer(this.video, {\n      continueLiveStreamDuringAds,\n      ...(this.config.licenseKey\n        ? { licenseKey: this.config.licenseKey }\n        : {}),\n      ...(this.hlsEngine?.hls ? { mainHlsInstance: this.hlsEngine.hls } : {}),\n    });\n  }\n\n  private generateVastUrls(baseUrl: string, count: number): string[] {\n    return this.adConfig.generateVastUrlsWithCorrelators(\n      baseUrl, count, this.adPlayer, this.palNonce, this.adBreak.inAdBreak\n    );\n  }\n\n  // ───────────────────────────────────────────────────────────────\n  //  Lifecycle\n  // ───────────────────────────────────────────────────────────────\n\n  async load(): Promise<void> {\n    if (!this.attached) {\n      this.attach();\n    }\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\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()\n      .then((signals) => {\n        this.adConfig.consentSignals = signals;\n      })\n      .catch(() => {});\n\n    this.adConfig.initializeTracking();\n\n    if (this.hlsEngine.shouldUseNativeHls(() => this.getStreamType())) {\n      await this.hlsEngine.setupNativeHls();\n\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\n      this.adPlayer.destroy();\n      this.adPlayer = this.createAdPlayer(continueLiveStreamDuringAds);\n      this.adPlayer.initialize();\n      return;\n    }\n\n    this.hlsEngine.setupHls();\n  }\n\n  private async onManifestParsed(isLive: boolean): Promise<void> {\n    if (\n      !this.adConfig.isVmapEnabled() &&\n      !isLive &&\n      this.adConfig.vmapBreaks.length === 0 &&\n      this.adConfig.apiVastTagUrl\n    ) {\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\n    if (this.debug) {\n      const adBehavior = this.shouldContinueLiveStreamDuringAds()\n        ? \"live (main video continues muted during ads)\"\n        : \"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\n    this.adPlayer.destroy();\n    this.adPlayer = this.createAdPlayer(this.shouldContinueLiveStreamDuringAds());\n    this.adPlayer.initialize();\n  }\n\n  private attach(): void {\n    if (this.attached) return;\n    this.attached = true;\n    this.video.autoplay = !!this.config.autoplay;\n    this.video.muted = !!this.config.muted;\n\n    this.adPlayer.initialize();\n    this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n    this.adBreak.attachImaEventListeners();\n\n    this.video.addEventListener(\"play\", () => {\n      if (!this.palPlaybackStarted && !this.adPlayer.isAdPlaying()) {\n        this.palPlaybackStarted = true;\n        this.palNonce.sendPlaybackStart();\n      }\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\n    this.video.addEventListener(\"mousedown\", (e) => {\n      this.palNonce.sendAdTouch(e as MouseEvent);\n    });\n\n    this.video.addEventListener(\"touchstart\", (e) => {\n      this.palNonce.sendAdTouch(e as TouchEvent);\n    });\n\n    this.timeUpdateHandler = () => {\n      this.onTimeUpdate(this.video.currentTime);\n    };\n    this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n\n    this.emptiedHandler = () => {\n      if (\n        this.hlsEngine.nativeHlsMode &&\n        this.hlsEngine.videoSrcProtection &&\n        !this.adPlayer.isAdPlaying()\n      ) {\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    this.video.addEventListener(\"emptied\", this.emptiedHandler);\n  }\n\n  private shouldContinueLiveStreamDuringAds(): boolean {\n    // Continue content under ads for live streams regardless of native/hls.js\n    // playback mode. Pausing live content during ads causes replayed break\n    // filler after ads complete on CTV devices.\n    if (this.hlsEngine.isLiveStream) {\n      return true;\n    }\n\n    // Native HLS can still represent live as Infinity duration even when\n    // explicit isLiveStream is not provided.\n    const duration = this.video.duration;\n    if (!Number.isFinite(duration) || duration === Infinity) {\n      return true;\n    }\n\n    return false;\n  }\n\n  // ───────────────────────────────────────────────────────────────\n  //  SCTE-35 marker orchestration\n  // ───────────────────────────────────────────────────────────────\n\n  private onScte35Marker(marker: Scte35Marker, cueKey?: string): void {\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\n    if (marker.type === \"start\") {\n      if (this.adBreak.inAdBreak) {\n        if (marker.durationSeconds != null) {\n          const newDurationMs = marker.durationSeconds * 1000;\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\n      if (!this.adBreak.adDetectSentForCurrentBreak) {\n        this.adBreak.adDetectSentForCurrentBreak = true;\n        const detectPayload: {\n          durationSeconds?: number;\n          ptsSeconds?: number;\n          detectedAtFragmentSn?: number;\n        } = {};\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: new Date().toISOString(), ...detectPayload }).catch(() => {});\n      }\n\n      const hasPrefetchedAds = this.adBreak.pendingAdBreak && this.adBreak.pendingAdBreak.vastUrls.length > 0;\n\n      const durationMs =\n        marker.durationSeconds != null\n          ? marker.durationSeconds * 1000\n          : (this.adBreak.pendingAdBreak?.marker.durationSeconds != null\n              ? this.adBreak.pendingAdBreak.marker.durationSeconds * 1000\n              : undefined);\n\n      const isManifest = isManifestBasedMarker(marker);\n      const forceImmediate = this.config.immediateManifestAds ?? true;\n\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\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 ?? 1000;\n        const nowMs = this.video.currentTime * 1000;\n        const estCurrentPtsMs = nowMs - this.timing.ptsDriftEmaMs;\n        const deltaMs = Math.floor(marker.ptsSeconds * 1000 - estCurrentPtsMs);\n\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] PTS-based timing calculation:\", {\n            nowMs,\n            estCurrentPtsMs,\n            markerPtsMs: marker.ptsSeconds * 1000,\n            deltaMs,\n            tolerance: tol,\n          });\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 * 1000);\n      }\n      this.timing.scheduleAdStopAtBreakBoundary();\n\n      if (\n        !this.adPlayer.isAdPlaying() &&\n        this.timing.activeAdRequestToken === null &&\n        this.adBreak.adRequestQueue.length > 0 &&\n        this.timing.hasTimeToStartAnotherAd()\n      ) {\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\n      const remaining = this.timing.getRemainingAdMs();\n      const adPlaying = this.adPlayer.isAdPlaying();\n      const hasQueuedAds = this.adBreak.adRequestQueue.length > 0;\n\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\n      this.timing.scteAdBreakEndWallClockMs = Date.now();\n      this.timing.clearAdStartTimer();\n      this.timing.clearAdStopTimer();\n\n      if (adPlaying) {\n        this.adPlayer.stop().catch(() => {});\n      }\n\n      this.adBreak.handleAdPodComplete();\n      return;\n    }\n  }\n\n  private startScte35AdBreak(\n    marker: Scte35Marker,\n    cueKey: string | undefined,\n    durationMs: number | undefined\n  ): void {\n    this.adBreak.inAdBreak = true;\n    this.cueManager.activeScte35BreakKey = cueKey ?? this.cueManager.pendingScte35CueKey;\n    this.cueManager.scheduledScte35BreakKey = undefined;\n    this.timing.currentAdBreakStartWallClockMs =\n      this.timing.resolveScteBreakStartWallClockMs(marker);\n    this.timing.setAdBreakDurationBoundary(durationMs);\n\n    this.adBreak.handleAdStart(marker);\n\n    this.timing.scheduleAdStopAtBreakBoundary();\n  }\n\n  private onAdStopTimerFired(): void {\n    if (!this.adBreak.inAdBreak) return;\n\n    const adPlaying = this.adPlayer.isAdPlaying();\n    const checkIntervalMs = Math.max(\n      250,\n      Math.floor(this.config.adBreakCheckIntervalMs ?? 1000)\n    );\n    const maxExtensionMsConfig = this.config.maxAdBreakExtensionMs;\n    const maxExtensionMs =\n      typeof maxExtensionMsConfig === \"number\" && maxExtensionMsConfig > 0\n        ? maxExtensionMsConfig\n        : 0;\n\n    const endWallClockMs = this.timing.getAdBreakEndWallClockMs() ?? Date.now();\n    const overrunMs = Math.max(0, Date.now() - endWallClockMs);\n\n    const shouldExtendAdBreak = adPlaying && overrunMs < maxExtensionMs;\n\n    if (shouldExtendAdBreak) {\n      this.timing.scheduleAdStopCountdown(checkIntervalMs);\n      return;\n    }\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\n    if (adPlaying) {\n      this.adPlayer.stop().catch(() => {});\n    }\n\n    this.adBreak.handleAdPodComplete();\n  }\n\n  // ───────────────────────────────────────────────────────────────\n  //  Ad prefetch\n  // ───────────────────────────────────────────────────────────────\n\n  private startAdPrefetch(\n    marker: Scte35Marker,\n    fragmentSn?: number,\n    cueKey?: string\n  ): void {\n    if (this.adBreak.pendingAdBreak || this.adBreak.inAdBreak) return;\n\n    const scheduled = this.adConfig.findCurrentOrNextBreak(this.video.currentTime * 1000);\n    const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n\n    let baseVastUrl: string;\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\n    this.adConfig.beginNewAdPod();\n    this.adConfig.podAssignedByPrefetch = true;\n\n    const generatedUrls = this.generateVastUrls(baseVastUrl, 1);\n\n    this.adBreak.pendingAdBreak = {\n      marker,\n      ...(fragmentSn !== undefined ? { detectedAtFragmentSn: fragmentSn } : {}),\n      vastUrls: generatedUrls,\n      isFetching: false,\n      fetchStartTime: Date.now(),\n    };\n    this.cueManager.pendingScte35CueKey = cueKey;\n\n    this.adBreak.adDetectSentForCurrentBreak = true;\n    const detectPayload: {\n      durationSeconds?: number;\n      ptsSeconds?: number;\n      detectedAtFragmentSn?: number;\n    } = {};\n    if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n    if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n    if (fragmentSn !== undefined) detectPayload.detectedAtFragmentSn = fragmentSn;\n    sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: 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\n    this.preloadPool.startPreloadPool(baseVastUrl, generatedUrls.slice(0, 1), false);\n  }\n\n  // ───────────────────────────────────────────────────────────────\n  //  VMAP time-based ad breaks\n  // ───────────────────────────────────────────────────────────────\n\n  private onTimeUpdate(currentTimeSec: number): void {\n    if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n    if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n    const nowMs = currentTimeSec * 1000;\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\n  private onVideoEnded(): void {\n    if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n    if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n\n    const durationMs = Number.isFinite(this.video.duration)\n      ? Math.floor(this.video.duration * 1000)\n      : 0;\n    const postroll = this.adConfig.vmapBreaks.find(\n      (b) =>\n        b.startTimeMs === -1 &&\n        !this.adConfig.consumedVmapBreakIds.has(this.adConfig.getAdBreakKey(b))\n    );\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\n  private async handleVmapAdBreak(\n    adBreak: AdBreak,\n    nowMs: number\n  ): Promise<void> {\n    const key = this.adConfig.getAdBreakKey(adBreak);\n    if (this.adConfig.consumedVmapBreakIds.has(key)) return;\n\n    const breakStartMs = this.adConfig.resolveBreakStartMs(adBreak);\n    if (breakStartMs == null) return;\n\n    const durationMs = adBreak.durationMs ?? 0;\n    const endMs = breakStartMs + durationMs;\n    const inWindow =\n      durationMs > 0\n        ? nowMs >= breakStartMs && nowMs < endMs\n        : nowMs >= breakStartMs;\n\n    if (inWindow) {\n      this.adConfig.consumedVmapBreakIds.add(key);\n      const tags = this.adConfig.selectVastTagsForBreak(adBreak);\n      if (!tags || tags.length === 0) return;\n\n      const first = tags[0] as string;\n      const rest = tags.slice(1);\n      this.adBreak.adPodQueue = rest;\n\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\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  // ───────────────────────────────────────────────────────────────\n  //  Public API\n  // ───────────────────────────────────────────────────────────────\n\n  getCurrentAdIndex(): number {\n    return this.timing.currentAdIndex;\n  }\n\n  getTotalAdsInBreak(): number {\n    return this.timing.totalAdsInBreak;\n  }\n\n  getAdRemainingMs(): number {\n    return this.timing.getRemainingAdMs();\n  }\n\n  isAdPlaying(): boolean {\n    return this.adBreak.inAdBreak && this.adPlayer.isAdPlaying();\n  }\n\n  isShowingAds(): boolean {\n    return this.adBreak.showAds;\n  }\n\n  getStreamType(): \"hls\" | \"other\" {\n    const url = this.config.src.toLowerCase();\n    if (\n      url.includes(\".m3u8\") ||\n      url.includes(\"/hls/\") ||\n      url.includes(\"application/vnd.apple.mpegurl\")\n    ) {\n      return \"hls\";\n    }\n    return \"other\";\n  }\n\n  shouldShowNativeControls(): boolean {\n    const streamType = this.getStreamType();\n    if (streamType === \"other\") {\n      return !(this.config.showCustomControls ?? false);\n    }\n    return !!(\n      this.config.allowNativeHls && !(this.config.showCustomControls ?? false)\n    );\n  }\n\n  isLive(): boolean {\n    return this.hlsEngine.isLiveStream;\n  }\n\n  get videoElement(): HTMLVideoElement {\n    return this.video;\n  }\n\n  toggleMute(): void {\n    ctrlToggleMute(this.video, this.adPlayer, this.debug);\n  }\n\n  toggleFullscreen(): Promise<void> {\n    return ctrlToggleFullscreen(this.video, this.debug);\n  }\n\n  isMuted(): boolean {\n    return ctrlIsMuted(this.video, this.adPlayer);\n  }\n\n  setMuted(muted: boolean): void {\n    ctrlSetMuted(this.video, this.adPlayer, muted, this.debug);\n  }\n\n  setVolume(volume: number): void {\n    ctrlSetVolume(this.video, this.adPlayer, volume, this.debug);\n  }\n\n  getVolume(): number {\n    return ctrlGetVolume(this.video, this.adPlayer);\n  }\n\n  isFullscreen(): boolean {\n    return ctrlIsFullscreen();\n  }\n\n  resize(): void {\n    ctrlResizePlayer(this.video, this.adPlayer, this.debug);\n  }\n\n  // ───────────────────────────────────────────────────────────────\n  //  Destroy\n  // ───────────────────────────────────────────────────────────────\n\n  destroy(): void {\n    this.adBreak.stopContinuousFetching();\n    this.preloadPool.stop();\n    this.timing.destroy();\n    this.adBreak.clearPendingAdBreak();\n    this.placeholder.destroy();\n\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\n    this.adConfig.destroyTracking();\n    this.hlsEngine.destroy();\n    this.adPlayer?.destroy();\n\n    if (this.palPlaybackStarted) {\n      this.palPlaybackStarted = false;\n      this.palNonce.sendPlaybackEnd();\n    }\n    this.palNonce.reset();\n\n    this.adBreak.adRequestQueue = [];\n    this.timing.consecutiveFailures = 0;\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 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","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","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"]}