fpscanner 1.0.2 → 1.0.3-beta.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"hasMismatchPlatformWorker.d.ts","sourceRoot":"","sources":["../../src/detections/hasMismatchPlatformWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,WAAW,WAMjE"}
1
+ {"version":3,"file":"hasMismatchPlatformWorker.d.ts","sourceRoot":"","sources":["../../src/detections/hasMismatchPlatformWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAkBvC,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,WAAW,WAiBjE"}
@@ -1 +1 @@
1
- {"version":3,"file":"hasMismatchWebGLInWorker.d.ts","sourceRoot":"","sources":["../../src/detections/hasMismatchWebGLInWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,WAAW,WAShE"}
1
+ {"version":3,"file":"hasMismatchWebGLInWorker.d.ts","sourceRoot":"","sources":["../../src/detections/hasMismatchWebGLInWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAOvC,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,WAAW,WAchE"}
@@ -1 +1 @@
1
- {"version":3,"file":"hasMissingChromeObject.d.ts","sourceRoot":"","sources":["../../src/detections/hasMissingChromeObject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,WAG9D"}
1
+ {"version":3,"file":"hasMissingChromeObject.d.ts","sourceRoot":"","sources":["../../src/detections/hasMissingChromeObject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAgBvC,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,WAS9D"}
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});function ne(){return navigator.webdriver}function ie(){return navigator.userAgent}function ae(){return navigator.platform}const l="ERROR",r="INIT",s="NA",f="SKIPPED",d="high",b="low",oe="medium";function p(t){let e=0;for(let n=0,i=t.length;n<i;n++){let a=t.charCodeAt(n);e=(e<<5)-e+a,e|=0}return e.toString(16).padStart(8,"0")}function g(t,e){for(const n in t)t[n]=e}function se(){return navigator.buildID==="20181001000000"}function ce(){try{let t=!1;const e=Error.prepareStackTrace;Error.prepareStackTrace=function(){return t=!0,e};const n=new Error("");return console.log(n),t}catch{return l}}function le(){const t={vendor:r,renderer:r};if(se())return g(t,s),t;try{var e=document.createElement("canvas"),n=e.getContext("webgl")||e.getContext("experimental-webgl");n.getSupportedExtensions().indexOf("WEBGL_debug_renderer_info")>=0?(t.vendor=n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_VENDOR_WEBGL),t.renderer=n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_RENDERER_WEBGL)):g(t,s)}catch{g(t,l)}return t}function ue(){return"__pwInitScripts"in window||"__playwright__binding__"in window}function de(){return navigator.hardwareConcurrency||s}function ge(){const t=[],e=.123456789;return["E","LN10","LN2","LOG10E","LOG2E","PI","SQRT1_2","SQRT2"].forEach(function(a){try{t.push(Math[a])}catch{t.push(-1)}}),["tan","sin","exp","atan","acosh","asinh","atanh","expm1","log1p","sinh"].forEach(function(a){try{t.push(Math[a](e))}catch{t.push(-1)}}),p(t.map(String).join(","))}function he(){return navigator.deviceMemory||s}function me(){return eval.toString().length}function pe(){const t={timezone:r,localeLanguage:r};try{if(typeof Intl<"u"&&typeof Intl.DateTimeFormat<"u"){const e=Intl.DateTimeFormat().resolvedOptions();t.timezone=e.timeZone,t.localeLanguage=e.locale}else t.timezone=s,t.localeLanguage=s}catch{t.timezone=l,t.localeLanguage=l}return t}function fe(){return{width:window.screen.width,height:window.screen.height,pixelDepth:window.screen.pixelDepth,colorDepth:window.screen.colorDepth,availableWidth:window.screen.availWidth,availableHeight:window.screen.availHeight,innerWidth:window.innerWidth,innerHeight:window.innerHeight,hasMultipleDisplays:typeof screen.isExtended<"u"?screen.isExtended:s}}function ve(){return{languages:navigator.languages,language:navigator.language}}async function we(){const t={vendor:r,architecture:r,device:r,description:r};if("gpu"in navigator)try{const e=await navigator.gpu.requestAdapter();e&&(t.vendor=e.info.vendor,t.architecture=e.info.architecture,t.device=e.info.device,t.description=e.info.description)}catch{g(t,l)}else g(t,s);return t}function ye(){const t=["__driver_evaluate","__webdriver_evaluate","__selenium_evaluate","__fxdriver_evaluate","__driver_unwrapped","__webdriver_unwrapped","__selenium_unwrapped","__fxdriver_unwrapped","_Selenium_IDE_Recorder","_selenium","calledSelenium","$cdc_asdjflasutopfhvcZLmcfl_","$chrome_asyncScriptInfo","__$webdriverAsyncExecutor","webdriver","__webdriverFunc","domAutomation","domAutomationController","__lastWatirAlert","__lastWatirConfirm","__lastWatirPrompt","__webdriver_script_fn","_WEBDRIVER_ELEM_CACHE"];let e=!1;for(let n=0;n<t.length;n++)if(t[n]in window){e=!0;break}return e=e||!!document.__webdriver_script_fn||!!window.domAutomation||!!window.domAutomationController,e}function be(){try{const t="webdriver",e=window.navigator;if(!e[t]&&!e.hasOwnProperty(t)){e[t]=1;const n=e[t]===1;return delete e[t],n}return!0}catch{return!1}}async function Se(){const t=window.navigator,e={architecture:r,bitness:r,brands:r,mobile:r,model:r,platform:r,platformVersion:r,uaFullVersion:r};if("userAgentData"in t)try{const n=await t.userAgentData.getHighEntropyValues(["architecture","bitness","brands","mobile","model","platform","platformVersion","uaFullVersion"]);e.architecture=n.architecture,e.bitness=n.bitness,e.brands=n.brands,e.mobile=n.mobile,e.model=n.model,e.platform=n.platform,e.platformVersion=n.platformVersion,e.uaFullVersion=n.uaFullVersion}catch{g(e,l)}else g(e,s);return e}function Ce(){if(!navigator.plugins)return!1;const t=typeof navigator.plugins.toString=="function"?navigator.plugins.toString():navigator.plugins.constructor&&typeof navigator.plugins.constructor.toString=="function"?navigator.plugins.constructor.toString():typeof navigator.plugins;return t==="[object PluginArray]"||t==="[object MSPluginsCollection]"||t==="[object HTMLPluginsCollection]"}function Ae(){if(!navigator.plugins)return s;const t=[];for(let e=0;e<navigator.plugins.length;e++)t.push(navigator.plugins[e].name);return p(t.join(","))}function Pe(){return navigator.plugins?navigator.plugins.length:s}function Me(){if(!navigator.plugins)return s;try{return navigator.plugins[0]===navigator.plugins[0][0].enabledPlugin}catch{return l}}function xe(){if(!navigator.plugins)return s;try{return navigator.plugins.item(4294967296)!==navigator.plugins[0]}catch{return l}}function We(){const t={isValidPluginArray:r,pluginCount:r,pluginNamesHash:r,pluginConsistency1:r,pluginOverflow:r};try{t.isValidPluginArray=Ce(),t.pluginCount=Pe(),t.pluginNamesHash=Ae(),t.pluginConsistency1=Me(),t.pluginOverflow=xe()}catch{g(t,l)}return t}async function Ee(){return new Promise(async function(t){var e={audiooutput:0,audioinput:0,videoinput:0};if(navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices){const a=await navigator.mediaDevices.enumerateDevices();if(typeof a<"u"){for(var n=0;n<a.length;n++){var i=a[n].kind;e[i]=e[i]+1}return t({speakers:e.audiooutput,microphones:e.audioinput,webcams:e.videoinput})}else return g(e,s),t(e)}else return g(e,s),t(e)})}function ke(){const t={webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r},e=document.createElement("iframe");let n=!1;try{e.style.display="none",e.src="about:blank",document.body.appendChild(e),n=!0;const i=e.contentWindow?.navigator;t.webdriver=i.webdriver??!1,t.userAgent=i.userAgent??s,t.platform=i.platform??s,t.memory=i.deviceMemory??s,t.cpuCount=i.hardwareConcurrency??s,t.language=i.language??s}catch{g(t,l)}finally{if(n)try{document.body.removeChild(e)}catch{}}return t}async function De(){return new Promise(t=>{const e={vendor:r,renderer:r,userAgent:r,language:r,platform:r,memory:r,cpuCount:r};let n=null,i=null,a=null;const h=()=>{a&&clearTimeout(a),n&&n.terminate(),i&&URL.revokeObjectURL(i)};try{const m=`try {
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});function ie(){return navigator.webdriver}function ae(){return navigator.userAgent}function oe(){return navigator.platform}const l="ERROR",r="INIT",s="NA",f="SKIPPED",g="high",S="low",se="medium";function p(t){let e=0;for(let n=0,i=t.length;n<i;n++){let a=t.charCodeAt(n);e=(e<<5)-e+a,e|=0}return e.toString(16).padStart(8,"0")}function h(t,e){for(const n in t)t[n]=e}function ce(){return navigator.buildID==="20181001000000"}function le(){try{let t=!1;const e=Error.prepareStackTrace;Error.prepareStackTrace=function(){return t=!0,e};const n=new Error("");return console.log(n),t}catch{return l}}function ue(){const t={vendor:r,renderer:r};if(ce())return h(t,s),t;try{var e=document.createElement("canvas"),n=e.getContext("webgl")||e.getContext("experimental-webgl");n.getSupportedExtensions().indexOf("WEBGL_debug_renderer_info")>=0?(t.vendor=n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_VENDOR_WEBGL),t.renderer=n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_RENDERER_WEBGL)):h(t,s)}catch{h(t,l)}return t}function de(){return"__pwInitScripts"in window||"__playwright__binding__"in window}function ge(){return navigator.hardwareConcurrency||s}function he(){const t=[],e=.123456789;return["E","LN10","LN2","LOG10E","LOG2E","PI","SQRT1_2","SQRT2"].forEach(function(a){try{t.push(Math[a])}catch{t.push(-1)}}),["tan","sin","exp","atan","acosh","asinh","atanh","expm1","log1p","sinh"].forEach(function(a){try{t.push(Math[a](e))}catch{t.push(-1)}}),p(t.map(String).join(","))}function me(){return navigator.deviceMemory||s}function pe(){return eval.toString().length}function fe(){const t={timezone:r,localeLanguage:r};try{if(typeof Intl<"u"&&typeof Intl.DateTimeFormat<"u"){const e=Intl.DateTimeFormat().resolvedOptions();t.timezone=e.timeZone,t.localeLanguage=e.locale}else t.timezone=s,t.localeLanguage=s}catch{t.timezone=l,t.localeLanguage=l}return t}function ve(){return{width:window.screen.width,height:window.screen.height,pixelDepth:window.screen.pixelDepth,colorDepth:window.screen.colorDepth,availableWidth:window.screen.availWidth,availableHeight:window.screen.availHeight,innerWidth:window.innerWidth,innerHeight:window.innerHeight,hasMultipleDisplays:typeof screen.isExtended<"u"?screen.isExtended:s}}function we(){return{languages:navigator.languages,language:navigator.language}}async function ye(){const t={vendor:r,architecture:r,device:r,description:r};if("gpu"in navigator)try{const e=await navigator.gpu.requestAdapter();e&&(t.vendor=e.info.vendor,t.architecture=e.info.architecture,t.device=e.info.device,t.description=e.info.description)}catch{h(t,l)}else h(t,s);return t}function be(){const t=["__driver_evaluate","__webdriver_evaluate","__selenium_evaluate","__fxdriver_evaluate","__driver_unwrapped","__webdriver_unwrapped","__selenium_unwrapped","__fxdriver_unwrapped","_Selenium_IDE_Recorder","_selenium","calledSelenium","$cdc_asdjflasutopfhvcZLmcfl_","$chrome_asyncScriptInfo","__$webdriverAsyncExecutor","webdriver","__webdriverFunc","domAutomation","domAutomationController","__lastWatirAlert","__lastWatirConfirm","__lastWatirPrompt","__webdriver_script_fn","_WEBDRIVER_ELEM_CACHE"];let e=!1;for(let n=0;n<t.length;n++)if(t[n]in window){e=!0;break}return e=e||!!document.__webdriver_script_fn||!!window.domAutomation||!!window.domAutomationController,e}function Se(){try{const t="webdriver",e=window.navigator;if(!e[t]&&!e.hasOwnProperty(t)){e[t]=1;const n=e[t]===1;return delete e[t],n}return!0}catch{return!1}}async function Ce(){const t=window.navigator,e={architecture:r,bitness:r,brands:r,mobile:r,model:r,platform:r,platformVersion:r,uaFullVersion:r};if("userAgentData"in t)try{const n=await t.userAgentData.getHighEntropyValues(["architecture","bitness","brands","mobile","model","platform","platformVersion","uaFullVersion"]);e.architecture=n.architecture,e.bitness=n.bitness,e.brands=n.brands,e.mobile=n.mobile,e.model=n.model,e.platform=n.platform,e.platformVersion=n.platformVersion,e.uaFullVersion=n.uaFullVersion}catch{h(e,l)}else h(e,s);return e}function Pe(){if(!navigator.plugins)return!1;const t=typeof navigator.plugins.toString=="function"?navigator.plugins.toString():navigator.plugins.constructor&&typeof navigator.plugins.constructor.toString=="function"?navigator.plugins.constructor.toString():typeof navigator.plugins;return t==="[object PluginArray]"||t==="[object MSPluginsCollection]"||t==="[object HTMLPluginsCollection]"}function Ae(){if(!navigator.plugins)return s;const t=[];for(let e=0;e<navigator.plugins.length;e++)t.push(navigator.plugins[e].name);return p(t.join(","))}function Me(){return navigator.plugins?navigator.plugins.length:s}function xe(){if(!navigator.plugins)return s;try{return navigator.plugins[0]===navigator.plugins[0][0].enabledPlugin}catch{return l}}function We(){if(!navigator.plugins)return s;try{return navigator.plugins.item(4294967296)!==navigator.plugins[0]}catch{return l}}function Ee(){const t={isValidPluginArray:r,pluginCount:r,pluginNamesHash:r,pluginConsistency1:r,pluginOverflow:r};try{t.isValidPluginArray=Pe(),t.pluginCount=Me(),t.pluginNamesHash=Ae(),t.pluginConsistency1=xe(),t.pluginOverflow=We()}catch{h(t,l)}return t}async function ke(){return new Promise(async function(t){var e={audiooutput:0,audioinput:0,videoinput:0};if(navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices){const a=await navigator.mediaDevices.enumerateDevices();if(typeof a<"u"){for(var n=0;n<a.length;n++){var i=a[n].kind;e[i]=e[i]+1}return t({speakers:e.audiooutput,microphones:e.audioinput,webcams:e.videoinput})}else return h(e,s),t(e)}else return h(e,s),t(e)})}function De(){const t={webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r},e=document.createElement("iframe");let n=!1;try{e.style.display="none",e.src="about:blank",document.body.appendChild(e),n=!0;const i=e.contentWindow?.navigator;t.webdriver=i.webdriver??!1,t.userAgent=i.userAgent??s,t.platform=i.platform??s,t.memory=i.deviceMemory??s,t.cpuCount=i.hardwareConcurrency??s,t.language=i.language??s}catch{h(t,l)}finally{if(n)try{document.body.removeChild(e)}catch{}}return t}async function _e(){return new Promise(t=>{const e={vendor:r,renderer:r,userAgent:r,language:r,platform:r,memory:r,cpuCount:r};let n=null,i=null,a=null;const d=()=>{a&&clearTimeout(a),n&&n.terminate(),i&&URL.revokeObjectURL(i)};try{const m=`try {
2
2
  var fingerprintWorker = {};
3
3
 
4
4
  fingerprintWorker.userAgent = navigator.userAgent;
@@ -29,4 +29,4 @@
29
29
  self.postMessage(fingerprintWorker);
30
30
  } catch (e) {
31
31
  self.postMessage(fingerprintWorker);
32
- }`,w=new Blob([m],{type:"application/javascript"});i=URL.createObjectURL(w),n=new Worker(i),a=window.setTimeout(()=>{h(),g(e,l),t(e)},2e3),n.onmessage=function(o){try{e.vendor=o.data.vendor,e.renderer=o.data.renderer,e.userAgent=o.data.userAgent,e.language=o.data.language,e.platform=o.data.platform,e.memory=o.data.memory,e.cpuCount=o.data.cpuCount}catch{g(e,l)}finally{h(),t(e)}},n.onerror=function(){h(),g(e,l),t(e)}}catch{h(),g(e,l),t(e)}})}function _e(){const t={toSourceError:r,hasToSource:!1};try{null.usdfsh}catch(e){t.toSourceError=e.toString()}try{throw"xyz"}catch(e){try{e.toSource(),t.hasToSource=!0}catch{t.hasToSource=!1}}return t}const S=['audio/mp4; codecs="mp4a.40.2"',"audio/mpeg;",'audio/webm; codecs="vorbis"','audio/ogg; codecs="vorbis"','audio/wav; codecs="1"','audio/ogg; codecs="speex"','audio/ogg; codecs="flac"','audio/3gpp; codecs="samr"'],C=['video/mp4; codecs="avc1.42E01E, mp4a.40.2"','video/mp4; codecs="avc1.42E01E"','video/mp4; codecs="avc1.58A01E"','video/mp4; codecs="avc1.4D401E"','video/mp4; codecs="avc1.64001E"','video/mp4; codecs="mp4v.20.8"','video/mp4; codecs="mp4v.20.240"','video/webm; codecs="vp8"','video/ogg; codecs="theora"','video/ogg; codecs="dirac"','video/3gpp; codecs="mp4v.20.8"','video/x-matroska; codecs="theora"'];function A(t,e){const n={};try{const i=document.createElement(e);for(const a of t)try{n[a]=i.canPlayType(a)||null}catch{n[a]=null}}catch{for(const i of t)n[i]=null}return n}function P(t){const e={},n=window.MediaSource;if(!n||typeof n.isTypeSupported!="function"){for(const i of t)e[i]=null;return e}for(const i of t)try{e[i]=n.isTypeSupported(i)}catch{e[i]=null}return e}function M(t){try{const e=window.RTCRtpReceiver;if(e&&typeof e.getCapabilities=="function"){const n=e.getCapabilities(t);return p(JSON.stringify(n))}return s}catch{return l}}function Re(){const t={audioCanPlayTypeHash:s,videoCanPlayTypeHash:s,audioMediaSourceHash:s,videoMediaSourceHash:s,rtcAudioCapabilitiesHash:s,rtcVideoCapabilitiesHash:s,hasMediaSource:!1};try{t.hasMediaSource=!!window.MediaSource;const e=A(S,"audio"),n=A(C,"video");t.audioCanPlayTypeHash=p(JSON.stringify(e)),t.videoCanPlayTypeHash=p(JSON.stringify(n));const i=P(S),a=P(C);t.audioMediaSourceHash=p(JSON.stringify(i)),t.videoMediaSourceHash=p(JSON.stringify(a)),t.rtcAudioCapabilitiesHash=M("audio"),t.rtcVideoCapabilitiesHash=M("video")}catch{g(t,l)}return t}async function Ie(){return new Promise(t=>{try{const e=new Image,n=document.createElement("canvas").getContext("2d");e.onload=()=>{n.drawImage(e,0,0),t(n.getImageData(0,0,1,1).data.filter(i=>i===0).length!=4)},e.onerror=()=>{t(l)},e.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII="}catch{t(l)}})}function Te(){var t=document.createElement("canvas");t.width=400,t.height=200,t.style.display="inline";var e=t.getContext("2d");try{return e.rect(0,0,10,10),e.rect(2,2,6,6),e.textBaseline="alphabetic",e.fillStyle="#f60",e.fillRect(125,1,62,20),e.fillStyle="#069",e.font="11pt no-real-font-123",e.fillText("Cwm fjordbank glyphs vext quiz, 😃",2,15),e.fillStyle="rgba(102, 204, 0, 0.2)",e.font="18pt Arial",e.fillText("Cwm fjordbank glyphs vext quiz, 😃",4,45),e.globalCompositeOperation="multiply",e.fillStyle="rgb(255,0,255)",e.beginPath(),e.arc(50,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(0,255,255)",e.beginPath(),e.arc(100,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,255,0)",e.beginPath(),e.arc(75,100,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,0,255)",e.arc(75,75,75,0,2*Math.PI,!0),e.arc(75,75,25,0,2*Math.PI,!0),e.fill("evenodd"),p(t.toDataURL())}catch{return l}}async function Le(){const t={hasModifiedCanvas:r,canvasFingerprint:r};return t.hasModifiedCanvas=await Ie(),t.canvasFingerprint=Te(),t}function Oe(){const t=["deviceMemory","hardwareConcurrency","language","languages","platform"],e=[];for(const n of t){const i=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator),n);i&&i.value?e.push("1"):e.push("0")}return e.join("")}function He(){return Math.random().toString(36).substring(2,15)}function Fe(){return new Date().getTime()}function Ue(){return window.location.href}function x(t,e){const n=t.signals;return e==="iframe"?n.contexts.iframe.webdriver!==n.automation.webdriver||n.contexts.iframe.userAgent!==n.browser.userAgent||n.contexts.iframe.platform!==n.device.platform||n.contexts.iframe.memory!==n.device.memory||n.contexts.iframe.cpuCount!==n.device.cpuCount:n.contexts.webWorker.webdriver!==n.automation.webdriver||n.contexts.webWorker.userAgent!==n.browser.userAgent||n.contexts.webWorker.platform!==n.device.platform||n.contexts.webWorker.memory!==n.device.memory||n.contexts.webWorker.cpuCount!==n.device.cpuCount}function Ve(){const t={bitmask:r,extensions:[]},e=document.body.hasAttribute("data-gr-ext-installed"),n=typeof window.ethereum<"u",i=document.getElementById("coupon-birds-drop-div")!==null,a=document.querySelector("deepl-input-controller")!==null,h=document.getElementById("monica-content-root")!==null,m=document.querySelector("chatgpt-sidebar")!==null,w=typeof window.__REQUESTLY__<"u",o=Array.from(document.querySelectorAll("*")).filter(v=>v.tagName.toLowerCase().startsWith("veepn-")).length>0;return t.bitmask=[e?"1":"0",n?"1":"0",i?"1":"0",a?"1":"0",h?"1":"0",m?"1":"0",w?"1":"0",o?"1":"0"].join(""),e&&t.extensions.push("grammarly"),n&&t.extensions.push("metamask"),i&&t.extensions.push("coupon-birds"),a&&t.extensions.push("deepl"),h&&t.extensions.push("monica-ai"),m&&t.extensions.push("sider-ai"),w&&t.extensions.push("requestly"),o&&t.extensions.push("veepn"),t}function c(t){try{return t()}catch{return!1}}function Ge(){const t={bitmask:r,chrome:c(()=>"chrome"in window),brave:c(()=>"brave"in navigator),applePaySupport:c(()=>"ApplePaySetup"in window),opera:c(()=>typeof window.opr<"u"||typeof window.onoperadetachedviewchange=="object"),serial:c(()=>window.navigator.serial!==void 0),attachShadow:c(()=>!!Element.prototype.attachShadow),caches:c(()=>!!window.caches),webAssembly:c(()=>!!window.WebAssembly&&!!window.WebAssembly.instantiate),buffer:c(()=>"Buffer"in window),showModalDialog:c(()=>"showModalDialog"in window),safari:c(()=>"safari"in window),webkitPrefixedFunction:c(()=>"webkitCancelAnimationFrame"in window),mozPrefixedFunction:c(()=>"mozGetUserMedia"in navigator),usb:c(()=>typeof window.USB=="function"),browserCapture:c(()=>typeof window.BrowserCaptureMediaStreamTrack=="function"),paymentRequestUpdateEvent:c(()=>typeof window.PaymentRequestUpdateEvent=="function"),pressureObserver:c(()=>typeof window.PressureObserver=="function"),audioSession:c(()=>"audioSession"in navigator),selectAudioOutput:c(()=>typeof navigator<"u"&&typeof navigator.mediaDevices<"u"&&typeof navigator.mediaDevices.selectAudioOutput=="function"),barcodeDetector:c(()=>"BarcodeDetector"in window),battery:c(()=>"getBattery"in navigator),devicePosture:c(()=>"DevicePosture"in window),documentPictureInPicture:c(()=>"documentPictureInPicture"in window),eyeDropper:c(()=>"EyeDropper"in window),editContext:c(()=>"EditContext"in window),fencedFrame:c(()=>"FencedFrameConfig"in window),sanitizer:c(()=>"Sanitizer"in window),otpCredential:c(()=>"OTPCredential"in window)},e=Object.keys(t).filter(n=>n!=="bitmask").map(n=>t[n]?"1":"0").join("");return t.bitmask=e,t}function je(){const t={prefersColorScheme:r,prefersReducedMotion:r,prefersReducedTransparency:r,colorGamut:r,pointer:r,anyPointer:r,hover:r,anyHover:r,colorDepth:r};try{window.matchMedia("(prefers-color-scheme: dark)").matches?t.prefersColorScheme="dark":window.matchMedia("(prefers-color-scheme: light)").matches?t.prefersColorScheme="light":t.prefersColorScheme=null,t.prefersReducedMotion=window.matchMedia("(prefers-reduced-motion: reduce)").matches,t.prefersReducedTransparency=window.matchMedia("(prefers-reduced-transparency: reduce)").matches,window.matchMedia("(color-gamut: rec2020)").matches?t.colorGamut="rec2020":window.matchMedia("(color-gamut: p3)").matches?t.colorGamut="p3":window.matchMedia("(color-gamut: srgb)").matches?t.colorGamut="srgb":t.colorGamut=null,window.matchMedia("(pointer: fine)").matches?t.pointer="fine":window.matchMedia("(pointer: coarse)").matches?t.pointer="coarse":window.matchMedia("(pointer: none)").matches?t.pointer="none":t.pointer=null,window.matchMedia("(any-pointer: fine)").matches?t.anyPointer="fine":window.matchMedia("(any-pointer: coarse)").matches?t.anyPointer="coarse":window.matchMedia("(any-pointer: none)").matches?t.anyPointer="none":t.anyPointer=null,t.hover=window.matchMedia("(hover: hover)").matches,t.anyHover=window.matchMedia("(any-hover: hover)").matches;let e=0;for(let n=0;n<=16;n++)window.matchMedia(`(color: ${n})`).matches&&(e=n);t.colorDepth=e}catch{g(t,l)}return t}function Be(t){const e=t.signals.device.screenResolution;return e.width===800&&e.height===600||e.availableWidth===800&&e.availableHeight===600||e.innerWidth===800&&e.innerHeight===600}function Ne(t){return t.signals.automation.webdriver===!0}function ze(t){return!!t.signals.automation.selenium}function $e(t){return t.signals.automation.cdp===!0}function Qe(t){return t.signals.automation.playwright===!0}function qe(t){return typeof t.signals.device.memory!="number"?!1:t.signals.device.memory>32||t.signals.device.memory<.25}function Ke(t){return typeof t.signals.device.cpuCount!="number"?!1:t.signals.device.cpuCount>70}function Je(t){const e=t.signals.browser.userAgent;return t.signals.browser.features.chrome===!1&&typeof e=="string"&&e.includes("Chrome")}function Ye(t){return t.signals.contexts.iframe.webdriver===!0}function Ze(t){return t.signals.contexts.webWorker.webdriver===!0}function Xe(t){const e=t.signals.contexts.webWorker,n=t.signals.graphics.webGL;return e.vendor===l||e.renderer===l||n.vendor===s||n.renderer===s||e.vendor===f?!1:e.vendor!==n.vendor||e.renderer!==n.renderer}function et(t){return t.signals.contexts.webWorker.platform===s||t.signals.contexts.webWorker.platform===l||t.signals.contexts.webWorker.platform===f?!1:t.signals.device.platform!==t.signals.contexts.webWorker.platform}function tt(t){return t.signals.contexts.iframe.platform===s||t.signals.contexts.iframe.platform===l?!1:t.signals.device.platform!==t.signals.contexts.iframe.platform}function rt(t){return t.signals.automation.webdriverWritable===!0}function nt(t){return t.signals.graphics.webGL.renderer.includes("SwiftShader")}function it(t){return t.signals.locale.internationalization.timezone==="UTC"}function at(t){const e=t.signals.locale.languages.languages,n=t.signals.locale.languages.language;return n&&e&&Array.isArray(e)&&e.length>0?e[0]!==n:!1}function ot(t){return!!(t.signals.browser.features.chrome&&t.signals.browser.etsl!==33||t.signals.browser.features.safari&&t.signals.browser.etsl!==37||t.signals.browser.userAgent.includes("Firefox")&&t.signals.browser.etsl!==37)}function st(t){return[t.signals.browser.userAgent,t.signals.contexts.iframe.userAgent,t.signals.contexts.webWorker.userAgent].some(n=>/bot|headless/i.test(n.toLowerCase()))}function ct(t){const e=t.signals.graphics.webgpu,n=t.signals.graphics.webGL,i=t.signals.browser.userAgent;return!!((n.vendor.includes("Apple")||n.renderer.includes("Apple"))&&!i.includes("Mac")||e.vendor.includes("apple")&&!i.includes("Mac")||e.vendor.includes("apple")&&!n.renderer.includes("Apple"))}function lt(t){const e=t.signals.device.platform,n=t.signals.browser.userAgent,i=t.signals.browser.highEntropyValues.platform;return!!(n.includes("Mac")&&(e.includes("Win")||e.includes("Linux"))||n.includes("Windows")&&(e.includes("Mac")||e.includes("Linux"))||n.includes("Linux")&&(e.includes("Mac")||e.includes("Win"))||i!==l&&i!==s&&(i.includes("Mac")&&(e.includes("Win")||e.includes("Linux"))||i.includes("Windows")&&(e.includes("Mac")||e.includes("Linux"))||i.includes("Linux")&&(e.includes("Mac")||e.includes("Win"))))}async function ut(t,e){const n=new TextEncoder().encode(e),i=new TextEncoder().encode(t),a=new Uint8Array(i.length);for(let m=0;m<i.length;m++)a[m]=i[m]^n[m%n.length];const h=String.fromCharCode(...a);return btoa(h)}class dt{constructor(){this.fingerprint={signals:{automation:{webdriver:r,webdriverWritable:r,selenium:r,cdp:r,playwright:r,navigatorPropertyDescriptors:r},device:{cpuCount:r,memory:r,platform:r,screenResolution:{width:r,height:r,pixelDepth:r,colorDepth:r,availableWidth:r,availableHeight:r,innerWidth:r,innerHeight:r,hasMultipleDisplays:r},multimediaDevices:{speakers:r,microphones:r,webcams:r},mediaQueries:{prefersColorScheme:r,prefersReducedMotion:r,prefersReducedTransparency:r,colorGamut:r,pointer:r,anyPointer:r,hover:r,anyHover:r,colorDepth:r}},browser:{userAgent:r,features:{bitmask:r,chrome:r,brave:r,applePaySupport:r,opera:r,serial:r,attachShadow:r,caches:r,webAssembly:r,buffer:r,showModalDialog:r,safari:r,webkitPrefixedFunction:r,mozPrefixedFunction:r,usb:r,browserCapture:r,paymentRequestUpdateEvent:r,pressureObserver:r,audioSession:r,selectAudioOutput:r,barcodeDetector:r,battery:r,devicePosture:r,documentPictureInPicture:r,eyeDropper:r,editContext:r,fencedFrame:r,sanitizer:r,otpCredential:r},plugins:{isValidPluginArray:r,pluginCount:r,pluginNamesHash:r,pluginConsistency1:r,pluginOverflow:r},extensions:{bitmask:r,extensions:r},highEntropyValues:{architecture:r,bitness:r,brands:r,mobile:r,model:r,platform:r,platformVersion:r,uaFullVersion:r},etsl:r,maths:r,toSourceError:{toSourceError:r,hasToSource:r}},graphics:{webGL:{vendor:r,renderer:r},webgpu:{vendor:r,architecture:r,device:r,description:r},canvas:{hasModifiedCanvas:r,canvasFingerprint:r}},codecs:{audioCanPlayTypeHash:r,videoCanPlayTypeHash:r,audioMediaSourceHash:r,videoMediaSourceHash:r,rtcAudioCapabilitiesHash:r,rtcVideoCapabilitiesHash:r,hasMediaSource:r},locale:{internationalization:{timezone:r,localeLanguage:r},languages:{languages:r,language:r}},contexts:{iframe:{webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r},webWorker:{webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r,vendor:r,renderer:r}}},fsid:r,nonce:r,time:r,url:r,fastBotDetection:!1,fastBotDetectionDetails:{headlessChromeScreenResolution:{detected:!1,severity:"high"},hasWebdriver:{detected:!1,severity:"high"},hasWebdriverWritable:{detected:!1,severity:"high"},hasSeleniumProperty:{detected:!1,severity:"high"},hasCDP:{detected:!1,severity:"high"},hasPlaywright:{detected:!1,severity:"high"},hasImpossibleDeviceMemory:{detected:!1,severity:"high"},hasHighCPUCount:{detected:!1,severity:"high"},hasMissingChromeObject:{detected:!1,severity:"high"},hasWebdriverIframe:{detected:!1,severity:"high"},hasWebdriverWorker:{detected:!1,severity:"high"},hasMismatchWebGLInWorker:{detected:!1,severity:"high"},hasMismatchPlatformIframe:{detected:!1,severity:"high"},hasMismatchPlatformWorker:{detected:!1,severity:"high"},hasSwiftshaderRenderer:{detected:!1,severity:"low"},hasUTCTimezone:{detected:!1,severity:"medium"},hasMismatchLanguages:{detected:!1,severity:"low"},hasInconsistentEtsl:{detected:!1,severity:"high"},hasBotUserAgent:{detected:!1,severity:"high"},hasGPUMismatch:{detected:!1,severity:"high"},hasPlatformMismatch:{detected:!1,severity:"high"}}}}async collectSignal(e){try{return await e()}catch{return l}}generateFingerprintScannerId(){try{const e=this.fingerprint.signals,n=this.fingerprint.fastBotDetectionDetails,i="FS1",h=[n.headlessChromeScreenResolution.detected,n.hasWebdriver.detected,n.hasWebdriverWritable.detected,n.hasSeleniumProperty.detected,n.hasCDP.detected,n.hasPlaywright.detected,n.hasImpossibleDeviceMemory.detected,n.hasHighCPUCount.detected,n.hasMissingChromeObject.detected,n.hasWebdriverIframe.detected,n.hasWebdriverWorker.detected,n.hasMismatchWebGLInWorker.detected,n.hasMismatchPlatformIframe.detected,n.hasMismatchPlatformWorker.detected,n.hasSwiftshaderRenderer.detected,n.hasUTCTimezone.detected,n.hasMismatchLanguages.detected,n.hasInconsistentEtsl.detected,n.hasBotUserAgent.detected,n.hasGPUMismatch.detected,n.hasPlatformMismatch.detected].map(u=>u?"1":"0").join(""),m=[e.automation.webdriver===!0,e.automation.webdriverWritable===!0,e.automation.selenium===!0,e.automation.cdp===!0,e.automation.playwright===!0].map(u=>u?"1":"0").join(""),w=p(String(e.automation.navigatorPropertyDescriptors)).slice(0,4),o=`${m}h${w}`,v=typeof e.device.screenResolution.width=="number"?e.device.screenResolution.width:0,y=typeof e.device.screenResolution.height=="number"?e.device.screenResolution.height:0,W=typeof e.device.cpuCount=="number"?String(e.device.cpuCount).padStart(2,"0"):"00",E=typeof e.device.memory=="number"?String(Math.round(e.device.memory)).padStart(2,"0"):"00",k=[e.device.screenResolution.hasMultipleDisplays===!0,e.device.mediaQueries.prefersReducedMotion===!0,e.device.mediaQueries.prefersReducedTransparency===!0,e.device.mediaQueries.hover===!0,e.device.mediaQueries.anyHover===!0].map(u=>u?"1":"0").join(""),D=[e.device.platform,e.device.screenResolution.pixelDepth,e.device.screenResolution.colorDepth,e.device.multimediaDevices.speakers,e.device.multimediaDevices.microphones,e.device.multimediaDevices.webcams,e.device.mediaQueries.prefersColorScheme,e.device.mediaQueries.colorGamut,e.device.mediaQueries.pointer,e.device.mediaQueries.anyPointer,e.device.mediaQueries.colorDepth].map(u=>String(u)).join("|"),_=p(D).slice(0,6),R=`${v}x${y}c${W}m${E}b${k}h${_}`,I=typeof e.browser.features.bitmask=="string"?e.browser.features.bitmask:"0000000000",T=typeof e.browser.extensions.bitmask=="string"?e.browser.extensions.bitmask:"00000000",L=[e.browser.plugins.isValidPluginArray===!0,e.browser.plugins.pluginConsistency1===!0,e.browser.plugins.pluginOverflow===!0,e.browser.toSourceError.hasToSource===!0].map(u=>u?"1":"0").join(""),O=[e.browser.userAgent,e.browser.etsl,e.browser.maths,e.browser.plugins.pluginCount,e.browser.plugins.pluginNamesHash,e.browser.toSourceError.toSourceError,e.browser.highEntropyValues.architecture,e.browser.highEntropyValues.bitness,e.browser.highEntropyValues.platform,e.browser.highEntropyValues.platformVersion,e.browser.highEntropyValues.uaFullVersion,e.browser.highEntropyValues.mobile].map(u=>String(u)).join("|"),H=p(O).slice(0,6),F=`f${I}e${T}p${L}h${H}`,U=[e.graphics.canvas.hasModifiedCanvas===!0].map(u=>u?"1":"0").join(""),V=[e.graphics.webGL.vendor,e.graphics.webGL.renderer,e.graphics.webgpu.vendor,e.graphics.webgpu.architecture,e.graphics.webgpu.device,e.graphics.webgpu.description,e.graphics.canvas.canvasFingerprint].map(u=>String(u)).join("|"),G=p(V).slice(0,6),j=`${U}h${G}`,B=[e.codecs.hasMediaSource===!0].map(u=>u?"1":"0").join(""),N=[e.codecs.audioCanPlayTypeHash,e.codecs.videoCanPlayTypeHash,e.codecs.audioMediaSourceHash,e.codecs.videoMediaSourceHash,e.codecs.rtcAudioCapabilitiesHash,e.codecs.rtcVideoCapabilitiesHash].map(u=>String(u)).join("|"),z=p(N).slice(0,6),$=`${B}h${z}`,Q=typeof e.locale.languages.language=="string"?e.locale.languages.language.slice(0,2).toLowerCase():"xx",q=Array.isArray(e.locale.languages.languages)?e.locale.languages.languages.length:0,K=(typeof e.locale.internationalization.timezone=="string"?e.locale.internationalization.timezone:"unknown").replace(/[\/\s]/g,"-"),J=[e.locale.internationalization.timezone,e.locale.internationalization.localeLanguage,Array.isArray(e.locale.languages.languages)?e.locale.languages.languages.join(","):e.locale.languages.languages,e.locale.languages.language].map(u=>String(u)).join("|"),Y=p(J).slice(0,4),Z=`${Q}${q}t${K}_h${Y}`,X=[x(this.fingerprint,"iframe"),x(this.fingerprint,"worker"),e.contexts.iframe.webdriver===!0,e.contexts.webWorker.webdriver===!0].map(u=>u?"1":"0").join(""),ee=[e.contexts.iframe.userAgent,e.contexts.iframe.platform,e.contexts.iframe.memory,e.contexts.iframe.cpuCount,e.contexts.iframe.language,e.contexts.webWorker.userAgent,e.contexts.webWorker.platform,e.contexts.webWorker.memory,e.contexts.webWorker.cpuCount,e.contexts.webWorker.language,e.contexts.webWorker.vendor,e.contexts.webWorker.renderer].map(u=>String(u)).join("|"),te=p(ee).slice(0,6),re=`${X}h${te}`;return[i,h,o,R,F,j,$,Z,re].join("_")}catch(e){return console.error("Error generating fingerprint scanner id",e),l}}async encryptFingerprint(e){const n="__DEFAULT_FPSCANNER_KEY__";return n.length>20&&n.indexOf("DEFAULT")>0&&n.indexOf("FPSCANNER")>0&&console.warn('[fpscanner] WARNING: Using default encryption key! Run "npx fpscanner build --key=your-secret-key" to inject your own key. See: https://github.com/antoinevastel/fpscanner#advanced-custom-builds'),await ut(JSON.stringify(e),n)}getDetectionRules(){return[{name:"headlessChromeScreenResolution",severity:d,test:Be},{name:"hasWebdriver",severity:d,test:Ne},{name:"hasWebdriverWritable",severity:d,test:rt},{name:"hasSeleniumProperty",severity:d,test:ze},{name:"hasCDP",severity:d,test:$e},{name:"hasPlaywright",severity:d,test:Qe},{name:"hasImpossibleDeviceMemory",severity:d,test:qe},{name:"hasHighCPUCount",severity:d,test:Ke},{name:"hasMissingChromeObject",severity:d,test:Je},{name:"hasWebdriverIframe",severity:d,test:Ye},{name:"hasWebdriverWorker",severity:d,test:Ze},{name:"hasMismatchWebGLInWorker",severity:d,test:Xe},{name:"hasMismatchPlatformIframe",severity:d,test:tt},{name:"hasMismatchPlatformWorker",severity:d,test:et},{name:"hasSwiftshaderRenderer",severity:b,test:nt},{name:"hasUTCTimezone",severity:oe,test:it},{name:"hasMismatchLanguages",severity:b,test:at},{name:"hasInconsistentEtsl",severity:d,test:ot},{name:"hasBotUserAgent",severity:d,test:st},{name:"hasGPUMismatch",severity:d,test:ct},{name:"hasPlatformMismatch",severity:d,test:lt}]}runDetectionRules(){const e=this.getDetectionRules(),n={headlessChromeScreenResolution:{detected:!1,severity:"high"},hasWebdriver:{detected:!1,severity:"high"},hasWebdriverWritable:{detected:!1,severity:"high"},hasSeleniumProperty:{detected:!1,severity:"high"},hasCDP:{detected:!1,severity:"high"},hasPlaywright:{detected:!1,severity:"high"},hasImpossibleDeviceMemory:{detected:!1,severity:"high"},hasHighCPUCount:{detected:!1,severity:"high"},hasMissingChromeObject:{detected:!1,severity:"high"},hasWebdriverIframe:{detected:!1,severity:"high"},hasWebdriverWorker:{detected:!1,severity:"high"},hasMismatchWebGLInWorker:{detected:!1,severity:"high"},hasMismatchPlatformIframe:{detected:!1,severity:"high"},hasMismatchPlatformWorker:{detected:!1,severity:"high"},hasSwiftshaderRenderer:{detected:!1,severity:"low"},hasUTCTimezone:{detected:!1,severity:"medium"},hasMismatchLanguages:{detected:!1,severity:"low"},hasInconsistentEtsl:{detected:!1,severity:"high"},hasBotUserAgent:{detected:!1,severity:"high"},hasGPUMismatch:{detected:!1,severity:"high"},hasPlatformMismatch:{detected:!1,severity:"high"}};for(const i of e)try{const a=i.test(this.fingerprint);n[i.name]={detected:a,severity:i.severity}}catch{n[i.name]={detected:!1,severity:i.severity}}return n}async collectFingerprint(e={encrypt:!0}){const{encrypt:n=!0,skipWorker:i=!1}=e,a=this.fingerprint.signals,h={webdriver:this.collectSignal(ne),webdriverWritable:this.collectSignal(be),selenium:this.collectSignal(ye),cdp:this.collectSignal(ce),playwright:this.collectSignal(ue),navigatorPropertyDescriptors:this.collectSignal(Oe),cpuCount:this.collectSignal(de),memory:this.collectSignal(he),platform:this.collectSignal(ae),screenResolution:this.collectSignal(fe),multimediaDevices:this.collectSignal(Ee),mediaQueries:this.collectSignal(je),userAgent:this.collectSignal(ie),browserFeatures:this.collectSignal(Ge),plugins:this.collectSignal(We),browserExtensions:this.collectSignal(Ve),highEntropyValues:this.collectSignal(Se),etsl:this.collectSignal(me),maths:this.collectSignal(ge),toSourceError:this.collectSignal(_e),webGL:this.collectSignal(le),webgpu:this.collectSignal(we),canvas:this.collectSignal(Le),mediaCodecs:this.collectSignal(Re),internationalization:this.collectSignal(pe),languages:this.collectSignal(ve),iframe:this.collectSignal(ke),webWorker:i?Promise.resolve({webdriver:f,userAgent:f,platform:f,memory:f,cpuCount:f,language:f,vendor:f,renderer:f}):this.collectSignal(De),nonce:this.collectSignal(He),time:this.collectSignal(Fe),url:this.collectSignal(Ue)},m=Object.keys(h),w=await Promise.all(Object.values(h)),o=Object.fromEntries(m.map((v,y)=>[v,w[y]]));return a.automation.webdriver=o.webdriver,a.automation.webdriverWritable=o.webdriverWritable,a.automation.selenium=o.selenium,a.automation.cdp=o.cdp,a.automation.playwright=o.playwright,a.automation.navigatorPropertyDescriptors=o.navigatorPropertyDescriptors,a.device.cpuCount=o.cpuCount,a.device.memory=o.memory,a.device.platform=o.platform,a.device.screenResolution=o.screenResolution,a.device.multimediaDevices=o.multimediaDevices,a.device.mediaQueries=o.mediaQueries,a.browser.userAgent=o.userAgent,a.browser.features=o.browserFeatures,a.browser.plugins=o.plugins,a.browser.extensions=o.browserExtensions,a.browser.highEntropyValues=o.highEntropyValues,a.browser.etsl=o.etsl,a.browser.maths=o.maths,a.browser.toSourceError=o.toSourceError,a.graphics.webGL=o.webGL,a.graphics.webgpu=o.webgpu,a.graphics.canvas=o.canvas,a.codecs=o.mediaCodecs,a.locale.internationalization=o.internationalization,a.locale.languages=o.languages,a.contexts.iframe=o.iframe,a.contexts.webWorker=o.webWorker,this.fingerprint.nonce=o.nonce,this.fingerprint.time=o.time,this.fingerprint.url=o.url,this.fingerprint.fastBotDetectionDetails=this.runDetectionRules(),this.fingerprint.fastBotDetection=Object.values(this.fingerprint.fastBotDetectionDetails).some(v=>v.detected),this.fingerprint.fsid=this.generateFingerprintScannerId(),n?await this.encryptFingerprint(JSON.stringify(this.fingerprint)):this.fingerprint}}exports.default=dt;
32
+ }`,w=new Blob([m],{type:"application/javascript"});i=URL.createObjectURL(w),n=new Worker(i),a=window.setTimeout(()=>{d(),h(e,l),t(e)},2e3),n.onmessage=function(o){try{e.vendor=o.data.vendor,e.renderer=o.data.renderer,e.userAgent=o.data.userAgent,e.language=o.data.language,e.platform=o.data.platform,e.memory=o.data.memory,e.cpuCount=o.data.cpuCount}catch{h(e,l)}finally{d(),t(e)}},n.onerror=function(){d(),h(e,l),t(e)}}catch{d(),h(e,l),t(e)}})}function Re(){const t={toSourceError:r,hasToSource:!1};try{null.usdfsh}catch(e){t.toSourceError=e.toString()}try{throw"xyz"}catch(e){try{e.toSource(),t.hasToSource=!0}catch{t.hasToSource=!1}}return t}const C=['audio/mp4; codecs="mp4a.40.2"',"audio/mpeg;",'audio/webm; codecs="vorbis"','audio/ogg; codecs="vorbis"','audio/wav; codecs="1"','audio/ogg; codecs="speex"','audio/ogg; codecs="flac"','audio/3gpp; codecs="samr"'],P=['video/mp4; codecs="avc1.42E01E, mp4a.40.2"','video/mp4; codecs="avc1.42E01E"','video/mp4; codecs="avc1.58A01E"','video/mp4; codecs="avc1.4D401E"','video/mp4; codecs="avc1.64001E"','video/mp4; codecs="mp4v.20.8"','video/mp4; codecs="mp4v.20.240"','video/webm; codecs="vp8"','video/ogg; codecs="theora"','video/ogg; codecs="dirac"','video/3gpp; codecs="mp4v.20.8"','video/x-matroska; codecs="theora"'];function A(t,e){const n={};try{const i=document.createElement(e);for(const a of t)try{n[a]=i.canPlayType(a)||null}catch{n[a]=null}}catch{for(const i of t)n[i]=null}return n}function M(t){const e={},n=window.MediaSource;if(!n||typeof n.isTypeSupported!="function"){for(const i of t)e[i]=null;return e}for(const i of t)try{e[i]=n.isTypeSupported(i)}catch{e[i]=null}return e}function x(t){try{const e=window.RTCRtpReceiver;if(e&&typeof e.getCapabilities=="function"){const n=e.getCapabilities(t);return p(JSON.stringify(n))}return s}catch{return l}}function Ie(){const t={audioCanPlayTypeHash:s,videoCanPlayTypeHash:s,audioMediaSourceHash:s,videoMediaSourceHash:s,rtcAudioCapabilitiesHash:s,rtcVideoCapabilitiesHash:s,hasMediaSource:!1};try{t.hasMediaSource=!!window.MediaSource;const e=A(C,"audio"),n=A(P,"video");t.audioCanPlayTypeHash=p(JSON.stringify(e)),t.videoCanPlayTypeHash=p(JSON.stringify(n));const i=M(C),a=M(P);t.audioMediaSourceHash=p(JSON.stringify(i)),t.videoMediaSourceHash=p(JSON.stringify(a)),t.rtcAudioCapabilitiesHash=x("audio"),t.rtcVideoCapabilitiesHash=x("video")}catch{h(t,l)}return t}async function Le(){return new Promise(t=>{try{const e=new Image,n=document.createElement("canvas").getContext("2d");e.onload=()=>{n.drawImage(e,0,0),t(n.getImageData(0,0,1,1).data.filter(i=>i===0).length!=4)},e.onerror=()=>{t(l)},e.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII="}catch{t(l)}})}function Te(){var t=document.createElement("canvas");t.width=400,t.height=200,t.style.display="inline";var e=t.getContext("2d");try{return e.rect(0,0,10,10),e.rect(2,2,6,6),e.textBaseline="alphabetic",e.fillStyle="#f60",e.fillRect(125,1,62,20),e.fillStyle="#069",e.font="11pt no-real-font-123",e.fillText("Cwm fjordbank glyphs vext quiz, 😃",2,15),e.fillStyle="rgba(102, 204, 0, 0.2)",e.font="18pt Arial",e.fillText("Cwm fjordbank glyphs vext quiz, 😃",4,45),e.globalCompositeOperation="multiply",e.fillStyle="rgb(255,0,255)",e.beginPath(),e.arc(50,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(0,255,255)",e.beginPath(),e.arc(100,50,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,255,0)",e.beginPath(),e.arc(75,100,50,0,2*Math.PI,!0),e.closePath(),e.fill(),e.fillStyle="rgb(255,0,255)",e.arc(75,75,75,0,2*Math.PI,!0),e.arc(75,75,25,0,2*Math.PI,!0),e.fill("evenodd"),p(t.toDataURL())}catch{return l}}async function Oe(){const t={hasModifiedCanvas:r,canvasFingerprint:r};return t.hasModifiedCanvas=await Le(),t.canvasFingerprint=Te(),t}function He(){const t=["deviceMemory","hardwareConcurrency","language","languages","platform"],e=[];for(const n of t){const i=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator),n);i&&i.value?e.push("1"):e.push("0")}return e.join("")}function Ue(){return Math.random().toString(36).substring(2,15)}function Fe(){return new Date().getTime()}function Ge(){return window.location.href}function W(t,e){const n=t.signals;return e==="iframe"?n.contexts.iframe.webdriver!==n.automation.webdriver||n.contexts.iframe.userAgent!==n.browser.userAgent||n.contexts.iframe.platform!==n.device.platform||n.contexts.iframe.memory!==n.device.memory||n.contexts.iframe.cpuCount!==n.device.cpuCount:n.contexts.webWorker.webdriver!==n.automation.webdriver||n.contexts.webWorker.userAgent!==n.browser.userAgent||n.contexts.webWorker.platform!==n.device.platform||n.contexts.webWorker.memory!==n.device.memory||n.contexts.webWorker.cpuCount!==n.device.cpuCount}function Ve(){const t={bitmask:r,extensions:[]},e=document.body.hasAttribute("data-gr-ext-installed"),n=typeof window.ethereum<"u",i=document.getElementById("coupon-birds-drop-div")!==null,a=document.querySelector("deepl-input-controller")!==null,d=document.getElementById("monica-content-root")!==null,m=document.querySelector("chatgpt-sidebar")!==null,w=typeof window.__REQUESTLY__<"u",o=Array.from(document.querySelectorAll("*")).filter(v=>v.tagName.toLowerCase().startsWith("veepn-")).length>0;return t.bitmask=[e?"1":"0",n?"1":"0",i?"1":"0",a?"1":"0",d?"1":"0",m?"1":"0",w?"1":"0",o?"1":"0"].join(""),e&&t.extensions.push("grammarly"),n&&t.extensions.push("metamask"),i&&t.extensions.push("coupon-birds"),a&&t.extensions.push("deepl"),d&&t.extensions.push("monica-ai"),m&&t.extensions.push("sider-ai"),w&&t.extensions.push("requestly"),o&&t.extensions.push("veepn"),t}function c(t){try{return t()}catch{return!1}}function Be(){const t={bitmask:r,chrome:c(()=>"chrome"in window),brave:c(()=>"brave"in navigator),applePaySupport:c(()=>"ApplePaySetup"in window),opera:c(()=>typeof window.opr<"u"||typeof window.onoperadetachedviewchange=="object"),serial:c(()=>window.navigator.serial!==void 0),attachShadow:c(()=>!!Element.prototype.attachShadow),caches:c(()=>!!window.caches),webAssembly:c(()=>!!window.WebAssembly&&!!window.WebAssembly.instantiate),buffer:c(()=>"Buffer"in window),showModalDialog:c(()=>"showModalDialog"in window),safari:c(()=>"safari"in window),webkitPrefixedFunction:c(()=>"webkitCancelAnimationFrame"in window),mozPrefixedFunction:c(()=>"mozGetUserMedia"in navigator),usb:c(()=>typeof window.USB=="function"),browserCapture:c(()=>typeof window.BrowserCaptureMediaStreamTrack=="function"),paymentRequestUpdateEvent:c(()=>typeof window.PaymentRequestUpdateEvent=="function"),pressureObserver:c(()=>typeof window.PressureObserver=="function"),audioSession:c(()=>"audioSession"in navigator),selectAudioOutput:c(()=>typeof navigator<"u"&&typeof navigator.mediaDevices<"u"&&typeof navigator.mediaDevices.selectAudioOutput=="function"),barcodeDetector:c(()=>"BarcodeDetector"in window),battery:c(()=>"getBattery"in navigator),devicePosture:c(()=>"DevicePosture"in window),documentPictureInPicture:c(()=>"documentPictureInPicture"in window),eyeDropper:c(()=>"EyeDropper"in window),editContext:c(()=>"EditContext"in window),fencedFrame:c(()=>"FencedFrameConfig"in window),sanitizer:c(()=>"Sanitizer"in window),otpCredential:c(()=>"OTPCredential"in window)},e=Object.keys(t).filter(n=>n!=="bitmask").map(n=>t[n]?"1":"0").join("");return t.bitmask=e,t}function je(){const t={prefersColorScheme:r,prefersReducedMotion:r,prefersReducedTransparency:r,colorGamut:r,pointer:r,anyPointer:r,hover:r,anyHover:r,colorDepth:r};try{window.matchMedia("(prefers-color-scheme: dark)").matches?t.prefersColorScheme="dark":window.matchMedia("(prefers-color-scheme: light)").matches?t.prefersColorScheme="light":t.prefersColorScheme=null,t.prefersReducedMotion=window.matchMedia("(prefers-reduced-motion: reduce)").matches,t.prefersReducedTransparency=window.matchMedia("(prefers-reduced-transparency: reduce)").matches,window.matchMedia("(color-gamut: rec2020)").matches?t.colorGamut="rec2020":window.matchMedia("(color-gamut: p3)").matches?t.colorGamut="p3":window.matchMedia("(color-gamut: srgb)").matches?t.colorGamut="srgb":t.colorGamut=null,window.matchMedia("(pointer: fine)").matches?t.pointer="fine":window.matchMedia("(pointer: coarse)").matches?t.pointer="coarse":window.matchMedia("(pointer: none)").matches?t.pointer="none":t.pointer=null,window.matchMedia("(any-pointer: fine)").matches?t.anyPointer="fine":window.matchMedia("(any-pointer: coarse)").matches?t.anyPointer="coarse":window.matchMedia("(any-pointer: none)").matches?t.anyPointer="none":t.anyPointer=null,t.hover=window.matchMedia("(hover: hover)").matches,t.anyHover=window.matchMedia("(any-hover: hover)").matches;let e=0;for(let n=0;n<=16;n++)window.matchMedia(`(color: ${n})`).matches&&(e=n);t.colorDepth=e}catch{h(t,l)}return t}function Ne(t){const e=t.signals.device.screenResolution;return e.width===800&&e.height===600||e.availableWidth===800&&e.availableHeight===600||e.innerWidth===800&&e.innerHeight===600}function ze(t){return t.signals.automation.webdriver===!0}function $e(t){return!!t.signals.automation.selenium}function Qe(t){return t.signals.automation.cdp===!0}function qe(t){return t.signals.automation.playwright===!0}function Ke(t){return typeof t.signals.device.memory!="number"?!1:t.signals.device.memory>32||t.signals.device.memory<.25}function Je(t){return typeof t.signals.device.cpuCount!="number"?!1:t.signals.device.cpuCount>70}function Ye(t){return t.includes("Android")||t.includes("iPhone")||t.includes("iPod")||t.includes("iPad")}function Ze(t){const e=t.signals.browser.userAgent;return typeof e!="string"||!e.includes("Chrome")||Ye(e)?!1:t.signals.browser.features.chrome===!1}function Xe(t){return t.signals.contexts.iframe.webdriver===!0}function et(t){return t.signals.contexts.webWorker.webdriver===!0}function y(t){return t===s||t===l||t===f||t===r}function tt(t){const e=t.signals.contexts.webWorker,n=t.signals.graphics.webGL;return y(n.vendor)||y(n.renderer)||y(e.vendor)||y(e.renderer)?!1:e.vendor!==n.vendor||e.renderer!==n.renderer}function rt(t,e){const n=t.includes("iPad"),i=e.includes("iPad");if(n===i)return!1;const a=d=>d==="MacIntel"||d==="MacPPC";return a(t)||a(e)}function nt(t){if(t.signals.contexts.webWorker.platform===s||t.signals.contexts.webWorker.platform===l||t.signals.contexts.webWorker.platform===f)return!1;const e=t.signals.device.platform,n=t.signals.contexts.webWorker.platform;return!(e===n||rt(e,n))}function it(t){return t.signals.contexts.iframe.platform===s||t.signals.contexts.iframe.platform===l?!1:t.signals.device.platform!==t.signals.contexts.iframe.platform}function at(t){return t.signals.automation.webdriverWritable===!0}function ot(t){return t.signals.graphics.webGL.renderer.includes("SwiftShader")}function st(t){return t.signals.locale.internationalization.timezone==="UTC"}function ct(t){const e=t.signals.locale.languages.languages,n=t.signals.locale.languages.language;return n&&e&&Array.isArray(e)&&e.length>0?e[0]!==n:!1}function lt(t){return!!(t.signals.browser.features.chrome&&t.signals.browser.etsl!==33||t.signals.browser.features.safari&&t.signals.browser.etsl!==37||t.signals.browser.userAgent.includes("Firefox")&&t.signals.browser.etsl!==37)}function ut(t){return[t.signals.browser.userAgent,t.signals.contexts.iframe.userAgent,t.signals.contexts.webWorker.userAgent].some(n=>/bot|headless/i.test(n.toLowerCase()))}function dt(t){const e=t.signals.graphics.webgpu,n=t.signals.graphics.webGL,i=t.signals.browser.userAgent;return!!((n.vendor.includes("Apple")||n.renderer.includes("Apple"))&&!i.includes("Mac")||e.vendor.includes("apple")&&!i.includes("Mac")||e.vendor.includes("apple")&&!n.renderer.includes("Apple"))}function gt(t){const e=t.signals.device.platform,n=t.signals.browser.userAgent,i=t.signals.browser.highEntropyValues.platform;return!!(n.includes("Mac")&&(e.includes("Win")||e.includes("Linux"))||n.includes("Windows")&&(e.includes("Mac")||e.includes("Linux"))||n.includes("Linux")&&(e.includes("Mac")||e.includes("Win"))||i!==l&&i!==s&&(i.includes("Mac")&&(e.includes("Win")||e.includes("Linux"))||i.includes("Windows")&&(e.includes("Mac")||e.includes("Linux"))||i.includes("Linux")&&(e.includes("Mac")||e.includes("Win"))))}async function ht(t,e){const n=new TextEncoder().encode(e),i=new TextEncoder().encode(t),a=new Uint8Array(i.length);for(let m=0;m<i.length;m++)a[m]=i[m]^n[m%n.length];const d=String.fromCharCode(...a);return btoa(d)}class mt{constructor(){this.fingerprint={signals:{automation:{webdriver:r,webdriverWritable:r,selenium:r,cdp:r,playwright:r,navigatorPropertyDescriptors:r},device:{cpuCount:r,memory:r,platform:r,screenResolution:{width:r,height:r,pixelDepth:r,colorDepth:r,availableWidth:r,availableHeight:r,innerWidth:r,innerHeight:r,hasMultipleDisplays:r},multimediaDevices:{speakers:r,microphones:r,webcams:r},mediaQueries:{prefersColorScheme:r,prefersReducedMotion:r,prefersReducedTransparency:r,colorGamut:r,pointer:r,anyPointer:r,hover:r,anyHover:r,colorDepth:r}},browser:{userAgent:r,features:{bitmask:r,chrome:r,brave:r,applePaySupport:r,opera:r,serial:r,attachShadow:r,caches:r,webAssembly:r,buffer:r,showModalDialog:r,safari:r,webkitPrefixedFunction:r,mozPrefixedFunction:r,usb:r,browserCapture:r,paymentRequestUpdateEvent:r,pressureObserver:r,audioSession:r,selectAudioOutput:r,barcodeDetector:r,battery:r,devicePosture:r,documentPictureInPicture:r,eyeDropper:r,editContext:r,fencedFrame:r,sanitizer:r,otpCredential:r},plugins:{isValidPluginArray:r,pluginCount:r,pluginNamesHash:r,pluginConsistency1:r,pluginOverflow:r},extensions:{bitmask:r,extensions:r},highEntropyValues:{architecture:r,bitness:r,brands:r,mobile:r,model:r,platform:r,platformVersion:r,uaFullVersion:r},etsl:r,maths:r,toSourceError:{toSourceError:r,hasToSource:r}},graphics:{webGL:{vendor:r,renderer:r},webgpu:{vendor:r,architecture:r,device:r,description:r},canvas:{hasModifiedCanvas:r,canvasFingerprint:r}},codecs:{audioCanPlayTypeHash:r,videoCanPlayTypeHash:r,audioMediaSourceHash:r,videoMediaSourceHash:r,rtcAudioCapabilitiesHash:r,rtcVideoCapabilitiesHash:r,hasMediaSource:r},locale:{internationalization:{timezone:r,localeLanguage:r},languages:{languages:r,language:r}},contexts:{iframe:{webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r},webWorker:{webdriver:r,userAgent:r,platform:r,memory:r,cpuCount:r,language:r,vendor:r,renderer:r}}},fsid:r,nonce:r,time:r,url:r,fastBotDetection:!1,fastBotDetectionDetails:{headlessChromeScreenResolution:{detected:!1,severity:"high"},hasWebdriver:{detected:!1,severity:"high"},hasWebdriverWritable:{detected:!1,severity:"high"},hasSeleniumProperty:{detected:!1,severity:"high"},hasCDP:{detected:!1,severity:"high"},hasPlaywright:{detected:!1,severity:"high"},hasImpossibleDeviceMemory:{detected:!1,severity:"high"},hasHighCPUCount:{detected:!1,severity:"high"},hasMissingChromeObject:{detected:!1,severity:"high"},hasWebdriverIframe:{detected:!1,severity:"high"},hasWebdriverWorker:{detected:!1,severity:"high"},hasMismatchWebGLInWorker:{detected:!1,severity:"high"},hasMismatchPlatformIframe:{detected:!1,severity:"high"},hasMismatchPlatformWorker:{detected:!1,severity:"high"},hasSwiftshaderRenderer:{detected:!1,severity:"low"},hasUTCTimezone:{detected:!1,severity:"medium"},hasMismatchLanguages:{detected:!1,severity:"low"},hasInconsistentEtsl:{detected:!1,severity:"high"},hasBotUserAgent:{detected:!1,severity:"high"},hasGPUMismatch:{detected:!1,severity:"high"},hasPlatformMismatch:{detected:!1,severity:"high"}}}}async collectSignal(e){try{return await e()}catch{return l}}generateFingerprintScannerId(){try{const e=this.fingerprint.signals,n=this.fingerprint.fastBotDetectionDetails,i="FS1",d=[n.headlessChromeScreenResolution.detected,n.hasWebdriver.detected,n.hasWebdriverWritable.detected,n.hasSeleniumProperty.detected,n.hasCDP.detected,n.hasPlaywright.detected,n.hasImpossibleDeviceMemory.detected,n.hasHighCPUCount.detected,n.hasMissingChromeObject.detected,n.hasWebdriverIframe.detected,n.hasWebdriverWorker.detected,n.hasMismatchWebGLInWorker.detected,n.hasMismatchPlatformIframe.detected,n.hasMismatchPlatformWorker.detected,n.hasSwiftshaderRenderer.detected,n.hasUTCTimezone.detected,n.hasMismatchLanguages.detected,n.hasInconsistentEtsl.detected,n.hasBotUserAgent.detected,n.hasGPUMismatch.detected,n.hasPlatformMismatch.detected].map(u=>u?"1":"0").join(""),m=[e.automation.webdriver===!0,e.automation.webdriverWritable===!0,e.automation.selenium===!0,e.automation.cdp===!0,e.automation.playwright===!0].map(u=>u?"1":"0").join(""),w=p(String(e.automation.navigatorPropertyDescriptors)).slice(0,4),o=`${m}h${w}`,v=typeof e.device.screenResolution.width=="number"?e.device.screenResolution.width:0,b=typeof e.device.screenResolution.height=="number"?e.device.screenResolution.height:0,E=typeof e.device.cpuCount=="number"?String(e.device.cpuCount).padStart(2,"0"):"00",k=typeof e.device.memory=="number"?String(Math.round(e.device.memory)).padStart(2,"0"):"00",D=[e.device.screenResolution.hasMultipleDisplays===!0,e.device.mediaQueries.prefersReducedMotion===!0,e.device.mediaQueries.prefersReducedTransparency===!0,e.device.mediaQueries.hover===!0,e.device.mediaQueries.anyHover===!0].map(u=>u?"1":"0").join(""),_=[e.device.platform,e.device.screenResolution.pixelDepth,e.device.screenResolution.colorDepth,e.device.multimediaDevices.speakers,e.device.multimediaDevices.microphones,e.device.multimediaDevices.webcams,e.device.mediaQueries.prefersColorScheme,e.device.mediaQueries.colorGamut,e.device.mediaQueries.pointer,e.device.mediaQueries.anyPointer,e.device.mediaQueries.colorDepth].map(u=>String(u)).join("|"),R=p(_).slice(0,6),I=`${v}x${b}c${E}m${k}b${D}h${R}`,L=typeof e.browser.features.bitmask=="string"?e.browser.features.bitmask:"0000000000",T=typeof e.browser.extensions.bitmask=="string"?e.browser.extensions.bitmask:"00000000",O=[e.browser.plugins.isValidPluginArray===!0,e.browser.plugins.pluginConsistency1===!0,e.browser.plugins.pluginOverflow===!0,e.browser.toSourceError.hasToSource===!0].map(u=>u?"1":"0").join(""),H=[e.browser.userAgent,e.browser.etsl,e.browser.maths,e.browser.plugins.pluginCount,e.browser.plugins.pluginNamesHash,e.browser.toSourceError.toSourceError,e.browser.highEntropyValues.architecture,e.browser.highEntropyValues.bitness,e.browser.highEntropyValues.platform,e.browser.highEntropyValues.platformVersion,e.browser.highEntropyValues.uaFullVersion,e.browser.highEntropyValues.mobile].map(u=>String(u)).join("|"),U=p(H).slice(0,6),F=`f${L}e${T}p${O}h${U}`,G=[e.graphics.canvas.hasModifiedCanvas===!0].map(u=>u?"1":"0").join(""),V=[e.graphics.webGL.vendor,e.graphics.webGL.renderer,e.graphics.webgpu.vendor,e.graphics.webgpu.architecture,e.graphics.webgpu.device,e.graphics.webgpu.description,e.graphics.canvas.canvasFingerprint].map(u=>String(u)).join("|"),B=p(V).slice(0,6),j=`${G}h${B}`,N=[e.codecs.hasMediaSource===!0].map(u=>u?"1":"0").join(""),z=[e.codecs.audioCanPlayTypeHash,e.codecs.videoCanPlayTypeHash,e.codecs.audioMediaSourceHash,e.codecs.videoMediaSourceHash,e.codecs.rtcAudioCapabilitiesHash,e.codecs.rtcVideoCapabilitiesHash].map(u=>String(u)).join("|"),$=p(z).slice(0,6),Q=`${N}h${$}`,q=typeof e.locale.languages.language=="string"?e.locale.languages.language.slice(0,2).toLowerCase():"xx",K=Array.isArray(e.locale.languages.languages)?e.locale.languages.languages.length:0,J=(typeof e.locale.internationalization.timezone=="string"?e.locale.internationalization.timezone:"unknown").replace(/[\/\s]/g,"-"),Y=[e.locale.internationalization.timezone,e.locale.internationalization.localeLanguage,Array.isArray(e.locale.languages.languages)?e.locale.languages.languages.join(","):e.locale.languages.languages,e.locale.languages.language].map(u=>String(u)).join("|"),Z=p(Y).slice(0,4),X=`${q}${K}t${J}_h${Z}`,ee=[W(this.fingerprint,"iframe"),W(this.fingerprint,"worker"),e.contexts.iframe.webdriver===!0,e.contexts.webWorker.webdriver===!0].map(u=>u?"1":"0").join(""),te=[e.contexts.iframe.userAgent,e.contexts.iframe.platform,e.contexts.iframe.memory,e.contexts.iframe.cpuCount,e.contexts.iframe.language,e.contexts.webWorker.userAgent,e.contexts.webWorker.platform,e.contexts.webWorker.memory,e.contexts.webWorker.cpuCount,e.contexts.webWorker.language,e.contexts.webWorker.vendor,e.contexts.webWorker.renderer].map(u=>String(u)).join("|"),re=p(te).slice(0,6),ne=`${ee}h${re}`;return[i,d,o,I,F,j,Q,X,ne].join("_")}catch(e){return console.error("Error generating fingerprint scanner id",e),l}}async encryptFingerprint(e){const n="__DEFAULT_FPSCANNER_KEY__";return n.length>20&&n.indexOf("DEFAULT")>0&&n.indexOf("FPSCANNER")>0&&console.warn('[fpscanner] WARNING: Using default encryption key! Run "npx fpscanner build --key=your-secret-key" to inject your own key. See: https://github.com/antoinevastel/fpscanner#advanced-custom-builds'),await ht(JSON.stringify(e),n)}getDetectionRules(){return[{name:"headlessChromeScreenResolution",severity:g,test:Ne},{name:"hasWebdriver",severity:g,test:ze},{name:"hasWebdriverWritable",severity:g,test:at},{name:"hasSeleniumProperty",severity:g,test:$e},{name:"hasCDP",severity:g,test:Qe},{name:"hasPlaywright",severity:g,test:qe},{name:"hasImpossibleDeviceMemory",severity:g,test:Ke},{name:"hasHighCPUCount",severity:g,test:Je},{name:"hasMissingChromeObject",severity:g,test:Ze},{name:"hasWebdriverIframe",severity:g,test:Xe},{name:"hasWebdriverWorker",severity:g,test:et},{name:"hasMismatchWebGLInWorker",severity:g,test:tt},{name:"hasMismatchPlatformIframe",severity:g,test:it},{name:"hasMismatchPlatformWorker",severity:g,test:nt},{name:"hasSwiftshaderRenderer",severity:S,test:ot},{name:"hasUTCTimezone",severity:se,test:st},{name:"hasMismatchLanguages",severity:S,test:ct},{name:"hasInconsistentEtsl",severity:g,test:lt},{name:"hasBotUserAgent",severity:g,test:ut},{name:"hasGPUMismatch",severity:g,test:dt},{name:"hasPlatformMismatch",severity:g,test:gt}]}runDetectionRules(){const e=this.getDetectionRules(),n={headlessChromeScreenResolution:{detected:!1,severity:"high"},hasWebdriver:{detected:!1,severity:"high"},hasWebdriverWritable:{detected:!1,severity:"high"},hasSeleniumProperty:{detected:!1,severity:"high"},hasCDP:{detected:!1,severity:"high"},hasPlaywright:{detected:!1,severity:"high"},hasImpossibleDeviceMemory:{detected:!1,severity:"high"},hasHighCPUCount:{detected:!1,severity:"high"},hasMissingChromeObject:{detected:!1,severity:"high"},hasWebdriverIframe:{detected:!1,severity:"high"},hasWebdriverWorker:{detected:!1,severity:"high"},hasMismatchWebGLInWorker:{detected:!1,severity:"high"},hasMismatchPlatformIframe:{detected:!1,severity:"high"},hasMismatchPlatformWorker:{detected:!1,severity:"high"},hasSwiftshaderRenderer:{detected:!1,severity:"low"},hasUTCTimezone:{detected:!1,severity:"medium"},hasMismatchLanguages:{detected:!1,severity:"low"},hasInconsistentEtsl:{detected:!1,severity:"high"},hasBotUserAgent:{detected:!1,severity:"high"},hasGPUMismatch:{detected:!1,severity:"high"},hasPlatformMismatch:{detected:!1,severity:"high"}};for(const i of e)try{const a=i.test(this.fingerprint);n[i.name]={detected:a,severity:i.severity}}catch{n[i.name]={detected:!1,severity:i.severity}}return n}async collectFingerprint(e={encrypt:!0}){const{encrypt:n=!0,skipWorker:i=!1}=e,a=this.fingerprint.signals,d={webdriver:this.collectSignal(ie),webdriverWritable:this.collectSignal(Se),selenium:this.collectSignal(be),cdp:this.collectSignal(le),playwright:this.collectSignal(de),navigatorPropertyDescriptors:this.collectSignal(He),cpuCount:this.collectSignal(ge),memory:this.collectSignal(me),platform:this.collectSignal(oe),screenResolution:this.collectSignal(ve),multimediaDevices:this.collectSignal(ke),mediaQueries:this.collectSignal(je),userAgent:this.collectSignal(ae),browserFeatures:this.collectSignal(Be),plugins:this.collectSignal(Ee),browserExtensions:this.collectSignal(Ve),highEntropyValues:this.collectSignal(Ce),etsl:this.collectSignal(pe),maths:this.collectSignal(he),toSourceError:this.collectSignal(Re),webGL:this.collectSignal(ue),webgpu:this.collectSignal(ye),canvas:this.collectSignal(Oe),mediaCodecs:this.collectSignal(Ie),internationalization:this.collectSignal(fe),languages:this.collectSignal(we),iframe:this.collectSignal(De),webWorker:i?Promise.resolve({webdriver:f,userAgent:f,platform:f,memory:f,cpuCount:f,language:f,vendor:f,renderer:f}):this.collectSignal(_e),nonce:this.collectSignal(Ue),time:this.collectSignal(Fe),url:this.collectSignal(Ge)},m=Object.keys(d),w=await Promise.all(Object.values(d)),o=Object.fromEntries(m.map((v,b)=>[v,w[b]]));return a.automation.webdriver=o.webdriver,a.automation.webdriverWritable=o.webdriverWritable,a.automation.selenium=o.selenium,a.automation.cdp=o.cdp,a.automation.playwright=o.playwright,a.automation.navigatorPropertyDescriptors=o.navigatorPropertyDescriptors,a.device.cpuCount=o.cpuCount,a.device.memory=o.memory,a.device.platform=o.platform,a.device.screenResolution=o.screenResolution,a.device.multimediaDevices=o.multimediaDevices,a.device.mediaQueries=o.mediaQueries,a.browser.userAgent=o.userAgent,a.browser.features=o.browserFeatures,a.browser.plugins=o.plugins,a.browser.extensions=o.browserExtensions,a.browser.highEntropyValues=o.highEntropyValues,a.browser.etsl=o.etsl,a.browser.maths=o.maths,a.browser.toSourceError=o.toSourceError,a.graphics.webGL=o.webGL,a.graphics.webgpu=o.webgpu,a.graphics.canvas=o.canvas,a.codecs=o.mediaCodecs,a.locale.internationalization=o.internationalization,a.locale.languages=o.languages,a.contexts.iframe=o.iframe,a.contexts.webWorker=o.webWorker,this.fingerprint.nonce=o.nonce,this.fingerprint.time=o.time,this.fingerprint.url=o.url,this.fingerprint.fastBotDetectionDetails=this.runDetectionRules(),this.fingerprint.fastBotDetection=Object.values(this.fingerprint.fastBotDetectionDetails).some(v=>v.detected),this.fingerprint.fsid=this.generateFingerprintScannerId(),n?await this.encryptFingerprint(JSON.stringify(this.fingerprint)):this.fingerprint}}exports.default=mt;
@@ -1,13 +1,13 @@
1
- function ne() {
1
+ function ie() {
2
2
  return navigator.webdriver;
3
3
  }
4
- function ie() {
4
+ function ae() {
5
5
  return navigator.userAgent;
6
6
  }
7
- function ae() {
7
+ function oe() {
8
8
  return navigator.platform;
9
9
  }
10
- const l = "ERROR", r = "INIT", s = "NA", f = "SKIPPED", d = "high", b = "low", oe = "medium";
10
+ const l = "ERROR", r = "INIT", s = "NA", f = "SKIPPED", g = "high", S = "low", se = "medium";
11
11
  function p(t) {
12
12
  let e = 0;
13
13
  for (let n = 0, i = t.length; n < i; n++) {
@@ -20,10 +20,10 @@ function h(t, e) {
20
20
  for (const n in t)
21
21
  t[n] = e;
22
22
  }
23
- function se() {
23
+ function ce() {
24
24
  return navigator.buildID === "20181001000000";
25
25
  }
26
- function ce() {
26
+ function le() {
27
27
  try {
28
28
  let t = !1;
29
29
  const e = Error.prepareStackTrace;
@@ -36,12 +36,12 @@ function ce() {
36
36
  return l;
37
37
  }
38
38
  }
39
- function le() {
39
+ function ue() {
40
40
  const t = {
41
41
  vendor: r,
42
42
  renderer: r
43
43
  };
44
- if (se())
44
+ if (ce())
45
45
  return h(t, s), t;
46
46
  try {
47
47
  var e = document.createElement("canvas"), n = e.getContext("webgl") || e.getContext("experimental-webgl");
@@ -51,10 +51,10 @@ function le() {
51
51
  }
52
52
  return t;
53
53
  }
54
- function ue() {
54
+ function de() {
55
55
  return "__pwInitScripts" in window || "__playwright__binding__" in window;
56
56
  }
57
- function de() {
57
+ function ge() {
58
58
  return navigator.hardwareConcurrency || s;
59
59
  }
60
60
  function he() {
@@ -73,13 +73,13 @@ function he() {
73
73
  }
74
74
  }), p(t.map(String).join(","));
75
75
  }
76
- function ge() {
76
+ function me() {
77
77
  return navigator.deviceMemory || s;
78
78
  }
79
- function me() {
79
+ function pe() {
80
80
  return eval.toString().length;
81
81
  }
82
- function pe() {
82
+ function fe() {
83
83
  const t = {
84
84
  timezone: r,
85
85
  localeLanguage: r
@@ -95,7 +95,7 @@ function pe() {
95
95
  }
96
96
  return t;
97
97
  }
98
- function fe() {
98
+ function ve() {
99
99
  return {
100
100
  width: window.screen.width,
101
101
  height: window.screen.height,
@@ -108,13 +108,13 @@ function fe() {
108
108
  hasMultipleDisplays: typeof screen.isExtended < "u" ? screen.isExtended : s
109
109
  };
110
110
  }
111
- function ve() {
111
+ function we() {
112
112
  return {
113
113
  languages: navigator.languages,
114
114
  language: navigator.language
115
115
  };
116
116
  }
117
- async function we() {
117
+ async function ye() {
118
118
  const t = {
119
119
  vendor: r,
120
120
  architecture: r,
@@ -132,7 +132,7 @@ async function we() {
132
132
  h(t, s);
133
133
  return t;
134
134
  }
135
- function ye() {
135
+ function be() {
136
136
  const t = [
137
137
  "__driver_evaluate",
138
138
  "__webdriver_evaluate",
@@ -166,7 +166,7 @@ function ye() {
166
166
  }
167
167
  return e = e || !!document.__webdriver_script_fn || !!window.domAutomation || !!window.domAutomationController, e;
168
168
  }
169
- function be() {
169
+ function Se() {
170
170
  try {
171
171
  const t = "webdriver", e = window.navigator;
172
172
  if (!e[t] && !e.hasOwnProperty(t)) {
@@ -179,7 +179,7 @@ function be() {
179
179
  return !1;
180
180
  }
181
181
  }
182
- async function Se() {
182
+ async function Ce() {
183
183
  const t = window.navigator, e = {
184
184
  architecture: r,
185
185
  bitness: r,
@@ -210,7 +210,7 @@ async function Se() {
210
210
  h(e, s);
211
211
  return e;
212
212
  }
213
- function Ce() {
213
+ function Pe() {
214
214
  if (!navigator.plugins) return !1;
215
215
  const t = typeof navigator.plugins.toString == "function" ? navigator.plugins.toString() : navigator.plugins.constructor && typeof navigator.plugins.constructor.toString == "function" ? navigator.plugins.constructor.toString() : typeof navigator.plugins;
216
216
  return t === "[object PluginArray]" || t === "[object MSPluginsCollection]" || t === "[object HTMLPluginsCollection]";
@@ -222,7 +222,7 @@ function Ae() {
222
222
  t.push(navigator.plugins[e].name);
223
223
  return p(t.join(","));
224
224
  }
225
- function Pe() {
225
+ function Me() {
226
226
  return navigator.plugins ? navigator.plugins.length : s;
227
227
  }
228
228
  function xe() {
@@ -241,7 +241,7 @@ function We() {
241
241
  return l;
242
242
  }
243
243
  }
244
- function Me() {
244
+ function Ee() {
245
245
  const t = {
246
246
  isValidPluginArray: r,
247
247
  pluginCount: r,
@@ -250,13 +250,13 @@ function Me() {
250
250
  pluginOverflow: r
251
251
  };
252
252
  try {
253
- t.isValidPluginArray = Ce(), t.pluginCount = Pe(), t.pluginNamesHash = Ae(), t.pluginConsistency1 = xe(), t.pluginOverflow = We();
253
+ t.isValidPluginArray = Pe(), t.pluginCount = Me(), t.pluginNamesHash = Ae(), t.pluginConsistency1 = xe(), t.pluginOverflow = We();
254
254
  } catch {
255
255
  h(t, l);
256
256
  }
257
257
  return t;
258
258
  }
259
- async function Ee() {
259
+ async function ke() {
260
260
  return new Promise(async function(t) {
261
261
  var e = {
262
262
  audiooutput: 0,
@@ -281,7 +281,7 @@ async function Ee() {
281
281
  return h(e, s), t(e);
282
282
  });
283
283
  }
284
- function ke() {
284
+ function De() {
285
285
  const t = {
286
286
  webdriver: r,
287
287
  userAgent: r,
@@ -306,7 +306,7 @@ function ke() {
306
306
  }
307
307
  return t;
308
308
  }
309
- async function De() {
309
+ async function _e() {
310
310
  return new Promise((t) => {
311
311
  const e = {
312
312
  vendor: r,
@@ -318,7 +318,7 @@ async function De() {
318
318
  cpuCount: r
319
319
  };
320
320
  let n = null, i = null, a = null;
321
- const g = () => {
321
+ const d = () => {
322
322
  a && clearTimeout(a), n && n.terminate(), i && URL.revokeObjectURL(i);
323
323
  };
324
324
  try {
@@ -355,24 +355,24 @@ async function De() {
355
355
  self.postMessage(fingerprintWorker);
356
356
  }`, w = new Blob([m], { type: "application/javascript" });
357
357
  i = URL.createObjectURL(w), n = new Worker(i), a = window.setTimeout(() => {
358
- g(), h(e, l), t(e);
358
+ d(), h(e, l), t(e);
359
359
  }, 2e3), n.onmessage = function(o) {
360
360
  try {
361
361
  e.vendor = o.data.vendor, e.renderer = o.data.renderer, e.userAgent = o.data.userAgent, e.language = o.data.language, e.platform = o.data.platform, e.memory = o.data.memory, e.cpuCount = o.data.cpuCount;
362
362
  } catch {
363
363
  h(e, l);
364
364
  } finally {
365
- g(), t(e);
365
+ d(), t(e);
366
366
  }
367
367
  }, n.onerror = function() {
368
- g(), h(e, l), t(e);
368
+ d(), h(e, l), t(e);
369
369
  };
370
370
  } catch {
371
- g(), h(e, l), t(e);
371
+ d(), h(e, l), t(e);
372
372
  }
373
373
  });
374
374
  }
375
- function _e() {
375
+ function Re() {
376
376
  const t = {
377
377
  toSourceError: r,
378
378
  hasToSource: !1
@@ -393,7 +393,7 @@ function _e() {
393
393
  }
394
394
  return t;
395
395
  }
396
- const S = [
396
+ const C = [
397
397
  'audio/mp4; codecs="mp4a.40.2"',
398
398
  "audio/mpeg;",
399
399
  'audio/webm; codecs="vorbis"',
@@ -402,7 +402,7 @@ const S = [
402
402
  'audio/ogg; codecs="speex"',
403
403
  'audio/ogg; codecs="flac"',
404
404
  'audio/3gpp; codecs="samr"'
405
- ], C = [
405
+ ], P = [
406
406
  'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
407
407
  'video/mp4; codecs="avc1.42E01E"',
408
408
  'video/mp4; codecs="avc1.58A01E"',
@@ -432,7 +432,7 @@ function A(t, e) {
432
432
  }
433
433
  return n;
434
434
  }
435
- function P(t) {
435
+ function M(t) {
436
436
  const e = {}, n = window.MediaSource;
437
437
  if (!n || typeof n.isTypeSupported != "function") {
438
438
  for (const i of t)
@@ -459,7 +459,7 @@ function x(t) {
459
459
  return l;
460
460
  }
461
461
  }
462
- function Re() {
462
+ function Ie() {
463
463
  const t = {
464
464
  audioCanPlayTypeHash: s,
465
465
  videoCanPlayTypeHash: s,
@@ -471,16 +471,16 @@ function Re() {
471
471
  };
472
472
  try {
473
473
  t.hasMediaSource = !!window.MediaSource;
474
- const e = A(S, "audio"), n = A(C, "video");
474
+ const e = A(C, "audio"), n = A(P, "video");
475
475
  t.audioCanPlayTypeHash = p(JSON.stringify(e)), t.videoCanPlayTypeHash = p(JSON.stringify(n));
476
- const i = P(S), a = P(C);
476
+ const i = M(C), a = M(P);
477
477
  t.audioMediaSourceHash = p(JSON.stringify(i)), t.videoMediaSourceHash = p(JSON.stringify(a)), t.rtcAudioCapabilitiesHash = x("audio"), t.rtcVideoCapabilitiesHash = x("video");
478
478
  } catch {
479
479
  h(t, l);
480
480
  }
481
481
  return t;
482
482
  }
483
- async function Ie() {
483
+ async function Le() {
484
484
  return new Promise((t) => {
485
485
  try {
486
486
  const e = new Image(), n = document.createElement("canvas").getContext("2d");
@@ -494,7 +494,7 @@ async function Ie() {
494
494
  }
495
495
  });
496
496
  }
497
- function Le() {
497
+ function Te() {
498
498
  var t = document.createElement("canvas");
499
499
  t.width = 400, t.height = 200, t.style.display = "inline";
500
500
  var e = t.getContext("2d");
@@ -504,14 +504,14 @@ function Le() {
504
504
  return l;
505
505
  }
506
506
  }
507
- async function Te() {
507
+ async function He() {
508
508
  const t = {
509
509
  hasModifiedCanvas: r,
510
510
  canvasFingerprint: r
511
511
  };
512
- return t.hasModifiedCanvas = await Ie(), t.canvasFingerprint = Le(), t;
512
+ return t.hasModifiedCanvas = await Le(), t.canvasFingerprint = Te(), t;
513
513
  }
514
- function He() {
514
+ function Oe() {
515
515
  const t = ["deviceMemory", "hardwareConcurrency", "language", "languages", "platform"], e = [];
516
516
  for (const n of t) {
517
517
  const i = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator), n);
@@ -519,13 +519,13 @@ function He() {
519
519
  }
520
520
  return e.join("");
521
521
  }
522
- function Oe() {
522
+ function Ue() {
523
523
  return Math.random().toString(36).substring(2, 15);
524
524
  }
525
525
  function Fe() {
526
526
  return (/* @__PURE__ */ new Date()).getTime();
527
527
  }
528
- function Ue() {
528
+ function Ge() {
529
529
  return window.location.href;
530
530
  }
531
531
  function W(t, e) {
@@ -536,17 +536,17 @@ function Ve() {
536
536
  const t = {
537
537
  bitmask: r,
538
538
  extensions: []
539
- }, e = document.body.hasAttribute("data-gr-ext-installed"), n = typeof window.ethereum < "u", i = document.getElementById("coupon-birds-drop-div") !== null, a = document.querySelector("deepl-input-controller") !== null, g = document.getElementById("monica-content-root") !== null, m = document.querySelector("chatgpt-sidebar") !== null, w = typeof window.__REQUESTLY__ < "u", o = Array.from(document.querySelectorAll("*")).filter((v) => v.tagName.toLowerCase().startsWith("veepn-")).length > 0;
539
+ }, e = document.body.hasAttribute("data-gr-ext-installed"), n = typeof window.ethereum < "u", i = document.getElementById("coupon-birds-drop-div") !== null, a = document.querySelector("deepl-input-controller") !== null, d = document.getElementById("monica-content-root") !== null, m = document.querySelector("chatgpt-sidebar") !== null, w = typeof window.__REQUESTLY__ < "u", o = Array.from(document.querySelectorAll("*")).filter((v) => v.tagName.toLowerCase().startsWith("veepn-")).length > 0;
540
540
  return t.bitmask = [
541
541
  e ? "1" : "0",
542
542
  n ? "1" : "0",
543
543
  i ? "1" : "0",
544
544
  a ? "1" : "0",
545
- g ? "1" : "0",
545
+ d ? "1" : "0",
546
546
  m ? "1" : "0",
547
547
  w ? "1" : "0",
548
548
  o ? "1" : "0"
549
- ].join(""), e && t.extensions.push("grammarly"), n && t.extensions.push("metamask"), i && t.extensions.push("coupon-birds"), a && t.extensions.push("deepl"), g && t.extensions.push("monica-ai"), m && t.extensions.push("sider-ai"), w && t.extensions.push("requestly"), o && t.extensions.push("veepn"), t;
549
+ ].join(""), e && t.extensions.push("grammarly"), n && t.extensions.push("metamask"), i && t.extensions.push("coupon-birds"), a && t.extensions.push("deepl"), d && t.extensions.push("monica-ai"), m && t.extensions.push("sider-ai"), w && t.extensions.push("requestly"), o && t.extensions.push("veepn"), t;
550
550
  }
551
551
  function c(t) {
552
552
  try {
@@ -555,7 +555,7 @@ function c(t) {
555
555
  return !1;
556
556
  }
557
557
  }
558
- function Ge() {
558
+ function Be() {
559
559
  const t = {
560
560
  bitmask: r,
561
561
  chrome: c(() => "chrome" in window),
@@ -589,7 +589,7 @@ function Ge() {
589
589
  }, e = Object.keys(t).filter((n) => n !== "bitmask").map((n) => t[n] ? "1" : "0").join("");
590
590
  return t.bitmask = e, t;
591
591
  }
592
- function Be() {
592
+ function je() {
593
593
  const t = {
594
594
  prefersColorScheme: r,
595
595
  prefersReducedMotion: r,
@@ -612,87 +612,103 @@ function Be() {
612
612
  }
613
613
  return t;
614
614
  }
615
- function je(t) {
615
+ function Ne(t) {
616
616
  const e = t.signals.device.screenResolution;
617
617
  return e.width === 800 && e.height === 600 || e.availableWidth === 800 && e.availableHeight === 600 || e.innerWidth === 800 && e.innerHeight === 600;
618
618
  }
619
- function Ne(t) {
620
- return t.signals.automation.webdriver === !0;
621
- }
622
619
  function ze(t) {
623
- return !!t.signals.automation.selenium;
620
+ return t.signals.automation.webdriver === !0;
624
621
  }
625
622
  function $e(t) {
626
- return t.signals.automation.cdp === !0;
623
+ return !!t.signals.automation.selenium;
627
624
  }
628
625
  function Qe(t) {
629
- return t.signals.automation.playwright === !0;
626
+ return t.signals.automation.cdp === !0;
630
627
  }
631
628
  function qe(t) {
632
- return typeof t.signals.device.memory != "number" ? !1 : t.signals.device.memory > 32 || t.signals.device.memory < 0.25;
629
+ return t.signals.automation.playwright === !0;
633
630
  }
634
631
  function Ke(t) {
635
- return typeof t.signals.device.cpuCount != "number" ? !1 : t.signals.device.cpuCount > 70;
632
+ return typeof t.signals.device.memory != "number" ? !1 : t.signals.device.memory > 32 || t.signals.device.memory < 0.25;
636
633
  }
637
634
  function Je(t) {
638
- const e = t.signals.browser.userAgent;
639
- return t.signals.browser.features.chrome === !1 && typeof e == "string" && e.includes("Chrome");
635
+ return typeof t.signals.device.cpuCount != "number" ? !1 : t.signals.device.cpuCount > 70;
640
636
  }
641
637
  function Ye(t) {
642
- return t.signals.contexts.iframe.webdriver === !0;
638
+ return t.includes("Android") || t.includes("iPhone") || t.includes("iPod") || t.includes("iPad");
643
639
  }
644
640
  function Ze(t) {
645
- return t.signals.contexts.webWorker.webdriver === !0;
641
+ const e = t.signals.browser.userAgent;
642
+ return typeof e != "string" || !e.includes("Chrome") || Ye(e) ? !1 : t.signals.browser.features.chrome === !1;
646
643
  }
647
644
  function Xe(t) {
648
- const e = t.signals.contexts.webWorker, n = t.signals.graphics.webGL;
649
- return e.vendor === l || e.renderer === l || n.vendor === s || n.renderer === s || e.vendor === f ? !1 : e.vendor !== n.vendor || e.renderer !== n.renderer;
645
+ return t.signals.contexts.iframe.webdriver === !0;
650
646
  }
651
647
  function et(t) {
652
- return t.signals.contexts.webWorker.platform === s || t.signals.contexts.webWorker.platform === l || t.signals.contexts.webWorker.platform === f ? !1 : t.signals.device.platform !== t.signals.contexts.webWorker.platform;
648
+ return t.signals.contexts.webWorker.webdriver === !0;
649
+ }
650
+ function y(t) {
651
+ return t === s || t === l || t === f || t === r;
653
652
  }
654
653
  function tt(t) {
654
+ const e = t.signals.contexts.webWorker, n = t.signals.graphics.webGL;
655
+ return y(n.vendor) || y(n.renderer) || y(e.vendor) || y(e.renderer) ? !1 : e.vendor !== n.vendor || e.renderer !== n.renderer;
656
+ }
657
+ function rt(t, e) {
658
+ const n = t.includes("iPad"), i = e.includes("iPad");
659
+ if (n === i)
660
+ return !1;
661
+ const a = (d) => d === "MacIntel" || d === "MacPPC";
662
+ return a(t) || a(e);
663
+ }
664
+ function nt(t) {
665
+ if (t.signals.contexts.webWorker.platform === s || t.signals.contexts.webWorker.platform === l || t.signals.contexts.webWorker.platform === f)
666
+ return !1;
667
+ const e = t.signals.device.platform, n = t.signals.contexts.webWorker.platform;
668
+ return !(e === n || rt(e, n));
669
+ }
670
+ function it(t) {
655
671
  return t.signals.contexts.iframe.platform === s || t.signals.contexts.iframe.platform === l ? !1 : t.signals.device.platform !== t.signals.contexts.iframe.platform;
656
672
  }
657
- function rt(t) {
673
+ function at(t) {
658
674
  return t.signals.automation.webdriverWritable === !0;
659
675
  }
660
- function nt(t) {
676
+ function ot(t) {
661
677
  return t.signals.graphics.webGL.renderer.includes("SwiftShader");
662
678
  }
663
- function it(t) {
679
+ function st(t) {
664
680
  return t.signals.locale.internationalization.timezone === "UTC";
665
681
  }
666
- function at(t) {
682
+ function ct(t) {
667
683
  const e = t.signals.locale.languages.languages, n = t.signals.locale.languages.language;
668
684
  return n && e && Array.isArray(e) && e.length > 0 ? e[0] !== n : !1;
669
685
  }
670
- function ot(t) {
686
+ function lt(t) {
671
687
  return !!(t.signals.browser.features.chrome && t.signals.browser.etsl !== 33 || t.signals.browser.features.safari && t.signals.browser.etsl !== 37 || t.signals.browser.userAgent.includes("Firefox") && t.signals.browser.etsl !== 37);
672
688
  }
673
- function st(t) {
689
+ function ut(t) {
674
690
  return [
675
691
  t.signals.browser.userAgent,
676
692
  t.signals.contexts.iframe.userAgent,
677
693
  t.signals.contexts.webWorker.userAgent
678
694
  ].some((n) => /bot|headless/i.test(n.toLowerCase()));
679
695
  }
680
- function ct(t) {
696
+ function dt(t) {
681
697
  const e = t.signals.graphics.webgpu, n = t.signals.graphics.webGL, i = t.signals.browser.userAgent;
682
698
  return !!((n.vendor.includes("Apple") || n.renderer.includes("Apple")) && !i.includes("Mac") || e.vendor.includes("apple") && !i.includes("Mac") || e.vendor.includes("apple") && !n.renderer.includes("Apple"));
683
699
  }
684
- function lt(t) {
700
+ function gt(t) {
685
701
  const e = t.signals.device.platform, n = t.signals.browser.userAgent, i = t.signals.browser.highEntropyValues.platform;
686
702
  return !!(n.includes("Mac") && (e.includes("Win") || e.includes("Linux")) || n.includes("Windows") && (e.includes("Mac") || e.includes("Linux")) || n.includes("Linux") && (e.includes("Mac") || e.includes("Win")) || i !== l && i !== s && (i.includes("Mac") && (e.includes("Win") || e.includes("Linux")) || i.includes("Windows") && (e.includes("Mac") || e.includes("Linux")) || i.includes("Linux") && (e.includes("Mac") || e.includes("Win"))));
687
703
  }
688
- async function ut(t, e) {
704
+ async function ht(t, e) {
689
705
  const n = new TextEncoder().encode(e), i = new TextEncoder().encode(t), a = new Uint8Array(i.length);
690
706
  for (let m = 0; m < i.length; m++)
691
707
  a[m] = i[m] ^ n[m % n.length];
692
- const g = String.fromCharCode(...a);
693
- return btoa(g);
708
+ const d = String.fromCharCode(...a);
709
+ return btoa(d);
694
710
  }
695
- class ht {
711
+ class pt {
696
712
  constructor() {
697
713
  this.fingerprint = {
698
714
  signals: {
@@ -921,7 +937,7 @@ class ht {
921
937
  */
922
938
  generateFingerprintScannerId() {
923
939
  try {
924
- const e = this.fingerprint.signals, n = this.fingerprint.fastBotDetectionDetails, i = "FS1", g = [
940
+ const e = this.fingerprint.signals, n = this.fingerprint.fastBotDetectionDetails, i = "FS1", d = [
925
941
  n.headlessChromeScreenResolution.detected,
926
942
  n.hasWebdriver.detected,
927
943
  n.hasWebdriverWritable.detected,
@@ -950,13 +966,13 @@ class ht {
950
966
  e.automation.selenium === !0,
951
967
  e.automation.cdp === !0,
952
968
  e.automation.playwright === !0
953
- ].map((u) => u ? "1" : "0").join(""), w = p(String(e.automation.navigatorPropertyDescriptors)).slice(0, 4), o = `${m}h${w}`, v = typeof e.device.screenResolution.width == "number" ? e.device.screenResolution.width : 0, y = typeof e.device.screenResolution.height == "number" ? e.device.screenResolution.height : 0, M = typeof e.device.cpuCount == "number" ? String(e.device.cpuCount).padStart(2, "0") : "00", E = typeof e.device.memory == "number" ? String(Math.round(e.device.memory)).padStart(2, "0") : "00", k = [
969
+ ].map((u) => u ? "1" : "0").join(""), w = p(String(e.automation.navigatorPropertyDescriptors)).slice(0, 4), o = `${m}h${w}`, v = typeof e.device.screenResolution.width == "number" ? e.device.screenResolution.width : 0, b = typeof e.device.screenResolution.height == "number" ? e.device.screenResolution.height : 0, E = typeof e.device.cpuCount == "number" ? String(e.device.cpuCount).padStart(2, "0") : "00", k = typeof e.device.memory == "number" ? String(Math.round(e.device.memory)).padStart(2, "0") : "00", D = [
954
970
  e.device.screenResolution.hasMultipleDisplays === !0,
955
971
  e.device.mediaQueries.prefersReducedMotion === !0,
956
972
  e.device.mediaQueries.prefersReducedTransparency === !0,
957
973
  e.device.mediaQueries.hover === !0,
958
974
  e.device.mediaQueries.anyHover === !0
959
- ].map((u) => u ? "1" : "0").join(""), D = [
975
+ ].map((u) => u ? "1" : "0").join(""), _ = [
960
976
  e.device.platform,
961
977
  e.device.screenResolution.pixelDepth,
962
978
  e.device.screenResolution.colorDepth,
@@ -968,12 +984,12 @@ class ht {
968
984
  e.device.mediaQueries.pointer,
969
985
  e.device.mediaQueries.anyPointer,
970
986
  e.device.mediaQueries.colorDepth
971
- ].map((u) => String(u)).join("|"), _ = p(D).slice(0, 6), R = `${v}x${y}c${M}m${E}b${k}h${_}`, I = typeof e.browser.features.bitmask == "string" ? e.browser.features.bitmask : "0000000000", L = typeof e.browser.extensions.bitmask == "string" ? e.browser.extensions.bitmask : "00000000", T = [
987
+ ].map((u) => String(u)).join("|"), R = p(_).slice(0, 6), I = `${v}x${b}c${E}m${k}b${D}h${R}`, L = typeof e.browser.features.bitmask == "string" ? e.browser.features.bitmask : "0000000000", T = typeof e.browser.extensions.bitmask == "string" ? e.browser.extensions.bitmask : "00000000", H = [
972
988
  e.browser.plugins.isValidPluginArray === !0,
973
989
  e.browser.plugins.pluginConsistency1 === !0,
974
990
  e.browser.plugins.pluginOverflow === !0,
975
991
  e.browser.toSourceError.hasToSource === !0
976
- ].map((u) => u ? "1" : "0").join(""), H = [
992
+ ].map((u) => u ? "1" : "0").join(""), O = [
977
993
  e.browser.userAgent,
978
994
  e.browser.etsl,
979
995
  e.browser.maths,
@@ -986,7 +1002,7 @@ class ht {
986
1002
  e.browser.highEntropyValues.platformVersion,
987
1003
  e.browser.highEntropyValues.uaFullVersion,
988
1004
  e.browser.highEntropyValues.mobile
989
- ].map((u) => String(u)).join("|"), O = p(H).slice(0, 6), F = `f${I}e${L}p${T}h${O}`, U = [
1005
+ ].map((u) => String(u)).join("|"), U = p(O).slice(0, 6), F = `f${L}e${T}p${H}h${U}`, G = [
990
1006
  e.graphics.canvas.hasModifiedCanvas === !0
991
1007
  ].map((u) => u ? "1" : "0").join(""), V = [
992
1008
  e.graphics.webGL.vendor,
@@ -996,26 +1012,26 @@ class ht {
996
1012
  e.graphics.webgpu.device,
997
1013
  e.graphics.webgpu.description,
998
1014
  e.graphics.canvas.canvasFingerprint
999
- ].map((u) => String(u)).join("|"), G = p(V).slice(0, 6), B = `${U}h${G}`, j = [
1015
+ ].map((u) => String(u)).join("|"), B = p(V).slice(0, 6), j = `${G}h${B}`, N = [
1000
1016
  e.codecs.hasMediaSource === !0
1001
- ].map((u) => u ? "1" : "0").join(""), N = [
1017
+ ].map((u) => u ? "1" : "0").join(""), z = [
1002
1018
  e.codecs.audioCanPlayTypeHash,
1003
1019
  e.codecs.videoCanPlayTypeHash,
1004
1020
  e.codecs.audioMediaSourceHash,
1005
1021
  e.codecs.videoMediaSourceHash,
1006
1022
  e.codecs.rtcAudioCapabilitiesHash,
1007
1023
  e.codecs.rtcVideoCapabilitiesHash
1008
- ].map((u) => String(u)).join("|"), z = p(N).slice(0, 6), $ = `${j}h${z}`, Q = typeof e.locale.languages.language == "string" ? e.locale.languages.language.slice(0, 2).toLowerCase() : "xx", q = Array.isArray(e.locale.languages.languages) ? e.locale.languages.languages.length : 0, K = (typeof e.locale.internationalization.timezone == "string" ? e.locale.internationalization.timezone : "unknown").replace(/[\/\s]/g, "-"), J = [
1024
+ ].map((u) => String(u)).join("|"), $ = p(z).slice(0, 6), Q = `${N}h${$}`, q = typeof e.locale.languages.language == "string" ? e.locale.languages.language.slice(0, 2).toLowerCase() : "xx", K = Array.isArray(e.locale.languages.languages) ? e.locale.languages.languages.length : 0, J = (typeof e.locale.internationalization.timezone == "string" ? e.locale.internationalization.timezone : "unknown").replace(/[\/\s]/g, "-"), Y = [
1009
1025
  e.locale.internationalization.timezone,
1010
1026
  e.locale.internationalization.localeLanguage,
1011
1027
  Array.isArray(e.locale.languages.languages) ? e.locale.languages.languages.join(",") : e.locale.languages.languages,
1012
1028
  e.locale.languages.language
1013
- ].map((u) => String(u)).join("|"), Y = p(J).slice(0, 4), Z = `${Q}${q}t${K}_h${Y}`, X = [
1029
+ ].map((u) => String(u)).join("|"), Z = p(Y).slice(0, 4), X = `${q}${K}t${J}_h${Z}`, ee = [
1014
1030
  W(this.fingerprint, "iframe"),
1015
1031
  W(this.fingerprint, "worker"),
1016
1032
  e.contexts.iframe.webdriver === !0,
1017
1033
  e.contexts.webWorker.webdriver === !0
1018
- ].map((u) => u ? "1" : "0").join(""), ee = [
1034
+ ].map((u) => u ? "1" : "0").join(""), te = [
1019
1035
  e.contexts.iframe.userAgent,
1020
1036
  e.contexts.iframe.platform,
1021
1037
  e.contexts.iframe.memory,
@@ -1028,17 +1044,17 @@ class ht {
1028
1044
  e.contexts.webWorker.language,
1029
1045
  e.contexts.webWorker.vendor,
1030
1046
  e.contexts.webWorker.renderer
1031
- ].map((u) => String(u)).join("|"), te = p(ee).slice(0, 6), re = `${X}h${te}`;
1047
+ ].map((u) => String(u)).join("|"), re = p(te).slice(0, 6), ne = `${ee}h${re}`;
1032
1048
  return [
1033
1049
  i,
1034
- g,
1050
+ d,
1035
1051
  o,
1036
- R,
1052
+ I,
1037
1053
  F,
1038
- B,
1039
- $,
1040
- Z,
1041
- re
1054
+ j,
1055
+ Q,
1056
+ X,
1057
+ ne
1042
1058
  ].join("_");
1043
1059
  } catch (e) {
1044
1060
  return console.error("Error generating fingerprint scanner id", e), l;
@@ -1048,34 +1064,34 @@ class ht {
1048
1064
  const n = "__DEFAULT_FPSCANNER_KEY__";
1049
1065
  return n.length > 20 && n.indexOf("DEFAULT") > 0 && n.indexOf("FPSCANNER") > 0 && console.warn(
1050
1066
  '[fpscanner] WARNING: Using default encryption key! Run "npx fpscanner build --key=your-secret-key" to inject your own key. See: https://github.com/antoinevastel/fpscanner#advanced-custom-builds'
1051
- ), await ut(JSON.stringify(e), n);
1067
+ ), await ht(JSON.stringify(e), n);
1052
1068
  }
1053
1069
  /**
1054
1070
  * Detection rules with name and severity.
1055
1071
  */
1056
1072
  getDetectionRules() {
1057
1073
  return [
1058
- { name: "headlessChromeScreenResolution", severity: d, test: je },
1059
- { name: "hasWebdriver", severity: d, test: Ne },
1060
- { name: "hasWebdriverWritable", severity: d, test: rt },
1061
- { name: "hasSeleniumProperty", severity: d, test: ze },
1062
- { name: "hasCDP", severity: d, test: $e },
1063
- { name: "hasPlaywright", severity: d, test: Qe },
1064
- { name: "hasImpossibleDeviceMemory", severity: d, test: qe },
1065
- { name: "hasHighCPUCount", severity: d, test: Ke },
1066
- { name: "hasMissingChromeObject", severity: d, test: Je },
1067
- { name: "hasWebdriverIframe", severity: d, test: Ye },
1068
- { name: "hasWebdriverWorker", severity: d, test: Ze },
1069
- { name: "hasMismatchWebGLInWorker", severity: d, test: Xe },
1070
- { name: "hasMismatchPlatformIframe", severity: d, test: tt },
1071
- { name: "hasMismatchPlatformWorker", severity: d, test: et },
1072
- { name: "hasSwiftshaderRenderer", severity: b, test: nt },
1073
- { name: "hasUTCTimezone", severity: oe, test: it },
1074
- { name: "hasMismatchLanguages", severity: b, test: at },
1075
- { name: "hasInconsistentEtsl", severity: d, test: ot },
1076
- { name: "hasBotUserAgent", severity: d, test: st },
1077
- { name: "hasGPUMismatch", severity: d, test: ct },
1078
- { name: "hasPlatformMismatch", severity: d, test: lt }
1074
+ { name: "headlessChromeScreenResolution", severity: g, test: Ne },
1075
+ { name: "hasWebdriver", severity: g, test: ze },
1076
+ { name: "hasWebdriverWritable", severity: g, test: at },
1077
+ { name: "hasSeleniumProperty", severity: g, test: $e },
1078
+ { name: "hasCDP", severity: g, test: Qe },
1079
+ { name: "hasPlaywright", severity: g, test: qe },
1080
+ { name: "hasImpossibleDeviceMemory", severity: g, test: Ke },
1081
+ { name: "hasHighCPUCount", severity: g, test: Je },
1082
+ { name: "hasMissingChromeObject", severity: g, test: Ze },
1083
+ { name: "hasWebdriverIframe", severity: g, test: Xe },
1084
+ { name: "hasWebdriverWorker", severity: g, test: et },
1085
+ { name: "hasMismatchWebGLInWorker", severity: g, test: tt },
1086
+ { name: "hasMismatchPlatformIframe", severity: g, test: it },
1087
+ { name: "hasMismatchPlatformWorker", severity: g, test: nt },
1088
+ { name: "hasSwiftshaderRenderer", severity: S, test: ot },
1089
+ { name: "hasUTCTimezone", severity: se, test: st },
1090
+ { name: "hasMismatchLanguages", severity: S, test: ct },
1091
+ { name: "hasInconsistentEtsl", severity: g, test: lt },
1092
+ { name: "hasBotUserAgent", severity: g, test: ut },
1093
+ { name: "hasGPUMismatch", severity: g, test: dt },
1094
+ { name: "hasPlatformMismatch", severity: g, test: gt }
1079
1095
  ];
1080
1096
  }
1081
1097
  runDetectionRules() {
@@ -1112,41 +1128,41 @@ class ht {
1112
1128
  return n;
1113
1129
  }
1114
1130
  async collectFingerprint(e = { encrypt: !0 }) {
1115
- const { encrypt: n = !0, skipWorker: i = !1 } = e, a = this.fingerprint.signals, g = {
1131
+ const { encrypt: n = !0, skipWorker: i = !1 } = e, a = this.fingerprint.signals, d = {
1116
1132
  // Automation signals
1117
- webdriver: this.collectSignal(ne),
1118
- webdriverWritable: this.collectSignal(be),
1119
- selenium: this.collectSignal(ye),
1120
- cdp: this.collectSignal(ce),
1121
- playwright: this.collectSignal(ue),
1122
- navigatorPropertyDescriptors: this.collectSignal(He),
1133
+ webdriver: this.collectSignal(ie),
1134
+ webdriverWritable: this.collectSignal(Se),
1135
+ selenium: this.collectSignal(be),
1136
+ cdp: this.collectSignal(le),
1137
+ playwright: this.collectSignal(de),
1138
+ navigatorPropertyDescriptors: this.collectSignal(Oe),
1123
1139
  // Device signals
1124
- cpuCount: this.collectSignal(de),
1125
- memory: this.collectSignal(ge),
1126
- platform: this.collectSignal(ae),
1127
- screenResolution: this.collectSignal(fe),
1128
- multimediaDevices: this.collectSignal(Ee),
1129
- mediaQueries: this.collectSignal(Be),
1140
+ cpuCount: this.collectSignal(ge),
1141
+ memory: this.collectSignal(me),
1142
+ platform: this.collectSignal(oe),
1143
+ screenResolution: this.collectSignal(ve),
1144
+ multimediaDevices: this.collectSignal(ke),
1145
+ mediaQueries: this.collectSignal(je),
1130
1146
  // Browser signals
1131
- userAgent: this.collectSignal(ie),
1132
- browserFeatures: this.collectSignal(Ge),
1133
- plugins: this.collectSignal(Me),
1147
+ userAgent: this.collectSignal(ae),
1148
+ browserFeatures: this.collectSignal(Be),
1149
+ plugins: this.collectSignal(Ee),
1134
1150
  browserExtensions: this.collectSignal(Ve),
1135
- highEntropyValues: this.collectSignal(Se),
1136
- etsl: this.collectSignal(me),
1151
+ highEntropyValues: this.collectSignal(Ce),
1152
+ etsl: this.collectSignal(pe),
1137
1153
  maths: this.collectSignal(he),
1138
- toSourceError: this.collectSignal(_e),
1154
+ toSourceError: this.collectSignal(Re),
1139
1155
  // Graphics signals
1140
- webGL: this.collectSignal(le),
1141
- webgpu: this.collectSignal(we),
1142
- canvas: this.collectSignal(Te),
1156
+ webGL: this.collectSignal(ue),
1157
+ webgpu: this.collectSignal(ye),
1158
+ canvas: this.collectSignal(He),
1143
1159
  // Codecs
1144
- mediaCodecs: this.collectSignal(Re),
1160
+ mediaCodecs: this.collectSignal(Ie),
1145
1161
  // Locale signals
1146
- internationalization: this.collectSignal(pe),
1147
- languages: this.collectSignal(ve),
1162
+ internationalization: this.collectSignal(fe),
1163
+ languages: this.collectSignal(we),
1148
1164
  // Context signals
1149
- iframe: this.collectSignal(ke),
1165
+ iframe: this.collectSignal(De),
1150
1166
  webWorker: i ? Promise.resolve({
1151
1167
  webdriver: f,
1152
1168
  userAgent: f,
@@ -1156,15 +1172,15 @@ class ht {
1156
1172
  language: f,
1157
1173
  vendor: f,
1158
1174
  renderer: f
1159
- }) : this.collectSignal(De),
1175
+ }) : this.collectSignal(_e),
1160
1176
  // Meta signals
1161
- nonce: this.collectSignal(Oe),
1177
+ nonce: this.collectSignal(Ue),
1162
1178
  time: this.collectSignal(Fe),
1163
- url: this.collectSignal(Ue)
1164
- }, m = Object.keys(g), w = await Promise.all(Object.values(g)), o = Object.fromEntries(m.map((v, y) => [v, w[y]]));
1179
+ url: this.collectSignal(Ge)
1180
+ }, m = Object.keys(d), w = await Promise.all(Object.values(d)), o = Object.fromEntries(m.map((v, b) => [v, w[b]]));
1165
1181
  return a.automation.webdriver = o.webdriver, a.automation.webdriverWritable = o.webdriverWritable, a.automation.selenium = o.selenium, a.automation.cdp = o.cdp, a.automation.playwright = o.playwright, a.automation.navigatorPropertyDescriptors = o.navigatorPropertyDescriptors, a.device.cpuCount = o.cpuCount, a.device.memory = o.memory, a.device.platform = o.platform, a.device.screenResolution = o.screenResolution, a.device.multimediaDevices = o.multimediaDevices, a.device.mediaQueries = o.mediaQueries, a.browser.userAgent = o.userAgent, a.browser.features = o.browserFeatures, a.browser.plugins = o.plugins, a.browser.extensions = o.browserExtensions, a.browser.highEntropyValues = o.highEntropyValues, a.browser.etsl = o.etsl, a.browser.maths = o.maths, a.browser.toSourceError = o.toSourceError, a.graphics.webGL = o.webGL, a.graphics.webgpu = o.webgpu, a.graphics.canvas = o.canvas, a.codecs = o.mediaCodecs, a.locale.internationalization = o.internationalization, a.locale.languages = o.languages, a.contexts.iframe = o.iframe, a.contexts.webWorker = o.webWorker, this.fingerprint.nonce = o.nonce, this.fingerprint.time = o.time, this.fingerprint.url = o.url, this.fingerprint.fastBotDetectionDetails = this.runDetectionRules(), this.fingerprint.fastBotDetection = Object.values(this.fingerprint.fastBotDetectionDetails).some((v) => v.detected), this.fingerprint.fsid = this.generateFingerprintScannerId(), n ? await this.encryptFingerprint(JSON.stringify(this.fingerprint)) : this.fingerprint;
1166
1182
  }
1167
1183
  }
1168
1184
  export {
1169
- ht as default
1185
+ pt as default
1170
1186
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fpscanner",
3
- "version": "1.0.2",
3
+ "version": "1.0.3-beta.0",
4
4
  "description": "A lightweight browser fingerprinting and bot detection library with encryption, obfuscation, and cross-context validation",
5
5
  "main": "dist/fpScanner.cjs.js",
6
6
  "module": "dist/fpScanner.es.js",
@@ -1,10 +1,36 @@
1
1
  import { Fingerprint } from "../types";
2
2
  import { ERROR, NA, SKIPPED } from "../signals/utils";
3
3
 
4
+ /**
5
+ * iPad Safari in desktop-style mode often reports navigator.platform as "MacIntel"
6
+ * in the top-level window (and same-origin iframe) while dedicated workers can still
7
+ * report "iPad". That split is expected on real hardware, not a worker spoof signal.
8
+ */
9
+ function isBenignIPadMacPlatformSplit(a: string, b: string): boolean {
10
+ const aIsIPad = a.includes("iPad");
11
+ const bIsIPad = b.includes("iPad");
12
+ if (aIsIPad === bIsIPad) {
13
+ return false;
14
+ }
15
+ const macDesktopCompat = (p: string) => p === "MacIntel" || p === "MacPPC";
16
+ return macDesktopCompat(a) || macDesktopCompat(b);
17
+ }
18
+
4
19
  export function hasMismatchPlatformWorker(fingerprint: Fingerprint) {
5
20
  if (fingerprint.signals.contexts.webWorker.platform === NA || fingerprint.signals.contexts.webWorker.platform === ERROR || fingerprint.signals.contexts.webWorker.platform === SKIPPED) {
6
21
  return false;
7
22
  }
8
23
 
9
- return fingerprint.signals.device.platform !== fingerprint.signals.contexts.webWorker.platform;
24
+ const devicePlatform = fingerprint.signals.device.platform;
25
+ const workerPlatform = fingerprint.signals.contexts.webWorker.platform;
26
+
27
+ if (devicePlatform === workerPlatform) {
28
+ return false;
29
+ }
30
+
31
+ if (isBenignIPadMacPlatformSplit(devicePlatform, workerPlatform)) {
32
+ return false;
33
+ }
34
+
35
+ return true;
10
36
  }
@@ -1,11 +1,20 @@
1
1
  import { Fingerprint } from "../types";
2
- import { ERROR, NA, SKIPPED } from "../signals/utils";
2
+ import { ERROR, INIT, NA, SKIPPED } from "../signals/utils";
3
+
4
+ function webGLStringUnavailable(value: string): boolean {
5
+ return value === NA || value === ERROR || value === SKIPPED || value === INIT;
6
+ }
3
7
 
4
8
  export function hasMismatchWebGLInWorker(fingerprint: Fingerprint) {
5
9
  const worker = fingerprint.signals.contexts.webWorker;
6
10
  const webGL = fingerprint.signals.graphics.webGL;
7
-
8
- if (worker.vendor === ERROR || worker.renderer === ERROR || webGL.vendor === NA || webGL.renderer === NA || worker.vendor === SKIPPED) {
11
+
12
+ if (
13
+ webGLStringUnavailable(webGL.vendor) ||
14
+ webGLStringUnavailable(webGL.renderer) ||
15
+ webGLStringUnavailable(worker.vendor) ||
16
+ webGLStringUnavailable(worker.renderer)
17
+ ) {
9
18
  return false;
10
19
  }
11
20
 
@@ -1,6 +1,26 @@
1
1
  import { Fingerprint } from "../types";
2
2
 
3
+ /**
4
+ * In-app browsers and system WebViews on Android/iOS often ship a Chrome-like UA but
5
+ * do not expose window.chrome. That is common on real devices, so this rule is only
6
+ * meant for desktop-style environments where missing chrome is suspicious.
7
+ */
8
+ function isClaimedMobileUserAgent(ua: string): boolean {
9
+ return (
10
+ ua.includes("Android") ||
11
+ ua.includes("iPhone") ||
12
+ ua.includes("iPod") ||
13
+ ua.includes("iPad")
14
+ );
15
+ }
16
+
3
17
  export function hasMissingChromeObject(fingerprint: Fingerprint) {
4
18
  const userAgent = fingerprint.signals.browser.userAgent;
5
- return fingerprint.signals.browser.features.chrome === false && typeof userAgent === 'string' && userAgent.includes('Chrome');
19
+ if (typeof userAgent !== "string" || !userAgent.includes("Chrome")) {
20
+ return false;
21
+ }
22
+ if (isClaimedMobileUserAgent(userAgent)) {
23
+ return false;
24
+ }
25
+ return fingerprint.signals.browser.features.chrome === false;
6
26
  }