@dtect/security-sdk-js 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -88,6 +88,8 @@ interface ISecurityResultResponse {
88
88
  isTorDetected: boolean;
89
89
  isHighActivityDevice: boolean;
90
90
  isIncognito: boolean;
91
+ isAIUsageDetected?: boolean | null;
92
+ isQualityRejected?: boolean | null;
91
93
  };
92
94
  }
93
95
  interface ISecurityTokenResponse {
@@ -119,6 +121,7 @@ interface ISecurityAPIInitProps {
119
121
  apiKey: string;
120
122
  endpoint?: string;
121
123
  includeResults?: boolean;
124
+ autoFlagAIUsage?: boolean;
122
125
  }
123
126
 
124
127
  interface Idtect {
package/dist/index.d.ts CHANGED
@@ -88,6 +88,8 @@ interface ISecurityResultResponse {
88
88
  isTorDetected: boolean;
89
89
  isHighActivityDevice: boolean;
90
90
  isIncognito: boolean;
91
+ isAIUsageDetected?: boolean | null;
92
+ isQualityRejected?: boolean | null;
91
93
  };
92
94
  }
93
95
  interface ISecurityTokenResponse {
@@ -119,6 +121,7 @@ interface ISecurityAPIInitProps {
119
121
  apiKey: string;
120
122
  endpoint?: string;
121
123
  includeResults?: boolean;
124
+ autoFlagAIUsage?: boolean;
122
125
  }
123
126
 
124
127
  interface Idtect {
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var ie=Object.defineProperty;var pt=Object.getOwnPropertyDescriptor;var yt=Object.getOwnPropertyNames;var ht=Object.prototype.hasOwnProperty;var wt=(t,e)=>{for(var n in e)ie(t,n,{get:e[n],enumerable:!0})},It=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of yt(e))!ht.call(t,r)&&r!==n&&ie(t,r,{get:()=>e[r],enumerable:!(o=pt(e,r))||o.enumerable});return t};var vt=t=>It(ie({},"__esModule",{value:!0}),t);var kn={};wt(kn,{LanguageCodes:()=>F,QualityQuestionsRespondentTypes:()=>G,SecurityAPIError:()=>dt,checkQualityQuestions:()=>te,default:()=>Pn,getQualityQuestions:()=>ee,getSecurityResult:()=>X,getSecurityToken:()=>Z,hasCredentials:()=>vn,init:()=>gt,isAIUsageDetected:()=>H});module.exports=vt(kn);var Et={UNAUTHORIZED:"Unauthorized"},bt={EXPIRED:"EXPIRED_TOKEN",INVALID_API_KEY:"INVALID_API_KEY",MISSING_AUTHENTICATION_TOKEN:"MISSING_AUTHENTICATION_TOKEN"},Ae={INTERNAL_SERVER_ERROR:"Internal Server Error during API Request",MISSING_CREDENTIALS:"Missing Public Client ID or Public API Key",MAINTENANCE_MODE:"API Under Maintenance",RATE_LIMIT_REACHED:"Too many requests. Rate limit exceeded"},Se={SDK_INIT_ERROR:"Internal Server Error during SDK Initialization",DUPLICATE_INITIALIZATION:"Multiple SDK Initializations Detected",NOT_INITIALIZED:"SDK Not Initialized"},Pe={INVALID_CREDENTIALS:"Invalid Public Client ID or Public API Key"},ke={FAILED_TO_GET_SECURITY_RESULT:"Failed to Retrieve Security Result"},_e={FAILED_TO_GET_SECURITY_TOKEN:" Failed to Generate Security Token"},y={...Et,...bt,...Ae,...Se,...Pe,...ke,..._e},Oe={...Ae,...Se,...Pe,...ke,..._e};var F=(f=>(f.AR="ar",f.BN="bn",f.DE="de",f.EN="en",f.ES="es",f.FR="fr",f.HI="hi",f.ID="id",f.IT="it",f.JA="ja",f.KO="ko",f.MS="ms",f.NL="nl",f.PT="pt",f.RU="ru",f.YU="yu",f.ZH="zh",f))(F||{}),G=(p=>(p.GeneralConsumer="general-consumer",p.HRManagerDirector="hr-manager-director",p.WebDeveloper="web-developer",p.SoftwareEngineer="software-engineer",p.ITDirector="it-director",p.BusinessAdministrator="business-administrator",p.AccountsPayableManager="accounts-payable-manager",p.Accountant="accountant",p.FinanceDirector="finance-director",p.SmallBusinessOwner="small-business-owner",p.GeneralContractor="general-contractor",p.MarketingManagerDirector="marketing-manager-director",p.ConsumerShopper="consumer-shopper",p.Travel="travel",p.Entertainment="entertainment",p.FinanceAndBanking="finance-and-banking",p.General="general",p.B2BWhiteCollar="b2b-white-collar",p.B2BBlueCollar="b2b-blue-collar",p.Lawyer="lawyer",p))(G||{});var v=[];for(let t=0;t<256;++t)v.push((t+256).toString(16).slice(1));function Me(t,e=0){return(v[t[e+0]]+v[t[e+1]]+v[t[e+2]]+v[t[e+3]]+"-"+v[t[e+4]]+v[t[e+5]]+"-"+v[t[e+6]]+v[t[e+7]]+"-"+v[t[e+8]]+v[t[e+9]]+"-"+v[t[e+10]]+v[t[e+11]]+v[t[e+12]]+v[t[e+13]]+v[t[e+14]]+v[t[e+15]]).toLowerCase()}var ae,Tt=new Uint8Array(16);function se(){if(!ae){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");ae=crypto.getRandomValues.bind(crypto)}return ae(Tt)}var Rt=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),ce={randomUUID:Rt};function xt(t,e,n){if(ce.randomUUID&&!e&&!t)return ce.randomUUID();t=t||{};let o=t.random??t.rng?.()??se();if(o.length<16)throw new Error("Random bytes length must be >= 16");if(o[6]=o[6]&15|64,o[8]=o[8]&63|128,e){if(n=n||0,n<0||n+16>e.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);for(let r=0;r<16;++r)e[n+r]=o[r];return e}return Me(o)}var O=xt;var Ne="dtect_security_sdk_state",Le=typeof window<"u",Be={isLoading:!1,token:"",visitorId:"",projectId:"",questionData:null,clientData:null,aiCheckData:null},K={state:{...Be},securityKeys:{behaviorKey:"bwDZ0V3Zrb4SB6g4lZwW",automationKey:"7166bf18-b91e-407a-84fc-d57ac104de98"}};function Ce(){if(!Le)return K;try{let t=sessionStorage.getItem(Ne);if(!t)return K;let e=JSON.parse(t);return e.expiresAt&&e.expiresAt<Date.now()?K:{state:{...Be,...e.state},securityKeys:e.securityKeys||{behaviorKey:"",automationKey:""}}}catch{return K}}function Ue(t){if(Le)try{let e=Date.now()+864e5,n={...t,expiresAt:e};sessionStorage.setItem(Ne,JSON.stringify(n))}catch{}}function Fe(t){return t||O()}var Dt="0.1.0",V={...Ce(),monitor:void 0,version:Dt};function h(){return V}function P(t){V=t(V),Ue({state:V.state,securityKeys:V.securityKeys})}function M(){let{config:t}=h(),e=t?.endpoint||"https://api.dtect.io/security",n=t?.includeResults?`${e}/client/check/result`:`${e}/client/check`;return{endpoint:e,clientId:t?.clientId,apiKey:t?.apiKey,checkResultEndpoint:n}}async function E(t,e="info",n={}){let o=`${n.endpoint??"https://api.dtect.io/security"}/log`,r={message:t,type:e,payload:n};navigator.sendBeacon(o,JSON.stringify(r))}function N(t){if(t instanceof Error){if(t?.message?.includes("maintenance_mode"))throw new Error(y.MAINTENANCE_MODE);switch(t?.message){default:throw new Error(y.INTERNAL_SERVER_ERROR)}}throw new Error(y.FAILED_TO_GET_SECURITY_TOKEN)}function Ge(t,e){let{state:n,config:o}=h();if(t instanceof Error){if(E(t.message,"error",{function:"init",endpoint:o?.endpoint,error:t,token:n.token,clientId:e.clientId}),t.message.includes("maintenance_mode"))throw new Error(y.MAINTENANCE_MODE);if([y.INVALID_API_KEY,y.UNAUTHORIZED].includes(t.message))throw new Error(y.INVALID_CREDENTIALS)}throw new Error(y.SDK_INIT_ERROR)}function Ve(t){let e=t?.qbc||!1,n=t?.mas||!1,o=t?.apd||!1,r=t?.scb||null,i=0,a=()=>{e=!1,n=!1,o=!1,r=void 0,i=0},s=()=>{let l=window?.getSelection()?.toString();l&&l.length>0&&(i=Date.now(),e=!0)},c=u=>{let l=u.clipboardData?.getData("text"),g=u.target instanceof HTMLInputElement||u.target instanceof HTMLTextAreaElement;l&&g&&(o=!0)},d=()=>{n=!0;let u=Date.now();if(i){let l=(u-i)/1e3;(r===void 0||l<r)&&(r=l)}};return document?.addEventListener("copy",s),document?.addEventListener("paste",c),window?.addEventListener("blur",d),{get qbc(){return e},get mas(){return n},get apd(){return o},get scb(){return r},reset:a,destroy(){document?.removeEventListener("copy",s),document?.removeEventListener("paste",c),window?.removeEventListener("blur",d)}}}function We(t){P(e=>{let n=Ve(e.state.aiCheckData);return{...e,monitor:n,state:{...e.state,isLoading:!0,token:t||""}}})}function qe(t){P(e=>({...e,state:{...e.state,isLoading:!1,token:t||""}}))}var L={exclude:[],include:[],stabilize:["private","iframe"],logging:!0,timeout:5e3,cache_api_call:!0,performance:!1,experimental:!1},gr={...L},ue={private:[{exclude:["canvas"],browsers:["firefox","safari>=17","brave"]},{exclude:["audio"],browsers:["samsungbrowser","safari"]},{exclude:["fonts"],browsers:["firefox"]},{exclude:["audio.sampleHash","hardware.deviceMemory","header.acceptLanguage.q","system.hardwareConcurrency","plugins"],browsers:["brave"]},{exclude:["tls.extensions"],browsers:["firefox","chrome","safari"]},{exclude:["header.acceptLanguage"],browsers:["edge","chrome"]}],iframe:[{exclude:["system.applePayVersion","system.cookieEnabled"],browsers:["safari"]},{exclude:["permissions"]}],vpn:[{exclude:["ip"]}]};async function me(){return At()}async function At(){return new Promise((e,n)=>{try{let i=new(window.OfflineAudioContext||window.webkitOfflineAudioContext)(1,5e3,44100),a=i?.createBufferSource(),s=i.createOscillator();s.frequency.value=1e3;let c=i.createDynamicsCompressor();c.threshold.value=-50,c.knee.value=40,c.ratio.value=12,c.attack.value=0,c.release.value=.2,s.connect(c),c.connect(i.destination),s.start();let d;i.oncomplete=u=>{d=u.renderedBuffer.getChannelData(0),e({sampleHash:St(d),maxChannels:i.destination.maxChannelCount,channelCountMode:a.channelCountMode})},i.startRendering()}catch(o){console.error("Error creating audio fingerprint:",o),n(o)}})}function St(t){let e=0;for(let n=0;n<t.length;++n)e+=Math.abs(t[n]);return e}function j(t,e,n){let o=[];for(let a=0;a<t[0].data.length;a++){let s=[];for(let c=0;c<t.length;c++)s.push(t[c].data[a]);o.push(Pt(s))}let r=o,i=new Uint8ClampedArray(r);return new ImageData(i,e,n)}function Pt(t){if(t.length===0)return 0;let e={};for(let o of t)e[o]=(e[o]||0)+1;let n=t[0];for(let o in e)e[o]>e[n]&&(n=parseInt(o,10));return n}function kt(t){return new TextEncoder().encode(t).buffer}function $(t){return t^=t>>>16,t=Math.imul(t,2246822507),t^=t>>>13,t=Math.imul(t,3266489909),t^=t>>>16,t>>>0}var R=new Uint32Array([597399067,2869860233,951274213,2716044179]);function A(t,e){return t<<e|t>>>32-e}function _t(t,e){let n=t.byteLength/16|0,o=new Uint32Array(t,0,n*4);for(let r=0;r<n;r++){let i=o.subarray(r*4,(r+1)*4);i[0]=Math.imul(i[0],R[0]),i[0]=A(i[0],15),i[0]=Math.imul(i[0],R[1]),e[0]=e[0]^i[0],e[0]=A(e[0],19),e[0]=e[0]+e[1],e[0]=Math.imul(e[0],5)+1444728091,i[1]=Math.imul(i[1],R[1]),i[1]=A(i[1],16),i[1]=Math.imul(i[1],R[2]),e[1]=e[1]^i[1],e[1]=A(e[1],17),e[1]=e[1]+e[2],e[1]=Math.imul(e[1],5)+197830471,i[2]=Math.imul(i[2],R[2]),i[2]=A(i[2],17),i[2]=Math.imul(i[2],R[3]),e[2]=e[2]^i[2],e[2]=A(e[2],15),e[2]=e[2]+e[3],e[2]=Math.imul(e[2],5)+2530024501,i[3]=Math.imul(i[3],R[3]),i[3]=A(i[3],18),i[3]=Math.imul(i[3],R[0]),e[3]=e[3]^i[3],e[3]=A(e[3],13),e[3]=e[3]+e[0],e[3]=Math.imul(e[3],5)+850148119}}function Ot(t,e){let n=t.byteLength/16|0,o=t.byteLength%16,r=new Uint32Array(4),i=new Uint8Array(t,n*16,o);switch(o){case 15:r[3]=r[3]^i[14]<<16;case 14:r[3]=r[3]^i[13]<<8;case 13:r[3]=r[3]^i[12]<<0,r[3]=Math.imul(r[3],R[3]),r[3]=A(r[3],18),r[3]=Math.imul(r[3],R[0]),e[3]=e[3]^r[3];case 12:r[2]=r[2]^i[11]<<24;case 11:r[2]=r[2]^i[10]<<16;case 10:r[2]=r[2]^i[9]<<8;case 9:r[2]=r[2]^i[8]<<0,r[2]=Math.imul(r[2],R[2]),r[2]=A(r[2],17),r[2]=Math.imul(r[2],R[3]),e[2]=e[2]^r[2];case 8:r[1]=r[1]^i[7]<<24;case 7:r[1]=r[1]^i[6]<<16;case 6:r[1]=r[1]^i[5]<<8;case 5:r[1]=r[1]^i[4]<<0,r[1]=Math.imul(r[1],R[1]),r[1]=A(r[1],16),r[1]=Math.imul(r[1],R[2]),e[1]=e[1]^r[1];case 4:r[0]=r[0]^i[3]<<24;case 3:r[0]=r[0]^i[2]<<16;case 2:r[0]=r[0]^i[1]<<8;case 1:r[0]=r[0]^i[0]<<0,r[0]=Math.imul(r[0],R[0]),r[0]=A(r[0],15),r[0]=Math.imul(r[0],R[1]),e[0]=e[0]^r[0]}}function Mt(t,e){e[0]=e[0]^t.byteLength,e[1]=e[1]^t.byteLength,e[2]=e[2]^t.byteLength,e[3]=e[3]^t.byteLength,e[0]=e[0]+e[1]|0,e[0]=e[0]+e[2]|0,e[0]=e[0]+e[3]|0,e[1]=e[1]+e[0]|0,e[2]=e[2]+e[0]|0,e[3]=e[3]+e[0]|0,e[0]=$(e[0]),e[1]=$(e[1]),e[2]=$(e[2]),e[3]=$(e[3]),e[0]=e[0]+e[1]|0,e[0]=e[0]+e[2]|0,e[0]=e[0]+e[3]|0,e[1]=e[1]+e[0]|0,e[2]=e[2]+e[0]|0,e[3]=e[3]+e[0]|0}function b(t,e=0){if(e=e?e|0:0,typeof t=="string"&&(t=kt(t)),!(t instanceof ArrayBuffer))throw new TypeError("Expected key to be ArrayBuffer or string");let n=new Uint32Array([e,e,e,e]);_t(t,n),Ot(t,n),Mt(t,n);let o=new Uint8Array(n.buffer);return Array.from(o).map(r=>r.toString(16).padStart(2,"0")).join("")}var Nt=3,Ke=280,je=20;async function le(){return Lt()}function Lt(){return new Promise(t=>{let e=Array.from({length:Nt},()=>Bt()),n=j(e,Ke,je);t({commonPixelsHash:b(n.data.toString()).toString()})})}function Bt(){let t=document.createElement("canvas"),e=t.getContext("2d");if(!e)return new ImageData(1,1);t.width=Ke,t.height=je;let n=e.createLinearGradient(0,0,t.width,t.height);n.addColorStop(0,"red"),n.addColorStop(1/6,"orange"),n.addColorStop(2/6,"yellow"),n.addColorStop(3/6,"green"),n.addColorStop(4/6,"blue"),n.addColorStop(5/6,"indigo"),n.addColorStop(1,"violet"),e.fillStyle=n,e.fillRect(0,0,t.width,t.height);let o="Random Text WMwmil10Oo";return e.font="23.123px Arial",e.fillStyle="black",e.fillText(o,-5,15),e.fillStyle="rgba(0, 0, 255, 0.5)",e.fillText(o,-3.3,17.7),e.beginPath(),e.moveTo(0,0),e.lineTo(t.width*2/7,t.height),e.strokeStyle="white",e.lineWidth=2,e.stroke(),e.getImageData(0,0,t.width,t.height)}async function z(t){for(;!document.body;)await Ct(50);let e=document.createElement("iframe");e.setAttribute("frameBorder","0");let n=e.style;n.setProperty("position","fixed"),n.setProperty("display","block","important"),n.setProperty("visibility","visible"),n.setProperty("border","0"),n.setProperty("opacity","0"),e.src="about:blank",document.body.appendChild(e);let o=e.contentDocument||e.contentWindow?.document;if(!o)throw new Error("Iframe document is not accessible");t({iframe:o}),setTimeout(()=>{document.body.removeChild(e)},0)}function Ct(t,e){return new Promise(n=>setTimeout(n,t,e))}var Ut=["Arial","Arial Black","Arial Narrow","Arial Rounded MT","Arimo","Archivo","Barlow","Bebas Neue","Bitter","Bookman","Calibri","Cabin","Candara","Century","Century Gothic","Comic Sans MS","Constantia","Courier","Courier New","Crimson Text","DM Mono","DM Sans","DM Serif Display","DM Serif Text","Dosis","Droid Sans","Exo","Fira Code","Fira Sans","Franklin Gothic Medium","Garamond","Geneva","Georgia","Gill Sans","Helvetica","Impact","Inconsolata","Indie Flower","Inter","Josefin Sans","Karla","Lato","Lexend","Lucida Bright","Lucida Console","Lucida Sans Unicode","Manrope","Merriweather","Merriweather Sans","Montserrat","Myriad","Noto Sans","Nunito","Nunito Sans","Open Sans","Optima","Orbitron","Oswald","Pacifico","Palatino","Perpetua","PT Sans","PT Serif","Poppins","Prompt","Public Sans","Quicksand","Rajdhani","Recursive","Roboto","Roboto Condensed","Rockwell","Rubik","Segoe Print","Segoe Script","Segoe UI","Sora","Source Sans Pro","Space Mono","Tahoma","Taviraj","Times","Times New Roman","Titillium Web","Trebuchet MS","Ubuntu","Varela Round","Verdana","Work Sans"],Ft=["monospace","sans-serif","serif"];async function de(t){return Gt()}function Gt(){return new Promise((t,e)=>{try{z(async({iframe:n})=>{let r=n.createElement("canvas").getContext("2d"),i=Ft.map(s=>$e(r,s)),a={};Ut.forEach(s=>{let c=$e(r,s);i.includes(c)||(a[s]=c)}),t(a)})}catch{e({error:"unsupported"})}})}function $e(t,e){if(!t)return null;let n="WwMmLli0Oo";return t.font=`72px ${e}`,t.measureText(n).width}function ge(){return new Promise((t,e)=>{let n=navigator.deviceMemory!==void 0?navigator.deviceMemory:0,o=window.performance&&window.performance.memory?window.performance.memory:0;t({videocard:Vt(),architecture:Wt(),deviceMemory:n.toString()||"undefined",jsHeapSizeLimit:o.jsHeapSizeLimit||0})})}function Vt(){let t=document.createElement("canvas"),e=t.getContext("webgl")??t.getContext("experimental-webgl");if(e&&"getParameter"in e)try{let n=(e.getParameter(e.VENDOR)||"").toString(),o=(e.getParameter(e.RENDERER)||"").toString(),r={vendor:n,renderer:o,version:(e.getParameter(e.VERSION)||"").toString(),shadingLanguageVersion:(e.getParameter(e.SHADING_LANGUAGE_VERSION)||"").toString()};if(!o.length||!n.length){let i=e.getExtension("WEBGL_debug_renderer_info");if(i){let a=(e.getParameter(i.UNMASKED_VENDOR_WEBGL)||"").toString(),s=(e.getParameter(i.UNMASKED_RENDERER_WEBGL)||"").toString();a&&(r.vendorUnmasked=a),s&&(r.rendererUnmasked=s)}}return r}catch{}return"undefined"}function Wt(){let t=new Float32Array(1),e=new Uint8Array(t.buffer);return t[0]=1/0,t[0]=t[0]-t[0],e[3]}function fe(){return new Promise(t=>{t({languages:qt(),timezone:Kt()})})}function qt(){let t=[];return navigator.language}function Kt(){return Intl.DateTimeFormat().resolvedOptions().timeZone}var Y=(t,e,n,o)=>{let r=(n-e)/o,i=0;for(let a=0;a<o;a++){let s=e+(a+.5)*r;i+=t(s)}return i*r};function pe(){return new Promise(t=>{t({acos:Math.acos(.5),asin:Y(Math.asin,-1,1,97),cos:Y(Math.cos,0,Math.PI,97),largeCos:Math.cos(1e20),largeSin:Math.sin(1e20),largeTan:Math.tan(1e20),sin:Y(Math.sin,-Math.PI,Math.PI,97),tan:Y(Math.tan,0,2*Math.PI,97)})})}function jt(t){if(t.length===0)return null;let e={};t.forEach(r=>{let i=String(r);e[i]=(e[i]||0)+1});let n=t[0],o=1;return Object.keys(e).forEach(r=>{e[r]>o&&(n=r,o=e[r])}),n}function ze(t,e){let n={};return e.forEach(o=>{let r=t.map(a=>o in a?a[o]:void 0).filter(a=>a!==void 0),i=jt(r);i&&(n[o]=i)}),n}var $t=["accelerometer","accessibility","accessibility-events","ambient-light-sensor","background-fetch","background-sync","bluetooth","camera","clipboard-read","clipboard-write","device-info","display-capture","gyroscope","geolocation","local-fonts","magnetometer","microphone","midi","nfc","notifications","payment-handler","persistent-storage","push","speaker","storage-access","top-level-storage-access","window-management","query"];async function ye(t){let e=t?.permissions_to_check||$t,o=await Promise.all(Array.from({length:3},()=>zt(e)));return ze(o,e)}async function zt(t){let e={};for(let n of t)try{let o=await navigator.permissions.query({name:n});e[n]=o.state.toString()}catch{}return e}async function he(){let t=[];if(navigator.plugins)for(let e=0;e<navigator.plugins.length;e++){let n=navigator.plugins[e];t.push([n.name,n.filename,n.description].join("|"))}return new Promise(e=>{e({plugins:t})})}function B(){if(typeof navigator>"u")return{name:"unknown",version:"unknown"};let t=navigator.userAgent,e=[/(?<name>SamsungBrowser)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>EdgA|EdgiOS|Edg)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>OPR|OPX)\/(?<version>\d+(?:\.\d+)+)/,/Opera[\s\/](?<version>\d+(?:\.\d+)+)/,/Opera Mini\/(?<version>\d+(?:\.\d+)+)/,/Opera Mobi\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Vivaldi)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Brave)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>CriOS)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>FxiOS)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Chrome|Chromium)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Firefox|Waterfox|Iceweasel|IceCat)\/(?<version>\d+(?:\.\d+)+)/,/Version\/(?<version1>[\d.]+).*Safari\/[\d.]+|(?<name>Safari)\/(?<version2>[\d.]+)/,/(?<name>MSIE|Trident|IEMobile).+?(?<version>\d+(?:\.\d+)+)/,/(?<name>[A-Za-z]+)\/(?<version>\d+(?:\.\d+)+)/],n={edg:"Edge",edga:"Edge",edgios:"Edge",opr:"Opera",opx:"Opera",crios:"Chrome",fxios:"Firefox",samsung:"SamsungBrowser",vivaldi:"Vivaldi",brave:"Brave"};for(let o of e){let r=t.match(o);if(r){let i=r.groups?.name,a=r.groups?.version||r.groups?.version1||r.groups?.version2;if(!i&&(r.groups?.version1||r.groups?.version2)&&(i="Safari"),!i&&o.source.includes("Opera Mini")&&(i="Opera Mini"),!i&&o.source.includes("Opera Mobi")&&(i="Opera Mobi"),!i&&o.source.includes("Opera")&&(i="Opera"),!i&&r[1]&&(i=r[1]),!a&&r[2]&&(a=r[2]),i)return{name:n[i.toLowerCase()]||i,version:a||"unknown"}}}return{name:"unknown",version:"unknown"}}function Q(){if(typeof navigator>"u"||!navigator.userAgent)return!1;let t=navigator.userAgent;return/Mobi|Android|iPhone|iPod|IEMobile|Opera Mini|Opera Mobi|webOS|BlackBerry|Windows Phone/i.test(t)&&!/iPad/i.test(t)}function we(){return new Promise(t=>{let e={is_touchscreen:navigator.maxTouchPoints>0,maxTouchPoints:navigator.maxTouchPoints,colorDepth:screen.colorDepth,mediaMatches:Qt()};Q()&&navigator.maxTouchPoints>0&&(e.resolution=Yt()),t(e)})}function Yt(){let t=window.screen.width,e=window.screen.height,n=Math.max(t,e).toString(),o=Math.min(t,e).toString();return`${n}x${o}`}function Qt(){let t=[],e={"prefers-contrast":["high","more","low","less","forced","no-preference"],"any-hover":["hover","none"],"any-pointer":["none","coarse","fine"],pointer:["none","coarse","fine"],hover:["hover","none"],update:["fast","slow"],"inverted-colors":["inverted","none"],"prefers-reduced-motion":["reduce","no-preference"],"prefers-reduced-transparency":["reduce","no-preference"],scripting:["none","initial-only","enabled"],"forced-colors":["active","none"]};return Object.keys(e).forEach(n=>{e[n].forEach(o=>{matchMedia(`(${n}: ${o})`).matches&&t.push(`${n}: ${o}`)})}),t}function Ie(){return new Promise(t=>{let e=B(),n=navigator.userAgent,o={platform:window.navigator.platform,productSub:navigator.productSub,product:navigator.product,useragent:navigator.userAgent,hardwareConcurrency:navigator.hardwareConcurrency,browser:{name:e.name,version:e.version},mobile:Q(),applePayVersion:Jt(),cookieEnabled:window.navigator.cookieEnabled};t(o)})}function Jt(){if(window.location.protocol==="https:"&&typeof window.ApplePaySession=="function")try{let t=window.ApplePaySession.supportsVersion;for(let e=15;e>0;e--)if(t(e))return e}catch{return 0}return 0}var Xt=B().name!=="SamsungBrowser"?1:3,x,m=null;function Zt(){typeof document<"u"&&(x=document.createElement("canvas"),x.width=200,x.height=100,m=x.getContext("webgl"))}async function ve(){Zt();try{if(!m)throw new Error("WebGL not supported");let t=Array.from({length:Xt},()=>Ht()),e=j(t,x.width,x.height);return{commonPixelsHash:b(e.data.toString()).toString()}}catch{return{webgl:"unsupported"}}}function Ht(){try{if(!m)throw new Error("WebGL not supported");let t=`
1
+ "use strict";var se=Object.defineProperty;var It=Object.getOwnPropertyDescriptor;var vt=Object.getOwnPropertyNames;var Et=Object.prototype.hasOwnProperty;var bt=(t,e)=>{for(var n in e)se(t,n,{get:e[n],enumerable:!0})},Tt=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of vt(e))!Et.call(t,r)&&r!==n&&se(t,r,{get:()=>e[r],enumerable:!(o=It(e,r))||o.enumerable});return t};var Rt=t=>Tt(se({},"__esModule",{value:!0}),t);var Mn={};bt(Mn,{LanguageCodes:()=>G,QualityQuestionsRespondentTypes:()=>V,SecurityAPIError:()=>yt,checkQualityQuestions:()=>re,default:()=>On,getQualityQuestions:()=>ne,getSecurityResult:()=>ee,getSecurityToken:()=>te,hasCredentials:()=>Tn,init:()=>ht,isAIUsageDetected:()=>$});module.exports=Rt(Mn);var xt={UNAUTHORIZED:"Unauthorized"},At={EXPIRED:"EXPIRED_TOKEN",INVALID_API_KEY:"INVALID_API_KEY",MISSING_AUTHENTICATION_TOKEN:"MISSING_AUTHENTICATION_TOKEN"},ke={INTERNAL_SERVER_ERROR:"Internal Server Error during API Request",MISSING_CREDENTIALS:"Missing Public Client ID or Public API Key",MAINTENANCE_MODE:"API Under Maintenance",RATE_LIMIT_REACHED:"Too many requests. Rate limit exceeded"},Pe={SDK_INIT_ERROR:"Internal Server Error during SDK Initialization",DUPLICATE_INITIALIZATION:"Multiple SDK Initializations Detected",NOT_INITIALIZED:"SDK Not Initialized"},_e={INVALID_CREDENTIALS:"Invalid Public Client ID or Public API Key"},Oe={FAILED_TO_GET_SECURITY_RESULT:"Failed to Retrieve Security Result"},Me={FAILED_TO_GET_SECURITY_TOKEN:" Failed to Generate Security Token"},h={...xt,...At,...ke,...Pe,..._e,...Oe,...Me},Ne={...ke,...Pe,..._e,...Oe,...Me};var G=(p=>(p.AR="ar",p.BN="bn",p.DE="de",p.EN="en",p.ES="es",p.FR="fr",p.HI="hi",p.ID="id",p.IT="it",p.JA="ja",p.KO="ko",p.MS="ms",p.NL="nl",p.PT="pt",p.RU="ru",p.YU="yu",p.ZH="zh",p))(G||{}),V=(y=>(y.GeneralConsumer="general-consumer",y.HRManagerDirector="hr-manager-director",y.WebDeveloper="web-developer",y.SoftwareEngineer="software-engineer",y.ITDirector="it-director",y.BusinessAdministrator="business-administrator",y.AccountsPayableManager="accounts-payable-manager",y.Accountant="accountant",y.FinanceDirector="finance-director",y.SmallBusinessOwner="small-business-owner",y.GeneralContractor="general-contractor",y.MarketingManagerDirector="marketing-manager-director",y.ConsumerShopper="consumer-shopper",y.Travel="travel",y.Entertainment="entertainment",y.FinanceAndBanking="finance-and-banking",y.General="general",y.B2BWhiteCollar="b2b-white-collar",y.B2BBlueCollar="b2b-blue-collar",y.Lawyer="lawyer",y))(V||{});var E=[];for(let t=0;t<256;++t)E.push((t+256).toString(16).slice(1));function Le(t,e=0){return(E[t[e+0]]+E[t[e+1]]+E[t[e+2]]+E[t[e+3]]+"-"+E[t[e+4]]+E[t[e+5]]+"-"+E[t[e+6]]+E[t[e+7]]+"-"+E[t[e+8]]+E[t[e+9]]+"-"+E[t[e+10]]+E[t[e+11]]+E[t[e+12]]+E[t[e+13]]+E[t[e+14]]+E[t[e+15]]).toLowerCase()}var ce,Dt=new Uint8Array(16);function ue(){if(!ce){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");ce=crypto.getRandomValues.bind(crypto)}return ce(Dt)}var St=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),le={randomUUID:St};function kt(t,e,n){if(le.randomUUID&&!e&&!t)return le.randomUUID();t=t||{};let o=t.random??t.rng?.()??ue();if(o.length<16)throw new Error("Random bytes length must be >= 16");if(o[6]=o[6]&15|64,o[8]=o[8]&63|128,e){if(n=n||0,n<0||n+16>e.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);for(let r=0;r<16;++r)e[n+r]=o[r];return e}return Le(o)}var O=kt;var Ce="dtect_security_sdk_state",Be=typeof window<"u",Ue={isLoading:!1,token:"",visitorId:"",projectId:"",questionData:null,clientData:null,aiCheckData:null,aiUsageFlagged:!1},z={state:{...Ue},securityKeys:{behaviorKey:"",automationKey:""}};function Fe(){if(!Be)return z;try{let t=sessionStorage.getItem(Ce);if(!t)return z;let e=JSON.parse(t);return e.expiresAt&&e.expiresAt<Date.now()?z:{state:{...Ue,...e.state},securityKeys:e.securityKeys||{behaviorKey:"",automationKey:""}}}catch{return z}}function Ge(t){if(Be)try{let e=Date.now()+864e5,n={...t,expiresAt:e};sessionStorage.setItem(Ce,JSON.stringify(n))}catch{}}function Ve(t){return t||O()}var Pt="0.1.1",W={...Fe(),monitor:void 0,version:Pt};function w(){return W}function S(t){W=t(W),Ge({state:W.state,securityKeys:W.securityKeys})}function M(){let{config:t}=w(),e=t?.endpoint||"https://api.dtect.io/security",n=t?.includeResults?`${e}/client/check/result`:`${e}/client/check`;return{endpoint:e,clientId:t?.clientId,apiKey:t?.apiKey,checkResultEndpoint:n}}async function I(t,e="info",n={}){let o=`${n.endpoint??"https://api.dtect.io/security"}/log`,r={message:t,type:e,payload:n};navigator.sendBeacon(o,JSON.stringify(r))}function N(t){if(t instanceof Error){if(t?.message?.includes("maintenance_mode"))throw new Error(h.MAINTENANCE_MODE);switch(t?.message){default:throw new Error(h.INTERNAL_SERVER_ERROR)}}throw new Error(h.FAILED_TO_GET_SECURITY_TOKEN)}function We(t,e){let{state:n,config:o}=w();if(t instanceof Error){if(I(t.message,"error",{function:"init",endpoint:o?.endpoint,error:t,token:n.token,clientId:e.clientId}),t.message.includes("maintenance_mode"))throw new Error(h.MAINTENANCE_MODE);if([h.INVALID_API_KEY,h.UNAUTHORIZED].includes(t.message))throw new Error(h.INVALID_CREDENTIALS)}throw new Error(h.SDK_INIT_ERROR)}function qe(t){let e=t?.qbc||!1,n=t?.mas||!1,o=t?.apd||!1,r=t?.scb||null,i=0,a=new Set,s=()=>{a.forEach(g=>g())},c=()=>{e=!1,n=!1,o=!1,r=void 0,i=0},m=()=>{let f=window?.getSelection()?.toString();f&&f.length>0&&(i=Date.now(),e=!0,s())},u=g=>{let f=g.clipboardData?.getData("text"),T=g.target instanceof HTMLInputElement||g.target instanceof HTMLTextAreaElement;f&&T&&(o=!0,s())},d=()=>{n=!0;let g=Date.now();if(i){let f=(g-i)/1e3;(r==null||f<r)&&(r=f)}s()};return document?.addEventListener("copy",m),document?.addEventListener("paste",u),window?.addEventListener("blur",d),{get qbc(){return e},get mas(){return n},get apd(){return o},get scb(){return r},onChange(g){return a.add(g),()=>{a.delete(g)}},reset:c,destroy(){a.clear(),document?.removeEventListener("copy",m),document?.removeEventListener("paste",u),window?.removeEventListener("blur",d)}}}function Ke(t){S(e=>{let n=qe(null);return{...e,monitor:n,state:{...e.state,isLoading:!0,token:t||"",aiUsageFlagged:!1}}})}function je(t){S(e=>({...e,state:{...e.state,isLoading:!1,token:t||""}}))}function L({projectId:t,visitorId:e}){let{state:n,monitor:o}=w();if(n.projectId===t&&n.visitorId===e)return;let r=O();o?.reset(),S(i=>({...i,state:{...i.state,aiCheckData:null,questionData:null,clientData:null,aiUsageFlagged:!1,projectId:t,visitorId:e,token:r}}))}var C={exclude:[],include:[],stabilize:["private","iframe"],logging:!0,timeout:5e3,cache_api_call:!0,performance:!1,experimental:!1},hr={...C},me={private:[{exclude:["canvas"],browsers:["firefox","safari>=17","brave"]},{exclude:["audio"],browsers:["samsungbrowser","safari"]},{exclude:["fonts"],browsers:["firefox"]},{exclude:["audio.sampleHash","hardware.deviceMemory","header.acceptLanguage.q","system.hardwareConcurrency","plugins"],browsers:["brave"]},{exclude:["tls.extensions"],browsers:["firefox","chrome","safari"]},{exclude:["header.acceptLanguage"],browsers:["edge","chrome"]}],iframe:[{exclude:["system.applePayVersion","system.cookieEnabled"],browsers:["safari"]},{exclude:["permissions"]}],vpn:[{exclude:["ip"]}]};async function de(){return _t()}async function _t(){return new Promise((e,n)=>{try{let i=new(window.OfflineAudioContext||window.webkitOfflineAudioContext)(1,5e3,44100),a=i?.createBufferSource(),s=i.createOscillator();s.frequency.value=1e3;let c=i.createDynamicsCompressor();c.threshold.value=-50,c.knee.value=40,c.ratio.value=12,c.attack.value=0,c.release.value=.2,s.connect(c),c.connect(i.destination),s.start();let m;i.oncomplete=u=>{m=u.renderedBuffer.getChannelData(0),e({sampleHash:Ot(m),maxChannels:i.destination.maxChannelCount,channelCountMode:a.channelCountMode})},i.startRendering()}catch(o){console.error("Error creating audio fingerprint:",o),n(o)}})}function Ot(t){let e=0;for(let n=0;n<t.length;++n)e+=Math.abs(t[n]);return e}function Y(t,e,n){let o=[];for(let a=0;a<t[0].data.length;a++){let s=[];for(let c=0;c<t.length;c++)s.push(t[c].data[a]);o.push(Mt(s))}let r=o,i=new Uint8ClampedArray(r);return new ImageData(i,e,n)}function Mt(t){if(t.length===0)return 0;let e={};for(let o of t)e[o]=(e[o]||0)+1;let n=t[0];for(let o in e)e[o]>e[n]&&(n=parseInt(o,10));return n}function Nt(t){return new TextEncoder().encode(t).buffer}function Q(t){return t^=t>>>16,t=Math.imul(t,2246822507),t^=t>>>13,t=Math.imul(t,3266489909),t^=t>>>16,t>>>0}var x=new Uint32Array([597399067,2869860233,951274213,2716044179]);function k(t,e){return t<<e|t>>>32-e}function Lt(t,e){let n=t.byteLength/16|0,o=new Uint32Array(t,0,n*4);for(let r=0;r<n;r++){let i=o.subarray(r*4,(r+1)*4);i[0]=Math.imul(i[0],x[0]),i[0]=k(i[0],15),i[0]=Math.imul(i[0],x[1]),e[0]=e[0]^i[0],e[0]=k(e[0],19),e[0]=e[0]+e[1],e[0]=Math.imul(e[0],5)+1444728091,i[1]=Math.imul(i[1],x[1]),i[1]=k(i[1],16),i[1]=Math.imul(i[1],x[2]),e[1]=e[1]^i[1],e[1]=k(e[1],17),e[1]=e[1]+e[2],e[1]=Math.imul(e[1],5)+197830471,i[2]=Math.imul(i[2],x[2]),i[2]=k(i[2],17),i[2]=Math.imul(i[2],x[3]),e[2]=e[2]^i[2],e[2]=k(e[2],15),e[2]=e[2]+e[3],e[2]=Math.imul(e[2],5)+2530024501,i[3]=Math.imul(i[3],x[3]),i[3]=k(i[3],18),i[3]=Math.imul(i[3],x[0]),e[3]=e[3]^i[3],e[3]=k(e[3],13),e[3]=e[3]+e[0],e[3]=Math.imul(e[3],5)+850148119}}function Ct(t,e){let n=t.byteLength/16|0,o=t.byteLength%16,r=new Uint32Array(4),i=new Uint8Array(t,n*16,o);switch(o){case 15:r[3]=r[3]^i[14]<<16;case 14:r[3]=r[3]^i[13]<<8;case 13:r[3]=r[3]^i[12]<<0,r[3]=Math.imul(r[3],x[3]),r[3]=k(r[3],18),r[3]=Math.imul(r[3],x[0]),e[3]=e[3]^r[3];case 12:r[2]=r[2]^i[11]<<24;case 11:r[2]=r[2]^i[10]<<16;case 10:r[2]=r[2]^i[9]<<8;case 9:r[2]=r[2]^i[8]<<0,r[2]=Math.imul(r[2],x[2]),r[2]=k(r[2],17),r[2]=Math.imul(r[2],x[3]),e[2]=e[2]^r[2];case 8:r[1]=r[1]^i[7]<<24;case 7:r[1]=r[1]^i[6]<<16;case 6:r[1]=r[1]^i[5]<<8;case 5:r[1]=r[1]^i[4]<<0,r[1]=Math.imul(r[1],x[1]),r[1]=k(r[1],16),r[1]=Math.imul(r[1],x[2]),e[1]=e[1]^r[1];case 4:r[0]=r[0]^i[3]<<24;case 3:r[0]=r[0]^i[2]<<16;case 2:r[0]=r[0]^i[1]<<8;case 1:r[0]=r[0]^i[0]<<0,r[0]=Math.imul(r[0],x[0]),r[0]=k(r[0],15),r[0]=Math.imul(r[0],x[1]),e[0]=e[0]^r[0]}}function Bt(t,e){e[0]=e[0]^t.byteLength,e[1]=e[1]^t.byteLength,e[2]=e[2]^t.byteLength,e[3]=e[3]^t.byteLength,e[0]=e[0]+e[1]|0,e[0]=e[0]+e[2]|0,e[0]=e[0]+e[3]|0,e[1]=e[1]+e[0]|0,e[2]=e[2]+e[0]|0,e[3]=e[3]+e[0]|0,e[0]=Q(e[0]),e[1]=Q(e[1]),e[2]=Q(e[2]),e[3]=Q(e[3]),e[0]=e[0]+e[1]|0,e[0]=e[0]+e[2]|0,e[0]=e[0]+e[3]|0,e[1]=e[1]+e[0]|0,e[2]=e[2]+e[0]|0,e[3]=e[3]+e[0]|0}function b(t,e=0){if(e=e?e|0:0,typeof t=="string"&&(t=Nt(t)),!(t instanceof ArrayBuffer))throw new TypeError("Expected key to be ArrayBuffer or string");let n=new Uint32Array([e,e,e,e]);Lt(t,n),Ct(t,n),Bt(t,n);let o=new Uint8Array(n.buffer);return Array.from(o).map(r=>r.toString(16).padStart(2,"0")).join("")}var Ut=3,$e=280,ze=20;async function ge(){return Ft()}function Ft(){return new Promise(t=>{let e=Array.from({length:Ut},()=>Gt()),n=Y(e,$e,ze);t({commonPixelsHash:b(n.data.toString()).toString()})})}function Gt(){let t=document.createElement("canvas"),e=t.getContext("2d");if(!e)return new ImageData(1,1);t.width=$e,t.height=ze;let n=e.createLinearGradient(0,0,t.width,t.height);n.addColorStop(0,"red"),n.addColorStop(1/6,"orange"),n.addColorStop(2/6,"yellow"),n.addColorStop(3/6,"green"),n.addColorStop(4/6,"blue"),n.addColorStop(5/6,"indigo"),n.addColorStop(1,"violet"),e.fillStyle=n,e.fillRect(0,0,t.width,t.height);let o="Random Text WMwmil10Oo";return e.font="23.123px Arial",e.fillStyle="black",e.fillText(o,-5,15),e.fillStyle="rgba(0, 0, 255, 0.5)",e.fillText(o,-3.3,17.7),e.beginPath(),e.moveTo(0,0),e.lineTo(t.width*2/7,t.height),e.strokeStyle="white",e.lineWidth=2,e.stroke(),e.getImageData(0,0,t.width,t.height)}async function J(t){for(;!document.body;)await Vt(50);let e=document.createElement("iframe");e.setAttribute("frameBorder","0");let n=e.style;n.setProperty("position","fixed"),n.setProperty("display","block","important"),n.setProperty("visibility","visible"),n.setProperty("border","0"),n.setProperty("opacity","0"),e.src="about:blank",document.body.appendChild(e);let o=e.contentDocument||e.contentWindow?.document;if(!o)throw new Error("Iframe document is not accessible");t({iframe:o}),setTimeout(()=>{document.body.removeChild(e)},0)}function Vt(t,e){return new Promise(n=>setTimeout(n,t,e))}var Wt=["Arial","Arial Black","Arial Narrow","Arial Rounded MT","Arimo","Archivo","Barlow","Bebas Neue","Bitter","Bookman","Calibri","Cabin","Candara","Century","Century Gothic","Comic Sans MS","Constantia","Courier","Courier New","Crimson Text","DM Mono","DM Sans","DM Serif Display","DM Serif Text","Dosis","Droid Sans","Exo","Fira Code","Fira Sans","Franklin Gothic Medium","Garamond","Geneva","Georgia","Gill Sans","Helvetica","Impact","Inconsolata","Indie Flower","Inter","Josefin Sans","Karla","Lato","Lexend","Lucida Bright","Lucida Console","Lucida Sans Unicode","Manrope","Merriweather","Merriweather Sans","Montserrat","Myriad","Noto Sans","Nunito","Nunito Sans","Open Sans","Optima","Orbitron","Oswald","Pacifico","Palatino","Perpetua","PT Sans","PT Serif","Poppins","Prompt","Public Sans","Quicksand","Rajdhani","Recursive","Roboto","Roboto Condensed","Rockwell","Rubik","Segoe Print","Segoe Script","Segoe UI","Sora","Source Sans Pro","Space Mono","Tahoma","Taviraj","Times","Times New Roman","Titillium Web","Trebuchet MS","Ubuntu","Varela Round","Verdana","Work Sans"],qt=["monospace","sans-serif","serif"];async function fe(t){return Kt()}function Kt(){return new Promise((t,e)=>{try{J(async({iframe:n})=>{let r=n.createElement("canvas").getContext("2d"),i=qt.map(s=>Ye(r,s)),a={};Wt.forEach(s=>{let c=Ye(r,s);i.includes(c)||(a[s]=c)}),t(a)})}catch{e({error:"unsupported"})}})}function Ye(t,e){if(!t)return null;let n="WwMmLli0Oo";return t.font=`72px ${e}`,t.measureText(n).width}function pe(){return new Promise((t,e)=>{let n=navigator.deviceMemory!==void 0?navigator.deviceMemory:0,o=window.performance&&window.performance.memory?window.performance.memory:0;t({videocard:jt(),architecture:$t(),deviceMemory:n.toString()||"undefined",jsHeapSizeLimit:o.jsHeapSizeLimit||0})})}function jt(){let t=document.createElement("canvas"),e=t.getContext("webgl")??t.getContext("experimental-webgl");if(e&&"getParameter"in e)try{let n=(e.getParameter(e.VENDOR)||"").toString(),o=(e.getParameter(e.RENDERER)||"").toString(),r={vendor:n,renderer:o,version:(e.getParameter(e.VERSION)||"").toString(),shadingLanguageVersion:(e.getParameter(e.SHADING_LANGUAGE_VERSION)||"").toString()};if(!o.length||!n.length){let i=e.getExtension("WEBGL_debug_renderer_info");if(i){let a=(e.getParameter(i.UNMASKED_VENDOR_WEBGL)||"").toString(),s=(e.getParameter(i.UNMASKED_RENDERER_WEBGL)||"").toString();a&&(r.vendorUnmasked=a),s&&(r.rendererUnmasked=s)}}return r}catch{}return"undefined"}function $t(){let t=new Float32Array(1),e=new Uint8Array(t.buffer);return t[0]=1/0,t[0]=t[0]-t[0],e[3]}function ye(){return new Promise(t=>{t({languages:zt(),timezone:Yt()})})}function zt(){let t=[];return navigator.language}function Yt(){return Intl.DateTimeFormat().resolvedOptions().timeZone}var X=(t,e,n,o)=>{let r=(n-e)/o,i=0;for(let a=0;a<o;a++){let s=e+(a+.5)*r;i+=t(s)}return i*r};function he(){return new Promise(t=>{t({acos:Math.acos(.5),asin:X(Math.asin,-1,1,97),cos:X(Math.cos,0,Math.PI,97),largeCos:Math.cos(1e20),largeSin:Math.sin(1e20),largeTan:Math.tan(1e20),sin:X(Math.sin,-Math.PI,Math.PI,97),tan:X(Math.tan,0,2*Math.PI,97)})})}function Qt(t){if(t.length===0)return null;let e={};t.forEach(r=>{let i=String(r);e[i]=(e[i]||0)+1});let n=t[0],o=1;return Object.keys(e).forEach(r=>{e[r]>o&&(n=r,o=e[r])}),n}function Qe(t,e){let n={};return e.forEach(o=>{let r=t.map(a=>o in a?a[o]:void 0).filter(a=>a!==void 0),i=Qt(r);i&&(n[o]=i)}),n}var Jt=["accelerometer","accessibility","accessibility-events","ambient-light-sensor","background-fetch","background-sync","bluetooth","camera","clipboard-read","clipboard-write","device-info","display-capture","gyroscope","geolocation","local-fonts","magnetometer","microphone","midi","nfc","notifications","payment-handler","persistent-storage","push","speaker","storage-access","top-level-storage-access","window-management","query"];async function we(t){let e=t?.permissions_to_check||Jt,o=await Promise.all(Array.from({length:3},()=>Xt(e)));return Qe(o,e)}async function Xt(t){let e={};for(let n of t)try{let o=await navigator.permissions.query({name:n});e[n]=o.state.toString()}catch{}return e}async function Ie(){let t=[];if(navigator.plugins)for(let e=0;e<navigator.plugins.length;e++){let n=navigator.plugins[e];t.push([n.name,n.filename,n.description].join("|"))}return new Promise(e=>{e({plugins:t})})}function B(){if(typeof navigator>"u")return{name:"unknown",version:"unknown"};let t=navigator.userAgent,e=[/(?<name>SamsungBrowser)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>EdgA|EdgiOS|Edg)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>OPR|OPX)\/(?<version>\d+(?:\.\d+)+)/,/Opera[\s\/](?<version>\d+(?:\.\d+)+)/,/Opera Mini\/(?<version>\d+(?:\.\d+)+)/,/Opera Mobi\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Vivaldi)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Brave)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>CriOS)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>FxiOS)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Chrome|Chromium)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Firefox|Waterfox|Iceweasel|IceCat)\/(?<version>\d+(?:\.\d+)+)/,/Version\/(?<version1>[\d.]+).*Safari\/[\d.]+|(?<name>Safari)\/(?<version2>[\d.]+)/,/(?<name>MSIE|Trident|IEMobile).+?(?<version>\d+(?:\.\d+)+)/,/(?<name>[A-Za-z]+)\/(?<version>\d+(?:\.\d+)+)/],n={edg:"Edge",edga:"Edge",edgios:"Edge",opr:"Opera",opx:"Opera",crios:"Chrome",fxios:"Firefox",samsung:"SamsungBrowser",vivaldi:"Vivaldi",brave:"Brave"};for(let o of e){let r=t.match(o);if(r){let i=r.groups?.name,a=r.groups?.version||r.groups?.version1||r.groups?.version2;if(!i&&(r.groups?.version1||r.groups?.version2)&&(i="Safari"),!i&&o.source.includes("Opera Mini")&&(i="Opera Mini"),!i&&o.source.includes("Opera Mobi")&&(i="Opera Mobi"),!i&&o.source.includes("Opera")&&(i="Opera"),!i&&r[1]&&(i=r[1]),!a&&r[2]&&(a=r[2]),i)return{name:n[i.toLowerCase()]||i,version:a||"unknown"}}}return{name:"unknown",version:"unknown"}}function Z(){if(typeof navigator>"u"||!navigator.userAgent)return!1;let t=navigator.userAgent;return/Mobi|Android|iPhone|iPod|IEMobile|Opera Mini|Opera Mobi|webOS|BlackBerry|Windows Phone/i.test(t)&&!/iPad/i.test(t)}function ve(){return new Promise(t=>{let e={is_touchscreen:navigator.maxTouchPoints>0,maxTouchPoints:navigator.maxTouchPoints,colorDepth:screen.colorDepth,mediaMatches:Ht()};Z()&&navigator.maxTouchPoints>0&&(e.resolution=Zt()),t(e)})}function Zt(){let t=window.screen.width,e=window.screen.height,n=Math.max(t,e).toString(),o=Math.min(t,e).toString();return`${n}x${o}`}function Ht(){let t=[],e={"prefers-contrast":["high","more","low","less","forced","no-preference"],"any-hover":["hover","none"],"any-pointer":["none","coarse","fine"],pointer:["none","coarse","fine"],hover:["hover","none"],update:["fast","slow"],"inverted-colors":["inverted","none"],"prefers-reduced-motion":["reduce","no-preference"],"prefers-reduced-transparency":["reduce","no-preference"],scripting:["none","initial-only","enabled"],"forced-colors":["active","none"]};return Object.keys(e).forEach(n=>{e[n].forEach(o=>{matchMedia(`(${n}: ${o})`).matches&&t.push(`${n}: ${o}`)})}),t}function Ee(){return new Promise(t=>{let e=B(),n=navigator.userAgent,o={platform:window.navigator.platform,productSub:navigator.productSub,product:navigator.product,useragent:navigator.userAgent,hardwareConcurrency:navigator.hardwareConcurrency,browser:{name:e.name,version:e.version},mobile:Z(),applePayVersion:en(),cookieEnabled:window.navigator.cookieEnabled};t(o)})}function en(){if(window.location.protocol==="https:"&&typeof window.ApplePaySession=="function")try{let t=window.ApplePaySession.supportsVersion;for(let e=15;e>0;e--)if(t(e))return e}catch{return 0}return 0}var tn=B().name!=="SamsungBrowser"?1:3,A,l=null;function nn(){typeof document<"u"&&(A=document.createElement("canvas"),A.width=200,A.height=100,l=A.getContext("webgl"))}async function be(){nn();try{if(!l)throw new Error("WebGL not supported");let t=Array.from({length:tn},()=>rn()),e=Y(t,A.width,A.height);return{commonPixelsHash:b(e.data.toString()).toString()}}catch{return{webgl:"unsupported"}}}function rn(){try{if(!l)throw new Error("WebGL not supported");let t=`
2
2
  attribute vec2 position;
3
3
  void main() {
4
4
  gl_Position = vec4(position, 0.0, 1.0);
@@ -8,4 +8,4 @@
8
8
  void main() {
9
9
  gl_FragColor = vec4(0.812, 0.195, 0.553, 0.921); // Set line color
10
10
  }
11
- `,n=m.createShader(m.VERTEX_SHADER),o=m.createShader(m.FRAGMENT_SHADER);if(!n||!o)throw new Error("Failed to create shaders");if(m.shaderSource(n,t),m.shaderSource(o,e),m.compileShader(n),!m.getShaderParameter(n,m.COMPILE_STATUS))throw new Error("Vertex shader compilation failed: "+m.getShaderInfoLog(n));if(m.compileShader(o),!m.getShaderParameter(o,m.COMPILE_STATUS))throw new Error("Fragment shader compilation failed: "+m.getShaderInfoLog(o));let r=m.createProgram();if(!r)throw new Error("Failed to create shader program");if(m.attachShader(r,n),m.attachShader(r,o),m.linkProgram(r),!m.getProgramParameter(r,m.LINK_STATUS))throw new Error("Shader program linking failed: "+m.getProgramInfoLog(r));m.useProgram(r);let i=137,a=new Float32Array(i*4),s=2*Math.PI/i;for(let g=0;g<i;g++){let w=g*s;a[g*4]=0,a[g*4+1]=0,a[g*4+2]=Math.cos(w)*(x.width/2),a[g*4+3]=Math.sin(w)*(x.height/2)}let c=m.createBuffer();m.bindBuffer(m.ARRAY_BUFFER,c),m.bufferData(m.ARRAY_BUFFER,a,m.STATIC_DRAW);let d=m.getAttribLocation(r,"position");m.enableVertexAttribArray(d),m.vertexAttribPointer(d,2,m.FLOAT,!1,0,0),m.viewport(0,0,x.width,x.height),m.clearColor(0,0,0,1),m.clear(m.COLOR_BUFFER_BIT),m.drawArrays(m.LINES,0,i*2);let u=new Uint8ClampedArray(x.width*x.height*4);return m.readPixels(0,0,x.width,x.height,m.RGBA,m.UNSIGNED_BYTE,u),new ImageData(u,x.width,x.height)}catch{return new ImageData(1,1)}finally{m&&(m.bindBuffer(m.ARRAY_BUFFER,null),m.useProgram(null),m.viewport(0,0,m.drawingBufferWidth,m.drawingBufferHeight),m.clearColor(0,0,0,0))}}function D(t){let e=[];return function n(o){if(o&&o.toJSON&&typeof o.toJSON=="function"&&(o=o.toJSON()),o===void 0)return;if(typeof o=="number")return isFinite(o)?""+o:"null";if(typeof o!="object")return JSON.stringify(o);let r,i;if(Array.isArray(o)){for(i="[",r=0;r<o.length;r++)r&&(i+=","),i+=n(o[r])||"null";return i+"]"}if(o===null)return"null";if(e.indexOf(o)!==-1)throw new TypeError("Converting circular structure to JSON");let a=e.push(o)-1,s=Object.keys(o).sort();for(i="",r=0;r<s.length;r++){let c=s[r],d=n(o[c]);d&&(i&&(i+=","),i+=JSON.stringify(c)+":"+d)}return e.splice(a,1),"{"+i+"}"}(t)||""}async function Ee(){return new Promise(t=>{try{let e=window.RTCPeerConnection||window.webkitRTCPeerConnection||window.mozRTCPeerConnection;if(!e){t({supported:!1,error:"WebRTC not supported"});return}let n={iceCandidatePoolSize:1,iceServers:[]},o=new e(n);o.createDataChannel(""),(async()=>{try{let i={offerToReceiveAudio:!0,offerToReceiveVideo:!0},a=await o.createOffer(i);await o.setLocalDescription(a);let s=a.sdp||"",c=[...new Set((s.match(/extmap:\d+ [^\n\r]+/g)||[]).map(I=>I.replace(/extmap:\d+ /,"")))].sort(),d=I=>{let T=s.match(new RegExp(`m=${I} [^\\s]+ [^\\s]+ ([^\\n\\r]+)`));return T?T[1].split(" "):[]},u=(I,T)=>T.map(f=>{let k=new RegExp(`(rtpmap|fmtp|rtcp-fb):${f} (.+)`,"g"),_=[...s.matchAll(k)];if(!_.length)return null;let p={};return _.forEach(ft=>{let[_n,ne,re]=ft,oe=re.split("/");ne==="rtpmap"?(p.mimeType=`${I}/${oe[0]}`,p.clockRate=+oe[1],I==="audio"&&(p.channels=+oe[2]||1)):ne==="rtcp-fb"?(p.feedbackSupport=p.feedbackSupport||[],p.feedbackSupport.push(re)):ne==="fmtp"&&(p.sdpFmtpLine=re)}),p}).filter(Boolean),l=u("audio",d("audio")),g=u("video",d("video")),w={audio:{count:l.length,hash:b(D(l))},video:{count:g.length,hash:b(D(g))},extensionsHash:b(D(c))},S=await new Promise(I=>{let T=setTimeout(()=>{o.removeEventListener("icecandidate",f),o.close(),I({supported:!0,...w,timeout:!0})},3e3),f=k=>{let _=k.candidate;!_||!_.candidate||(clearTimeout(T),o.removeEventListener("icecandidate",f),o.close(),I({supported:!0,...w,candidateType:_.type||""}))};o.addEventListener("icecandidate",f)});t({details:S,hash:b(D(S))})}catch(i){o.close(),t({supported:!0,error:`WebRTC offer failed: ${i.message}`})}})()}catch(e){t({supported:!1,error:`WebRTC error: ${e.message}`})}})}var Ye=["\u{1D504}","\u{1D505}","\u212D","\u{1D507}","\u{1D508}","\u{1D509}","\u{1D538}","\u{1D539}","\u2102","\u{1D53B}","\u{1D53C}","\u{1D53D}"],Qe=["\u03B2","\u03C8","\u03BB","\u03B5","\u03B6","\u03B1","\u03BE","\u03BC","\u03C1","\u03C6","\u03BA","\u03C4","\u03B7","\u03C3","\u03B9","\u03C9","\u03B3","\u03BD","\u03C7","\u03B4","\u03B8","\u03C0","\u03C5","\u03BF"];async function be(){return new Promise(t=>{try{z(async({iframe:e})=>{try{if(!en(e)){t({supported:!1,error:"MathML not supported"});return}let n=[W("integral","<msubsup><mo>\u222B</mo><mi>a</mi><mi>b</mi></msubsup><mfrac><mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mrow><mi>g</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mfrac><mi>dx</mi>"),W("fraction","<mfrac><mrow><mi>\u03C0</mi><mo>\xD7</mo><msup><mi>r</mi><mn>2</mn></msup></mrow><mrow><mn>2</mn><mi>\u03C3</mi></mrow></mfrac>"),W("matrix","<mo>[</mo><mtable><mtr><mtd><mi>\u03B1</mi></mtd><mtd><mi>\u03B2</mi></mtd></mtr><mtr><mtd><mi>\u03B3</mi></mtd><mtd><mi>\u03B4</mi></mtd></mtr></mtable><mo>]</mo>"),tn(),...nn()],o=[],r="";n.forEach((a,s)=>{let c=rn(a,e);o.push({width:c.dimensions.width,height:c.dimensions.height}),s===0&&c.fontInfo&&(r=b(D(c.fontInfo)))});let i={fontStyleHash:r,dimensions:o};t({details:i,hash:b(D(i))})}catch(n){t({supported:!1,error:`MathML error: ${n.message}`})}})}catch(e){t({supported:!1,error:`MathML error: ${e.message}`})}})}function en(t){try{let e=t.createElement("math");e.innerHTML="<mrow><mi>x</mi></mrow>",e.style.position="absolute",e.style.visibility="hidden",t.body.appendChild(e);let n=e.getBoundingClientRect();return t.body.removeChild(e),n.width>0&&n.height>0}catch{return!1}}function W(t,e){return`<math><mrow>${e}</mrow></math>`}function tn(){let t="<mo>\u220F</mo>";return Ye.forEach((e,n)=>{let o=n*2,r=Qe.slice(o,o+2);r.length===2&&(t+=`<mmultiscripts><mi>${e}</mi><none/><mi>${r[1]}</mi><mprescripts></mprescripts><mi>${r[0]}</mi><none/></mmultiscripts>`)}),W("complex_nested",`<munderover><mmultiscripts>${t}</mmultiscripts></munderover>`)}function nn(){let t=[];return Ye.forEach((e,n)=>{let o=n*2,r=Qe.slice(o,o+2);r.length===2&&t.push(W("combined",`<mmultiscripts><mi>${e}</mi><none/><mi>${r[1]}</mi><mprescripts></mprescripts><mi>${r[0]}</mi><none/></mmultiscripts>`))}),t}function rn(t,e){try{let n=e.createElement("math");n.innerHTML=t.replace(/<\/?math>/g,""),n.style.whiteSpace="nowrap",n.style.position="absolute",n.style.visibility="hidden",n.style.top="-9999px",e.body.appendChild(n);let o=n.getBoundingClientRect(),i=(e.defaultView||window).getComputedStyle(n),a={dimensions:{width:o.width,height:o.height},fontInfo:{fontFamily:i.fontFamily,fontSize:i.fontSize,fontWeight:i.fontWeight,fontStyle:i.fontStyle,lineHeight:i.lineHeight,fontVariant:i.fontVariant||"normal",fontStretch:i.fontStretch||"normal",fontSizeAdjust:i.fontSizeAdjust||"none",textRendering:i.textRendering||"auto",fontFeatureSettings:i.fontFeatureSettings||"normal",fontVariantNumeric:i.fontVariantNumeric||"normal",fontKerning:i.fontKerning||"auto"}};return e.body.removeChild(n),a}catch(n){return{error:n.message}}}var on=800;async function Te(){return new Promise(t=>{try{if(typeof window>"u"||!window.speechSynthesis||typeof window.speechSynthesis.getVoices!="function"){t({supported:!1,error:"Speech Synthesis API not supported"});return}let e=!1,n=null,o=a=>{if(!e){e=!0,n&&clearTimeout(n);try{let s=a.map(d=>{let u=g=>g.replace(/\\/g,"\\\\").replace(/,/g,"\\,");return[u(d.voiceURI||""),u(d.name||""),u(d.lang||""),d.localService?"1":"0",d.default?"1":"0"].join(",")});s.sort();let c={voiceCount:a.length,voicesHash:b(D(s))};t({details:c,hash:b(D(c))})}catch(s){t({supported:!0,error:`Voice processing failed: ${s.message}`})}}},r=window.speechSynthesis.getVoices();if(r.length>0){o(r);return}n=setTimeout(()=>{let a=window.speechSynthesis.getVoices();o(a)},on);let i=()=>{window.speechSynthesis.removeEventListener("voiceschanged",i);let a=window.speechSynthesis.getVoices();o(a)};window.speechSynthesis.addEventListener("voiceschanged",i)}catch(e){t({supported:!1,error:`Speech Synthesis error: ${e.message}`})}})}var Je={audio:me,canvas:le,fonts:de,hardware:ge,locales:fe,math:pe,permissions:ye,plugins:he,screen:we,system:Ie,webgl:ve},Xe={webrtc:Ee,mathml:be,speech:Te},Re={},Ze={timeout:"true"},xe=(t,e,n)=>{Re[t]=e};function an(t,e){return new Promise(n=>{setTimeout(()=>n(e),t)})}function He(t,e,n){return Promise.all(t.map(o=>{let r=performance.now();return Promise.race([o.then(i=>({value:i,elapsed:performance.now()-r})),an(e,n).then(i=>({value:i,elapsed:performance.now()-r}))])}))}function J(t,e){let n=B();if(n.name==="unknown"&&t.system&&typeof t.system=="object"&&!Array.isArray(t.system)){let l=t.system.browser;if(l&&typeof l=="object"&&!Array.isArray(l)){let g=l;n={name:g.name||"unknown",version:g.version||"unknown"}}}let o=n.name.toLowerCase(),r=n.version.split(".")[0]||"0",i=parseInt(r,10),a=[...e?.exclude||[]],s=e?.stabilize||[],c=e?.include||[];for(let u of s){let l=ue[u];if(l)for(let g of l){let w=!("browsers"in g),S=!w&&g.browsers?.some(I=>{let T=I.match(/(.+?)(>=)(\d+)/);if(T){let[,f,,k]=T,_=parseInt(k,10);return o===f&&i>=_}return o===I});(w||S)&&a.push(...g.exclude)}}function d(u,l=""){let g={};for(let[w,S]of Object.entries(u)){let I=l?`${l}.${w}`:w;if(typeof S=="object"&&!Array.isArray(S)&&S!==null){let T=d(S,I);Object.keys(T).length>0&&(g[w]=T)}else{let T=a.some(k=>I.startsWith(k)),f=c.some(k=>I.startsWith(k));(!T||f)&&(g[w]=S)}}return g}return d(t)}async function De(t){let e={...L,...t},n=e.logging&&!sessionStorage.getItem("_tmjs_l")&&Math.random()<1e-4,o={...Je,...Re},{elapsed:r,resolvedComponents:i}=await et(o,e),a={},s={};if(n||e.experimental){let{elapsed:T,resolvedComponents:f}=await et(Xe,e);a=f,s=T}let c={...r,...s},d=e.performance?{elapsed:c}:{},u=J({},e),l={...i,...u},g={};return{thumbmark:b(D(l)),components:l,info:g,version:"",...d,...Object.keys(a).length>0&&e.experimental&&{experimental:a}}}async function et(t,e){let n={...L,...e},o=Object.entries(t).filter(([u])=>!n?.exclude?.includes(u)).filter(([u])=>n?.include?.some(l=>l.includes("."))?n?.include?.some(l=>l.startsWith(u)):n?.include?.length===0||n?.include?.includes(u)),r=o.map(([u])=>u),i=o.map(([u,l])=>l(e)),a=await He(i,n?.timeout||5e3,Ze),s={},c={};a.forEach((u,l)=>{u.value!=null&&(c[r[l]]=u.value,s[r[l]]=u.elapsed??0)});let d=J(c,n);return{elapsed:s,resolvedComponents:d}}var q=class{options;constructor(e){this.options={...L,...e}}async get(e){let n={...this.options,...e};return De(n)}getVersion(){return""}includeComponent(e,n){xe(e,n)}};var sn=(t,e={})=>({"Content-Type":"application/json",...t?.accessToken&&{Authorization:`Bearer ${t?.accessToken}`},...e}),cn=async(t,e)=>{if(!t.ok){let n=await t.text();throw new Error(n)}return e==="file"?t.blob():e==="json"?t.json():e==="text"?t.text():null},tt=async({url:t,auth:e,body:n,method:o="GET",headers:r={},responseType:i="json"})=>{let a={method:o,headers:sn(e,r),...n?{body:n instanceof FormData?n:JSON.stringify(n)}:{}},s=await fetch(t,a);return cn(s,i)},nt=t=>tt({...t,method:"GET"}),C=t=>tt({...t,method:"POST"});var un=[{name:"lowCpuCores",weight:2,async check(){let t=navigator.hardwareConcurrency||0,e=t>0&&t<=2;return{value:t,triggered:e}}},{name:"lowDeviceMemory",weight:0,async check(){let t=navigator.deviceMemory||0,e=t>0&&t<=4;return{value:t,triggered:e}}},{name:"platformMismatch",weight:1,async check(){let t=navigator.userAgent||"",e=navigator.platform||"",n=t.includes("Mac")&&e.includes("Linux")||t.includes("Win")&&e.includes("Mac")||e===""||e==="Unknown";return{value:e,triggered:n}}},{name:"webglSoftwareRenderer",weight:4,async check(){let t=null,e=null,n=!1;try{let o=document.createElement("canvas"),r=o.getContext("webgl")||o.getContext("experimental-webgl");if(r){let i=r.getExtension("WEBGL_debug_renderer_info");if(i){t=r.getParameter(i.UNMASKED_VENDOR_WEBGL)||"",e=r.getParameter(i.UNMASKED_RENDERER_WEBGL)||"";let a=e.toLowerCase(),s=t.toLowerCase();n=a.includes("swiftshader")||a.includes("llvmpipe")||a.includes("softwar")||a.includes("basic render")||a.includes("vmware")||a.includes("virtualbox")||s.includes("vmware")||s.includes("parallels")}}}catch{}return{value:{vendor:t,renderer:e},triggered:n}}},{name:"missingWebGPUAdapter",weight:3,async check(){if(!("gpu"in navigator))return{value:"no WebGPU",triggered:!0};try{let t=await navigator.gpu.requestAdapter();return{value:t?"adapter-present":"adapter-null",triggered:!t}}catch{return{value:"adapter-error",triggered:!0}}}},{name:"reducedTimerPrecision",weight:1,async check(){let t=performance.now();await new Promise(o=>setTimeout(o,50));let e=performance.now()-t,n=e<30||e>80;return{value:e.toFixed(2),triggered:n}}},{name:"timerJitter",weight:0,async check(){let t=[];for(let n=0;n<10;n++){let o=performance.now();await new Promise(i=>setTimeout(i,10));let r=performance.now();t.push(r-o)}let e=Math.sqrt(t.map(n=>(n-10)**2).reduce((n,o)=>n+o)/t.length);return{value:e.toFixed(3),triggered:e>5}}},{name:"audioFingerprint",weight:1,async check(){try{let t=new(window.OfflineAudioContext||window.webkitOfflineAudioContext)(1,44100,44100),e=t.createOscillator();e.frequency.value=440,e.connect(t.destination),e.start(0);let o=(await t.startRendering()).getChannelData(0).reduce((r,i)=>r+Math.abs(i),0);return{value:o,triggered:o<100}}catch{return{value:"audio-error",triggered:!0}}}},{name:"canvasEntropy",weight:1,async check(){try{let t=document.createElement("canvas"),e=t.getContext("2d");e.textBaseline="top",e.font="14px 'Arial'",e.fillText("VM CHECK",2,2);let o=[...t.toDataURL()].reduce((r,i)=>(r+i.charCodeAt(0))%9999999,0);return{value:o,triggered:o===0||o===999999}}catch{return{value:"canvas-error",triggered:!0}}}},{name:"windowSizeWeird",weight:1,async check(){let t=window.innerWidth/window.innerHeight,e=t===1.333||t===1.6;return{value:t.toFixed(2),triggered:e}}},{name:"touchMismatch",weight:1,async check(){let t="ontouchstart"in window,e=navigator.maxTouchPoints||0;return{value:{hasTouch:t,maxTouch:e},triggered:t&&e===0}}},{name:"batteryVirtualized",weight:1,async check(){if(!navigator.getBattery)return{value:"no API",triggered:!0};try{let t=await navigator.getBattery(),e=t.chargingTime===0&&t.dischargingTime===1/0;return{value:{chargingTime:t.chargingTime,dischargingTime:t.dischargingTime},triggered:e}}catch{return{value:"battery-error",triggered:!0}}}},{name:"permissionsWeird",weight:0,async check(){try{let t=await navigator.permissions.query({name:"camera"});return{value:t.state,triggered:t.state==="prompt"}}catch{return{value:"perm-error",triggered:!0}}}},{name:"noMediaDevices",weight:1,async check(){try{let t=await navigator.mediaDevices.enumerateDevices();return{value:t.length,triggered:t.length===0}}catch{return{value:"media-error",triggered:!0}}}},{name:"virtualizedMediaDevices",weight:1,async check(){try{let t=await navigator.mediaDevices.enumerateDevices(),e=t.some(n=>n.label.toLowerCase().includes("virtual"));return{value:t.map(n=>n.label),triggered:e}}catch{return{value:"media-error",triggered:!0}}}},{name:"webrtcIpPattern",weight:2,async check(){return new Promise(t=>{try{let e=new RTCPeerConnection({iceServers:[]});e.createDataChannel("x");let n=setTimeout(()=>{e.close(),t({value:"timeout",triggered:!1})},3e3);e.onicecandidate=o=>{if(!o?.candidate){clearTimeout(n),e.close(),t({value:"no candidate",triggered:!1});return}let r=o.candidate.candidate.toLowerCase();clearTimeout(n),e.close(),t({value:r,triggered:r.includes("10.0.2.")||r.includes("172.16.")||r.includes("192.168.56.")})},e.createOffer().then(o=>e.setLocalDescription(o))}catch{t({value:"rtc-error",triggered:!1})}})}},{name:"gpuAccelerationDisabled",weight:3,async check(){let e=document.createElement("canvas").getContext("webgl");return{value:!!e,triggered:!e}}},{name:"noWebGL2",weight:3,async check(){let t=document.createElement("canvas").getContext("webgl2");return{value:!!t,triggered:!t}}},{name:"lowStorageQuota",weight:1,async check(){try{let t=await navigator.storage.estimate();return{value:t.quota,triggered:(t.quota??0)<524288e3}}catch{return{value:"storage-error",triggered:!0}}}},{name:"lowEntropy",weight:1,async check(){let t=Object.keys(navigator).length+Object.keys(screen).length+Object.keys(window).length;return{value:t,triggered:t<200}}},{name:"noLanguages",weight:1,async check(){let t=navigator.languages||[];return{value:t,triggered:t.length===0}}},{name:"uaEntropyLow",weight:1,async check(){let t=navigator.userAgent;return{value:t,triggered:t.length<30}}},{name:"weirdDPI",weight:2,async check(){let t=window.devicePixelRatio;return{value:t,triggered:t===1}}}],mn=[{name:"tamperingPluginMismatch",penalty:3,async check(){try{let t=navigator.userAgent.toLowerCase(),e=(t.includes("chrome")||t.includes("edg"))&&!t.includes("firefox")&&!t.includes("safari"),n=navigator.plugins?.length??0,o=!e&&n>0;return{value:{pluginCount:n,isChromeLike:e},triggered:o}}catch{return{value:"error",triggered:!1}}}},{name:"tamperingWebglNoise",penalty:1,async check(){try{let t=document.createElement("canvas");t.width=16,t.height=16;let e=t.getContext("webgl");if(!e)return{value:"no-webgl",triggered:!1};e.clearColor(.1,.2,.3,1),e.clear(e.COLOR_BUFFER_BIT);let n=new Uint8Array(16*16*4);e.readPixels(0,0,16,16,e.RGBA,e.UNSIGNED_BYTE,n);let o=new Set(n).size;return{value:{uniqueValues:o},triggered:o>4}}catch{return{value:"error",triggered:!1}}}},{name:"tamperingServiceWorkerBlocked",penalty:1,async check(){let t=!("serviceWorker"in navigator);return{value:{serviceWorkerAvailable:!t},triggered:t}}},{name:"permissionsWeirdAntiVM",penalty:2,async check(){try{let t=await navigator.permissions.query({name:"camera"});return{value:t.state,triggered:t.state==="prompt"}}catch{return{value:"error",triggered:!1}}}}];async function rt({threshold:t=4}={}){let e={},n=0;for(let r of un)try{let i=await r.check();e[r.name]={...i,weight:r.weight},i.triggered&&r.weight>0&&(n+=r.weight)}catch{e[r.name]={value:"error",triggered:!1,weight:r.weight}}let o=n;for(let r of mn)try{let i=await r.check();e[r.name]={...i,penalty:r.penalty},i.triggered&&(n-=r.penalty)}catch{e[r.name]={value:"error",triggered:!1,penalty:r.penalty}}return{isLikelyVM:n>=t,score:n,rawScore:o,threshold:t,signals:e}}var ln=[{name:"hookedFunctionToString",weight:2,async check(){let t=Function.prototype.toString.toString(),e=Function.prototype.toString+"";return{value:{native:t,current:e},triggered:t!==e}}},{name:"navigatorProxyTrap",weight:2,async check(){let t=!1;try{let e=Object.getOwnPropertyDescriptor(window,"navigator");e&&e.get&&e.get.toString()?.includes("[native code]")===!1&&(t=!0)}catch{}return{value:"navigator getter",triggered:t}}},{name:"uaMismatch",weight:2,async check(){let t=navigator.userAgent||"",e="";try{let o=await navigator.userAgentData?.getHighEntropyValues?.(["platform","brands"]);e=JSON.stringify(o)}catch{}let n=t?.includes("Mac")&&e?.includes("Windows")||t?.includes("Win")&&e?.includes("Mac")||e&&e.length>0&&!t;return{value:{ua:t,brandInfo:e},triggered:n}}},{name:"timezoneLocaleMismatch",weight:1,async check(){let t=Intl.DateTimeFormat().resolvedOptions().timeZone,e=navigator.language||"",n=e.startsWith("en")&&t==="Asia/Shanghai"||e.startsWith("zh")&&t==="America/New_York"||t===void 0;return{value:{tz:t,lang:e},triggered:n}}},{name:"canvasNoise",weight:2,async check(){let t=()=>{let r=document.createElement("canvas"),i=r.getContext("2d");return i.textBaseline="top",i.font="14px Arial",i.fillText("anti-detect-check",2,2),r.toDataURL()},e=t(),n=t();return{value:{a:e,b:n},triggered:e!==n}}},{name:"webglNoise",weight:-2,async check(){try{let e=document.createElement("canvas").getContext("webgl");if(!e)return{value:"no-webgl",triggered:!0};let n=e.getExtension("WEBGL_debug_renderer_info");if(!n)return{value:"no-debug-extension",triggered:!1};let o=e.getParameter(n.UNMASKED_VENDOR_WEBGL),r=e.getParameter(n.UNMASKED_RENDERER_WEBGL),i=o===""||r===""||o?.includes(" ")===!1||r?.includes(" ")===!1;return{value:{v:o,r},triggered:i}}catch{return{value:"gl-error",triggered:!0}}}},{name:"webdriverFlag",weight:3,async check(){let t=navigator.webdriver===!0;return{value:navigator.webdriver,triggered:t}}},{name:"perfectEventTiming",weight:-3,async check(){let t=performance.now();return{value:t,triggered:t%1===0}}},{name:"serviceWorkerBlocked",weight:-4,async check(){let t=!("serviceWorker"in navigator);return{value:t,triggered:t}}},{name:"smallQuota",weight:2,async check(){try{let t=await navigator.storage.estimate(),e=t.quota<50*1024*1024;return{value:t.quota,triggered:e}}catch{return{value:"quota-error",triggered:!0}}}},{name:"indexedDbBlocked",weight:2,async check(){try{let t=indexedDB.open("tamper-check");return await new Promise(e=>{t.onerror=()=>e({value:"error",triggered:!0}),t.onsuccess=()=>e({value:"ok",triggered:!1})})}catch{return{value:"throw",triggered:!0}}}},{name:"screenDprMismatch",weight:0,async check(){let t=window.screen.width,e=window.screen.height,n=window.devicePixelRatio,o=t===1920&&n===1&&e===1080||n%1!==0&&n%1!==.5;return{value:{w:t,h:e,dpr:n},triggered:o}}},{name:"missingCommonFonts",weight:1,async check(){return{value:"skipped",triggered:!1}}},{name:"noMediaDevices",weight:1,async check(){try{let t=await navigator.mediaDevices.enumerateDevices();return{value:t.length,triggered:t.length===0}}catch{return{value:"error",triggered:!0}}}},{name:"languagesEmpty",weight:1,async check(){let t=navigator.languages||[];return{value:t,triggered:t.length===0}}},{name:"pluginMismatch",weight:-4,async check(){try{let t=navigator.plugins.length;return{value:t,triggered:t===0}}catch{return{value:"error",triggered:!0}}}},{name:"devtoolsDetected",weight:-2,async check(){return new Promise(async t=>{let e={viewportBreakpoint:!1,consoleSpeed:!1},n=160,o=window.outerWidth-window.innerWidth,r=window.outerHeight-window.innerHeight;(o>n||r>n)&&(e.viewportBreakpoint=!0);async function i(s=50){return new Promise(c=>{let d=performance.now();console.log("%c ","font-size:3000px");let u=performance.now();c(u-d>s)})}e.consoleSpeed=await i();let a=Object.values(e).some(Boolean);setTimeout(()=>{t({value:a,triggered:a})},50)})}},{name:"knownAntiDetectBrowser",weight:5,async check(){let t=navigator.userAgent.toLowerCase(),n=["incogniton","multilogin","morelogin","adspect","kameleo","goLogin"].some(o=>t?.includes(o));return{value:t,triggered:n}}},{name:"batteryVirtualized",weight:4,async check(){try{let t=await navigator.getBattery(),e=t.chargingTime,n=t.dischargingTime;return{value:{chargingTime:e,dischargingTime:n},triggered:e===0}}catch{return{value:"no-battery-api",triggered:!1}}}},{name:"permissionDenied",weight:4,async check(){try{let t=await navigator.permissions.query({name:"notifications"}),e=t.state==="denied";return{value:t.state,triggered:e}}catch{return{value:"perm-error",triggered:!1}}}}];async function ot({anomalyMin:t=.52,anomalyMax:e=.54}={}){let n={},o=0;for(let l of ln){let g=await l.check();n[l.name]=g,g.triggered&&(o+=l.weight)}let r=navigator?.platform||"",i=(navigator?.userAgent||"").toLowerCase(),a=r.toLowerCase().includes("win"),s=n.batteryVirtualized?.triggered||!1,c=n.permissionDenied?.triggered||!1,d=!a&&r!==""&&s&&c,u=Math.min(1,Math.max(0,o)/15);return{result:d&&u>=t&&u<=e||n.knownAntiDetectBrowser?.triggered,anomalyScore:u,score:o,signals:n}}function dn(){let t=0;try{0 .toFixed(-1)}catch(e){t=e.message.length}return t}function gn(){let t=navigator.userAgent,e=dn();return e===44||e===43?"Safari":e===51?"Chrome":e===25?"Firefox":navigator.msSaveBlob!==void 0?"MSIE":t.match(/Chrome/)?navigator.brave!==void 0?"Brave":t.includes("Edg")?"Edge":t.includes("OPR")?"Opera":"Chrome":"Unknown"}var fn=[{name:"safari_currentStorageTest",weight:2,browser:"Safari",async check(){if(typeof navigator.storage?.getDirectory!="function")return{triggered:!1,value:"unsupported"};try{return await navigator.storage.getDirectory(),{triggered:!1,value:"ok"}}catch(t){let e=t?.message??String(t);return{triggered:e.includes("unknown transient reason"),value:e}}}},{name:"safari13to18_indexedDbBlobTest",weight:2,browser:"Safari",async check(){return await new Promise(t=>{let e=String(Math.random()),n=indexedDB.open(e,1);n.onupgradeneeded=o=>{let r=o.target.result;try{r.createObjectStore("t",{autoIncrement:!0}).put(new Blob),t({triggered:!1,value:"ok"})}catch(i){let a=i?.message??String(i);t({triggered:a.includes("are not yet supported"),value:a})}finally{r.close(),indexedDB.deleteDatabase(e)}},n.onerror=()=>t({triggered:!1,value:"idb-error"})})}},{name:"safari_oldWebkitTest",weight:1,browser:"Safari",async check(){let t=window.openDatabase,e=window.localStorage;try{t(null,null,null,null)}catch{return{triggered:!0,value:"openDatabase denied"}}try{e.setItem("test","1"),e.removeItem("test")}catch{return{triggered:!0,value:"localStorage denied"}}return{triggered:!1,value:"ok"}}},{name:"chrome_storageQuotaPrivateTest",weight:2,browser:"Chrome",async check(){return await new Promise((t,e)=>{let o=window?.performance?.memory?.jsHeapSizeLimit??1073741824;navigator.webkitTemporaryStorage.queryUsageAndQuota((r,i)=>{let a=Math.round(i/1048576),s=Math.round(o/(1024*1024))*2;t({triggered:a<s,value:{quotaMB:a,limitMB:s}})},r=>e(r))})}},{name:"chrome_oldFileSystemTest",weight:1,browser:"Chrome",async check(){let t=window.webkitRequestFileSystem;return t?await new Promise(e=>t(0,1,()=>e({triggered:!1,value:"ok"}),()=>e({triggered:!0,value:"denied"}))):{triggered:!1,value:"unsupported"}}},{name:"firefox_storageDirectoryTest",weight:2,browser:"Firefox",async check(){if(typeof navigator.storage?.getDirectory!="function")return{triggered:!1,value:"unsupported"};try{return await navigator.storage.getDirectory(),{triggered:!1,value:"ok"}}catch(t){let e=t?.message??String(t);return{triggered:e.includes("Security error"),value:e}}}},{name:"firefox_indexedDbInvalidStateTest",weight:1,browser:"Firefox",async check(){return await new Promise(t=>{let e=indexedDB.open("inPrivate");e.onerror=()=>{t({triggered:e.error?.name==="InvalidStateError",value:e.error?.name})},e.onsuccess=()=>{indexedDB.deleteDatabase("inPrivate"),t({triggered:!1,value:"ok"})}})}},{name:"msie_indexedDbMissing",weight:2,browser:"MSIE",async check(){return{triggered:window.indexedDB===void 0,value:"msie-idb-check"}}}];async function it(){let t=gn(),e={},n=0;for(let o of fn){if(o.browser!==t)continue;let r=await o.check();e[o.name]=r,r.triggered&&(n+=o.weight)}return{isPrivate:n>0,browserName:t,score:n,signals:e}}typeof window<"u"&&(window.detectIncognito=it);var at=it;var st=[{name:"globalPrivacyControl",weight:3,async check(){let t=navigator.globalPrivacyControl;return{triggered:t===!0,value:t}}},{name:"doNotTrack",weight:1,async check(){let t=navigator.doNotTrack;return{triggered:t==="1",value:t}}},{name:"cookiesDisabled",weight:3,async check(){let t=navigator.cookieEnabled;return{triggered:t===!1,value:t}}},{name:"thirdPartyCookiesBlocked",weight:3,async check(){try{if("hasStorageAccess"in document&&!await document.hasStorageAccess())try{return await document.requestStorageAccess(),{triggered:!1,value:"access_granted"}}catch{return{triggered:!0,value:"access_denied"}}let t=`__dtect_3p_test_${Date.now()}`;document.cookie=`${t}=1; SameSite=None; Secure`;let e=document.cookie.includes(t);return document.cookie=`${t}=; expires=Thu, 01 Jan 1970 00:00:00 GMT`,{triggered:!1,value:e?"cookies_work":"may_be_blocked"}}catch(t){return{triggered:!1,value:`error: ${t?.message}`}}}},{name:"firefoxResistFingerprinting",weight:2,async check(){let t=[],e=new Date().getTimezoneOffset();e===0&&Intl.DateTimeFormat().resolvedOptions().timeZone==="UTC"&&t.push("timezone_utc");let n=navigator.hardwareConcurrency;n===2&&t.push("cores_capped");let o=window.screen.width,r=window.screen.height,i=window.innerWidth,a=window.innerHeight;o===i&&r===a&&t.push("screen_matches_inner");let s=window.matchMedia("(prefers-reduced-motion: reduce)").matches;return{triggered:t.length>=2,value:{signals:t,timezoneOffset:e,cores:n,prefersReducedMotion:s}}}},{name:"braveShields",weight:3,async check(){if(!(navigator.brave!==void 0))return{triggered:!1,value:"not_brave"};try{if(!await navigator.brave.isBrave())return{triggered:!1,value:"brave_check_false"};let o=document.createElement("canvas").getContext("2d");if(o){o.fillStyle="rgb(255, 0, 0)",o.fillRect(0,0,1,1);let r=o.getImageData(0,0,1,1).data;o.fillRect(0,0,1,1);let i=o.getImageData(0,0,1,1).data;if(r[0]!==i[0]||r[1]!==i[1]||r[2]!==i[2])return{triggered:!0,value:"shields_active_canvas"}}try{let r=new RTCPeerConnection({iceServers:[{urls:"stun:stun.l.google.com:19302"}]});if(r.createDataChannel(""),await new Promise(a=>{let s=setTimeout(()=>{r.close(),a(!1)},1e3);r.onicecandidate=c=>{c.candidate?.candidate&&(/([0-9]{1,3}\.){3}[0-9]{1,3}/.test(c.candidate.candidate)||(clearTimeout(s),r.close(),a(!0)))},r.createOffer().then(c=>r.setLocalDescription(c))}))return{triggered:!0,value:"shields_active_webrtc"}}catch{return{triggered:!0,value:"shields_active_webrtc_blocked"}}return{triggered:!0,value:"brave_detected_shields_default"}}catch(e){return{triggered:!1,value:`error: ${e?.message}`}}}}];async function ct(){let t={},e=0,n=await Promise.allSettled(st.map(async o=>{let r=await o.check();return{name:o.name,weight:o.weight,result:r}}));for(let o of n)if(o.status==="fulfilled"){let{name:r,weight:i,result:a}=o.value;t[r]=a,a.triggered&&(e+=i)}else{let r=n.indexOf(o),i=st[r];i&&(t[i.name]={triggered:!1,value:`check_failed: ${o.reason}`})}return{isPrivacyEnabled:e>3,score:e,signals:t}}typeof window<"u"&&(window.detectPrivacy=ct);var ut=ct;function pn(t){let e=t?.projectId,n=t?.visitorId||O();return(typeof t?.projectId=="number"||typeof t?.visitorId=="number")&&(e=`${t?.projectId}`,n=`${t?.visitorId}`),{visitorId:n,projectId:e}}function U(t){let{projectId:e,visitorId:n}=pn(t);return{projectId:e,visitorId:n}}async function yn(){let t=new q,[e,n,o,r,i]=await Promise.allSettled([t.get(),rt(),ot(),at(),ut()]);return{deviceRes:e,vmDtectResults:n,tamperingDtectResults:o,incognitoDtectResults:r,privacySettingsDtectResults:i}}function hn(t,e){return{entryLink:window?.location?.href,securitySettings:t.securitySettings,metaData:t.metaData,vmDtectResults:e?.vmDtectResults?.value,tamperingDtectResults:e?.tamperingDtectResults?.value,incognitoDtectResults:e?.incognitoDtectResults?.value,deviceIdResults:e?.deviceRes?.value,privacySettingsDtectResults:e?.privacySettingsDtectResults?.value}}function wn(t,e,n,o){let r=(performance.now()-e).toFixed();E(`${t} finishes in ${r}ms`,"info",{function:t,endpoint:n?.endpoint,diff:r,token:o,clientId:n?.clientId})}function In(t,e,n,o,r){let i=(performance.now()-e).toFixed();E(`${t} error`,"error",{function:t,endpoint:n?.endpoint,error:r,diff:i,token:o,clientId:n?.clientId})}async function mt(t,e){let n=performance.now(),{state:o,config:r,version:i}=h(),{projectId:a,visitorId:s}=U(t);if(!t||!a?.trim())throw new Error(y.FAILED_TO_GET_SECURITY_RESULT);let c=a!==o.projectId?O():o.token;try{let d=await yn(),u=hn(t,d),l={...t,projectId:a,visitorId:s,clientData:u,version:i,token:c,questionData:o.questionData,aiCheckData:o.aiCheckData},g=await C({url:e,body:l,headers:{"client-id":r?.clientId||"","x-api-key":r?.apiKey||""}});if(!("token"in g||"results"in g))throw new Error(y.INTERNAL_SERVER_ERROR);return P(w=>({...w,state:{...w.state,token:c,visitorId:s,projectId:a,clientData:u}})),wn("getResultBase",n,r,c),g}catch(d){In("getResultBase",n,r,c,d),N(d)}}async function X(t){let{endpoint:e}=M();if(t)return mt(t,`${e}/client/check/result`)}async function Z(t){let{endpoint:e}=M();return mt(t,`${e}/client/check`)}async function H(t){let e=performance.now(),{state:n,config:o,monitor:r,version:i}=h(),{checkResultEndpoint:a}=M(),{visitorId:s,projectId:c}=U(t),d={timeTakenSeconds:t.timeTakenSeconds,qbc:t.qbc||r?.qbc,mas:t.mas||r?.mas,scb:t.scb||r?.scb,apd:t.apd||r?.apd};try{let u=await C({url:a,headers:{"client-id":o?.clientId||"","x-api-key":o?.apiKey||""},body:{token:n.token,visitorId:s,projectId:c,version:i,clientData:n.clientData,questionData:n.questionData,aiCheckData:d}});if(!u)throw new Error(y.INTERNAL_SERVER_ERROR);P(g=>({...g,state:{...g.state,aiCheckData:d,visitorId:s,projectId:c}}));let l=(performance.now()-e).toFixed();return E(`isAIUsageDetected finishes in ${l}ms`,"info",{endpoint:o?.endpoint,diff:l,token:n.token,clientId:o?.clientId}),u}catch(u){let l=(performance.now()-e).toFixed();E("isAIUsageDetected error","error",{endpoint:o?.endpoint,error:u,diff:l,token:n.token,clientId:o?.clientId}),N(u)}}async function ee(t){let e=performance.now(),{state:n,config:o}=h(),{respondentType:r,language:i}=t;try{let a=await nt({url:`${o?.endpoint}/client/quality-questions/${r}/${i}`,headers:{"client-id":o?.clientId||"","x-api-key":o?.apiKey||""}});if(!a)throw new Error(y.INTERNAL_SERVER_ERROR);let s=(performance.now()-e).toFixed();return E(`getQualityQuestions finishes in ${s}ms`,"info",{function:"getQualityQuestions",endpoint:o?.endpoint,diff:s,token:n.token,clientId:o?.clientId}),a}catch(a){let s=(performance.now()-e).toFixed();E("getQualityQuestions error","error",{endpoint:o?.endpoint,error:a,diff:s,token:n.token,clientId:o?.clientId}),N(a)}}async function te(t){let e=performance.now(),{state:n,config:o,version:r}=h(),{checkResultEndpoint:i}=M(),{visitorId:a,projectId:s}=U(t),c=n.questionData||{questions:t.questions};try{let d=await C({url:i,headers:{"client-id":o?.clientId||"","x-api-key":o?.apiKey||""},body:{token:n.token,visitorId:a,projectId:s,version:r,questionData:c,aiCheckData:n.aiCheckData,clientData:n.clientData}});if(!d)throw new Error(y.INTERNAL_SERVER_ERROR);P(l=>({...l,state:{...l.state,questionData:c,visitorId:a,projectId:s}}));let u=(performance.now()-e).toFixed();return E(`checkQualityQuestions finishes in ${u}ms`,"info",{function:"checkQualityQuestions",endpoint:o?.endpoint,diff:u,token:n.token,clientId:o?.clientId}),d}catch(d){let u=(performance.now()-e).toFixed();E("checkQualityQuestions error","error",{endpoint:o?.endpoint,error:d,diff:u,token:n.token,clientId:o?.clientId}),N(d)}}var lt,dt=Oe;function vn(){let{config:t}=h();return!!(t?.clientId&&t?.apiKey)}function En(t){let{config:e}=h();if(!t?.clientId||!t?.apiKey)throw E(y.MISSING_CREDENTIALS,"error",{endpoint:e?.endpoint,...t}),new Error(y.MISSING_CREDENTIALS)}function bn(){let{config:t}=h();return!!(t?.clientId&&t.apiKey)}function Tn(t){let{config:e}=h();if(!bn())throw E(y.MISSING_CREDENTIALS,"error",{endpoint:e?.endpoint,...t}),new Error(y.MISSING_CREDENTIALS)}function Rn(t){return{clientId:t.clientId,apiKey:t.apiKey,endpoint:t.endpoint||"https://api.dtect.io/security",includeResults:t.includeResults}}function xn(t){let e=t.endpoint,n=t.includeResults?`${e}/client/check/result`:`${e}/client/check`;return{...t,checkResultEndpoint:n}}function Dn(t){let e=xn(t);P(n=>({...n,config:e}))}function An(){let{state:t}=h();if(t.isLoading)throw new Error(y.DUPLICATE_INITIALIZATION)}async function Sn(t){let{state:e,config:n}=h(),r=(performance.now()-t).toFixed();return E(`init() finishes ${r}ms`,"info",{endpoint:n?.endpoint,function:"init",diff:r,token:e.token,clientId:n?.clientId}),{getSecurityResult:X,getSecurityToken:Z,SecurityAPIError:dt,isAIUsageDetected:H,checkQualityQuestions:te,getQualityQuestions:ee,LanguageCodes:F,QualityQuestionsRespondentTypes:G}}async function gt(t){let{state:e}=h(),n=performance.now();En(t);let o=Rn(t);Dn(o),Tn(t);let r=Fe(e.token);An(),We(r);try{return await Sn(n)}catch(i){Ge(i,o)}finally{qe(r)}}lt={init:gt,getSecurityResult:X,getSecurityToken:Z,isAIUsageDetected:H,checkQualityQuestions:te,getQualityQuestions:ee,QualityQuestionsRespondentTypes:G,LanguageCodes:F};var Pn=lt;
11
+ `,n=l.createShader(l.VERTEX_SHADER),o=l.createShader(l.FRAGMENT_SHADER);if(!n||!o)throw new Error("Failed to create shaders");if(l.shaderSource(n,t),l.shaderSource(o,e),l.compileShader(n),!l.getShaderParameter(n,l.COMPILE_STATUS))throw new Error("Vertex shader compilation failed: "+l.getShaderInfoLog(n));if(l.compileShader(o),!l.getShaderParameter(o,l.COMPILE_STATUS))throw new Error("Fragment shader compilation failed: "+l.getShaderInfoLog(o));let r=l.createProgram();if(!r)throw new Error("Failed to create shader program");if(l.attachShader(r,n),l.attachShader(r,o),l.linkProgram(r),!l.getProgramParameter(r,l.LINK_STATUS))throw new Error("Shader program linking failed: "+l.getProgramInfoLog(r));l.useProgram(r);let i=137,a=new Float32Array(i*4),s=2*Math.PI/i;for(let g=0;g<i;g++){let f=g*s;a[g*4]=0,a[g*4+1]=0,a[g*4+2]=Math.cos(f)*(A.width/2),a[g*4+3]=Math.sin(f)*(A.height/2)}let c=l.createBuffer();l.bindBuffer(l.ARRAY_BUFFER,c),l.bufferData(l.ARRAY_BUFFER,a,l.STATIC_DRAW);let m=l.getAttribLocation(r,"position");l.enableVertexAttribArray(m),l.vertexAttribPointer(m,2,l.FLOAT,!1,0,0),l.viewport(0,0,A.width,A.height),l.clearColor(0,0,0,1),l.clear(l.COLOR_BUFFER_BIT),l.drawArrays(l.LINES,0,i*2);let u=new Uint8ClampedArray(A.width*A.height*4);return l.readPixels(0,0,A.width,A.height,l.RGBA,l.UNSIGNED_BYTE,u),new ImageData(u,A.width,A.height)}catch{return new ImageData(1,1)}finally{l&&(l.bindBuffer(l.ARRAY_BUFFER,null),l.useProgram(null),l.viewport(0,0,l.drawingBufferWidth,l.drawingBufferHeight),l.clearColor(0,0,0,0))}}function D(t){let e=[];return function n(o){if(o&&o.toJSON&&typeof o.toJSON=="function"&&(o=o.toJSON()),o===void 0)return;if(typeof o=="number")return isFinite(o)?""+o:"null";if(typeof o!="object")return JSON.stringify(o);let r,i;if(Array.isArray(o)){for(i="[",r=0;r<o.length;r++)r&&(i+=","),i+=n(o[r])||"null";return i+"]"}if(o===null)return"null";if(e.indexOf(o)!==-1)throw new TypeError("Converting circular structure to JSON");let a=e.push(o)-1,s=Object.keys(o).sort();for(i="",r=0;r<s.length;r++){let c=s[r],m=n(o[c]);m&&(i&&(i+=","),i+=JSON.stringify(c)+":"+m)}return e.splice(a,1),"{"+i+"}"}(t)||""}async function Te(){return new Promise(t=>{try{let e=window.RTCPeerConnection||window.webkitRTCPeerConnection||window.mozRTCPeerConnection;if(!e){t({supported:!1,error:"WebRTC not supported"});return}let n={iceCandidatePoolSize:1,iceServers:[]},o=new e(n);o.createDataChannel(""),(async()=>{try{let i={offerToReceiveAudio:!0,offerToReceiveVideo:!0},a=await o.createOffer(i);await o.setLocalDescription(a);let s=a.sdp||"",c=[...new Set((s.match(/extmap:\d+ [^\n\r]+/g)||[]).map(v=>v.replace(/extmap:\d+ /,"")))].sort(),m=v=>{let R=s.match(new RegExp(`m=${v} [^\\s]+ [^\\s]+ ([^\\n\\r]+)`));return R?R[1].split(" "):[]},u=(v,R)=>R.map(p=>{let P=new RegExp(`(rtpmap|fmtp|rtcp-fb):${p} (.+)`,"g"),_=[...s.matchAll(P)];if(!_.length)return null;let y={};return _.forEach(wt=>{let[Nn,oe,ie]=wt,ae=ie.split("/");oe==="rtpmap"?(y.mimeType=`${v}/${ae[0]}`,y.clockRate=+ae[1],v==="audio"&&(y.channels=+ae[2]||1)):oe==="rtcp-fb"?(y.feedbackSupport=y.feedbackSupport||[],y.feedbackSupport.push(ie)):oe==="fmtp"&&(y.sdpFmtpLine=ie)}),y}).filter(Boolean),d=u("audio",m("audio")),g=u("video",m("video")),f={audio:{count:d.length,hash:b(D(d))},video:{count:g.length,hash:b(D(g))},extensionsHash:b(D(c))},T=await new Promise(v=>{let R=setTimeout(()=>{o.removeEventListener("icecandidate",p),o.close(),v({supported:!0,...f,timeout:!0})},3e3),p=P=>{let _=P.candidate;!_||!_.candidate||(clearTimeout(R),o.removeEventListener("icecandidate",p),o.close(),v({supported:!0,...f,candidateType:_.type||""}))};o.addEventListener("icecandidate",p)});t({details:T,hash:b(D(T))})}catch(i){o.close(),t({supported:!0,error:`WebRTC offer failed: ${i.message}`})}})()}catch(e){t({supported:!1,error:`WebRTC error: ${e.message}`})}})}var Je=["\u{1D504}","\u{1D505}","\u212D","\u{1D507}","\u{1D508}","\u{1D509}","\u{1D538}","\u{1D539}","\u2102","\u{1D53B}","\u{1D53C}","\u{1D53D}"],Xe=["\u03B2","\u03C8","\u03BB","\u03B5","\u03B6","\u03B1","\u03BE","\u03BC","\u03C1","\u03C6","\u03BA","\u03C4","\u03B7","\u03C3","\u03B9","\u03C9","\u03B3","\u03BD","\u03C7","\u03B4","\u03B8","\u03C0","\u03C5","\u03BF"];async function Re(){return new Promise(t=>{try{J(async({iframe:e})=>{try{if(!on(e)){t({supported:!1,error:"MathML not supported"});return}let n=[q("integral","<msubsup><mo>\u222B</mo><mi>a</mi><mi>b</mi></msubsup><mfrac><mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mrow><mi>g</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mfrac><mi>dx</mi>"),q("fraction","<mfrac><mrow><mi>\u03C0</mi><mo>\xD7</mo><msup><mi>r</mi><mn>2</mn></msup></mrow><mrow><mn>2</mn><mi>\u03C3</mi></mrow></mfrac>"),q("matrix","<mo>[</mo><mtable><mtr><mtd><mi>\u03B1</mi></mtd><mtd><mi>\u03B2</mi></mtd></mtr><mtr><mtd><mi>\u03B3</mi></mtd><mtd><mi>\u03B4</mi></mtd></mtr></mtable><mo>]</mo>"),an(),...sn()],o=[],r="";n.forEach((a,s)=>{let c=cn(a,e);o.push({width:c.dimensions.width,height:c.dimensions.height}),s===0&&c.fontInfo&&(r=b(D(c.fontInfo)))});let i={fontStyleHash:r,dimensions:o};t({details:i,hash:b(D(i))})}catch(n){t({supported:!1,error:`MathML error: ${n.message}`})}})}catch(e){t({supported:!1,error:`MathML error: ${e.message}`})}})}function on(t){try{let e=t.createElement("math");e.innerHTML="<mrow><mi>x</mi></mrow>",e.style.position="absolute",e.style.visibility="hidden",t.body.appendChild(e);let n=e.getBoundingClientRect();return t.body.removeChild(e),n.width>0&&n.height>0}catch{return!1}}function q(t,e){return`<math><mrow>${e}</mrow></math>`}function an(){let t="<mo>\u220F</mo>";return Je.forEach((e,n)=>{let o=n*2,r=Xe.slice(o,o+2);r.length===2&&(t+=`<mmultiscripts><mi>${e}</mi><none/><mi>${r[1]}</mi><mprescripts></mprescripts><mi>${r[0]}</mi><none/></mmultiscripts>`)}),q("complex_nested",`<munderover><mmultiscripts>${t}</mmultiscripts></munderover>`)}function sn(){let t=[];return Je.forEach((e,n)=>{let o=n*2,r=Xe.slice(o,o+2);r.length===2&&t.push(q("combined",`<mmultiscripts><mi>${e}</mi><none/><mi>${r[1]}</mi><mprescripts></mprescripts><mi>${r[0]}</mi><none/></mmultiscripts>`))}),t}function cn(t,e){try{let n=e.createElement("math");n.innerHTML=t.replace(/<\/?math>/g,""),n.style.whiteSpace="nowrap",n.style.position="absolute",n.style.visibility="hidden",n.style.top="-9999px",e.body.appendChild(n);let o=n.getBoundingClientRect(),i=(e.defaultView||window).getComputedStyle(n),a={dimensions:{width:o.width,height:o.height},fontInfo:{fontFamily:i.fontFamily,fontSize:i.fontSize,fontWeight:i.fontWeight,fontStyle:i.fontStyle,lineHeight:i.lineHeight,fontVariant:i.fontVariant||"normal",fontStretch:i.fontStretch||"normal",fontSizeAdjust:i.fontSizeAdjust||"none",textRendering:i.textRendering||"auto",fontFeatureSettings:i.fontFeatureSettings||"normal",fontVariantNumeric:i.fontVariantNumeric||"normal",fontKerning:i.fontKerning||"auto"}};return e.body.removeChild(n),a}catch(n){return{error:n.message}}}var un=800;async function xe(){return new Promise(t=>{try{if(typeof window>"u"||!window.speechSynthesis||typeof window.speechSynthesis.getVoices!="function"){t({supported:!1,error:"Speech Synthesis API not supported"});return}let e=!1,n=null,o=a=>{if(!e){e=!0,n&&clearTimeout(n);try{let s=a.map(m=>{let u=g=>g.replace(/\\/g,"\\\\").replace(/,/g,"\\,");return[u(m.voiceURI||""),u(m.name||""),u(m.lang||""),m.localService?"1":"0",m.default?"1":"0"].join(",")});s.sort();let c={voiceCount:a.length,voicesHash:b(D(s))};t({details:c,hash:b(D(c))})}catch(s){t({supported:!0,error:`Voice processing failed: ${s.message}`})}}},r=window.speechSynthesis.getVoices();if(r.length>0){o(r);return}n=setTimeout(()=>{let a=window.speechSynthesis.getVoices();o(a)},un);let i=()=>{window.speechSynthesis.removeEventListener("voiceschanged",i);let a=window.speechSynthesis.getVoices();o(a)};window.speechSynthesis.addEventListener("voiceschanged",i)}catch(e){t({supported:!1,error:`Speech Synthesis error: ${e.message}`})}})}var Ze={audio:de,canvas:ge,fonts:fe,hardware:pe,locales:ye,math:he,permissions:we,plugins:Ie,screen:ve,system:Ee,webgl:be},He={webrtc:Te,mathml:Re,speech:xe},Ae={},et={timeout:"true"},De=(t,e,n)=>{Ae[t]=e};function ln(t,e){return new Promise(n=>{setTimeout(()=>n(e),t)})}function tt(t,e,n){return Promise.all(t.map(o=>{let r=performance.now();return Promise.race([o.then(i=>({value:i,elapsed:performance.now()-r})),ln(e,n).then(i=>({value:i,elapsed:performance.now()-r}))])}))}function H(t,e){let n=B();if(n.name==="unknown"&&t.system&&typeof t.system=="object"&&!Array.isArray(t.system)){let d=t.system.browser;if(d&&typeof d=="object"&&!Array.isArray(d)){let g=d;n={name:g.name||"unknown",version:g.version||"unknown"}}}let o=n.name.toLowerCase(),r=n.version.split(".")[0]||"0",i=parseInt(r,10),a=[...e?.exclude||[]],s=e?.stabilize||[],c=e?.include||[];for(let u of s){let d=me[u];if(d)for(let g of d){let f=!("browsers"in g),T=!f&&g.browsers?.some(v=>{let R=v.match(/(.+?)(>=)(\d+)/);if(R){let[,p,,P]=R,_=parseInt(P,10);return o===p&&i>=_}return o===v});(f||T)&&a.push(...g.exclude)}}function m(u,d=""){let g={};for(let[f,T]of Object.entries(u)){let v=d?`${d}.${f}`:f;if(typeof T=="object"&&!Array.isArray(T)&&T!==null){let R=m(T,v);Object.keys(R).length>0&&(g[f]=R)}else{let R=a.some(P=>v.startsWith(P)),p=c.some(P=>v.startsWith(P));(!R||p)&&(g[f]=T)}}return g}return m(t)}async function Se(t){let e={...C,...t},n=e.logging&&!sessionStorage.getItem("_tmjs_l")&&Math.random()<1e-4,o={...Ze,...Ae},{elapsed:r,resolvedComponents:i}=await nt(o,e),a={},s={};if(n||e.experimental){let{elapsed:R,resolvedComponents:p}=await nt(He,e);a=p,s=R}let c={...r,...s},m=e.performance?{elapsed:c}:{},u=H({},e),d={...i,...u},g={};return{thumbmark:b(D(d)),components:d,info:g,version:"",...m,...Object.keys(a).length>0&&e.experimental&&{experimental:a}}}async function nt(t,e){let n={...C,...e},o=Object.entries(t).filter(([u])=>!n?.exclude?.includes(u)).filter(([u])=>n?.include?.some(d=>d.includes("."))?n?.include?.some(d=>d.startsWith(u)):n?.include?.length===0||n?.include?.includes(u)),r=o.map(([u])=>u),i=o.map(([u,d])=>d(e)),a=await tt(i,n?.timeout||5e3,et),s={},c={};a.forEach((u,d)=>{u.value!=null&&(c[r[d]]=u.value,s[r[d]]=u.elapsed??0)});let m=H(c,n);return{elapsed:s,resolvedComponents:m}}var K=class{options;constructor(e){this.options={...C,...e}}async get(e){let n={...this.options,...e};return Se(n)}getVersion(){return""}includeComponent(e,n){De(e,n)}};var mn=(t,e={})=>({"Content-Type":"application/json",...t?.accessToken&&{Authorization:`Bearer ${t?.accessToken}`},...e}),dn=async(t,e)=>{if(!t.ok){let n=await t.text();throw new Error(n)}return e==="file"?t.blob():e==="json"?t.json():e==="text"?t.text():null},rt=async({url:t,auth:e,body:n,method:o="GET",headers:r={},responseType:i="json"})=>{let a={method:o,headers:mn(e,r),...n?{body:n instanceof FormData?n:JSON.stringify(n)}:{}},s=await fetch(t,a);return dn(s,i)},ot=t=>rt({...t,method:"GET"}),U=t=>rt({...t,method:"POST"});var gn=[{name:"lowCpuCores",weight:2,async check(){let t=navigator.hardwareConcurrency||0,e=t>0&&t<=2;return{value:t,triggered:e}}},{name:"lowDeviceMemory",weight:0,async check(){let t=navigator.deviceMemory||0,e=t>0&&t<=4;return{value:t,triggered:e}}},{name:"platformMismatch",weight:1,async check(){let t=navigator.userAgent||"",e=navigator.platform||"",n=t.includes("Mac")&&e.includes("Linux")||t.includes("Win")&&e.includes("Mac")||e===""||e==="Unknown";return{value:e,triggered:n}}},{name:"webglSoftwareRenderer",weight:4,async check(){let t=null,e=null,n=!1;try{let o=document.createElement("canvas"),r=o.getContext("webgl")||o.getContext("experimental-webgl");if(r){let i=r.getExtension("WEBGL_debug_renderer_info");if(i){t=r.getParameter(i.UNMASKED_VENDOR_WEBGL)||"",e=r.getParameter(i.UNMASKED_RENDERER_WEBGL)||"";let a=e.toLowerCase(),s=t.toLowerCase();n=a.includes("swiftshader")||a.includes("llvmpipe")||a.includes("softwar")||a.includes("basic render")||a.includes("vmware")||a.includes("virtualbox")||s.includes("vmware")||s.includes("parallels")}}}catch{}return{value:{vendor:t,renderer:e},triggered:n}}},{name:"missingWebGPUAdapter",weight:3,async check(){if(!("gpu"in navigator))return{value:"no WebGPU",triggered:!0};try{let t=await navigator.gpu.requestAdapter();return{value:t?"adapter-present":"adapter-null",triggered:!t}}catch{return{value:"adapter-error",triggered:!0}}}},{name:"reducedTimerPrecision",weight:1,async check(){let t=performance.now();await new Promise(o=>setTimeout(o,50));let e=performance.now()-t,n=e<30||e>80;return{value:e.toFixed(2),triggered:n}}},{name:"timerJitter",weight:0,async check(){let t=[];for(let n=0;n<10;n++){let o=performance.now();await new Promise(i=>setTimeout(i,10));let r=performance.now();t.push(r-o)}let e=Math.sqrt(t.map(n=>(n-10)**2).reduce((n,o)=>n+o)/t.length);return{value:e.toFixed(3),triggered:e>5}}},{name:"audioFingerprint",weight:1,async check(){try{let t=new(window.OfflineAudioContext||window.webkitOfflineAudioContext)(1,44100,44100),e=t.createOscillator();e.frequency.value=440,e.connect(t.destination),e.start(0);let o=(await t.startRendering()).getChannelData(0).reduce((r,i)=>r+Math.abs(i),0);return{value:o,triggered:o<100}}catch{return{value:"audio-error",triggered:!0}}}},{name:"canvasEntropy",weight:1,async check(){try{let t=document.createElement("canvas"),e=t.getContext("2d");e.textBaseline="top",e.font="14px 'Arial'",e.fillText("VM CHECK",2,2);let o=[...t.toDataURL()].reduce((r,i)=>(r+i.charCodeAt(0))%9999999,0);return{value:o,triggered:o===0||o===999999}}catch{return{value:"canvas-error",triggered:!0}}}},{name:"windowSizeWeird",weight:1,async check(){let t=window.innerWidth/window.innerHeight,e=t===1.333||t===1.6;return{value:t.toFixed(2),triggered:e}}},{name:"touchMismatch",weight:1,async check(){let t="ontouchstart"in window,e=navigator.maxTouchPoints||0;return{value:{hasTouch:t,maxTouch:e},triggered:t&&e===0}}},{name:"batteryVirtualized",weight:1,async check(){if(!navigator.getBattery)return{value:"no API",triggered:!0};try{let t=await navigator.getBattery(),e=t.chargingTime===0&&t.dischargingTime===1/0;return{value:{chargingTime:t.chargingTime,dischargingTime:t.dischargingTime},triggered:e}}catch{return{value:"battery-error",triggered:!0}}}},{name:"permissionsWeird",weight:0,async check(){try{let t=await navigator.permissions.query({name:"camera"});return{value:t.state,triggered:t.state==="prompt"}}catch{return{value:"perm-error",triggered:!0}}}},{name:"noMediaDevices",weight:1,async check(){try{let t=await navigator.mediaDevices.enumerateDevices();return{value:t.length,triggered:t.length===0}}catch{return{value:"media-error",triggered:!0}}}},{name:"virtualizedMediaDevices",weight:1,async check(){try{let t=await navigator.mediaDevices.enumerateDevices(),e=t.some(n=>n.label.toLowerCase().includes("virtual"));return{value:t.map(n=>n.label),triggered:e}}catch{return{value:"media-error",triggered:!0}}}},{name:"webrtcIpPattern",weight:2,async check(){return new Promise(t=>{try{let e=new RTCPeerConnection({iceServers:[]});e.createDataChannel("x");let n=setTimeout(()=>{e.close(),t({value:"timeout",triggered:!1})},3e3);e.onicecandidate=o=>{if(!o?.candidate){clearTimeout(n),e.close(),t({value:"no candidate",triggered:!1});return}let r=o.candidate.candidate.toLowerCase();clearTimeout(n),e.close(),t({value:r,triggered:r.includes("10.0.2.")||r.includes("172.16.")||r.includes("192.168.56.")})},e.createOffer().then(o=>e.setLocalDescription(o))}catch{t({value:"rtc-error",triggered:!1})}})}},{name:"gpuAccelerationDisabled",weight:3,async check(){let e=document.createElement("canvas").getContext("webgl");return{value:!!e,triggered:!e}}},{name:"noWebGL2",weight:3,async check(){let t=document.createElement("canvas").getContext("webgl2");return{value:!!t,triggered:!t}}},{name:"lowStorageQuota",weight:1,async check(){try{let t=await navigator.storage.estimate();return{value:t.quota,triggered:(t.quota??0)<524288e3}}catch{return{value:"storage-error",triggered:!0}}}},{name:"lowEntropy",weight:1,async check(){let t=Object.keys(navigator).length+Object.keys(screen).length+Object.keys(window).length;return{value:t,triggered:t<200}}},{name:"noLanguages",weight:1,async check(){let t=navigator.languages||[];return{value:t,triggered:t.length===0}}},{name:"uaEntropyLow",weight:1,async check(){let t=navigator.userAgent;return{value:t,triggered:t.length<30}}},{name:"weirdDPI",weight:2,async check(){let t=window.devicePixelRatio;return{value:t,triggered:t===1}}}],fn=[{name:"tamperingPluginMismatch",penalty:3,async check(){try{let t=navigator.userAgent.toLowerCase(),e=(t.includes("chrome")||t.includes("edg"))&&!t.includes("firefox")&&!t.includes("safari"),n=navigator.plugins?.length??0,o=!e&&n>0;return{value:{pluginCount:n,isChromeLike:e},triggered:o}}catch{return{value:"error",triggered:!1}}}},{name:"tamperingWebglNoise",penalty:1,async check(){try{let t=document.createElement("canvas");t.width=16,t.height=16;let e=t.getContext("webgl");if(!e)return{value:"no-webgl",triggered:!1};e.clearColor(.1,.2,.3,1),e.clear(e.COLOR_BUFFER_BIT);let n=new Uint8Array(16*16*4);e.readPixels(0,0,16,16,e.RGBA,e.UNSIGNED_BYTE,n);let o=new Set(n).size;return{value:{uniqueValues:o},triggered:o>4}}catch{return{value:"error",triggered:!1}}}},{name:"tamperingServiceWorkerBlocked",penalty:1,async check(){let t=!("serviceWorker"in navigator);return{value:{serviceWorkerAvailable:!t},triggered:t}}},{name:"permissionsWeirdAntiVM",penalty:2,async check(){try{let t=await navigator.permissions.query({name:"camera"});return{value:t.state,triggered:t.state==="prompt"}}catch{return{value:"error",triggered:!1}}}}];async function it({threshold:t=4}={}){let e={},n=0;for(let r of gn)try{let i=await r.check();e[r.name]={...i,weight:r.weight},i.triggered&&r.weight>0&&(n+=r.weight)}catch{e[r.name]={value:"error",triggered:!1,weight:r.weight}}let o=n;for(let r of fn)try{let i=await r.check();e[r.name]={...i,penalty:r.penalty},i.triggered&&(n-=r.penalty)}catch{e[r.name]={value:"error",triggered:!1,penalty:r.penalty}}return{isLikelyVM:n>=t,score:n,rawScore:o,threshold:t,signals:e}}var pn=[{name:"hookedFunctionToString",weight:2,async check(){let t=Function.prototype.toString.toString(),e=Function.prototype.toString+"";return{value:{native:t,current:e},triggered:t!==e}}},{name:"navigatorProxyTrap",weight:2,async check(){let t=!1;try{let e=Object.getOwnPropertyDescriptor(window,"navigator");e&&e.get&&e.get.toString()?.includes("[native code]")===!1&&(t=!0)}catch{}return{value:"navigator getter",triggered:t}}},{name:"uaMismatch",weight:2,async check(){let t=navigator.userAgent||"",e="";try{let o=await navigator.userAgentData?.getHighEntropyValues?.(["platform","brands"]);e=JSON.stringify(o)}catch{}let n=t?.includes("Mac")&&e?.includes("Windows")||t?.includes("Win")&&e?.includes("Mac")||e&&e.length>0&&!t;return{value:{ua:t,brandInfo:e},triggered:n}}},{name:"timezoneLocaleMismatch",weight:1,async check(){let t=Intl.DateTimeFormat().resolvedOptions().timeZone,e=navigator.language||"",n=e.startsWith("en")&&t==="Asia/Shanghai"||e.startsWith("zh")&&t==="America/New_York"||t===void 0;return{value:{tz:t,lang:e},triggered:n}}},{name:"canvasNoise",weight:2,async check(){let t=()=>{let r=document.createElement("canvas"),i=r.getContext("2d");return i.textBaseline="top",i.font="14px Arial",i.fillText("anti-detect-check",2,2),r.toDataURL()},e=t(),n=t();return{value:{a:e,b:n},triggered:e!==n}}},{name:"webglNoise",weight:-2,async check(){try{let e=document.createElement("canvas").getContext("webgl");if(!e)return{value:"no-webgl",triggered:!0};let n=e.getExtension("WEBGL_debug_renderer_info");if(!n)return{value:"no-debug-extension",triggered:!1};let o=e.getParameter(n.UNMASKED_VENDOR_WEBGL),r=e.getParameter(n.UNMASKED_RENDERER_WEBGL),i=o===""||r===""||o?.includes(" ")===!1||r?.includes(" ")===!1;return{value:{v:o,r},triggered:i}}catch{return{value:"gl-error",triggered:!0}}}},{name:"webdriverFlag",weight:3,async check(){let t=navigator.webdriver===!0;return{value:navigator.webdriver,triggered:t}}},{name:"perfectEventTiming",weight:-3,async check(){let t=performance.now();return{value:t,triggered:t%1===0}}},{name:"serviceWorkerBlocked",weight:-4,async check(){let t=!("serviceWorker"in navigator);return{value:t,triggered:t}}},{name:"smallQuota",weight:2,async check(){try{let t=await navigator.storage.estimate(),e=t.quota<50*1024*1024;return{value:t.quota,triggered:e}}catch{return{value:"quota-error",triggered:!0}}}},{name:"indexedDbBlocked",weight:2,async check(){try{let t=indexedDB.open("tamper-check");return await new Promise(e=>{t.onerror=()=>e({value:"error",triggered:!0}),t.onsuccess=()=>e({value:"ok",triggered:!1})})}catch{return{value:"throw",triggered:!0}}}},{name:"screenDprMismatch",weight:0,async check(){let t=window.screen.width,e=window.screen.height,n=window.devicePixelRatio,o=t===1920&&n===1&&e===1080||n%1!==0&&n%1!==.5;return{value:{w:t,h:e,dpr:n},triggered:o}}},{name:"missingCommonFonts",weight:1,async check(){return{value:"skipped",triggered:!1}}},{name:"noMediaDevices",weight:1,async check(){try{let t=await navigator.mediaDevices.enumerateDevices();return{value:t.length,triggered:t.length===0}}catch{return{value:"error",triggered:!0}}}},{name:"languagesEmpty",weight:1,async check(){let t=navigator.languages||[];return{value:t,triggered:t.length===0}}},{name:"pluginMismatch",weight:-4,async check(){try{let t=navigator.plugins.length;return{value:t,triggered:t===0}}catch{return{value:"error",triggered:!0}}}},{name:"devtoolsDetected",weight:-2,async check(){return new Promise(async t=>{let e={viewportBreakpoint:!1,consoleSpeed:!1,consoleProfileTiming:!1},n=160,o=window.outerWidth-window.innerWidth,r=window.outerHeight-window.innerHeight;(o>n||r>n)&&(e.viewportBreakpoint=!0);async function i(c=50){return new Promise(m=>{let u=performance.now();console.log("%c ","font-size:3000px");let d=performance.now();m(d-u>c)})}e.consoleSpeed=await i();function a(){if(typeof console.profile!="function"||typeof console.profileEnd!="function")return!1;let c=5,m=3,u=[];try{for(let g=0;g<c;g++){let f=performance.now(),T=`profile_${f.toString()}`;console.profile(T),console.profileEnd(T),u.push(performance.now()-f)}}catch{return!1}return u.sort((g,f)=>g-f),u[Math.floor(u.length/2)]>m}e.consoleProfileTiming=a();let s=Object.values(e).some(Boolean);setTimeout(()=>{t({value:s,triggered:s})},50)})}},{name:"knownAntiDetectBrowser",weight:5,async check(){let t=navigator.userAgent.toLowerCase(),n=["incogniton","multilogin","morelogin","adspect","kameleo","goLogin"].some(o=>t?.includes(o));return{value:t,triggered:n}}},{name:"batteryVirtualized",weight:4,async check(){try{let t=await navigator.getBattery(),e=t.chargingTime,n=t.dischargingTime;return{value:{chargingTime:e,dischargingTime:n},triggered:e===0}}catch{return{value:"no-battery-api",triggered:!1}}}},{name:"permissionDenied",weight:4,async check(){try{let t=await navigator.permissions.query({name:"notifications"}),e=t.state==="denied";return{value:t.state,triggered:e}}catch{return{value:"perm-error",triggered:!1}}}}];async function at({anomalyMin:t=.52,anomalyMax:e=.54}={}){let n={},o=0;for(let d of pn){let g=await d.check();n[d.name]=g,g.triggered&&(o+=d.weight)}let r=navigator?.platform||"",i=(navigator?.userAgent||"").toLowerCase(),a=r.toLowerCase().includes("win"),s=n.batteryVirtualized?.triggered||!1,c=n.permissionDenied?.triggered||!1,m=!a&&r!==""&&s&&c,u=Math.min(1,Math.max(0,o)/15);return{result:m&&u>=t&&u<=e||n.knownAntiDetectBrowser?.triggered,anomalyScore:u,score:o,signals:n}}function yn(){let t=0;try{0 .toFixed(-1)}catch(e){t=e.message.length}return t}function hn(){let t=navigator.userAgent,e=yn();return e===44||e===43?"Safari":e===51?"Chrome":e===25?"Firefox":navigator.msSaveBlob!==void 0?"MSIE":t.match(/Chrome/)?navigator.brave!==void 0?"Brave":t.includes("Edg")?"Edge":t.includes("OPR")?"Opera":"Chrome":"Unknown"}var wn=[{name:"safari_currentStorageTest",weight:2,browser:"Safari",async check(){if(typeof navigator.storage?.getDirectory!="function")return{triggered:!1,value:"unsupported"};try{return await navigator.storage.getDirectory(),{triggered:!1,value:"ok"}}catch(t){let e=t?.message??String(t);return{triggered:e.includes("unknown transient reason"),value:e}}}},{name:"safari13to18_indexedDbBlobTest",weight:2,browser:"Safari",async check(){return await new Promise(t=>{let e=String(Math.random()),n=indexedDB.open(e,1);n.onupgradeneeded=o=>{let r=o.target.result;try{r.createObjectStore("t",{autoIncrement:!0}).put(new Blob),t({triggered:!1,value:"ok"})}catch(i){let a=i?.message??String(i);t({triggered:a.includes("are not yet supported"),value:a})}finally{r.close(),indexedDB.deleteDatabase(e)}},n.onerror=()=>t({triggered:!1,value:"idb-error"})})}},{name:"safari_oldWebkitTest",weight:1,browser:"Safari",async check(){let t=window.openDatabase,e=window.localStorage;try{t(null,null,null,null)}catch{return{triggered:!0,value:"openDatabase denied"}}try{e.setItem("test","1"),e.removeItem("test")}catch{return{triggered:!0,value:"localStorage denied"}}return{triggered:!1,value:"ok"}}},{name:"chrome_storageQuotaPrivateTest",weight:2,browser:"Chrome",async check(){return await new Promise((t,e)=>{let o=window?.performance?.memory?.jsHeapSizeLimit??1073741824;navigator.webkitTemporaryStorage.queryUsageAndQuota((r,i)=>{let a=Math.round(i/1048576),s=Math.round(o/(1024*1024))*2;t({triggered:a<s,value:{quotaMB:a,limitMB:s}})},r=>e(r))})}},{name:"chrome_oldFileSystemTest",weight:1,browser:"Chrome",async check(){let t=window.webkitRequestFileSystem;return t?await new Promise(e=>t(0,1,()=>e({triggered:!1,value:"ok"}),()=>e({triggered:!0,value:"denied"}))):{triggered:!1,value:"unsupported"}}},{name:"firefox_storageDirectoryTest",weight:2,browser:"Firefox",async check(){if(typeof navigator.storage?.getDirectory!="function")return{triggered:!1,value:"unsupported"};try{return await navigator.storage.getDirectory(),{triggered:!1,value:"ok"}}catch(t){let e=t?.message??String(t);return{triggered:e.includes("Security error"),value:e}}}},{name:"firefox_indexedDbInvalidStateTest",weight:1,browser:"Firefox",async check(){return await new Promise(t=>{let e=indexedDB.open("inPrivate");e.onerror=()=>{t({triggered:e.error?.name==="InvalidStateError",value:e.error?.name})},e.onsuccess=()=>{indexedDB.deleteDatabase("inPrivate"),t({triggered:!1,value:"ok"})}})}},{name:"msie_indexedDbMissing",weight:2,browser:"MSIE",async check(){return{triggered:window.indexedDB===void 0,value:"msie-idb-check"}}}];async function st(){let t=hn(),e={},n=0;for(let o of wn){if(o.browser!==t)continue;let r=await o.check();e[o.name]=r,r.triggered&&(n+=o.weight)}return{isPrivate:n>0,browserName:t,score:n,signals:e}}typeof window<"u"&&(window.detectIncognito=st);var ct=st;var ut=[{name:"globalPrivacyControl",weight:3,async check(){let t=navigator.globalPrivacyControl;return{triggered:t===!0,value:t}}},{name:"doNotTrack",weight:1,async check(){let t=navigator.doNotTrack;return{triggered:t==="1",value:t}}},{name:"cookiesDisabled",weight:3,async check(){let t=navigator.cookieEnabled;return{triggered:t===!1,value:t}}},{name:"thirdPartyCookiesBlocked",weight:3,async check(){try{if("hasStorageAccess"in document&&!await document.hasStorageAccess())try{return await document.requestStorageAccess(),{triggered:!1,value:"access_granted"}}catch{return{triggered:!0,value:"access_denied"}}let t=`__dtect_3p_test_${Date.now()}`;document.cookie=`${t}=1; SameSite=None; Secure`;let e=document.cookie.includes(t);return document.cookie=`${t}=; expires=Thu, 01 Jan 1970 00:00:00 GMT`,{triggered:!1,value:e?"cookies_work":"may_be_blocked"}}catch(t){return{triggered:!1,value:`error: ${t?.message}`}}}},{name:"firefoxResistFingerprinting",weight:2,async check(){let t=[],e=new Date().getTimezoneOffset();e===0&&Intl.DateTimeFormat().resolvedOptions().timeZone==="UTC"&&t.push("timezone_utc");let n=navigator.hardwareConcurrency;n===2&&t.push("cores_capped");let o=window.screen.width,r=window.screen.height,i=window.innerWidth,a=window.innerHeight;o===i&&r===a&&t.push("screen_matches_inner");let s=window.matchMedia("(prefers-reduced-motion: reduce)").matches;return{triggered:t.length>=2,value:{signals:t,timezoneOffset:e,cores:n,prefersReducedMotion:s}}}},{name:"braveShields",weight:3,async check(){if(!(navigator.brave!==void 0))return{triggered:!1,value:"not_brave"};try{if(!await navigator.brave.isBrave())return{triggered:!1,value:"brave_check_false"};let o=document.createElement("canvas").getContext("2d");if(o){o.fillStyle="rgb(255, 0, 0)",o.fillRect(0,0,1,1);let r=o.getImageData(0,0,1,1).data;o.fillRect(0,0,1,1);let i=o.getImageData(0,0,1,1).data;if(r[0]!==i[0]||r[1]!==i[1]||r[2]!==i[2])return{triggered:!0,value:"shields_active_canvas"}}try{let r=new RTCPeerConnection({iceServers:[{urls:"stun:stun.l.google.com:19302"}]});if(r.createDataChannel(""),await new Promise(a=>{let s=setTimeout(()=>{r.close(),a(!1)},1e3);r.onicecandidate=c=>{c.candidate?.candidate&&(/([0-9]{1,3}\.){3}[0-9]{1,3}/.test(c.candidate.candidate)||(clearTimeout(s),r.close(),a(!0)))},r.createOffer().then(c=>r.setLocalDescription(c))}))return{triggered:!0,value:"shields_active_webrtc"}}catch{return{triggered:!0,value:"shields_active_webrtc_blocked"}}return{triggered:!0,value:"brave_detected_shields_default"}}catch(e){return{triggered:!1,value:`error: ${e?.message}`}}}}];async function lt(){let t={},e=0,n=await Promise.allSettled(ut.map(async o=>{let r=await o.check();return{name:o.name,weight:o.weight,result:r}}));for(let o of n)if(o.status==="fulfilled"){let{name:r,weight:i,result:a}=o.value;t[r]=a,a.triggered&&(e+=i)}else{let r=n.indexOf(o),i=ut[r];i&&(t[i.name]={triggered:!1,value:`check_failed: ${o.reason}`})}return{isPrivacyEnabled:e>3,score:e,signals:t}}typeof window<"u"&&(window.detectPrivacy=lt);var mt=lt;function In(t){let e=t?.projectId,n=t?.visitorId||O();return(typeof t?.projectId=="number"||typeof t?.visitorId=="number")&&(e=`${t?.projectId}`,n=`${t?.visitorId}`),{visitorId:n,projectId:e}}function F(t){let{projectId:e,visitorId:n}=In(t);return{projectId:e,visitorId:n}}async function vn(){let t=new K,[e,n,o,r,i]=await Promise.allSettled([t.get(),it(),at(),ct(),mt()]);return{deviceRes:e,vmDtectResults:n,tamperingDtectResults:o,incognitoDtectResults:r,privacySettingsDtectResults:i}}function En(t,e){return{entryLink:window?.location?.href,securitySettings:t.securitySettings,metaData:t.metaData,vmDtectResults:e?.vmDtectResults?.value,tamperingDtectResults:e?.tamperingDtectResults?.value,incognitoDtectResults:e?.incognitoDtectResults?.value,deviceIdResults:e?.deviceRes?.value,privacySettingsDtectResults:e?.privacySettingsDtectResults?.value}}function bn(t,e,n,o){let r=(performance.now()-e).toFixed();I(`${t} finishes in ${r}ms`,"info",{function:t,endpoint:n?.endpoint,diff:r,token:o,clientId:n?.clientId})}function dt(t,e,n,o,r){let i=(performance.now()-e).toFixed();I(`${t} error`,"error",{function:t,endpoint:n?.endpoint,error:r,diff:i,token:o,clientId:n?.clientId})}async function gt(t,e){let n=performance.now(),{projectId:o,visitorId:r}=F(t);if(!t||!o?.trim())throw new Error(h.FAILED_TO_GET_SECURITY_RESULT);L({projectId:o,visitorId:r});let{state:i,config:a,version:s}=w();try{let c=await vn(),m=En(t,c),u={...t,projectId:o,visitorId:r,clientData:m,version:s,token:i.token,questionData:i.questionData,aiCheckData:i.aiCheckData},d=await U({url:e,body:u,headers:{"client-id":a?.clientId||"","x-api-key":a?.apiKey||""}});if(!("token"in d||"results"in d))throw new Error(h.INTERNAL_SERVER_ERROR);let g="results"in d&&d.results.isAIUsageDetected===!0;return S(f=>({...f,state:{...f.state,token:i.token,visitorId:r,projectId:o,clientData:m,aiUsageFlagged:f.state.aiUsageFlagged||g}})),bn("getResultBase",n,a,i.token),d}catch(c){c instanceof Error?dt("getResultBase",n,a,i.token,{message:c.message,stack:c.stack,name:c.name}):dt("getResultBase",n,a,i.token,c),N(c)}}async function ee(t){let{endpoint:e}=M();if(t)return gt(t,`${e}/client/check/result`)}async function te(t){let{endpoint:e}=M();return gt(t,`${e}/client/check`)}var j;function ft(){let{config:t,monitor:e,state:n}=w();if(!t?.autoFlagAIUsage||!e||(j?.(),j=void 0,n.aiUsageFlagged))return;let o=()=>{let{state:r}=w();r.aiUsageFlagged||!(e.apd||e.qbc&&e.mas&&e.scb!=null)||r.projectId&&(S(a=>({...a,state:{...a.state,aiUsageFlagged:!0}})),j?.(),j=void 0,$({projectId:r.projectId,visitorId:r.visitorId}))};j=e.onChange(o),o()}async function $(t){let e=performance.now(),{visitorId:n,projectId:o}=F(t);L({projectId:o,visitorId:n});let{state:r,config:i,monitor:a,version:s}=w(),{checkResultEndpoint:c}=M(),m={timeTakenSeconds:t.timeTakenSeconds,qbc:a?.qbc,mas:a?.mas,scb:a?.scb,apd:a?.apd};try{let u=await U({url:c,headers:{"client-id":i?.clientId||"","x-api-key":i?.apiKey||""},body:{token:r.token,visitorId:n,projectId:o,version:s,clientData:r.clientData,questionData:r.questionData,aiCheckData:m}});if(!u)throw new Error(h.INTERNAL_SERVER_ERROR);let d="results"in u&&u.results.isAIUsageDetected===!0;S(f=>({...f,state:{...f.state,aiCheckData:m,visitorId:n,projectId:o,aiUsageFlagged:f.state.aiUsageFlagged||d}}));let g=(performance.now()-e).toFixed();return I(`isAIUsageDetected finishes in ${g}ms`,"info",{endpoint:i?.endpoint,diff:g,token:r.token,clientId:i?.clientId}),u}catch(u){let d=(performance.now()-e).toFixed();u instanceof Error?I("isAIUsageDetected error","error",{endpoint:i?.endpoint,error:{message:u.message,stack:u.stack,name:u.name},diff:d,token:r.token,clientId:i?.clientId}):I("isAIUsageDetected error","error",{endpoint:i?.endpoint,error:u,diff:d,token:r.token,clientId:i?.clientId}),N(u)}}async function ne(t){let e=performance.now(),{state:n,config:o}=w(),{respondentType:r,language:i}=t;try{let a=await ot({url:`${o?.endpoint}/client/quality-questions/${r}/${i}`,headers:{"client-id":o?.clientId||"","x-api-key":o?.apiKey||""}});if(!a)throw new Error(h.INTERNAL_SERVER_ERROR);let s=(performance.now()-e).toFixed();return I(`getQualityQuestions finishes in ${s}ms`,"info",{function:"getQualityQuestions",endpoint:o?.endpoint,diff:s,token:n.token,clientId:o?.clientId}),a}catch(a){let s=(performance.now()-e).toFixed();I("getQualityQuestions error","error",{endpoint:o?.endpoint,error:a,diff:s,token:n.token,clientId:o?.clientId}),N(a)}}async function re(t){let e=performance.now(),{visitorId:n,projectId:o}=F(t);L({projectId:o,visitorId:n});let{state:r,config:i,version:a}=w(),{checkResultEndpoint:s}=M(),c={questions:t.questions};try{let m=await U({url:s,headers:{"client-id":i?.clientId||"","x-api-key":i?.apiKey||""},body:{token:r.token,visitorId:n,projectId:o,version:a,questionData:c,aiCheckData:r.aiCheckData,clientData:r.clientData}});if(!m)throw new Error(h.INTERNAL_SERVER_ERROR);S(d=>({...d,state:{...d.state,token:r.token,questionData:c,visitorId:n,projectId:o}}));let u=(performance.now()-e).toFixed();return I(`checkQualityQuestions finishes in ${u}ms`,"info",{function:"checkQualityQuestions",endpoint:i?.endpoint,diff:u,token:r.token,clientId:i?.clientId}),m}catch(m){let u=(performance.now()-e).toFixed();m instanceof Error?I("checkQualityQuestions error","error",{endpoint:i?.endpoint,error:{message:m.message,stack:m.stack,name:m.name},diff:u,token:r.token,clientId:i?.clientId}):I("checkQualityQuestions error","error",{endpoint:i?.endpoint,error:m,diff:u,token:r.token,clientId:i?.clientId}),N(m)}}var pt,yt=Ne;function Tn(){let{config:t}=w();return!!(t?.clientId&&t?.apiKey)}function Rn(t){let{config:e}=w();if(!t?.clientId||!t?.apiKey)throw I(h.MISSING_CREDENTIALS,"error",{endpoint:e?.endpoint,...t}),new Error(h.MISSING_CREDENTIALS)}function xn(){let{config:t}=w();return!!(t?.clientId&&t.apiKey)}function An(t){let{config:e}=w();if(!xn())throw I(h.MISSING_CREDENTIALS,"error",{endpoint:e?.endpoint,...t}),new Error(h.MISSING_CREDENTIALS)}function Dn(t){return{clientId:t.clientId,apiKey:t.apiKey,endpoint:t.endpoint||"https://api.dtect.io/security",includeResults:t.includeResults,autoFlagAIUsage:t.autoFlagAIUsage}}function Sn(t){let e=t.endpoint,n=t.includeResults?`${e}/client/check/result`:`${e}/client/check`;return{...t,checkResultEndpoint:n}}function kn(t){let e=Sn(t);S(n=>({...n,config:e}))}function Pn(){let{state:t}=w();if(t.isLoading)throw new Error(h.DUPLICATE_INITIALIZATION)}async function _n(t){let{state:e,config:n}=w(),r=(performance.now()-t).toFixed();return I(`init() finishes ${r}ms`,"info",{endpoint:n?.endpoint,function:"init",diff:r,token:e.token,clientId:n?.clientId}),{getSecurityResult:ee,getSecurityToken:te,SecurityAPIError:yt,isAIUsageDetected:$,checkQualityQuestions:re,getQualityQuestions:ne,LanguageCodes:G,QualityQuestionsRespondentTypes:V}}async function ht(t){let{state:e}=w(),n=performance.now();Rn(t);let o=Dn(t);kn(o),An(t);let r=Ve(e.token);Pn(),Ke(r),ft();try{return await _n(n)}catch(i){We(i,o)}finally{je(r)}}pt={init:ht,getSecurityResult:ee,getSecurityToken:te,isAIUsageDetected:$,checkQualityQuestions:re,getQualityQuestions:ne,QualityQuestionsRespondentTypes:V,LanguageCodes:G};var On=pt;
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- var dt={UNAUTHORIZED:"Unauthorized"},gt={EXPIRED:"EXPIRED_TOKEN",INVALID_API_KEY:"INVALID_API_KEY",MISSING_AUTHENTICATION_TOKEN:"MISSING_AUTHENTICATION_TOKEN"},De={INTERNAL_SERVER_ERROR:"Internal Server Error during API Request",MISSING_CREDENTIALS:"Missing Public Client ID or Public API Key",MAINTENANCE_MODE:"API Under Maintenance",RATE_LIMIT_REACHED:"Too many requests. Rate limit exceeded"},Ae={SDK_INIT_ERROR:"Internal Server Error during SDK Initialization",DUPLICATE_INITIALIZATION:"Multiple SDK Initializations Detected",NOT_INITIALIZED:"SDK Not Initialized"},Se={INVALID_CREDENTIALS:"Invalid Public Client ID or Public API Key"},Pe={FAILED_TO_GET_SECURITY_RESULT:"Failed to Retrieve Security Result"},ke={FAILED_TO_GET_SECURITY_TOKEN:" Failed to Generate Security Token"},y={...dt,...gt,...De,...Ae,...Se,...Pe,...ke},_e={...De,...Ae,...Se,...Pe,...ke};var W=(f=>(f.AR="ar",f.BN="bn",f.DE="de",f.EN="en",f.ES="es",f.FR="fr",f.HI="hi",f.ID="id",f.IT="it",f.JA="ja",f.KO="ko",f.MS="ms",f.NL="nl",f.PT="pt",f.RU="ru",f.YU="yu",f.ZH="zh",f))(W||{}),q=(p=>(p.GeneralConsumer="general-consumer",p.HRManagerDirector="hr-manager-director",p.WebDeveloper="web-developer",p.SoftwareEngineer="software-engineer",p.ITDirector="it-director",p.BusinessAdministrator="business-administrator",p.AccountsPayableManager="accounts-payable-manager",p.Accountant="accountant",p.FinanceDirector="finance-director",p.SmallBusinessOwner="small-business-owner",p.GeneralContractor="general-contractor",p.MarketingManagerDirector="marketing-manager-director",p.ConsumerShopper="consumer-shopper",p.Travel="travel",p.Entertainment="entertainment",p.FinanceAndBanking="finance-and-banking",p.General="general",p.B2BWhiteCollar="b2b-white-collar",p.B2BBlueCollar="b2b-blue-collar",p.Lawyer="lawyer",p))(q||{});var v=[];for(let t=0;t<256;++t)v.push((t+256).toString(16).slice(1));function Oe(t,e=0){return(v[t[e+0]]+v[t[e+1]]+v[t[e+2]]+v[t[e+3]]+"-"+v[t[e+4]]+v[t[e+5]]+"-"+v[t[e+6]]+v[t[e+7]]+"-"+v[t[e+8]]+v[t[e+9]]+"-"+v[t[e+10]]+v[t[e+11]]+v[t[e+12]]+v[t[e+13]]+v[t[e+14]]+v[t[e+15]]).toLowerCase()}var ee,ft=new Uint8Array(16);function te(){if(!ee){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");ee=crypto.getRandomValues.bind(crypto)}return ee(ft)}var pt=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),ne={randomUUID:pt};function yt(t,e,n){if(ne.randomUUID&&!e&&!t)return ne.randomUUID();t=t||{};let o=t.random??t.rng?.()??te();if(o.length<16)throw new Error("Random bytes length must be >= 16");if(o[6]=o[6]&15|64,o[8]=o[8]&63|128,e){if(n=n||0,n<0||n+16>e.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);for(let r=0;r<16;++r)e[n+r]=o[r];return e}return Oe(o)}var O=yt;var Me="dtect_security_sdk_state",Ne=typeof window<"u",Le={isLoading:!1,token:"",visitorId:"",projectId:"",questionData:null,clientData:null,aiCheckData:null},K={state:{...Le},securityKeys:{behaviorKey:"bwDZ0V3Zrb4SB6g4lZwW",automationKey:"7166bf18-b91e-407a-84fc-d57ac104de98"}};function Be(){if(!Ne)return K;try{let t=sessionStorage.getItem(Me);if(!t)return K;let e=JSON.parse(t);return e.expiresAt&&e.expiresAt<Date.now()?K:{state:{...Le,...e.state},securityKeys:e.securityKeys||{behaviorKey:"",automationKey:""}}}catch{return K}}function Ce(t){if(Ne)try{let e=Date.now()+864e5,n={...t,expiresAt:e};sessionStorage.setItem(Me,JSON.stringify(n))}catch{}}function Ue(t){return t||O()}var ht="0.1.0",F={...Be(),monitor:void 0,version:ht};function h(){return F}function P(t){F=t(F),Ce({state:F.state,securityKeys:F.securityKeys})}function M(){let{config:t}=h(),e=t?.endpoint||"https://api.dtect.io/security",n=t?.includeResults?`${e}/client/check/result`:`${e}/client/check`;return{endpoint:e,clientId:t?.clientId,apiKey:t?.apiKey,checkResultEndpoint:n}}async function E(t,e="info",n={}){let o=`${n.endpoint??"https://api.dtect.io/security"}/log`,r={message:t,type:e,payload:n};navigator.sendBeacon(o,JSON.stringify(r))}function N(t){if(t instanceof Error){if(t?.message?.includes("maintenance_mode"))throw new Error(y.MAINTENANCE_MODE);switch(t?.message){default:throw new Error(y.INTERNAL_SERVER_ERROR)}}throw new Error(y.FAILED_TO_GET_SECURITY_TOKEN)}function Fe(t,e){let{state:n,config:o}=h();if(t instanceof Error){if(E(t.message,"error",{function:"init",endpoint:o?.endpoint,error:t,token:n.token,clientId:e.clientId}),t.message.includes("maintenance_mode"))throw new Error(y.MAINTENANCE_MODE);if([y.INVALID_API_KEY,y.UNAUTHORIZED].includes(t.message))throw new Error(y.INVALID_CREDENTIALS)}throw new Error(y.SDK_INIT_ERROR)}function Ge(t){let e=t?.qbc||!1,n=t?.mas||!1,o=t?.apd||!1,r=t?.scb||null,i=0,a=()=>{e=!1,n=!1,o=!1,r=void 0,i=0},s=()=>{let l=window?.getSelection()?.toString();l&&l.length>0&&(i=Date.now(),e=!0)},c=u=>{let l=u.clipboardData?.getData("text"),g=u.target instanceof HTMLInputElement||u.target instanceof HTMLTextAreaElement;l&&g&&(o=!0)},d=()=>{n=!0;let u=Date.now();if(i){let l=(u-i)/1e3;(r===void 0||l<r)&&(r=l)}};return document?.addEventListener("copy",s),document?.addEventListener("paste",c),window?.addEventListener("blur",d),{get qbc(){return e},get mas(){return n},get apd(){return o},get scb(){return r},reset:a,destroy(){document?.removeEventListener("copy",s),document?.removeEventListener("paste",c),window?.removeEventListener("blur",d)}}}function Ve(t){P(e=>{let n=Ge(e.state.aiCheckData);return{...e,monitor:n,state:{...e.state,isLoading:!0,token:t||""}}})}function We(t){P(e=>({...e,state:{...e.state,isLoading:!1,token:t||""}}))}var L={exclude:[],include:[],stabilize:["private","iframe"],logging:!0,timeout:5e3,cache_api_call:!0,performance:!1,experimental:!1},nr={...L},re={private:[{exclude:["canvas"],browsers:["firefox","safari>=17","brave"]},{exclude:["audio"],browsers:["samsungbrowser","safari"]},{exclude:["fonts"],browsers:["firefox"]},{exclude:["audio.sampleHash","hardware.deviceMemory","header.acceptLanguage.q","system.hardwareConcurrency","plugins"],browsers:["brave"]},{exclude:["tls.extensions"],browsers:["firefox","chrome","safari"]},{exclude:["header.acceptLanguage"],browsers:["edge","chrome"]}],iframe:[{exclude:["system.applePayVersion","system.cookieEnabled"],browsers:["safari"]},{exclude:["permissions"]}],vpn:[{exclude:["ip"]}]};async function oe(){return wt()}async function wt(){return new Promise((e,n)=>{try{let i=new(window.OfflineAudioContext||window.webkitOfflineAudioContext)(1,5e3,44100),a=i?.createBufferSource(),s=i.createOscillator();s.frequency.value=1e3;let c=i.createDynamicsCompressor();c.threshold.value=-50,c.knee.value=40,c.ratio.value=12,c.attack.value=0,c.release.value=.2,s.connect(c),c.connect(i.destination),s.start();let d;i.oncomplete=u=>{d=u.renderedBuffer.getChannelData(0),e({sampleHash:It(d),maxChannels:i.destination.maxChannelCount,channelCountMode:a.channelCountMode})},i.startRendering()}catch(o){console.error("Error creating audio fingerprint:",o),n(o)}})}function It(t){let e=0;for(let n=0;n<t.length;++n)e+=Math.abs(t[n]);return e}function j(t,e,n){let o=[];for(let a=0;a<t[0].data.length;a++){let s=[];for(let c=0;c<t.length;c++)s.push(t[c].data[a]);o.push(vt(s))}let r=o,i=new Uint8ClampedArray(r);return new ImageData(i,e,n)}function vt(t){if(t.length===0)return 0;let e={};for(let o of t)e[o]=(e[o]||0)+1;let n=t[0];for(let o in e)e[o]>e[n]&&(n=parseInt(o,10));return n}function Et(t){return new TextEncoder().encode(t).buffer}function $(t){return t^=t>>>16,t=Math.imul(t,2246822507),t^=t>>>13,t=Math.imul(t,3266489909),t^=t>>>16,t>>>0}var R=new Uint32Array([597399067,2869860233,951274213,2716044179]);function A(t,e){return t<<e|t>>>32-e}function bt(t,e){let n=t.byteLength/16|0,o=new Uint32Array(t,0,n*4);for(let r=0;r<n;r++){let i=o.subarray(r*4,(r+1)*4);i[0]=Math.imul(i[0],R[0]),i[0]=A(i[0],15),i[0]=Math.imul(i[0],R[1]),e[0]=e[0]^i[0],e[0]=A(e[0],19),e[0]=e[0]+e[1],e[0]=Math.imul(e[0],5)+1444728091,i[1]=Math.imul(i[1],R[1]),i[1]=A(i[1],16),i[1]=Math.imul(i[1],R[2]),e[1]=e[1]^i[1],e[1]=A(e[1],17),e[1]=e[1]+e[2],e[1]=Math.imul(e[1],5)+197830471,i[2]=Math.imul(i[2],R[2]),i[2]=A(i[2],17),i[2]=Math.imul(i[2],R[3]),e[2]=e[2]^i[2],e[2]=A(e[2],15),e[2]=e[2]+e[3],e[2]=Math.imul(e[2],5)+2530024501,i[3]=Math.imul(i[3],R[3]),i[3]=A(i[3],18),i[3]=Math.imul(i[3],R[0]),e[3]=e[3]^i[3],e[3]=A(e[3],13),e[3]=e[3]+e[0],e[3]=Math.imul(e[3],5)+850148119}}function Tt(t,e){let n=t.byteLength/16|0,o=t.byteLength%16,r=new Uint32Array(4),i=new Uint8Array(t,n*16,o);switch(o){case 15:r[3]=r[3]^i[14]<<16;case 14:r[3]=r[3]^i[13]<<8;case 13:r[3]=r[3]^i[12]<<0,r[3]=Math.imul(r[3],R[3]),r[3]=A(r[3],18),r[3]=Math.imul(r[3],R[0]),e[3]=e[3]^r[3];case 12:r[2]=r[2]^i[11]<<24;case 11:r[2]=r[2]^i[10]<<16;case 10:r[2]=r[2]^i[9]<<8;case 9:r[2]=r[2]^i[8]<<0,r[2]=Math.imul(r[2],R[2]),r[2]=A(r[2],17),r[2]=Math.imul(r[2],R[3]),e[2]=e[2]^r[2];case 8:r[1]=r[1]^i[7]<<24;case 7:r[1]=r[1]^i[6]<<16;case 6:r[1]=r[1]^i[5]<<8;case 5:r[1]=r[1]^i[4]<<0,r[1]=Math.imul(r[1],R[1]),r[1]=A(r[1],16),r[1]=Math.imul(r[1],R[2]),e[1]=e[1]^r[1];case 4:r[0]=r[0]^i[3]<<24;case 3:r[0]=r[0]^i[2]<<16;case 2:r[0]=r[0]^i[1]<<8;case 1:r[0]=r[0]^i[0]<<0,r[0]=Math.imul(r[0],R[0]),r[0]=A(r[0],15),r[0]=Math.imul(r[0],R[1]),e[0]=e[0]^r[0]}}function Rt(t,e){e[0]=e[0]^t.byteLength,e[1]=e[1]^t.byteLength,e[2]=e[2]^t.byteLength,e[3]=e[3]^t.byteLength,e[0]=e[0]+e[1]|0,e[0]=e[0]+e[2]|0,e[0]=e[0]+e[3]|0,e[1]=e[1]+e[0]|0,e[2]=e[2]+e[0]|0,e[3]=e[3]+e[0]|0,e[0]=$(e[0]),e[1]=$(e[1]),e[2]=$(e[2]),e[3]=$(e[3]),e[0]=e[0]+e[1]|0,e[0]=e[0]+e[2]|0,e[0]=e[0]+e[3]|0,e[1]=e[1]+e[0]|0,e[2]=e[2]+e[0]|0,e[3]=e[3]+e[0]|0}function b(t,e=0){if(e=e?e|0:0,typeof t=="string"&&(t=Et(t)),!(t instanceof ArrayBuffer))throw new TypeError("Expected key to be ArrayBuffer or string");let n=new Uint32Array([e,e,e,e]);bt(t,n),Tt(t,n),Rt(t,n);let o=new Uint8Array(n.buffer);return Array.from(o).map(r=>r.toString(16).padStart(2,"0")).join("")}var xt=3,qe=280,Ke=20;async function ie(){return Dt()}function Dt(){return new Promise(t=>{let e=Array.from({length:xt},()=>At()),n=j(e,qe,Ke);t({commonPixelsHash:b(n.data.toString()).toString()})})}function At(){let t=document.createElement("canvas"),e=t.getContext("2d");if(!e)return new ImageData(1,1);t.width=qe,t.height=Ke;let n=e.createLinearGradient(0,0,t.width,t.height);n.addColorStop(0,"red"),n.addColorStop(1/6,"orange"),n.addColorStop(2/6,"yellow"),n.addColorStop(3/6,"green"),n.addColorStop(4/6,"blue"),n.addColorStop(5/6,"indigo"),n.addColorStop(1,"violet"),e.fillStyle=n,e.fillRect(0,0,t.width,t.height);let o="Random Text WMwmil10Oo";return e.font="23.123px Arial",e.fillStyle="black",e.fillText(o,-5,15),e.fillStyle="rgba(0, 0, 255, 0.5)",e.fillText(o,-3.3,17.7),e.beginPath(),e.moveTo(0,0),e.lineTo(t.width*2/7,t.height),e.strokeStyle="white",e.lineWidth=2,e.stroke(),e.getImageData(0,0,t.width,t.height)}async function z(t){for(;!document.body;)await St(50);let e=document.createElement("iframe");e.setAttribute("frameBorder","0");let n=e.style;n.setProperty("position","fixed"),n.setProperty("display","block","important"),n.setProperty("visibility","visible"),n.setProperty("border","0"),n.setProperty("opacity","0"),e.src="about:blank",document.body.appendChild(e);let o=e.contentDocument||e.contentWindow?.document;if(!o)throw new Error("Iframe document is not accessible");t({iframe:o}),setTimeout(()=>{document.body.removeChild(e)},0)}function St(t,e){return new Promise(n=>setTimeout(n,t,e))}var Pt=["Arial","Arial Black","Arial Narrow","Arial Rounded MT","Arimo","Archivo","Barlow","Bebas Neue","Bitter","Bookman","Calibri","Cabin","Candara","Century","Century Gothic","Comic Sans MS","Constantia","Courier","Courier New","Crimson Text","DM Mono","DM Sans","DM Serif Display","DM Serif Text","Dosis","Droid Sans","Exo","Fira Code","Fira Sans","Franklin Gothic Medium","Garamond","Geneva","Georgia","Gill Sans","Helvetica","Impact","Inconsolata","Indie Flower","Inter","Josefin Sans","Karla","Lato","Lexend","Lucida Bright","Lucida Console","Lucida Sans Unicode","Manrope","Merriweather","Merriweather Sans","Montserrat","Myriad","Noto Sans","Nunito","Nunito Sans","Open Sans","Optima","Orbitron","Oswald","Pacifico","Palatino","Perpetua","PT Sans","PT Serif","Poppins","Prompt","Public Sans","Quicksand","Rajdhani","Recursive","Roboto","Roboto Condensed","Rockwell","Rubik","Segoe Print","Segoe Script","Segoe UI","Sora","Source Sans Pro","Space Mono","Tahoma","Taviraj","Times","Times New Roman","Titillium Web","Trebuchet MS","Ubuntu","Varela Round","Verdana","Work Sans"],kt=["monospace","sans-serif","serif"];async function ae(t){return _t()}function _t(){return new Promise((t,e)=>{try{z(async({iframe:n})=>{let r=n.createElement("canvas").getContext("2d"),i=kt.map(s=>je(r,s)),a={};Pt.forEach(s=>{let c=je(r,s);i.includes(c)||(a[s]=c)}),t(a)})}catch{e({error:"unsupported"})}})}function je(t,e){if(!t)return null;let n="WwMmLli0Oo";return t.font=`72px ${e}`,t.measureText(n).width}function se(){return new Promise((t,e)=>{let n=navigator.deviceMemory!==void 0?navigator.deviceMemory:0,o=window.performance&&window.performance.memory?window.performance.memory:0;t({videocard:Ot(),architecture:Mt(),deviceMemory:n.toString()||"undefined",jsHeapSizeLimit:o.jsHeapSizeLimit||0})})}function Ot(){let t=document.createElement("canvas"),e=t.getContext("webgl")??t.getContext("experimental-webgl");if(e&&"getParameter"in e)try{let n=(e.getParameter(e.VENDOR)||"").toString(),o=(e.getParameter(e.RENDERER)||"").toString(),r={vendor:n,renderer:o,version:(e.getParameter(e.VERSION)||"").toString(),shadingLanguageVersion:(e.getParameter(e.SHADING_LANGUAGE_VERSION)||"").toString()};if(!o.length||!n.length){let i=e.getExtension("WEBGL_debug_renderer_info");if(i){let a=(e.getParameter(i.UNMASKED_VENDOR_WEBGL)||"").toString(),s=(e.getParameter(i.UNMASKED_RENDERER_WEBGL)||"").toString();a&&(r.vendorUnmasked=a),s&&(r.rendererUnmasked=s)}}return r}catch{}return"undefined"}function Mt(){let t=new Float32Array(1),e=new Uint8Array(t.buffer);return t[0]=1/0,t[0]=t[0]-t[0],e[3]}function ce(){return new Promise(t=>{t({languages:Nt(),timezone:Lt()})})}function Nt(){let t=[];return navigator.language}function Lt(){return Intl.DateTimeFormat().resolvedOptions().timeZone}var Y=(t,e,n,o)=>{let r=(n-e)/o,i=0;for(let a=0;a<o;a++){let s=e+(a+.5)*r;i+=t(s)}return i*r};function ue(){return new Promise(t=>{t({acos:Math.acos(.5),asin:Y(Math.asin,-1,1,97),cos:Y(Math.cos,0,Math.PI,97),largeCos:Math.cos(1e20),largeSin:Math.sin(1e20),largeTan:Math.tan(1e20),sin:Y(Math.sin,-Math.PI,Math.PI,97),tan:Y(Math.tan,0,2*Math.PI,97)})})}function Bt(t){if(t.length===0)return null;let e={};t.forEach(r=>{let i=String(r);e[i]=(e[i]||0)+1});let n=t[0],o=1;return Object.keys(e).forEach(r=>{e[r]>o&&(n=r,o=e[r])}),n}function $e(t,e){let n={};return e.forEach(o=>{let r=t.map(a=>o in a?a[o]:void 0).filter(a=>a!==void 0),i=Bt(r);i&&(n[o]=i)}),n}var Ct=["accelerometer","accessibility","accessibility-events","ambient-light-sensor","background-fetch","background-sync","bluetooth","camera","clipboard-read","clipboard-write","device-info","display-capture","gyroscope","geolocation","local-fonts","magnetometer","microphone","midi","nfc","notifications","payment-handler","persistent-storage","push","speaker","storage-access","top-level-storage-access","window-management","query"];async function me(t){let e=t?.permissions_to_check||Ct,o=await Promise.all(Array.from({length:3},()=>Ut(e)));return $e(o,e)}async function Ut(t){let e={};for(let n of t)try{let o=await navigator.permissions.query({name:n});e[n]=o.state.toString()}catch{}return e}async function le(){let t=[];if(navigator.plugins)for(let e=0;e<navigator.plugins.length;e++){let n=navigator.plugins[e];t.push([n.name,n.filename,n.description].join("|"))}return new Promise(e=>{e({plugins:t})})}function B(){if(typeof navigator>"u")return{name:"unknown",version:"unknown"};let t=navigator.userAgent,e=[/(?<name>SamsungBrowser)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>EdgA|EdgiOS|Edg)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>OPR|OPX)\/(?<version>\d+(?:\.\d+)+)/,/Opera[\s\/](?<version>\d+(?:\.\d+)+)/,/Opera Mini\/(?<version>\d+(?:\.\d+)+)/,/Opera Mobi\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Vivaldi)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Brave)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>CriOS)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>FxiOS)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Chrome|Chromium)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Firefox|Waterfox|Iceweasel|IceCat)\/(?<version>\d+(?:\.\d+)+)/,/Version\/(?<version1>[\d.]+).*Safari\/[\d.]+|(?<name>Safari)\/(?<version2>[\d.]+)/,/(?<name>MSIE|Trident|IEMobile).+?(?<version>\d+(?:\.\d+)+)/,/(?<name>[A-Za-z]+)\/(?<version>\d+(?:\.\d+)+)/],n={edg:"Edge",edga:"Edge",edgios:"Edge",opr:"Opera",opx:"Opera",crios:"Chrome",fxios:"Firefox",samsung:"SamsungBrowser",vivaldi:"Vivaldi",brave:"Brave"};for(let o of e){let r=t.match(o);if(r){let i=r.groups?.name,a=r.groups?.version||r.groups?.version1||r.groups?.version2;if(!i&&(r.groups?.version1||r.groups?.version2)&&(i="Safari"),!i&&o.source.includes("Opera Mini")&&(i="Opera Mini"),!i&&o.source.includes("Opera Mobi")&&(i="Opera Mobi"),!i&&o.source.includes("Opera")&&(i="Opera"),!i&&r[1]&&(i=r[1]),!a&&r[2]&&(a=r[2]),i)return{name:n[i.toLowerCase()]||i,version:a||"unknown"}}}return{name:"unknown",version:"unknown"}}function Q(){if(typeof navigator>"u"||!navigator.userAgent)return!1;let t=navigator.userAgent;return/Mobi|Android|iPhone|iPod|IEMobile|Opera Mini|Opera Mobi|webOS|BlackBerry|Windows Phone/i.test(t)&&!/iPad/i.test(t)}function de(){return new Promise(t=>{let e={is_touchscreen:navigator.maxTouchPoints>0,maxTouchPoints:navigator.maxTouchPoints,colorDepth:screen.colorDepth,mediaMatches:Gt()};Q()&&navigator.maxTouchPoints>0&&(e.resolution=Ft()),t(e)})}function Ft(){let t=window.screen.width,e=window.screen.height,n=Math.max(t,e).toString(),o=Math.min(t,e).toString();return`${n}x${o}`}function Gt(){let t=[],e={"prefers-contrast":["high","more","low","less","forced","no-preference"],"any-hover":["hover","none"],"any-pointer":["none","coarse","fine"],pointer:["none","coarse","fine"],hover:["hover","none"],update:["fast","slow"],"inverted-colors":["inverted","none"],"prefers-reduced-motion":["reduce","no-preference"],"prefers-reduced-transparency":["reduce","no-preference"],scripting:["none","initial-only","enabled"],"forced-colors":["active","none"]};return Object.keys(e).forEach(n=>{e[n].forEach(o=>{matchMedia(`(${n}: ${o})`).matches&&t.push(`${n}: ${o}`)})}),t}function ge(){return new Promise(t=>{let e=B(),n=navigator.userAgent,o={platform:window.navigator.platform,productSub:navigator.productSub,product:navigator.product,useragent:navigator.userAgent,hardwareConcurrency:navigator.hardwareConcurrency,browser:{name:e.name,version:e.version},mobile:Q(),applePayVersion:Vt(),cookieEnabled:window.navigator.cookieEnabled};t(o)})}function Vt(){if(window.location.protocol==="https:"&&typeof window.ApplePaySession=="function")try{let t=window.ApplePaySession.supportsVersion;for(let e=15;e>0;e--)if(t(e))return e}catch{return 0}return 0}var Wt=B().name!=="SamsungBrowser"?1:3,x,m=null;function qt(){typeof document<"u"&&(x=document.createElement("canvas"),x.width=200,x.height=100,m=x.getContext("webgl"))}async function fe(){qt();try{if(!m)throw new Error("WebGL not supported");let t=Array.from({length:Wt},()=>Kt()),e=j(t,x.width,x.height);return{commonPixelsHash:b(e.data.toString()).toString()}}catch{return{webgl:"unsupported"}}}function Kt(){try{if(!m)throw new Error("WebGL not supported");let t=`
1
+ var yt={UNAUTHORIZED:"Unauthorized"},ht={EXPIRED:"EXPIRED_TOKEN",INVALID_API_KEY:"INVALID_API_KEY",MISSING_AUTHENTICATION_TOKEN:"MISSING_AUTHENTICATION_TOKEN"},Se={INTERNAL_SERVER_ERROR:"Internal Server Error during API Request",MISSING_CREDENTIALS:"Missing Public Client ID or Public API Key",MAINTENANCE_MODE:"API Under Maintenance",RATE_LIMIT_REACHED:"Too many requests. Rate limit exceeded"},ke={SDK_INIT_ERROR:"Internal Server Error during SDK Initialization",DUPLICATE_INITIALIZATION:"Multiple SDK Initializations Detected",NOT_INITIALIZED:"SDK Not Initialized"},Pe={INVALID_CREDENTIALS:"Invalid Public Client ID or Public API Key"},_e={FAILED_TO_GET_SECURITY_RESULT:"Failed to Retrieve Security Result"},Oe={FAILED_TO_GET_SECURITY_TOKEN:" Failed to Generate Security Token"},h={...yt,...ht,...Se,...ke,...Pe,..._e,...Oe},Me={...Se,...ke,...Pe,..._e,...Oe};var K=(p=>(p.AR="ar",p.BN="bn",p.DE="de",p.EN="en",p.ES="es",p.FR="fr",p.HI="hi",p.ID="id",p.IT="it",p.JA="ja",p.KO="ko",p.MS="ms",p.NL="nl",p.PT="pt",p.RU="ru",p.YU="yu",p.ZH="zh",p))(K||{}),j=(y=>(y.GeneralConsumer="general-consumer",y.HRManagerDirector="hr-manager-director",y.WebDeveloper="web-developer",y.SoftwareEngineer="software-engineer",y.ITDirector="it-director",y.BusinessAdministrator="business-administrator",y.AccountsPayableManager="accounts-payable-manager",y.Accountant="accountant",y.FinanceDirector="finance-director",y.SmallBusinessOwner="small-business-owner",y.GeneralContractor="general-contractor",y.MarketingManagerDirector="marketing-manager-director",y.ConsumerShopper="consumer-shopper",y.Travel="travel",y.Entertainment="entertainment",y.FinanceAndBanking="finance-and-banking",y.General="general",y.B2BWhiteCollar="b2b-white-collar",y.B2BBlueCollar="b2b-blue-collar",y.Lawyer="lawyer",y))(j||{});var E=[];for(let t=0;t<256;++t)E.push((t+256).toString(16).slice(1));function Ne(t,e=0){return(E[t[e+0]]+E[t[e+1]]+E[t[e+2]]+E[t[e+3]]+"-"+E[t[e+4]]+E[t[e+5]]+"-"+E[t[e+6]]+E[t[e+7]]+"-"+E[t[e+8]]+E[t[e+9]]+"-"+E[t[e+10]]+E[t[e+11]]+E[t[e+12]]+E[t[e+13]]+E[t[e+14]]+E[t[e+15]]).toLowerCase()}var re,wt=new Uint8Array(16);function oe(){if(!re){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");re=crypto.getRandomValues.bind(crypto)}return re(wt)}var It=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),ie={randomUUID:It};function vt(t,e,n){if(ie.randomUUID&&!e&&!t)return ie.randomUUID();t=t||{};let o=t.random??t.rng?.()??oe();if(o.length<16)throw new Error("Random bytes length must be >= 16");if(o[6]=o[6]&15|64,o[8]=o[8]&63|128,e){if(n=n||0,n<0||n+16>e.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);for(let r=0;r<16;++r)e[n+r]=o[r];return e}return Ne(o)}var O=vt;var Le="dtect_security_sdk_state",Ce=typeof window<"u",Be={isLoading:!1,token:"",visitorId:"",projectId:"",questionData:null,clientData:null,aiCheckData:null,aiUsageFlagged:!1},$={state:{...Be},securityKeys:{behaviorKey:"",automationKey:""}};function Ue(){if(!Ce)return $;try{let t=sessionStorage.getItem(Le);if(!t)return $;let e=JSON.parse(t);return e.expiresAt&&e.expiresAt<Date.now()?$:{state:{...Be,...e.state},securityKeys:e.securityKeys||{behaviorKey:"",automationKey:""}}}catch{return $}}function Fe(t){if(Ce)try{let e=Date.now()+864e5,n={...t,expiresAt:e};sessionStorage.setItem(Le,JSON.stringify(n))}catch{}}function Ge(t){return t||O()}var Et="0.1.1",G={...Ue(),monitor:void 0,version:Et};function w(){return G}function S(t){G=t(G),Fe({state:G.state,securityKeys:G.securityKeys})}function M(){let{config:t}=w(),e=t?.endpoint||"https://api.dtect.io/security",n=t?.includeResults?`${e}/client/check/result`:`${e}/client/check`;return{endpoint:e,clientId:t?.clientId,apiKey:t?.apiKey,checkResultEndpoint:n}}async function I(t,e="info",n={}){let o=`${n.endpoint??"https://api.dtect.io/security"}/log`,r={message:t,type:e,payload:n};navigator.sendBeacon(o,JSON.stringify(r))}function N(t){if(t instanceof Error){if(t?.message?.includes("maintenance_mode"))throw new Error(h.MAINTENANCE_MODE);switch(t?.message){default:throw new Error(h.INTERNAL_SERVER_ERROR)}}throw new Error(h.FAILED_TO_GET_SECURITY_TOKEN)}function Ve(t,e){let{state:n,config:o}=w();if(t instanceof Error){if(I(t.message,"error",{function:"init",endpoint:o?.endpoint,error:t,token:n.token,clientId:e.clientId}),t.message.includes("maintenance_mode"))throw new Error(h.MAINTENANCE_MODE);if([h.INVALID_API_KEY,h.UNAUTHORIZED].includes(t.message))throw new Error(h.INVALID_CREDENTIALS)}throw new Error(h.SDK_INIT_ERROR)}function We(t){let e=t?.qbc||!1,n=t?.mas||!1,o=t?.apd||!1,r=t?.scb||null,i=0,a=new Set,s=()=>{a.forEach(g=>g())},c=()=>{e=!1,n=!1,o=!1,r=void 0,i=0},m=()=>{let f=window?.getSelection()?.toString();f&&f.length>0&&(i=Date.now(),e=!0,s())},u=g=>{let f=g.clipboardData?.getData("text"),T=g.target instanceof HTMLInputElement||g.target instanceof HTMLTextAreaElement;f&&T&&(o=!0,s())},d=()=>{n=!0;let g=Date.now();if(i){let f=(g-i)/1e3;(r==null||f<r)&&(r=f)}s()};return document?.addEventListener("copy",m),document?.addEventListener("paste",u),window?.addEventListener("blur",d),{get qbc(){return e},get mas(){return n},get apd(){return o},get scb(){return r},onChange(g){return a.add(g),()=>{a.delete(g)}},reset:c,destroy(){a.clear(),document?.removeEventListener("copy",m),document?.removeEventListener("paste",u),window?.removeEventListener("blur",d)}}}function qe(t){S(e=>{let n=We(null);return{...e,monitor:n,state:{...e.state,isLoading:!0,token:t||"",aiUsageFlagged:!1}}})}function Ke(t){S(e=>({...e,state:{...e.state,isLoading:!1,token:t||""}}))}function L({projectId:t,visitorId:e}){let{state:n,monitor:o}=w();if(n.projectId===t&&n.visitorId===e)return;let r=O();o?.reset(),S(i=>({...i,state:{...i.state,aiCheckData:null,questionData:null,clientData:null,aiUsageFlagged:!1,projectId:t,visitorId:e,token:r}}))}var C={exclude:[],include:[],stabilize:["private","iframe"],logging:!0,timeout:5e3,cache_api_call:!0,performance:!1,experimental:!1},ar={...C},ae={private:[{exclude:["canvas"],browsers:["firefox","safari>=17","brave"]},{exclude:["audio"],browsers:["samsungbrowser","safari"]},{exclude:["fonts"],browsers:["firefox"]},{exclude:["audio.sampleHash","hardware.deviceMemory","header.acceptLanguage.q","system.hardwareConcurrency","plugins"],browsers:["brave"]},{exclude:["tls.extensions"],browsers:["firefox","chrome","safari"]},{exclude:["header.acceptLanguage"],browsers:["edge","chrome"]}],iframe:[{exclude:["system.applePayVersion","system.cookieEnabled"],browsers:["safari"]},{exclude:["permissions"]}],vpn:[{exclude:["ip"]}]};async function se(){return bt()}async function bt(){return new Promise((e,n)=>{try{let i=new(window.OfflineAudioContext||window.webkitOfflineAudioContext)(1,5e3,44100),a=i?.createBufferSource(),s=i.createOscillator();s.frequency.value=1e3;let c=i.createDynamicsCompressor();c.threshold.value=-50,c.knee.value=40,c.ratio.value=12,c.attack.value=0,c.release.value=.2,s.connect(c),c.connect(i.destination),s.start();let m;i.oncomplete=u=>{m=u.renderedBuffer.getChannelData(0),e({sampleHash:Tt(m),maxChannels:i.destination.maxChannelCount,channelCountMode:a.channelCountMode})},i.startRendering()}catch(o){console.error("Error creating audio fingerprint:",o),n(o)}})}function Tt(t){let e=0;for(let n=0;n<t.length;++n)e+=Math.abs(t[n]);return e}function z(t,e,n){let o=[];for(let a=0;a<t[0].data.length;a++){let s=[];for(let c=0;c<t.length;c++)s.push(t[c].data[a]);o.push(Rt(s))}let r=o,i=new Uint8ClampedArray(r);return new ImageData(i,e,n)}function Rt(t){if(t.length===0)return 0;let e={};for(let o of t)e[o]=(e[o]||0)+1;let n=t[0];for(let o in e)e[o]>e[n]&&(n=parseInt(o,10));return n}function xt(t){return new TextEncoder().encode(t).buffer}function Y(t){return t^=t>>>16,t=Math.imul(t,2246822507),t^=t>>>13,t=Math.imul(t,3266489909),t^=t>>>16,t>>>0}var x=new Uint32Array([597399067,2869860233,951274213,2716044179]);function k(t,e){return t<<e|t>>>32-e}function At(t,e){let n=t.byteLength/16|0,o=new Uint32Array(t,0,n*4);for(let r=0;r<n;r++){let i=o.subarray(r*4,(r+1)*4);i[0]=Math.imul(i[0],x[0]),i[0]=k(i[0],15),i[0]=Math.imul(i[0],x[1]),e[0]=e[0]^i[0],e[0]=k(e[0],19),e[0]=e[0]+e[1],e[0]=Math.imul(e[0],5)+1444728091,i[1]=Math.imul(i[1],x[1]),i[1]=k(i[1],16),i[1]=Math.imul(i[1],x[2]),e[1]=e[1]^i[1],e[1]=k(e[1],17),e[1]=e[1]+e[2],e[1]=Math.imul(e[1],5)+197830471,i[2]=Math.imul(i[2],x[2]),i[2]=k(i[2],17),i[2]=Math.imul(i[2],x[3]),e[2]=e[2]^i[2],e[2]=k(e[2],15),e[2]=e[2]+e[3],e[2]=Math.imul(e[2],5)+2530024501,i[3]=Math.imul(i[3],x[3]),i[3]=k(i[3],18),i[3]=Math.imul(i[3],x[0]),e[3]=e[3]^i[3],e[3]=k(e[3],13),e[3]=e[3]+e[0],e[3]=Math.imul(e[3],5)+850148119}}function Dt(t,e){let n=t.byteLength/16|0,o=t.byteLength%16,r=new Uint32Array(4),i=new Uint8Array(t,n*16,o);switch(o){case 15:r[3]=r[3]^i[14]<<16;case 14:r[3]=r[3]^i[13]<<8;case 13:r[3]=r[3]^i[12]<<0,r[3]=Math.imul(r[3],x[3]),r[3]=k(r[3],18),r[3]=Math.imul(r[3],x[0]),e[3]=e[3]^r[3];case 12:r[2]=r[2]^i[11]<<24;case 11:r[2]=r[2]^i[10]<<16;case 10:r[2]=r[2]^i[9]<<8;case 9:r[2]=r[2]^i[8]<<0,r[2]=Math.imul(r[2],x[2]),r[2]=k(r[2],17),r[2]=Math.imul(r[2],x[3]),e[2]=e[2]^r[2];case 8:r[1]=r[1]^i[7]<<24;case 7:r[1]=r[1]^i[6]<<16;case 6:r[1]=r[1]^i[5]<<8;case 5:r[1]=r[1]^i[4]<<0,r[1]=Math.imul(r[1],x[1]),r[1]=k(r[1],16),r[1]=Math.imul(r[1],x[2]),e[1]=e[1]^r[1];case 4:r[0]=r[0]^i[3]<<24;case 3:r[0]=r[0]^i[2]<<16;case 2:r[0]=r[0]^i[1]<<8;case 1:r[0]=r[0]^i[0]<<0,r[0]=Math.imul(r[0],x[0]),r[0]=k(r[0],15),r[0]=Math.imul(r[0],x[1]),e[0]=e[0]^r[0]}}function St(t,e){e[0]=e[0]^t.byteLength,e[1]=e[1]^t.byteLength,e[2]=e[2]^t.byteLength,e[3]=e[3]^t.byteLength,e[0]=e[0]+e[1]|0,e[0]=e[0]+e[2]|0,e[0]=e[0]+e[3]|0,e[1]=e[1]+e[0]|0,e[2]=e[2]+e[0]|0,e[3]=e[3]+e[0]|0,e[0]=Y(e[0]),e[1]=Y(e[1]),e[2]=Y(e[2]),e[3]=Y(e[3]),e[0]=e[0]+e[1]|0,e[0]=e[0]+e[2]|0,e[0]=e[0]+e[3]|0,e[1]=e[1]+e[0]|0,e[2]=e[2]+e[0]|0,e[3]=e[3]+e[0]|0}function b(t,e=0){if(e=e?e|0:0,typeof t=="string"&&(t=xt(t)),!(t instanceof ArrayBuffer))throw new TypeError("Expected key to be ArrayBuffer or string");let n=new Uint32Array([e,e,e,e]);At(t,n),Dt(t,n),St(t,n);let o=new Uint8Array(n.buffer);return Array.from(o).map(r=>r.toString(16).padStart(2,"0")).join("")}var kt=3,je=280,$e=20;async function ce(){return Pt()}function Pt(){return new Promise(t=>{let e=Array.from({length:kt},()=>_t()),n=z(e,je,$e);t({commonPixelsHash:b(n.data.toString()).toString()})})}function _t(){let t=document.createElement("canvas"),e=t.getContext("2d");if(!e)return new ImageData(1,1);t.width=je,t.height=$e;let n=e.createLinearGradient(0,0,t.width,t.height);n.addColorStop(0,"red"),n.addColorStop(1/6,"orange"),n.addColorStop(2/6,"yellow"),n.addColorStop(3/6,"green"),n.addColorStop(4/6,"blue"),n.addColorStop(5/6,"indigo"),n.addColorStop(1,"violet"),e.fillStyle=n,e.fillRect(0,0,t.width,t.height);let o="Random Text WMwmil10Oo";return e.font="23.123px Arial",e.fillStyle="black",e.fillText(o,-5,15),e.fillStyle="rgba(0, 0, 255, 0.5)",e.fillText(o,-3.3,17.7),e.beginPath(),e.moveTo(0,0),e.lineTo(t.width*2/7,t.height),e.strokeStyle="white",e.lineWidth=2,e.stroke(),e.getImageData(0,0,t.width,t.height)}async function Q(t){for(;!document.body;)await Ot(50);let e=document.createElement("iframe");e.setAttribute("frameBorder","0");let n=e.style;n.setProperty("position","fixed"),n.setProperty("display","block","important"),n.setProperty("visibility","visible"),n.setProperty("border","0"),n.setProperty("opacity","0"),e.src="about:blank",document.body.appendChild(e);let o=e.contentDocument||e.contentWindow?.document;if(!o)throw new Error("Iframe document is not accessible");t({iframe:o}),setTimeout(()=>{document.body.removeChild(e)},0)}function Ot(t,e){return new Promise(n=>setTimeout(n,t,e))}var Mt=["Arial","Arial Black","Arial Narrow","Arial Rounded MT","Arimo","Archivo","Barlow","Bebas Neue","Bitter","Bookman","Calibri","Cabin","Candara","Century","Century Gothic","Comic Sans MS","Constantia","Courier","Courier New","Crimson Text","DM Mono","DM Sans","DM Serif Display","DM Serif Text","Dosis","Droid Sans","Exo","Fira Code","Fira Sans","Franklin Gothic Medium","Garamond","Geneva","Georgia","Gill Sans","Helvetica","Impact","Inconsolata","Indie Flower","Inter","Josefin Sans","Karla","Lato","Lexend","Lucida Bright","Lucida Console","Lucida Sans Unicode","Manrope","Merriweather","Merriweather Sans","Montserrat","Myriad","Noto Sans","Nunito","Nunito Sans","Open Sans","Optima","Orbitron","Oswald","Pacifico","Palatino","Perpetua","PT Sans","PT Serif","Poppins","Prompt","Public Sans","Quicksand","Rajdhani","Recursive","Roboto","Roboto Condensed","Rockwell","Rubik","Segoe Print","Segoe Script","Segoe UI","Sora","Source Sans Pro","Space Mono","Tahoma","Taviraj","Times","Times New Roman","Titillium Web","Trebuchet MS","Ubuntu","Varela Round","Verdana","Work Sans"],Nt=["monospace","sans-serif","serif"];async function ue(t){return Lt()}function Lt(){return new Promise((t,e)=>{try{Q(async({iframe:n})=>{let r=n.createElement("canvas").getContext("2d"),i=Nt.map(s=>ze(r,s)),a={};Mt.forEach(s=>{let c=ze(r,s);i.includes(c)||(a[s]=c)}),t(a)})}catch{e({error:"unsupported"})}})}function ze(t,e){if(!t)return null;let n="WwMmLli0Oo";return t.font=`72px ${e}`,t.measureText(n).width}function le(){return new Promise((t,e)=>{let n=navigator.deviceMemory!==void 0?navigator.deviceMemory:0,o=window.performance&&window.performance.memory?window.performance.memory:0;t({videocard:Ct(),architecture:Bt(),deviceMemory:n.toString()||"undefined",jsHeapSizeLimit:o.jsHeapSizeLimit||0})})}function Ct(){let t=document.createElement("canvas"),e=t.getContext("webgl")??t.getContext("experimental-webgl");if(e&&"getParameter"in e)try{let n=(e.getParameter(e.VENDOR)||"").toString(),o=(e.getParameter(e.RENDERER)||"").toString(),r={vendor:n,renderer:o,version:(e.getParameter(e.VERSION)||"").toString(),shadingLanguageVersion:(e.getParameter(e.SHADING_LANGUAGE_VERSION)||"").toString()};if(!o.length||!n.length){let i=e.getExtension("WEBGL_debug_renderer_info");if(i){let a=(e.getParameter(i.UNMASKED_VENDOR_WEBGL)||"").toString(),s=(e.getParameter(i.UNMASKED_RENDERER_WEBGL)||"").toString();a&&(r.vendorUnmasked=a),s&&(r.rendererUnmasked=s)}}return r}catch{}return"undefined"}function Bt(){let t=new Float32Array(1),e=new Uint8Array(t.buffer);return t[0]=1/0,t[0]=t[0]-t[0],e[3]}function me(){return new Promise(t=>{t({languages:Ut(),timezone:Ft()})})}function Ut(){let t=[];return navigator.language}function Ft(){return Intl.DateTimeFormat().resolvedOptions().timeZone}var J=(t,e,n,o)=>{let r=(n-e)/o,i=0;for(let a=0;a<o;a++){let s=e+(a+.5)*r;i+=t(s)}return i*r};function de(){return new Promise(t=>{t({acos:Math.acos(.5),asin:J(Math.asin,-1,1,97),cos:J(Math.cos,0,Math.PI,97),largeCos:Math.cos(1e20),largeSin:Math.sin(1e20),largeTan:Math.tan(1e20),sin:J(Math.sin,-Math.PI,Math.PI,97),tan:J(Math.tan,0,2*Math.PI,97)})})}function Gt(t){if(t.length===0)return null;let e={};t.forEach(r=>{let i=String(r);e[i]=(e[i]||0)+1});let n=t[0],o=1;return Object.keys(e).forEach(r=>{e[r]>o&&(n=r,o=e[r])}),n}function Ye(t,e){let n={};return e.forEach(o=>{let r=t.map(a=>o in a?a[o]:void 0).filter(a=>a!==void 0),i=Gt(r);i&&(n[o]=i)}),n}var Vt=["accelerometer","accessibility","accessibility-events","ambient-light-sensor","background-fetch","background-sync","bluetooth","camera","clipboard-read","clipboard-write","device-info","display-capture","gyroscope","geolocation","local-fonts","magnetometer","microphone","midi","nfc","notifications","payment-handler","persistent-storage","push","speaker","storage-access","top-level-storage-access","window-management","query"];async function ge(t){let e=t?.permissions_to_check||Vt,o=await Promise.all(Array.from({length:3},()=>Wt(e)));return Ye(o,e)}async function Wt(t){let e={};for(let n of t)try{let o=await navigator.permissions.query({name:n});e[n]=o.state.toString()}catch{}return e}async function fe(){let t=[];if(navigator.plugins)for(let e=0;e<navigator.plugins.length;e++){let n=navigator.plugins[e];t.push([n.name,n.filename,n.description].join("|"))}return new Promise(e=>{e({plugins:t})})}function B(){if(typeof navigator>"u")return{name:"unknown",version:"unknown"};let t=navigator.userAgent,e=[/(?<name>SamsungBrowser)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>EdgA|EdgiOS|Edg)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>OPR|OPX)\/(?<version>\d+(?:\.\d+)+)/,/Opera[\s\/](?<version>\d+(?:\.\d+)+)/,/Opera Mini\/(?<version>\d+(?:\.\d+)+)/,/Opera Mobi\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Vivaldi)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Brave)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>CriOS)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>FxiOS)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Chrome|Chromium)\/(?<version>\d+(?:\.\d+)+)/,/(?<name>Firefox|Waterfox|Iceweasel|IceCat)\/(?<version>\d+(?:\.\d+)+)/,/Version\/(?<version1>[\d.]+).*Safari\/[\d.]+|(?<name>Safari)\/(?<version2>[\d.]+)/,/(?<name>MSIE|Trident|IEMobile).+?(?<version>\d+(?:\.\d+)+)/,/(?<name>[A-Za-z]+)\/(?<version>\d+(?:\.\d+)+)/],n={edg:"Edge",edga:"Edge",edgios:"Edge",opr:"Opera",opx:"Opera",crios:"Chrome",fxios:"Firefox",samsung:"SamsungBrowser",vivaldi:"Vivaldi",brave:"Brave"};for(let o of e){let r=t.match(o);if(r){let i=r.groups?.name,a=r.groups?.version||r.groups?.version1||r.groups?.version2;if(!i&&(r.groups?.version1||r.groups?.version2)&&(i="Safari"),!i&&o.source.includes("Opera Mini")&&(i="Opera Mini"),!i&&o.source.includes("Opera Mobi")&&(i="Opera Mobi"),!i&&o.source.includes("Opera")&&(i="Opera"),!i&&r[1]&&(i=r[1]),!a&&r[2]&&(a=r[2]),i)return{name:n[i.toLowerCase()]||i,version:a||"unknown"}}}return{name:"unknown",version:"unknown"}}function X(){if(typeof navigator>"u"||!navigator.userAgent)return!1;let t=navigator.userAgent;return/Mobi|Android|iPhone|iPod|IEMobile|Opera Mini|Opera Mobi|webOS|BlackBerry|Windows Phone/i.test(t)&&!/iPad/i.test(t)}function pe(){return new Promise(t=>{let e={is_touchscreen:navigator.maxTouchPoints>0,maxTouchPoints:navigator.maxTouchPoints,colorDepth:screen.colorDepth,mediaMatches:Kt()};X()&&navigator.maxTouchPoints>0&&(e.resolution=qt()),t(e)})}function qt(){let t=window.screen.width,e=window.screen.height,n=Math.max(t,e).toString(),o=Math.min(t,e).toString();return`${n}x${o}`}function Kt(){let t=[],e={"prefers-contrast":["high","more","low","less","forced","no-preference"],"any-hover":["hover","none"],"any-pointer":["none","coarse","fine"],pointer:["none","coarse","fine"],hover:["hover","none"],update:["fast","slow"],"inverted-colors":["inverted","none"],"prefers-reduced-motion":["reduce","no-preference"],"prefers-reduced-transparency":["reduce","no-preference"],scripting:["none","initial-only","enabled"],"forced-colors":["active","none"]};return Object.keys(e).forEach(n=>{e[n].forEach(o=>{matchMedia(`(${n}: ${o})`).matches&&t.push(`${n}: ${o}`)})}),t}function ye(){return new Promise(t=>{let e=B(),n=navigator.userAgent,o={platform:window.navigator.platform,productSub:navigator.productSub,product:navigator.product,useragent:navigator.userAgent,hardwareConcurrency:navigator.hardwareConcurrency,browser:{name:e.name,version:e.version},mobile:X(),applePayVersion:jt(),cookieEnabled:window.navigator.cookieEnabled};t(o)})}function jt(){if(window.location.protocol==="https:"&&typeof window.ApplePaySession=="function")try{let t=window.ApplePaySession.supportsVersion;for(let e=15;e>0;e--)if(t(e))return e}catch{return 0}return 0}var $t=B().name!=="SamsungBrowser"?1:3,A,l=null;function zt(){typeof document<"u"&&(A=document.createElement("canvas"),A.width=200,A.height=100,l=A.getContext("webgl"))}async function he(){zt();try{if(!l)throw new Error("WebGL not supported");let t=Array.from({length:$t},()=>Yt()),e=z(t,A.width,A.height);return{commonPixelsHash:b(e.data.toString()).toString()}}catch{return{webgl:"unsupported"}}}function Yt(){try{if(!l)throw new Error("WebGL not supported");let t=`
2
2
  attribute vec2 position;
3
3
  void main() {
4
4
  gl_Position = vec4(position, 0.0, 1.0);
@@ -8,4 +8,4 @@ var dt={UNAUTHORIZED:"Unauthorized"},gt={EXPIRED:"EXPIRED_TOKEN",INVALID_API_KEY
8
8
  void main() {
9
9
  gl_FragColor = vec4(0.812, 0.195, 0.553, 0.921); // Set line color
10
10
  }
11
- `,n=m.createShader(m.VERTEX_SHADER),o=m.createShader(m.FRAGMENT_SHADER);if(!n||!o)throw new Error("Failed to create shaders");if(m.shaderSource(n,t),m.shaderSource(o,e),m.compileShader(n),!m.getShaderParameter(n,m.COMPILE_STATUS))throw new Error("Vertex shader compilation failed: "+m.getShaderInfoLog(n));if(m.compileShader(o),!m.getShaderParameter(o,m.COMPILE_STATUS))throw new Error("Fragment shader compilation failed: "+m.getShaderInfoLog(o));let r=m.createProgram();if(!r)throw new Error("Failed to create shader program");if(m.attachShader(r,n),m.attachShader(r,o),m.linkProgram(r),!m.getProgramParameter(r,m.LINK_STATUS))throw new Error("Shader program linking failed: "+m.getProgramInfoLog(r));m.useProgram(r);let i=137,a=new Float32Array(i*4),s=2*Math.PI/i;for(let g=0;g<i;g++){let w=g*s;a[g*4]=0,a[g*4+1]=0,a[g*4+2]=Math.cos(w)*(x.width/2),a[g*4+3]=Math.sin(w)*(x.height/2)}let c=m.createBuffer();m.bindBuffer(m.ARRAY_BUFFER,c),m.bufferData(m.ARRAY_BUFFER,a,m.STATIC_DRAW);let d=m.getAttribLocation(r,"position");m.enableVertexAttribArray(d),m.vertexAttribPointer(d,2,m.FLOAT,!1,0,0),m.viewport(0,0,x.width,x.height),m.clearColor(0,0,0,1),m.clear(m.COLOR_BUFFER_BIT),m.drawArrays(m.LINES,0,i*2);let u=new Uint8ClampedArray(x.width*x.height*4);return m.readPixels(0,0,x.width,x.height,m.RGBA,m.UNSIGNED_BYTE,u),new ImageData(u,x.width,x.height)}catch{return new ImageData(1,1)}finally{m&&(m.bindBuffer(m.ARRAY_BUFFER,null),m.useProgram(null),m.viewport(0,0,m.drawingBufferWidth,m.drawingBufferHeight),m.clearColor(0,0,0,0))}}function D(t){let e=[];return function n(o){if(o&&o.toJSON&&typeof o.toJSON=="function"&&(o=o.toJSON()),o===void 0)return;if(typeof o=="number")return isFinite(o)?""+o:"null";if(typeof o!="object")return JSON.stringify(o);let r,i;if(Array.isArray(o)){for(i="[",r=0;r<o.length;r++)r&&(i+=","),i+=n(o[r])||"null";return i+"]"}if(o===null)return"null";if(e.indexOf(o)!==-1)throw new TypeError("Converting circular structure to JSON");let a=e.push(o)-1,s=Object.keys(o).sort();for(i="",r=0;r<s.length;r++){let c=s[r],d=n(o[c]);d&&(i&&(i+=","),i+=JSON.stringify(c)+":"+d)}return e.splice(a,1),"{"+i+"}"}(t)||""}async function pe(){return new Promise(t=>{try{let e=window.RTCPeerConnection||window.webkitRTCPeerConnection||window.mozRTCPeerConnection;if(!e){t({supported:!1,error:"WebRTC not supported"});return}let n={iceCandidatePoolSize:1,iceServers:[]},o=new e(n);o.createDataChannel(""),(async()=>{try{let i={offerToReceiveAudio:!0,offerToReceiveVideo:!0},a=await o.createOffer(i);await o.setLocalDescription(a);let s=a.sdp||"",c=[...new Set((s.match(/extmap:\d+ [^\n\r]+/g)||[]).map(I=>I.replace(/extmap:\d+ /,"")))].sort(),d=I=>{let T=s.match(new RegExp(`m=${I} [^\\s]+ [^\\s]+ ([^\\n\\r]+)`));return T?T[1].split(" "):[]},u=(I,T)=>T.map(f=>{let k=new RegExp(`(rtpmap|fmtp|rtcp-fb):${f} (.+)`,"g"),_=[...s.matchAll(k)];if(!_.length)return null;let p={};return _.forEach(lt=>{let[En,X,Z]=lt,H=Z.split("/");X==="rtpmap"?(p.mimeType=`${I}/${H[0]}`,p.clockRate=+H[1],I==="audio"&&(p.channels=+H[2]||1)):X==="rtcp-fb"?(p.feedbackSupport=p.feedbackSupport||[],p.feedbackSupport.push(Z)):X==="fmtp"&&(p.sdpFmtpLine=Z)}),p}).filter(Boolean),l=u("audio",d("audio")),g=u("video",d("video")),w={audio:{count:l.length,hash:b(D(l))},video:{count:g.length,hash:b(D(g))},extensionsHash:b(D(c))},S=await new Promise(I=>{let T=setTimeout(()=>{o.removeEventListener("icecandidate",f),o.close(),I({supported:!0,...w,timeout:!0})},3e3),f=k=>{let _=k.candidate;!_||!_.candidate||(clearTimeout(T),o.removeEventListener("icecandidate",f),o.close(),I({supported:!0,...w,candidateType:_.type||""}))};o.addEventListener("icecandidate",f)});t({details:S,hash:b(D(S))})}catch(i){o.close(),t({supported:!0,error:`WebRTC offer failed: ${i.message}`})}})()}catch(e){t({supported:!1,error:`WebRTC error: ${e.message}`})}})}var ze=["\u{1D504}","\u{1D505}","\u212D","\u{1D507}","\u{1D508}","\u{1D509}","\u{1D538}","\u{1D539}","\u2102","\u{1D53B}","\u{1D53C}","\u{1D53D}"],Ye=["\u03B2","\u03C8","\u03BB","\u03B5","\u03B6","\u03B1","\u03BE","\u03BC","\u03C1","\u03C6","\u03BA","\u03C4","\u03B7","\u03C3","\u03B9","\u03C9","\u03B3","\u03BD","\u03C7","\u03B4","\u03B8","\u03C0","\u03C5","\u03BF"];async function ye(){return new Promise(t=>{try{z(async({iframe:e})=>{try{if(!jt(e)){t({supported:!1,error:"MathML not supported"});return}let n=[G("integral","<msubsup><mo>\u222B</mo><mi>a</mi><mi>b</mi></msubsup><mfrac><mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mrow><mi>g</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mfrac><mi>dx</mi>"),G("fraction","<mfrac><mrow><mi>\u03C0</mi><mo>\xD7</mo><msup><mi>r</mi><mn>2</mn></msup></mrow><mrow><mn>2</mn><mi>\u03C3</mi></mrow></mfrac>"),G("matrix","<mo>[</mo><mtable><mtr><mtd><mi>\u03B1</mi></mtd><mtd><mi>\u03B2</mi></mtd></mtr><mtr><mtd><mi>\u03B3</mi></mtd><mtd><mi>\u03B4</mi></mtd></mtr></mtable><mo>]</mo>"),$t(),...zt()],o=[],r="";n.forEach((a,s)=>{let c=Yt(a,e);o.push({width:c.dimensions.width,height:c.dimensions.height}),s===0&&c.fontInfo&&(r=b(D(c.fontInfo)))});let i={fontStyleHash:r,dimensions:o};t({details:i,hash:b(D(i))})}catch(n){t({supported:!1,error:`MathML error: ${n.message}`})}})}catch(e){t({supported:!1,error:`MathML error: ${e.message}`})}})}function jt(t){try{let e=t.createElement("math");e.innerHTML="<mrow><mi>x</mi></mrow>",e.style.position="absolute",e.style.visibility="hidden",t.body.appendChild(e);let n=e.getBoundingClientRect();return t.body.removeChild(e),n.width>0&&n.height>0}catch{return!1}}function G(t,e){return`<math><mrow>${e}</mrow></math>`}function $t(){let t="<mo>\u220F</mo>";return ze.forEach((e,n)=>{let o=n*2,r=Ye.slice(o,o+2);r.length===2&&(t+=`<mmultiscripts><mi>${e}</mi><none/><mi>${r[1]}</mi><mprescripts></mprescripts><mi>${r[0]}</mi><none/></mmultiscripts>`)}),G("complex_nested",`<munderover><mmultiscripts>${t}</mmultiscripts></munderover>`)}function zt(){let t=[];return ze.forEach((e,n)=>{let o=n*2,r=Ye.slice(o,o+2);r.length===2&&t.push(G("combined",`<mmultiscripts><mi>${e}</mi><none/><mi>${r[1]}</mi><mprescripts></mprescripts><mi>${r[0]}</mi><none/></mmultiscripts>`))}),t}function Yt(t,e){try{let n=e.createElement("math");n.innerHTML=t.replace(/<\/?math>/g,""),n.style.whiteSpace="nowrap",n.style.position="absolute",n.style.visibility="hidden",n.style.top="-9999px",e.body.appendChild(n);let o=n.getBoundingClientRect(),i=(e.defaultView||window).getComputedStyle(n),a={dimensions:{width:o.width,height:o.height},fontInfo:{fontFamily:i.fontFamily,fontSize:i.fontSize,fontWeight:i.fontWeight,fontStyle:i.fontStyle,lineHeight:i.lineHeight,fontVariant:i.fontVariant||"normal",fontStretch:i.fontStretch||"normal",fontSizeAdjust:i.fontSizeAdjust||"none",textRendering:i.textRendering||"auto",fontFeatureSettings:i.fontFeatureSettings||"normal",fontVariantNumeric:i.fontVariantNumeric||"normal",fontKerning:i.fontKerning||"auto"}};return e.body.removeChild(n),a}catch(n){return{error:n.message}}}var Qt=800;async function he(){return new Promise(t=>{try{if(typeof window>"u"||!window.speechSynthesis||typeof window.speechSynthesis.getVoices!="function"){t({supported:!1,error:"Speech Synthesis API not supported"});return}let e=!1,n=null,o=a=>{if(!e){e=!0,n&&clearTimeout(n);try{let s=a.map(d=>{let u=g=>g.replace(/\\/g,"\\\\").replace(/,/g,"\\,");return[u(d.voiceURI||""),u(d.name||""),u(d.lang||""),d.localService?"1":"0",d.default?"1":"0"].join(",")});s.sort();let c={voiceCount:a.length,voicesHash:b(D(s))};t({details:c,hash:b(D(c))})}catch(s){t({supported:!0,error:`Voice processing failed: ${s.message}`})}}},r=window.speechSynthesis.getVoices();if(r.length>0){o(r);return}n=setTimeout(()=>{let a=window.speechSynthesis.getVoices();o(a)},Qt);let i=()=>{window.speechSynthesis.removeEventListener("voiceschanged",i);let a=window.speechSynthesis.getVoices();o(a)};window.speechSynthesis.addEventListener("voiceschanged",i)}catch(e){t({supported:!1,error:`Speech Synthesis error: ${e.message}`})}})}var Qe={audio:oe,canvas:ie,fonts:ae,hardware:se,locales:ce,math:ue,permissions:me,plugins:le,screen:de,system:ge,webgl:fe},Je={webrtc:pe,mathml:ye,speech:he},we={},Xe={timeout:"true"},Ie=(t,e,n)=>{we[t]=e};function Jt(t,e){return new Promise(n=>{setTimeout(()=>n(e),t)})}function Ze(t,e,n){return Promise.all(t.map(o=>{let r=performance.now();return Promise.race([o.then(i=>({value:i,elapsed:performance.now()-r})),Jt(e,n).then(i=>({value:i,elapsed:performance.now()-r}))])}))}function J(t,e){let n=B();if(n.name==="unknown"&&t.system&&typeof t.system=="object"&&!Array.isArray(t.system)){let l=t.system.browser;if(l&&typeof l=="object"&&!Array.isArray(l)){let g=l;n={name:g.name||"unknown",version:g.version||"unknown"}}}let o=n.name.toLowerCase(),r=n.version.split(".")[0]||"0",i=parseInt(r,10),a=[...e?.exclude||[]],s=e?.stabilize||[],c=e?.include||[];for(let u of s){let l=re[u];if(l)for(let g of l){let w=!("browsers"in g),S=!w&&g.browsers?.some(I=>{let T=I.match(/(.+?)(>=)(\d+)/);if(T){let[,f,,k]=T,_=parseInt(k,10);return o===f&&i>=_}return o===I});(w||S)&&a.push(...g.exclude)}}function d(u,l=""){let g={};for(let[w,S]of Object.entries(u)){let I=l?`${l}.${w}`:w;if(typeof S=="object"&&!Array.isArray(S)&&S!==null){let T=d(S,I);Object.keys(T).length>0&&(g[w]=T)}else{let T=a.some(k=>I.startsWith(k)),f=c.some(k=>I.startsWith(k));(!T||f)&&(g[w]=S)}}return g}return d(t)}async function ve(t){let e={...L,...t},n=e.logging&&!sessionStorage.getItem("_tmjs_l")&&Math.random()<1e-4,o={...Qe,...we},{elapsed:r,resolvedComponents:i}=await He(o,e),a={},s={};if(n||e.experimental){let{elapsed:T,resolvedComponents:f}=await He(Je,e);a=f,s=T}let c={...r,...s},d=e.performance?{elapsed:c}:{},u=J({},e),l={...i,...u},g={};return{thumbmark:b(D(l)),components:l,info:g,version:"",...d,...Object.keys(a).length>0&&e.experimental&&{experimental:a}}}async function He(t,e){let n={...L,...e},o=Object.entries(t).filter(([u])=>!n?.exclude?.includes(u)).filter(([u])=>n?.include?.some(l=>l.includes("."))?n?.include?.some(l=>l.startsWith(u)):n?.include?.length===0||n?.include?.includes(u)),r=o.map(([u])=>u),i=o.map(([u,l])=>l(e)),a=await Ze(i,n?.timeout||5e3,Xe),s={},c={};a.forEach((u,l)=>{u.value!=null&&(c[r[l]]=u.value,s[r[l]]=u.elapsed??0)});let d=J(c,n);return{elapsed:s,resolvedComponents:d}}var V=class{options;constructor(e){this.options={...L,...e}}async get(e){let n={...this.options,...e};return ve(n)}getVersion(){return""}includeComponent(e,n){Ie(e,n)}};var Xt=(t,e={})=>({"Content-Type":"application/json",...t?.accessToken&&{Authorization:`Bearer ${t?.accessToken}`},...e}),Zt=async(t,e)=>{if(!t.ok){let n=await t.text();throw new Error(n)}return e==="file"?t.blob():e==="json"?t.json():e==="text"?t.text():null},et=async({url:t,auth:e,body:n,method:o="GET",headers:r={},responseType:i="json"})=>{let a={method:o,headers:Xt(e,r),...n?{body:n instanceof FormData?n:JSON.stringify(n)}:{}},s=await fetch(t,a);return Zt(s,i)},tt=t=>et({...t,method:"GET"}),C=t=>et({...t,method:"POST"});var Ht=[{name:"lowCpuCores",weight:2,async check(){let t=navigator.hardwareConcurrency||0,e=t>0&&t<=2;return{value:t,triggered:e}}},{name:"lowDeviceMemory",weight:0,async check(){let t=navigator.deviceMemory||0,e=t>0&&t<=4;return{value:t,triggered:e}}},{name:"platformMismatch",weight:1,async check(){let t=navigator.userAgent||"",e=navigator.platform||"",n=t.includes("Mac")&&e.includes("Linux")||t.includes("Win")&&e.includes("Mac")||e===""||e==="Unknown";return{value:e,triggered:n}}},{name:"webglSoftwareRenderer",weight:4,async check(){let t=null,e=null,n=!1;try{let o=document.createElement("canvas"),r=o.getContext("webgl")||o.getContext("experimental-webgl");if(r){let i=r.getExtension("WEBGL_debug_renderer_info");if(i){t=r.getParameter(i.UNMASKED_VENDOR_WEBGL)||"",e=r.getParameter(i.UNMASKED_RENDERER_WEBGL)||"";let a=e.toLowerCase(),s=t.toLowerCase();n=a.includes("swiftshader")||a.includes("llvmpipe")||a.includes("softwar")||a.includes("basic render")||a.includes("vmware")||a.includes("virtualbox")||s.includes("vmware")||s.includes("parallels")}}}catch{}return{value:{vendor:t,renderer:e},triggered:n}}},{name:"missingWebGPUAdapter",weight:3,async check(){if(!("gpu"in navigator))return{value:"no WebGPU",triggered:!0};try{let t=await navigator.gpu.requestAdapter();return{value:t?"adapter-present":"adapter-null",triggered:!t}}catch{return{value:"adapter-error",triggered:!0}}}},{name:"reducedTimerPrecision",weight:1,async check(){let t=performance.now();await new Promise(o=>setTimeout(o,50));let e=performance.now()-t,n=e<30||e>80;return{value:e.toFixed(2),triggered:n}}},{name:"timerJitter",weight:0,async check(){let t=[];for(let n=0;n<10;n++){let o=performance.now();await new Promise(i=>setTimeout(i,10));let r=performance.now();t.push(r-o)}let e=Math.sqrt(t.map(n=>(n-10)**2).reduce((n,o)=>n+o)/t.length);return{value:e.toFixed(3),triggered:e>5}}},{name:"audioFingerprint",weight:1,async check(){try{let t=new(window.OfflineAudioContext||window.webkitOfflineAudioContext)(1,44100,44100),e=t.createOscillator();e.frequency.value=440,e.connect(t.destination),e.start(0);let o=(await t.startRendering()).getChannelData(0).reduce((r,i)=>r+Math.abs(i),0);return{value:o,triggered:o<100}}catch{return{value:"audio-error",triggered:!0}}}},{name:"canvasEntropy",weight:1,async check(){try{let t=document.createElement("canvas"),e=t.getContext("2d");e.textBaseline="top",e.font="14px 'Arial'",e.fillText("VM CHECK",2,2);let o=[...t.toDataURL()].reduce((r,i)=>(r+i.charCodeAt(0))%9999999,0);return{value:o,triggered:o===0||o===999999}}catch{return{value:"canvas-error",triggered:!0}}}},{name:"windowSizeWeird",weight:1,async check(){let t=window.innerWidth/window.innerHeight,e=t===1.333||t===1.6;return{value:t.toFixed(2),triggered:e}}},{name:"touchMismatch",weight:1,async check(){let t="ontouchstart"in window,e=navigator.maxTouchPoints||0;return{value:{hasTouch:t,maxTouch:e},triggered:t&&e===0}}},{name:"batteryVirtualized",weight:1,async check(){if(!navigator.getBattery)return{value:"no API",triggered:!0};try{let t=await navigator.getBattery(),e=t.chargingTime===0&&t.dischargingTime===1/0;return{value:{chargingTime:t.chargingTime,dischargingTime:t.dischargingTime},triggered:e}}catch{return{value:"battery-error",triggered:!0}}}},{name:"permissionsWeird",weight:0,async check(){try{let t=await navigator.permissions.query({name:"camera"});return{value:t.state,triggered:t.state==="prompt"}}catch{return{value:"perm-error",triggered:!0}}}},{name:"noMediaDevices",weight:1,async check(){try{let t=await navigator.mediaDevices.enumerateDevices();return{value:t.length,triggered:t.length===0}}catch{return{value:"media-error",triggered:!0}}}},{name:"virtualizedMediaDevices",weight:1,async check(){try{let t=await navigator.mediaDevices.enumerateDevices(),e=t.some(n=>n.label.toLowerCase().includes("virtual"));return{value:t.map(n=>n.label),triggered:e}}catch{return{value:"media-error",triggered:!0}}}},{name:"webrtcIpPattern",weight:2,async check(){return new Promise(t=>{try{let e=new RTCPeerConnection({iceServers:[]});e.createDataChannel("x");let n=setTimeout(()=>{e.close(),t({value:"timeout",triggered:!1})},3e3);e.onicecandidate=o=>{if(!o?.candidate){clearTimeout(n),e.close(),t({value:"no candidate",triggered:!1});return}let r=o.candidate.candidate.toLowerCase();clearTimeout(n),e.close(),t({value:r,triggered:r.includes("10.0.2.")||r.includes("172.16.")||r.includes("192.168.56.")})},e.createOffer().then(o=>e.setLocalDescription(o))}catch{t({value:"rtc-error",triggered:!1})}})}},{name:"gpuAccelerationDisabled",weight:3,async check(){let e=document.createElement("canvas").getContext("webgl");return{value:!!e,triggered:!e}}},{name:"noWebGL2",weight:3,async check(){let t=document.createElement("canvas").getContext("webgl2");return{value:!!t,triggered:!t}}},{name:"lowStorageQuota",weight:1,async check(){try{let t=await navigator.storage.estimate();return{value:t.quota,triggered:(t.quota??0)<524288e3}}catch{return{value:"storage-error",triggered:!0}}}},{name:"lowEntropy",weight:1,async check(){let t=Object.keys(navigator).length+Object.keys(screen).length+Object.keys(window).length;return{value:t,triggered:t<200}}},{name:"noLanguages",weight:1,async check(){let t=navigator.languages||[];return{value:t,triggered:t.length===0}}},{name:"uaEntropyLow",weight:1,async check(){let t=navigator.userAgent;return{value:t,triggered:t.length<30}}},{name:"weirdDPI",weight:2,async check(){let t=window.devicePixelRatio;return{value:t,triggered:t===1}}}],en=[{name:"tamperingPluginMismatch",penalty:3,async check(){try{let t=navigator.userAgent.toLowerCase(),e=(t.includes("chrome")||t.includes("edg"))&&!t.includes("firefox")&&!t.includes("safari"),n=navigator.plugins?.length??0,o=!e&&n>0;return{value:{pluginCount:n,isChromeLike:e},triggered:o}}catch{return{value:"error",triggered:!1}}}},{name:"tamperingWebglNoise",penalty:1,async check(){try{let t=document.createElement("canvas");t.width=16,t.height=16;let e=t.getContext("webgl");if(!e)return{value:"no-webgl",triggered:!1};e.clearColor(.1,.2,.3,1),e.clear(e.COLOR_BUFFER_BIT);let n=new Uint8Array(16*16*4);e.readPixels(0,0,16,16,e.RGBA,e.UNSIGNED_BYTE,n);let o=new Set(n).size;return{value:{uniqueValues:o},triggered:o>4}}catch{return{value:"error",triggered:!1}}}},{name:"tamperingServiceWorkerBlocked",penalty:1,async check(){let t=!("serviceWorker"in navigator);return{value:{serviceWorkerAvailable:!t},triggered:t}}},{name:"permissionsWeirdAntiVM",penalty:2,async check(){try{let t=await navigator.permissions.query({name:"camera"});return{value:t.state,triggered:t.state==="prompt"}}catch{return{value:"error",triggered:!1}}}}];async function nt({threshold:t=4}={}){let e={},n=0;for(let r of Ht)try{let i=await r.check();e[r.name]={...i,weight:r.weight},i.triggered&&r.weight>0&&(n+=r.weight)}catch{e[r.name]={value:"error",triggered:!1,weight:r.weight}}let o=n;for(let r of en)try{let i=await r.check();e[r.name]={...i,penalty:r.penalty},i.triggered&&(n-=r.penalty)}catch{e[r.name]={value:"error",triggered:!1,penalty:r.penalty}}return{isLikelyVM:n>=t,score:n,rawScore:o,threshold:t,signals:e}}var tn=[{name:"hookedFunctionToString",weight:2,async check(){let t=Function.prototype.toString.toString(),e=Function.prototype.toString+"";return{value:{native:t,current:e},triggered:t!==e}}},{name:"navigatorProxyTrap",weight:2,async check(){let t=!1;try{let e=Object.getOwnPropertyDescriptor(window,"navigator");e&&e.get&&e.get.toString()?.includes("[native code]")===!1&&(t=!0)}catch{}return{value:"navigator getter",triggered:t}}},{name:"uaMismatch",weight:2,async check(){let t=navigator.userAgent||"",e="";try{let o=await navigator.userAgentData?.getHighEntropyValues?.(["platform","brands"]);e=JSON.stringify(o)}catch{}let n=t?.includes("Mac")&&e?.includes("Windows")||t?.includes("Win")&&e?.includes("Mac")||e&&e.length>0&&!t;return{value:{ua:t,brandInfo:e},triggered:n}}},{name:"timezoneLocaleMismatch",weight:1,async check(){let t=Intl.DateTimeFormat().resolvedOptions().timeZone,e=navigator.language||"",n=e.startsWith("en")&&t==="Asia/Shanghai"||e.startsWith("zh")&&t==="America/New_York"||t===void 0;return{value:{tz:t,lang:e},triggered:n}}},{name:"canvasNoise",weight:2,async check(){let t=()=>{let r=document.createElement("canvas"),i=r.getContext("2d");return i.textBaseline="top",i.font="14px Arial",i.fillText("anti-detect-check",2,2),r.toDataURL()},e=t(),n=t();return{value:{a:e,b:n},triggered:e!==n}}},{name:"webglNoise",weight:-2,async check(){try{let e=document.createElement("canvas").getContext("webgl");if(!e)return{value:"no-webgl",triggered:!0};let n=e.getExtension("WEBGL_debug_renderer_info");if(!n)return{value:"no-debug-extension",triggered:!1};let o=e.getParameter(n.UNMASKED_VENDOR_WEBGL),r=e.getParameter(n.UNMASKED_RENDERER_WEBGL),i=o===""||r===""||o?.includes(" ")===!1||r?.includes(" ")===!1;return{value:{v:o,r},triggered:i}}catch{return{value:"gl-error",triggered:!0}}}},{name:"webdriverFlag",weight:3,async check(){let t=navigator.webdriver===!0;return{value:navigator.webdriver,triggered:t}}},{name:"perfectEventTiming",weight:-3,async check(){let t=performance.now();return{value:t,triggered:t%1===0}}},{name:"serviceWorkerBlocked",weight:-4,async check(){let t=!("serviceWorker"in navigator);return{value:t,triggered:t}}},{name:"smallQuota",weight:2,async check(){try{let t=await navigator.storage.estimate(),e=t.quota<50*1024*1024;return{value:t.quota,triggered:e}}catch{return{value:"quota-error",triggered:!0}}}},{name:"indexedDbBlocked",weight:2,async check(){try{let t=indexedDB.open("tamper-check");return await new Promise(e=>{t.onerror=()=>e({value:"error",triggered:!0}),t.onsuccess=()=>e({value:"ok",triggered:!1})})}catch{return{value:"throw",triggered:!0}}}},{name:"screenDprMismatch",weight:0,async check(){let t=window.screen.width,e=window.screen.height,n=window.devicePixelRatio,o=t===1920&&n===1&&e===1080||n%1!==0&&n%1!==.5;return{value:{w:t,h:e,dpr:n},triggered:o}}},{name:"missingCommonFonts",weight:1,async check(){return{value:"skipped",triggered:!1}}},{name:"noMediaDevices",weight:1,async check(){try{let t=await navigator.mediaDevices.enumerateDevices();return{value:t.length,triggered:t.length===0}}catch{return{value:"error",triggered:!0}}}},{name:"languagesEmpty",weight:1,async check(){let t=navigator.languages||[];return{value:t,triggered:t.length===0}}},{name:"pluginMismatch",weight:-4,async check(){try{let t=navigator.plugins.length;return{value:t,triggered:t===0}}catch{return{value:"error",triggered:!0}}}},{name:"devtoolsDetected",weight:-2,async check(){return new Promise(async t=>{let e={viewportBreakpoint:!1,consoleSpeed:!1},n=160,o=window.outerWidth-window.innerWidth,r=window.outerHeight-window.innerHeight;(o>n||r>n)&&(e.viewportBreakpoint=!0);async function i(s=50){return new Promise(c=>{let d=performance.now();console.log("%c ","font-size:3000px");let u=performance.now();c(u-d>s)})}e.consoleSpeed=await i();let a=Object.values(e).some(Boolean);setTimeout(()=>{t({value:a,triggered:a})},50)})}},{name:"knownAntiDetectBrowser",weight:5,async check(){let t=navigator.userAgent.toLowerCase(),n=["incogniton","multilogin","morelogin","adspect","kameleo","goLogin"].some(o=>t?.includes(o));return{value:t,triggered:n}}},{name:"batteryVirtualized",weight:4,async check(){try{let t=await navigator.getBattery(),e=t.chargingTime,n=t.dischargingTime;return{value:{chargingTime:e,dischargingTime:n},triggered:e===0}}catch{return{value:"no-battery-api",triggered:!1}}}},{name:"permissionDenied",weight:4,async check(){try{let t=await navigator.permissions.query({name:"notifications"}),e=t.state==="denied";return{value:t.state,triggered:e}}catch{return{value:"perm-error",triggered:!1}}}}];async function rt({anomalyMin:t=.52,anomalyMax:e=.54}={}){let n={},o=0;for(let l of tn){let g=await l.check();n[l.name]=g,g.triggered&&(o+=l.weight)}let r=navigator?.platform||"",i=(navigator?.userAgent||"").toLowerCase(),a=r.toLowerCase().includes("win"),s=n.batteryVirtualized?.triggered||!1,c=n.permissionDenied?.triggered||!1,d=!a&&r!==""&&s&&c,u=Math.min(1,Math.max(0,o)/15);return{result:d&&u>=t&&u<=e||n.knownAntiDetectBrowser?.triggered,anomalyScore:u,score:o,signals:n}}function nn(){let t=0;try{0 .toFixed(-1)}catch(e){t=e.message.length}return t}function rn(){let t=navigator.userAgent,e=nn();return e===44||e===43?"Safari":e===51?"Chrome":e===25?"Firefox":navigator.msSaveBlob!==void 0?"MSIE":t.match(/Chrome/)?navigator.brave!==void 0?"Brave":t.includes("Edg")?"Edge":t.includes("OPR")?"Opera":"Chrome":"Unknown"}var on=[{name:"safari_currentStorageTest",weight:2,browser:"Safari",async check(){if(typeof navigator.storage?.getDirectory!="function")return{triggered:!1,value:"unsupported"};try{return await navigator.storage.getDirectory(),{triggered:!1,value:"ok"}}catch(t){let e=t?.message??String(t);return{triggered:e.includes("unknown transient reason"),value:e}}}},{name:"safari13to18_indexedDbBlobTest",weight:2,browser:"Safari",async check(){return await new Promise(t=>{let e=String(Math.random()),n=indexedDB.open(e,1);n.onupgradeneeded=o=>{let r=o.target.result;try{r.createObjectStore("t",{autoIncrement:!0}).put(new Blob),t({triggered:!1,value:"ok"})}catch(i){let a=i?.message??String(i);t({triggered:a.includes("are not yet supported"),value:a})}finally{r.close(),indexedDB.deleteDatabase(e)}},n.onerror=()=>t({triggered:!1,value:"idb-error"})})}},{name:"safari_oldWebkitTest",weight:1,browser:"Safari",async check(){let t=window.openDatabase,e=window.localStorage;try{t(null,null,null,null)}catch{return{triggered:!0,value:"openDatabase denied"}}try{e.setItem("test","1"),e.removeItem("test")}catch{return{triggered:!0,value:"localStorage denied"}}return{triggered:!1,value:"ok"}}},{name:"chrome_storageQuotaPrivateTest",weight:2,browser:"Chrome",async check(){return await new Promise((t,e)=>{let o=window?.performance?.memory?.jsHeapSizeLimit??1073741824;navigator.webkitTemporaryStorage.queryUsageAndQuota((r,i)=>{let a=Math.round(i/1048576),s=Math.round(o/(1024*1024))*2;t({triggered:a<s,value:{quotaMB:a,limitMB:s}})},r=>e(r))})}},{name:"chrome_oldFileSystemTest",weight:1,browser:"Chrome",async check(){let t=window.webkitRequestFileSystem;return t?await new Promise(e=>t(0,1,()=>e({triggered:!1,value:"ok"}),()=>e({triggered:!0,value:"denied"}))):{triggered:!1,value:"unsupported"}}},{name:"firefox_storageDirectoryTest",weight:2,browser:"Firefox",async check(){if(typeof navigator.storage?.getDirectory!="function")return{triggered:!1,value:"unsupported"};try{return await navigator.storage.getDirectory(),{triggered:!1,value:"ok"}}catch(t){let e=t?.message??String(t);return{triggered:e.includes("Security error"),value:e}}}},{name:"firefox_indexedDbInvalidStateTest",weight:1,browser:"Firefox",async check(){return await new Promise(t=>{let e=indexedDB.open("inPrivate");e.onerror=()=>{t({triggered:e.error?.name==="InvalidStateError",value:e.error?.name})},e.onsuccess=()=>{indexedDB.deleteDatabase("inPrivate"),t({triggered:!1,value:"ok"})}})}},{name:"msie_indexedDbMissing",weight:2,browser:"MSIE",async check(){return{triggered:window.indexedDB===void 0,value:"msie-idb-check"}}}];async function ot(){let t=rn(),e={},n=0;for(let o of on){if(o.browser!==t)continue;let r=await o.check();e[o.name]=r,r.triggered&&(n+=o.weight)}return{isPrivate:n>0,browserName:t,score:n,signals:e}}typeof window<"u"&&(window.detectIncognito=ot);var it=ot;var at=[{name:"globalPrivacyControl",weight:3,async check(){let t=navigator.globalPrivacyControl;return{triggered:t===!0,value:t}}},{name:"doNotTrack",weight:1,async check(){let t=navigator.doNotTrack;return{triggered:t==="1",value:t}}},{name:"cookiesDisabled",weight:3,async check(){let t=navigator.cookieEnabled;return{triggered:t===!1,value:t}}},{name:"thirdPartyCookiesBlocked",weight:3,async check(){try{if("hasStorageAccess"in document&&!await document.hasStorageAccess())try{return await document.requestStorageAccess(),{triggered:!1,value:"access_granted"}}catch{return{triggered:!0,value:"access_denied"}}let t=`__dtect_3p_test_${Date.now()}`;document.cookie=`${t}=1; SameSite=None; Secure`;let e=document.cookie.includes(t);return document.cookie=`${t}=; expires=Thu, 01 Jan 1970 00:00:00 GMT`,{triggered:!1,value:e?"cookies_work":"may_be_blocked"}}catch(t){return{triggered:!1,value:`error: ${t?.message}`}}}},{name:"firefoxResistFingerprinting",weight:2,async check(){let t=[],e=new Date().getTimezoneOffset();e===0&&Intl.DateTimeFormat().resolvedOptions().timeZone==="UTC"&&t.push("timezone_utc");let n=navigator.hardwareConcurrency;n===2&&t.push("cores_capped");let o=window.screen.width,r=window.screen.height,i=window.innerWidth,a=window.innerHeight;o===i&&r===a&&t.push("screen_matches_inner");let s=window.matchMedia("(prefers-reduced-motion: reduce)").matches;return{triggered:t.length>=2,value:{signals:t,timezoneOffset:e,cores:n,prefersReducedMotion:s}}}},{name:"braveShields",weight:3,async check(){if(!(navigator.brave!==void 0))return{triggered:!1,value:"not_brave"};try{if(!await navigator.brave.isBrave())return{triggered:!1,value:"brave_check_false"};let o=document.createElement("canvas").getContext("2d");if(o){o.fillStyle="rgb(255, 0, 0)",o.fillRect(0,0,1,1);let r=o.getImageData(0,0,1,1).data;o.fillRect(0,0,1,1);let i=o.getImageData(0,0,1,1).data;if(r[0]!==i[0]||r[1]!==i[1]||r[2]!==i[2])return{triggered:!0,value:"shields_active_canvas"}}try{let r=new RTCPeerConnection({iceServers:[{urls:"stun:stun.l.google.com:19302"}]});if(r.createDataChannel(""),await new Promise(a=>{let s=setTimeout(()=>{r.close(),a(!1)},1e3);r.onicecandidate=c=>{c.candidate?.candidate&&(/([0-9]{1,3}\.){3}[0-9]{1,3}/.test(c.candidate.candidate)||(clearTimeout(s),r.close(),a(!0)))},r.createOffer().then(c=>r.setLocalDescription(c))}))return{triggered:!0,value:"shields_active_webrtc"}}catch{return{triggered:!0,value:"shields_active_webrtc_blocked"}}return{triggered:!0,value:"brave_detected_shields_default"}}catch(e){return{triggered:!1,value:`error: ${e?.message}`}}}}];async function st(){let t={},e=0,n=await Promise.allSettled(at.map(async o=>{let r=await o.check();return{name:o.name,weight:o.weight,result:r}}));for(let o of n)if(o.status==="fulfilled"){let{name:r,weight:i,result:a}=o.value;t[r]=a,a.triggered&&(e+=i)}else{let r=n.indexOf(o),i=at[r];i&&(t[i.name]={triggered:!1,value:`check_failed: ${o.reason}`})}return{isPrivacyEnabled:e>3,score:e,signals:t}}typeof window<"u"&&(window.detectPrivacy=st);var ct=st;function an(t){let e=t?.projectId,n=t?.visitorId||O();return(typeof t?.projectId=="number"||typeof t?.visitorId=="number")&&(e=`${t?.projectId}`,n=`${t?.visitorId}`),{visitorId:n,projectId:e}}function U(t){let{projectId:e,visitorId:n}=an(t);return{projectId:e,visitorId:n}}async function sn(){let t=new V,[e,n,o,r,i]=await Promise.allSettled([t.get(),nt(),rt(),it(),ct()]);return{deviceRes:e,vmDtectResults:n,tamperingDtectResults:o,incognitoDtectResults:r,privacySettingsDtectResults:i}}function cn(t,e){return{entryLink:window?.location?.href,securitySettings:t.securitySettings,metaData:t.metaData,vmDtectResults:e?.vmDtectResults?.value,tamperingDtectResults:e?.tamperingDtectResults?.value,incognitoDtectResults:e?.incognitoDtectResults?.value,deviceIdResults:e?.deviceRes?.value,privacySettingsDtectResults:e?.privacySettingsDtectResults?.value}}function un(t,e,n,o){let r=(performance.now()-e).toFixed();E(`${t} finishes in ${r}ms`,"info",{function:t,endpoint:n?.endpoint,diff:r,token:o,clientId:n?.clientId})}function mn(t,e,n,o,r){let i=(performance.now()-e).toFixed();E(`${t} error`,"error",{function:t,endpoint:n?.endpoint,error:r,diff:i,token:o,clientId:n?.clientId})}async function ut(t,e){let n=performance.now(),{state:o,config:r,version:i}=h(),{projectId:a,visitorId:s}=U(t);if(!t||!a?.trim())throw new Error(y.FAILED_TO_GET_SECURITY_RESULT);let c=a!==o.projectId?O():o.token;try{let d=await sn(),u=cn(t,d),l={...t,projectId:a,visitorId:s,clientData:u,version:i,token:c,questionData:o.questionData,aiCheckData:o.aiCheckData},g=await C({url:e,body:l,headers:{"client-id":r?.clientId||"","x-api-key":r?.apiKey||""}});if(!("token"in g||"results"in g))throw new Error(y.INTERNAL_SERVER_ERROR);return P(w=>({...w,state:{...w.state,token:c,visitorId:s,projectId:a,clientData:u}})),un("getResultBase",n,r,c),g}catch(d){mn("getResultBase",n,r,c,d),N(d)}}async function Ee(t){let{endpoint:e}=M();if(t)return ut(t,`${e}/client/check/result`)}async function be(t){let{endpoint:e}=M();return ut(t,`${e}/client/check`)}async function Te(t){let e=performance.now(),{state:n,config:o,monitor:r,version:i}=h(),{checkResultEndpoint:a}=M(),{visitorId:s,projectId:c}=U(t),d={timeTakenSeconds:t.timeTakenSeconds,qbc:t.qbc||r?.qbc,mas:t.mas||r?.mas,scb:t.scb||r?.scb,apd:t.apd||r?.apd};try{let u=await C({url:a,headers:{"client-id":o?.clientId||"","x-api-key":o?.apiKey||""},body:{token:n.token,visitorId:s,projectId:c,version:i,clientData:n.clientData,questionData:n.questionData,aiCheckData:d}});if(!u)throw new Error(y.INTERNAL_SERVER_ERROR);P(g=>({...g,state:{...g.state,aiCheckData:d,visitorId:s,projectId:c}}));let l=(performance.now()-e).toFixed();return E(`isAIUsageDetected finishes in ${l}ms`,"info",{endpoint:o?.endpoint,diff:l,token:n.token,clientId:o?.clientId}),u}catch(u){let l=(performance.now()-e).toFixed();E("isAIUsageDetected error","error",{endpoint:o?.endpoint,error:u,diff:l,token:n.token,clientId:o?.clientId}),N(u)}}async function Re(t){let e=performance.now(),{state:n,config:o}=h(),{respondentType:r,language:i}=t;try{let a=await tt({url:`${o?.endpoint}/client/quality-questions/${r}/${i}`,headers:{"client-id":o?.clientId||"","x-api-key":o?.apiKey||""}});if(!a)throw new Error(y.INTERNAL_SERVER_ERROR);let s=(performance.now()-e).toFixed();return E(`getQualityQuestions finishes in ${s}ms`,"info",{function:"getQualityQuestions",endpoint:o?.endpoint,diff:s,token:n.token,clientId:o?.clientId}),a}catch(a){let s=(performance.now()-e).toFixed();E("getQualityQuestions error","error",{endpoint:o?.endpoint,error:a,diff:s,token:n.token,clientId:o?.clientId}),N(a)}}async function xe(t){let e=performance.now(),{state:n,config:o,version:r}=h(),{checkResultEndpoint:i}=M(),{visitorId:a,projectId:s}=U(t),c=n.questionData||{questions:t.questions};try{let d=await C({url:i,headers:{"client-id":o?.clientId||"","x-api-key":o?.apiKey||""},body:{token:n.token,visitorId:a,projectId:s,version:r,questionData:c,aiCheckData:n.aiCheckData,clientData:n.clientData}});if(!d)throw new Error(y.INTERNAL_SERVER_ERROR);P(l=>({...l,state:{...l.state,questionData:c,visitorId:a,projectId:s}}));let u=(performance.now()-e).toFixed();return E(`checkQualityQuestions finishes in ${u}ms`,"info",{function:"checkQualityQuestions",endpoint:o?.endpoint,diff:u,token:n.token,clientId:o?.clientId}),d}catch(d){let u=(performance.now()-e).toFixed();E("checkQualityQuestions error","error",{endpoint:o?.endpoint,error:d,diff:u,token:n.token,clientId:o?.clientId}),N(d)}}var mt,ln=_e;function Mi(){let{config:t}=h();return!!(t?.clientId&&t?.apiKey)}function dn(t){let{config:e}=h();if(!t?.clientId||!t?.apiKey)throw E(y.MISSING_CREDENTIALS,"error",{endpoint:e?.endpoint,...t}),new Error(y.MISSING_CREDENTIALS)}function gn(){let{config:t}=h();return!!(t?.clientId&&t.apiKey)}function fn(t){let{config:e}=h();if(!gn())throw E(y.MISSING_CREDENTIALS,"error",{endpoint:e?.endpoint,...t}),new Error(y.MISSING_CREDENTIALS)}function pn(t){return{clientId:t.clientId,apiKey:t.apiKey,endpoint:t.endpoint||"https://api.dtect.io/security",includeResults:t.includeResults}}function yn(t){let e=t.endpoint,n=t.includeResults?`${e}/client/check/result`:`${e}/client/check`;return{...t,checkResultEndpoint:n}}function hn(t){let e=yn(t);P(n=>({...n,config:e}))}function wn(){let{state:t}=h();if(t.isLoading)throw new Error(y.DUPLICATE_INITIALIZATION)}async function In(t){let{state:e,config:n}=h(),r=(performance.now()-t).toFixed();return E(`init() finishes ${r}ms`,"info",{endpoint:n?.endpoint,function:"init",diff:r,token:e.token,clientId:n?.clientId}),{getSecurityResult:Ee,getSecurityToken:be,SecurityAPIError:ln,isAIUsageDetected:Te,checkQualityQuestions:xe,getQualityQuestions:Re,LanguageCodes:W,QualityQuestionsRespondentTypes:q}}async function vn(t){let{state:e}=h(),n=performance.now();dn(t);let o=pn(t);hn(o),fn(t);let r=Ue(e.token);wn(),Ve(r);try{return await In(n)}catch(i){Fe(i,o)}finally{We(r)}}mt={init:vn,getSecurityResult:Ee,getSecurityToken:be,isAIUsageDetected:Te,checkQualityQuestions:xe,getQualityQuestions:Re,QualityQuestionsRespondentTypes:q,LanguageCodes:W};var Ni=mt;export{W as LanguageCodes,q as QualityQuestionsRespondentTypes,ln as SecurityAPIError,xe as checkQualityQuestions,Ni as default,Re as getQualityQuestions,Ee as getSecurityResult,be as getSecurityToken,Mi as hasCredentials,vn as init,Te as isAIUsageDetected};
11
+ `,n=l.createShader(l.VERTEX_SHADER),o=l.createShader(l.FRAGMENT_SHADER);if(!n||!o)throw new Error("Failed to create shaders");if(l.shaderSource(n,t),l.shaderSource(o,e),l.compileShader(n),!l.getShaderParameter(n,l.COMPILE_STATUS))throw new Error("Vertex shader compilation failed: "+l.getShaderInfoLog(n));if(l.compileShader(o),!l.getShaderParameter(o,l.COMPILE_STATUS))throw new Error("Fragment shader compilation failed: "+l.getShaderInfoLog(o));let r=l.createProgram();if(!r)throw new Error("Failed to create shader program");if(l.attachShader(r,n),l.attachShader(r,o),l.linkProgram(r),!l.getProgramParameter(r,l.LINK_STATUS))throw new Error("Shader program linking failed: "+l.getProgramInfoLog(r));l.useProgram(r);let i=137,a=new Float32Array(i*4),s=2*Math.PI/i;for(let g=0;g<i;g++){let f=g*s;a[g*4]=0,a[g*4+1]=0,a[g*4+2]=Math.cos(f)*(A.width/2),a[g*4+3]=Math.sin(f)*(A.height/2)}let c=l.createBuffer();l.bindBuffer(l.ARRAY_BUFFER,c),l.bufferData(l.ARRAY_BUFFER,a,l.STATIC_DRAW);let m=l.getAttribLocation(r,"position");l.enableVertexAttribArray(m),l.vertexAttribPointer(m,2,l.FLOAT,!1,0,0),l.viewport(0,0,A.width,A.height),l.clearColor(0,0,0,1),l.clear(l.COLOR_BUFFER_BIT),l.drawArrays(l.LINES,0,i*2);let u=new Uint8ClampedArray(A.width*A.height*4);return l.readPixels(0,0,A.width,A.height,l.RGBA,l.UNSIGNED_BYTE,u),new ImageData(u,A.width,A.height)}catch{return new ImageData(1,1)}finally{l&&(l.bindBuffer(l.ARRAY_BUFFER,null),l.useProgram(null),l.viewport(0,0,l.drawingBufferWidth,l.drawingBufferHeight),l.clearColor(0,0,0,0))}}function D(t){let e=[];return function n(o){if(o&&o.toJSON&&typeof o.toJSON=="function"&&(o=o.toJSON()),o===void 0)return;if(typeof o=="number")return isFinite(o)?""+o:"null";if(typeof o!="object")return JSON.stringify(o);let r,i;if(Array.isArray(o)){for(i="[",r=0;r<o.length;r++)r&&(i+=","),i+=n(o[r])||"null";return i+"]"}if(o===null)return"null";if(e.indexOf(o)!==-1)throw new TypeError("Converting circular structure to JSON");let a=e.push(o)-1,s=Object.keys(o).sort();for(i="",r=0;r<s.length;r++){let c=s[r],m=n(o[c]);m&&(i&&(i+=","),i+=JSON.stringify(c)+":"+m)}return e.splice(a,1),"{"+i+"}"}(t)||""}async function we(){return new Promise(t=>{try{let e=window.RTCPeerConnection||window.webkitRTCPeerConnection||window.mozRTCPeerConnection;if(!e){t({supported:!1,error:"WebRTC not supported"});return}let n={iceCandidatePoolSize:1,iceServers:[]},o=new e(n);o.createDataChannel(""),(async()=>{try{let i={offerToReceiveAudio:!0,offerToReceiveVideo:!0},a=await o.createOffer(i);await o.setLocalDescription(a);let s=a.sdp||"",c=[...new Set((s.match(/extmap:\d+ [^\n\r]+/g)||[]).map(v=>v.replace(/extmap:\d+ /,"")))].sort(),m=v=>{let R=s.match(new RegExp(`m=${v} [^\\s]+ [^\\s]+ ([^\\n\\r]+)`));return R?R[1].split(" "):[]},u=(v,R)=>R.map(p=>{let P=new RegExp(`(rtpmap|fmtp|rtcp-fb):${p} (.+)`,"g"),_=[...s.matchAll(P)];if(!_.length)return null;let y={};return _.forEach(pt=>{let[Rn,ee,te]=pt,ne=te.split("/");ee==="rtpmap"?(y.mimeType=`${v}/${ne[0]}`,y.clockRate=+ne[1],v==="audio"&&(y.channels=+ne[2]||1)):ee==="rtcp-fb"?(y.feedbackSupport=y.feedbackSupport||[],y.feedbackSupport.push(te)):ee==="fmtp"&&(y.sdpFmtpLine=te)}),y}).filter(Boolean),d=u("audio",m("audio")),g=u("video",m("video")),f={audio:{count:d.length,hash:b(D(d))},video:{count:g.length,hash:b(D(g))},extensionsHash:b(D(c))},T=await new Promise(v=>{let R=setTimeout(()=>{o.removeEventListener("icecandidate",p),o.close(),v({supported:!0,...f,timeout:!0})},3e3),p=P=>{let _=P.candidate;!_||!_.candidate||(clearTimeout(R),o.removeEventListener("icecandidate",p),o.close(),v({supported:!0,...f,candidateType:_.type||""}))};o.addEventListener("icecandidate",p)});t({details:T,hash:b(D(T))})}catch(i){o.close(),t({supported:!0,error:`WebRTC offer failed: ${i.message}`})}})()}catch(e){t({supported:!1,error:`WebRTC error: ${e.message}`})}})}var Qe=["\u{1D504}","\u{1D505}","\u212D","\u{1D507}","\u{1D508}","\u{1D509}","\u{1D538}","\u{1D539}","\u2102","\u{1D53B}","\u{1D53C}","\u{1D53D}"],Je=["\u03B2","\u03C8","\u03BB","\u03B5","\u03B6","\u03B1","\u03BE","\u03BC","\u03C1","\u03C6","\u03BA","\u03C4","\u03B7","\u03C3","\u03B9","\u03C9","\u03B3","\u03BD","\u03C7","\u03B4","\u03B8","\u03C0","\u03C5","\u03BF"];async function Ie(){return new Promise(t=>{try{Q(async({iframe:e})=>{try{if(!Qt(e)){t({supported:!1,error:"MathML not supported"});return}let n=[V("integral","<msubsup><mo>\u222B</mo><mi>a</mi><mi>b</mi></msubsup><mfrac><mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mrow><mi>g</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mfrac><mi>dx</mi>"),V("fraction","<mfrac><mrow><mi>\u03C0</mi><mo>\xD7</mo><msup><mi>r</mi><mn>2</mn></msup></mrow><mrow><mn>2</mn><mi>\u03C3</mi></mrow></mfrac>"),V("matrix","<mo>[</mo><mtable><mtr><mtd><mi>\u03B1</mi></mtd><mtd><mi>\u03B2</mi></mtd></mtr><mtr><mtd><mi>\u03B3</mi></mtd><mtd><mi>\u03B4</mi></mtd></mtr></mtable><mo>]</mo>"),Jt(),...Xt()],o=[],r="";n.forEach((a,s)=>{let c=Zt(a,e);o.push({width:c.dimensions.width,height:c.dimensions.height}),s===0&&c.fontInfo&&(r=b(D(c.fontInfo)))});let i={fontStyleHash:r,dimensions:o};t({details:i,hash:b(D(i))})}catch(n){t({supported:!1,error:`MathML error: ${n.message}`})}})}catch(e){t({supported:!1,error:`MathML error: ${e.message}`})}})}function Qt(t){try{let e=t.createElement("math");e.innerHTML="<mrow><mi>x</mi></mrow>",e.style.position="absolute",e.style.visibility="hidden",t.body.appendChild(e);let n=e.getBoundingClientRect();return t.body.removeChild(e),n.width>0&&n.height>0}catch{return!1}}function V(t,e){return`<math><mrow>${e}</mrow></math>`}function Jt(){let t="<mo>\u220F</mo>";return Qe.forEach((e,n)=>{let o=n*2,r=Je.slice(o,o+2);r.length===2&&(t+=`<mmultiscripts><mi>${e}</mi><none/><mi>${r[1]}</mi><mprescripts></mprescripts><mi>${r[0]}</mi><none/></mmultiscripts>`)}),V("complex_nested",`<munderover><mmultiscripts>${t}</mmultiscripts></munderover>`)}function Xt(){let t=[];return Qe.forEach((e,n)=>{let o=n*2,r=Je.slice(o,o+2);r.length===2&&t.push(V("combined",`<mmultiscripts><mi>${e}</mi><none/><mi>${r[1]}</mi><mprescripts></mprescripts><mi>${r[0]}</mi><none/></mmultiscripts>`))}),t}function Zt(t,e){try{let n=e.createElement("math");n.innerHTML=t.replace(/<\/?math>/g,""),n.style.whiteSpace="nowrap",n.style.position="absolute",n.style.visibility="hidden",n.style.top="-9999px",e.body.appendChild(n);let o=n.getBoundingClientRect(),i=(e.defaultView||window).getComputedStyle(n),a={dimensions:{width:o.width,height:o.height},fontInfo:{fontFamily:i.fontFamily,fontSize:i.fontSize,fontWeight:i.fontWeight,fontStyle:i.fontStyle,lineHeight:i.lineHeight,fontVariant:i.fontVariant||"normal",fontStretch:i.fontStretch||"normal",fontSizeAdjust:i.fontSizeAdjust||"none",textRendering:i.textRendering||"auto",fontFeatureSettings:i.fontFeatureSettings||"normal",fontVariantNumeric:i.fontVariantNumeric||"normal",fontKerning:i.fontKerning||"auto"}};return e.body.removeChild(n),a}catch(n){return{error:n.message}}}var Ht=800;async function ve(){return new Promise(t=>{try{if(typeof window>"u"||!window.speechSynthesis||typeof window.speechSynthesis.getVoices!="function"){t({supported:!1,error:"Speech Synthesis API not supported"});return}let e=!1,n=null,o=a=>{if(!e){e=!0,n&&clearTimeout(n);try{let s=a.map(m=>{let u=g=>g.replace(/\\/g,"\\\\").replace(/,/g,"\\,");return[u(m.voiceURI||""),u(m.name||""),u(m.lang||""),m.localService?"1":"0",m.default?"1":"0"].join(",")});s.sort();let c={voiceCount:a.length,voicesHash:b(D(s))};t({details:c,hash:b(D(c))})}catch(s){t({supported:!0,error:`Voice processing failed: ${s.message}`})}}},r=window.speechSynthesis.getVoices();if(r.length>0){o(r);return}n=setTimeout(()=>{let a=window.speechSynthesis.getVoices();o(a)},Ht);let i=()=>{window.speechSynthesis.removeEventListener("voiceschanged",i);let a=window.speechSynthesis.getVoices();o(a)};window.speechSynthesis.addEventListener("voiceschanged",i)}catch(e){t({supported:!1,error:`Speech Synthesis error: ${e.message}`})}})}var Xe={audio:se,canvas:ce,fonts:ue,hardware:le,locales:me,math:de,permissions:ge,plugins:fe,screen:pe,system:ye,webgl:he},Ze={webrtc:we,mathml:Ie,speech:ve},Ee={},He={timeout:"true"},be=(t,e,n)=>{Ee[t]=e};function en(t,e){return new Promise(n=>{setTimeout(()=>n(e),t)})}function et(t,e,n){return Promise.all(t.map(o=>{let r=performance.now();return Promise.race([o.then(i=>({value:i,elapsed:performance.now()-r})),en(e,n).then(i=>({value:i,elapsed:performance.now()-r}))])}))}function Z(t,e){let n=B();if(n.name==="unknown"&&t.system&&typeof t.system=="object"&&!Array.isArray(t.system)){let d=t.system.browser;if(d&&typeof d=="object"&&!Array.isArray(d)){let g=d;n={name:g.name||"unknown",version:g.version||"unknown"}}}let o=n.name.toLowerCase(),r=n.version.split(".")[0]||"0",i=parseInt(r,10),a=[...e?.exclude||[]],s=e?.stabilize||[],c=e?.include||[];for(let u of s){let d=ae[u];if(d)for(let g of d){let f=!("browsers"in g),T=!f&&g.browsers?.some(v=>{let R=v.match(/(.+?)(>=)(\d+)/);if(R){let[,p,,P]=R,_=parseInt(P,10);return o===p&&i>=_}return o===v});(f||T)&&a.push(...g.exclude)}}function m(u,d=""){let g={};for(let[f,T]of Object.entries(u)){let v=d?`${d}.${f}`:f;if(typeof T=="object"&&!Array.isArray(T)&&T!==null){let R=m(T,v);Object.keys(R).length>0&&(g[f]=R)}else{let R=a.some(P=>v.startsWith(P)),p=c.some(P=>v.startsWith(P));(!R||p)&&(g[f]=T)}}return g}return m(t)}async function Te(t){let e={...C,...t},n=e.logging&&!sessionStorage.getItem("_tmjs_l")&&Math.random()<1e-4,o={...Xe,...Ee},{elapsed:r,resolvedComponents:i}=await tt(o,e),a={},s={};if(n||e.experimental){let{elapsed:R,resolvedComponents:p}=await tt(Ze,e);a=p,s=R}let c={...r,...s},m=e.performance?{elapsed:c}:{},u=Z({},e),d={...i,...u},g={};return{thumbmark:b(D(d)),components:d,info:g,version:"",...m,...Object.keys(a).length>0&&e.experimental&&{experimental:a}}}async function tt(t,e){let n={...C,...e},o=Object.entries(t).filter(([u])=>!n?.exclude?.includes(u)).filter(([u])=>n?.include?.some(d=>d.includes("."))?n?.include?.some(d=>d.startsWith(u)):n?.include?.length===0||n?.include?.includes(u)),r=o.map(([u])=>u),i=o.map(([u,d])=>d(e)),a=await et(i,n?.timeout||5e3,He),s={},c={};a.forEach((u,d)=>{u.value!=null&&(c[r[d]]=u.value,s[r[d]]=u.elapsed??0)});let m=Z(c,n);return{elapsed:s,resolvedComponents:m}}var W=class{options;constructor(e){this.options={...C,...e}}async get(e){let n={...this.options,...e};return Te(n)}getVersion(){return""}includeComponent(e,n){be(e,n)}};var tn=(t,e={})=>({"Content-Type":"application/json",...t?.accessToken&&{Authorization:`Bearer ${t?.accessToken}`},...e}),nn=async(t,e)=>{if(!t.ok){let n=await t.text();throw new Error(n)}return e==="file"?t.blob():e==="json"?t.json():e==="text"?t.text():null},nt=async({url:t,auth:e,body:n,method:o="GET",headers:r={},responseType:i="json"})=>{let a={method:o,headers:tn(e,r),...n?{body:n instanceof FormData?n:JSON.stringify(n)}:{}},s=await fetch(t,a);return nn(s,i)},rt=t=>nt({...t,method:"GET"}),U=t=>nt({...t,method:"POST"});var rn=[{name:"lowCpuCores",weight:2,async check(){let t=navigator.hardwareConcurrency||0,e=t>0&&t<=2;return{value:t,triggered:e}}},{name:"lowDeviceMemory",weight:0,async check(){let t=navigator.deviceMemory||0,e=t>0&&t<=4;return{value:t,triggered:e}}},{name:"platformMismatch",weight:1,async check(){let t=navigator.userAgent||"",e=navigator.platform||"",n=t.includes("Mac")&&e.includes("Linux")||t.includes("Win")&&e.includes("Mac")||e===""||e==="Unknown";return{value:e,triggered:n}}},{name:"webglSoftwareRenderer",weight:4,async check(){let t=null,e=null,n=!1;try{let o=document.createElement("canvas"),r=o.getContext("webgl")||o.getContext("experimental-webgl");if(r){let i=r.getExtension("WEBGL_debug_renderer_info");if(i){t=r.getParameter(i.UNMASKED_VENDOR_WEBGL)||"",e=r.getParameter(i.UNMASKED_RENDERER_WEBGL)||"";let a=e.toLowerCase(),s=t.toLowerCase();n=a.includes("swiftshader")||a.includes("llvmpipe")||a.includes("softwar")||a.includes("basic render")||a.includes("vmware")||a.includes("virtualbox")||s.includes("vmware")||s.includes("parallels")}}}catch{}return{value:{vendor:t,renderer:e},triggered:n}}},{name:"missingWebGPUAdapter",weight:3,async check(){if(!("gpu"in navigator))return{value:"no WebGPU",triggered:!0};try{let t=await navigator.gpu.requestAdapter();return{value:t?"adapter-present":"adapter-null",triggered:!t}}catch{return{value:"adapter-error",triggered:!0}}}},{name:"reducedTimerPrecision",weight:1,async check(){let t=performance.now();await new Promise(o=>setTimeout(o,50));let e=performance.now()-t,n=e<30||e>80;return{value:e.toFixed(2),triggered:n}}},{name:"timerJitter",weight:0,async check(){let t=[];for(let n=0;n<10;n++){let o=performance.now();await new Promise(i=>setTimeout(i,10));let r=performance.now();t.push(r-o)}let e=Math.sqrt(t.map(n=>(n-10)**2).reduce((n,o)=>n+o)/t.length);return{value:e.toFixed(3),triggered:e>5}}},{name:"audioFingerprint",weight:1,async check(){try{let t=new(window.OfflineAudioContext||window.webkitOfflineAudioContext)(1,44100,44100),e=t.createOscillator();e.frequency.value=440,e.connect(t.destination),e.start(0);let o=(await t.startRendering()).getChannelData(0).reduce((r,i)=>r+Math.abs(i),0);return{value:o,triggered:o<100}}catch{return{value:"audio-error",triggered:!0}}}},{name:"canvasEntropy",weight:1,async check(){try{let t=document.createElement("canvas"),e=t.getContext("2d");e.textBaseline="top",e.font="14px 'Arial'",e.fillText("VM CHECK",2,2);let o=[...t.toDataURL()].reduce((r,i)=>(r+i.charCodeAt(0))%9999999,0);return{value:o,triggered:o===0||o===999999}}catch{return{value:"canvas-error",triggered:!0}}}},{name:"windowSizeWeird",weight:1,async check(){let t=window.innerWidth/window.innerHeight,e=t===1.333||t===1.6;return{value:t.toFixed(2),triggered:e}}},{name:"touchMismatch",weight:1,async check(){let t="ontouchstart"in window,e=navigator.maxTouchPoints||0;return{value:{hasTouch:t,maxTouch:e},triggered:t&&e===0}}},{name:"batteryVirtualized",weight:1,async check(){if(!navigator.getBattery)return{value:"no API",triggered:!0};try{let t=await navigator.getBattery(),e=t.chargingTime===0&&t.dischargingTime===1/0;return{value:{chargingTime:t.chargingTime,dischargingTime:t.dischargingTime},triggered:e}}catch{return{value:"battery-error",triggered:!0}}}},{name:"permissionsWeird",weight:0,async check(){try{let t=await navigator.permissions.query({name:"camera"});return{value:t.state,triggered:t.state==="prompt"}}catch{return{value:"perm-error",triggered:!0}}}},{name:"noMediaDevices",weight:1,async check(){try{let t=await navigator.mediaDevices.enumerateDevices();return{value:t.length,triggered:t.length===0}}catch{return{value:"media-error",triggered:!0}}}},{name:"virtualizedMediaDevices",weight:1,async check(){try{let t=await navigator.mediaDevices.enumerateDevices(),e=t.some(n=>n.label.toLowerCase().includes("virtual"));return{value:t.map(n=>n.label),triggered:e}}catch{return{value:"media-error",triggered:!0}}}},{name:"webrtcIpPattern",weight:2,async check(){return new Promise(t=>{try{let e=new RTCPeerConnection({iceServers:[]});e.createDataChannel("x");let n=setTimeout(()=>{e.close(),t({value:"timeout",triggered:!1})},3e3);e.onicecandidate=o=>{if(!o?.candidate){clearTimeout(n),e.close(),t({value:"no candidate",triggered:!1});return}let r=o.candidate.candidate.toLowerCase();clearTimeout(n),e.close(),t({value:r,triggered:r.includes("10.0.2.")||r.includes("172.16.")||r.includes("192.168.56.")})},e.createOffer().then(o=>e.setLocalDescription(o))}catch{t({value:"rtc-error",triggered:!1})}})}},{name:"gpuAccelerationDisabled",weight:3,async check(){let e=document.createElement("canvas").getContext("webgl");return{value:!!e,triggered:!e}}},{name:"noWebGL2",weight:3,async check(){let t=document.createElement("canvas").getContext("webgl2");return{value:!!t,triggered:!t}}},{name:"lowStorageQuota",weight:1,async check(){try{let t=await navigator.storage.estimate();return{value:t.quota,triggered:(t.quota??0)<524288e3}}catch{return{value:"storage-error",triggered:!0}}}},{name:"lowEntropy",weight:1,async check(){let t=Object.keys(navigator).length+Object.keys(screen).length+Object.keys(window).length;return{value:t,triggered:t<200}}},{name:"noLanguages",weight:1,async check(){let t=navigator.languages||[];return{value:t,triggered:t.length===0}}},{name:"uaEntropyLow",weight:1,async check(){let t=navigator.userAgent;return{value:t,triggered:t.length<30}}},{name:"weirdDPI",weight:2,async check(){let t=window.devicePixelRatio;return{value:t,triggered:t===1}}}],on=[{name:"tamperingPluginMismatch",penalty:3,async check(){try{let t=navigator.userAgent.toLowerCase(),e=(t.includes("chrome")||t.includes("edg"))&&!t.includes("firefox")&&!t.includes("safari"),n=navigator.plugins?.length??0,o=!e&&n>0;return{value:{pluginCount:n,isChromeLike:e},triggered:o}}catch{return{value:"error",triggered:!1}}}},{name:"tamperingWebglNoise",penalty:1,async check(){try{let t=document.createElement("canvas");t.width=16,t.height=16;let e=t.getContext("webgl");if(!e)return{value:"no-webgl",triggered:!1};e.clearColor(.1,.2,.3,1),e.clear(e.COLOR_BUFFER_BIT);let n=new Uint8Array(16*16*4);e.readPixels(0,0,16,16,e.RGBA,e.UNSIGNED_BYTE,n);let o=new Set(n).size;return{value:{uniqueValues:o},triggered:o>4}}catch{return{value:"error",triggered:!1}}}},{name:"tamperingServiceWorkerBlocked",penalty:1,async check(){let t=!("serviceWorker"in navigator);return{value:{serviceWorkerAvailable:!t},triggered:t}}},{name:"permissionsWeirdAntiVM",penalty:2,async check(){try{let t=await navigator.permissions.query({name:"camera"});return{value:t.state,triggered:t.state==="prompt"}}catch{return{value:"error",triggered:!1}}}}];async function ot({threshold:t=4}={}){let e={},n=0;for(let r of rn)try{let i=await r.check();e[r.name]={...i,weight:r.weight},i.triggered&&r.weight>0&&(n+=r.weight)}catch{e[r.name]={value:"error",triggered:!1,weight:r.weight}}let o=n;for(let r of on)try{let i=await r.check();e[r.name]={...i,penalty:r.penalty},i.triggered&&(n-=r.penalty)}catch{e[r.name]={value:"error",triggered:!1,penalty:r.penalty}}return{isLikelyVM:n>=t,score:n,rawScore:o,threshold:t,signals:e}}var an=[{name:"hookedFunctionToString",weight:2,async check(){let t=Function.prototype.toString.toString(),e=Function.prototype.toString+"";return{value:{native:t,current:e},triggered:t!==e}}},{name:"navigatorProxyTrap",weight:2,async check(){let t=!1;try{let e=Object.getOwnPropertyDescriptor(window,"navigator");e&&e.get&&e.get.toString()?.includes("[native code]")===!1&&(t=!0)}catch{}return{value:"navigator getter",triggered:t}}},{name:"uaMismatch",weight:2,async check(){let t=navigator.userAgent||"",e="";try{let o=await navigator.userAgentData?.getHighEntropyValues?.(["platform","brands"]);e=JSON.stringify(o)}catch{}let n=t?.includes("Mac")&&e?.includes("Windows")||t?.includes("Win")&&e?.includes("Mac")||e&&e.length>0&&!t;return{value:{ua:t,brandInfo:e},triggered:n}}},{name:"timezoneLocaleMismatch",weight:1,async check(){let t=Intl.DateTimeFormat().resolvedOptions().timeZone,e=navigator.language||"",n=e.startsWith("en")&&t==="Asia/Shanghai"||e.startsWith("zh")&&t==="America/New_York"||t===void 0;return{value:{tz:t,lang:e},triggered:n}}},{name:"canvasNoise",weight:2,async check(){let t=()=>{let r=document.createElement("canvas"),i=r.getContext("2d");return i.textBaseline="top",i.font="14px Arial",i.fillText("anti-detect-check",2,2),r.toDataURL()},e=t(),n=t();return{value:{a:e,b:n},triggered:e!==n}}},{name:"webglNoise",weight:-2,async check(){try{let e=document.createElement("canvas").getContext("webgl");if(!e)return{value:"no-webgl",triggered:!0};let n=e.getExtension("WEBGL_debug_renderer_info");if(!n)return{value:"no-debug-extension",triggered:!1};let o=e.getParameter(n.UNMASKED_VENDOR_WEBGL),r=e.getParameter(n.UNMASKED_RENDERER_WEBGL),i=o===""||r===""||o?.includes(" ")===!1||r?.includes(" ")===!1;return{value:{v:o,r},triggered:i}}catch{return{value:"gl-error",triggered:!0}}}},{name:"webdriverFlag",weight:3,async check(){let t=navigator.webdriver===!0;return{value:navigator.webdriver,triggered:t}}},{name:"perfectEventTiming",weight:-3,async check(){let t=performance.now();return{value:t,triggered:t%1===0}}},{name:"serviceWorkerBlocked",weight:-4,async check(){let t=!("serviceWorker"in navigator);return{value:t,triggered:t}}},{name:"smallQuota",weight:2,async check(){try{let t=await navigator.storage.estimate(),e=t.quota<50*1024*1024;return{value:t.quota,triggered:e}}catch{return{value:"quota-error",triggered:!0}}}},{name:"indexedDbBlocked",weight:2,async check(){try{let t=indexedDB.open("tamper-check");return await new Promise(e=>{t.onerror=()=>e({value:"error",triggered:!0}),t.onsuccess=()=>e({value:"ok",triggered:!1})})}catch{return{value:"throw",triggered:!0}}}},{name:"screenDprMismatch",weight:0,async check(){let t=window.screen.width,e=window.screen.height,n=window.devicePixelRatio,o=t===1920&&n===1&&e===1080||n%1!==0&&n%1!==.5;return{value:{w:t,h:e,dpr:n},triggered:o}}},{name:"missingCommonFonts",weight:1,async check(){return{value:"skipped",triggered:!1}}},{name:"noMediaDevices",weight:1,async check(){try{let t=await navigator.mediaDevices.enumerateDevices();return{value:t.length,triggered:t.length===0}}catch{return{value:"error",triggered:!0}}}},{name:"languagesEmpty",weight:1,async check(){let t=navigator.languages||[];return{value:t,triggered:t.length===0}}},{name:"pluginMismatch",weight:-4,async check(){try{let t=navigator.plugins.length;return{value:t,triggered:t===0}}catch{return{value:"error",triggered:!0}}}},{name:"devtoolsDetected",weight:-2,async check(){return new Promise(async t=>{let e={viewportBreakpoint:!1,consoleSpeed:!1,consoleProfileTiming:!1},n=160,o=window.outerWidth-window.innerWidth,r=window.outerHeight-window.innerHeight;(o>n||r>n)&&(e.viewportBreakpoint=!0);async function i(c=50){return new Promise(m=>{let u=performance.now();console.log("%c ","font-size:3000px");let d=performance.now();m(d-u>c)})}e.consoleSpeed=await i();function a(){if(typeof console.profile!="function"||typeof console.profileEnd!="function")return!1;let c=5,m=3,u=[];try{for(let g=0;g<c;g++){let f=performance.now(),T=`profile_${f.toString()}`;console.profile(T),console.profileEnd(T),u.push(performance.now()-f)}}catch{return!1}return u.sort((g,f)=>g-f),u[Math.floor(u.length/2)]>m}e.consoleProfileTiming=a();let s=Object.values(e).some(Boolean);setTimeout(()=>{t({value:s,triggered:s})},50)})}},{name:"knownAntiDetectBrowser",weight:5,async check(){let t=navigator.userAgent.toLowerCase(),n=["incogniton","multilogin","morelogin","adspect","kameleo","goLogin"].some(o=>t?.includes(o));return{value:t,triggered:n}}},{name:"batteryVirtualized",weight:4,async check(){try{let t=await navigator.getBattery(),e=t.chargingTime,n=t.dischargingTime;return{value:{chargingTime:e,dischargingTime:n},triggered:e===0}}catch{return{value:"no-battery-api",triggered:!1}}}},{name:"permissionDenied",weight:4,async check(){try{let t=await navigator.permissions.query({name:"notifications"}),e=t.state==="denied";return{value:t.state,triggered:e}}catch{return{value:"perm-error",triggered:!1}}}}];async function it({anomalyMin:t=.52,anomalyMax:e=.54}={}){let n={},o=0;for(let d of an){let g=await d.check();n[d.name]=g,g.triggered&&(o+=d.weight)}let r=navigator?.platform||"",i=(navigator?.userAgent||"").toLowerCase(),a=r.toLowerCase().includes("win"),s=n.batteryVirtualized?.triggered||!1,c=n.permissionDenied?.triggered||!1,m=!a&&r!==""&&s&&c,u=Math.min(1,Math.max(0,o)/15);return{result:m&&u>=t&&u<=e||n.knownAntiDetectBrowser?.triggered,anomalyScore:u,score:o,signals:n}}function sn(){let t=0;try{0 .toFixed(-1)}catch(e){t=e.message.length}return t}function cn(){let t=navigator.userAgent,e=sn();return e===44||e===43?"Safari":e===51?"Chrome":e===25?"Firefox":navigator.msSaveBlob!==void 0?"MSIE":t.match(/Chrome/)?navigator.brave!==void 0?"Brave":t.includes("Edg")?"Edge":t.includes("OPR")?"Opera":"Chrome":"Unknown"}var un=[{name:"safari_currentStorageTest",weight:2,browser:"Safari",async check(){if(typeof navigator.storage?.getDirectory!="function")return{triggered:!1,value:"unsupported"};try{return await navigator.storage.getDirectory(),{triggered:!1,value:"ok"}}catch(t){let e=t?.message??String(t);return{triggered:e.includes("unknown transient reason"),value:e}}}},{name:"safari13to18_indexedDbBlobTest",weight:2,browser:"Safari",async check(){return await new Promise(t=>{let e=String(Math.random()),n=indexedDB.open(e,1);n.onupgradeneeded=o=>{let r=o.target.result;try{r.createObjectStore("t",{autoIncrement:!0}).put(new Blob),t({triggered:!1,value:"ok"})}catch(i){let a=i?.message??String(i);t({triggered:a.includes("are not yet supported"),value:a})}finally{r.close(),indexedDB.deleteDatabase(e)}},n.onerror=()=>t({triggered:!1,value:"idb-error"})})}},{name:"safari_oldWebkitTest",weight:1,browser:"Safari",async check(){let t=window.openDatabase,e=window.localStorage;try{t(null,null,null,null)}catch{return{triggered:!0,value:"openDatabase denied"}}try{e.setItem("test","1"),e.removeItem("test")}catch{return{triggered:!0,value:"localStorage denied"}}return{triggered:!1,value:"ok"}}},{name:"chrome_storageQuotaPrivateTest",weight:2,browser:"Chrome",async check(){return await new Promise((t,e)=>{let o=window?.performance?.memory?.jsHeapSizeLimit??1073741824;navigator.webkitTemporaryStorage.queryUsageAndQuota((r,i)=>{let a=Math.round(i/1048576),s=Math.round(o/(1024*1024))*2;t({triggered:a<s,value:{quotaMB:a,limitMB:s}})},r=>e(r))})}},{name:"chrome_oldFileSystemTest",weight:1,browser:"Chrome",async check(){let t=window.webkitRequestFileSystem;return t?await new Promise(e=>t(0,1,()=>e({triggered:!1,value:"ok"}),()=>e({triggered:!0,value:"denied"}))):{triggered:!1,value:"unsupported"}}},{name:"firefox_storageDirectoryTest",weight:2,browser:"Firefox",async check(){if(typeof navigator.storage?.getDirectory!="function")return{triggered:!1,value:"unsupported"};try{return await navigator.storage.getDirectory(),{triggered:!1,value:"ok"}}catch(t){let e=t?.message??String(t);return{triggered:e.includes("Security error"),value:e}}}},{name:"firefox_indexedDbInvalidStateTest",weight:1,browser:"Firefox",async check(){return await new Promise(t=>{let e=indexedDB.open("inPrivate");e.onerror=()=>{t({triggered:e.error?.name==="InvalidStateError",value:e.error?.name})},e.onsuccess=()=>{indexedDB.deleteDatabase("inPrivate"),t({triggered:!1,value:"ok"})}})}},{name:"msie_indexedDbMissing",weight:2,browser:"MSIE",async check(){return{triggered:window.indexedDB===void 0,value:"msie-idb-check"}}}];async function at(){let t=cn(),e={},n=0;for(let o of un){if(o.browser!==t)continue;let r=await o.check();e[o.name]=r,r.triggered&&(n+=o.weight)}return{isPrivate:n>0,browserName:t,score:n,signals:e}}typeof window<"u"&&(window.detectIncognito=at);var st=at;var ct=[{name:"globalPrivacyControl",weight:3,async check(){let t=navigator.globalPrivacyControl;return{triggered:t===!0,value:t}}},{name:"doNotTrack",weight:1,async check(){let t=navigator.doNotTrack;return{triggered:t==="1",value:t}}},{name:"cookiesDisabled",weight:3,async check(){let t=navigator.cookieEnabled;return{triggered:t===!1,value:t}}},{name:"thirdPartyCookiesBlocked",weight:3,async check(){try{if("hasStorageAccess"in document&&!await document.hasStorageAccess())try{return await document.requestStorageAccess(),{triggered:!1,value:"access_granted"}}catch{return{triggered:!0,value:"access_denied"}}let t=`__dtect_3p_test_${Date.now()}`;document.cookie=`${t}=1; SameSite=None; Secure`;let e=document.cookie.includes(t);return document.cookie=`${t}=; expires=Thu, 01 Jan 1970 00:00:00 GMT`,{triggered:!1,value:e?"cookies_work":"may_be_blocked"}}catch(t){return{triggered:!1,value:`error: ${t?.message}`}}}},{name:"firefoxResistFingerprinting",weight:2,async check(){let t=[],e=new Date().getTimezoneOffset();e===0&&Intl.DateTimeFormat().resolvedOptions().timeZone==="UTC"&&t.push("timezone_utc");let n=navigator.hardwareConcurrency;n===2&&t.push("cores_capped");let o=window.screen.width,r=window.screen.height,i=window.innerWidth,a=window.innerHeight;o===i&&r===a&&t.push("screen_matches_inner");let s=window.matchMedia("(prefers-reduced-motion: reduce)").matches;return{triggered:t.length>=2,value:{signals:t,timezoneOffset:e,cores:n,prefersReducedMotion:s}}}},{name:"braveShields",weight:3,async check(){if(!(navigator.brave!==void 0))return{triggered:!1,value:"not_brave"};try{if(!await navigator.brave.isBrave())return{triggered:!1,value:"brave_check_false"};let o=document.createElement("canvas").getContext("2d");if(o){o.fillStyle="rgb(255, 0, 0)",o.fillRect(0,0,1,1);let r=o.getImageData(0,0,1,1).data;o.fillRect(0,0,1,1);let i=o.getImageData(0,0,1,1).data;if(r[0]!==i[0]||r[1]!==i[1]||r[2]!==i[2])return{triggered:!0,value:"shields_active_canvas"}}try{let r=new RTCPeerConnection({iceServers:[{urls:"stun:stun.l.google.com:19302"}]});if(r.createDataChannel(""),await new Promise(a=>{let s=setTimeout(()=>{r.close(),a(!1)},1e3);r.onicecandidate=c=>{c.candidate?.candidate&&(/([0-9]{1,3}\.){3}[0-9]{1,3}/.test(c.candidate.candidate)||(clearTimeout(s),r.close(),a(!0)))},r.createOffer().then(c=>r.setLocalDescription(c))}))return{triggered:!0,value:"shields_active_webrtc"}}catch{return{triggered:!0,value:"shields_active_webrtc_blocked"}}return{triggered:!0,value:"brave_detected_shields_default"}}catch(e){return{triggered:!1,value:`error: ${e?.message}`}}}}];async function ut(){let t={},e=0,n=await Promise.allSettled(ct.map(async o=>{let r=await o.check();return{name:o.name,weight:o.weight,result:r}}));for(let o of n)if(o.status==="fulfilled"){let{name:r,weight:i,result:a}=o.value;t[r]=a,a.triggered&&(e+=i)}else{let r=n.indexOf(o),i=ct[r];i&&(t[i.name]={triggered:!1,value:`check_failed: ${o.reason}`})}return{isPrivacyEnabled:e>3,score:e,signals:t}}typeof window<"u"&&(window.detectPrivacy=ut);var lt=ut;function ln(t){let e=t?.projectId,n=t?.visitorId||O();return(typeof t?.projectId=="number"||typeof t?.visitorId=="number")&&(e=`${t?.projectId}`,n=`${t?.visitorId}`),{visitorId:n,projectId:e}}function F(t){let{projectId:e,visitorId:n}=ln(t);return{projectId:e,visitorId:n}}async function mn(){let t=new W,[e,n,o,r,i]=await Promise.allSettled([t.get(),ot(),it(),st(),lt()]);return{deviceRes:e,vmDtectResults:n,tamperingDtectResults:o,incognitoDtectResults:r,privacySettingsDtectResults:i}}function dn(t,e){return{entryLink:window?.location?.href,securitySettings:t.securitySettings,metaData:t.metaData,vmDtectResults:e?.vmDtectResults?.value,tamperingDtectResults:e?.tamperingDtectResults?.value,incognitoDtectResults:e?.incognitoDtectResults?.value,deviceIdResults:e?.deviceRes?.value,privacySettingsDtectResults:e?.privacySettingsDtectResults?.value}}function gn(t,e,n,o){let r=(performance.now()-e).toFixed();I(`${t} finishes in ${r}ms`,"info",{function:t,endpoint:n?.endpoint,diff:r,token:o,clientId:n?.clientId})}function mt(t,e,n,o,r){let i=(performance.now()-e).toFixed();I(`${t} error`,"error",{function:t,endpoint:n?.endpoint,error:r,diff:i,token:o,clientId:n?.clientId})}async function dt(t,e){let n=performance.now(),{projectId:o,visitorId:r}=F(t);if(!t||!o?.trim())throw new Error(h.FAILED_TO_GET_SECURITY_RESULT);L({projectId:o,visitorId:r});let{state:i,config:a,version:s}=w();try{let c=await mn(),m=dn(t,c),u={...t,projectId:o,visitorId:r,clientData:m,version:s,token:i.token,questionData:i.questionData,aiCheckData:i.aiCheckData},d=await U({url:e,body:u,headers:{"client-id":a?.clientId||"","x-api-key":a?.apiKey||""}});if(!("token"in d||"results"in d))throw new Error(h.INTERNAL_SERVER_ERROR);let g="results"in d&&d.results.isAIUsageDetected===!0;return S(f=>({...f,state:{...f.state,token:i.token,visitorId:r,projectId:o,clientData:m,aiUsageFlagged:f.state.aiUsageFlagged||g}})),gn("getResultBase",n,a,i.token),d}catch(c){c instanceof Error?mt("getResultBase",n,a,i.token,{message:c.message,stack:c.stack,name:c.name}):mt("getResultBase",n,a,i.token,c),N(c)}}async function Re(t){let{endpoint:e}=M();if(t)return dt(t,`${e}/client/check/result`)}async function xe(t){let{endpoint:e}=M();return dt(t,`${e}/client/check`)}var q;function gt(){let{config:t,monitor:e,state:n}=w();if(!t?.autoFlagAIUsage||!e||(q?.(),q=void 0,n.aiUsageFlagged))return;let o=()=>{let{state:r}=w();r.aiUsageFlagged||!(e.apd||e.qbc&&e.mas&&e.scb!=null)||r.projectId&&(S(a=>({...a,state:{...a.state,aiUsageFlagged:!0}})),q?.(),q=void 0,H({projectId:r.projectId,visitorId:r.visitorId}))};q=e.onChange(o),o()}async function H(t){let e=performance.now(),{visitorId:n,projectId:o}=F(t);L({projectId:o,visitorId:n});let{state:r,config:i,monitor:a,version:s}=w(),{checkResultEndpoint:c}=M(),m={timeTakenSeconds:t.timeTakenSeconds,qbc:a?.qbc,mas:a?.mas,scb:a?.scb,apd:a?.apd};try{let u=await U({url:c,headers:{"client-id":i?.clientId||"","x-api-key":i?.apiKey||""},body:{token:r.token,visitorId:n,projectId:o,version:s,clientData:r.clientData,questionData:r.questionData,aiCheckData:m}});if(!u)throw new Error(h.INTERNAL_SERVER_ERROR);let d="results"in u&&u.results.isAIUsageDetected===!0;S(f=>({...f,state:{...f.state,aiCheckData:m,visitorId:n,projectId:o,aiUsageFlagged:f.state.aiUsageFlagged||d}}));let g=(performance.now()-e).toFixed();return I(`isAIUsageDetected finishes in ${g}ms`,"info",{endpoint:i?.endpoint,diff:g,token:r.token,clientId:i?.clientId}),u}catch(u){let d=(performance.now()-e).toFixed();u instanceof Error?I("isAIUsageDetected error","error",{endpoint:i?.endpoint,error:{message:u.message,stack:u.stack,name:u.name},diff:d,token:r.token,clientId:i?.clientId}):I("isAIUsageDetected error","error",{endpoint:i?.endpoint,error:u,diff:d,token:r.token,clientId:i?.clientId}),N(u)}}async function Ae(t){let e=performance.now(),{state:n,config:o}=w(),{respondentType:r,language:i}=t;try{let a=await rt({url:`${o?.endpoint}/client/quality-questions/${r}/${i}`,headers:{"client-id":o?.clientId||"","x-api-key":o?.apiKey||""}});if(!a)throw new Error(h.INTERNAL_SERVER_ERROR);let s=(performance.now()-e).toFixed();return I(`getQualityQuestions finishes in ${s}ms`,"info",{function:"getQualityQuestions",endpoint:o?.endpoint,diff:s,token:n.token,clientId:o?.clientId}),a}catch(a){let s=(performance.now()-e).toFixed();I("getQualityQuestions error","error",{endpoint:o?.endpoint,error:a,diff:s,token:n.token,clientId:o?.clientId}),N(a)}}async function De(t){let e=performance.now(),{visitorId:n,projectId:o}=F(t);L({projectId:o,visitorId:n});let{state:r,config:i,version:a}=w(),{checkResultEndpoint:s}=M(),c={questions:t.questions};try{let m=await U({url:s,headers:{"client-id":i?.clientId||"","x-api-key":i?.apiKey||""},body:{token:r.token,visitorId:n,projectId:o,version:a,questionData:c,aiCheckData:r.aiCheckData,clientData:r.clientData}});if(!m)throw new Error(h.INTERNAL_SERVER_ERROR);S(d=>({...d,state:{...d.state,token:r.token,questionData:c,visitorId:n,projectId:o}}));let u=(performance.now()-e).toFixed();return I(`checkQualityQuestions finishes in ${u}ms`,"info",{function:"checkQualityQuestions",endpoint:i?.endpoint,diff:u,token:r.token,clientId:i?.clientId}),m}catch(m){let u=(performance.now()-e).toFixed();m instanceof Error?I("checkQualityQuestions error","error",{endpoint:i?.endpoint,error:{message:m.message,stack:m.stack,name:m.name},diff:u,token:r.token,clientId:i?.clientId}):I("checkQualityQuestions error","error",{endpoint:i?.endpoint,error:m,diff:u,token:r.token,clientId:i?.clientId}),N(m)}}var ft,fn=Me;function Fi(){let{config:t}=w();return!!(t?.clientId&&t?.apiKey)}function pn(t){let{config:e}=w();if(!t?.clientId||!t?.apiKey)throw I(h.MISSING_CREDENTIALS,"error",{endpoint:e?.endpoint,...t}),new Error(h.MISSING_CREDENTIALS)}function yn(){let{config:t}=w();return!!(t?.clientId&&t.apiKey)}function hn(t){let{config:e}=w();if(!yn())throw I(h.MISSING_CREDENTIALS,"error",{endpoint:e?.endpoint,...t}),new Error(h.MISSING_CREDENTIALS)}function wn(t){return{clientId:t.clientId,apiKey:t.apiKey,endpoint:t.endpoint||"https://api.dtect.io/security",includeResults:t.includeResults,autoFlagAIUsage:t.autoFlagAIUsage}}function In(t){let e=t.endpoint,n=t.includeResults?`${e}/client/check/result`:`${e}/client/check`;return{...t,checkResultEndpoint:n}}function vn(t){let e=In(t);S(n=>({...n,config:e}))}function En(){let{state:t}=w();if(t.isLoading)throw new Error(h.DUPLICATE_INITIALIZATION)}async function bn(t){let{state:e,config:n}=w(),r=(performance.now()-t).toFixed();return I(`init() finishes ${r}ms`,"info",{endpoint:n?.endpoint,function:"init",diff:r,token:e.token,clientId:n?.clientId}),{getSecurityResult:Re,getSecurityToken:xe,SecurityAPIError:fn,isAIUsageDetected:H,checkQualityQuestions:De,getQualityQuestions:Ae,LanguageCodes:K,QualityQuestionsRespondentTypes:j}}async function Tn(t){let{state:e}=w(),n=performance.now();pn(t);let o=wn(t);vn(o),hn(t);let r=Ge(e.token);En(),qe(r),gt();try{return await bn(n)}catch(i){Ve(i,o)}finally{Ke(r)}}ft={init:Tn,getSecurityResult:Re,getSecurityToken:xe,isAIUsageDetected:H,checkQualityQuestions:De,getQualityQuestions:Ae,QualityQuestionsRespondentTypes:j,LanguageCodes:K};var Gi=ft;export{K as LanguageCodes,j as QualityQuestionsRespondentTypes,fn as SecurityAPIError,De as checkQualityQuestions,Gi as default,Ae as getQualityQuestions,Re as getSecurityResult,xe as getSecurityToken,Fi as hasCredentials,Tn as init,H as isAIUsageDetected};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dtect/security-sdk-js",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",
@@ -14,7 +14,6 @@
14
14
  "check-size": "size-limit"
15
15
  },
16
16
  "dependencies": {
17
- "@tanstack/query-core": "^5.64.2",
18
17
  "uuid": "^11.0.5"
19
18
  },
20
19
  "devDependencies": {