wadsBlocking=0;var wads;(function(){wads={update:'09-11-2021 15:16:01',sitepage:'[site]/[page]',sitegroup:'allocine',query:'[query]',mode:'[mode]',callBaseUrl:'http://goutee.top',cookieBaseUrl:'http://goutee.top',callBaseUrlAcceptable:'http://acceptable.wbdds.com',cookieBaseUrlAcceptable:'http://acceptable.wbdds.com',callBaseUrlAutopromo:'http://autopromo.wbdds.com',cookieBaseUrlAutopromo:'http://autopromo.wbdds.com',jsSyncCallMethod:'p-c-js',jsAsyncCallMethod:'p-c-async',jsSyncCallPositionMethod:'p-cp-js',jsAsyncCallPositionMethod:'p-cp-async',vastCallMethod:'p-cp-vast2',callFuncUnpacked:'0',includeUrl:'include/async',detectAcceptableAdsUrl:'detect-acceptable/',adBlocking:wadsBlocking,acceptableAds:0,positionCryptKey:Math.round(Math.random()*1000000).toString(),cnxtype:((navigator!==undefined&&navigator.connection!==undefined&&navigator.connection.type!==undefined)?navigator.connection.type:"unknown"),devicetype:"unknown",os:"unknown",nbpageviews:"unknown",site:'',page:'',pbi:[],autoload:true,isReady:false,alreadyStarted:false,beforeStartAlreadyCall:false,startWithoutParam:false,options:{"adPerf":"0","amazon":"0","amp":"1","appnexus":"0","audiencescience":"0","autoRefresh":"1","cookiesync":"0","cphmeasurement":"0","customAudience":"0","deviceDetection":"1","funcUnpacked":"1","krux":"0","nugg":"0","public":"1","prebid":"0","rgpd":"1","start":"0","stratocube":"0","tradelab":"0","visibility":"1"},log_prefix:'Webediads',log_style:'color:#ffffff; background:#00561b;padding:1px 5px 1px 5px;border-radius:2px',adblock:{loopCheckTime:50,loopMaxNumber:10,lsCacheKey:'adblockDetected',lsCacheTTL:86400*30,_var:{bait:null,loopNumber:0,detected:null},detected:function(){var detected=0;if(this._var.detected!==null){detected=this._var.detected;}else if(wads.localStorage.exists(this.lsCacheKey)){detected=wads.localStorage.get(this.lsCacheKey);}
wadsBlocking=detected;wads.log('[wads.adblock.detected]() return '+detected);return detected;},check:function(){this._var.loopNumber++;var detected=0;if(this._var.bait===null){this.creatBait();}
if(window.document.body!==null&&(window.document.body.getAttribute('abp')!==null||this._var.bait.offsetParent===null||this._var.bait.offsetHeight===0||this._var.bait.offsetLeft===0||this._var.bait.offsetTop===0||this._var.bait.offsetWidth===0||this._var.bait.clientHeight===0||this._var.bait.clientWidth===0)){detected=1;}
wads.log('[wads.adblock.check] loop '+this._var.loopNumber+(detected?' adblock is detected':' adblock is not detected'));if(detected||this._var.loopNumber>=this.loopMaxNumber){if(this._var.loopNumber<this.loopMaxNumber){wads.log('[wads.adblock.check] Adblock detected before end of loop at turn '+this._var.loopNumber);wads.stats.logDuration('wadsAdblockCheck',this._var.loopNumber,'adbDetected')}
if(wads.adBlocking!=detected){wads.adBlocking=detected;}
wadsBlocking=detected;this._var.detected=detected;this._var.loopNumber=0;wads.localStorage.setex(this.lsCacheKey,this.lsCacheTTL,detected);if(!detected)this.destroyBait();}else{setTimeout(function(){wads.adblock.check();},this.loopCheckTime);}},creatBait:function(){wads.log('[wads.adblock.creatBait]()');var bait=document.createElement('div');bait.setAttribute('class','pub_300x250 pub_300x250m pub_728x90 text-ad textAd text_ad text_ads text-ads text-ad-links');bait.setAttribute('style','width: 1px !important; height: 1px !important; position: absolute !important; left: -10000px !important; top: -1000px !important;');if(window.document.body!==null){this._var.bait=window.document.body.appendChild(bait);this._var.bait.offsetParent;this._var.bait.offsetHeight;this._var.bait.offsetLeft;this._var.bait.offsetTop;this._var.bait.offsetWidth;this._var.bait.clientHeight;this._var.bait.clientWidth;}},destroyBait:function(){wads.log('[wads.adblock.destroyBait]()');window.document.body.removeChild(this._var.bait);this._var.bait=null;}},autoRefresh:{checkInterval:1,positions:{},defaultRefreshInterval:25,visibilityFloor:50,isRunning:false,setIntervalValue:true,alreadyDisplayed:{},init:function(positionName,refreshInterval){wads.log('[wads.autoRefresh.init]('+positionName+', '+refreshInterval+') ');if(wads.mode!='async'){wads.warn('wads.autoRefresh.init only in async mode');return;}
if(!document.getElementById(wads.encryptPositionName(positionName))){wads.warn('wads.autoRefresh.init("'+positionName+'") can not find position');return;}
if(typeof refreshInterval=='undefined'){refreshInterval=this.defaultRefreshInterval;if(positionName=='middle'){refreshInterval=20;}}
this.positions[positionName]={vtime:0,refreshInterval:refreshInterval,nbRefresh:0};this.enable();},isVisible:function(el){if(typeof document.hasFocus=="function"&&document.hasFocus()==false){wads.log('[wads.autoRefresh.isVisible]() return false because not on focus',2);return false;}
var elemVisibility=this.getElementVisibility(el);var isVisible=elemVisibility>=this.visibilityFloor;wads.log('[wads.autoRefresh.isVisible]()'+(el&&el.id?' '+el.id:'')+' return '+isVisible+' ( '+elemVisibility+' >= '+this.visibilityFloor+' )',2);return isVisible;},disable:function(){wads.log('[wads.autoRefresh.disable]()');window.clearInterval(this.setIntervalValue);this.isRunning=false;},enable:function(){wads.log('[wads.autoRefresh.enable]()');if(!this.isRunning){this.isRunning=true;this.setIntervalValue=window.setInterval(function(){wads.autoRefresh.checkRefresh();},this.checkInterval*1000);}},validateAutoRefresh:function(positionName){wads.log('[wads.autoRefresh.validateAutoRefresh]('+positionName+')');if(typeof wads.ads!='undefined'&&typeof wads.ads[positionName]!='undefined'&&typeof wads.ads[positionName][0]!='undefined'&&typeof wads.ads[positionName][0]['autorefresh']!='undefined'&&wads.ads[positionName][0]['autorefresh']==1){return true;}else{delete this.positions[positionName];var nbPositions=0;for(positionName in this.positions){nbPositions++;}
if(nbPositions==0){this.disable();}
return false;}},checkRefresh:function(){wads.log('[wads.autoRefresh.checkRefresh]() ',2);for(positionName in this.positions){if(this.isVisible(document.getElementById(wads.encryptPositionName(positionName)))){this.positions[positionName].vtime+=this.checkInterval;wads.log('[wads.autoRefresh.checkRefresh]() '+positionName+': '+this.positions[positionName].vtime,2);if(this.positions[positionName].vtime>=this.positions[positionName].refreshInterval){this.positions[positionName].vtime=0;this.addInsertionToAlreadyDisplayed(positionName);if(this.validateAutoRefresh(positionName)){if(typeof wads.ads[positionName]!='undefined'&&typeof wads.ads[positionName][0]!='undefined'){var insertion_id=(typeof wads.ads[positionName][0].id!='undefined'?wads.ads[positionName][0].id:'0');var status=wads.site+'_'+wads.page+'_'+positionName+'_'+insertion_id;wads.stats.logDuration('autoRefreshAds',1,status);}
wads.refreshOnePosition(positionName,true)
this.positions[positionName].nbRefresh+=1;};}else if(wads.headerBidding&&wads.headerBidding.prebidTimeout&&wads.headerBidding.sendBeforeRefresh&&this.positions[positionName].vtime==(this.positions[positionName].refreshInterval-wads.headerBidding.prebidTimeout)){wads.headerBidding.sendBeforeRefresh(positionName);}}else{wads.log('[wads.autoRefresh.checkRefresh]() '+positionName+' is not visible',2);}}},addInsertionToAlreadyDisplayed:function(positionName){wads.log('[wads.autoRefresh.addInsertionToAlreadyDisplayed]('+positionName+') ');if(typeof this.alreadyDisplayed[positionName]=='undefined'){this.alreadyDisplayed[positionName]=[];}
if(typeof wads.ads!='undefined'&&typeof wads.ads[positionName]=='object'){for(var i in wads.ads[positionName]){if(typeof wads.ads[positionName][i].id!='undefined'&&this.alreadyDisplayed[positionName].indexOf(wads.ads[positionName][i].id)==-1){this.alreadyDisplayed[positionName].push(wads.ads[positionName][i].id);}}}},getElementVisibility:function(el){var visibility=0;try{var winHeight=(window.innerHeight||document.documentElement.clientHeight);var rect=el.getBoundingClientRect();var creativeHeight=rect.bottom-rect.top;if(rect.top>=0&&rect.bottom<=winHeight){visibility=100;}else if(rect.top>winHeight||rect.bottom<0){visibility=0;}else{if(rect.top<0&&rect.bottom>winHeight){var v=100;v-=100-((1-Math.abs(rect.top)/ creativeHeight)*100);v-=100-((1-(rect.bottom-winHeight)/ creativeHeight)*100);visibility=Math.round(v);}else if(rect.top<0){visibility=Math.round((1-Math.abs(rect.top)/ creativeHeight)*100);}else{visibility=Math.round((1-(rect.bottom-winHeight)/ creativeHeight)*100);}}}catch(e){wads.warn(e);}
return visibility;}},rgpd:{canTrack:false,previousCanTrack:null,submitEventWatching:false,timeout:1000,check:function(){wads.log('[wads.rgpd.check]()',2);if(typeof Didomi=='undefined'){setTimeout(function(){wads.rgpd.check()},10);}
else{wads.rgpd.canTrack=Didomi.getUserConsentStatusForVendor("c:dmpwebedi-nTBHAk44");setTimeout(function(){wads.rgpd.check()},10000);}}},stats:{logDuration:function(eventName,duration,status){wads.log('[wads.stats.logDuration]('+eventName+', '+duration+(status?', '+status:'')+')');if(typeof status=='undefined'){status='undefined';}
status=status.replace(/[^a-z0-9_]+/gi,"");var pixel=document.createElement('img');var url=wads.callBaseUrl+'/'+wads.encryptStringIfAdBlocking('logduration/'+eventName+'/'+duration+'/'+status+'/w'+wads.getWid()+'/r'+Math.round(Math.random()*1000000000));if(location.protocol=='https:'){url=url.replace('http:','https:')}
pixel.src=url;}},visibility:{checkInterval:0.1,isRunning:false,setIntervalValue:null,eventsToSend:[],triggers:[{visibility:50,duration:1},{visibility:50,duration:2},{visibility:50,duration:5},{visibility:50,duration:10},{visibility:50,duration:15},{visibility:60,duration:1},{visibility:65,duration:5},{visibility:80,duration:2},{visibility:100,duration:1},{visibility:100,duration:2},{visibility:100,duration:5},{visibility:100,duration:10}],consecutiveTriggers:[{visibility:50,duration:1},{visibility:50,duration:2},{visibility:80,duration:2},{visibility:100,duration:3}],consecutiveTriggersAlreadySends:[],mesurements:[],consecutiveMesurements:[],data:{},consecutiveData:{},initPosition:function(positionName,insertionId){wads.log('[wads.visibility.initPosition]('+positionName+','+insertionId+')');if(typeof(wads.autoRefresh)=='undefined'){wads.warn('wads.visibility need wads.autoRefresh');return;}
this.initMesurements();if(typeof(this.data[positionName])=='undefined'){this.data[positionName]={};}
if(typeof(this.consecutiveData[positionName])=='undefined'){this.consecutiveData[positionName]={};}
if(typeof(this.data[positionName][insertionId])=='undefined'){this.data[positionName][insertionId]={};for(var i=0;i<this.mesurements.length;i++){this.data[positionName][insertionId][this.mesurements[i]]=0;}}
if(typeof(this.consecutiveData[positionName][insertionId])=='undefined'){this.consecutiveData[positionName][insertionId]={};for(var i=0;i<this.consecutiveMesurements.length;i++){this.consecutiveData[positionName][insertionId][this.consecutiveMesurements[i]]=0;}}
this.enable();},initMesurements:function(){if(this.mesurements.length==0){wads.log('[wads.visibility.initMesurements]()');for(var i=0;i<this.triggers.length;i++){if(this.mesurements.indexOf(this.triggers[i].visibility)==-1){this.mesurements.push(this.triggers[i].visibility);}}
this.mesurements.sort(function(a,b){return a>b;});this.initConsecutiveMesurements();}},initConsecutiveMesurements:function(){for(var i=0;i<this.consecutiveTriggers.length;i++){if(this.consecutiveMesurements.indexOf(this.consecutiveTriggers[i].visibility)==-1){this.consecutiveMesurements.push(this.consecutiveTriggers[i].visibility);}}
this.consecutiveMesurements.sort(function(a,b){return a>b;});},enable:function(){if(!this.isRunning){wads.log('[wads.visibility.enable]()');this.isRunning=true;this.setIntervalValue=window.setInterval(function(){wads.visibility.check();},this.checkInterval*1000);}},check:function(){if(typeof document.hasFocus=="function"&&document.hasFocus()==false){this.resetAllConsecutivePositions();return;}
for(var positionName in this.data){var el=wads.getElement(positionName);if(el){if(wads.public.isPositionFilled(positionName)){if(positionName=='interstitiel-ft'){if(this.getElementHeight(el)!=0){var visibility=100;}else{var visibility=0;}}else{if(this.getElementHeight(el)==0){var visibility=0;}else{var visibility=wads.autoRefresh.getElementVisibility(el);}}}else{var visibility=wads.autoRefresh.getElementVisibility(el);}
if(visibility){for(var insertionId in this.data[positionName]){this.incrementInsertion(positionName,insertionId,visibility);}}else{this.resetOneConsecutivePosition(positionName);}}}
if(this.eventsToSend.length){this.sendEvents();}},getElementHeight:function(el){var height=0;try{var rect=el.getBoundingClientRect();height=rect.bottom-rect.top;}catch(e){wads.warn(e);}
return height;},incrementInsertion:function(positionName,insertionId,visibility){for(var v in this.data[positionName][insertionId]){if(v<=visibility){this.data[positionName][insertionId][v]+=this.checkInterval;this.data[positionName][insertionId][v]=parseFloat(this.data[positionName][insertionId][v].toFixed(3));for(var i=0;i<this.triggers.length;i++){if(this.triggers[i]['visibility']==v&&this.triggers[i]['duration']==this.data[positionName][insertionId][v]){this.addEventToSend({insertion:insertionId,position:positionName,visibility:this.triggers[i]['visibility'],duration:this.triggers[i]['duration'],consecutive:false});wads.log('[wads.visibility.incrementInsertion]('+positionName+','+insertionId+','+visibility+') trigger '+this.triggers[i]['visibility']+' + '+this.triggers[i]['duration'],2);}}}}
for(var v in this.consecutiveData[positionName][insertionId]){if(v<=visibility){this.consecutiveData[positionName][insertionId][v]+=this.checkInterval;this.consecutiveData[positionName][insertionId][v]=parseFloat(this.consecutiveData[positionName][insertionId][v].toFixed(3));for(var i=0;i<this.consecutiveTriggers.length;i++){if(this.consecutiveTriggers[i]['visibility']==v&&this.consecutiveTriggers[i]['duration']==this.consecutiveData[positionName][insertionId][v]){this.addEventToSend({insertion:insertionId,position:positionName,visibility:this.consecutiveTriggers[i]['visibility'],duration:this.consecutiveTriggers[i]['duration'],consecutive:true});wads.log('[wads.visibility.incrementInsertion]('+positionName+','+insertionId+','+visibility+') trigger '+this.triggers[i]['visibility']+' + '+this.triggers[i]['duration']);}}}else{this.consecutiveData[positionName][insertionId][v]=0;}}},addEventToSend:function(event){if(event.consecutive===false){this.eventsToSend.push(event);}else{if(!this.consecutiveTriggersAlreadySends[event.position]){this.consecutiveTriggersAlreadySends[event.position]=[];}
if(!this.consecutiveTriggersAlreadySends[event.position][event.insertion]){this.consecutiveTriggersAlreadySends[event.position][event.insertion]=[];}
if(!this.consecutiveTriggersAlreadySends[event.position][event.insertion][event.visibility]){this.consecutiveTriggersAlreadySends[event.position][event.insertion][event.visibility]=[];}
if(!this.consecutiveTriggersAlreadySends[event.position][event.insertion][event.visibility][event.duration]){this.consecutiveTriggersAlreadySends[event.position][event.insertion][event.visibility][event.duration]=true;this.eventsToSend.push(event);}}},sendEvents:function(){var url=wads.callBaseUrl+'/visibility/'+wads.sitepage+'/w'+wads.getWid()+'/r'+Math.round(Math.random()*1000000).toString()+'/';var event=null;while(event=this.eventsToSend.shift()){url+=event.insertion+','+event.position+','+event.visibility+','+event.duration+(event.consecutive?',c':'')+';';}
url=url.substring(0,url.length-1);new Image().src=url;wads.log('[wads.visibility.sendEvents]() '+url);},disable:function(){wads.log('[wads.visibility.disable]()');window.clearInterval(this.setIntervalValue);this.isRunning=false;},resetOnePosition:function(positionName){wads.log('[wads.visibility.resetOnePosition]('+positionName+')');this.data[positionName]={};},resetAllPositions:function(){wads.log('[wads.visibility.resetAllPositions]()');this.data=[];},resetOneConsecutivePosition:function(positionName){if(this.consecutiveData[positionName]){for(var insertionId in this.consecutiveData[positionName]){for(var visibility in this.consecutiveData[positionName][insertionId]){this.consecutiveData[positionName][insertionId][visibility]=0;}}}},resetAllConsecutivePositions:function(){for(var positionName in this.consecutiveData){this.resetOneConsecutivePosition(positionName);}}},insertInParentNode:function(encryptPositionNodeParent,encryptPositionNode){if(!("currentScript"in document)){var cssText='';if(encryptPositionNode.style&&encryptPositionNode.style.cssText){cssText='style="'+encryptPositionNode.style.cssText+'"';}
document.write('<div id="'+encryptPositionNodeParent.id+'"'+cssText+'><div id="'+encryptPositionNode.id+'"'+cssText+'></div></div>');return;}
var scriptTag=document.currentScript;var parentNode=scriptTag.parentNode;parentNode.insertBefore(encryptPositionNodeParent,scriptTag.nextSibling);},createAdPosition:function(positionName,element){wads.log('[wads.createAdPosition]('+positionName+(element?','+element:'')+')');var encryptPosition=this.encryptPositionName(positionName);var encryptPositionNodeParent=document.createElement('div');encryptPositionNodeParent.id=encryptPosition+'_p';if(document.getElementById(encryptPositionNodeParent.id)){wads.warn('[wads.createAdPosition]('+positionName+(element?','+element:'')+') already exist');return;}
var encryptPositionNode=document.createElement('div');encryptPositionNode.id=encryptPosition;encryptPositionNodeParent.appendChild(encryptPositionNode);if(this.mode=='sync'){if(typeof wads_script=='undefined'){return;}
document.write('<div id="'+encryptPosition+'">');wads_script(positionName);document.write('</div>');if(typeof this.stratocube=='object'){this.stratocube.loggingLog(positionName);}}else if(this.mode=='async'){if(element){element.appendChild(encryptPositionNodeParent);}
else{wads.insertInParentNode(encryptPositionNodeParent,encryptPositionNode);}
if(wads.ads&&wads.ads[positionName]&&wads.isReady&&wads.autoload&&(!wads.displayedPositions||!wads.displayedPositions[positionName]||!wads.displayedPositions[positionName].isDisplayed)){wads.log('[wads.createAdPosition]('+positionName+(element?','+element:'')+') sendToPosition()-->');wads.sendToPosition(positionName,wads.ads[positionName]);}}else if(this.mode=='deferred'){if((positionName=='header-top'||positionName=='interstitiel-ft')&&typeof wads_script!='undefined'){wads_script(positionName);}else{var styles="";if(wads&&wads.ads&&wads.ads[positionName]&&wads.ads[positionName][0]&&wads.ads[positionName][0].empty){styles=' style="height:0;visibility:hidden;"';}
encryptPositionNodeParent.removeChild(encryptPositionNode);encryptPositionNode.id='t'+encryptPosition;encryptPositionNode.style=styles;encryptPositionNodeParent.appendChild(encryptPositionNode);wads.insertInParentNode(encryptPositionNodeParent,encryptPositionNode);}}else{wads.warn('wads_unknow_mode');}
return encryptPosition;},setAdPositionStyle:function(positionName,style){var adPosition=document.getElementById(this.encryptPositionName(positionName));if(adPosition){for(var prop in style){adPosition.style[prop]=style[prop];}}
var adPositionParent=document.getElementById(this.encryptPositionName(positionName)+'_p');if(adPositionParent){for(var propP in style){adPositionParent.style[propP]=style[propP];}}},launchDeferredAdPositions:function(){wads.log('[wads.launchDeferredAdPositions]()');if(this.mode=='deferred'){if(typeof wads_script=='function'){for(var positionName in wads.ads){if(document.getElementById('t'+this.encryptPositionName(positionName))){document.write('<div id="'+this.encryptPositionName(positionName)+'">');wads_script(positionName);document.write('</div>');}}}}
if(window.addEventListener){window.addEventListener("load",wads.moveDeferredAdPositions,false);}else if(window.attachEvent){window.attachEvent("onload",wads.moveDeferredAdPositions);}},moveDeferredAdPositions:function(){if(wads.mode=='deferred'){for(var positionName in wads.ads){if(document.getElementById('t'+wads.encryptPositionName(positionName))){var adDiv=wads.getElement(positionName);if(adDiv){adDiv=adDiv.parentNode.removeChild(adDiv);document.getElementById('t'+wads.encryptPositionName(positionName)).appendChild(adDiv);}}}}},callAsyncPosition:function(positionName,callBaseUrl,autoload,isAutoRefresh){this.log('[wads.callAsyncPosition]('+positionName+')');var defaultAutoload=this.autoload;if(typeof(autoload)=='undefined'){this.autoload=0;}else{this.autoload=autoload;}
if(typeof(isAutoRefresh)=='undefined'){isAutoRefresh=false;}
if(typeof(callBaseUrl)=='undefined'){callBaseUrl=this.callBaseUrl;}
var url=callBaseUrl+'/'+this.encryptStringIfAdBlocking(this.jsAsyncCallPositionMethod+'/'+this.sitepage+'@'+positionName+'/w'+this.getWid()+
this.getTechnicalQuery(isAutoRefresh)+'/r'+Math.round(Math.random()*1000000000)+'/'+this.getQuery());this.autoload=defaultAutoload;this.loadAsync(document,url,'callAsyncPosition'+positionName);},passback:function(positionName){var adPosition=this.getElement(positionName);if(adPosition&&typeof(wads.ads[positionName])!='undefined'&&typeof(wads.ads[positionName][0])!='undefined'&&typeof(wads.ads[positionName][0]['id'])!='undefined'&&typeof(wads.ads[positionName][0]['cm2'])!='undefined'){adPosition.innerHTML='';var cm2=document.createElement('img');cm2.src=wads.ads[positionName][0]['cm2'];if(typeof(this.pbi[positionName])=='undefined'){this.pbi[positionName]=[];}
this.pbi[positionName].push(wads.ads[positionName][0]['id']);var pbi='&pbi='+this.pbi[positionName].join('|');if(this.mode=='sync'){wads.ads[positionName].splice(0,1);this.encryptedCallUri=this.encryptStringIfAdBlocking(this.jsSyncCallPositionMethod+'/'+this.sitepage+'@'+positionName+'/w'+this.wid+this.getTechnicalQuery()+pbi+'/r'+Math.round(Math.random()*1000000000)+'/'+this.getQuery());this.callUrl=this.callBaseUrl+'/'+this.encryptedCallUri;this.loadSync(document,this.callUrl,'call');}else if(this.mode=='async'){this.encryptedCallUri=this.encryptStringIfAdBlocking(this.jsAsyncCallPositionMethod+'/'+this.sitepage+'@'+positionName+'/w'+this.wid+this.getTechnicalQuery()+pbi+'/r'+Math.round(Math.random()*1000000000)+'/'+this.getQuery());this.callUrl=this.callBaseUrl+'/'+this.encryptedCallUri;if(this.callFuncUnpacked==='1'){this.loadAsync(document,this.callBaseUrl+'/'+this.encryptStringIfAdBlocking(this.includeUrl),'include');}
else{this.includeFunctionUnpacked();}}}},encryptPositionName:function(positionName){positionName='wads_po_'+positionName;return positionName;},encryptStringIfAdBlocking:function(str){return str;},decodeWindowLocationHash:function(){var s=[];if(typeof(window.location.hash)!='undefined'){var hash=window.location.hash.replace('#','');hash=hash.split('&');for(i=0;i<hash.length;i++){var c=hash[i].split('=');if(c.length==2){s[c[0]]=c[1];}}}
return s;},getQuery:function(){var outputQuery=this.query;var params=window.location.search.replace("?","");var wbddsPreview;if(params.indexOf('wbdds_preview=')===0){wbddsPreview=params;}
if(window.location.href&&window.location.href.indexOf('wbdds_preview=')!=-1){wbddsPreview=window.location.href.substring(window.location.href.indexOf('wbdds_preview='))}
var referrer=document.referrer;var referrerDomain='';if(referrer!==undefined){var referrerMatches=referrer.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);referrerDomain=referrerMatches&&referrerMatches[1];outputQuery+="&referer="+referrerDomain;if(wbddsPreview===undefined){var previewMatches=referrer.match(/(wbdds_preview=[^&]+)/i);wbddsPreview=previewMatches&&previewMatches[1];}}
if(this.sitepage.indexOf('allocine_fr')==-1&&typeof amznAdsResponse=='function'){outputQuery+=amznAdsResponse();}
if(this.cookies.get('wb_from_db')){outputQuery+='&from_db=1';}
if(typeof this.audiencescience=='object'){outputQuery+=this.audiencescience.getQuery();}
if(typeof wads.krux=='object'){var krux=wads.krux.get('segs');if(krux!=''){krux=krux.replace(/,/g,'|');outputQuery+='&segments='+krux;}
var kuid=wads.krux.get('kuid');if(kuid!=''){outputQuery+='&kuid='+kuid;}}
if(typeof wads.nugg=='object'){var nugg=wads.nugg.get();if(nugg){nugg=nugg.replace(/&/g,'|').replace(/=/g,',');outputQuery+='&nuggSegments='+nugg;}}
if(wbddsPreview){outputQuery+='&'+wbddsPreview;}
var regexUtm=new RegExp('utm_term=m|dpaid');if(regexUtm.test(location.hash+';'+location.search)){outputQuery+='&arbitrage=1';}
var regUtm=new RegExp('(utm\_[a-z]+)\=([a-z]+)','igm');var matchUtm=document.location.search.match(regUtm);if(matchUtm){outputQuery=outputQuery+'&'+matchUtm.join('&');}
return outputQuery;},getTechnicalQuery:function(isAutoRefresh){if(typeof isAutoRefresh=='undefined'){isAutoRefresh=false;}
var tq='/tq,cnxtype='+this.cnxtype+'&devicetype='+this.devicetype+'&os='+this.os;if(this.cookies.get('wb_proxy')){tq=tq+'&proxy=1';}
if(isAutoRefresh&&typeof this.autoRefresh!='undefined'&&typeof this.autoRefresh.alreadyDisplayed!='undefined'){tq=tq+'&autoRefresh='+JSON.stringify(this.autoRefresh.alreadyDisplayed);}
if(this.mode=='async'){tq=tq+'&autoload='+(this.autoload?'1':'0');}
tq=tq+'&seg='+(this.adBlocking==0?'noadb':(this.acceptableAds==1)?'acceptable':'autopromo');var hash=wads.decodeWindowLocationHash();var tqHasNoPosition=false;if(typeof(hash['wads_no_position'])!='undefined'){tq=tq+'&noposition='+hash['wads_no_position'].replace(/[^a-z|\-0-9]/g,'');tqHasNoPosition=true;}
if((this.sitepage.search('purepeople_fr_')!=-1||this.sitepage.search('puretrend_fr_')!=-1)&&navigator.userAgent){var userAgent=navigator.userAgent;if((userAgent.search('Android')!=-1&&userAgent.match(/Chrome\/[.0-9]* Mobile/))||(userAgent.search('iPhone')!=-1&&userAgent.match(/CriOS\/[.0-9]* Mobile/))){tq=tq+(tqHasNoPosition?'|interstitiel-ft':'&noposition=interstitiel-ft');}}
if(typeof(hash['wads_insertion_id'])!='undefined'){tq=tq+'&wads_insertion_id='+hash['wads_insertion_id'].replace(/[^0-9]/g,'');}
tq=tq+'&flash='+(wads.flash.isPresent()?'on':'off');if(typeof(strato)!='undefined'&&typeof(strato.origin)!='undefined'&&typeof(strato.origin.get)!='undefined'){tq=tq+'&strato_origin='+strato.origin.get();}
tq=tq+'&nbpageviews='+this.nbpageviews;if(typeof(wads.rgpd)!='undefined'){tq+='&rgpdauthorized='+(wads.rgpd.canTrack&1);}
return tq;},getVideoAdUrl:function(position,cpy){var url;if(wads.ads&&wads.ads[position]&&wads.ads[position][0]&&wads.ads[position][0]['videoAdUrl']&&wads.ads[position][0]['videoAdUrl']!=""){url=wads.ads[position][0]['videoAdUrl'];if(typeof(cpy)!='undefined'&&typeof(wads.ads[position][0]['empty'])=='undefined'){url=url.replace(/\/tq,adb=/,'/tq,cpy='+cpy+'&adb=');}
this.log('[wads.getVideoAdUrl]('+position+(cpy?','+cpy:'')+')'+' return '+url);return url;}
if(typeof(this.wid)=='undefined'){this.wid=this.cookies.get('wid');if(this.wid==null){this.wid=0;}}
wads.stats.logDuration('vastAutonome',1,this.sitepage.replace('/','__')+'__'+position);if(location.protocol=='https:'){this.callBaseUrl=this.callBaseUrl.replace('http:','https:');}
url=this.callBaseUrl+'/'+this.encryptStringIfAdBlocking(this.vastCallMethod+'/'+this.sitepage+'@'+position+'/w'+this.wid+this.getTechnicalQuery()+(typeof(cpy)!='undefined'?'&cpy='+cpy:'')+'/r'+Math.round(Math.random()*1000000000)+'/'+this.getQuery());this.log('[wads.getVideoAdUrl]('+position+(cpy?','+cpy:'')+')'+' return '+url);return url;},getVastUrl:function(position,cpy){this.log('[wads.getVastUrl]('+position+(cpy?','+cpy:'')+')');return(typeof(cpy)=='undefined'?this.getVideoAdUrl(position):this.getVideoAdUrl(position,cpy));},getVideoAdType:function(position){if(wads.ads&&wads.ads[position]&&wads.ads[position][0]&&wads.ads[position][0]['videoAdType']&&!wads.ads[position][0]['empty']&&wads.ads[position][0]['videoAdType']!=""){this.log('[wads.getVideoAdType]('+position+') return '+wads.ads[position][0]['videoAdType']);return wads.ads[position][0]['videoAdType'];}
this.log('[wads.getVideoAdType]('+position+') return default vast');return"vast";},getVideoAdPrimary:function(position){var videoAdFormat="flash";if(this.adBlocking){videoAdFormat="html5";}else if(wads.ads&&wads.ads[position]&&wads.ads[position][0]&&wads.ads[position][0]['videoAdFormat']&&!wads.ads[position][0]['empty']&&wads.ads[position][0]['videoAdFormat']!=""){videoAdFormat=wads.ads[position][0]['videoAdFormat'];if(position=="midroll"&&videoAdFormat!="flash"&&wads.ads['postroll']&&wads.ads['postroll'][0]&&wads.ads['postroll'][0]['videoAdFormat']&&!wads.ads['postroll'][0]['empty']&&wads.ads['postroll'][0]['videoAdFormat']!=""){videoAdFormat=wads.ads['postroll'][0]['videoAdFormat'];}}
this.log('[wads.getVideoAdPrimary]('+position+') return '+videoAdFormat);return videoAdFormat;},loadSync:function(d,src,id){d.write('<'+'script src="'+src+'"><\/scr'+'ipt>');},loadAsync:function(d,src,id){var dv;dv=d.getElementById('wads_'+id);if(dv)
dv.parentNode.removeChild(dv);var a=d.createElement('script');a.async="async";a.src=src;if(id){a.id='wads_'+id;}
var h=d.getElementsByTagName('head')[0];h.appendChild(a);},setSitePage:function(sp){this.log('[wads.setSitePage]('+sp+')');this.sitepage=sp;},setQuery:function(q){this.log('[wads.setQuery]('+q+')');this.query=q;},fetchAll:function(){this.log('[wads.fetchAll]()');if(wads.adPerf!=undefined){wads.adPerf.sendEvent('wadsQueryStart');}
this.loadAsync(document,this.callUrl,'fetchAll');},refreshAll:function(){this.ads=[];this.encryptedCallUri=this.encryptStringIfAdBlocking(this.jsAsyncCallMethod+'/'+this.sitepage+'/w'+this.getWid()+this.getTechnicalQuery()+'/r'+Math.round(Math.random()*1000000000)+'/'+this.getQuery());this.callUrl=this.callBaseUrl+'/'+this.encryptedCallUri;if(typeof this.visibility!='undefined'){this.visibility.resetAllPositions();}
this.cleanAllPositions();this.creativeAndCallMasterInit();this.fetchAll();},refreshOnePosition:function(positionName,isAutoRefresh){this.log('[wads.refreshOnePosition]('+positionName+')');if(typeof isAutoRefresh=='undefined'){isAutoRefresh=false;}
if(this.mode=='async'){var adPosition=this.getElement(positionName);if(!adPosition){wads.warn('wads_debug: problem refreshOnePosition('+positionName+') : noadPosition');}
if(this.ads[positionName]!=undefined){wads.log('[wads.refreshOnePosition]('+positionName+') ');if(typeof this.visibility!='undefined'){this.visibility.resetOnePosition(positionName);}
var posIframe=document.getElementById('wbdds_fif_'+positionName+'_0');if(posIframe){adPosition.style.width=posIframe.style.width;adPosition.style.height=posIframe.style.height;}
if(wads.sitepage!="terrafemina_fr_web/article"){for(var insertionId in wads.creativeMasters){if(typeof wads.creativeMasters[insertionId][positionName]!='undefined'){wads.creativeMasters[insertionId]=[];}}}
this.clean(adPosition);adPosition.innerHTML='';this.unsetAsyncCallback();this.callAsyncPosition(positionName,this.callBaseUrl,1,isAutoRefresh);if(typeof this.tradelab!='undefined'){this.tradelab.addPosition(positionName);}}else{wads.warn('wads_debug: problem refreshOnePosition('+positionName+') adPosition is undefined');}}else{wads.log('wads_debug: cannot refreshOnePosition('+positionName+') in sync mode');}},setAsyncCallback:function(callback){this.callback=callback;},unsetAsyncCallback:function(){this.callback=null;},cookies:{get:function(sKey){if(!sKey){return null;}
return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*"+encodeURIComponent(sKey).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))||null;},set:function(sKey,sValue,vEnd,sPath,sDomain,bSecure){if(!wads.rgpd.canTrack){return false;}
if(!sKey||/^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)){return false;}
var sExpires="";if(vEnd){switch(vEnd.constructor){case Number:sExpires=vEnd===Infinity?"; expires=Tue, 19 Jan 2038 03:14:07 GMT":"; max-age="+vEnd;break;case String:sExpires="; expires="+vEnd;break;case Date:sExpires="; expires="+vEnd.toUTCString();break;}}
document.cookie=encodeURIComponent(sKey)+"="+encodeURIComponent(sValue)+sExpires+(sDomain?"; domain="+sDomain:"")+(sPath?"; path="+sPath:"")+(bSecure?"; secure":"");return true;},exists:function(sKey){if(!sKey){return false;}
return(new RegExp("(?:^|;\\s*)"+encodeURIComponent(sKey).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=")).test(document.cookie);},sync:function(name,value){if(location.protocol=='https:'){wads.callBaseUrl=wads.callBaseUrl.replace('http:','https:');}
var cookieSync=document.createElement('img');cookieSync.src=wads.callBaseUrl+'/'+wads.encryptStringIfAdBlocking('setcookie/'+name+'/'+value+'/r'+Math.round(Math.random()*1000000000));}},date:{getCurrentTimestamp:function(){if(!Date.now){Date.now=function(){return new Date().getTime();}}
return Math.floor(Date.now()/ 1000);}},localStorage:{variablesPrefix:'wads_',del:function(key){if(typeof(localStorage)!=="undefined"){localStorage.removeItem(this.variablesPrefix+key);return true;}
return null;},exists:function(key){return(typeof(localStorage)!=="undefined"&&this.get(key)!=null);},garbage:function(){if(typeof(localStorage)!=="undefined"){for(var key in localStorage){if(key.indexOf(this.variablesPrefix)!=-1){this.ttl(key.substring(key.indexOf(this.variablesPrefix)));}}}},get:function(key){if(typeof(localStorage)!=="undefined"){var o=JSON.parse(localStorage.getItem(this.variablesPrefix+key));if(o==null){return null;}
if(o.e==-1){return o.v;}else{var now=wads.date.getCurrentTimestamp();if(o.e>=now){return o.v;}}}
return null;},set:function(key,value){try{if(typeof(localStorage)!=="undefined"){localStorage.setItem(this.variablesPrefix+key,JSON.stringify({v:value,e:'-1'}));return true;}}catch(error){}
return false;},setex:function(key,ttl,value){try{var expire=wads.date.getCurrentTimestamp()+ttl;if(typeof(localStorage)!=="undefined"){localStorage.setItem(this.variablesPrefix+key,JSON.stringify({v:value,e:expire}));return true;}}catch(error){}
return false;},ttl:function(key){if(typeof(localStorage)!=="undefined"){var o=JSON.parse(localStorage.getItem(this.variablesPrefix+key));if(o==null){return-2;}
if(o.e==-1){return-1;}else{var now=wads.date.getCurrentTimestamp();if(o.e>now){return(o.e-now);}else{this.del(key);return-2;}}}
return null;}},dmp:{get:function(key,callback){wads.updateHttpsUrl();if(typeof(callback)!='function'){callback=function(data){wads.log('dmp:get:'+data.value);};}
wads.ajax.get({url:wads.callBaseUrl+'/'+wads.encryptStringIfAdBlocking('dmp/get/'+key+'/w'+wads.getWid()+'/r'+Math.round(Math.random()*1000000000)),success:callback});},set:function(key,value,ttl){wads.updateHttpsUrl();if(typeof(ttl)=='undefined'){ttl=300;}
var pixel=document.createElement('img');pixel.src=wads.callBaseUrl+'/'+wads.encryptStringIfAdBlocking('dmp/set/'+key+'/'+value+'/ttl'+ttl+'/w'+wads.getWid()+'/r'+Math.round(Math.random()*1000000000));},incr:function(key){wads.updateHttpsUrl();var pixel=document.createElement('img');pixel.src=wads.callBaseUrl+'/'+wads.encryptStringIfAdBlocking('dmp/incr/'+key+'/w'+wads.getWid()+'/r'+Math.round(Math.random()*1000000000));}},ajax:{createXHTTP:function(){return(window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP"));},get:function(dataParam){var xhttp=this.createXHTTP();xhttp.onreadystatechange=function(){if(xhttp.readyState==4&&xhttp.status==200){var dataResponse=JSON.parse(xhttp.responseText);dataParam.success(dataResponse);}};xhttp.open("GET",dataParam.url,true);xhttp.send();}},flash:{isPresent:function(){var p=false;if(typeof(navigator.plugins)!='undefined'){for(var i=0;i<navigator.plugins.length;i++){if(typeof(navigator.plugins[i]['name'])!='undefined'&&navigator.plugins[i]['name']=='Shockwave Flash'){return true;}}}
return p;}},getWid:function(){if(typeof(this.wid)!='undefined'){return this.wid;}else{var localCookieId=this.cookies.get('wid');if(localCookieId==null){localCookieId=0;}
return localCookieId;}},getCookieFromGlobal:function(){this.log('[wads.getCookieFromGlobal]()');var localCookieId=this.cookies.get('wid');if(localCookieId==null){localCookieId=0;}
this.cookieUrl=this.cookieBaseUrl+'/'+this.encryptStringIfAdBlocking('/c/w'+localCookieId+'/r'+Math.round(Math.random()*1000000000));if(this.mode=='sync'||this.mode=='deferred'){this.loadSync(document,this.cookieUrl,'cookie');}else{this.loadAsync(document,this.cookieUrl,'cookie');}},afterGlobalCookieCall:function(){this.log('[wads.afterGlobalCookieCall]()');if(wads.adPerf!=undefined){wads.adPerf.sendEvent('wadsHelpersStart');}
var localCookieId=this.cookies.get('wid');if(localCookieId==null){localCookieId=0;}
if(this.mode=='sync'||this.mode=='deferred'){this.encryptedCallUri=this.encryptStringIfAdBlocking(this.jsSyncCallMethod+'/'+this.sitepage+'/w'+localCookieId+this.getTechnicalQuery()+'/r'+Math.round(Math.random()*1000000000)+'/'+this.getQuery());this.callUrl=this.callBaseUrl+'/'+this.encryptedCallUri;this.loadSync(document,this.callBaseUrl+'/'+this.encryptedCallUri,'call');}else{this.encryptedCallUri=this.encryptStringIfAdBlocking(this.jsAsyncCallMethod+'/'+this.sitepage+'/w'+localCookieId+this.getTechnicalQuery()+'/r'+Math.round(Math.random()*1000000000)+'/'+this.getQuery());this.callUrl=this.callBaseUrl+'/'+this.encryptedCallUri;if(this.callFuncUnpacked==='1'){this.loadAsync(document,this.callBaseUrl+'/'+this.encryptStringIfAdBlocking(this.includeUrl),'include');}
else{this.includeFunctionUnpacked();}}},getDeviceType:function(){var isMobile=(function(a){return!!(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)));})(navigator.userAgent||navigator.vendor||window.opera);var isTablet=isMobile==true?false:(function(a){return!!(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)));})(navigator.userAgent||navigator.vendor||window.opera);var nVer=navigator.appVersion;if(nVer.indexOf("Win")!=-1)this.os="windows";if(nVer.indexOf("Mac")!=-1)this.os="macos";if(nVer.indexOf("X11")!=-1)this.os="unix";if(nVer.indexOf("Linux")!=-1)this.os="linux";if(nVer.indexOf("Android")!=-1)this.os="android";if(nVer.indexOf("iPad")!=-1)this.os="ipad";if(nVer.indexOf("iPhone")!=-1)this.os="iphone";this.devicetype=isMobile?"mobile":isTablet?"tablet":"web";return this.devicetype;},initSitePage:function(){var slashPosition=this.sitepage.indexOf('/');if(slashPosition>=1){this.site=this.sitepage.substring(0,slashPosition);this.page=this.sitepage.substring(slashPosition+1);}},initNbPageViews:function(){try{if(typeof(sessionStorage)!='undefined'){if(typeof(sessionStorage.nbpageviews)=='undefined'){sessionStorage.nbpageviews=1;}else{sessionStorage.nbpageviews=Number(sessionStorage.nbpageviews)+1;}
this.nbpageviews=sessionStorage.nbpageviews;}}catch(error){wads.warn('[wads.initNbPageViews]() we have a problem');}},checkWadsToolsDebug:function(){if(sessionStorage.wadsDebug&&sessionStorage.wadsDebug=="enable"){if(!document.getElementById("__wadsTools")){var e=document.createElement("script");e.id="__wadsTools";e.setAttribute('async','true');e.setAttribute("type","text/javascript");e.setAttribute("src","//eu1.wbdds.com/wads-tools.js?r="+Math.random());document.documentElement.firstChild.appendChild(e);}}},public:{adblockDetected:function(){return wads.adblock.detected();},callAsyncPosition:function(positionName,callBaseUrl,autoload){if(typeof autoload!='undefined'){wads.callAsyncPosition(positionName,callBaseUrl,autoload);}else if(typeof callBaseUrl!='undefined'){wads.callAsyncPosition(positionName,callBaseUrl);}else{wads.callAsyncPosition(positionName);}},createAdPosition:function(positionName,element){if(typeof element=='undefined'){return wads.createAdPosition(positionName);}else{return wads.createAdPosition(positionName,element);}},disableAutoLoad:function(){wads.autoload=false;},displayAll:function(){return wads.display();},getCustomParamsKruxForDFP:function(){var res='';if(typeof wads.krux=='object'){var segs=wads.krux.get('segs');if(segs!=''){res='ksg='+segs;}}
return res;},getCustomParamsNuggForDFP:function(){var res='';if(typeof wads.nugg=='object'){var segs=wads.nugg.get();if(segs!=''&&segs){res='nugg_'+segs.replace(/&/g,'&nugg_');}}
return res;},getJWPlayerIASPlugin:function(){return wads.jwplayer.iasPlugin;},getSitePage:function(){return wads.sitepage;},getTrailerConfig:function(positionName,positionNumber){positionNumber=positionNumber!==undefined?positionNumber:0;if(wads&&wads.ads&&wads.ads[positionName]&&wads.ads[positionName][positionNumber]){if(wads.ads[positionName][positionNumber].empty){return false;}
var JWPlayerConfig=wads.ads[positionName][positionNumber].display();return JWPlayerConfig;}
return false;},getVideoAdPrimary:function(positionName){return wads.getVideoAdPrimary(positionName);},getVideoAdUrl:function(positionName,cpy){if(typeof cpy=='undefined'){return wads.getVideoAdUrl(positionName);}else{return wads.getVideoAdUrl(positionName,cpy);}},getVideoAdType:function(positionName){return wads.getVideoAdType(positionName);},isPositionFilled:function(positionName){return((wads.ads&&wads.ads[positionName]&&wads.ads[positionName][0]&&!wads.ads[positionName][0].empty)==true);},refreshAll:function(){return wads.refreshAll();},refreshOnePosition:function(positionName){return wads.refreshOnePosition(positionName);},removePosition:function(positionName){wads.log('[wads.public.removePosition]('+positionName+')');var element=document.getElementById(wads.encryptPositionName(positionName))
if(element){if(typeof wads.clean=="function"){wads.clean(element);}
element.parentNode.removeChild(element);var elementParentName='wads_po_'+positionName+'_p';var elementParent=document.getElementById(elementParentName);if(elementParent){elementParent.parentNode.removeChild(elementParent);}}},setAdPositionStyle:function(positionName,style){return wads.setAdPositionStyle(positionName,style);},setAsyncCallback:function(callback){return wads.setAsyncCallback(callback);},setBaseUrl:function(data){if(typeof data=='object'){for(var prop in data){if(prop!='autopromo'&&prop!='acceptable'){continue;}
if(typeof data[prop]=='object'){for(var ssprop in data[prop]){if(ssprop!='call'&&ssprop!='cookie'){continue;}
wads[ssprop+'BaseUrl'+prop.charAt(0).toUpperCase()+prop.slice(1)]=data[prop][ssprop];console.log(wads[ssprop+'BaseUrl'+prop.charAt(0).toUpperCase()+prop.slice(1)]);}}}}},setQuery:function(query){return wads.setQuery(query);},setSitePage:function(sitePage){return wads.setSitePage(sitePage);},unsetAsyncCallback:function(){return wads.unsetAsyncCallback();}},prestart:function(){this.log('[wads.prestart]()');if(wads.mode=='async'){wads.delayStart.reset();wads.delayStart.setCallBack(function(){wads.start('prestart');});if(typeof wads.headerBidding=='object'){wads.delayStart.addTask('prebid',wads.headerBidding.prebidTimeout);wads.headerBidding.start();}
wads.delayStart.run()}},updateHttpsUrl:function(){this.callBaseUrl=this.callBaseUrl.replace('http:','https:');this.cookieBaseUrl=this.cookieBaseUrl.replace('http:','https:');this.callBaseUrlAcceptable=this.callBaseUrlAcceptable.replace('http:','https:');this.cookieBaseUrlAcceptable=this.cookieBaseUrlAcceptable.replace('http:','https:');this.callBaseUrlAutopromo=this.callBaseUrlAutopromo.replace('http:','https:');this.cookieBaseUrlAutopromo=this.cookieBaseUrlAutopromo.replace('http:','https:');},start:function(from){this.log('[wads.start]('+(typeof from=="undefined"?'':from)+')');if(typeof from=="undefined"){this.startWithoutParam=true;if(!this.delayStart.isAllDone()){this.warn('[wads.start] cannot start because task is running');return;}else{this.log('[wads.start] startWithoutParam and isAllDone',2);}}else{if(!this.startWithoutParam){this.warn('[wads.start] cannot start without simple start');return;}else{this.log('[wads.start] start with param and startWithoutParam is true',2);}}
if(typeof wads_no_start!="undefined"&&wads_no_start==true){return;}
if(this.alreadyStarted){wads.warn('wads.start: Only one time plz');return;}else{this.alreadyStarted=true;}
var currentDate=Date.now();document.addEventListener('wadsAdsLoaded',function(event){var loadingTime=(Date.now()-currentDate);wads.log('[wads.start]:wadsAdsLoaded in '+loadingTime+'ms');wads.stats.logDuration('wadsAdsLoaded',loadingTime,wads.mode);if(typeof wads.cphmeasurement!='undefined'){wads.cphmeasurement.run();}});if(typeof wadsBeforeStart=='function'&&this.beforeStartAlreadyCall==false){this.log('[wadsBeforeStart]()');wadsBeforeStart();this.beforeStartAlreadyCall=true;var hash=wads.decodeWindowLocationHash();if(typeof(hash['wads_site'])!='undefined'){wads.sitepage=hash['wads_site'];}}
this.updateHttpsUrl();this.adBlocking=this.adblock.detected();this.adblock.check();if(this.adBlocking){if(this.cookies.exists('acceptableAds')){this.acceptableAds=this.cookies.get('acceptableAds');}else{wadsAcceptableAds=0;var url=this.callBaseUrlAcceptable+'/'+this.encryptStringIfAdBlocking(this.detectAcceptableAdsUrl);if(this.mode=='sync'){this.loadSync(document,url,'acceptableAds');}else{var a=document.createElement('script');a.async='async';a.src=url;var h=document.getElementsByTagName('head')[0];h.appendChild(a);}
this.acceptableAds=wadsAcceptableAds;this.cookies.set('acceptableAds',wadsAcceptableAds,60*60*24,'/','',false);}
if(this.acceptableAds!=0){this.callBaseUrl=this.callBaseUrlAcceptable;this.cookieBaseUrl=this.cookieBaseUrlAcceptable;}else{this.callBaseUrl=this.callBaseUrlAutopromo;this.cookieBaseUrl=this.cookieBaseUrlAutopromo;}}
this.initSitePage();if(typeof getDeviceType=='function'){try{this.getDeviceType();}catch(e){wads.warn(e);}}
if(this.cookies.get('wb_wads_mode')){this.mode=this.cookies.get('wb_wads_mode');}
if(typeof wads.tradelab!='undefined'){wads.tradelab.sendCookieMatching();}
this.initNbPageViews();this.afterGlobalCookieCall();this.checkWadsToolsDebug();setTimeout(function(){wads.localStorage.garbage();},1);},display:function(timeout){this.log('[wads.display]('+(typeof(timeout)=='undefined'?'':timeout)+')');if(typeof(timeout)=='undefined'){timeout=2000;}
this.autoload=true;if(wads.mode=='async'){if(wads.isReady){for(var position in wads.ads){wads.sendToPosition(position,wads.ads[position]);}}else if(timeout>0){setTimeout(wads.display,500,timeout-500);}}},warn:function(data){if(this.cookies.get('wads_debug')>=1){console.warn('%c'+this.log_prefix,this.log_style,data);}},log:function(data,level){if(typeof(level)=='undefined'){level=1;}
if(this.cookies.get('wads_debug')>=level){console.log('%c'+this.log_prefix,this.log_style,data);}},sendEvent:function(eventName){if(typeof document.createEvent=='function'){wads.log('[wads.sendEvent]('+eventName+')');var event=document.createEvent('Event');event.initEvent(eventName,true,true);document.dispatchEvent(event);}},delayStart:{tasks:[],maxTimeout:0,startTimeOut:null,loopCheckTime:50,loopNumber:0,startTime:null,callBack:null,reset:function(){wads.log('[wads.delayStart.reset]');this.tasks=[];this.loopNumber=0;this.callBack=null;},setCallBack:function(funct){this.callBack=funct;},check:function(){this.loopNumber++;if(wads.alreadyStarted){wads.log('[wads.delayStart.check] loop '+this.loopNumber+', done, wads is already started');}else{if(!this.isAllDone()){setTimeout(function(){wads.delayStart.check();},this.loopCheckTime);}else{wads.log('[wads.delayStart.check] loop '+this.loopNumber+', go !!!');if(typeof this.callBack=='function'){this.callBack();}}}},isAllDone:function(){var now=new Date().getTime();var alldone=true;for(var i=0;i<this.tasks.length&&alldone;i++){if(this.tasks[i].done==false&&this.tasks[i].timeoutTime>now){alldone=false;wads.log('[wads.delayStart.isAllDone] loop '+this.loopNumber+', task '+this.tasks[i].name+' is running');}}
return alldone;},run:function(){wads.log('[wads.delayStart.run]()');this.startTime=new Date().getTime();wads.alreadyStarted=false;var now=new Date().getTime();for(var i=0;i<this.tasks.length;i++){this.tasks[i].timeoutTime=now+this.tasks[i].timeout;}
this.check();},addTask:function(name,timeout){wads.log('[wads.delayStart.addTask]('+name+', '+timeout+')');if(timeout>this.maxTimeout){this.maxTimeout=timeout;}
this.tasks.push({name:name,timeout:timeout,done:false,timeoutTime:null});},closeTask:function(name){wads.log('[wads.delayStart.closeTask]('+name+')');for(var i=0;i<this.tasks.length;i++){if(this.tasks[i].name==name){this.tasks[i].done=true;}}}},includeFunctionUnpacked:function(){if(!wads.mode){wads.mode='script'}wads.warn=wads.warn||function(data){if(wads.cookies&&wads.cookies.get('wads_debug')==1){console.warn(data)}};wads.log=wads.log||function(data){if(wads.cookies&&wads.cookies.get('wads_debug')==1){if(typeof data=='object'){console.log(data)}else{console.log('%c'+data,'color:#438EB9;')}}};wads.sendEvent=wads.sendEvent||function(eventName){if(typeof document.createEvent=='function'){wads.log('[wads.sendEvent]('+eventName+')');var event=document.createEvent('Event');event.initEvent(eventName,true,true);document.dispatchEvent(event)}};wads.paths={jwplayerBase:'https://mediaathay.org.uk/files/v-a67d06c39e0a4cb4311f13e54d0e0c33/8.3.0/jwplayer.js',jwplayerFlash:'###jwplayer_flash###',emptyVideoFile:'https://mediaathay.org.uk/files/v-a67d06c39e0a4cb4311f13e54d0e0c33/blank.mp4',jQuery:'https://mediaathay.org.uk/files/v-a67d06c39e0a4cb4311f13e54d0e0c33/jquery.js'};wads.utils=wads.utils||{};wads.utils.addEventListener=function(el,t,fnc,uc){if(el.addEventListener){el.addEventListener(t,fnc,uc)}else if(el.attachEvent){el.attachEvent('on'+t,fnc)}};wads.utils.extend=function(){var src,copyIsArray,copy,name,options,clone,target=arguments[0]||{},i=1,length=arguments.length,deep=false;var isPlainObject=function(mixed_var){if(Object.prototype.toString.call(mixed_var)==='[object Array]'){return false}return mixed_var!==null&&typeof mixed_var=='object'};var isArray=function(mixed_var){if(Object.prototype.toString.call(mixed_var)==='[object Array]'){return true}return false};if(typeof target==="boolean"){deep=target;target=arguments[1]||{};i=2}if(typeof target!=="object"&&typeof target!='function'){target={}}if(length===i){target=this;--i}for(;i<length;i++){if((options=arguments[i])!=null){for(name in options){src=target[name];copy=options[name];if(target===copy){continue}if(deep&&copy&&(isPlainObject(copy)||(copyIsArray=isArray(copy)))){if(copyIsArray){copyIsArray=false;clone=src&&isArray(src)?src:[]}else{clone=src&&isPlainObject(src)?src:{}}target[name]=wads.utils.extend(deep,clone,copy)}else if(copy!==undefined){target[name]=copy}}}}return target};wads.utils.loadScript=function(url,callback){wads.log('[wads.utils.loadScript]('+url+', '+callback+')');callback=callback||function(){};var b=document.createElement("script");b.type='text/javascript';b.src=url;b.async=true;var done=false;b.onload=b.onreadystatechange=function(){if(!done&&(!b.readyState||b.readyState=='loaded'||b.readyState=='complete')){done=true;callback()}};document.head.appendChild(b)};wads.utils.loadJquery=function(callback){if(typeof wads.jQuery=='undefined'){if(typeof jQuery=='undefined'){var jq=document.createElement('script');jq.type='text/javascript';if(location.protocol=='https:'){wads.paths.jQuery=wads.paths.jQuery.replace('http:','https:')}jq.src=wads.paths.jQuery;jq.async=true;var done=false;jq.onload=jq.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=='loaded'||this.readyState=='complete')){wads.jQuery=jQuery.noConflict();done=true;callback()}};document.head.appendChild(jq)}else{wads.jQuery=jQuery;callback()}}else{callback()}};wads.utils.setCookie=function(key,value,exdays){if(wads.rgpd.canTrack){wads.log('[wads.utils.setCookie]('+key+', '+value+', '+exdays+')');var domain=document.domain;var splitDomain=domain.split('.');if(splitDomain.length>=2){domain=splitDomain[splitDomain.length-2]+'.'+splitDomain[splitDomain.length-1]}var d=new Date();d.setTime(d.getTime()+(exdays*24*60*60*1000));var expires="expires="+d.toUTCString();document.cookie=key+"="+value+"; "+expires+";domain="+domain+";path=/"}return true};wads.utils.whereAmI=function(){if(self==top){return 1}else{try{top.location.hostname;return 2}catch(e){return 3}}};wads.mergeStringArray=function(str){var output='';if(typeof str==='object'){if(str){if(Object.prototype.toString.call(str)=='[object Array]'){for(var j=0;j<str.length;j++){output+="\n"+str[j]}}}}else{output=str}return output};wads.addToContents=function(str,content){if(typeof str==='object'){if(str){if(str instanceof Array){for(var j=0;j<str.length;j++){content+=str[j]}}}}else{content+=str}};wads.browser={name:'other',version:false,os:'unknown',isIE:false,isMozilla:false,isWebkit:false,isChrome:false,isOpera:false,isSafari:false,hasFlash:false,isMobile:false,isTablet:false,init:function(){var nVer=navigator.appVersion;var nAgt=navigator.userAgent;var browserName=navigator.appName;var fullVersion=''+parseFloat(navigator.appVersion);var majorVersion=parseInt(navigator.appVersion,10);var nameOffset,verOffset,ix;if((verOffset=nAgt.indexOf("Opera"))!=-1){this.name="Opera";this.isOpera=true;fullVersion=nAgt.substring(verOffset+6);if((verOffset=nAgt.indexOf("Version"))!=-1)fullVersion=nAgt.substring(verOffset+8)}else if((verOffset=nAgt.indexOf("OPR"))!=-1){this.name="Opera";this.isOpera=true;fullVersion=nAgt.substring(verOffset+4)}else if((verOffset=nAgt.indexOf("MSIE")!=-1||nAgt.indexOf("Trident"))!=-1){this.name="Microsoft Internet Explorer";this.isIE=true;fullVersion=nAgt.substring(verOffset+5)}else if((verOffset=nAgt.indexOf("Chrome"))!=-1){this.name="Chrome";this.isChrome=true;this.isWebkit=true;fullVersion=nAgt.substring(verOffset+7)}else if((verOffset=nAgt.indexOf("Safari"))!=-1){this.name="Safari";this.isSafari=true;this.isWebkit=true;fullVersion=nAgt.substring(verOffset+7);if((verOffset=nAgt.indexOf("Version"))!=-1)fullVersion=nAgt.substring(verOffset+8)}else if((verOffset=nAgt.indexOf("Firefox"))!=-1){this.name="Firefox";this.isMozilla=true;fullVersion=nAgt.substring(verOffset+8)}else if((nameOffset=nAgt.lastIndexOf(' ')+1)<(verOffset=nAgt.lastIndexOf('/'))){this.name=nAgt.substring(nameOffset,verOffset);fullVersion=nAgt.substring(verOffset+1);if(browserName.toLowerCase()==browserName.toUpperCase()){browserName=navigator.appName}}if((ix=fullVersion.indexOf(";"))!=-1)fullVersion=fullVersion.substring(0,ix);if((ix=fullVersion.indexOf(" "))!=-1)fullVersion=fullVersion.substring(0,ix);this.version=parseInt(''+fullVersion,10);if(isNaN(majorVersion)){this.version=parseInt(navigator.appVersion,10)}try{var fo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(fo)this.hasFlash=true}catch(e){if(navigator.mimeTypes&&navigator.mimeTypes["application/x-shockwave-flash"]!=undefined)this.hasFlash=true}this.isMobile=(function(a){return!!(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))})(navigator.userAgent||navigator.vendor||window.opera);this.isTablet=this.isMobile==true?false:(function(a){return!!(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))})(navigator.userAgent||navigator.vendor||window.opera);if(nVer.indexOf("Win")!=-1)this.os="windows";if(nVer.indexOf("Mac")!=-1)this.os="macos";if(nVer.indexOf("X11")!=-1)this.os="unix";if(nVer.indexOf("Linux")!=-1)this.os="linux";if(nVer.indexOf("Android")!=-1)this.os="android";if(nVer.indexOf("iPad")!=-1)this.os="ipad";if(nVer.indexOf("iPhone")!=-1)this.os="iphone"}};wads.browser.init();wads.randomNumber=Math.floor(Math.random()*99999999);wads.randomizeInit=function(inNumber){if(typeof inNumber==='undefined'){wads.randomNumber=Math.floor(Math.random()*99999999)}else{wads.randomNumber=inNumber}};wads.randomize=function(str){if(typeof str==='object'){if(str){if(str instanceof Array){var output_array=new Array(str.length);for(var j=0;j<str.length;j++){output_array[j]=str[j].replace(/\[wads_random\]/gi,wads.randomNumber)}return output_array}}}else{if(typeof(str)!=='undefined'){return str.replace(/\[wads_random\]/gi,wads.randomNumber)}}return false};wads.isCallMaster=1;wads.callMasterize=function(str){var output=str.replace(/\[wads_call_master\]/gi,wads.isCallMaster);wads.isCallMaster=0;return output};wads.creativeMasters=new Array();wads.creativeMasterize=function(insertionId,str,positionName){positionName=(typeof(positionName)=='undefined')?'unknown':positionName;if(typeof(wads.creativeMasters[insertionId])=='undefined'){wads.creativeMasters[insertionId]=new Array();wads.creativeMasters[insertionId][positionName]=1;var master=1}else if(typeof(wads.creativeMasters[insertionId][positionName])=='undefined'){wads.creativeMasters[insertionId][positionName]=1;var master=1}else{var master=0}return str.replace(/\[wads_creative_master\]/gi,master)};wads.creativeAndCallMasterInit=function(){wads.creativeMasters=new Array();wads.isCallMaster=1};wads.domL={readyBound:false,DOMContentLoaded:null,isReady:false,DOMReadyCallback:[],addLoadEvent:function(callback){wads.domL.readyBound=false;wads.domL.isReady=false;if(typeof callback=='function'){wads.domL.DOMReadyCallback.push(callback)}wads.domL.bindReady()},DOMReady:function(){if(!wads.domL.isReady){if(!window.document.body){setTimeout(wads.domL.DOMReady,13);return}wads.domL.isReady=true;for(var i=0;i<wads.domL.DOMReadyCallback.length;i++){wads.domL.DOMReadyCallback[i]()}}},init:function(){if(document.addEventListener){wads.domL.DOMContentLoaded=function(){document.removeEventListener("DOMContentLoaded",wads.domL.DOMContentLoaded,false);wads.domL.DOMReady()}}else if(document.attachEvent){wads.domL.DOMContentLoaded=function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",wads.domL.DOMContentLoaded);wads.domL.DOMReady()}}}},bindReady:function(){if(wads.domL.readyBound){return}wads.domL.readyBound=true;if(document.readyState==="complete"){wads.domL.DOMReady()}if(document.addEventListener){document.addEventListener("DOMContentLoaded",wads.domL.DOMContentLoaded,false);window.addEventListener("load",wads.domL.DOMContentLoaded,false)}else if(document.attachEvent){document.attachEvent("onreadystatechange",wads.domL.DOMContentLoaded);window.attachEvent("onload",wads.domL.DOMContentLoaded);var toplevel=false;try{toplevel=window.frameElement==null}catch(e){}if(document.documentElement.doScroll&&toplevel){wads.domL.doScrollCheck()}}},doScrollCheck:function(){if(wads.domL.isReady){return}try{document.documentElement.doScroll("left")}catch(error){setTimeout(wads.domL.doScrollCheck,1);return}wads.domL.DOMReady()}};wads.domL.init();wads.addLoadEvent=wads.domL.addLoadEvent;wads.codeFlash=function(url,width,height,wmode,target,clicktag,id_suffix,arr_flashvars){var id='wads_creative_'+id_suffix;var str_clicktags='clicktag='+encodeURIComponent(clicktag)+'&amp;clickTag='+encodeURIComponent(clicktag)+'&amp;clickTAG='+encodeURIComponent(clicktag);var output='<object width="'+width+'" height="'+height+'" id="'+id+'" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"><param value="always" name="allowScriptAccess"><param value="'+url+'" name="movie"><param value="'+str_clicktags+'&amp;target=_1" name="flashvars"><param value="high" name="quality"><param value="'+wmode+'" name="wmode"><embed width="'+width+'" height="'+height+'" pluginspage="http://www.adobe.com/go/getflashplayer" type="application/x-shockwave-flash" allowscriptaccess="always" wmode="'+wmode+'" quality="high" swliveconnect="true" flashvars="'+str_clicktags+'&amp;target='+target+'" src="'+url+'" name="'+id+'"></object>';return output};var wads_script=function(positionName){if(wads.ads[positionName]){if(wads.ads[positionName][0])wads.ads[positionName][0].display()}};wads.video={callbackFunctionsStack:{},addCallbackFunctionStack:function(positionName,action,func){wads.video.callbackFunctionsStack[positionName]=wads.video.callbackFunctionsStack[positionName]||{};wads.video.callbackFunctionsStack[positionName][action]=[func,[positionName]]},getCallbackFunctionStack:function(pos,prop){if(typeof wads.video.callbackFunctionsStack[pos]!='undefined'){funcs=wads.video.callbackFunctionsStack[pos];if(funcs.hasOwnProperty(prop)){return function(){stackRow=funcs[prop];try{r=stackRow[0].apply(this,typeof stackRow[1]=='array'?stackRow[1]:[stackRow[1]])}catch(e){console.log(e.message)}};return r}};return function(){return false}},generateContent:function(positionName,config){config=arguments.length>1?arguments[1]:{};if(typeof(config.controls)!='undefined'){if(config.controls==='true'||config.controls!==false){config.controls='true'}else{config.controls='false'}}else{config.controls='false'}if(typeof(config.mute)!='undefined'){if(config.mute==='true'||config.mute!==false){config.mute='true'}else{config.mute='false'}}else{config.mute='false'}var html='';html+='<scr'+'ipt src="'+wads.paths.jwplayerBase+'"></scr'+'ipt>';html+='<div id="container"></div>';html+='<scr'+'ipt> var inDapIF=true; var ready = function(){';html+='    var c = {';html+='        primary : wads.getVideoAdPrimary('+positionName+'),';html+='        flashplayer : "'+wads.paths.jwplayerFlash+'",';html+='        html5player : "'+wads.paths.jwplayerHtml5+'",';html+='        analytics : {enable:false, cookie:false},';html+='        width : "100%",';html+='        height : "100%",';html+='        autostart : true,';html+='        controls : \''+config.controls+'\',';html+='        mute : \''+config.mute+'\',';html+='        playlist : [{';html+='            file : "'+wads.paths.emptyVideoFile+'",';html+='            duration : 0';html+='        }],';html+='        advertising: {';html+='           debug : { "levels": "none" },';html+='           client : "'+wads.ads[positionName][config.index].videoAdType+'",';html+='           tag : "'+wads.randomize(wads.ads[positionName][config.index].videoAdUrl)+'",';html+='           admessage : "'+config.admessage+'",';html+='        }';html+='    };';html+='    jwplayer("container").setup(c);';if(typeof config.onMute=="function"){html+='    jwplayer().onMute(function(e){';self.wads.video.addCallbackFunctionStack(positionName,'onMute',config.onMute);html+='        self.wads.video.getCallbackFunctionStack("'+positionName+'","onMute")();';html+='    });'}html+='    jwplayer().onAdImpression(function(){';if(typeof config.onAdImpression=="function"){self.wads.video.addCallbackFunctionStack(positionName,'onAdImpression',config.onAdImpression);html+='        self.wads.video.getCallbackFunctionStack("'+positionName+'","onAdImpression")();'}html+='    });';html+='    jwplayer().onAdError(function(e){});';html+='    jwplayer().onAdSkipped(function(e){ completeOrSkip(e); });';html+='    jwplayer().onAdComplete(function(e){';html+='        completeOrSkip(e);';html+='    });';html+='    completeOrSkip = function(e) {';if(typeof config.onAdComplete=="function"){self.wads.video.addCallbackFunctionStack(positionName,'onAdComplete',config.onAdComplete);html+='        self.wads.video.getCallbackFunctionStack("'+positionName+'", "onAdComplete")();'}html+='        jwplayer().remove();';html+='        self.wads.video.remove("'+positionName+'", '+config.index+');';html+='    };';html+='};';html+='self.wads.utils.addEventListener(window, "load", ready);';html+='</scr'+'ipt>';return html},remove:function(positionName,index){ifrm=document.getElementById("wdds_video_"+positionName+'_'+index);ifrm.parentNode.removeChild(ifrm)},display:function(positionName,config){if(typeof(config.index)=='undefined'){config.index=0}if(typeof(wads.ads[positionName][config.index]['empty'])!='undefined'){var img=document.createElement('img');img.src=wads.ads[positionName][config.index]['empty'];if(typeof config.onAdComplete=="function"){config.onAdComplete()}}else{var iframe=document.createElement('iframe');iframe.id='wdds_video_'+positionName+'_'+config.index;iframe.name='wdds_video_'+positionName+'_'+config.index;iframe.style.cssText="width:"+config.width+"px;height:"+config.height+"px;border:none;padding:0px;margin:0px;overflow:hidden;";iframe.marginWidth=iframe.marginHeight=iframe.frameBorder=iframe.width=iframe.height=0;iframe.src='about:blank';iframe.allowTransparency=true;var html='<ht'+'ml><he'+'ad><me'+'ta charset="utf-8" />';html+='</he'+'ad><bo'+'dy style="overflow:hidden;width:100%;height:100%;margin:0;padding:0;">';html+=wads.video.generateContent(positionName,config);html+='</bo'+'dy></ht'+'ml>';el=document.getElementById(config.element);while(el.firstChild){el.removeChild(el.firstChild)}el.appendChild(iframe);var iframe=document.getElementById(iframe.id);var ifrwin=(iframe.contentWindow)?iframe.contentWindow:(iframe.contentDocument.document)?iframe.contentDocument.document:iframe.contentDocument;ifrwin.document.write(html);ifrwin.document.close()}}};wads.jwplayer={iasPlugin:function(player){wads.log('[wads.jwplayer.iasPlugins]');wads.log(player);var currentAd=false;var foundAdsInPlaylist=function(data){var config=player.getConfig();var item=player.getPlaylistItem(player.getItem());var list=null;if(typeof item.adschedule==='object'){wads.log('[wads.jwplayer.iasPlugins]:foundAdsInPlaylist / playlist detect');list=item.adschedule}else if(typeof config!==undefined&&typeof config.advertising!==undefined&&typeof config.advertising.schedule==='object'){wads.log('[wads.jwplayer.iasPlugins]:foundAdsInPlaylist / single mode detect');list=config.advertising.schedule}else if(typeof config!==undefined&&typeof config.advertising==='object'){wads.log('[wads.jwplayer.iasPlugins]:foundAdsInPlaylist / simple mode detect');list=[];list[0]=config.advertising}if(list===null){wads.warn('[wads.jwplayer.iasPlugins]:foundAdsInPlaylist empty list');return false}var reg1=/(i[0-9]+).*(pl[0-9]+)/g;for(var i in list){var el=list[i];var tag=el.tag===undefined?el.tagUrl:el.tag;if(tag.match(reg1)[0]!==data.tag.match(reg1)[0]){continue}if(el.offset===data.adposition||el.position.replace('roll','')===data.adposition){return el}if(data.adposition==='mid'&&!/^(pre|post)roll$/.test(el.position)){return el}}wads.warn('[wads.jwplayer.iasPlugins]:foundAdsInPlaylist ad not matched');return false};var initTracking=function(ad){if(!wads||!wads.ads||!wads.ads[ad.position]||!wads.ads[ad.position][0]){wads.warn('[wads.jwplayer.iasPlugins]:initTracking - wads infos not found');wads.warn(ad);wads.warn('-------------------');return false}var adInfos=wads.ads[ad.position][0];var conf={anId:922360,partner:'webedia',advId:null,campId:player.getWidth()+'x'+player.getHeight(),pubId:(adInfos.advertiser_id?adInfos.advertiser_id:-1),placementId:adInfos.id,chanId:ad.position,pubOrder:(adInfos.campaign_id?adInfos.campaign_id:-1),pubCreative:null,custom:wads.site,custom2:wads.page};try{ad.integral=new __IASVANS();ad.integral.initCM(conf,player.getContainer());wads.log('[wads.jwplayer.iasPlugins]:initTracking: '+ad.position)}catch(e){wads.warn('[wads.jwplayer.iasPlugins]:initTracking - '+e);wads.warn(conf);wads.warn('-----------------')}return true};var events={'adClick':'AdClickThru','adComplete':'AdVideoComplete','adError':'AdError','adImpression':'AdImpression','adMeta':'AdLoaded','adPause':'AdPaused','adPlay':'AdPlaying','adSkipped':'AdStopped','adStarted':'AdStarted','fullscreen':'AdExpandedChange','volume':'AdVolumeChange','mute':'AdVolumeChange','firstquart':'AdVideoFirstQuartile','midpoint':'AdVideoMidpoint','thirdquart':'AdVideoThirdQuartile'};var sendEvent=function(data){if(!currentAd||!currentAd.integral||!events[data.type]){wads.warn('[wads.jwplayer.iasPlugins]:sendEvent - failed');return false}var params={ad_duration:currentAd.duration|0,ad_dimensions:player.getWidth()+'x'+player.getHeight(),player_dimensions:player.getWidth()+'x'+player.getHeight(),ad_offset_left:0,ad_offset_top:0,volume:(player.getVolume()/100),adExpanded:player.getFullscreen(),};if(data.type=='adError'){params.message=data.message}try{currentAd.integral.sendEvent(events[data.type],params);wads.log('[wads.jwplayer.iasPlugins]:sendEvent - '+data.type)}catch(e){wads.warn('[wads.jwplayer.iasPlugins]:sendEvent - '+e.toString())}};for(var i in events){player.on(i,sendEvent)}player.on('adRequest',function(data){var ad=foundAdsInPlaylist(data);if(!ad){wads.warn('[wads.jwplayer.iasPlugins]:adRequest - ad not found');return false}if(!initTracking(ad)){wads.warn('[wads.jwplayer.iasPlugins]:adRequest - tracking not possible');return false}currentAd=ad});player.on('adTime',function(data){if(!currentAd){wads.warn('[wads.jwplayer.iasPlugins]:adTime - tracking ad not init');return false}if(!data.duration){wads.warn('[wads.jwplayer.iasPlugins]:adTime - not ready yet');return false}if(!currentAd.duration){currentAd.duration=data.duration;currentAd.quartiles=[{step:data.duration*25/100,eventType:'firstquart'},{step:data.duration*50/100,eventType:'midpoint'},{step:data.duration*75/100,eventType:'thirdquart'}];return true}if(currentAd.quartiles.length>0&&data.position>=currentAd.quartiles[0].step){data.type=currentAd.quartiles[0].eventType;sendEvent(data);currentAd.quartiles.shift()}})}};wads.displayedPositions={};wads.getElement=function(positionName){if(document.getElementById('wads_po_'+positionName)){return document.getElementById('wads_po_'+positionName)}else if(typeof this.encryptPositionName=='function'){cryptedPositionName=this.encryptPositionName(positionName);if(document.getElementById(cryptedPositionName)){return document.getElementById(cryptedPositionName)}else{return false}}else{return false}};wads.logClick=function(event,positionName){if(typeof event=='undefined'||typeof event.offsetX=='undefined'){wads.warn('[wads.logClick]('+positionName+') event.offsetX/Y not found');return true}if(event.offsetX==0&&event.offsetY==0){wads.warn('[wads.logClick]('+positionName+') event.offsetX/Y = 0');return true}wads.log('[wads.logClick]('+event.offsetX+'/'+event.offsetY+', '+positionName+')');var insertionId=0;if(typeof wads.ads[positionName]!='undefined'&&typeof wads.ads[positionName][0]!='undefined'&&typeof wads.ads[positionName][0].id!='undefined'){insertionId=wads.ads[positionName][0].id}var screenXY='?,?';if(typeof event.screenX!='undefined'){screenXY=parseInt(event.screenX)+','+parseInt(event.screenY)}var pageXY='?,?';if(typeof event.pageX!='undefined'){pageXY=parseInt(event.pageX)+','+parseInt(event.pageY)}var url=wads.callBaseUrl+'/hot-spot/'+wads.sitepage+'/'+positionName+'/w'+wads.getWid()+'/r'+Math.round(Math.random()*1000000).toString()+'/i'+insertionId+'/'+parseInt(event.offsetX)+','+parseInt(event.offsetY)+'/'+screenXY+'/'+pageXY;new Image().src=url};wads.sendToPosition=function(positionName,adObjectsArray){if(wads.sitepage=="terrafemina_fr_web/article"){if(typeof adObjectsArray=='undefined'&&typeof wads.ads=='object'&&typeof wads.ads[positionName]=='object'){adObjectsArray=wads.ads[positionName]}for(var insertionId in wads.creativeMasters){if(typeof wads.creativeMasters[insertionId][positionName]!='undefined'){wads.creativeMasters[insertionId]=[]}}}wads.log('[wads.sendToPosition]('+positionName+(adObjectsArray?','+adObjectsArray:'')+')');if(wads.adPerf!=undefined&&positionName=="middle"){wads.adPerf.sendEvent('wadsIFrameStart',positionName)}if(typeof adObjectsArray[0]!='undefined'&&typeof adObjectsArray[0]['autorefresh']!='undefined'&&adObjectsArray[0]['autorefresh']=='1'&&typeof wads.autoRefresh!='undefined'&&typeof wads.autoRefresh.init!='undefined'){wads.autoRefresh.init(positionName)}if(typeof wads.tradelab!='undefined'){wads.tradelab.addPosition(positionName)}for(var index in adObjectsArray){var adPosition=this.getElement(positionName);if(adPosition){if(typeof wads.visibility!='undefined'){if(adObjectsArray[index].id){wads.visibility.initPosition(positionName,adObjectsArray[index].id)}else{wads.visibility.initPosition(positionName,'0')}}if(adObjectsArray[index].videoAdUrl==''){wads.displayedPositions[positionName]={isDisplayed:false,onUnload:[]};var div=document.createElement('div');div.id='wbdds_div_'+positionName+'_'+index;div.style.cssText="border:none;padding:0px;margin:0px;";adPosition.appendChild(div);var iframe=document.createElement('iframe');iframe.name=iframe.id='wbdds_fif_'+positionName+'_'+index;iframe.style.cssText="width:0px;height:0px;border:none;padding:0px;margin:0px;overflow:hidden;";iframe.marginWidth=iframe.marginHeight=iframe.frameBorder=iframe.width=iframe.height=0;if(wads&&wads.cookies&&wads.cookies.exists&&wads.cookies.exists('wadsDebugAboutBlank')){iframe.src=null}else{iframe.src='about:blank'}iframe.allow='autoplay';iframe.allowTransparency=true;adPosition.appendChild(iframe);var iframe=document.getElementById(iframe.id);var ifrm=(iframe.contentWindow)?iframe.contentWindow:(iframe.contentDocument.document)?iframe.contentDocument.document:iframe.contentDocument;var html='<ht'+'ml><bo'+'dy style="overflow:hidden;" onclick="parent.wads.logClick(event, \''+positionName+'\');">';html+='<scr'+'ipt> var inDapIF=true; var wAPI=new parent.wads.iframeApi(\''+positionName+'\', '+index+'); </scr'+'ipt>';html+=adObjectsArray[index].script;html+='<scr'+'ipt> '+'window.onload=function() {wAPI.autoResize();}; ';if(positionName=='middle'){html+='if (parent.wads.adPerf != undefined) {'+'parent.wads.adPerf.sendEvent("wadsIFrameLoaded", "'+positionName+'"); '+'}'};html+='parent.window.onresize=function() {wAPI.autoResize();} '+'</scr'+'ipt>';html+='</bo'+'dy></h'+'tml>';ifrm.document.write(html);ifrm.document.close();wads.displayedPositions[positionName].isDisplayed=true;var event=document.createEvent("CustomEvent");event.initCustomEvent("wbdds_position_active",false,false,{positionName:positionName,element:adPosition});document.dispatchEvent(event);var regexUtm=new RegExp('utm_term=m|dpaid');if(regexUtm.test(location.hash+';'+location.search)){if(positionName=='header-top'||positionName=='middle'){wads.gaLogger.add({eventName:'ads-impression',positionName:positionName,id:adObjectsArray[index].id})}}}else if(adObjectsArray[index].empty){var event=document.createEvent("CustomEvent");event.initCustomEvent("wbdds_position_empty",false,false,{positionName:positionName,element:adPosition});document.dispatchEvent(event);var img=document.createElement('img');img.src=adObjectsArray[index].empty;var adPosition=wads.getElement(positionName);if(adPosition){adPosition.style.width='';adPosition.style.height=''}}}else{if(typeof(console.log)!='undefined'){wads.warn('[wbdds] '+positionName+' container is missing')}}}};wads.getPositionContainer=function(positionName,index){return document.getElementById('wbdds_div_'+positionName+'_'+index)};wads.iframeApi=function(positionName,index){this.positionName=positionName;this.index=index};wads.iframeApi.prototype={positionName:'',index:0,autoResizable:true,defaultWidth:0,defaultHeight:0,getParentContainer:function(){return wads.getPositionContainer(this.positionName,this.index)},setAutoResize:function(val){this.autoResizable=val},resizeTo:function(w,h){if(w!==false){document.getElementById('wbdds_fif_'+this.positionName+'_'+this.index).style.width=w+'px'}if(h!==false){document.getElementById('wbdds_fif_'+this.positionName+'_'+this.index).style.height=h+'px'}},autoResize:function(){if(this.autoResizable){var iframe=document.getElementById('wbdds_fif_'+this.positionName+'_'+this.index);if(!iframe)return;var ifrm=(iframe.contentWindow)?iframe.contentWindow:(iframe.contentDocument.document)?iframe.contentDocument.document:iframe.contentDocument;var w=ifrm.document.getElementsByTagName("body")[0].scrollWidth;var h=ifrm.document.getElementsByTagName("body")[0].scrollHeight;this.resizeTo(w,h);this.setDefaultSize(w,h);var adPosition=wads.getElement(this.positionName);if(adPosition){adPosition.style.width='';adPosition.style.height=''}}},setDefaultSize:function(w,h){this.defaultWidth=w;this.defaultHeight=h},collapse:function(){this.resizeTo(this.defaultWidth,this.defaultHeight)},expand:function(dw,dh){this.resizeTo(this.defaultWidth+dw,this.defaultHeight+dh)},registerUnload:function(func){if(typeof func==='function'){wads.displayedPositions[this.positionName]['onUnload'].push(func)}},browser:wads.browser};wads.clean=function(obj){if(obj){while(obj.childNodes.length>0){var child=obj.childNodes[0];var id=child.id;if(id){child.id=''}if(child.childNodes.length>0){wads.clean(child)}try{obj.removeChild(child)}catch(e){}}}};wads.cleanCss=function(pos){if(wads.ads[pos]&&wads.ads[pos][0]&&wads.ads[pos][0].id){var styleElement=document.getElementById('wbdds_css_'+wads.ads[pos][0].id);if(styleElement)styleElement.parentNode.removeChild(styleElement);var styleElement=document.getElementById('wbdds_css_'+wads.ads[pos][0].id+'_0');if(styleElement)styleElement.parentNode.removeChild(styleElement)}};wads.cleanAllPositions=function(){wads.log('[wads.cleanAllPositions]');for(pos in wads.displayedPositions){for(var ou in wads.displayedPositions[pos]['onUnload']){if(typeof(wads.displayedPositions[pos]['onUnload'][ou])=='function'){wads.displayedPositions[pos]['onUnload'][ou]()}}var adPosition=wads.getElement(pos);if(adPosition){wads.cleanCss(pos);wads.clean(adPosition);adPosition.innerHTML='';adPosition.style.cssText="border:none;padding:0px;margin:0px;"}}wads.displayedPositions=[];wads.creativeAndCallMasterInit()};if(wads.mode=='async'){wads.creativeAndCallMasterInit();wads.fetchAll()};wads.sendEvent('wadsLibLoaded');if(typeof wadsAfterExecute=="function")wadsAfterExecute();var __IASVANS=function(r){var h={now:function(){return(new Date).getTime()},sendMonitoringPixel:function(c){try{this.sendUrlRequest(["//pixel.adsafeprotected.com/mon?anId=10173&campId=",encodeURIComponent(m.getPartnerId()),"&pubId=",encodeURIComponent("vans-js_"+c)].join(""))}catch(b){k.report("smp",b)}},sendUrlRequest:function(c,b){var f,a;if(c){f=this.getWindow();try{a=new f.XMLHttpRequest,b&&(a.onreadystatechange=b),a.open("GET",c),a.send()}catch(e){}}},getWindow:function(){return window},getDocument:function(){return document},generateUID:function(){var c,b="";try{for(c=0;8>c;c++)b=[b,Math.floor(65536*(1+Math.random())).toString(16).substring(1)].join("")}catch(f){}return b},noop:function(){}},k=function(){var c={};return{report:function(b,f){if(!c[b])try{c[b]=!0,h.sendUrlRequest(["//fw.adsafeprotected.com/jsdiagnostic?code:vans-js_",encodeURIComponent(m.getPartnerId()),"_",b,"&err:",encodeURIComponent(f.message)].join(""))}catch(a){}}}}(),l=function(){var c,b=!1,f=function(e){e==a()&&(b=!0,n.flushUnsentEvents());return b?"jv3":null},a=function(){c||(c=h.generateUID());return c};return{getVideoId:a,setNodeInterface:function(e){var d,c,q=a();try{d="IASid"+q,c="blockAd"+q,e.className+=" integral-vid-"+q,e[c]=h.noop,e[d]=f,e.getVersion=function(){return"3.2.1"}}catch(b){k.report("sni",b)}},isEstablished:function(){return b},resetHandshake:function(){b=!1}}}(),s=function(){var c,b=function(){var e=function(e){return"undefined"!==typeof e},a=function(){var a="u";try{e(window.opera)&&e(window.opera.buildNumber)?a="o":e(window.mozInnerScreenY)?a="g":e(window.chrome)&&e(window.chrome.csi)?a="c":e(window.msWriteProfilerMark)&&e(window.crypto)?a="e":e(window.attachEvent)||e(window.msCrypto)?a="i":e(window.WebKitPoint)&&(a="w")}catch(c){}return a}(),c=function(){var a=function(a){for(var c in a)if(a.hasOwnProperty(c)){var b=a[c];""!==b&&"null"!==b&&"undefined"!==b&&null!==b&&e(b)||delete a[c]}return a},c=function(a){var c={},b,d;for(d in a)a.hasOwnProperty(d)&&(b=a[d],e(c[b])?c[b]+=d:c[b]=d);a={};for(d in c)c.hasOwnProperty(d)&&(b=c[d],a[b]=d);return a};return function(){var b=function(){var a={g:"",q:""};try{a.q=window.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.location.href}catch(d){var b=d.message,b=b.substring(b.lastIndexOf("<")+1,b.lastIndexOf(">")),c;if(c=e(b))if(c=!1,e(window.navigator)&&e(window.navigator.userAgent)){var g=window.navigator.userAgent.match(/Firefox\/([\.0-9]+)/);null!==g&&2==g.length&&(g=g[1].split("."),3==parseInt(g[0],10)&&6>=parseInt(g[1],10)&&(3==g.length?13>=parseInt(g[2],10)&&(c=!0):c=!0))}c&&(a.g=b)}return a},d={};try{d.a=encodeURIComponent(self.location.href)}catch(g){}try{d.b=encodeURIComponent(parent.location.href)}catch(f){}if(window!=top){try{d.c=encodeURIComponent(parent.document.referrer)}catch(k){}try{d.e=encodeURIComponent(window.document.referrer)}catch(h){}}try{d.d=encodeURIComponent(window.location.href)}catch(n){}try{var l=b();d.g=encodeURIComponent(l.g);d.q=encodeURIComponent(l.q)}catch(m){}var d=a(d),d=c(d),b=[],p;for(p in d)d.hasOwnProperty(p)&&b.push({key:p,val:d[p]});b.sort(function(a,b){return a.val.length>b.val.length?1:a.val.length<b.val.length?-1:0});return b}()}();return{br:a,urls:c}},f=function(a,b,c){var f=["//fw.adsafeprotected.com/db2/video/",b,"/",c,"/skeleton.js?videoId=",l.getVideoId()].join("");b=function(a){f=[f,"&adsafe_url=",a.val,"&adsafe_type=",a.key].join("")};try{a.urls.forEach(b),f=[f,"&adsafe_jsinfo=br:",a.br].join("")}catch(h){k.report("bvu",h)}return f},a=function(){if(4==this.readyState)if(n.sendPerfSample(40),200==this.status)try{c("failed"===JSON.parse(this.responseText).action?"block":"safe")}catch(a){k.report("ba",a)}else k.report("blk_url_req_err",{message:this.status})};return{init:function(e,d,g){var k=b();n.sendPerfSample(30);e=f(k,e,d);c=g;h.sendUrlRequest(e,a)}}}(),n=function(){var c=[],b=function(a){if(l.isEstablished())try{h.getWindow().postMessage(JSON.stringify(a),"*")}catch(b){k.report("dm",b)}else try{c.push(a)}catch(d){k.report("cm",d)}},f=function(a,c){try{b({messageType:a,id:l.getVideoId(),time:h.now(),partner:m.getPartnerId(),eventData:c})}catch(d){k.report("se",d)}};return{sendEvent:f,flushUnsentEvents:function(){try{c.forEach(b)}catch(a){k.report("fue",a)}},sendPerfSample:function(a){f("PerfCheckpoint",{type:"vans",code:a,timestamp:h.now()})}}}(),m=function(){var c,b=function(a,b){var c,g=r||"fw.adsafeprotected.com",f=function(a){var b="";Object.keys(a).forEach(function(c){"advEntityId"!=c&&"pubEntityId"!=c&&"partner"!=c&&(b+="&"+c+"="+a[c])});return b};try{c=["//",g,a,"?videoId=",l.getVideoId(),f(b)].join("")}catch(h){k.report("bsurl",h)}return c},f=function(a,c){var d,g=h.getDocument();try{if(d=g.createElement("script"),d.src=b(a,c),g.body)g.body.insertBefore(d,g.body.firstChild);else if(g.head)g.head.appendChild(d);else if(g.documentElement)g.documentElement.appendChild(d);else throw Error()}catch(f){h.sendMonitoringPixel("inj_err")}};return{initCM:function(a,b){if(!a.partner)throw Error("missing partnerId");n.sendPerfSample(20);c=a.partner;try{if(!a.anId)throw Error("missing anId");h.sendMonitoringPixel("cminit");l.setNodeInterface(b);f("/jsvid",a)}catch(d){k.report("icm",d)}},initFW:function(a,b,d){var g;if(!a.partner)throw Error("missing partnerId");n.sendPerfSample(20);c=a.partner;try{if(!a.advEntityId||!a.pubEntityId)throw Error("missing client id: advEntityId: "+a.advEntityId+" ,pubEntityId: "+a.pubEntityId);h.sendMonitoringPixel("fwinit");d&&s.init(a.advEntityId,a.pubEntityId,d);g="/fwjsvid/st/"+a.advEntityId+"/"+a.pubEntityId+"/skeleton.js";l.setNodeInterface(b);f(g,a)}catch(m){k.report("ifw",m)}},getPartnerId:function(){return c}}}();n.sendPerfSample(10);return{initFW:m.initFW,initCM:m.initCM,sendEvent:n.sendEvent}};if(wads.gaLogger!=undefined){wads.gaLogger.init()}if(wads.adPerf!=undefined){wads.adPerf.sendEvent('wadsHelpersLoaded')}},gaLogger:{queue:[],add:function(entry){entry.sent=false;this.queue.push(entry);},send:function(){if(typeof ga!=='undefined'){for(var j in this.queue){if(!this.queue[j].sent){if(this.queue[j].eventName){ga('send',{hitType:'event',eventCategory:this.queue[j].eventName,eventAction:this.queue[j].positionName,eventValue:this.queue[j].id,nonInteraction:true});}
else{ga('send',{hitType:'event',eventCategory:this.queue[j].eventCategory,eventAction:this.queue[j].eventAction,eventLabel:this.queue[j].eventLabel||void 0,eventValue:this.queue[j].eventValue||void 0,nonInteraction:this.queue[j].nonInteraction||true});}
this.queue[j].sent=true;}}}},init:function(){window.setInterval(function(){wads.gaLogger.send();},500);}}};if(typeof document.createEvent=='function'){var event=document.createEvent('Event');event.initEvent('wadsLoaded',true,true);document.dispatchEvent(event);}
if(typeof wadsBeforeStart=='function'&&wads.beforeStartAlreadyCall==false){wads.log('[wadsBeforeStart]()');wadsBeforeStart();wads.beforeStartAlreadyCall=true;var hash=wads.decodeWindowLocationHash();if(typeof(hash['wads_site'])!='undefined'){wads.sitepage=hash['wads_site'];}}
if(typeof wads.rgpd=='object'){wads.log('[wads.rgpd] run');wads.delayStart.setCallBack(function(){wads.prestart();});wads.delayStart.addTask('rgpd',wads.rgpd.timeout);wads.rgpd.check();wads.delayStart.run()}else{wads.prestart();}
if(wads.adPerf!=undefined){wads.adPerf.sendEvent('wadsInitialLoaded');}})();