@magield/collectors 0.6.1 → 0.8.2

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.
Files changed (57) hide show
  1. package/dist/behavior/recorder.d.ts +33 -0
  2. package/dist/behavior/recorder.js +303 -1
  3. package/dist/hash.d.ts +15 -0
  4. package/dist/hash.js +27 -1
  5. package/dist/index.d.ts +7 -0
  6. package/dist/index.js +7 -1
  7. package/dist/native.d.ts +39 -0
  8. package/dist/native.js +142 -1
  9. package/dist/registry.d.ts +57 -0
  10. package/dist/registry.js +108 -1
  11. package/dist/run.d.ts +10 -0
  12. package/dist/run.js +128 -1
  13. package/dist/signals/adblock.d.ts +2 -0
  14. package/dist/signals/adblock.js +135 -1
  15. package/dist/signals/apps.d.ts +2 -0
  16. package/dist/signals/apps.js +191 -1
  17. package/dist/signals/audio.d.ts +16 -0
  18. package/dist/signals/audio.js +63 -1
  19. package/dist/signals/automation.d.ts +2 -0
  20. package/dist/signals/automation.js +346 -1
  21. package/dist/signals/behavior.d.ts +17 -0
  22. package/dist/signals/behavior.js +31 -1
  23. package/dist/signals/capabilities.d.ts +2 -0
  24. package/dist/signals/capabilities.js +235 -1
  25. package/dist/signals/devices.d.ts +2 -0
  26. package/dist/signals/devices.js +119 -1
  27. package/dist/signals/display.d.ts +2 -0
  28. package/dist/signals/display.js +101 -1
  29. package/dist/signals/errors.d.ts +2 -0
  30. package/dist/signals/errors.js +84 -1
  31. package/dist/signals/features.d.ts +2 -0
  32. package/dist/signals/features.js +951 -1
  33. package/dist/signals/fonts.d.ts +2 -0
  34. package/dist/signals/fonts.js +128 -1
  35. package/dist/signals/integrity.d.ts +2 -0
  36. package/dist/signals/integrity.js +216 -1
  37. package/dist/signals/math.d.ts +2 -0
  38. package/dist/signals/math.js +43 -1
  39. package/dist/signals/navigator.d.ts +10 -0
  40. package/dist/signals/navigator.js +81 -1
  41. package/dist/signals/pointer.d.ts +2 -0
  42. package/dist/signals/pointer.js +93 -1
  43. package/dist/signals/render.d.ts +12 -0
  44. package/dist/signals/render.js +214 -1
  45. package/dist/signals/screen.d.ts +9 -0
  46. package/dist/signals/screen.js +80 -1
  47. package/dist/signals/storage.d.ts +33 -0
  48. package/dist/signals/storage.js +100 -1
  49. package/dist/signals/timezone.d.ts +9 -0
  50. package/dist/signals/timezone.js +63 -1
  51. package/dist/signals/webrtc.d.ts +2 -0
  52. package/dist/signals/webrtc.js +168 -1
  53. package/dist/stable-core.d.ts +128 -0
  54. package/dist/stable-core.js +187 -1
  55. package/dist/types.d.ts +54 -0
  56. package/dist/types.js +15 -1
  57. package/package.json +2 -1
package/dist/native.js CHANGED
@@ -1 +1,142 @@
1
- (function(T,U){const S={T:0x116,U:0x111,h:'79Tb',u:0x123,I:0x111,i:0x29f,R:'cFqG',Z:0x27e,c:0x280,w:0x292,P:0x195,N:0x157,a:'$md9',C0:0x196,C1:0x16f,C2:0xa4,C3:0xb7,C4:0xb6,C5:'@x!%',C6:0xbf,C7:0xc6,C8:0x10b,C9:0xe2,CC:'c[T8',CD:0xdc,CF:0x23f,Cb:'6rAj',CT:0x268,CU:0x250,Ch:0x28f,Cu:0xc5,CI:0xac,Ci:0xc7,CR:0xc2,CZ:'JLD4',CO:0xce,CE:0xb5,Cz:0xcf,Cp:0x141,Cv:0x177,CK:'oocf',CY:0x145,CA:0x160,CX:0x289,CG:'vDsc',Cr:0x2ae,Cn:0x2d8,Cg:0x2c4,Cq:0xc9,Ck:'*#nK',Ce:0xcd,Cy:0xd8,Cs:0xc9},L={T:0x321},H={T:0x391},J={T:0x169},l={T:0x2dd},W={T:0x85},h=T();function E(T,U,h,u,I){return b(h-W.T,U);}function p(T,U,h,u,I){return b(h- -l.T,u);}function v(T,U,h,u,I){return b(h- -J.T,U);}function z(T,U,h,u,I){return b(I- -H.T,h);}function O(T,U,h,u,I){return b(u- -L.T,h);}while(!![]){try{const u=parseInt(O(-S.T,-S.U,S.h,-S.u,-S.I))/(0x831*0x3+0x10d9*-0x2+0x4*0x248)+-parseInt(E(S.i,S.R,S.Z,S.c,S.w))/(0x2*-0x1169+-0x119*-0x1+-0x37*-0x9d)*(parseInt(z(-S.P,-S.N,S.a,-S.C0,-S.C1))/(0x21fa+-0x85+0xb26*-0x3))+-parseInt(p(-S.C2,-S.C3,-S.C4,S.C5,-S.C6))/(0xb1d*-0x3+-0x1*-0x673+0x1ae8)*(parseInt(p(-S.C7,-S.C8,-S.C9,S.CC,-S.CD))/(-0x1559+-0x101e+0x12be*0x2))+parseInt(E(S.CF,S.Cb,S.CT,S.CU,S.Ch))/(0x2175+0x904+0x1*-0x2a73)+parseInt(p(-S.Cu,-S.CI,-S.Ci,S.a,-S.CR))/(0x4b8+0xb64+-0x17*0xb3)+-parseInt(v(S.C2,S.CZ,S.CO,S.CE,S.Cz))/(-0x1d90+-0x3d*0x2+-0xa06*-0x3)*(parseInt(z(-S.Cp,-S.Cv,S.CK,-S.CY,-S.CA))/(-0x5*-0x112+-0x4d*-0x22+-0xf8b*0x1))+-parseInt(E(S.CX,S.CG,S.Cr,S.Cn,S.Cg))/(0x1f01+0xa*0x2cb+-0x3ae5)*(-parseInt(v(S.Cq,S.Ck,S.Ce,S.Cy,S.Cs))/(-0xfb*0x3+0x2462*0x1+-0x2166));if(u===U)break;else h['push'](h['shift']());}catch(I){h['push'](h['shift']());}}}(F,0x128235+-0x1186d5*0x1+0x2ea5f*0x3));const D=(function(){let T=!![];return function(U,h){const w={T:0x202,U:0x20a,h:0x1fd,u:'c]AF',I:0x22b},u=T?function(){const c={T:0x9};function K(T,U,h,u,I){return b(U- -c.T,u);}if(h){const I=h[K(w.T,w.U,w.h,w.u,w.I)](U,arguments);return h=null,I;}}:function(){};return T=![],u;};}()),C=D(this,function(){const C6={T:'GT*R',U:0x2c1,h:0x296,u:0x2cc,I:0x2b1,i:'%vw(',R:0x2d6,Z:0x2f5,C7:0x2e4,C8:0x2ec,C9:'9(ux',CC:0x2b4,CD:0x2b7,CF:0x2cf,Cb:0x2cc,CT:0x615,CU:0x5d8,Ch:'mJoY',Cu:0x5f7,CI:0x606,Ci:0x5f1,CR:0x5fd,CZ:']C[D',CO:0x5ed,CE:0x5cd,Cz:0x5ed,Cp:0x623,Cv:'9[wx',CK:0x604,CY:0x5fe,CA:0x5fe,CX:0x5af,CG:'*#nK',Cr:0x5d4,Cn:0x5e2,Cg:']eS(',Cq:0x2ce,Ck:0x2cb,Ce:0x2bf,Cy:'3s(1',Cs:0x2fe,CM:0x2d3,Cm:0x324,CB:0x324,Cj:0x35,Cx:0x24,Cd:0x4c,CQ:'x3AD',Co:0x1a,Cf:0x33d,Ct:0x33a,CV:0x366,CW:0x312,Cl:']C[D',CJ:0x331,CH:0x34d,CL:0x342,CS:0x31c,Cc:'%vw(',Cw:0x5f1,CP:0x622,CN:'SwHE',Ca:0x60b,D0:0x61a,D1:'oocf',D2:0x2ec,D3:'oocf',D4:0x2e7,D5:0x2bd,D6:0x2ce,D7:0x313,D8:0x5d7,D9:0x604,DC:'%nf]',DD:0x5f5,DF:0x5e8,Db:0x1ae,DT:0x1c1,DU:0x1cd,Dh:0x1ad,Du:0x1b9,DI:0x1d7,Di:'5(ae',DR:0x1b8,DZ:0x19d,DO:0x5d3,DE:0x5fb,Dz:'B@X]',Dp:0x5e9,Dv:0x5f9},C5={T:0xcb},C4={T:0x3dc},C3={T:0x11a},C2={T:0x3bd},C0={T:0x21c},U={};function X(T,U,h,u,I){return b(T- -C0.T,u);}U[Y(C6.T,C6.U,C6.h,C6.u,C6.I)]=function(u,I){return u!==I;};function G(T,U,h,u,I){return b(T- -C2.T,h);}U[Y(C6.i,C6.R,C6.Z,C6.C7,C6.C8)]=Y(C6.C9,C6.CC,C6.CD,C6.CF,C6.Cb)+A(C6.CT,C6.CU,C6.Ch,C6.Cu,C6.CI)+'+$';const h=U;function r(T,U,h,u,I){return b(T-C3.T,I);}function A(T,U,h,u,I){return b(u-C4.T,h);}function Y(T,U,h,u,I){return b(U-C5.T,T);}if(h[A(C6.Ci,C6.CR,C6.CZ,C6.CO,C6.CE)](C[A(C6.Cz,C6.Cp,C6.Cv,C6.CK,C6.CY)]()[A(C6.CA,C6.CX,C6.CG,C6.Cr,C6.Cn)+Y(C6.Cg,C6.Cq,C6.Ck,C6.U,C6.Ce)]()[Y(C6.Cy,C6.Cs,C6.CM,C6.Cm,C6.CB)+'Of']('\x0a'),-(0x2301+-0x3*0x881+-0x97d)))return;return C[X(-C6.Cj,-C6.Cx,-C6.Cd,C6.CQ,-C6.Co)+r(C6.Cf,C6.Ct,C6.CV,C6.CW,C6.Cl)]()[r(C6.CJ,C6.CH,C6.CL,C6.CS,C6.Cc)+'h'](h[A(C6.Cw,C6.CP,C6.CN,C6.Ca,C6.D0)])[Y(C6.D1,C6.C8,C6.Z,C6.Cq,C6.D2)+Y(C6.D3,C6.D4,C6.D5,C6.D6,C6.D7)]()[A(C6.D8,C6.D9,C6.DC,C6.DD,C6.DF)+G(-C6.Db,-C6.DT,C6.Cg,-C6.DU,-C6.Dh)+'r'](C)[G(-C6.Du,-C6.DI,C6.Di,-C6.DR,-C6.DZ)+'h'](h[A(C6.DO,C6.DE,C6.Dz,C6.Dp,C6.Dv)]);});C();const NATIVE_SOURCE=/^\s*function[\s\w$]*\([^)]*\)\s*\{\s*\[native code\]\s*\}\s*$/;export function isNativeSource(T){const C8={T:0x116,U:'x3AD',h:0x11d,u:0xfe,I:0xed},C7={T:0x134};function n(T,U,h,u,I){return b(u- -C7.T,U);}return NATIVE_SOURCE[n(C8.T,C8.U,C8.h,C8.u,C8.I)](T);}function F(){const Cs=['WPZdOhZdJmo6','hrPiW4RcRYfn','DXJdV8oVra','lf7cJCkZaKXrsCkdWOtdTd8','re7dJmoXqG','i8kvu8kQW4u','W6ngBfmTxfLhW6Xcxmon','E2BcOSoijSoQoq','W7NcM1FdPMW1W7CPsmkowszD','W7tdHaC1W7a','k1BcI8kWaKKGtmkEWPBdQtGb','WRhcJqu','Ah/cLCoqga','W4hcIColWP3dIG','tu7cNCoQmq','C08G','Bmkzwmkx','W6b7xuy','nN7cOq','W4xcR2/dQ8ke','BqDVW5xcHG','lmkcECkkW7m','D8ksD8kquq','WQRcLGerW74','WOecfY5d','kSkqWQyVvW','AgRcMmoldW','z8k7eSoaBG','AhBcNCobhG','WRZdKmo/kwi','W4pdRgxdGLXYWR3dOd0GqCkJWRG','W7RcRMNdG8kD','BNtcL8oweG','WQlcNe/dSmoM','W5fsWR3dP8oL','dbxcLCk2eG','W4xcVHy','hCkSjHfu','WQavlra','lmkTAmkwW4S','wdVdIhRcMbZdMv0cW5mDWRxcMa','W5JcVYlcICok','W4pdO2ddH196WRFdOWKfyCk9WQ4','mmkTWRi','e8kDvqeR','W5ldSmo6dCowmYnFW6nOfSkx','WQOTu28tWRtdVCoM','hmo9WO52W5BdVh0E','ESkvrCkh','ESkktCkSWPyLhCkfuSkBW5JdKCkS','omoApSo5W64','tSkUWQDj','mCoCf8opW4G','WRhdTKtdQ8o9','WQtdVSozl0W','v8oXWRFdTNy','W5RdVNPWra','WP7dO0BdI8kbxmoCAvnehW','nSkdW6VdGa','wr7dMmkpW6u','W6BcImoHWRFdSW','kSkEfmoSW7q','W5hcTKZdTmofomo8la','WPecW7xcV8oLWO0LlYtcGq','WOpdLwJdJmos','qGtcVCklWQa','W6SjWQOqESklbmkWAZ4lmmom','sLBdIL7dUq','W7KQWOyaWRi','pXdcVG3cL2HGiK5rEq','nSkjW4VdGmom','auhcJCoEWQZcLKuSiSkCsCkGWQS','WRWLu0rE','ArRdJSoTwa','amkkW7hdVCo/','fCoNd8kYW4e','wW51W6G','W68VWQZcNbHhWPVcO8oaWP7dQmof','mSkmW7vdna','i8kWEsmy','WOFdPXNcMry','aHrPxrG','EYldLmkQl8oikIfiaq','WR9xW75DjW','dmkypmofW4y','oKtcN8o8dW','WPifWOJdMmooWOuNmW'];F=function(){return Cs;};return F();}export function nameMatchesSource(T,U){const Ch={T:0x36e,U:0x374,h:0x38d,u:'j6#J',I:0x37a,i:0x3eb,R:0x3a4,Z:0x3c7,Cu:'vDsc',CI:0x3de,Ci:0x20a,CR:0x208,CZ:0x224,CO:0x21d,CE:'w#fg',Cz:0x4e,Cp:0x68,Cv:'yG4T',CK:0x4f,CY:0x215,CA:0x229,CX:0x200,CG:0x20e,Cr:'5(ae',Cn:0x372,Cg:0x36c,Cq:0x389,Ck:0x383,Ce:0x411,Cy:0x435,Cs:'5(ae',CM:0x3fb,Cm:0x416,CB:'9[wx',Cj:0x6,Cx:0x31,Cd:0x32,CQ:0xd,Co:0x415,Cf:0x40b,Ct:'c[T8',CV:0x3f8,CW:0x220,Cl:0x24b,CJ:0x23f,CH:0x225,CL:'j6#J',CS:'cFqG',Cc:0x33,Cw:0x2,CP:0x21,CN:0x14},Cb={T:0x8},CF={T:0x201},CD={T:0x19d},CC={T:0x272},C9={T:0x1fe};function q(T,U,h,u,I){return b(I-C9.T,h);}function e(T,U,h,u,I){return b(T- -CC.T,h);}function g(T,U,h,u,I){return b(h-CD.T,u);}function y(T,U,h,u,I){return b(I- -CF.T,T);}function k(T,U,h,u,I){return b(u-Cb.T,I);}const h={'saBaI':function(u,I){return u===I;},'VTiHJ':g(Ch.T,Ch.U,Ch.h,Ch.u,Ch.I)+'\x20','mvCkr':function(u,I){return u(I);}};if(h[g(Ch.i,Ch.R,Ch.Z,Ch.Cu,Ch.CI)](T,'')||T[k(Ch.Ci,Ch.CR,Ch.CZ,Ch.CO,Ch.CE)+e(-Ch.Cz,-Ch.Cp,Ch.Cv,-Ch.Cz,-Ch.CK)](h[k(Ch.CY,Ch.CA,Ch.CX,Ch.CG,Ch.Cr)]))return!![];return new RegExp(g(Ch.Cn,Ch.Cg,Ch.Cq,Ch.Cu,Ch.Ck)+q(Ch.Ce,Ch.Cy,Ch.Cs,Ch.CM,Ch.Cm)+y(Ch.CB,-Ch.Cj,Ch.Cx,Ch.Cd,Ch.CQ)+h[q(Ch.Co,Ch.Cf,Ch.Ct,Ch.CI,Ch.CV)](escapeName,T)+k(Ch.CW,Ch.Cl,Ch.CJ,Ch.CH,Ch.CL))[y(Ch.CS,-Ch.Cc,-Ch.Cw,-Ch.CP,-Ch.CN)](U);}function escapeName(U){const CZ={T:0x335,U:0x337,h:0x30f,u:0x336,I:'9Nx@',i:0x339,R:0x318,Z:0x31d,CO:0x33c,CE:'cFqG',Cz:0x34,Cp:0x3c,Cv:'JLD4',CK:0x34,CY:0x48,CA:0x1da,CX:0x200,CG:0x1fb,Cr:'38oW',Cn:0x1ee},CR={T:0xe},Ci={T:0x1c9},CI={T:0x135},Cu={T:0x1de};function M(T,U,h,u,I){return b(U- -Cu.T,h);}const h={};h[s(CZ.T,CZ.U,CZ.h,CZ.u,CZ.I)]=s(CZ.i,CZ.R,CZ.Z,CZ.CO,CZ.CE);const u=h;function s(T,U,h,u,I){return b(u-CI.T,I);}function m(T,U,h,u,I){return b(U- -Ci.T,h);}function B(T,U,h,u,I){return b(U-CR.T,u);}return U[M(CZ.Cz,CZ.Cp,CZ.Cv,CZ.CK,CZ.CY)+'ce'](/[.*+?^${}()|[\]\\]/g,u[B(CZ.CA,CZ.CX,CZ.CG,CZ.Cr,CZ.Cn)]);}function b(C,D){C=C-(-0x1*-0x1a57+-0x1*-0x25fd+-0x2b7*0x17);const T=F();let U=T[C];if(b['sLzGqA']===undefined){var h=function(R){const Z='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let O='',E='',z=O+h,p=(''+function(){return 0xa82+-0x21d4+-0xf*-0x18e;})['indexOf']('\x0a')!==-(0x2*-0xcfa+-0x21d3*0x1+0x3bc8);for(let v=0x106b+-0x32+-0x1039,K,Y,A=-0x1b4*0x2+0xb13+0x97*-0xd;Y=R['charAt'](A++);~Y&&(K=v%(0x1972*0x1+-0x2575+-0xc07*-0x1)?K*(-0x3*-0x9a9+-0xb*-0x1b6+-0x2f8d)+Y:Y,v++%(0x4c+-0xb*-0x185+-0x1*0x10ff))?O+=p||z['charCodeAt'](A+(0x376*0xa+-0x17ab+-0xae7))-(0x10b9+-0x1*0x215e+0x10af)!==0x83f*0x1+0xb34+-0xd*0x17f?String['fromCharCode'](0x26a5+0x514+-0x2aba&K>>(-(0x11a4+0x4c*-0x4+-0x1072*0x1)*v&-0x21fc+-0xb41*0x1+0x1*0x2d43)):v:0x317*-0x1+-0x455*-0x3+0x8*-0x13d){Y=Z['indexOf'](Y);}for(let X=0xebb*-0x1+-0x233a+0x31f5,G=O['length'];X<G;X++){E+='%'+('00'+O['charCodeAt'](X)['toString'](0x3ad+-0x1715+-0x1*-0x1378))['slice'](-(-0x21e9*-0x1+-0x14c3+-0x349*0x4));}return decodeURIComponent(E);};const i=function(R,Z){let O=[],E=0xbe9*-0x1+-0xacf+-0x8*-0x2d7,z,p='';R=h(R);let v;for(v=0x10a1+0xb*-0x2b6+-0xb*-0x133;v<0x277*0x1+-0x17d6+0x165f;v++){O[v]=v;}for(v=0x1bfd*0x1+-0x8af+0x7*-0x2c2;v<-0xa34*0x1+0x267b+0x1*-0x1b47;v++){E=(E+O[v]+Z['charCodeAt'](v%Z['length']))%(0x1*-0x1674+0x5*-0x51f+0x1*0x310f),z=O[v],O[v]=O[E],O[E]=z;}v=0x17*-0x6b+0x1*0x4ac+0x17*0x37,E=0x61*-0x13+0x177*0x6+-0x197;for(let K=0x1*0xced+0xdc9+0x1a*-0x107;K<R['length'];K++){v=(v+(0x1c*-0x13e+-0x25*-0x52+-0x1*-0x16ef))%(0x10b8+-0x1bb2+0xbfa),E=(E+O[v])%(0x220+-0x1*0x509+0x3e9),z=O[v],O[v]=O[E],O[E]=z,p+=String['fromCharCode'](R['charCodeAt'](K)^O[(O[v]+O[E])%(-0x4bb+0x1338+-0xd7d)]);}return p;};b['piiSLU']=i,b['TYKoWm']={},b['sLzGqA']=!![];}const u=T[-0x176f+0x3*0xb1e+-0x1*0x9eb];b['XSzFqE']!==u&&(b['TYKoWm']={},b['XSzFqE']=u);const I=b['TYKoWm'][C];if(I===undefined){if(b['cGSPBs']===undefined){const R=function(Z){this['zJdpzw']=Z,this['cMJTat']=[0x179*0x3+0x2051*-0x1+0x1be7,-0x2549+0x500+0x2049,0x990+0x177a+-0x210a],this['OzFOOQ']=function(){return'newState';},this['TvFQYk']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['YwUNoZ']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};R['prototype']['yXNlFP']=function(){const Z=new RegExp(this['TvFQYk']+this['YwUNoZ']),O=Z['test'](this['OzFOOQ']['toString']())?--this['cMJTat'][-0x1a11*0x1+0x1*0x1f4a+-0x4*0x14e]:--this['cMJTat'][0x64*-0xf+0x2*0x17b+0x6a*0x7];return this['CkTxCj'](O);},R['prototype']['CkTxCj']=function(Z){if(!Boolean(~Z))return Z;return this['GMtVXs'](this['zJdpzw']);},R['prototype']['GMtVXs']=function(Z){for(let O=0x79a+0x175e+0x2*-0xf7c,E=this['cMJTat']['length'];O<E;O++){this['cMJTat']['push'](Math['round'](Math['random']())),E=this['cMJTat']['length'];}return Z(this['cMJTat'][-0x2*0xd11+-0x2*0x6df+0x27e0]);},(''+function(){return-0xa8d+-0x12d*-0xd+-0x3*0x194;})['indexOf']('\x0a')===-(0x801*-0x3+0x23b+0x1fb*0xb)&&new R(b)['yXNlFP'](),b['cGSPBs']=!![];}U=b['piiSLU'](U,D),b['TYKoWm'][C]=U;}else U=I;return U;}const APPLY_TRAP=/\bapply\b/,TRAP_WINDOW=-0x10eb*0x1+0x990+0x75e;export function interposesApplyTrap(U){const Cr={T:0x3f9,U:0x3e9,h:0x415,u:0x417,I:'a#*L',i:0x183,R:'w#fg',Z:0x1aa,Cn:0x1c4,Cg:0x1cb,Cq:'9MQ9',Ck:0x1b0,Ce:0x1c6,Cy:0x1ce,Cs:0x176,CM:'JIx&',Cm:0x186,CB:0x17b,Cj:0x18a,Cx:0x402,Cd:0x413,CQ:0x41e,Co:0x3f4,Cf:'x3AD',Ct:0x422,CV:0x438,CW:0x438,Cl:0x430,CJ:'9MQ9',CH:0x3ae,CL:0x3da,CS:0x3cd,Cc:0x3db,Cw:'tK)4',CP:0x41f,CN:0x3fb,Ca:0x41d,D0:0x3fe,D1:'c[T8',D2:0x178,D3:'79Tb',D4:0x18c,D5:0x188,D6:0x168,D7:0x1b7,D8:'FHR$',D9:0x1ac,DC:0x188,DD:0x185,DF:'*#nK',Db:0x1a9,DT:0x1a4,DU:0x1cc,Dh:0xde,Du:0xbf,DI:0xe6,Di:0x489,DR:0x438,DZ:0x45e,DO:0x454,DE:'@x!%',Dz:0x45f,Dp:0x41c,Dv:0x43f,DK:'cFqG',DY:0xdb,DA:0xf3,DX:'05JI',DG:0xe5,Dr:0xf2,Dn:0x182,Dg:'#Lpi',Dq:0x16b,Dk:0x162,De:0x176,Dy:0x119,Ds:0xe1,DM:'B@X]',Dm:0xf2,DB:0xed,Dj:0x405,Dx:0x428,Dd:0x428,DQ:'05JI',Do:0x193,Df:'5(ae',Dt:0x18e,DV:0x16a,DW:0x164,Dl:0x44d,DJ:0x444,DH:0x427,DL:0x44a,DS:'6rAj',Dc:0x3d4,Dw:0x407,DP:0x3f0,DN:0x3cc,Da:'5(ae',F0:0x133,F1:0xf1,F2:0x114,F3:0x101,F4:0x3c8,F5:0x3e2,F6:0x3c1,F7:0x39a,F8:'jKOp',F9:0x16c,FC:'$AK@',FD:0x1a1,FF:0x181},CG={T:0x311},CX={T:0x1dc},CK={T:0x84},Cz={T:0x15a},CO={T:0x233},h={};function d(T,U,h,u,I){return b(h-CO.T,I);}h[j(Cr.T,Cr.U,Cr.h,Cr.u,Cr.I)]=function(I,i){return I!==i;};function o(T,U,h,u,I){return b(T- -Cz.T,h);}h[x(Cr.i,Cr.R,Cr.Z,Cr.Cn,Cr.Cn)]=x(Cr.Cg,Cr.Cq,Cr.Ck,Cr.Ce,Cr.Cy)+x(Cr.Cs,Cr.CM,Cr.Cm,Cr.CB,Cr.Cj),h[d(Cr.Cx,Cr.Cd,Cr.CQ,Cr.Co,Cr.Cf)]=function(I,i){return I instanceof i;},h[d(Cr.Ct,Cr.CV,Cr.CW,Cr.Cl,Cr.CJ)]=function(I,i){return I!==i;};function x(T,U,h,u,I){return b(h- -CK.T,U);}h[j(Cr.CH,Cr.CL,Cr.CS,Cr.Cc,Cr.Cw)]=d(Cr.CP,Cr.CN,Cr.Ca,Cr.D0,Cr.D1)+'g',h[x(Cr.D2,Cr.D3,Cr.D4,Cr.D5,Cr.D6)]=function(I,i){return I===i;},h[x(Cr.D7,Cr.D8,Cr.D9,Cr.Ce,Cr.DC)]=function(I,i){return I===i;};const u=h;function j(T,U,h,u,I){return b(h-CX.T,I);}function Q(T,U,h,u,I){return b(u- -CG.T,h);}if(u[x(Cr.DD,Cr.DF,Cr.Db,Cr.DT,Cr.DU)](typeof U,u[o(Cr.Dh,Cr.Du,Cr.DF,Cr.DI,Cr.Dh)]))return undefined;try{;return U[d(Cr.Di,Cr.DR,Cr.DZ,Cr.DO,Cr.DE)](null),undefined;}catch(I){const i=u[d(Cr.Dz,Cr.Dp,Cr.Dv,Cr.CQ,Cr.DK)](I,Error)?I[o(Cr.DY,Cr.DA,Cr.DX,Cr.DG,Cr.Dr)]:undefined;if(u[x(Cr.Dn,Cr.Dg,Cr.Dq,Cr.Dk,Cr.De)](typeof i,u[Q(-Cr.Dy,-Cr.Ds,Cr.DM,-Cr.Dm,-Cr.DB)])||u[d(Cr.D0,Cr.Dj,Cr.Dx,Cr.Dd,Cr.DQ)](i,''))return undefined;const R=i[x(Cr.Do,Cr.Df,Cr.Dt,Cr.DV,Cr.DW)]('\x0a')[d(Cr.Dl,Cr.DJ,Cr.DH,Cr.DL,Cr.DS)+'r'](Z=>/^\s*at\s/[x(0x184,'9[wx',0x184,0x161,0x170)](Z))[j(Cr.Dc,Cr.Dw,Cr.DP,Cr.DN,Cr.Da)](-0x1a11*0x1+0x1*0x1f4a+-0x7*0xbf,TRAP_WINDOW);if(u[Q(-Cr.F0,-Cr.F1,Cr.DM,-Cr.F2,-Cr.F3)](R[j(Cr.F4,Cr.F5,Cr.F6,Cr.F7,Cr.F8)+'h'],0x64*-0xf+0x2*0x17b+0x6a*0x7))return undefined;return R[x(Cr.F9,Cr.FC,Cr.DD,Cr.FD,Cr.FF)](Z=>APPLY_TRAP[x(0x1ba,'79Tb',0x19a,0x19c,0x1b4)](Z));}}export function applyTrapIsObservable(T){const Cy={T:0xf,U:0x18,h:0x3a,u:'vDsc',I:0x24,i:0x317,R:'bA8w',Z:0x307,Cs:0x31f,CM:0x309},Ce={T:0x344},Cg={T:0x214},Cn={T:0x123};function V(T,U,h,u,I){return b(h-Cn.T,U);}function f(T,U,h,u,I){return b(U- -Cg.T,u);}const U={'zgkWo':function(h,u){return h===u;},'GuCeW':function(h,u){return h(u);}};function t(T,U,h,u,I){return b(I-Ce.T,T);}try{const h=new Proxy(T,{'apply':(u,I,i)=>Reflect[f(-0x2d,-0x18,-0x41,'mJoY',0x12)](u,I,i)});return U[f(-Cy.T,Cy.U,Cy.h,Cy.u,Cy.I)](U[V(Cy.i,Cy.R,Cy.Z,Cy.Cs,Cy.CM)](interposesApplyTrap,h),!![]);}catch{return![];}}
1
+ /**
2
+ * Whether a function's source is a genuine native stub.
3
+ *
4
+ * `String.includes('[native code]')` is the obvious test and it is wrong: it
5
+ * asks whether the text appears *anywhere*, so any replacement whose own source
6
+ * happens to contain those fifteen characters passes. That is not a theoretical
7
+ * evasion — a replacement only has to mention the string to be waved through:
8
+ *
9
+ * const patched = () => 'function () { [native code] }'
10
+ *
11
+ * stringifies to its own source, which contains `[native code]`, and a
12
+ * substring test calls it native.
13
+ *
14
+ * Engines emit a fixed shape instead, and it is worth matching properly:
15
+ *
16
+ * function max() { [native code] } V8, ordinary native
17
+ * function () { [native code] } V8, bound function
18
+ * function get webdriver() { [native code] } V8, accessor
19
+ * function max() {\n [native code]\n} SpiderMonkey / JavaScriptCore
20
+ *
21
+ * Anchored at both ends, so the text has to *be* the stub rather than contain
22
+ * it. Whitespace is loose because engines disagree about newlines, and the name
23
+ * is loose because it carries `get`/`set`/`bound` prefixes and can be empty.
24
+ */
25
+ const NATIVE_SOURCE = /^\s*function[\s\w$]*\([^)]*\)\s*\{\s*\[native code\]\s*\}\s*$/;
26
+ export function isNativeSource(source) {
27
+ return NATIVE_SOURCE.test(source);
28
+ }
29
+ /**
30
+ * Whether a native stub carries the name its function claims to have.
31
+ *
32
+ * A `Proxy` around a native function is still reported as native — V8 hands
33
+ * back a native stub for any callable proxy — so a source check alone cannot
34
+ * see a proxy-wrapped intrinsic. It does lose the *name*, which is the tell.
35
+ * Measured on Chrome 141:
36
+ *
37
+ * Function.prototype.toString function toString() { [native code] }
38
+ * new Proxy(Function.prototype.toString) function () { [native code] }
39
+ *
40
+ * `.name` reports `toString` in both cases, because the proxy forwards the
41
+ * property. So the contradiction is between the name the function claims and
42
+ * the name the engine prints for it, and every intrinsic this package probes
43
+ * prints its name in a clean realm — verified in a browser, not assumed.
44
+ *
45
+ * Bound functions print anonymously too, and legitimately. Their names start
46
+ * with `bound `, which is the documented exemption rather than a guess.
47
+ */
48
+ export function nameMatchesSource(name, source) {
49
+ if (name === '' || name.startsWith('bound '))
50
+ return true;
51
+ return new RegExp(`^\\s*function\\s+${escapeName(name)}\\s*\\(`).test(source);
52
+ }
53
+ /** A function name can contain `$`, which is a regex metacharacter. */
54
+ function escapeName(name) {
55
+ return name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
56
+ }
57
+ /**
58
+ * The frame an engine prints for a proxy's `apply` trap.
59
+ *
60
+ * V8 describes the trap rather than the wrapper, so this text comes from the
61
+ * engine and not from anything the page controls — it survives minification of
62
+ * the probe and cannot be renamed by the plugin. Measured shapes:
63
+ *
64
+ * at Object.apply a bare Proxy handler
65
+ * at newHandler.<computed> [as apply] (eval at <anonymous>) stealth's own
66
+ *
67
+ * Deliberately not matched against the probe's own call frame: the probe invokes
68
+ * through `.call`, never `.apply`, so its own frames cannot contain this word.
69
+ */
70
+ const APPLY_TRAP = /\bapply\b/;
71
+ /**
72
+ * How many frames from the top may hold the trap.
73
+ *
74
+ * Not one, which a first version of this assumed and measurement disproved. V8
75
+ * prints the native's *own* frame for a JavaScript builtin and omits it for a
76
+ * Blink DOM method, so the trap sits one place lower in the first case:
77
+ *
78
+ * Map.prototype.size through a proxy [0] at get size [1] at Object.apply
79
+ * canvas.toDataURL through a proxy [0] at Object.apply
80
+ *
81
+ * Three covers both, plus a handler that calls through `Reflect.apply`. It stays
82
+ * small because the frames below belong to the caller, and a page that reached
83
+ * this collector through something of its own named `apply` would otherwise
84
+ * accuse itself.
85
+ *
86
+ * The window does not have to be right by argument, which is the point of
87
+ * `applyTrapIsObservable`: the control runs this same rule at this same stack
88
+ * depth, so an engine where the indexing does not hold fails the control and the
89
+ * caller abstains instead of reporting everyone clean.
90
+ */
91
+ const TRAP_WINDOW = 3;
92
+ /**
93
+ * Whether a function has a proxy standing in front of it.
94
+ *
95
+ * `undefined` means the question could not be asked — the call did not throw, or
96
+ * the engine gave us no stack — and is never reported as clean.
97
+ */
98
+ export function interposesApplyTrap(target) {
99
+ if (typeof target !== 'function')
100
+ return undefined;
101
+ try {
102
+ // An illegal receiver. Every candidate this is used on validates `this`
103
+ // before it looks at its arguments, so one call with no arguments is enough
104
+ // and nothing observable happens on the way.
105
+ ;
106
+ target.call(null);
107
+ return undefined;
108
+ }
109
+ catch (error) {
110
+ const stack = error instanceof Error ? error.stack : undefined;
111
+ if (typeof stack !== 'string' || stack === '')
112
+ return undefined;
113
+ const frames = stack
114
+ .split('\n')
115
+ .filter((line) => /^\s*at\s/.test(line))
116
+ .slice(0, TRAP_WINDOW);
117
+ if (frames.length === 0)
118
+ return undefined;
119
+ return frames.some((line) => APPLY_TRAP.test(line));
120
+ }
121
+ }
122
+ /**
123
+ * Whether this engine names a proxy's `apply` trap on a stack at all.
124
+ *
125
+ * The positive control for `interposesApplyTrap`, given a native that throws on
126
+ * an illegal receiver. Wraps it in a proxy of its own — never installed
127
+ * anywhere, so nothing observable changes — and checks that the technique sees
128
+ * it. A caller that gets `false` here must report "cannot tell" rather than
129
+ * "clean", because a silent failure of this technique looks exactly like a
130
+ * browser with nothing to hide.
131
+ */
132
+ export function applyTrapIsObservable(native) {
133
+ try {
134
+ const wrapped = new Proxy(native, {
135
+ apply: (fn, self, args) => Reflect.apply(fn, self, args),
136
+ });
137
+ return interposesApplyTrap(wrapped) === true;
138
+ }
139
+ catch {
140
+ return false;
141
+ }
142
+ }
@@ -0,0 +1,57 @@
1
+ import type { Collector } from './types.js';
2
+ /**
3
+ * Order within a wave is the order they run, so the cheapest and most
4
+ * universally available come first: when a budget runs out, what survives
5
+ * should be the signals present on every device rather than the exotic ones.
6
+ */
7
+ export declare const ALL_COLLECTORS: readonly Collector[];
8
+ export declare const COLLECTOR_IDS: readonly string[];
9
+ /**
10
+ * Collectors a deployment must ask for by name.
11
+ *
12
+ * Deliberately absent from `ALL_COLLECTORS`, so no default enables them and no
13
+ * tenant gets them by forgetting to opt out. Everything here reads something
14
+ * about the person rather than about their browser, which makes enabling it a
15
+ * decision somebody has to make on purpose and be able to point at a consent
16
+ * for.
17
+ *
18
+ * Pass them explicitly:
19
+ *
20
+ * runCollectors(env, { collectors: [...ALL_COLLECTORS, ...INVASIVE_COLLECTORS] })
21
+ *
22
+ * The split is the product position, not a technical one. `docs/` says what
23
+ * Magic Shield collects by default, and this is the list that is not in it.
24
+ */
25
+ export declare const INVASIVE_COLLECTORS: readonly Collector[];
26
+ /**
27
+ * Removed: localPortsCollector.
28
+ *
29
+ * It probed nine loopback ports for automation drivers, remote-control tools
30
+ * and anti-detect control APIs, and it was measured from the wrong place. The
31
+ * fp-lab page is served from `127.0.0.1`, so the probe was local reaching
32
+ * local — the one case Chrome does not gate — and it reported nine ports
33
+ * cleanly probed.
34
+ *
35
+ * From a public origin, which is every real deployment, Chrome 153 answers
36
+ * `navigator.permissions.query({ name: 'local-network-access' })` with
37
+ * **prompt**. Measured from `https://example.com` against known ports:
38
+ *
39
+ * 8791 open hung until aborted at 1.5 s
40
+ * 9515 closed Failed to fetch in 10 ms
41
+ * 18123 closed hung until aborted at 2.0 s
42
+ *
43
+ * So it does not work, and the way it fails is worse than not working. The
44
+ * open port did not complete and two results were indistinguishable hangs, so
45
+ * the answers are noise; and a pending permission decision blocks, which on a
46
+ * login page means burning the deep wave and showing the visitor a prompt
47
+ * asking to access their local network. Nobody accepts that prompt, and asking
48
+ * is itself the harm.
49
+ *
50
+ * Not kept behind a flag. A collector that prompts cannot be enabled by a
51
+ * deployment without the person seeing it, which is the line this set does not
52
+ * cross — every other member runs silently.
53
+ *
54
+ * If it ever comes back it needs the permission requested honestly, at a
55
+ * moment the person understands, which is a product decision rather than a
56
+ * collector.
57
+ */
package/dist/registry.js CHANGED
@@ -1 +1,108 @@
1
- (function(T,U){const k={T:0x4f0,U:'JqZh',h:0x4d7,u:0x4d6,I:0x4ea,e:0x4ea,y:'JqZh',s:0x4e5,M:0x508,m:0x4f3,B:0x3fd,j:0x3f9,x:'RefM',d:0x403,Q:0x410,o:0x6,f:'yXRE',t:0x17,V:0x2,W:0x4d4,l:'AUux',J:0x4f4,H:0x4f3,L:0x4e9,S:0x4d,c:0x5a,w:'joRl',P:0x45,N:0x59,a:0x3f3,C0:0x405,C1:'5N[g',C2:0x400,C3:0x3ed,C4:0x50,C5:0x49,C6:'w0&X',C7:0x4a,C8:0x56,C9:0x3fe,CC:0x3f1,CD:'Y@p#',CF:0x3f5,Cb:0x64,CT:0x5d,CU:'!ko8',Ch:0x6b,Cu:0x62},q={T:0x1ae},g={T:0x363},n={T:0xb8},r={T:0x27f},G={T:0x136},h=T();function O(T,U,h,u,I){return b(I- -G.T,h);}function Z(T,U,h,u,I){return b(T-r.T,h);}function E(T,U,h,u,I){return b(h- -n.T,I);}function i(T,U,h,u,I){return b(I-g.T,U);}function R(T,U,h,u,I){return b(u- -q.T,U);}while(!![]){try{const u=-parseInt(i(k.T,k.U,k.h,k.u,k.I))/(0x1*0x159e+-0x108d+-0x24*0x24)+-parseInt(i(k.e,k.y,k.s,k.M,k.m))/(-0x268f+-0x22a5+-0x2*-0x249b)+-parseInt(Z(k.B,k.j,k.x,k.d,k.Q))/(0x1*-0xb50+-0x1122*-0x1+-0x5cf)*(-parseInt(R(-k.o,k.f,-k.o,-k.t,-k.V))/(0x20*0xcc+0xc5*0x2+-0x6*0x481))+-parseInt(i(k.W,k.l,k.J,k.H,k.L))/(-0x66b*0x5+0x20da+-0x2*0x5f)*(-parseInt(O(k.S,k.c,k.w,k.P,k.N))/(0x5c7+0x24cb+0x614*-0x7))+parseInt(Z(k.a,k.C0,k.C1,k.C2,k.C3))/(0x18c2+0x1*-0x1951+0x6*0x19)+-parseInt(O(k.C4,k.C5,k.C6,k.C7,k.C8))/(-0xd87+-0x466*0x1+0x11f5)+parseInt(Z(k.C9,k.CC,k.CD,k.CF,k.C2))/(0x36*-0xb0+0x1a2d+-0x57e*-0x2)*(parseInt(O(k.Cb,k.CT,k.CU,k.Ch,k.Cu))/(0x2270+0x54*-0x3+-0x216a));if(u===U)break;else h['push'](h['shift']());}catch(I){h['push'](h['shift']());}}}(F,0x5c5c6+-0x92eb3+0x7685*0x16));const D=(function(){const y={T:'w0&X',U:0x3f6,h:0x3f3,u:0x3fc};let T=!![];return function(U,h){const u=T?function(){const e={T:0x26a};function z(T,U,h,u,I){return b(u-e.T,T);}if(h){const I=h[z(y.T,y.U,y.h,y.h,y.u)](U,arguments);return h=null,I;}}:function(){};return T=![],u;};}()),C=D(this,function(){const f={T:'QYhu',U:0x8e,h:0xa3,u:0x9f,I:0x96,t:0x56b,V:0x566,W:0x554,l:0x560,J:'#iq*',H:0x554,L:0x558,S:0x565,c:0x55d,w:'ow05',P:0x564,N:0x56c,a:0x57c,C0:0x580,C1:'8jBX',C2:'M^cl',C3:0xbf,C4:0xa2,C5:0xaf,C6:'^Ft5',C7:0xb3,C8:0xae,C9:0xac,CC:0xb1,CD:'ert[',CF:0xac,Cb:0x8b,CT:0xa8,CU:0x9b,Ch:0x4ff,Cu:'w0&X',CI:0x4f8,Ci:0x4ee,CR:0x4fc,CZ:'t5lN',CO:0x93,CE:0xa6,Cz:0x9e,Cp:'Qu5O',Cv:0x99,CK:0xb1,CY:0xa5,CA:0xbc,CX:0xb2,CG:0x4b1,Cr:0x4b9,Cn:'AUux',Cg:0x4b5,Cq:0x50,Ck:'RY]j',Ce:0x4b,Cy:0x4d,Cs:0x63,CM:0x52,Cm:'$$0B',CB:0x66,Cj:0x4c,Cx:0x55,Cd:'!ko8',CQ:0x54,Co:0x43,Cf:0x32,Ct:'AUux',CV:0x32,CW:0x41,Cl:0x23,CJ:0x4f3,CH:'Xom!',CL:0x4f5,CS:0x4d7,Cc:0x4ea,Cw:0x4c9,CP:0x4c1,CN:'B]Tf',Ca:0x4c4,D0:0x4cc,D1:0x4d4,D2:'pDsx',D3:0x4cf,D4:0x4e5,D5:0x4e0},o={T:0x3db},Q={T:0x327},x={T:0x144},j={T:0x360},B={T:0x229};function p(T,U,h,u,I){return b(I- -B.T,T);}function Y(T,U,h,u,I){return b(I-j.T,U);}function A(T,U,h,u,I){return b(T- -x.T,U);}const U={};U[p(f.T,-f.U,-f.h,-f.u,-f.I)]=function(u,I){return u!==I;},U[v(f.t,f.V,f.W,f.l,f.J)]=v(f.H,f.L,f.S,f.c,f.w)+v(f.P,f.N,f.a,f.C0,f.C1)+'+$';const h=U;if(h[p(f.C2,-f.C3,-f.C4,-f.C4,-f.C5)](C[p(f.C6,-f.C7,-f.C8,-f.C9,-f.CC)]()[p(f.CD,-f.CF,-f.Cb,-f.CT,-f.CU)+Y(f.Ch,f.Cu,f.CI,f.Ci,f.CR)]()[p(f.CZ,-f.CO,-f.CE,-f.Cz,-f.CE)+'Of']('\x0a'),-(0x105d+0x79+-0x8b*0x1f)))return;function K(T,U,h,u,I){return b(U-Q.T,h);}function v(T,U,h,u,I){return b(U-o.T,I);}return C[p(f.Cp,-f.Cv,-f.CK,-f.C7,-f.CY)+p(f.C1,-f.CE,-f.C3,-f.CA,-f.CX)]()[K(f.CG,f.Cr,f.Cn,f.Cg,f.CG)+'h'](h[A(f.Cq,f.Ck,f.Ce,f.Cy,f.Cs)])[A(f.CM,f.Cm,f.CB,f.Cj,f.Cx)+A(f.Cx,f.Cd,f.CM,f.CQ,f.Co)]()[A(f.Cf,f.Ct,f.CV,f.CW,f.Cl)+Y(f.CJ,f.CH,f.CL,f.CS,f.Cc)+'r'](C)[K(f.Cw,f.CP,f.CN,f.Ca,f.D0)+'h'](h[Y(f.D1,f.D2,f.D3,f.D4,f.D5)]);});C();import{adblockCollector}from'./signals/adblock.js';import{appsCollector}from'./signals/apps.js';import{audioCollector}from'./signals/audio.js';import{capabilitiesCollector}from'./signals/capabilities.js';function b(C,D){C=C-(-0x130e+0x118e+0x2f4);const T=F();let U=T[C];if(b['TJoTsu']===undefined){var h=function(R){const Z='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let O='',E='',z=O+h,p=(''+function(){return 0xa4f+-0xde4+-0x83*-0x7;})['indexOf']('\x0a')!==-(-0x1a*-0x82+0x313*0x4+-0x197f);for(let v=0xb73*-0x1+0x4ec+0x687,K,Y,A=0x1*0x1423+-0x72+-0x47*0x47;Y=R['charAt'](A++);~Y&&(K=v%(-0x22ff+-0x1*-0x1745+0xbbe)?K*(0x244d+0x13*-0x1f3+0xfc)+Y:Y,v++%(0x82b+-0x105+-0x722))?O+=p||z['charCodeAt'](A+(0x6af+0x16d+-0x812))-(-0xa48+0x1*-0x19c6+-0x6*-0x604)!==0x1*0x1310+0x5ac+-0x18bc?String['fromCharCode'](0x1c1a+-0x1a9f+-0x7c&K>>(-(-0x1*-0x6f7+0xe5b+-0x1550)*v&-0x2b*-0x17+-0x159+-0x27e)):v:-0x1*-0xe9+-0x61*-0x3b+0x4*-0x5d1){Y=Z['indexOf'](Y);}for(let X=-0x1046+-0xccf+0x1d15,G=O['length'];X<G;X++){E+='%'+('00'+O['charCodeAt'](X)['toString'](0x5ef*0x1+0x1*0x2e3+-0x8c2))['slice'](-(0xe9*0xf+0x2417*-0x1+0x1672));}return decodeURIComponent(E);};const i=function(R,Z){let O=[],E=-0x1513+-0x1b49+0x305c,z,p='';R=h(R);let v;for(v=0xb*-0x17e+-0x478*0x7+0x2fb2;v<-0x550*-0x5+-0xf*0x5a+-0x144a;v++){O[v]=v;}for(v=0x875*0x2+-0xfbf+-0x12b;v<0x1c5a+0x53*0x10+-0x208a;v++){E=(E+O[v]+Z['charCodeAt'](v%Z['length']))%(0x25ca+0x1946+-0x18*0x296),z=O[v],O[v]=O[E],O[E]=z;}v=0x1ada+-0x71*-0x16+-0x2490,E=-0x22a5+-0x35*0x6d+0x3936;for(let K=0x1*0x1122+0x83b+-0x195d;K<R['length'];K++){v=(v+(0x20*0xcc+0xc5*0x2+-0x9*0x301))%(-0x66b*0x5+0x20da+-0x1*-0x3d),E=(E+O[v])%(0x5c7+0x24cb+0x272*-0x11),z=O[v],O[v]=O[E],O[E]=z,p+=String['fromCharCode'](R['charCodeAt'](K)^O[(O[v]+O[E])%(0x18c2+0x1*-0x1951+0x13*0x15)]);}return p;};b['twbzac']=i,b['oTopKS']={},b['TJoTsu']=!![];}const u=T[-0xd87+-0x466*0x1+0x11ed];b['luyFqF']!==u&&(b['oTopKS']={},b['luyFqF']=u);const I=b['oTopKS'][C];if(I===undefined){if(b['AwjuxF']===undefined){const R=function(Z){this['TAqBlr']=Z,this['QrprGy']=[0x36*-0xb0+0x1a2d+-0xaf4*-0x1,0x2270+0x54*-0x3+-0x2174,0x10a4+-0x1a79+0x347*0x3],this['HyUJnK']=function(){return'newState';},this['ZNfRmf']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['jkjvWu']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};R['prototype']['TiREkC']=function(){const Z=new RegExp(this['ZNfRmf']+this['jkjvWu']),O=Z['test'](this['HyUJnK']['toString']())?--this['QrprGy'][0x1*0x1741+0xfb9*0x1+-0x26f9]:--this['QrprGy'][-0x4a9*0x4+-0x5b1+-0x1*-0x1855];return this['YAZXBt'](O);},R['prototype']['YAZXBt']=function(Z){if(!Boolean(~Z))return Z;return this['IDEqcL'](this['TAqBlr']);},R['prototype']['IDEqcL']=function(Z){for(let O=0xc96+-0xb1c+-0x17a,E=this['QrprGy']['length'];O<E;O++){this['QrprGy']['push'](Math['round'](Math['random']())),E=this['QrprGy']['length'];}return Z(this['QrprGy'][-0x280+-0xb03*-0x1+0x883*-0x1]);},(''+function(){return 0xce3+0x8*-0x38c+0xd*0x131;})['indexOf']('\x0a')===-(-0xeaa+0x23c+-0xc6f*-0x1)&&new R(b)['TiREkC'](),b['AwjuxF']=!![];}U=b['twbzac'](U,D),b['oTopKS'][C]=U;}else U=I;return U;}import{automationCollector}from'./signals/automation.js';import{devicesCollector}from'./signals/devices.js';import{displayCollector}from'./signals/display.js';import{fontsCollector}from'./signals/fonts.js';import{storageCollector}from'./signals/storage.js';import{webrtcCollector}from'./signals/webrtc.js';import{errorsCollector}from'./signals/errors.js';import{featuresCollector}from'./signals/features.js';import{integrityCollector}from'./signals/integrity.js';import{mathCollector}from'./signals/math.js';import{navigatorCollector}from'./signals/navigator.js';import{pointerCollector}from'./signals/pointer.js';function X(T,U,h,u,I){const t={T:0x26d};return b(u-t.T,T);}import{canvasCollector,webglCollector}from'./signals/render.js';function F(){const V=['Amk1W5xcOSo2W5/cKIHEWR3cVHPh','DduwW6RdRsTWiGfC','oG1pe8o2','W7itW5G','W6lcRZZcKG','W69gEmoRWRytuSoP','j3dcTKXL','D3TBW48YW51S','W7StW69XWPiDWRLQoSkiWRhdTG','mKTqW53cTq','WP5sW4/cSMqOpG','lCoqWP7cISkSaG7cH8ojW7K','g8o6W6JdT10','W6ddH8k0','W6Hppmk0W4TOjCo+WQddKCoYbmoR','xexcHt9T','dSkkzmksW74','tCoubmowW4ldRXr9guC','AfqsuCk0ymkXWPRdO1ZcIdO','WR7dJSkcB8o9WRnCW48NW4C2Eq','kCkQW4NcOb5Bn8oHW5tdL8ohya','C0Wtpwi','BCojW4/cHSoO','zt3cGmkKWPq','iarwyIWDmhdcPrxdJmovW5S','c8oVWPldRNuXbmkFW4dcGJDttq','W4lcNNaJWPq','W7VdN8kqBI7dQ3xdVa','WRJdGmkkB8o5WR1LW44iW5CuCa','WRjwWPzumW','kGDaeSoH','W5tdHmkRW7JcLW','WR1RW6FcPSoH','WQBdICkwWOVcHmojWQqUWQ3cSCkNW5W','zd3cHa81','kmkVW4VcPbLFdCoXW6VdVCoGDq','W65ho8k9WRiJt8oBWOtdIW','WRayBW','n1XYW6qg','W53cIv4NoN/dLh9pymkQga','E1ie'];F=function(){return V;};return F();}import{screenCollector}from'./signals/screen.js';import{timezoneCollector}from'./signals/timezone.js';export const ALL_COLLECTORS=[navigatorCollector,screenCollector,timezoneCollector,featuresCollector,pointerCollector,automationCollector,mathCollector,errorsCollector,canvasCollector,webglCollector,displayCollector,integrityCollector,audioCollector,devicesCollector,storageCollector,capabilitiesCollector,fontsCollector];export const COLLECTOR_IDS=ALL_COLLECTORS[X('QYhu',0x3fd,0x3db,0x3ee,0x3e0)](T=>T['id']);export const INVASIVE_COLLECTORS=[webrtcCollector,adblockCollector,appsCollector];
1
+ import { adblockCollector } from './signals/adblock.js';
2
+ import { appsCollector } from './signals/apps.js';
3
+ import { audioCollector } from './signals/audio.js';
4
+ import { capabilitiesCollector } from './signals/capabilities.js';
5
+ import { automationCollector } from './signals/automation.js';
6
+ import { devicesCollector } from './signals/devices.js';
7
+ import { displayCollector } from './signals/display.js';
8
+ import { fontsCollector } from './signals/fonts.js';
9
+ import { storageCollector } from './signals/storage.js';
10
+ import { webrtcCollector } from './signals/webrtc.js';
11
+ import { errorsCollector } from './signals/errors.js';
12
+ import { featuresCollector } from './signals/features.js';
13
+ import { integrityCollector } from './signals/integrity.js';
14
+ import { mathCollector } from './signals/math.js';
15
+ import { navigatorCollector } from './signals/navigator.js';
16
+ import { pointerCollector } from './signals/pointer.js';
17
+ import { canvasCollector, webglCollector } from './signals/render.js';
18
+ import { screenCollector } from './signals/screen.js';
19
+ import { timezoneCollector } from './signals/timezone.js';
20
+ /**
21
+ * Order within a wave is the order they run, so the cheapest and most
22
+ * universally available come first: when a budget runs out, what survives
23
+ * should be the signals present on every device rather than the exotic ones.
24
+ */
25
+ export const ALL_COLLECTORS = [
26
+ // instant
27
+ // Automation first. When a slow device runs out of budget, what is lost
28
+ // must be the ordinary fingerprint, never the detection: the published SDK
29
+ // ran this sixth, behind a 5 ms budget its obfuscated build could not meet,
30
+ // and shipped without bot detection for every integrator until 0.7.0.
31
+ automationCollector,
32
+ navigatorCollector,
33
+ screenCollector,
34
+ featuresCollector,
35
+ pointerCollector,
36
+ mathCollector,
37
+ errorsCollector,
38
+ // Last in the wave: the slowest instant collector measured (`Intl` calls,
39
+ // ~7 ms on an Apple M2 before obfuscation was removed).
40
+ timezoneCollector,
41
+ // warm
42
+ canvasCollector,
43
+ webglCollector,
44
+ displayCollector,
45
+ // Last in the wave: it is the only collector that attaches to the document,
46
+ // so if the budget runs out it is the one to lose.
47
+ integrityCollector,
48
+ // deep — every one is optional, so a tenant switching them off costs no
49
+ // confidence, and a budget overrun loses the expensive signals rather than
50
+ // the universal ones.
51
+ audioCollector,
52
+ devicesCollector,
53
+ storageCollector,
54
+ capabilitiesCollector,
55
+ // Last overall: it appends to the document and does the most DOM work of
56
+ // anything here, so it is the right thing to lose when the budget ends.
57
+ fontsCollector,
58
+ ];
59
+ export const COLLECTOR_IDS = ALL_COLLECTORS.map((c) => c.id);
60
+ /**
61
+ * Collectors a deployment must ask for by name.
62
+ *
63
+ * Deliberately absent from `ALL_COLLECTORS`, so no default enables them and no
64
+ * tenant gets them by forgetting to opt out. Everything here reads something
65
+ * about the person rather than about their browser, which makes enabling it a
66
+ * decision somebody has to make on purpose and be able to point at a consent
67
+ * for.
68
+ *
69
+ * Pass them explicitly:
70
+ *
71
+ * runCollectors(env, { collectors: [...ALL_COLLECTORS, ...INVASIVE_COLLECTORS] })
72
+ *
73
+ * The split is the product position, not a technical one. `docs/` says what
74
+ * Magic Shield collects by default, and this is the list that is not in it.
75
+ */
76
+ export const INVASIVE_COLLECTORS = [webrtcCollector, adblockCollector, appsCollector];
77
+ /**
78
+ * Removed: localPortsCollector.
79
+ *
80
+ * It probed nine loopback ports for automation drivers, remote-control tools
81
+ * and anti-detect control APIs, and it was measured from the wrong place. The
82
+ * fp-lab page is served from `127.0.0.1`, so the probe was local reaching
83
+ * local — the one case Chrome does not gate — and it reported nine ports
84
+ * cleanly probed.
85
+ *
86
+ * From a public origin, which is every real deployment, Chrome 153 answers
87
+ * `navigator.permissions.query({ name: 'local-network-access' })` with
88
+ * **prompt**. Measured from `https://example.com` against known ports:
89
+ *
90
+ * 8791 open hung until aborted at 1.5 s
91
+ * 9515 closed Failed to fetch in 10 ms
92
+ * 18123 closed hung until aborted at 2.0 s
93
+ *
94
+ * So it does not work, and the way it fails is worse than not working. The
95
+ * open port did not complete and two results were indistinguishable hangs, so
96
+ * the answers are noise; and a pending permission decision blocks, which on a
97
+ * login page means burning the deep wave and showing the visitor a prompt
98
+ * asking to access their local network. Nobody accepts that prompt, and asking
99
+ * is itself the harm.
100
+ *
101
+ * Not kept behind a flag. A collector that prompts cannot be enabled by a
102
+ * deployment without the person seeing it, which is the line this set does not
103
+ * cross — every other member runs silently.
104
+ *
105
+ * If it ever comes back it needs the permission requested honestly, at a
106
+ * moment the person understands, which is a product decision rather than a
107
+ * collector.
108
+ */
package/dist/run.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { type CollectionResult, type Collector, type CollectorEnv, type Wave } from './types.js';
2
+ export interface RunOptions {
3
+ readonly waves?: readonly Wave[];
4
+ /** Collector ids switched off by the tenant, for privacy or compatibility. */
5
+ readonly disabled?: readonly string[];
6
+ readonly budgets?: Partial<Record<Wave, number>>;
7
+ readonly collectors?: readonly Collector[];
8
+ readonly now?: () => number;
9
+ }
10
+ export declare function runCollectors(env: CollectorEnv, options?: RunOptions): Promise<CollectionResult>;
package/dist/run.js CHANGED
@@ -1 +1,128 @@
1
- (function(T,U){const C2={T:'9#Cx',U:0x3fd,h:0x3db,u:0x3da,I:0x40b,i:'WqWF',R:0x400,Z:0x3d2,O:0x3f4,E:0x3f0,z:0x2,p:'9#Cx',v:0x0,K:0x3,Y:0x34,A:'s6Oh',X:0x3c2,G:0x3d3,r:0x3ad,n:0x3e5,g:'YOId',C3:0x140,C4:0x158,C5:0x148,C6:0x174,C7:'N]Sv',C8:0x1c4,C9:0x18e,CC:0x195,CD:0x1b9,CF:0x1a3,Cb:'W5bF',CT:0x19f,CU:0x1a0,Ch:0x17a,Cu:0x405,CI:'p%R3',Ci:0x3e5,CR:0x416,CZ:0x429,CO:0x1cc,CE:'ih7B',Cz:0x1be,Cp:0x1a0,Cv:0x1ae},C1={T:0x244},C0={T:0x19f},a={T:0x350},N={T:0x44},P={T:0x20d};function q(T,U,h,u,I){return b(h-P.T,T);}function e(T,U,h,u,I){return b(u- -N.T,T);}function s(T,U,h,u,I){return b(h- -a.T,U);}function k(T,U,h,u,I){return b(u- -C0.T,U);}function y(T,U,h,u,I){return b(T-C1.T,U);}const h=T();while(!![]){try{const u=parseInt(q(C2.T,C2.U,C2.h,C2.u,C2.I))/(-0x65*0x1b+-0x142*-0x1a+-0x160c)+-parseInt(q(C2.i,C2.R,C2.Z,C2.O,C2.E))/(0x241b+0x27d*0x4+-0x2e0d)+-parseInt(k(C2.z,C2.p,C2.v,-C2.K,-C2.Y))/(0x11c7+0x3*0x9b3+-0x2edd)*(-parseInt(q(C2.A,C2.X,C2.G,C2.r,C2.n))/(0x13a9+0xc02*-0x2+-0x1*-0x45f))+parseInt(e(C2.g,C2.C3,C2.C4,C2.C5,C2.C6))/(-0xd03*-0x1+0x453*0x7+-0x2b43)+-parseInt(e(C2.C7,C2.C8,C2.C9,C2.CC,C2.CD))/(-0x12ac+-0x62a*0x1+-0x56*-0x4a)+parseInt(s(-C2.CF,C2.Cb,-C2.CT,-C2.CU,-C2.Ch))/(-0x21a*-0x2+-0x225b+0x1e2e)+parseInt(y(C2.Cu,C2.CI,C2.Ci,C2.CR,C2.CZ))/(-0xbaf+0x1*-0x761+0x5e*0x34)*(-parseInt(s(-C2.CO,C2.CE,-C2.Cz,-C2.Cp,-C2.Cv))/(-0x1*-0x3e5+-0x1dce+0x19f2));if(u===U)break;else h['push'](h['shift']());}catch(I){h['push'](h['shift']());}}}(F,0x2fa8e+0xc555d+0x25*-0x2ddf));const D=(function(){const C4={T:0x210,U:0x1f7,h:'4$3y',u:0x221,I:0x1d4};let T=!![];return function(U,h){const u=T?function(){const C3={T:0x3a9};function M(T,U,h,u,I){return b(U- -C3.T,h);}if(h){const I=h[M(-C4.T,-C4.U,C4.h,-C4.u,-C4.I)](U,arguments);return h=null,I;}}:function(){};return T=![],u;};}()),C=D(this,function(){const CT={T:0xa5,U:'5b*[',h:0xca,u:0x94,I:0xa8,i:0x368,R:'yoVo',Z:0x386,O:0x3a4,E:0x3af,z:0x118,p:'y1I!',v:0x132,K:0x11a,Y:0x151,A:0xad,X:'ynNB',G:0x8e,r:0x7e,n:0xa6,g:'ynNB',CU:0x253,Ch:0x270,Cu:0x27b,CI:0x24e,Ci:'$e&^',CR:0x37f,CZ:0x390,CO:0x398,CE:0x372,Cz:'BCL&',Cp:0x377,Cv:0x3a1,CK:0x3b5,CY:0x3ae,CA:0x97,CX:'ih7B',CG:0xbf,Cr:0x9b,Cn:0x91,Cg:'lytr',Cq:0x260,Ck:0x269,Ce:0x23c,Cy:0x26c,Cs:'N]Sv',CM:0x26b,Cm:0x26a,CB:0x260,Cj:0x26f,Cx:'UH(3',Cd:0x2bc,CQ:0x2ac,Co:0x294,Cf:0x292,Ct:0xe5,CV:'04D2',CW:0xd7,Cl:0xa5,CJ:0xba,CH:'YOId',CL:0x284,CS:0x27e,Cc:0x256,Cw:0x3cc,CP:'GJ^5',CN:0x39c,Ca:0x392,D0:0x3ad,D1:0xc3,D2:0xb5,D3:0xc1,D4:0x4a,D5:'jDdQ',D6:0x9e,D7:0x77,D8:0x14d,D9:'Jhwz',DC:0x15b,DD:0x17e,DF:0x14f,Db:0x167,DT:0x160,DU:0x177,Dh:0x15c,Du:'*nNS',DI:0x3ea,Di:0x3bc,DR:0x3ba},Cb={T:0xd6},CF={T:0x20c},CD={T:0x1da},CC={T:0x10f},C8={T:0x7c},U={};function j(T,U,h,u,I){return b(h- -C8.T,U);}U[m(CT.T,CT.U,CT.h,CT.u,CT.I)]=function(u,I){return u!==I;},U[B(CT.i,CT.R,CT.Z,CT.O,CT.E)]=j(CT.z,CT.p,CT.v,CT.K,CT.Y)+m(CT.A,CT.X,CT.G,CT.r,CT.n)+'+$';function m(T,U,h,u,I){return b(I- -CC.T,U);}const h=U;function B(T,U,h,u,I){return b(h-CD.T,U);}if(h[x(CT.g,CT.CU,CT.Ch,CT.Cu,CT.CI)](C[d(CT.Ci,CT.CR,CT.CZ,CT.CO,CT.CE)]()[d(CT.Cz,CT.Cp,CT.Cv,CT.CK,CT.CY)+m(CT.CA,CT.CX,CT.CG,CT.Cr,CT.Cn)]()[x(CT.Cg,CT.Cq,CT.Ck,CT.Ce,CT.Cy)+'Of']('\x0a'),-(-0x1*-0x15eb+0x1*-0x1fb7+0x9cd)))return;function d(T,U,h,u,I){return b(h-CF.T,T);}function x(T,U,h,u,I){return b(h-Cb.T,T);}return C[x(CT.Cs,CT.CM,CT.Cm,CT.CB,CT.Cj)+x(CT.Cx,CT.Cd,CT.CQ,CT.Co,CT.Cf)]()[m(CT.Ct,CT.CV,CT.CW,CT.Cl,CT.CJ)+'h'](h[x(CT.CH,CT.CL,CT.CS,CT.Cc,CT.Co)])[B(CT.Cw,CT.CP,CT.CN,CT.Ca,CT.D0)+m(CT.D1,CT.Ci,CT.D2,CT.D2,CT.D3)]()[m(CT.D4,CT.D5,CT.D6,CT.G,CT.D7)+j(CT.D8,CT.D9,CT.DC,CT.DD,CT.DF)+'r'](C)[j(CT.Db,CT.Cx,CT.DT,CT.DU,CT.Dh)+'h'](h[d(CT.Du,CT.DI,CT.Di,CT.D0,CT.DR)]);});function Q(T,U,h,u,I){const CU={T:0x37b};return b(U-CU.T,I);}function b(C,D){C=C-(0x4*-0x24b+0x22b4+-0x180b);const T=F();let U=T[C];if(b['vxXUIw']===undefined){var h=function(R){const Z='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let O='',E='',z=O+h,p=(''+function(){return-0x1fdf+0x147b+0xb64;})['indexOf']('\x0a')!==-(0x633+-0xdee+0x7bc);for(let v=-0x7f*-0x20+0x2326*0x1+-0x3306,K,Y,A=-0xfdb+0x5*-0x27a+0x1c3d*0x1;Y=R['charAt'](A++);~Y&&(K=v%(0xd3d+0x1c1c+-0x3*0xdc7)?K*(0x8*-0x36e+0x92+0x1b1e)+Y:Y,v++%(-0x27*-0x81+-0x28c+-0x7d*0x23))?O+=p||z['charCodeAt'](A+(0x21eb+-0xdd4+-0x6af*0x3))-(0xcd*-0x1+-0xe6c+0xf43)!==-0xd*-0x131+-0x11*0x7e+-0x71f?String['fromCharCode'](0x9*0x59+0x8b*0x3e+-0x1d*0x13c&K>>(-(0x2047*-0x1+0x1f6d+-0xb*-0x14)*v&-0x3*-0xb7c+0x1d36+-0x1*0x3fa4)):v:0x13*0x35+-0x13a*-0xb+0x3*-0x5cf){Y=Z['indexOf'](Y);}for(let X=-0x10*-0x119+0x10ac+-0x223c,G=O['length'];X<G;X++){E+='%'+('00'+O['charCodeAt'](X)['toString'](-0x8c9*-0x1+0x3*0x1a3+-0xda2))['slice'](-(0x194+-0x1*-0xb6c+0xcfe*-0x1));}return decodeURIComponent(E);};const i=function(R,Z){let O=[],E=-0x227a+0x1*-0xad7+0x509*0x9,z,p='';R=h(R);let v;for(v=0x2187+-0x2099*-0x1+-0x4220;v<0x12*0xa7+-0x1b5*-0x3+0x83*-0x1f;v++){O[v]=v;}for(v=0x1b0d+0x7*0x2d1+-0x1762*0x2;v<0xee+-0x849+0x85b;v++){E=(E+O[v]+Z['charCodeAt'](v%Z['length']))%(0x1b33*0x1+-0x12f7+-0x73c),z=O[v],O[v]=O[E],O[E]=z;}v=-0x1*0x1c97+-0x1*0x227+0x313*0xa,E=-0xba7*-0x3+-0x1*0x125f+0xb*-0x182;for(let K=-0x2224+-0x1*-0xe25+-0x1*-0x13ff;K<R['length'];K++){v=(v+(-0x1343+-0x21*0xfe+-0x1156*-0x3))%(0x14c*0x1+-0x5*0x663+-0x1*-0x1fa3),E=(E+O[v])%(0x2002+-0xb8c+-0x2*0x9bb),z=O[v],O[v]=O[E],O[E]=z,p+=String['fromCharCode'](R['charCodeAt'](K)^O[(O[v]+O[E])%(0x2b*0x69+0x127c+-0x25*0xf3)]);}return p;};b['mKTdfw']=i,b['QTkhhT']={},b['vxXUIw']=!![];}const u=T[-0x15*0xa8+-0x15b*-0x19+0x1*-0x141b];b['nkPxMo']!==u&&(b['QTkhhT']={},b['nkPxMo']=u);const I=b['QTkhhT'][C];if(I===undefined){if(b['NcTiIu']===undefined){const R=function(Z){this['NAQUmE']=Z,this['xiWdrI']=[-0x11b*-0xb+-0xfd1*-0x1+-0x1bf9,0xcf5+0x1f72+-0x2c67,0x126b+-0x1126+-0x1*0x145],this['rFkrqr']=function(){return'newState';},this['XoFIDT']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['cLXuRN']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};R['prototype']['XVffpz']=function(){const Z=new RegExp(this['XoFIDT']+this['cLXuRN']),O=Z['test'](this['rFkrqr']['toString']())?--this['xiWdrI'][-0x2*0xa9f+0x258b+0x4*-0x413]:--this['xiWdrI'][0x2*0xf7a+-0x2f0*-0x7+-0x2*0x19c2];return this['vsNDmF'](O);},R['prototype']['vsNDmF']=function(Z){if(!Boolean(~Z))return Z;return this['UPOMxB'](this['NAQUmE']);},R['prototype']['UPOMxB']=function(Z){for(let O=0x242e+-0x32b*-0x1+-0x2759,E=this['xiWdrI']['length'];O<E;O++){this['xiWdrI']['push'](Math['round'](Math['random']())),E=this['xiWdrI']['length'];}return Z(this['xiWdrI'][0x6*-0x668+0x458*0x4+0xa88*0x2]);},(''+function(){return 0x11b6*-0x2+0x1*0x17cb+0xba1;})['indexOf']('\x0a')===-(0x467+0x19b7+-0xd*0x251)&&new R(b)['XVffpz'](),b['NcTiIu']=!![];}U=b['mKTdfw'](U,D),b['QTkhhT'][C]=U;}else U=I;return U;}C();import{ALL_COLLECTORS}from'./registry.js';function o(T,U,h,u,I){const Ch={T:0x2eb};return b(U- -Ch.T,I);}function F(){const Cx=['F8k1kmkD','dSo/q8kDWQC','wCoik8od','tCouk8okva','oSkraq','bKX5gH4','W4VdRKxcN8oqW5ZcHhPrmmk8b0i','WRVdTNuPWQtdNKpdICofWODRChC','tmk/W5i','W79AW4z7uq','imkAb03dUW','WR7dSmoTidW','W5lcHdCPWOJcNSk5js7cJsNdIYO','W7JcHmk0Dmkr','t8k1W5BdHmkO','WQ55WPBcVbe','ecCyWP16','W65keCoxWQO','WOZdIdRdSSkP','WPlcRCo7W7m','W4JdHSkiaa','iHS4WODw','wXZcMSoQvq','W4L7zmkMpq','WP3cPCoT','WOaas8k7la','WRpdNGDPsW','W4NdOedcMmoBW5ZcGNTGfmkmexO','W4BdUv3cJq','i8kkfvC','W79Ar8kudW','qmkkp8k/xW','W5RcUGtdImkf','jc3cNeRdNSk8WO87WQhdGa','WRddQY3dK8kG','W77cRXjUW6q','W419c8oqW6q','vSoUWP8/pa','W4dcR8kMw8kf','o3TuBmknW74SW6SIWQqJDa','WOmYpCoCW7u','W7ddGglcIZe','W61Rvg4+','qNHhkCk7WOdcPq','W5hdT8op','zCoNWQy6pq','WOJcUrldIq','FNpdJa','WONdQmkNW79D','cmoCDCk/WQe','eCoOWPtcG8oWE8kyW6P/W6RcUCkQaG','nSkOp2/dRq','WRdcGSoxWOBcHmocpmkknZK','rCo/o2y','BCkAW4hdVCkU','WP3cOGddQCk4','WRhdPdO','W53dGmkjeuC','wvzVgG','WP4vxCkhjW','W7ajxSodW4O','w3RcHSoXhG','AsWWaSkU','jSoLeHVdVa','mSkkW6rGvK/dVsDIW4JdVLu','WPddISo5bIi','W4VdNmkwdq','b8obW4yklW','WPJcSWldG3i','WR50WRlcJsq','kY0cuCkh','W4hdRvJcGa','EYmwo8or','WO7cTZFdHCkA','WR7dGCkf','WONdQmogeHRdM8kEFmkmW7KzWPNcPa','qSk7iCkVAq','zSoiuWNcQSkDWRjKnZ87Fq','W5FdJmkb','WQBcJH/cRW','bCkUFtn6ESkFEadcTG','vSk/W7BdG8k7','WQ90B3ZcKW','W5bFWQtdLSoc','WRqNW67cPCklCmowW4m4WPVcK8kRWPy','WOTWpCkoWPCsoCoNyCkYW5VdGW','gSo7fmo6FuzJ','eLfNfmkv','lX7cKSkmxa','zmosWR06aq','W69bmCoYWPq','u8oUWQG6iG','WQNdSdRdNG','qa45qmoeW7/dPCoiW4i1b8k6dW','W5hcTSkhxK8','WPNcQSoY','WRGWmYhdOIOfBSkZWOK'];F=function(){return Cx;};return F();}import{WAVE_BUDGET_MS}from'./types.js';const TIMED_OUT=Symbol(Q(0x525,0x503,0x52a,0x513,'LTIh')+Q(0x518,0x526,0x551,0x4fd,'Jhwz'));async function withDeadline(T,U){const CY={T:0x11d,U:0xe2,h:'W5bF',u:0x10d,I:0xfc,i:0x112,R:0x10e,Z:'YOId',O:0x13d,E:0x129,z:0x206,p:0x21c,v:0x203,K:'Bd6U',Y:0x1fc,A:0x3be,X:0x3c0,G:0x3d8,r:0x3c6,n:'f)9W'},CK={T:0x534,U:0x531,h:0x50a,u:'s6Oh',I:0x4de,i:0x326,R:'$e&^',Z:0x2fd,O:0x2e7,E:0x2f8},Cp={T:0x15b,U:0x12e,h:0x1a5,u:0x625},Cz={T:0x1a0,U:0xea,h:0x5c,u:0x64},CE={T:0x103,U:0x23,h:0x20,u:0x76},CO={T:0x121,U:0xee,h:0x1af,u:0x9d},CZ={T:0x166,U:0x4ce,h:0x4e,u:0xd7},h={'INTte':function(I,i,R){return I(i,R);},'TSylF':function(I,i){return I instanceof i;},'QKJhC':function(I,i){return I!==i;},'LZndk':function(I,i){return I(i);}};function l(T,U,h,u,I){return o(T-CZ.T,T-CZ.U,h-CZ.h,u-CZ.u,I);}if(!h[f(-CY.T,-CY.U,CY.h,-CY.u,-CY.I)](T,Promise))return T;function t(T,U,h,u,I){return o(T-CO.T,U- -CO.U,h-CO.h,u-CO.u,u);}function f(T,U,h,u,I){return o(T-CE.T,I-CE.U,h-CE.h,u-CE.u,h);}function J(T,U,h,u,I){return o(T-Cz.T,I-Cz.U,h-Cz.h,u-Cz.u,U);}let u;try{return await Promise[f(-CY.i,-CY.R,CY.Z,-CY.O,-CY.E)]([T,new Promise(I=>{const Cv={T:0x16d,U:0x8c,h:0x5b,u:0x437};function V(T,U,h,u,I){return f(T-Cp.T,U-Cp.U,u,u-Cp.h,h-Cp.u);}function W(T,U,h,u,I){return f(T-Cv.T,U-Cv.U,U,u-Cv.h,I-Cv.u);}u=h[V(CK.T,CK.U,CK.h,CK.u,CK.I)](setTimeout,()=>I(TIMED_OUT),Math[W(CK.i,CK.R,CK.Z,CK.O,CK.E)](0x1778+-0x21f3+0xa7b*0x1,U));})]);}finally{if(h[t(-CY.z,-CY.p,-CY.v,CY.K,-CY.Y)](u,undefined))h[l(CY.A,CY.X,CY.G,CY.r,CY.n)](clearTimeout,u);}}export async function runCollectors(T,U={}){const Cj={T:0xd4,U:0x105,h:0xea,u:0xf0,I:'CL#F',i:0xb0,R:0xab,Z:0xc1,O:0xe1,E:'p%R3',z:0xdc,p:0xed,v:0xf5,K:0x113,Y:'GJ^5',A:0x11b,X:0x106,G:0x128,r:'A4TQ',n:0x123,g:0x12b,Cx:0x14a,Cd:0x139,CQ:'LTIh',Co:0x138,Cf:0xe0,Ct:0xf7,CV:0xd1,CW:0xd4,Cl:'[n)a',CJ:0x2cb,CH:'!3Cm',CL:0x2e1,CS:0x2b1,Cc:0x2b5,Cw:0x149,CP:0x16a,CN:0x169,Ca:'vjsi',D0:0x191,D1:0x2be,D2:'9#Cx',D3:0x2d2,D4:0x29e,D5:0x2dd,D6:0x196,D7:0x1a3,D8:'%2IV',D9:0x17d,DC:0x176,DD:0x92,DF:0x98,Db:0xb1,DT:0xcd,DU:'W5bF',Dh:0xde,Du:0x9a,DI:0xb6,Di:0x87,DR:'63Li',DZ:0x103,DO:0x13b,DE:'df)^',Dz:0x12c,Dp:0x14a,Dv:0xa8,DK:0xb9,DY:0xc5,DA:0xa4,DX:0x3e,DG:0x24,Dr:0x3b,Dn:'lytr',Dg:0x50,Dq:0x15e,Dk:0x156,De:0x177,Dy:0x171,Ds:0x10e,DM:0x153,Dm:0x134,DB:'yoVo',Dj:0x110,Dx:0x138,Dd:0x163,DQ:0x135,Do:'rE@B',Df:0x153,Dt:0x42,DV:0x3a,DW:0x2f,Dl:'8ACa',DJ:0x2a,DH:0x18f,DL:0x173,DS:0x175,Dc:'df)^',Dw:0x11a,DP:0xf2,DN:0xf8,Da:0x102,F0:'4$3y',F1:0x9f,F2:0xa7,F3:0x9c,F4:0xae,F5:'jDdQ',F6:0x1f,F7:0x4d,F8:0x45,F9:0x72,FC:0x168,FD:'A4TQ',FF:0x141,Fb:0x16d,FT:0xa,FU:0x41,Fh:0x22,Fu:'lDa(',FI:0x2,Fi:0x125,FR:0x124,FZ:'%2IV',FO:0x14c,FE:0x12a,Fz:0x2aa,Fp:'$GcA',Fv:0x2c8,FK:0x2b4,FY:0x28a,FA:0x2c0,FX:'W5bF',FG:0x2e8,Fr:0x292,Fn:0x17f,Fg:0x18c,Fq:0x16e,Fk:'WqWF',Fe:0x180,Fy:0x13f,Fs:0x16f,FM:0x162,Fm:'ynNB',FB:0x166,Fj:0x185,Fx:0x184,Fd:0x16a,FQ:'xJSS',Fo:0x165,Ff:0x8c,Ft:0xb4,FV:0xd7,FW:'BCL&',Fl:0x15b,FJ:0x14c,FH:0x131,FL:'m5vx',FS:0x75,Fc:0x77,Fw:0x55,FP:'2NuD',FN:0x59,Fa:0x36,b0:0x43,b1:0x23,b2:'YOId',b3:0x1d,b4:0x3d,b5:']DfM',b6:0x4e,b7:0x2b,b8:0x0,b9:0x12,bC:0x1b,bD:0x100,bF:0x114,bb:'vjsi',bT:0x12f,bU:0x11c,bh:0x12e,bu:0x159,bI:0x138,bi:'UH(3',bR:0xc2,bZ:0x109,bO:0xef,bE:'!3Cm',bz:0x15d,bp:'lDa(',bv:0x17c,bK:0x10d,bY:0x132,bA:0x129,bX:0x131,bG:0x2af,br:'M4Ex',bn:0x2df,bg:0x2b0,bq:0x170,bk:0x151,be:0x169,by:0x146,bs:0x14e,bM:0x13a,bm:0x279,bB:0x296,bj:0x27b,bx:0x27b,bd:0x9e,bQ:0xdd,bo:0x297,bf:'FU9e',bt:0x28c,bV:0x267,bW:0x2bd,bl:0x6e,bJ:0x63,bH:0x4c,bL:0x1b},CB={T:0x133,U:0x3e1,h:0xe0,u:0x1b0},Cm={T:0x1b2,U:0x295,h:0x1ac,u:0xbb},CM={T:0x88,U:0x295,h:0x1c7,u:0x47},Cs={T:0x117,U:0x17d,h:0x1dc,u:0x0},Cy={T:0x1cd,U:0x206,h:0x79,u:0x87},h={'BHNWV':H(Cj.T,Cj.U,Cj.h,Cj.u,Cj.I)+'nt','flHDP':H(Cj.i,Cj.R,Cj.Z,Cj.O,Cj.E),'QSNiX':function(K){return K();},'yogyQ':function(K,Y){return K!==Y;},'PXnLf':function(K,Y){return K>=Y;},'OJdJg':function(K,Y){return K-Y;},'eWYPu':function(K){return K();},'VswzI':function(K,Y,A){return K(Y,A);},'UMsDq':function(K,Y){return K===Y;},'bZwlY':function(K,Y){return K(Y);},'YFUNU':function(K,Y){return K/Y;}};function H(T,U,h,u,I){return o(T-Cy.T,h-Cy.U,h-Cy.h,u-Cy.u,I);}const u=U[H(Cj.z,Cj.p,Cj.v,Cj.K,Cj.Y)]??(()=>performance[H(0xb4,0xbb,0xd6,0x100,'FU9e')]()),I=U[S(Cj.A,Cj.X,Cj.G,Cj.r,Cj.n)]??[h[S(Cj.g,Cj.Cx,Cj.Cd,Cj.CQ,Cj.Co)],h[H(Cj.Cf,Cj.Ct,Cj.CV,Cj.CW,Cj.Cl)]],i=new Set(U[c(Cj.CJ,Cj.CH,Cj.CL,Cj.CS,Cj.Cc)+S(Cj.Cw,Cj.CP,Cj.CN,Cj.Ca,Cj.D0)]??[]);function w(T,U,h,u,I){return o(T-Cs.T,h-Cs.U,h-Cs.h,u-Cs.u,u);}function L(T,U,h,u,I){return o(T-CM.T,u-CM.U,h-CM.h,u-CM.u,h);}const R=U[c(Cj.D1,Cj.D2,Cj.D3,Cj.D4,Cj.D5)+L(Cj.D6,Cj.D7,Cj.D8,Cj.D9,Cj.DC)]??ALL_COLLECTORS;function S(T,U,h,u,I){return o(T-Cm.T,h-Cm.U,h-Cm.h,u-Cm.u,u);}const Z={},O=[],E=[],z=h[H(Cj.DD,Cj.DF,Cj.Db,Cj.DT,Cj.DU)](u);let p=0x3*0x1e5+-0x253*-0x1+0x19*-0x52;function c(T,U,h,u,I){return o(T-CB.T,T-CB.U,h-CB.h,u-CB.u,U);}let v=-0x2009*-0x1+0x773*0x2+-0x2eef;for(const K of I){const Y=U[H(Cj.Dh,Cj.Du,Cj.DI,Cj.Di,Cj.DR)+'ts']?.[K]??WAVE_BUDGET_MS[K],A=h[L(Cj.DZ,Cj.DO,Cj.DE,Cj.Dz,Cj.Dp)](u);let X=![];for(const G of R[H(Cj.Dv,Cj.DK,Cj.DY,Cj.DA,Cj.Ca)+'r'](r=>r[H(0xbe,0xc9,0xa8,0xd6,'ynNB')]===K)){if(i[w(Cj.DX,Cj.DG,Cj.Dr,Cj.Dn,Cj.Dg)](G['id'])){O[S(Cj.Dq,Cj.Dk,Cj.De,Cj.Dn,Cj.Dy)](G['id']);if(h[S(Cj.Ds,Cj.DM,Cj.Dm,Cj.DB,Cj.Dj)](G[S(Cj.Dx,Cj.Dd,Cj.DQ,Cj.Do,Cj.Df)+w(Cj.Dt,Cj.DV,Cj.DW,Cj.Dl,Cj.DJ)],!![]))p++;continue;}p++;if(X||h[S(Cj.DH,Cj.DL,Cj.DS,Cj.Dc,Cj.DS)](h[H(Cj.Dw,Cj.DP,Cj.DN,Cj.Da,Cj.F0)](h[H(Cj.F1,Cj.F2,Cj.F3,Cj.F4,Cj.F5)](u),A),Y)){O[w(Cj.F6,Cj.F7,Cj.F8,Cj.Ca,Cj.F9)](G['id']);continue;}try{const r=h[L(Cj.FC,Cj.DO,Cj.FD,Cj.FF,Cj.Fb)](Y,h[w(Cj.FT,Cj.FU,Cj.Fh,Cj.Fu,-Cj.FI)](h[L(Cj.Fi,Cj.FR,Cj.FZ,Cj.FO,Cj.FE)](u),A)),n=await h[c(Cj.Fz,Cj.Fp,Cj.Fv,Cj.FK,Cj.FY)](withDeadline,G[c(Cj.FA,Cj.FX,Cj.FG,Cj.FG,Cj.Fr)+'ct'](T),r);if(h[S(Cj.Fn,Cj.Fg,Cj.Fq,Cj.Fk,Cj.Fe)](n,TIMED_OUT)){O[S(Cj.Fy,Cj.Fs,Cj.FM,Cj.Fm,Cj.FB)](G['id']),E[S(Cj.Fj,Cj.Fx,Cj.Fd,Cj.FQ,Cj.Fo)](G['id']+(H(Cj.DT,Cj.Ff,Cj.Ft,Cj.FV,Cj.FW)+S(Cj.Fl,Cj.FJ,Cj.FH,Cj.FL,Cj.Fy)+w(Cj.FS,Cj.Fc,Cj.Fw,Cj.FP,Cj.FN))+K+(w(Cj.Fa,Cj.b0,Cj.b1,Cj.b2,Cj.b3)+'et')),X=!![];continue;}Object[w(Cj.DX,Cj.b4,Cj.FU,Cj.b5,Cj.b6)+'n'](Z,n);if(Object[w(Cj.b7,Cj.b8,Cj.b9,Cj.Cl,-Cj.bC)+'s'](n)[L(Cj.bD,Cj.bF,Cj.bb,Cj.bT,Cj.bU)](g=>g!==null))v++;else O[S(Cj.bh,Cj.bu,Cj.bI,Cj.bi,Cj.Dq)](G['id']);}catch(g){O[H(Cj.bR,Cj.bZ,Cj.bO,Cj.p,Cj.bE)](G['id']),E[L(Cj.bz,Cj.Df,Cj.bp,Cj.bv,Cj.Fg)](G['id']+':\x20'+g[S(Cj.bK,Cj.bY,Cj.bA,Cj.Y,Cj.bX)+'ge']);}}}return{'signals':Z,'durationMs':Math[c(Cj.bG,Cj.br,Cj.bn,Cj.Fz,Cj.bg)](h[S(Cj.bu,Cj.bq,Cj.bk,Cj.Y,Cj.be)](h[S(Cj.FR,Cj.by,Cj.bs,Cj.bi,Cj.bM)](u),z)),'skipped':O,'errors':E,'confidence':h[c(Cj.bm,Cj.Dn,Cj.bB,Cj.bj,Cj.bx)](p,-0x235b+0xd3f+-0x4*-0x587)?0xf57*0x2+0x1e80+-0x3d2e:h[H(Cj.Dh,Cj.bd,Cj.DK,Cj.bQ,Cj.FX)](Number,h[c(Cj.bo,Cj.bf,Cj.bt,Cj.bV,Cj.bW)](v,p)[w(Cj.bl,Cj.bJ,Cj.bH,Cj.b2,Cj.bL)+'ed'](0x353+-0x22db+0x1f8b))};}
1
+ import { ALL_COLLECTORS } from './registry.js';
2
+ import { WAVE_BUDGET_MS } from './types.js';
3
+ /**
4
+ * Runs collectors within their wave budgets.
5
+ *
6
+ * The budget is a hard promise to the integrator: a protected action is never
7
+ * delayed by collection. When a wave runs out of time the remaining collectors
8
+ * are skipped and reported, and confidence falls — a partial fingerprint is a
9
+ * normal outcome, not an error. On a slow device that is exactly the right
10
+ * trade: the user gets their login, and the server scores what it has.
11
+ */
12
+ /** Returned instead of a result when a collector outlives its budget. */
13
+ const TIMED_OUT = Symbol('timed-out');
14
+ /**
15
+ * Resolves with the collector's result, or `TIMED_OUT` when the deadline wins.
16
+ *
17
+ * The collector is not cancelled — nothing here can cancel a browser API — so
18
+ * a hung probe keeps its handle until the page goes away. What this bounds is
19
+ * how long anyone *waits* for it, which is the promise the budget actually
20
+ * makes.
21
+ */
22
+ async function withDeadline(work, ms) {
23
+ if (!(work instanceof Promise))
24
+ return work;
25
+ let timer;
26
+ try {
27
+ return await Promise.race([
28
+ work,
29
+ new Promise((resolve) => {
30
+ timer = setTimeout(() => resolve(TIMED_OUT), Math.max(0, ms));
31
+ }),
32
+ ]);
33
+ }
34
+ finally {
35
+ if (timer !== undefined)
36
+ clearTimeout(timer);
37
+ }
38
+ }
39
+ export async function runCollectors(env, options = {}) {
40
+ const now = options.now ?? (() => performance.now());
41
+ const waves = options.waves ?? ['instant', 'warm'];
42
+ const disabled = new Set(options.disabled ?? []);
43
+ const registry = options.collectors ?? ALL_COLLECTORS;
44
+ const signals = {};
45
+ const skipped = [];
46
+ const errors = [];
47
+ const startedAll = now();
48
+ let expected = 0;
49
+ let obtained = 0;
50
+ for (const wave of waves) {
51
+ const budget = options.budgets?.[wave] ?? WAVE_BUDGET_MS[wave];
52
+ const waveStarted = now();
53
+ // Set when a collector hits its deadline. A collector that outlived the
54
+ // remaining budget consumed it by definition, and saying so explicitly is
55
+ // both more honest and more reliable than inferring it from a clock —
56
+ // `setTimeout` and `performance.now()` are not the same clock, and a timer
57
+ // firing a fraction early left the comparison below reading as though
58
+ // there were budget left when there was not.
59
+ let exhausted = false;
60
+ for (const collector of registry.filter((c) => c.wave === wave)) {
61
+ if (disabled.has(collector.id)) {
62
+ skipped.push(collector.id);
63
+ // An optional collector the tenant switched off is a configuration
64
+ // choice, not missing evidence, so it does not count against
65
+ // confidence. Otherwise a tenant who disables canvas for privacy pays
66
+ // a permanently lower confidence on every request — the product
67
+ // penalising them for using the control it gave them.
68
+ //
69
+ // A collector that ran and found nothing still counts. That is a real
70
+ // absence, and `optional` says the tenant may turn it off, not that
71
+ // its silence is free.
72
+ if (collector.optional !== true)
73
+ expected++;
74
+ continue;
75
+ }
76
+ expected++;
77
+ // Checked before starting rather than after: overshooting the budget and
78
+ // then noticing is the failure this is meant to prevent.
79
+ if (exhausted || now() - waveStarted >= budget) {
80
+ skipped.push(collector.id);
81
+ continue;
82
+ }
83
+ try {
84
+ // Bounded by what is left of the wave, not merely checked before it
85
+ // starts. The budget is "a protected action is never delayed by
86
+ // collection", and an unbounded await cannot keep that promise: one
87
+ // collector whose promise never settles hangs the whole bundle, and
88
+ // the caller waits forever for a fingerprint that was supposed to be
89
+ // best-effort.
90
+ //
91
+ // Measured: a backgrounded tab never fires `requestAnimationFrame`,
92
+ // and a browser API that hangs rather than rejecting is an ordinary
93
+ // hostile-runtime event rather than an exotic one.
94
+ const remaining = budget - (now() - waveStarted);
95
+ const result = await withDeadline(collector.collect(env), remaining);
96
+ if (result === TIMED_OUT) {
97
+ skipped.push(collector.id);
98
+ errors.push(`${collector.id}: exceeded the ${wave} budget`);
99
+ exhausted = true;
100
+ continue;
101
+ }
102
+ Object.assign(signals, result);
103
+ // A collector that returns only nulls did not fail, but it did not
104
+ // contribute either — canvas in an environment with no canvas, for
105
+ // instance. Confidence has to mean "how much was actually learned",
106
+ // not "how many collectors avoided throwing".
107
+ if (Object.values(result).some((value) => value !== null))
108
+ obtained++;
109
+ else
110
+ skipped.push(collector.id);
111
+ }
112
+ catch (err) {
113
+ // One broken collector must never cost the whole bundle. Browsers are
114
+ // a hostile runtime: extensions remove APIs, hardening throws on
115
+ // property access, and a page can be closed mid-collection.
116
+ skipped.push(collector.id);
117
+ errors.push(`${collector.id}: ${err.message}`);
118
+ }
119
+ }
120
+ }
121
+ return {
122
+ signals,
123
+ durationMs: Math.round(now() - startedAll),
124
+ skipped,
125
+ errors,
126
+ confidence: expected === 0 ? 0 : Number((obtained / expected).toFixed(3)),
127
+ };
128
+ }
@@ -0,0 +1,2 @@
1
+ import type { Collector } from '../types.js';
2
+ export declare const adblockCollector: Collector;