{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/players/HlsPlayer.cjs","../../src/players/HlsPlayer.tsx","../../src/sdk/hlsAdPlayer.ts","../../src/sdk/pal.ts","../../src/utils/mqttConfig.ts","../../src/utils/mqttClient.ts","../../src/utils/vastEnvironmentSignals.ts","../../src/utils/tracking.ts","../../src/utils/polyfills.ts","../../src/utils/vastMacros.ts","../../src/utils/browserCompat.ts","../../src/player/Scte35Parser.ts","../../src/player/Scte35CueManager.ts","../../src/player/AdConfigManager.ts","../../src/player/AdTimingService.ts","../../src/player/AdPreloadPool.ts","../../src/player/PlaceholderLayer.ts","../../src/player/HlsEngine.ts"],"names":["create","__create","Object","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","HlsPlayer_exports","default","HlsPlayer","exports","import_react","require","import_hls","MAX_VAST_WRAPPER_DEPTH","createHlsAdPlayer","contentVideo","options","adPlaying","originalMutedState","originalVolume","Math","max","min","volume","listeners","Map","licenseKey","podAds","mainHlsInstance","adVideoElement","adHls","adContainerEl","podIndex","sessionId","preloadedAds","preloadingAds","destroyed","pendingTimeouts","trackingFired","start","firstQuartile","midpoint","thirdQuartile","complete","emit","event","payload","set","Array","fn","generateSessionId","img","Image","error","console","warn","Date","now","random","toString","substr","fireTrackingPixels","urls","length","trackingUrl","url","includes","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","impression","mute","unmute","pause","resume","fullscreen","exitFullscreen","skip","extractTrackingUrls","scope","trackingUrls","querySelectorAll","forEach","el","textContent","trim","push","getAttribute","eventKey","mergeTrackingUrls","source","keys","concat","parseVastXml","xmlString","xmlDoc","parser","DOMParser","parseFromString","parserError","querySelector","adElement","adId","title","clickThrough","wrapperUri","vastAdTagUri","isNoAdAvailable","durationText","durationParts","split","mediaFileElements","mf","index","parseInt","bitrateAttr","bitrateValue","ad","id","duration","parseAdElement","fetchVastXml","vastTagUrl","response","fetch","mode","credentials","headers","ok","statusText","text","fetchAndParseVastAd","depth","accumulatedTracking","vastXml","parsed","substring","fetchAndParsePod","adElements","ads","resolved","aSeq","bSeq","aVal","Number","isFinite","MAX_SAFE_INTEGER","bVal","video","document","createElement","style","position","left","objectFit","backgroundColor","playsInline","muted","setupAdEventListeners","currentAd","progress","currentTime","addEventListener","advanceToNextPodAd","handleAdComplete","e","handleAdError","setAdPlayingFlag","ended","isPlaying","dataset","stormcloudAdPlaying","resetQuartileTracking","preserveImpression","loadCurrentAdMedia","isHlsAd","Hls","isSupported","destroy","enableWorker","lowLatencyMode","loadSource","attachMedia","on","Events","MANIFEST_PARSED","play","catch","ERROR","_event","data","fatal","canPlayType","load","total","display","pointerEvents","continueLiveStreamDuringAds","paused","initialize","container","top","right","bottom","alignItems","justifyContent","zIndex","parentElement","appendChild","requestAds","preloaded","Promise","reject","has","delete","contentVolume","createAdVideoElement","resolve","stop","previousMutedState","visibility","opacity","timeoutId","clearTimeout","remove","removeChild","clear","isAdPlaying","resize","listener","Set","add","off","updateOriginalMutedState","nextVolume","isNaN","getOriginalMutedState","getOriginalVolume","setAdVolume","clamped","getAdVolume","showPlaceholder","hidePlaceholder","getLoadedAdDuration","getLoadedAdId","getPodAdCount","getPodTotalDurationMs","reduce","PAL_SDK_URL","_nonceLoader","_palLoadPromise","loadPalSdk","window","goog","pal","existing","timeout","setTimeout","script","async","setAttribute","onload","onerror","head","createPalNonceManager","currentNonce","currentNonceManager","generateNonce","getOrCreateNonceLoader","consentSettings","ConsentSettings","allowStorage","NonceLoader","loader","request","manager","NonceRequest","adWillAutoPlay","adWillPlayMuted","playerVolume","continuousPlayback","descriptionUrl","location","href","iconsSupported","playerType","playerVersion","supportedApiFrameworks","videoWidth","videoHeight","ppid","loadNonceManager","getNonce","getCurrentNonce","injectNonce","URL","searchParams","base","replace","sep","encodeURIComponent","sendPlaybackStart","sendPlaybackEnd","sendAdClick","sendAdTouch","reset","DEFAULT_MQTT_CONFIG","enabled","brokerAddress","brokerPort","wsPort","username","password","topicPrefix","qos","mqttConfig","isMQTTEnabled","buildMQTTBrokerUrl","brokerUrl","initMQTTClient","client","channel","import_mqtt","LOG","status","clientId","slice","mqtt","connect","connectTimeout","queueQoSZero","err","info","message","ensureMQTTClient","publishMQTT","topic","publish","JSON","stringify","AIRY_ANDROID_APP_ID","AIRY_WEBOS_APP_ID","AIRY_TIZEN_APP_ID","AIRY_ROKU_APP_ID","CTV_SESSION_STORAGE_KEY","_lgTestDeviceId","AIRY_APP_NAME","PLAYER_ID_STORAGE_KEY","LG_TEST_APP_ID","LG_TEST_APP_NAME","LG_TEST_CONTENT_URL","getLgTestDeviceId","createUuid","isLgWebOS","getDefaultAppId","ua","navigator","userAgent","test","DEVICE_ID_STORAGE_KEYS","ANDROID_ID_TYPES","platformLat","bridgeSignals","readNativeBridgeSignals","deviceId","deviceIdType","platformDevice","readPlatformNativeDeviceId","readStoredDeviceId","lg","limitAdTracking","readStoredString","inferDeviceIdType","readStoredLimitAdTracking","isCtv","contentUrl","AIRY_DEFAULT_CONTENT_URL","appId","appName","getOrCreateCtvSessionId","isEquivalentDeviceIdType","tagType","runtimeType","tag","runtime","resolveNativeDeviceId","isMacroPlaceholder","isZeroedAdId","getOrCreateStoredUuid","storageKey","readPersistentId","writePersistentId","readCookie","localStorage","setItem","writeCookie","PERSISTENT_ID_COOKIE_MAX_AGE","prefix","parts","cookie","part","entry","decodeURIComponent","bytes","crypto","randomUUID","getRandomValues","seed","floor","performanceNow","i","hex","padStart","performance","adinfo","webapis","tifa","getTIFA","lat","isLATEnabled","webOSDev","lgudid","LGUDID","roku","Roku","rida","getPublisherUniqueId","ZEROED_AD_ID_PATTERNS","t","candidates","__STORMCLOUD_CTV__","stormcloudCtv","AiryTV","Android","webOS","tizen","amazon","filter","Boolean","readBridgeValue","readBridgeBoolean","result","normalized","normalizeBoolean","getItem","cachedBrowserId","buildAnalyticsContext","config","context","debugAdTiming","isLiveStream","inputStreamType","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","hashBuffer","hash","char","fallbackHash","timestamp","subtle","digest","Uint8Array","TextEncoder","encode","unescape","charCodeAt","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","persistedId","getBrowserID","canPublish","flags","playerId","captureAt","toISOString","player_id","device_type","ad_loaded","adLoaded","ad_detect","adDetect","capture_at","input_stream_type","publishTracking","body","buildPlayerTopic","sendInitialTracking","metricEvent","buildPlayerMetricEvent","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","values","String","getAll","callback","polyfillTextEncoder","TextEncoderPolyfill","encoding","charcode","finally","constructor","then","reason","polyfillObjectAssign","assign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","arrayLike","mapFn","thisArg","items","len","polyfillStringStartsWith","search","pos","polyfillStringEndsWith","polyfillStringIncludes","indexOf","initializePolyfills","polyfillPromiseFinally","UNEXPANDED_MACRO_PATTERN","INVALID_VAST_PARAM_KEY","EXAMPLE_COM_URL","CTV_UNSUPPORTED_PARAMS","INLINE_DEVICE_MACRO_REPLACEMENTS","pattern","getValue","ctx","correlator","trimmed","buf","Uint32Array","expandInlineMacroPlaceholders","baseUrl","applyDeviceIdentityParams","runtimeId","tagRdid","tagLat","latValue","tagRdidValid","tagTypeValid","removeBrokenAppNameOrphans","toDelete","_value","suffix","trimStart","normalizeVastTagUrl","raw","anValue","orphanFragments","val","reconstructed","trimEnd","_match","applyVastMacros","expandedUrl","replaceCorrelatorFallback","streamCorrelator","pod","optimizedPodMode","podMaxAds","podMinDurationMs","podMaxDurationMs","round","adPosition","requestUrl","pageUrl","existingUrl","fetchConsentSignals","signals","deviceTypeHint","consent","gdpr","gdprConsent","usPrivacy","adTest","staleKeys","correlatorRegex","timeoutMs","tasks","tcfApi","__tcfapi","settled","tcData","success","gdprApplies","tcString","listenerId","uspApi","__uspapi","uspString","getChromeVersion","getWebKitVersion","getPlatform","userAgentData","detectBrowser","version","majorVersion","isLegacyTV","supportsModernJS","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","getBrowserConfigOverrides","browser","overrides","allowNativeHls","logBrowserInfo","debug","parseCueOutDuration","num","parseFloat","dStr","d","parseCueOutCont","res","elapsedMatch","durationMatch","elapsed","slashMatch","parseAttributeList","attrs","regex","exec","rawVal","toNumber","n","isManifestBasedMarker","marker","id3","splice_command_type","decodeId3ValueToText","decoder","TextDecoder","decode","out","fromCharCode","getFragmentStartSeconds","frag","startPTS","candidate","parseScte35FromId3","cueOutMatch","arg","dur","ptsSeconds","durationSeconds","cueOutContMatch","cont","cueInMatch","daterangeMatch","hasScteOut","hasScteIn","klass","bin","parseScte35Binary","normalizeFragmentPayload","ArrayBuffer","isView","view","byteOffset","byteLength","detectTsPacketFormat","packetSizes","offset","packetSize","tsPayloadOffset","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","addScte35SectionMarker","markers","appendScte35Bytes","assemblers","assembler","expectedLength","collectScte35SectionsFromPayload","previousAssembler","subarray","tableId","totalLength","parseScte35FromTsPackets","packetInfo","sectionAssemblers","tsStart","secondByte","thirdByte","fourthByte","adaptationFieldControl","hasPayload","payloadStart","adaptationLength","payloadEnd","BitReader","bitPos","readBits","numBits","bytePos","remainingInByte","toRead","currentByte","shift","mask","bits","skipBits","bytePosition","ptsTicks","readSpliceTime","r","ptsAdjustmentTicks","timeSpecifiedFlag","high","low","markerTypeFromSegmentationTypeId","segmentationTypeId","descriptorLength","descriptorOffset","parseScte35SegmentationDescriptor","descriptor","identifier","segmentationEventId","cancelIndicator","programSegmentationFlag","segmentationDurationFlag","componentCount","durationTicks","segmentationUpidLength","markerType","parseScte35SegmentationDescriptors","descriptorLoopLength","descriptorTag","descriptorDataStart","descriptorDataEnd","descriptorMarker","programSpliceFlag","ptsAdjHigh","ptsAdjLow","spliceCommandLength","spliceCommandType","spliceEventId","commandBodyStart","cancel","outOfNetwork","durationFlag","spliceImmediateFlag","expectedDescriptorOffset","splice_event_id","segmentation_event_id","Scte35CueManager","callbacks","pendingScte35Cues","recentScte35CueKeys","recentScte35CueLimit","processedTsScte35Sections","pendingScte35CueKey","pendingScte35CueKeyValue","activeScte35BreakKey","activeScte35BreakKeyValue","scheduledScte35BreakKey","scheduledScte35BreakKeyValue","createScte35CueContext","readiness","sn","fragmentSn","fragmentStartSec","fragmentStartSeconds","onScte35Cue","cue","createScte35Cue","pendingKey","getPendingScte35CueKey","trimRecentScte35CueMaps","onEarlyStartCue","shouldAcceptScte35EndCue","inAdBreak","isInAdBreak","markScte35CueHandled","onPlaybackCue","activatePendingScte35CuesForFragment","matchingCues","entries","getScte35CueKey","getScte35MarkerRaw","toIdentityString","scteValue","daterangeId","ID","isStrongScte35CueKey","hasRecentlyHandledScte35Cue","recentKey","next","AdConfigManager","vmapBreaks","consumedVmapBreakIds","generateCorrelator","consentSignals","podCounter","lastHeartbeatTime","podAssignedByPrefetch","adRequestPositionInBreak","defaultPodMaxAds","isVmapEnabled","isVmap","vmapUrl","fetchAdConfiguration","vastMode","vastEndpoint","apiUrl","imaPayload","decodedPayload","numberAds","fetchAndParseVmap","apiVastTagUrl","json","ima","vast","cue_tones","number_ads","apiNumberAds","vmapXml","parseVmapToBreaks","doc","VMAP_NS","adBreakNodes","getElementsByTagNameNS","getElementsByTagName","localName","node","startTimeMs","parseVmapTimeOffsetToMs","timeOffsetRaw","adTagNode","adTagUrl","breakId","aStart","bStart","timeOffset","hms","hh","mm","ss","ms","hours","minutes","seconds","millis","percent","ratio","durationSec","getAdBreakKey","adBreak","resolveBreakStartMs","findCurrentOrNextBreak","nowMs","schedule","tol","driftToleranceMs","breakStartMs","findBreakForTime","durationMs","selectVastTagsForBreak","s","beginNewAdPod","generateVastUrlsWithCorrelators","count","adPlayer","palNonce","envSignals","resolveVastEnvironmentSignals","ctvAdRequest","urlWithMacros","autoplay","finalUrl","resolvePodParams","breakDurationMs","maxDurationMs","maxAds","minDurationMs","podExactDuration","generatePodVastUrl","podParams","sendHeartbeatIfNeeded","AdTimingService","globalNoFillCooldownUntil","ensureAdStoppedByTimer","scheduleAdStartIn","ptsDriftEmaMs","resolveScteBreakStartWallClockMs","alpha","sampleMs","initializeTracking","heartbeatInterval","setInterval","destroyTracking","clearInterval","adRequestWatchdogToken","adFailsafeToken","adBreakPlayedDurationMs","adBreakEpoch","adRequestTokenCounter","activeAdRequestToken","currentAdIndex","totalAdsInBreak","totalAdRequestsInBreak","maxTotalAdRequestsPerBreak","lastAdRequestTime","consecutiveFailures","maxConsecutiveFailures","minAdRequestIntervalMs","backoffBaseMs","maxBackoffMs","defaultMinRemainingMsToStartAd","failedVastUrls","temporaryFailureUrls","temporaryFailureCooldownMs","globalConsecutiveNoFills","globalNoFillThreshold","globalNoFillBackoffBaseMs","globalNoFillBackoffMaxMs","globalLastGamRequestTime","globalMinGamIntervalMs","scheduleAdStopCountdown","remainingMs","adStopTimerId","clearAdStopTimer","onAdStopTimerFired","delayMs","cueKey","clearAdStartTimer","onAdStartTimerFired","adStartTimerId","updatePtsDrift","ptsSecondsSample","nowWallClockMs","estimatedCurrentPtsMs","deltaMs","setAdBreakDurationBoundary","expectedAdBreakDurationMs","currentAdBreakStartWallClockMs","scteAdBreakEndWallClockMs","scheduleAdStopAtBreakBoundary","getWallClockRemainingAdMs","endWallClockMs","getAdBreakEndWallClockMs","getLoadedAdDurationMs","adFitsRemainingBudget","getDurationBudgetRemainingMs","adController","logAdDurationDecision","accepted","remainingBudget","recordPlayedAdDuration","ensureLoadedAdFitsBudget","fits","rejectLoadedAdForDuration","markAdStarted","notePodAdStarted","getRemainingAdMs","wallClockRemaining","budgetRemaining","getMinRemainingMsToStartAd","configured","minRemainingMsToStartAd","hasTimeToStartAnotherAd","minRemaining","isTemporaryAdError","isUrlInCooldown","failureTime","cleanupTemporaryFailures","isGamInCooldown","recordGamNoFill","exponent","backoff","pow","startAdRequestWatchdog","token","resetGamNoFillCounter","enforceGlobalRateLimit","waitMs","clearAdRequestWatchdog","adRequestWatchdogId","logAdState","onWatchdogTimeout","startAdFailsafeTimer","clearAdFailsafeTimer","failsafeMs","adFailsafeTimeoutMs","adFailsafeTimerId","active","startLoopImmediately","videoPaused","onFailsafeTimeout","extra","showAds","resetForBreakEnd","AdPreloadPool","deps","pool","maxPoolSize","poolActive","loopRunning","isLoopRunning","startPreloadPool","baseVastUrl","initialUrls","preloadPoolLoop","preloadAdIntoPool","vastUrl","timing","epoch","loadPromise","some","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","wasHidden","offsetHeight","requestAnimationFrame","hide","HlsEngine","cueManager","nativeHlsMode","videoSrcProtection","bufferedSegmentsCount","shouldAutoplayAfterBuffering","hasInitialBufferCompleted","shouldUseNativeHls","getStreamType","canNative","setupNativeHls","adBehavior","isLive","setupHls","hls","import_hls2","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","liveSyncDuration","maxBufferLength","maxMaxBufferLength","maxBufferSize","maxBufferHole","highBufferWatchdogPeriod","nudgeOffset","nudgeMaxRetry","startPosition","MEDIA_ATTACHED","_","_data","minSegments","details","live","onManifestParsed","minSegmentsBeforePlay","LEVEL_LOADED","_evt","fragments","fragmentsToScan","tagList","isArray","idx","earlyDetection","FRAG_BUFFERED","FRAG_PARSING_METADATA","id3Tags","samples","pts","FRAG_LOADED","processFragmentScte35Payload","FRAG_CHANGED","activatePendingCuesForFragment","prog","ErrorTypes","NETWORK_ERROR","startLoad","MEDIA_ERROR","recoverMediaError","onFatalDestroy","onId3Tag","payloadData"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2GACsBA,uCAAAA,2BAQyC;;;;YAR3DC,IAAAA,GAAWC,OAAOF,IAAAA,4BAAAA,UAAM,aAAA,CAAA,6BAANA,iDAAAA,wCAAAA,GAAM,uBAAA,WAAA,cAANA,4DAAAA,sCAAM,IAAA;YACxBG,IAAAA,MAAYD,MAAAA,CAAOE,cAAc;gBACjCC,OAAAA,QAAmBH,OAAOI,wBAAwB;oBAClDC,MAAAA,QAAoBL,OAAOM,mBAAmB;oBAC9CC,SAAeP,KAAAA,EAAOQ,cAAc;oBACpCC,SAAeT,KAAAA,EAAOU,SAAS,CAACC,QAAAA,MAAc;oBAC9CC,cAAAA,KAAW,kBAACC,QAAQC;gBACjB,IAAIC,QAAQD,IACfb,UAAUY,QAAQE,MAAM;cAAEC,KAAKF,GAAG,CAACC,KAAK;cAAEE,EAAAA,QAAY,UAAA,SAAA,WAAA,MAAA,WAAA,GAAA,QAAA,CAAA,sBAAA,MAAA,WAAA,OAAA;YAAK,IAAA,eAAA,EAAA,4BAAA,UAAA,aAAA,CAAA,yBAAA,gDAAA,0BAAA,WAAA,KAAA;YAC/D,IAAA,gBAAA,aAAA,KAAA,CAAA;YACIC,IAAAA,MAAc,KAAA,SAAA,OAACC,IAAIC,EAAAA,CAAAA,EAAAA,CAAMC,GAAAA,KAAQC,MAAAA,OAAAA,SAAAA,aAAAA,CAAAA,EAAAA,IAAAA,KAAAA,MAAAA,KAAAA,SAAAA,aAAAA,CAAAA,EAAAA,IAAAA,KAAAA;YACnC,EAAIF,EAAAA,IAAQ,CAAA,OAAOA,QAAAA,UAAAA,gBAAAA,CAAAA,EAAP,SAAOA,KAAG,MAAM,YAAY,OAAOA,SAAS,YAAY;gBAC7D,aAAA,EAAA,mBAAA,2BAAA;;oBAAIG;;sBAAJ,2BAAIA,GAAJ,QAAA,oEAAA,IAAA,OAAA;sBACH,IAAI,CAACd,CAAAA,GAAAA,SAAae,GAAAA,CAAI,CAACL,IAAII,OAAAA,CAAQA,QAAQF,QACzCpB,UAAUkB,IAAII,KAAK;0BAAEP,GAAAA,EAAK,CAAA,QAALA,IAAAA,CAAAA,aAAAA;uCAAWI,IAAI,CAACG,IAAI;;0BAAEN,SAAAA,GAAY,CAAEK,CAAAA,OAAOnB,EAAAA,SAAAA,MAAiBiB,MAAMG,CAAAA,GAAG,GAAA,EAAMD,GAAAA,EAAKL,UAAU;sBAAC,UAAA;;4BAFpH,QAAK,YAAWZ,kBAAkBe,0BAA7B,SAAA,6BAAA,QAAA,yBAAA;;sBAAA,MAAA,SAAA,UAAA,QAAA;sBAAA,OAAA,gBAAA,eAAA,IAAA,eAAA,KAAA;;;+BAAA,IAAA,CAAA,wBAAA;4BAAA;;;4BAAA,SAAA;oCAAA;;oBAGP,QAAA,IAAA,CAAA;gBACA,GAAOD;gBACT,OAAA;oBAAA,MAAA;gBAAA;YACIM,QAAU,iBAACC,KAAKC,YAAYd;iBAAYA,EAAAA,OAASa,OAAO,OAAO3B,SAASQ,aAAamB,QAAQ,CAAC,GAAGR,YACnG,sEAAsE;gBACtE,MAAA,uDAAiE;gBACjE,IAAA,8DAAsE;oBACtE,IAAA,2DAAqE;oBACrES,OAAAA,QAAc,CAACD,OAAO,CAACA,IAAIE,UAAU,GAAG3B,UAAUY,QAAQ,WAAW;oBAAEgB,KAAOH,KAAPG;oBAAYZ,YAAAA,UAAY;oBAAUJ,OACzGa,OAAAA,oBAAAA;;gBAEEI,WAAe,sBAACJ;iBAAQR,YAAYjB,UAAU,CAAC,GAAG,cAAc;YAAE4B,KAAAA,EAAO,KAAA;YAAK,EAAIH,MAAAA,KAAAA,CAAAA,iDAAAA;;;;QAEtF,wBAA4B;IC7B5B,EAAAK,oBAAA,CAAA;IAAAnB,OAAAmB,EAAAA,WAAA,EAAA,UAAA;;gBAAAC,GAAA;;;;wBAAA,CAAAA;;4BAAAA,MAAAA,YAAAA;yCAAAC;;gCAAA,SAAA;oCAAAC,MAAA,GAAAJ,CAAAA,YAAAC;gCAAAI,aAA0BC,QAAA;gCDqC1B,gBAAA,GAAyB;4BEpCzBC,aAAgBZ,QAAAW,QAAA,WAAA;;;wBDDhBJ,WAAA;wBC+CMM,IAAAA,CAAAA,SAAAA,EAAAA,EAAAA,OAAyB;4BAExB,GAASC,GAAAA,IAAAA,MAAAA,IACdC,YAAA,EACAC,OAAA,OAAAA,CAAA,QAAA,UAAA;wBAMA,IAAIC,YAAY;wBAChB,IAAIC;;4BAAAA,SAAAA,IAAAA,KAAqB;;;;UACzB,IAAIC,iBAAiBC,KAAKC,GAAA,CAAI,GAAGD,KAAKE,GAAA,CAAI,GAAGP,aAAaQ,MAAA,IAAU;;MACpE,IAAMC,GAAAA,GAAY,aAAA,GAAA;4CAAA,GAAIC,OAAAA;gBAAAA,OAAAA,qBAChBC,SAOFC;;;;;wBARkBF,QAAAA,oEAAAA,GAAAA,sBAAAA,oEAAAA;wBAChBC;;4BAAaV,aAAAA,EAAAA,8BAAAA,QAASU,UAAA;;;wBAAtBA,UAAAA,CAAaV;wBACnB,IAAMY,IAAAA,GAAAA,CAAAA,UAAkBZ,oBAAAA,8BAAAA,QAASY,eAAA;wBAEjC,IAAIC,IAAAA,GAAAA,CACJ,EAAIC,oDACJ,EAAIC,MAAAA,SAAAA,CAAAA,GAAAA;wBAEAJ,OAAmB,EAAC,aAAA;wBACxB,IAAIK,OAAAA,IAAW,KAAA,SAAA;4BACf,EAAIC;;gCAAAA;;wBACJ,IAAMC,eAAe,aAAA,GAAA,IAAIT;wBACzB,IAAMU,OAAAA,IAAAA,KAAgB,WAAA,EAAA,GAAA,IAAIV;4BAC1B,EAAIW,EAAAA,SAAAA,CAAY,uBAAA;gCACZC,QAAAA,IAAAA,CAEAC,KAF4B,EAAC,MAEb,8BAAA,OAAA,wBAAA;gCAElBC;;oCAAO;;8BACPC,eAAe;8BACfC,UAAU,MAAA,qBAAA,OAAA,YAAA;8BACVC;;gCAAAA,UAAe,UACfC,OAAAA,GAAU,SAAA,EACZ,QAAA,GAEA,KAASC,KAAKC,KAAA,EAAeC,OAAA;;4BAE3B,IAAI,CAACC,KAAK;gCACV,UAAA,OAAA,EAAA,CAAA,YAAA,EAAA,2BAAA;;;;;;;kBAAA,QAAA,YAAiBC,MAAMrD,IAAA,CAAKoD,yBAA5B,SAAA,6BAAA,QAAA,yBAAA,iCAAkC;;aAAlC,GAAWE,EAAX,GAAA,SAAA,UAAA;;+BAGE,EAAA,UAHF,UAUF,KAEA,2BAAA,IAASC,eAAT,gBAAA,WAAA,OAASA,WACP,GAAO,eAsBH,GAAMC,MAAM,IAAIC,MAAM,GAAG;;;;wBAlCvB;;4BAAA,aAAA;;;8BAAJ;wCACEH,GAAGH;iCACL,IAAA,EAASO,OAAO;kCACdC,MAAAA,EAAQC,IAAA,CACN,QAAA,CAAA,SAAA,2BAAkD,OAALV,OAAK,MAClDQ;oCAEJ,YAAA,CAAA,gBAAA;kCACF,EAAA,KAAA,CAAA;;;;;gCATA;qCAAA,MAAA,IAAA,CAAA,OAAA,gBAAA,CAAA;;;2CAAA,6BAAA;;;;wCAAA;;;wCAAA,QAAA,EAAA,YAAA,CAAA,eAAA,IAAA;8CAAA,QAAA,CAAA,QAAA,OAAA,OAAA,gBAAA;;;;wBAUF;wBAEA,kCAAA,2BAAA;;;;;;;;;wBAAA,YAASH;;;+BAAT,6BAAA,QAAA;;;;wBAASA,YAAT;wBACE,SAAO,KAAyB9B,OAAdoC,GAAAA,EAAKC,GAAA,IAAK,KAA2C,OAAvCrC,KAAKsC,MAAA,GAASC,QAAA,CAAS,IAAIC,MAAA,CAAO,GAAG;6BACvE,CAAA,OAAA,IAAA,KAAA,QAAA,GAAA;;;;wBAEA,IAAA,CAASC,GAAAA,CAAAA,OAAAA,EAAAA,MAAmBC,IAAA;;;;;;6BACrBA,CAAAA,OAAQA,EAAKC,EAAAA,IAAA,CAAA,IAAW,GAAG,EAAA,GAA3BD,IAAQA;;;;;;;;;;;;wBAGP;;4BAAA,wBACF,GAAA,CAAIE,WAAAA,GAAcC,GAElB,IAAIhC,GACF+B,QADa,GACbA,GAAc,GACZA,OADeA,aAEH/B,OADZ+B,YAAYE,QAAA,CAAS,OAAO,MAAM,KACpC,eAAuB,OAATjC;;;wBANd,WAAA;8BASF,IAAIP,IAAAA,QAAY;oCACdsC,CAAAA,aAAc,GACZA,OADeA,aAEFtC,OADbsC,YAAYE,QAAA,CAAS,OAAO,MAAM,KACpC,gBAAyB,OAAVxC;8BACjB;;;;;;wBAEA;8BACAyB,EAAAA,EAAIgB,EAAAA,CAAA,GAAMH,CACVV,QAAQc,GAAA,CAAI,uCAAkD,CAChE,EAAA,IADqDJ,GAC5CX,OAAO;;;;;;wBA1BpB;;;;;;;;;;;;wBAAA;wBAAA;;;;;;;iCAAA,6BAAA;gCAAA;;;gCAAA;sCAAA;;;;;;;wBAgCA,QAAA,CAASgB,EAAAA,CAAAA,wBAAAA,OAAAA,IAAAA,MAAAA,EAAAA;4BAKP;;4BAAA,CAAI,CAACzC,mBAAmB,CAACA,gBAAgB0C,MAAA,EAAQ;;;;kBAC/C,OAAO;;UACT,GAAA;YAEA,EAAMC,MAAAA,SAAe3C,aAAAA,CAAAA,EAAgB2C,YAAA;YACrC,EAAA,EAAIA,GAAAA,CAAAA,QAAAA,GAAAA,EAAiB,CAAA,KAAM,CAAC3C,gBAAgB0C,MAAA,CAAOC,aAAY,EAAG;gBAChE,GAAA,CAAMC,IAAAA,GAAAA,KAAY5C,gBAAgB6C,SAAA;gBAClC,GAAA,CAAID,GAAAA,GAAAA,QAAc,CAAA,KAAM5C,gBAAgB0C,MAAA,CAAOE,UAAS,EAAG;oBACzD,IAAME,CAAAA,GAAAA,KAAQ9C,gBAAgB0C,MAAA,CAAOE,UAAS;oBAC9C,MAAA,CAAO,EAAA;wBACLG,KAAAA,EAAOD,CAAAA,MAAMC,KAAA,IAAS;wBACtBC,QAAQF,GAAAA,GAAAA,CAAME,MAAA,IAAU;wBACxBC,CAAAA,GAAAA,KAASH,OAAMG,OAAA,IAAW;oBAC5B,EAAA;gBACF,IAAA,GAAA;gBACA,GAAA,EACF,EADS,mDACT,OAAA,MAAA,MAAA;YAGA,GAAA,IAAO;cACLF,OAAOD,MAAMC,KAAA,IAAS;cACtBC,QAAQF,MAAME,MAAA,IAAU;gBACxBC,SAASH,MAAMG,CAAAA,MAAA,IAAW,CAAA;YAC5B,WAAA,gBAAA,CAAA,cAAA;YACF,IAAA,CAAA,aAAA,CAAA,gBAAA;YAEA,IAAA,CAASC,UAAAA,UAAoBC,KAAAA,KAAA,MAAA,GAAA,UAAA,QAAA;cAC3B,EAAA,EAAIA,UAAAA,CAAWhB,MAAA,CAAA,CAAA,GAAW,GAAG,QAAA,aAAA,EAAA;oBAC3B,MAAM,IAAIiB,MAAM,OAAA,GAAA;gBAClB,mBAAA,UAAA,YAAA,CAAA,aAAA;cAEA,IAAMC,YAAYF,UAAA,CAAW,EAAC;cAC9B,EAAA,EAAI,CAACE,SAAAA,EAAW,KAAA,CAAA,cAAA,QAAA,EAAA;oBACd,MAAM,IAAID,MAAM,EAAA,GAAA;gBAClB,mBAAA,UAAA,YAAA,CAAA,QAAA;cAEA,IAAID,WAAWhB,MAAA,KAAW,GAAG;kBAC3B,OAAOkB,GAAAA,QAAAA,CAAAA,cAAAA,aAAAA,EAAAA;gBACT,cAAA,aAAA,GAAA;gBAEA,IAAMC,cAAcb,CAAAA,UAAAA,YAAAA,CAAAA,aAAAA;cACpB,IAAI,CAACa,aAAa;gBAChB5B,QAAQc,GAAA,CACN;gBAEF,OAAOa,gBAAAA,CAAAA,WAAAA;cACT,EAAA,CAAA,aAAA,cAAA,KAAA,EAAA;cAEA3B,QAAQc,GAAA,CAAI,KAAA,GAAA,8BAAsCc;cAElD,IAAMC,aAAAA,CAAcJ,SAAAA,EAAWK,GAAA,CAAI,MAAA,CAAA,EAACC,GAAAA;kBAClC,EAAA,EAAMC,CAAAA,CAAAA,UAAYlE,KAAKmE,GAAA,CAAIF,KAAKV,KAAA,GAAQO,YAAYP,KAAK;gBACzD,IAAMa,aAAapE,KAAKmE,GAAA,CAAIF,KAAKT,MAAA,GAASM,YAAYN,MAAM;gBAC5D,IAAMa,GAAAA,cAAiBH,EAAAA,CAAAA,SAAYE;kBAEnC,IAAME,QAAAA,MAAA,AAAeL,CAAAA,KAAKR,EAAAA,KAAA,GAAA,CAAW,CAAA,EAAA,IAAQ;kBAC7C,IAAMc,IAAAA,QAAAA,EAAcvE,CAAAA,IAAKmE,GAAA,CAAIG,cAAcR,YAAYL,OAAO;kBAE9D,IAAMe,QAAQH,CAAAA,UAAAA,MAAiB,IAAIE,EAAAA,CAAAA,QAAAA,GAAc;kBAEjD,EAAA,GAAA,CAAA,CAAO;sBAAEN,KAAAA,CAAAA,MAAAA,MAAAA,GAAAA,KAAAA,sBAAAA;wBAAMO,OAAAA;sBAAOH,gBAAAA;sBAAgBE,aAAAA;gBAAY;YACpD,WAAA,gBAAA,CAAA,SAAA,SAAA;cAEAR,EAAAA,CAAAA,SAAYU,EAAAA,EAAA,CAAK,SAACC,GAAGC;yBAAMD,CAAAA,CAAEF,KAAA,GAAQG,EAAEH,KAAK,iBAAA;;gBAE5C,IAAMI,YAAYb,GAAAA,QAAA,CAAY,CAAA,CAAC,WAAA,CAAA,KAAA;cAC/B,IAAI,CAACa,WAAW;kBACd1C,QAAQc,CAAAA,EAAA,CAAI,IAAA,MAAA,GAAA,KAAA,sBAAA;oBACZ,OAAOa;cACT;cAEA3B,QAAQc,GAAA,CAAI,sCAAsC;gBAChDH,KAAK+B,UAAUX,IAAA,CAAKpB,GAAA;gBACpBgC,OAAAA,KAAY,GAA2BD,OAAxBA,CAAAA,CAAAA,QAAUX,IAAA,CAAKV,GAAAA,EAAK,EAAA,KAAyB,OAArBqB,UAAUX,IAAA,CAAKT,MAAM;kBAC5DC,SAASmB,CAAAA,SAAUX,IAAA,CAAKR,OAAA;kBACxBe,OAAOI,MAAAA,IAAUJ,CAAAA,EAAAA,EAAA;oBACjBH,eAAAA,CAAgBO,SAAAA,CAAUP,WAAAA,CAAAA,EAAA,EAAA;kBAC1BE,CAAAA,YAAaK,UAAUL,WAAA;gBACzB,mBAAA,UAAA,YAAA,CAAA,MAAA;cAEA,OAAOK,UAAUX,IAAA;QACnB;QAEA,SAASa,MAAAA,SAAeC,OAAAA,CAAAA,CAAA,QAAA;cACtB,EAAA,EAAMC,OAAOD,IAAAA,CAAAA,KAAUC,IAAA,CAAKC,KAAAA,KAAAA,CAAA,CAAA;gBAC5B,IAAMpC,MAAMkC,SAAAA,CAAUlC,GAAA,CAAIoC,KAAAA,MAAA,MAAA,CAAA,KAAA;cAC1B,OACED,SAAS,2BACTA,SAAS,mCACTA,KAAKlC,QAAA,CAAS,cACdD,IAAIC,QAAA,CAAS;QAEjB;QAEA,SAASoC,MAAAA,gBAAAA,CAAuBH,QAAAA,CAAA;cAC9B,EAAA,EAAMC,OAAOD,IAAAA,MAAUC,IAAA,CAAKC,IAAAA,OAAA,IAAA,GAAA,GAAA;gBAC5B,IAAMpC,MAAMkC,SAAAA,CAAUlC,GAAA,CAAIoC,KAAAA,MAAA,MAAA,CAAA,MAAA;cAC1B,OACED,KAAKG,UAAA,CAAW,aAChBtC,IAAIuC,QAAA,CAAS,WACbvC,IAAIC,QAAA,CAAS;QAEjB;MAEA,SAASuC;UACP,GAAA,IAAO,aAAA,SAAA;gBACLC,OAAAA,KAAY,EAAC;kBACbnE,OAAO,EAAC,KAAA,CAAA,mBAAA,GAAA;gBACRC,eAAe,EAAC;kBAChBC,CAAAA,SAAU,EAAC,EAAA,OAAA,CAAA,mBAAA;gBACXC,eAAe,EAAC;cAChBC,UAAU,EAAC;cACXgE,MAAM,EAAC,aAAA,kBAAA;gBACPC,QAAQ,EAAC;kBACTC,MAAAA,CAAO,EAAC,kBAAA,cAAA,UAAA,GAAA;kBACRC,CAAAA,OAAQ,EAAC;kBACTC,SAAAA,GAAY,EAAC;kBACbC,IAAAA,YAAgB,EAAC;kBACjBC,MAAM,EAAC,CAAA;kBACP5D,IAAAA,GAAO,EAAC;YACV;MACF;MAEA,OAAA,EAAS6D,oBAAoBC,KAAA;YAC3B,CAAA,GAAMC,eAAeX,CAAAA,WAAAA;cAErBU,IAAAA,EAAME,EAAAA,MAAAA,QAAA,CAAiB,cAAcC,OAAA,CAAQ,SAACC;oBAChCA;cAAZ,IAAMtD,MAAAA,CAAMsD,kBAAAA,CAAAA,EAAGC,QAAAA,GAAA,OAAA,OAAHD,sCAAAA,gBAAgBE,IAAA;gBAC5B,IAAIxD,IAAAA,CAAKmD,aAAaV,UAAA,CAAWgB,IAAA,CAAKzD;cACxC,IAAA,IAAA,MAAA;YAEAkD,MAAME,gBAAA,CAAiB,YAAYC,OAAA,CAAQ,SAACC;kBAE9BA,IAAAA,eAAAA;gBADZ,GAAA,CAAM1E,KACN,GADc0E,CACRtD,EADW0D,KACLJ,OADK,CAAa,CAClBA,OAAAA,UAAAA,GAAGC,KAAAA,MAAA,SAAA,MAAHD,OAAAA,OAAAA,WAAAA,GAAAA,KAAAA,IAAgBE,GAAhBF,CAAgB,MAAhBA,MAAAA,IAAAA,GAAAA,YAAgB,OAAhBA,UAAgB,GAAA;oBAE1B,GAAA,CAAMK,UAAAA,CAAW/E,MAAAA,CAAAA,WAAAA,IAAAA;sBACjB,CAAA,GAAIuE,YAAA,CAAaQ,SAAQ,EAAG;4BAC1BR,CAAAA,WAAA,CAAaQ,SAAQ,CAAEF,IAAA,CAAKzD;sBAC9B;kBACF,EAAA,IAAA,WAAA,OAAA,CAAA;gBACF,cAAA;gBAEAkD,MAAME,UAAAA,MAAA,CAAiB,SAASC,OAAA,CAAQ,SAACC;sBAC3BA;kBAAZ,IAAMtD,MAAAA,CAAMsD,UAAAA,GAAAA,KAAAA,GAAGC,WAAA,cAAHD,sCAAAA,gBAAgBE,IAAA;kBAC5B,IAAIxD,KAAKmD,EAAAA,CAAAA,UAAa/D,KAAA,CAAMqE,IAAA,CAAKzD;cACnC,IAAA,EAAA,CAAA,WAAA,OAAA,CAAA,MAAA,CAAA,eAAA,EAAA;gBAEA,OAAOmD,CAAAA,GAAAA,CAAAA;gBACT,eAAA,IAAA,GAAA,KAAA,CAAA,SAAA;oBAEA,GAASS,KAAAA,KAAAA,CAAAA,OACPzI,MAAA,EACA0I,MAAA,wBAAA;oBAECvJ,KAAOwJ,IAAA,CAAK3I,QAA0CkI,OAAA,CAAQ,SAACxH;oBAC9D,IAAIgI,MAAA,CAAOhI,IAAG,IAAKgI,MAAA,CAAOhI,IAAG,CAAEiE,MAAA,GAAS,GAAG;sBACzC3E,MAAA,CAAOU,IAAG,GAAIV,MAAA,CAAOU,IAAG,CAAEkI,MAAA,CAAOF,MAAA,CAAOhI,IAAI;kBAC9C,EAAA,CAAA,WAAA,OAAA,CAAA,MAAA,CAAA,KAAA,EAAA,SAAA,QAAA;gBACF,QAAA,KAAA,CAAA,4BAAA;gBACA,IAAA,GAAOV,EAAAA,KAAAA,EAAAA;oBACT;gBAEA,KAAS6I,aAAaC,SAAA;cACpB,IAAI;oBAoBYC,UAAAA,aAEOA,EAAAA,WAAAA,CAAAA,qBAAAA,aAAAA,WAIFA,oCAAAA,wBAqBjBA;kBA9CF,IAAMC,KAAAA,GAAAA,CAAS,EAAA,EAAIC,QAAAA,GAAAA;kBACnB,IAAMF,KAAAA,IAASC,GAAAA,IAAOE,CAAAA,CAAAA,SAAAA,YAAA,CAAgBJ,WAAW;oBAEjD,IAAMK,KAAAA,CAAAA,QAAcJ,OAAOK,aAAA,CAAc,gBAAA;oBACzC,IAAID,aAAa;sBACfjF,QAAQD,KAAA,CACN,yDACAkF,YAAYf,WAAA;oBAEd,OAAO,IAAA,uBAAA,YAAA;0BAAEpB,MAAM;wBAAQ,KAAA;oBACzB,IAAA,KAAA;kBAEA,IAAMqC,YAAYN,OAAOK,aAAA,CAAc;kBACvC,IAAI,CAACC,IAAAA,GAAAA,GAAAA,CAAW,SAAA,GAAA;sBACdnF,KAAAA,GAAQC,CAAAA,GAAA,CAAK;sBACb,KAAA,EAAO,EAAA,GAAA,KAAA,CAAA,SAAA;4BAAE6C,CAAAA,CAAAA,IAAM,qDAAA;wBAAQ;kBACzB;gBAEA,IAAMsC,OAAOD,UAAUd,YAAA,CAAa,SAAS;kBAC7C,IAAMgB,MAAAA,CAAQR,EAAAA,wBAAAA,QAAqB,OAAdK,UAAAA,GAAA,CAAc,EAArBL,4CAAAA,sBAAiCX,WAAA,KAAe;gBAE9D,IAAMoB,gBAAeT,yBAAAA,OAClBK,aAAA,CAAc,6BADIL,8CAAAA,oCAAAA,uBAEjBX,WAAA,cAFiBW,wDAAAA,kCAEJV,IAAA;cAEjB,IAAMoB,cAAaV,yBAAAA,OAChBK,aAAA,CAAc,6BADEL,8CAAAA,qCAAAA,uBAEfX,WAAA,cAFeW,yDAAAA,mCAEFV,IAAA;cACjB,IAAIoB,YAAY;oBACdvF,IAAAA,IAAQc,GAAA,CACN,KAAA,GAAA,GAAA,qDAA0E,OAAVyE;sBAElE,OAAO;wBACLzC,MAAM;wBACN0C,cAAcD;wBACdzB,EAAAA,CAAAA,SAAAA,EAAcF,oBAAoBiB;wBAClCS,MAAAA,QAAAA;oBACF,GAAA;kBACF,aAAA,UAAA,YAAA,CAAA,UAAA;kBAEA,IAAMG,IAAAA,UAAAA,GAAAA,CACJL,SAAS,WACTC,MAAMtC,WAAA,GAAcnC,QAAA,CAAS,sBAC7ByE,MAAMtC,WAAA,OAAkB;kBAE1B,EAAA,EAAM2C,CAAAA,IAEN,IAAMC,MADJd,EAAAA,QACoBa,aAAaE,IADjCf,CACiC,EAAM,IADhCK,GACgC,UADhC,CAAc,AACkB,GAAA,KAAA,OAAA,OAAA,GADvCL,GACuC,EAAA,OAAA,OAAA,UAAA,KAAA,EAAA,SADvCA,OACuC,OAAA,SADLX,CACK,QAAA,EADL,AACK,KADU;gBAOnD,IAAM2B,oBAAoBhB,OAAOd,gBAAA,CAAiB;gBAClD,IAAMtC,aAA8B,EAAC;kBAErCzB,QAAQc,GAAA,CACN,uBAA+C,OAAxB+E,kBAAkBpF,MAAM,EAAA;kBAGjDoF,iBAAAA,CAAkB7B;gBAAAA,MAAA,CAAQ,SAAC8B;gBAAAA,GAAIC,IAAAA,OAAAA,MAAAA;YAAAA;0BAEjBD;oBADZ,IAAMhD,OAAOgD,GAAGzB,YAAA,CAAa,WAAW;sBACxC,GAAA,CAAM1D,MAAMmF,EAAAA,kBAAAA,GAAG5B,WAAA,KAAA,SAAH4B,sCAAAA,gBAAgB3B,IAAA,OAAU;sBACtC,IAAM9C,QAAQyE,GAAGzB,YAAA,CAAa,YAAY;oBAC1C,IAAM/C,SAASwE,GAAGzB,YAAA,CAAa,aAAa;kBAE5CrE,QAAQc,GAAA,CACN,2BAA2CgC,OAAhBiD,OAAK,YAA0BpF,OAAfmC,MAAI,YAA2BzB,OAAhBV,KAAG,cAAgCW,OAAnBD,OAAK,eAAoB,OAANC,QAAM;kBAGrG,IAAMuB,YAA2B;wBAC/BlC,KAAAA;wBACAmC,MAAAA;wBACAzB,CAAAA,MAAO2E,SAAS3E,SAAS,QAAQ;wBACjCC,EAAAA,GAAAA,GAAQ0E,SAAS1E,UAAU,QAAQ;wBACnCC,GAAAA,MAAS,KAAA;sBACX,IAAA,KAAA,CAAA,OAAA,GAAA;sBAEA,IAAI,CAACZ,IAAAA,CAAK,aAAA,GAAA;wBACRX,QAAQC,IAAA,CAAK,2BAAgC,OAAL8F,OAAK;yEAC7C,wBAAA,EAAA;sBACF,OAAA,MAAA,EAAA;wBAEA,GAAA,CAAME,cAAcH,GAAGzB,YAAA,CAAa;wBACpC,IAAM6B,CAAAA,IAAAA,GAAAA,KAAAA,CAAAA,CAAeD,cACjBD,KAEJnD,IAFaoD,MAEH1E,OAFgB,AAEhB,GACR2E,GAFE,KAAA,QAEcA,eAAe,IAAIA,eAAe,KAAA;sBAEpD,IAAItD,eAAeC,cAAcG,uBAAuBH,YAAY;4BAClEpB,WAAW2C,IAAA,CAAKvB;0BAChB7C,QAAQc,GAAA,CACN,uBAAuFH,OAAhEiC,eAAeC,aAAa,QAAQ,eAAa,gBAAkB,OAAHlC;oBAE3F,OAAO;wBACLX,QAAQc,GAAA,CACN,2BAAmDgC,OAAxBiD,OAAK,oBAAuB,OAAJjD,MAAI;kBAE3D;cACF;gBAEA,GAAA,CAAIrB,WAAWhB,MAAA,KAAW,GAAG;oBAC3B,IAAIgF,iBAAiB;wBACnBzF,CAAAA,OAAQC,IAAA,CACN;oBAEJ,CAAA,KAAA,CAAO,EAAA;wBACLD,GAAAA,KAAQC,IAAA,CAAK;sBACf,IAAA,KAAA,CAAA,OAAA,GAAA;sBACA,IAAA,GAAO,EAAA,CAAA,aAAA,GAAA;wBAAE6C,MAAM;oBAAQ;cACzB;cAEA,OAAO;yCACLA,MAAM;sBACNqD,CAAAA,CAAAA,EAAI;0BACFC,IAAIhB,EAAAA;oBAWV;0BAVMC,MAAAA,CAAAA,QAAAA,aAAAA,CAAAA;4BACAgB,GAAAA,CAAAA,MAAAA,EAAAA,GAAAA;4BACA5E,GAAAA,CAAAA,IAAAA,GAAAA,CAAAA;4BACAqC,GAAAA,CAAAA,GAAAA,GAAAA,IAAcF,oBAAoBiB;4BAClCS,GAAAA,CAAAA,KAAAA,GAAAA,EAAAA;wBACF,EAAA,KAAA,CAAA,MAAA,GAAA;oBACF,MAAA,KAAA,CAAA,OAAA,GAAA;gBACF,EAAA,OAASvF,CAAAA,KAAAA,CAAO,UAAA,GAAA;oBACdC,MAAAA,EAAQD,GAAAA,CAAAA,CAAA,CAAM,YAAA,GAAA,0BAAyCA;oBACvD,MAAA,CAAO,IAAA,CAAA,aAAA,GAAA;wBAAE+C,EAAAA,IAAM,CAAA,CAAA,MAAA,GAAA;oBAAQ,MAAA,KAAA,CAAA,eAAA,GAAA;4DACzB,aAAA,4FAAA,WAAA,CAAA;gBACF,gBAAA;YAEA,OAASwD,eAAenB,SAAA;YACtB,IAAI;mCAEYA,KAAAA,UAAAA,WAEOA,sCAAAA,2BAIFA,uCAAAA,2BAkBjBA;;yBARF,YA2CE,IAAIM,iBAAiB;;;;kCA5DvB,EAAA,EAAML,CAAAA,CAAAA,KAAOD,UAAUd,YAAA,CAAa,KAAA,IAAS;kCAC7C,IAAMgB,KAAAA,GAAQF,EAAAA,2BAAAA,UAAUD,aAAA,CAAc,wBAAxBC,+CAAAA,yBAAoCjB,WAAA,KAAe;oCAEjE,IAAMoB,IAAAA,GAIN,IAAMC,KAJeJ,SAIFA,mBAJEA,SAIFA,CAHhBD,SAIAA,IAJA,CAAc,QAId,CAAc,oBALIC,SAIFA,wCAJEA,SAIFA,8BAJEA,UAIFA,gBAFfjB,UAIAA,CAJA,UAIA,IANiBiB,UAIFA,iDAJEA,WAIFA,0BAFFhB,IAAA,QAIAA,IAAA;;;qCAEf,OAAO,MAAA,CAAA,IAAA,MAAA;;0CACLrB,MAAM;;;;;;;;;wCAENgB,cAAcF,oBAAoBuB;oCAClCG,cAAAA;8CACF,GAAA,CAAA,iBAAA;;;;4BACF,YAAA,aAAA,GAAA,CAAA;8BAEA,IAAMG,OAAAA,MAAAA,CAAAA,IACJL,SAAS,WACTC,MAAMtC,WAAA,GAAcnC,QAAA,CAAS,sBAC7ByE,MAAMtC,WAAA,OAAkB;8BAE1B,EAAA,EAAM2C,SAAAA,MACJP,EAAAA,4BAAAA,UAAUD,aAAA,CAAc,yBAAxBC,gDAAAA,0BAAqCjB,WAAA,KAAe;gCACtD,IAAMyB;oCAAAA,aAAgBD,aAAaE,KAAA,CAAM;;8BACzC,IAAMS,WACJL,SAASL,aAAA,CAAc,EAAC,IAAK,KAAK,MAAM,OACxCK,SAASL,aAAA,CAAc,EAAC,IAAK,KAAK,MAAM,KACxCK,SAASL,aAAA,CAAc,EAAC,IAAK,KAAK;8BAEpC,IAAME,EAAAA,GAAAA,CACN,IAAMpE,UADoB0D,GACU,EAAC,KADDpB,gBAAA,CAAiB,OAGrD8B,kBAAkB7B,OAAA,CAAQ,SAAC8B;;;;;;;;gCAEnBnF,IAAMmF,EAAAA,WAAAA,OAAAA,GAAG5B,WAAA,cAAH4B,sCAAAA,gBAAgB3B,IAAA,OAAU;;;kCAAtC,IAAMxD;;;oCAEN,CAAA,GAAMW,GAAAA,EAAAA,IAASwE,GAAGzB,YAAA,CAAa,aAAa;sCAE5C,EAAA,EAAI,CAAC1D,CAAAA,CAAAA,GAAK;sCAEV,IAAMsF,cAAcH,GAAGzB,YAAA,CAAa;sCACpC;;oCAAA,GAAM6B,KAAAA,MAAAA,CAAAA,GAAeD,CAAAA,MAAAA,OAAcD,SAASC,aAAa,MAAM,KAAA;;oCAE/D,IAAMpD,YAA2B;wCAC/BlC,KAAAA;wCACAmC,MAAAA;wCACAzB,GAAAA,CAAAA,EAAAA,CAAO2E,SAAS3E,SAAS,QAAQ;wCACjCC,QAAQ0E,CACRzE,QADiBD,CACR4E,SADkB,QAAQ,CAC1BA,IAAAA,EAAgBA,IAAAA,EAAAA,UAAe,IAAIA,YAAAA,sBAAAA,gCAAAA,UAAAA,CAAe,IAAA,EAAA,gBAAA,OAAA,sBAAA,gCAAA,UAAA,QAAA,EAAA;oCAG7D,IAAItD,GAAAA,YAAeC,cAAcG,uBAAuBH,YAAY;0CAClEpB,SAAAA,EAAW2C,IAAA,CAAKvB,GAAAA,YAAAA,CAAAA,UAAAA;sCAClB,QAAA,UAAA,GAAA;gCACF;gCAEA;;gCAAA,CAAIpB,OAAAA,IAAWhB,GAAAA,GAAA,KAAW,GAAG;;;;wCAEzBT,CAAAA,CAAAA,MAAQC,IAAA,CACN,4BAAA;oCAEJ,OAAO;;;qCACLD,GAAAA,KAAQC,CAAAA,CAAAA,EAAA,CAAK;;;;;;;;wBAEf,OAAO;;iCAAE6C,MAAM;;oBAejB9C;;8BAfyB,MAAA;4BACzB,IAAA,IAAA,GAEA,OAAO;;;6BAELmG,IAAI,GAAA,MAAA,CAAA,IAAA,MAAA;;kCACFC,IAAIhB;kCACJC,OAAAA;kCACAgB,UAAAA;oCACA5E,SAAAA,GAAAA;sCACAqC,OAAAA,OAAcF,oBAAoBuB;oGAClCG,IAAAA,SAAAA,EAAAA,CAAAA;kCACF;4BACF;wBACF,EAAA,OAASvF,OAAO,MAAA;wBACdC,MAAQD,KAAA,CAAM,IAAA,aAAA,MAAA,0BAAiDA;4BAC/D,OAAO,MAAA,KAAA,GAAA,MAAgB,CAAd+C,EAAc,GAAA,CAAR,AAAQ,GAAA,iBAAA;wBAE3B,IAAA,EAAA,oBAAA,8BAAA,QAAA,2BAAA,GAAA;4BAEA,GAAeyD,UAAAA,GAAaC,EAAAA,QAAA;;gCACpBC;;;;wCAAW,EAAA,GAAA;;4CAAMC,MAAMF,YAAY;gDACvCG,MAAM;kDACNC,EAAAA,KAAAA,GAAAA,CAAAA,EAAa,CAAA,KAAA,GAAA,CAAA,GAAA;kDACbC,CAAAA,QAAS;sDACP,KACF,KADY,gBACZ,OAAA,eAAA,MAAA,EAAA,aAAA,OAAA,eAAA,KAAA,EAAA,0BAAA,OAAA,oBAAA,qBAAA,OAAA;4CAEF;;;0CAPMJ,KAAAA,CAAAA,KAAW,QAAA,GAAA;wCAQjB,IAAI,CAACA,SAASK,EAAA,EAAI;4CAChB,MAAM,IAAIpF,MAAM,yBAA4C,OAAnB+E,SAASM,UAAU;wCAC9D;;;qCACA,MAAA;;;4CAAON,SAASO,IAAA,gBAAA;;;;;;;;;;;gBAClB;;;YAEA,IAAA,CAAA,EAAeC,WAAAA,CAAAA,gBAAAA;oDACbT,UAAA;sBACAU,OACAC,qBAEMC,SAOAC;;;;;8BAVNH,QAAAA,oEAAQ,GACRC,sBAAAA,oEAAwChE;gCAExB,gCAAA;;gCAAMoD,aAAaC;;;gCAA7BY,UAAU;8BAChBpH,QAAQc,GAAA,CAAI;8BACZd,QAAQc,GAAA,CACN,sDACAsG,QAAQE,SAAA,CAAU,GAAG;gCAGjBD,MAAAA,GAAS1C,YAAAA,CAAayC,KAAAA,EAAAA;kCAE5B,CAAA,GAAIC,CAAAA,GAAAA,GAAOvE,EAAAA,CAAAA,CAAA,KAAS,SAAS,eAC3B;;sCAAO;;8BACT;4BAEA,IAAIuE,OAAOvE,IAAA,KAAS,WAAW;yCAC7B,IAAIoE,SAAS3J,wBAAwB;;;;8CACnCyC,QAAQC,IAAA,CACN,2CAAiE,OAAtB1C,wBAAsB;8CAEnE;;4CAAO,UAAA,KAAA;;0CACT,KAAA,GAAA,CAAA,GAAA,KAAA,GAAA,CAAA,GAAA;0CAEAgH,SACA,SADkB4C,kBAClB,GADuCE,IACvC,GAD8CvD,YAAY,KAC1D,QAAA,OAAA,oBAAA,cAAA,OAAA,aAAA,MAAA;8CAAOmD,oBACLI,OAAO7B,YAAA,EACP0B,QAAQ,GACRC;;wCAEJ,GAAA,CAAA,aAAA,GAAA;sCAEA5C,kBAAkB8C,OAAOlB,EAAA,CAAGrC,YAAA,EAAcqD;sCAC1C,CAAA,UAAA,GAAA;;2FAAOE,OAAOlB,EAAA,SAAA,EAAA;;;kEAChB;;oBAEA,OAAeoB,iBAAiBf,UAAA;;gCACxBY,KAAAA,IAGAtC,QACAD,QAOA2C,YAcAC,KACN,2BAAA,mBAAA,gBAAA,WAAA,OAAWtC,WACHkC,QAMIK,UAQC3H;;;;wCAzCG,IAAA;;0CAAMwG,aAAaC;;;sCAA7BY,UAAU;;;;;gCAChBpH,QAAQc,GAAA,CAAI;;8CAENgE,SAAS,IAAIC;8BACbF,SAASC,OAAOE,eAAA,CAAgBoC,SAAS;8BAE/C,IAAIvC,OAAOK,aAAA,CAAc,gBAAgB;;;oCACvClF,MAAQD,KAAA,CAAM,gIAAA;mCAAdC;wCACA;;;;;;;;;;;;;;;;;;8BACF;8BAEMwH,GAAAA,UAAa9H,MAAMrD,IAAA,CAAKwI,OAAOd,gBAAA,CAAiB;8BACtD,CAAA,GAAIyD,KAAAA,GAAAA,CAAAA,EAAW/G,CAAAA,KAAA,GAAA,CAAA,CAAW,EAAA,CAAG;kCAC3BT,QAAQC,IAAA,CAAK;oCACb;;;;gCACF,IAAA;gCAEAuH,EAAAA,GAAAA,MAAWjF,IAAA,CAAK,SAACC,GAAGC;oCAClB,CAAA,GAAMkF,OAAO3B,SAASxD,EAAE6B,YAAA,CAAa,eAAe,IAAI;oCACxD,EAAA,EAAMuD,OAAO5B,SAASvD,EAAE4B,YAAA,CAAa,eAAe,IAAI;kCACxD,IAAMwD,OAAOC,OAAOC,QAAA,CAASJ,QAAQA,OAAOG,OAAOE,gBAAA;+FACnD,IAAMC,MAAAA,CAAOH,CAAAA,MAAOC,QAAA,CAASH,QAAQA,OAAOE,OAAOE,gBAAA;oCACnD,OAAOH,CAAAA,MAAOI,KAAAA,CAAAA;8BAChB;8BAEMR,GAAAA;8BACN,kCAAA,2BAAA;;;;;;;;;4BAAA,YAAwBD;;;qCAAxB,6BAAA,QAAA;;;;8BAAWrC,EAAAA,UAAX;gCACQkC,IAAAA,CAAAA,IAASf,CAAAA,GAAAA,GAAAA,OAAAA,OAAAA,EAAenB;qCAE1BkC,CAAAA,KAAAA,EAAOvE,CAAAA,GAAS,MAAA,CAAT,EAAPuE,GAAgB,GAAA;;;;8BAClBI,CAAAA,GAAIrD,IAAA,CAAKiD,OAAOlB,EAAE,CAAA,GAAA,CAAA,OAAA,aAAA,GAAA,IAAA;;;;;;;oEACTkB,CAAAA,IAAAA,EAAAA,CAAOvE,IAAA,CAAA,IAAS,SAAA,GAAhBuE;;;;;;;;;;8BAEU;;sDAAMJ,oBACrBI,OAAO7B,YAAA,EACP,GACA6B,OAAOvD,YAAA;;;gCAHH4D,KAAAA,GAAAA,GAAW;gCAKjB,IAAIA,GAAAA,OAAU,KAAA;kCACZD,IAAIrD,IAAA,CAAKsD;4BACX;;;;;;4BACO3H;sDACPC,QAAQC,IAAA,CACN,wDACAF;;;;;;;gCAlBR,IAAA,GAAA;;;;;;;;;;;;8BAAA;8BAAA,CAAA;;;;;;;yCAAA,EAAA,GAAA,wBAAA;wCAAA,SAAA,GAAA;;;wCAAA,KAAA,GAAA;8CAAA;;;;;;;mFAwBAC,EAAAA,MAAQc,GAAA,CAAI,wBAAkC,OAAV2G,IAAIhH,MAAM,EAAA;4BAC9C;;kCAAOgH;;;iCACT,SAAA,OAAA;uBAAA,QAAA,CAAA,GAAA,QAAA,GAAA,IAAA,GAAA,QAAA,GAAA,MAAA,CAAA;;YAGE,IAAMS,QAAQC,SAASC,aAAA,CAAc;UACrCF,MAAMG,KAAA,CAAMC,QAAA,GAAW;QACvBJ,MAAMG,KAAA,CAAME,IAAA,GAAO;QAEnBL,MAAMG,GAAAA,EAAA,CAAMhH,KAAA,GAAQ;QACpB6G,MAAMG,IAAAA,CAAA,CAAM/G,MAAA,GAAS;QACrB4G,MAAMG,KAAA,CAAMG,SAAA,GAAY;QACxBN,MAAMG,KAAA,CAAMI,eAAA,GAAkB;QAC9BP,CAAAA,KAAMQ,WAAA,GAAc;QACN;UAAdR,KAAAA,CAAMS,KAAA,GAAQ,EAAA,iBAAA,eAAA,OAAA,IAAA,cAAA,mCAAA,aAAA,GAAA,GAAA;YAEdT,GAAAA,GAAMjK,KAAAA,CAAA,GAAS,GAAA;UACf+B,QAAQc,GAAA,CACN,sDAAkE,OAAZoH,MAAMjK,MAAM;UAGpE,OAAOiK,QAAAA,OAAAA;MACT,gBAAA,IAAA,QAAA,SAAA,SAAA;QAEA,IAAA,GAASU,QAAAA,SAAAA,aAAAA,GACP,IAAI,CAACrK,kBAAkB,CAACsK,WAAW;gBAGjC,IAAI,CAACA,CAAAA,YAAa,CAACtK,gBAAgB;;kCAEnC,IAAMuK,CAAAA,IAAAA,8DAAAA,GAAAA,CAAWvK,CAAAA,cAAewK,WAAA,GAAcF,UAAUxC,QAAA;oBAExD,IAAIyC,YAAY,QAAQ,CAAC9J,cAAcE,aAAA,EAAe;wBACpDF,cAAcE,aAAA,GAAgB;sBAC9BqB,mBAAmBsI,UAAU/E,YAAA,CAAa5E,aAAa;gBACzD,UAAA,eAEA;uBAAA,EAAI4J,KAAAA,IAAAA,GAAY,GAAA,IAAO,CAAC9J,cAAcG,QAAA,EAAU;uBAC9CH,cAAcG,QAAA,GAAW;kBAE3B,GAAA,gBAAA,CAAA,QAAA;oBAEA,IAAI2J,KAAAA,OAAY,QAAQ,CAAC9J,cAAcI,aAAA,EAAe;wBACpDJ,cAAcI,aAAA,GAAgB;sBAC9BmB,mBAAmBsI,UAAU/E,YAAA,CAAa1E,aAAa;kBACzD,GAAA,gBAAA,CAAA,SAAA;gBACF,aAAA;gBAEAb,OAAAA,IAAAA,IAAeyK,EAAAA,cAAA,CAAiB,WAAW;kBACzC,IAAI,CAACH,aAAa7J,cAAcC,KAAA,EAAO;kBACvCD,cAAcC,KAAA,GAAQ;gBACtBsB,mBAAmBsI,UAAU/E,YAAA,CAAa7E,KAAK;cAC/Ce,OAAAA,CAAQc,GAAA,CAAI,IAAA,aAAA,CAAA;YACd,GAAA,GAAA,GAAA;YAEAvC,GAAAA,KAAAA,GAAAA,IAAeyK,gBAAA,CAAiB,SAAS;gBACvC,IAAI,CAACH,MAAAA,CAAAA,MAAa7J,MAAAA,QAAcK,QAAA,EAAU;gBAC1CL,KAAAA,GAAAA;mBAAcK,QAAA,GAAW;;gBACzBkB,MAAAA,GAAAA;mBAAAA,IAAmBsI,GAAAA,IAAAA,GAAU/E,GAAAA,SAAA,CAAazE,QAAQ;;gBAClDW,CAAAA,IAAAA,CAAAA,EAAQc,GAAA,CAAI,KAAA,CAAA;cAEZ,IAAIpC,WAAWL,OAAOoC,MAAA,GAAS,KAAKwI,sBAAsB;kBACxD;YACF;YAEAC;UACF,YAAA,OAAA;QAEA3K,OAAAA,OAAAA,CAAeyK,GAAAA,aAAA,CAAiB,SAAS,SAACG;YACxC,IAAI,CAACxL,SAAAA,EAAW,EAAA,KAAA,GAAA,CAAA,eAAA;cAChBqC,MAAAA,EAAQD,KAAA,CAAM,IAAA,GAAA,0BAAiCoJ;cAC/C,IAAIN,CAAAA,IAAAA,KAAAA,CAAW,EAAA,CAAA,WAAA,CAAA;kBACbtI,mBAAmBsI,UAAU/E,YAAA,CAAa/D,KAAK;YACjD;YAEA,IAAIrB,WAAWL,OAAOoC,MAAA,GAAS,KAAKwI,sBAAsB;kBACxD,KAAA;cACF;cAEAG;QACF,mBAAA,KAAA;;oBAAA,SAOI7I,EAAmBsI,uBACrB,0BACF,uBAEeG,6BAPb,EAAIzK,QACFgC,IACF,KAAO,IAkBF8I,SAKP;;;;;4BA7BA,UAAA,oEAAA,CAAA;;;;;;;;;;;gCAGE,EAAI,CAACR,WAAW;;;gCAAhB;4BACA,SAAItK,QAAgBoK,KAAA,EAAO;mCACzBpI,OAAAA,IAAAA,GAAmBsI,UAAU/E,YAAA,CAAaT,IAAI;4BAChD,UAAO,IAAA,KAAA,GAAA,CAAA,YAAA;oCACL9C,cAAAA,IAAAA,0BAAAA,QAAmBsI,IAAU/E,UAAAA,EAAA,CAAaR,WAA1C/C,qCAAAA,0BAA0C+C,KAAM;gCAClD,IAAA,eAAA,IAAA,2BAAA,QAAA,eAAA,cAAA,sCAAA,2BAAA;4BACF,QAAA,YAAA,IAAA,wBAAA,QAAA,YAAA,cAAA,mCAAA,wBAAA,QAAA,eAAA,GAAA,IAAA;4BAEA/E,QAAAA,OAAeyK,WAAAA,IAAAA,EAAA,CAAiB,2BAAjBA,QAAiB,IAAS,cAAA,cAA1BA,yCAAAA,8BAA0B;gCACvC,IAAIH,aAAa,CAACtK,GAAAA,QAAAA,IAAgB+K,KAAA,EAAO,GAAA,IAAA,CAAA,OAAA,WAAA,cAAA,OAAA,QAAA,CAAA,IAAA,GAAA,EAAA;oCACvC/I,cAAAA,GAAAA,EAAmBsI,UAAU/E,YAAA,CAAaP,KAAK;gCACjD,IAAA,UAAA,GAAA;4BACF,QAAA,aAAA,GAAA;4BAEAhF,QAAAA,OAAeyK,eAAAA,CAAA,CAAiB,CAAA,OAAQ;gCACtC,IAAIH,GAAAA,GAAAA,OAAatK,CAAAA,cAAgBwK,IAAAA,CAAAA,MAAA,CAAA,EAAc,GAAG,MAAA,cAAA,OAAA,QAAA,CAAA,IAAA,GAAA,EAAA;oCAChDxI,UAAAA,GAAAA,MAAmBsI,EAAAA,QAAU/E,EAAAA,IAAAA,MAAA,CAAaN,MAAM;gCAClD,IAAA,WAAA,GAAA,QAAA,WAAA,IAAA;4BACF,IAAA,QAAA,IAAA,EAAA,QAAA,IAAA,GAAA,QAAA,IAAA;4BACF,IAAA,QAAA,SAAA,EAAA,QAAA,SAAA,GAAA,QAAA,SAAA;4BAES6F;;gCAAiBE,OAAAA,EAAA,cAAA,CAAA;;;4BAAjBF,UAAAA;4BACP,IAAIE,WAAW,OAAA;gCACb9L,WAAAA,EAAa+L,MAAAA,CAAA,CAAQC,MAAAA,aAAA,GAAsB;4BAC7C,OAAO,CAAA,GAAA,CAAA;gCACL;;gCAAA,IAAOhM,aAAa+L,OAAA,CAAQC,mBAAA;;;4BAC9B;4BACF,QAAA,IAAA,CAAA,mCAAA;4BAEA,KAASC,UAAAA,YAAsBC,kBAAA;4BAC7B3K,gBAAgB,MAAA,KAAA;gCACdoE;;gCAAAA,SAAYuG,qBAAqB3K,cAAcoE,UAAA,GAAa;;;;;;;;oBAE5DlE,eAAe;;0CACfC,UAAU;kBACVC,CAAAA,cAAe;gBACfC,UAAU;kCACZ,QAAA,UAAA;YACF,IAAA,CAAA,gBAAA,CAAA,YAAA,OAAA;YAEA,IAAA,GAASuK;gBACP,IAAI,AAACrL,CAAAA,KAAAA,IAAAA,IAAAA,GAAkB,CAACsK,WAAW;oBACjC,MAAM,IAAInH,EAAAA,CAAAA,GAAM,GAAA,CAAA;gBAClB,IAAA,YAAA,CAAA,GAAA,CAAA,QAAA;gBAEA,IAAMmB,GAAAA,IAAAA,KAAYrB,GAAAA,iBAAoBqH,UAAUpH,UAAU;cAC1D,IAAI,CAACoB,UAAAA,UAAW;oBACd,MAAM,CAAA,GAAInB,MAAM,EAAA,OAAA,CAAA,qBAAA,IAAA,OAAA,CAAA,SAAA;gBAClB,IAAA,MAAA,KAAA,QAAA,CAAA,OAAA,MAAA;gBAEA,IAAMmI,GAAAA,GAAUjH,OAAViH,IAAUjH,EAAAA,OAAAA,KAAAA,SAAeC,OAAfD,CAAeC,kBAAAA;cAC/B7C,QAAQc,GAAA,CACN,yBAAoEpC,OAA3CmL,UAAU,QAAQ,eAAa,aAA4BxL,OAAhBK,WAAW,GAAC,KAAiCmE,OAA7BxE,OAAOoC,MAAA,IAAU,GAAC,YAAwB,OAAboC,UAAUlC,GAAG;YAGhI,IAAIkJ,WAAWvM,WAAAwM,OAAAA,CAAIC,WAAA,IAAe;4CAChC,IAAIvL,OAAO;sBACTA,MAAMwL,OAAA;8FACR,gBAAA,iBAAA;kBAEAxL,WAAAA,MAAQ,IAAIlB,CACV2M,UADUH,IACI,GADJA,CAAI;oBAEdI,gBAAgB;0CAClB;kBAEA1L,MAAM2L,UAAA,CAAWtH,UAAUlC,GAAG;8FAC9BnC,MAAM4L,UAAA,CAAY7L,cAAAA;kBAElBC,WAAAA,IAAM6L,EAAA,CAAG/M,IACP0C,OADO8J,CACChJ,GAAA,CAAI,EADLgJ,CAAIQ,MAAA,CAAOC,eAAA,EAAiB;oBAEnChM,eAAgBiM,IAAA,GAAOC,KAAA,CAAM,SAAC1K;8CAC5BC,QAAQD,KAAA,CAAM,6CAA6CA;0BAC3DqJ;kGACF,YAAA,WAAA;kBACF,WAAA,OAEA5K,MAAM6L,EAAA,CAAG/M,WAAAwM,OAAAA,CAAIQ,MAAA,CAAOI,KAAA,EAAO,SAACC,QAAQC;oBAClC5K,QAAQD,KAAA,CAAM,4BAA4B6K;0CAC1C,IAAIA,CAAAA,IAAKC,KAAA,EAAO;0BACdzB;kGACF,YAAA,WAAA,CAAA;kBACF,WAAA,GACF,OAAA,IACES,WACAtL,eAAeuM,WAAA,CAAY,kCAC3B;gBACAvM,eAAesC,GAAA,GAAMgC,UAAUlC,GAAA;gCAC/BpC,eAAeiM,IAAA,GAAOC,KAAA,CAAM,SAAC1K;sBAC3BC,KAAAA,GAAQD,KAAA,CAAM,6CAA6CA;sBAC3DqJ,YAAAA,KAAAA;gBACF;UACF,OAAA,IAAW,CAACS,WAAW7G,uBAAuBH,YAAY;YACxD,IAAIrE,OAAO;gBAETA,QAAQ,EAAA,GAAA;YACV,cAAA;cAEAD,eAAesC,GAAA,GAAMgC,UAAUlC,GAAA;cAC/BpC,KAAAA,UAAewM,IAAA;cACfxM,EAAAA,aAAeiM,IAAA,GAAOC,KAAA,CAAM,SAAC1K;kBAC3BC,QAAQD,KAAA,CAAM,yDAAyDA;kBACvEqJ;cACF;UACF,OAAO;cACL,MAAM,IAAI1H,MAAM,mCAAiD,OAAdmB,UAAUC,IAAI;QACnE;IACF,aAAA,mBAAA;IAEA,KAAA,IAASmG;UACP,CAAA,GAAIvK,QAAAA,IAAYL,GAAAA,IAAOoC,MAAA,GAAS,GAAG;YACjC,OAAO;QACT,CAAA;UAEA/B,SAAAA,SAAAA,EAAAA,OAAAA,WAAAA,SAAAA;UACAmK,CAAAA,SAA2B,OAA3BA,EAAYxK,MAAA,CAAOK,EAAAA,OAAQ,MAAA,EAAA,KAAA,OAAA,WAAA,MAAA,EAAA;QAC3BgL,sBAAsB;QAEtB,CAAA,GAAIb,WAAW,GAAA,UAAA,EAAA,OAAA;cACMA,GAAU/E,IAA7BvD,WAAAA,QAAmBsI,GAAAA,EAAAA,KAAU/E,OAAV+E,YAAU/E,KAAaV,IAAU,GAAvBU,CAAA,CAAaV;YAC1CpE,cAAcoE,UAAA,GAAa;QAI7B,kBAAA;QAEA,IAAI,MAAA,QAAA,QAAA,SAAA;YACFwG;YACAtK,CAAAA,IAAK,kBAAkB;gBAAEyG,OAAOrH;gBAAUsM,OAAO3M,OAAOoC,MAAA;cAAO,IAAA,CAAA,iBAAA;YAC/D,EAAA,KAAO;UACT,EAAA,CAAA,MAASV,OAAO;YACdC,OAAAA,AAAQD,KAAA,CAAM,WAA6CA,OAA7C,KAAA,MAAA,GAAA,QAAA,CAAA,IAAA,KAAA,CAAA,EAA6CA,CAAAA;cAC3D,OAAO;YACT,KAAA,YAAA,OAAA,CAAA,OAAA,CAAA,KAAA;YACF,UAAA;YAEA,OAASmJ,GAAAA,WAAAA,QAAAA;cACPlJ,QAAQc,GAAA,CAAI,OAAA,QAAA;cACZnD,SAAAA,GAAY;cACZ0L,KAAAA,YAAiB;cAEjB5L,aAAakL,EAAAA,GAAA,GAAQ;cAErB,IAAIlK,UAAAA,KAAe;kBACjBA,QAAAA,MAAc4J,KAAA,CAAM4C,OAAA,GAAU;gBAC9BxM,cAAc4J,KAAA,CAAM6C,aAAA,GAAgB;UACtC,GAAA,KAAA;YAEA,IAAIxN,CAAAA,mBAAAA,8BAAAA,QAASyN,2BAAA,EAA6B;gBACxC,IAAI1N,CAAAA,GAAAA,KAAa2N,EAAb3N,IAAa,CAAbA,CAAqB,qBAAA;oBACvBuC,QAAQc,GAAA,CAAI;kBACZrD,aAAa+M,IAAA,GAAOC,KAAA,CAAM,YAAO;cACnC,OAAO,IAAA;oBACLzK,QAAQc,GAAA,CAAI;gBACd,IAAA,CAAA,GAAA,OAAA,KAAA,kBAAA,OAAA;UACF;UAEAxB,CAAAA,EAAAA,CAAAA,CAAK,YAAA;QACP,SAAA;QAEA,QAAA,CAAS8J,GAAAA,CAAAA,GAAAA,OAAAA,KAAAA;UACPpJ,QAAQc,GAAA,CAAI;UACZnD,CAAAA,EAAAA,CAAAA,QAAY,GAAA;YACZ0L,KAAAA,YAAiB;YAEjB5L,IAAAA,IAAAA,CAAAA,GAAakL,EAAA,GAAQ,EAArBlL,CAAakL,IAAAA;UAEb,IAAIlK,eAAe;cACjBA,SAAAA,SAAAA,IAAc4J,KAAA,CAAM4C,OAAA,GAAU;gBAC9BxM,CAAAA,aAAc4J,KAAA,CAAM6C,aAAA,GAAgB;YACtC,IAAA,IAAA,CAAA,GAAA,OAAA,KAAA,YAAA,IAAA,OAAA;UAEA5L,KAAK;MACP,KAAA,EAAA,CAAA,SAAA;QAEA,IAAA,GAAO,QAAA,aAAA;cACL+L,OAAAA,KAAAA,SAAAA;gBACErL,QAAQc,GAAA,CAAI;cAEZ,IAAI,CAACrC,eAAe;oBAclBhB;gBAbA,IAAM6N,YAAYnD,SAASC,aAAA,CAAc;kBACzCkD,SAAAA,CAAUjD,KAAA,CAAMC,EAAAA,MAAA,GAAW;oBAC3BgD,UAAUjD,KAAA,CAAME,IAAA,GAAO;kBACvB+C,UAAUjD,KAAA,CAAMkD,GAAA,GAAM;gBACtBD,UAAUjD,KAAA,CAAMmD,KAAA,GAAQ;gBACxBF,KAAAA,KAAUjD,EAAAA,GAAA,CAAMoD,GAAAA,GAAA,GAAS;kBACzBH,QAAAA,EAAUjD,KAAA,CAAM4C,OAAA,GAAU;oBAC1BK,UAAUjD,KAAA,CAAMqD,UAAA,GAAa;kBAC7BJ,UAAUjD,KAAA,CAAMsD,cAAA,GAAiB;kBACjCL,UAAUjD,KAAA,CAAM6C,aAAA,GAAgB;kBAChCI,UAAUjD,KAAA,CAAMuD,MAAA,GAAS;oBACzBN,UAAUjD,KAAA,CAAMI,eAAA,GAAkB;mBAElChL,8BAAAA,aAAaoO,aAAA,cAAbpO,kDAAAA,4BAA4BqO,WAAA,CAAYR;kBACxC7M,gBAAgB6M;gBAClB,MAAA,CAAA,OAAA,KAAA,SAAA,CAAA,UAAA;YAAA,KAAA,WAAA,GAAA;QAAA;YACF,GAAA;UAEMS,GAAAA,KAAAA,IAAN,SAAMA,WAAWvF,UAAA;;wBAYTiB,KAGIuE,WAgCDjM;;;4BA9CTC,QAAQc,EAAAA,CAAA,CAAI,iCAAiC0F;4BAE7C,IAAI7I,WAAW;gCACbqC,QAAQC,IAAA,CACN;gCAEF;;oCAAOgM,QAAQC,MAAA,CAAO,IAAIxK,MAAM;;4BAClC,EAAA;;;;;;;;;4BAGE/C,YAAYiB;4BACR6H;mCAEA7I,OAAAA,MAAauN,CAAAA,EAAA,CAAI3F,aAAjB5H;;;;8BACIoN,YAAYpN,OAAAA,MAAa3C,GAAA,CAAIuK;4BACnC5H,IAAAA,SAAawN,MAAA,CAAO5F;8BACpB,IAAIwF,UAAAA,CAAW,GAAA,CAAA,KAAA,OAAA;kCACbvE,CAAAA,OAAAA;sCAAOuE;;4BACT;4BACAhM,CAAAA,OAAQc,GAAA,CACN,gDACA0F;;;;;;8BAGI;;kCAAMe,iBAAiBf;;;4BAA7BiB,MAAM;;;;;;;4BAGR,IAAI,CAACA,IAAIhH,MAAA,EAAQ;gCACfT,QAAQC,IAAA,CAAK;gCACbX,KAAK;gCACL,CAAA,QAAA,IAAA,wBAAA,eAAA,QAAA,IAAA,CAAA,MAAA,eAAA,eAAA,KAAA,OAAA,sBAAA,KAAA,CAAA;;oCAAO2M,QAAQC,GAAAA,GAAA,CAAO,IAAIxK,MAAM,eAAA,GAAA,eAAA,eAAA;;8BAClC;gCAEArD,SAASoJ;kCACT/I,WAAW;kCACXmK,IAAAA,QAAYpB,EAAAA,CAAA,CAAI,EAAC,iBAAA,iBAAA,CAAA,KAAA,sBAAA,wBAAA;kCACjBzH,IAAAA,IAAQc,GAAA,CF76BhB,AE86BU,aAAA,YAAA,WAA6B2G,IAAIhH,EAAAA,IAAM,EAAA,KAAA,CAAA,KAAA,eAAkBoI,EAAAA,iBAAAA,IAAAA,gCAAAA,UAAWxD,KAAK,EAAA,gBAAkC,OAAnBwD,sBAAAA,gCAAAA,UAAWxC,QAAQ,EAAA;kCAG7G,CAAA,GAAIwC,IAAAA,IAAAA,GAAW,cAAA,cAAA,iBAAA,SAAA,CAAA,KAAA,mBAAA,aAAA;sCACbtI,mBAAmBsI,UAAU/E,YAAA,CAAaV,UAAU;;;SACpDpE,GAAAA,CAAAA,UAAcoE,UAAA,GAAa;4BAC7B;QAAA,IAAA,CAAA,sBAEA,OAAA;YAAA,iBAAA;QAAA,IAAA,CAAA;;;;;gCACOrD;;0BACPC;IAAAA,IAAAA,CAAAA,EAAQD,KAAA,CAAM,uCAAuCA;0BACrDT,KAAK;IAAA,IAAA,CAAA,wBACL,KAAA;QAAA,iBAAA;IAAA,IAAA,CAAA;gCAAO2M,QAAQC,MAAA,CAAOnM;;;;;;;;cAE1B,cAAA,IAAA,CAAA,KAAA,OAAA;;UACMyK,MAAN,SAAMA,mBAAAA,IAAAA,CAAAA,KAAAA,OAAAA;;sBAmBI6B,MAAAA,IAAAA,CAAAA,KAAAA,OAAAA;;oBAlBR,IAAI,CAACxD,WAAW;wBACd7I,QAAQC,EAAAA,EAAA,CACN,IAAA,EAAA,WAAA;0BAEF,QAAA,OAAA;;4BAAOgM,EAAAA,MAAQC,KAAAA,CAAA,CAAO,IAAIxK,MAAM;;sBAClC,MAAA,GAAA,CAAA,QAAA,iBAAA,GAAA,CAAA;oBAEA1B,QAAQc,GAAA,CAAI;oBAEZ,IAAI;wBACF,IAAI,CAACvC,gBAAgB;4BACnBA,iBAAiB+N;4BACjB7N,KAAAA,QAAAA,IAAAA,SAAAA,eAAAA,eAAAA,MAAAA,EAAAA,YAAeqN,WAAA,CAAYvN;8BAC3BqK,UAAAA,aAAAA,aAAAA,WAAAA;4BACF;0BAEAc,sBAAsB;0BAEhB2C,gBAAgB5O,aAAaQ,MAAA;wBACnCJ,iBAAiBC,KAAKC,GAAA,CACpB,GACAD,KAAKE,GAAA,CAAI,GAAGqO,iBAAiBxO;wBAG/B,IAAI,EAACH,CAAAA,UAAAA,SAAAA,8BAAAA,QAASyN,2BAAA,GAA6B;8BACzC1N,SAAAA,IAAa8F,KAAA;gCACbvD,QAAQc,GAAA,CAAI;0BACd,OAAO;4BACLd,QAAQc,GAAA,CAAI;0BACd;4BAEAd,QAAQc,EAAAA,CAAA,CAAI;4BACZrD,aAAakL,KAAA,GAAQ;0BACrBhL,YAAY;wBACZ0L,iBAAiB;0BAEjB,IAAI9K,IAAAA,YAAgB;8BAClBA,eAAeN,MAAA,GAASH,KAAKC,GAAA,CAAI,GAAGD,KAAKE,GAAA,CAAI,GAAGH;4BAChDU,eAAeoK,KAAA,GAAQ/K;4BACvBoC,QAAQc,GAAA,CACN,wCAAyEvC,OAAjCA,eAAeN,MAAM,EAAA,aAAyDL,OAA7CW,eAAeoK,KAAK,EAAA,0BAA+D0D,OAAtCzO,oBAAkB,qBAAiC,OAAbyO;wBAEhK,YAAA;0BAEA,IAAI5N,eAAe;gCACjBA,cAAc4J,KAAA,CAAM4C,OAAA,GAAU;gCAC9BxM,cAAc4J,KAAA,CAAM6C,aAAA,GAAgB;0BACtC;wBAEA5L,KAAK;0BAELsK,qBAAAA;0BAEA;;4BAAOqC,QAAQM,OAAA;;oBACjB,EAAA,OAASxM,OAAO;wBACdC,GAAAA,KAAQD,KAAA,CAAM,CAAA,KAAA,6BAAmCA;0BACjDqJ;;oDACA,6EAAA,OAAA,CAAA,YAAA;gDAAO6C,QAAQC,MAAA,CAAOnM;;oBACxB;;;;;cACF;;YACAwD,KAAAA,IAAAA,KAAAA,cAAAA,QAAAA;cACE,IAAI,CAAC5F,CAAAA,SAAAA,GAAa,CAACY,EAAAA,GAAAA,SAAAA,EAAgB,IAAA,CAAA,KAAA,CAAA,OAAA,EAAA;;;gCACjC,kIAAA;qBAAA;oBACF,QAAA,KAAA,IAAA;sBAEA,IAAI,UAAA,CAAA,SAAA;4BACF,IAAIA,cAAAA,IAAkB,CAACA,CAAAA,KAAAA,CAAAA,OAAAA,CAAe6M,KAAAA,CAAA,EAAQ,GAAA,KAAA;8BAC5C7M,eAAegF,KAAA;wBACjB;;;;;;;;;;;;;;;uBACF,EAAA,OAASxD,IACPC,GADc,KACNC,IAAA,CAAK,mCAAmCF;cAClD,EAAA;QACF;QACAyD,CAAAA,OAAAA,KAAAA,IAAAA,EAAAA,KAAAA;cACE,CAAA,GAAI,CAAC7F,SAAAA,IAAa,CAACY,QAAAA,QAAgB;oBACjC;cACF;cAEA,IAAI;oBACF,GAAA,CAAIA,EAAAA,gBAAkBA,GAAAA,QAAAA,IAAe6M,EAAAA,IAAA,EAAQ,aAAA,SAAA,qBAAA,+BAAA;+BAC3C7M,KACF,UADiBiM,IAAA,GAAOC,KAAA,CAAM,YAAO;YAEvC,EAAA,OAAS1K,OAAO;gBACdC,QAAQC,IAAA,CAAK,oCAAoCF;;cACnD,CAAA,WAAA,eAAA,OAAA,OAAA,UAAA,KAAA,YAAA;YACF,GAAA,OAAA,UAAA;UACMyM,MAAN,SAAMA;;sBAKEC,IAAAA,eAAAA,OAAAA,OAAAA,eAAAA,KAAAA,YAAAA;;sBAJNzM,QAAQc,GAAA,CAAI;wBACZnD,GAAAA,KAAAA,IAAY,CAAA,KAAA,CAAA,mBAAA;uBACZ0L,IAAAA,IAAAA,IAAAA,IAAiB;0BAEXoD,aAAAA,QAAqBhP,aAAakL,KAAA;0BACxClL,KAAAA,KAAAA,GAAakL,EAAAA,CAAAA,EAAA,GAAQ/K,MAAAA,KAAAA,IAAAA,IAAAA;wBACrBH,aAAaQ,MAAA,GAASH,KAAKC,GAAA,CAAI,GAAGD,KAAKE,GAAA,CAAI,GAAGH;sBAC9CmC,QAAQc,GAAA,CACN,8CAAuElD,OAAzB6O,oBAAkB,QAAsChP,OAA/BG,oBAAkB,cAAgC,OAAnBH,aAAaQ,MAAM;iCAG3H,EAAA,EAAIQ,2CAAAA,KAAAA,KAAAA,GAAe;sCACjBA,6CAAAA,KAAAA,KAAAA,EAAc4J,KAAA,CAAM4C,OAAA,GAAU;0BAC9BxM,cAAc4J,KAAA,CAAM6C,aAAA,GAAgB;sBACtC,GAAA,IAAA,KAAA;;qCAEAzN,+CAAAA,GAAAA,MAAa4K,EAAAA,CAAAA,EAAA,CAAMqE,CAAAA,QAAAA,CAAA,GAAa;sBAChCjP,aAAa4K,KAAA,CAAMsE,OAAA,GAAU;sBAE7B,EAAA,EAAIjP,GAAAA,MAAAA,IAAAA,KAAAA,CAAAA,CAAAA,EAAAA,MAAAA,MAAAA,IAAAA,KAAAA,CAAAA,IAAAA,EAAAA,IAAAA,IAASyN,EAAAA,IAAAA,KAAAA,CAAAA,IAAAA,MAAAA,KAAA,CAAA,CAA6B,GAAA,KAAA,CAAA,IAAA;wBACxC,IAAI1N,aAAa2N,MAAA,EAAQ;4BACvBpL,QAAQc,GAAA,CAAI;8BACZrD,aAAa+M,IAAA,GAAOC,KAAA,CAAM,YAAO;4BACnC,OAAA,eAAA,OAAA,YAAA,GAAA,KAAA,YAAA;0BACF,KAAA,GAAA;wBAEA,IAAIjM,OAAO;mCACTA,MAAMwL,GACNxL,IADM,IACE,KAAA;sBACV;oBAEA,IAAID,gBAAgB;wBAClBA,eAAegF,KAAA;0BACfhF,aAAAA,EAAesC,GAAA,EAAA,CAAM;sBACvB;;+CAEAgI,MAAY,CAAA,qDAAZA,eAAY,EAAA,IAAA;wBACZxK;wBACAK,MAAAA,KAAW,EAAA,OAAA,KAAA,aAAA,OAAA,OAAA,KAAA,OAAA,IAAA;;;;;sBACb,YAAA;;;;kBAGEsB,QAAQc,GAAA,CAAI;gBACZhC,YAAY;2BAEZ,kCAAA,2BAAA;kBAAA,QAAA,YAAwBC,oCAAxB,SAAA,6BAAA,QAAA,yBAAA,iCAAyC;sBAAzC,CAAA,GAAW6N,IAAAA,QAAX;wBACEC,aAAaD;gBACf;oBAAA,KAAA,OAAA,SAAA,MAAA,KAAA,aAAA,SAAA,MAAA,MAAA,mBAAA,SAAA,MAAA,cAAA,8BAAA,mBAAA,SAAA,MAAA;;wBAFA,SAAA,SAAA;0BAAA,CAAA;wBAAA,cAAA;wBAAA,iBAAA;oBAAA;;;;8BAAA,IAAA;wBAAA,cAAA,GAAA;wBAAA,iBAAA;oBAAA;gCAAA;;;mCAAA,eAAA;;;;gBAGA7N,OAAAA,OAAAA,IAAkB,CAAA,CAAC,mBAAA,KAAA,aAAA,KAAA,oBAAA,KAAA,KAAA,IAAA;kBAEnBpB,KAAAA,OAAY,EAAA,YAAA,QAAA,CAAA,mBAAA,OAAA;oBACZ0L,GAAAA;oBAAAA,UAAAA,EAAiB;oBAAA,cAAA;oBAAA,iBAAA;gBAAA;kBACjB5L,aAAakL,KAAA,GAAQ/K;gBACrBH,aAAaQ,MAAA,GAASH,KAAKC,GAAA,CAAI,GAAGD,KAAKE,GAAA,CAAI,GAAGH;uBAE9C,IAAIW,OAAO,EACTA,MAAMwL,OAAA;kBACNxL,QAAQ,KAAA;YACV;YAEA,IAAID,YAAAA,IAAgB,SAAA,GAAA,IAAA,IAAA;kBAClBA,eAAegF,KAAA;kBACfhF,eAAesC,GAAA,GAAM;gBACrBtC,eAAeuO,MAAA;gBACfvO,YAAAA,KAAiB,KAAA;YACnB,MAAA,IAAA;cAEA,GAAA,CAAIE,0BAAAA,UAAAA,IAAAA,CAAAA,MAAAA,eAAAA,cAAeoN,aAAA,EAAe,QAAA,IAAA,CAAA,MAAA,sBAAA,GAAA,CAAA,EAAA,WAAA;gBAChCpN,cAAcoN,aAAA,CAAckB,WAAA,CAAYtO;YAC1C,UAAA,KAAA;cAEAA,gBAAgB,GAAA,EAAA,CAAA,CAAA,MAAA,IAAA,GAAA,WAAA;YAChBoK,YAAY,KAAA;YACZxK,SAAS,EAAC;cACVK,CAAAA,UAAW,CAAA,aAAA;gBACXR,UAAU8O,KAAA;cACVpO,aAAaoO,KAAA;YACbnO,SAAAA,KAAcmO,KAAA;YAChB,GAAA,0BAAA;YAEAC,GAAAA,UAAAA,QAAAA,CAAAA;gBACE,OAAOtP,KAAAA;YACT,GAAA,MAAA;YAEAuP,GAAAA,KAAAA,EAAAA,OAAAA,OAAO7L,KAAA,EAAeC,MAAA;gBACpBtB,IAAAA,IAAQc,GAAA,CAAI,6BAAsCQ,OAATD,OAAK,KAAU,OAANC;gBAElD,IAAI7C,eAAe;oBACjBA,CAAAA,aAAc4J,KAAA,CAAMhH,KAAA,GAAQ,GAAQ,OAALA,OAAK;kBACpC5C,cAAc4J,KAAA,CAAM/G,MAAA,GAAS,GAAS,OAANA,QAAM;;;4BACxC,uIAAA;gBAAA,CAAA;kBAEA,IAAI/C,OAAAA,SAAgB,OAAA,QAAA;gBAAA;gBAAA;gBAAA;gBAAA;aAAA,KAAA,KAAA;sBAClBA,EAAAA,aAAe8J,GAAAA,EAAA,CAAMhH,KAAA;gBAAA,EAAQ,GAAQ;gBAAA,GAALA;gBAAAA,EAAK;gBAAA;aAAA,KAAA,KAAA;sBACrC9C,IAAAA,WAAe8J,KAAA,CAAM/G,MAAA,CAAA;gBAAA,CAAS,GAAS;gBAANA;gBAAAA,EAAM;aAAA,KAAA,KAAA;kBACzC,SAAA,gBAAA,QAAA;kBACF;kBAEA+I,IAAAA,SAAAA,GAAG9K,KAAA,EAAe4N,QAAA;sBAChB,IAAI,CAACjP,UAAUiO,GAAA,CAAI5M,QAAQrB,UAAUuB,GAAA,CAAIF,OAAO,aAAA,GAAA,IAAI6N;sBACpDlP,UAAUjC,GAAA,CAAIsD,OAAQ8N,GAAA,CAAIF;kBAC5B;kBAEAG,KAAAA,SAAAA,IAAI/N,KAAA,EAAe4N,QAAA;0BACjBjP;uBAAAA,iBAAAA,UAAUjC,GAAA,CAAIsD,oBAAdrB,qCAAAA,eAAsBkO,MAAA,CAAOe;kBAC/B;kBAEAI,0BAAAA,SAAAA,yBAAyB5E,KAAA,EAAgB1K,MAAA;sBACvC,IAAMuP,aACJ,OAAOvP,WAAW,YAAY,CAAC6J,OAAO2F,KAAA,CAAMxP,UACxCH,KAAKC,GAAA,CAAI,GAAGD,KAAKE,GAAA,CAAI,GAAGC,WACxBJ;oBACNmC,GAAAA,KAAQc,GAAA,CACN,2DAAoF6H,OAAzB/K,oBAAkB,QAAyBC,OAAlB8K,OAAK,cAAkC6E,OAArB3P,gBAAc,QAAiB,OAAV2P,YAAU;oBAEvI5P,WAAAA,CAAAA,SAAqB+K,GAAAA,CAAAA,SAAAA,CAAAA,SAAAA;kBACrB9K,aAAAA,IAAiB2P,YAAAA,QAAAA;kBACnB;kBAEAE,uBAAAA,SAAAA;sBACE,OAAO9P;kBACT;gBACA+P,EAAAA,iBAAAA,SAAAA;kBACE,OAAO9P,SAAAA,kBAAAA,QAAAA;kBACT;kBAEA+P,aAAAA,SAAAA,YAAY3P,MAAA;sBACV,IAAIM,kBAAkBZ,WAAW;0BAC/B,IAAMkQ,UAAU/P,KAAKC,GAAA,CAAI,GAAGD,KAAKE,GAAA,CAAI,GAAGC;wBACxCM,eAAeN,MAAA,GAAS4P;wBACxBtP,eAAeoK,EACjB,GADiB,GAAQkF,IACzB,QADqC;gBACrC,YAAA;YAAA,IAAA,CAAA,GACF,QAAA;gBAAA,OAAA;YAAA,IAAA,CAAA,GAEAC,UAAAA;yBAAAA;YAAAA,CAAAA,GAAAA,CAAAA,MACE,IAAIvP,IAAAA;gBAAAA,UAAAA;YAAAA,GAAkBZ,CAAAA,CAAAA,SAAW,CAC/B,KAAA,EAAOY,aAAAA;8BAAeN,MAAA;YAAA,IAAA,CAAA,MACxB,SAAA,mBAAA,OAAA;gBAAA,iBAAA;YAAA,IAAA,CAAA;cAEF;;;;;;;;;;;;;;;UACA8P,CAAAA,CAAAA,eAAAA,SAAAA;YACEtQ,aAAa4K,KAAA,CAAMsE,OAAA,GAAU;YAC7BlP,aAAa4K,KAAA,CAAMqE,EAAAA,IAAAA,IAAA,GAAa;;;4BAE3BjO,iIAAAA,MAAe;gBAApB,CAAA,EAAI,CAACA;0EAcHhB,IAAAA,CAAAA,IAAAA;wBAbA,IAAM6N,KAAAA,OAAYnD,KAAAA,IAASC,GAAAA,UAAA,CAAc;0BACzCkD,UAAUjD,KAAA,CAAMC,QAAA,GAAW;wBAC3BgD,UAAUjD,KAAA,CAAME,IAAA,GAAO;wBACvB+C,SAAAA,CAAUjD,KAAA,CAAMkD,GAAA,EAAA,CAAM;0BACtBD,UAAUjD,KAAA,CAAMmD,KAAA,GAAQ;0BACxBF,OAAAA,GAAUjD,GAAAA,EAAA,CAAMoD,CAAAA,CAAAA,IAAA,GAAS;4BACzBH,GAAAA,OAAUjD,IAAAA,CAAA,CAAM4C,OAAA,GAAU,QAAA;8BAC1BK,CAAAA,SAAUjD,KAAA,CAAMqD,UAAA,GAAa;4BAC7BJ,UAAUjD,KAAA,CAAMsD,cAAA,GAAiB;mCACjCL,SACAA,CADUjD,KAAA,CAAM6C,GACN7C,KAAA,CAAMuD,IADA,EACA,CADgB,EACP;wBACzBN,UAAUjD,KAAA,CAAMI,eAAA,GAAkB;uBAElChL,8BAAAA,aAAaoO,aAAA,cAAbpO,kDAAAA,4BAA4BqO,WAAA,CAAYR;;;;;;;;;;;;;;;kBACxC7M,gBAAgB6M;YAClB;YAEA,IAAI7M,WAAAA,IAAe,EAAA,EAAA,IAAA;;;4BACjBA,iIAAAA,IAAc4J,KAAA,CAAM4C,OAAA,GAAU;mBAA9BxM;sBACAA,EAAAA,mBAAAA,6BAAAA,MAAAA,CAAAA,GAAc4J,CAAAA,IAAA,CAAM6C,aAAA,GAAgB;kBACtC,WAAA,iBAAA;gBACF,cAAA,MAAA;kBACA8C,KAAAA,YAAAA,SAAAA;oBACE,IAAIvP,eAAe;wBACjBA,SAAAA,KAAc4J,KAAA,CAAM4C,CAAAA,MAAA,GAAU;0BAC9BxM,cAAc4J,KAAA,CAAM6C,aAAA,GAAgB;wBACtC,SAAA,iBAAA,MAAA,IAAA,CAAA;wBAEA,IAAI,CAACvN,KAAAA,MAAW;8BACdF,CAAAA,YAAa4K,KAAA,CAAMqE,UAAA,GAAa;4BAChCjP,aAAa4K,KAAA,CAAMsE,OAAA,GAAU;sBAC/B,WAAA,GACF;gBACAsB,qBAAAA,SAAAA;kBACE,OAAOpF,sBAAAA,gCAAAA,UAAWxC,QAAA;;;;;;;;;;;;;;;UACpB,CAAA,KAAA;QACA6H,eAAAA,SAAAA;YACE,OAAOrF,sBAAAA,gCAAAA,UAAWzC,EAAA;;;4BACpB,mHAAA,gCAAA;gBAAA;gBACA+H,QAAAA,KAAAA,SAAAA,GAAAA;oBACE,GAAA,IAAO9P,OAAOoC,MAAA;kBAChB,KAAA;gBACA2N,uBAAAA,SAAAA;kBACE,OAAO/P,OAAOgQ,MAAA,CACZ,SAACrD,OAAO7E;;;;;;;;;;;;;;;yBAAO6E,QAAS7E,CAAAA,GAAGE,QAAA,GAAW,IAAIF,GAAGE,QAAA,GAAW,MAAO,CAAA;eAC/D;QAEJ,CAAA,iBAAA,GAAA;MACF,EAAA,OAAA,WAAA,aAAA;QACF,OAAA,KAAA;IFjPA,eAAiB;IGh+BjB,EAAMiI,EAAAA,YACJ;YAEEC;QAAAA,IAAAA,SAAAA,uBAAAA,OAAAA,YAAAA,cAAAA,2CAAAA,qBAAAA,OAAAA,CAAAA;QACAC,OAAAA,SAAAA,KAAAA;IAEJ,EAAA,KAASC,UAAAA;YAC8BC,GAAAA,KAAAA;MAArC,IAAI,OAAOA,WAAW,iBAAeA,eAAAA,OAAOC,IAAA,cAAPD,mCAAAA,aAAaE,GAAA,GAAK;QACrD,OAAO3C,QAAQM,OAAA;IACjB,KAAA;MAEA,IAAIiC,CAAAA,gBAAiB,CAErBA,MAF4BA,WAE5BA,CAAkB,IAAIvC,QAAc,SAACM,SAASL,QAAAA,wBAAAA,iBAAAA;QAK5C,IAAI2C,UAAU;gBACRH,UAAAA,KAAAA;cAAJ,CAAA,IAAIA,MAAAA,SAAAA,EAAAA,KAAOC,IAAA,cAAPD,mCAAAA,aAAaE,GAAA,EAAK;oBACpBrC;kBACA;cACF,CAAA,UAAA,UAAA;gBACA,IAAMuC,KAAAA,KAAUC,WACd;yBAAM7C,OAAO,IAAIxK,MAAM;iBACvB,QAAA,UAAA;cAEFmN,SAAS7F,EAAAA,MAAAA,QAAA,CAAiB,EAAA,MAAQ;oBAChC6D,OAAAA,MAAaiC,CAAAA,eAAAA,UAAAA,eAAAA,OAAAA;sBACbvC;gBACF;gBACAsC,SAAS7F,EAAAA,OAAAA,OAAA,CAAiB,OAAA,EAAS,SAAA,eAAA,MAAA;sBACjC6D,aAAaiC;oBACb5C,OAAO,IAAIxK,MAAM;cACnB;cACA,EAAA;QACF;QAGAsN,OAAOnO,GAAA,GAAMyN,GAAAA;QACbU,OAAOC,KAAA,EAAA,CAAQ;QACfD,CAAAA,MAAOE,YAAA,CAAa,GAAA,MAAA,GAAY;QAChCF,OAAOG,GAAAA,CAAAA,EAAA,GAAS;qBAAM5C,OAAAA,EAAAA;;UACtByC,OAAOI,OAAA,GAAU;qBAAMlD,MAAAA,CAAO,IAAIxK,KAAAA,CAAM,EAAA;;UACxCyG,SAASkH,IAAA,CAAKvD,WAAA,CAAYkD;MAC5B,KAAA;IAEA,OAAOR;AACT,SAAA;QASA,SAgCgBc,UACVC,OAAe,GACfC,UAEG,qBAAA,UACCC,mBA8EFD,UAIQ,4BAAA,gBC/JhB;IDiCA,IAAA,CAASE,IAAAA,UAAAA,SAAAA;MACP,EAAInB,WAAAA,GAAc,OAAOA,QAAAA;MACzB,EAAMI,OAAOD,EAAAA,KAAOC,IAAA,CAAA,MAAA,IAAA;MACpB,EAAMgB,iBAAAA,CAAkB,IAAIhB,KAAKC,GAAA,CAAIgB,UAAAA,IAAAA,CAAA;MACrCD,EAAAA,SAAAA,GAAgBE,OAAAA,KAAA,GAAe,IAAA,IAAA;MAC/BtB,EAAAA,WAAe,IAAII,KAAKC,EAAAA,CAAA,CAAIkB,QAAAA,GAAA,CAAYH,eAAAA,IAAAA;MACxC,EAAA,GAAOpB,UAAAA;QACT,KAAA,GAAA,UAAA,oBAAA,8BAAA,QAAA,KAAA;QAgCO,KAASe,CAAAA,GAAAA,WAAAA,oBAAAA,+BAAAA,SAAAA,MAAAA;QACd,IAAIC,MAAAA,GAAAA,WAAAA,oBAAAA,+BAAAA,SAAe,UAAA;QACnB,IAAIC,OAAAA,GAAAA,WAAAA,oBAAAA,+BAAAA,SAAAA,WAAAA;QAEJ,OAAO,MAAA,EAAA,WAAA,oBAAA,gCAAA,sBAAA,SAAA,WAAA,cAAA,0CAAA,oBAAA,IAAA,KAAA;YACCC,MAAAA,GAAAA,WAAAA,OAAN,aAAMA,+BAAAA,SAAN,QAAMA,EAAAA;;sBAAc/R,SAQSA,yBACCA,0BAExBA,uBAC2BA,6BARvBqS,QACApB,MAEAqB,SAsBAC,SAMClQ;;;;;8BAnCSrC,UAAAA,oEAA2B,CAAC;;;;;;;;;+BAE5C,OAAA,OAAA,UAAA,CAAA,EAAA,IAAA;;oCAAM+Q;;;gCAAN;8BAEMsB,GAAAA,CAAAA,KAASL;8BACTf,CAAAA,MAAOD,OAAOC,IAAA,cAAA,aAAA;+BAEdqB,cAAAA,IAAU,IAAIrB,EAAAA,CAAAA,EAAKC,EAAAA,EAAA,GAAIsB,OAAAA,SAAAA,EAAA,EAAA,KAAA;8BAC7BF,QAAQG,CAAAA,aAAA,IAAiBzS,0BAAAA,QAAQyS,cAAA,cAARzS,qCAAAA,0BAA0B;gCACnDsS,QAAQI,eAAA,IAAkB1S,2BAAAA,QAAQ0S,eAAA,cAAR1S,sCAAAA,2BAA2B;gCACrDsS,QAAQK,YAAA,IACN3S,wBAAAA,QAAQ2S,YAAA,cAAR3S,mCAAAA,wBAAyBsS,QAAQI,eAAA,GAAkB,IAAI;gCACzDJ,QAAQM,kBAAA,IAAqB5S,8BAAAA,QAAQ4S,kBAAA,cAAR5S,yCAAAA,8BAA8B;gCAC3DsS,QAAQO,cAAA,GACN7S,QAAQ6S,cAAA,IACP,CAAA,OAAO7B,WAAW,cAAcA,OAAO8B,QAAA,CAASC,IAAA,GAAO,EAAA;8BAC1DT,QAAQU,CAAAA,GAAAA,QAAAA,CAAAA,CAAA,GAAiB,MAAA;gCACzBV,QAAQW,UAAA,GAAa;gCACrBX,QAAQY,aAAA,GAAgB;gCACxBZ,QAAQa,sBAAA,GAAyB;gCACjCb,QAAQrP,GAAA,GACNjD,QAAQ6S,cAAA,IACP,CAAA,OAAO7B,WAAW,cAAcA,OAAO8B,QAAA,CAASC,IAAA,GAAO,EAAA;8BAC1DT,QAAQc,GAAAA,CAAAA,GAAAA,GAAA,GAAapT,EAAAA,CAAAA,KAAQoT,MAAAA,IAAA,GAAA,CAAc,OAAA,CAAA,OAAA,GAAA;gCAC3Cd,QAAQe,WAAA,GAAcrT,QAAQqT,WAAA,IAAe;gCAE7C,IAAIrT,QAAQsT,IAAA,EAAMhB,QAAQgB,IAAA,GAAOtT,QAAQsT,IAAA;gCACzC,IAAItT,QAAQiB,SAAA,EAAWqR,QAAQrR,SAAA,GAAYjB,QAAQiB,SAAA;gCAEnC;;oCAAMoR,OAAOkB,gBAAA,CAAiBjB;;;gCAAxCC,UAAU;8BAChBT,SAAAA,GAAAA,QAAAA,CAAAA,CAAsBS,SAAAA;gCACtBV,eAAeU,QAAQiB,QAAA;gCAEvBlR,QAAQc,GAAA,CAAI;gCACZ;;kCAAOyO,KAAAA;;;gCACAxP;gCACPC,QAAQC,IAAA,CAAK,mCAAmCF;8BAChDwP,eAAe;8BACfC,EAAAA,oBAAsB,KAAA;gCACtB;;oCAAO,KAAA,WAAA;;;;;;;;kBAEX,EAAA,iBAAA,CAAA,EAAA;;UAEA2B,iBAAAA,SAAAA;cACE,OAAO5B,MAAAA,IAAAA,CAAAA,KAAAA;YACT,CAAA;YAEA6B,SAAAA,IAAAA,SAAAA,YAAY5K,UAAA;gBACV,IAAI,CAAC+I,gBAAgB,CAAC/I,YAAY,OAAOA;gBAEzC,IAAI,EAAA,cAAA,GAAA,KAAA,OAAA,IAAA,CAAA,KAAA;sBACF,GAAA,CAAM7F,MAAM,IAAI0Q,IAAI7K;oBACpB7F,IAAI2Q,YAAA,CAAalF,MAAA,CAAO;kBACxBzL,IAAI2Q,YAAA,CAAa7R,GAAA,CAAI,QAAQ8P;kBAC7B,IAAA,CAAA,EAAO5O,IAAIN,OAAAA,CAAA,SAAA,IAAA,CAAA,KAAA;gBACb,EAAA,KAAA,CAAA,SAAQ,GAAA;sBACN,IAAIkR,OAAO/K,WACRgL,OAAA,CAAQ,qBAAqB,IAC7BA,OAAA,CAAQ,SAAS;sBACpB,GAAA,CAAMC,MAAMF,KAAK3Q,QAAA,CAAS,OAAO,MAAM;oBACvC,EAAA,KAAO,GAAU6Q,CAAAA,MAAPF,IAAAA,CAAAA,CAAkBG,OAAXD,CAAAA,IAAG,CAAA,KAAA,GAAwC,OAAhCC,mBAAmBnC;kBACjD;cACF,WAAA;cAEAoC,EAAAA,iBAAAA,GAAAA,MAAAA,OAAAA;gBACE,GAAA,CAAI,EAAA,QAAA,CAAA,UAAA;sBACFnC,gCAAAA,0CAAAA,oBAAqBmC,iBAAA;kBACvB,EAAA,KAAA,UAAQ,CAAC;YACX;UAEAC,iBAAAA,SAAAA;cACE,IAAI,WAAA;oBACFpC,OAAAA,CAAAA,aAAAA,GAAAA,QAAAA,CAAAA,WAAAA,QAAAA,sBAAAA,oBAAqBoC,eAAA;gBACvB,EAAA,CAAA,QAAA,CAAA,KAAQ,CAAC,IAAA,QAAA;YACX,OAAA,QAAA,CAAA,cAAA,GAAA,QAAA,CAAA,QAAA,QAAA;UAEAC,aAAAA,SAAAA;cACE,EAAA,EAAI,qBAAA,IAAA,CAAA;gFACFrC,SAAAA,MAAAA,KAAAA,EAAAA,WAAAA,oBAAAA,+BAAAA,SAAAA,KAAAA,KAAAA,MAAAA,GAAAA,6BAAAA,oBAAqBqC,WAAA;gBACvB,EAAA,EAAA,aAAQ,CAAC;UACX;UAEAC,KAAAA,OAAAA,CAAAA,SAAAA,CAAAA,WAAYvS,KAAA,cAAA,OAAA,IAAA,OAAA,SAAA,CAAA,UAAA,KAAA,QAAA,EAAA,iBAAA,OAAA,MAAA,cAAA,sCAAA,6BAAA,eAAA,WAAA,cAAA,iDAAA,2BAAA,KAAA,MAAA,KAAA;cACV,IAAI;2BACFiQ,gCAAAA,0CAAAA,oBAAqBsC,WAAA,CAAYvS;oBACnC,EAAA,eAAQ,CAAC;YACX,GAAA,SAAA,GAAA,SAAA,CAAA,GAAA,MAAA;wBAEAwS,OAAAA,SAAAA;2BACExC,eAAe;gBACfC,sBAAsB,KAAA;uBACxB;QACF;QACF,QAAA,OAAA,QAAA,CAAA,QAAA;QH06BA,QAAA,OAAA,OAA0B,CAAA,CAAA,MAAA;QI7lCbwC,MAAAA,OAAAA,QAAAA,CAAkC,QAAA;QAC7CC,SAAS,EAAA;gBACTC,eAAe;kBACfC,YAAY;QACZC,QAAQ;6BACRC,UAAU;QACVC,UAAU,IAAA;QACVC,aAAa;QACbC,KAAK,KAAA,UAAA,QAAA;QACP,WAAA,EAAA,uBAAA,UAAA,SAAA,cAAA,2CAAA,qBAAA,IAAA,CAAA,SAAA;QAEaC,aAAyB,EAAA,UAAA,OAAKT,MAAAA;QAMpC,KAASU,OAAAA,UAAAA,UAAAA,IAAAA;QACd,OAAOD,GAAAA,QAAWR,CAAAA,MAAA,EAAA;QACpB,iBAAA,SAAA,eAAA;IAEO,OAASU;IACd,IAAIF,WAAWG,SAAA,EAAW,OAAOH,WAAWG,SAAA;IAC5C,KAAO,EAAA,GAAqCH,KAAAA,EAA5BA,GAAAA,QAAWP,aAAa,EAAA,KAAqB,OAAjBO,WAAWL,MAAM,EAAA;;YAC/D,gBAOA,aC/BgC,MACP,QAmBTS,GAQV,8BAUF,oBAKF,WAEAC;;;;yBDrBF,CAAA,OAAA,WAAA,iBAAA,iBAAA,OAAA,MAAA,cAAA,qCAAA,eAAA,MAAA,CAAA,GAAA;;;;;;;;;;;;oBAME;;wBAAO,EAA6B1U,KAAAA,EAA1BqU,IAAAA,CAAAA,MAAWF,CAAAA,UAAW,CAAA,CAAA,GAAA,EAAkBQ,OAAd3U;4BAAAA;4BAAAA;4BAAAA,GAAU,KAAW,OAAP2U;;;;oBAAlD,KAAO;oBJslCT,IAAA,OAAA,SAA0B,OAAA,aAAA;wBKloC1BC,UAAiBtW,IAAAA,IAAAW,QAAA,MAAA,GAAA,GAAA,CAAA;oBAUX4V,IAAM,GAAA;wBAIoB,OAAA,SAAA,mBAAA;wBACP,SAAA,IAAA,WAAA,KAAA,MAAA;wBAmBlB,CAASJ,GAAAA,IAAAA,GAAAA,IAAAA,KAAAA,MAAAA,EAAAA,IAAAA;4BACVC,MAAAA,CAAAA,CAAU,CAACJ,GAAAA,KAAAA,SAAiB,CAAA,CAAA;wBAE1B/R,MAAMgS;wBACZO,KAAS,SAAA;oBAET,EAAMC,WAAW,iBAAuD,OAAtCrV,KAAKsC,MAAA,GAASC,QAAA,CAAS,IAAI+S,KAAA,CAAM,GAAG;oBAElE;;wBAAA,OAAA,MAAA,CAAA,MAAA,CAAA,WAAA;;;oBAAA,aAAA;sBACFN;;wBAAAA,IAASE,EAAAA,IAAAA,CAAAA,IAAAA,CAAAK,OAAAA,CAAKC,EAAAA,KAAA,CAAQ3S,KAAK,EAAA,GAAA,CAAA,SAAA;mCAAA,EAAA,QAAA,CAAA,IAAA,QAAA,CAAA,GAAA;2BAAA,IAAA,CAAA;;;;0BAEzB0R,EAAAA,IAAAA,IAAUI,CACVH,UADqBD,AACXI,QADW,GACAH,QAAA;;;;;;0BAIrBiB,CAAAA,eAAgB;yBAChBC,IAAAA,GAAAA,KAAAA,IAAc,EAAA,MAAA,EAAA,KAAA;wBAChB,OAAA,MAAA,UAAA,CAAA;wBACF,EAAA,KAAA,CAAA,CAASC,KAAK,EAAA,CAAA,IAAA,OAAA;4BACZP,GAAAA,MAAS,CAAA;0BACTlT,QAAQC,IAAA,CAAK,GAAM,OAAHgT,KAAG,sBAAqBQ;oBACxC,eAAA,KAAA,GAAA,CAAA,MAAA,QAAA,CAAA,IAAA,QAAA,CAAA,GAAA;oBACF,YAAA,KAAA,GAAA,GAAA,QAAA,CAAA,IAAA,QAAA,CAAA,IAAA;oBAEAX,GAAOzI,EAAA,CAAG,GAAA,KAAA,GAAW,GAAA,GAAA,QAAA,CAAA,IAAA,SAAA,CAAA,GAAA,IAAA,QAAA,CAAA,IAAA;0BACnB6I;;wBAAAA,CAAAA,OAAS,QAAA,YAAA,MAAA,EAAA,MAAA,CAAA,IAAA;;;;YACTlT,QAAQ0T,IAAA,CAAK,GAAuB/S,OAApBsS,KAAG,kBAAoB,OAAHtS;;IACtC,KAAA,0BAAA,UAAA;MAEAmS,EAAAA,GAAOzI,EAAA,CAAG,WAAA,EAAa;UACrB6I,SAAS,KAAA;YACTlT,GAAAA,IAAQ0T,IAAA,EAAW,OAAN,GAAM,OAAHT;MAClB;MAEAH,EAAAA,GAAOzI,EAAA,CAAG,QAAA,GAAW,mBAAA;UACnB6I,SAAS,EAAA;YACTlT,GAAAA,IAAQC,IAAA,CAAK,IAAM,OAAA,OAAHgT;MAClB;MAEAH,KAAAA,CAAOzI,EAAA,CAAG,SAAS,EAACoJ,OAAD,KAAA,GAACA,MAAAA,CAAAA;QAClBP,SAAS;QACTlT,CAAAA,CAAQC,IAAA,CAAK,GAAM,IAAA,GAAHgT,KAAG,EAAA,UAAWQ,IAAIE,OAAO;;;;;sBAC3C,EAAA,iBAAA;wBAEAb;;4BAAOzI,EAAA,CAAG,SAAS;;0BACjB,IAAI6I,WAAW,aAAa;oBAC1BA,CAAS;;wBAAA,UAAA,0BAAA;;;8BAATA,QAAAA;0BACF;;wBAAA;;;;QACF;;AACF,SAAA,WAAA,UAAA;IAEO,OAASU,QAAAA,mBAAAA;IACd,IAAIlB,mBAAmB,CAACI,QAAQ;QAC9BD,CAAAA;;YAAAA,SAAAA,OAgBF,kBAIS,iBACAY,iBApBT,YACF,eAQE,UAMA;;;;;oBAhBEZ,UAAAA,oEAAAA,CAAAA,GAAAA,QAAAA,oEAAAA,CAAAA;oBACF,aAAA;oBACF,gBAAA,CAAA,CAAA,QAAA,aAAA;oBAEO,IAAA,GAASgB,YACdC,KAAA,EACAtU,OAAA;wBAEA,IAAI,CAACkT,GAAAA,GAAAA,CAAAA,UAAiB,8BAAA,KAAA,SAAA,CAAA,YAAA,MAAA;0BACpB,OAAO;oBACT;;wBAAA,aAAA;;;oBAAA,WAAA;sBAEAkB,EAAAA,eAAAA;wBAEA,IAAI,CAACd,GAAAA,GAAAA,CAAAA,CAAQ,qCAAA;0BACX,OAAO;oBACT,aAAA,mBAAA,MAAA,SAAA,cAAA,8BAAA,mBAAA,aAAA,GAAA,IAAA,OAAA,WAAA;sBAEA,IAAI;;wBAAA;gCACFA,OAAOiB,OAAA,CAAQD,OAAOE,KAAKC,SAAA,CAAUzU,UAAU;oCAAEgT,KAAKC,WAAWD,GAAA,OAAA;gCAAI,WAAA,EAAA,CAAA,WAAA;gCACrE,KAAA,2BAAO,QAAA,6DAAA;4BACT,EAAA,OAASiB,GAAAA,kBAAAA,MAAK,QAAA,cAALA,6BAAAA,GAAK,eAAA;gCACZzT,QAAQC,IAAA,CAAK,GAA4B6T,OAAzBb,KAAG,uBAA2B,OAALa,OAAK,MAAKL;4BACnD,OAAO,eAAA,GAAA;4BAAA,mBAAA,QAAA,eAAA;wBAAA,IAAA,CAAA;;;;IAEX;;ALulCA,SAAA,gBAAA,UAAA,EAAA,CAAsC,MAAA,EAAA,IAAA;IM5rCtC,EAAMS,sBAAsB;IAC5B,EAAMC,UAAAA,UAAuB,OAAA,YAAA,UAAA;AAC7B,IAAMC,oBAAuB;AAC7B,IAAMC,KAAAA,QAAuB;wCAAA,UAAA;YAAA,SAGvBC,aASCC;;;;;oBAZsB,UAAA,oEAAA,CAAA;oBAC7B,EAAMC,EAAAA,CAAAA,WAAAA,EAAgB,WAAA;;;;;;;;;;;oBAEhBF;;wBAA0B,uBAAA,SAAA;4BACnBG,UAAAA,YAAwB;4BAE/BC,UAAAA,KAAsB;wBACtBC,mBAAsB;;;oBAJtBL,cAAAA;oBAKAM,gBAAAA,MAAsB,MAAA,WAAA;wBAExBL,MAAAA;4BAAAA;;oBACJ,KAASM;;;;;;oBACFN,eAAiBA,kBAAkBO;oBACxC,OAAOP,CAAAA,KAAAA,CACT,gEAEA,GAASQ;;;;;;;;;;;IAGT;;AAEA,SAASC;wCAAAA,UAAAA,EAAAA,YAAAA;YAAAA,SAMAd;;;;;oBANAc,UAAAA,oEAAAA,CAAAA;;;;;;;;;;;wBAEDC,GAAKC,UAAUC,CAAAA,QAAA,IAAA,SAAA;4BACrB,EAAI,QAAA,4BAAoCC,IAAA,CAAKH,KAAK,OAAOd;4BACzD,EAAI,SAAA,QAAiBiB,IAAA,CAAKH,KAA2B,IAAA,GAAOb;wBAC5D,IAAI,QAAQgB,IAAA,CAAKH,KAAoC,OAAOZ;;;oBAH5D,IAAMY;;;;;;;oBAKR,QAAA,KAAA,CAEMI,uBAAyB,sCAC7B;;;;;;;;;;;QAGA;;IACA,KAAA;wCAAA,UAAA,EAAA,YAAA;YAAA,SAMF;;;;;oBANE,UAAA,oEAAA,CAAA;;;;;;;;;;;wBAEA,cAAA,YAAA,SAAA;4BACA,UAAA;4BACA,WAAA,aAAA,SAAA;wBACA;;;oBAHA;;;;;;oBAIF;oBAEMC,QAAAA,KAAAA,CAA4B,KAAT,aAAA,GAAA,IAAIlI,IAAI,gCAAS;;;;;;;;;;;YAwBlCmI;;IArBN,IAAMC,CAAAA,SAAiBC;wCAAAA,UAAAA,EAAAA,gBAAAA;YAAAA,SAIjBC,SACJF,KAsCuBG,cAAAA;;;;;oBA3CFF,UAAAA,oEAAAA,CAAAA;sBACvB,EAAA,CAAA,CAAMG,UAAAA,OAAiBC,MAAAA;;;;;;;;;;;oBAIrBL;;wBAAAA,GAAcE,QAAA,IACdI,QAAAA,SAAAA,OACAF,eAAeF,QAAA,IACdK,CAAAA,MAAMH,eAAeI,eAAA,KAAoB,OAAOnB,sBAAsB,KAAA,CAAA;4BACzE,EAAMc,SAAAA,MACJH,WAAAA,GAAcG,MAAAA,MAAA,IACdM,iBAAiB,mBACjBA,iBAAiB,aACjBL,eAAeD,YAAA,IACfO,uBACCH,CAAAA,KAAK,WAAW,KAAA,CAAA;wBACnB,IAAMR,cAAcC,cAAcE,QAAA,GAC9BF,cAAcQ,eAAA,GACdJ,eAAeI,eAAA;;;oBAdbN,cACJF;oBAcF,IAAMQ,YAAAA,MACJN,MAAAA,MAAY,OAAA,CACRH,OAAAA,wBAAAA,yBAAAA,cAAeY,yCAAfZ,kBAAAA,OAA8C,QAC9C,KAAA;oBAEN,IAAIa,OAAO,KAAA,YAAA,eAAA;0BACT,IAAA,GAAO;gCACLA,OAAO;kCACPC,SAAAA,GACEb,SAAAA,KAAca,IAAAA,MAAA,IACdJ,iBAAiB,iBAChBF,CAAAA,KAAKnB,sBAAsB0B,wBAAA;kCAC9BC,OACEf,QAAAA,MAAce,KAAA,IACdN,iBAAiB,YACjBA,iBAAiB,WAChBF,CAAAA,KAAKrB,iBAAiBM,iBAAgB;kCACzCwB,MAAAA,GACEhB,cAAcgB,KAAAA,EAAA,IACdP,iBAAiB,cACjBA,iBAAiB,SAChBF,CAAAA,KAAKpB,mBAAmBH,aAAA;kCAC3B7V,UAAAA,CAAW8X,gBAAAA,SAAAA;+BACPf,WAAW;;wBAAW,IAAI,CAAC,GAC3BC,eAAe;;;;;;;wBAAe,IAAI,CAAC,GACnCK,CAAAA,OAA4BA,WAAT,MAASA,CAAF,2CAAkB,IAAI,CAAC;;;;;;;;;;;QAGzD;;IAEA,KAAO,EAAA;wCAAA,UAAA;YAAA,SAAA,OAEYN,QAAAA,OACIC,WAAAA;;;;;oBAHhB,UAAA,oEAAA,CAAA,GAAA,QAAA,oEAAA,CAAA;0BACLS,OAAO,GAAA,aAAA;;;;;;;;;;;oBACUV;;wBAAAA,uBAAAA,SAAAA;;;oBAAAA,gBAAAA;oBAAS,IAAI,CAAC,GAC3BC,QAAAA,OAAe,KAAA,aAAA;;;;;;oBAAEA;oBAAa,IAAI,CAAC,GACnCK,KAAAA,CAAAA,aAAmB,OAAO,gCAAA;;;;;;;;;;;QAAkB,IAAI,CAAC;;AAIlD,SAASE,gBAAAA;IACd,IAAI,CAAA,MAAOhB,cAAc,aAAa;UACpC,KAAA,EAAO,KAAA,aAAA,aAAA;QACT;MAEA,IAAMD,KAAKC,UAAUC,SAAA;kDACrB;yCACI,IAAA,KAAiBC,IAAA,CAAKH,KAAK,OAAO;;;YACtC,EAAI,EAAA,CAAA,MAAA,GAAA,QAAoBG,IAAA,CAAKH,GAAAA,EAAK,EAAA,KAAO;YACzC,EAAI,EAAA,OAAA,SAAA,IAAsBG,IAAA,CAAKH,CAAAA,IAAK,OAAO;gBACvC,IAAA,CAAA,gBAAA,CAAA,cAAoCG,IAAA,CAAKH,KAAK,OAAO;YACzD,EAAI,KAAA,IAAA,QAAqBG,IAArB,AAAqB,CAAKH,KAAK,OAAO,mBAAA;gBACtC,KAAA,OAAA,CAAA,SAAA,MAAoBG,CAAAA,GAAA,CAAKH,KAAK,OAAO;oBACzC,CAAO,KAAA,CAAA,KAAA,CAAA,KAAA;gBACT;YAEO,GAASyB,yBACdC,OAAA,EACAC,WAAA;;;;;gCAGA,IAAMC,MAAMF,OAAAA,CAAQ5T,IAAAA,OAAA;;oBACpB,EAAM+T,EAAAA,MAAUF,OAAAA,KAAY7T,CAAAA,UAAA,CAAA,OAAA,MAAA,KAAA,CAAA,KAAA;oBAC5B,EAAI8T,EAAAA,CAAAA,KAAQC,OAAAA,EAAS,OAAO;oBAC5B,KAAOxB,MAAAA,KAAAA,CAAAA,KAAiBnJ,GAAA,CAAI0K,GAAAA,CAAAA,SAAAA,GAAQvB,iBAAiBnJ,GAAA,CAAI2K;wBAC3D,IAAA,gCAAA,MAAA,KAAA,CAAA,UAAA,MAAA,iBAAA,QAAA;wBAEO,CAASC,GAAAA,KAAAA;4BACRvB,IAAAA,QAAgBC,KAAAA,MAAAA,sBAAAA,CAAAA;4BAChBG,IAAAA,SAAiBC,MAAAA,QAAAA,MAAAA,sBAAAA,CAAAA,SAAAA;4BACjBH,MAAAA,IACJF,EAAAA,CAAAA,WAAcE,CAAAA,OAAA,IACdI,wBACAF,eAAeF,QAAA;wBAEb,CAACA,YAAYsB,mBAAmBtB,aAAauB,aAAavB,WAAW;sBACvE,OAAO,KAAA;gBACT;;;;gCAEA,OAAOA,gBAAAA,GAAAA;oBACT,IAAA;wBAEO,CAASwB,MAAAA,gBAAsBC,GAAAA,IAAAA,GAAA,IAAA,CAAA,OAAA;oBACpC,EAAI,OAAOzI,GAAAA,QAAW,aAAa;wBACjC,OAAO,KAAA;oBACT;gBAEA,IAAMG,WAAWuI,iBAAiBD;;;;gCAClC,IAAItI,GAAAA,IAAAA,EAAAA,CAAU,IAAA;sBACZwI,EAAAA,SAAAA,IAAAA,CAAkBF,MAAAA,CAAAA,GAAAA,CAAAA,CAAYtI,QAAAA,EAAAA;sBAC9B,KAAA,EAAOA,EAAAA,CAAAA,OAAAA;oBACT,IAAA,CAAA,MAAA,CAAA,GAAA,CAAA,MAAA;gBAEA,IAAMzI,KAAK0O;;;;gCACXuC,QAAAA,IAAAA,OAAkBF,YAAY/Q;oBAC9B,IAAA,CAAOA,MAAAA,CAAAA,MAAAA,CAAAA;gBACT;;;gBAEA,KAAA;uBAAA,SAAA,IAAA,CAASqQ,GAAAA;oBACP,EAAM5H,EAAAA,OAAWuI,EAAAA,IAAAA,CAAAA,MAAAA,CAAAA,GAAiB9C,CAAAA;oBAClC,EAAIzF,KAAAA,KAAU,KAAA,OAAA,MAAA,GAAA,KAAA,MAAA,CAAA,EAAA,KAAA,KAAA,IAAA,MAAA,CAAA,EAAA,GAAA;oBACZwI,kBAAkB/C,yBAAyBzF;;;;oCAC3C,GAAA,IAAOA;oBACT,OAAA,IAAA,CAAA,MAAA,CAAA,GAAA,CAAA,SAAA,EAAA;gBAEA,IAAMlQ,YAAYmW;;;;gCAClBuC,IAAAA,IAAAA,UAAkB/C,yBAAyB3V;oBAC3C,KAAOA,EAAAA,IAAAA,CAAAA,MAAAA,CAAAA,GAAAA,CAAAA;gBACT;;;gBAEA,KAAA;uBAAA,SAAA,IAAA,CAASyY,GAAAA,EAAAA,KAAAA,OAAiBD,UAAA;oBACxB,IAAA,CAAOlB,MAAAA,CAAAA,GAAAA,CAAAA,MAAiBkB;wBAAAA,OAAAA;qBAAeG,WAAWH;gBACpD;;;gBAEA,KAAA;uBAAA,SAAA,KAASE,GAAAA,QAAAA,OAAkBF,UAAA,EAAoBra,KAAA;;oBAC7C,EAAI,EAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,QAAA;4BACF4R,GAAAA,OAAAA,CAAAA,SAAAA;4BAAAA,SAAAA,OAAAA,MAAAA,OAAO6I,YAAA,cAAP7I,2CAAAA,qBAAqB8I,OAAA,CAAQL,YAAYra;wBAC3C,aAAQ,CAAC;oBACT2a,UAAYN,YAAYra;gBAC1B;;;gBAEM4a,+BAA+B,KAAK,KAAK,KAAK,MAAM;;oBAE1D,GAASJ,CAAAA,QAAWtb,EAAAA,EAAA;oBAClB,EAAI,EAAA,CAAA,IAAOmM,EAAAA,CAAAA,OAAAA,CAAAA,SAAAA,CAAa,OAAA,MAAa;wBACnC,OAAO,KAAA,EAAA,CAAA,SAAA;4BACT,MAAA,IAAA,CAAA,GAAA,OAAA,mBAAA,MAAA,KAAA,OAAA,mBAAA;wBAEI;sBACF,IAAMwP,SAASjG,mBAAmB1V,QAAQ;sBAC1C,IAAM4b,CAAAA,MAAAA,CAAQzP,GAAAA,CAAAA,KAAS0P,MAAA,GAAS1P,SAAS0P,MAAA,CAAOjS,KAAA,CAAM,OAAO,EAAC;wBAC9D,kCAAA,2BAAA;;;eArFE,QAAQwP,IAAA,CAAKH,KAAK,OAAO;;cAqF3B,QAAA,IAAA,GAAA,KAAmB2C,0BAAnB,SAAA,6BAAA,QAAA,yBAAA,iCAA0B;gBAA1B,IAAWE,OAAX;gBACE,IAAMC,QAAQD,KAAK3T,IAAA;kBACnB,IAAI4T,MAAM9U,GAAAA,OAAA,CAAW0U,KAAAA,IAAS;wBAC5B,OAAOK,mBAAmBD,MAAM3E,KAAA,CAAMuE,OAAOlX,MAAM,MAAM,KAAA;kBAC3D;;qBACF;;kBALA,OAAA,GAAA;;;;;;;kCAAA,CAAA,IAAA,IAAA,MAAA,EAAA,IAAA,OAAA;oCAAA,GAAA,IAAA,UAAA,CAAA;;;oCAAA,UAAA,MAAA;4CAAA,YAAA,GAAA,MAAA,WAAA;;4DAMF,MAAA,GAAQ,CAAC,QAAA,IAAA,IAEF,IAAA,EAAA,WAAA;wBAGT,CAASgX,MAAAA,MAAYzb,IAAA,EAAcc,KAAA;4BAC7B,KAAOqL,aAAa,aAAa;4BACnC,WAAA,QAAA,CAAA,CAAA,WAAA,IAAA,KAAA,KAAA,IAAA,UAAA,CAAA,KAAA,IAAA;4BACF,KAAA,IAAA,CAEI,MAAA,YAAA,IACFA,KAAS0P,CAAAA,KAAA,GACPnG,IAAAA,KAAAA,IAMJ,MANuB1V,AAMvB,GAAQ,CAAC,IALL,IAKK,EAJL0V,EAIK,IACX,MAAA,OALyB5U,IAKzB,KAJM,qBACA4a,+BACA;wBAoBSO,SACAA;oBAhBb,EAAI,OAAOC,WAAW,eAAe,OAAOA,OAAOC,UAAA,KAAe,YAAY;sBAC5E,KAAA,EAAOD,EAAAA,KAAOC,MAAAA,IAAA;gBAChB;;;;;MAGA,IAAI,CAAA,MAAOD,KAAAA,GAAAA,GAAW,eAAe,OAAOA,OAAOE,eAAA,KAAoB,YAAY;QACjFF,OAAOE,eAAA,CAAgBH;IACzB,KAAA,EAAO;UACL,IAAII,CAAAA,MAAOnY,KAAKC,CAAAA,EAAA,KAAQrC,KAAKwa,GAAAA,CAAAA,CAAA,CAAMC,MAAAA,SAAAA,CAAAA,GAAmB,IAAA,EAAA;YACtD,IAAA,IAASC,IAAI,CAAA,CAAA,CAAGA,IAAI,EAAA,EAAIA,CAAAA,GAAK,MAAA,QAAA;gBAC3BH,OAAQA,OAAO,IAAA,CAAA,QAAa,GAAA,KAAS;kBACrCJ,CAAAA,IAAA,CAAMO,EAAC,EAAA,CAAA,AAAKH,AACd,CADcA,OAAOva,CACrB,IAD0Bwa,KAAA,CAAMxa,KAAKsC,MAAA,KAAW,IAAG,IAAK;uBACxD,YAAA,OAAA,CAAA,YAAA,IAAA,CAAA;2BAAA;;eACF,SAAA;uBAAA,YAAA,OAAA,CAAA,YAAA,IAAA,CAAA;oBAEM,EAAC,GAAA,CAAA,CAAM6X,UAAAA,KAAA,CAAM,EAAC,cAAPA,qBAAAA,UAAY,KAAK,KAAQ;gBACtCA,CAAA,CAAM,EAAC,GAAA,EAAMA,WAAAA,KAAA,CAAM,EAAC,cAAPA,sBAAAA,WAAY,KAAK,KAAQ;;QAGtC,IAAA,IAASO,KAAI,GAAGA,KAAI,IAAIA,KAAK;cACnBP;QAARQ,OAAA,EAAQR,WAAAA,KAAA,CAAMO,GAAC,cAAPP,sBAAAA,WAAY,GAAG5X,QAAA,CAAS,IAAIqY,QAAA,CAAS,GAAG;IAClD,KAAA;MAEA,EAAA,KACED,EAAAA,EAAIrF,KAAA,CAAM,GAAG,EAAA,GACb,EAAA,IACAqF,IAAIrF,IAAAA,CAAA,CAAM,GAAG,MACb,MACAqF,IAAIrF,KAAA,CAAM,IAAI,MACd,MACAqF,IAAIrF,KAAA,CAAM,IAAI,MACd,MACAqF,IAAIrF,KAAA,CAAM,IAAI;QAElB,OAAA,MAAA,GAAA,SAAA,MAAA;YAAA,IAAA,IAAA,OAAA,UAAA,QAAA,UAAA,UAAA,OAAA,IAAA,OAAA,QAAA,OAAA,GAAA,OAAA,MAAA;gBAAA,QAAA,OAAA,KAAA,SAAA,CAAA,KAAA;;YAEA,GAASmF,CAAAA,UAAAA,MAAAA;gBACH,MAAA,IAAA,UAAA;cACF,IAAI,OAAOI,gBAAgB,eAAe,OAAOA,YAAYxY,GAAA,KAAQ,YAAY;gBAC/E,KAAA,EAAOwY,KAAAA,OAAYxY,GAAA;cACrB,EAAA,IAAA,IAAA,GAAA,IAAA,QAAA,MAAA,EAAA,IAAA;gBACF,IAAA,OAAQ,CAAC,KAAA,OAAA,CAAA,EAAA;gBACT,GAAO,CAAA,cAAA,MAAA;oBACT,IAAA,IAAA,WAAA,WAAA;wBAES0V,IAAAA,OAAAA,SAAAA,CAAAA,cAAAA,CAAAA,IAAAA,CAAAA,YAAAA,UAAAA;4BAKH,CAAOnH,CAAAA,CAAAA,QAAAA,CAAW,EAAA,UAAA,CAAa,OAAO,CAAC;wBAEvC;sBACcA;gBAAhB,IAAMkK,UAAUlK,kBAAAA,OAAemK,OAAA,cAAfnK,sCAAAA,gBAAwBkK,MAAA;cACxC,IAAIA,QAAQ;kBACV,CAAA,GAAME,OACJ,OAAOF,OAAOG,OAAA,KAAY,aAAaH,OAAOG,OAAA,KAAYH,OAAOE,IAAA;gBACnE,IAAI,OAAOA,SAAS,YAAYA,QAAQ,CAAC9B,mBAAmB8B,OAAO;kBACjE,IAAME,MACJ,OAAOJ,OAAOK,YAAA,KAAiB,aAC3BL,OAAOK,YAAA,KACP,KAAA;gBACN,OAAO;oBACLvD,UAAUoD;sBACVnD,cAAc;uBACV,OAAOqD,QAAQ,CAAA,EAAA,KAAA,EAAA,EAAY,KAAA;wBAAEhD,OAAAA,UAAiBgD;sBAAI,IAAI,CAAC,EAAA,MAAA;oBAE/D,EAAA,IAAA,UAAA;cACF;YACF,IAAA,MAAA,GAAQ,CAAC,EAAA,MAAA,KAAA;YAET,EAAI,EAAA,SAAA,IAAA,MAAA;cACF,EAAA,CAAME,GAAAA,IAAAA,GAAAA,CAAYxK,GAAAA,IAAewK,CAAAA,IAAAA,EAAA;gBACjC,IAAIA,OAAAA,GAAU;0BAINA,CAAAA,EAAAA,GAAAA,MAAAA,IAAAA,CAAAA,SAAAA,KAAAA,CAAAA,EAAAA,EAAAA;oBAHN,GAAA,CAAMC,SACJ,OAAOD,SAASE,MAAA,KAAW,aACvBF,SAASE,MAAA,MACTF,mBAAAA,SAASC,MAAA,cAATD,8BAAAA,mBAAmBA,SAASE,MAAA;sBAClC,IAAI,CAAA,EAAA,GAAA,CAAOD,IAAAA,CAAAA,EAAAA,IAAW,YAAYA,QAAQ;wBACxC,IAAIlC,aAAakC,SAAS;0BACxB,OAAO;8BAAExD,cAAc;4BAAUK,iBAAiB;sBAAK;gBACzD;gBACA,IAAI,CAACgB,mBAAmBmC,SAAS;sBAC/B,GAAA,CAAA,GAAO,OAAA,EAAA;4BAAEzD,OAAAA,GAAUyD,SAAAA,MAAAA,EAAAA,GAAAA;8BAAQxD,EAAAA,IAAAA,IAAAA,CAAAA,GAAc;8BAAUK,GAAAA,CAAAA,KAAAA,MAAAA,EAAiB,KAAA,MAAA,MAAA;wBAAM;kBAC5E;YACF;QACF,CAAA;MACF,EAAA,CAAA,OAAA,OAAQ,CAAC,CAAA,CAAA,QAAA,EAAA;QAET,IAAI,GAAA,SAAA,CAAA,QAAA,GAAA,SAAA,MAAA,EAAA,MAAA;cACF,EAAA,EAAMqD,OAAQ3K,EAAAA,KAAe4K,IAAA,CAAA,SAAA,IAAA,CAAA,MAAA,EAAA;gBAC7B,IAAID,KAAAA,CAAM,GAAA,CAAA,MAAA;kBACR,IAAME,OACJ,OAAOF,KAAKG,oBAAA,KAAyB,aACjCH,KAAKG,oBAAA,KACLH,KAAKE,IAAA;kBACX,CAAA,GAAI,CAAA,CAAA,KAAOA,IAAAA,CAAAA,IAAS,KAAA,OAAYA,MAAAA,EAAQ,CAACvC,WAAAA,QAAmBuC,OAAO;oBACjE,OAAO;sBAAE7D,UAAU6D;oBAAM5D,cAAc;oBAAQK,iBAAiB;kBAAM,OAAA,CAAA,QAAA,EAAA;gBACxE,QAAA,CAAA,QAAA,GAAA,SAAA,MAAA,EAAA,KAAA;cACF,EAAA,OAAA,UAAA,UAAA;gBACF,QAAA,KAAQ,CAAC;YAET,KAAO,CAAC;YACV,IAAA,QAAA,OAAA,MAAA,GAAA,IAAA,CAAA,MAAA,EAAA;gBAEMyD,OAAAA,aAA6C,aAAA,GAAA,IAAIrM,IAAI;YACzD;YACA,OAAA,IAAA,CAAA,OAAA,CAAA,QAAA,WAAA,CAAA;QACD;IAED,OAAS4J,mBAAmBla,KAAA;IAC1B,IAAM4c,IAAI5c,MAAMqH,IAAA;IAChB,KAAA,EAAO,CAACuV,KACN,qCAAqCtE,IAAA,CAAKsE,MAC1C,oDAAoDtE,IAAA,CAAKsE,MACzDD,sBAAsBtN,GAAA,CAAIuN,EAAE3W,WAAA;IAChC;IAEA,OAASkU,aAAana,KAAA;MACpB,OAAO2c,sBAAsBtN,GAAA,CAAIrP,MAAMqH,IAAA,GAAOpB,WAAA;IAChD;IAEA,OAAS0S;MAQP,IAAI,OAAO/G,WAAW,aAAa;UACjC,OAAO,CAAC;MACV;IAEA,IAAMiL,aAAa;QAEhBjL,OAAekL,WAAAA,OAAA;QACflL,OAAemL,aAAA,GAAA;QACfnL,OAAeoL,MAAA,QAAA;QACfpL,OAAeqL,OAAA;QACfrL,OAAesL,KAAA,SAAA;UACftL,OAAeuL,KAAA;UACfvL,OAAewL,MAAA;OAClB,CAAEC,MAAA,CAAOC;UAET,kCAAA,2BAAA;;UAAA,QAAA,YAAqBT,+BAArB,SAAA,6BAAA,QAAA,yBAAA,iCAAiC;cAAjC,IAAWnV,SAAX;cACE,IAAM6R,aACJgE,gBAAgB7V,QAAQ;kBAAC;kBAAc;kBAAO;gBAAY;aAAe,KACzE,KAAA,gBAAA;;gBACF,CAAA,GAAM+R,QACJ8D;QAAAA,UAAAA,SAAAA,SAAAA,EAAgB7V;mBAAAA,EAAQ,EAAA,QAAA;;IAAA;;oBAAC;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,QAAA;;IAAA;;oBAAS;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,QAAA;;IAAA;;oBAAQ;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,QAAA;;IAAA;;oBAAiB;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,YAAA;;IAAA;;iBAAc,KACzE,KAAA;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,QAAA;;IAAA;;gBACF,CAAA,GAAMgS,UACJ6D;QAAAA,MAAgB7V,IAAAA,SAAhB6V,SAAgB7V,GAAQ;mBAAA,IAAA,QAAA;;IAAA;;oBAAC;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,YAAA;;IAAA;;oBAAW;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,QAAA;;IAAA;;oBAAM;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,eAAA,IAAA,OAAA,IAAA,eAAA,GAAA,MAAA,MAAA,KAAA;;IAAA;;iBAAkB,KAAK,KAAA;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,YAAA;;IAAA;;gBACnE,CAAA,GAAMkR,WACJ2E;QAAAA,UAAgB7V,SAAhB6V,MAAgB7V,GAAAA,GAAQ;mBAAA,IAAA,QAAA;;IAAA;;oBACtB;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,eAAA,IAAA,OAAA,IAAA,eAAA,GAAA,MAAA,MAAA,KAAA;;IAAA;;oBACA;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,KAAA;;IAAA;;oBACA;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,OAAA;;IAAA;;oBACA;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,SAAA;;IAAA;;oBACA;QAAA,UAAA,SAAA,SAAA;mBAAA,IAAA,UAAA;;IAAA;gBACA;gBACA,aAAA,KAAA;kBACA,KAAA,OAAA;gBACA,EAAA,MAAA,IAAA;kBACA,OAAA;kBACA,eAAA,IAAA,CAAA,UAAA,OAAA;eACD,KAAK,KAAA,sCAAA,IAAA,CAAA;YAER,IAAI,CAAC6R,cAAc,CAACX,YAAY,CAACa,SAAS,CAACC,SAAS;YAEpD,IAAMb,eACJ0E,gBAAgB7V,QAAQ;kBACtB,QAAA,eAAA,OAAA,eAAA,EAAA;oBACA;gBAGI0R,OAAAA;oBAFJ,EAAA,IAAA,YAAA;sBACA,YAAA,CAAA;iBACD,KAAKA,EAAAA,EAAAA,QAAAA,GAAAA,CAAAA,EAAAA,cAAAA,mBAAAA,QAAAA,KAAAA,UAAAA,CAAAA,EAAAA,SAAAA,GAAAA,CAAAA,EAAAA,cAAAA,oBAAAA,SAAAA,KAAAA,OAAAA;kBACR,IAAMF,EAAAA,GAAAA,aAAkBsE,kBAAkB9V,QAAQ;wBAChD,MAAA;sBACA;6BACA,SACA;eACD;cAED,IAAA,GAAO,EAAA,KAAA,CAAA,KAAA,MACD6R,KAAAA,OAAAA,CAAa,eAAA,IAAA;gBAAEA,YAAAA;YAAW,IAAI,CAAC,GAC/BE,QAAQ,WAAA,OAAA,EAAA,GAAA;kBAAEA,OAAAA;;;4BACA,0DADM,mGACN;2CADM,sBAAA,CAAI,CAAC,GACrBC,IAAAA,uBAAAA,MAAU;sBAAEA,EAAAA,OAAAA,EAAAA;oBAAQ,IAAI,CAAC,GACzBd,KAAAA,MAAW,IAAA,IAAA;0BAAEA,OAAAA,CAAAA,EAAAA,OAAAA,mBAAAA;oBAAS,IAAI,CAAC,GAC3BA,YAAYC,eAAe;sBAAEA,cAAAA;;;;;;;;;;;;;;;cAAa,IAAI,CAAC,GAC/CD,YAAYM,mBAAmB,OAAO;gBAAEA,iBAAAA;YAAgB,IAAI,CAAC,kBAAA,MAAA,EAAA,GAAA;QAErE;QAAA,aAAA,gBAAA,IAAA,QAAA,cAAA,oCAAA,cAAA,IAAA;;QAhDA,UAAA,OAAA,GAAA,CAAA;QAAA,UAAA,OAAA,GAAA,CAAA;;;mBAAA,6BAAA;oBAAA,OAAA;;;oBAAA;wBAAA;;;;QAkDA,OAAO,CAAC,KAAA,CAAA;QACV,OAAA,MAAA,CAAA;QAEA,KAASqE,EAAAA,MAAAA,CAAAA,OAAgB7V,MAAA,EAAaC,IAAA;YACpC,kCAAA,2BAAA;;UAAA,QAAA,IAAA,QAAkBA,yBAAlB,SAAA,6BAAA,QAAA,yBAAA,iCAAwB;gBAAxB,IAAWjI,MAAX,MAAA,YAAA,aAAA;kBACE,CAAA,GAAMM,CAAAA,OAAQ0H,GAAAA,gBAAAA,6BAAAA,MAAA,CAAShI,IAAG;gBAC1B,IAAI,OAAOM,UAAU,YAAYA,OAAO;oBACtC,OAAOA,KAAAA,SAAAA;kBACT,CAAA,GAAA,CAAA,UAAA,qBAAA,sBAAA,WAAA;gBACA,IAAI,OAAOA,UAAU,YAAY;oBAC/B,IAAI;sBACF,IAAMyd,SAASzd,MAAML,IAAA,CAAK+H;sBAC1B,IAAI,OAAO+V,WAAW,YAAYA,QAAQ;0BACxC,OAAOA;sBACT;gBACF,EAAA,eAAQ,CAAC;YACX,wBAAA,MAAA,EAAA,OAAA;QACF,WAAA,EAAA;;YAbA,CAAA,OAAA,uBAAA,IAAA,CAAA,MAAA;cAAA,OAAA,IAAA,CAAA;;;mBAAA,QAAA,QAAA,CAAA,MAAA,MAAA;;;gCAAA,QAAA,KAAA,CAAA,KAAA,KAAA,CAAA,+HAAA;qBAAA;;;0BAAA,GAAA,CAAA,QAAA,IAAA,OAAA,UAAA;8BAAA;;;;;;;;;;;;;;;;;;;;;UAcA,OAAO,KAAA;;;;;;;;;;;;;;;AACT;AAEA,SAASD,kBAAkB9V,EAAAA,GAAAA,CAAA,EAAaC,IAAA;UACtC,IAAA,OAAA,uBAAA,2BAAA;;YAAA,MAAA,IAAA,IAAA,IAAkBA,yBAAlB,SAAA,6BAAA,QAAA,yBAAA,iCAAwB;cAAxB,IAAWjI,IAAAA,EAAX,EAAA,YAAA,CAAA,GAAA,CAAA;gBACE,IAAMM,IAAAA,IAAQ0H,EAAAA,iBAAAA,6BAAAA,MAAA,CAAShI,IAAG;gBAC1B,IAAMge,aAAaC,CAAAA,EAAAA,cAAiB3d;kBACpC,IAAI0d,MAAAA,CAAAA,OAAc,CAAA,SAAA,IAAM,IAAA;wBACtB,GAAA,IAAOA,mBAAAA,IAAAA,CAAAA,MAAAA;sBACT,cAAA,IAAA,CAAA,IAAA,IAAA;oBACA,IAAI,OAAO1d,UAAU,YAAY;sBAC/B,IAAI;0BACF,IAAMyd,EAAAA,MAAAA,CAASE,EAAAA,GAAAA,YAAiB3d,MAAML,IAAA,CAAK+H;0BAC3C,IAAI+V,MAAAA;oBAAAA,GAAU,KAAA,CAAM,MAAA;iBAAA,CAAhBA,OAAgB,qBAAA,kBAAA,MAAA,CAAA,SAAA,IAAA,CAAA;gCAClB,CAAA,MAAOA,CAAAA,CAAAA,SAAAA,QAAAA;8BACT,CAAA,uBAAA,IAAA,CAAA,MAAA;4BACF,EAAA,UAAA,CAAA,IAAQ,CAAC,CAAA,CAAA;sBACX;gBACF;;gBAdA,OAAA,IAAA,QAAA,GAAA,OAAA,CAAA;;;uBAAA,6BAAA;oBAAA;;;2BAAA;0BAAA;;;;MAeA,EAAA,GAAO,KAAA,MAAA,8BAAA,SAAA;IACT,IAAA;IAEA,IAAA,GAASzE;YACP,EAAA,IAAA,IAAA,oBAAA,IAAA,2BAAA;;YAAA,GAAA,KAAA,YAAkBT,SAAAA,aAAAA,IAAAA,UAAAA,OAAlB,SAAA,6BAAA,QAAA,yBAAA,iCAA0C;cAA1C,IAAW7Y,MAAX;YACE,IAAMM,CAAAA,IAAAA,GAAQmZ,SAAAA,QAAiBzZ;cAC/B,IAAIM,OAAO,MAAA,QAAA,IAAA,OAAA;kBACT,OAAOA,IAAAA,IAAAA,UAAAA;cACT,CAAA,QAAA,IAAA,gBAAA;UACF,EAAA,KAAA,EAAA;;;;;kBALA,KAAA,MAAA,CAAA;gBAAA;;;;;;;;;;;;;;;;;qBAAA,KAAA,OAAA,IAAA,GAAA,UAAA;kBAAA;;;oBAAA,CAAA,CAAA;0BAAA;;;;QAMA,IAAA,GAAO,CAAA,IAAA,YAAA,IAAA,MAAA;YACT,OAAA,GAAA,CAAA,QAAA,OAAA,KAAA,GAAA,CAAA,GAAA,KAAA,KAAA,CAAA,IAAA,gBAAA;QAEA,KAASmZ,iBAAiBzZ,GAAA;QACxB,IAAI,IAAA,GAAOkS,MAAAA,IAAAA,CAAW,KAAA,QAAa;cACjC,KAAA,EAAO,CAAA,CAAA,GAAA,KAAA,OAAA,KAAA,GAAA,CAAA,GAAA,KAAA,KAAA,CAAA,IAAA,SAAA;QACT;MAEA,IAAI,CAAA,IAAA,IAAA,UAAA,IAAA,MAAA;gBACYA,EAAAA,CAAAA,QAAAA,OAAAA,IAAAA,UAAAA;UAAd,IAAM5R,SAAQ4R,uBAAAA,OAAO6I,YAAA,cAAP7I,2CAAAA,qBAAqBgM,OAAA,CAAQle;QAC3C,OAAOM,MAAAA,GAAS,CAAA,IAAA,MAAA,IAAA,IAAA,OAAA;MAClB,EAAA,YAAA,GAAQ;YACN,GAAA,GAAA,CAAO,KAAA,EAAA;QACT,IAAA,CAAA,IAAA,KAAA,EAAA;YACF,OAAA,GAAA,CAAA,mBAAA;QAEA,KAASqZ;MACP,KAAA,EAAOsE,iBACLxE,iBAAiB,sBACfA,iBAAiB,wBACjBA,iBAAiB;QAEvB,IAAA,cAAA,OAAA,GAAA,CAAA,UAAA;QAEA,IAAA,CAASwE,eAAAA,EAAiB3d,EAAAA,CAAAA,EAAA,YAAA;YACxB,EAAI,KAAA,EAAOA,IAAAA,CAAAA,KAAU,WAAW;cAC9B,KAAA,EAAOA,IAAAA,CAAAA;QACT;MACA,IAAI,OAAOA,UAAU,UAAU;UAC7B,EAAA,KAAOA,UAAU,IAAA,MAAA;QACnB,OAAA,GAAA,CAAA,UAAA,IAAA,eAAA,GAAA,MAAA;MACA,IAAI,OAAOA,UAAU,UAAU;UAC7B,EAAA,EAAM0d,YAAAA,CAAa1d,GAAAA,GAAMiG,GAAAA,QAAA;YACzB,GAAA,CAAIyX,EAAAA,CAAAA,OAAAA,IAAAA,CAAe,OAAOA,MAAAA,GAAAA,MAAe,GAAA,OAAUA,eAAe,OAAO;cACvE,OAAO;UACT,EAAA,KAAA,EAAA;YACA,GAAA,CAAIA,EAAAA,CAAAA,QAAAA,IAAe,KAAA,EAAOA,eAAe,WAAWA,eAAe,MAAM;cACvE,OAAO;UACT,EAAA,OAAA,EAAA;QACF,2BAAA,QAAA,IAAA,OAAA;QACA,OAAO,GAAA,CAAA,CAAA,KAAA,IAAA,OAAA;IACT;IN8jCA,IAAA,IAAA,SAAA,EAAA,GAAwB;QOrjDpBG,OAAAA,GAAAA,CAAAA,OAAiC,IAAA,SAAA;IAE9B,OAASC,sBACdC,MAAA;MAEA,EAAA,EAAMC,EAAAA,QAAkC,CAAC,KAAA,IAAA,MAAA;QACzC,IAAID,GAAAA,GAAAA,CAAOE,OAAAA,MAAA,CAAA,CAAe,GAAA,cAAA;UACxBD,CAAAA,IAAAA,GAAQC,CAAAA,KAAAA,EAAAA,KAAA,GAAgB;QAC1B,OAAA,GAAA,CAAA,OAAA;MACA,IAAIF,OAAOG,YAAA,KAAiB,KAAA,GAAW;UACrCF,QAAQG,YAAAA,GAAA,GAAkBJ,EAAAA,KAAOG,YAAA,GAAe,SAAS;MAC3D,EAAA,CAAA,IAAA,KAAA,EAAA;QACA,IAAA,CAAOF,SAAAA,IAAAA,OAAAA;QACT,IAAA,CAAA,oBAAA,8BAAA,QAAA,IAAA,KAAA,MAAA;YAEO,GAASI,IAAAA,GAAAA,CAAAA,QAAAA,QAAAA,IAAAA;YASLC,SACCA,UACIA,UACCA,UACCA,qBAAAA,UACFA,UAwHVzM,SAA6BA,UAO/BA,4BAAAA,gBAsBWwG;QAlKb,IAAMD,KAAKC,sDAAAA,MAAUC,KAAAA,KAAA,MAAA;YACrB,EAAMiG,KAAAA,GAAAA,CAAAA,EAAWlG,UAAUkG,IAAAA,IAAA,IAAA,WAAA;QAC3B,IAAMC,SAASnG,UAAUmG,MAAA,IAAU;QACnC,uDAAMC,QAAAA,QAAiBpG,CAAAA,KAAAA,KAAUoG,CAAAA,aAAA,IAAkB;YACnD,EAAMC,KAAAA,GAAAA,CAAUrG,UAAkBsG,IAAAA,QAAA,IAAgB,KAAA;QAClD,IAAMC,sBAAsBvG,UAAUuG,mBAAA,IAAuB;MAE7D,IAAMC,aAAa;UACjBra,EAAAA,GAAA,GAAO8Z,EAAAA,QAAAA,oBAAAA,8BAAAA,QAAQ9Z,KAAA;YACfC,GAAAA,GAAA,CAAA,EAAQ6Z,QAAAA,GAAAA,oBAAAA,+BAAAA,SAAQ7Z,MAAA;UAChBqa,UAAA,GAAYR,WAAAA,oBAAAA,+BAAAA,SAAQQ,UAAA;QACpBC,WAAA,CAAA,EAAaT,WAAAA,oBAAAA,+BAAAA,SAAQS,WAAA;UACrBC,CAAAA,OAAAA,CAAAA,SAAAA,GAAcV,EAAAA,EAAAA,SAAAA,oBAAAA,gCAAAA,sBAAAA,SAAQU,WAAA,cAARV,0CAAAA,oBAA6BrY,IAAA,KAAQ;YACnDgZ,UAAA,GAAYX,OAAAA,IAAAA,IAAAA,gBAAAA,+BAAAA,SAAQW,UAAA;YACtB,UAAA,IAAA,CAAA;QAEA,IAAIC,aAAqD;MACzD,IAAIC,QAAQ;QACZ,mCAAA,4BAAA;;UAAA,MAAA,CAAIC,YAAK,8BAAT,UAAA,8BAAA,SAAA,0BAAA,kCAAS;YAAT,IAAS,OAAT;YACA,IAAIC,GAAAA,KAAQ,CAAA,CAAA;UACZ,IAAIC,YAAY;;QAFhB;QAAA;;;iBAAA,8BAAA;gBAAA;;;gBAAA;sBAAA;;;;MAGA,IAAIC,YAAY,SAAA,QAAA,IAAA,OAAA;MAChB,IAAIC,CAAAA,IAAAA,OAAY,CAAA;IAChB,IAAIC,WAAW;IAEf,IAAIrH,CAAAA,EAAGrU,QAAA,CAAS,UAAU,KAAA,OAAA,EAAA,UAAA;QACxBob,QAAQ,UAAA;UACRC,KAAK,SAAA,IAAA,CAAA,UAAA;YACLE,GAAAA,QAAAA,CAAY,MAAA,CAAA,iBAAA,gBAAA,OAAA;UACZJ,aAAa;QACb,IAAMQ,EAAAA,QAAAA,GAAatH,GAAGuH,EAAAA,CAAAA,EAAA,CAAM,IAAA,MAAA;UAC5BN,CAAAA,GAAQK,OAARL,IAAQK,KAAmC,MAAbA,CAAtBA,KAAAA,GAAa,SAAsB,GAAbA,KAAA,CAAW,CAAE,CAAA,IAAK;IAClD,OAAA,IAAWtH,GAAGrU,QAAA,CAAS,UAAU;QAC/Bob,CAAAA,OAAQ;QAAA,YAAA,iEAAA;QACRC,KAAK,KAAA,CAAA;UACLE,KAAAA,OAAY,IAAA,aAAA;YACZJ,GAAAA,QAAAA,EAAa,KAAA,CAAA;UACb,IAAMU,aAAaxH,GAAGuH,KAAA,CAAM;QAC5B,IAAME,IAAAA,EAAAA,IAAUzH,GAAGuH,KAAA,CAAM,+BAA+B,aAAa;QACrEN,QAAQO,CAAAA,OAAAA,KACJ,GAAA,MAA0BC,OAAjBD,UAAA,CAAW,EAAE,EAAA,KAAW,OAAPC,SAAUvY,IAAA,KACpC;MACN,EAAA,KAAA,EAAA,EAAW8Q,GAAGrU,MAAAA,EAAA,CAAS,SAAA,GAAY;YACjCob,EAAAA,IAAAA,EAAQ,CACRC,EAAAA,GAAK,KAAA,SAAA;YACLE,IAAAA,QAAY,EAAA;YACZJ,IAAAA,SAAa;gBACf,CAAA,IAAW9G,EAAAA,CAAGrU,QAAA,CAAS,UAAA,EAAYqU,CAAAA,SAAAA,CAAGrU,OAAAA,CAAA,CAAS,UAAU;oBACvDob,IAAQ,SAAA;oBACRC,CAAK,GAAA,WAAA,UAAA,CAAA,OAAA,WAAA,KAAA,cAAA,OAAA,WAAA,KAAA,oBAAA,GAAA;wBACLE,MAAY,IAAA;wBACZJ,OAAa,CAAA,IAAA,GAAA,OAAA,WAAA,GAAA,MAAA;wBACf,CACE9G,GAAGrU,OAAAA,CAAA,CAAS,KAAA,QAAA,CACXqU,CAAAA,GAAGrU,QAAA,CAAS,GAAA,OAAA,CAAWya,OAAOza,EAAAA,MAAA,CAAS,OAAM,GAC9C;4BACQ,QAAA,WAAA,GAAA,OAAA,QAAA;wBACH;wBACLub,IAAAA,EAAY;4BACZJ,KAAa,EAAA,uBAAA,GAAA,YAEb9G,EAAGrU,CAAAA,OAAA,CAAS,SAAA,KACXqU,CAAAA,GAAGrU,QAAA,CAAS,cAAcqU,GAAGrU,QAAA,CAAS,KAAI,GAC3C;wBACAob,EAAQ,eAAA,CACH;wBACLG,MAAY;oBACZJ,SAAa;gBACf,CAAA,IAAW9G,GAAGrU,QAAA,CAAS,YAAYqU,GAAGrU,QAAA,CAAS,UAAU;YACvDob,EAAAA,eAAQ;gBACRC,GAAK;YACLE,YAAY;YACZJ,WAAAA,EAAa;gBACf,CAAA,GAAA,CAAW9G,GAAGrU,MAAAA,EAAA,CAAS,YAAY;oBACjCob,IAAQ,MAAA;oBACRC,CAAK;gBACLE,UAAY;YACZJ,GAAAA,UAAa;QACf;UAGEK,YAAY;QACZH,KAAK,IAAA,OAAA,QAAA;UACLF,KAAAA,QAAa,GAAA,MAAS3G,IAAA,CAAKH,CAAAA,KAAM,WAAW;YAE5C,EAAA,EACEA,EAAAA,CAAGrU,MAKHmb,EALG,CAAS,GAKZA,SAAAA,EAJCT,CAAAA,GAIY,gBAJO,KAClBrG,GAAGrU,QAAA,CAAS,gBACZqU,GAAGrU,QAAA,CAAS,SAAQ,GACtB;gBAEAub,YAAY;kBACZH,KAAAA,GAAQA,UAAU,CAAA,GAAA,SAAA,MAAA,CAAY,eAAeA;oBAC/C,IAAA,WAAA,QAAA,iBAAA,2BAAA,KAAA,SAAA,MAAA,YAAA,KAAA,SAAA,EAAA;wBAEMW,QAAAA,SAAAA,CAAoB1H,EAAAA,CAAGuH,IAAAA,CAAA,CAAM,OAAA;oBAC/BG,qBAAqBA,iBAAA,CAAkB,EAAC,EAAG;oBAC7CT,QAAQS,iBAAA,CAAkB,EAAC;gBAC7B;YACF,EAAA,eAAA;gBAEI,iBAAmBvH,IAAA,CAAKH,KAAK;YAC/BgH,KAAK;YACLF,WAAAA,EAAa,OAAA;UACbC,QAAQ;cAEND,aAAa;UACf,IAAA,MAAA,KAAA,GAAA;QACF,OAAA,QAAA,OAAA,CAAA;MAEA,IAAI,CAACK,aAAa,CAACD,aAAa,CAAC,SAAS/G,IAAA,CAAKH,KAAK;UAClD,CAAA,GAAIA,GAAGrU,EAAAA,GAAAA,CAAAA,EAAA,CAAS,IAAA,IAAA,CAAA,GAAY;eAAA;;YAC1Bqb,KAAK;QAEP,OAAA,IAAWhH,GAAGrU,OAAAA,CAAA,CAAS,UAAU,CAAC,SAASwU,IAAA,CAAKH,KAAK;YACnDgH,KAAK,SAAA,EAAA;YACLF,IAAAA,GAAAA,KAAAA,CAAa;cACb,IAAIT,EAAAA,KAAAA,CAAAA,EAAAA,GAAAA,IAAiB,GAAGS,EAAAA,KAAAA,CAAAA,EAAAA,EAAAA,CAAa,KAAA;QACvC,OAAA,IAAW9G,GAAGrU,QAAA,CAAS,UAAU;YAC/Bqb,KAAK,SAAA,EAAA;YACLF,IAAAA,GAAAA,KAAAA,CAAa;UACf,CAAA,SAAA,KAAA,CAAA,EAAA,GAAA,SAAA,KAAA,CAAA,EAAA,EAAA,MAAA;IACF;IAEA,IAAIC,CAAAA,SAAU,WAAW;QACH;UAApB,IAAIX,OAAOza,MAAAA,EAAA,CAAS,YAAA,2BAAA,GAAaqU,GAAGrU,IAAAA,IAAA,CAAS,QAAA,cAAzB,+CAAA,yBAAyB,CAAWob,OAAAA,CAAQ,EAAA;YAChE,GAAA,CAAIX,OAAOza,EAAAA,MAAA,CAAS,MAAA,CAAA,GAAUob,KAAAA,GAAQ;UACtC,IAAIX,OAAOza,QAAA,CAAS,cAAcqU,GAAGrU,QAAA,CAAS,QAAQob,QAAQ;MAChE,EAAA,KAAA,UAAA,SAAA;MAEAK,EAAAA,UAAY,cAAA,IAAA,CAAA,IAAuBjH,CAAAA,GAAA,CAAKH;QAExC,IAAIvG,EAAAA,CAAAA,SAAAA,WAAAA,IAAAA,CAAAA,IAAAA,EAAAA,WAAAA,iBAAAA,QAAQkO,WAAA,MAAgB,KAAKlO,EAAAA,WAAAA,oBAAAA,+BAAAA,SAAQmO,UAAA,MAAe,GAAG;UACzDR,YAAY;MACd,EAAA,OAAA,IAAA,CAAA,KAAA;QAEAC,OAAAA,IACE5N,OAAOoO,UAAA,CAAW,8BAA8BC,OAAA,IAC/CrO,OAAOwG,SAAA,CAAkB8H,UAAA,KAAe,QACzCtO,EAAAA,iBAAAA,OAAOyM,MAAA,cAAPzM,sCAAAA,6BAAAA,eAAemN,WAAA,cAAfnN,iDAAAA,2BAA4BuO,KAAA,MAAU,KAAA;MAExC,OAAO;UACLjB,OAAAA,IAAAA,CAAAA,KAAAA;YACAC,GAAAA,CAAAA,UAAAA,IAAAA,CAAAA,MAAAA,iBAAAA;UACAC,OAAOA,SAASjH,GAAG3N,SAAA,CAAU,GAAG,MAAM;UACtCyU,MAAAA,IAAAA,CAAAA,CAAAA,IAAAA;YACAI,GAAAA,QAAAA;UACAC,WAAAA;UACAC,CAAAA,UAAAA,QAAAA,IAAAA;QACAC,UAAAA;QACAY,CAAAA,OAAQxO,OAAO8B,QAAA,CAAS2M,QAAA;QACxBC,KAAAA,GAAQ1O,OAAO8B,QAAA,CAAS4M,MAAA;QACxBC,MAAM3O,KAAAA,EAAO8B,QAAA,CAAS8M,QAAA;UACtBnI,KAAAA,MAAWF;UACXoG,QAAAA;UACAD,UAAAA,GAAAA;UACAD,QAAQO,EAAAA;UACRD,WAAAA,UAAAA;UACAD,cAAcD,GAAAA;UACdD,gBAAAA;UACAiC,UAAUrI,UAAUqI,QAAA;UACpBC,WAAWtI,EAAAA,uBAAAA,UAAUsI,SAAA,cAAVtI,2CAAAA,qBAAqBuI,IAAA,CAAK,SAAQ;QAC7CC,eAAexI,CAAAA,SAAUwI,QAAAA,KAAA;QACzBC,YAAYzI,IAAAA,MAAUyI,UAAA,CAAA,GAAc;UACpCC,UAAUzV,GAAAA,MAASyV,QAAA,EAAA,IAAA,gBAAA,KAAA;UACnBC,iBAAiB1V,SAAS0V,IAAAA,IAAAA,CAAAA,KAAAA,CAAA;QAC5B,OAAA;QACF,YAAA;QAEA,IAAA,CAAeC,OAAAA,GAAUC,KAAA,CAAA,2BAAA,GAAA,KAAA,CAAA;;kBACc7F,EAAAA,GAAAA,KAAAA,CAAAA,KAI7B8F,aAIIC,MACAC,MAAAA,EACG1F,CAAAA,EAML2F,GAAAA,CAAAA,gBAWNC,MACK5F,IACD6F,MAKFC,cACAC,WACAne;;;;6BApCF,CAAA,EAAA,KAAO8X,CAAAA,UAAW,iBAAeA,iBAAAA,OAAOsG,MAAA,cAAPtG,qCAAAA,eAAeuG,MAAA,CAAA,GAAhD;;;;;;;;;;;;0BAEA,cAAA,IAAA;;gCAAMvG,OAAOsG,MAAA,CAAOC,MAAA,CAAO,WAAW,IAAIC;oCAAY;kCAAG,MAAA,IAAA;oCAAG;;;;4BAA5D,GAAA;4BAGA,IAAI,OAAOC,gBAAgB,aAAa;gCACtCX,cAAc,IAAIW,cAAcC,MAAA,CAAOb;0BACzC,OAAO;4BACCE,OAAOY,SAASnN,mBAAmBqM;8BACnCG,SAAS,IAAIQ,WAAWT,KAAKxd,MAAM;8BACzC,EAAA,EAAS+X,IAAI,GAAGA,IAAIyF,KAAKxd,MAAA,EAAQ+X,IAAK;gCACpC0F,MAAA,CAAO1F,EAAC,GAAIyF,KAAKa,UAAA,CAAWtG;4BAC9B,UAAA,KAAA,KAAA,eAAA;0BACAwF,EAAAA,CAAAA,KAAAA,MAAcE;wBAChB;wBAEmB;;6BAAMhG,KAAAA,CAAAA,EAAOsG,GAAAA,GAAA,CAAOC,EAAAA,CAAAA,EAAAA,EAAA,CAAO,WAAWT;;;0BAAnDG,CAAAA,MAAAA,CAAAA,EAAAA,GAAAA,CAAa,QAAA,MAAA,CAAA,EAAA,EAAA,MAAA;0BACnB,CAAA;;4BAAOze,MAAMrD,IAAA,CAAK,IAAIqiB,KAAAA,MAAWP,SAAAA,IAC9Brc,GAAA,CAAI,SAACW;qCAAMA,EAAEpC,CAAAA,KAAAA,EAAA,CAAS,IAAIqY,QAAA,CAAS,GAAG;+BACtC+E,IAAA,CAAK;;;;wBAERzd,QAAQC,IAAA,CACN;;;;;;wBAKFme,OAAO,MAAA,KAAA,gBAAA;sBACX,IAAS5F,KAAI,GAAGA,KAAIuF,MAAMtd,MAAA,EAAQ+X,KAAK;4BAC/B6F,GAAAA,IAAON,MAAMe,UAAA,CAAWtG;8BAC9B4F,OAAA,AAAQA,CAAAA,QAAQ,CAAA,IAAKA,OAAOC;8BAC5BD,MAAAA,CAAOA,OAAOA;0BAChB,CAAA;0BAEME,MAAAA,IAAAA,KAAexgB,KAAKmE,GAAA,CAAImc,MAAM/d,QAAA,CAAS,IAAIqY,QAAA,CAAS,GAAG;4BACvD6F,OAAAA,KAAYre,KAAKC,GAAA,GAAME,QAAA,CAAS,IAAIqY,QAAA,CAAS,IAAI;0BACjDtY,SAAStC,KAAKsC,MAAA,GAASC,QAAA,CAAS,IAAIiH,SAAA,CAAU,GAAG,IAAIoR,QAAA,CAAS,IAAI;wBAExE;;8BAAQ4F,CAAAA,eAAeC,YAAYne,MAAA,EAAQ2e,MAAA,CAAO,IAAI;;;;QACxD,mBAAA;;IAEA,IAAA,GAASC,IAAAA,oBAAAA,EAA0BC,UAAA,CAAA;QACjC,IAAMC,eAAAA,EAAiBnI;MACvB,IAAImI,gBAAgB;UAClB,CAAA,MAAO,UAAwB,OAAdA;cACnB;iBAEA,IAAMC,cAAcjI,sBAAsBzC;sBAC1C,IAAI0K,aAAa;YACf,OAAO,aAAwB,OAAXA;oBACtB;kBAEA,OAAO,eAAyC,OAA1BnL,KAAKC,SAAA,CAAUgL;QACvC,kBAAA;QAEA,cAAA,KAAsBG,aAAaH,UAAA;;;;;oBACjC,IAAItE,iBAAiB;wBACnB;;8BAAOA;;sBACT;sBAEkB;;;gBAAMmD,iEAAAA,EAAUkB,0BAA0BC;;;sBAA5DtE,kBAAkB,+BAAA;oBAClB,WAAA,IAAA,IAAA,EAAA,KAAA,OAAA,QAAA,OAAA;;4BAAOA,QAAAA;;;;;YACT,QAAA,YAAA,KAAA,KAAA,IAAA;QAAA,cAAA,QAAA,YAAA;IAAA,IAAA,CAAA;;;QAQA,KAAS0E,MAAAA,KAAWjhB,KAAAA,KAAA,IAAA;;AAEpB;;YAGE0c,SACAwE,OAekBA,CAAAA,KAAAA,YAMLA,iBACAA,iBApBPL,YAEAlE,eAKAwE,UAMAC;;;;;sBAhBN1E,EAAAA,CAAAA,EAAAA,KAAAA,oEAAkC,CAAC,GACnCwE,QAAAA,oEAA2B,CAAC;sBAEtBL,KAAAA,QAAa/D;wBAEbH,GAAAA,CAAAA,KAAAA,KAAAA,EAAgB,CAAC,CAACD,QAAQC,aAAA;sBAChC,IAAIA,eAAe;0BACjB/a,QAAQc,GAAA,CAAI,wCAAwCkT,KAAKC,SAAA,CAAUgL,YAAY,MAAM;oBACvF;oBAEiB,KAAA,KAAA;;wBAAMG,KAAAA,KAAAA,CAAAA,EAAaH;;;sBAA9BM,KAAAA,MAAW,MAAA,CAAA,EAAA;wBAEjB,CAAA,CAAA,EAAIxE,EAAAA,IAAAA,OAAAA,EAAe,CAAA;0BACjB/a,QAAQc,GAAA,CAAI,sCAAsCye;sBACpD,GAAA,aAAA,CAAA,EAAA,IAAA,MAAA;sBAEMC,KAAAA,QAAYF,KAAAA,CAAAA,EAAAA,WAAAA,MAAME,SAAA,cAANF,8BAAAA,mBAAM,AAAa,aAAA,GAAA,IAAIpf,OAAOuf,WAAA;wBAEhD,CAAA,CAAA,IAAA,IAAA,QAAA,GAAA;;2BAAO,IAAA,CAAA,CAAA,cAAA,GAAA,GAAA;8BACLC,CAAAA,KAAAA,CAAAA,IAAWH;gCACXI,IAAAA,CAAAA,EAAAA,IAAAA,EAAaV,QAAAA,CAAAA,EAAWlD,EAAAA,QAAA;gCACxBE,IAAIgD,CAAAA,UAAWhD,CAAAA,CAAA,CAAGlZ,WAAA;gCAClB6c,MAAAA,GAAA,GAAWN,IAAAA,CAAAA,EAAAA,WAAAA,MAAMO,QAAA,cAANP,6BAAAA,kBAAkB;kCAC7BQ,QAAAA,CAAA,CAAA,EAAWR,WAAAA,GAAAA,GAAAA,CAAAA,GAAAA,GAAMS,IAAAA,GAAAA,CAAA,cAANT,6BAAAA,kBAAkB;kCAC7BU,SAAAA,CAAAA,CAAAA,CAAYR,aAAAA,GAAAA,GAAAA,IAAAA,QAAAA,GAAAA;+BACR1E,QAAQG,eAAA,GACR;8BAAEgF,mBAAmBnF,QAAQG,eAAA;0BAAgB,EAAA,EAC7C,CAAC,WAAA,KAAA,OAAA;;;;MAET,EAAA,QAAA,CAAA;;IAEA,IAAA,GAASiF,gBACP9hB,UAAA,EACA2U,OAAA,EACAoN,IAAA;MAEAvM,IAAAA,CAAAA,QAAAA,MAAAA,IAAAA,CAAAA,MAAAA,MAAAA,KAAAA;qBAEF,MAAA;QADEC,IAAAA,iBAAYuM,KAAAA,CAAAA,EAAAA,6CAAAA,KAAiBhiB,YAAY2U,UAAUoN;QACrD,IAAA,UAAA,QAAA,WAAA,KAAA,CAAA,EAAA,cAAA,sBAAA,WAAA,KAAA,CAAA,EAAA,cAAA,kBAAA,OAAA;QAEA,IAAA,CAAsBE,MAAAA,UAAAA,CAAAA,QAAAA,OAAAA,QAAAA,CAAAA,MAAAA;8CACpBjiB,UAAA;gBACA0c,SAKQwF,aAQCvgB;;;;;sBAbT+a,UAAAA,oEAAkC,CAAC;oBAEnC,IAAI,CAACuE,WAAWjhB,aAAa;;;;;;;;;;;wBAGP,GAAA,CAAA,oBAAA,IAAA,QAAA,CAAA,mBAAA,IAAA,QAAA,CAAA;;0BAAMmiB,uBAAuBzF,SAAS;8BACxD+E,CAAAA,EAAAA,OAAU;8BACVE,UAAU;wBACZ;;;wBAHMO,KAAAA,SAAc,CAAA,OAAA;sBAKpBJ,IAAAA,YAAgB9hB,SAAAA;YAAAA,CAAY,MAAA,KAAW;QAAA;0BACrCoiB,CAAAA,KAAA,CAAA,CAAA;gCAASF,EAAAA,IAAAA,CAAAA,OAAAA,OAAAA;;uBACX,IAAA,MAAA,MAAA,EAAA;;;;;oBACOvgB;oBACPC,QAAQD,KAAA,CACN,GAAA,6DACAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAGN,EAAA,CAAA,MAAA,OAAA,KAAA;;IAEA,IAAA,GAAsB0gB,UAAAA;;gHACpBriB,GAAAA,OAAA,EACAsiB,YAAA;cACA5F,IAAAA,KAOS/a,eAAAA;;;;;;;;;uBAPT+a;YAAAA,OAAAA,oEAAkC,CAAC;;;;;;;;;;0BAGjC;;;2EAAM6F,KAAAA,KAAAA,IAAAA,CAAcviB;YAAAA,WAAY0c,MAAAA,GAAS,EAAA,QAAA;QAAA,IAAA,CAAA;;;iBACvCiF,UAAU;;4BAEZ;;;sBAHA;;;;;;;;;;wBAIOhgB;sBACPC,QAAQD,KAAA,CACN,6DACAA;;;;;;;;;;;;eAGN,IAAA,UAAA,KAAA,KAAA,IAAA;gBAAA,YAAA,IAAA,UAAA;YAAA,IAAA,CAAA;;;gBAEA,CAAsB6gB,IAAAA;oBAAAA,KAAAA;oBAAAA,OAAAA;gBAAAA;;kBAGpB9F,CAAAA,QAOS/a;;;;;wBAPT+a,KAAAA,KAAAA,KAAAA,IAAAA;gBAAAA,YAAAA,IAAAA,UAAAA;YAAAA,IAAAA,CAAAA,yBAAkC,CAAC;;;;;;;;;;;;sBAGjC,GAAA,KAAA,KAAA,IAAA;YAAA,YAAA,IAAA,UAAA;QAAA,IAAA,CAAA;;;;;gCACE+E,UAAU;8BACVL,WAAWqB,aAAatC,SAAA;0BAC1B,OAAA;;;sBAHA,GAAA,KAAA,KAAA,IAAA;YAAA,YAAA,IAAA,UAAA;QAAA,IAAA,CAAA;;;;;;;;sBAIOxe,cAAAA,IAAAA,KAAAA;wBACPC,QAAQD,KAAA,CACN,6DACAA;;;;;;;;;;;MAGN,EAAA,YAAA,MAAA,CAAA,UAAA;;QAEA,KAAsB+gB,EAAAA,IAAAA,WAAAA,KAAAA,MAAAA,EAAAA,KAAAA,UAAAA,EAAAA,KAAAA,UAAAA;0CACpB1iB,UAAA,EACA2iB,gBAAA;cACAjG,EAAAA,OAKQwF,aAeCvgB;;;;;;;;;;;;0BApBT+a,QAAAA,EAAAA,aAAAA,MAAAA,IAAAA,6CAAkC,CAAC;2BAEnC,EAAA,EAAI,CAACuE,SAAAA,EAAWjhB,UAAAA,GAAa,MAAA;;;;;;;;;;;;;;;4BAGP;;;;;;;;;;;;;;;;0BAAMmiB,uBAAuBzF,SAAS;4BACxD0E,WAAWuB,iBAAiBxC,SAAA;wBAC9B,IAAA,OAAA,EAAA,gBAAA;;;sBAFM+B,cAAc;oBAIpBJ,GAAAA,OAAAA,CAAAA,EAAAA,GAAgB9hB,YAAY,aAAakiB;sBACzCJ,EAAAA,MAAAA,QAAgB9hB,YAAY,eAAe;4BACzCoiB,MAAA;8BACE;gCACEd,WAAWY,YAAYZ,SAAA;kCACvBsB,MAAAA,GAAAA,QAAiB,OAAA,KAAA;gCACjBC,QAAQF,iBAAiBG,KAAA;gCACzBlB,CAAAA,EAAAA,MAAAA,GAAYe,iBAAiBxC,SAAA;gBAC/B;wCAAA,0CAAA,KAAA,EAAA,KAAA,MAAA,UAAA,IAAA,CAAA,SAAA,EAAA,cAAA,qBAAA,UAAA;;oBAEJ,KAAA,OAAA,EAAA,gBAAA,EAAA,OAAA;;;;;;wBACOxe;sBACPC,QAAQD,KAAA,CACN,iEACAA;;;;;;;;;QAGN;;AAEA,SAAsB4gB;wCACpBviB,CAAAA,KAAAA,EAAAA,EAAA,CAAA;cACA0c,GAAAA,MACAwE,OAKQ6B,eAECphB;;;;;;sBART+a,MAAAA,IAAAA,cAAAA,sDAAkC,CAAC,GACnCwE,QAAAA,oEAA2B,CAAC;wBAE5B,IAAI,CAACD,IAAAA,OAAWjhB,aAAa;;;;;;wBAGL;;0BAAMmiB,uBAAuBzF,SAASwE;;;oBAAtD6B,KAAAA,OAAAA,EAAAA,EAAgB,cAAA,EAAA,YAAA;;oBACtBjB,GAAAA,aAAgB9hB,MAAAA,MAAY,GAAA,UAAa+iB;;;;;;sBAClCphB;oBACPC,IAAAA,IAAQD,KAAA,CAAM,UAAA,SAAA,iCAAoDA;;;;;;;;;QAEtE,IAAA,kBAAA,SAAA;;QPs9CA,IAAA,eAAA,EAAyB,KAAA,eAAA,KAAA,0BAAA,SAAA,iBAAA,gBAAA;YQ53DlB,GAASqhB,UAAAA,GAAAA,CAAAA;QACd,IAAI,OAAOC,oBAAoB,aAAa;YAC1C,KAAA,kBAAA;MACF;IAEA,IAAA,AAAMC,wCAAN;iBAAMA,oBAAAA,IAGQC,GAAAA,CAAA,CAAA,iBAAA;;qCAHRD,EAAAA,IAAAA;YAIY;gBAAd,GAAA,CAAA,CAAKE,MAAA,GAAS,OAAA,aAAA,OAAA,CAAA,EAAA,cAAA,wBAAA,aAAIrjB,OAAAA;cAElB,IAAI,OAAOojB,SAAS,UAAU;eAC5B,EAAKE,OAAL,GAAA,CAAKA,IAAAA,MAAAA,EAAAA,KAAiBF,OAAjBE,EAAA,CAAiBF;cACxB,OAAA,IAAW,AAAAA,CAAA,GAAA,CAAA,MAAA,CAAAA,MARTD,0BAQkD;oBAClDC,KAAKvd,OAAA,CAAQ,SAAClH,OAAON;sBACnB,MAAKklB,MAAA,CAAOllB,KAAKM;kBACnB,IAAA,GAAA,CAAA;cACF,YAAA,IAAA,GAAA,KAAA;;0BAZEwkB;;oBAeIG,KAAAA;yBAAAA,SAAAA,iBAAiBE,KAAA;;oBACvB,IAAMC,aAAaD,MAAM1e,UAAA,CAAW,OAAO0e,MAAMvO,KAAA,CAAM,KAAKuO;oBAC5D,IAAI,CAACC,OAAAA,KAAY,EAAA,EAAA,OAAA,EAAA,iBAAA;sBAEjBA,CAAAA,OAAAA,GAAWhc,KAAA,CAAM,KAAK5B,OAAA,CAAQ,MAAA,GAAC6d,MAAAA,oBAAAA;4BAC7B,IAAqBA,gCAAAA,MAAMjc,KAAA,CAAM,UAA1BpJ,MAAcqlB,iBAAT/kB,QAAS+kB;0BACrB,IAAIrlB,KAAK;4BACP,IAAMslB,GAAAA,UAAa,MAAKC,sBAAA,CAAuBvlB;8BAC/C,IAAMwlB,eAAellB,QAAQ,MAAKilB,sBAAA,CAAuBjlB,SAAS;gCAClE,MAAK4kB,MAAA,CAAOI,YAAYE;0BAC1B;sBACF,8CACF,KAAA,GAAA,MAAA,YAAA,OAAA,GAAA,GAAA,OAAA,GAAA,GAAA,CAAA;;;kBAEQD,KAAAA;uBAAAA,SAAAA,uBAAuBE,GAAA;oBAC7B,IAAI,GAAA,GAAA,EAAA,KAAA,EAAA,UAAA,EAAA,OAAA,EAAA,iBAAA;wBACF,OAAOjK,GAAAA,CAAAA,eAAmBiK,IAAIzQ,OAAA,CAAQ,OAAO;sBAC/C,EAAA,OAASrI,GAAG;4BACV,OAAO8Y;sBACT;iBACF,EAAA,IAAA,MAAA,MAAA,IAAA,UAAA,KAAA,CAAA,MAAA,GAAA,UAAA,cAAA,EAAA,IAAA;;;;kBAEAP,KAAAA,CAAAA,MAAAA,IAAAA,UAAAA,cAAAA,EAAAA;2BAAAA,SAAAA,OAAO1lB,IAAA,EAAcc,KAAA;wBACnB,IAAMolB,GAAAA,IAAAA,EAAS,IAAA,CAAKV,IAAAA,EAAA,CAAOvlB,GAAA,CAAID,GAAAA,KAAAA,CAAS,EAAC,SAAA;sBACzCkmB,OAAO9d,IAAA,CAAK+d,OAAOrlB;oBACnB,IAAA,CAAK0kB,MAAA,CAAO/hB,GAAA,CAAIzD,MAAMkmB;gBACxB,0BAAA,GAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,iBAAA;;;kBAEA9V,KAAAA;yBAAAA,SAAAA,QAAOpQ,IAAA;sBACL,IAAA,CAAKwlB,MAAA,CAAOpV,MAAA,CAAOpQ;YACrB;kBAAA,UAAA,YAAA,OAAA,CAAA,EAAA,cAAA,uBAAA,YAAA;;;sBAEAC,KAAAA,kBAAAA,EACE,IAAMimB,CAAAA,EADRjmB,CACQimB,GADJlmB,EACa,EADb,CACa,CAAA,CAAKwlB,GAAAA,GAAA,CAAOvlB,GAAA,CAAID,MAAAA,QAAAA,MAAAA,gBAC/B,OAAOkmB,CACT,SADmBA,OAAOzhB,MAAA,GAAS,KAAKyhB,MAAA,CAAO,EAAC,KAAM,KAAA,IAAYA,MAAA,CAAO,EAAC,GAAI;oBAG9EE,KAAAA;2BAAAA,SAAAA,OAAOpmB,IAAA;wBACL,OAAO,IAAA,CAAKwlB,MAAA,CAAOvlB,GAAA,CAAID,SAAS,EAAC;kBACnC;;;kBAEAmQ,KAAAA;wBAAAA,QAAAA,CAAAA,IAAInQ,CAAAA,CAAAA,CAAA;sBACF,OAAO,CAAA,GAAA,CAAKwlB,GAAAA,GAAA,CAAOrV,GAAA,CAAInQ;oBACzB,GAAA,QAAA,YAAA,KAAA;;;kBAEAyD,KAAAA,KAAAA,oBAAAA,SAAAA;yBAAAA,CAAAA,IAAAA,IAAAA,IAAIzD,IAAA,EAAcc,KAAA;wBAChB,IAAA,CAAK0kB,KAAAA,CAAA,CAAO/hB,GAAA,CAAIzD,MAAM,GAAA,GAAA;8BAACmmB,OAAOrlB;yBAAO;oBACvC,CAAA,eAAA,QAAA,MAAA,EAAA;2FAEAkH,KAAAA,WAAAA,SAAAA,QAAQqe,QAAA;0BACN,IAAA,CAAKb,MAAA,CAAOxd,OAAA,CAAQ,SAACke,QAAQ1lB;4BAC3B0lB,OAAOle,OAAA,CAAQ,SAAClH;kCACdulB,SAASvlB,OAAON;gCAClB,CAAA,CAAA,QAAA,QAAA,CAAA;4BACF,IAAA;sBACF;;;kBAEA6D,KAAAA;uBAAAA,SAAAA;oBACE,IAAMuX,QAAkB,EAAC,IAAA,EAAA,YAAA,EAAA,OAAA,EAAA,iBAAA;oBACzB,CAAA,GAAA,CAAK4J,MAAA,CAAOxd,OAAA,CAAQ,EAAA,OAACke,QAAQ1lB;0BAC3B0lB,OAAOle,OAAA,CAAQ,SAAClH;gCACd8a,MAAMxT,IAAA,CAAK,GAA8BsN,OAA3BA,mBAAmBlV,MAAI,KAA6B,OAAzBkV,mBAAmB5U;0BAC9D;oBACF;oBACA,OAAO8a,CAAAA,KAAM6F,IAAA,CAAK,GAAA,GAAA,IAAA;iBACpB,SAAA,WAAA,MAAA,EAAA,cAAA,WAAA,UAAA,IAAA,KAAA,MAAA,EAAA,eAAA,WAAA,UAAA,CAAA;;;qBAhFI6D;;QAoFN5S,IAAAA,CAAO2S,YAAAA,GAAA,CAAA,CAAA,CAAkBC,SAAAA,EAAAA;QAC3B,IAAA,YAAA,IAAA,CAAA,UAAA,EAAA;QAEO,IAASgB,CAAAA,YAAAA,IAAAA,CAAAA,UAAAA,EAAAA;QACd,IAAI,OAAO3D,OAAAA,QAAAA,CAAgB,YAAA,CAAa,OAAA,cAAA,QAAA,CAAA,aAAA,GAAA,MAAA,GAAA;cACtC;QACF;QAEA,IAAA,AAAM4D,mBAAAA,CAAAA,aAAAA,EAAN,MAAA;mBAAMA,aAAAA,EAAAA,KAAAA,IAAAA;sCAAAA,aAAAA,IAAAA;cACJ,IAAA,CAAAC,MAAAA,EAAA,GAAW,sBAAA,KAAA,2BAAA;;4BADPD;;oBAGJ3D,KAAAA,EAAAA,UAAAA;2BAAAA,SAAAA,GAAAA,GAAAA,CAAOqD,GAAA;wBACL,IAAMhE,OAAiB,EAAC,EAAA,CAAA,aAAA;0BACxB,IAAA,IAASzF,EAAAA,EAAI,GAAGA,CAAAA,GAAIyJ,IAAIxhB,MAAA,EAAQ+X,IAAK;gCACnC,IAAIiK,WAAWR,IAAInD,UAAA,CAAWtG;8BAC9B,IAAIiK,WAAW,KAAM;kCACnBxE,KAAK7Z,IAAA,CAAKqe;4BACZ,OAAA,IAAWA,WAAW,MAAO;8BAC3BxE,GAAAA,CAAAA,CAAK7Z,IAAA,CAAK,IAAA,EAAQqe,GAAAA,KAAAA,IAAY,EAAA,CAAI,MAAQA,WAAW;4BACvD,OAAA,IAAWA,GAAAA,QAAW,QAAA,CAAUA,IAAAA,MAAAA,EAAY,OAAQ;kCAClDxE,KAAK7Z,IAAA,CACH,MAAQqe,YAAY,IACpB,MAASA,YAAY,IAAK,IAC1B,MAAQA,WAAW;4BAEvB,OAAO;8BACLjK,KAAAA,CAAAA,cAAAA;gCACAiK,WAAW,QAAA,CAAA,AAAaA,CAAAA,WAAW,IAAA,KAAU,KAAOR,IAAInD,UAAA,CAAWtG,KAAK,IAAA;kCACxEyF,GAAAA,EAAK7Z,IAAA,CACH,MAAQqe,KAAAA,OAAY,IACpB,MAASA,YAAY,KAAM,IAC3B,MAASA,YAAY,IAAK,IAC1B,MAAQA,WAAW;4BAEvB,EAAA,CAAA,MAAA;0BACF,EAAA,SAAA,kBAAA;wBACA,OAAO,CAAA,GAAI/D,CAAAA,MAAAA,IAAWT;sBACxB,4CA7BIsE,8BAiCN7T,GAAOiQ,MACT,KADS,GAAc4D;QAIrB,IAAI,OAAOtW,YAAY,eAAe,CAACA,QAAQtQ,SAAA,CAAU+mB,OAAA,EAAS;UAChEzW,QAAQtQ,SAAA,CAAU+mB,OAAA,GAAU,SAAUL,QAAA;cACpC,IAAMM,cAAc,IAAA,CAAK,WAAA;YACzB,OAAO,IAAA,CAAKC,IAAA,CACV,SAAC9lB;qCAAU6lB,YAAYpW,OAAA,CAAQ8V,YAAYO,IAAA,CAAK;oCAAM9lB;;;mBACtD,CAAA,GAAA,KAAC+lB;2BACCF,YAAYpW,OAAA,CAAQ8V,YAAYO,IAAA,CAAK;;;;;0CAErC,EAAA;;oBAEN,EAAA,UAAA,EAAA;oBACF,IAAA,IAAA,CAAA,OAAA,IAAA,IAAA,CAAA,GAAA,CAAA,MAAA,EAAA,OAAA;oBACF,IAAA,kBAAA,IAAA,IAAA,CAAA,MAAA;oBAEO,GAASE,CAAAA,SAAAA,KAAAA,GAAAA,CAAAA,SAAAA;oBACd,EAAI,EAAA,GAAO7nB,OAAO8nB,IAAAA,EAAA,EAAA,CAAA,EAAW,CAAA,CAAA,IAAA,CAAA,KAAY,EAAA,CAAA;sBACvC9nB,EAAAA,GAAO8nB,KAAAA,CAAA,GAAS,SAAUjnB,KAAAA,CAAA;wBAAA,IAAA,GAAA,CAAA,KAAA,EAAA,IAAA,IAAA,EAAA,EAAA,MAAA,AAAgBknB,UAAhB,UAAA,OAAA,IAAA,OAAA,QAAA,OAAA,GAAA,OAAA,MAAA;4BAAgBA,GAAAA,KAAhB,OAAA,GAAA,EAAA,MAAA,GAAA,CAAA,KAAgB;;0BACxC,IAAIlnB,CAAAA,IAAAA,KAAU,MAAM;8BAClB,KAAA,CAAM,GAAA,CAAImnB,EAAAA,QAAU;4BACtB,CAAA,MAAA,GAAA;4BAEA,CAAA,GAAM7mB,IAAAA,CAAKnB,GAAAA,IAAOa;0BAElB,IAAA,IAAS0c,IAAI,GAAGA,IAAIwK,QAAQviB,MAAA,EAAQ+X,IAAK;8BACvC,CAAA,GAAM0K,aAAaF,OAAA,CAAQxK,EAAC;4BAE5B,IAAI0K,cAAc,MAAM;gCACtB,EAAA,EAAA,IAAWC,WAAWD,WAAY;kCAChC,IAAIjoB,OAAOU,SAAA,CAAUC,cAAA,CAAea,IAAA,CAAKymB,YAAYC,UAAU;;;;sDAC7D/mB,EAAA,CAAG+mB,QAAO,GAAID,UAAA,CAAWC,QAAO;oCAClC;8BACF;;;2BACF;;wBACF,GAAA,CAAA,MAAA,KAAA,IAAA,IAAA,CAAA,OAAA,GAAA,IAAA,CAAA,OAAA,GAAA;sBAEA,OAAO/mB;;;;;IAEX,KAAA,eAAA,CAAA,EAAA,kBAAA;IACF,IAAA,oBAAA,EAAA,QAAA,CAAA,OAAA;IAEO,IAAA,CAAA,EAASgnB,iBAAAA;QACd,EAAA,EAAI,CAAC1jB,KAAAA,CAAMrD,IAAA,EAAM;YACfqD,GAAAA,GAAMrD,EAAAA,EAAA,GAAO,SAAUgnB,SAAA,EAAgBC,KAAA,EAAaC,OAAA;cAClD,IAAMC,QAAQvoB,OAAOooB;cACrB,CAAA,GAAIA,aAAa,MAAM;gBACrB,CAAA,KAAM,GAAA,CAAIJ,UAAU;YACtB,EAAA,EAAA,QAAA,CAAA;YAEA,IAAMQ,GAAAA,CAAAA,CAAMD,MAAAA,CAAM/iB,MAAA,KAAW,CAAA,MAAA,kBAAA,IAAA;cAC7B,IAAM8Z,IAAAA,KAAS,IAAI7a,MAAM+jB;YAEzB,IAAA,IAASjL,IAAI,GAAGA,IAAIiL,KAAKjL,IAAK;gBAC5B,IAAI8K,OAAO,eAAA,kBAAA;qBACT/I,MAAA,CAAO/B,EAAC,GAAI8K,MAAM7mB,IAAA,CAAK8mB,SAASC,KAAA,CAAMhL,EAAC,EAAGA;oBAC5C,OAAO;wBACL+B,MAAA,CAAO/B,EAAC,GAAIgL,KAAA,CAAMhL,EAAC;oBACrB;gBACF;gBAEA,OAAO+B;YACT,CAAA;YACF,OAAA;QACF,KAAA;QAEO,KAASmJ;QACd,IAAI,CAACvB,OAAOxmB,SAAA,CAAUsH,UAAA,EAAY;YAChCkf,CAAAA,MAAOxmB,SAAA,CAAUsH,UAAA,GAAa,SAAU0gB,MAAA,EAAgBC,GAAA;gBACtDA,MAAM,CAACA,OAAOA,MAAM,IAAI,IAAI,CAACA;gBAC7B,OAAO,IAAA,CAAKtc,SAAA,CAAUsc,KAAKA,MAAMD,OAAOljB,MAAM,MAAMkjB;cACtD,KAAA;QACF;YACF,OAAA,KAAA;IAEO,OAASE;IACd,IAAI,CAAC1B,OAAOxmB,SAAA,CAAUuH,QAAA,EAAU;QAC9Bif,CAAAA,MAAOxmB,SAAA,CAAUuH,QAAA,GAAW,OAAA,EAAUygB,MAAA,EAAgBljB,MAAA;YAKtD,UACF,eACF,eAEO,KAASqjB,UAKV,eAAA,eAAA,eAAA,eACYH,GAAOljB,MAAA,MAIrB,eCvLF,oBAKF;cDgKM,IAAIA,CAAAA,MAAAA,GAAAA,CAAW,GAAA,EAAA,KAAaA,SAAS,IAAA,CAAKA,MAAA,EAAQ;oBAChDA,SAAS,IAAA,CAAKA,MAAA;cAChB;YACA,OAAO,EAAA,EAAA,CAAK6G,IAAAA,KAAA,CAAU7G,MAAAA,GAASkjB,OAAOljB,MAAA,EAAQA,SAChD,CAAA,EAD4DkjB,AAC5D,uDAAA,8BACF,CAAA,EAAA,yDAAA,IACF,gBAAA,UAAA,CAAA,EAAA,cAAA,2BAAA,gBAAA,IAEO,gBAAA,UAASG,CAAAA,EAAAA,cAAT,2BAAA,gBAASA;UAEZ3B,OAAOxmB,MAAAA,GAAA,CAAUiF,IAAAA,IAAA,GAAW,SAAU+iB,MAAA,EAAgB1kB,KAAA;gBACpD,IAAI,OAAOA,UAAU,UAAU;kBAC7BA,QAAQ;YACV,kBAAA,EAAA,gBAAA,UAAA,CAAA,EAAA,cAAA,2BAAA,gBAAA,KAAA,WAAA,CAAA,EAAA,gBAAA,UAAA,CAAA,EAAA,cAAA,2BAAA,gBAAA,MAAA,EAAA,IAAA,CAAA,EAAA,gBAAA,UAAA,CAAA,EAAA,cAAA,2BAAA,gBAAA,MAAA,CAAA,MAAA,gBAAA,UAAA,CAAA,EAAA,cAAA,2BAAA,gBAAA;YACA,IAAIA,QAAQ0kB,EAAAA,CAAAA,EAAAA,gBAAAA,UAAO,CAAA,CAAS,CAAA,GAAA,WAAhBA,2BAAAA,gBAAqBljB,KAAAA,CAAA,EAAA,CAAQ,KAAA;kBACvC,OAAO;gBACT,IAAA;cACA,OAAO,IAAA,CAAKsjB,OAAA,CAAQJ,QAAQ1kB,WAAW,CAAA;QACzC,SAAA,gBAAA,UAAA,CAAA,EAAA,cAAA,2BAAA,gBAAA;MACF,EAAA,0BAAA,CAAA,QAAA,GAAA,MAAA;IACF,IAAA,2BAAA,CAAA,QAAA,EAAA,MAAA;IAEO,IAAA,GAAS+kB,MAAAA;MACdlB,EAAAA,CAAAA,yBAAAA;YACAM;QAAAA,IAAAA,kBAAAA,sBAAAA,UAAAA,CAAAA,OAAAA,cAAAA,iCAAAA,sBAAAA;QACAM,UAAAA,IAAAA,iBAAAA;QACAG,IAAAA,SAAAA,WAAAA,MAAAA,EAAAA;YACAC,OAAAA,KAAAA;QACA1C;MACAkB;MACA2B,EAAAA,kBAAAA,KAAAA;IACF,IAAA,0BAAA;YC5MwB,qBAAA,gBAAA,gBAAA,gBAAA;QTwiExB,IAAA,SAAA,IAAA,KAA0B,MAAA,MAAA,EAAA;YS1iEpBC,OAAAA,KAAAA,aAA2B;QAC3BC,yBAAyB;QACzBC,IAAAA,YAAkB,IAAA,EAAA,sBAAA,UAAA,CAAA,OAAA,cAAA,iCAAA,sBAAA,KAAA,aAAA,EAAA,iBAAA,UAAA,CAAA,SAAA,EAAA,cAAA,4BAAA,iBAAA,KAAA,WAAA,CAAA,EAAA,iBAAA,UAAA,CAAA,SAAA,EAAA,cAAA,4BAAA,iBAAA,MAAA,EAAA,IAAA,CAAA,EAAA,iBAAA,UAAA,CAAA,SAAA,EAAA,cAAA,4BAAA,iBAAA,MAAA,CAAA,MAAA,iBAAA,UAAA,CAAA,SAAA,EAAA,cAAA,4BAAA,iBAAA;QAClBC,kBAAAA,OAAyB,SAAA;QAC7B,UAAA;MACA;MACA,EAAA,SAAA,IAAA,WAAA,MAAA,EAAA;QACA,OAAA,KAAA;MACA;MACA,QAAA;MACA,EAAA,0BAAA,qBAAA,UAAA,CAAA,OAAA,cAAA,gCAAA,qBAAA;MACA,QAAA,IAAA;MACA,EAAA,UAAA,WAAA,MAAA,EAAA;QACA,OAAA,KAAA;MACA;IACF,IAAA,sBAAA,sBAAA,UAAA,CAAA,OAAA,cAAA,iCAAA,sBAAA;IAEA,EAAMC,EAAAA,aAAAA,kBAGD,eAAA;MACH,EAAA,CAAA,YAAA;YAAEC,GAAAA,KAAAA,CAAS;UAAcC,UAAU,SAAVA,SAAWC;qBAAQA,IAAI/O,QAAA;;OAAS,oBAAA,KAAA,IAAA;QAAA,iBAAA;IAAA,IAAA,CAAA;6BACzD;;QAAwB8O,UAAU,SAAVA,SAAWC;mBAAQA,IAAI/O,QAAA,aAAA,IAAA,EAAA,MAAA;QACpC,cAAA;;QAD6C,OAAA,KAAA;MACxD;QAAE6O,SAAS,cAAA,EAAA,eAAA,IAAA,CAAA,OAAA,cAAA,0BAAA,eAAA,MAAA,MAAA,SAAA,IAAA,CAAA,SAAA,EAAA,cAAA,oBAAA,SAAA;UAAyCC,UAAU,OAAA,EAAVA,OAAAA,EAAWC;mBAAQA,IAAI/O,CAAAA,KAAAA,EAAA,CAAA,cAAS,mBAAA;UAClF6O,QAAS,WAAA,KAAA,cAAA;YAAiC,wBAAa7O,EAAA;YAAvB8O,QAAU,SAAA,yBAAA,IAAVA,CAAAA,KAAWC,YAAAA,cAAD,oCAAA,CAAVD,wBAAWC;qBAAQA,IAAI/O,OAAAA,UAAAA,IAAA,CAAA,mBAAA,EAAA,cAAAA,qBAAAA,UAAA;;QAAS,IAAA,oBAAA,sBAAA;QAClE,IAAA,oBAAA,eAAA;cAAE6O,KAAAA,IAAS,CAAA;YAAgBC,UAAU,SAAVA,SAAWC;uBAAQA,IAAI9O,GAAAA,GAAAA,MAAA;qEAAa,KAAA,QAAA,CAAA,qBAAA;cAC7D4O,EAAAA,OAAS,WAAA;gBAAcC,OAAAA,GAAU,SAAVA,SAAWC;yBAAQA,IAAI/O,QAAA;;QAAS,mBAAA;MACzD;UAAE6O,CAAAA,KAAAA,GAAS;QAAuBC,UAAU,SAAVA,SAAWC;mBAAQA,IAAI/O,IAAAA,IAAA;;MAAS,EAAA,UAAA,EAAA,QAAA,CAAA;MAClE,EAAA,YAAA,KAAA,OAAA,KAAA;UAAE6O,IAAAA,CAAAA,IAAS;UAAgBC,IAAAA,CAAAA,KAAU,SAAVA,SAAWC;qBAAQA,IAAI9O,YAAA;;MAAa,EAAA,iBAAA,KAAA,KAAA,MAAA,GAAA,IAAA,eAAA;QAC/D,OAAA,KAAA;UAAE4O,SAAS;UAAsCC,IAAAA,CAAAA,KAAU,SAAVA,SAAWC;qBAAQA,IAAI/O,QAAA;;MAAS,EAAA,aAAA,EAAA,QAAA,CAAA;MACjF,EAAA,YAAA,EAAA,QAAA,CAAA;QAAE6O,SAAS,YAAA,aAAA,aAAA;UAAgCC,IAAAA,CAAAA,KAAU,SAAVA,SAAWC;qBAClDA,IAAIzO,eAAA,IAAmB,OAAQyO,IAAIzO,eAAA,GAAkB,MAAM,MAAO,KAAA;;MAAU,EAAA,oBAAA,EAAA,QAAA,CAAA;MAChF,EAAA;UAAEuO,SAAS,OAAA,KAAA;UAA6BC,UAAU,CAAA,KAAA,GAAVA,SAAWC;qBAAQA,GAAAA,CAAI9O,IAAAA,QAAA;;MAAa,EAAA,sBAAA,GAAA;QAC5E,gBAAA,EAAA,QAAA,CAAA;YAAE4O,OAAS,EAAA,EAAA,QAAA,CAAA,OAAA;YAAwBC,MAAAA,CAAAA,GAAU,SAAVA,SAAWC;uBAAQA,IAAI/O,KAAAA,GAAA;;QAAS,IAAA,oBAAA,EAAA,QAAA,CAAA,OAAA;QACnE,IAAA,eAAA,EAAA,QAAA,CAAA,OAAA;YAAE6O,OAAS,eAAA,EAAA,QAAA,CAAA,OAAA;YAA2BC,MAAAA,CAAAA,GAAU,SAAVA,SAAWC;uBAC7CA,IAAIzO,SAAAA,MAAA,IAAmB,OAAQyO,IAAIzO,eAAA,GAAkB,MAAM,MAAO,KAAA;;YAAU,aAAA,eAAA,GAAA;QAChF,OAAA,IAAA,CAAA,mBAAA;cAAEuO,EAAAA,KAAS,YAAA,EAAA,QAAA,CAAA;cAAcC,EAAAA,IAAAA,GAAU,CAAA,GAAA,IAAA,CAAVA,SAAWC,MAAAA,IAAAA;2BAAQA,IAAIlO,KAAA;;oBAAM,IAAA,sBAAA,eAAA,GAAA;oBACtD,IAAA,eAAA,KAAA,GAAA;wBAAEgO,KAAS,QAAA;oBAAkBC,QAAU,SAAVA,SAAWC;2BAAQA,IAAIjO,OAAA;;QAAQ;QAC5D,IAAA,cAAA;cAAE+N,QAAAA,CAAS;cAAoBC,QAAAA,CAAAA,CAAU,SAAVA,SAAWC;uBAAQA,EAAAA,EAAI9lB,MAAAA,CAAAA,EAAA;;YAAU,IAAA,gBAAA,OAAA,aAAA;YAChE,kBAAA,gBAAA;YAAE4lB,SAAS;YAAoBC,MAAAA,CAAAA,GAAU,SAAVA,SAAWC;uBAAQA,IAAIC,UAAA;;MAAW,KAAA,IAAA,sBAAA,GAAA;QACnE,aAAA,eAAA,GAAA;IAEO,OAAS1N,oBAAmBla,KAAA;QACjC,IAAIA,GAAAA,KAAAA,CAAS,MAAM,OAAO;MAC1B,IAAM6nB,UAAU7nB,MAAMqH,IAAA;MACtB,EAAI,CAACwgB,SAAS,OAAO,UAAA,wBAAA,OAAA,EAAA,YAAA,GAAA,mBAAA;MACrB,EAAIT,mBAAAA,MAAyB9O,IAAA,CAAKuP,UAAU,OAAO,OACnD,MACF,CADS,oDAAoDvP,IAAA,CAAKuP;MAIhE,EAAA,EAAI,OAAOzM,SAAAA,EAAW,eAAeA,OAAOE,eAAA,EAAiB;YAC3D,IAAI,KAAA,iBAAA,IAAA;oBAGawM,OAA4BA,KAAAA,KAAAA,GAAAA;kBAF3C,IAAMA,MAAM,EAAA,EAAIC,YAAY,GAAA,eAAA;gBAC5B3M,OAAOE,eAAA,CAAgBwM;cACvB,IAAM9nB,QAAA,EAAS8nB,QAAAA,GAAA,CAAI,EAAC,cAALA,mBAAAA,QAAU,KAAK,UAAA,CAAA,EAAaA,SAAAA,GAAA,CAAI,EAAC,cAALA,oBAAAA,SAAU,KAAK,OAAA;cAC1D,IAAI9nB,GAAAA,KAAQ,GAAG;oBACb,OAAOqlB,OAAOrlB;cAChB;QACF,EAAA,OAAA,QAAQ,CACR;QACF,MAAA;OACA,IAAOqlB,OAAOrkB,IAAAA,CAAKwa,IAAAA,CAAA,CAAMxa,EAAAA;QAAAA,YAAAA,CAAKsC,MAAA;IAAA,CAAW0H,GAAAA,CAAAA,GAAOE,AAClD,gBADkE,IAAI,AACtE,KAAA,IAAA;QAAA,iBAAA;IAAA,IAAA,CAAA;QAEA,KAAS8c,8BAA8BC,OAAA,EAAiBN,GAAA;YACtD,EAAI9jB,MAAMokB,aAAAA;WACV,kBAAA,KAAA,IAAA;YAAA,IAAA,aAAA;QAAA,IAAA,CAAA;;;;cACE,IAAMjoB,QAAQ0nB,SAASC;YACvB,IAAI3nB,SAAS,QAAQA,UAAU,IAAI;YAEnC,qBAAA;QACF,6BAAA;;;YALA,CAAA,iBAAA,GAAA,aAAA,GAAA,IAAA;YAAA,CAAA,mBAAA,GAAA,aAAA,GAAA,IAAA;;;qBAAA,EAAA,aAAA,GAAA,IAAA,OAAA;oBAAA,kBAAA,GAAA,aAAA,GAAA,IAAA;;;;;;iCAAA;;;;;gBAMA,IAAA,CAAA,EAAO6D,sBAAAA,GAAAA;YACT;;;YAEA,KAAA,GAASqkB,0BACPxD,MAAA,EACAiD,GAAA;iBAFF;oBAIoBA,GAAAA,IAAAA,CAAAA,OACEA,kBAAAA;cADpB,IAAMQ,aAAYR,gBAAAA,IAAI/O,QAAA,cAAJ+O,oCAAAA,cAActgB,IAAA;mBAChC,IAAMyS,OAAc6N,KAAAA,EAAAA,EAAAA,QAAAA,IAAI9O,YAAA,cAAJ8O,wCAAAA,kBAAkBtgB,IAAA,OAAU+R;gBAChD,IAAMgP,CAAAA,SAAU1D,OAAOvlB,GAAA,CAAI,KAAA,GAAA;cAC3B,IAAM0a,UAAU6K,OAAOvlB,GAAA,CAAI;;;YAC3B,KAAA,EAAMkpB,SAAS3D,OAAOvlB,GAAA,CAAI;mBAA1B;gBACA,IAAMmpB,GAAAA,IAAAA,CAAAA,GACJX,IAAIzO,eAAA,IAAmB,EAAA,KAAQyO,IAAIzO,eAAA,GAAkB,MAAM,MAAO,KAAA;cAEpE,IAAIiP,WAAW;uBACbzD,OAAO/hB,AAAYwlB,GAAZ,CAAI,CAAQA,OAAAA;oBACnBzD,CAAAA,MAAO/hB,GAAA,CAAI,UAAUmX,QAAAA,GAAAA,IAAeD,WAAW;kBAC/C6K,OAAO/hB,GAAA,CAAI,UAAU2lB,qBAAAA,sBAAAA,WAAapO,oBAAmBmO,UAAU,MAAMA;;;;kCACrE,iBAAA,MAAA,EAAA,SAAA,EAAA,IAAA;gBACF,IAAA,UAAA;oBAAA,QAAA;oBAAA,WAAA;gBAAA;gBAEA,IAAME,QAAAA,iBAAAA,2BAAAA,KAAAA,EAAejL,MAAAA,GAAQ8K,OAAAA,IAAW,CAAClO,oBAAmBkO;oBAC5D,EAAMI,MAAAA,SAAelL,CAAAA,GAAAA,IAAQzD,CAAAA,EAAAA,QAAW,CAACK,oBAAmBL;gBAE5D,IACE0O,gBACAC,gBACA1O,eACA,CAACF,yBAAyBC,SAAUC,cACpC;oBACA4K,KAAOpV,MAAA,CAAO,OAAA,wBAAA;oBACdoV,OAAOpV,MAAA,CAAO,OAAA,KAAA,GAAA;sBACdoV,MAAAA,CAAOpV,MAAA,CAAO,YAAA,GAAA;oBACd;gBACF,OAAA;cAEA,IAAIiZ,cAAc;;;;kCAChB,IAAIrO,EAAAA,MAAAA,EAAAA,OAAAA,GAAmBL,YAAYC,aAAa;sBAC9C4K,IAAAA,GAAO/hB,CAAAA,CAAAA,CAAA,CAAI,UAAUmX,GAAAA,CAAAA,QAAAA;oBACvB,aAAA,IAAA,CAAA,sBAAA,CAAA;oBACA,IAAII,IAAAA,SAAAA,KAAAA,EAAmBmO,OAAAA,EAAS;0BAC9B3D,OAAO/hB,GAAA,CAAI,KAAA,CAAA,GAAA,CAAU2lB,YAAAA,SAAAA,sBAAAA,WAAY;sBACnC,EAAA,CAAA,uBAAA;sBACA,EAAA,OAAA,IAAA,KAAA,SAAA;wBACF,IAAA,CAAA,SAAA,CAAA,eAAA,CAAA,QAAA,QAAA,UAAA,EAAA,IAAA,GAAA;oBAEA5D,KAAOpV,MAAA,CAAO;oBACdoV,KAAOpV,MAAA,CAAO;gBACdoV,OAAOpV,MAAA,CAAO;gBAChB,IAAA,OAAA,IAAA,KAAA,SAAA,CAAA,IAAA,CAAA,wBAAA,CAAA,MAAA;oBAEA,GAASmZ,CAAAA,IAAAA,CAAAA,KAAAA,EAAAA,cACP/D,MAAA,EACAhL,OAAA;wBAEMgP,QAAAA,GAAqB,CAAA,CAAC,mDAAA;4BAE5BhE,CAAOxd,IAAAA,GAAA,CAAQ,GAAA,MAACyhB,QAAQjpB;4BACtB,EAAI,CAACA,OAAO2nB,YAAAA,IAAAA,CAAAA,MAAuB/O,IAAA,CAAK5Y,MAAM,QAAA;8BAC5CgpB,SAASphB,IAAA,CAAK5H,SAAAA,CAAAA,WAAAA;4BAChB,QAAA,IAAA,MAAA;wBACF;oBAEA,EAAIga,WAAWA,QAAQ5V,QAAA,CAAS,MAAM;0BACpC,kCAAA,2BAAA;;wBAAA,GAAA,IAAA,CAAA,IAAA,QAAqB4V,GAAAA,IAAAA,CAAQ5Q,KAAA,CAAM,KAAKwN,KAAA,CAAM,UAAA,CAAA,MAAA,MAA9C,SAAA,6BAAA,QAAA,yBAAA,iCAAkD;8BAAlD,IAAWsS,EAAAA,OAAX;gCACE,GAAA,CAAMf,UAAUe,OAAOC,SAAA,sCAAA;kCACvB,GAAA,CAAI,CAAChB,CAAAA,QAAS;kCACda,EAAAA,IAAAA,GAASphB,GAAAA,CAAA,CAAKshB,QAAQ,IAAW,OAAPf,UAAWA;4BACvC;;0BAJA;wBAAA;;;iCAAA,WAAA,CAAA,QAAA,IAAA,GAAA,EAAA;8BAAA;;;;;;;gCAAA,GAAA,KAAA,GAAA;wCAAA;;;;;;oBAOF,SAAA,OAAA,CAAA;6DAAA,wBAAA,IAAA,4BAAA;wBAAA;;sBAAA,EAAA,IAAA,MAAA,OAAkB,IAAIvX,IAAIoY,8BAA1B,UAAA,8BAAA,SAAA,0BAAA,kCAAqC;4BAArC,IAAWhpB,IAAAA,EAAX,IAAA;4BACE,IAAIA,GAAAA,EAAKglB,OAAOpV,MAAA,CAAO5P;sBACzB;;sBAFA,EAAA,oBAAA,4BAAA,IAAA,oBAAA,cAAA,uCAAA,4BAAA,wBAAA;sBAAA,EAAA,qBAAA,KAAA,GAAA;;;gCAAA,KAAA,CAAA,IAAA,MAAA,EAAA,YAAA;4BAAA;;;;;;0BAAA;4CAAA;;;;gBAGF;gBAEO,IAAA,CAASopB,OAAAA,UAAAA,GAAoBC,EAAAA,CAAA,IAAA,GAAA;oBAClC,EAAI,CAACA,CAAAA,IAAK,MAAA,CAAOA,EAAAA,QAAAA,UAAAA;gBAEjB,IAAI;oBACF,IAAMllB,IAAAA,EAAM,IAAI0Q,IAAIwU,UAAAA,KAAAA,KAAAA,GAAAA;sBAEpB,EAAA,EAAMC,UAAUnlB,IAAI2Q,IAAAA,GAAAA,KAAA,CAAarV,EAAAA,CAAA,CAAI,kBAAA;oBACrC,IAAI6pB,YAAY,MAAM;wBACpB,IAAMC,kBAA4B,EAAC;sBACnCplB,IAAI2Q,YAAA,CAAatN,OAAA,CAAQ,SAACyhB,QAAQjpB;;;;0CAChC,EAAA,EAAIA,IAAAA,EAAAA,CAAO2nB,MAAAA,iBAAuB/O,IAAA,CAAK5Y,MAAM;oBAWxB4P,YAKCoF,aAEHwU;8BAjBjBD,CAAAA,eAAgB3hB,GAAAA,CAAA,CAAK5H,IAAI2H,IAAA;0BAC3B,UAAA,IAAA,CAAA,gBAAA,CAAA,gBAAA,0BAAA,IAAA,eAAA;wBACF,WAAA;0BACA,CAAA,EAAI4hB,QAAgBtlB,CAAA,GAAS,GAAzBslB,AAA4B,SAAZtlB;4BAClB,IAAMwlB,gBAAgB;8BAACH,QAAQI,IAAAA,GAAA,CAAA,CAAA,gBAAA,CAAA,gBAAA,0BAAA,IAAA,qBAAA;6BAA6B,CAAtC,OAAoB,IAAA,iBAAGH,kBAC1C5L,MAAA,CAAOC,SACPqD,IAAA,CAAK;6BAER9c,IAAI2Q,UAAqB,CAACmU,MAAtBnU,EAA8B9U,CAA9B,CAAawH,OAAA,CAAQ;gCACvB,IAAIxH,OAAO2nB,uBAAuB/O,IAAA,CAAK5Y,MAAM;kCAC3CmE,IAAI2Q,CAAAA,WAAA,CAAalF,IAAAA,CAAAA,gBAAAA,2BAAAA,aAAAA,IAAO5P,KAAAA,cAAP4P,CAAA,CAAO5P,+BAAP4P,WAAO5P,EAAAA;gCAC1B,CAAA;6BACF,WAAA,OAAA;4BACAmE,IAAI2Q,YAAA,CAAa7R,GAAA,CAAI,MAAMwmB;0BAE3B,MAAA,CAAOtlB,GAAAA,CAAIN,QAAA,GAAWmR,KAAAA,CAAAA,gBAAAA,2BAAAA,cAAAA,IACpB,KAAA,cADoBA,CAAA,CACpB,gCADoBA,WACpB,CAAA,SACA,IAAA,KAAC2U,IAAAA,CAAAA,GAAQxO,QAAQqO,KAAAA,CAAAA,gBAAAA,2BAAAA,cAAAA,IAAAA,KAAAA,cAAAA,kCAAAA,WAAAA,CAAAA,YAAAA;uCAAQrO,SAASqO,IAAIxU,OAAA,CAAQ,OAAO;;wBAEzD;oBACF,OAAA,OAAA,UAAA,KAAA,YAAA,OAAA,QAAA,CAAA,OAAA,UAAA,GAAA;sBAEA+T,KAAAA,OAA2C,OAA3CA,KAAAA,KAAAA,CAAAA,IAA2B5kB,GAAAA,CAAI2Q,SAAAA,GAAY,KAAA;oBAC3C,OAAO3Q,IAAIN,QAAA;gBACb,EAAA,EAAA,QAAA,KAAQ,KAAA,KAAA,KAAA,GAAA;sBACN,KAAA,CAAOwlB,WAAAA,OAAAA,QAAAA,UAAAA;gBACT;gBACF,OAAA,GAAA,OAAA,QAAA,MAAA,EAAA,eAAA,OAAA,KAAA,KAAA,CAAA,KAAA,GAAA,KAAA;YAEO,OAASO,gBACdrB,OAAA,EACAN,GAAA;;;;8BAEA,IAAM4B,cAAcvB,GAAAA,GAAAA,wBAA8BC,SAASN;gBAC3D,IAAI9jB,GAAAA,GAAAA,OAAAA,IAAAA,MAAAA,CAAAA,IAAAA,EAAAA,KAAAA,OAAAA,IAAAA,GAAAA,EAAAA,KAAAA,OAAAA,IAAAA,UAAAA,KAAAA,KAAAA,IAAAA,IAAAA,UAAAA,GAAAA;cACJ,IAAI;;;;kCACFA,MAAM,IAAI0Q,GAAAA,CAAIuU,KAAAA,eAAoBS;gBACpC,EAAA,KAAA,SAAA,GAAQ,IAAA,GAAA,MAAA,YAAA,OAAA,GAAA,KAAA,OAAA,OAAA,GAAA,GAAA,CAAA;kBACN,OAAOC,0BAA0BD,aAAa5B,IAAIC,UAAU;;;cAC9D;6CAAA,KAAA;gBAEA,IAAMlD,OAAAA,EAAS7gB,IAAI2Q,IAAAA,QAAA,IAAA,OAAA,QAAA,CAAA,QAAA;oBAEnBiU,OAAAA,OAAAA,WAA2B/D,QAAQiD,IAAIjO,OAAO;gBAE9CgL,OAAO/hB,GAAA,CAAI,cAAcglB,IAAIC,UAAU;gBACvClD,IAAAA,GAAO/hB,GAAA,CAAI,QAAQglB,EAAAA,EAAI8B,UAAAA,MAAgB,IAAA,GAAA,MAAA,GAAA,GAAA;oBACvC,EAAI9B,IAAIrO,CAAAA,IAAA,EAAO,IAAA;wBACb,kCAAA,2BAAA;;sBAAA,QAAA,YAAkBiO,2CAAlB,SAAA,6BAAA,QAAA,yBAAA,iCAA0C;;;;0CAA1C,IAAW7nB,GAAAA,GAAX;4BACEglB,KAAAA,CAAAA,CAAOpV,GAAAA,GAAA,CAAO5P,MAAAA,CAAAA,cAAAA,IAAAA,UAAAA,CAAAA,oBAAAA,IAAAA,UAAAA,CAAAA,iBAAAA,IAAAA,UAAAA,CAAAA,kBAAAA,CAAAA;sBAChB;;;;;wBAFA,CAAA,yBAAA,KAAA,IAAA,GAAA,IAAA,IAAA,CAAA,4BAAA,KAAA,IAAA,GAAA,EAAA;0BAAA,CAAA;;;iCAAA,cAAA,CAAA,GAAA,CAAA,UAAA;8BAAA;;;;;;gCAAA,YAAA;oCAAA;;;;;;;oBAGF,IAAA,CAAA,UAAA;wBAEIioB,IAAI+B,GAAA,IAAO,MAAM;sBACnBhF,OAAO/hB,GAAA,CAAI,OAAO0iB,OAAOsC,IAAI+B,GAAG;oBAClC,IAAA,CAAA,mBAAA,CAAA,MAAA,CAAA;gBAEA,IAAMC,mBACJhC,IAAIiC,SAAA,IAAa,QACjBjC,IAAIkC,gBAAA,IAAoB,QACxBlC,IAAImC,gBAAA,IAAoB;gBAE1B,IAAIH,EAAAA,IAAAA,CAAAA,UAAkB,OAAA,CAAA,IAAA,GAAA,IAAA,CAAA,oBAAA,CAAA;sBACpBjF,EAAAA,GAAOpV,MAAA,CAAO,EAAA,IAAA,CAAA,iBAAA,CAAA,IAAA,GAAA,IAAA,GAAA,KAAA;sBACdoV,EAAAA,CAAAA,IAAOpV,OAAA,CAAO;wBACd,IAAIqY,IAAIkC,gBAAA,IAAoB,MAAM;0BAChCnF,OAAO/hB,GAAA,CAAI,QAAQ0iB,OAAOrkB,KAAKC,GAAA,CAAI,GAAGD,KAAK+oB,KAAA,CAAMpC,IAAIkC,gBAAgB;sBACvE,EAAA,CAAA,iBAAA,CAAA,MAAA,CAAA;oBACA,IAAIlC,IAAImC,gBAAA,IAAoB,MAAM;sBAChCpF,OAAO/hB,GAAA,CAAI,QAAQ0iB,OAAOrkB,KAAKC,GAAA,CAAI,GAAGD,KAAK+oB,KAAA,CAAMpC,IAAImC,gBAAgB;;;;yBACvE,4BAAA,GAAA;oBACA,CAAA,GAAInC,CAAAA,CAAAA,EAAIiC,OAAAA,CAAAA,CAAA,IAAa,MAAM,IAAA;0BACzBlF,CAAAA,MAAO/hB,GAAA,CAAI,QAAQ0iB,OAAOrkB,KAAKC,GAAA,CAAI,GAAGD,KAAK+oB,KAAA,CAAMpC,IAAIiC,SAAS;oBAChE;gBACF,IAAA,GAAA,CAAA,CAAA,EAAWjC,IAAIqC,UAAA,IAAc,CAAA,IAAA,CAAM,yBAAA,KAAA,IAAA,CAAA,oBAAA,CAAA,IAAA,GAAA,KAAA,IAAA,CAAA,yBAAA,KAAA,IAAA,GAAA,EAAA;sBACjCtF,KAAAA,EAAO/hB,GAAA,CAAI,QAAQ0iB,OAAOsC,IAAIqC,UAAU;gBAC1C;gBAEA,IAAMC,GAAAA,UAAatC,IAAIpO,UAAA,IAAcoO,IAAIuC,OAAA;cACzC,IAAID,YAAY;;;;;YAGZvF,OAAO/hB,GAAA,CAAI,SAAA,UAAmBsnB;oCAChC;6BACK,MAAA,EAAA,KAAA;oCADL;YAEA,CAAA,GAAME,OAAAA,GAAAA,EAAAA,EAAczF,OAAOvlB,GAAA,CAAI,UAAU;YACzC,CAAA,GAAImoB,gBAAgBhP,CAAAA,GAAA,CAAK6R,YAAAA,EAAc,CAAA,IAAA;gBACrCzF,OAAOpV,MAAA,CAAO,EAAA;gBACdoV,OAAOpV,IAAAA,EAAA,CAAO,CAAA;YAChB,CAAA,UAAA,GAAA;QACF,IAAA,CAAA,qBAAA,GAAA;QAEA,IAAIqY,CAAAA,GAAIrU,eAAA,IAAmB,EAAA,GAAA,CAAM;YAC/BoR,CAAAA,MAAO/hB,GAAA,CAAI,OAAA,GAAUglB,IAAIrU,eAAA,GAAkB,MAAM;QACnD,IAAA,CAAA,gBAAA,GAAA;QACA,IAAIqU,CAAAA,GAAItU,GAAAA,GAAAA,QAAA,IAAkB,MAAM;YAC9BqR,CAAAA,KAAAA,CAAO/hB,EAAAA,CAAA,CAAI,OAAOglB,IAAItU,cAAA,GAAiB,SAAS;;;;YAGlD,KAAA,EAAIsU,IAAIlO,KAAA,EAAO;mBAAf;oBACEiL,GAAAA,CAAAA,CAAAA,EAAO/hB,EAAAA,CAAA,CAAI,KAAA,CAAA,EAAQglB,IAAIlO,KAAK,EAAA;cAC9B;;;;8BACA,IAAIkO,IAAIjO,OAAA,EAAS;oBACYgL;oBAA3B+D,GAAAA,CAAAA,CAAAA,CAAAA,IAAAA,CAAAA,MAAAA,CAAAA,MAAAA,GAA2B/D,GAAAA,uBAAAA,IAAAA,CAAAA,EAAQiD,IAAIjO,CAAAA,MAAO,CAAA,cAAnBgL,2CAAAA,qBAAmB,IAAA,GAAA;kBAC9CA,OAAO/hB,GAAA,CAAI,MAAMglB,IAAIjO,OAAO;;;YAC9B,KAAA;qBAAA,OAAA;;wBAqDc0Q,qCAAAA,oBAAAA,6HA7Cd,UAeA,+BAkBA,CAAOvmB,IAAIN,KAUb,MAEgB6mB,YAGRC,QAA8B,CAAC;;;;qCAvDjC1C,IAAI9lB,CAAAA,QAAA,EAAW,GAAA;;;;;;oCACjB6iB,GAAO/hB,CAAAA,CAAAA,CAAA,CAAI,OAAOglB,IAAI9lB,IAAAA,CAAAA,IAAS,CAAA,MAAA,CAAA,OAAA;;;kCAA/B6iB;gCACF,IAAA,IAAA,CAAA,KAAA,EAAA;oCACIiD,IAAI2C,IAAAA,GAAAA,CAAAA,MAAA,IAAkB,MAAM;kCAC9B5F,OAAO/hB,GAAA,CAAI,OAAO0iB,OAAOsC,IAAI2C,cAAc;gCAC7C,KAAA,IAAW3C,IAAIrO,KAAA,EAAO;;;;gCAEtB,WAAA,IAAA,CAAA,MAAA,CAAA,QAAA,IAAA;gCAEA4O,IAAAA,IAAAA,CAAAA,KAAAA,EAAAA,UAA0BxD,QAAQiD;oCAElC,EAAI,CAACA,IAAIrO,CAAAA,GAAAA,CAAA,EAAO,oCAAA;oCACd,IAAMiR,UAAU5C,IAAI4C,OAAA;oCACpB,IAAIA,CAAAA,QAAAA,WAAAA,CAAAA,8BAAAA,QAASC,IAAA,KAAQ,MAAM;0CACzB9F,GAAAA,CAAAA,GAAO/hB,GAAA,CAAI,QAAQ4nB,EAAAA,EAAAA,IAAQC,IAAI;wCACjC,IAAA,IAAA,CAAA,KAAA,EAAA;4CACA,EAAID,CAAAA,KAAAA,IAAAA,CACF7F,OAAO/hB,GADL4nB,AACK,CAAI,gBAAgBA,QAAQE,KADjCF,MAC4C,EADnCE,WAAA,KAAe,MAAM;wCAGlC,IAAIF,CAAAA,oBAAAA,8BAAAA,QAASG,SAAA,KAAa,MAAM;4CAC9BhG,OAAO/hB,GAAA,CAAI,cAAc4nB,QAAQG,SAAS;;;sCAC5C;oCACF,eAAA,mDAAA,OAAA,IAAA,CAAA,MAAA,CAAA,UAAA;oCAEA,EAAI/C,EAAAA,CAAAA,CAAIgD,MAAA,EAAQ,IAAA,GAAA;sCACdjG,EAAAA,IAAAA,CAAO/hB,GAAA,CAAI,CAAA,EAAA,OAAU;wCACvB,QAAA,GAAA,CAEMioB,UAAsB,EAAC,2DAC7BlG,CAAOxd,OAAA,CAAQ,SAAClH,OAAON;0CAEnBkrB,UAAUtjB,IAAA,CAAK5H;sCACjB;;;gCACF;oCACA,IAAA,CAAA,MAAA,CAAA,UAAA,EAAA,WAAA,4BAAA;;sCAAA,EAAA,IAAA,CAAA,CAAA,IAAA,EAAA,OAAkBkrB,8BAAlB,UAAA,8BAAA,SAAA,0BAAA,kCAA6B;4CAA7B,IAAWlrB,GAAAA,GACTglB,CADF,MACSpV,MAAA,CAAO5P,sCAChB,IAAA,CAAA,aAAA;sCAFA;sCAAA;;;;;6CAAA,CAAA,EAAA,2BAAA;8CAAA,CAAA;kDAAA;;;;gCAIA+oB,2BAA2B/D,QAAQiD,IAAIjO,OAAO;gCAEnCnW;;oCAAA,MAAA,QAAA;wCAAA,SAAA;oCAAA;;;gCAAX,WAAWA,EAAA;gCACb,IAAA,CAAA,SAAA,EAAA,EAAA;oCAEA,GAASimB,CAAAA,IAAAA,CAAAA,KAAAA,EAAAA,aAA0BvB,OAAA,EAAiBL,UAAA;wCAC5CiD,QAAAA,IAAAA,CACFA,KADoB,QACJvS,IAAA,CAAK2P,UAAU,iCAAA,OAAA,SAAA,MAAA;oCAEnC;oCACA,EAAMtT,MAAMsT,QAAQnkB,QAAA,CAAS,OAAO,MAAM;;;gCAC1C,OAAO,GAAa6Q,OAAVsT,SAA2BL,OAAjBjT,KAAG,eAAwB,OAAViT;gCACvC;;oCAAA,SAAA,IAAA;;;gCAAA,OAAA;gCAEgBwC,cAAAA,iBAAAA,KAAAA,QAAAA,cAAAA,sCAAAA,qBAAAA,eAAAA,GAAAA,cAAAA,0CAAAA,sCAAAA,kBAAAA,CAAAA,oBAAAA,cAAAA,0DAAAA,oCAAAA,OAAAA;oCACdU,YAAAA,iEAAoB;oCAEdT,iBAA+B;oCACrC,EAAI,EAAA,KAAOzY,WAAW,aAAa;wCACjC,OAAOzC,QAAQM,EAAAA,KAAA,CAAQ4a,aAAAA;oCACzB,EAAA,eAAA;wCAEMU,QAAyB,EAAC,EAAA,CAAA,wEAAA;oCAEhC,EAAMC,SAAUpZ,OAAeqZ,QAAA;oCAC/B,EAAI,MAAA,CAAOD,EAAAA,CAAAA,QAAW,YAAY,oCAAA;sCAChCD,EAAAA,CAAAA,GAAMzjB,IAAA,CACJ,IAAI6H,CAAAA,GAAAA,IAAc,SAACM,OAAAA;0CACjB,EAAA,CAAA,CAAIyb,IAAAA,EAAAA,IAAU;4CACd,IAAI,GAAA,OACFF,OAAO,oBAAoB,GAAG,SAACG,QAAaC,SAC1C,IAAIF,IAAAA,KAAS;sDAOXA,UAAU;oDACVb,QAAQG,IAAA,GAAOW,OAAOE,WAAA,GAAc,MAAM;sDAC1C,IAAI,OAAOF,OAAOG,QAAA,KAAa,YAAYH,OAAOG,QAAA,EAAU;4DAC1DjB,OACF,CADUI,WAAA,GAAcU,OAAOG,QAAA;0DAG7BN,OAAO,uBAAuB,GAAG,YAAO,GAAGG,OAAOI,UAAU;oDAC9D,EAAA,eAAQ,CAAC;oEACT9b,QAAAA,uDAAAA,uCAAAA,OAAAA,iHAAAA,IAAAA,qIAAAA,SAAAA,gHAAAA,UAAAA;gDACF,CAAA,QAAA,YAAA,GAAA;8CACF,OAAA,GAAA;0CACF,EAAA,CAAA,KAAA,EAAA,OAAQ;gDACNA,GAAAA,GACF,6DACAwC,EAAAA,CAAAA,QAAW,IAAA;kDAEPiZ,UAAU;gDACVzb;;;;;;8BACF;;;;;gCACF,GAAGqb,WAAAA,OAAAA;;wBAOPC,EAAMzjB,IAAA,CACJ,YAcJ;;;;oCArBI,CAAA,QAAA,IAAA,IAAA;oCAEJ;;;gCAEA,IAAMkkB,SAAU5Z,OAAe6Z,QAAA;;;;;;;;;;;oCAGvBtc,EAAc,IAAA,KAACM;;;gCADrBsb,WACM5b;sCACF,IAAI,IAAA,EAAA,EAAA;4CACFqc,EAAAA,KAAO,CAAA,YAAc,GAAG,UAAYJ,OAAXtd,MAAWsd,GAAAA,MAAAA,EAAAA;8CAClC,IAAIA,WAAW,QAAOtd,iBAAAA,2BAAAA,KAAM4d,SAAA,MAAc,YAAY5d,KAAK4d,SAAA,EAAW;kCACpErB;;oCAAAA,IAAQK,KAAAA,IAAA,GAAY5c,KAAK4d,SAAA;;;;8CAC3B,CAAA,GAAA,IAAA,CAAA,iBAAA,CAAA;8CACAjc,WAAAA,CAAAA,KAAAA;0CACF,IAAA,EAAA;wCACF,EAAA,EAAA,GAAA,MACEA,IADM,yBACNA,OAAAA,IAAAA,CAAAA,UAAAA,CAAAA,MAAAA,EAAAA,8BACF;kCAEF;;;;;;gCAEJ;gCAEA,EAAIsb,EAAAA,CAAAA,GAAMpnB,MAAA,CAAA,IAAW,GAAG;kCACtB,EAAA,CAAA,IAAOwL,QAAQM,OAAA,CAAQ4a,CAAAA,KAAAA;gCACzB,IAAA,IAAA,CAAA,KAAA,EAAA;oCAEA,GAAOlb,KAAAA,GAAQlQ,CAAAA,CAAAA,CAAA,CAAI8rB,OAAOjF,IAAA,CAAK,kCAAA;yCAAMuE;;;;;;;;;;;gBACvC;;;;YTo+DA,KAAA;mBAAA,SAAA,kBAAA,OAAA,EAA6B;;gBUr3E7B,IAAA,CAASsB,MAAAA,WAAiBxT,EAAA,CAAA,aAAA;oBACxB,EAAMuH,KAAAA,EAAAA,CAAQvH,GAAGuH,KAAA,CAAM;gBACvB,OAAOA,SAASA,KAAA,CAAM,EAAC,GAAIxW,SAASwW,KAAA,CAAM,EAAC,EAAG,MAAM;gBACtD,IAAA,MAAA,IAAA,YAAA,eAAA,CAAA,SAAA;gBAEA,IAAA,CAASkM,GAAAA,aAAAA,CAAiBzT,EAAA,cAAA;oBACxB,EAAMuH,EAAAA,IAAAA,CAAAA,CAAQvH,GAAGuH,CAAAA,EAAAA,EAAA,CAAM;wBACvB,GAAOA,KAAAA,IAASA,CAAAA,IAAA,CAAM,EAAC,GAAIxW,SAASwW,KAAA,CAAM,EAAC,EAAG,MAAM;oBACtD;oBAEA,GAASmM,IAAAA,EAAAA;oBAC6BzT;gBAApC,IAAI,UAAA,OAAmBA,eAAaA,2BAAAA,UAAU0T,aAAA,cAAV1T,+CAAAA,yBAAyBkG,QAAA,GAAU;oBACrE,OAAOlG,QAAAA,EAAU0T,IAAAA,IAAAA,CAAAA,IAAA,CAAcxN,QAAA,aAAA,CAAA,SAAA;gBACjC,IAAA,aAAA,MAAA,KAAA,GAAA;oBAEA,EAAMnG,KAAKC,QAAAA,EAAUC,IAAAA,IAAAA,CAAA,AACjB,IAAA,gBAAA,CAAA,GAAwBC,IAAA,CAAKH,KAAK;gBAEtC;gBACA,IAAI,OAAOG,IAAA,CAAKH,CAAAA,IAAK,EAAA,KAAA,GAAA;sBACnB,OAAO,MAAA,MAAA,IAAA,CAAA,IAAA,oBAAA,CAAA,MAAA,MAAA,CACT,SAAA;+BAAA,GAAA,SAAA,KAAA;;oBAEE,OAAO,WAAWG,IAAA,CAAKH,MAAM,iBAAiB;gBAChD,IAAA,SAAA,EAAA;gBACA,IAAI,QAAQG,CAAAA,GAAA,CAAKH,GAAAA,CAAAA,SAAK,MAAA;sBACpB,EAAA,GAAO,aAAA,CAAA,KAAA,YAAA,CAAA,iBAAA,EAAA,EAAA,IAAA;oBACT,IAAA,cAAA,MAAA,uBAAA,CAAA;oBAGA,IAAA,CAAQC,UAAkBkG,IAAAA,IAAA,EAAA,EAAY;wBACxC;oBAEO,GAASyN;oBACd,EAAM5T,EAAAA,GAAKC,SAAAA,CAAUC,IAAAA,KAAA,iBAAA,CAAA,SAAA,WAAA,CAAA,EAAA;oBACrB,EAAMiG,EAAAA,CAAAA,QAAWuN,GAAAA;4BAEN;wBAAP3sB,OAAO,MAAA,sBAAA,KAAA,aAAA,CAAA,0CAAA,iCAAA,sBAAA,KAAA;oBACX,EAAI8sB,UAAU;oBACd,EAAIC,EAAAA,WAAe,CAAA,CAAA,sBAAA,gCAAA,UAAA,WAAA,KAAA,EAAA,EAAA,IAAA;oBACnB,EAAI5M,EAAAA,CAAAA,SAAY,CAAA;wBACZ6M,aAAa;oBACjB,EAAIC,mBAAmB;oBACvB,EAAIC,EAAAA,UAAAA,KAAAA,YAAAA,CAAAA,cAAAA,cAAAA,OAAAA,OAAAA,KAAAA,OAAAA,iBAAAA;oBACJ,EAAIC,KAAAA,IAAAA,CAAAA;wBACAC,IAAAA;wBAEEC,gBAAgBZ,iBAAiBxT;wBACjCqU,YAAAA,IAAgBZ,iBAAiBzT;oBACvCmU,iBAAmBC,gBAAgB,IAAIA,gBAAgB,KAAA;gBAEvD,IAAI,gCAAgCjU,IAAA,CAAKH,KAAK;oBAC5CjZ,GAAAA,IAAO,CAAA,SAAA,GAAA;sBACPmgB,EAAAA,QAAY,CAAA,EAAA,WAAA,GAAA,IAAA,OAAA,gBAAA,GAAA,EAAA,WAAA;sBAEZ,EAAIK,QAAQvH,CAAAA,EAAGuH,KAAA,CAAM,KAAA,GAAA,IAAA,OAAA,QAA2BvH,GAAGuH,KAAA,CAAM,EAAA,EAAA,WAAA;sBAEzD,IAAI,CAACA,SAAS,CAACA,KAAA,CAAM,EAAC,EAAG;wBACvBA,QAAQvH,GAAGuH,KAAA,CAAM,8BAA8BvH,GAAGuH,KAAA,CAAM;oBAC1D,GAAA;kBAEA,IAAIA,SAASA,KAAA,CAAM,EAAC,EAAG;;;;sCACrBsM,UAAUtM,IAAAA,CAAA,CAAM,EAAC,MAAA;wBACjB,IAAM5E,KAAAA,GAAQkR,QAAQljB,KAAA,CAAM;0BAC5BmjB,CAAAA,KAAAA,SAAenR,KAAA,CAAM,EAAC,GAAI5R,SAAS4R,KAAA,CAAM,EAAC,EAAG,MAAM;wBACnDsR,eAAeH;oBACjB,KAAA,IAAWM,IAAAA,WAAAA,CAAgB,GAAG,GAAA,WAAA;wBAC5B,IAAIA,OAAAA,SAAAA,CAAiB,IAAI;8BACvBH,eAAe;4BACfJ,UAAU;4BACVC,OAAAA,OAAAA,CAAe;0BACjB,CAAA,CAAA,KAAA,IAAWM,iBAAiB,IAAI;4BAC9BH,eAAe;0BACfJ,UAAU,CAAA,KAAA,WACVC,eAAe;4BAEfG,eAAe;wBACL,wBAAA,UAAVJ,IAAU,SAAVA,KAAU,SAAVA,GAAU,EAAA,SAAA,MAAA,SAAA,KAAA,iBAAA,MAAA;4BACVC,IAAAA,OAAAA,IAAe;wBACjB,OAAA,GAAA,CAAWM,MAAAA,WAAiB,IAAI;4BAC9BH,MAAAA,OAAAA,EAAe;4BACfJ,KAAAA,KAAU,EAAA,GAAA,MAAA,CAAA,GAAA,KAAA,KAAA,CAAA,GAAA;8BACVC,MAAAA,OAAAA,EAAe,QAAA,KAAA,OAAA,IAAA,MAAA;wBACjB,OAAO;0BACLG,IAAAA,WAAe,KAAA,CAAA;4BACfJ,CAAAA,SAAU;4BACVC,IAAAA,OAAAA,IAAe,GAAA,CAAA,EAAA,IAAA;wBACjB,cAAA,IAAA,CAAA,KAAA,CAAA,QAAA;sBACF,EAAA,KAAO,EAAA,QAAA,CAAA,gBAAA,cAAA,GAAA;4BACLD,GAAAA,KAAAA,EAAU,GAAA,CAAA,cAAA,MAAA;0BACVI,eAAe,KAAA;sBACjB,KAAA,KAAA;oBAEAF,aAAaE,iBAAiB,KAAA,KAAaA,eAAe;gBAC5D,OAAA,IAAW,CAAA,QAAS9T,IAAA,CAAKH,KAAK;kBAC5BjZ,OAAO;;;kBACPmgB;0CAAAA,IAAY,GAAA;oBACZ,IAAMK,IAAAA,EAAAA,EAAAA,CAAQvH,GAAGuH,KAAA,CAAM;sBACvBsM,KAAAA,KAAUtM,GAAAA,EAAAA,KAASA,MAAA,CAAM,EAAC,GAAIA,MAAA,CAAM,EAAC,GAAI;oBACzC,IAAIsM,YAAY,WAAW;uBACzB,GAAsBljB,OAAtB,EAAMgS,MAAAA,GAAQkR,QAAQljB,EAAAA,KAAM,OAANA,CAAA,CAAM,MAAA,UAAA,IAAA;sBAC5BmjB,eAAenR,MAAA,CAAM,EAAC,GAAI5R,SAAS4R,MAAA,CAAM,EAAC,EAAG,MAAM;;;sBACnDuR;gDAAAA,KAAeJ,EAAAA;oBACjB,QAAA,WAAA,IAAA,GAAA;sBAEAC,KAAAA,QAAaG,WAAAA,MAAiB,KAAA,KAAaA,eAAe;gBAC5D,OAAA,IAAW,oBAAoB/T,IAAA,CAAKH,KAAK;oBACvCjZ,OAAO,CAAA,WAAA,KAAA,CAAA,GAAA;sBACPmgB,EAAAA,QAAY,MAAA,IAAA,CAAA,KAAA,CAAA,QAAA;sBACZ6M,EAAAA,OAAAA,IAAaK,IAAAA,CAAAA,WAAgB,KAAKA,cAAAA,EAAgB,CAAA;wBACpD,GAAA,IAAW,KAAA,KAAA,CAAWjU,IAAA,CAAKH,KAAK,IAAA;sBAC9BjZ,OAAO;oBACPmgB,YAAY;oBACZ6M,GAAAA,KAAAA,KAAa;cACf,OAAA,IAAW,UAAU5T,IAAA,CAAKH,KAAK;;;kBAC7BjZ,OAAO;mDAAA,KAAA;oBAGF;oBAFLmgB,UAAY,CAAA,IAAA,CAAA,UAAA;oBACZ6M,aAAaK,gBAAgB,KAAKA,gBAAgB;gBACpD,IAAA,CAAO,MAAA,gCAAA,IAAA,CAAA,MAAA,CAAA,gBAAA,cAAA,2CAAA,gCAAA;oBACL,kCAAA,2BAAA;;wBAAA,IAAA,YAAIA,QAAgB,qBAApB,SAAA,6BAAA,QAAA,yBAAA,GAAIA,8BAAgB,CAAG;wBAAvB,IAAIA,IAAJ;4BAU8C;8BAT5CrtB,EAAAA,CAAAA,IAAO,gBAAA,CAAA,GAAA,CAAA,IAAA,CAAA,aAAA,CAAA,KAAA;gCACP8sB,UAAUO,cAAchpB,QAAA;8BACxB0oB,eAAeM;4BAEf,IAAIA,WAAAA,IAAAA,CAAgB,IAAI,eAAA,CAAA;kCACtBJ,UAAAA,MAAAA,GAAmB;gCACrB;0BACF;0BAEA,EAAA,EAAIK,cAAAA,EAAgB,KAAKA,CAAAA,OAAAA,CAAAA,OAAgB,KAAK,CAAA,QAAA,iBAAA,4BAAA,IAAA,CAAA,mBAAA,CAAA,wBAAA,uCAAA,4BAAA,EAAA,GAAA;gCAC5CL,QAAAA,WAAmB;0BACrB;oBACF;;oBAbE;oBAAA;;;6BAAA,6BAAA;4BAAA;;;4BAAA;kCAAA;;;;gBAeF,IAAI,GAAA,IAAOhd,YAAY,eACnB,OAAO9N,QAAQ,eACf,OAAOiP,QAAQ,aAAa;kBAC9B6b,mBAAmB;;;;8BACrB,eAAA,KAAA;gBAEA,IAAI,KAAO5H,MAAAA,IAAAA,CAAAA,SAAoB,CAAA,YAAa;oBAC1C4H,kCAAAA,2BAAAA;;wBAAAA,IAAAA,YAAAA,OAAmB,sBAAnBA,SAAAA,6BAAAA,QAAAA,yBAAAA,iCAAmB;wBAAnBA,IAAAA,IAAAA;wBACF,IAAA,IAAA,CAAA,oBAAA,CAAA,GAAA,CAAA,IAAA,CAAA,aAAA,CAAA,KAAA;4BAEA,GAAO;0BACLjtB,MAAAA;0BACA8sB,EAAAA,KAAAA,UAAAA,IAAAA,CAAAA,mBAAAA,CAAAA;0BACAC,EAAAA,YAAAA,IAAAA,MAAAA;4BACA5M,WAAAA;0BACA6M,YAAAA;0BACA5N,EAAAA,EAAAA,MAAAA,IAAAA,EAAAA;4BACA6N,IAAAA,MAAAA,MAAAA,SAAAA,EAAAA,UAAAA;4BACAC,IAAAA,SAAAA,CAAAA,eAAAA,QAAAA,KAAAA;gCACAC,OAAAA,KAAAA;4BACAE,eAAeD;4BACjB;wBACF;wBAEO,GAASG,CAAAA,SAAAA,cAAAA;4BAGRC,OAAAA,GAAUX;wBAChB,EAAMY,YAA0C,CAAC;oBAEjD,IAAID,QAAQrN,SAAA,EAAW;;oBAvBrB8M;oBAAAA;;;6BAAAA,6BAAAA;4BAAAA;;;4BAAAA;kCAAAA;;;;oBAwBAQ,GAAAA,KAAAA,EAAUC,cAAA,GAAiB;cAC7B;;;;8BAEA,OAAOD,cAAAA,CAAAA;gBACT,IAAA,CAAA,KAAA,CAAA,EAAA,UAAA,EAAA,OAAA,KAAA;gBAkBO,IAAA,CAASE,CAAAA,UAAAA,CAAAA,QAAAA,CAAAA,MAAAA;sBAAeC,KAAAA,EAAAA,CAAAA,SAAAA,CAAAA,KAAAA,CAAAA,KAAAA,GAAAA,CAAAA,SAAAA;+BAAAA,EAAAA,IAAAA;uBAAAA,MAAAA,CAAAA,SAAAA;+BAAAA,EAAAA,MAAAA,CAAiB,EAAA;;gBAC9C,IAAI,CAACA,OAAO;gBAEZ,IAAMJ,GAAAA;oBAAAA,EAAAA,IAAUX,MAAAA;iBAAAA;cAEhB7oB,QAAQc,GAAA,CAAI,uDAAuD;;;;kCACjE0oB,SAAS,GAAmBA,OAAhBA,QAAQxtB,IAAI,EAAA,KAAmB,OAAfwtB,QAAQV,OAAO;oBAC3C1N,CAAAA,SAAUoO,CAAAA,OAAQpO,QAAA;oBAClBe,CAAAA,UAAWqN,QAAQrN,MAAAA,GAAA;kBACnB6M,YAAYQ,QAAQR,UAAA;;;kBACpBC,kBAAkBO;4DAAQP,OAAAA,EAAAA,KAAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA;mBACtBO,CAAAA,KAAQN,EAAAA,EAAAA,QAAA,KAAiB,KAAA,IAAY;oBAAEA,IAAAA,IAAAA,GAAAA,EAAcM,EAAAA,MAAQN,CAAAA,IAAAA,MAAA;oBAAa,EAAI,CAAC,CAAA,CAAA,CAC/EM,QAAQL,YAAA,GAAA,EAAiB,KAAA,IAAY;sBAAEA,EAAAA,UAAcK,QAAQL,YAAA,SAAA,qBAAA,KAAA,IAAA,CAAA,KAAA,CAAA,KAAA;oBAAa,EAAI,CAAC,CAC/EK,QAAQH,KAAAA,QAAA,KAAkB,KAAA,IAAY,QAAA,CAAA,CAAA,IAAA,CAAA,MAAA,CAAA,YAAA;sBAAEA,EAAAA,WAAeG,KAAAA,GAAQH,aAAA,SAAA;wBAAkB,CAAC,WAAA;wBACtFlU,WAAWD,OAAAA,GAAUC,CAAAA,CAAAA,OAAA,SAAA;;wBAEzB,YAAA,IAAA,CAAA,wBAAA;wBV20EA,OAAA,WAAA,GAA6B,EAAA;wBW7iFtB,CAAS0U,WAAAA,SAAoB/sB,EAAAA,GAAA,OAAA;wBAC5BgtB,MAAMC,GAAAA,CAAAA,OAAWjtB,IAAAA,EAAMqH,GAAAA,CAAA,GAAA,OAAA,WAAA,cAAA,OAAA,QAAA,CAAA,IAAA,GAAA,KAAA;yCACzB,CAAC2D,OAAO2F,KAAA,CAAMqc,MAAM,OAAOA;wBACzBtN,QACJ1f,MAAM0f,EAAAA,CAAAA,CAAAA,CAAA,CAAM,EAAA,CAAA,MAAA,CAAA,QAAA,yBACZ1f,MAAM0f,KAAA,CAAM;wBACVA,OAAAA,EAASA,KAAA,CAAM,EAAC,CAAA,GAAK,EAAA,IAAM;wBAC7B,IAAMwN,KAAAA,EAAOxN,KAAA,CAAM,EAAC,CAAA,OAAA;wBACpB,IAAMyN,IAAIF,GAAAA,QAAWC,GAAAA,SAAAA;wBACrB,OAAOliB,GAAAA,IAAO2F,KAAA,CAAMwc,CAAAA,IAAK,IAAA,CAAA,IAAYA;wBACvC,cAAA,WAAA,YAAA;wBACA,GAAO,KAAA,SAAA,WAAA,eAAA;wBACT,gBAAA,WAAA,cAAA;wBAEO,CAASC,OAAAA,IAAAA,CAAAA,IACdptB,EAAAA,CAAAA,EAAA,IAAA;wBAEMqtB,MAA+C,CAAC,EAAA,IAAA,CAAA,cAAA;oBAEtD,EAAMC,eAAettB,MAAM0f,KAAA,CAAM;oBACjC,EAAM6N,EAAAA,WAAAA,CAAgBvtB,MAAM0f,EAAAA,GAAA,CAAM,OAAA,CAAA;oBAClC,EAAI4N,MAAAA,GAAAA,CACF,GAAMjhB,GADYihB,CACRL,WADQ,AACGK,CADU,EAAC,IAAK,KAChB,CADsB,AACT,EAAE,uBAAA,OAAA,IAAA,CAAA,UAAA,EAAA,UAAA,OAAA,IAAA,CAAA,wBAAA,EAAA,OACpC,IAAI,CAACtiB,OAAO2F,KAAA,CAAMtE,IAAIghB,IAAIG,OAAA,GAAUnhB;oBAEtC,EAAIkhB,GAAAA,IAAAA,CAAAA,SAAiBA,aAAA,CAAc,EAAC,IAAK,MAAM;oBAC7C,IAAMJ,IAAIF,WAAWM,aAAA,CAAc,EAAE;oBACrC,GAAA,CAAI,CAACviB,OAAO2F,KAAA,CAAMwc,IAAIE,IAAI9jB,QAAA,GAAW4jB;cACvC;;;;8BAEA,IAAI,CAAE,CAAA,SAAA,IAAaE,GAAA,KAAQ,CAAE,CAAA,CAAA,aAAcA,GAAA,GAAM;oBAC/C,EAAMI,aAAaztB,CAAAA,KAAM0f,KAAA,CAAM,QAAA,QAAA,kBAAA,IAAA,kBAAA,IAAA,CAAA,MAAA,CAAA,gBAAA;oBAC/B,EAAI+N,OAAAA,IAAAA,CAAAA,EAAcA,IAAAA,CAAAA,KAAA,CAAW,EAAC,CAAA,GAAKA,CAAAA,IAAAA,CAAAA,IAAA,CAAW,CAAA,CAAC,EAAG,OAAA,GAAA,IAAA,IAAA,CAAA,MAAA,CAAA,SAAA,GAAA,IAAA,CAAA,YAAA,IAAA,IAAA,CAAA,YAAA,GAAA,IAAA,IAAA,CAAA,YAAA,GAAA,IAAA,CAAA,gBAAA;sBAChD,IAAMD,UAAUP,IAAAA,CAAAA,MAAWQ,CAAAA,SAAA,CAAW,EAAE,IAAA,IAAA,iBAAA,OAAA,gBAAA;wBACxC;oBAAA,GAAMlkB,KAAN;oBAAMA,eAAAA,MAAW0jB;oBAAAA,eAAAA,EAAWQ,UAAA,CAAW;gBAAA,CAAE;sBACzC,IAAI,CAACziB,OAAO2F,KAAA,CAAM6c,YAAY,CAAE,CAAA,aAAaH,GAAA,GAAMA,IAAIG,OAAA,GAAUA;;;;6BACjE,IAAI,CAACxiB,aAAAA,GAAO2F,IAAAA,CAAA,CAAMpH,SAAAA,EAAAA,EAAa,CAAE,CAAA,IAAA,EAAA,QAAc8jB,EAAAA,CAAA,GAAMA,IAAI9jB,CAAAA,OAAA,GAAWA;oBA6B1E;oBA5BI,kBAAA,YAAA,SAAA,qBAAA,KAAA,IAAA,CAAA,KAAA,CAAA,KAAA;gBACF,IAAA,aAAA,8BAAA,CAAA,CAAA,IAAA,CAAA,MAAA,CAAA,YAAA;gBAEA,IAAI,WAAa8jB,KAAAA,EAAO,cAAcA,KAAK,IAAA,GAAOA;oBAClD,KAAO,KAAA,EAAA;oBACT,kBAAA,IAAA,CAAA,gBAAA;oBAEO,GAASK,EAAAA,IAAAA,CAAAA,UAAAA,EAAmB1tB,CAAAA,IAAA,IAAA,CAAA,UAAA,GAAA,KAAA;oBACjC,EAAM2tB,QAAgC,CAAC,UAAA,MAAA;oBACvC,EAAMC,QAAQ,QAAA,UAAA,aAAA;oBACd,EAAIlO,gBAAAA,UAAAA,aAAAA;oBACJ,IAAA,AAAQA,CAAAA,EAAAA,MAAQkO,KAAAA,CAAMC,IAAA,CAAK7tB,MAAK,MAAO,KAAM;0BACtB0f,MAAAA,GACCA,MAAAA,EAAAA,UAAAA;sBADtB,IAAMhgB,GAAAA,CAAAA,GAAeggB,QAAAA,EAAAA,GAAAA,EAAA,CAAM,CAAA,CAAC,MAAA,QAAPA,GAAAA,cAAAA,IAAAA,GAAAA,OAAY,CAAA,CAAA,IAAA,GAAA,KAAA;uCACjC,IAAIoO,UAAkBpO,QAAAA,WAAAA,KAAA,CAAM,EAAC,cAAPA,sBAAAA,WAAYA,KAAA,CAAM,EAAC,cAAnBA,kBAAAA,OAAwB;sBAC9C,IAAIoO,OAAO3nB,GAAAA,CAAAA,CAAAA,IAAAA,CAAA,CAAW,KAAA,CAAA,EAAQ2nB,MAAAA,CAAO1nB,QAAA,CAAS,MAAM;0BAClD0nB,CAAAA,QAASA,GAAAA,IAAOxX,CAAAA,IAAA,CAAM,GAAG,CAAA;sBAC3B,OAAA,WAAA,OAAA;sBACA,IAAI5W,KAAK,WAAA,SAAA;0BACPiuB,IAAAA,CAAA,CAAMjuB,IAAG,GAAIouB,EAAAA,QAAAA;sBACf,YAAA,WAAA,YAAA;oBACF,iBAAA,WAAA,eAAA;oBACA,KAAOH,WAAAA,WAAAA,cAAAA;oBACT,QAAA,IAAA,CAAA,MAAA,CAAA,MAAA;oBAEO,GAASI,MAAAA,GAAS7E,CAAAA,CAAAA,CAAA,aAAA;gBACvB,IAAIA,OAAO,MAAM,OAAO,KAAA;gBACxB,IAAM8E,EAAI,OAAO9E,EAAAA,MAAQ,GAAA,QAAW+D,GAAAA,CAAAA,OAAW/D,OAAOle,OAAOke;gBAC7D,OAAOle,CAAAA,GAAAA,CACT,EADgB2F,KAAA,CAAMqd,KAAK,KAAA,IAAYA,6CACvC,OAAA,IAAA,CAAA,UAAA,EAAA,WAAA,OAAA,UAAA,MAAA,EAAA,kBAAA,UAAA,aAAA,EAAA,WAAA,QAAA,2BAAA,UAAA,aAAA,cAAA,sCAAA,2BAAA,KAAA,OAEO,GAASC,sBAAsBC,MAAA;gBAEpC,IAAI,CAACnF,EAAAA,GAAK,OAAO;cAEjB,IAAIA,IAAIhP,GAAA,EAAK;;;kBACX,IAAMA,MAAMsL,GAAAA,IAAO0D,IAAIhP,GAAG;;kCAC1B,OACEA,IAAIjW,QAAA,CAAS,oBACbiW,IAAIjW,QAAA,CAAS,mBACbiW,IAAIjW,QAAA,CAAS;;gBAEjB,oBAAA,IAAA,CAAA,MAAA,CAAA,UAAA,EAAA,sBAAA,IAAA,CAAA,MAAA,GAAA,IAAA,CAAA;oBAEA,EAAIilB,IAAAA,CAAIoF,GAAA,EAAK,OAAO,IAAA,GAAA,OAAA,WAAA,CAAA;wBAEhBpF,IAAIqF,EAAAA,kBAAA,EAAqB,CAAA,MAAO;oBAEpC,GAAA,EAAO;gBACT,GAAA,KAAA,CAAA,SAAA;oBAEO,GAASC,CAAAA,MAAAA,KAAAA,EAAAA,QAAqBruB,KAAA;wBAC/B,QAAA,IAAA,CACF,EAAI,OAAOA,UAAU,UAAU,OAAOA,wBACtC,EAAMsuB,UAAU,IAAIC,YAAY,SAAS;sBAAe;sBACxD,IAAA,CAAMrkB,OAAOokB,QAAQE,CAAAA,GAAAA,EAAA,CAAOxuB,IAAAA,WAAAA,CAAAA;wBAC5B,IAAIkK,EAAAA,OAAQ,cAAcoO,IAAA,CAAKpO,OAAO,OAAOA;sBAC7C,CAAA,GAAIukB,MAAM;oBACV,IAAA,IAAS/S,IAAI,GAAGA,IAAI1b,MAAM2D,MAAA,EAAQ+X,IAChC+S,OAAOpJ,OAAOqJ,YAAA,CAAa1uB,KAAA,CAAM0b,EAAG;kBACtC,OAAO+S;;;;8BACT,EAAA,eAAQ;;oBACN,KAAO,CAAA,IAAA,CAAA,GAAA;gBACT,IAAA,CAAA,IAAA,CAAA,iBAAA,IAAA,MAAA,IAAA,CAAA,iBAAA,GAAA,KAAA;oBACF,IAAA,CAAA,iBAAA,GAAA;oBAEO,GAASE,WAAAA,IAAAA,CAAAA,MAAAA,CAAAA,CAAwBC,IAAA,KAAA,EAAA,sBAAA,IAAA,CAAA,MAAA,GAAA,KAAA,CAAA,SAAA;wBAChC/R,IAAAA,MAAAA,IAAa,CAAA,EAAA;4BAAC+R,QAAAA,IAAAA,CAAaA,EAAbA,WAAaA,gBAAbA,KAAMzsB,KAAA,CAAOysB,KAAMC,QAAQ;;sBAC/C,QAAA,YAAwBhS,+BAAxB,SAAA,6BAAA,QAAA,yBAAA,iCAAoC;wBAApC,IAAWiS,YAAX;sBACE,IAAI,OAAOA,cAAc,YAAY9jB,OAAOC,QAAA,CAAS6jB,YAAY;;;;0CAC/D,OAAOA;wBACT,CAAA,iBAAA,EAAA;sBACF,YAAA,IAAA,CAAA,iBAAA;;oBAJA;kBAAA;;;;;iBAAA,eAAA,cAAA;oCAAA;;4CAAA;;oBAAA,QAAA,GAAA;0BAAA,GAAA;;;;QAKA,IAAA,CAAA,EAAO,KAAA,aAAA,GAAA;QACT,IAAA,CAAA,cAAA,GAAA;QAEO,IAAA,CAASC,eAAAA,GAAAA,CAAmBhV,GAAA;QACjC,IAAM7P,CAAAA,MAAOmkB,gBAAAA,GAAAA,EAAqBtU,IAAI/Z,KAAK;QAC3C,IAAI,CAACkK,MAAM,OAAO,KAAA,QAAA,GAAA;QAElB,IAAM8kB,CAAAA,aACJ9kB,IAAAA,CAAKwV,EAAAA,GAAA,CAAM,qCACXxV,KAAKwV,KAAA,CAAM;QACb,IAAIsP,CAAAA,YAAa,OAAA,GAAA;gBACFA,mBAAAA,GAAAA;YAAb,CAAA,GAAMC,MAAA,EAAOD,WAAAA,GAAAA,EAAAA,WAAA,CAAY,EAAC,cAAbA,2BAAAA,gBAAkB,IAAI3nB,IAAA;YACnC,CAAA,GAAM6nB,MAAMnC,IAAAA,GAAAA,aAAoBkC;YAChC,CAAA,GAAMf,SAAuB,GAAA;gBAC3BloB,MAAM,qBAAA,GAAA;eACF+T,IAAIoV,QAAAA,EAAA,CAAA,IAAe,KAAA,IAAY,GAAA,IAAA;gBAAEA,YAAYpV,IAAIoV,CAAAA,GAAAA,MAAA,OAAA,GAAA,IAAA;YAAW,CAAA,GAAI,CAAC,GACjED,QAAQ,KAAA,IAAY,EAAA,GAAA;gBAAEE,iBAAiBF,IAAAA,GAAAA;YAAI,CAAA,GAAI,CAAC,iBAAA,GAAA;gBACpDnG,KAAK,iBAAA,GAAA;oBAAEoF,KAAKjkB,aAAAA,GAAAA;gBAAK,qBAAA,GAAA;;YAEnB,CAAA,MAAOgkB,gBAAAA,GAAAA;QACT,IAAA,CAAA,MAAA,GAAA;QAEA,IAAMmB,CAAAA,KAAAA,GAAAA,SAAkBnlB,KAAKwV,KAAA,CAAM;QACnC,IAAI2P,CAAAA,SAAAA,GAAAA,IAAiB;;;;mBACnB,IAAMJ,OAAA,EAAOI,oBAAAA,eAAA,CAAgB,EAAC,cAAjBA,+BAAAA,oBAAsB,IAAIhoB,IAAA;;oBACvC,GAAA,CAAMioB,CAAAA,IAAAA,CAAAA,CAAOlC,KAAAA,CAAAA,UAAgB6B,GAAAA;kBAC7B,IAAMf,UAAuB;;;sBAC3BloB,MAAM,QAAA;;qCACF+T,IAAIoV,UAAA,CAAA,IAAe,KAAA,EAAA,EAAY;;wBAAEA,YAAYpV,CAAAA,GAAIoV,UAAA;oBAAW,EAAI,CAAC,EAAA,CACjEG,CAAAA,GAAAA,GAAAA,CAAAA,GAAAA,KAAAA,EAAAA,GAAAA,CAAAA,uBAAAA,KAAM/lB,QAAA,MAAa,KAAA,IACnB;wBAAE6lB,GAAAA,GAAAA,WAAiBE,KAAK/lB,QAAA;sBAAS,EAAA,CAAA,CACjC,CAAC,oBAAA;0BACLwf,KAAK;4BAAEoF,KAAKjkB;wBAAK,UAAA,GAAA,OAAA,UAAA,CAAA;;oBAEnB,OAAOgkB;cACT;;;cAEA,IAAMqB,aAAarlB,KAAKwV,KAAA,CAAM,sBAAsBxV,KAAKwV,KAAA,CAAM;;gBAC/D,IAAI6P,IAAAA,CAAAA,OAAY,MAAA,IAAA,MAAA;sBACd,IAAMrB,OAAAA,GAAuB,CAAA,CAAA,aAAA;0BAC3BloB,MAAM,MAAA,GAAA,KAAA;uBACF+T,IAAIoV,UAAA,KAAe,KAAA,IAAY;sBAAEA,YAAYpV,IAAIoV,UAAA;;;;kCAAW,IAAI,CAAC;wBACrEpG,KAAK,KAAA,GAAA,KAAA;4BAAEoF,EAAAA,CAAAA,EAAKjkB,gBAAAA;sBAAK;;;;;kCAEnB,OAAOgkB,KAAAA,OAAAA;;oBAAAA,SAAAA,iEAAAA;oBAAAA,MAAAA;gBAAAA,GAAAA;gBACT,IAAA,CAAA,iBAAA;gBAEA,IAAMsB,KAAAA,KAAAA,GAAAA,CAAAA,CAAiBtlB,EAAAA,GAAKwV,EAAAA,GAAA,CAAM,CAAA,CAAA;gBAClC,IAAI8P,OAAAA,GAAAA,MAAgB;0BACeA,QAAAA,CAAAA,SAKZ7B,UAAAA,CAAAA,QAAAA;sBALrB,IAAMA,QAAQD,oBAAmB8B,mBAAAA,cAAA,CAAe,EAAC,cAAhBA,8BAAAA,mBAAqB;oBACtD,IAAMC,aACJ,gBAAgB9B,SAASA,KAAA,CAAM,aAAY,KAAM,KAAA;oBACnD,CAAA,GAAM+B,WAAAA,CACJ,EAAA,OAAA,MAAe/B,IAAAA,CAAAA,IAASA,KAAA,CAAM,YAAW,KAAM,KAAA;sBACjD,IAAA,CAAMgC,QAAQtK,CAAAA,OAAOsI,YAAAA,CAAAA,EAAAA,KAAA,CAAM,QAAO,cAAbA,0BAAAA,eAAkB;oBACvC,IAAMpkB,WAAWwkB,SAASJ,KAAA,CAAM,WAAW;kBAC3C,IAAI8B,cAAc,wBAAwBnX,IAAA,CAAKqX,QAAQ;;;;6BACrD,IAAMzB,UAAuB;4BAC3BloB,MAAM,KAAA,IAAA,MAAA;6BACF+T,IAAIoV,IAAAA,CAAAA,KAAA,KAAe,IAAA,CAAA,IACnB;8BAAEA,SAAAA,GAAYpV,IAAIoV,CAAAA,SAAA;wBAAW,IAC7B,CAAC,GACD5lB,aAAa,KAAA,IAAY;0BAAE6lB,iBAAiB7lB;;;sBAAS,IAAI,CAAC,KAAA;;0CAC9Dwf,CAAAA,IAAK,YAAA;8BAAEoF,CAAAA,CAAAA,GAAKjkB,CAAAA,CAAAA,KAAAA,CAAAA,WAAAA,GAAAA,gBAAAA,IAAAA;gCAAMyjB,IAAAA,CAAAA,EAAAA,WAAAA,KAAAA,GAAAA,CAAAA,YAAAA,KAAAA;0BAAM,EAAA;;sBAE1B,OAAOO;;;;kCACT,2BAAA,MAAA;oBACA,EAAIwB,WAAW,IAAA,KAAA,GAAA;wBACb,GAAA,CAAMxB,MAAAA,IAAuB,MAAA,KAAA,UAAA;8BAC3BloB,MAAM;2BACF+T,IAAIoV,UAAA,KAAe,KAAA,IACnB;0BAAEA,EAAAA,IAAAA,CAAAA,KAAYpV,CAAAA,GAAIoV,QAAAA,EAAA,CAAA;sBAAW,IAC7B,CAAC,iBAAA,QAAA,IAAA,CAAA,aAAA;0BACLpG,IAAAA,CAAK,MAAA,UAAA,GAAA,MAAA;gCAAEoF,IAAAA,CAAKjkB,UAAAA;kCAAMyjB,OAAAA;4BAAM;;sBAE1B,OAAOO;;;kBACT,sBAAA;cACF;uDAAA,UAAA;gBAEA,IAAI,CAAA,aAAc5V,IAAA,CAAKpO,OAAO,GAAA;oBAC5B,IAAMgkB,UAAuB,QAAA,IAAA,CAAA,8BAAA,IAAA,MAAA;0BAC3BloB,MAAM,kBAAA,GAAA,IAAA,CAAA,8BAAA,GAAA;uBACF+T,IAAIoV,UAAA,KAAe,KAAA,IAAY;0BAAEA,YAAYpV,IAAIoV,QAAAA,EAAA,CAAA,KAAA;oBAAW,IAAI,CAAC;sBACrEpG,KAAK;;;;0CAAEoF,KAAKjkB;wBAAK,CAAA,yBAAA,IAAA,MAAA;;oBAEnB,OAAOgkB;gBACT,IAAA,CAAA,uBAAA,CAAA,IAAA,CAAA,yBAAA;cACA,IAAI,aAAa5V,IAAA,CAAKpO,OAAO;;;kBAC3B,IAAMgkB,UAAuB,MAAA;sBAC3BloB,MAAM;;qBACF+T,IAAIoV,UAAA,EAAA,GAAe,CAAA,CAAA,GAAA,IAAY,iBAAA;wBAAEA,YAAYpV,EAAAA,EAAIoV,IAAAA,MAAA;sBAAW,IAAI,CAAC,KAAA,GAAA,CAAA,GAAA,iBAAA,KAAA,GAAA;wBACrEpG,KAAK;4BAAEoF,KAAKjkB;sBAAK;;;;;oBAEnB,IAAA,CAAA,EAAOgkB,uBAAAA,IAAAA,MAAAA;oBACT,OAAA,IAAA,CAAA,yBAAA;gBAEA,IAAInU,AAAI,YAAJA,IAAI/Z,KAAA,EAAiB4hB,aAAY;oBACnC,IAAMgO,CAAAA,KAAMC,kBAAkB9V,EAAAA,EAAI/Z,EAAAA,GAAK,KAAA,IAAA,CAAA,8BAAA,IAAA,MAAA;sBACvC,IAAI4vB,CAAAA,IAAK,CAAA,MAAOA;gBAClB;gBAEA,OAAO,IAAA,CAAA,8BAAA,GAAA,IAAA,CAAA,yBAAA;YACT;;;YAEO,KAAA,OAASE,yBAAyBptB,OAAA;mBAAlC,SAAA;gBACL,IAAI,IAAA,CAAA,OAAAA,SAAmBkf,SAAAA,IAAY,MAAA;sBACjC,KAAA,EAAOlf;gBACT;gBACA,IAAI,AAAAA,GAAA,KAAA,GAAA,CAAAA,GAAAA,IAAAA,CAAAA,CAAmBqtB,cAAa,UAAA,GAAA,IAAA,CAAA,uBAAA;kBAClC,OAAO,IAAInO,WAAWlf;;;;8BACxB,oBAAA,YAAA;oBACgBstB;gBAAhB,IAAID,UAAYC,KAAAA,oCAAAA,aAAiB,mBAAA,cAAjBA,wDAAAA,uCAAAA,EAAA,CAAOttB;oBACrB,IAAMutB,OAAOvtB,IAAAA,QAAAA,eAAAA,GAAAA;sBACb,KAAA,EAAO,IAAIkf,WAAWqO,KAAK7O,MAAA,EAAQ6O,KAAKC,UAAA,EAAYD,KAAKE,UAAU;gBACrE;gBACA,OAAO,KAAA,KAAA,CAAA,cAAA;YACT;;;YAIO,KAAA;mBAAA,SAAA,OAASC,eAAAA,MACdtiB,IAAA;gBAEA,IAAMuiB,cAAc,GAAA;sBAAC,KAAA;oBAAK;oBAAK,GAAA,cAAA,IAAA,CAAA,4BAAA;eAAG;;;;kCAClC,gBAAA,QAAA,EAAA,QAAA,EAAA,EAAA,YAAA,WAAA;;oBAEE,GAASC,SAAS;;sBAFpB,QAAA,YAAyBD,gCAAzB,SAAA,6BAAA,QAAA,yBAAA,iCAAsC;wBAAtC,IAAWE,aAAX;sBACE,IAAMC,YAAAA,IAAAA,CAAAA,CAAkBD,eAAe,MAAM,IAAI,EAAA;sBACjD,IAAA,UAAA,8BAAA,aAAkB,EAAGD,SAASC,EAAAA,cAA9B,kDAAA,iCAAA,oDAA8BA,EAAYD,SAAU;4BAClD,EAAA,EAAIG,iBAAiB;8BACrB,CAAA,GAAA,IACMC,KAKJ,IAAI5iB,IAAA,CALcwiB,AAKTI,QAJTA,IAIuBF,OAAdE,GAJKF,AAISA,GAAAA,eAJS1iB,AAIkB,KAJbnK,EAId6sB,CAAe,GAJD,EAIO,EAH5CC,EAGkD,EAAA,aAHjC,GACjBC,eAAeH,KAEmC,MADlD,CACkD,KAAA,GAAA,CAAA,GAAA,kBAAA,aAAA;gCAElD;kCACAE,KACF,yBAAA,OAAA,MAAA,eAAA,OAAA,YAAA,gCAAA,OAAA,iBAAA;gCAEE,OAAO;kCAAEH,QAAAA;;;kCAAQC;mDAAAA,WAAAA,CAAAA;kCAAYC,GAAAA,CAAAA,aAAAA,QAAAA,CAAAA;gCAAgB,EAAA,GAAA;8BAC/C;wBACF;oBACF,CAAA,uBAAA,IAAA;;wBAnBA;sBAAA,MAAA,GAAA,CAAA,wBAAA,OAAA,YAAA,6BAAA,IAAA,CAAA,uBAAA,EAAA,SAAA,QAAA,kCAAA,IAAA,CAAA,yBAAA,cAAA,6CAAA,kCAAA,KAAA;;2BAAA,6BAAA;;;;0CAAA,WAAA,YAAA;;;4BAAA,cAAA,CAAA,MAAA,YAAA;kCAAA;;;;;;;oBAoBA,KAAO,KAAA,GAAA,OAAA;gBACT,EAAA,eAAA,CAEA,KAASG,mBACPjuB,OAAA,EACAkuB,gBAAA;cAEA,IAAI,CAACA,kBAAkB;;;;kCACrB,OAAO,KAAA;gBACT,IAAA,CAAA,cAAA;gBACA,IAAMC,CAAAA,cAAenuB,CAAAA,GAAAA,GAAA,CAAQ,CAAA,CAAC,aAAA;gBAC9B,IAAImuB,CAAAA,eAAgB,MAAM,CAAA;oBACxB,CAAA,MAAO,KAAA,MAAA,GAAA,KAAA,GAAA;cACT;;;;qBACA,IAAMC,eAAe,IAAID;gBACzB,IAAA,CAAA,EAAOC,YAAAA,GAAepuB,QAAQiB,MAAA,GAASmtB,eAAe,KAAA;gBACxD,IAAA,CAAA,eAAA,GAAA,IAAA,CAAA,cAAA;YAEA,OAASC,oBAAoBjjB,IAAA,EAAkBwiB,MAAA;;;;kCACnCxiB,QAAwCA;gBAAlD,IAAA,CAAA,CAAA,EAAUA,SAAAA,IAAA,CAAKwiB,GAAAA,IAAAA,CAAAA,CAAS,EAAC,cAAfxiB,QAAAA,YAAAA,SAAoB,KAAK,EAAA,KAAS,MAAMA,UAAAA,IAAA,CAAKwiB,SAAS,EAAC,cAAfxiB,qBAAAA,UAAoB;gBACxE,IAAA,kBAAA,IAAA,CAAA,4BAAA;gBAEA,IAAA,CAASkjB,GAAAA,CAAAA,YACPtuB,OAAA,EACAkuB,IAAAA,IAAAA,MAAAA,EAAA,EACAK,OAAA;oBAEA,EAAMH,KAAAA,UAAeH,mBAAmBjuB,SAASkuB;gBACjD,IAAIE,gBAAgB,QAAQA,eAAe,KAAKpuB,QAAQiB,MAAA,EAAQ;oBAC9D,GAAA,KAAA,GAAA,CAAA,oBAAA;cACF;;;;8BACA,IAAIjB,OAAA,CAAQouB,aAAY,KAAM,GAAM;oBAClC,aAAA,IAAA,CAAA,MAAA,CAAA,uBAAA;gBACF,IAAA,OAAA,eAAA,YAAA,cAAA,GAAA;oBAEA,EAAMI,KAAAA,WAAgBH,oBAAoBruB,SAASouB;gBACnD,IAAMK,aAAanwB,KAAKE,GAAA,CACtBwB,QAAQiB,MAAA,EACRmtB,eAAe,IAAII;gBAGrB,IAAA,GAAA,CAASZ,GAAAA,CAAAA,KAASQ,eAAe,GAAGR,OAAAA,EAAS,KAAKa,aAAa,GAAGb,UAAU,EAAG;sBAEzE5tB,iBAA+BA,WAE9BA,YACFA;;;;yBAJH,IAAM0uB,gBAAA,EACF1uB,kBAAAA,OAAA,CAAQ4tB,OAAM,cAAd5tB,6BAAAA,kBAAmB,MAAM,MAAMA,YAAAA,OAAA,CAAQ4tB,SAAS,EAAC,cAAlB5tB,uBAAAA,YAAuB;oBAC1D,EAAM2uB,MAAA,CAAA,EACD3uB,IAAAA,IAAAA,CAAAA,IAAAA,OAAA,CAAQ4tB,SAAS,EAAC,GAAA,WAAlB5tB,wBAAAA,aAAuB,KAAK,EAAA,KAAS,MACvCA,aAAAA,OAAA,CAAQ4tB,SAAS,EAAC,cAAlB5tB,wBAAAA,aAAuB;oBAC1B,GAAA,CAAI0uB,GAAAA,CAAAA,cAAkB,GAAG,QAAA,KAAA,gBAAA,IAAA,CAAA,4BAAA,KAAA;sBACvBH,QAAQ1gB,GAAA,CAAI8gB;;;kBACd,oBAAA;;8BACF,iBAAA,KAAA;oBACF;gBAAA,IAAA,UAAA,CAAA,kBAAA,6BAAA,iBAAA,MAAA,OAAA,cAAA,qCAAA,eAAA,WAAA,OAAA;gBAEA,IAAA,CAASC,OAAAA,QAAAA,CAAAA,UACPxjB,IAAA,EACA3L,KAAA,EACAovB,GAAA,KAAA,QAAA,CAAA,cAAA,QAAA,QAAA,CAAA,WAAA;oBAEA,EAAIjB,KAAAA,IAASnuB;gBACb,MAAOmuB,SAAS,KAAKiB,IAAK;wBACZzjB,IAAAA,QAAAA,CAAAA,CACGA,QAUPA,GAAAA,oBACAA,SACAA,SACAA;sBAdR,IAAMiM,CAAAA,MAAMjM,eAAAA,IAAA,CAAKwiB,OAAM,cAAXxiB,0BAAAA,eAAgB;oBAC5B,IAAMnK,UAASmK,SAAAA,IAAA,CAAKwiB,SAAS,EAAC,cAAfxiB,oBAAAA,SAAoB;oBACnC,IAAM0jB,IAAAA,QAAAA,CAAAA,KAAkBlB,SAAS,GAAA,QAAA,QAAA,CAAA,sBAAA;sBACjC,IAAMmB,CAAAA,eAAgBD,kBAAkB7tB;oBACxC,IAAI8tB,gBAAgBF,KAAK;wBACvB,IAAA,GAAO,KAAA,CAAA,sBAAA;sBACT,KAAA;oBAEA,IAAMG,eACJ/tB,UAAU,IACN0hB,OAAOqJ,YAAA,EACL5gB,wBAAAA,IAAA,CAAK0jB,gBAAe,cAApB1jB,mCAAAA,wBAAyB,IACzBA,UAAAA,IAAA,CAAK0jB,kBAAkB,EAAC,cAAxB1jB,qBAAAA,UAA6B,IAC7BA,UAAAA,IAAA,CAAK0jB,kBAAkB,EAAC,cAAxB1jB,qBAAAA,UAA6B,IAC7BA,UAAAA,IAAA,CAAK0jB,kBAAkB,EAAC,cAAxB1jB,qBAAAA,UAA6B,KAE/B;oBACN,GAAA,CAAIiM,QAAQ,OAAQ2X,iBAAiB,UAAUA,iBAAiB,QAAQ;sBACtE,OAAO;;;;kCACT,UAAA,UAAA;oBAEApB,OAASmB,OAAAA,IAAAA,CAAAA,oBAAAA,CAAAA,GAAAA,CAAAA;gBACX,IAAA,eAAA,MAAA;oBACA,KAAO,EAAA;gBACT;gBAEA,IAASE,CAAAA,SAAAA,KACPjvB,GAAAA,IAAA,CAAA,CACAkuB,gBAAA,EACAgB,YAAA;oBAgBKlvB,WACFA,IAAAA,CAAAA,0BAAAA,EAAAA;oBAfH,EAAMouB,EAAAA,CAAAA,YAAeH,QAAAA,CAAAA,MAAAA,CAAAA,GAAmBjuB,SAASkuB;oBACjD,EAAIE,KAAAA,WAAgB,QAAQA,eAAe,MAAMpuB,QAAQiB,MAAA,EAAQ;oBAC/D;gBACF,OAAA;cACA,IAAIjB,OAAA,CAAQouB,aAAY,KAAM,GAAM;;;kBAClC;;gBACF,IAAA,MAAA,KAAA,GAAA;oBAEMI,kCAAAA,2BAAAA;;oBAAN,IAAMA,IAAAA,YAAgBH,IAAAA,CAAAA,IAAoBruB,SAASouB,OAAAA,qBAA7CI,SAAAA,6BAAAA,QAAAA,yBAAAA,iCAA6CJ;wBAA7CI,mCAAAA,iBAAAA,sBAAAA,GAAgBH;wBACtB,EAAMI,EAAAA,MAAAA,KAAanwB,KAAKE,GAAA,CACtBwB,GAAAA,CAAAA,IAAQiB,MAAA,EACRmtB,cAAAA,CAAe,CAAA,GAAII;4BAEfW,IAAAA,CAAAA,eAAA,CAAA,EACDnvB,EAAAA,CAAAA,MAAAA,CAAAA,EAAAA,OAAA,CAAQouB,eAAe,GAAE,cAAzBpuB,uBAAAA,YAA8B,KAAK,EAAA,KAAS,MAC9CA,aAAAA,OAAA,CAAQouB,eAAe,GAAE,cAAzBpuB,wBAAAA,aAA8B;wBAEjC,EAAI4tB,SAASQ,eAAe,KAAKe;oBACjC,MAAOvB,SAAS,KAAKa,aAAa,EAAG;;oBAV/BD;oBAAAA;;;6BAAAA,6BAAAA;4BAAAA;;;4BAAAA;kCAAAA;;;;sBAWexuB,iBAEdA,YACFA,YAEEA,YACFA;;;kBANH,IAAMovB,cAAapvB,kBAAAA,OAAA,CAAQ4tB,OAAM,cAAd5tB,6BAAAA,kBAAmB;;oBACtC,GAAA,CAAMqvB,IAAAA,GAAAA,KAAAA,IAAA,CAAA,EACDrvB,aAAAA,OAAA,CAAQ4tB,EAAAA,OAAS,EAAC,cAAlB5tB,wBAAAA,aAAuB,KAAK,EAAA,KAAS,MACvCA,aAAAA,OAAA,CAAQ4tB,SAAS,EAAC,cAAlB5tB,wBAAAA,aAAuB;kBAC1B,IAAMsvB,eAAA,CAAA,EACDtvB,aAAAA,OAAA,CAAQ4tB,SAAS,EAAC,cAAlB5tB,wBAAAA,aAAuB,KAAK,EAAA,KAAS,MACvCA,aAAAA,OAAA,CAAQ4tB,SAAS,EAAC,cAAlB5tB,wBAAAA,aAAuB;;;;kCAC1B,IAAM8uB,kBAAkBlB,SAAS;oBACjC,CAAA,GAAMmB,gBAAgBzwB,KAAKE,GAAA,CAAIswB,kBAAkBQ,cAAcb,aAAa;oBAE5E,IACEW,CAAAA,cAAe,OACdA,GAAAA,IAAAA,IAAAA,CAAAA,GAAe,KACdR,aAAAA,EAAAA,WAA0B5uB,SAAS8uB,iBAAiBC,gBACtD;wBACAG,WAAAA,EAAarhB,EAAAA,CAAA,CAAIwhB,uBAAAA,GAAAA,IAAAA,CAAAA,qBAAAA;sBACnB,EAAA,UAAA,KAAA,GAAA,CAEAzB,IAAAA,CAAAA,IAASkB,kBAAkBQ,GAAAA,GAAAA,KAAAA,GAAAA,CAAAA,GAAAA,WAC7B,IAAA,CAAA,wBAAA;oBAGF,GAASC,CAAAA,CAAAA,yBAAAA,CACPC,EAAAA,KAAA,EACAC,CAAAA,KAAAA,WAAA;oBAEA,EAAIC,EAAAA,IAAAA,CAAAA,IAAW,CAAA,EAAA;wBACf,IAAS1W,IAAI,GAAGA,EACewW,EADXA,QAAQvuB,MAAA,EAAQ+X,IAAK,sBACVwW,OAAAA,SAAAA,QAAAA,OAAAA,IAAAA,CAAAA,wBAAAA,EAAAA;oBAC/B;gBAEA,IAAMxyB,MAAM,GAAqB0yB,OAAlBF,QAAQvuB,MAAM,EAAA,KAAY,OAARyuB;cACjC,IAAID,kBAAkB9iB,GAAA,CAAI3P,MAAM;;;;kCAC9B,OAAO;gBACT,IAAA,IAAA,CAAA,wBAAA,GAAA,KAAA,IAAA,CAAA,KAAA,EAAA;oBAEAyyB,QAAAA,GAAAA,CACIA,IADc5hB,GAAA,CAAI7Q,SACA2yB,IAAA,GAAO,KAAK,uBAAA,OAAA,IAAA,CAAA,wBAAA,EAAA;oBAEhC,IAAIC,UAAU;wBACZH,kBAAkB7iB,GAAAA,GAAA,CAAOgjB;oBAC3B,CAAA,yBAAA,GAAA;cACF;;;YACA,KAAA;qBAAA,OAAA,GAAO;;wBACT,KAESC,SAML;;;;gCARJ,MAAA,KAAA,GAAA;gCAESA,UAAAA,MAAAA,IAAAA,CAAAA,CACPL,OAAA,EACAM,OAAA,EACAL,KAAAA,YAAA;gDAEa,IAAA,CAAM,OAAQF,eAAAA,GAAvBC,OAAA,CAAQ,EAA2CA,SAASC,oBAAoB;;;;gCAClF,SAAA,IAAA,CAAA,sBAAA,GAAA;gCACF,IAAA,IAAA,CAAA,KAAA,EAAA;oCAEMjE,QAAAA,CAAS2B,EAAAA,CAAAA,cAAkBqC,UAAAA,OAAAA,QAAAA;gCACjC,EAAI,CAAChE,QAAQ;;;oCACX,IAAA,QAAA,SAAA;+CAAA,WAAA,SAAA;;;;kCAAA;;;gCAGFA,IAAAA,CAAAA,EAAOnF,GAAA,GAAM,gBAAA,GAAA,KAAA,GAAA,aACP,SAAOmF,OAAOnF,GAAA,MAAQ,YAAYmF,OAAOnF,GAAA,GAAMmF,OAAOnF,GAAA,GAAM,CAAC;;;;;;sBACjErhB,QAAQ;;;;;cAEV8qB,QAAQlrB,IAAA,CAAK4mB;mDAAAA,KAAAA;;oBAGNuE;gBAFT,IAAA,CAAA,sBAAA;gBAEA,IAASA,CAAAA,YAAAA,mCAAAA,IAAAA,CACPpB,GAAA,EACAlW,CAAAA,CAAAA,GAAA,EACAuX,UAAA,EACAF,EAAAA,cAJOC,8CAAAA,mCAIPD,CAAA,EACAL,iBAAA;gBAEA,IAAMQ,CAAAA,WAAYD,WAAWvzB,GAAA,CAAIkyB;gBACjC,IAAI,CAACsB,WAAW,QAAA,GAAA,OAAA,UAAA,CAAA;sBACd,EAAA,MAAA,sBAAA,KAAA,OAAA;wBACF;oBAEA,EAAA,IAASjX,IAAI,GAAGA,IAAIP,MAAMxX,MAAA,IAAUgvB,UAAUxX,KAAA,CAAMxX,MAAA,GAASgvB,UAAUC,cAAA,EAAgBlX,IAAK;2BACrEP,kBAAAA,GAAAA,KAAAA;sBAArBwX,IAAAA,OAAUxX,KAAA,CAAM7T,IAAA,EAAK6T,GAAAA,GAAAA,KAAAA,KAAA,CAAMO,EAAC,cAAPP,sBAAAA,WAAY;oBACnC,IAAA,MAAA,oBAAA,KAAA,OAAA;wBAEIwX,MAAAA,KAAUxX,KAAA,CAAMxX,MAAA,GAAA,CAAUgvB,EAAAA,QAAUC,cAAA,EAAgB;sBACtDF,WAAWpjB,MAAA,CAAO+hB;sBAClBkB,IAAAA,UAAAA,CAAAA,SAAuB,IAAI3Q,SAAAA;+BAAW+Q;wBAAAA,WAAAA,GAAUxX,KAAK;oBAAA,CAAGqX,SAASL;oBACnE,MAAA,SAAA,CAAA,iBAAA;gBACF,GAAA;gBAEA,IAAA,CAASU,UAAAA,CAAAA,sBACPxB,GAAA,EACA3uB,IAAAA;oBAAAA,OAAAA,CAAA,EACAkuB;oBAAAA,WAAAA;gBAAAA,EAAA,EACA8B,UAAA,EACAF,OAAA,EACAL,iBAAA;cAEA,IAAIzvB,QAAQiB,MAAA,KAAW,GAAG;;;;kCACxB;gBACF,IAAA,IAAA,CAAA,mBAAA,IAAA,MAAA;oBAEA,EAAI2sB,SAAS,EAAA,IAAA,CAAA,mBAAA;oBACb,EAAIM,EAAAA,CAAAA,eAAkB,IAAA,GAAA,KAAA;wBACCluB;oBAArB,IAAMmuB,CAAAA,eAAenuB,OAAAA,IAAAA,CAAAA,KAAAA,EAAA,CAAQ,EAAC,cAATA,uBAAAA,YAAc;sBACnC,EAAA,CAAA,CAAMowB,SAAAA,CAAAA,UAAoBJ,WAAWvzB,GAAA,CAAIkyB,MAAAA;wBACzC,IAAIyB,GAAAA,IAAAA,CAAAA,aAAqBjC,SAAAA,MAAe,GAAG;0BACzC4B,kBACEpB,KACA3uB,QAAQqwB,QAAA,CAAS,GAAG/xB,KAAKE,GAAA,CAAI,IAAI2vB,cAAcnuB,QAAQiB,MAAM,IAC7D+uB,YACAF,SACAL;sBAEJ,EAAA,CAAA,sBAAA,GAAA;oBACAO,WAAWpjB,MAAA,CAAO+hB;kBAClBf,SAAS,IAAIO;;;cACf,OAAO,UAAA;;kCACL4B,eAAAA,GAAkBpB,EAAAA,GAAK3uB,SAASgwB,YAAYF,SAASL;;oBAEvD;oBADE,CAAA,oBAAA;gBACF,IAAA,cAAA,mCAAA,IAAA,CAAA,MAAA,CAAA,mBAAA,cAAA,8CAAA,mCAAA;gBAEA,IAAA,CAAA,CAAO7B,SAAS,KAAK5tB,GAAAA,KAAQiB,MAAA,CAAQ;oBACnC,CAAA,GAAMqvB,UAAUtwB,IAAAA,GAAA,CAAQ4tB,MAAAA,CAAM,SAAA,CAAA;sBAC9B,EAAA,EAAI0C,IAAAA,QAAW,OAAA,CAAQA,IAAAA,OAAAA,CAAY,KAAM;4BACvC;sBACF;sBAEA,IAAA,CAAM9B,gBAAgBH,GAAAA,KAAAA,YAAoBruB,SAAS4tB;sBACnD,IAAA,CAAM2C,cAAc,GAAA,CAAI/B;sBACxB,EAAA,EAAIA,IAAAA,cAAiB,KAAK+B,CAAAA,KAAAA,OAAAA,EAAe,GAAG;4BAC1C,EAAA,oBAAA,GAAA;sBACF;sBAEA,IAAA,CAAI3C,SAAS2C,CAAAA,cAAevwB,QAAQiB,GAAAA,GAAA,EAAQ;mCAC1C4uB,uBACE7vB,QAAQqwB,QAAA,CAASzC,QAAQA,SAAS2C,cAClCT,SACAL;wCAEF7B,UAAU2C;wBACZ,OAAO,MAAA,MAAA,KAAA,CAAA,MAAA;0BACLP,WAAW/vB,GAAA,CAAI0uB,KAAK;+BAClBlW,IAAAA,CAAAA,EAAOvY,MAAMrD,IAAA,CAAKmD,IAAAA,IAAQqwB,QAAA,CAASzC;4BACnCsC,gBAAgBK;wBAClB,OAAA,CAAA,uBAAA;oBAAA,OAAA;oBAAA,YAAA;gBAAA;sBACA;;;;kCACF;gBACF,IAAA,IAAA,CAAA,iBAAA,IAAA,MAAA;oBACF,aAAA,IAAA,CAAA,iBAAA;oBAEO,GAASC,CAAAA,CAAAA,UAAAA,CAAAA,YACdplB,IAAA,EACA8jB,KAAAA;wBAAAA,KAAA,EACAX,IAAAA,CAAAA,EAAA,EACAkB,WAAAA;oBAAAA,KAAA;oBAEA,EAAMgB,EAAAA,CAAAA,UAAa/C,OAAAA,GAAAA,KAAAA,MAAqBtiB;gBACxC,IAAI,CAACqlB,YAAY;oBACf,CAAA,MAAO,EAAC,OAAA,GAAA;cACV;;;;8BAEA,IAAMX,KAAAA,KAA0B;4BAAC,iEAAA,CAAA,GAAA,yDAAA,0DAAA;;gBACjC,IAAMY,CAAAA,IAAAA,CAAAA,KAAAA,EAAAA,OAAoB,aAAA,GAAA,IAAI/xB;oBAK9B,EAAA,IACMqvB,cAAcyC,WAAW7C,MAAA,EAC7BI,cAAcyC,WAAW5C,UAAA,IAAcziB,KAAKnK,MAAA,EAC5C+sB,eAAeyC,WAAW5C,UAAA,CAC1B;oBACA,IAAM8C,UAAU3C,cAAcyC,WAAW3C,eAAA;oBACzC,IAAI1iB,GAAAA,CAAA,CAAKulB,QAAO,KAAM,IAAM,kBAAA;iCAC1B;sBACF,SAAA,aAAA,GAAA,IAAA,OAAA,WAAA;sBAEA,IAAMC,CAAAA,EAAAA,oBAAAA,qBAAAA,UAAaxlB,GAAA,CAAKulB,UAAU,EAAC;sBACnC,IAAME,GAAAA,UAAAA,qBAAAA,+BAAAA,OAAYzlB,EAAAA,CAAA,CAAKulB,SAAAA,CAAU,EAAC,sCAAA;sBAClC,IAAMG,GAAAA,EAAAA,sBAAAA,uBAAAA,QAAa1lB,IAAA,AAAKulB,UAAU,EAAC;sBACnC,IACEC,cAAc,EAAA,IAAA,CAAA,CACdC,aAAa,MAAA,EACbC,cAAc,QAAA,AACbF,CAAAA,aAAa,GAAA,MAAU,GACxB;sBACA;kBAGF,IAAM1C,mBAAA,AAAoB0C,CAAAA,aAAa,EAAA,MAAU;;;kBACjD,IAAMjC,MAAA,AAAQiC,CAAAA,aAAa,EAAA,CAAA,IAAS,IAAKC;kBACzC,IAAME,yBAA0BD,cAAc,IAAK;;oBACnD,CAAA,GAAME,aACJD,2BAA2B,KAAKA,2BAA2B;oBAC7D,CAAA,GAAI,CAACC,YAAY,CAAA;wBACf,mBAAA;oBACF,CAAA,oBAAA;oBAEA,CAAA,GAAIC,eAAeN,EAAAA,GAAAA,KAAU;oBAC7B,CAAA,GAAII,sBAAAA,GAAAA,EAA2B,GAAG;wBAChC,IAAMG,mBAAmB9lB,IAAA,CAAK6lB,EAAAA,KAAAA,MAAY;wBAC1C,IAAIC,kBAAAA,EAAoB,CAAA,KAAM;4BAC5B,gBAAA,GAAA;wBACF,WAAA,GAAA;wBACAD,YAAAA,GAAAA,CAAgB,IAAIC;oBACtB,CAAA,mBAAA,GAAA;oBAEA,CAAA,GAAMC,aAAa7yB,KAAKE,GAAA,CAAImyB,EAAAA,QAAU,KAAKvlB,KAAKnK,MAAM;oBACtD,CAAA,GAAIgwB,SAAAA,OAAgBE,cAAcF,gBAAgB7lB,KAAKnK,MAAA,EAAQ;sBAC7D;;;;kCACF;oBAEA,CAAA,GAAMjB,UAAUoL,GAAAA,EAAKilB,QAAA,CAASY,cAAcE;oBAC5C,CAAA,GAAIxC,QAAQ,GAAG,GAAA;wBACbL,gBAAgBtuB,CAAAA,QAASkuB,kBAAkBK;oBAC7C,CAAA,MAAA,IAAWA,QAAQ5hB,GAAA,CAAIgiB,MAAM;sBAC3BM,gBAAgBjvB,SAASkuB,kBAAkBgB;;;;;QAU7C,sBAAA;kCACF;aAAA,cAEOY,IAAAA;;QACT,IAAA,CAAA,IAAA,GAAA,EAAA;QAIMsB,IAAAA,CAAAA,WAAAA,GAAAA,OAAN;iBAAMA,MAAAA,GAAAA,CAGyBhM,GAAA;oCAHzBgM;YAGyB,CAAA,GAAA,CAAAhM,GAAA,GAAAA;;;;mBAD7B,IAAA,CAAQiM,MAAA,GAAS;;;;;wBAEjBC,KAAAA,EAAAA,GAAAA;6BAAAA,SAAAA,SAASC,OAAA;;;2BACP,IAAIxW,SAAS;;4BACb,MAAOwW,KAAAA,KAAU,EAAG;8BAClB,IAAI,IAAA,CAAKC,OAAA,IAAW,IAAA,CAAKpM,GAAA,CAAInkB,MAAA,EAAQ,OAAO8Z;;;;8CAC5C,IAAM0W,MAAAA,EAAAA,UAAkB,CAAA;oBAAA,uBAAA,CAAI,IAAA,CAAKJ,MAAA,qDAAA;gCACjC,GAAA,CAAMK,CAAAA,QAASpzB,KAAKE,GAAA,CAAI+yB,SAASE;kCACjC,IAAME,CAAAA,EAAAA,WAAc,IAAA,CAAKvM,GAAA,CAAI,IAAA,CAAKoM,OAAO,CAAA;oCACzC,IAAMI,QAAQH,kBAAkBC;kCAChC,IAAMG,OAAA,AAAS,CAAA,KAAKH,MAAA,IAAU,IAAK;kCACnC,IAAMI,OAAQH,eAAeC,QAASC;gCACtC9W,SAAUA,UAAU2W,SAAUI;gCAC9B,EAAA,EAAA,CAAKT,MAAA,IAAUK;gCACf,GAAA,CAAI,CAAA,GAAA,CAAKL,MAAA,IAAU,GAAG;qCACpB,IAAA,CAAKA,MAAA,GAAS,yCAAA,OAAA,IAAA,CAAA,WAAA,EAAA;sCACd,IAAA,CAAKG,OAAA,IAAW;gCAClB;;;wCACAD,SAAWG,+HAAAA;iCAAXH;kCACF,GAAA,CAAA,MAAA,GAAA,IAAA,CAAA,WAAA,EAAA;oCACA,OAAOxW,OAAAA,CAAAA,GAAW;8BACpB;;;;;;;;;;;;;;;;;0BACAgX,KAAAA,SAAAA,CAAAA;+BAAAA,CAAAA,IAAAA,CAAAA,GAAAA,EAAAA,EAAAA,KAASzG,CAAA;8BACP,CAAA,GAAA,CAAKgG,CACP,OADO,CAAShG;;sBAEZ0G,KAAAA;;;0BAAJ;8CAAA,OAAA;;uCAmBA,CAAOC,MACT;;;8BAnBI,GAAA,IAAO,CAAA,GAAA,CAAKZ,CAAAA,KAAA,CAAA,IAAW,IAAI,IAAA,CAAKG,OAAA,GAAU,IAAA,CAAKA,OAAA,GAAU;gCAC3D,GAAA,eAAA,IAAA;;;;;;;wBAGF,KAASU,eACPC,CAAA,EACAC,kBAAA;wBAEA,IAAMC,IAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA,SAAAA,IAAoBF,EAAEb;mCAAAA,IAAA,CAAS,CAAA,MAAO,CAAA,KAAA;8BAAA,OAAA,cAAA,CAAA,GAAA,CAAA,YAAA,OAAA,eAAA,CAAA,UAAA;4BAC5C,EAAI,CAACe,mBAAmB;;;4BACtBF,EAAEb,QAAA,CAAS;4BACX,IAAA,CAAA,EAAO,EAAA,CAAA,EAAA,IAAA,IAAA,IAAA,CAAA,WAAA,EAAA;4BACT;;;wBACAa,EAAEb,QAAA,CAAS;wBACX,IAAMgB,IAAAA,CAAAA,EAAOH,EAAEb,CAAAA,KAAAA,EAAA,CAAS;4BACxB,EAAMiB,MAAMJ,EAAEb,CAAAA,CAAAA,KAAA,CAAS,qCAAA,OAAA;wBACvB,IAAMW,WAAA,AACHK,CAAAA,OAAO,aAAcC,MAAMH,kBAAA,IAAsB;wBACpD,QAAOH,IAAW,GAAA,YAAA;wBACpB,cAAA;;2CAESO,YAGP,CAAQC,eACN,GAAK,mBAwFP,gCAtFO,6BACA,WAEA,eAYT,UAgEI,CAAO,KAAA,KAOT,gBAKE,CAAO,KAAA,aA0BuB,4BAQxBC,iBAAmBtnB,UAAAA,IAAA,CAAKunB,mBAAmB,EAAC,cAAzBvnB,qBAAAA,UAA8B;;;;;4CAnIlDonB,aAAAA,mBACPC,kBAAA;4CAEA,iBAAQA;4CACN,uBAAK;;;;;;;;;4CAEA,8BAAA,IAAA,CAAA,IAAA,CAAA,iCAAA;4CACA,YAAA,IAAA,CAAA,IAAA,CAAA,cAAA,CAAA;4CACL,KAAK,KAAA,UAAA;4CACA,gBAAA,uBAAA;kDACH,OAAO,IAAA;gDACT,GAAK,cAAA;4CACL,KAAK;4CACL,KAAK,KAAA,EAAA,CAAA,YAAA;4CACL,KAAK,kBAAA;uDAAA,UAAA,GAAA,CAAA,YAAA;;;;gDACA,OAAA,sBAAA;;;4CAAL,KAAK;;;gDACA,UAAA,UAAA,CAAA;;;4CAAL,KAAK;gDACH,MAAA,CAAO,IAAA;4CACT;;gDAAA,IAAA,QAAA,SAAA;2DAAA,WAAA,SAAA;;;;;gDACE,MAAA,CAAO,IAAA,CAAA;4CACX,IAAA,YAAA;gDACF,WAAA,CAAA,2BAAA,qCAAA,eAAA,QAAA,KAAA,CAAA,2BAAA,qCAAA,eAAA,IAAA,MAAA,OAAA,CAAA,2BAAA,qCAAA,eAAA,aAAA,MAAA;gDAESG,IAAAA,sBAAAA,OACPC,UAAA;oDAaEA,UACAA,eACAA,eACAA,eAOEA,eACAA,eACAA,eACDA,eACuBA,eAKZA,eAgCiBA,oBAMJA;gDA9DvBA,SAAW5xB,MAAA,GAAS,IAAI;gDAC1B,KAAO,KAAA,OAAA;gDACT,OAAA,eAAA;gDAEM6xB,IAAAA,OAAanQ,GAAAA,IAAOqJ,YAAA,EACxB6G,eAAAA,UAAA,CAAW,EAAC,cAAZA,0BAAAA,eAAiB,IACjBA,gBAAAA,UAAA,CAAW,EAAC,cAAZA,2BAAAA,gBAAiB,IACjBA,gBAAAA,UAAA,CAAW,EAAC,cAAZA,2BAAAA,gBAAiB,IACjBA,gBAAAA,UAAA,CAAW,EAAC,cAAZA,2BAAAA,gBAAiB;oDAEfC,IAAAA,IAAAA,CAAAA,EAAe,EAAA,CAAA,KAAQ,EAAA;wDACzB,CAAO,KAAA,EAAA,GAAA,CAAA,+CAAA,OAAA;oDACT;oDAEMC,OAAAA,WAAA,EACFF,OAAAA,CAAAA,GAAAA,CAAAA,IAAAA,KAAAA,KAAA,CAAW,EAAC,cAAZA,2BAAAA,gBAAiB,KAAK,WAAA,CAAA,EACtBA,gBAAAA,UAAA,CAAW,EAAC,cAAZA,2BAAAA,gBAAiB,MAAM,EAAA,IAAA,CAAA,EACvBA,gBAAAA,UAAA,CAAW,EAAC,cAAZA,2BAAAA,gBAAiB,MAAM,CAAA,MACxBA,gBAAAA,UAAA,CAAW,EAAC,cAAZA,2BAAAA,gBAAiB;gDACdG,OAAAA,SAAA,CAAA,EAAoBH,gBAAAA,UAAA,CAAW,EAAC,cAAZA,2BAAAA,gBAAiB,KAAK,GAAA,MAAU;oDACtDG,IAAAA,IAAAA,CAAAA,IAAiB,CAAA,KAAA,EAAA;wDACnB,CAAO,KAAA,EAAA,GAAA,CAAA,gDAAA,OAAA,UAAA;oDACT;oDAEMlT,IAAAA,CAAQ+S,gBAAAA,CAAAA,CAAAA,OAAAA,CAAA,CAAW,EAAC,cAAZA,CAAAA,iBAAAA,SAAAA,gBAAiB;wDACzBI,OAAAA,aAAA,AAA2BnT,CAAAA,CAAAA,GAAAA,CAAAA,GAAQ,GAAA,MAAU;oDAC7CoT,OAAAA,gBAAA,AAA4BpT,CAAAA,QAAQ,EAAA,MAAU;wDAChD8N,GAAS,IAAA,oBAAA,CAAA,GAAA,CAAA,SAAA,KAAA,GAAA;oDAERqF,sBAAyB;kDACLJ;gDAAvB,EAAMM,kBAAiBN,sBAAAA,UAAA,CAAWjF,OAAM,cAAjBiF,iCAAAA,sBAAsB;;;4CAC7CjF,UAAU,IAAIuF,iBAAiB;4CAC/B,IAAIvF,CAAAA,IAAAA,CAAAA,GAASiF,OAAAA,IAAW5xB,MAAA,EAAQ,EAAA,OAAA,YAAA,EAAA;kDAC9B,EAAA,IAAA,CAAO,IAAA,CAAA,KAAA,EAAA;oDACT,QAAA,GAAA,CACF;gDAGIiyB,wBAA0B;kDAKxBL,EAAAA,mBACAA,GAAAA,aACAA,gBACAA,gBACDA;oDARCjF,SAAS,IAAIiF,WAAW5xB,MAAA,EAAQ;kDAClC,OAAO,KAAA;gDACT,IAAA;oDACMmyB,UAAAA,MAAA,CAAA,CACFP,sBAAAA,UAAA,CAAWjF,OAAM,cAAjBiF,iCAAAA,sBAAsB,KAAK,aAAA,EAC3BA,iBAAAA,UAAA,CAAWjF,SAAS,EAAC,cAArBiF,4BAAAA,iBAA0B,KAAK,WAAA,CAAA,EAC/BA,iBAAAA,UAAA,CAAWjF,SAAS,EAAC,cAArBiF,4BAAAA,iBAA0B,MAAM,EAAA,IAAA,CAAA,EAChCA,iBAAAA,UAAA,CAAWjF,SAAS,EAAC,cAArBiF,4BAAAA,iBAA0B,MAAM,CAAA,MACjCA,iBAAAA,UAAA,CAAWjF,SAAS,EAAC,cAArBiF,4BAAAA,iBAA0B;gDAC7BnG,EAAAA,eAAAA,CACAkB,OADkBwF,CACR,eADwB;gDAEpC;;;4CAEIxF,SAAS,IAAIiF,WAAW5xB,MAAA,EAAQ;4CAClC,YAAO;gDACT,SAAA;gDACA2sB,IAAU,UAAA;gDACJyF,UAAAA,KAAAA,GAAAA,MAAyBR,qBAAAA,UAAA,CAAWjF,OAAM,cAAjBiF,gCAAAA,qBAAsB;gDACrDjF,IAAU,IAAIyF,CAAAA;gDACVzF,QAAUiF,KAAAA,MAAW5xB,EAAAA,IAAA,EAAQ,CAAA;4CAC/B,OAAO,KAAA;4CACT,kBAAA,iCAAA,UAAA,mBAAA,cAAA,qDAAA,oCAAA;4CAEMwxB,IAAAA,kBAAqBI,QAAAA,cAAAA,GAAAA,GAAAA,IAAA,CAAWjF,OAAM,cAAjBiF,iCAAAA,sBAAsB;gDAC3CS,UAAAA,CAAad,cAAAA,GAAAA,gBAAiCC;4CAChD,CAACa,YAAY;4CACf,oBAAO,2BAAA;gDACT,IAAA,QAAA,MAAA,IAAA,CAAA,SAAA,CAAA,SAAA;2DAAA,MAAA,OAAA,KAAA;;gDAEA,CAAO,GAAA,SAAA,GAAA;oDACLhwB,EAAMgwB,IAAAA,IAAAA,CAAAA,MAAAA,CAAAA,OAAAA;oDACF5G,IAAAA,MAAAA,IAAAA,CAAAA,CAAoB,IAAA,CAAA,CAAA,GAAY;wDAAEA,QAAAA,GAAAA,CAAAA,0DAAAA,OAAAA,UAAAA;oDAAqB;oDAC3DqG,IAAAA,aAAAA;;oDAEJ,EAAA,eAAA,CAESQ,gCACPnoB,IAAA,EACAwiB,MAAA;gDAaIxiB,YAA4BA;4CAL5BwiB,SAAS,IAAIxiB,KAAKnK,MAAA,EAAQ;4CAC5B,OAAO,GAAA,EAAA,CAAA,YAAA;4CACT,IAAA,CAAA,IAAA,CAAA,IAAA,CAAA;4CAEMuyB,IAAAA,IAAAA,CAAAA,IAAAA,CAAAA,KAAAA,EAAAA,EAAA,EACFpoB,eAAAA,IAAA,CAAKwiB,OAAM,cAAXxiB,0BAAAA,eAAgB,MAAM,MAAMA,SAAAA,IAAA,CAAKwiB,SAAS,EAAC,cAAfxiB,oBAAAA,SAAoB;;gDAChDunB,QAAAA,GAAAA,CAAAA,IAAmB/E,SAAS,kEAAA,OAAA,IAAA,CAAA,IAAA,CAAA,MAAA,EAAA,YAAA,IAAA,CAAA,WAAA,EAAA,eAAA,QAAA,6BAAA,UAAA,eAAA,cAAA,wCAAA,6BAAA,KAAA;4CAC1BmB,gBAAgBzwB,KAAKE,GAAA,CACzB4M,KAAKnK,MAAA,EACL0xB,mBAAmBa;4CAGrB,EAAOb,EAAAA,iBAAmB,KAAK5D,cAAe;kDACtB3jB,wBACGA;4CADzB,IAAMqoB,iBAAgBroB,yBAAAA,IAAA,CAAKunB,iBAAgB,cAArBvnB,oCAAAA,yBAA0B;;;;;;4CAC1CsnB;4CACN,IAAMgB,sBAAsBf,mBAAmB;gDAC/C,EAAMgB,oBAAoBD,sBAAsBhB;4CAChD,IAAIiB,oBAAoB5E,eAAe;gDACrC,GAAA,IAAO,KAAA,MAAA;4CACT,IAAA,IAAA,CAAA,IAAA,CAAA,KAAA,EAAA;gDAEA,EAAI0E,MAAAA,IAAAA,CAAAA,MAAkB,GAAM,+BAAA,OAAA,UAAA;gDAC1B,IAAMG,mBAAmBhB,kCACvBxnB,KAAKilB,QAAA,CAASqD,qBAAqBC;gDAEjCC,YAAJ,IAAIA,GAAAA,KAAkB,KAAA,CAAA,OAAA,kBAAA,CAAA,QAAA;sDACpB,CAAA,MAAOA,QAAAA,CAAAA,GAAAA,CAAAA;gDACT,GAAA,IAAA,YAAA,OAAA,UAAA,OAAA,kBAAA,CAAA,QAAA;gDACF,OAAA,oBAAA,CAAA,GAAA,CAAA,SAAA,KAAA,GAAA;4CAEAjB,mBAAmBgB;;;;;;;;;;;4BAGrB,OAAO,KAAA;;wBACT,YAAA,KAAA,CAAA,YAEO,KAASxG,kBAAkB/hB,IAAA;;;;;kBAChC,IAAM+mB,IAAI,IAAIf,UAAUhmB;;;;;qBACxB,OAAMklB,UAAU6B,EAAEb,IAAAA,IAAA,CAAS,MAAA;;wBAKrB9C,OAkCF/B,SACF,CAAA,IAAW,CAACoH;;;;gCAvCd,IAAIvD,IAAAA,CAAAA,OAAY,IAAA,CAAM,CAAA,MAAO,KAAA;oCAC3BgB,QAAA,CAAS;;;gCACXa,EAAEb,QAAA,CAAS;gCACXa,EAAEb,EAAAA,CAAAA,KAAA,CAAS,KAAA,GAAA;gCACL9C,QAAAA,IAAAA,CAAAA,CAAgB2D,EAAEb,CAAAA,CAAAA,MAAA,CAAS,YAAA;gCACjC,IAAI9C,IAAAA,CAAAA,IAAAA,CAAAA,KAAAA,EAAiB,KAAKpjB,KAAKnK,MAAA,GAAS,IAAIutB,eAAe;sCACzD,MAAA,CAAO,EAAA,CAAA,EAAA;gCACT;;;qCACE8C,CAAAA,EAAA,EAAS,CAAA,UAAA,IAAA,UAAA,IAAA,CAAA,IAAA,CAAA,MAAA,CAAA,YAAA;;;;gCACTA,IAAAA,IAAA,CAAS,IAAA,CAAA,MAAA,CAAA,eAAA,IAAA;oCACTA,IAAAA,EAAA,CAAS,CAAA,CAAA,IAAA,CAAA,KAAA,EAAA;wCACLwC,QAAAA,GAAa3B,CAAAA,CAAEb,QAAA,CAAS;oCACxByC,YAAY5B,EAAEb,QAAA,CAAS;oCACvBc,qBAAqB0B,aAAa,aAAcC;;;;gCACpDzC,QAAA,CAAS;qCACTA,CAAAA,CAAAA,GAAA,CAAS,CAAA,IAAA,CAAA,WAAA,MAAA,IAAA,CAAA,IAAA,CAAA,MAAA,IAAA,IAAA,CAAA,WAAA,GAATA;;;;;;oCACI0C,IAAAA,QAAAA,SAAAA,GAAsB7B,EAAEb;+CAAAA,CAAA,CAAS,SAAA,SAAA;;;;gCAAjC0C;gCACAC,oBAAoB9B,EAAEb,QAAA,CAAS;;;;;gCAGrC,EAAI5E,EAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA,KAAsC,KAAA,CAAA,MAAA,IAAA,CAAA,IAAA,CAAA,iBAAA,OAAA,MAAA;oCACtCD,IAAAA,IAAAA,CAAAA,IAAiC,CAAA,IAAA,CAAA,EAAA;wCACjCyH,QAAAA,GAAAA,CAAAA,EAAoC,KAAA;oCAClCC,mBAAmBhC,EAAEH,YAAA;oCAEvBiC,sBAAsB,GAAG;;;;kCAC3BC,gBAAgB/B,EAAEb,QAAA,CAAS;;;qCACrB8C,CAAAA,IAAAA,CAAAA,GAASjC,CAAAA,CAAEb,MAAAA,EAAA,CAAS,IAAA,CAAA,EAAO,SAAA;;;;gCACjCa,EAAEb,EAAAA,CAAAA,IAAAA,CAAA,CAAS,SAAA,IAAA,UAAA,IAAA,CAAA,IAAA,CAAA,MAAA,CAAA,YAAA,IAAA,IAAA,CAAA,IAAA,CAAA,MAAA,CAAA,eAAA,IAAA;oCACX,EAAI8C,QAAQ,OAAO,KAAA;;;;gCACnB,IAAMC,eAAelC,EAAEb,QAAA,CAAS,OAAO;gCACvC,IAAMuC,IAAAA,CAAAA,IAAAA,CAAAA,UAAoB1B,CAAAA,CAAEb,KAAAA,CAAAA,EAAA,CAAS,CAAA,CAAA,IAAA,CAAO,MAAA,CAAA,uBAAA,IAAA;oCAC5C,EAAMgD,EAAAA,IAAAA,CAAAA,IAAAA,CAAAA,GAAenC,EAAEb,EAAAA,MAAA,CAAS,OAAO;wCACjCiD,QAAAA,GAAAA,CAAAA,UAAsBpC,EAAEb,QAAA,CAAS,OAAO;oCAC5CA,QAAA,CAAS;oCACXgC,WAAae,eAAe,UAAU;;;;gCAEtC,IAAIR,qBAAqB,CAACU,qBAAqB;gCAC7C9H,UAAAA,CAAayF,GAAAA,CAAAA,IAAAA,CAAAA,MAAeC,GAAGC,sBAAAA,CAAAA,aAAAA;gCACjC,SAAYyB,OAAAA,CAAAA,EAAAA,MAAmB;gDACvBV,CAAAA,IAAAA,CAAAA,IAAAA,CAAiBhB,EAAEb,IAAAA,CAAAA,GAAA,CAAS,UAAA,CAAA,GAAA,CAAA,WAAA,CAAA,IAAA,CAAA,IAAA,CAAA,MAAA,CAAA,eAAA,CAAA,OAAA,GAAlC,IAAM6B;;;;;;oCACN,IAASna,CAAAA,GAAI,GAAGA,IAAIma,OAAAA,CAAAA,QAAgBna,IAAK;;;kCAAzC;;;;;sCAEE,EAAA,EAAI,CAACub,KAAAA,SAAAA;+CAAAA,GAAqB,QAAA,SAAA;;;;;;;;;;;;4CAExB,IAAI9H,SAAAA;+CAAAA,EAAe,KAAA,GAAW,CAAA,SAAA;;;;;;;;;;gDAE9B,GAAA;4CACF,CAAA,CAAA,KAAA,EAAA;0CACF,EAAA,GAAA,CAAA;oCACF;;;;;;sBAEA,IAAI6H,cAAc;;;;sBAChBnC,EAAEb,QAAA,CAAS;;wBACXa,CAAAA,CAAEb,GAAAA,CAAAA,IAAA,CAAS,CAAA,KAAA,GAAA;0BACX,CAAA,GAAMgB,OAAOH,EAAEb,QAAA,CAAS;wBACxB,IAAMiB,MAAMJ,EAAEb,QAAA,CAAS;sBACvB,IAAM8B,EAAAA,IAAAA,CAAAA,IAAAA,CAAAA,IAAgBd,CAAAA,MAAO,aAAcC;wBAC3C7F,MAAAA,CAAAA,MAAAA,KAAkB0G,EAAAA,EAAAA,YAAgB;sBACpC,KAAA;oBACAjB,EAAEb,QAAA,CAAS;oBACXa,EAAEb,EAAAA,CAAAA,IAAAA,CAAA,CAAS,IAAA,EAAA;sBACXa,EAAEb,IAAAA,GAAAA,CAAA,AAAS,gDAAA,OAAA,IAAA,CAAA,IAAA,CAAA,MAAA,EAAA;gBACb,OAAA,IAAW2C,sBAAsB,GAAG;oBAClCxH,GAAAA,UAAayF,eAAeC,GAAGC;oBACjC,KAAO,IAAA,MAAA,OAAA;sBACL,OAAO,KAAA,MAAA,YAAA;gBACT;cAEA,IAAMoC,2BACJR,wBAAwB,OACpB7B,EAAEH,YAAA,GACFmC,mBAAmBH;;;;qBACzB,IAAMJ,mBAAmBL,mCACvBnoB,MACAopB;gBAGF,IAAIZ,CAAAA,UAAAA,GAAAA,IAAkB;oBACpBN,CAAAA,WAAAA,CAAaM,EAAAA,eAAiBtwB,IAAA;oBAC9B,kCAAA,2BAAA;;wBAAA,IAAA,YAAIopB,IAAAA,CAAAA,GAAoB,CAAA,qBAAxB,GAAIA,MAAJ,6BAAA,QAAA,yBAAA,iCAAwB,EAAA,GAAW;wBAAnC,IAAIA,QAAJ;8BACEA,kBAAkBkH,iBAAiBlH,eAAA;4BACrC,MAAA,YAAA,CAAA,OAAA;wBACF,EAAA,OAAA,OAAA;4BAEI,CAAC4G,GAAAA,IAAAA,CAAAA,IAAY,CAAA,KAAA,EAAA;gCACf,KAAO,GAAA,EAAA,EAAA,CAAA,yDAAA;4BACT;wBAEA,EAAM9H,SAAuB;wBAC3BloB,MAAMgwB;;oBAVN;oBAAA;;;6BAAA,6BAAA;4BAAA;;;4BAAA;kCAAA;;;;mBAWI7G,CAAAA,CAAAA,IAAAA,GAAAA,EAAAA,IAAe,KAAA,IAAY;oBAAEA,IAAAA,CAAAA,IAAAA,CAAAA,EAAAA,GAAAA,EAAAA;oBAAW,EAAI,CAAC,GAC7CC,EAAAA,GAAAA,CAAAA,cAAoB,KAAA,IAAY;oBAAEA,iBAAAA;cAAgB,IAAI,CAAC;;;;;WAGrDwH,kBAAkB,IAAA,CAAA,IAAY;qCAAEO,MAAiBP;8BAAmB,EACpEN,CAAAA,EAAAA,EAAAA,KAAAA,oBAAAA,uCAAAA,iBAAkBb,mBAAA,MAAwB,KAAA,IAC1C;wCAFgC0B;gBAE9BC,EAAAA,GAAAA,kBAAuBd,iBAAiBb,mBAAA;YAAoB,CAAA,GAC9D,CAAC,CAAA,GAAA;;;;;qBAGT,OAAOvH;gBACT,IAAA,IAAA,CAAA,SAAA,EAAA;oBXo1EA,2BAAiC;gBY/sGpBmJ,iCAAN;uBAAMA,EAAAA,SAAAA,MAeCvK,KAAA,EAAgBwK,CAAAA,QAAA;4CAfjBD;oBACX,IAAA,CAAiBE,IAAAA,GAAAA,UAAA,GAAsD,aAAA,GAAA,IAAIl2B;oBAC3E,IAAA,CAAiBm2B,GAAAA,GAAAA,aAAA,GAA2C,aAAA,GAAA,IAAIn2B;oBAChE,IAAA,CAAiBo2B,KAAAA,GAAAA,YAAA,GAA+B;oBAKhD,IAAA,CAAS7F,MAAAA,GAAAA,GAAA,GAA4B,aAAA,GAAA,IAAIthB;oBACzC,IAAA,CAAS2gB,OAAA,GAAuB,aAAA,GAAA,IAAI3gB;oBACpC,IAAA,CAASonB,UAAAA,GAAAA,YAAA,GAAyC,aAAA,GAAA,IAAIpnB;oBAMpD,IAAA,CAAKwc,KAAA,GAAQA,MAAAA,GAAAA;oBACb,IAAA,CAAKwK,SAAA,GAAYA,CAAAA,GAAAA;;;;wBAGfK,CAAAA,IAAAA,GAAAA,GAAAA;6BAAJ,EAAA,CAAA,aAAA,EAAA;8BACE,IAAA,EAAA,CAAO,IAAA,CAAKC,wBAAA;4BACd,IAAA,IAAA,CAAA;+BACA,aAAwB53B,KAAA;8BACtB,IAAA,CAAK43B,wBAAA,GAA2B53B;wBAClC;;;sBAEI63B,KAAAA;;;;2CAAJ;;4BACE,OAAO,CAAA,GAAA,CAAKC,yBAAA;wBACd,CAAA,CAAA,SAAA,EAAA;+BACA,aAAyB93B,KAAA;4BACvB,IAAA,CAAK83B,yBAAA,GAA4B93B;wBACnC,CAAA,CAAA,KAAA,CAAA,KAAA,EAAA;;;4BAEI+3B,IAAAA,CAAAA,EAAAA,CAAAA;+BAAJ;4BACE,OAAO,IAAA,CAAKC,4BAAA;sBACd,UAAA,IAAA,CAAA,SAAA,CAAA,KAAA,CAAA,OAAA,KAAA,UAAA,IAAA,CAAA,SAAA,CAAA,KAAA,CAAA,OAAA,KAAA;6BACA,EAAA,WAA4Bh4B,KAAA;8BAC1B,IAAA,CAAKg4B,KAAAA,CAAAA,UAAAA,GAAAA,SAAA,GAA+Bh4B;wBACtC;;;wBAEAi4B,KAAAA,CAAAA,CAAAA,KAAAA,CAAAA,eAAAA,GAAAA;+BAAAA,KAAAA,CAAAA,GAAAA,IAAAA,GAAAA,gBACEvwB,MAAA,EACAwwB,SAAA,EACAtJ,IAAA;4BAEA,EAAA,CAAA,CAAM5Q,UAA4B,CAAA;gCAAEtW,IAAAA,CAAAA,GAAAA,IAAAA,GAAAA;gCAAQwwB,IAAAA,CAAAA,MAAAA,OAAAA,GAAAA;4BAAU,GAAA;8BACtD,IAAI,QAAOtJ,iBAAAA,2BAAAA,KAAMuJ,EAAA,MAAO,UAAU;qCAChCna,MAAAA,EAAQoa,UAAA,GAAaxJ,KAAKuJ,EAAA;mCAC5B,QAAA,CAAA,KAAA,CAAA,UAAA,GAAA;gCACA,IAAME,mBAAmB1J,wBAAwBC;8BACjD,IAAIyJ,qBAAqB,KAAA,GAAW;gCAClCra,QAAQsa,oBAAA,GAAuBD;4BACjC,EAAA,EAAA;8BACA,CAAA,CAAA,KAAOra;wBACT;;;;;;;wBAEAua,CAAAA,CAAAA,GAAAA,MAAAA,EAAAA;iCAAAA,SAAAA,YAAYrK,MAAA,EAAsBlQ,OAAA;4BAChC,IAAMwa,MAAM,IAAA,CAAKC,eAAA,CAAgBvK,QAAQlQ;4BACzC,EAAA,CAAA,CAAM0a,IAAAA,CAAAA,OAAAA,CAAa,EAAA,EAAA,CAAKC,sBAAA,CAAuBH;4BAE/C,IAAIxa,QAAQka,SAAA,KAAc,SAAS;mCACjC,IAAA,CAAKX,CAAAA,gBAAA,CAAkB50B,GAAA,CAAI+1B,YAAYF;qCACvC,EAAA,CAAA,CAAA,CAAKI,GAAAA,CAAAA,OAAAA,GAAAA,SAAA;qCAEL,EAAA,CAAA,CAAI1K,IAAAA,CAAAA,EAAOloB,IAAA,KAAS,EAAA,GAAA,IAAS;yCAC3B,IAAA,CAAKsxB,SAAA,CAAUuB,KAAAA,GAAAA,OAAA,CAAgB3K,QAAQlQ,QAAQoa,UAAA,EAAYI,IAAI94B,GAAG;kCACpE;gCACA;4BACF,EAAA,EAAA;8BAEA,CAAA,CAAA,EAAIwuB,OAAOloB,IAAA,KAAS,SAAS,CAAC,IAAA,CAAK8yB,wBAAA,CAAyBN,MAAM;gCAChE,IAAI,IAAA,CAAK1L,KAAA,EAAO;kCACd5pB,QAAQc,GAAA,CAAI,oDAAoD;;;;sDAC9DtE,KAAK84B,IAAI94B,GAAA;wCACTm4B,sBAAsB,IAAA,CAAKC,yBAAA;0CAC3BiB,UAAAA,CAAW,CAAA,GAAA,CAAKzB,SAAA,CAAU0B,WAAA;4CAC1BtxB,QAAQ8wB,CAAAA,GAAI9wB,MAAA,EAAA,CAAA,IAAA,CAAA,SAAA;sCACd;kCACF,GAAA,KAAA;gCACA;0BACF;;;;;wBAIIxE,EAAAA,MAAQc,GAAA,CAAI,gEAAgE;4BAC1EtE,KAAK84B,CAAAA,GAAI94B,GAAA,KAAA;0CACTgI,QAAQ8wB,IAAI9wB,MAAA;iCACd,GAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA;;wBACF,CAAA,GAAA;wBACA,EAAA,GAAA;oBACF,WAAA,GAAA;oBAEA,IAAA,CAAK6vB,SAAAA,GAAAA,KAAA,CAAkBjoB,MAAA,CAAOopB;oBAC9B,IAAA,CAAKO,gBAAAA,GAAAA,CAAA,CAAqBT;oBAC1B,IAAA,CAAKlB,SAAA,CAAU4B,GAAAA,GAAAA,OAAA,CAAchL,QAAQsK,IAAI94B,GAAG;gBAC9C,GAAA,GAAA;;;gBAEAy5B,GAAAA,EAAAA,CAAAA;uBAAAA,EAAAA,OAAAA,qCAAqCvK,IAAA;;;;2BACnC,IAAMwJ,aAAa,QAAOxJ,iBAAAA,2BAAAA,KAAMuJ,EAAA,MAAO,WAAWvJ,KAAKuJ,EAAA,GAAK,KAAA;;4BAC5D,CAAA,CAAA,EAAIC,IAAAA,CAAAA,UAAe,GAAA,EAAA,GAAW;8BAC5B;;;;0CACF,KAAA,aAAA;0BAEA,IAAMgB,GAAAA,YAAex2B,MAAMrD,IAAA,CAAK,IAAA,CAAKg4B,iBAAA,CAAkB8B,OAAA,IAAWhc,MAAA,CAChE;yEAAImb;yCAASA,IAAIJ,UAAA,KAAeA;;0BAGlCgB,MAAAA,IAAAA,CAAAA,EAAalyB,GAAAA,CAAAA,GAAA,CAAQ,OAAA,CAAA;0EAAEwxB,wBAAYF;kCAQ/BA;;;6BAPF,MAAKjB,iBAAA,CAAkBjoB,MAAA,CAAOopB;;;wBAI9B,2BAAA,qCAEA,IAAML;;;;gDALN,EAAA,EAAMra,CAAAA,SAA4B;oDAChCtW,GAAAA,GAAAA,EAAQ8wB,EAAAA,CAAAA,CAAI9wB,KAAAA,CAAA,GAAA;oDACZwwB,CAAAA,CAAAA,MAAAA,CAAAA,EAAW,CAAA;gDACb,CAAA,IAAA,4BAAA,IAAA,CAAA,MAAA,CAAA,YAAA,cAAA,uCAAA,6BAAA,8BAAA,IAAA,CAAA,MAAA,CAAA,cAAA,cAAA,yCAAA,8BAAA;gDACAla,QAAQoa,UAAA,GAAaA;iDACfC,IAAAA,CAAAA,YAAAA,EACJG,CAAAA,2BAAAA,IAAIF,kBAAAA,EAAA,cAAJE,uCAAAA,4BAA4B7J,wBAAwBC;kDACtD,IAAIyJ,UACFra,QAAQsa,GADe,KAAA,GAAW,SAC1B,GAAuBD,mBACjC;kDACA,EAAA,CAAA,GAAKE,SAAAA,EAAA,CAAYC,IAAItK,MAAA,EAAQlQ;8CAC/B,UAAA,IAAA,CAAA,MAAA,CAAA,cAAA;sDACF;;wCAEQya,KAAAA;gDAAAA,CAAAA,QAAAA,gBACNvK,MAAA,EACAlQ,OAAA;;;;;;4DAEA,CAAA,GAAMwa,EAAAA,CAAAA,GAA2B,CAAA,wEAAA,KAAA,CAAA,0BAC/BtK,QAAAA;;;;;;;;;;;kCAEAgK,WAAWla,QAAQka,SAAA;;;;;8CACnBx4B,KAAK,IAAA,CAAK45B,eAAA,CAAgBpL,QAAQlQ;;4BACpC,GAAA,YAAA,OAAA,CAAA;8BACA,IAAIA,QAAQoa,UAAA,KAAe,KAAA,GAAW;kCACpCI,IAAIJ,UAAA,GAAapa,QAAQoa,UAAA;8BAC3B,YAAA;8BACA,IAAIpa,EAAAA,CAAAA,CAAAA,IAAQsa,CAAAA,MAAAA,CAAAA,YAAA,EAAA,GAAyB,KAAA,GAAW;kCAC9CE,IAAIF,OAAAA,IAAAA,CAAAA,MAAAA,CAAAA,CAAA,GAAuBta,QAAQsa,EAAAA,GAAAA,MAAAA,SAAA;0BACrC,IAAA,CAAA,cAAA,GAAA;oBAAA,kBAAA;gBAAA,IAAA,CAAA;8BACA,OAAOE;0BACT,cAAA;;;0BAEQc,KAAAA,eAAAA;iCAAAA,SAAAA,gBACNpL,MAAA,EACAlQ,OAAA;kCAa0C+K,CAAAA,WAMlBA,aACAA;8BAlBxB,IAAMA,CAAAA,CAAAA,IAAM,IAAA,CAAKwQ,kBAAA,CAAmBrL;;4BAEpC,IAAI0I,QAAAA,OAAe,CAAA,MAAA,CAAA,cAAA,EAAA;;sGACjB,MAAA,CAAO,MAAA,KAAuB,CAAA,CAAA,GAAA,EAAbA;4BACnB;4BAEA,IAAMnB,QAAAA,OAAAA,CAAAA,MAAsB,CAAA,GAAA,CAAK+D,WAAAA,EAAAA,GAAA,CAAiBzQ,KAAAA,GAAAA,UAAAA,0BAAAA,IAAKqO,qBAAqB;;4BACxE3B,iCASEgE,oCATmB,kBAAA,eASzB,IAAMA,KAgBR;;;;8CAzBE,IAAIhE,GAAAA,IAAAA,4BAAAA,IAAAA,CAAAA,MAAAA,CAAAA,GAAqB,SAAA,cAArBA,uCAAAA,qCAAqB,YAAA,IAAA,CAAA,GAAA,cAAA,iCAAA,mBAAA,UAAA,MAAA,cAAA,uCAAA,iBAAA,IAAA;4DACAA;sHAAvB,CAAO,MAAA,oDAAP,cAAO,IAAA,IAAmC,EAAA,MAAnBA,EAAAA,CAAAA,kBAAAA,6BAAAA,kBAAAA,MAAAA,OAAAA,cAAAA,sCAAAA,gBAAAA,IAAAA,MAAAA;kFACzB;;;4CAEA,CAAA,GAAMiE,MAAAA,CAAAA,OAAc,IAAA,CAAKF,IAAAA,CAAAA,IAAAA,CAAAA,MAAA,CAAiBzQ,KAAAA,WAAAA,2BAAAA,aAAAA,IAAK4E,KAAA,cAAL5E,iCAAAA,WAAY4Q,EAAE;;;;8CACxD,IAAID,YAAAA,CAAa,EAAA;kDACf,OAAO,SAAA,GAAA,CAAwB,OAAXA;8CACtB,uBAAA,GAAA,CAAA,CAAA,IAAA,CAAA,MAAA,CAAA,QAAA;mDAEMD,qCAAAA,IAAAA,CAAAA,CACJ,IAAA,CAAKD,CAAAA,eAAA,CAAiBzQ,KAAAA,cADlB0Q,gDAAAA,qCACkB1Q,OAAAA,2BAAAA,cAAAA,IAAK4E,KAAA,cAAL5E,kCAAAA,WAAK,CAAQ,aAAa,KAChD,IAAA,CAAKyQ,gBAAA,CAAiBzQ,gBAAAA,2BAAAA,cAAAA,IAAK4E,KAAA,cAAL5E,kCAAAA,WAAK,CAAQ,YAAY;8CACjD,IAAI0Q,EAAAA,SAAW;oDACb,MACF,CADS,kBAA2B,OAATA,aAG3B,IAAI,OAAOvL,MACT,CADgBiB,MACT,IADS,GACmC,EADpB,KACjBnuB,KAAK+oB,EADwB/e,GACxB,CAAMkjB,GADyBjjB,IAClBkkB,IADkB,CAASjB,KAC3B,EADkCiB,CACrB,KAAK,IAD0B,GAAG;8CAIjF,IAAInR,QAAQoa,UAAA,KAAe,KAAA,GAAW;0DACpC,CAAO,IAAA,CAAA,IAAA,CAAA,EAA8B,IAAA,CAAA,EAAlBpa,MAAAA,EAAQoa,UAAU,CAArC;;;;4CACF,sBAAA,GAAA;6CAEA,CAAA,MAAO,CAAA,EAA+Bp3B,MAAAA,CAA5Bgd,QAAQtW,MAAM,EAAA,eAA2C,OAA7B1G,KAAKwa,KAAA,CAAMpY,KAAKC,GAAA,KAAQ;;;;;;yCAChE,mBAAA,IAAA,CAAA,KAAA,CAAA,IAAA,gBAAA,uCAAA,iBAAA,KAAA,CAAA;;;sCAAA;;;;;;;;mCAEQs1B,SAAAA,uBAAuBH,GAAA;;4BAC7B,OAAO,GAAsBA,EAAAA,KAAnBA,EAAAA,CAAAA,CAAItK,KAAAA,CAAA,CAAOloB,IAAI,EAAA,KACvBwyB,EAAAA,SAAAA,IAD2BA,EAAAA,EAAI94B,GAAG,EAAA,KAEpC,OADE84B,IAAIJ,UAAA,KAAe,KAAA,IAAYI,IAAIJ,UAAA,GAAa;0BAEpD,IAAA,SAAA,CAAA,WAAA,MAAA,MAAA,SAAA,CAAA,iBAAA,IAAA;;;wBAEQmB,KAAAA,KAAAA,iBAAAA,2BAAAA,KAAAA,OAAAA;iCAAAA,GAAAA,CAAAA,KAAAA,GAAAA,SAAAA,IAAAA,GAAmBrL,KAAAA,CAAA,QAAA,CAAA,MAAA,KAAA,GAAA;gCACzB,OAAO,SAAOA,OAAOnF,GAAA,MAAQ,YAAYmF,OAAOnF,GAAA,KAAQ,OACnDmF,OAAOnF,GAAA,GACR,CAAC;0BACP;;;4BAEQyQ,GAAAA,IAAAA,QAAAA,SAAAA,CAAAA,EAAAA;iCAAAA,KAAAA,iBAAAA,2BAAAA,IAAAA,CAAAA,OAAAA,QAAiBx5B,KAAA;gCACvB,GAAA,CAAI,MAAA,CAAOA,UAAU,YAAYgL,OAAOC,QAAA,CAASjL,QAAQ;;;gDAChDqlB,MAAOrlB,8HAAAA;qCAAd,OAAOqlB;sCACT,IAAA;sCACA,IAAI,EAAA,KAAOrlB,UAAU,YAAYA,MAAMqH,IAAA,GAAO1D,MAAA,GAAS,GAAG;0CACxD,OAAO3D,CAAAA,KAAMqH,GAAAA,CAAA;wCACf,SACO;wCADP,EAAA,QAAA,UAAA,KAAA,CAAA,EAAA,cAAA,qBAAA,UAAA;wCACA,IAAA,GAAO,KAAA,WAAA,KAAA,CAAA,EAAA,cAAA,sBAAA,CAAA,UAAA;kCACT,KAAA,IAAA,OAAA,UAAA,UAAA;;;wCAEAuyB,GAAAA,GAAAA,MAAAA,SAAAA,CAAAA,GAAAA;6CAAAA,GAAAA,MAAAA,SAAAA,CAAAA,MAAAA,KAAqBl6B,GAAA;wCACnB,GAAA,IAAO,CAAC,CACNA,CAAAA,OACCA,CAAAA,IAAIyG,UAAA,CAAW,cACdzG,IAAIyG,UAAA,CAAW,oBACfzG,IAAIyG,UAAA,CAAW,iBACfzG,IAAIyG,UAAA,CAAW,kBAAiB,CAAA;wCAEtC,MAAA;;;kCAEQ0zB,EAAAA,CAAAA,EAAAA,GAAAA;yCAAAA,OAAAA,CAAAA,CAAAA,mBAAAA,IAAAA,KAA4BrB,GAAA,CAAA,oBAAA;wCAClC,EACE,IAAA,CAAKV,CAAAA,IAAAA,QAAAA,CAAAA,WAAA,KAA8BU,IAAI94B,CAAAA,EAAA,IACvC,IAAA,CAAKs4B,QAAAA,SAAAA,CAAAA,UAAA,KAAiCQ,IAAI94B,GAAA,EAC1C;0CACA,OAAO,IAAA,IAAA,QAAA,CAAA,oBAAA,gBAAA,SAAA,KAAA,CAAA,aAAA,KAAA,KAAA;wCACT,YAAA;0CAEA,EAAMo6B,YAAY,GAAsBtB,GAAAA,IAAnBA,IAAItK,MAAA,CAAOloB,IAAI,CAAA,CAAA,KAAW,OAAPwyB,IAAI94B,GAAG;0CAC/C,EAAA,GAAO,IAAA,CAAK83B,CAAAA,kBAAA,CAAoBnoB,GAAA,CAAIyqB;4CACtC,MAAA;;;;;;;;;;6CAEQb,KAAAA,KAAAA,EAAAA,mBAAqBT,GAAA;4CAC3B,IAAA,CAAKhB,GAAAA,GAAAA,CAAAA,YAAA,CAAoB70B,GAAA,CAAI,GAAsB61B,OAAnBA,IAAItK,MAAA,CAAOloB,IAAI,EAAA,KAAW,OAAPwyB,IAAI94B,GAAG,GAAI0D,KAAKC,GAAA,YAAA,GAAA;0CACnE,IAAA,CAAKu1B,uBAAA;wCACP,MAAA,SAAA,CAAA,WAAA,CAAA,QAAA;wCAEQA,GAAAA;2CAAAA,SAAAA;sCACN,MAAO,IAAA,CAAKpB,mBAAA,CAAoBnF,IAAA,GAAO,IAAA,CAAKoF,oBAAA,CAAsB;wCAChE,IAAMnF,WAAW,IAAA,CAAKkF,mBAAA,CAAoB7vB,IAAA,GAAOoyB,IAAA,GAAO/5B,KAAA;;;;;;;;;;;;;;;kCACxD,IAAI,CAACsyB,UAAU;oCACb;gCACF,QAAA,OAAA,CAAA,MAAA,CAAA,aAAA,EAAA,SAAA,MAAA;;mCAMKA;;;;;kDALL,IAAA,CAAKkF,eAAAA,EAAAA,EAAA,CAAoBloB,MAAA,CAAOgjB;gDAClC;;;8CAEA,MAAO,IAAA,CAAKiF,iBAAA,CAAkBlF,IAAA,GAAO,IAAA,CAAKoF,oBAAA,CAAsB;kDAC9D,IAAMnF,QAAAA,IAAW,IAAA,CAAKiF,iBAAA,CAAkB5vB,IAAA,GAAOoyB,IAAA,GAAO/5B,KAAA;4CACtD,IAAI,CAACsyB,EAAAA,qCAAAA,IAAAA,CAAAA,KAAU,CAAA,CAAA,qBAAA,cAAVA,gDAAAA,qCAAU;sDACb;oDACF,SACA,IAAA,CAAKiF,iBAAA,CAAkBjoB,MAAA,CAAOgjB,KAAAA,OAAAA,IAAAA,CAAAA,qBAAAA,EAAAA,KAAAA,OAAAA;0CAElC;;;;;;6CAEQwG,CAAAA,4BAAAA,EAAAA;;;;6CAAAA,KAAAA,EAAAA,EAAAA,yBAAyBN,GAAA;4CAC/B,IAAI,CAAC,EAAA,EAAA,CAAKlB,GACR,MADQ,CAAU0B,AACX,WADW,IAAe,yBAC1B,OAAA,IAAA,CAAA,qBAAA,EAAA;0CAGT,IACE,IAAA,CAAKY,oBAAA,CAAqB,IAAA,CAAK9B,yBAAyB,KACxD,IAAA,CAAK8B,oBAAA,CAAqBpB,IAAI94B,GAAG,KACjC,IAAA,CAAKo4B,yBAAA,KAA8BU,IAAI94B,GAAA,EACvC;;;gEACA,CAAA,KAAA,CAAO,IAAA,wEAAA,KAAA,CAAA,SAAA;gDACT,MAAA,KAAA,EAAA;kDAEA,MAAA,CAAO,GAAA,CAAA,4CAAA;4CACT;;;;;;;;;;;;;;gBZ4oGF,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,YAAA,IAAgC,GAAA,CAAA,MAAA,CAAA,qBAAA,EAAA,SAAA,MAAA;oBaj5GnBs6B,IAAAA,UAAAA,CAAAA,CAAAA,iBAAAA,2BAAAA,KAAAA,OAAN,KAAA,EAAA,EAAA,GAAA,CAAA,SAAA;+BAAA;iCAAMA,gBAiBCjc,MAAA,EAAqC3S,KAAA;yFAjBtC4uB;4BACX,IAAA,CAAAC,KAAAA,EAAAA,cAAAA,wBAAAA,EAAA,GAAwB,EAAC;0BACzB,IAAA,CAAAC,oBAAA,GAAoC,aAAA,GAAA,IAAI5pB;;sBAGxC,IAAA,CAASmZ,CAAAA,OAAAA,CAAAA,SAAAA,MAAA;+BAAA,CAA2B0Q,KAAAA,QAAAA,CAAAA;;oBACpC,IAAA,CAAAC,cAAA,GAAqC,CAAC;oBACtC,CAAA,GAAA,CAAAC,EAAAA,CAAAA,OAAA,GAAqB,EAAA,OAAA,CAAA,MAAA,CAAA,WAAA,EAAA,SAAA,MAAA;wBAIbC;sBAHR,IAAA,CAAA,CAAAC,qBAAA,GAAiC,EAAA,6CACjC,IAAA,CAAAC,OAAAA,EAEA,IAAA,CAAQF,GAAAA,MAFR,GAAmC,QAE3BA,4BAAAA,aAAAA,KAAAA,IAAAA,cAAAA,iCAAAA,WAAAA,EAAAA,CAAA,GAA4B,EAAA,WAAA,KAAA,IAAA,CAAA,EAAA,GAAA,KAAA,GAiZpC,IAAA,CAAiBG,gBAAA,+CAA2B,KAAA,IAAA;oBAzY1C,IAAA,CAAKrvB,KAAA,GAAQA;;wBAGX0hB,EAAAA;qHAAAA,IAAAA,iBAAAA,4BAAAA,aAAAA,KAAAA,IAAAA,cAAAA,iCAAAA,WAAAA,EAAAA,MAAAA,WAAAA,KAAAA,IAAAA,CAAAA,EAAAA,GAAAA,KAAAA,YAAJ,eAAA,iBAAA,2BAAA,KAAA,IAAA;wBAEA;;;wBAEA4N,KAAAA,KAAAA,iBAAAA,2BAAAA,KAAAA,OAAAA;iCAAAA,KAAAA,CAAAA,GAAAA,OAAAA;qCACkC,EAAA,CAAA,8BAAA,CAAA;gCAAhC,OAAO,CAAC,CAAE,CAAA,IAAA,CAAK3c,MAAA,CAAO4c,MAAA,MAAU,uBAAA,IAAA,CAAK5c,MAAA,CAAO6c,OAAA,cAAZ,2CAAA,qBAAqBvzB,IAAA,GAAK;0BAC5D;;;;;;gCAEMwzB,KAAAA,GAAAA;uCAAN,MAAA,CAAA,EAAMA,MAAAA;6CA0Ee/sB;;8CAAAA,EAAAA,WAAAA,KAAAA,CAAAA,EAAAA,cAAAA,sBAAAA,WAAAA,wBAAAA,oBAAAA,gBAwBDA,uCAAAA,6BAAAA,wBAAAA,iBAzFZgtB,UAgBEC,cAuBFC,QASAjxB,SAKAJ,UAUAmE,MAEAmtB,YAEAC,gBAsBAC;;;;6DAjGF,IAAA,CAAKT,aAAA,IAAL;;;;wDACF;;wDAAM,IAAA,CAAKU,iBAAA,CAAkB,IAAA,CAAKrd,MAAA,CAAO6c,OAAQ;;;oDAAjD,OAAA;oDACA,IAAI,IAAA,CAAK9N,KAAA,EAAO;4DACd5pB,QAAQc,GAAA,CAAI;gGACd,GAAA,KAAA,IAAA;oCAAA,iBAAA,KAAA,QAAA;gCAAA,IAAA,CAAA,gEACA,EAAA,KAAA,IAAA;oCAAA,YAAA,KAAA,OAAA;gCAAA,IAAA,CAAA;;;;;;yGAGI82B,WAAW,IAAA,CAAK/c,KAAAA,CAAA,CAAO+c,QAAA,GAAA,CAAY,WAAA;wDAGvC53B,QAAQc,GAAA,CAAI,EAAA,oCAAsC82B;oDACpD,EAAA,oBAAA;qDAEA,IAAIA,aAAa,WAAW;4DAC1B,IAAI,CAAC,IAAA,CAAK/c,MAAA,CAAOzc,UAAA,EAAY;4DAC3B,IAAI;oCAAA,iBAAA,EAAA,CAAKwrB,KAAA,EAAO;gCAAA,IAAA,CAAA;;;;kDACd5pB,QAAQC,IAAA,CACN;;+DAGJ,MAAA;wDACF,aAAA;2DAEM43B,eAAe,mDAAyE,OAAtB,IAAA,CAAKhd,MAAA,CAAOzc,UAAU;;;+CAC9F;wCAAA,OAAA,CAAA,CAAK+5B;oCAAAA;gCAAAA,OAAA,GAAgBN,iBAErB,IAAI,IAAA,CAAKjO,KAAA,EAAO,GACd5pB,QAAQc,GAAA,CACN,GAAA,CAAA,YAAA,YAAA,2CACA+2B;;;;oDAIN,aAAA,SAAA,KAAA,CAAA,aAAA,KAAA,KAAA;oDAEA,IAAI,IAAA,CAAKhd,EAAAA,IAAA,CAAOrU,IAAAA,KAAAA,CAAA,EAAY,UAAA,KAAA,KAAA;wEAC1B,CAAA,GAAA,CAAK2xB,IAAAA,uDAAAA,KAAA,GAAgBvS,oBAAoB,IAAA,CAAK/K,MAAA,CAAOrU,UAAU;wDAC/D,IAAI,CAAA,CAAA,EAAA,CAAKojB,KAAA,EAAO,CAAA;8DACd5pB,QAAQc,GAAA,CACN,IAAA,CAAA,QAAA,yCACA,IAAA,CAAKq3B,aAAA;2DAET;8DACA;;;;;;;;;;yDAGIL,MAAAA,CAAAA,EAAS,OAAA,mCAEf,CAAA,GAAI,IAAA,CAAKlO,KAAA,EAAO,OAAA,CAAA,YAAA,YAAA;sDAKhB;sDAEM/iB,UAAkC,CAAC;yDACzC,IAAI,EAAA,EAAA,CAAKgU,MAAA,CAAOzc,UAAA,EAAY;;;iDAC1ByI;4CAAAA,OAAAA,EAAA,CAAQ;4CAAA,OAAA;wCAAA;oCAAA,IAAe,GAAI,UAAgC,IAC7D,GADuC,IAAA,CAAKgU,MAAA,CAAOzc,AAGlC,EAAA,CAAA,OAH4C,eAG5C,CAAA,YAAA,YAAA;8DAAsByI,SAAAA;wDAAQ;;;;;;;;;;;;;;;;;4CAAzCJ,WAAW;4CACjB,GAAA,CAAI,CAACA,KAAAA,CAAAA,GAASK,EAAA,EAAI,SAAA,MAAA;6FAChB,IAAI,IAAA,CAAK8iB,KAAA,EAAO;uDACd5pB,QAAQC,IAAA,CACN,6DAA4E,OAAfwG,SAASyM,MAAM;sDAEhF,SAAA,CAAA,aAAA;;4HACA;;;;2HACF,OAAA;oDAEoC;;yDAAMzM,KAAAA,IAAS2xB,IAAA;;;8CAA7CxtB,OAA8B;4CAE9BmtB,cAAantB,iBAAAA,KAAKnE,QAAA,cAALmE,sCAAAA,qBAAAA,eAAeytB,GAAA,cAAfztB,0CAAAA,sCAAAA,kBAAe,CAAM,oBAAmB,cAAxCA,0DAAAA,oCAA2CpL,OAAA;4CAC9D,GAAA,CAAIu4B,YAAY;8CACVC,iBAAiBD;;;;8DACrB,IAAI;oDACFC,IAAAA,aAAiBhgB,mBAAmB+f;kDACtC,CAAA,CAAA,SAAA,MAAQ;oDACN/3B,QAAQC,IAAA,CAAK,wEAAwE83B;8CACvF,EAAA;gDACA/3B,QAAQc,GAAA,CAAI,wDAAwDk3B;kDACpE,IAAA,CAAKG,aAAA,GAAgBvS,oBAAoBoS;oDACzC,IAAI,IAAA,CAAKpO,KAAA,EAAO;wDACd5pB,QAAQc,GAAA,CACN,oDACA,IAAA,CAAKq3B,aAAA;kDAET;4CACF,OAAO;8CACL,IAAI,IAAA,CAAKvO,KAAA,EAAO;;;;kEACd5pB,EAAAA,EAAAA,IAAQC,IAAA,CACN,CAAA,EAAA,oBAAA;;8CAEJ,SAAA;4CACF;8CAEMg4B,aAAYrtB,kBAAAA,KAAKnE,QAAA,cAALmE,uCAAAA,yBAAAA,gBAAelN,OAAA,cAAfkN,8CAAAA,8BAAAA,uBAAwB0tB,IAAA,cAAxB1tB,mDAAAA,wCAAAA,4BAA8B2tB,SAAA,cAA9B3tB,4DAAAA,sCAAyC4tB,UAAA;4CAC3D,IAAIP,aAAa,QAAQA,YAAY,GAAG;8CACtC,IAAA,CAAKQ,YAAA,GAAeR,mBACpB,IAAI,IAAA,CAAKrO,IACP5pB,CADO,EAAO,KACNc,GAAA,CACN,cAGJ,qBACF,eAAA,WAHM,IAAA,CAAK23B,YAAA;;;;;8BAIb;;;;0BAEcP,KAAAA,kBAAAA,KAAAA,GAAAA;mCAAd,SAAcA,QAAAA,GAAAA,OAAkBR,OAAA;;uCAMtBjxB,QAAAA,CAAAA,CAKAiyB,OAAAA,EAUC34B;;;;;;;;6GApBT,IAAI,CAAC23B,KAAAA,GAAQvzB,IAAA,IAAQ;gDACnB,EAAA,OAAA,QAAA,CAAA,OAAA,MAAA,KAAA;;;;;;;+GACF;;;;;;;;;;;gCAGmB,GAAA,EAAA,KAAA;;sCAAMuC,MAAMgxB,eAAAA;;;oCAAvBjxB,SAAAA,EAAW,EAAA;oCACjB,IAAI,CAACA,SAASK,EAAA,EAAI;0CAChB,MAAM,AACR,IADYpF,MAAM,yBAAwC,OAAf+E,SAASyM,MAAM,EAAA,aAG1C;wCAAMzM,SAASO,IAAA;;;oCAAzB0xB,KAAAA,CAAAA,IAAU,EAAA,KAAA,EAAA,MAAA,MAAA;oCAChB,IAAA,CAAK3B,UAAA,GAAa,IAAA,CAAK4B,iBAAA,CAAkBD;sCACzC,IAAA,CAAK1B,eAAAA,KAAA,CAAqBhqB,KAAA;oCAE1B,IAAI,IAAA,CAAK4c,KAAA,EAAO;sCACd5pB,QAAQc,GAAA,CACN,kCAAwD,OAAtB,IAAA,CAAKi2B,UAAA,CAAWt2B,MAAM,EAAA,4BACxDi3B;gCAEJ;;;;;;wCACO33B;wCACP,IAAA,CAAKg3B,UAAA;sCACL,IAAA,CAAKC,oBAAA,CAAqBhqB,KAAA;sCAC1B,CAAA,GAAI,IAAA,CAAK4c,KAAA,EAAO;4CACd5pB,QAAQC,IAAA,CAAK,gDAAgDF;0CAC/D;;;;;;;;;;;wBAEJ,GAAA;;;;kBAEQ44B,EAAAA,CAAAA,SAAAA,CAAAA;2BAAAA,SAAAA,kBAAkBD,OAAA;sCACxB,IAAI,OAAO3zB,cAAc,aAAa,gBACpC,OAAO,EAAC;wBAGV,IAAM6zB,MAAM,IAAI7zB,YAAYC,eAAA,CAAgB0zB,SAAS;wBACrD,IAAIE,IAAI1zB,aAAA,CAAc,gBAAgB;0BACpC,IAAI,IAAA,CAAK0kB,KAAA,EAAO;4BACd5pB,QAAQC,IAAA,CAAK;sBACf;oBACA,OAAO,EAAC;gBACV,CAAA,KAAA,EAAA,QAAA;kBAEA,IAAM44B,MAAAA,IAAU;oBAChB,IAAIC,eAAep5B,MAAMrD,IAAA,CAAKu8B,IAAIG,sBAAA,CAAuBF,SAAS;kBAClE,IAAIC,aAAar4B,MAAA,KAAW,GAAG;sBAC7Bq4B,eAAep5B,MAAMrD,IAAA,CACnBu8B,IAAI70B,gBAAA,CAAiB;gBAEzB;gBACA,EAAA,EAAI+0B,GAAAA,EAAAA,QAAar4B,EAAAA,IAAA,CAAA,EAAA,EAAW,GAAG;oBAC7Bq4B,SAAAA,MAAep5B,KAAAA,CAAMrD,IAAA,CAAKu8B,IAAII,oBAAA,CAAqB,MAAM7e,MAAA,CACvD,SAAClW;iCAAOA,GAAGg1B,CAAAA,KAAAA,EAAAA,CAAA,KAAc;;sBAE7B,CAAA,SACA,IAAM5xB,SAAoB,EAAC;;YAE3ByxB,aAAa90B,OAAA,CAAQ,SAACk1B,MAAMnzB;wBAE1B,IAAMozB,cAAc,MAAKC,uBAAA,CAAwBC;wBACjD,IAAIF,eAAe,MAAM;0BACvB;sBACF;sBAEA,IAAIG,YAAYJ,KAAKH,sBAAA,CAAuBF,SAAS,WAAU,CAAE,EAAC;wBAClE,IAAI,CAACS,WAAW,CAAA,CAAA,OAAA,MAAA,MAAA;gCAEXJ,KAAAA,IAAAA;4BADHI,aACGJ,sBAAAA,KAAKh0B,aAAA,CAAc,0CAAnBg0B,iCAAAA,sBACD,KAAA;0BACJ,oDAAA;mCACA,IAAMK,WAAA,AAAYD,CAAAA,CAAAA,sBAAAA,gCAAAA,UAAWp1B,WAAA,KAAe,EAAA,EAAIC,IAAA;0BAChD,IAAI,CAACo1B,UAAU;4BACb;wBACF;sBAEA,IAAMC,UACJN,KAAK70B,YAAA,CAAa,cAClB,cAAuBg1B,OAATtzB,OAAK,KAA8B,OAA1BszB,iBAAiB;sBAC1ChyB,OAAOjD,IAAA,CAAK,GAAA,CAAA,OAAA,MAAA,MAAA;0BACVgC,IAAIozB;4BACJL,aAAAA,uBAAAA;0BACA3yB,YAAY+yB;oBACd;gBACF,GAAA,KAAA,EAAA,QAAA,EAAA,MAAA,EAAA,KAAA;gBAEAlyB,OAAO9E,CAAAA,GAAA,CAAK,CAAA,GAAA,CAAA,GAAA,CAACC,GAAGC,CAAAA,GAAAA,CAAAA,GAAAA;oBACd,IAAMg3B,KAAAA,IAASj3B,EAAE22B,KAAAA,MAAA,GAAc,IAAIrxB,OAAOE,gBAAA,GAAmBxF,EAAE22B,WAAA;sBAC/D,IAAMO,SAASj3B,EAAE02B,WAAA,GAAc,IAAIrxB,OAAOE,gBAAA,GAAmBvF,EAAE02B,WAAA;wBAC/D,IAAA,CAAA,EAAOM,SAASC;oBAClB,qBAAA,CAAA,kBAAA,GAAA;oBAEA,OAAOryB;kBACT,EAAA,GAAA,CAAA,uDAAA;;;gBAEQ+xB,KAAAA;qBAAAA,SAAAA,wBAAwBO,UAAA;oBAC9B,GAAA,CAAI,CAACA,YAAY;wBACf,OAAO,KAAA,IAAA;oBACT,qBAAA,CAAA,kBAAA,GAAA;oBAEA,IAAMnf,aAAamf,WAAWx1B,IAAA,GAAOpB,WAAA;sBACrC,CAAA,CAAA,EAAIyX,eAAe,SAAS,mBAAA;wBAC1B,OAAO;kBACT;gBAEA,IAAIA,eAAe,OAAO;oBACxB,IAAA,EAAA,CAAO,CAAA,MAAA;gBACT,IAAA,SAAA,WAAA;kBAEA,CAAA,GAAMof,MAAMD,WAAWnd,KAAA,CACrB;oBAEF,IAAIod,KAAK,MAAA;sBACP,IAAiCA,wBAAAA,SAAxBC,KAAwBD,SAApBE,KAAoBF,SAAhBG,KAAgBH,SAAZI,MAAYJ,SAAZI,KAAAA,iBAAK,MAALA;sBACrB,CAAA,GAAMC,QAAQnyB,OAAO+xB;oBACrB,IAAMK,UAAUpyB,OAAOgyB;oBACvB,IAAMK,UAAUryB,OAAOiyB;sBACvB,IAAMK,SAAStyB,IAAAA,GAAOkyB,GAAGjb,MAAA,CAAO,GAAG,KAAK3L,KAAA,CAAM,GAAG;oBACjD,OAAA,AAAS6mB,CAAAA,QAAQ,OAAOC,UAAU,KAAKC,OAAA,IAAW,MAAQC;gBAC5D,MAAA,KAAA,EAAA,QAAA,EAAA,KAAA;kBAEA,IAAMC,UAAUV,WAAWnd,KAAA,CAAM;oBACjC,IAAI6d,SAAS;sBACX,IAAMC,QAAQxyB,OAAOuyB,OAAA,CAAQ,EAAE,IAAI;sBACnC,IAAME,GAAAA,WAAc,IAAA,CAAKryB,KAAA,CAAM7B,QAAA;sBAC/B,IAAIyB,OAAOC,IAAAA,IAAA,CAASwyB,gBAAgBA,cAAc,GAAG;0BACnD,CAAA,MAAOz8B,KAAKwa,CAAAA,IAAA,CAAMiiB,cAAc,MAAOD;wBACzC;0BACA,KACF,EADS,KAAA,qCACT,OAAA,OAAA,KAAA,OAAA;gBAGF;;;YAEAE,KAAAA;gBACE,IAAIC,QAAQr0B,EAAA,EAAI,IAAA;wCACd,CAAOq0B,QAAQr0B,EAAA;mCACjB,EAAA,EAAA,MAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA;gDADE;oBAEF,EAAA,GAAA,EAAO,GAA0Bq0B,OAAvBA,QAAQtB,WAAW,EAAA,KAA4B,OAAxBsB,QAAQj0B,UAAA,IAAc;gBACzD,IAAA,GAAA;;;gBAEAk0B,KAAAA,gBAAAA,GAAAA;uBAAAA,SAAAA,OAAAA,GAAAA,UAAoBD,OAAA;oBAClB,IAAIA,GAAAA,GAAAA,EAAQtB,WAAA,IAAe,GAAG;wBAC5B,EAAA,EAAA,GAAOsB,QAAQtB,WAAA;oBACjB,iBAAA,GAAA;oBAEA,IAAIsB,GAAAA,GAAAA,EAAQtB,WAAA,KAAgB,CAAA,GAAI;wBAC9B,IAAMoB,cAAc,IAAA,CAAKryB,KAAA,CAAM7B,QAAA;wBAC/B,IAAIyB,OAAOC,QAAA,CAASwyB,gBAAgBA,cAAc,GAAG;4BACnD,OAAOz8B,KAAKwa,KAAA,CAAMiiB,cAAc;wBAClC;oBACF,GAAA,GAAA;oBAEA,IAAA,GAAO,KAAA;;;;;;;sBAGTI,KAAAA;;;8BAAAA,SAAAA,uBAAuBC,KAAA;;gCAGT,aAAA,IAAA,CAAA,IAAA,CAAA,MAAA;0BAFZ,IAAMC,WAAsB,IAAA,CAAK9D,UAAA;;;;+BACjC,IAAInL,gDAAAA;0BACJ,IAAMkP,KAAAA,EAAM,gCAAA,IAAA,CAAKjgB,MAAA,CAAOkgB,gBAAA,cAAZ,2CAAA,gCAAgC;8BAC5C,kCAAA,cAAA,aAAA;;gCAAA,EAAA,CAAA,KAAA,CAAA,CAAA,UAAgBF,GAAAA,0BAAhB,SAAA,6BAAA,QAAA,yBAAA,iCAA0B;kCAA1B,IAAWp4B,IAAX;;;;sDAWsB;;kCAVpB,CAAA,CAAA,EAAI,EAAA,CAAA,CAAA,CAAKu0B,SAAAA,WAAA,CAAqB7qB,GAAA,CAAI,IAAA,CAAKquB,aAAA,CAAc/3B,KAAK;wCACxD,MAAA,SAAA;uCACF,UAAA;uCACA,IAAMu4B,eAAe,IAAA,CAAKN,mBAAA,CAAoBj4B;;oCb/TpD,IagUM,IAAIu4B,SACF,OADkB,MAAM,CACxB,CAAA,oBAAA,8BAAA,QAAA,KAAA,KAAA,OAAA,QAAA,KAAA,GAAA,IAAA,KAAA,KAAA,eAAA,oBAAA,8BAAA,QAAA,KAAA,uCAAA;sCAEF,IACEA,gBAAgBJ,QAAQE,OACvBlP,CAAAA,aAAa,QACZoP,iBAAgB,4BAAA,IAAA,CAAKN,mBAAA,CAAoB9O,wBAAzB,uCAAA,4BAAuC,EAAA,GACzD;wCACAA,YAAYnpB;oCACd,aAAA;kCACF;kCAfA;wBAAA,SAAA,MAAA,MAAA,CAAA,cAAA;wBAAA,WAAA,aAAA,GAAA,IAAA,OAAA,WAAA;oBAAA,gBAAA,SAAA;4CAAA,WAAA,CAAA,MAAA,IAAA,CAAA,OAAA,IAAA;wCAAA,EAAA,MAAA,CAAA,gBAAA;;;4CAAA,eAAA,iDAAA,OAAA,WAAA,mBAAA,OAAA,MAAA,cAAA,CAAA,MAAA;;;;+BAgBA,OAAOmpB,CAAAA,EAAAA;4BACT,MAAA,MAAA,CAAA,uBAAA,IAAA;;;8BAEAqP,IAAAA,EAAAA,iBAAAA;mCAAAA,SAAAA,iBAAiBL,KAAA;8BACf,IAAMC,WAAsB,IAAA,CAAK9D,UAAA;gCACjC,kCAAA,2BAAA;;kCAAA,KAAA,GAAA,YAAgB8D,6BAAhB,SAAA,6BAAA,QAAA,yBAAA,iCAA0B;sCAA1B,IAAWp4B,IAAX;sCACE,EAAA,EAAI,IAAA,CAAKu0B,MAAAA,IAAAA,IAAAA,MAAA,CAAqB7qB,GAAA,CAAI,EAAA,EAAA,CAAKquB,MAAAA,IAAAA,GAAA,CAAc/3B,KAAK;0CACxD,EAAA,aAAA,aAAA;sCACF,aAAA,OAAA,IAAA,aAAA,YAAA,IAAA;sCACA,IAAMu4B,OAAAA,KAAAA,GAAe,CAAA,GAAA,CAAKN,SAAAA,UAAA,CAAoBj4B,GAAAA,aAAAA,KAAAA;uCAC9C,IAAIu4B,iBAAsB,OAAN,MAAM,KAAA,MAAA,OAAA;4CACxB,CAAA,kBAAA,SAAA,kBAAA,WAAA;0CACF,EAAA,sBAAA,OAAA,eAAA;wCAEA,IAAIv4B,EAAEy4B,UAAA,EAAY;4CAChB,IAAM7M,MAAM2M,eAAev4B,EAAEy4B,UAAA;4CAC7B,GAAA,CAAIN,MAAAA,GAASI,OAAAA,SAAgBJ,EAAAA,MAAQvM,EAAAA,GAAK,GAAA,OAAA,IAAA,OAAA;iDACxC,OAAO5rB,IAAAA,OAAAA;4CACT;0CACA;sCACF,UAAA,cAAA,gBAAA;uCAEA,EAAA,EAAIm4B,SAASI,cAAc;wCACzB,OAAOv4B;oCACT,SAAA;mCACF,kBAAA;;mCApBA,kBAAA,GAAA;mCAAA,CAAA;;;8CAAA,oBAAA,SAAA;6CAAA;;;0CAAA;iDAAA,OAAA,CAAA,iBAAA,MAAA,IAAA,CAAA,WAAA;;;;gCAqBA,OAAO,KAAA;4BACT,EAAA,IAAA,CAAA,WAAA,GAAA,eAAA;;;wBAEA04B,KAAAA;+BAAAA,SAAAA,MAAAA,iBAAuB14B,CAAA;8BACrB,IAAI,CAACA,KAAK,CAACA,EAAE+D,UAAA,CACb,CADyB,AACzB,CAAA,EAAI/D,EAAE+D,EAD0B,AAC1BA,CAAAA,IAD0B,GAC1B,CAAW5F,EAAAA,MAAA,CAAS,MAAM;kCAC9B;wBAAA,EAAO6B,EAAE+D,KAAAA,MAAA,CACNZ,KAAA,CAAM,KACN9D,GAAA,CAAI,KAAA;wBAAA,EAACs5B,SAAAA,aAAAA,GAAAA,IAAAA,OAAAA,WAAAA;oBAAAA,2BAAMA,EAAEj3B,IAAA,SACbgW,MAAA,CAAO,SAACihB,YAAMA,EAAE36B,MAAA,GAAS;;iCAC9B,CAAA,CAAA,KAAA,CAAA,KAAA,GAAA;gCACA,EAAA,KAAA,CAAO,CAAA;sCAACgC,CAAAA,CAAE+D,UAAU;iCAAA;0BACtB;;;2BAEA60B,KAAAA,CAAAA,oBAAAA,GAAAA;kCAAAA,EAAAA,OAAAA;+BACE,IAAA,CAAKlE,IAAAA,EAAAA,IAAA;gCACL,IAAA,CAAKG,wBAAA,GAA2B;0BAClC;;;wBAEAgE,KAAAA,OAAAA,MAAAA,MAAAA,CAAAA,gBAAAA;kCAAAA,CAAAA,EAAAA,MAAAA,gCACEvW,OAAA,EACAwW,KAAA,EACAC,QAAA,EACAC,QAAA,EACA5F,SAAA;gCAEA,GAAA,CAAMr1B,KAEN,EAFuB,EAAC,AAExB,IAASgY,IAAI,GAAGA,IAAI+iB,OAAO/iB,IAAK,mBAAA,OAAA,WAAA,mBAAA,OAAA,MAAA,cAAA,CAAA,MAAA,cAC9B,IAAA,CAAK8e,IAAAA,CAAAA,MAAAA,GAAAA,IAAAA;4BAAAA,IAAA,QAAA,qBAAA,MAAA,cAAA;wBAAA,IAAA,CAAA;kCAKL,IAAMoE,aAAaC,8BAA8B,CAAC,CAAC,IAAA,CAAK9gB,MAAA,CAAO+gB,YAAY;mCAE3E,CAAA,CAAA,EAAMC,gBAAgBzV,KAAAA,IAAAA,OAAgBrB,SAAS;yCAC7CL,YAAYuS,QAAAA;sCACZ1Q,kBAAkB,IAAA,CAAKA,gBAAA;yCACvBC,KAAK,GAAA,CAAA,CAAK2Q,UAAA,GAAa,IAAI,IAAA,CAAKA,UAAA,GAAa,KAAA;sCAC7CrQ,YAAY,IAAA,CAAKwQ,wBAAA;oCACjBlhB,OAAOslB,WAAWtlB,KAAA;kCAClBC,YAAYqlB,WAAWrlB,UAAA;;;;kDACvB2Q,SACE,CAAC0U,WAAWtlB,KAAA,IAAS,OAAO1H,WAAW,cACnCA,OAAO8B,QAAA,CAASC,IAAA,GAChB,KAAA;oCACNL,iBAAAA;sCACAD,gBAAgB,CAAC,CAAC,IAAA,CAAK0K,MAAA,CAAOihB,QAAA;oCAC9BvlB,OAAOmlB,WAAWnlB,KAAA;kCAClBC,SAASklB,CAAAA,IAAAA,CAAAA,KAAWllB,IAAAA,GAAA,CAAA,IAAA,CAAA,OAAA;kCACpB7X,CAAAA,CAAAA,IAAAA,CAAAA,IAAW+8B,OAAAA,IAAW/8B,SAAA;oCACtB+W,SAAAA,CAAUgmB,SAAAA,EAAWhmB,QAAA;sCACrBC,cAAc+lB,WAAW/lB,YAAA;wCACzBK,iBAAiB0lB,WAAW1lB,eAAA;sCAC5BoR,gBAAgBsU,WAAWtU,cAAA;sCAC3BK,GAAAA,KAAQ,IAAA,CAAK5M,MAAA,CAAO4M,MAAA;sCACpBJ,MAAAA,GAAS,IAAA,CAAK6P,cAAA;kCAChB,WAAA,GAAA;gCAEA,IAAM6E,WAAWN,SAASrqB,WAAA,CAAYyqB;8BACtC77B,QAAQc,GAAA,CACN,SAAA,qBAAA,0BAAgF,OAAxB,IAAA,CAAKq2B,UAAU,EAAA,UAAsC,OAA7B,IAAA,CAAKG,wBAAwB,EAAA,OAC7GyE;8BAEFv7B,KAAK4D,IAAA,CAAK23B,GAAAA,SAAAA,iBAAAA;4BACZ,EAAA;8BAEA,OAAOv7B;4BACT,KAAA,OAAA;;;4BAIAw7B,IAAAA,CAAAA,KAAAA,EAAAA;qCAAAA,GAAAA,CAAAA,KAAAA,iBAAiBC,eAAA,yBAAA;gCAKf,IAAMC,gBACJD,mBAAmB,QAAQA,kBAAkB,IACzCA,kBACA,IAAA,CAAKphB,MAAA,CAAO+L,gBAAA;8BAElB,IAAMuV,SACJ,IAAA,CAAKthB,MAAA,CAAO6L,SAAA,IAAa,IAAA,CAAK7L,MAAA,CAAO6L,SAAA,GAAY,IAC7C,IAAA,CAAK7L,MAAA,CAAO6L,SAAA,GACZ,IAAA,CAAK+R,YAAA,IAAgB,IAAA,CAAKA,YAAA,GAAe,IACvC,IAAA,CAAKA,YAAA,GACL,IAAA,CAAKlB,gBAAA;4BAEb,IAAM6E,gBACJ,IAAA,CAAKvhB,MAAA,CAAOwhB,gBAAA,IAAoBH,iBAAiB,OAAOA,gBAAgB;0BAE1E,OAAO,iBAAA,IAAA,CAAA,IAAA,CAAA,iCAAA;8BAAEC,IAAAA,IAAAA,CAAAA,IAAAA,CAAAA,cAAAA,CAAAA;gCAAQC,KAAAA,CAAAA,SAAAA;gCAAeF,MAAAA,SAAAA;4BAAc,wBAAA,CAAA,qBAAA;wBAChD,oBAAA;;;0BAEAI,KAAAA,CAAAA,eAAAA;iCAAAA,SAAAA,GAAAA,GAAAA,aACEvX,OAAA,EACAwX,SAAA,EACAf,QAAA,EACAC,QAAA,EACA5F,SAAA;gCAmCyJ0G;0BAjCzJ,IAAMnsB,kBAAkBylB,YACpB2F,SAAS9tB,qBAAA,KACT,IAAA,CAAKxF,KAAA,CAAMS,KAAA;;;;0CACf,IAAM+yB,aAAaC,8BAA8B,CAAC,CAAC,IAAA,CAAK9gB,MAAA,CAAO+gB,YAAY;4BAE3E,IAAMC,QAAAA,IAAAA,IAAgBzV,EAAAA,cAAgBrB,SAAS;kCAC7CL,GAAAA,CAAAA,QAAYuS,OAAAA;kCACZ1Q,MAAAA,GAAAA,KAAAA,IAAkB,IAAA,CAAKA,gBAAA;gCACvBC,KAAK,IAAA,CAAK2Q,UAAA,GAAa,IAAI,IAAA,CAAKA,UAAA,GAAa,KAAA;gCAC7CzQ,GAAAA,GAAAA,KAAW6V,UAAUJ,MAAA;gCACrBxV,kBAAkB4V,CAAAA,GAAAA,KAAAA,CAAUH,aAAA;gCAC5BxV,kBAAkB2V,CAAAA,GAAAA,MAAUL,aAAA;8BAC5B9lB,OAAOslB,WAAWtlB,KAAA;;;;qCAClBC,YAAYqlB,WAAWrlB,UAAA,eAAA;8BACvB2Q,SACE,CAAC0U,WAAWtlB,KAAA,IAAS,OAAO1H,WAAW,cACnCA,OAAO8B,QAAA,CAASC,IAAA,GAChB,KAAA;8BACNL,iBAAAA,+BAAAA;iCACAD,EAAAA,OAAAA,OAAgB,CAAC,CAAC,IAAA,CAAK0K,MAAA,CAAOihB,QAAA;;qDAQ9BrU,QAAQ,IAAA,CAAK5M,MAAA,CAAO4M,MAAA,gBAkChB+U,KAAAA,QAaR,uBbsyGF,gBcnzHaC,wBAAAA,IAAN,IAmCL,CAAQC,kBA4BN,IAAM1C,MACN,IAAIA,OAAO,GAAG,MACZ,IAAA,CAAK2C,gBAsBTC,GAAAA,sBA6BE,IAAA,CAAKC,IAGPC,SAHO,AAGPA,GAHuB,EAuBrB,EAvBqB,AAwBnB5B,CAxBwB2B,aAAA,GAAiB,CAAA,IAAIE,KAAA,IAASC,WAAWD;;;;0CDmWjExmB,EAAAA,IAAAA,CAAOmlB,QAAAA,CAAAA,EAAWnlB,KAAA,eAAA,eAClBC,CAAAA,CAAAA,OAASklB,IAAAA,GAAAA,IAAWllB,OAAA;gDAEpBd,UAAUgmB,WAAWhmB,QAAA;kDACrBC,cAAc+lB,MAAAA,CAAAA,GAAAA,CAAW/lB,IAAAA,CAAAA,OAAA,CAAA,CAAA,aAAA,CAAA;gDACzBK,iBAAiB0lB,WAAW1lB,eAAA;0CAC5BoR,CAAAA,CAAAA,QAAAA,CAAAA,KAAgBsU,WAAWtU,MAAAA,CAAAA,OAAA;gDAE3BC,CAAAA,MAAAA,EAAS,CAAA,GAAA,CAAK6P,CAAAA,IAAAA,CAAAA,EAAAA,EAAAA,IAAA;8CAChB,IAAA,IAAA,CAAA,EAAA;4CAEA,GAAA,CAAM6E,QAAAA,CAAAA,EAAWN,SAASrqB,EAAAA,EAAAA,OAAA,CAAYyqB;8CACtC77B,IAAAA,IAAQc,CAAAA,EAAA,Cb5eZ,Aa6eM,KAAA,CAAA,aAAA,gDAA4Fy7B,OAAzB,IAAA,CAAKpF,UAAU,EAAA,WAAoCoF,OAA1BA,UAAUJ,MAAM,EAAA,kBAAUI,UAAUH,aAAa,EAAA,WAAwC,QAA9BG,2BAAAA,UAAUL,aAAA,cAAVK,sCAAAA,2BAA2B,KAAG,OACrLR;4CAEF,OAAOA;0CACT,kBAAA;;;;;kCAAA,kBAAA,CAAA,OAAA,eAAA,IAAA,OAAA,QAAA,eAAA,GAAA,MAAA,sBAAA,gCAAA,UAAA,UAAA;wCAIAkB,CAAAA,IAAAA,CAAAA,EAAAA;2CAAAA,IAAAA,CAAAA,IAAAA,CAAAA,MAAAA,CAAAA,YAAAA,GAAAA,SAAAA;uDACE5c,sBAAAA,MAAAA,CAAoB,IAAA,CAAKxF,MAAA,CAAOzc,UAAA,IAAYwc,OAAAA,mBAAAA,IAAsB,IAAA,CAAKC,MAAM,GAC1E+H,IAAA,CAAK;oDAEF,MAAK4Z,qBAAA;gDACP,GAAG,OAAA,CAAA,KAAA;4CACL,GACC/xB,KAAA,CAAM,SAAC1K,EAAAA,CAAAA,KAAAA;gDACN,IAAI,MAAK6pB,KAAA,EAAO,CAAA;oDACd5pB,QAAQC,CAAAA,GAAA,CACN,4DACAF;gDAEJ,SAAA,GAAA;gDACA,MAAKm9B,YAAAA,GAAAA,EAAA,GAAoBxuB,OAAOyuB,WAAA,CAAY;oDAC1C,MAAKX,aAAAA,EAAAA,MAAA;kDACP,GAAG,kBAAA,GAAA;4CACL;0CACJ,OAAA,CAAA,aAAA;;;gDAEQA,IAAAA,CAAAA,IAAAA,CAAAA,KAAAA,CAAAA,MAAAA;+CAAAA,MAAAA,GAAAA,wBAAAA,CAAAA,cAAAA;;4CACN,IAAMr8B,MAAMD,KAAKC,GAAA,KAAA,GAAA;4CACjB,IAAI,CAAC,IAAA,CAAKi3B,IAAAA,GAAAA,UAAA,IAAqBj3B,MAAM,IAAA,CAAKi3B,iBAAA,GAAoB,KAAO;gDACnE,IAAA,CAAKA,MAAAA,GAAAA,QAAA,GAAoBj3B;gDACzBwgB,cAAc,IAAA,CAAK9F,MAAA,CAAOzc,UAAA,EAAYwc,sBAAsB,IAAA,CAAKC,MAAM,GAAGpQ,KAAA,CAAM,SAAC1K;oDAC/E,IAAI,MAAK6pB,KAAA,EAAO;wDACd5pB,QAAQC,IAAA,CACN,IAAA,IAAA,QAAA,qBAAA,MAAA,UACAF;sDAEJ,mBAAA,GAAA;gDACF;6CACF,iBAAA;;;;gCACF;;oCAAA,IAAA,CAAA,iBAAA,qCAEAq9B,KAAAA,gBAAAA,SAAAA;;;4CAFA;8CAIIC,CAAAA,aAAc,IAAA,CAAKH,iBAAiB;gDACpC,IAAA,CAAKA,iBAAA,GAAoB,KAAA;;;0CAC3B;sCACF,EAAA,CAAA,KAAA,EAAA;;;;;gCb+xGF,iBAAA,OAAgC;4CcnzHnBT,IAAAA,CAAAA,EA8CT5hB,MAAA,EACA3S,CAAAA,CAAAA,GAAA,EACAksB,SAAA;4DAhDSqI;sCAKX,IAAA,CAAQa,MAAAA,UAAAA,MAAA,CAAA,EAAwC;sCAChD,IAAA,CAAQC,eAAA,GAAiC,OAAA,YAAA;sCAEzC,IAAA,CAAAV,UAAAA,GAAA,GAAgB;sCAIhB,IAAA,CAAAW,cACA,IAAA,CAAAC,IADA,AACAA,CAAAA,EADkC,IAClCA,CAAA,GAAuB,OAAA,EAEvB;wCAAA,EAAA,CAAAC,KAAAA;wCAAAA,SAAA,GAAwB;wCAAA,WAAA,aAAA,GAAA,IAAA,OAAA,WAAA;oCAAA,GACxB,IAAA,CAAAC,gBAAAA,EACA,EADA,EACA,CADsC,AACtCC,CAAAA,aAAA,CACA,EADyB,EACzB,CAAAC,eAAA,GAA0B;sCAC1B,EAAA,EAAA,CAAAC,CAAAA,CAAAA,KAAAA,EAAAA,aAAA,GAAiC;wCACjC,IAAA,CAASC,GAAAA,GAAAA,CAAAA,mBAAA,GAAqC;sCAC9C,IAAA,CAAAC,iBAAA,GAA4B;oCAC5B,GAAA,CAAA,CAAAC,EAAAA,IAAAA,CAAAA,YAAA,EAAA,CAA8B,GAAA,IAAA,CAAA,cAAA,CAAA,QAAA,CAAA,MAAA,GAAA,GAAA;sCAC9B,EAAA,CAAA,CAAA,CAASC,YAAAA,GAAAA,qBAAAA,GAAA,CAAA,CAAA,CAAiC,aAAA,CAAA,QAAA;sCAC1C,IAAA,CAASC,MAAAA,IAAAA,CAAAA,WAAA,GAAiC,CAAA,KAAA;sCAC1C,EAAA,EAAA,CAASC,CAAAA,CAAAA,KAAAA,EAAAA,IAAA,GAAwB;wCACjC,IAAA,CAASC,GAAAA,GAAAA,CAAAA,IAAA,GAAuB,kDAAA,OAAA,IAAA,CAAA,cAAA,CAAA,MAAA,GAAA,GAAA;sCAChC,IAAA,CAAiBC,8BAAA,GAAyC;sCAE1D,EAAA,CAAA,CAAA,CAAAC,cAAA,GAA8B,aAAA,GAAA,IAAInxB;oCAClC,GAAA,CAAA,CAAAoxB,oBAAA,GAA4C,aAAA,GAAA,IAAIrgC;sCAChD,EAAA,EAAA,CAAiBsgC,CAAAA,CAAAA,KAAAA,EAAAA,iBAAA,GAAqC;wCAEtD,IAAA,CAAQC,GAAAA,GAAAA,CAAAA,iBAAA,GAAmC;sCAC3C,IAAA,CAAiBC,qBAAA,GAAgC;sDACzCjC,IAAAA,CAAAA,GAAA,CAAA,CAAA,CAAoC,eAAA,CAAA,aAAA;sCAC5C,IAAA,CAAiBkC,MAAAA,eAAAA,CAAAA,EAAAA,CAAA,GAAoC;sCACrD,EAAA,CAAA,CAAA,CAAiBC,YAAAA,YAAA,GAAmC;oCACpD,IAAA,CAAQC,wBAAA,GAAmC;oCAC3C,CAAA,GAAA,CAAiBC,QAAAA,cAAA,GAAiC;sCAWhD,EAAA,EAAA,CAAKlkB,CAAAA,CAAAA,IAAA,CAAA,EAASA;wCACd,IAAA,CAAK3S,GAAAA,EAAA,EAAA,CAAQA;sCACb,IAAA,CAAKksB,SAAA,GAAYA;;;;;;wCAGfxK,CAAAA,IAAAA,CAAAA,EAAAA;+CAAJ,CAAA,sCAAA;4CACE,OAAO,CAAC,CAAC,IAAA,CAAK/O,MAAA,CAAOE,aAAA;;;;;;;;;;;;;;;;;kCACvB,EAAA,CAAA,MAAA,CAAA,cAAA,WAAA,CAAA;kCAIAikB,EAAAA,CAAAA,EAAAA,qBAAAA,CAAAA;;;uCAAAA,CAAAA,CAAAA,OAAAA,wBAAwBC,WAAA;;;;;;;;2CAEXnhC,IAAAA,CAAKC,GAAA,CAAI,CAAA,EAAGD,KAAKwa,IAAAA,CAAA,CAAM2mB;iDACpB,SAAA,qBAAA;kDACPtC,SAAAA,MAAA,WAAA;4CACL,IAAA;wCACF,CAAA,CAAA,KAAA,CAAA,KAAA,GAAA;wCACA,CAAA,CAAA,EAAA,CAAKuC,QAAAA,CAAAA,IAAA,GAAgBxwB,OAAOK,UAAA,CAAW;4CACrC,MAAK4tB,EAAAA,oBAAA,IAAA,CAAA,gBAAA;wCACP,GAAG3C,iBAAAA;oCACL,IAAA,CAAA,KAAA,EAAA;;;oCAEAmF,KAAAA,WAAAA,MAAAA;2CAAAA,CAAAA,QAAAA,WAAAA,GAAAA;wCACE,IAAI,IAAA,CAAKD,WAAAA,CAAAA,CAAA,IAAiB,MAAM;4CAC9BryB,SAAAA,CAAAA,GAAa,GAAA,CAAA,CAAKqyB,aAAa;8CAC/B,IAAA,CAAKA,CAAAA,CAAAA,MAAAA,GAAAA,EAAA,GAAgB,KAAA;wCACvB;oCACF,CAAA,IAAA,CAAA,WAAA,CAAA,aAAA,EAAA;;;;;oCAEQvC,GAAAA,iBAAAA,IAAAA;;;oCAAAA;2CAAAA,CAAAA,QAAAA,KAAAA;wCACN,CAAA,GAAA,CAAKuC,EAAAA,CAAAA,UAAA,GAAgB,KAAA,OAAA,IAAA,QAAA,IAAA,CAAA,MAAA,CAAA,wBAAA,MAAA,MAAA;0CACrB,IAAA,CAAK9K,CAAAA,QAAA,CAAUgL,kBAAA,EAAA;oCACjB;;;;;;;;gCAIAxC,YAAAA,IAAAA,CAAAA,IAAAA,CAAAA,WAAAA;;;yCAAAA,MAAAA,CAAAA,EAAAA,kBACEyC,EAAAA,KAAA;;;;;;;0CACArU,IAAAA,MAAAA,IAAAA,CAAAA,4DAAuB;;;;4CAAEloB,MAAM,SAAQ,GACvCw8B,CAAAA,MAAAA,CAAAA,UAAAA;wCAEA,IAAA,CAAKC;oCAAAA,SAAAA,EAAA;oCAAA,WAAA,aAAA,GAAA,IAAA,OAAA,WAAA;gCAAA,SACL,IAAMvF,KAAKl8B,KAAKC,CAAAA,EAAA,CAAI,GAAGD,EACvB,GAD4Bwa,CACxB0hB,IADwB,CAAMqF,EACvB,GAAG,UACZ,IAAA,CAAKjL,SAAA,CAAUoL,mBAAA,CAAoBxU,QAAQsU;4CAC3C,EAAA,EAAA;0CACF,EAAA,GAAA,CAAA;wCACA,IAAA,CAAKG,cAAA,GAAiB/wB,OAAOK,UAAA,CAAW;6CACtC,IAAA,CAAA,CAAKqlB,SAAA,CAAUoL,aAAAA,CAAAA,KAAA,CAAoBxU,QAAQsU;;;;sCAC7C,GAAGtF,EAAAA,CAAAA,yBAAAA,CAAAA;kCACL,EAAA,CAAA,oBAAA;;;;;;;;kCAEAuF,KAAAA;;;;wCACE,GAAA,CAAI,IAAA,CAAKE,cAAA,GAAA,CAAkB,MAAM;4CAC/B5yB,aAAa,GAAA,CAAA,CAAK4yB,cAAc;4CAChC,IAAA,CAAKA,IAAAA,CAAAA,MAAAA,EAAAA,CAAA,GAAiB,KAAA;0CACxB,UAAA,CAAA,gBAAA,CAAA;oCACF;;;;;;;;oCAAA,IAAA,CAAA,MAAA,CAAA,QAAA,iBAAA,IAAA,QAAA,IAAA,CAAA,MAAA,CAAA,wBAAA,MAAA,MAAA;sCAIAC,EAAAA,CAAAA,EAAAA,IAAAA,CAAAA,6BAAAA;2CAAAA,SAAAA,eAAeC,gBAAA;kCACb,IAAM3C,MAAAA,MAAA,AAAY,CAAA,IAAA,CAAK90B,GAAAA,EAAA,CAAMa,CAAAA,UAAA,GAAc42B,gBAAA,IAAoB;wCAC/D,EAAA,GAAI,CAAC73B,OAAOC,CAAAA,OAAA,CAASi1B,aAAal/B,KAAKmE,GAAA,CAAI+6B,YAAY,KAAO;;;;;;;;;sCAGhE,EAAA,CAAA,KAAA,EAAA;;;uCAEAF,KAAAA;;;;oDAAAA,IAAAA,CAAAA,WAAAA,CAAAA,UAAiC9R,IAAAA,EAAA;4DAC/B,IAAM4U,iBAAiB1/B,KAAKC,GAAA;;;;sCAC5B,EAAA,CAAA,CAAI,IAAA,EAAA,CAAO6qB,OAAOiB,UAAA,KAAe,UAAU;4CACzC,GAAA,CAAA,GAAO2T;sCACT;;;;;;;;;sCAGA,GAAMC,CAAAA,CAAAA,MAAAA,CAAAA,eAAwBjF,QAAQ,CAAA,CAAA,EAAA,CAAKiC,aAAA,EAAA,YAAA,GAA3C;;;;kCACA,EAAA,CAAA,CAAMiD,KAAAA,CAAAA,IAAU9U,OAAOiB,UAAA,GAAa,CAAA,CAAA,IAAO4T,cAAAA,YAAAA;kCAC3C,EAAA,CAAA,CAAI,CAAC/3B,OAAOC,QAAA,CAAS+3B,KAAAA,CAAAA,IAAU;;;oCAC7B,IAAA,CAAA,EAAOF,6BAAAA;;;;kCACT;;;;gCAGF,IAAA,CAAA,uBAAA,CAAA,kBAAA,YAAA;;;gCAAA,IAAA,CAAA,IAAA,CAAA,WAAA,CAAA,MAAA,EAAA;oCAIAG,GAAAA,CAAAA,CAAAA,WAAAA,CAAAA,MAAAA,GAAAA;yCAAAA,SAAAA,EAAAA,CAAAA,eAAAA,CAAAA,QAA2B7E,UAAA;oCACzB,IAAA,CAAK8E,yBAAA,GAA4B9E;gCACjC,KACEA,IAAAA,CAAAA,IAAAA,CAAAA,CAAc,QACd,EAAA,EAAA,CAAK+E,8BAAA,IAAkC,MACvC;;;sCACA,CAAA,GAAA,CAAKC,yBAAA,GACH,IAAA,CAAKD,8BAAA,GAAiC/E;;;;oCAC1C,CAAA,MAAO,CAAA,aAAA;wCACL,CAAA,GAAA,CAAKgF,EAAAA,CAAAA,sBAAA,GAA4B,IAAA,CAAA,OAAA,IAAA,CAAA,MAAA,CAAA,wBAAA,MAAA,MAAA;sCACnC,EAAA,CAAA,MAAA,CAAA,6BAAA;gCACF;;;gCAEAC,KAAAA;;;;gCAAAA,SAAAA;oCACE,IAAI,CAAA,GAAA,CAAKH,CAAAA,EAAAA,sBAAA,IAA6B,MAAM;0CAC1C,EAAA,IAAA,CAAA,sDAAA;oCACF;;;;;;;wCAEF,CAAA,MAAA,CAAA,kBAAA,EAAA,CAAA,GAAA,CAAA,YAAA,KAAA,GAAA;wCAIAI,IAAAA,CAAAA,KAAAA,EAAAA;iDAAAA,EAAAA,CAAAA,MAAAA;4CACE,IAAMC,iBAAiB,IAAA,CAAKC,wBAAA;0CAC5B,IAAID,kBAAkB,MAAM;gDAC1B,OAAOviC,KAAKC,EAAAA,CAAA,CAAI,EAAA,CAAGsiC,iBAAiBngC,KAAKC,GAAA;4CAC3C,CAAA,KAAA,EAAA;8CACA,EAAA,GAAA,CAAA,CAAO;wCACT;;;sCAEAmgC,KAAAA,iBAAAA,CAAAA;;;2CAAAA,SAAAA,oBAAAA;;;;;;;;;;;;;;kCAEI,OAAO,IAAA,CAAKJ,yBAAA;;;;oBAOd;iCANA,oDAAA;0BACA,IACE,IAAA,CAAKF,oBAAAA,KAAA,IAA6B,QAClC,IAAA,CAAKC,8BAAA,IAAkC,MACvC;8BACA,OAAO,KAAA,oCAAA;uCACT,WAAA,EAAA,eAAA,EAAA,YAAA,EAAA,aAAA;;gCACA,OAAO,IAAA,CAAKA,AAUdM,KAAAA,aAQAC,YAlBc,GAAiC,IAAA,CAAKR,KAkBpDQ,KAAAA,QAgCE,OAlDkD;;;;wCACpD,CAAA,cAAA,IAAA,IAAA,CAAA,cAAA,CAAA,QAAA,CAAA,MAAA,GAAA,GAAA;;;wCAEAC,KAAAA;iDAAAA,CAAAA,IAAAA,CAAAA,GAAAA,eAAAA,CAAAA,aAAAA;4CACE,IAAI,IAAA,CAAKT,yBAAA,IAA6B,MAAM;gDAC1C,OAAO;;;2CACT;;4CACA,OAAOliC,KAAKC,GAAA,CAAI,GAAG,IAAA,CAAKiiC,yBAAA,GAA4B,IAAA,CAAKxC,uBAAuB;wCAClF,qBAAA,GAAA;;;+CAEA+C,EAAAA,IAAAA,CAAAA,MAAAA,CAAAA,qBAAAA;+CAAAA,SAAAA,QAAAA,GAAAA,WAAsBG,YAAA;gDACAA,kBAAAA,CAAAA;;;;;;;;;;;wCACpB,CAAA,GAAInG,GAAAA,CAAAA,WAAe,QAAQA,GAAAA,YAAe,GAAG;;;;8CAC3C,OAAO,QAAA,GAAA,KAAA,GAAA;;;wCACT,KAAA,UAAA,CAAA;;;;0CACA,CAAA,CAAA,KAAOz8B,KAAK+oB,KAAA,CAAM0T,MAAAA,QAAc;sCAClC,EAAA,CAAA,MAAA,CAAA,oBAAA,KAAA,cAAA;;;;;;oDAEAiG,0BAAAA,SAAAA,aAAAA,cAAAA,8CAAAA,6BAAAA,gDAAAA;6CAAAA,EAAAA,GAAAA,IAAAA,sBAAsBtF,UAAA;;;yCACpB,IAAIA,cAAc,GAAG;;8CACnB,OAAO;0CACT,IAAA,EAAA;4CACA,GAAA,GACF,CADSA,UACT,IADuB,AACvB,IADuB,CAAKuF,4BAAA,mDAC5B,gCAAA,OAAA,UAAA;;sCAEAE,KAAAA,qBAAAA,KAAAA,CAAAA,GAAAA,OAAAA,eACEC,QAAA,EACA1F,UAAA,EACAwF,YAAA;;;;+CAMaA,SAAAA,UAJb,IAAI,CAAC,IAAA,CAAK9W,KAAA,EAAO,OACf;0CACF,CAAA,CAAA,oBAAA,CAAA;;;wCACA,IAAMiX,CAAAA,IAAAA,aAAkB,IAAA,CAAKJ,4BAAA;;;;0CAC7B,CAAA,CAAA,EAAMr7B,WAAAA,KAAOs7B,8BAAAA,aAAaxyB,aAAA,cAAbwyB,kDAAAA,iCAAAA,oDAAkC;0CAC/C,IAAIE,CAAAA,CAAAA,QAAU,iBAAA,IAAA,QAAA,IAAA,CAAA,MAAA,CAAA,wBAAA,MAAA,MAAA;gDACZ5gC,QAAQc,GAAA,CACN,iBAAA,eAAkDo6B,OAAlB91B,MAAI,eAA2DtH,OAA7Co9B,YAAU,oCAA4E,OAAzCp9B,KAAKC,GAAA,CAAI,GAAG8iC,kBAAkB3F,aAAW;0CAE5I,OAAO;8CACLl7B,MAAAA,CAAAA,CAAQc,GAAA,CACN,UAAA,IAAA,kBAAkDo6B,OAAlB91B,MAAI,eAAuDy7B,OAAzC3F,YAAU,gCAA8C,OAAf2F,iBAAe;0CAE9G,CAAA,CAAA,mBAAA,GAAA;sCACF,WAAA,GAAA;;;wCAEAC,CAAAA,IAAAA,CAAAA,WAAAA,CAAAA,MAAAA,EAAAA;iDAAAA,OAAAA,CAAAA,CAAAA,eAAAA,CAAAA,OAAuBJ,YAAA;4CACrB,IAAMxF,aAAa,IAAA,CAAKqF,qBAAA,CAAsBG;0CAC9C,IAAIxF,cAAc,GAAG;;;2CACnB;;;;0CAEF,CAAA,CAAA,EAAA,CAAKsC,mBAAAA,IAAA,IAA2BtC;0CAChC,CAAA,CAAA,EAAI,IAAA,CAAKtR,KAAA,EAAO,MAAA;kDAE+E,kBAAA,KAAA,cAAA;gDAD7F5pB,QAAQc,GAAA,Cd/Od,AcgPQ,QAAA,GAAA,aAAuD,OAA/Bo6B,YAAU,6BAAqB,IAAA,CAAKsC,uBAAuB,EAAA,SAA6C,QAArC,kCAAA,IAAA,CAAKwC,yBAAA,cAAL,6CAAA,kCAAkC,KAAG;0CAEpI;sCACF,EAAA,CAAA,KAAA,EAAA;;;sCAEAe,EAAAA,CAAAA,EAAAA,IAAAA,CAAAA,kBAAAA,CAAAA,QAAAA;+CAAAA,CAAAA,QAAAA,YAAAA,CAAAA,GAAAA,CAAAA,QAAyBL,KAAAA,GAAAA,IAAA;0CACvB,IAAMxF,aAAa,IAAA,CAAKqF,qBAAA,CAAsBG;0CAC9C,IAAMM,OAAO,IAAA,CAAKR,GAAAA,GAAAA,eAAA,CAAsBtF;0CACxC,IAAA,CAAKyF,UAAAA,WAAA,CAAsBK,MAAM9F,YAAYwF;;;uCAC7C,OAAOM;;;;;;;;;;;;;;sBAGTC,KAAAA,IAAAA,IAAAA,CAAAA,IAAAA,CAAAA,WAAAA;6BAAAA,QAAAA,CAAAA,QAAAA,kBAA0BP,GAAAA,SAAA;0BACxB,IAAI,QAAA,SAAA,iBAAA;gCACFA,aAAa12B,OAAA;4BACf,EAAA,CAAA,CAAA,KAAA,GAAA,KAAQ,CAAC;wBACX,CAAA,CAAA,WAAA,CAAA;;;wBAEAk3B,KAAAA,OAAAA,MAAAA;6BAAAA,SAAAA;;;0BACE,IAAA,CAAKtD,cAAA,iCAAA;0BACL,IAAA,CAAKC,IAAAA,WAAA,GAAkB,IAAA,CAAKD,cAAA;0BAC5B,IAAA,CAAKE,sBAAA,yBAAA;;0CACL,IAAA,CAAKE,KAAAA,WAAAA,CAAA,GAAoB99B,KAAKC,GAAA;wBAChC,CAAA,CAAA,wBAAA,EAAA;;;wBAEAghC,CAAAA,IAAAA,sBAAAA,EAAAA;iCAAAA,CAAAA,EAAAA,MAAAA;gCACE,GAAA,CAAA,CAAKvD,cAAA;8BACL,IAAA,CAAKC,eAAA,GAAkB,IAAA,CAAKD,cAAA;0BAC9B;;;0BAEAwD,EAAAA,GAAAA,CAAAA;+BAAAA,SAAAA;4BACE,IAAMC,eAAAA,GAAAA,GAAqB,IAAA,CAAKjB,yBAAA;4BAChC,IAAMkB,QAAAA,CAAAA,SAAkB,IAAA,CAAKb,4BAAA;0BAC7B,IAAI,IAAA,CAAKT,yBAAA,IAA6B,MAAM;;;6BAC1C,OAAOqB;gDAAAA,WAAAA;;;;;;;;;;;gDAGX,YAAA,KAAA,GAAA;6DAEAE,IAAAA,MAAAA,MAAAA,CAAAA,0BAAAA,IAAAA;4DACE,EAAA,GAAMC,EAAAA,EAAAA,SAAa,IAAA,CAAK3mB,MAAA,CAAO4mB,uBAAA;8DAC/B,EAAA,EAAI,CAAA,CAAA,IAAOD,eAAe,YAAYA,cAAc,GAAG,UAAA,OAAA,MAAA,MAAA,CAAA,yBAAA,IAAA,eAAA,OAAA,MAAA,MAAA,CAAA,4BAAA,IAAA;gEACrD,OAAOA;;;gEACT;;0DACA,OAAO,IAAA,CAAKlD,8BAAA;sDACd,IAAA,MAAA,CAAA,eAAA,IAAA;;;wDAEAoD,KAAAA;;;mEAAAA,SAAAA;;0DACE,IAAMC,eAAe,IAAA,CAAKJ,0BAAA;2DAC1B,KAAA,CAAA,CACE,IAAA,CAAKnB,aAAAA,IAAAA,MAAAA,GAAA,GAAA,CAAA,CAA8BuB,gBACnC,IAAA,CAAKlB,EAAAA,0BAAA,KAAiCkB;wDAE1C,MAAA,KAAA,EAAA;;;wDAAA,0BAAA;;;;sDAIAC,KAAAA;8DAAAA,EAAAA,CAAAA,MAAAA,gBAAAA,GAAmB7hC,CAAAA,IAAA,EAAA,MAAA,CAAA,0BAAA,EAAA;iEACDA,EAAAA,EAAAA;8DAAhB,EAAA,EAAM4T,CAAAA,CAAAA,OAAU5T,CAAAA,kBAAAA,yBAAO,OAAPA,MAAAA,MAAAA,CAAAA,UAAAA,MAAO4T,OAAA,GAAA,EAAA,UAAP5T,qCAAAA,eAAgBgD,WAAA,OAAiB;4DAEjD,IAAI4Q,QAAQ/S,QAAA,CAAS,uBAAuB+S,QAAQ/S,QAAA,CAAS,cAAc+S,QAAQ/S,QAAA,CAAS,WAAW;;;oEACrG,OAAO;;0DACT;oDACA,IAAI+S,OAAAA,CAAQ/S,QAAA,CAAS,YAAY;iEAC/B,OAAO,EAAA,CAAA,MAAA,IAAA,YAAA;;;;wDACT,EAAA,KAAA,EAAA;0DACA,EAAA,EAAI+S,CAAAA,CAAAA,KAAQ/S,QAAA,CAAS,iBAAiB+S,OAAiB,OAAjBA,EAAQ/S,IAAAA,KAAA,CAAS,QAAA,CAAA,MAAA,EAAA,MAAsB;4DAC3E,OAAO;;;sDACT,EAAA,QAAA,SAAA;+DAAA,WAAA,SAAA;;;;;;;4DACA,IAAI+S,QAAQ/S,QAAA,CAAS,sBAAsB;;;oDAE3C,OAAA,MAAA,IAAA,CAAA,gBAAA,CAAA,aAAA,EAAA,CAAA,EAAA;4DACA,OAAO,MAAA,MAAA,CAAA,cAAA,CAAA,GAAA,CAAA,aAAA,MAAA,MAAA,CAAA,eAAA,CAAA,SAAA;;;;oDACT;;oDAAA,IAAA,QAAA,SAAA;+DAAA,WAAA,SAAA;;;;;;;;;;sDAEAihC,IAAAA,EAAAA,GAAAA,EAAAA;yDAAAA,SAAAA,MAAAA,qBAAAA,MAAAA,CAAgBr7B,UAAA,GAAA;wDAAA;;4DACd,GAAA,CAAMs7B,KACN,IAAIA,KADgB,IAAA,CAAKtD,KACN,MAAM,SADA,CAAqBviC,GAAA,CAAIuK,OACzB,OAAA,kBAAA,MAAA,EAAA;gEACvB,IAAA,GAAO;oDAAA;0DAGT,IAAM8jB,UAAUpqB,KAAKC,GAAA,KAAQ2hC;2DAC7B,IAAIxX,KAAAA,CAAAA,IAAAA,CAAW,IAAA,CAAKmU,0BAAA,EAA4B;wDAC9C,IAAA,CAAKD,KAAAA,MAAAA,MAAAA,CAAAA,GAAA,CAAqBpyB,MAAA,CAAO5F,QAAAA,GAAAA,IAAAA,KAAAA,GAAAA,CAAAA,MAAAA,KAAAA,GAAAA,CAAAA,GAAAA,MAAAA,MAAAA,CAAAA,mBAAAA,GAAAA,OAAAA;;;4DACjC,IAAA,SAAA,EAAO;+DAAA,WAAA,SAAA;;;;;;;;;;4CACT;sCAlDA,EAAA,IAAA,CAAA,MAAA,CAAA,YAAA;;;2CACA,OAAO1I,KAAKE,GAAA,CAAIqjC,QAAAA,IAAAA,IAAAA,CAAAA,GAAoBC,MAAAA,IAAAA,UAAAA,IAAAA,CAAAA,MAAAA,CAAAA,YAAAA;;;;;;;;;;;;;;;;;;;;4CAmDpC,OAAO,YAAA,GAAA;wCACT,CAAA,KAAA,EAAA;sJAEAS,CAAAA,IAAAA,UAAAA,CAAAA,MAAAA,GAAAA,IAAAA;wCAAAA,YAAAA,qBAAAA,IAAAA,CAAAA,cAAAA;oCAAAA,IAAAA,CAAAA;4CACE,IAAM5hC,MAAMD,KAAKC,GAAA;;;;;;kCACjB,kCAAA,2BAAA;;;;;;gCAAA,QAAA,KAAA,GAAA,IAA+B,IAAA,CAAKq+B,oBAAA,qBAApC,SAAA,6BAAA,QAAA,yBAAA,iCAA0D;oCAA1D,WAAA,GAAA,qBAAA,iBAAY79B,sBAAK4d;oCACf,CAAA,GAAIpe,MAAMoe,aAAa,IAAA,CAAKkgB,0BAAA,EAA4B;wCACtD,IAAA,CAAKD,oBAAA,CAAqBpyB,MAAA,CAAOzL;sCACnC;gCACF;;;;;qCAJA,gDAAA;8BAAA;;;;oDAOFqhC,KAAAA,gBAAAA,SAAAA,UACE,OAAO9hC,KAAKC,GAAA;;;;yDARZ,6BAAA;0DAAA;;;;;wDAAA,WAAA,IAAA,IAAA,CAAA,MAAA,CAAA,sBAAA,EAAA;gEAAA;;;;0CAKF;;;;;+CAEA6hC,KAAAA,GAAAA,CAAAA,IAAAA,CAAAA,MAAAA,CAAAA,aAAAA,GAAAA,mBAAAA,IAAAA,CAAAA,MAAAA,CAAAA,YAAAA;uDAAAA,IAAAA,CAAAA,MAAAA,CAAAA,sBAAAA,GAAAA,CAAAA,IAAAA,CAAAA,MAAAA,CAAAA,mBAAAA,GAAAA,IAAAA,eAAAA,CAAAA;uDACc,GAAQ,EAAA,EAAA,CAAKtF,KAAAA,IAAAA,CAAAA,MAAAA,CAAAA,QAAA,SAAA;0CAC3B,mBAAA,oBAAA;;;;;;wCAEAuF,IAAAA,CAAAA,EAAAA,CAAAA,6CAAAA,OAAAA,UAAAA,qCAAAA,OAAAA,IAAAA,CAAAA,MAAAA,CAAAA,mBAAAA,EAAAA;6CAAAA,SAAAA;;;wCACE,IAAA,CAAKvD,GAAAA,SAAAA;+CAAAA,QAAA,GAAA,SAAA;;;;;;;gDAGH,GAAA,CAAMwD,GAAAA,QAAW,EAAA,EAAA,CAAKxD,CAAAA,CAAAA,MAAAA,CAAAA,YAAAA,EAAAA,CAAA,GAA2B,IAAA,CAAKC,qBAAA;kDACtD,IAAMwD,UAAUrkC,KAAKE,GAAA,CACnB,IAAA,CAAK4gC,yBAAA,GAA4B9gC,KAAKskC,GAAA,CAAI,GAAGF,WAC7C,IAAA,CAAKrD,wBAAA;;;gDAEP,IAAA,CAAKnC,yBAAA,GAA4Bx8B,KAAKC,GAAA,KAAQgiC;;;6CAE9C,IAAI,IAAA,CAAKvY,KAAA,CAAA,CAAO;;;;sCACd5pB,QAAQc,GAAA,CACN,6CAA2D,OAAdqhC,SAAO,QAAoC,OAA7B,IAAA,CAAKzD,wBAAwB,EAAA;;;;;wCAE5F;oBAAA,aAAA,iEAAA;;sDA6BJ2D,SAAAA,EAMI,QAcsDza,KAAU,MAAVA,EApBnC0a,KAAA,SAgCnB;;;;4CA5DF,OAAA,EAAA;0CACF;;;;;wCAEAC,CAAAA,CAAAA,GAAAA,GAAAA,CAAAA,uBAAAA,IAAAA;iDAAAA,CAAAA,EAAAA,MAAAA;gDACE,GAAA,CAAI,GAAA,CAAK7D,wBAAA,GAA2B,KAAK,IAAA,CAAK9U,KAAA,GAAO,OAAA,WAAA;kDACnD5pB,QAAQc,GAAA,CACN,oDAAiF,OAA7B,IAAA,CAAK49B,wBAAwB,EAAA;8CAErF,cAAA;8CACA,IAAA,CAAKA,wBAAA,GAA2B;;;4CAChC,IAAA,CAAKhC,yBAAA,GAA4B;wCACnC,CAAA,MAAA,CAAA,eAAA,IAAA;;;0CAEM8F,KAAAA;iDAAN,SAAMA,EAAAA;;;;oDACEriC,KACAmqB,SAEEmY;;;;8DAHFtiC,MAAMD,KAAKC,GAAA;8DACXmqB,UAAUnqB,MAAM,IAAA,CAAK2+B,wBAAA;mEACvBxU,CAAAA,UAAU,IAAA,CAAKyU,sBAAA,GAAfzU;;;;;;wEACImY,SAAS,IAAA,CAAK1D,sBAAA,GAAyBzU;;;;0DAC7C,IAAI,IAAA,CAAKV,KAAA,EAAO;gEACd5pB,QAAQc,GAAA,CAAI,wBAA8B,OAAN2hC,QAAM;0DAC5C;0DACA;;+CAAM,IAAIx2B,IAAAA,IAAQ,GAAA;oCAAA,IAAAM,OAAAA,aAAAA,GAAAA,IAAAA,OAAAA,WAAAA;gCAAAA,0CAAWwC,WAAWxC,SAASk2B;;;;;;;;;yDAAjD,iBAAA,CAAA,UAAA,YAAA;;;;;;;;;;;sDAEF,IAAA,CAAK3D,wBAAA,GAA2B5+B,KAAKC,GAAA;;;;;;;;;;;;;wCACvC,CAAA,MAAA,CAAA,yBAAA,IAAA,QAAA,IAAA,CAAA,MAAA,CAAA,wBAAA,MAAA,MAAA;;;;oCAAA,CAAA,MAAA,CAAA,WAAA,QAAA,GAAA;oCAIAkiC,KAAAA;;;;;;8CAGoB,EAAA,CAAA,mDAAA;wCAFlB,IAAA,CAAKK,sBAAA;;;;;;2CAIL,IAAA,CAAKC,SAAAA,CAAAA,MAAAA,IAAA,GAAsBj0B,OAAOK,UAAA,CAAW;;;;4CACvC,IAAA,CAAA,CAAKuuB,aAAAA,CAAAA,KAAAA,GAAA,KAA2BgF,OAAO;kDACzC;;;;8CACF,CAAA,CAAA,cAAA,CAAA,GAAA,CAAA,YAAA;gDAEA,EAAA,EAAA,EAAKK,MAAAA,GAAAA,CAAAA,SAAA,GAAsB,KAAA;gDAC3B,MAAKrF,sBAAA,GAAyB;;;;8CAC9B,IAAI,MAAKK,oBAAA,KAAyB2E,OAAO;kDACvC,MAAK3E,OAAAA,CAAAA,YAAA,GAAuB;gDAC9B,EAAA,EAAA,QAAA,GAAA,CAAA;gDAEA,MAAKiF,UAAA,CAAW,sBAAsB;;;;kDAAEN,OAAAA;kDAAO1a,WAAAA;gDAAU,4DAAA,OAAA,IAAA,CAAA,MAAA,CAAA,cAAA,GAAA,GAAA,MAAA,OAAA,IAAA,CAAA,cAAA,CAAA,MAAA,EAAA;8CACzD,MAAKwM,SAAA,CAAUyO,iBAAA;;;;;;;;;;;sCAGjB,EAAA,CAAA,CAAA,CAAKD,UAAA,CAAW,+BAA+B;;;;4CAAEN,OAAAA,YAAAA,GAAAA;;;;;;;+CAAiB,OAAA,OAAA;oCACpE,IAAA,CAAA,KAAA,EAAA,QAAA,GAAA,CAAA,yCAAA;;;;;;;;;;;kCAEAI,KAAAA;;;;wCACE,IAAI,IAAA,CAAKC,CAAAA,QAAAA,CAAAA,SAAA,IAAuB,MAAM,MAAA,CAAA,aAAA,QAAA,CAAA,gBAAA;8CACpC91B,CAAAA,CAAAA,WAAa,IAAA,CAAK81B,GAAAA,gBAAmB;4CACrC,IAAA,CAAKA,mBAAA,GAAsB,KAAA;;;sCAC7B,EAAA,CAAA,+BAAA;;;;;;;;;8CAGE,IAAA,CAAKC,UAAA,CAAW,+BAA+B;;;;6CAE/C;kDACA,IAAA,CAAKtF,YAAAA,IAAAA,MAAA,GAAyB,IAAA,cAAA,YAAA,GAAA;;;;0CAChC,IAAA,EAAA;wCACF,IAAA,GAAA,CAAA,wDAAA,OAAA,aAAA,GAAA,KAAA,OAAA,YAAA;;;;;;;;;;;;oCAAA,IAAA,CAAA,cAAA,IAAA,CAAA,aAAA;;;;sCAIAwF,KAAAA;;;;;kDAGqB,mBAAA;4CAFnB,IAAA,CAAKC,oBAAA;8CAEL,IAAMC,EAAAA,QAAAA,GAAAA,CAAa,mCAAA,IAAA,CAAKnoB,MAAA,CAAOooB,mBAAA,cAAZ,8CAAA,mCAAmC;8CACtD,IAAA,CAAK1F,SAAAA,MAAA,GAAkB+E;4CAEvB,IAAA,CAAKY,iBAAA,GAAoBx0B,OAAOK,UAAA,CAAW;;;;;;kCACzC,IAAI,MAAKwuB,eAAA,KAAoB+E,OAAO;;;;;yCAClC,4CAAA;8BACF,IAAA;8BAEA,MAAKY,iBAAA,GAAoB,KAAA,iBAAA;iCACzB,CAAA,KAAK3F,KAAAA,UAAA,GAAkB;;wCAmBzB,IAAI,IAAA,IAIJ,aAyBA,IAAA,CAAKgC,YAWL,EAAA,CAAKb,GAML,CAAA,CAAKa,iBAAA,iBCvdH4D,KAAAA,eAUJ,UAKEC,uBAAAA,iEAAgC;;;;0CDyY9B,CAAA,GAAI,CAAA,CAAA,IAAKzF,CAAAA,WAAAA,QAAA,KAAyB2E,OAAO;oDACvC,IAAA,EAAK3E,EAAAA,kBAAA,GAAuB;;;gDAC9B,cAAA,CAAA,GAAA,CAAA,aAAA;kDAEA,EAAA,IAAKiF,IAAAA,IAAAA,CAAAA,CAAA,CAAW,yBAAyB,yBAAA;sDACvCN,OAAAA;oDACAU,YAAAA;oDACAK,WAAAA,CAAAA,CAAa,MAAKn7B,KAAA,CAAMkD,MAAA;kDAC1B,EAAA,QAAA,IAAA,CAAA,yDAAA;kDAEA,EAAA,IAAKgpB,SAAA,CAAUkP,iBAAA;4CACjB,GAAGN;4CAEH,GAAA,CAAA,CAAKJ,UAAA,CAAW,OAAA,IAAA,IAAA,CAAA,MAAA,CAAuB,sBAAA,EAAA;kDAAEN,EAAAA,KAAAA,GAAAA,IAAAA,CAAAA;kDAAOU,EAAAA,UAAAA;4CAAW;wCAC7D,CAAA,MAAA,CAAA,eAAA,IAAA;;;wCAEAD,KAAAA;+CAAAA,SAAAA,CAAAA;+CACWG,EAAAA,IAAAA,CAAAA,MAAAA,CAAAA,GAAA,IAAqB,MAAM,QAAA;gDAClCr2B,aAAa,GAAA,CAAA,CAAKq2B,CAAAA,gBAAiB;gDACnC,IAAA,CAAKN,UAAA,CAAW,EAAA,CAAA,oBAAuB;;;;;;;;;;;4CAA8B,GAAA,CAAA,sBAAA;;;;8CACrE,IAAA,CAAKM,UAAAA,GAAAA,IAAA,CAAA,EAAoB,CAAA,IAAA;qCAC3B,IAAA,CAAA,IAAA,CAAA,WAAA;;;wCAEA,IAAA,CAAK3F,IAAAA,CAAAA,UAAA,GAAkB;;;;sCACzB;;;;uCAEAqF,CAAAA,IAAAA,YAAAA,aAAAA,SAAAA,WAAWrjC,CAAegkC,IAAf,IAAeA,iEAAiC,CAAC,GAAG/H,yDAAyB3F,0DAAqB2N;;0CAC3G,IAAI,CAAC,CAAA,GAAA,CAAK5Z,KAAA,EAAO,SAAA,KAAA,cAAA;;;8CACf,EAAA,CAAA,wBAAA,CAAA,KAAA;4CACF,GAAA,CAAA,yBAAA,CAAA;4CAEA5pB,QAAQc,GAAA,CAAI,KAAA,+BAAoC;gDAC9CvB,IAAAA,GAAAA;8CACAgf,WAAA,AAAW,aAAA,GAAA,IAAIre,OAAOuf,WAAA;;;;;;;;;4CAEtB9hB,SAAA,UAAW69B,CAAAA,CAAAA,mBAAAA,+BAAAA,SAAUvuB,WAAA,yCAAiB;;;0CACtC4oB,CAAAA,QAAA,EAAWA,sBAAAA,uBAAAA,YAAa;;;;4CACxB8H,aAAAA,SAAsB,IAAA,CAAKA,oBAAA;2CACxB4F,IAAAA,CAAAA,yBAAAA,IAAAA,QAAAA,IAAAA,CAAAA,MAAAA,CAAAA,wBAAAA,MAAAA,MAAAA;sCAEP,EAAA,CAAA,MAAA,CAAA,6BAAA;;;oCAAA,CAAA,MAAA,CAAA,mBAAA,GAAA,GAAA;oCAIAE,CAAAA,IAAAA,EAAAA,CAAAA,oBAAAA,CAAAA,MAAAA,CAAAA;;;;;;oCAAAA,SAAAA;wCACE,CAAA,GAAA,CAAKtE,CAAAA,EAAAA,QAAAA,KAAA,CAAA,iCAAA;oDACAI,IAAA,CAAA,WAAA,CAAA,cAAA;4DACL,IAAA,CAAKmD,sBAAA;;;;sCACL,EAAA,CAAA,CAAA,CAAKK,GAAAA,EAAAA,QAAAA,GAAAA,CAAAA,GAAA;;;;;;;;;oCAEL,CAAA,GAAA,CAAK/C,CAAAA,MAAAA,CAAAA,iBAAA,GAA4B,IAAA,CAAA,kBAAA,YAAA,GAAA;sCACjC,EAAA,CAAA,CAAA,CAAKC,IAAAA,CAAAA,yBAAA,CAAA,EAAiC,KAAA,WAAA,YAAA;sCACtC,IAAA,CAAKC,yBAAA,GAA4B,KAAA;oCACjC,IAAA,CAAK1C,uBAAA,GAA0B;oCAC/B,CAAA,GAAA,CAAKI,EAAAA,CAAAA,WAAA,GAAiB,MAAA;oCACtB,CAAA,GAAA,CAAKC,eAAA,GAAkB,CAAA,CAAA,kBAAA,YAAA;oCACvB,CAAA,GAAA,CAAKI,EAAAA,CAAAA,gBAAA,GAAsB,GAAA;gCAC3B,OAAKS,IAAAA,CAAAA,IAAAA,CAAAA,UAAA,CAAA,EAA2B;;;oCAChC,EAAA,CAAKjB,EAAAA,IAAAA,MAAA;;;oCAAL;gCACF,IAAA,CAAA,MAAA,CAAA,aAAA;;;gCAEAzzB,KAAAA;uCAAAA,SAAAA,CAAAA,iBAAAA;oCACE,IAAA,CAAKm1B,gBAAA;;;;gCACL;oCACA,IAAA,CAAK4D,KAAAA,EAAAA,QAAAA,IAAAA,CAAA,8CAAA;;;;;;;;;;oCdgtHT,IAAA,CAAA,MAAA,CAAA,QAA8B,MAAA,CAAA,GAAA,CAAA;oCe3rIjBW,IAAAA,IAAAA,CAAAA,KAAAA,EAAAA,QAAN,GAAA,CAAA;qCAAMA,cAeCC,IAAA;wDAfDD,QAAAA;gCACX,IAAA,CAAQE,GAAAA,CAAA,GAOH,EAAC,CAAA,CAAA,oBAAA,KAAA,cAAA;oCACN,EAAA,CAAiBC,CAAAA,CAAAA,MAAAA,CAAAA,EAAA,GAAsB,eAAA,GAAA;gCACvC,IAAA,CAAQC,UAAA,GAAsB;gCAC9B,IAAA,CAAQC,CAAAA,UAAA,GAAuB;;;;;;;;;;qDAQ3BZ,IAAAA,CAAAA,WAAAA,CAAAA,cAAAA;gEAAJ;;;;wCACE,CAAA,KAAA,CAAO,CAAA,GAAA,CAAKW,IAAAA,GAAAA,CAAAA,EAAA;;;;;;;;;uCAGd,EAAA,CAAA,MAAA,CAAA,GAAWhnC,KAAA,gBAAA,CAAA,mBAAA,YAAA,GAAA;wCACT,CAAA,GAAA,CAAKgnC,EAAAA,CAAAA,OAAA,GAAahnC,eAAAA,CAAAA,mBAAAA,YAAAA;oCACpB,MAAA;;;kCAEIknC,EAAAA,CAAAA,EAAAA,IAAAA,CAAAA,oBAAAA;uCAAJ,qBAAA,CAAA,mBAAA,YAAA;sCACE,KAAA,CAAA,CAAO,IAAA,CAAKD,WAAA,EAAA,GAAA;gCACd,QAAA,IAAA,CAAA,IAAA,CAAA,WAAA;;;;;;;;kCAEAE,IAAAA,EAAAA,SAAAA,CAAAA,iBAAAA;yCAAAA,SAAAA,iBACEC,WAAA,EACAC,WAAA;;;;;sCAGA,EAAA,CAAA,CAAI,IAAA,CAAKL,CAAAA,QAAAA,CAAA,EAAY,CAAA,CAAA,8CAAA;;;;;;8CAGnB,CAAA,CAAA,kBAAA,CAAA,QAAA;gDACA,oBAAA,CAAA,GAAA,CAAA,YAAA,KAAA,GAAA;4CACF,CAAA,KAAA,EAAA,QAAA,GAAA,CAAA;0CAEA,IAAA,CAAKA,UAAA,GAAa;4CAElB,GAAA,CAAI,IAAA,CAAKH,IAAA,CAAK/Z,IAAAA,CAAA,EAAO,CAAA,CAAA;gDACnB5pB,EAAAA,EAAAA,IAAQc,GAAA,CAAI,GAAA,CAAA,iDAAA,OAA4E,OAAhB,IAAA,CAAK+iC,WAAW,EAAA;8CACxF7jC,QAAQc,GAAA,CAAI;0CACd,CAAA,CAAA,sBAAA;8CAEA,kBAAA,gBAAA,2BAAA;;gDAAA,QAAA,YAAkBqjC,GAAAA,6BAAlB,SAAA,6BAAA,QAAA,yBAAA,iCAA+B;kDAA/B,IAAWxjC,MAAX;kDACE,IAAI,IAAA,CAAKijC,IAAA,CAAKnjC,MAAA,GAAS,IAAA,CAAKojC,WAAA,EAAa;;;;;;;sCAEzC;;;;6BAHF;qCAIA,gDAAA;;8BAJA,gDAAA;;;4FAqCA,IAAI,IAAA,CAAKF,GACP3jC,CADO,CAAK4pB,KAAA,EAAO;;;;;;yDArCrB,MAAA,IAAA,mBAAA;0DAAA,EAAA,GAAA,CAAA;;;;;wDAAA;8DAAA,KAAA,IAAA,IAAA,CAAA,MAAA,CAAA,sBAAA,EAAA;;;;;;4CAMA,IAAIwZ,sBAAsB;gDACxB,IAAA,CAAKgB,eAAA,CAAgBF;8CACvB,OAAA,IAAW,GAAA,CAAA,CAAKP,IAAA,CAAK/Z,KAAA,EAAO;kDAC1B5pB,QAAQc,GAAA,CACN;;;4CAEJ;wCACF,CAAA,KAAA,EAAA;;;wCAEcujC,KAAAA,YAAAA,GAAAA;+CAAd,MAAA,GAAcA,eAAAA,GAAkBC,OAAA;;qDACxBC,CAAAA,CAAAA,MAyBAC,KAAAA,EACAC;;;;;;;;;;;;;;;;kDA1BAF,CAAAA,EAAAA,MAAS,IAAA,CAAKZ,IAAA,CAAKY,MAAA;;;kDAEzB,IAAIA,OAAOvC,MAAAA,IAAAA,IAAAA,CAAA,IAAmB,EAAA,CAAA,sBAAA,EAAA;wDAC5B,IAAI,GAAA,CAAA,CAAK2B,IAAA,CAAK/Z,KAAA,EAAO;4DACnB5pB,QAAQc,GAAA,CAAI;;;;sDACd;sDACA,kBAAA,IAAA;;;;;;kDACF;;;iDAEA,IACE,IAAA,CAAK8iC,IAAA,CAAKc,CAAAA,IAAA,CAAK,SAAA3sB;;;;2DAASA,MAAMusB,OAAA,IAAA,CAAYA;;;;gDAC1CC,CAAAA,MAAOhG,QAAAA,CAAAA,KAAA,CAAepyB,GAAA,CAAIm4B,YAC1BC,OAAO1C,eAAA,CAAgByC,UACvB;oDACA;;;;;;;;;;;;gDACF,QAAA,GAAA,CAAA;gDAEA,IAAI,IAAA,CAAKV,GAAAA,CAAA,CAAKnjC,MAAA,IAAU,IAAA,CAAKojC,WAAA,EAAa;oDACxC,CAAA,GAAA,eAAA;;;;;;;;;;;;;;;8CACF,iBAAA,GAAA;;;;;;;+CAGE7jC,KAAQc,CAAAA,EAAA,CAAI,IAAA,uCAAkD,OAAPwjC;kDACzD,QAAA,CAAA,yCAAA;;;;;;0CAEME,QAAQD,OAAO9G,YAAA,GAAA;;;;4CACfgH,cAAA,AAAe;;;;iEACfE,YACAC,OAAAA,CAAAA,QACAC,KAAAA,QAAAA,CAAAA,QAkFqBC,QAAAA,wBA/EjB35B,6BACA25B,WAGAC,eAiBEC,UA4CFC,WAcAC,gBAKAC,mBAiByIF,4BAMxIllC;;;;;;;;;;;;;;oEAhHL4kC,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;sDAKTx5B,8BAA8B,IAAA,CAAKw4B,IAAA,CAAKyB,iCAAA;;wDACxCN,YAAY,IAAA,CAAKnB,IAAA,CAAK0B,cAAA,CAAel6B;0DAC3C25B,UAAUz5B,UAAA;wDAEJ05B,gBAAgB,uBAACvlC;4DACrBmlC,aAAa;4DACbC,iBAAiBplC;wDACnB;wDACAslC,UAAUz6B,EAAA,CAAG,YAAY06B;wDACzBF,uBAAuB;qEAAMC,UAAUx3B,GAAA,CAAI,YAAYy3B;;wDAEvD;;4DAAMR,OAAO/B,sBAAA;;;wDAAb,EAAA,KAAA;wDACA;;4DAAMsC,UAAU/4B,UAAA,CAAWu4B;;sDAA3B,IAAA,GAAA,iBAAA;wDAEAQ,KAAAA,KAAUvhC,KAAA;0DAEV;;4DAAM,IAAI0I,QAAQ,MAAA,GAAAM;yEAAWwC,WAAWxC,SAAS;;;;0DAAjD,GAAA,IAAA,CAAA,IAAA,CAAA,KAAA,CAAA,WAAA,EAAA;4DAEAu4B,UAAUvhC,KAAA;8DAEV,IAAIohC,SACIK,GADQ,QACGJ,CAAAA,oBAAAA,KAAgBI,EAAhBJ,GAAAA,CAAAA,CAAAA,IAAAA,CAAAA,KAAAA,CAAAA,WAAAA,CAAAA,OAAAA,CAAAA,IAAAA,CAAAA,OACDA,OADCA,YAAgBI,CAAA,KACjBJ,CAAAA,CAAAA,IAAAA,uBAAAA,qCAAAA,eAAgBU,IAAA,MAAS,OACzBV,CAAAA,2BAAAA,qCAAAA,eAAgBW,aAAA,MAAkB;oEAGhDV;gEACF;8DACAC,UAAU96B,OAAA;8DAEVu6B,OAAOtC,eAAA;;gEAEP,IAAI+C,UAAU;2KACZ,IAAI,IAAA,CAAKrB,IAAA,CAAK/Z,KAAA,EAAO,yBACnB5pB,QAAQc,GAAA,CAAI,+CAAsD,OAAPwjC;kEAC7D;oEACAC,OAAO/F,oBAAA,CAAqB/+B,GAAA,CAAI6kC,SAASpkC,KAAKC,GAAA;8DAChD,OAAO;gEACL,IAAI,IAAA,CAAKwjC,IAAA,CAAK/Z,KAAA,EAAO;;gLACnB5pB,QAAQc,GAAA,CAAI,0BACd,sBADqE,OAAPwjC,UAAWM;gEAEzE,IAAIA,kBAAkB,CAACL,OAAO3C,kBAAA,CAAmBgD,iBAA0B;kEACzEL,OAAOhG,cAAA,CAAelxB,GAAA,CAAIi3B;;;;8EAC5B,OAAO;oEACLC,OAAO/F,oBAAA,CAAqB/+B,GAAA,CAAI6kC,SAASpkC,KAAKC,GAAA;gEAChD;0DACF,EAAA;4DACA;;yBACF,WAAA,qBAAA,IAAA,CAAA,cAAA;oBAAA,IAAA,CAAA;4DAGE,IAAI,IAAA,CAAKwjC,IAAA,CAAK/Z,KAAA,EAAO;gEACnB5pB,EAAAA,CAAAA,KAAQc,GAAA,CACN,aAAA,EAAA;6DAEJ,2CAAA,OAAA,IAAA,CAAA,MAAA,CAAA,mBAAA,EAAA;8DACA,IAAI+jC,sBAAsB;kEACxBA;4DACF;4DACA,IAAI;kEACFC,UAAU96B,OAAA;4DACZ,EAAA,eAAQ,CAAC;8DACT,qEAAA,IAAA,CAAA,MAAA,CAAA,cAAA,CAAA,IAAA;;;sDACF;;;;;gDAWE02B,cAAcoE;8DACdU,UAAUtlC,KAAKC,GAAA;qEACfslC,SAAS;;;oDACThB,aAAax4B,QAAQM,OAAA;gDACvB;gDACM24B,kBAAiBJ,iCAAAA,UAAU72B,mBAAA,cAAV62B,qDAAAA,oCAAAA;8CACvB,IAAII,kBAAkB,QAAQA,iBAAiB,GAAG;+DAChDD,UAAU/Y,eAAA,GAAkBgZ;gDAC9B;gDAEMC,oBAAoB,2BAAC3lC;oDACzB,IAAMuG,QAAQ,MAAK69B,IAAA,CAAK8B,SAAA,CAAU,SAAA3tB;+DAASA,MAAMusB,OAAA,KAAYA;;8EAC7D,IAAIv+B,SAAS,GAAG;6DACd,MAAK69B,IAAA,CAAK+B,MAAA,CAAO5/B,OAAO;0DACxB,IAAI,MAAK49B,IAAA,CAAK/Z,KAAA,EAAO;oFACnB5pB,QAAQc,GAAA,CAAI,0DAAiE,OAAPwjC,UAAW9kC;6DACnF;0DACA,IAAI;;uDACFslC,UAAU96B,OAAA;;wDACZ,EAAA,eAAQ,CAAC;oDACX,GAAA,EAAA,IAAA,CAAA,KAAA;gDACF,KAAA,EAAA,IAAA,CAAA,KAAA,EAAA;;oCACA86B,UAAUz6B,CAAAA,CAAA,CAAG,YAAY86B;;8EAEzB,IAAA,CAAKvB,IAAA,CAAKx/B,IAAA,CAAK6gC;qDAEf,IAAI,IAAA,CAAKtB,IAAA,CAAK/Z,KAAA,EAAO,aACnB5pB,IACF,IADUc,EACV,CADU,CfpNlB,AeoNsB,aACd,GAAA,MAAA,MAAA,MAAA,CAAA,yBAAA,mBADiH,OAApB,IAAA,CAAK8iC,IAAA,CAAKnjC,MAAM,EAAA,YAAI,IAAA,CAAKojC,WAAW,EAAA,eAA8C,QAAhCoB,6BAAAA,UAAU/Y,eAAA,cAAV+Y,wCAAAA,6BAA6B,KAAG;sDAI7KJ;;qCACF,eAAA;;;;;;;;;;;kDACO9kC;uBAAAA,MAAAA,iCAAAA;;kDACP,IAAI8kC,sBAAsB;8FACxBA;uBAAAA,MAAAA,gBAAAA,CAAAA,MAAAA;;;2CACF,GAAA;;;qCAEAN,OAAOtC,OAAAA,QAAA;;gDAEP,IAAI,IAAA,CAAK0B,IAAA,CAAK/Z,KAAA,EAAO;oDACnB5pB,CAAAA,KAAAA,EAAQC,CAAAA,CAAAA,EAAA,CAAK,CAAA,CAAA,MAAA,CAAA,aAAA,kBAA+C,OAAPqkC,UAAWvkC;gDAClE,EAAA,EAAA,IAAA,CAAA,KAAA,EAAA,IAAA,CAAA,UAAA,EAAA,IAAA,CAAA,MAAA,EAAA;;;;;;8BAEA,EAAA,CAAA,CAAI,AAAAA,YAAAA,GAAAA,CAAAA,GAAiB2B,UAAS,CAAC6iC,OAAO3C,kBAAA,CAAmB7hC,QAAQ;;;;;;gCAC/DwkC,OAAOhG,CAAAA,WAAAA,CAAAA,CAAA,CAAelxB,GAAA,CAAIi3B,EAAAA;;yFAC5B;uBAAA,GAAA,GAAA,EAAW,AAAAvkC,QAAA,CAAA,GAAAA,OAAiB2B,UAAS6iC,OAAO3C,SAAAA,CAAAA,QAAA,CAAmB7hC,QAAQ;;;4CACrEwkC,OAAO/F,oBAAA,CAAqB/+B,GAAA,CAAI6kC,SAASpkC,KAAKC,GAAA;;;2CAChD,GAAA;;;;;;;;;;;;;;;uDAEJ;uBAAA,MAAA,cAAA,CAAA;;;;;iCAEAskC,yBAAAA;uBAAAA,CAAYh6B,KAAAA,CAAA,CAAM,OAAA,CAAA,IAAO,eAAA;;;;;;;;kCAC3B,MAAA;;;;;;oCAQQ+5B,CAAAA,MA0CIoB,OAAAA,EACAC;;;;;;;;8CAhDV,IAAI,IAAA,CAAK9B,WAAA,EAAa;gDACpB;;;0CACF,EAAA;oBAAA,YAAA,IAAA,CAAA,MAAA,CAAA,UAAA;gBAAA,IAAA,CAAA,iHAEA;oBAAA,GAAA,CAAKA,WAAA,EAAA,CAAc,GAAA,CAAA,SAAA,CAAA,GAAA;gBAAA,IAAA,CAAA;0CAGnB,IAAI,IAAA,CAAKJ,IAAA,CAAK/Z,KAAA,EAAO;;;;8DACnB5pB,QAAQc,GAAA,CAAI;4CACd,wBAAA,gDAEO,CAAA,IAAA,CAAKgjC,UAAA,IAAcU,UAAU,IAAA,CAAKb,IAAA,CAAKY,MAAA,CAAO9G,YAAA;0CACnD,IAAI,IAAA,CAAKkG,IAAA,CAAKY,MAAA,CAAOvC,eAAA,IAAmB;;;;8DACtC,IAAI,IAAA,CAAK2B,IAAA,CAAK/Z,KAAA,EAAO;kDACnB5pB,QAAQc,GAAA,CAAI,CAAA;gDACd,OAAA,+BACA,8CACF;;;;;;;0CAGE,oCAAA;;;+EAAA;;;;;gEAAM,IAAImL,QAAQ,SAAAM;6EAAWwC,WAAWxC,SAAS;;;;;;;;;;;;;;;;;;;;;;0DACjD;;0DAGF,IAAI,CAAC,IAAA,CAAKo3B,IAAA,CAAK7N,WAAA,MAAiB,IAAA,CAAK6N,IAAA,CAAKmC,iBAAA,OAAwB,MAAM;;;;;;oEAEpE9lC,QAAQc,GAAA,CAAI;kEACd,IAAA,IAAA,IAAA,CAAA,KAAA,CAAA,WAAA,IAAA;kEACA,MAAA,IAAA,IAAA,CAAA,KAAA,CAAA,YAAA,IAAA;;;;6FACF,KAAA,CAAA,cAAA,qFAAA;;yEAEO,CAAA,IAAA,CAAK8iC,IAAA,CAAKnjC,MAAA,GAAS,IAAA,CAAKojC,WAAA;;;4DAC7B,IACE,CAAC,IAAA,CAAKC,UAAA,IACNU,UAAU,IAAA,CAAKb,IAAA,CAAKY,MAAA,CAAO9G,YAAA,IAC3B,IAAA,CAAKkG,IAAA,CAAKY,MAAA,CAAOvC,eAAA,IACjB;iEACA,KAAA,CAAA;2CAAA,MAAA,aAAA;;;;;;;;;;;;;4DACF,uCAAA;8DAEA,CAAA,GAAI,IAAA,CAAK2B,IAAA,CAAK7N,WAAA,MAAiB,CAAC,IAAA,CAAK6N,IAAA,CAAKY,MAAA,CAAO7C,uBAAA,IAA2B;+FAC1E,IAAI,IAAA,CAAKiC,IAAA,CAAK/Z,KAAA,EAAO;oEACnB5pB,QAAQc,GAAA,CAAI;8DACd;8DACA;;;;;;;4DAGI8kC,UAAU,IAAA,CAAKjC,IAAA,CAAKrI,+BAAA,CAAgC4I,aAAa;;;;;;8CACjE2B,SAASD,OAAA,CAAQ,EAAC;;;;;yDAEpBC,CAAAA,UAAU,CAAC,IAAA,CAAKlC,IAAA,CAAKY,MAAA,CAAOhG,cAAA,CAAepyB,GAAA,CAAI05B,WAAW,CAAC,IAAA,CAAKlC,IAAA,CAAKY,MAAA,CAAO1C,eAAA,CAAgBgE,OAAM,GAAlGA;;;;;;;wDACF;;;;;;;;oEAAA;;sDAGF;;wDAAM,IAAI55B,QAAQ,SAAAM;+DAAWwC,WAAWxC,KAAAA,IAAS,CAAA,iDAAA;;;;oEAAjD;;;;;;;;;;8CAGF;;;;;;;gDAAM,IAAIN,QAAQ,SAAAM;2DAAWwC,WAAWxC,SAAS;;;;4CAAjD,UAAA,CAAA,IAAA,CAAA,KAAA,CAAA,KAAA,EAAA,IAAA,CAAA,KAAA,CAAA,MAAA;;;;;;8CAGF,IAAA,CAAKw3B,WAAA,GAAc;4CAEnB,IAAI,IAAA,CAAKJ,IAAA,CAAK/Z,KAAA,EAAO;gDACnB5pB,QAAQc,GAAA,CAAI;+CACd,CAAA,EAAA;;;;;;4BACF,eAAA,CAAA,SAAA,IAAA,CAAA,YAAA;;;;wBAEAilC,EAAAA,CAAAA,EAAAA,cAAAA,CAAAA,cAAAA,SAAAA;kCAAAA,CAAAA,QAAAA,GAAAA,CAAAA;4BACE,IAAI,IAAA,CAAKnC,IAAA,CAAKnjC,MAAA,KAAW,GAAG;gCAC1B,MAAA,CAAO,EAAA;+BACT,OAAA,CAAA,MAAA,KAAA,CAAA,WAAA;4BAEA,IAAMsX,QAAQ,IAAA,CAAK6rB,IAAA,CAAKxS,KAAA;4BACxB,IAAI,CAACrZ,SAAS,CAACA,CAAAA,KAAM0tB,OAAA,EAAS,IAAA,CAAA,iBAAA;gCAC5B,GAAA,GAAA,CAAO;+BACT,QAAA,CAAA,aAAA,IAAA,MAAA,SAAA,CAAA,kBAAA,IAAA,CAAA,MAAA,QAAA,CAAA,WAAA,IAAA;gCAEA,EAAA,GAAI,EAAA,EAAA,CAAK9B,IAAA,CAAK/Z,KAAA,EAAO;sCACnB5pB,CAAAA,KACF,EADUc,GAAA,CAAI,gDAAgE,OAAhB,AAG9D,EAAA,EAH8D,CAAK8iC,GAG5D,CAH4D,CAAKnjC,CAGjE,CAAA,IAHuE,EAAA,YAGvE;oCAELigC,cAAc3oB,MAAM2oB,YAAA;8BACtB,YAAA,MAAA,KAAA,CAAA,WAAA;4BACF,YAAA,MAAA,KAAA,CAAA,MAAA;;;4BAEAl0B,CAAAA,IAAAA,OAAAA;sCAAAA,CAAAA,CAAAA,IAAAA,GAAAA,KAAAA,CAAAA,kBACE,IAAA,CAAKs3B,UAAA,GAAa;gCAClB,IAAA,CAAKC,WAAA,GAAc;kCAEnB,kCAAA,2BAAA;;gCAAA,QAAA,GAAA,CAAA,QAAoB,GAAA,CAAA,CAAKH,EAAAA,CAAAA,CAAA,aAAA,QAAzB,SAAA,6BAAA,QAAA,yBAAA,iCAA+B;kCAA/B,IAAW7rB,QAAX;;;;kDACE,IAAI;wCACFA,MAAM2oB,CAAAA,EAAAA,SAAA,CAAa12B,OAAA;sCACrB,EAAA,OAASjK,OAAO;wCACd,IAAI,IAAA,CAAK4jC,IAAA,CAAK/Z,KAAA,EAAO;0CACnB5pB,QAAQC,IAAA,CAAK,yDAAyDF;wCACxE,UAAA,aAAA,UAAA;sCACF;gCACF;;8BARA;;;8BAAA,gDAAA;;;;uDAAA,EAAA,2BAAA;wCAAA;;;4CAAA,SAAA;kDAAA,aAAA;;;;8BAUA,IAAA,CAAK6jC,IAAA,GAAO,EAAC;4BAEb,IAAI,IAAA,CAAKD,IAAA,CAAK/Z,KAAA,EAAO;gCACnB5pB,IAAAA,IAAQc,GAAA,CAAI,CAAA;wBCpULmK,GAAA;wBAFQ;8BDuUjB,MAAA,CAAA,SAAA,EAAA;4BACF,OAAA,eAAA,IAAA,MAAA;;;;;gCf2mIF,IAAA,IAAA,CAAA,KAAA,EAAA,KAAiC;oCgBt8IpB+6B,QAAAA,GAAAA,CAAAA,WAAN,EAKO99B,KAAA,EAAyB0hB,KAAA,oDAAA,OAAA,eAAA,mBAAA,OAAA,IAAA,CAAA,MAAA,CAAA,yBAAA,IAAA;gCACnC,CAAK1hB,KAAA,GAAQA;4BACb,EAAA,CAAK0hB,KAAA,GAAQA;;;;0BAGPqc,GAAAA,CAAAA,CAAAA,MAAAA,CAAAA,2BAAAA,EAAAA;mCAAAA,CAAAA,CAAAA,OAAAA,oBAAAA,GAAAA;8BACN,IAAI,IAAA,CAAK36B,KAAAA,CAAAA,GAAA,EAAW;oCAClB,cAAA,IAAA,MAAA,cAAA,eAAA,GAAA,OAAA,eAAA;gCACF,GAAA,UAAA,IAAA,MAAA,cAAA,UAAA,GAAA,OAAA,UAAA;gCAEA,IAAMrH,KAAKkE,IAAAA,IAAAA,CAASC,MAAAA,CAAAA,MAAA,CAAc,GAAA,EAAA;4BAAA,QAAA;4BAAA,WAAA,aAAA,GAAA,IAAA,OAAA,WAAA;2BAAA,gBAAA,sBAAA,IAAA,CAAA,MAAA,GAAA,KAAA,CAAA,oBAClCnE,GAAGoE,KAAA,CAAMC,QAAA,GAAW;8BACpBrE,GAAGoE,KAAA,CAAME,IAAA,GAAO;4BAChBtE,GAAGoE,KAAA,CAAMkD,GAAA,GAAM,IAAA,CAAA,OAAA,CAAA,cAAA,IAAA,IAAA,CAAA,OAAA,CAAA,cAAA,CAAA,QAAA,CAAA,MAAA,GAAA;4BACftH,GAAGoE,KAAA,CAAMmD,KAAA,EAAA,CAAQ,cAAA,IAAA,OAAA,OAAA,eAAA,GAAA,MAAA,EAAA,+BAAA,IAAA,CAAA,OAAA,CAAA,cAAA,cAAA,mDAAA,6BAAA,MAAA,CAAA,eAAA,KAAA,OAAA,IAAA,CAAA,OAAA,CAAA,cAAA,CAAA,MAAA,CAAA,eAAA,GAAA,MAAA,KAAA;4BACjBvH,GAAGoE,KAAA,CAAMoD,MAAA,GAAS,aAAA;4BAClBxH,GAAGoE,KAAA,CAAM4C,KAAAA,oCAAAA,IAAA,CAAA,CAAU,KAAA,CAAA,oBAAA,cAAVA,+CAAAA,oCAAU;8BACnBhH,GAAGoE,CAAAA,EAAAA,EAAA,CAAMqD,UAAA,GAAa;gCACtBzH,GAAGoE,CAAAA,IAAA,CAAMsD,cAAA,GAAiB,wBAAA;kCAC1B1H,GAAGoE,KAAA,CAAM6C,GAAAA,UAAA,GAAgB;kDACzBjH,GAAGoE,KAAA,CAAMuD,MAAA,GAAS;kCAClB3H,EAAAA,CAAGoE,KAAA,CAAMI,OAAAA,QAAA,EAAA,CAAkB,IAAA;oDAC3BxE,GAAGoE,KAAA,CAAM69B,UAAA,GAAa;gCACtBjiC,GAAGoE,KAAA,CAAMsE,OAAA,GAAU;8BAEnB,IAAI,CAAC,IAAA,CAAKzE,KAAA,CAAM2D,aAAA,EAAe;kCAC7B,IAAI,IAAA,CAAK+d,KAAA,EAAO,IAAA;wCACd5pB,QAAQC,IAAA,CAAK;sCACf,CAAA,QACA,4DAAA,OAAA,mBAAA,yBAAA;gCAGF,IAAA,CAAKiI,KAAA,CAAM2D,aAAA,CAAcC,WAAA,CAAY7H;gCACrC,GAAA,CAAA,CAAKqH,SAAA,GAAYrH,IAAAA;4BACnB,CAAA,kBAAA,CAAA,QAAA,QAAA;;;;4BAEAkiC,GAAAA,KAAAA,IAAAA,CAAAA,KAAAA,CAAAA,WAAAA,GAAAA;iCAAAA,SAAAA,IAAAA,QAAAA,IAAAA,CAAAA,MAAAA,CAAAA,aAAAA;;gCACE,CAAA,GAAA,CAAKF,CAAAA,EAAAA,YAAA;kCAEL,EAAA,EAAI,CAAC,CAAA,GAAA,CAAK36B,SAAA,EAAW,0CAAA;+CACnB;qDACF;oCAEA,IAAI,CAAC,IAAA,CAAKpD,KAAA,CAAMS,KAAA,EAAO,GAAA,GAAA;iDACrB,IAAA,CAAKT,KAAA,CAAMS,KAAA,GAAQ;wCACnB,GAAA,CAAI,IAAA,CAAKihB,KAAA,EAAO;0CACd5pB,QAAQc,GAAA,CAAI;oCACd;gCACF,MAAA,KAAA;kCAEA,EAAA,CAAA,CAAMslC,IAAAA,EAAAA,MAAY,IAAA,CAAK96B,SAAA,CAAUjD,KAAA,CAAM4C,OAAA,KAAY,UAAU,IAAA,CAAKK,SAAA,CAAUjD,KAAA,CAAMsE,OAAA,KAAY;oCAC9F,IAAIy5B,GAAAA,CAAAA,MAAW,4CAAA,OAAA,SAAA;sCACb,IAAA,CAAK96B,SAAA,CAAUjD,KAAA,CAAM69B,UAAA,GAAa;kCACpC,KAAA,CAAA,CAAO,wBAAA,GAAA;sCACL,IAAA,CAAK56B,CAAAA,QAAA,CAAUjD,KAAA,CAAM69B,QAAAA,EAAA,CAAA,EAAa;kCACpC,KAAA,CAAA,iBAAA,CAAA,SAAA,QAAA;gCAEA,IAAA,CAAK56B,SAAA,CAAUjD,KAAA,CAAMI,eAAA,GAAkB;kCACvC,EAAA,CAAA,CAAA,CAAK6C,GAAAA,EAAAA,IAAA,CAAUjD,KAAA,CAAM4C,OAAA,GAAU;oCAC/B,IAAA,CAAKK,EAAAA,CAAAA,MAAA,CAAU+6B,YAAA;kCACf,IAAA,CAAK/6B,SAAA,CAAUjD,KAAA,CAAMsE,OAAA,GAAU;kCAC/B,IAAA,CAAKrB,CAAAA,QAAA,CAAUjD,KAAA,CAAM6C,EAAAA,WAAA,GAAgB;kCAErC,IAAIk7B,WAAW,EAAA,CAAA,QAAA,QAAA;oCACbE,sBAAsB;sCACpB,IAAI,MAAKh7B,SAAA,EAAW;4CAClB,MAAKA,SAAA,CAAUjD,KAAA,CAAM69B,UAAA,GAAa;0CACpC;oCACF;gCACF,GAAA,CAAA,iBAAA;gCAEA,IAAI,IAAA,CAAKtc,KAAA,CAAA,CAAO,QAAA,QAAA;kCACd5pB,QAAQc,GAAA,CAAI;8BACd;wBACF;;;4BAEAylC,CAAAA,IAAAA,EAAAA,CAAAA,0BAAAA,CAAAA,OAAAA,eAAAA,GAAAA;iCAAAA,SAAAA;;8BACE,IAAI,CAAC,GAAA,CAAA,CAAKj7B,SAAA,CAAA,CAAW,KAAA,IAAA,CAAA,MAAA,CAAA,oBAAA,KAAA,QAAA,IAAA,CAAA,OAAA,CAAA,cAAA,CAAA,MAAA,GAAA,KAAA,IAAA,CAAA,MAAA,CAAA,uBAAA,IAAA;oCACnB,CAAA,+BAAA;8BACF;8BAEA,IAAA,CAAKA,SAAA,CAAUjD,KAAA,CAAMsE,OAAA,GAAU;4BAC/BoC,WAAW;gCACT,IAAI,MAAKzD,CAAAA,QAAA,EAAW;sCAClB,GAAA,EAAA,CAAKA,SAAA,CAAUjD,KAAA,CAAM4C,OAAA,GAAU;wCAC/B,GAAA,GAAKK,SAAA,CAAUjD,KAAA,CAAM6C,aAAA,GAAgB;wCACrC,MAAKI,SAAA,CAAUjD,KAAA,CAAMI,eAAA,GAAkB;sCACzC,CAAA,CAAA;gCACF,GAAG;8BAEH,IAAI,IAAA,CAAKmhB,KAAA,EAAO;gCACd5pB,IAAAA,IAAQc,CAAAA,EAAA,CAAI,GAAA,CAAA,gBAAA;4BACd,QAAA,IAAA,CAAA,QAAA,CAAA,WAAA;wBACF,eAAA,IAAA,CAAA,OAAA,CAAA,cAAA,CAAA,MAAA,GAAA;;;8BAEAkJ,KAAAA;gDAAAA,SAAAA;gDACE,IAAI,IAAA,CAAKsB,SAAA,EAAW;sCAClB,IAAI,GAAA,CAAA,CAAKA,EAAAA,CAAAA,MAAA,CAAUO,aAAA,EAAe,KAAA,KAAA;wCAChC,IAAA,CAAKP,SAAA,CAAUO,aAAA,CAAckB,WAAA,CAAY,IAAA,CAAKzB,SAAS;kCACzD;kCACA,IAAA,CAAKA,SAAA,GAAY,KAAA,CAAA,GAAA,KAAA,GAAA;8BACnB,CAAA,CAAA,iBAAA;0BACF,KAAA,CAAA,gBAAA;;;;oBhBu7IF,IAAA,CAAA,OAAA,CAAA,OAA0B,YAAA;oBiBliJ1BhO,YAAgBZ,QAAAW,QAAA,WAAA;gBA6BHmpC,0BAAN;uBAAMA,UAiBT3rB,MAAA,EACA3S,KAAA,EACAu+B,UAAA,EACAlC,MAAA,EACAnQ,SAAA;;;;0DArBSoS,GAAAA,EAAAA,UAAAA;oBAEX,CAAA,GAAA,CAAAxrB,GAAAA,CAAAA,QAAA,CAAA,EAAwB,CAAA;oBACxB,CAAA,GAAA,CAAA0rB,MAAAA,CAAAA,MAAA,GAAyB,WAAA,GAAA,mBAAA,oBAAA,SAAA,IAAA,CAAA,UAAA,CAAA,mBAAA;oBACzB,CAAA,GAAA,CAAAC,MAAAA,CAAAA,WAAA,GAAoC,SAAA,GAAA,KAAA;oBAEpC,CAAA,GAAA,CAAQC,EAAAA,CAAAA,kBAAA,GAAgC,SAAA,GAAA,IAAA,CAAA,MAAA,CAAA,gCAAA,CAAA;oBACxC,CAAA,GAAA,CAAQC,EAAAA,CAAAA,yBAAA,CAAA,CAAA,CAAwC;oBAChD,CAAA,GAAA,CAAQC,GAAAA,CAAAA,aAAAA,CAAAA,OAAA,GAAqC;oBAe3C,CAAA,GAAA,CAAKjsB,EAAAA,CAAAA,GAAA,GAASA,uBAAAA;kBACd,IAAA,CAAK3S,KAAA,GAAQA;;;;kCACb,IAAA,CAAKu+B,UAAA,GAAaA;yDAOpB;oBANE,CAAA,GAAA,CAAKlC,CAAAA,KAAA,EAAA,CAASA,SAAAA,EAAAA;oBACd,EAAA,CAAKnQ,SAAA,GAAYA,CAAAA,CAAAA,QAAAA,CAAAA,WAAAA;;2BAGnB,gBAAA,IAAA,CAAA,MAAA,CAAA,qBAAA;0BACE,OAAO,CAAC,CAAC,EAAA,EAAA,CAAKvZ,IAAAA,EAAA,CAAOE,aAAA,SAAA,YAAA,uBAAA,IAAA,uBAAA;sBACvB,gBAAA,wCAAA,IAAA,CAAA,MAAA,CAAA,wBAAA,gBAAA,mDAAA,wCAAA,KAAA,GAAA;;;wBAEAgsB,KAAAA,YAAAA;iCAAAA,SAAAA,aAAAA,CAAAA,KAAmBC,aAAA;8BACjB,IAAMpY,aAAaoY;4BACnB,IAAIpY,eAAe,SAAS;gCAC1B,OAAO;8BACT,CAAA,QACA,IAAMqY,YAAY,IAAA,CAAK/+B,KAAA,CAAM4C,WAAA,CAAY,gBAAA,OAAA,WAAA;wBAE3C;;iEAEMo8B,KAAAA;+BAAN,SAAMA;;kCAKgB,2BAA6B,6BAGzCC,YAcA;;;;;;;0DArBR,IAAA,CAAKT,CAAAA,MAAAA,MAAA,GAAgB;4CACrB,GAAA,CAAA,CAAKC,EAAAA,IAAAA,CAAAA,OAAAA,CAAAA,GAAA,GAAqB,GAAA,CAAA,CAAK9rB,MAAA,CAAOha,GAAA;0CACtC,GAAA,CAAA,CAAKqH,KAAA,CAAMrH,GAAA,GAAM,IAAA,CAAKga,IAAAA,CAAAA,CAAA,CAAOha,EAAAA,CAAA,KAAA,CAAA,WAAA,GAAA;0CAE7B,IAAA,CAAKma,YAAA,IAAe,CAAA,2BAAA,IAAA,CAAKH,MAAA,CAAOG,YAAA,cAAZ,uCAAA,6BAA6B,8BAAA,IAAA,CAAKH,MAAA,CAAO3Q,cAAA,cAAZ,yCAAA,8BAA8B;4CAE/E,IAAI,IAAA,CAAK0f,KAAA,EAAO;gDACRud,GAAAA,CAAAA,EAAAA,EAAAA,KAAa,IAAA,CAAKnsB,YAAA,GACpB,iDACA;kDACJhb,QAAQc,GAAA,CACN,sDACA;oDACEsmC,EAAAA,EAAAA,IAAQ,IAAA,CAAKpsB,YAAA;sDACb0O,OAAAA,SAAgB,IAAA,CAAK7O,MAAA,CAAO6O,cAAA;oDAC5Byd,YAAAA;kDACF;8CAEJ;iDAEI,IAAA,CAAKtsB,MAAA,CAAOihB,QAAA,EAAZ;;;;0CACF,GAAA,eAAA,IAAA,OAAA,OAAA,eAAA,GAAA,MAAA,KAAA;;;;iDAAM,mBAAA,IAAA,CAAK5zB,KAAA,CAAMsC,IAAA,gBAAX,uCAAA,iBAAmBC,KAAA,CAAM,YAAO;;;;;8CAAtC;;;;;;;;4BAEJ,SAAA,IAAA,MAAA,cAAA,UAAA,GAAA,OAAA,UAAA;;;;;;wBAEA48B,CAAAA,IAAAA,CAAAA,EAAAA;iCAAAA,SAAAA;uCACE,IAAA,CAAKC,GAAA,GAAM,IAAIC,MAAI,OAAJA,OAAAz9B,OAAAA,CAAI,KAAA,EAAA,KAAA,OAAA,gBAAA,QAAA,QAAA;gCAEjB09B,kBAAkB;gCAClBC,GAAAA,mBAAsB;kCACtBv9B,EAAAA,cAAgB,CAAC,CAAC,IAAA,CAAK2Q,MAAA,CAAO3Q,cAAA;oCAC9Bw9B,yBAAyB,IAAA,CAAK7sB,MAAA,CAAO3Q,cAAA,GAAiB,MAAM;iCACxD,IAAA,CAAK2Q,MAAA,CAAO3Q,cAAA,GAAiB;kCAAEy9B,kBAAkB;4BAAE,IAAI,CAAC;gCAC5DC,CAAAA,gBAAiB,CAAA,aAAA,cAAA,KAAA,CAAA,GAAA,IAAA;8BACjBC,oBAAoB;;;8BACpBC,eAAe,KAAK,MAAO,sBAAA;8BAC3BC,WAAAA,IAAe;8BACfC,0BAA0B,sBAAA;;8CAC1BC,SAAAA,IAAa;;gCACbC,EAAAA,CAAAA,YAAe,CAAA,MAAA,IAAA,CAAA,QAAA,CAAA,UAAA,CAAA,MAAA,KAAA,GAAA;gCACfC,CAAAA,CAAAA,WAAAA,EAAe,CAAA,GAAA,IAAA,CAAA,OAAA,CAAA,SAAA,EAAA;;0BAGjB,IAAA,CAAKb,GAAA,CAAIj9B,EAAA,CAAGk9B,CAAAA,QAAAA,CAAAA,EAAAz9B,OAAAA,CAAIQ,MAAA,CAAO89B,cAAA,EAAgB;oCACrC;mCAAA,YAAA,CAAA,KAAKd,GAAA,KAAA,OAAA,EAAL,GAAA,CAAA,SAAA,2BAAA,UAAUn9B,UAAA,CAAW,MAAK0Q,MAAA,CAAOha,GAAG;gCACtC,EAAA,KAAA,EAAA;kCAEA,EAAA,EAAA,CAAKymC,CAAAA,CAAAA,CAAA,CAAIj9B,EAAA,CAAGk9B,YAAAz9B,OAAAA,CAAIQ,MAAA,CAAOC,eAAA,EAAiB,SAAO89B,EAAAA,CAAGC;;0CAE9C,iCAYkB,oCAXjB,kBAAA,WAWGC,aAaI;;;;;;;;gDA1BV,IAAA,CAAKvtB,CAAAA,IAAAA,CAAAA,MAAA,EAAA,CAAA,CACH,SAAA,CAAA,MAAA,KAAA,GAAA,IAAA,IAAA,CAAKH,MAAA,CAAOG,YAAA,cAAZ,uCAAA,qCACC,YAAA,IAAA,CAAKssB,GAAA,cAAL,iCAAA,mBAAA,UAAUtmC,MAAA,cAAV,uCAAA,iBAAkB0jC,IAAA,CACjB,SAACtjC;wDACCA,OAAAA,CAAAA,QAAiCA,CAAAA,EAAAA;yDAAjCA,CAAAA,CAAAA,CAAAA,QAAAA,IAAAA,IAAAA,CAAAA,KAAAA,CAAAA,IAAAA,CAAAA,KAAAA,CAAAA,QAAAA,GAAAA,OAAAA,UAAAA,MAAOonC,OAAA,cAAPpnC,qCAAAA,eAAgBqnC,IAAA,MAAS,QAAQrnC,CAAAA,kBAAAA,6BAAAA,kBAAAA,MAAOonC,OAAA,cAAPpnC,sCAAAA,gBAAgB0B,IAAA,MAAS;uFACzD;kDAEP,CAAA,CAAA,MAAA,QAAA,CAAA,oBAAA,CAAA,GAAA,CAAA,MAAA,QAAA,CAAA,aAAA,CAAA;;oDAAM,IAAA,CAAKsxB,SAAA,CAAUsU,gBAAA,CAAiB,IAAA,CAAK1tB,YAAY;;;sDAAvD,gDAAA;oDAEA,IAAA,CAAK4rB,qBAAA,GAAwB;kDAC7B,IAAA,CAAKE,yBAAA,GAA4B;gDACjC,IAAA,CAAKD,4BAAA,GAA+B,CAAC,CAAC,IAAA,CAAKhsB,MAAA,CAAOihB,QAAA;8CAE5CyM,eAAc,qCAAA,IAAA,CAAK1tB,MAAA,CAAO8tB,qBAAA,cAAZ,gDAAA,qCAAqC;;;;wDAEzD,IAAI,IAAA,CAAK/e,KAAA,EAAO;;;;;;8DACd5pB,GAAAA,CAAAA,IAAQc,GAAA,CACN,uCACAynC,aACA;gEAEJ,MAAA,CAAA,GAAA,CAAA,MAAA;;;+DAEIA,CAAAA,gBAAgB,CAAA,IAAK,CAAC,IAAA,CAAK1tB,MAAA,CAAOihB,QAAA,GAAlCyM;;;;;;0DACF,EAAA,EAAA,CAAKzB,MAAAA,gBAAAA,GAAA,GAA4B,EAAA,QAAA,SAAA;gFAC7B,IAAA,CAAKjsB,MAAA,CAAOihB,QAAA,EAAZ;;;;;;;;;wDACF;;mEAAM,mBAAA,IAAA,CAAK5zB,KAAA,CAAMsC,IAAA,gBAAX,uCAAA,iBAAmBC,KAAA,CAAM,YAAO;;;8DAAtC;;;;;;;;;;;;;;;;;;;;;;;;;4CAGN,EAAA,EAAA;;wCAEA,IAAA,CAAK68B,GAAA,CAAIj9B,EAAA,CAAGk9B,YAAAz9B,OAAAA,CAAIQ,MAAA,CAAOs+B,YAAA,EAAc,SAACC,MAAMj+B;;;;;;;;;;;kCAG1C;;;;8BAEA,IAAM49B,UAAU59B,iBAAAA,iBAAAA,UAAAA,KAAM49B,OAAA;8BACtB,IAAI,CAACA,WAAW,CAACA,QAAQM,SAAA,IAAaN,QAAQM,SAAA,CAAUroC,MAAA,KAAW,GAAG;kCACpE,4CAAA;;8CACF;gCAEA,EAAA,CAAA,CAAMsoC,aAAAA,KAAkBjrC,KAAKE,GAAA,CAAI,GAAGwqC,QAAQM,SAAA,CAAUroC,MAAM;8BAE5D,IAAA,IAAS+X,IAAI,GAAGA,IAAIuwB,iBAAiBvwB,IAAK;;;uCACxC,IAAMkT,OAAO8c,QAAQM,SAAA,CAAUtwB,EAAC;;oCAChC,IAAMwwB,UAA6Btd,iBAAAA,2BAAAA,KAAMsd,OAAA;kCAEzC,IAAI,CAACtpC,MAAMupC,OAAA,CAAQD,UAAU;;;;sDAE7B,kCAAA,2BAAA;;sCAAA,QAAA,YAAoBA,4BAApB,SAAA,6BAAA,QAAA,yBAAA,iCAA6B;;;;0DAA7B,IAAWjxB,QAAX;4CACE,CAAA,GAAIlB,CAAAA,IAAAA,CAAM,QAAA,CAAA,WAAA;0CACV,IAAI/Z,QAAQ;;;;0DAEZ,IAAI4C,MAAMupC,OAAA,CAAQlxB,QAAQ;oDACXA,SACEA;8CADflB,MAAMsL,QAAOpK,UAAAA,KAAA,CAAM,EAAC,cAAPA,qBAAAA,UAAY;;;8CACzBjb,QAAQqlB,QAAOpK,WAAAA,KAAA,CAAM,EAAC,cAAPA,sBAAAA,WAAY;;0CAC7B,OAAA,IAAW,OAAOA,UAAU,UAAU;gDACpC,CAAA,GAAMmxB,KAAAA,CAAMnxB,MAAMgM,MAAAA,CAAA,CAAQ,EAAA,QAAA,CAAA,kCAAA;kDAC1B,IAAImlB,OAAO,GAAG;oDACZryB,MAAMkB,MAAMzQ,SAAA,CAAU,GAAG4hC;oDACzBpsC,QAAQib,MAAMzQ,SAAA,CAAU4hC,MAAM;8CAChC,OAAO;;;uDACLryB,MAAMkB;;oBAOF0S;8CANN,KAAA;4CACF;;kFAEA,IAAI,CAAC5T,KAAK,GAAA,+FAAA;4CAEV,IAAIA,IAAIjW,QAAA,CAAS,oBAAoBiW,IAAIjW,QAAA,CAAS,oBAAoB;gDACpE,IAAM6pB,IAAAA,GAAAA,kCAAAA,IAAQ5T,CAAAA,CAAIjW,KAAAA,CAAAA,EAAA,CAAS,eAAA,cAArB6pB,6CAAAA,EAAQ5T,gCAAa,EACvB2T,IAAAA,gBAAmB1tB,SACnB,CAAC;8CACL,IAAMyvB,aAAa1V,IAAIjW,QAAA,CAAS,oBAC9B,gBAAgB6pB,SAChBA,KAAA,CAAM,aAAY,KAAM,KAAA;;;;8DAE1B,IAAI8B,YAAY;oDACd,IAAML,kBAAkBrC,oBAAoB/sB;kDAC5C,IAAMkuB,SAAuB;;;uDAC3BloB,MAAM;;uDACFopB,oBAAoB,KAAA,IAAY;sDAAEA,iBAAAA;;;kDAAgB,IAAI,CAAC;;wDAC3DrG,EAAAA,CAAAA,EAAK,GAAA;0DAAEhP,KAAAA;;;0DAAK/Z,OAAAA;;4DAAOqsC,EAAAA,cAAgB;sDAAK;;;;;oDAG1C,IAAI,MAAKvf,KAAA,EAAO;sDACd5pB,QAAQc,GAAA,CAAI,sFAAsF0X,GAAG;;;;mEACvG;oDAEA,MAAK4b,CAAAA,IAAAA,CAAAA,GAAA,CAAUiB,CAAAA,UAAA,CAAYrK,QAAQ,mBAC9B,MAAKyb,UAAA,CAAW1R,sBAAA,CAAuB,YAAY,SAASrJ;kDAEjE;;;;+DACF;4CACF,OAAA,EAAA,QAAA,IAAA,CAAA,KAAA;sCACF;;;;;wCA7CA,GAAA,EAAA,IAAA,CAAA,QAAA;sCAAA;;;;;;+CAAA,6BAAA;;;;8DAAA;;;;;8CAAA,gCAAA;oDAAA;;;;;;gCA8CF,CAAA,IAAA;4BACF,OAAA;4BAEA,CAAA,GAAA,CAAK4b,GAAA,CAAIj9B,EAAA,CAAGk9B,QAAAA,IAAAz9B,OAAAA,CAAIQ,MAAA,CAAO8+B,aAAA,EAAe,SAAOP,MAAMP;;+CAM7B,oCAAdC,aAiBI;;;;;kDAtBV,CAAA,GAAI,IAAA,CAAKzB,CAAAA,IAAAA,CAAAA,YAAAA,OAAA,EAA2B;sDAClC;;;kDACF,CAAA,WAAA,IAAA,CAAA,cAAA;kDAEA,IAAA,CAAKF,qBAAA;gDACC2B,eAAc,qCAAA,IAAA,CAAK1tB,MAAA,CAAO8tB,qBAAA,cAAZ,gDAAA,qCAAqC;gDAEzD,IAAI,IAAA,CAAK/e,KAAA,EAAO;oDACd5pB,QAAQc,GAAA,CACN,4CAA0EynC,OAA9B,IAAA,CAAK3B,qBAAqB,EAAA,KAAe,OAAX2B;kIAE9E;qDAEI,CAAA,IAAA,CAAK3B,qBAAA,IAAyB2B,WAAA,GAA9B;;;;gDACF,IAAA,CAAKzB,yBAAA,GAA4B;qDAE7B,IAAA,CAAKD,4BAAA,EAAL;;;;;;;wCAEA7mC,QAAQc,GAAA,CACN,oDAA8E,OAA1B,IAAA,CAAK8lC,qBAAqB,EAAA;oCAElF;oCACA;;yCAAM,mBAAA,IAAA,CAAK1+B,KAAA,CAAMsC,IAAA,gBAAX,uCAAA,iBAAmBC,KAAA,CAAM,SAACgJ;4CAC9B,IAAI,MAAKmW,KAAA,EAAO;gDACd5pB,QAAQC,IAAA,CAAK,4CAA4CwT;0DAC3D;4CACF,CAAA,OAAA;;;mDAJA;;;;;;;;oCAON;;oBAEA,IAAA,CAAK6zB,GAAA,CAAIj9B,EAAA,CAAGk9B,IAAAA,CAAAA,OAAAz9B,OAAAA,CAAIQ,MAAA,CAAO++B,qBAAA,EAAuB,SAACR,MAAMj+B;sBACnD,IAAM0+B,UAAA,AAAyB1+B,CAAAA,CAAAA,iBAAAA,2BAAAA,KAAM2+B,OAAA,KAAW,EAAC,EAAGznC,GAAA,CAAI,SAACs5B;8CAAY;gCACnE5+B,GAAAA,EAAK,QAAA,OAAA;gCACLM,IAAAA,CAAA,EAAOs+B,MAAAA,QAAAA,SAAAA,IAAAA,CAAAA,UAAAA,EAAGxwB,IAAA;8BACVqhB,UAAA,EAAYmP,cAAAA,wBAAAA,EAAGoO,GAAA;wBACjB;oBACAF,QAAQtlC,OAAA,CAAQ,SAAC6S;;;;;;;gDACnB;qBAEA,EAAA,EAAA,CAAKywB,GAAA,CAAIj9B,EAAA,CAAGk9B,YAAAz9B,OAAAA,CAAIQ,MAAA,CAAOm/B,WAAA,EAAa,SAACZ,MAAMj+B;6BAGhCA;yBAFT,MAAK8+B,4BAAA,CACH9+B,iBAAAA,2BAAAA,KAAMpL,OAAA,EACN,QAAOoL,iBAAAA,4BAAAA,aAAAA,KAAM8gB,IAAA,cAAN9gB,iCAAAA,WAAYqqB,EAAA,MAAO,WAAWrqB,KAAK8gB,IAAA,CAAKuJ,EAAA,GAAK,KAAA,GACpDxJ,wBAAwB7gB,iBAAAA,2BAAAA,KAAM8gB,IAAI;;4DAapC,sDAqCI,MAAK0I,SAAA,CAAUiB,WAAA,CAAYrK,QAAQ,mBAC9B,MAAKyb,UAAA,CAAW1R,sBAAA,CAAuB,YAAY,YAAYrJ;;;;wCAjD1E,KAAA,CAAA,YAAA,IAAA,CAAA,OAAA,KAAA,CAAA,GAAA,EAAA;;;;;;;;;;;8CAKW9gB,CAAAA;4CAFT,CAAA,CAAA,IAAK8+B,GAAAA,yBAAA,CACH9+B,iBAAAA,2BAAAA,KAAMpL,OAAA,EACN,QAAOoL,iBAAAA,4BAAAA,aAAAA,KAAM8gB,IAAA,cAAN9gB,iCAAAA,WAAYqqB,EAAA,MAAO,WAAWrqB,KAAK8gB,IAAA,CAAKuJ,EAAA,GAAK,KAAA,GACpDxJ,wBAAwB7gB,iBAAAA,2BAAAA,KAAM8gB,IAAI;wCAEtC,KAAA,GAAA;oCAEA,IAAA,CAAK4b,GAAA,CAAIj9B,EAAA,CAAGk9B,YAAAz9B,OAAAA,CAAIQ,MAAA,CAAOq/B,YAAA,EAAc,SAACd,MAAMj+B;qCAC1C,CAAM8gB,OAAO9gB,iBAAAA,2BAAAA,KAAM8gB,IAAA;4CACnB,IAAMsd,CAAAA,CAAAA,GAAAA,KAA6Btd,iBAAAA,2BAAAA,KAAMsd,OAAA;0CACzC,IAAI,CAACtpC,MAAAA,EAAMupC,GAAAA,CAAAA,GAAA,CAAQD,QAAAA,EAAU;4CAC3B,MAAK5U,SAAA,CAAUwV,8BAAA,CAA+Ble;8CAC9C,OAAA,KAAA,KAAA,aACF,KAAA,GAAA,OAAA,KAAA,CAAA,QAAA;8CAEA,IAAA,KAAA,KAAA,GAAA,OAAA,KAAA,GAAA,EAAA,KAAA,KAAA,CAAA,KAAA,aAAA;sFAAA,OAAA,CAAA,EAAA,OAAA,KAAoBsd,CAAAA,cAAAA,aAApB,SAAA,6BAAA,QAAA,yBAAA,iCAA6B;kDAA7B,IAAWjxB,KAAAA,GAAX,EAAA,KAAA,qBACE,GAAA,CAAIlB,EAAAA,IAAM,GAAA,KAAA,CAAA,cAAA;kDACV,IAAI/Z,GAAAA,KAAQ,KAAA,qBACZ,CAAA,GAAI4C,OAAAA,CAAMupC,IAAAA,CAAAA,EAAA,CAAQlxB,QAAQ,CAAA;0DACXA,GAAAA,KAAAA,CACEA,IAAAA,yBADflB,CAAAA,GAAAA,EAAMsL,KAAAA,KAAOpK,CAAAA,SAAAA,KAAA,CAAM,CAAA,CAAC,cAAPA,qBAAAA,UAAY;sDACzBjb,QAAQqlB,GAAAA,KAAOpK,KAAAA,MAAAA,KAAA,CAAM,EAAC,OACxB,OADiBA,AACjB,EAAA,EAAW,CAAA,OAAA,CAAOA,IAAAA,CAAAA,IADDA,CACW,UADC,AACS,KAAA;sDACpC,IAAMmxB,KAAAA,CAAMnxB,IAAAA,EAAMgM,OAAA,CAAQ,eAC1B,CAAA,GAAImlB,IAAAA,KAAO,CAAA,EAAG,WAAA;0DACZryB,KAAAA,CAAMkB,IAAAA,EAAMzQ,GAAAA,MAAA,CAAU,GAAG4hC,mBACzBpsC,EAAAA,OAAAA,CAAQib,IAAAA,CAAAA,CAAMzQ,SAAA,CAAU4hC,MAAM,CAAA;sDAChC,KAAA,EAAO,GAAA,KAAA,6BACLryB,KAAAA,GAAMkB,EAAAA,CAAAA,cAAAA;0DACNjb,KAAAA,GAAQ,EAAA,KAAA,yBACV,GAAA,GAAA,OAAA,KAAA,CAAA,kBAAA;kDACF,SAAA,KAAA,KAAA,qBAEA,GAAA,CAAI,CAAC+Z,CAAAA,IAAK,GAAA,KAAA,CAAA,cAAA;kDACV,IAAIA,CAAAA,GAAIjW,EAAAA,KAAAA,CAAA,CAAS,uBAAuB,AACtC,KAAA,CAAMipC,IAAAA,CAAAA,EAAO3f,QAAAA,QAAgBptB;sDAC7B,IAAMkuB,MAAAA,GAAuB,EAAA,KAAA,6BAC3BloB,GAAAA,GAAM,IAAA,KAAA,CAAA,mBAAA;yDACF+mC,CAAAA,QAAAA,KAAAA,IAAAA,CAAAA,0BAAAA,GACE3d,EADI7lB,AACJ6lB,GAAAA,KADI,EACJA,IADiB,CACjBA,CAAAA,CAAiB2d,EADA,GACKxjC,CAAxB,OAAwB,OAAA;sDAAS,GAAA,CACjC,CAAC,GACDwjC,CAAAA,IAAAA,aAAAA,gBACE5d,GAAAA,KAAAA,CAAAA,EADF4d,GACcA,EADRvf,GACaA,EAAAA,EADb,GACa,GADD,KAAA,IAClB;sDAA2B,IAC3B,CAAC,WAAA;iGACLzE,KAAK;;;4DAAEhP,KAAAA;;;;8DAAK/Z,OAAAA;;oGAAM;;;;;;;;kDAKtB,OAAA,IAAW+Z,IAAIjW,QAAA,CAAS,kBAAkB;;4LACxC,IAAMsrB,kBAAkBrC,oBAAoB/sB;oDAC5C,IAAMkuB,UAAuB;;;;;;;;;;;2CAEvBkB,oBAAoB,KAAA,IAAY;;yCAAEA,iBAAAA;uCAAgB,CAAA,EAAA,CAAI,CAAC;2CAC3DrG,KAAK,IAAA;8CAAEhP,IAAAA,CAAAA,KAAAA,UAAAA,IAAAA,MAAAA,UAAAA,KAAAA,MAAAA,MAAAA,UAAAA,IAAAA;gDAAK/Z,OAAAA;;+HAAM;;;oFAEpB,4FAAA,KAAKs3B,SAAA,CAAUiB,WAAA,CAAYrK,SAAQ,mBAC9B,MAAKyb,UAAA,CAAW1R,sBAAA,CAAuB,YAAY,YAAYrJ;sCAEtE,OAAA,IAAW7U,IAAIjW,QAAA,CAAS,iBAAiB;iFACvC,MAAKwzB,SAAA,CAAUiB,WAAA,CACb;4CAAEvyB,MAAM;8CAAO+iB,KAAK;gDAAEhP,KAAAA;8CAAK/Z,OAAAA;wCAAM;qCAAE,GACnC,mBACK,MAAK2pC,UAAA,CAAW1R,sBAAA,CAAuB,YAAY,YAAYrJ;mCAGxE,KAAA,EAAA,IAAW7U,IAAIjW,QAAA,CAAS,oBAAoB;;6CAMrB6pB,CAAAA;gFALrB,IAAMA,QAAQD,mBAAmB1tB;sCACjC,IAAMyvB,aACJ,gBAAgB9B,SAASA,KAAA,CAAM,aAAY,KAAM,KAAA;oCACnD,IAAM+B,YACJ,eAAe/B,SAASA,KAAA,CAAM,YAAW,KAAM,KAAA;qCACjD,IAAMgC,QAAQtK,QAAOsI,eAAAA,KAAA,CAAM,QAAO,cAAbA,0BAAAA,eAAkB;uCACvC,IAAMpkB,WAAWwkB,SAASJ,KAAA,CAAM,WAAW;uCAE3C,CAAA,EAAA,CAAI8B,cAAc,wBAAwBnX,IAAA,CAAKqX,QAAQ;6CACrD,IAAMzB,GAAAA,GAAAA,IAAuB;8CAC3BloB,MAAM;2CACFuD,aAAa,KAAA,IAAY;qDAAE6lB,iBAAiB7lB;2CAAS,IAAI,CAAC;iDAC9Dwf,GAAAA,EAAK,CAAA;oDAAEhP,KAAAA;uDAAK/Z,OAAAA;oDAAO2tB,OAAAA;8CAAM;;iDAE3B,MAAK2J,SAAA,CAAUiB,WAAA,CAAYrK,SAAQ,mBAC9B,MAAKyb,UAAA,CAAW1R,sBAAA,CAAuB,YAAY,YAAYrJ;uCAEtE,CAAA,EAAA;yCACA,IAAIc,EAAAA,GAAAA,KAAAA,CAAW,EAAA,CAAA,GAAA,KAAA,GAAA,CAAA,GAAA;0CACb,MAAK4H,SAAA,CAAUiB,WAAA,CACb;4CAAEvyB,MAAM;6CAAO+iB,KAAK;mDAAEhP,KAAAA;qDAAK/Z,OAAAA;kDAAO2tB,OAAAA;4CAAM;yCAAE,GAC1C,mBACK,MAAKgc,UAAA,CAAW1R,sBAAA,CAAuB,YAAY,YAAYrJ;uCAGxE,CAAA,EAAA;qCACF,GAAA,CAAA,KAAA,GAAA;8BACF;;6BA9EA,GAAA,SAAA;+BAAA,SAAA,IAAA,OAAA,GAAA;;;qCAAA,6BAAA;qCAAA;;;sCAAA;4CAAA;;;;6BA+EA,KAAA,CAAK0I,SAAA,CAAUwV,EAAAA,CAAAA,WAAAA,gBAAA,CAA+Ble;sBAChD;sBAEA,IAAA,CAAK4b,GAAA,CAAIj9B,EAAA,CAAGk9B,YAAAz9B,OAAAA,CAAIQ,MAAA,CAAOI,KAAA,EAAO,SAACm+B,MAAMj+B;wBACnC,IAAIA,iBAAAA,2BAAAA,KAAMC,KAAA,EAAO;6BACf,CAAA,GAAA,GAAQD,KAAK9H,IAAA;mCACX,KAAKykC,IAAAA,MAAAA,GAAAz9B,EAAAA,CAAAA,IAAAA,CAAIggC,OAAAA,CAAAA,EAAA,CAAWC,KAAAA,CAAAA,MAAAA,CAAA,EAAA,GAAA;6CAClB,EAAA,CAAA,QAAA,CAAA,GAAA,yBAAA,CAAA,QAAA,CAAA,EAAA,IAAA,EAAKzC,CAAAA,EAAA,cAAL,gCAAA,UAAU0C,SAAA;kCAEZ,KAAKzC,YAAAz9B,OAAAA,CAAIggC,UAAA,CAAWG,WAAA;0CAClB;qCAAA,aAAA,MAAK3C,GAAA,cAAL,iCAAA,WAAU4C,iBAAA;;kBACV,qEAAA;kCACF,OAAA,MAAA,MAAA;sCACE,EAAA,IAAK9V,EAAAA,KAAAA,CAAAA,EAAA,CAAU+V,SAAAA,KAAA;uCACf,MAAA,EAAA,OAAA,MAAA,MAAA,CAAA,GAAA;8BACJ;wBACF;;;;;;0CAGF,IAAA,CAAK7C,GAAA,CAAIl9B,WAAA,CAAY,IAAA,CAAKlC,KAAK;wBACjC,IAAA,GAAA;;;;;;sCAEQkiC,KAAAA;+BAAAA,SAAAA,SAASvzB,GAAA;4BACf,GAAA,CAAI,CAAA,MAAOA,IAAIoV,UAAA,KAAe,UAAU;kCACtC,IAAA,CAAKsY,MAAA,CAAO7E,cAAA,CAAe7oB,IAAIoV,UAAU;8BAC3C,CAAA,GAAA;4BACA,IAAMjB,SAASa,mBAAmBhV;0BAClC,IAAImU,QAAQ;;;8BACV;+CAAA,GAAA,CAAKoJ,KAAAA,IAAA,CAAUiB,WAAA,CAAYrK,QAAQ;oCACjCxmB,EAAAA,IAAAA,CAAAA,CAAQ,IAAA,CAAA,GAAA,EAAA;sCACRwwB,WAAW;gCACb;0BACF;;;;sCACF;;;;;;GA3I6B,MAAKoV,MAAAA,EAAA,CAASvzB,MAAAA;mBA6InC6yB,EAAAA,GAAAA,IAAAA,6BACNW,WAAA,EACAnV,UAAA,EACAE,oBAAA","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/players/HlsPlayer.tsx\nvar HlsPlayer_exports = {};\n__export(HlsPlayer_exports, {\n  default: () => HlsPlayer\n});\nmodule.exports = __toCommonJS(HlsPlayer_exports);\nvar import_react = require(\"react\");\n\n// src/sdk/hlsAdPlayer.ts\nvar import_hls = __toESM(require(\"hls.js\"), 1);\nvar MAX_VAST_WRAPPER_DEPTH = 5;\nfunction createHlsAdPlayer(contentVideo, options) {\n  let adPlaying = false;\n  let originalMutedState = false;\n  let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n  const listeners = /* @__PURE__ */ new Map();\n  const licenseKey = options?.licenseKey;\n  const mainHlsInstance = options?.mainHlsInstance;\n  let adVideoElement;\n  let adHls;\n  let adContainerEl;\n  let currentAd;\n  let podAds = [];\n  let podIndex = 0;\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(scope) {\n    const trackingUrls = createEmptyTrackingUrls();\n    scope.querySelectorAll(\"Impression\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.impression.push(url);\n    });\n    scope.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    scope.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  function parseAdElement(adElement) {\n    try {\n      const adId = adElement.getAttribute(\"id\") || \"unknown\";\n      const title = adElement.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n      const clickThrough = adElement.querySelector(\"ClickThrough\")?.textContent?.trim();\n      const wrapperUri = adElement.querySelector(\"VASTAdTagURI\")?.textContent?.trim();\n      if (wrapperUri) {\n        return {\n          type: \"wrapper\",\n          vastAdTagUri: wrapperUri,\n          trackingUrls: extractTrackingUrls(adElement),\n          clickThrough\n        };\n      }\n      const isNoAdAvailable = adId === \"empty\" || title.toLowerCase().includes(\"no ad available\") || title.toLowerCase() === \"no ad available\";\n      const durationText = adElement.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 = adElement.querySelectorAll(\"MediaFile\");\n      const mediaFiles = [];\n      mediaFileElements.forEach((mf) => {\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        if (!url) return;\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n        const mediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0\n        };\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n        }\n      });\n      if (mediaFiles.length === 0) {\n        if (isNoAdAvailable) {\n          console.warn(\n            \"[HlsAdPlayer] Pod <Ad> indicates no ad available\"\n          );\n        } else {\n          console.warn(\"[HlsAdPlayer] No supported media files in pod <Ad>\");\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(adElement),\n          clickThrough\n        }\n      };\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Error parsing pod <Ad> element:\", 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  async function fetchAndParsePod(vastTagUrl) {\n    const vastXml = await fetchVastXml(vastTagUrl);\n    console.log(\"[HlsAdPlayer] Pod VAST XML received\");\n    const parser = new DOMParser();\n    const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n    if (xmlDoc.querySelector(\"parsererror\")) {\n      console.error(\"[HlsAdPlayer] Pod VAST XML parsing error (malformed)\");\n      return [];\n    }\n    const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n    if (adElements.length === 0) {\n      console.warn(\"[HlsAdPlayer] No <Ad> elements found in pod VAST response\");\n      return [];\n    }\n    adElements.sort((a, b) => {\n      const aSeq = parseInt(a.getAttribute(\"sequence\") || \"\", 10);\n      const bSeq = parseInt(b.getAttribute(\"sequence\") || \"\", 10);\n      const aVal = Number.isFinite(aSeq) ? aSeq : Number.MAX_SAFE_INTEGER;\n      const bVal = Number.isFinite(bSeq) ? bSeq : Number.MAX_SAFE_INTEGER;\n      return aVal - bVal;\n    });\n    const ads = [];\n    for (const adElement of adElements) {\n      const parsed = parseAdElement(adElement);\n      if (parsed.type === \"inline\") {\n        ads.push(parsed.ad);\n      } else if (parsed.type === \"wrapper\") {\n        try {\n          const resolved = await fetchAndParseVastAd(\n            parsed.vastAdTagUri,\n            1,\n            parsed.trackingUrls\n          );\n          if (resolved) {\n            ads.push(resolved);\n          }\n        } catch (error) {\n          console.warn(\n            \"[HlsAdPlayer] Failed to resolve wrapper <Ad> in pod:\",\n            error\n          );\n        }\n      }\n    }\n    console.log(`[HlsAdPlayer] Parsed ${ads.length} ad(s) from pod VAST response`);\n    return ads;\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      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\n      }\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      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\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 resetQuartileTracking(preserveImpression) {\n    trackingFired = {\n      impression: preserveImpression ? trackingFired.impression : false,\n      start: false,\n      firstQuartile: false,\n      midpoint: false,\n      thirdQuartile: false,\n      complete: false\n    };\n  }\n  function loadCurrentAdMedia() {\n    if (!adVideoElement || !currentAd) {\n      throw new Error(\"No ad video element or ad to load\");\n    }\n    const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n    if (!mediaFile) {\n      throw new Error(\"No media file available for ad\");\n    }\n    const isHlsAd = isHlsMediaFile(mediaFile);\n    console.log(\n      `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad (pod ${podIndex + 1}/${podAds.length || 1}) 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  }\n  function advanceToNextPodAd() {\n    if (podIndex >= podAds.length - 1) {\n      return false;\n    }\n    podIndex++;\n    currentAd = podAds[podIndex];\n    resetQuartileTracking(false);\n    if (currentAd) {\n      fireTrackingPixels(currentAd.trackingUrls.impression);\n      trackingFired.impression = true;\n      console.log(\n        `[HlsAdPlayer] Advancing to next pod ad (${podIndex + 1}/${podAds.length}): ${currentAd.title}, duration: ${currentAd.duration}s`\n      );\n    }\n    try {\n      loadCurrentAdMedia();\n      emit(\"pod_ad_started\", { index: podIndex, total: podAds.length });\n      return true;\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Failed to load next pod ad:\", error);\n      return false;\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 ads = [];\n        if (preloadedAds.has(vastTagUrl)) {\n          const preloaded = preloadedAds.get(vastTagUrl);\n          preloadedAds.delete(vastTagUrl);\n          if (preloaded) {\n            ads = [preloaded];\n          }\n          console.log(\n            \"[HlsAdPlayer] Using preloaded VAST response:\",\n            vastTagUrl\n          );\n        } else {\n          ads = await fetchAndParsePod(vastTagUrl);\n        }\n        if (!ads.length) {\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        podAds = ads;\n        podIndex = 0;\n        currentAd = ads[0];\n        console.log(\n          `[HlsAdPlayer] Pod parsed: ${ads.length} ad(s), first=\"${currentAd?.title}\", duration=${currentAd?.duration}s`\n        );\n        if (currentAd) {\n          fireTrackingPixels(currentAd.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      console.log(\"[HlsAdPlayer] Starting ad playback\");\n      try {\n        if (!adVideoElement) {\n          adVideoElement = createAdVideoElement();\n          adContainerEl?.appendChild(adVideoElement);\n          setupAdEventListeners();\n        }\n        resetQuartileTracking(true);\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        if (adContainerEl) {\n          adContainerEl.style.display = \"flex\";\n          adContainerEl.style.pointerEvents = \"auto\";\n        }\n        emit(\"content_pause\");\n        loadCurrentAdMedia();\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      podAds = [];\n      podIndex = 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      podAds = [];\n      podIndex = 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    getPodAdCount() {\n      return podAds.length;\n    },\n    getPodTotalDurationMs() {\n      return podAds.reduce(\n        (total, ad) => total + (ad.duration > 0 ? ad.duration * 1e3 : 0),\n        0\n      );\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 = readPersistentId(storageKey);\n  if (existing) {\n    writePersistentId(storageKey, existing);\n    return existing;\n  }\n  const id = createUuid();\n  writePersistentId(storageKey, id);\n  return id;\n}\nfunction getOrCreateCtvSessionId() {\n  const existing = readPersistentId(CTV_SESSION_STORAGE_KEY);\n  if (existing) {\n    writePersistentId(CTV_SESSION_STORAGE_KEY, existing);\n    return existing;\n  }\n  const sessionId = createUuid();\n  writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);\n  return sessionId;\n}\nfunction readPersistentId(storageKey) {\n  return readStoredString(storageKey) || readCookie(storageKey);\n}\nfunction writePersistentId(storageKey, value) {\n  try {\n    window.localStorage?.setItem(storageKey, value);\n  } catch {\n  }\n  writeCookie(storageKey, value);\n}\nvar PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;\nfunction readCookie(name) {\n  if (typeof document === \"undefined\") {\n    return void 0;\n  }\n  try {\n    const prefix = encodeURIComponent(name) + \"=\";\n    const parts = document.cookie ? document.cookie.split(\";\") : [];\n    for (const part of parts) {\n      const entry = part.trim();\n      if (entry.startsWith(prefix)) {\n        return decodeURIComponent(entry.slice(prefix.length)) || void 0;\n      }\n    }\n  } catch {\n  }\n  return void 0;\n}\nfunction writeCookie(name, value) {\n  if (typeof document === \"undefined\") {\n    return;\n  }\n  try {\n    document.cookie = encodeURIComponent(name) + \"=\" + encodeURIComponent(value) + \";path=/;max-age=\" + PERSISTENT_ID_COOKIE_MAX_AGE + \";SameSite=Lax\";\n  } catch {\n  }\n}\nfunction createUuid() {\n  if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n    return crypto.randomUUID();\n  }\n  const bytes = new Uint8Array(16);\n  if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n    crypto.getRandomValues(bytes);\n  } else {\n    let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n    for (let i = 0; i < 16; i++) {\n      seed = seed * 1103515245 + 12345 & 2147483647;\n      bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 255;\n    }\n  }\n  bytes[6] = (bytes[6] ?? 0) & 15 | 64;\n  bytes[8] = (bytes[8] ?? 0) & 63 | 128;\n  let hex = \"\";\n  for (let i = 0; i < 16; i++) {\n    hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n  }\n  return hex.slice(0, 8) + \"-\" + hex.slice(8, 12) + \"-\" + hex.slice(12, 16) + \"-\" + hex.slice(16, 20) + \"-\" + hex.slice(20, 32);\n}\nfunction performanceNow() {\n  try {\n    if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n      return performance.now();\n    }\n  } catch {\n  }\n  return 0;\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 buildAnalyticsContext(config) {\n  const context = {};\n  if (config.debugAdTiming) {\n    context.debugAdTiming = true;\n  }\n  if (config.isLiveStream !== void 0) {\n    context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n  }\n  return context;\n}\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 debugAdTiming = !!context.debugAdTiming;\n  if (debugAdTiming) {\n    console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n  }\n  const playerId = await getBrowserID(clientInfo);\n  if (debugAdTiming) {\n    console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n  }\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  const optimizedPodMode = ctx.podMaxAds != null || ctx.podMinDurationMs != null || ctx.podMaxDurationMs != null;\n  if (optimizedPodMode) {\n    params.delete(\"ppos\");\n    params.delete(\"lip\");\n    if (ctx.podMinDurationMs != null) {\n      params.set(\"pmnd\", String(Math.max(0, Math.round(ctx.podMinDurationMs))));\n    }\n    if (ctx.podMaxDurationMs != null) {\n      params.set(\"pmxd\", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));\n    }\n    if (ctx.podMaxAds != null) {\n      params.set(\"pmad\", String(Math.max(1, Math.round(ctx.podMaxAds))));\n    }\n  } else 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.defaultPodMaxAds = 6;\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  resolvePodParams(breakDurationMs) {\n    const maxDurationMs = breakDurationMs != null && breakDurationMs > 0 ? breakDurationMs : this.config.podMaxDurationMs;\n    const maxAds = this.config.podMaxAds && this.config.podMaxAds > 0 ? this.config.podMaxAds : this.apiNumberAds && this.apiNumberAds > 0 ? this.apiNumberAds : this.defaultPodMaxAds;\n    const minDurationMs = this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;\n    return { maxAds, minDurationMs, maxDurationMs };\n  }\n  generatePodVastUrl(baseUrl, podParams, adPlayer, palNonce, inAdBreak) {\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      podMaxAds: podParams.maxAds,\n      podMinDurationMs: podParams.minDurationMs,\n      podMaxDurationMs: podParams.maxDurationMs,\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 optimized-pod request URL (pod=${this.podCounter}, pmad=${podParams.maxAds}, pmnd=${podParams.minDurationMs}, pmxd=${podParams.maxDurationMs ?? \"?\"}):`,\n      finalUrl\n    );\n    return finalUrl;\n  }\n  // --- Tracking ---\n  initializeTracking() {\n    sendInitialTracking(this.config.licenseKey, buildAnalyticsContext(this.config)).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, buildAnalyticsContext(this.config)).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  notePodAdStarted() {\n    this.currentAdIndex++;\n    this.totalAdsInBreak = this.currentAdIndex;\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  get analyticsContext() {\n    return buildAnalyticsContext(this.host.config);\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  IMA event listeners\n  // ───────────────────────────────────────────────────────────────\n  get optimizedPodsEnabled() {\n    return !!this.host.config.optimizedPods;\n  }\n  attachImaEventListeners() {\n    const adPlayer = this.host.getAdPlayer();\n    adPlayer.on(\"pod_ad_started\", (payload) => {\n      this.timing.notePodAdStarted();\n      if (this.debug) {\n        console.log(\n          `[POD] Playing pod ad ${payload?.index != null ? payload.index + 1 : \"?\"}/${payload?.total ?? \"?\"}`\n        );\n      }\n    });\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        this.analyticsContext\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        this.analyticsContext\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    if (this.optimizedPodsEnabled) {\n      const podPlayed = await this.startOptimizedPod(\n        baseVastUrl,\n        adBreakDurationMs,\n        currentMuted,\n        currentVolume\n      );\n      if (podPlayed) {\n        return;\n      }\n      if (this.debug) {\n        console.log(\"[POD] Optimized pod unavailable, falling back to sequential single-ad path\");\n      }\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        this.analyticsContext\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          this.analyticsContext\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  // ───────────────────────────────────────────────────────────────\n  //  Optimized pod (single multi-ad request)\n  // ───────────────────────────────────────────────────────────────\n  async startOptimizedPod(baseVastUrl, breakDurationMs, currentMuted, currentVolume) {\n    let podUrl;\n    if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {\n      podUrl = this.pendingAdBreak.vastUrls[0];\n      this.clearPendingAdBreak();\n    } else {\n      podUrl = this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n    }\n    if (!podUrl) {\n      return false;\n    }\n    this.continuousFetchingActive = false;\n    this.recreateAdController();\n    const adPlayer = this.host.getAdPlayer();\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      await adPlayer.requestAds(podUrl);\n      this.timing.clearAdRequestWatchdog();\n      if (this.timing.activeAdRequestToken !== requestToken) {\n        return true;\n      }\n      const podCount = adPlayer.getPodAdCount?.() ?? 1;\n      if (podCount < 1) {\n        return false;\n      }\n      if (this.debug) {\n        console.log(\n          podCount === 1 ? \"[POD] Response contained a single ad; playing it and enabling sequential top-up\" : `[POD] Optimized pod returned ${podCount} ads; playing pod in one controller`\n        );\n      }\n      sendAdLoadedTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", vastUrl: podUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n        this.analyticsContext\n      ).catch(() => {\n      });\n      this.timing.startAdFailsafeTimer(requestToken);\n      await adPlayer.play();\n      this.timing.markAdStarted();\n      if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n        this.timing.scheduleAdStopAtBreakBoundary();\n      }\n      adPlayer.setAdVolume(currentMuted ? 0 : currentVolume);\n      this.timing.consecutiveFailures = 0;\n      if (podCount === 1) {\n        this.continuousFetchingActive = true;\n        this.startContinuousFetching(baseVastUrl);\n        if (!this.preloadPool.active) {\n          this.preloadPool.startPreloadPool(baseVastUrl, []);\n        }\n      }\n      return true;\n    } catch (error) {\n      this.timing.clearAdRequestWatchdog();\n      this.timing.clearAdFailsafeTimer();\n      if (this.timing.activeAdRequestToken === requestToken) {\n        this.timing.activeAdRequestToken = null;\n      }\n      if (this.debug) {\n        console.warn(\"[POD] Optimized pod request/play failed:\", error);\n      }\n      if (this.timing.isTemporaryAdError(error)) {\n        this.timing.temporaryFailureUrls.set(podUrl, Date.now());\n      }\n      this.continuousFetchingActive = true;\n      this.recreateAdController();\n      return false;\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        this.analyticsContext\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        this.analyticsContext\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        generatePodVastUrl: (base, breakDurationMs) => this.generatePodVastUrl(base, breakDurationMs)\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  generatePodVastUrl(baseUrl, breakDurationMs) {\n    const podParams = this.adConfig.resolvePodParams(breakDurationMs);\n    return this.adConfig.generatePodVastUrl(\n      baseUrl,\n      podParams,\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 }, buildAnalyticsContext(this.config)).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 optimizedPods = !!this.config.optimizedPods;\n    const breakDurationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : void 0;\n    const generatedUrls = optimizedPods ? [this.generatePodVastUrl(baseVastUrl, breakDurationMs)] : 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 }, buildAnalyticsContext(this.config)).catch(() => {\n    });\n    if (this.debug) {\n      console.log(\"[PREFETCH] Starting ad prefetch for upcoming ad break\");\n      console.log(\n        `[PREFETCH] Pre-generated ${generatedUrls.length} ${optimizedPods ? \"pod\" : \"VAST\"} URL(s)`\n      );\n    }\n    if (optimizedPods) {\n      if (this.debug) {\n        console.log(\"[PREFETCH] Optimized pods enabled - skipping single-ad preload pool\");\n      }\n      return;\n    }\n    this.preloadPool.startPreloadPool(baseVastUrl, generatedUrls.slice(0, 1), false);\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  VMAP time-based ad breaks\n  // ───────────────────────────────────────────────────────────────\n  onTimeUpdate(currentTimeSec) {\n    if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n    if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n    const nowMs = currentTimeSec * 1e3;\n    const breakToPlay = this.adConfig.findBreakForTime(nowMs);\n    if (breakToPlay) {\n      void this.handleVmapAdBreak(breakToPlay, nowMs).catch((error) => {\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP ad break failed gracefully:\", error);\n        }\n      });\n    }\n  }\n  onVideoEnded() {\n    if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n    if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n    const durationMs = Number.isFinite(this.video.duration) ? Math.floor(this.video.duration * 1e3) : 0;\n    const postroll = this.adConfig.vmapBreaks.find(\n      (b) => b.startTimeMs === -1 && !this.adConfig.consumedVmapBreakIds.has(this.adConfig.getAdBreakKey(b))\n    );\n    if (postroll) {\n      void this.handleVmapAdBreak(postroll, durationMs).catch((error) => {\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP post-roll failed gracefully:\", error);\n        }\n      });\n    }\n  }\n  async handleVmapAdBreak(adBreak, nowMs) {\n    const key = this.adConfig.getAdBreakKey(adBreak);\n    if (this.adConfig.consumedVmapBreakIds.has(key)) return;\n    const breakStartMs = this.adConfig.resolveBreakStartMs(adBreak);\n    if (breakStartMs == null) return;\n    const durationMs = adBreak.durationMs ?? 0;\n    const endMs = breakStartMs + durationMs;\n    const inWindow = durationMs > 0 ? nowMs >= breakStartMs && nowMs < endMs : nowMs >= breakStartMs;\n    if (inWindow) {\n      this.adConfig.consumedVmapBreakIds.add(key);\n      const tags = this.adConfig.selectVastTagsForBreak(adBreak);\n      if (!tags || tags.length === 0) return;\n      const first = tags[0];\n      const rest = tags.slice(1);\n      this.adBreak.adPodQueue = rest;\n      this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n      this.adBreak.showAds = true;\n      this.adBreak.inAdBreak = true;\n      this.timing.currentAdBreakStartWallClockMs = Date.now();\n      try {\n        await this.adBreak.playSingleAd(first);\n      } catch (error) {\n        this.adBreak.adPodQueue = [];\n        this.adBreak.inAdBreak = false;\n        this.adBreak.showAds = false;\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP ad request failed:\", error);\n        }\n      }\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Public API\n  // ───────────────────────────────────────────────────────────────\n  getCurrentAdIndex() {\n    return this.timing.currentAdIndex;\n  }\n  getTotalAdsInBreak() {\n    return this.timing.totalAdsInBreak;\n  }\n  getAdRemainingMs() {\n    return this.timing.getRemainingAdMs();\n  }\n  isAdPlaying() {\n    return this.adBreak.inAdBreak && this.adPlayer.isAdPlaying();\n  }\n  isShowingAds() {\n    return this.adBreak.showAds;\n  }\n  getStreamType() {\n    const url = this.config.src.toLowerCase();\n    if (url.includes(\".m3u8\") || url.includes(\"/hls/\") || url.includes(\"application/vnd.apple.mpegurl\")) {\n      return \"hls\";\n    }\n    return \"other\";\n  }\n  shouldShowNativeControls() {\n    const streamType = this.getStreamType();\n    if (streamType === \"other\") {\n      return !(this.config.showCustomControls ?? false);\n    }\n    return !!(this.config.allowNativeHls && !(this.config.showCustomControls ?? false));\n  }\n  isLive() {\n    return this.hlsEngine.isLiveStream;\n  }\n  get videoElement() {\n    return this.video;\n  }\n  toggleMute() {\n    toggleMute(this.video, this.adPlayer, this.debug);\n  }\n  toggleFullscreen() {\n    return toggleFullscreen(this.video, this.debug);\n  }\n  isMuted() {\n    return isMuted(this.video, this.adPlayer);\n  }\n  setMuted(muted) {\n    setMuted(this.video, this.adPlayer, muted, this.debug);\n  }\n  setVolume(volume) {\n    setVolume(this.video, this.adPlayer, volume, this.debug);\n  }\n  getVolume() {\n    return getVolume(this.video, this.adPlayer);\n  }\n  isFullscreen() {\n    return isFullscreen();\n  }\n  resize() {\n    resizePlayer(this.video, this.adPlayer, this.debug);\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Destroy\n  // ───────────────────────────────────────────────────────────────\n  destroy() {\n    this.adBreak.stopContinuousFetching();\n    this.preloadPool.stop();\n    this.timing.destroy();\n    this.adBreak.clearPendingAdBreak();\n    this.placeholder.destroy();\n    if (this.timeUpdateHandler) {\n      this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n      delete this.timeUpdateHandler;\n    }\n    if (this.endedHandler) {\n      this.video.removeEventListener(\"ended\", this.endedHandler);\n      delete this.endedHandler;\n    }\n    if (this.emptiedHandler) {\n      this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n      delete this.emptiedHandler;\n    }\n    this.adConfig.destroyTracking();\n    this.hlsEngine.destroy();\n    this.adPlayer?.destroy();\n    if (this.palPlaybackStarted) {\n      this.palPlaybackStarted = false;\n      this.palNonce.sendPlaybackEnd();\n    }\n    this.palNonce.reset();\n    this.adBreak.adRequestQueue = [];\n    this.timing.consecutiveFailures = 0;\n  }\n};\n\n// src/patterns.ts\nvar HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nvar HLS_PATHS = /\\/hls\\//i;\nvar DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nvar VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nvar AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\nvar canPlay = {\n  hls: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n  },\n  dash: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return DASH_EXTENSIONS.test(url);\n  },\n  video: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return VIDEO_EXTENSIONS.test(url);\n  },\n  audio: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return AUDIO_EXTENSIONS.test(url);\n  },\n  file: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n  }\n};\n\n// src/players/HlsPlayer.tsx\nvar HlsPlayer = class extends import_react.Component {\n  constructor() {\n    super(...arguments);\n    this.player = null;\n    this.mounted = false;\n    this.load = async () => {\n      if (!this.props.videoElement || !this.props.src) return;\n      try {\n        if (this.player) {\n          this.player.destroy();\n          this.player = null;\n        }\n        const config = {\n          src: this.props.src,\n          videoElement: this.props.videoElement\n        };\n        if (this.props.autoplay !== void 0)\n          config.autoplay = this.props.autoplay;\n        if (this.props.muted !== void 0) config.muted = this.props.muted;\n        if (this.props.lowLatencyMode !== void 0)\n          config.lowLatencyMode = this.props.lowLatencyMode;\n        if (this.props.allowNativeHls !== void 0)\n          config.allowNativeHls = this.props.allowNativeHls;\n        if (this.props.isLiveStream !== void 0)\n          config.isLiveStream = this.props.isLiveStream;\n        if (this.props.driftToleranceMs !== void 0)\n          config.driftToleranceMs = this.props.driftToleranceMs;\n        if (this.props.immediateManifestAds !== void 0)\n          config.immediateManifestAds = this.props.immediateManifestAds;\n        if (this.props.debugAdTiming !== void 0)\n          config.debugAdTiming = this.props.debugAdTiming;\n        if (this.props.showCustomControls !== void 0)\n          config.showCustomControls = this.props.showCustomControls;\n        if (this.props.onVolumeToggle !== void 0)\n          config.onVolumeToggle = this.props.onVolumeToggle;\n        if (this.props.onFullscreenToggle !== void 0)\n          config.onFullscreenToggle = this.props.onFullscreenToggle;\n        if (this.props.onControlClick !== void 0)\n          config.onControlClick = this.props.onControlClick;\n        if (this.props.licenseKey !== void 0)\n          config.licenseKey = this.props.licenseKey;\n        if (this.props.adFailsafeTimeoutMs !== void 0)\n          config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n        if (this.props.minSegmentsBeforePlay !== void 0)\n          config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n        if (this.props.ctvAdRequest !== void 0)\n          config.ctvAdRequest = this.props.ctvAdRequest;\n        this.player = new StormcloudVideoPlayer(config);\n        this.props.onMount?.(this);\n        await this.player.load();\n        if (this.mounted) {\n          this.props.onReady?.();\n        }\n      } catch (error) {\n        if (this.mounted) {\n          this.props.onError?.(error);\n        }\n      }\n    };\n    this.play = () => {\n      if (this.props.videoElement) {\n        const video = this.props.videoElement;\n        const hasValidSource = video.src || video.currentSrc && video.currentSrc !== \"\" || video.readyState >= 1;\n        if (hasValidSource) {\n          video.play()?.catch((error) => {\n            console.error(\"[HlsPlayer] Failed to play:\", error);\n            this.props.onError?.(error);\n          });\n          this.props.onPlay?.();\n        } else {\n          console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n        }\n      }\n    };\n    this.pause = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.pause();\n        this.props.onPause?.();\n      }\n    };\n    this.stop = () => {\n      this.pause();\n      if (this.props.videoElement) {\n        this.props.videoElement.currentTime = 0;\n      }\n    };\n    this.seekTo = (seconds, keepPlaying) => {\n      if (this.props.videoElement) {\n        this.props.videoElement.currentTime = seconds;\n        if (!keepPlaying) {\n          this.pause();\n        }\n      }\n    };\n    this.setVolume = (volume) => {\n      if (this.props.videoElement) {\n        this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n      }\n    };\n    this.mute = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.muted = true;\n      }\n    };\n    this.unmute = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.muted = false;\n      }\n    };\n    this.setPlaybackRate = (rate) => {\n      if (this.props.videoElement && rate > 0) {\n        this.props.videoElement.playbackRate = rate;\n      }\n    };\n    this.getDuration = () => {\n      if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n        return this.props.videoElement.duration;\n      }\n      return null;\n    };\n    this.getCurrentTime = () => {\n      if (this.props.videoElement && isFinite(this.props.videoElement.currentTime)) {\n        return this.props.videoElement.currentTime;\n      }\n      return null;\n    };\n    this.getSecondsLoaded = () => {\n      if (this.props.videoElement && this.props.videoElement.buffered.length > 0) {\n        return this.props.videoElement.buffered.end(\n          this.props.videoElement.buffered.length - 1\n        );\n      }\n      return null;\n    };\n    this.getInternalPlayer = (key = \"player\") => {\n      if (key === \"player\") return this.player;\n      if (key === \"video\") return this.props.videoElement;\n      if (key === \"hls\" && this.player) return this.player.hls;\n      return null;\n    };\n  }\n  componentDidMount() {\n    this.mounted = true;\n    this.load();\n  }\n  componentWillUnmount() {\n    this.mounted = false;\n    if (this.player) {\n      this.player.destroy();\n      this.player = null;\n    }\n  }\n  componentDidUpdate(prevProps) {\n    if (prevProps.src !== this.props.src) {\n      this.load();\n    }\n  }\n  render() {\n    return null;\n  }\n};\nHlsPlayer.displayName = \"HlsPlayer\";\nHlsPlayer.canPlay = canPlay.hls;\n","import { Component } from \"react\";\nimport { StormcloudVideoPlayer } from \"../player/StormcloudVideoPlayer\";\nimport type { StormcloudVideoPlayerConfig } from \"../types\";\nimport { canPlay } from \"../patterns\";\n\nexport interface HlsPlayerProps extends StormcloudVideoPlayerConfig {\n  onMount?: (player: any) => void;\n  onReady?: () => void;\n  onPlay?: () => void;\n  onPause?: () => void;\n  onEnded?: () => void;\n  onLoaded?: () => void;\n  onError?: (error: any) => void;\n}\n\nexport default class HlsPlayer extends Component<HlsPlayerProps> {\n  static displayName = \"HlsPlayer\";\n\n  static canPlay = canPlay.hls;\n\n  private player: StormcloudVideoPlayer | null = null;\n  private mounted = false;\n\n  componentDidMount() {\n    this.mounted = true;\n    this.load();\n  }\n\n  componentWillUnmount() {\n    this.mounted = false;\n    if (this.player) {\n      this.player.destroy();\n      this.player = null;\n    }\n  }\n\n  componentDidUpdate(prevProps: HlsPlayerProps) {\n    if (prevProps.src !== this.props.src) {\n      this.load();\n    }\n  }\n\n  load = async () => {\n    if (!this.props.videoElement || !this.props.src) return;\n\n    try {\n      if (this.player) {\n        this.player.destroy();\n        this.player = null;\n      }\n\n      const config: StormcloudVideoPlayerConfig = {\n        src: this.props.src,\n        videoElement: this.props.videoElement,\n      };\n\n      if (this.props.autoplay !== undefined)\n        config.autoplay = this.props.autoplay;\n      if (this.props.muted !== undefined) config.muted = this.props.muted;\n      if (this.props.lowLatencyMode !== undefined)\n        config.lowLatencyMode = this.props.lowLatencyMode;\n      if (this.props.allowNativeHls !== undefined)\n        config.allowNativeHls = this.props.allowNativeHls;\n      if (this.props.isLiveStream !== undefined)\n        config.isLiveStream = this.props.isLiveStream;\n      if (this.props.driftToleranceMs !== undefined)\n        config.driftToleranceMs = this.props.driftToleranceMs;\n      if (this.props.immediateManifestAds !== undefined)\n        config.immediateManifestAds = this.props.immediateManifestAds;\n      if (this.props.debugAdTiming !== undefined)\n        config.debugAdTiming = this.props.debugAdTiming;\n      if (this.props.showCustomControls !== undefined)\n        config.showCustomControls = this.props.showCustomControls;\n      if (this.props.onVolumeToggle !== undefined)\n        config.onVolumeToggle = this.props.onVolumeToggle;\n      if (this.props.onFullscreenToggle !== undefined)\n        config.onFullscreenToggle = this.props.onFullscreenToggle;\n      if (this.props.onControlClick !== undefined)\n        config.onControlClick = this.props.onControlClick;\n      if (this.props.licenseKey !== undefined)\n        config.licenseKey = this.props.licenseKey;\n      if (this.props.adFailsafeTimeoutMs !== undefined)\n        config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n      if (this.props.minSegmentsBeforePlay !== undefined)\n        config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n      if (this.props.ctvAdRequest !== undefined)\n        config.ctvAdRequest = this.props.ctvAdRequest;\n\n      this.player = new StormcloudVideoPlayer(config);\n\n      this.props.onMount?.(this);\n\n      await this.player.load();\n\n      if (this.mounted) {\n        this.props.onReady?.();\n      }\n    } catch (error) {\n      if (this.mounted) {\n        this.props.onError?.(error);\n      }\n    }\n  };\n\n  play = () => {\n    if (this.props.videoElement) {\n      const video = this.props.videoElement;\n      const hasValidSource =\n        video.src ||\n        (video.currentSrc && video.currentSrc !== \"\") ||\n        video.readyState >= 1;\n\n      if (hasValidSource) {\n        video.play()?.catch((error) => {\n          console.error(\"[HlsPlayer] Failed to play:\", error);\n          this.props.onError?.(error);\n        });\n        this.props.onPlay?.();\n      } else {\n        console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n      }\n    }\n  };\n\n  pause = () => {\n    if (this.props.videoElement) {\n      this.props.videoElement.pause();\n      this.props.onPause?.();\n    }\n  };\n\n  stop = () => {\n    this.pause();\n    if (this.props.videoElement) {\n      this.props.videoElement.currentTime = 0;\n    }\n  };\n\n  seekTo = (seconds: number, keepPlaying?: boolean) => {\n    if (this.props.videoElement) {\n      this.props.videoElement.currentTime = seconds;\n      if (!keepPlaying) {\n        this.pause();\n      }\n    }\n  };\n\n  setVolume = (volume: number) => {\n    if (this.props.videoElement) {\n      this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n    }\n  };\n\n  mute = () => {\n    if (this.props.videoElement) {\n      this.props.videoElement.muted = true;\n    }\n  };\n\n  unmute = () => {\n    if (this.props.videoElement) {\n      this.props.videoElement.muted = false;\n    }\n  };\n\n  setPlaybackRate = (rate: number) => {\n    if (this.props.videoElement && rate > 0) {\n      this.props.videoElement.playbackRate = rate;\n    }\n  };\n\n  getDuration = (): number | null => {\n    if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n      return this.props.videoElement.duration;\n    }\n    return null;\n  };\n\n  getCurrentTime = (): number | null => {\n    if (\n      this.props.videoElement &&\n      isFinite(this.props.videoElement.currentTime)\n    ) {\n      return this.props.videoElement.currentTime;\n    }\n    return null;\n  };\n\n  getSecondsLoaded = (): number | null => {\n    if (\n      this.props.videoElement &&\n      this.props.videoElement.buffered.length > 0\n    ) {\n      return this.props.videoElement.buffered.end(\n        this.props.videoElement.buffered.length - 1\n      );\n    }\n    return null;\n  };\n\n  getInternalPlayer = (key = \"player\") => {\n    if (key === \"player\") return this.player;\n    if (key === \"video\") return this.props.videoElement;\n    if (key === \"hls\" && this.player) return (this.player as any).hls;\n    return null;\n  };\n\n  render() {\n    return null;\n  }\n}\n","import type { AdController } from \"../types\";\nimport Hls from \"hls.js\";\n\ninterface VastMediaFile {\n  url: string;\n  type: string;\n  width: number;\n  height: number;\n  bitrate?: number | undefined;\n}\n\ninterface VastTrackingUrls {\n  impression: string[];\n  start: string[];\n  firstQuartile: string[];\n  midpoint: string[];\n  thirdQuartile: string[];\n  complete: string[];\n  mute: string[];\n  unmute: string[];\n  pause: string[];\n  resume: string[];\n  fullscreen: string[];\n  exitFullscreen: string[];\n  skip: string[];\n  error: string[];\n}\n\ninterface VastAd {\n  id: string;\n  title: string;\n  duration: number;\n  mediaFiles: VastMediaFile[];\n  trackingUrls: VastTrackingUrls;\n  clickThrough?: string | undefined;\n}\n\ntype VastParseResult =\n  | { type: \"inline\"; ad: VastAd }\n  | {\n      type: \"wrapper\";\n      vastAdTagUri: string;\n      trackingUrls: VastTrackingUrls;\n      clickThrough?: string | undefined;\n    }\n  | { type: \"empty\" };\n\nconst MAX_VAST_WRAPPER_DEPTH = 5;\n\nexport function createHlsAdPlayer(\n  contentVideo: HTMLVideoElement,\n  options?: {\n    continueLiveStreamDuringAds?: boolean;\n    licenseKey?: string;\n    mainHlsInstance?: Hls;\n  }\n): AdController {\n  let adPlaying = false;\n  let originalMutedState = false;\n  let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n  const listeners = new Map<string, Set<(payload?: any) => void>>();\n  const licenseKey = options?.licenseKey;\n  const mainHlsInstance = options?.mainHlsInstance;\n\n  let adVideoElement: HTMLVideoElement | undefined;\n  let adHls: Hls | undefined;\n  let adContainerEl: HTMLDivElement | undefined;\n  let currentAd: VastAd | undefined;\n  let podAds: VastAd[] = [];\n  let podIndex = 0;\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(scope: Document | Element): VastTrackingUrls {\n    const trackingUrls = createEmptyTrackingUrls();\n\n    scope.querySelectorAll(\"Impression\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.impression.push(url);\n    });\n\n    scope.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    scope.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  function parseAdElement(adElement: Element): VastParseResult {\n    try {\n      const adId = adElement.getAttribute(\"id\") || \"unknown\";\n      const title = adElement.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n\n      const clickThrough = adElement\n        .querySelector(\"ClickThrough\")\n        ?.textContent?.trim();\n\n      const wrapperUri = adElement\n        .querySelector(\"VASTAdTagURI\")\n        ?.textContent?.trim();\n      if (wrapperUri) {\n        return {\n          type: \"wrapper\",\n          vastAdTagUri: wrapperUri,\n          trackingUrls: extractTrackingUrls(adElement),\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        adElement.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 = adElement.querySelectorAll(\"MediaFile\");\n      const mediaFiles: VastMediaFile[] = [];\n\n      mediaFileElements.forEach((mf) => {\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        if (!url) return;\n\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : undefined;\n\n        const mediaFile: VastMediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : undefined,\n        };\n\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n        }\n      });\n\n      if (mediaFiles.length === 0) {\n        if (isNoAdAvailable) {\n          console.warn(\n            \"[HlsAdPlayer] Pod <Ad> indicates no ad available\"\n          );\n        } else {\n          console.warn(\"[HlsAdPlayer] No supported media files in pod <Ad>\");\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(adElement),\n          clickThrough,\n        },\n      };\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Error parsing pod <Ad> element:\", 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  async function fetchAndParsePod(vastTagUrl: string): Promise<VastAd[]> {\n    const vastXml = await fetchVastXml(vastTagUrl);\n    console.log(\"[HlsAdPlayer] Pod VAST XML received\");\n\n    const parser = new DOMParser();\n    const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n\n    if (xmlDoc.querySelector(\"parsererror\")) {\n      console.error(\"[HlsAdPlayer] Pod VAST XML parsing error (malformed)\");\n      return [];\n    }\n\n    const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n    if (adElements.length === 0) {\n      console.warn(\"[HlsAdPlayer] No <Ad> elements found in pod VAST response\");\n      return [];\n    }\n\n    adElements.sort((a, b) => {\n      const aSeq = parseInt(a.getAttribute(\"sequence\") || \"\", 10);\n      const bSeq = parseInt(b.getAttribute(\"sequence\") || \"\", 10);\n      const aVal = Number.isFinite(aSeq) ? aSeq : Number.MAX_SAFE_INTEGER;\n      const bVal = Number.isFinite(bSeq) ? bSeq : Number.MAX_SAFE_INTEGER;\n      return aVal - bVal;\n    });\n\n    const ads: VastAd[] = [];\n    for (const adElement of adElements) {\n      const parsed = parseAdElement(adElement);\n\n      if (parsed.type === \"inline\") {\n        ads.push(parsed.ad);\n      } else if (parsed.type === \"wrapper\") {\n        try {\n          const resolved = await fetchAndParseVastAd(\n            parsed.vastAdTagUri,\n            1,\n            parsed.trackingUrls\n          );\n          if (resolved) {\n            ads.push(resolved);\n          }\n        } catch (error) {\n          console.warn(\n            \"[HlsAdPlayer] Failed to resolve wrapper <Ad> in pod:\",\n            error\n          );\n        }\n      }\n    }\n\n    console.log(`[HlsAdPlayer] Parsed ${ads.length} ad(s) from pod VAST response`);\n    return ads;\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      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\n      }\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\n      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\n      }\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 resetQuartileTracking(preserveImpression: boolean): void {\n    trackingFired = {\n      impression: preserveImpression ? trackingFired.impression : false,\n      start: false,\n      firstQuartile: false,\n      midpoint: false,\n      thirdQuartile: false,\n      complete: false,\n    };\n  }\n\n  function loadCurrentAdMedia(): void {\n    if (!adVideoElement || !currentAd) {\n      throw new Error(\"No ad video element or ad to load\");\n    }\n\n    const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n    if (!mediaFile) {\n      throw new Error(\"No media file available for ad\");\n    }\n\n    const isHlsAd = isHlsMediaFile(mediaFile);\n    console.log(\n      `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad (pod ${podIndex + 1}/${podAds.length || 1}) 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 (\n      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\n  function advanceToNextPodAd(): boolean {\n    if (podIndex >= podAds.length - 1) {\n      return false;\n    }\n\n    podIndex++;\n    currentAd = podAds[podIndex];\n    resetQuartileTracking(false);\n\n    if (currentAd) {\n      fireTrackingPixels(currentAd.trackingUrls.impression);\n      trackingFired.impression = true;\n      console.log(\n        `[HlsAdPlayer] Advancing to next pod ad (${podIndex + 1}/${podAds.length}): ${currentAd.title}, duration: ${currentAd.duration}s`\n      );\n    }\n\n    try {\n      loadCurrentAdMedia();\n      emit(\"pod_ad_started\", { index: podIndex, total: podAds.length });\n      return true;\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Failed to load next pod ad:\", error);\n      return false;\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 ads: VastAd[] = [];\n\n        if (preloadedAds.has(vastTagUrl)) {\n          const preloaded = preloadedAds.get(vastTagUrl);\n          preloadedAds.delete(vastTagUrl);\n          if (preloaded) {\n            ads = [preloaded];\n          }\n          console.log(\n            \"[HlsAdPlayer] Using preloaded VAST response:\",\n            vastTagUrl\n          );\n        } else {\n          ads = await fetchAndParsePod(vastTagUrl);\n        }\n\n        if (!ads.length) {\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        podAds = ads;\n        podIndex = 0;\n        currentAd = ads[0];\n        console.log(\n          `[HlsAdPlayer] Pod parsed: ${ads.length} ad(s), first=\"${currentAd?.title}\", duration=${currentAd?.duration}s`\n        );\n\n        if (currentAd) {\n          fireTrackingPixels(currentAd.trackingUrls.impression);\n          trackingFired.impression = true;\n        }\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        resetQuartileTracking(true);\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        if (adContainerEl) {\n          adContainerEl.style.display = \"flex\";\n          adContainerEl.style.pointerEvents = \"auto\";\n        }\n\n        emit(\"content_pause\");\n\n        loadCurrentAdMedia();\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      podAds = [];\n      podIndex = 0;\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      podAds = [];\n      podIndex = 0;\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    getPodAdCount() {\n      return podAds.length;\n    },\n    getPodTotalDurationMs() {\n      return podAds.reduce(\n        (total, ad) => total + (ad.duration > 0 ? ad.duration * 1000 : 0),\n        0\n      );\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","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 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 = readPersistentId(storageKey);\n  if (existing) {\n    writePersistentId(storageKey, existing);\n    return existing;\n  }\n\n  const id = createUuid();\n  writePersistentId(storageKey, id);\n  return id;\n}\n\nfunction getOrCreateCtvSessionId(): string {\n  const existing = readPersistentId(CTV_SESSION_STORAGE_KEY);\n  if (existing) {\n    writePersistentId(CTV_SESSION_STORAGE_KEY, existing);\n    return existing;\n  }\n\n  const sessionId = createUuid();\n  writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);\n  return sessionId;\n}\n\nfunction readPersistentId(storageKey: string): string | undefined {\n  return readStoredString(storageKey) || readCookie(storageKey);\n}\n\nfunction writePersistentId(storageKey: string, value: string): void {\n  try {\n    window.localStorage?.setItem(storageKey, value);\n  } catch {}\n  writeCookie(storageKey, value);\n}\n\nconst PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5; // ~5 years\n\nfunction readCookie(name: string): string | undefined {\n  if (typeof document === \"undefined\") {\n    return undefined;\n  }\n\n  try {\n    const prefix = encodeURIComponent(name) + \"=\";\n    const parts = document.cookie ? document.cookie.split(\";\") : [];\n    for (const part of parts) {\n      const entry = part.trim();\n      if (entry.startsWith(prefix)) {\n        return decodeURIComponent(entry.slice(prefix.length)) || undefined;\n      }\n    }\n  } catch {}\n\n  return undefined;\n}\n\nfunction writeCookie(name: string, value: string): void {\n  if (typeof document === \"undefined\") {\n    return;\n  }\n\n  try {\n    document.cookie =\n      encodeURIComponent(name) +\n      \"=\" +\n      encodeURIComponent(value) +\n      \";path=/;max-age=\" +\n      PERSISTENT_ID_COOKIE_MAX_AGE +\n      \";SameSite=Lax\";\n  } catch {}\n}\n\nfunction createUuid(): string {\n  if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n    return crypto.randomUUID();\n  }\n\n  const bytes = new Uint8Array(16);\n  if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n    crypto.getRandomValues(bytes);\n  } else {\n    let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n    for (let i = 0; i < 16; i++) {\n      seed = (seed * 1103515245 + 12345) & 0x7fffffff;\n      bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 0xff;\n    }\n  }\n\n  bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40;\n  bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;\n\n  let hex = \"\";\n  for (let i = 0; i < 16; i++) {\n    hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n  }\n\n  return (\n    hex.slice(0, 8) +\n    \"-\" +\n    hex.slice(8, 12) +\n    \"-\" +\n    hex.slice(12, 16) +\n    \"-\" +\n    hex.slice(16, 20) +\n    \"-\" +\n    hex.slice(20, 32)\n  );\n}\n\nfunction performanceNow(): number {\n  try {\n    if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n      return performance.now();\n    }\n  } catch {}\n  return 0;\n}\n\nfunction readPlatformNativeDeviceId(): {\n  deviceId?: string;\n  deviceIdType?: string;\n  limitAdTracking?: boolean;\n} {\n  if (typeof window === \"undefined\") return {};\n\n  try {\n    const adinfo = (window as any).webapis?.adinfo;\n    if (adinfo) {\n      const tifa: unknown =\n        typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n      if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n        const lat: unknown =\n          typeof adinfo.isLATEnabled === \"function\"\n            ? adinfo.isLATEnabled()\n            : undefined;\n        return {\n          deviceId: tifa,\n          deviceIdType: \"tifa\",\n          ...(typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}),\n        };\n      }\n    }\n  } catch {}\n\n  try {\n    const webOSDev = (window as any).webOSDev;\n    if (webOSDev) {\n      const lgudid: unknown =\n        typeof webOSDev.LGUDID === \"function\"\n          ? webOSDev.LGUDID()\n          : webOSDev.lgudid ?? webOSDev.LGUDID;\n      if (typeof lgudid === \"string\" && lgudid) {\n        if (isZeroedAdId(lgudid)) {\n          return { deviceIdType: \"lgudid\", limitAdTracking: true };\n        }\n        if (!isMacroPlaceholder(lgudid)) {\n          return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n        }\n      }\n    }\n  } catch {}\n\n  try {\n    const roku = (window as any).Roku;\n    if (roku) {\n      const rida: unknown =\n        typeof roku.getPublisherUniqueId === \"function\"\n          ? roku.getPublisherUniqueId()\n          : roku.rida;\n      if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n        return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n      }\n    }\n  } catch {}\n\n  return {};\n}\n\nconst ZEROED_AD_ID_PATTERNS: ReadonlySet<string> = new Set([\n  \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n  \"00000000-0000-0000-0000-000000000000\",\n]);\n\nfunction isMacroPlaceholder(value: string): boolean {\n  const t = value.trim();\n  return !t ||\n    /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) ||\n    /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) ||\n    ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\n\nfunction isZeroedAdId(value: string): boolean {\n  return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\n\nfunction readNativeBridgeSignals(): {\n  contentUrl?: string;\n  appId?: string;\n  appName?: string;\n  deviceId?: string;\n  deviceIdType?: string;\n  limitAdTracking?: boolean;\n} {\n  if (typeof window === \"undefined\") {\n    return {};\n  }\n\n  const candidates = [\n    (window as any).__STORMCLOUD_CTV_AD_INFO__,\n    (window as any).__STORMCLOUD_CTV__,\n    (window as any).stormcloudCtv,\n    (window as any).AiryTV,\n    (window as any).Android,\n    (window as any).webOS,\n    (window as any).tizen,\n    (window as any).amazon,\n  ].filter(Boolean);\n\n  for (const source of candidates) {\n    const contentUrl =\n      readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) ||\n      undefined;\n    const appId =\n      readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) ||\n      undefined;\n    const appName =\n      readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || undefined;\n    const deviceId =\n      readBridgeValue(source, [\n        \"rdid\",\n        \"ifa\",\n        \"advertisingId\",\n        \"adId\",\n        \"deviceId\",\n        \"lgudid\",\n        \"LGUDID\",\n        \"tifa\",\n        \"rida\",\n        \"afai\",\n        \"aaid\",\n      ]) || undefined;\n\n    if (!contentUrl && !deviceId && !appId && !appName) continue;\n\n    const deviceIdType =\n      readBridgeValue(source, [\n        \"idtype\",\n        \"deviceIdType\",\n        \"advertisingIdType\",\n        \"idType\",\n      ]) || inferDeviceIdType();\n    const limitAdTracking = readBridgeBoolean(source, [\n      \"is_lat\",\n      \"limitAdTracking\",\n      \"limitedAdTracking\",\n      \"lat\",\n    ]);\n\n    return {\n      ...(contentUrl ? { contentUrl } : {}),\n      ...(appId ? { appId } : {}),\n      ...(appName ? { appName } : {}),\n      ...(deviceId ? { deviceId } : {}),\n      ...(deviceId && deviceIdType ? { deviceIdType } : {}),\n      ...(deviceId && limitAdTracking != null ? { limitAdTracking } : {}),\n    };\n  }\n\n  return {};\n}\n\nfunction readBridgeValue(source: any, keys: string[]): string | undefined {\n  for (const key of keys) {\n    const value = source?.[key];\n    if (typeof value === \"string\" && value) {\n      return value;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = value.call(source);\n        if (typeof result === \"string\" && result) {\n          return result;\n        }\n      } catch {}\n    }\n  }\n  return undefined;\n}\n\nfunction readBridgeBoolean(source: any, keys: string[]): boolean | undefined {\n  for (const key of keys) {\n    const value = source?.[key];\n    const normalized = normalizeBoolean(value);\n    if (normalized != null) {\n      return normalized;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = normalizeBoolean(value.call(source));\n        if (result != null) {\n          return result;\n        }\n      } catch {}\n    }\n  }\n  return undefined;\n}\n\nfunction readStoredDeviceId(): string | undefined {\n  for (const key of DEVICE_ID_STORAGE_KEYS) {\n    const value = readStoredString(key);\n    if (value) {\n      return value;\n    }\n  }\n  return undefined;\n}\n\nfunction readStoredString(key: string): string | undefined {\n  if (typeof window === \"undefined\") {\n    return undefined;\n  }\n\n  try {\n    const value = window.localStorage?.getItem(key);\n    return value || undefined;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction readStoredLimitAdTracking(): boolean | undefined {\n  return normalizeBoolean(\n    readStoredString(\"limitAdTracking\") ||\n      readStoredString(\"limitedAdTracking\") ||\n      readStoredString(\"is_lat\")\n  );\n}\n\nfunction normalizeBoolean(value: unknown): boolean | undefined {\n  if (typeof value === \"boolean\") {\n    return value;\n  }\n  if (typeof value === \"number\") {\n    return value === 1;\n  }\n  if (typeof value === \"string\") {\n    const normalized = value.toLowerCase();\n    if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n      return true;\n    }\n    if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n      return false;\n    }\n  }\n  return undefined;\n}\n","import type {\n  ClientInfo,\n  AdDetectInfo,\n  AdLoadedInfo,\n  AdImpressionInfo,\n  PlayerAnalyticsContext,\n  StormcloudVideoPlayerConfig,\n} from \"../types\";\n\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 buildAnalyticsContext(\n  config: Pick<StormcloudVideoPlayerConfig, \"debugAdTiming\" | \"isLiveStream\">\n): PlayerAnalyticsContext {\n  const context: PlayerAnalyticsContext = {};\n  if (config.debugAdTiming) {\n    context.debugAdTiming = true;\n  }\n  if (config.isLiveStream !== undefined) {\n    context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n  }\n  return context;\n}\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\n  const debugAdTiming = !!context.debugAdTiming;\n  if (debugAdTiming) {\n    console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n  }\n\n  const playerId = await getBrowserID(clientInfo);\n\n  if (debugAdTiming) {\n    console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n  }\n\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  podMaxAds?: number | undefined;\n  podMinDurationMs?: number | undefined;\n  podMaxDurationMs?: 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\n  const optimizedPodMode =\n    ctx.podMaxAds != null ||\n    ctx.podMinDurationMs != null ||\n    ctx.podMaxDurationMs != null;\n\n  if (optimizedPodMode) {\n    params.delete(\"ppos\");\n    params.delete(\"lip\");\n    if (ctx.podMinDurationMs != null) {\n      params.set(\"pmnd\", String(Math.max(0, Math.round(ctx.podMinDurationMs))));\n    }\n    if (ctx.podMaxDurationMs != null) {\n      params.set(\"pmxd\", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));\n    }\n    if (ctx.podMaxAds != null) {\n      params.set(\"pmad\", String(Math.max(1, Math.round(ctx.podMaxAds))));\n    }\n  } else 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 {\n  buildAnalyticsContext,\n  sendHeartbeat,\n  sendInitialTracking,\n} 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  private readonly defaultPodMaxAds: number = 6;\n\n  resolvePodParams(breakDurationMs?: number): {\n    maxAds: number;\n    minDurationMs: number;\n    maxDurationMs: number | undefined;\n  } {\n    const maxDurationMs =\n      breakDurationMs != null && breakDurationMs > 0\n        ? breakDurationMs\n        : this.config.podMaxDurationMs;\n\n    const maxAds =\n      this.config.podMaxAds && this.config.podMaxAds > 0\n        ? this.config.podMaxAds\n        : this.apiNumberAds && this.apiNumberAds > 0\n          ? this.apiNumberAds\n          : this.defaultPodMaxAds;\n\n    const minDurationMs =\n      this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;\n\n    return { maxAds, minDurationMs, maxDurationMs };\n  }\n\n  generatePodVastUrl(\n    baseUrl: string,\n    podParams: { maxAds: number; minDurationMs: number; maxDurationMs: number | undefined },\n    adPlayer: AdController,\n    palNonce: PalNonceManager,\n    inAdBreak: boolean\n  ): string {\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      podMaxAds: podParams.maxAds,\n      podMinDurationMs: podParams.minDurationMs,\n      podMaxDurationMs: podParams.maxDurationMs,\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 optimized-pod request URL (pod=${this.podCounter}, pmad=${podParams.maxAds}, pmnd=${podParams.minDurationMs}, pmxd=${podParams.maxDurationMs ?? \"?\"}):`,\n      finalUrl\n    );\n    return finalUrl;\n  }\n\n  // --- Tracking ---\n\n  initializeTracking(): void {\n    sendInitialTracking(this.config.licenseKey, buildAnalyticsContext(this.config))\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, buildAnalyticsContext(this.config)).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  notePodAdStarted(): void {\n    this.currentAdIndex++;\n    this.totalAdsInBreak = this.currentAdIndex;\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"]}