{"version":3,"sources":["prebid.js","iiq.js","pricing.js","https://adncdn.net/0"],"names":["window","document","URL_PATHS_BLACKLIST","Object","freeze","adsConfig","id","size","position","isLazyLoaded","refreshIteration","sizeMapping","desktop","tablet","mobile","refreshTime","biddersWhiteList","appnexus","magnite","msft","pubmatic","rubicon","openx","unruly","country","adagio","adyoulike","amx","anyclip","contxtful","conversant","criteo","exco","fluct","gamoshi","ix","kueezrtb","medianet","oms","onetag","pixfuture","programmaticx","richaudience","rise","seedtag","sharethrough","smartadserver","smilewanted","sovrn","sparteo","ssp_geniee","teads","underdogmedia","vidazoo","yandex","getCountry","bidders","filter","bidder","name","toLowerCase","replace","includes","bidderSettings","storageAllowed","adnimation","sonobi","taboola","bidderNames","endsWith","map","s2sBidders","s2sAliases","fromEntries","slice","GDPR_GEOS","needsGdpr","async","maxMs","Promise","resolve","start","Date","now","check","__tcfapi","setTimeout","isGdprRequired","pbjsConfig","s2sConfig","enabled","accountId","endpoint","syncEndpoint","timeout","extPrebid","aliases","priceGranularity","currency","adServerCurrency","conversionRateFile","defaultRates","USD","EUR","ratesTTL","floors","enforcement","enforceJS","enforcePBS","floorDeals","bidAdjustment","data","skipRate","schema","fields","values","banner","native","video","default","gvlMapping","amxS2S","magniteS2S","riseS2S","kueezrtbS2S","adagioS2S","consentManagement","gdpr","cmpApi","defaultGdprScope","actionTimeout","usp","useBidCache","schain","validation","config","ver","complete","nodes","asi","sid","hp","userSync","iframeEnabled","filterSettings","iframe","userIds","storage","type","expires","params","pid","partner","refreshInSeconds","detectMissingSizes","aliasSyncEnabled","auctionOptions","suppressStaleRender","version","customer","realTimeData","dataProviders","waitForIt","adServerTargeting","gtag","dataLayer","push","arguments","pbjs","que","googletag","cmd","pubads","addEventListener","onImpressionViewable","setConfig","collapseDiv","_taboola","GA_ID","PREBID_TIMEOUT_MS","createScript","src","preCreate","scriptEl","querySelector","console","warn","attemptLoad","createElement","fetchPriority","defer","remove","head","appendChild","pathname","location","some","path","isBlacklistedUrl","all","then","log","handleSlotRenderEnded","removeEventListener","IntentIqObject","intentIq_2072952453","adnpbjs","callback","main","timeoutInMillis","ABTestingConfigurationSource","manualWinReportEnabled","domainName","host","vrBrowserBlackList","gamParameterName","onEvent","reportExternalWin","biddingPlatformId","partnerAuctionId","auctionId","bidderCode","prebidAuctionId","cpm","originalCpm","originalCurrency","status","placementId","adUnitCode","err","error","initIiq","catch","setAttribute","adUnits","slotsMap","lazyLoader","constructor","margin","this","observer","IntersectionObserver","onIntersect","rootMargin","entries","forEach","entry","isIntersecting","cb","target","dataset","lazyCallback","unobserve","add","element","getBoundingClientRect","top","innerHeight","cbName","Math","random","toString","observe","activeSlotIds","newPbjsAdUnits","viewportType","screen","width","event","slot","slotId","getSlotElementId","adUnitPath","getAdUnitPath","adUnit","timeoutMs","adUnitToRefresh","getSlots","at","targeting","slotEl","getElementById","runBids","refresh","message","refreshAd","collectAds","length","adsEl","querySelectorAll","adPath","adpath","sizes","slotBidders","STANDARD_SIZES","prebidSizes","viewport","Array","isArray","standardSizes","every","w","h","isNative","sw","sh","hasOnlyStandardSizes","bids","code","mediaTypes","setBidderConfig","ortb2","source","ext","allSettled","e","createNativeCmd","onload","performance","mark","destroyNativeCmd","footerEl","innerHTML","createAd","slotName","addSize","build","defineSlot","defineSizeMapping","addService","intent_iq_group","pbjsAdUnit","find","addAdUnits","init","enableServices","display","getConfig","disableInitialLoad","createAdCmd","destroyAd","destroySlots","idx","indexOf","splice","removeAttribute","parentElement","destroyAdCmd","createInterstitial","createInterstitialCmd","getIpInfo","cached","localStorage","getItem","JSON","parse","url","res","fetch","ok","Error","ipInfo","json","setItem","stringify","removeItem","adn","createNative","destroyNative","onDomReady","callbacks","interval","setInterval","readyState","clearInterval","observeSlots","handleAdded","node","getAttribute","handleRemoved","isAdSlot","hasAttribute","nodeList","from","nodeType","Node","ELEMENT_NODE","flatMap","concat","MutationObserver","mutations","mutation","addedNodes","removedNodes","attributeName","isStyleChanged","oldStyle","oldValue","newStyle","isVisibilityChanged","style","getComputedStyle","isDisplayed","isVisible","visibility","subtree","childList","attributes","attributeFilter","attributeOldValue","defineOutOfPageSlot","enums","OutOfPageFormat","INTERSTITIAL","createAudioPlayer","customElementSelector","excludeSelectors","state","audio","fullText","currentBlobUrl","prefetchedAudioBlob","prefetchedBlobUrl","isPlaying","isLoading","isPrefetching","customSelector","handlers","canplay","timeupdate","selectedTheme","bg","border","text","subtext","fill","progress","progressFill","formatTime","s","floor","padStart","removeExcludedElements","container","clonedContainer","cloneNode","selector","elementsToRemove","extractText","useCustomSelector","isBadText","test","paragraphs","titleEl","subtitleEl","title","innerText","trim","subtitle","articleParagraphs","p","match","parts","articleText","join","extractArticleContent","script","textContent","articleBody","raw","headline","_","sel","el","div","offsetHeight","sort","a","b","processedContainer","ignorePatterns","lines","rx","fallbackText","Set","cleanup","handler","fn","pause","URL","revokeObjectURL","assign","updateIcon","iconEl","shadow","toggleBtn","icons","play","stop","loading","className","fetchAudio","response","method","headers","body","input","gender","pageUrl","href","clone","audioUrl","audioRes","blob","get","playAudio","wasPrefetched","audioBlob","finalAudioBlob","blobUrl","createObjectURL","Audio","preload","elements","duration","progressBar","currentTime","total","alert","percent","setupAudio","outerWrapper","cssText","wrapper","attachShadow","mode","shadowAdn","styles","titleText","playerHTML","before","createPlayerUI","shadowRoot","progressContainer","isDragging","seek","rect","clickX","clientX","left","percentage","min","max","newTime","enableSeeking","adSlot","onpage","logoLink","logo","append","createAdSlot","after","setSelector","addExcludeSelector","removeExcludeSelector","index","setExcludeSelectors","selectors","getExcludeSelectors","getExtractedText","prefetch","tempAudio","durationEl","VidDisplayAdUnit","textAlign","marginTop","marginBottom","minHeight","pElement","insertBefore","nextElementSibling","addVidDisplayAdUnits","SideBarAdUnit","addSideBarAdUnits","SideBarBottomAdUnit","addSideBarBottomAdUnits","innerWidth","right","height","zIndex","root","threshold","SideBarstickyBannerRight","divElement","scriptElement","lastDiv","insertAdjacentElement","injectTaboolaSidebar","stack"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5HA;ACAA;CCAA,eAAgBA,EAAQC,GAMtB,MAAMC,EAAsBC,OAAOC,OAAO,IAKpCC,EAAYF,OAAOC,OAAO,CAC9B,yCAA0C,CACxCE,GAAM,yCACNC,KAAQ,CACN,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,IAAK,IACN,CAAC,IAAK,IACN,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,KAAM,KACP,CAAC,KAAM,KACP,CAAC,KAAM,KACP,CAAC,KAAM,KACP,CAAC,KAAM,KACP,SAEFC,SAAY,MACZC,cAAgB,EAChBC,iBAAoB,EACpBC,YAAe,CACbC,QAAW,CACT,CAAC,IAAK,IACN,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,IAAK,KACN,CAAC,KAAM,KACP,CAAC,KAAM,KACP,CAAC,KAAM,KACP,CAAC,KAAM,KACP,CAAC,KAAM,KACP,SAEFC,OAAU,CACR,CAAC,IAAK,KAERC,OAAU,CACR,CAAC,IAAK,KACN,CAAC,IAAK,KA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","file":"hH3MwSEK","sourcesContent":[null,null,null,"(async function(window, document) {\n\n// ----------------------------------------------\n  // Configuration\n  // ----------------------------------------------\n\n  const URL_PATHS_BLACKLIST = Object.freeze([\n    // Add a list of URL paths to exclude 👇\n    // e.g. \"/path/to/page\"\n  ]);\n\n  const adsConfig = Object.freeze({\n    \"/339474670,87143780/PassportCruise/ATF\": {\n      \"id\": \"/339474670,87143780/PassportCruise/ATF\",\n      \"size\": [\n        [300, 250],\n        [336, 280],\n        [728, 90],\n        [970, 90],\n        [970, 250],\n        [990, 250],\n        [970, 250],\n        [1200, 250],\n        [1100, 250],\n        [1500, 250],\n        [1600, 250],\n        [1420, 210],\n        'fluid'\n      ],\n      \"position\": \"ATF\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [970, 90],\n          [970, 250],\n          [970, 250],\n          [990, 250],\n          [1200, 250],\n          [1100, 250],\n          [1500, 250],\n          [1600, 250],\n          [1420, 210],\n          'fluid'\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280],\n          [360, 360]\n        ]\n      },\n      \"refreshTime\": 15000\n    },\n    \"/339474670,87143780/PassportCruise/ATF_Article\": {\n      \"id\": \"/339474670,87143780/PassportCruise/ATF_Article\",\n      \"size\": [\n        [300, 250],\n        [336, 280],\n        [728, 90],\n        [970, 90]\n      ],\n      \"position\": \"ATF\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90],\n          [970, 90]\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280]\n        ]\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/Below_Article\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Below_Article\",\n      \"size\": [\n        [300, 250],\n        [336, 280],\n        [728, 90],\n        [970, 90],\n        [970, 250]\n      ],\n      \"position\": \"Other\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90],\n          [970, 90],\n          [970, 250]\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280]\n        ]\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/InContent\": {\n      \"id\": \"/339474670,87143780/PassportCruise/InContent\",\n      \"size\": [\n        [300, 250],\n        [336, 280],\n        [728, 90]\n      ],\n      \"position\": \"Content\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90],\n          [300, 250],\n          [336, 280]\n        ],\n        \"tablet\": [\n          [728, 90],\n          [300, 250],\n          [336, 280]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280]\n        ]\n      },\n      \"refreshTime\": 15000\n    },\n    \"/339474670,87143780/PassportCruise/MainBanner\": {\n      \"id\": \"/339474670,87143780/PassportCruise/MainBanner\",\n      \"size\": [\n        [300, 250],\n        [336, 280],\n        [360, 360],\n        [728, 90],\n        [970, 90],\n        [970, 250],\n        [1200, 260],\n        [1200, 600]\n      ],\n      \"position\": \"Other\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90],\n          [970, 90],\n          [970, 250],\n          [1200, 260],\n          [1200, 600]\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280],\n          [360, 360]\n        ]\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/Middle1\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Middle1\",\n      \"size\": [\n        [300, 250],\n        [336, 280],\n        [728, 90]\n      ],\n      \"position\": \"Content\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90]\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280]\n        ]\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/Middle3\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Middle3\",\n      \"size\": [\n        [300, 250],\n        [336, 280],\n        [728, 90]\n      ],\n      \"position\": \"Content\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90]\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280]\n        ]\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/Middle4\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Middle4\",\n      \"size\": [\n        [300, 250],\n        [336, 280],\n        [728, 90]\n      ],\n      \"position\": \"Content\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90]\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280]\n        ]\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/Middle5\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Middle5\",\n      \"size\": [\n        [728, 90]\n      ],\n      \"position\": \"Content\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90]\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": []\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/PassportCruise_Interstitial\": {\n      \"id\": \"/339474670,87143780/PassportCruise/PassportCruise_Interstitial\",\n      \"size\": [\n        [300, 250],\n        [320, 480],\n        [336, 280]\n      ],\n      \"position\": \"Other\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [],\n        \"tablet\": [\n          [320, 480]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280]\n        ]\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/PassportCruise_ReadAloud\": {\n      \"id\": \"/339474670,87143780/PassportCruise/PassportCruise_ReadAloud\",\n      \"size\": [\n        [320, 50],\n        [468, 60],\n        [728, 90]\n      ],\n      \"position\": \"Content\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90]\n        ],\n        \"tablet\": [\n          [468, 60],\n          [728, 90]\n        ],\n        \"mobile\": [\n          [320, 50]\n        ]\n      },\n      \"refreshTime\": 15000\n    },\n    \"/339474670,87143780/PassportCruise/Right_Sky\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Right_Sky\",\n      \"size\": [\n        [120, 600],\n        [160, 600]\n      ],\n      \"position\": \"Sticky\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [120, 600],\n          [160, 600]\n        ],\n        \"tablet\": [\n          [120, 600],\n        ],\n        \"mobile\": []\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/SectionHP\": {\n      \"id\": \"/339474670,87143780/PassportCruise/SectionHP\",\n      \"size\": [\n        [300, 250],\n        [336, 280],\n        [728, 90],\n        [970, 90],\n        [970, 250]\n      ],\n      \"position\": \"Content\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90],\n          [970, 90],\n          [970, 250]\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280]\n        ]\n      },\n      \"refreshTime\": 15000\n    },\n    \"/339474670,87143780/PassportCruise/Side\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Side\",\n      \"size\": [\n        [300, 250],\n        [300, 600],\n        [336, 280]\n      ],\n      \"position\": \"Side\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [300, 250],\n          [336, 280]\n        ],\n        \"tablet\": [\n          [300, 250],\n          [336, 280]\n        ],\n        \"mobile\": []\n      },\n      \"refreshTime\": 15000\n    },\n    \"/339474670,87143780/PassportCruise/Side3\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Side3\",\n      \"size\": [\n        [300, 250]\n      ],\n      \"position\": \"Side\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [],\n        \"tablet\": [],\n        \"mobile\": [\n          [300, 250]\n        ]\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/Sky_Left\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Sky_Left\",\n      \"size\": [\n        [160, 600]\n      ],\n      \"position\": \"Other\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [160, 600]\n        ],\n        \"tablet\": [\n          [160, 600]\n        ],\n        \"mobile\": []\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/Sticky_Footer\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Sticky_Footer\",\n      \"size\": [\n        [320, 50],\n        [320, 100],\n        [728, 90],\n        [970, 90]\n      ],\n      \"position\": \"Sticky\",\n      \"isLazyLoaded\": false,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90],\n          [970, 90]\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": [\n          [320, 50],\n          [320, 100]\n        ]\n      },\n      \"refreshTime\": 45000\n    },\n    \"/339474670,87143780/PassportCruise/Top\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Top\",\n      \"size\": [\n        [320, 50],\n        [728, 90]\n      ],\n      \"position\": \"ATF\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90]\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": [\n          [320, 50]\n        ]\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/Left_Sky\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Left_Sky\",\n      \"size\": [\n        [120, 600],\n        [160, 600]\n      ],\n      \"position\": \"Sticky\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [120, 600],\n          [160, 600]\n        ],\n        \"tablet\": [\n          [120, 600],\n        ],\n        \"mobile\": []\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/Middle2\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Middle2\",\n      \"size\": [\n        [300, 250],\n        [336, 280],\n        [728, 90]\n      ],\n      \"position\": \"Content\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90]\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280]\n        ]\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/SectionCategory\": {\n      \"id\": \"/339474670,87143780/PassportCruise/SectionCategory\",\n      \"size\": [\n        [300, 250],\n        [336, 280],\n        [728, 90]\n      ],\n      \"position\": \"Content\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90]\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280]\n        ]\n      },\n      \"refreshTime\": 15000\n    },\n    \"/339474670,87143780/PassportCruise/Side1\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Side1\",\n      \"size\": [\n        [300, 250]\n      ],\n      \"position\": \"Side\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [],\n        \"tablet\": [],\n        \"mobile\": [\n          [300, 250]\n        ]\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/Sky_Right\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Sky_Right\",\n      \"size\": [\n        [120, 600],\n        [160, 600]\n      ],\n      \"position\": \"Other\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [120, 600],\n          [160, 600]\n        ],\n        \"tablet\": [\n          [120, 600],\n          [160, 600]\n        ],\n        \"mobile\": []\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/SuperMaavaron\": {\n      \"id\": \"/339474670,87143780/PassportCruise/SuperMaavaron\",\n      \"size\": [\n        [970, 450],\n        [970, 250],\n        [970, 90],\n        [728, 90],\n        [360, 360],\n        [336, 280],\n        [300, 250]\n      ],\n      \"position\": \"Content\",\n      \"isLazyLoaded\": false,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [970, 450],\n          [970, 250],\n          [970, 90],\n          [728, 90],\n        ],\n        \"tablet\": [\n          [728, 90]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280],\n          [360, 360]\n        ]\n      },\n      \"refreshTime\": 30000\n    },\n    \"/339474670,87143780/PassportCruise/Side2\": {\n      \"id\": \"/339474670,87143780/PassportCruise/Side2\",\n      \"size\": [\n        [300, 250]\n      ],\n      \"position\": \"Side\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [300, 250]\n        ],\n        \"tablet\": [\n          [300, 250]\n        ],\n        \"mobile\": []\n      },\n      \"refreshTime\": 15000\n    },\n    \"/339474670,87143780/PassportCruise/VidDisplay\": {\n      \"id\": \"/339474670,87143780/PassportCruise/VidDisplay\",\n      \"size\": [\n        [300, 250],\n        [336, 280],\n        [728, 90]\n      ],\n      \"position\": \"Content\",\n      \"isLazyLoaded\": true,\n      \"refreshIteration\": 0,\n      \"sizeMapping\": {\n        \"desktop\": [\n          [728, 90],\n          [300, 250],\n          [336, 280]\n        ],\n        \"tablet\": [\n          [728, 90],\n          [300, 250],\n          [336, 280]\n        ],\n        \"mobile\": [\n          [300, 250],\n          [336, 280]\n        ]\n      },\n      \"refreshTime\": 15000\n    }\n  });\n\n  const biddersWhiteList = Object.freeze({\n    \"appnexus\":[\"US\",\"GB\",\"CA\",\"IL\",\"JP\",\"AU\",\"NZ\",\"IN\",\"BR\",\"ID\",\"EG\",\"AE\",\"SA\",\"AR\",\"CL\",\"MY\",\"PH\",\"PT\",\"HK\",\"SG\",\"NL\",\"BE\",\"IE\",\"NO\",\"SE\",\"FI\",\"DK\",\"CH\",\"DE\",\"TR\",\"PL\",\"RO\",\"CZ\",\"ZA\"],\n    \"magnite\":[\"US\",\"GB\",\"IL\",\"PS\",\"TR\",\"CA\",\"DE\",\"GH\",\"ZA\",\"FR\",\"ES\",\"IT\",\"AU\",\"NZ\",\"IN\",\"MX\",\"PL\",\"EC\",\"KR\",\"UA\",\"SA\",\"NL\",\"BE\",\"BD\",\"AE\",\"SG\",\"AM\",\"JP\",\"BR\",\"NG\",\"TH\",\"MY\",\"HK\",\"UZ\",\"SE\",\"AT\",\"PH\",\"VN\",\"CL\",\"IE\",\"CH\",\"NO\",\"FI\",\"DK\",\"PT\"],\n    \"msft\":[\"US\",\"GB\",\"CA\",\"IL\",\"JP\",\"AU\",\"NZ\",\"IN\",\"BR\",\"ID\",\"EG\",\"AE\",\"SA\",\"AR\",\"CL\",\"MY\",\"PH\",\"PT\",\"HK\",\"SG\",\"NL\",\"BE\",\"IE\",\"NO\",\"SE\",\"FI\",\"DK\",\"CH\",\"DE\",\"TR\",\"PL\",\"RO\",\"CZ\",\"ZA\"],\n    \"pubmatic\":[\"US\",\"CA\",\"GB\",\"IE\",\"AU\",\"NZ\",\"DE\",\"AT\",\"CH\",\"NL\",\"BE\",\"NO\",\"SE\",\"FI\",\"DK\",\"IL\",\"PR\"],\n    \"rubicon\":[\"US\",\"GB\",\"IL\",\"PS\",\"TR\",\"CA\",\"DE\",\"GH\",\"ZA\",\"FR\",\"ES\",\"IT\",\"AU\",\"NZ\",\"IN\",\"MX\",\"PL\",\"EC\",\"KR\",\"UA\",\"SA\",\"NL\",\"BE\",\"BD\",\"AE\",\"SG\",\"AM\",\"JP\",\"BR\",\"NG\",\"TH\",\"MY\",\"HK\",\"UZ\",\"SE\",\"AT\",\"PH\",\"VN\",\"CL\",\"IE\",\"CH\",\"NO\",\"FI\",\"DK\",\"PT\"],\n    \"openx\":[\"US\",\"CA\"],\n    \"unruly\":[\"US\",\"GB\"],\n  });\n\n  const biddersBlackList = Object.freeze({\n    \"33across\":[\"GH\",\"GB\",\"CA\",\"DE\",\"NL\",\"IL\",\"SG\",\"AU\",\"IT\",\"FR\"],\n    \"adagio\":[\"FR\",\"IL\",\"GB\",\"AU\",\"BE\",\"CH\",\"PH\",\"DE\",\"CN\",\"SG\"],\n    \"adyoulike\":[\"IL\",\"CA\",\"CN\",\"SG\",\"GB\",\"AU\",\"ZA\",\"FR\",\"IN\",\"PK\"],\n    \"amx\":[\"NL\",\"ID\",\"IT\",\"PH\",\"CN\",\"ES\",\"BE\",\"SO\",\"CH\",\"BR\"],\n    \"anyclip\":[\"GH\",\"US\",\"GB\",\"IT\",\"CA\",\"FR\",\"AT\",\"BR\",\"DE\",\"DK\"],\n    \"appnexus\":[\"DE\",\"CA\",\"GB\",\"FR\",\"ID\",\"AU\",\"PH\",\"BR\",\"TH\",\"SG\"],\n    \"contxtful\":[\"IL\",\"IN\",\"GB\",\"ID\",\"SG\",\"KR\",\"CN\",\"PH\",\"DE\",\"TH\"],\n    \"conversant\":[\"IL\",\"IN\",\"KR\",\"PH\",\"TH\",\"JP\",\"VN\",\"PK\",\"CN\",\"EG\"],\n    \"criteo\":[\"CN\",\"BD\",\"BY\",\"KZ\",\"AR\",\"MA\",\"CY\",\"CO\",\"BG\",\"CI\"],\n    \"exco\":[\"US\",\"SG\",\"GB\",\"DE\",\"CA\",\"AU\",\"IT\",\"PL\",\"CN\",\"BR\"],\n    \"fluct\":[\"US\",\"CA\",\"HK\",\"JP\",\"SG\",\"GB\",\"AU\",\"DE\",\"CN\",\"TW\"],\n    \"gamoshi\":[\"US\",\"GB\",\"CA\",\"DE\",\"AU\",\"PH\",\"IT\",\"SG\",\"CN\",\"MY\"],\n    \"ix\":[\"CN\",\"PL\",\"IE\",\"FI\",\"DK\",\"AT\",\"GR\",\"AR\",\"MA\",\"PT\"],\n    \"kueezrtb\":[\"IT\",\"CN\",\"ES\",\"BE\",\"UA\",\"PH\",\"CH\",\"TH\",\"SE\",\"BY\"],\n    \"magnite\":[\"NL\",\"IT\",\"CN\",\"BE\",\"SO\",\"CH\",\"ES\",\"UA\",\"BR\",\"PL\"],\n    \"medianet\":[\"CN\",\"CH\",\"MY\",\"UA\",\"VN\",\"BD\",\"AE\",\"PK\",\"TR\",\"BY\"],\n    \"msft\":[\"CN\",\"SO\",\"SG\",\"UA\",\"PH\",\"BY\",\"KZ\",\"KE\",\"IN\",\"IT\"],\n    \"oms\":[\"SG\",\"IN\",\"IL\",\"NL\",\"ID\",\"KR\",\"IT\",\"PH\",\"TH\",\"CH\"],\n    \"onetag\":[\"CN\",\"PL\",\"BD\",\"GR\",\"SE\",\"PK\",\"CY\",\"RO\",\"AT\",\"PT\"],\n    \"openx\":[\"DE\",\"NL\",\"CN\",\"IT\",\"BE\",\"SO\",\"JP\",\"ES\",\"PH\",\"SE\"],\n    \"pixfuture\":[\"DE\",\"CN\",\"AU\",\"FR\",\"SG\",\"TH\",\"PH\",\"ID\",\"BR\",\"JP\"],\n    \"programmaticx\":[\"FR\",\"SG\",\"IL\",\"GB\",\"ID\",\"IN\",\"KR\",\"DE\",\"PH\",\"JP\"],\n    \"richaudience\":[\"IN\",\"GB\",\"CN\",\"PK\",\"DE\",\"BD\",\"BR\",\"ZA\",\"FR\",\"TW\"],\n    \"rise\":[\"FR\",\"SG\",\"IN\",\"GB\",\"DE\",\"ID\",\"AU\",\"PH\",\"KR\",\"CN\"],\n    \"rubicon\":[\"IL\",\"CA\",\"MY\",\"GH\",\"SG\",\"AU\",\"PR\",\"GB\",\"CN\",\"DE\"],\n    \"seedtag\":[\"CN\",\"PH\",\"NG\",\"IN\",\"NO\",\"AT\",\"MA\",\"DK\",\"MY\",\"CI\"],\n    \"sharethrough\":[\"FR\",\"SG\",\"IL\",\"GB\",\"DE\",\"BE\",\"CH\",\"BR\",\"NL\",\"IT\"],\n    \"smartadserver\":[\"US\",\"SO\",\"GB\",\"IL\",\"CA\",\"KE\",\"SE\",\"NO\",\"NL\",\"CN\"],\n    \"smilewanted\":[\"DE\",\"ID\",\"CN\",\"PH\",\"NL\",\"SE\",\"IT\",\"TH\",\"CH\",\"ES\"],\n    \"sovrn\":[\"NL\",\"SG\",\"IT\",\"CN\",\"ES\",\"SE\",\"VN\",\"MY\",\"NG\",\"MX\"],\n    \"sparteo\":[\"CN\",\"PK\",\"BD\",\"RO\",\"FI\",\"CZ\",\"DZ\",\"NO\",\"HU\",\"DK\"],\n    \"ssp_geniee\":[\"IL\",\"GB\",\"DE\",\"NL\",\"ID\",\"IN\",\"KR\",\"IT\",\"CN\",\"ZA\"],\n    \"teads\":[\"CN\",\"CA\",\"SG\",\"IL\",\"AU\",\"GB\",\"FR\",\"TH\",\"DE\",\"PH\"],\n    \"underdogmedia\":[\"SO\",\"US\",\"CA\",\"ZA\",\"undefined\"],\n    \"unruly\":[\"IN\",\"ID\",\"DE\",\"AU\",\"PH\",\"KR\",\"CN\",\"SG\",\"TH\",\"JP\"],\n    \"vidazoo\":[\"FR\",\"SG\",\"GB\",\"IN\",\"ID\",\"DE\",\"PH\",\"CN\",\"SO\",\"TH\"],\n    \"yandex\":[\"IL\",\"US\",\"CA\",\"DE\",\"UA\",\"AU\",\"GB\",\"BG\",\"KZ\",\"LV\"]\n  });\n\n  const country = await getCountry();\n\n  const isBidderAllowed = ({ bidder }) => {\n    const name = bidder?.toLowerCase().replace(/s2s$/, '');\n    const whiteOk = !biddersWhiteList[name] || biddersWhiteList[name].includes(country);\n    // const blackOk = !biddersBlackList[name] || !biddersBlackList[name].includes(country);\n    return whiteOk;\n  };\n\n  const bidders = ([]).filter(isBidderAllowed);\n\n  const bidderSettings = Object.freeze({\n    \"33across\": { \"storageAllowed\": true },\n    \"adagio\": { \"storageAllowed\": true },\n    \"adnimation\": { \"storageAllowed\": true },\n    \"adyoulike\": { \"storageAllowed\": true },\n    \"amx\": { \"storageAllowed\": true },\n    \"anyclip\": { \"storageAllowed\": true },\n    \"appnexus\": { \"storageAllowed\": true },\n    \"contxtful\": { \"storageAllowed\": true },\n    \"conversant\": { \"storageAllowed\": true },\n    \"criteo\": { \"storageAllowed\": true },\n    \"exco\": { \"storageAllowed\": true },\n    \"fluct\": { \"storageAllowed\": true },\n    \"gamoshi\": { \"storageAllowed\": true },\n    \"ix\": { \"storageAllowed\": true },\n    \"kueezrtb\": { \"storageAllowed\": true },\n    \"magnite\": { \"storageAllowed\": true },\n    \"medianet\": { \"storageAllowed\": true },\n    \"msft\": { \"storageAllowed\": true },\n    \"oms\": { \"storageAllowed\": true },\n    \"onetag\": { \"storageAllowed\": true },\n    \"openx\": { \"storageAllowed\": true },\n    \"pixfuture\": { \"storageAllowed\": true },\n    \"programmaticx\": { \"storageAllowed\": true },\n    \"pubmatic\": { \"storageAllowed\": true },\n    \"richaudience\": { \"storageAllowed\": true },\n    \"rise\": { \"storageAllowed\": true },\n    \"rubicon\": { \"storageAllowed\": true },\n    \"seedtag\": { \"storageAllowed\": true },\n    \"sharethrough\": { \"storageAllowed\": true },\n    \"smartadserver\": { \"storageAllowed\": true },\n    \"smilewanted\": { \"storageAllowed\": true },\n    \"sonobi\": { \"storageAllowed\": true },\n    \"sovrn\": { \"storageAllowed\": true },\n    \"sparteo\": { \"storageAllowed\": true },\n    \"ssp_geniee\": { \"storageAllowed\": true },\n    \"taboola\": { \"storageAllowed\": true },\n    \"teads\": { \"storageAllowed\": true },\n    \"underdogmedia\": { \"storageAllowed\": true },\n    \"unruly\": { \"storageAllowed\": true },\n    \"vidazoo\": { \"storageAllowed\": true },\n    \"yandex\": { \"storageAllowed\": true },\n  });\n\n  const bidderNames = bidders.filter(({bidder}) => !bidder.endsWith('S2S')).map(({bidder}) => bidder);\n  const s2sBidders = bidders.filter(({\n    bidder\n  }) => bidder.endsWith('S2S')).map(({\n    bidder\n  }) => bidder);\n  const s2sAliases = Object.fromEntries(s2sBidders.map(bidder => [bidder, bidder.slice(0, -3)]));\n\n  const GDPR_GEOS = Object.freeze(['AT','BE','BG','HR','CY','CZ','DK','EE','FI','FR','DE','GR','HU','IE','IT','LV','LT','LU','MT','NL','PL','PT','RO','SK','SI','ES','SE','IS','LI','NO','GB','CH']);\n  const CMP_WAIT_MS = 3000;\n  function waitForTcfApi(maxMs){return new Promise((resolve)=>{const start=Date.now();(function check(){if(typeof window.__tcfapi==='function')return resolve(true);if(Date.now()-start>=maxMs)return resolve(false);setTimeout(check,50);})();});}\n  async function isGdprRequired(country){const hasCmp=await waitForTcfApi(CMP_WAIT_MS);return hasCmp||GDPR_GEOS.includes(country);}\n  const needsGdpr = await isGdprRequired(await getCountry());\n\n  const pbjsConfig = Object.freeze({\n    's2sConfig': {\n      'enabled': true,\n      'accountId': '1001',\n      'bidders': s2sBidders,\n      'endpoint': 'https://adnpbs.com/openrtb2/auction',\n      'syncEndpoint': 'https://adnpbs.com/cookie_sync',\n      'timeout': 1500,\n      'extPrebid': {\n        'aliases': s2sAliases\n      }\n    },\n    'priceGranularity': 'high',\n    'currency': {\n      'adServerCurrency': 'USD',\n      'conversionRateFile': 'https://cdn.jsdelivr.net/gh/prebid/currency-file@1/latest.json',\n      'defaultRates': {\n        'USD': {\n          'EUR': 0.92,\n          'USD': 1\n        },\n        'EUR': {\n          'USD': 1.09,\n          'EUR': 1\n        }\n      },\n      'ratesTTL': 3600000\n    },\n    'floors': {\n      'enforcement': {\n        'enforceJS': true,\n        'enforcePBS': true,\n        'floorDeals': true,\n        'bidAdjustment': true\n      },\n      'data': {\n        'currency': 'USD',\n        'skipRate': 0,\n        'schema': {\n          'fields': [\n            'mediaType'\n          ]\n        },\n        'values': {\n          'banner': 0.01,\n          'native': 0.01,\n          'video': 0.01\n        },\n        'default': 0.01\n      }\n    },\n    'gvlMapping': {'amxS2S':737,'magniteS2S':52,'riseS2S':1043,'kueezrtbS2S':1165,'adagioS2S':617,'anyclip':1400,'exco':444},\n    'consentManagement': {\n      'gdpr': needsGdpr && {'cmpApi':'iab','defaultGdprScope':true,'timeout':500,'actionTimeout':2000},\n      'usp': { 'cmpApi':'iab', 'timeout':500 }\n    },\n    'useBidCache': true,\n    'schain': {\n      'validation': 'strict',\n      'config': {\n        'ver': '1.0',\n        'complete': 1,\n        'nodes': [{\n          'asi': 'adnimation.com',\n          'sid': '',\n          'hp': 1\n        }]\n      }\n    },\n    'userSync': {\n      'iframeEnabled': true,\n      'filterSettings': {\n        'iframe': {\n          'bidders': bidderNames,\n          'filter': 'include'\n        }\n      },\n      'userIds': [{\n          'name': 'sharedId',\n          'storage': {\n            'type': 'html5',\n            'name': '_pubcid',\n            'expires': 365\n          }\n        },\n        {\n          'name': 'identityLink',\n          'params': {\n            'pid': '13346'\n          },\n          'storage': {\n            'type': 'html5',\n            'name': 'idl_env',\n            'expires': 30\n          }\n        },\n        {\n          'name': 'id5Id',\n          'params': {\n            'partner': 1262\n          },\n          'storage': {\n            'type': 'html5',\n            'name': 'id5id',\n            'expires': 90,\n            'refreshInSeconds': 28800\n          }\n        },\n        {\n          'name': '33acrossId',\n          'params': {\n            'pid': '0010b00002KBtyLAAT'\n          },\n          'storage': {\n            'name': '33acrossId',\n            'type': 'html5',\n            'expires': 90,\n            'refreshInSeconds': 28800\n          }\n        }\n      ]\n    },\n    'ix': {\n      'detectMissingSizes': true\n    },\n    'aliasSyncEnabled': true,\n    'auctionOptions': {\n      'suppressStaleRender': true\n    },\n    'contxtful': {\n      'version': 'v1',\n      'customer': 'ADNP250319'\n    },\n    'realTimeData': {\n      'dataProviders': [{\n        'name': 'contxtful',\n        'waitForIt': true,\n        'params': {\n          'version': 'v1',\n          'customer': 'ADNP250319',\n          'bidders': [\n            'contxtful'\n          ],\n          'adServerTargeting': true\n        }\n      }]\n    }\n  });\n\n  // ----------------------------------------------\n  // Placeholders\n  // ----------------------------------------------\n\n  // Prebid\n  window.pbjs = window.pbjs || {};\n  window.pbjs.que = window.pbjs.que || [];\n\n  // Google Tag\n  window.googletag = window.googletag || {};\n  window.googletag.cmd = window.googletag.cmd || [];\n  // Manage refresh of viewable ads\n  window.googletag.cmd.push(() =>\n    window.googletag.pubads().addEventListener(\n      'impressionViewable', onImpressionViewable));\n  // Visually collapse unfilled slots\n  window.googletag.cmd.push(() =>\n    window.googletag.setConfig({ collapseDiv: 'ON_NO_FILL' }));\n\n  // Google Analytics\n  window.dataLayer = window.dataLayer || [];\n\n  function gtag() {\n    window.dataLayer.push(arguments);\n  }\n\n  // Taboola\n  window._taboola = window._taboola || [];\n\n  // ----------------------------------------------\n  // Constants\n  // ----------------------------------------------\n\n  const GA_ID = 'G-MNJQPPBSCN';\n  const APS_TIMEOUT_MS = 2000;\n  const PREBID_TIMEOUT_MS = 1800;\n\n  // ----------------------------------------------\n  // Scripts\n  // ----------------------------------------------\n\n  function createScript(src, preCreate = () => {}) {\n    return new Promise((resolve) => {\n      let scriptEl = document.querySelector(`script[src=\"${src}\"]`);\n\n      if (scriptEl) {\n        console.warn('Script already exists:', src);\n        resolve(false);\n        return;\n      }\n\n      const attemptLoad = () => {\n        scriptEl = document.createElement('script');\n        scriptEl.src = src;\n        scriptEl.fetchPriority = 'high';\n        preCreate(scriptEl);\n        scriptEl.async = !scriptEl.defer;\n        scriptEl.addEventListener('load', () => resolve(true));\n        scriptEl.addEventListener('error', () => {\n          console.warn('Retrying to load script:', src);\n          scriptEl.remove();\n          setTimeout(attemptLoad, 100);\n        });\n        document.head.appendChild(scriptEl);\n      };\n\n      attemptLoad();\n    });\n  }\n\n  // Don't initialize anything if page URL is blacklisted\n  if (isBlacklistedUrl()) {\n    throw 'Skipping...';\n  }\n\n  Promise.all([\n      // Amazon Publisher Services\n      // createScript('https://c.amazon-adsystem.com/aax2/apstag.js'),\n\n      // Human anti-bot protection\n      createScript('https://cadmus.script.ac/d3svkhbhkz2i0f/script.js'),\n    ])\n    .then(config)\n    .then(main)\n    .catch((err) => console.error('Failed to bootstrap scripts:', err));\n\n  // Block Through anti-adblock\n  createScript('https://btloader.com/tag?o=5696523966873600&upapi=true');\n\n  // Vidazoo video ads\n  createScript('https://static.vidazoo.com/basev/vwpt.js', (scriptEl) => {\n    scriptEl.setAttribute('data-widget-id', '65e9b79ebdb3a9c5732bbae8');\n  });\n\n  // Google Analytics\n  createScript(`https://www.googletagmanager.com/gtag/js?id=${GA_ID}`);\n\n  // KueezRTB cookieless solution\n  createScript('https://static.kueezrtb.com/latest.js', (scriptEl) => {\n    scriptEl.setAttribute('data-cfasync', 'false');\n    scriptEl.id = 'kueezrtb_latest';\n  });\n\n  class LazyLoader {\n    constructor(margin = '100px') {\n      this.observer = new IntersectionObserver(this.onIntersect, {\n        rootMargin: margin\n      });\n    }\n\n    onIntersect = (entries) => {\n      entries.forEach((entry) => {\n        if (entry.isIntersecting) {\n          const cb = entry.target.dataset.lazyCallback;\n          if (cb && window[cb]) {\n            window[cb](entry.target);\n            delete window[cb];\n          }\n          this.observer.unobserve(entry.target);\n        }\n      });\n    };\n\n    add(element, callback) {\n      if (!element || typeof callback !== 'function') return;\n      if (element.getBoundingClientRect().top < window.innerHeight) {\n        callback(element);\n      } else {\n        const cbName = 'lazy_cb_' + Math.random().toString(36).slice(2);\n        window[cbName] = callback;\n        element.dataset.lazyCallback = cbName;\n        this.observer.observe(element);\n      }\n    }\n  }\n\n  // ----------------------------------------------\n  // App\n  // ----------------------------------------------\n\n  const adUnits = [];\n  const slotsMap = [];\n  const lazyLoader = new LazyLoader();\n  const activeSlotIds = [];\n  const newPbjsAdUnits = [];\n  const viewportType =\n    window.screen.width > 1525 ?\n    'desktop' :\n    window.screen.width > 730 ?\n    'tablet' :\n    'mobile';\n\n  /**\n   * Main entry point of our tag.\n   */\n  async function main() {\n    const isOk = await createScript('https://securepubads.g.doubleclick.net/tag/js/gpt.js');\n    if (isOk) {\n      console.log('Starting...');\n    }\n  }\n\n  function config() {\n    console.log('Configuring...');\n    initGa();\n    // initAps();\n    initIiq();\n  }\n\n  function initAps() {\n    window.apstag.init({\n      pubID: '83d5088d-5f70-4acf-a888-15a83bf33932',\n      adServer: 'googletag'\n    });\n  }\n\n  function initGa() {\n    window.googletag.cmd.push(() => {\n      const handleSlotRenderEnded = () => {\n        gtag('js', new Date());\n        gtag('config', GA_ID);\n\n        googletag.pubads().removeEventListener('slotRenderEnded', handleSlotRenderEnded);\n      };\n      googletag.pubads().addEventListener('slotRenderEnded', handleSlotRenderEnded);\n    });\n  }\n\n  function initIiq() {\n    if (!window.IntentIqObject) {\n      console.log('IIQ not found - skipping initialization');\n      return;\n    }\n\n    try {\n      // Configure IntentIQ\n      window.intentIq_2072952453 = new IntentIqObject({\n        partner: 2072952453,\n        pbjs: adnpbjs,\n        callback: main,\n        timeoutInMillis: PREBID_TIMEOUT_MS,\n        ABTestingConfigurationSource: 'IIQServer',\n        manualWinReportEnabled: true,\n        domainName: window.location.host,\n        vrBrowserBlackList: ['chrome'],\n        gamParameterName: 'googletag', // Optional\n      });\n\n      adnpbjs.onEvent('bidWon', (data) => {\n        window.intentIq_2072952453.reportExternalWin({\n          biddingPlatformId: 1, // PreBid\n          partnerAuctionId: data.auctionId,\n          bidderCode: data.bidderCode,\n          prebidAuctionId: data.auctionId,\n          cpm: data.cpm,\n          currency: 'USD',\n          originalCpm: data.originalCpm,\n          originalCurrency: 'USD',\n          status: data.status,\n          placementId: data.adUnitCode\n        });\n      });\n\n    } catch (err) {\n      console.error('Failed to initialize IntentIQ:', err);\n      throw err;\n    }\n  }\n\n  function initAds() {\n    const adsEl = document.querySelectorAll('[data-onpage=\"true\"]');\n    adsEl.forEach(slotEl => createAd(slotEl.dataset.adpath));\n  }\n\n  function onImpressionViewable(event) {\n    const {\n      slot\n    } = event;\n    const slotId = slot.getSlotElementId();\n    if (!activeSlotIds.includes(slotId)) {\n      return;\n    }\n\n    const adUnitPath = slot.getAdUnitPath();\n    const adUnit = adsConfig[adUnitPath];\n    const timeoutMs = adUnit.refreshTime;\n\n    setTimeout(() => refreshAd(slot, slotId, adUnit), timeoutMs);\n  }\n\n  function collectAds() {\n    adUnits.length = 0;\n\n    const adsEl = document.querySelectorAll('[data-onpage=\"true\"]');\n    if (!adsEl.length) {\n      console.warn('No ads found to collect');\n      return;\n    }\n\n    adsEl.forEach((slotEl) => {\n      const adPath = slotEl.dataset.adpath;\n      const slot = adsConfig[adPath];\n      const slotId = slot?.id;\n      const sizes = slot?.sizeMapping[viewportType];\n\n      if (!sizes?.length) {\n        console.warn(\n          'Failed to find slot sizes for viewport - bids will be affected for',\n          viewportType, slotId\n        );\n        return;\n      }\n      const slotBidders = [...bidders];\n      const STANDARD_SIZES = {\n        desktop: [\n          [728, 90],\n          [970, 90],\n          [970, 250],\n          [300, 250],\n          [300, 600],\n          [160, 600],\n          [336, 280],\n          [320, 50],\n          [320, 100],\n        ],\n        tablet: [\n          [728, 90],\n          [300, 250],\n          [300, 600],\n          [160, 600],\n          [336, 280],\n        ],\n        mobile: [\n          [320, 50],\n          [320, 100],\n          [300, 250],\n          [336, 280],\n          [360, 360],\n        ]\n      };\n\n      function hasOnlyStandardSizes(sizes, viewport) {\n        if (!Array.isArray(sizes) || sizes.length === 0) return false;\n\n        const standardSizes = STANDARD_SIZES[viewport] || [];\n\n        const isNative = (w, h) => w === 1 && h === 2;\n\n        return sizes.every(size => {\n          if (size === 'fluid') return true;\n          if (Array.isArray(size)) {\n            const [w, h] = size;\n            if (isNative(w, h)) return true;\n            return standardSizes.some(([sw, sh]) => sw === w && sh === h);\n          }\n          return false;\n        });\n      }\n      const prebidSizes = sizes.filter(size => hasOnlyStandardSizes([size], viewportType));\n\nif (prebidSizes.length) {\n        adUnits.push({\n          bids: slotBidders,\n          code: slotId,\n          mediaTypes: {\n            banner: {\n              sizes: prebidSizes\n            }\n          }\n        });\n        console.log(`Prebid sizes for ${slotId}:`, prebidSizes);\n      } else {\n        console.log(`Skipping Prebid for ${slotId} — No compatible sizes.`);\n      }\n    });\n\n    newPbjsAdUnits.length = 0;\n    newPbjsAdUnits.push(...adUnits);\n\n    window.adnpbjs.que.push(() => {\n      window.adnpbjs.bidderSettings = bidderSettings;\n      window.adnpbjs.setConfig(pbjsConfig);\n      window.adnpbjs.setBidderConfig({\n        bidders: ['sparteo'],\n        config: {\n          ortb2: {\n            source: {\n              ext: {\n                schain: {\n                  ver: \"1.0\",\n                  complete: 1,\n                  nodes: [{\n                    asi: \"zerodegreeads.com\",\n                    sid: \"320252CD1\",\n                    hp: 1\n                  }]\n                }\n              }\n            }\n          }\n        }\n      });\n    });\n  }\n\n  function runApsBids(slotEl, resolve) {\n    return;\n\n    const slotId = slotEl.id;\n    const adPath = slotEl.dataset.adpath;\n\n    const sizes = adsConfig[adPath].sizeMapping[viewportType];\n    if (!sizes.length) {\n      console.warn(\n        'Failed to find slot sizes for viewport - canceling APS bid for',\n        viewportType, slotId\n      );\n      resolve();\n      return;\n    }\n\n    const slots = [{\n      slotID: slotId,\n      slotName: adsConfig[adPath].id,\n      sizes\n    }];\n\n    window.apstag.fetchBids({\n      slots,\n      timeout: APS_TIMEOUT_MS\n    }, () => {\n      window.apstag.setDisplayBids();\n      resolve();\n    });\n  }\n\n  function runPrebidBids(slotEl, resolve) {\n    const slotId = slotEl.id;\n    window.pbjs.que.push(() =>\n      window.pbjs.requestBids({\n        timeout: PREBID_TIMEOUT_MS,\n        adUnitCodes: [slotId],\n        bidsBackHandler: () => {\n          window.pbjs.setTargetingForGPTAsync([slotId]);\n          resolve();\n        }\n      })\n    );\n  }\n\n  async function runBids(slotEl) {\n    try {\n      const slotId = slotEl.id;\n      // const apsBids = new Promise((resolve) => runApsBids(slotEl, resolve));\n      // const pbjsBids = new Promise((resolve) => runPrebidBids(slotEl, resolve));\n\n      function withTimeout(promise, ms) {\n        return Promise.race([\n          promise,\n          new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), ms))\n        ]);\n      }\n\n      await Promise.allSettled([\n      // withTimeout(apsBids, 3000),\n        // withTimeout(pbjsBids, 3000)\n      ]);\n\n    } catch (e) {\n      console.log(e);\n      return\n    }\n  }\n\n  async function createAdCmd(slotName) {\n    const slotEl = document.querySelector(`[data-adpath=\"${slotName}\"]`);\n    if (!slotEl) {\n      console.warn('Failed to find ad to create by id:', slotName);\n      return;\n    }\n\n    collectAds();\n\n    let adUnit = adsConfig[slotName];\n    if (!adUnit) {\n      console.warn('Failed to find ad with the following id:', slotName);\n      return;\n    }\n\n    const sizeMapping = googletag\n      .sizeMapping()\n      .addSize([980, 200], adUnit.sizeMapping.desktop)\n      .addSize([730, 200], adUnit.sizeMapping.tablet)\n      .addSize([0, 0], adUnit.sizeMapping.mobile)\n      .build();\n\n    const adPath = slotEl.dataset.adpath;\n    let refreshIteration = adsConfig[adPath].refreshIteration;\n    refreshIteration++;\n\n    const slot = googletag\n      .defineSlot(adUnit.id, adUnit.size)\n      .defineSizeMapping(sizeMapping)\n      .addService(window.googletag.pubads());\n\n    slot.setConfig({ targeting: { refreshIteration: refreshIteration.toString(), intent_iq_group: 'U' } });\n\n    slotEl.id = slot.getSlotElementId();\n\n    const pbjsAdUnit = newPbjsAdUnits.find(adUnit => adUnit.code === slotName);\n    if (pbjsAdUnit) {\n      pbjsAdUnit.code = slotEl.id;\n      window.adnpbjs.addAdUnits(pbjsAdUnit);\n      window.pbjs = adnpbjs;\n    }\n\n    slotsMap[slotEl.id] = slot;\n    activeSlotIds.push(slotEl.id);\n\n    const init = async () => {\n      try {\n        await runBids(slotEl);\n        window.googletag.enableServices();\n        window.googletag.display(slotEl.id);\n        if (googletag.getConfig('disableInitialLoad').disableInitialLoad) {\n          window.googletag.pubads().refresh([slot]);\n        }\n      } catch (err) {\n        console.error('Failed to run bids for ad slot: %s, %s', slotEl.id, err);\n      }\n    };\n\n    const isLazyLoaded = adsConfig[adPath]?.isLazyLoaded !== false;\n    if (isLazyLoaded) {\n      lazyLoader.add(slotEl, init);\n    } else {\n      init();\n    }\n  }\n\n  async function refreshAd(slot, slotId, adUnit) {\n    try {\n      const adUnitToRefresh = googletag\n        .pubads()\n        .getSlots()\n        .filter((slot) => slot.getSlotElementId() === slotId)\n        .at(0);\n\n      if (!adUnitToRefresh) {\n        return;\n      }\n\n      adUnit.refreshIteration++;\n      slot.setConfig({ targeting: { refreshIteration: adUnit.refreshIteration.toString() } });\n\n      const slotEl = document.getElementById(adUnitToRefresh.getSlotElementId());\n      await runBids(slotEl);\n\n      window.googletag.pubads().refresh([slotsMap[slotEl.id]]);\n    } catch (err) {\n      console.error('Failed to refresh ad:', slotId, err.message);\n    }\n  }\n\n  function destroyAdCmd(slotName) {\n    const slotEl = document.querySelector(`[data-adpath=\"${slotName}\"]`);\n    if (!slotEl) {\n      console.warn('Failed to find ad to destroy by id:', slotName);\n      return;\n    }\n\n    const slotId = slotEl.id;\n    if (slotId && slotsMap[slotId]) {\n      window.googletag.destroySlots([slotsMap[slotId]]);\n      delete slotsMap[slotId];\n      const idx = activeSlotIds.indexOf(slotId);\n      if (idx > -1) {\n        activeSlotIds.splice(idx, 1);\n      }\n    }\n\n    slotEl.innerHTML = '';\n    slotEl.id = '';\n    slotEl.removeAttribute('data-onpage');\n    if (slotId.toLowerCase().includes('sticky_footer')) {\n      slotEl.parentElement.parentElement.remove();\n    }\n  }\n\n  function createNativeCmd() {\n    createScript('https://cdn.taboola.com/libtrc/adnimationnetwork/loader.js', (scriptEl) => {\n      scriptEl.id = 'tb_loader_script';\n      scriptEl.onload = () => {\n        window.performance?.mark?.('tbl_ic');\n      };\n    });\n\n    createScript('data:text/javascript;charset=utf-8,_taboola.push({flush:true})', (scriptEl) => {\n      scriptEl.setAttribute('data-taboola-flush', 'true');\n      scriptEl.defer = true;\n    });\n  }\n\n  function destroyNativeCmd() {\n    const footerEl = document.querySelector('.adn-footer');\n    if (footerEl) {\n      footerEl.innerHTML = '';\n    }\n  }\n\n  function createNative() {\n    window.googletag.cmd.push(createNativeCmd);\n  }\n\n  function destroyNative() {\n    window.googletag.cmd.push(destroyNativeCmd);\n  }\n\n  function createAd(slotName) {\n    window.googletag.cmd.push(() => createAdCmd(slotName));\n  }\n\n  function destroyAd(slotName) {\n    window.googletag.cmd.push(() => destroyAdCmd(slotName));\n  }\n\n  function createInterstitial() {\n    window.googletag.cmd.push(createInterstitialCmd);\n  }\n\n  // ----------------------------------------------\n  // Exports\n  // ----------------------------------------------\n\n  window.adn = {\n    createAd,\n    destroyAd,\n    createNative,\n    destroyNative,\n    createInterstitial,\n  };\n\n  // ----------------------------------------------\n  // Utils\n  // ----------------------------------------------\n\n  async function getIpInfo() {\n    try {\n      const cached = localStorage.getItem('ipinfo');\n      if (cached) return JSON.parse(cached);\n      const key = '7c4d73767e64472ea502eacdbc47386b';\n      const url = `https://d2dvy74lyjayxz.cloudfront.net/?key=${key}`;\n      const res = await fetch(url);\n      if (!res.ok) throw new Error(`HTTP-${res.status}`);\n      const ipInfo = await res.json();\n      localStorage.setItem('ipinfo', JSON.stringify(ipInfo));\n      localStorage.removeItem('adngeo'); // Old version cleanup\n      return ipInfo;\n    } catch (err) {\n      console.error('Failed to get ip info:', err.message);\n      return null;\n    }\n  }\n\n  async function getCountry() {\n    const ipInfo = await getIpInfo();\n    return ipInfo?.country ?? 'US';\n  }\n\n  async function getPlatform() {\n    const ipInfo = await getIpInfo();\n    return ['ios','android','mobile','desktop'].find(k => ipInfo?.[k]) ?? 'desktop';\n  }\n\n  async function waitForElement(selector) {\n    let cnt = 0;\n    const timeout = 100;\n    const threshold = 3000 / timeout;\n    return new Promise((resolve) => {\n      let interval = setInterval(() => {\n        const el = document.querySelector(selector);\n        if (el) {\n          clearInterval(interval);\n          resolve(el);\n        }\n        if (++cnt === threshold) {\n          cnt = 0;\n          console.warn('Still waiting for selector:', selector);\n        }\n      }, timeout);\n    });\n  }\n\n  const onDomReady = (function () {\n    const callbacks = [];\n\n    document.addEventListener('DOMContentLoaded', () => {\n      callbacks.forEach((callback) => callback());\n      callbacks.length = 0;\n    });\n\n    const interval = setInterval(() => {\n      if (\n        document.readyState === 'complete' ||\n        document.readyState === 'interactive'\n      ) {\n        clearInterval(interval);\n        callbacks.forEach((callback) => callback());\n        callbacks.length = 0;\n      }\n    }, 100);\n\n    return (callback) => {\n      if (\n        document.readyState === 'complete' ||\n        document.readyState === 'interactive'\n      ) {\n        setTimeout(callback, 0);\n      } else {\n        callbacks.push(callback);\n      }\n    };\n  })();\n\n  // Find \"URL_PATHS_BLACKLIST\" under the \"Configuration\" section.\n  // There you can add any additional URL paths to blacklist.\n  function isBlacklistedUrl() {\n    const {\n      pathname\n    } = window.location;\n    const list = URL_PATHS_BLACKLIST ?? [];\n    const isBlacklisted = list.some((path) =>\n      path === '/' ? pathname === path : pathname.includes(path));\n    return isBlacklisted;\n  }\n\n  function observeSlots() {\n    const isVisible = (element) => {\n      const style = window.getComputedStyle(element);\n      const isDisplayed = style.display !== 'none';\n      const isVisible = style.visibility !== 'hidden';\n      return isDisplayed && isVisible;\n    };\n\n    const isStyleChanged = (mutation) =>\n      mutation.type === 'attributes' &&\n      (\n        mutation.attributeName === 'style' ||\n        mutation.attributeName === 'class'\n      );\n\n    const isVisibilityChanged = (mutation) => {\n      const oldStyle = mutation.oldValue || '';\n      const newStyle = mutation.target.getAttribute('style') || '';\n      const wasHidden = oldStyle.includes('hidden') || oldStyle.includes('none');\n      const isHidden = newStyle.includes('hidden') || newStyle.includes('none');\n      return wasHidden !== isHidden;\n    }\n\n    const handleAdded = (node) => {\n      const slot = node.getAttribute('data-adpath');\n      console.log('Added:', slot);\n      createAd(slot);\n    }\n\n    const handleRemoved = (node) => {\n      const slot = node.getAttribute('data-adpath');\n      console.log('Removed:', slot);\n      destroyAd(slot);\n    }\n\n    const isAdSlot = (node) => node.hasAttribute?.('data-adpath');\n\n    const getSlots = (nodeList) =>\n      Array.from(nodeList)\n      .filter((node) => node.nodeType === Node.ELEMENT_NODE)\n      .flatMap((node) => Array.from(node.querySelectorAll('[data-adpath]')).concat(node))\n      .filter(isAdSlot);\n\n    const handleMutations = (mutations) =>\n      mutations.forEach((mutation) => {\n        const addedNodes = getSlots(mutation.addedNodes);\n        const removedNodes = getSlots(mutation.removedNodes);\n\n        addedNodes.forEach(handleAdded);\n        removedNodes.forEach(handleRemoved);\n\n        if (\n          !addedNodes.includes(mutation.target) &&\n          !removedNodes.includes(mutation.target) &&\n          isStyleChanged(mutation) &&\n          isVisibilityChanged(mutation)\n        ) {\n          const childNodes = getSlots(mutation.target);\n          childNodes.forEach((node) => {\n            if (isVisible(node)) {\n              handleAdded(node);\n            } else {\n              handleRemoved(node);\n            }\n          });\n        }\n      });\n\n    const config = {\n      subtree: true,\n      childList: true,\n      attributes: true,\n      attributeFilter: ['style', 'class'],\n      attributeOldValue: true\n    };\n\n    const observer = new MutationObserver(handleMutations);\n    observer.observe(document, config);\n  }\n\n  // ----------------------------------------------\n  // Custom\n  // ----------------------------------------------\n\n  function createStickyBanner() {\n\n    const addCloseButton = (stickyBannerSizeDiv) => {\n      const el = document.createElement('div');\n      el.innerText = 'Close';\n      el.style.position = 'absolute';\n      el.style.top = '-20px';\n      el.style.right = '0px';\n      el.style.height = '20px';\n      el.style.width = '50px';\n      el.style.color = 'white';\n      el.style.borderRadius = '2px';\n      el.style.backgroundColor = 'black';\n      el.style.cursor = 'pointer';\n      el.style.fontSize = '14px';\n      el.style.textAlign = 'center';\n      el.classList.add('closeButton');\n      el.onclick = function () {\n        this.parentElement.remove();\n      };\n      stickyBannerSizeDiv.append(el);\n    };\n\n    const stickyBannerParent = document.createElement('div');\n    stickyBannerParent.classList.add('adnSticky');\n    stickyBannerParent.style.position = 'fixed';\n    stickyBannerParent.style.display = 'flex';\n    stickyBannerParent.style.justifyContent = 'space-evenly';\n    stickyBannerParent.style.bottom = '0px';\n    stickyBannerParent.style.width = '100%';\n    stickyBannerParent.style.backgroundColor = 'transparent';\n    stickyBannerParent.style.zIndex = '9999999999';\n\n    const stickyBannerSizeDiv = document.createElement('div');\n    stickyBannerSizeDiv.style.position = 'relative';\n\n    const stickyBanner = document.createElement('div');\n    stickyBanner.dataset.onpage = !0;\n    stickyBanner.dataset.adpath = '/339474670,87143780/PassportCruise/Sticky_Footer';\n\n    stickyBannerSizeDiv.append(stickyBanner);\n    stickyBannerParent.append(stickyBannerSizeDiv);\n    document.getElementsByTagName('body')[0].append(stickyBannerParent);\n\n    let flag = true;\n    googletag.cmd.push(() => {\n      googletag.pubads().addEventListener('slotRenderEnded', (event) => {\n        if (\n          event.slot.getSlotElementId().includes('Sticky_Footer') &&\n          !event.isEmpty && flag\n        ) {\n          flag = false;\n          addCloseButton(stickyBannerSizeDiv);\n        }\n      });\n      googletag.enableServices();\n    });\n\n  }\n\n  let addSideBarAdUnits = () => {\n    if (window.screen.width > 600) {\n      let SideBarAdUnit = document.createElement('div');\n      SideBarAdUnit.dataset.onpage = true;\n      SideBarAdUnit.dataset.adpath = '/339474670,87143780/PassportCruise/Side';\n      SideBarAdUnit.style.textAlign = 'center';\n      SideBarAdUnit.style.marginTop = '40px';\n      SideBarAdUnit.style.marginBottom = '40px';\n      SideBarAdUnit.style.minHeight = '250px';\n      //SideBarAdUnit.style.backgroundColor = 'green';\n      let pArr4 = document.querySelectorAll('#more_articles_block > .inner > article:nth-child(2)');\n      pArr4.forEach(pElement => pElement.parentElement.insertBefore(SideBarAdUnit.cloneNode(true), pElement.nextElementSibling));\n    }\n  }\n\n  let addSideBarBottomAdUnits = () => {\n    if (window.screen.width > 600) {\n      let SideBarBottomAdUnit = document.createElement('div');\n      SideBarBottomAdUnit.dataset.onpage = true;\n      SideBarBottomAdUnit.dataset.adpath = '/339474670,87143780/PassportCruise/Side';\n      SideBarBottomAdUnit.style.textAlign = 'center';\n      SideBarBottomAdUnit.style.marginTop = '40px';\n      SideBarBottomAdUnit.style.marginBottom = '40px';\n      SideBarBottomAdUnit.style.minHeight = '250px';\n      //SideBarBottomAdUnit.style.backgroundColor = 'green';\n      let pArr8 = document.querySelectorAll('#more_articles_block > .inner');\n      pArr8.forEach(pElement => pElement.parentElement.appendChild(SideBarBottomAdUnit.cloneNode(true), pElement.nextElementSibling));\n    }\n  }\n\nlet SideBarstickyBannerRight = () => {\n    if (window.innerWidth > 1650) {\n      let banner = document.createElement('div');\n      banner.dataset.onpage = true;\n      banner.dataset.adpath = '/339474670,87143780/PassportCruise/Right_Sky';\n      banner.style.position = 'fixed';\n      banner.style.top = '60%';\n      banner.style.right = '20px';\n      banner.style.marginTop = '-271px';\n      window.screen.width >= 730 && window.screen.width < 1600 ? banner.style.width = '120px' : window.screen.width >= 1600 ? banner.style.width = '160px' : null;\n      banner.style.height = '600px';\n      banner.style.zIndex = 'auto';\n      document.body.append(banner);\n\n      // Intersection Observer setup\n      let observer = new IntersectionObserver((entries, observer) => {\n        entries.forEach(entry => {\n          if (entry.isIntersecting) {\n            // If the banner intersects with a .show_in_desktop element, hide the banner\n            banner.style.display = 'none';\n          } else {\n            // Optional: Show the banner again if the condition no longer applies\n            banner.style.display = 'block';\n          }\n        });\n      }, {\n        // Using the entire viewport to check for intersection\n        root: null, // null means the viewport\n        threshold: 0.1 // Trigger if at least 10% of the banner is intersected\n      });\n\n      // Observe all current and future elements with class 'show_in_desktop'\n      document.querySelectorAll('.show_in_desktop').forEach(element => {\n        observer.observe(element);\n      });\n\n      // If new elements with 'show_in_desktop' can be added dynamically, consider observing for DOM changes or calling a function to observe new elements when they are added.\n    }\n  }\n\nlet addVidDisplayAdUnits = () => {\n    let VidDisplayAdUnit = document.createElement('div');\n    VidDisplayAdUnit.dataset.onpage = true;\n    VidDisplayAdUnit.dataset.adpath = '/339474670,87143780/PassportCruise/VidDisplay';\n    VidDisplayAdUnit.style.textAlign = '-webkit-center';\n    VidDisplayAdUnit.style.marginTop = '40px';\n    VidDisplayAdUnit.style.marginBottom = '40px';\n    VidDisplayAdUnit.style.minHeight = '250px'\n    //VidDisplayAdUnit.style.backgroundColor = 'blue'\n    let pArr18 = document.querySelectorAll('#article_inner > p:nth-of-type(2)');\n    pArr18.forEach(pElement => pElement.parentElement.insertBefore(VidDisplayAdUnit.cloneNode(true), pElement.nextElementSibling));\n  }\n\n  function createInterstitialCmd() {\n\n    const slot = window.googletag.defineOutOfPageSlot(\n      '/339474670,87143780/PassportCruise/PassportCruise_Interstitial', window.googletag.enums.OutOfPageFormat.INTERSTITIAL);\n\n    if (!slot) {\n      console.error('Failed to define out of page slot - Interstitial');\n      return;\n    }\n\n    slot.addService(window.googletag.pubads());\n    window.googletag.enableServices();\n    window.googletag.display(slot);\n\n  }\n\n  function injectTaboolaFooterFeed() {\n\n    // Select all elements matching the selector\n    var elements = document.querySelectorAll('#comments_wrp');\n\n    // Check if elements exist\n    if (elements.length === 0) {\n      console.log('No elements found with the selector.');\n      return;\n    }\n\n    // Loop through each matched element\n    elements.forEach(function (element) {\n      // Create the <div> element\n      var divElement = document.createElement('div');\n      divElement.id = 'taboola-organic-feed';\n      // divElement.style.maxWidth = '970px'; // Limit width to 970px\n      // divElement.style.margin = '0 auto'; // Center the widget\n\n      // Create the <script> element\n      var scriptElement = document.createElement('script');\n      scriptElement.type = 'text/javascript';\n      scriptElement.text = `\n            window._taboola = window._taboola || [];\n            _taboola.push({\n                mode: 'alternating-thumbnails-a',\n        container: 'taboola-organic-feed',\n        placement: 'Organic Feed',\n        target_type: 'mix'\n            });\n        `;\n\n      // Append the <div> and <script> to the current element\n      element.appendChild(divElement);\n      element.appendChild(scriptElement);\n    });\n\n    console.log('Taboola infinite footer feed injected successfully.');\n  }\n\n  function injectTaboolaSidebar() {\n    // Select all elements matching the selector\n    var elements = document.querySelectorAll('.left_side');\n\n    // Check if elements exist\n    if (elements.length === 0) {\n      console.log('No elements found with the selector.');\n      return;\n    }\n\n    // Loop through each matched element\n    elements.forEach(function (element) {\n      // Find the last <div> inside the current element\n      var lastDiv = element.querySelector('div:last-of-type');\n\n      // If a <div> exists, append after it\n      if (lastDiv) {\n        // Create the <div> element\n        var divElement = document.createElement('div');\n        divElement.id = 'taboola-left-rail-1x10-thumbnails';\n\n        // Create the <script> element\n        var scriptElement = document.createElement('script');\n        scriptElement.type = 'text/javascript';\n        scriptElement.text = `\n                window._taboola = window._taboola || [];\n                _taboola.push({\n                    mode: 'thumbnails-rails-1x10',\n          container: 'taboola-left-rail-1x10-thumbnails',\n          placement: 'Left Rail 1x10 Thumbnails',\n          target_type: 'mix'\n                });\n            `;\n\n        // Insert the <div> and <script> after the last <div>\n        lastDiv.insertAdjacentElement('afterend', divElement);\n        divElement.insertAdjacentElement('afterend', scriptElement);\n      } else {\n        console.log('No <div> elements found inside:', element);\n      }\n    });\n  }\n\n  let addATFAdUnits = () => {\n    let ATFAdUnit = document.createElement('div');\n    ATFAdUnit.dataset.onpage = true;\n    ATFAdUnit.dataset.adpath = '/339474670,87143780/PassportCruise/ATF';\n\n    ATFAdUnit.style.display = 'block'; // Changed to block for centering\n    ATFAdUnit.style.marginTop = '40px';\n    ATFAdUnit.style.marginBottom = '40px';\n    ATFAdUnit.style.marginLeft = 'auto';\n    ATFAdUnit.style.marginRight = 'auto';\n    ATFAdUnit.style.minHeight = '250px';\n    ATFAdUnit.style.textAlign = 'center'; // <-- Important line\n\n// Optional: Set a background color for testing\n    // ATFAdUnit.style.backgroundColor = 'blue';\n\n    let targetElement = document.querySelector('#content');\n    if (targetElement && targetElement.parentElement) {\n      targetElement.parentElement.insertBefore(ATFAdUnit, targetElement);\n    }\n  };\n\nfunction createAudioPlayer(customElementSelector = \"#article_content\", excludeSelectors = []) {\n  const target = document.querySelector('.head_content');\n  if (!target) return console.error(\"❌ Target element not found.\");\n\n  const API_URL = \"https://plsbmrgivrjwya6jq2jbqaqc6m0dajyq.lambda-url.us-east-1.on.aws/\";\n  const isDarkTheme = 'white' === \"dark\";\n\n  // State management\n  const state = {\n    audio: null,\n    fullText: '',\n    currentBlobUrl: null,\n    prefetchedAudioBlob: null,\n    prefetchedBlobUrl: null,\n    isPlaying: false,\n    isLoading: false,\n    isPrefetching: false,\n    customSelector: customElementSelector, // Store the selector passed to function\n    excludeSelectors: Array.isArray(excludeSelectors) ? excludeSelectors : [], // Store exclusion selectors\n    handlers: { canplay: null, timeupdate: null, error: null }\n  };\n\n  // Theme configuration\n  const themes = {\n    light: {\n      bg: \"#FFFFFF\", border: \"#C8C8C8\", text: \"#202020\",\n      subtext: \"#666\", fill: \"#1c1c1c\", progress: \"#e4e4e4\", progressFill: \"#848484\"\n    },\n    dark: {\n      bg: \"#1E1E1E\", border: \"#C8C8C8\", text: \"#F1F1F1\",\n      subtext: \"#BBB\", fill: \"#F1F1F1\", progress: \"#444\", progressFill: \"#888\"\n    }\n  };\n  const selectedTheme = themes[isDarkTheme ? 'dark' : 'light'];\n\n  // Create UI components\n  function createPlayerUI() {\n    const wrapper = document.createElement('div');\n    wrapper.id = \"adn-audio-wrapper\";\n\n    const shadow = wrapper.attachShadow({ mode: 'open' });\n    window.shadowAdn = shadow;\n\n    const styles = `\n      :host { all: initial; }\n      .player {\n        direction: ltr; display: flex; flex-direction: column; font-family: Verdana, sans-serif;\n        border-radius: 8px 8px 0 0; background: ${selectedTheme.bg};\n        padding: 8px 12px; box-sizing: border-box; width: 100%; color: ${selectedTheme.text};\n      }\n      .top-row { display: flex; justify-content: space-between; align-items: center; }\n      .title { font-size: 14px; color: ${selectedTheme.text}; position: relative; right: 44%; }\n      .progress { margin: 6px 0; height: 6px; background: ${selectedTheme.progress}; border-radius: 4px; overflow: hidden; position: relative; }\n      .progress-inner { height: 100%; width: 0%; background: ${selectedTheme.progressFill}; }\n      .controls-row { display: flex; align-items: center; justify-content: space-between; margin-top: 4px; }\n      .time { font-size: 10px; color: ${selectedTheme.subtext}; min-width: 45px; text-align: center; }\n      .controls { display: flex; align-items: center; gap: 12px; }\n      .btn { background: none; border: none; cursor: pointer; padding: 0; }\n      .btn svg { width: 30px; height: 30px; fill: ${selectedTheme.fill}; }\n      .loading svg { animation: spin 1s linear infinite; }\n      .prefetching svg { opacity: 0.6; }\n      @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n\n      @media (max-width: 768px) {\n        .title { right: 38%; }\n      }\n\n      @media (min-width: 769px) {\n        .title { right: 44%; }\n      }\n    `;\n\n        // Detect language from URL\n    let titleText = \"Listen to this article\"; // default\n    if (location.href.includes(\"/he/\")) {\n    titleText = \"לחצו להאזנה לכתבה\";\n    } else if (location.href.includes(\"/ar/\")) {\n    titleText = \"انقر للاستماع للمقال\";\n    } else if (location.href.includes(\"/fr/\")) {\n    titleText = \"Écoutez cet article\";\n    } else if (location.href.includes(\"/en/\")) {\n    titleText = \"Listen to this article\";\n    }\n\n    const playerHTML = `\n    <div class=\"player\">\n        <div class=\"top-row\">\n        <div class=\"controls\">\n            <button id=\"toggleBtn\" class=\"btn\" aria-label=\"Play or Stop\">\n            <svg id=\"btnIcon\" viewBox=\"0 0 36 36\">\n                <circle cx=\"18\" cy=\"18\" r=\"17\" stroke=\"${selectedTheme.fill}\" stroke-width=\"2\" fill=\"none\"/>\n                <path d=\"M14 12L26 18L14 24Z\" fill=\"${selectedTheme.fill}\"/>\n            </svg>\n            </button>\n        </div>\n        <div class=\"title\">${titleText}</div>\n        </div>\n        <div class=\"progress\">\n        <div class=\"progress-inner\" id=\"progressBar\"></div>\n        </div>\n        <div class=\"controls-row\">\n        <div class=\"time\" id=\"currentTime\">00:00</div>\n        <div class=\"time\" id=\"duration\">00:00</div>\n        </div>\n    </div>\n    `;\n\n    shadow.innerHTML = `<style>${styles}</style>${playerHTML}`;\n    target.before(wrapper);\n\n    return { wrapper, shadow };\n  }\n\n    const getAdPath = () => { \n        return '/339474670,87143780/PassportCruise/PassportCruise_ReadAloud'; // default fallback \n    };\n\n  function createAdSlot() {\n    const adSlot = document.createElement('div');\n    const adpath = getAdPath();\n    Object.assign(adSlot.dataset, {\n      onpage: 'true',\n      adpath: adpath,\n    });\n    adSlot.id = 'gpt_unit_'+adpath+'_0';\n\n    adSlot.style.cssText = `\n      text-align: -webkit-center;\n      min-height: 90px;\n      padding: 12px;\n      background: ${selectedTheme.bg};\n    `;\n\n    const logoLink = document.createElement('a');\n    logoLink.href = \"https://adnimation.com\";\n    logoLink.target = \"_blank\";\n\n    const logo = document.createElement('img');\n    logo.id = \"AdnimationLogo\";\n    logo.src = \"https://adncdn.net/Adnimation%20Logo%20Transparent.png\";\n    logo.style.cssText = `\n      width: 50px;\n      height: 14px;\n    `;\n\n    logoLink.append(logo);\n\n    const separator = document.createElement('div');\n    separator.style.cssText = `\n      height: 1px;\n      margin: 0 -12px 12px;\n    `;\n    window.shadowAdn.querySelector(\".controls-row\").append(logoLink);\n    return adSlot;\n  }\n\n  // Utility functions\n  const formatTime = (s) => {\n    const m = Math.floor(s / 60).toString().padStart(2, '0');\n    const sec = Math.floor(s % 60).toString().padStart(2, '0');\n    return `${m}:${sec}`;\n  };\n\n  function cleanText(input) {\n    return input\n      .replace(/https?:\\/\\/\\S+/g, '')      // strip URLs\n      .replace(/\\b(?:UPDATED|PUBLISHED)?\\d{6,}\\b/g, '')\n      .replace(/(?:FOLLOW US ON.*|INSTAGRAM.*|TWITTER.*|THREADS.*)/gi, '')\n      .replace(/[^\\p{L}\\p{N}\\s.,!?\\-]/gu, '')  // keep all letters, digits, spaces and punctuation\n      .replace(/\\s{2,}/g, ' ')\n      .replace(/\\s*([.,!?])\\s*/g, '$1 ')\n      .replace(/\\n{2,}/g, '\\n')\n      .trim();\n  }\n\n  // Helper function to remove excluded elements\n  function removeExcludedElements(container) {\n    if (!state.excludeSelectors || state.excludeSelectors.length === 0) {\n      return container;\n    }\n\n    // Clone the container to avoid modifying the original DOM\n    const clonedContainer = container.cloneNode(true);\n    \n    // Remove all elements matching exclude selectors\n    state.excludeSelectors.forEach(selector => {\n      try {\n        const elementsToRemove = clonedContainer.querySelectorAll(selector);\n        elementsToRemove.forEach(element => {\n          element.remove();\n        });\n        console.log(`🚫 Excluded ${elementsToRemove.length} elements matching: ${selector}`);\n      } catch (err) {\n        console.warn(`⚠️ Invalid exclude selector: ${selector}`, err);\n      }\n    });\n\n    return clonedContainer;\n  }\n\n  // Smart article content extraction\n  function extractArticleContent(container) {\n    const paragraphs = Array.from(container.querySelectorAll('p'));\n    \n    if (paragraphs.length === 0) return '';\n    \n    // Get title and subtitle once for deduplication\n    const titleEl = document.querySelector('h1.page_title, h1[itemprop=\"name\"]');\n    const subtitleEl = document.querySelector('h2.short_text, h2[itemprop=\"description\"]');\n    const title = titleEl?.innerText?.trim() || '';\n    const subtitle = subtitleEl?.innerText?.trim() || '';\n    \n    // Filter out non-article content\n    const articleParagraphs = paragraphs.filter(p => {\n      const text = p.innerText?.trim() || '';\n      \n      // Skip if too short\n      if (text.length < 20) return false;\n      \n      // Skip if it's duplicate of title or subtitle\n      if (title && text === title) return false;\n      if (subtitle && text === subtitle) return false;\n      \n      // Skip promotional/social media content\n      if (/(?:WhatsApp|Telegram|Facebook|Twitter|Instagram|follow|subscribe|חדשות.*עדכונים|מבצעים)/i.test(text)) return false;\n      \n      // Skip if mostly links or has many symbols\n      const linkRatio = (text.match(/>>|http|www|\\.com/g) || []).length / text.length * 100;\n      if (linkRatio > 5) return false;\n      \n      // Skip if contains mostly styled/highlighted promotional text\n      if (p.querySelector('span[style*=\"background-color\"]') && text.length < 100) return false;\n      \n      // Skip navigation-like content\n      if (/^(תגיות|אל תפספסו|הכתבה הבאה|עודכן|פורסם):/i.test(text)) return false;\n      \n      return true;\n    });\n    \n    // Build final text: title + subtitle + unique article content\n    const parts = [];\n    if (title) parts.push(title);\n    if (subtitle) parts.push(subtitle);\n    \n    const articleText = articleParagraphs\n      .map(p => p.innerText?.trim() || '')\n      .filter(text => text.length > 0)\n      .join(' ');\n    \n    if (articleText) parts.push(articleText);\n    \n    return parts.join('. ');\n  }\n\n  // Enhanced text extraction with smart article detection\n  function extractText(useCustomSelector = true) {\n    function isBadText(text) {\n        return (\n            !text || text.length < 10 ||\n            /^(?:[,.\\-–•\\s]*)$/.test(text) ||\n            text.replace(/[a-zA-Zא-ת0-9\\u0600-\\u06FF]/g, '').length / text.length > 0.7 ||  // ⬅️ added Arabic range\n            /(?:[,.\\-–•]{2,}){4,}/.test(text)\n        );\n    }\n\n// If custom selector provided, use smart extraction on that container\n    if (useCustomSelector && state.customSelector) {\n      try {\n        const element = document.querySelector(state.customSelector);\n        if (element) {\n          //console.log(`🎯 Found element with custom selector: ${state.customSelector}`);\n          \n          // Apply exclusions first\n          const processedElement = removeExcludedElements(element);\n          \n          // Use smart article extraction\n          const text = extractArticleContent(processedElement);\n          \n          //console.log(`📝 Smart extracted text length: ${text.length} characters`);\n          //console.log(`📋 Text preview: ${text}...`);\n          \n          if (text.length > 0 && !isBadText(text)) {\n            //console.log(`✅ Using smart extraction with custom selector: ${state.customSelector}`);\n            if (state.excludeSelectors.length > 0) {\n              //console.log(`🚫 Applied exclusions: ${state.excludeSelectors.join(', ')}`);\n            }\n            return text;\n          } else if (text.length === 0) {\n            //console.warn(`⚠️ Smart extraction found no article content after filtering`);\n          } else {\n            //console.warn(`⚠️ Smart extracted text quality is poor (${text.length} chars)`);\n          }\n        } else {\n          //console.warn(`⚠️ No element found with selector: ${state.customSelector}`);\n        }\n      } catch (err) {\n        console.error(`❌ Invalid selector: ${state.customSelector}`, err);\n      }\n      \n      console.log(`🛑 Custom selector specified but smart extraction failed`);\n      return '';\n    }\n\n    // Original extraction logic as fallback\n    // Try structured data first\n    for (const script of document.querySelectorAll('script[type=\"application/ld+json\"]')) {\n      try {\n        const data = JSON.parse(script.textContent);\n        const type = data['@type'];\n        const isNews = (typeof type === 'string' && type === 'NewsArticle') ||\n                      (Array.isArray(type) && type.includes('NewsArticle'));\n\n        if (isNews && data.articleBody) {\n          const raw = `${data.headline || ''}\\n\\n${data.articleBody}`.trim();\n          if (!isBadText(raw)) return raw;\n        }\n      } catch (_) {}\n    }\n\n    // Fallback to DOM heuristics\n    const selectors = ['article', '[itemprop=articleBody]', '.article-body', 'main', '[role=main]'];\n    let container = selectors.map(sel => document.querySelector(sel))\n      .find(el => el?.innerText?.trim().length > 100);\n\n    if (!container) {\n      container = Array.from(document.querySelectorAll(\"div\"))\n        .filter(div => {\n          const text = div.innerText?.trim() || '';\n          if (text.length < 150 || div.offsetHeight < 100) return false;\n          const goodTags = div.querySelectorAll(\"p,h1,h2,h3\").length;\n          const badTags = div.querySelectorAll(\"li,a,ul\").length;\n          return goodTags - badTags > 2;\n        })\n        .sort((a, b) => b.innerText.length - a.innerText.length)[0];\n    }\n\n    if (!container) return '';\n\n    // Apply exclusions to the found container\n    const processedContainer = removeExcludedElements(container);\n\n    const ignorePatterns = [\n      /by\\s+\\w+/i, /next article/i, /previous article/i, /get the news/i, /subscribe/i,\n      /follow us/i, /author|editor|posted|published/i, /[\\d]{1,2} [a-z]{3,9} \\d{4}/i,\n      /read more|comments|share this|view gallery/i\n    ];\n\n    const lines = Array.from(processedContainer.querySelectorAll(\"p, h1, h2, h3\"))\n      .map(el => el.innerText?.trim() || '')\n      .filter(text => text.length > 30 && !ignorePatterns.some(rx => rx.test(text)));\n\n    const fallbackText = Array.from(new Set(lines)).join(\"\\n\\n\");\n    \n    if (state.excludeSelectors.length > 0 && !isBadText(fallbackText)) {\n      console.log(`🎯 Applied exclusions to fallback extraction: ${state.excludeSelectors.join(', ')}`);\n    }\n    \n    return isBadText(fallbackText) ? '' : fallbackText;\n  }\n\n  // Audio management\n  function cleanup() {\n    if (state.audio) {\n      Object.values(state.handlers).forEach(handler => {\n        if (handler) state.audio.removeEventListener(handler.type, handler.fn);\n      });\n      state.audio.pause();\n      state.audio.src = '';\n      state.audio = null;\n    }\n    [state.currentBlobUrl, state.prefetchedBlobUrl].forEach(url => {\n      if (url) URL.revokeObjectURL(url);\n    });\n    Object.assign(state, {\n      currentBlobUrl: null, prefetchedBlobUrl: null, prefetchedAudioBlob: null,\n      isPlaying: false, isLoading: false, handlers: { canplay: null, timeupdate: null, error: null }\n    });\n  }\n\n  function updateIcon(type) {\n    const iconEl = shadow.getElementById(\"btnIcon\");\n    const toggleBtn = shadow.getElementById(\"toggleBtn\");\n\n    const icons = {\n      play: `<circle cx=\"18\" cy=\"18\" r=\"17\" stroke=\"${selectedTheme.fill}\" stroke-width=\"2\" fill=\"none\"/>\n        <path d=\"M14 12L26 18L14 24Z\" fill=\"${selectedTheme.fill}\"/>`,\n      stop: `<circle cx=\"18\" cy=\"18\" r=\"17\" stroke=\"${selectedTheme.fill}\" stroke-width=\"2\" fill=\"none\"/>\n        <rect x=\"13\" y=\"12\" width=\"10\" height=\"12\" fill=\"${selectedTheme.fill}\"/>`,\n      loading: `<circle cx=\"18\" cy=\"18\" r=\"17\" stroke=\"${selectedTheme.fill}\" stroke-width=\"2\" fill=\"none\"/>\n        <path d=\"M18 10a8 8 0 1 1-8 8\" stroke=\"${selectedTheme.fill}\" stroke-width=\"2\" fill=\"none\"/>`\n    };\n\n    iconEl.innerHTML = icons[type] || icons.play;\n    toggleBtn.className = `btn ${type === 'loading' ? 'loading' : type === 'prefetching' ? 'prefetching' : ''}`;\n  }\n\n  async function fetchAudio(text) {\n    const response = await fetch(API_URL, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ text: cleanText(text), gender: \"male\", pageUrl: location.href })\n    });\n\n    try {\n      const data = await response.clone().json();\n      if (data.audioUrl) {\n        const audioRes = await fetch(data.audioUrl);\n        if (!audioRes.ok) throw new Error(\"Failed to fetch audio file.\");\n        return await audioRes.blob();\n      }\n      throw new Error(\"Missing audioUrl in response.\");\n    } catch {\n      if (response.ok && response.headers.get(\"Content-Type\") === \"audio/mpeg\") {\n        return await response.blob();\n      }\n      throw new Error(`API error: ${await response.text()}`);\n    }\n  }\n\n  async function setupAudio(audioBlob) {\n    const blobUrl = URL.createObjectURL(audioBlob);\n    state.currentBlobUrl = blobUrl;\n    state.audio = new Audio(blobUrl);\n    state.audio.preload = \"auto\";\n\n    // Get elements first\n    const elements = {\n      duration: shadow.getElementById(\"duration\"),\n      progressBar: shadow.getElementById(\"progressBar\"),\n      currentTime: shadow.getElementById(\"currentTime\")\n    };\n\n    // Set up duration handler\n    state.audio.addEventListener('loadedmetadata', () => {\n      const total = state.audio.duration || 0;\n      if (elements.duration) {\n        elements.duration.textContent = formatTime(total);\n      }\n      console.log(\"Duration set:\", formatTime(total));\n    });\n\n    // Also try with canplaythrough as backup\n    state.audio.addEventListener('canplaythrough', () => {\n      const total = state.audio.duration || 0;\n      if (elements.duration && elements.duration.textContent === \"00:00\") {\n        elements.duration.textContent = formatTime(total);\n      }\n    });\n\n    state.handlers.canplay = {\n      type: 'canplaythrough',\n      fn: () => {\n        state.audio.play().catch(err => {\n          console.error(\"Failed to play audio:\", err);\n          alert(\"שגיאה לא הצליח להטעין\");\n        });\n\n        state.isPlaying = true;\n        state.isLoading = false;\n        updateIcon('stop');\n      }\n    };\n\n    state.handlers.timeupdate = {\n      type: 'timeupdate',\n      fn: () => {\n        if (!state.audio.duration) return;\n        const percent = (state.audio.currentTime / state.audio.duration) * 100;\n        elements.progressBar.style.width = `${percent}%`;\n        elements.currentTime.textContent = formatTime(state.audio.currentTime);\n      }\n    };\n\n    state.handlers.error = {\n      type: 'error',\n      fn: (e) => {\n        console.error(\"Audio error:\", e);\n        alert(\"לא ניתן להפעיל את קובץ השמע.\");\n        cleanup();\n        updateIcon('play');\n      }\n    };\n\n    Object.values(state.handlers).forEach(handler => {\n      state.audio.addEventListener(handler.type, handler.fn);\n    });\n  }\n\n  function enableSeeking(shadowRoot) {\n    const progressBar = shadowRoot.getElementById(\"progressBar\");\n    const progressContainer = progressBar.parentElement;\n\n    let isDragging = false;\n\n    const seek = (event) => {\n      if (!state.audio || !state.audio.duration) return;\n\n      const rect = progressContainer.getBoundingClientRect();\n      const clickX = event.clientX - rect.left;\n      const percentage = Math.min(Math.max(clickX / rect.width, 0), 1);\n      const newTime = percentage * state.audio.duration;\n\n      state.audio.currentTime = newTime;\n      progressBar.style.width = `${percentage * 100}%`;\n    };\n\n    progressContainer.addEventListener(\"mousedown\", (event) => {\n      isDragging = true;\n      seek(event);\n    });\n\n    document.addEventListener(\"mousemove\", (event) => {\n      if (isDragging) seek(event);\n    });\n\n    document.addEventListener(\"mouseup\", () => {\n      isDragging = false;\n    });\n\n    // Also support direct click without drag\n    progressContainer.addEventListener(\"click\", seek);\n  }\n\n  async function prefetchAudio() {\n    if (state.isPrefetching || state.prefetchedAudioBlob) return;\n\n    const text = extractText();\n    if (!text) return console.warn(\"No text found for prefetching\");\n\n    state.isPrefetching = true;\n    updateIcon('prefetching');\n\n    try {\n      const audioBlob = await fetchAudio(text);\n      if (!audioBlob?.size) throw new Error(\"Empty audio blob received\");\n\n      state.prefetchedAudioBlob = audioBlob;\n\n      // Create a temporary audio to get duration immediately\n      const tempAudio = new Audio(URL.createObjectURL(audioBlob));\n      tempAudio.addEventListener('loadedmetadata', () => {\n        const durationEl = shadow.getElementById(\"duration\");\n        if (durationEl && tempAudio.duration) {\n          durationEl.textContent = formatTime(tempAudio.duration);\n          console.log(\"Duration prefetched:\", formatTime(tempAudio.duration));\n        }\n        // Clean up temp audio\n        URL.revokeObjectURL(tempAudio.src);\n      });\n\n      console.log(\"✅ Audio prefetched successfully\");\n    } catch (err) {\n      console.error(\"Prefetch failed:\", err);\n      state.prefetchedAudioBlob = null;\n    } finally {\n      state.isPrefetching = false;\n      updateIcon('play');\n    }\n  }\n\n  async function playAudio() {\n    const wasPrefetched = !!state.prefetchedAudioBlob;\n    const audioBlob = state.prefetchedAudioBlob;\n\n    cleanup(); // This clears state.prefetchedAudioBlob, so we copy first\n    state.isLoading = true;\n    updateIcon('loading');\n\n    try {\n      let finalAudioBlob = audioBlob;\n\n      if (!finalAudioBlob) {\n        const text = extractText();\n        if (!text) throw new Error(\"No readable text found in article\");\n        finalAudioBlob = await fetchAudio(text);\n      }\n\n      if (!finalAudioBlob?.size) throw new Error(\"Empty audio blob\");\n\n      await setupAudio(finalAudioBlob);\n\n      // Preserve prefetch blob if it was used\n      if (wasPrefetched) {\n        state.prefetchedAudioBlob = finalAudioBlob;\n      }\n\n    } catch (err) {\n      console.error(\"Failed to play audio:\", err);\n      alert(\"שגיאה בהפעלת השמע\");\n      cleanup();\n      updateIcon('play');\n    }\n  }\n\n  // Initialize\n  const outerWrapper = document.createElement(\"div\");\n  outerWrapper.id = \"adn-audio-outer-wrapper\";\n\n  outerWrapper.style.cssText = `\n    width: 100%;\n    border-radius: 8px;\n    overflow: hidden;\n    background: ${selectedTheme.bg};\n    margin-bottom: 16px;\n  `;\n\n  const { wrapper, shadow } = createPlayerUI();\n  enableSeeking(shadow);\n\n  outerWrapper.appendChild(wrapper);\n  const adSlot = createAdSlot();\n  //outerWrapper.appendChild(adSlot); //uncomment to inject ad from our side\n\n  target.after(outerWrapper);\n\n  shadow.getElementById(\"toggleBtn\").addEventListener(\"click\", () => {\n    if (state.isLoading) return;\n    state.isPlaying ? cleanup() && updateIcon('play') : playAudio();\n  });\n\n  // Log initialization info\n  if (state.customSelector) {\n    console.log(`🎯 Audio player initialized with custom selector: ${state.customSelector}`);\n  }\n  if (state.excludeSelectors.length > 0) {\n    console.log(`🚫 Exclude selectors configured: ${state.excludeSelectors.join(', ')}`);\n  }\n\n  // Uncomment to enable prefetching\n  // setTimeout(prefetchAudio, 1000);\n  \n  // Return control object for external manipulation if needed\n  return {\n    play: playAudio,\n    stop: cleanup,\n    setSelector: (selector) => {\n      state.customSelector = selector;\n      console.log(`Updated selector to: ${selector}`);\n    },\n    addExcludeSelector: (selector) => {\n      if (!state.excludeSelectors.includes(selector)) {\n        state.excludeSelectors.push(selector);\n        console.log(`Added exclude selector: ${selector}`);\n      }\n    },\n    removeExcludeSelector: (selector) => {\n      const index = state.excludeSelectors.indexOf(selector);\n      if (index > -1) {\n        state.excludeSelectors.splice(index, 1);\n        console.log(`Removed exclude selector: ${selector}`);\n      }\n    },\n    setExcludeSelectors: (selectors) => {\n      state.excludeSelectors = Array.isArray(selectors) ? selectors : [];\n      console.log(`Updated exclude selectors to: ${state.excludeSelectors.join(', ')}`);\n    },\n    getExcludeSelectors: () => state.excludeSelectors.slice(), // Return copy\n    getExtractedText: () => extractText(),\n    prefetch: prefetchAudio\n  };\n}\n\n  onDomReady(async () => {\n    try {\n      // Add custom slots creation logic here 👇\n      addVidDisplayAdUnits();\n      addSideBarAdUnits();\n      addSideBarBottomAdUnits();\n      window.location.href != 'https://passportcruise.co.il/' ? SideBarstickyBannerRight() : null;\n      createAudioPlayer();\n      injectTaboolaFooterFeed();\n      injectTaboolaSidebar();\n      createInterstitial();\n      //createStickyBanner();\n      // addATFAdUnits();\n\n    } catch (err) {\n      console.error('Failed to create slots:', err.stack);\n    }\n\n    // Must be called last\n    initAds();\n    observeSlots();\n  });\n\n})(window, document);\n\n"]}