vartestStatus=-1,dlStatus="",ulStatus="",pingStatus="",jitterStatus="",clientIp="",dlProgress=0,ulProgress=0,pingProgress=0,log="";functiontlog(t){log+=Date.now()+": "+t+"\n"}functiontwarn(t){log+=Date.now()+" WARN: "+t+"\n",console.warn(t)}varsettings={test_order:"IP_D_U",time_ul:15,time_dl:15,time_ulGraceTime:3,time_dlGraceTime:1.5,count_ping:35,url_dl:"garbage.php",url_ul:"empty.php",url_ping:"empty.php",url_getIp:"getIP.php",getIp_ispInfo:!0,getIp_ispInfo_distance:"km",xhr_dlMultistream:10,xhr_ulMultistream:3,xhr_multistreamDelay:300,xhr_ignoreErrors:1,xhr_dlUseBlob:!1,xhr_ul_blob_megabytes:20,garbagePhp_chunkSize:20,enable_quirks:!0,ping_allowPerformanceApi:!0,overheadCompensationFactor:1.06,useMebibits:!1,telemetry_level:0,url_telemetry:"telemetry.php"},xhr=null,interval=null,test_pointer=0;functionurl_sep(t){returnt.match(/\?/)?"&":"?"}functionclearRequests(){if(tlog("stopping pending XHRs"),xhr){for(vart=0;t<xhr.length;t++){try{xhr[t].onprogress=null,xhr[t].onload=null,xhr[t].onerror=null}catch(t){}try{xhr[t].upload.onprogress=null,xhr[t].upload.onload=null,xhr[t].upload.onerror=null}catch(t){}try{xhr[t].abort()}catch(t){}try{deletexhr[t]}catch(t){}}xhr=null}}this.addEventListener("message",function(t){vare=t.data.split(" ");if("status"===e[0]&&postMessage(testStatus+";"+dlStatus+";"+ulStatus+";"+pingStatus+";"+clientIp+";"+jitterStatus+";"+dlProgress+";"+ulProgress+";"+pingProgress),"start"===e[0]&&-1===testStatus){testStatus=0;try{varr={};try{vars=t.data.substring(5);s&&(r=JSON.parse(s))}catch(t){twarn("Error parsing custom settings JSON. Please check your syntax")}for(varninr)void0!==settings[n]?settings[n]=r[n]:twarn("Unknown setting ignored: "+n);if(settings.enable_quirks||void0!==r.enable_quirks&&r.enable_quirks){vari=navigator.userAgent;/Firefox.(\d+\.\d+)/i.test(i)&&void0===r.xhr_ulMultistream&&(settings.xhr_ulMultistream=1),/Edge.(\d+\.\d+)/i.test(i)&&void0===r.xhr_dlMultistream&&(settings.xhr_dlMultistream=3),/Chrome.(\d+)/i.test(i)&&self.fetch&&void0===r.xhr_dlMultistream&&(settings.xhr_dlMultistream=5)}/Edge.(\d+\.\d+)/i.test(i)&&(settings.forceIE11Workaround=!0),/Chrome.(\d+)/i.test(i)&&/Android|iPhone|iPad|iPod|Windows Phone/i.test(i)&&(settings.xhr_ul_blob_megabytes=4),void0!==r.telemetry_level&&(settings.telemetry_level="basic"===r.telemetry_level?1:"full"===r.telemetry_level?2:0),settings.test_order=settings.test_order.toUpperCase()}catch(t){twarn("Possible error in custom test settings. Some settings may not be applied. Exception: "+t)}tlog(JSON.stringify(settings)),test_pointer=0;varl=!1,a=!1,o=!1,u=!1,g=function(){if(5!=testStatus){if(test_pointer>=settings.test_order.length)returntestStatus=4,voidsendTelemetry();switch(settings.test_order.charAt(test_pointer)){case"I":if(test_pointer++,l)returnvoidg();l=!0,getIp(g);break;case"D":if(test_pointer++,a)returnvoidg();a=!0,testStatus=1,dlTest(g);break;case"U":if(test_pointer++,o)returnvoidg();o=!0,testStatus=3,ulTest(g);break;case"P":if(test_pointer++,u)returnvoidg();u=!0,testStatus=2,pingTest(g);break;case"_":test_pointer++,setTimeout(g,1e3);break;default:test_pointer++}}};g()}"abort"===e[0]&&(tlog("manually aborted"),clearRequests(),g=null,interval&&clearInterval(interval),settings.telemetry_level>1&&sendTelemetry(),testStatus=5,dlStatus="",ulStatus="",pingStatus="",jitterStatus="")});varipCalled=!1;functiongetIp(t){tlog("getIp"),ipCalled||(ipCalled=!0,(xhr=newXMLHttpRequest).onload=function(){tlog("IP: "+xhr.responseText),clientIp=xhr.responseText,t()},xhr.onerror=function(){tlog("getIp failed"),t()},xhr.open("GET",settings.url_getIp+url_sep(settings.url_getIp)+(settings.getIp_ispInfo?"isp=true"+(settings.getIp_ispInfo_distance?"&distance="+settings.getIp_ispInfo_distance+"&":"&"):"&")+"r="+Math.random(),!0),xhr.send())}vardlCalled=!1;functiondlTest(t){if(tlog("dlTest"),!dlCalled){dlCalled=!0;vare=0,r=(newDate).getTime(),s=!1,n=!1;xhr=[];for(vari=function(t,r){setTimeout(function(){if(1===testStatus){tlog("dl test stream started "+t+" "+r);vars=0,l=newXMLHttpRequest;xhr[t]=l,xhr[t].onprogress=function(