@axeptio/behavior-detection 1.0.3 → 1.1.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.
package/README.md CHANGED
@@ -10,6 +10,7 @@ A sophisticated JavaScript library that analyzes user behavior patterns to deter
10
10
  ## ✨ Features
11
11
 
12
12
  - **🎯 High Accuracy**: Multi-strategy detection approach with configurable weights
13
+ - **🤖 Automation Detection**: Immediate detection of `navigator.webdriver`, headless browsers, and automation frameworks
13
14
  - **🌲 Tree-shakeable**: Import only the strategies you need
14
15
  - **🚀 Zero Dependencies**: Lightweight and fast (< 15KB minified)
15
16
  - **📱 Cross-platform**: Works on desktop and mobile browsers
@@ -59,12 +60,23 @@ yarn add @axeptio/behavior-detection
59
60
  Import only the strategies you need for optimal bundle size:
60
61
 
61
62
  ```typescript
62
- import { BehaviorDetector, Mouse, Click, Keyboard } from '@axeptio/behavior-detection';
63
+ import {
64
+ BehaviorDetector,
65
+ Mouse,
66
+ Click,
67
+ Keyboard,
68
+ Environment,
69
+ Timing,
70
+ Visibility
71
+ } from '@axeptio/behavior-detection';
63
72
 
64
73
  const detector = new BehaviorDetector()
65
74
  .addStrategy(new Mouse())
66
75
  .addStrategy(new Click())
67
- .addStrategy(new Keyboard());
76
+ .addStrategy(new Keyboard())
77
+ .addStrategy(new Environment()) // Detects automation frameworks
78
+ .addStrategy(new Timing()) // Detects machine-like timing
79
+ .addStrategy(new Visibility()); // Detects hidden tab actions
68
80
 
69
81
  // Start tracking
70
82
  detector.start();
@@ -204,6 +216,8 @@ Analyzes mouse movement patterns for human-like characteristics:
204
216
  - **Velocity Variation**: Humans have natural acceleration/deceleration (CV ~0.8-1.2)
205
217
  - **Direction Changes**: Organic curves vs. linear interpolation
206
218
  - **Movement Smoothness**: Natural micro-corrections vs. perfect paths
219
+ - **Entry Point Analysis**: Where mouse enters the viewport
220
+ - **Micro-movement Detection**: Natural hand tremor (1-5px jitter)
207
221
 
208
222
  ```typescript
209
223
  import { MouseStrategy } from '@axeptio/behavior-detection';
@@ -219,13 +233,15 @@ detector.addStrategy(mouse, 0.30); // Custom weight
219
233
  - Constant velocity movements
220
234
  - Perfect straight lines or curves
221
235
  - Instant position jumps
222
- - No micro-corrections
236
+ - No micro-corrections or hand tremor
237
+ - Entry at (0,0) or exact viewport center
238
+ - No micro-movements (1-5px) before actions
223
239
 
224
240
  ### 👆 Click Strategy
225
241
 
226
242
  **Weight:** 0.30 (default)
227
243
 
228
- Monitors click positioning accuracy on interactive elements:
244
+ Monitors click positioning accuracy and timing on interactive elements:
229
245
 
230
246
  ```typescript
231
247
  import { ClickStrategy } from '@axeptio/behavior-detection';
@@ -245,6 +261,16 @@ click.addTarget('.custom-clickable');
245
261
  - ⚠️ **Suspicious**: Click at exact center (pixel-perfect)
246
262
  - ❌ **Bot**: Click without mouse movement or mouse outside element
247
263
 
264
+ **Enhanced Detection (v1.1+):**
265
+
266
+ | Signal | Human | Bot |
267
+ |--------|-------|-----|
268
+ | Mouse-click position delta | 0px (exact match) | > 5px (mismatched) |
269
+ | Time since last mousemove | 50-300ms | < 10ms or > 2000ms |
270
+ | `isTrusted` event property | `true` | `false` (programmatic) |
271
+
272
+ Bots using `element.click()` often have click event coordinates that don't match the last mouse position, which is a strong indicator of programmatic clicks.
273
+
248
274
  ### 📜 Scroll Strategy
249
275
 
250
276
  **Weight:** 0.15 (default)
@@ -311,20 +337,54 @@ const tap = new TapStrategy({
311
337
 
312
338
  **Weight:** 0.08 (default)
313
339
 
314
- Fingerprints browser environment for automation indicators:
340
+ Fingerprints browser environment for automation indicators. This strategy provides **immediate bot detection** for the most reliable automation signals.
315
341
 
316
342
  ```typescript
317
343
  import { EnvironmentStrategy } from '@axeptio/behavior-detection';
318
344
 
319
345
  const env = new EnvironmentStrategy();
320
- ```
321
346
 
322
- **Checks:**
347
+ // Check if automation is detected
348
+ if (env.isLikelyBot()) {
349
+ console.warn('Automation detected!');
350
+ }
351
+
352
+ // Get detailed automation indicators
353
+ const indicators = env.getAutomationIndicators();
354
+ console.log(indicators);
355
+ // {
356
+ // isWebdriver: true, // navigator.webdriver === true
357
+ // hasHeadlessUA: false, // HeadlessChrome in user agent
358
+ // hasChromelessRuntime: true, // Chrome without chrome.runtime
359
+ // hasSoftwareRenderer: false, // SwiftShader WebGL renderer
360
+ // hasAutomationGlobals: false, // Selenium, Phantom, etc. globals
361
+ // hasCDPInjection: false, // Chrome DevTools Protocol injection
362
+ // ...
363
+ // }
364
+ ```
365
+
366
+ **Immediate Disqualification Signals (returns very low scores):**
367
+
368
+ | Signal | Score | Description |
369
+ |--------|-------|-------------|
370
+ | `navigator.webdriver === true` | 0.05 | Most reliable automation indicator |
371
+ | Automation globals detected | 0.10 | Selenium, Phantom, Nightmare, etc. |
372
+ | CDP injection (`cdc_*` properties) | 0.10 | Chrome DevTools Protocol |
373
+ | Multiple headless indicators | 0.15 | Combined headless signals |
374
+ | HeadlessChrome in user agent | 0.20 | Explicit headless mode |
375
+
376
+ **Automation Globals Detected:**
377
+ - `__selenium_evaluate`, `__webdriver_evaluate`, `__driver_evaluate`
378
+ - `_phantom`, `callPhantom`, `__nightmare`
379
+ - `_Selenium_IDE_Recorder`, `domAutomation`, `domAutomationController`
380
+ - And more...
381
+
382
+ **Additional Checks:**
323
383
  - Suspicious dimensions (800x600, 1024x768)
324
384
  - Missing browser features (WebGL, localStorage)
325
385
  - Plugin/MIME type inconsistencies
326
- - Headless browser indicators
327
- - Navigator property anomalies
386
+ - Software WebGL renderer (SwiftShader)
387
+ - Chrome without `chrome.runtime` (headless indicator)
328
388
 
329
389
  ### 📐 Resize Strategy
330
390
 
@@ -343,6 +403,58 @@ const resize = new ResizeStrategy();
343
403
  - Suspicious resize timing
344
404
  - Mouse position during resize
345
405
 
406
+ ### ⏱️ Timing Strategy
407
+
408
+ **Weight:** 0.15 (default)
409
+
410
+ Analyzes timing patterns in user interactions to detect bot-like precision:
411
+
412
+ ```typescript
413
+ import { TimingStrategy } from '@axeptio/behavior-detection';
414
+
415
+ const timing = new TimingStrategy();
416
+ ```
417
+
418
+ **Detection Signals:**
419
+
420
+ | Signal | Human Behavior | Bot Behavior |
421
+ |--------|---------------|--------------|
422
+ | Pre-action stillness | Micro-movements (1-5px tremor) | Perfect stillness |
423
+ | Mouse-to-click delay | 50-300ms with variation | 0-10ms (instant) |
424
+ | Action intervals | Variable timing | Machine-precise (100ms, 500ms, 1000ms) |
425
+ | Hidden tab actions | None (can't interact) | Continues while hidden |
426
+
427
+ **Bot Indicators:**
428
+ - Zero mouse movement before clicks (perfect stillness)
429
+ - Suspiciously consistent action intervals (CV < 0.15)
430
+ - Actions at machine-precise intervals (multiples of 100ms, 500ms)
431
+ - Any actions while `document.hidden === true`
432
+
433
+ ### 👁️ Visibility Strategy
434
+
435
+ **Weight:** 0.10 (default)
436
+
437
+ Monitors tab visibility and focus patterns:
438
+
439
+ ```typescript
440
+ import { VisibilityStrategy } from '@axeptio/behavior-detection';
441
+
442
+ const visibility = new VisibilityStrategy();
443
+ ```
444
+
445
+ **Detection Signals:**
446
+
447
+ | Signal | Human Behavior | Bot Behavior |
448
+ |--------|---------------|--------------|
449
+ | Actions while hidden | Impossible | Continues normally |
450
+ | Resume delay | 100-500ms to refocus | Instant (< 50ms) |
451
+ | Focus-to-type delay | 100-500ms natural delay | Instant (< 20ms) |
452
+
453
+ **Bot Indicators:**
454
+ - Actions occurring while `document.hidden === true`
455
+ - Instant activity resume when tab becomes visible
456
+ - Typing immediately after focus without human reaction time
457
+
346
458
  ## 📊 API Reference
347
459
 
348
460
  ### BehaviorDetector
@@ -692,12 +804,14 @@ behavior-detection/
692
804
  │ ├── math-utils.ts # Mathematical functions
693
805
  │ ├── browser.ts # Browser CDN wrapper
694
806
  │ └── strategies/
695
- │ ├── mouse.ts # Mouse movement detection
696
- │ ├── click.ts # Click accuracy detection
807
+ │ ├── mouse.ts # Mouse movement + entry point detection
808
+ │ ├── click.ts # Click accuracy + position delta
697
809
  │ ├── scroll.ts # Scroll behavior detection
698
810
  │ ├── keyboard.ts # Keyboard timing detection
699
811
  │ ├── tap.ts # Mobile tap detection
700
- │ ├── environment.ts # Environment fingerprinting
812
+ │ ├── environment.ts # Automation + headless detection
813
+ │ ├── timing.ts # Action timing patterns
814
+ │ ├── visibility.ts # Tab visibility behavior
701
815
  │ └── resize.ts # Window resize detection
702
816
  ├── dist/ # Build output
703
817
  ├── demos/
@@ -1,2 +1,2 @@
1
- "use strict";(()=>{var I=class{constructor(t){this.strategies=new Map,this.isTracking=!1,this.isPausedByVisibility=!1,this.tickInterval=null,this.tickIntervalMs=1e3,this.pauseOnHidden=!0,this.visibilityChangeHandler=null,this.confidenceScore=0,this.CONFIDENCE_TARGET=1,this.CONFIDENCE_DECAY=.95,t?.interval&&(this.tickIntervalMs=t.interval),t?.pauseOnHidden!==void 0&&(this.pauseOnHidden=t.pauseOnHidden)}addStrategy(t,e){let s={strategy:t,weight:e??t.defaultWeight,enabled:!0};return this.strategies.set(t.name,s),t.setEventCallback&&t.setEventCallback(n=>{this.onStrategyEvent(n,s.weight)}),this.isTracking&&t.start(),this}onStrategyEvent(t,e){this.confidenceScore*=this.CONFIDENCE_DECAY;let s=t.weight*e;this.confidenceScore=Math.min(this.CONFIDENCE_TARGET,this.confidenceScore+s)}removeStrategy(t){let e=this.strategies.get(t);return e&&(this.isTracking&&e.strategy.stop(),this.strategies.delete(t)),this}setStrategyEnabled(t,e){let s=this.strategies.get(t);return s&&(s.enabled=e,!e&&this.isTracking&&s.strategy.stop(),e&&this.isTracking&&s.strategy.start()),this}getStrategies(){return this.strategies}start(){if(!this.isTracking){if(this.isTracking=!0,this.pauseOnHidden&&typeof document<"u"&&(this.visibilityChangeHandler=this.handleVisibilityChange.bind(this),document.addEventListener("visibilitychange",this.visibilityChangeHandler),document.hidden)){this.isPausedByVisibility=!0;return}for(let[t,e]of this.strategies)e.enabled&&e.strategy.start();this.startTick()}}stop(){if(this.isTracking){this.isTracking=!1,this.isPausedByVisibility=!1,this.visibilityChangeHandler&&typeof document<"u"&&(document.removeEventListener("visibilitychange",this.visibilityChangeHandler),this.visibilityChangeHandler=null);for(let[t,e]of this.strategies)e.strategy.stop();this.stopTick()}}reset(){this.confidenceScore=0;for(let[t,e]of this.strategies)e.strategy.reset()}async score(t={}){let e=this.calculateStrategyScore(),s={score:e.overall};return t.breakdown&&(s.breakdown=e),s}isActive(){return this.isTracking}isPaused(){return this.isPausedByVisibility}getEventCount(){var t,e;let s={};for(let[n,r]of this.strategies){let i=(e=(t=r.strategy).getDebugInfo)===null||e===void 0?void 0:e.call(t);i?.eventCount!==void 0&&(s[n]=i.eventCount)}return s}getStrategyDebugInfo(){let t={};for(let[e,s]of this.strategies)s.strategy.getDebugInfo&&(t[e]=s.strategy.getDebugInfo());return t}getConfidence(){return Math.min(1,this.confidenceScore)}hasConfidentData(t=.3){return this.getConfidence()>=t}destroy(){this.stop(),this.strategies.clear()}handleVisibilityChange(){if(this.isTracking){if(document.hidden){if(!this.isPausedByVisibility){this.isPausedByVisibility=!0;for(let[t,e]of this.strategies)e.enabled&&e.strategy.stop();this.stopTick()}}else if(this.isPausedByVisibility){this.isPausedByVisibility=!1;for(let[t,e]of this.strategies)e.enabled&&e.strategy.start();this.startTick()}}}startTick(){this.tickInterval===null&&(this.tickInterval=window.setInterval(()=>{let t=Date.now();for(let[e,s]of this.strategies)s.enabled&&s.strategy.onTick&&s.strategy.onTick(t)},this.tickIntervalMs))}stopTick(){this.tickInterval!==null&&(clearInterval(this.tickInterval),this.tickInterval=null)}calculateStrategyScore(){let t={},e={},s=0,n=0;for(let[i,a]of this.strategies){if(!a.enabled)continue;let c=a.strategy.score();t[i]=c,e[i]=a.weight,c!=null&&(s+=a.weight,n+=c*a.weight)}let r=s>0?n/s:.5;return{overall:Math.max(0,Math.min(1,r)),factors:t,weights:e}}};var d=class{constructor(){this.eventCallback=null}setEventCallback(t){this.eventCallback=t}notifyEvent(t){this.eventCallback&&this.eventCallback({strategy:this.name,weight:t,timestamp:Date.now()})}};function W(l,t=0,e=1){return 1/(1+Math.exp(-e*(l-t)))}function p(l,t=0,e=1){return 1-W(l,t,e)}function v(l,t=0,e=1){let s=-Math.pow(l-t,2)/(2*e*e);return Math.exp(s)}function S(l){if(l.length===0)return{mean:0,variance:0,stdDev:0,cv:0};let t=l.reduce((r,i)=>r+i,0)/l.length,e=l.reduce((r,i)=>r+(i-t)**2,0)/l.length,s=Math.sqrt(e),n=t>0?s/t:0;return{mean:t,variance:e,stdDev:s,cv:n}}function y(l){if(l.length<2)return;let t=new Set(l.map(n=>Math.round(n/10))).size,e=t===1;return{statistics:S(l),uniqueCount:t,allIdentical:e}}function w(l){return l<.05?.1:l>2?.3:v(l,.45,.35)}var E=class extends d{constructor(t){super(),this.name="mouse",this.defaultWeight=.3,this.distanceSeries=[],this.angleSeries=[],this.lastPosition=null,this.lastAngle=0,this.cumulativeAngle=0,this.rollingWindowMs=5e3,this.listener=null,this.leaveListener=null,this.isActive=!1,this.screenDiagonal=1,t?.rollingWindow!==void 0&&(this.rollingWindowMs=t.rollingWindow)}start(){if(this.isActive)return;this.isActive=!0;let t=window.innerWidth,e=window.innerHeight;this.screenDiagonal=Math.sqrt(t*t+e*e),this.listener=s=>{let n=s,r=Date.now(),i={x:n.clientX,y:n.clientY};if(this.lastPosition){let a=i.x-this.lastPosition.x,c=i.y-this.lastPosition.y,g=Math.sqrt(a*a+c*c)/this.screenDiagonal;if(g>.001){let m=Math.atan2(c,a),u=m-this.lastAngle;for(;u>Math.PI;)u-=2*Math.PI;for(;u<-Math.PI;)u+=2*Math.PI;this.cumulativeAngle+=u,this.lastAngle=m,this.distanceSeries.push({value:g,timestamp:r}),this.angleSeries.push({value:this.cumulativeAngle,timestamp:r}),this.notifyEvent(Math.min(1,g*100))}let h=r-this.rollingWindowMs;for(;this.distanceSeries.length>0&&this.distanceSeries[0].timestamp<h;)this.distanceSeries.shift(),this.angleSeries.shift()}this.lastPosition=i},document.addEventListener("mousemove",this.listener,{passive:!0}),this.leaveListener=()=>{this.distanceSeries=[],this.angleSeries=[],this.lastPosition=null,this.lastAngle=0,this.cumulativeAngle=0},document.addEventListener("mouseleave",this.leaveListener,{passive:!0})}stop(){this.isActive&&(this.isActive=!1,this.listener&&(document.removeEventListener("mousemove",this.listener),this.listener=null),this.leaveListener&&(document.removeEventListener("mouseleave",this.leaveListener),this.leaveListener=null))}reset(){this.distanceSeries=[],this.angleSeries=[],this.lastPosition=null,this.lastAngle=0,this.cumulativeAngle=0}score(){if(!(this.distanceSeries.length<10))return this.detectMousePatterns()}detectMousePatterns(){if(this.distanceSeries.length<10)return;let t=0,e=0,s=this.distanceSeries.map(r=>r.value);if(s.length>=3){let r=S(s);t+=v(r.cv,.9,.35),e++}let n=this.angleSeries.map(r=>r.value);if(n.length>=3){let r=[];for(let a=1;a<n.length;a++)r.push(Math.abs(n[a]-n[a-1]));let i=r.reduce((a,c)=>a+c,0)/r.length;t+=v(i,.15,.12),e++}return e>0?t/e:void 0}getDebugInfo(){return{eventCount:this.distanceSeries.length,rollingWindow:this.rollingWindowMs,isActive:this.isActive,distanceSeries:this.distanceSeries,angleSeries:this.angleSeries}}};var L=class extends d{constructor(t){super(),this.name="scroll",this.defaultWeight=.15,this.distanceSeries=[],this.velocitySeries=[],this.lastScrollY=null,this.lastTimestamp=0,this.rollingWindowMs=5e3,this.documentHeight=1,this.listener=null,this.isActive=!1,t?.rollingWindow!==void 0&&(this.rollingWindowMs=t.rollingWindow)}start(){this.isActive||(this.isActive=!0,this.documentHeight=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,1),this.listener=t=>{let e=window.scrollY,s=Date.now();if(this.lastScrollY===null){this.lastScrollY=e,this.lastTimestamp=s;return}let n=e-this.lastScrollY,r=s-this.lastTimestamp;if(n===0)return;let i=Math.abs(n)/this.documentHeight;if(r>0){let a=i/r;this.distanceSeries.push({value:i,timestamp:s}),this.velocitySeries.push({value:a,timestamp:s}),this.notifyEvent(Math.min(1,i*10));let c=s-this.rollingWindowMs;for(;this.distanceSeries.length>0&&this.distanceSeries[0].timestamp<c;)this.distanceSeries.shift(),this.velocitySeries.shift()}this.lastScrollY=e,this.lastTimestamp=s},window.addEventListener("scroll",this.listener,{passive:!0}))}stop(){this.isActive&&(this.isActive=!1,this.listener&&(window.removeEventListener("scroll",this.listener),this.listener=null))}reset(){this.distanceSeries=[],this.velocitySeries=[],this.lastScrollY=null,this.lastTimestamp=0}score(){if(!(this.distanceSeries.length<2))return this.detectScrollPatterns()}detectScrollPatterns(){if(this.distanceSeries.length<2)return;let t=0,e=0,s=this.distanceSeries.map(i=>i.value);if(s.length>=2&&new Set(s.map(a=>Math.round(a*1e3))).size===1)return .05;if(s.length>=2){let i=S(s);t+=v(i.cv,1,.4),e++}let n=this.velocitySeries.map(i=>i.value);if(n.length>=2){let i=S(n);t+=v(i.cv,1.2,.5),e++}let r=s.filter(i=>i>.1).length;if(s.length>0){let i=r/s.length;t+=p(i,.3,15),e++}return e>0?t/e:void 0}getDebugInfo(){return{eventCount:this.distanceSeries.length,rollingWindow:this.rollingWindowMs,isActive:this.isActive,distanceSeries:this.distanceSeries,velocitySeries:this.velocitySeries}}};var b=class extends d{constructor(t){super(),this.name="click",this.defaultWeight=.3,this.events=[],this.targetSelectors=["button","a",'input[type="submit"]','[role="button"]'],this.lastMousePosition=null,this.mouseListener=null,this.clickListeners=new Map,this.isActive=!1,t?.targetSelectors&&(this.targetSelectors=t.targetSelectors)}start(){this.isActive||(this.isActive=!0,this.mouseListener=t=>{let e=t;this.lastMousePosition={x:e.clientX,y:e.clientY}},document.addEventListener("mousemove",this.mouseListener,{passive:!0}),this.attachClickListeners())}addTarget(t){this.targetSelectors.includes(t)||(this.targetSelectors.push(t),this.isActive&&this.attachClickListenersForSelector(t))}attachClickListeners(){this.targetSelectors.forEach(t=>{this.attachClickListenersForSelector(t)})}attachClickListenersForSelector(t){document.querySelectorAll(t).forEach(s=>{if(this.clickListeners.has(s))return;let n=r=>{var i,a;let c=r,o=s.getBoundingClientRect(),g=o.top>=0&&o.left>=0&&o.bottom<=window.innerHeight&&o.right<=window.innerWidth,h;if(!this.lastMousePosition)h="no-mouse-data";else{let m=this.lastMousePosition.x,u=this.lastMousePosition.y;if(!(m>=o.left&&m<=o.right&&u>=o.top&&u<=o.bottom))h="outside";else{let f=o.left+o.width/2,D=o.top+o.height/2;Math.sqrt((m-f)**2+(u-D)**2)<2?h="dead-center":h="over-element"}}this.events.push({clickX:c.clientX,clickY:c.clientY,mouseX:(i=this.lastMousePosition)===null||i===void 0?void 0:i.x,mouseY:(a=this.lastMousePosition)===null||a===void 0?void 0:a.y,rect:o,inViewport:g,position:h,timestamp:Date.now()}),this.notifyEvent(1)};s.addEventListener("click",n),this.clickListeners.set(s,n)})}stop(){this.isActive&&(this.isActive=!1,this.mouseListener&&(document.removeEventListener("mousemove",this.mouseListener),this.mouseListener=null),this.clickListeners.forEach((t,e)=>{e.removeEventListener("click",t)}),this.clickListeners.clear())}reset(){this.events=[],this.lastMousePosition=null}score(){if(this.events.length===0)return;let t=0;for(let e of this.events)switch(e.position){case"no-mouse-data":t+=0;break;case"outside":t+=0;break;case"dead-center":t+=.5;break;case"over-element":t+=1;break}return t/this.events.length}getDebugInfo(){return{eventCount:this.events.length,positions:{noMouseData:this.events.filter(t=>t.position==="no-mouse-data").length,outside:this.events.filter(t=>t.position==="outside").length,deadCenter:this.events.filter(t=>t.position==="dead-center").length,overElement:this.events.filter(t=>t.position==="over-element").length},inViewport:this.events.filter(t=>t.inViewport).length,trackedElements:this.clickListeners.size}}};var k=class extends d{constructor(t){super(),this.name="tap",this.defaultWeight=.35,this.events=[],this.targetSelectors=["button","a",'input[type="submit"]','[role="button"]'],this.touchStartListeners=new Map,this.touchEndListeners=new Map,this.activeTouches=new Map,this.isActive=!1,t?.targetSelectors&&(this.targetSelectors=t.targetSelectors)}start(){this.isActive||(this.isActive=!0,this.attachTouchListeners())}addTarget(t){this.targetSelectors.includes(t)||(this.targetSelectors.push(t),this.isActive&&this.attachTouchListenersForSelector(t))}attachTouchListeners(){this.targetSelectors.forEach(t=>{this.attachTouchListenersForSelector(t)})}attachTouchListenersForSelector(t){document.querySelectorAll(t).forEach(s=>{if(this.touchStartListeners.has(s))return;let n=i=>{let a=i;if(a.touches.length!==1)return;let c=a.touches[0];this.activeTouches.set(c.identifier,{x:c.clientX,y:c.clientY,timestamp:Date.now(),element:s})},r=i=>{let a=i;if(a.changedTouches.length!==1)return;let c=a.changedTouches[0],o=this.activeTouches.get(c.identifier);if(!o||o.element!==s)return;let g=Date.now(),h=g-o.timestamp,m=c.clientX-o.x,u=c.clientY-o.y,B=Math.sqrt(m*m+u*u),f=s.getBoundingClientRect(),D=f.top>=0&&f.left>=0&&f.bottom<=window.innerHeight&&f.right<=window.innerWidth,C=c.clientX,A=c.clientY,F=C>=f.left&&C<=f.right&&A>=f.top&&A<=f.bottom,P;if(!F)P="outside";else{let H=f.left+f.width/2,Y=f.top+f.height/2;P=Math.sqrt((C-H)**2+(A-Y)**2)<2?"dead-center":"over-element"}this.events.push({x:C,y:A,rect:f,inViewport:D,position:P,duration:h,movement:B,timestamp:g}),this.notifyEvent(1),this.activeTouches.delete(c.identifier)};s.addEventListener("touchstart",n,{passive:!0}),s.addEventListener("touchend",r,{passive:!0}),this.touchStartListeners.set(s,n),this.touchEndListeners.set(s,r)})}stop(){this.isActive&&(this.isActive=!1,this.touchStartListeners.forEach((t,e)=>{e.removeEventListener("touchstart",t)}),this.touchStartListeners.clear(),this.touchEndListeners.forEach((t,e)=>{e.removeEventListener("touchend",t)}),this.touchEndListeners.clear(),this.activeTouches.clear())}reset(){this.events=[],this.activeTouches.clear()}score(){if(this.events.length===0)return;let t=0,e=0,s=0;for(let i of this.events)switch(i.position){case"outside":s+=0;break;case"dead-center":s+=.5;break;case"over-element":s+=1;break}t+=s/this.events.length,e++;let n=this.events.map(i=>i.duration);if(n.length>=2){let i=y(n);if(i){let{statistics:a,allIdentical:c}=i;if(c)return .05;t+=w(a.cv),e++,t+=v(a.mean,95,40),e++}}let r=this.events.map(i=>i.movement);if(r.length>0){let i=r.reduce((a,c)=>a+c,0)/r.length;t+=v(i,2,3),e++}if(this.events.length>=3){let i=[];for(let c=1;c<this.events.length;c++)i.push(this.events[c].timestamp-this.events[c-1].timestamp);let a=y(i);a&&!a.allIdentical&&(t+=w(a.statistics.cv),e++)}return e>0?t/e:void 0}getDebugInfo(){return{eventCount:this.events.length,positions:{outside:this.events.filter(t=>t.position==="outside").length,deadCenter:this.events.filter(t=>t.position==="dead-center").length,overElement:this.events.filter(t=>t.position==="over-element").length},durations:this.events.map(t=>t.duration),movements:this.events.map(t=>t.movement),inViewport:this.events.filter(t=>t.inViewport).length,trackedElements:this.touchStartListeners.size}}};var x=class extends d{constructor(t){super(),this.name="keyboard",this.defaultWeight=.1,this.events=[],this.targetSelectors=['input[type="text"]','input[type="email"]',"textarea"],this.focusedElement=null,this.focusedElementSelector="",this.lastEventTimestamp=0,this.sessionPauseThreshold=1e3,this.downListener=null,this.upListener=null,this.focusListeners=new Map,this.blurListeners=new Map,this.isActive=!1,t?.targetSelectors&&(this.targetSelectors=t.targetSelectors)}start(){this.isActive||(this.isActive=!0,this.attachFocusListeners(),this.downListener=t=>{if(!this.focusedElement)return;let e=Date.now(),s=t;this.lastEventTimestamp>0&&e-this.lastEventTimestamp>this.sessionPauseThreshold&&(this.events=[]),this.events.push({key:s.key,type:"down",timestamp:e,targetElement:this.focusedElementSelector}),this.notifyEvent(.8),this.lastEventTimestamp=e},this.upListener=t=>{if(!this.focusedElement)return;let e=Date.now(),s=t;this.lastEventTimestamp>0&&e-this.lastEventTimestamp>this.sessionPauseThreshold&&(this.events=[]),this.events.push({key:s.key,type:"up",timestamp:e,targetElement:this.focusedElementSelector}),this.lastEventTimestamp=e},document.addEventListener("keydown",this.downListener),document.addEventListener("keyup",this.upListener))}addTarget(t){this.targetSelectors.includes(t)||(this.targetSelectors.push(t),this.isActive&&this.attachFocusListenersForSelector(t))}attachFocusListeners(){this.targetSelectors.forEach(t=>{this.attachFocusListenersForSelector(t)})}attachFocusListenersForSelector(t){document.querySelectorAll(t).forEach(s=>{if(this.focusListeners.has(s))return;let n=()=>{this.focusedElement=s,this.focusedElementSelector=t},r=()=>{this.focusedElement=null,this.focusedElementSelector=""};s.addEventListener("focus",n),s.addEventListener("blur",r),this.focusListeners.set(s,n),this.blurListeners.set(s,r)})}stop(){this.isActive&&(this.isActive=!1,this.downListener&&(document.removeEventListener("keydown",this.downListener),this.downListener=null),this.upListener&&(document.removeEventListener("keyup",this.upListener),this.upListener=null),this.focusListeners.forEach((t,e)=>{e.removeEventListener("focus",t)}),this.focusListeners.clear(),this.blurListeners.forEach((t,e)=>{e.removeEventListener("blur",t)}),this.blurListeners.clear(),this.focusedElement=null)}reset(){this.events=[],this.focusedElement=null,this.focusedElementSelector="",this.lastEventTimestamp=0}score(){if(this.events.length<6)return;let t=this.events.filter(o=>o.type==="down");if(t.length<3)return;let e=0,s=0,n=[];for(let o=1;o<t.length;o++)n.push(t[o].timestamp-t[o-1].timestamp);let r=y(n);if(r){let{statistics:o,allIdentical:g}=r;if(g)return .1;let h=w(o.cv);if(e+=h,s++,h<=.1)return h}let i=[];for(let o=0;o<this.events.length-1;o++)this.events[o].type==="down"&&this.events[o+1].type==="up"&&this.events[o].key===this.events[o+1].key&&i.push(this.events[o+1].timestamp-this.events[o].timestamp);let a=y(i);if(a){let{statistics:o,allIdentical:g}=a;if(g)return .1;if(o.mean<5)e+=.1,s++;else{let h=w(o.cv);if(e+=h,s++,h<=.1)return h}}let c=this.events.filter(o=>o.key==="Backspace").length;if(c>0){let o=c/t.length;o>.05&&o<.3?(e+=1,s++):o>0&&(e+=.8,s++)}return s>0?e/s:void 0}getDebugInfo(){let t=[];for(let e=0;e<this.events.length-1;e++)this.events[e].type==="down"&&this.events[e+1].type==="up"&&this.events[e].key===this.events[e+1].key&&t.push(this.events[e+1].timestamp-this.events[e].timestamp);return{eventCount:this.events.length,downEvents:this.events.filter(e=>e.type==="down").length,upEvents:this.events.filter(e=>e.type==="up").length,backspaceCount:this.events.filter(e=>e.key==="Backspace").length,pressDurations:t,focusedElement:this.focusedElementSelector,trackedElements:this.focusListeners.size}}};var T=class extends d{constructor(){super(...arguments),this.name="environment",this.defaultWeight=.08,this.data=null}start(){this.captureEnvironment()}stop(){}reset(){this.data=null}onTick(t){this.captureEnvironment()}score(){if(!this.data)return;let t=this.data,e=0,s=0;e+=t.suspiciousDimensions?.1:1,e+=t.suspiciousRatio?.2:1,e+=t.featureInconsistency?.3:1,s+=3;let n=[t.hasWebGL,t.hasLocalStorage,t.hasSessionStorage,t.hasIndexedDB].filter(Boolean).length;return e+=n/4,s++,e+=p(t.plugins,-2,-.5),e+=t.plugins>0?1:.1,s+=2,e+=v(t.devicePixelRatio,2,1.5),e+=t.colorDepth===24||t.colorDepth===32?1:.4,s+=2,s>0?e/s:void 0}isMobileDevice(){let t=navigator.maxTouchPoints>0||"ontouchstart"in window,e=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),s=window.innerWidth<768&&window.innerHeight<1024;return t&&s||e}captureEnvironment(){try{let t=!1;try{let u=document.createElement("canvas");t=!!(u.getContext("webgl")||u.getContext("experimental-webgl"))}catch{t=!1}let e=!!(window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection),s=this.isMobileDevice(),n=window.innerWidth,r=window.innerHeight,i=window.screen.width,a=window.screen.height,c=n===800&&r===600||n===1024&&r===768||n===1280&&r===720||i===800&&a===600,o=n*r/(i*a),g=o===1||o<.1||o>1,h=typeof localStorage<"u"&&typeof sessionStorage<"u",m=navigator.plugins.length===0&&navigator.mimeTypes.length===0||!t||!h;this.data={screenWidth:i,screenHeight:a,windowWidth:n,windowHeight:r,devicePixelRatio:window.devicePixelRatio,colorDepth:window.screen.colorDepth,userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language,languages:navigator.languages?Array.from(navigator.languages):[navigator.language],hardwareConcurrency:navigator.hardwareConcurrency,maxTouchPoints:navigator.maxTouchPoints||0,vendor:navigator.vendor,hasWebGL:t,hasWebRTC:e,hasLocalStorage:typeof localStorage<"u",hasSessionStorage:typeof sessionStorage<"u",hasIndexedDB:"indexedDB"in window,plugins:navigator.plugins.length,mimeTypes:navigator.mimeTypes.length,suspiciousRatio:g,suspiciousDimensions:c,featureInconsistency:m,isMobile:s,timestamp:Date.now()}}catch(t){console.warn("Failed to capture environment:",t)}}getDebugInfo(){return this.data}isMobile(){var t,e;return(e=(t=this.data)===null||t===void 0?void 0:t.isMobile)!==null&&e!==void 0?e:null}};var M=class extends d{constructor(){super(...arguments),this.name="resize",this.defaultWeight=.02,this.events=[],this.listener=null,this.isActive=!1,this.lastMousePosition=null,this.mouseListener=null}start(){this.isActive||(this.isActive=!0,this.mouseListener=t=>{let e=t;this.lastMousePosition={x:e.clientX,y:e.clientY}},document.addEventListener("mousemove",this.mouseListener,{passive:!0}),this.listener=()=>{var t,e;let s=(t=this.lastMousePosition)===null||t===void 0?void 0:t.x,n=(e=this.lastMousePosition)===null||e===void 0?void 0:e.y,r=!1;s!==void 0&&n!==void 0&&(r=s<50||s>window.innerWidth-50||n<50||n>window.innerHeight-50),this.events.push({width:window.innerWidth,height:window.innerHeight,mouseX:s,mouseY:n,mouseNearEdge:r,timestamp:Date.now()})},window.addEventListener("resize",this.listener))}stop(){this.isActive&&(this.isActive=!1,this.listener&&(window.removeEventListener("resize",this.listener),this.listener=null),this.mouseListener&&(document.removeEventListener("mousemove",this.mouseListener),this.mouseListener=null))}reset(){this.events=[]}score(){if(this.events.length===0)return;let t=0,e=0;t+=p(this.events.length,5,.5),e++;let s=this.events.filter(n=>n.mouseX!==void 0);if(s.length>0){let n=s.filter(r=>r.mouseNearEdge).length;t+=W(n/s.length,.5,8),e++}return e>0?t/e:void 0}getDebugInfo(){return{eventCount:this.events.length,withMouseData:this.events.filter(t=>t.mouseX!==void 0).length}}};var _={sampleRates:{mouseMove:.1,scroll:1,keypress:1},rollingWindows:{mouseMove:3e4,scroll:3e4},weights:{mouseMovement:.3,clickAccuracy:.3,scrollBehavior:.15,keyboardTiming:.1,tabActivity:.05,resizeBehavior:.02,environmentFingerprint:.08},customScorers:{},clickMouseHistoryWindow:1e3,useWebWorker:!1};})();
1
+ "use strict";(()=>{var R=class{constructor(e){this.strategies=new Map,this.isTracking=!1,this.isPausedByVisibility=!1,this.tickInterval=null,this.tickIntervalMs=1e3,this.pauseOnHidden=!0,this.visibilityChangeHandler=null,this.confidenceScore=0,this.CONFIDENCE_TARGET=1,this.CONFIDENCE_DECAY=.95,e?.interval&&(this.tickIntervalMs=e.interval),e?.pauseOnHidden!==void 0&&(this.pauseOnHidden=e.pauseOnHidden)}addStrategy(e,t){let i={strategy:e,weight:t??e.defaultWeight,enabled:!0};return this.strategies.set(e.name,i),e.setEventCallback&&e.setEventCallback(s=>{this.onStrategyEvent(s,i.weight)}),this.isTracking&&e.start(),this}onStrategyEvent(e,t){this.confidenceScore*=this.CONFIDENCE_DECAY;let i=e.weight*t;this.confidenceScore=Math.min(this.CONFIDENCE_TARGET,this.confidenceScore+i)}removeStrategy(e){let t=this.strategies.get(e);return t&&(this.isTracking&&t.strategy.stop(),this.strategies.delete(e)),this}setStrategyEnabled(e,t){let i=this.strategies.get(e);return i&&(i.enabled=t,!t&&this.isTracking&&i.strategy.stop(),t&&this.isTracking&&i.strategy.start()),this}getStrategies(){return this.strategies}start(){if(!this.isTracking){if(this.isTracking=!0,this.pauseOnHidden&&typeof document<"u"&&(this.visibilityChangeHandler=this.handleVisibilityChange.bind(this),document.addEventListener("visibilitychange",this.visibilityChangeHandler),document.hidden)){this.isPausedByVisibility=!0;return}for(let[e,t]of this.strategies)t.enabled&&t.strategy.start();this.startTick()}}stop(){if(this.isTracking){this.isTracking=!1,this.isPausedByVisibility=!1,this.visibilityChangeHandler&&typeof document<"u"&&(document.removeEventListener("visibilitychange",this.visibilityChangeHandler),this.visibilityChangeHandler=null);for(let[e,t]of this.strategies)t.strategy.stop();this.stopTick()}}reset(){this.confidenceScore=0;for(let[e,t]of this.strategies)t.strategy.reset()}async score(e={}){let t=this.calculateStrategyScore(),i={score:t.overall};return e.breakdown&&(i.breakdown=t),i}isActive(){return this.isTracking}isPaused(){return this.isPausedByVisibility}getEventCount(){var e,t;let i={};for(let[s,o]of this.strategies){let n=(t=(e=o.strategy).getDebugInfo)===null||t===void 0?void 0:t.call(e);n?.eventCount!==void 0&&(i[s]=n.eventCount)}return i}getStrategyDebugInfo(){let e={};for(let[t,i]of this.strategies)i.strategy.getDebugInfo&&(e[t]=i.strategy.getDebugInfo());return e}getConfidence(){return Math.min(1,this.confidenceScore)}hasConfidentData(e=.3){return this.getConfidence()>=e}destroy(){this.stop(),this.strategies.clear()}handleVisibilityChange(){if(this.isTracking){if(document.hidden){if(!this.isPausedByVisibility){this.isPausedByVisibility=!0;for(let[e,t]of this.strategies)t.enabled&&t.strategy.stop();this.stopTick()}}else if(this.isPausedByVisibility){this.isPausedByVisibility=!1;for(let[e,t]of this.strategies)t.enabled&&t.strategy.start();this.startTick()}}}startTick(){this.tickInterval===null&&(this.tickInterval=window.setInterval(()=>{let e=Date.now();for(let[t,i]of this.strategies)i.enabled&&i.strategy.onTick&&i.strategy.onTick(e)},this.tickIntervalMs))}stopTick(){this.tickInterval!==null&&(clearInterval(this.tickInterval),this.tickInterval=null)}calculateStrategyScore(){let e={},t={},i=0,s=0;for(let[n,a]of this.strategies){if(!a.enabled)continue;let r=a.strategy.score();e[n]=r,t[n]=a.weight,r!=null&&(i+=a.weight,s+=r*a.weight)}let o=i>0?s/i:.5;return{overall:Math.max(0,Math.min(1,o)),factors:e,weights:t}}};var g=class{constructor(){this.eventCallback=null}setEventCallback(e){this.eventCallback=e}notifyEvent(e){this.eventCallback&&this.eventCallback({strategy:this.name,weight:e,timestamp:Date.now()})}};function F(f,e=0,t=1){return 1/(1+Math.exp(-t*(f-e)))}function E(f,e=0,t=1){return 1-F(f,e,t)}function y(f,e=0,t=1){let i=-Math.pow(f-e,2)/(2*t*t);return Math.exp(i)}function S(f){if(f.length===0)return{mean:0,variance:0,stdDev:0,cv:0};let e=f.reduce((o,n)=>o+n,0)/f.length,t=f.reduce((o,n)=>o+(n-e)**2,0)/f.length,i=Math.sqrt(t),s=e>0?i/e:0;return{mean:e,variance:t,stdDev:i,cv:s}}function M(f){if(f.length<2)return;let e=new Set(f.map(s=>Math.round(s/10))).size,t=e===1;return{statistics:S(f),uniqueCount:e,allIdentical:t}}function b(f){return f<.05?.1:f>2?.3:y(f,.45,.35)}var k=class extends g{constructor(e){super(),this.name="mouse",this.defaultWeight=.3,this.distanceSeries=[],this.angleSeries=[],this.lastPosition=null,this.lastAngle=0,this.cumulativeAngle=0,this.rollingWindowMs=5e3,this.listener=null,this.leaveListener=null,this.enterListener=null,this.isActive=!1,this.screenDiagonal=1,this.entryPoints=[],this.microMovements=[],this.STILLNESS_WINDOW=500,e?.rollingWindow!==void 0&&(this.rollingWindowMs=e.rollingWindow)}start(){if(this.isActive)return;this.isActive=!0;let e=window.innerWidth,t=window.innerHeight;this.screenDiagonal=Math.sqrt(e*e+t*t),this.listener=i=>{let s=i,o=Date.now(),n={x:s.clientX,y:s.clientY,timestamp:o};if(this.lastPosition){let a=n.x-this.lastPosition.x,r=n.y-this.lastPosition.y,c=Math.sqrt(a*a+r*r);if(c>=1&&c<=5){this.microMovements.push({dx:a,dy:r,timestamp:o});let v=o-this.STILLNESS_WINDOW;for(;this.microMovements.length>0&&this.microMovements[0].timestamp<v;)this.microMovements.shift()}let l=c/this.screenDiagonal;if(l>.001){let v=Math.atan2(r,a),d=v-this.lastAngle;for(;d>Math.PI;)d-=2*Math.PI;for(;d<-Math.PI;)d+=2*Math.PI;this.cumulativeAngle+=d,this.lastAngle=v,this.distanceSeries.push({value:l,timestamp:o}),this.angleSeries.push({value:this.cumulativeAngle,timestamp:o}),this.notifyEvent(Math.min(1,l*100))}let h=o-this.rollingWindowMs;for(;this.distanceSeries.length>0&&this.distanceSeries[0].timestamp<h;)this.distanceSeries.shift(),this.angleSeries.shift()}this.lastPosition=n},document.addEventListener("mousemove",this.listener,{passive:!0}),this.enterListener=i=>{let s=i,o=Date.now(),n=s.clientX,a=s.clientY,r=window.innerWidth,c=window.innerHeight,l=a,h=c-a,v=n,d=r-n,p=Math.min(l,h,v,d),u,m=50;p<m?l<=p?u="top":h<=p?u="bottom":v<=p?u="left":u="right":n>r*.35&&n<r*.65&&a>c*.35&&a<c*.65?u="center":l<m*2&&v<m*2||l<m*2&&d<m*2||h<m*2&&v<m*2||h<m*2&&d<m*2?u="corner":l<h&&l<v&&l<d?u="top":h<v&&h<d?u="bottom":v<d?u="left":u="right",this.entryPoints.push({x:n,y:a,timestamp:o,edgeDistance:p,entryEdge:u}),this.entryPoints.length>20&&this.entryPoints.shift()},document.addEventListener("mouseenter",this.enterListener,{passive:!0}),this.leaveListener=()=>{this.distanceSeries=[],this.angleSeries=[],this.lastPosition=null,this.lastAngle=0,this.cumulativeAngle=0,this.microMovements=[]},document.addEventListener("mouseleave",this.leaveListener,{passive:!0})}stop(){this.isActive&&(this.isActive=!1,this.listener&&(document.removeEventListener("mousemove",this.listener),this.listener=null),this.leaveListener&&(document.removeEventListener("mouseleave",this.leaveListener),this.leaveListener=null),this.enterListener&&(document.removeEventListener("mouseenter",this.enterListener),this.enterListener=null))}reset(){this.distanceSeries=[],this.angleSeries=[],this.lastPosition=null,this.lastAngle=0,this.cumulativeAngle=0,this.entryPoints=[],this.microMovements=[]}score(){if(!(this.distanceSeries.length<10))return this.detectMousePatterns()}detectMousePatterns(){if(this.distanceSeries.length<10)return;let e=0,t=0,i=this.distanceSeries.map(a=>a.value);if(i.length>=3){let a=S(i);e+=y(a.cv,.9,.35),t++}let s=this.angleSeries.map(a=>a.value);if(s.length>=3){let a=[];for(let c=1;c<s.length;c++)a.push(Math.abs(s[c]-s[c-1]));let r=a.reduce((c,l)=>c+l,0)/a.length;e+=y(r,.15,.12),t++}let o=this.scoreEntryPoints();o!==void 0&&(e+=o,t++);let n=this.scoreMicroMovements();return n!==void 0&&(e+=n,t++),t>0?e/t:void 0}scoreEntryPoints(){if(this.entryPoints.length<2)return;let e=0,t=0,i=0,s=0;for(let a of this.entryPoints)a.x<5&&a.y<5?(s++,e++):a.entryEdge==="center"?(t++,e++):a.entryEdge==="corner"&&(i++,a.edgeDistance<10&&e++);let o=this.entryPoints.length,n=e/o;return s>=2||s/o>=.5?.1:t/o>=.5?.2:n>=.7?.3:n>=.5?.5:n>=.3?.7:1}scoreMicroMovements(){if(this.distanceSeries.length<20)return;let e=this.microMovements.length,t=this.distanceSeries[0],s=this.distanceSeries[this.distanceSeries.length-1].timestamp-t.timestamp;if(s<1e3)return;let o=e/s*1e3;return e===0?.3:o<1?.5:o<5?.7:o>=5&&o<=30?1:.8}getMicroMovementCount(){return this.microMovements.length}getLastPosition(){return this.lastPosition?{x:this.lastPosition.x,y:this.lastPosition.y}:null}getDebugInfo(){return{eventCount:this.distanceSeries.length,rollingWindow:this.rollingWindowMs,isActive:this.isActive,distanceSeries:this.distanceSeries,angleSeries:this.angleSeries,entryPoints:this.entryPoints,microMovementCount:this.microMovements.length,lastPosition:this.lastPosition}}};var T=class extends g{constructor(e){super(),this.name="scroll",this.defaultWeight=.15,this.distanceSeries=[],this.velocitySeries=[],this.lastScrollY=null,this.lastTimestamp=0,this.rollingWindowMs=5e3,this.documentHeight=1,this.listener=null,this.isActive=!1,e?.rollingWindow!==void 0&&(this.rollingWindowMs=e.rollingWindow)}start(){this.isActive||(this.isActive=!0,this.documentHeight=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,1),this.listener=e=>{let t=window.scrollY,i=Date.now();if(this.lastScrollY===null){this.lastScrollY=t,this.lastTimestamp=i;return}let s=t-this.lastScrollY,o=i-this.lastTimestamp;if(s===0)return;let n=Math.abs(s)/this.documentHeight;if(o>0){let a=n/o;this.distanceSeries.push({value:n,timestamp:i}),this.velocitySeries.push({value:a,timestamp:i}),this.notifyEvent(Math.min(1,n*10));let r=i-this.rollingWindowMs;for(;this.distanceSeries.length>0&&this.distanceSeries[0].timestamp<r;)this.distanceSeries.shift(),this.velocitySeries.shift()}this.lastScrollY=t,this.lastTimestamp=i},window.addEventListener("scroll",this.listener,{passive:!0}))}stop(){this.isActive&&(this.isActive=!1,this.listener&&(window.removeEventListener("scroll",this.listener),this.listener=null))}reset(){this.distanceSeries=[],this.velocitySeries=[],this.lastScrollY=null,this.lastTimestamp=0}score(){if(!(this.distanceSeries.length<2))return this.detectScrollPatterns()}detectScrollPatterns(){if(this.distanceSeries.length<2)return;let e=0,t=0,i=this.distanceSeries.map(n=>n.value);if(i.length>=2&&new Set(i.map(a=>Math.round(a*1e3))).size===1)return .05;if(i.length>=2){let n=S(i);e+=y(n.cv,1,.4),t++}let s=this.velocitySeries.map(n=>n.value);if(s.length>=2){let n=S(s);e+=y(n.cv,1.2,.5),t++}let o=i.filter(n=>n>.1).length;if(i.length>0){let n=o/i.length;e+=E(n,.3,15),t++}return t>0?e/t:void 0}getDebugInfo(){return{eventCount:this.distanceSeries.length,rollingWindow:this.rollingWindowMs,isActive:this.isActive,distanceSeries:this.distanceSeries,velocitySeries:this.velocitySeries}}};var C=class extends g{constructor(e){super(),this.name="click",this.defaultWeight=.3,this.events=[],this.targetSelectors=["button","a",'input[type="submit"]','[role="button"]'],this.lastMousePosition=null,this.mouseListener=null,this.clickListeners=new Map,this.isActive=!1,e?.targetSelectors&&(this.targetSelectors=e.targetSelectors)}start(){this.isActive||(this.isActive=!0,this.mouseListener=e=>{let t=e;this.lastMousePosition={x:t.clientX,y:t.clientY,timestamp:Date.now()}},document.addEventListener("mousemove",this.mouseListener,{passive:!0}),this.attachClickListeners())}addTarget(e){this.targetSelectors.includes(e)||(this.targetSelectors.push(e),this.isActive&&this.attachClickListenersForSelector(e))}attachClickListeners(){this.targetSelectors.forEach(e=>{this.attachClickListenersForSelector(e)})}attachClickListenersForSelector(e){document.querySelectorAll(e).forEach(i=>{if(this.clickListeners.has(i))return;let s=o=>{var n,a;let r=o,c=Date.now(),l=i.getBoundingClientRect(),h=l.top>=0&&l.left>=0&&l.bottom<=window.innerHeight&&l.right<=window.innerWidth,v=0,d=-1;if(this.lastMousePosition){let u=r.clientX-this.lastMousePosition.x,m=r.clientY-this.lastMousePosition.y;v=Math.sqrt(u*u+m*m),d=c-this.lastMousePosition.timestamp}let p;if(!this.lastMousePosition)p="no-mouse-data";else{let u=this.lastMousePosition.x,m=this.lastMousePosition.y;if(!(u>=l.left&&u<=l.right&&m>=l.top&&m<=l.bottom))p="outside";else{let L=l.left+l.width/2,W=l.top+l.height/2;Math.sqrt((u-L)**2+(m-W)**2)<2?p="dead-center":p="over-element"}}this.events.push({clickX:r.clientX,clickY:r.clientY,mouseX:(n=this.lastMousePosition)===null||n===void 0?void 0:n.x,mouseY:(a=this.lastMousePosition)===null||a===void 0?void 0:a.y,rect:l,inViewport:h,position:p,timestamp:c,mouseClickDelta:v,timeSinceMouseMove:d,isTrusted:r.isTrusted}),this.notifyEvent(1)};i.addEventListener("click",s),this.clickListeners.set(i,s)})}stop(){this.isActive&&(this.isActive=!1,this.mouseListener&&(document.removeEventListener("mousemove",this.mouseListener),this.mouseListener=null),this.clickListeners.forEach((e,t)=>{t.removeEventListener("click",e)}),this.clickListeners.clear())}reset(){this.events=[],this.lastMousePosition=null}score(){let e=this.events.length;if(e===0)return;let t=0,i=0,s=0,o=0,n=0,a=0;for(let l of this.events){switch(l.position){case"no-mouse-data":t+=0;break;case"outside":t+=0;break;case"dead-center":t+=.5;break;case"over-element":t+=1;break}l.mouseClickDelta>=0&&(i++,l.mouseClickDelta>5&&s++),l.timeSinceMouseMove>=0&&(o++,(l.timeSinceMouseMove<10||l.timeSinceMouseMove>2e3)&&n++),l.isTrusted||a++}let r=0,c=0;if(r+=t/e,c++,i>=2){let l=s/i,h;l>=.8?h=.1:l>=.5?h=.3:l>=.3?h=.5:l>0?h=.7:h=1,r+=h,c++}if(o>=2){let l=n/o,h;l>=.8?h=.2:l>=.5?h=.4:l>=.3?h=.6:l>0?h=.8:h=1,r+=h,c++}if(e>=2){let l=a/e,h;l>=.5?h=.1:l>0?h=.3:h=1,r+=h,c++}return c>0?r/c:void 0}getDebugInfo(){return{eventCount:this.events.length,positions:{noMouseData:this.events.filter(e=>e.position==="no-mouse-data").length,outside:this.events.filter(e=>e.position==="outside").length,deadCenter:this.events.filter(e=>e.position==="dead-center").length,overElement:this.events.filter(e=>e.position==="over-element").length},inViewport:this.events.filter(e=>e.inViewport).length,trackedElements:this.clickListeners.size,mouseClickDeltas:this.events.map(e=>e.mouseClickDelta),timeSinceMouseMoves:this.events.map(e=>e.timeSinceMouseMove),untrustedClicks:this.events.filter(e=>!e.isTrusted).length}}};var A=class extends g{constructor(e){super(),this.name="tap",this.defaultWeight=.35,this.events=[],this.targetSelectors=["button","a",'input[type="submit"]','[role="button"]'],this.touchStartListeners=new Map,this.touchEndListeners=new Map,this.activeTouches=new Map,this.isActive=!1,e?.targetSelectors&&(this.targetSelectors=e.targetSelectors)}start(){this.isActive||(this.isActive=!0,this.attachTouchListeners())}addTarget(e){this.targetSelectors.includes(e)||(this.targetSelectors.push(e),this.isActive&&this.attachTouchListenersForSelector(e))}attachTouchListeners(){this.targetSelectors.forEach(e=>{this.attachTouchListenersForSelector(e)})}attachTouchListenersForSelector(e){document.querySelectorAll(e).forEach(i=>{if(this.touchStartListeners.has(i))return;let s=n=>{let a=n;if(a.touches.length!==1)return;let r=a.touches[0];this.activeTouches.set(r.identifier,{x:r.clientX,y:r.clientY,timestamp:Date.now(),element:i})},o=n=>{let a=n;if(a.changedTouches.length!==1)return;let r=a.changedTouches[0],c=this.activeTouches.get(r.identifier);if(!c||c.element!==i)return;let l=Date.now(),h=l-c.timestamp,v=r.clientX-c.x,d=r.clientY-c.y,p=Math.sqrt(v*v+d*d),u=i.getBoundingClientRect(),m=u.top>=0&&u.left>=0&&u.bottom<=window.innerHeight&&u.right<=window.innerWidth,w=r.clientX,L=r.clientY,W=w>=u.left&&w<=u.right&&L>=u.top&&L<=u.bottom,H;if(!W)H="outside";else{let N=u.left+u.width/2,V=u.top+u.height/2;H=Math.sqrt((w-N)**2+(L-V)**2)<2?"dead-center":"over-element"}this.events.push({x:w,y:L,rect:u,inViewport:m,position:H,duration:h,movement:p,timestamp:l}),this.notifyEvent(1),this.activeTouches.delete(r.identifier)};i.addEventListener("touchstart",s,{passive:!0}),i.addEventListener("touchend",o,{passive:!0}),this.touchStartListeners.set(i,s),this.touchEndListeners.set(i,o)})}stop(){this.isActive&&(this.isActive=!1,this.touchStartListeners.forEach((e,t)=>{t.removeEventListener("touchstart",e)}),this.touchStartListeners.clear(),this.touchEndListeners.forEach((e,t)=>{t.removeEventListener("touchend",e)}),this.touchEndListeners.clear(),this.activeTouches.clear())}reset(){this.events=[],this.activeTouches.clear()}score(){if(this.events.length===0)return;let e=0,t=0,i=0;for(let n of this.events)switch(n.position){case"outside":i+=0;break;case"dead-center":i+=.5;break;case"over-element":i+=1;break}e+=i/this.events.length,t++;let s=this.events.map(n=>n.duration);if(s.length>=2){let n=M(s);if(n){let{statistics:a,allIdentical:r}=n;if(r)return .05;e+=b(a.cv),t++,e+=y(a.mean,95,40),t++}}let o=this.events.map(n=>n.movement);if(o.length>0){let n=o.reduce((a,r)=>a+r,0)/o.length;e+=y(n,2,3),t++}if(this.events.length>=3){let n=[];for(let r=1;r<this.events.length;r++)n.push(this.events[r].timestamp-this.events[r-1].timestamp);let a=M(n);a&&!a.allIdentical&&(e+=b(a.statistics.cv),t++)}return t>0?e/t:void 0}getDebugInfo(){return{eventCount:this.events.length,positions:{outside:this.events.filter(e=>e.position==="outside").length,deadCenter:this.events.filter(e=>e.position==="dead-center").length,overElement:this.events.filter(e=>e.position==="over-element").length},durations:this.events.map(e=>e.duration),movements:this.events.map(e=>e.movement),inViewport:this.events.filter(e=>e.inViewport).length,trackedElements:this.touchStartListeners.size}}};var D=class extends g{constructor(e){super(),this.name="keyboard",this.defaultWeight=.1,this.events=[],this.targetSelectors=['input[type="text"]','input[type="email"]',"textarea"],this.focusedElement=null,this.focusedElementSelector="",this.lastEventTimestamp=0,this.sessionPauseThreshold=1e3,this.downListener=null,this.upListener=null,this.focusListeners=new Map,this.blurListeners=new Map,this.isActive=!1,e?.targetSelectors&&(this.targetSelectors=e.targetSelectors)}start(){this.isActive||(this.isActive=!0,this.attachFocusListeners(),this.downListener=e=>{if(!this.focusedElement)return;let t=Date.now(),i=e;this.lastEventTimestamp>0&&t-this.lastEventTimestamp>this.sessionPauseThreshold&&(this.events=[]),this.events.push({key:i.key,type:"down",timestamp:t,targetElement:this.focusedElementSelector}),this.notifyEvent(.8),this.lastEventTimestamp=t},this.upListener=e=>{if(!this.focusedElement)return;let t=Date.now(),i=e;this.lastEventTimestamp>0&&t-this.lastEventTimestamp>this.sessionPauseThreshold&&(this.events=[]),this.events.push({key:i.key,type:"up",timestamp:t,targetElement:this.focusedElementSelector}),this.lastEventTimestamp=t},document.addEventListener("keydown",this.downListener),document.addEventListener("keyup",this.upListener))}addTarget(e){this.targetSelectors.includes(e)||(this.targetSelectors.push(e),this.isActive&&this.attachFocusListenersForSelector(e))}attachFocusListeners(){this.targetSelectors.forEach(e=>{this.attachFocusListenersForSelector(e)})}attachFocusListenersForSelector(e){document.querySelectorAll(e).forEach(i=>{if(this.focusListeners.has(i))return;let s=()=>{this.focusedElement=i,this.focusedElementSelector=e},o=()=>{this.focusedElement=null,this.focusedElementSelector=""};i.addEventListener("focus",s),i.addEventListener("blur",o),this.focusListeners.set(i,s),this.blurListeners.set(i,o)})}stop(){this.isActive&&(this.isActive=!1,this.downListener&&(document.removeEventListener("keydown",this.downListener),this.downListener=null),this.upListener&&(document.removeEventListener("keyup",this.upListener),this.upListener=null),this.focusListeners.forEach((e,t)=>{t.removeEventListener("focus",e)}),this.focusListeners.clear(),this.blurListeners.forEach((e,t)=>{t.removeEventListener("blur",e)}),this.blurListeners.clear(),this.focusedElement=null)}reset(){this.events=[],this.focusedElement=null,this.focusedElementSelector="",this.lastEventTimestamp=0}score(){if(this.events.length<6)return;let e=this.events.filter(c=>c.type==="down");if(e.length<3)return;let t=0,i=0,s=[];for(let c=1;c<e.length;c++)s.push(e[c].timestamp-e[c-1].timestamp);let o=M(s);if(o){let{statistics:c,allIdentical:l}=o;if(l)return .1;let h=b(c.cv);if(t+=h,i++,h<=.1)return h}let n=[];for(let c=0;c<this.events.length-1;c++)this.events[c].type==="down"&&this.events[c+1].type==="up"&&this.events[c].key===this.events[c+1].key&&n.push(this.events[c+1].timestamp-this.events[c].timestamp);let a=M(n);if(a){let{statistics:c,allIdentical:l}=a;if(l)return .1;if(c.mean<5)t+=.1,i++;else{let h=b(c.cv);if(t+=h,i++,h<=.1)return h}}let r=this.events.filter(c=>c.key==="Backspace").length;if(r>0){let c=r/e.length;c>.05&&c<.3?(t+=1,i++):c>0&&(t+=.8,i++)}return i>0?t/i:void 0}getDebugInfo(){let e=[];for(let t=0;t<this.events.length-1;t++)this.events[t].type==="down"&&this.events[t+1].type==="up"&&this.events[t].key===this.events[t+1].key&&e.push(this.events[t+1].timestamp-this.events[t].timestamp);return{eventCount:this.events.length,downEvents:this.events.filter(t=>t.type==="down").length,upEvents:this.events.filter(t=>t.type==="up").length,backspaceCount:this.events.filter(t=>t.key==="Backspace").length,pressDurations:e,focusedElement:this.focusedElementSelector,trackedElements:this.focusListeners.size}}};var B=["__nightmare","_phantom","callPhantom","__selenium_evaluate","__webdriver_evaluate","__driver_evaluate","__webdriver_script_function","__lastWatirAlert","__lastWatirConfirm","__lastWatirPrompt","_Selenium_IDE_Recorder","domAutomation","domAutomationController","webdriver","_webdriver_script_fn","__webdriver_script_func","__fxdriver_evaluate","__fxdriver_unwrapped","__selenium_unwrapped"],_=class extends g{constructor(){super(...arguments),this.name="environment",this.defaultWeight=.08,this.data=null}start(){this.captureEnvironment()}stop(){}reset(){this.data=null}onTick(e){this.captureEnvironment()}score(){if(!this.data)return;let e=this.data,t=e.automation;if(t.isWebdriver)return .05;if(t.hasAutomationGlobals||t.hasCDPInjection)return .1;if([t.hasHeadlessUA,t.hasChromelessRuntime,t.hasSoftwareRenderer].filter(Boolean).length>=2)return .15;if(t.hasHeadlessUA)return .2;let s=0,o=0;s+=e.suspiciousDimensions?.1:1,s+=e.suspiciousRatio?.2:1,s+=e.featureInconsistency?.3:1,o+=3;let n=[e.hasWebGL,e.hasLocalStorage,e.hasSessionStorage,e.hasIndexedDB].filter(Boolean).length;return s+=n/4,o++,e.isMobile||(s+=E(e.plugins,-2,-.5),s+=e.plugins>0?1:.1,o+=2,t.hasNoPlugins&&e.vendor.includes("Google")&&(s+=.3,o++)),t.hasChromelessRuntime&&(s+=.3,o++),t.hasSoftwareRenderer&&(s+=.4,o++),s+=y(e.devicePixelRatio,2,1.5),s+=e.colorDepth===24||e.colorDepth===32?1:.4,o+=2,o>0?s/o:void 0}isMobileDevice(){let e=navigator.maxTouchPoints>0||"ontouchstart"in window,t=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),i=window.innerWidth<768&&window.innerHeight<1024;return e&&i||t}detectAutomation(){let e=this.isMobileDevice(),t=navigator.webdriver===!0,i=navigator.userAgent,s=/HeadlessChrome|Headless/i.test(i),o=window,n=!!(o.chrome&&typeof o.chrome=="object"&&!o.chrome.runtime),a=[];for(let d of B)d in o&&a.push(d);let r=a.length>0,c=[];try{for(let d of Object.keys(o))/^cdc_|^__cdc_/.test(d)&&c.push(d)}catch{}let l=c.length>0,h=!e&&navigator.plugins.length===0,v=!1;try{let d=document.createElement("canvas"),p=d.getContext("webgl")||d.getContext("experimental-webgl");if(p){let u=p.getExtension("WEBGL_debug_renderer_info");if(u){let m=p.getParameter(u.UNMASKED_RENDERER_WEBGL);v=/SwiftShader|Software|LLVMpipe/i.test(m),this._webglRenderer=m}}}catch{}return{isWebdriver:t,hasHeadlessUA:s,hasChromelessRuntime:n,hasSoftwareRenderer:v,hasNoPlugins:h,hasAutomationGlobals:r,detectedGlobals:a,hasCDPInjection:l,detectedCDPKeys:c}}captureEnvironment(){try{let e=!1,t;try{let u=document.createElement("canvas"),m=u.getContext("webgl")||u.getContext("experimental-webgl");if(e=!!m,m){let w=m.getExtension("WEBGL_debug_renderer_info");w&&(t=m.getParameter(w.UNMASKED_RENDERER_WEBGL))}}catch{e=!1}let i=!!(window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection),s=this.isMobileDevice(),o=window.innerWidth,n=window.innerHeight,a=window.screen.width,r=window.screen.height,c=o===800&&n===600||o===1024&&n===768||o===1280&&n===720||a===800&&r===600,l=o*n/(a*r),h=l===1||l<.1||l>1,v=typeof localStorage<"u"&&typeof sessionStorage<"u",d=navigator.plugins.length===0&&navigator.mimeTypes.length===0||!e||!v,p=this.detectAutomation();this.data={screenWidth:a,screenHeight:r,windowWidth:o,windowHeight:n,devicePixelRatio:window.devicePixelRatio,colorDepth:window.screen.colorDepth,userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language,languages:navigator.languages?Array.from(navigator.languages):[navigator.language],hardwareConcurrency:navigator.hardwareConcurrency,maxTouchPoints:navigator.maxTouchPoints||0,vendor:navigator.vendor,hasWebGL:e,hasWebRTC:i,hasLocalStorage:typeof localStorage<"u",hasSessionStorage:typeof sessionStorage<"u",hasIndexedDB:"indexedDB"in window,plugins:navigator.plugins.length,mimeTypes:navigator.mimeTypes.length,suspiciousRatio:h,suspiciousDimensions:c,featureInconsistency:d,isMobile:s,timestamp:Date.now(),automation:p,webglRenderer:t}}catch{}}getDebugInfo(){return this.data}isMobile(){var e,t;return(t=(e=this.data)===null||e===void 0?void 0:e.isMobile)!==null&&t!==void 0?t:null}getAutomationIndicators(){var e,t;return(t=(e=this.data)===null||e===void 0?void 0:e.automation)!==null&&t!==void 0?t:null}isLikelyBot(){if(!this.data)return null;let e=this.data.automation;return e.isWebdriver||e.hasAutomationGlobals||e.hasCDPInjection||e.hasHeadlessUA}};var x=class extends g{constructor(){super(...arguments),this.name="resize",this.defaultWeight=.02,this.events=[],this.listener=null,this.isActive=!1,this.lastMousePosition=null,this.mouseListener=null}start(){this.isActive||(this.isActive=!0,this.mouseListener=e=>{let t=e;this.lastMousePosition={x:t.clientX,y:t.clientY}},document.addEventListener("mousemove",this.mouseListener,{passive:!0}),this.listener=()=>{var e,t;let i=(e=this.lastMousePosition)===null||e===void 0?void 0:e.x,s=(t=this.lastMousePosition)===null||t===void 0?void 0:t.y,o=!1;i!==void 0&&s!==void 0&&(o=i<50||i>window.innerWidth-50||s<50||s>window.innerHeight-50),this.events.push({width:window.innerWidth,height:window.innerHeight,mouseX:i,mouseY:s,mouseNearEdge:o,timestamp:Date.now()})},window.addEventListener("resize",this.listener))}stop(){this.isActive&&(this.isActive=!1,this.listener&&(window.removeEventListener("resize",this.listener),this.listener=null),this.mouseListener&&(document.removeEventListener("mousemove",this.mouseListener),this.mouseListener=null))}reset(){this.events=[]}score(){if(this.events.length===0)return;let e=0,t=0;e+=E(this.events.length,5,.5),t++;let i=this.events.filter(s=>s.mouseX!==void 0);if(i.length>0){let s=i.filter(o=>o.mouseNearEdge).length;e+=F(s/i.length,.5,8),t++}return t>0?e/t:void 0}getDebugInfo(){return{eventCount:this.events.length,withMouseData:this.events.filter(e=>e.mouseX!==void 0).length}}};var I=class extends g{constructor(){super(...arguments),this.name="timing",this.defaultWeight=.15,this.actions=[],this.mouseStillness={position:null,lastMoveTime:0,microMovementCount:0},this.microMovements=[],this.isActive=!1,this.mouseListener=null,this.clickListener=null,this.keydownListener=null,this.scrollListener=null,this.STILLNESS_WINDOW=500,this.MICRO_MOVEMENT_THRESHOLD=1,this.MAX_MICRO_MOVEMENT=5,this.MACHINE_PRECISION_THRESHOLD=5}start(){this.isActive||(this.isActive=!0,this.mouseListener=e=>{let t=e,i=Date.now(),s={x:t.clientX,y:t.clientY};if(this.mouseStillness.position){let n=s.x-this.mouseStillness.position.x,a=s.y-this.mouseStillness.position.y,r=Math.sqrt(n*n+a*a);r>=this.MICRO_MOVEMENT_THRESHOLD&&r<=this.MAX_MICRO_MOVEMENT&&this.microMovements.push({timestamp:i,distance:r}),r>=this.MICRO_MOVEMENT_THRESHOLD&&(this.mouseStillness.lastMoveTime=i)}this.mouseStillness.position=s;let o=i-this.STILLNESS_WINDOW;this.microMovements=this.microMovements.filter(n=>n.timestamp>=o)},this.clickListener=e=>{this.recordAction("click",e)},this.keydownListener=()=>{this.recordAction("keydown")},this.scrollListener=()=>{this.recordAction("scroll")},document.addEventListener("mousemove",this.mouseListener,{passive:!0}),document.addEventListener("click",this.clickListener,{passive:!0}),document.addEventListener("keydown",this.keydownListener,{passive:!0}),document.addEventListener("scroll",this.scrollListener,{passive:!0}))}recordAction(e,t){let i=Date.now(),s=this.mouseStillness.lastMoveTime>0?i-this.mouseStillness.lastMoveTime:-1;this.mouseStillness.microMovementCount=this.microMovements.length,this.actions.push({type:e,timestamp:i,timeSinceMouseMove:s,wasHidden:document.hidden}),this.notifyEvent(.7),this.actions.length>100&&this.actions.shift()}stop(){this.isActive&&(this.isActive=!1,this.mouseListener&&(document.removeEventListener("mousemove",this.mouseListener),this.mouseListener=null),this.clickListener&&(document.removeEventListener("click",this.clickListener),this.clickListener=null),this.keydownListener&&(document.removeEventListener("keydown",this.keydownListener),this.keydownListener=null),this.scrollListener&&(document.removeEventListener("scroll",this.scrollListener),this.scrollListener=null))}reset(){this.actions=[],this.microMovements=[],this.mouseStillness={position:null,lastMoveTime:0,microMovementCount:0}}score(){let e=this.actions.length;if(e<3)return;let t=0,i=0,s=[],o=[],n=0;for(let r of this.actions)r.type==="click"&&(s.push(r),r.timeSinceMouseMove>=0&&o.push(r)),r.wasHidden&&n++;if(s.length>=2){let r=this.scorePreActionStillness(s);r!==void 0&&(t+=r,i++)}if(o.length>=3){let r=this.scoreMouseToClickDelayFromCache(o);r!==void 0&&(t+=r,i++)}if(e>=5){let r=this.scoreActionIntervals();r!==void 0&&(t+=r,i++)}let a=this.scoreHiddenActionsFromCount(n,e);return t+=a,i++,i>0?t/i:void 0}scorePreActionStillness(e){let t=e.filter(o=>o.timeSinceMouseMove>=0);if(t.length<2)return;let s=t.filter(o=>o.timeSinceMouseMove>=100&&o.timeSinceMouseMove<=500&&this.mouseStillness.microMovementCount===0).length/t.length;return s>=.9?.1:s>=.7?.3:s>=.5?.5:s>=.3?.7:1}scoreMouseToClickDelayFromCache(e){let t=e.map(s=>s.timeSinceMouseMove),i=S(t);return i.mean<10?.1:i.cv<.2&&e.length>=5?.2:i.mean>=50&&i.mean<=300&&i.cv>=.3?1:i.cv<.4?.6:.8}scoreActionIntervals(){if(this.actions.length<5)return;let e=[];for(let n=1;n<this.actions.length;n++)e.push(this.actions[n].timestamp-this.actions[n-1].timestamp);let t=[100,200,250,500,1e3],i=0;for(let n of e)for(let a of t){let r=n%a;if(r<this.MACHINE_PRECISION_THRESHOLD||a-r<this.MACHINE_PRECISION_THRESHOLD){i++;break}}let s=i/e.length;return s>=.8?.1:s>=.6?.3:s>=.4?.5:S(e).cv<.15?.2:1}scoreHiddenActionsFromCount(e,t){if(e===0)return 1;let i=e/t;return i>.5?.1:i>.2?.3:i>0?.5:1}getDebugInfo(){let e=this.actions.filter(i=>i.type==="click"),t=[];for(let i=1;i<this.actions.length;i++)t.push(this.actions[i].timestamp-this.actions[i-1].timestamp);return{actionCount:this.actions.length,clickCount:e.length,keydownCount:this.actions.filter(i=>i.type==="keydown").length,scrollCount:this.actions.filter(i=>i.type==="scroll").length,hiddenActionCount:this.actions.filter(i=>i.wasHidden).length,microMovementCount:this.microMovements.length,intervals:t.slice(-20),lastStillnessDuration:this.mouseStillness.lastMoveTime>0?Date.now()-this.mouseStillness.lastMoveTime:null}}};var P=class extends g{constructor(){super(...arguments),this.name="visibility",this.defaultWeight=.1,this.events=[],this.focusTypingPairs=[],this.actionsWhileHidden=0,this.lastVisibilityChange=null,this.resumeDelays=[],this.isActive=!1,this.visibilityListener=null,this.focusListener=null,this.blurListener=null,this.clickListener=null,this.keydownListener=null,this.inputFocusListener=null,this.lastFocusedInput=null,this.hasTypedInFocusedInput=!1,this.lastActionTime=0,this.preHideActionTime=0}start(){this.isActive||(this.isActive=!0,this.visibilityListener=()=>{let e=Date.now(),t=document.hidden;this.lastVisibilityChange&&!t?(this.lastActionTime>0&&this.preHideActionTime>0&&e-this.lastActionTime<50&&this.actionsWhileHidden++,this.lastVisibilityChange={hidden:!1,timestamp:e}):t&&(this.preHideActionTime=this.lastActionTime,this.lastVisibilityChange={hidden:!0,timestamp:e}),this.events.push({type:"visibility_change",timestamp:e,wasHidden:t})},this.focusListener=()=>{this.events.push({type:"focus_change",timestamp:Date.now(),wasHidden:document.hidden,wasFocused:!0})},this.blurListener=()=>{this.events.push({type:"focus_change",timestamp:Date.now(),wasHidden:document.hidden,wasFocused:!1})},this.clickListener=e=>{this.recordAction("click",e)},this.keydownListener=e=>{if(this.recordAction("keydown",e),this.lastFocusedInput&&!this.hasTypedInFocusedInput){let t=Date.now(),i=t-this.lastFocusedInput.timestamp;this.focusTypingPairs.push({focusTime:this.lastFocusedInput.timestamp,firstKeypressTime:t,delay:i,element:this.lastFocusedInput.element}),this.hasTypedInFocusedInput=!0}},this.inputFocusListener=e=>{let t=e.target;t&&(t.tagName==="INPUT"||t.tagName==="TEXTAREA")&&(this.lastFocusedInput={element:t.tagName.toLowerCase(),timestamp:Date.now()},this.hasTypedInFocusedInput=!1)},document.addEventListener("visibilitychange",this.visibilityListener),window.addEventListener("focus",this.focusListener),window.addEventListener("blur",this.blurListener),document.addEventListener("click",this.clickListener,{passive:!0}),document.addEventListener("keydown",this.keydownListener,{passive:!0}),document.addEventListener("focusin",this.inputFocusListener,{passive:!0}))}recordAction(e,t){let i=Date.now();if(this.lastActionTime=i,document.hidden&&(this.actionsWhileHidden++,this.events.push({type:"action_while_hidden",timestamp:i,wasHidden:!0}),this.notifyEvent(1)),this.lastVisibilityChange&&!this.lastVisibilityChange.hidden){let s=i-this.lastVisibilityChange.timestamp;if(s>0&&s<1e4&&this.resumeDelays.length<20){let o=this.resumeDelays[this.resumeDelays.length-1];(o===void 0||Math.abs(s-o)>100)&&this.resumeDelays.push(s)}}}stop(){this.isActive&&(this.isActive=!1,this.visibilityListener&&(document.removeEventListener("visibilitychange",this.visibilityListener),this.visibilityListener=null),this.focusListener&&(window.removeEventListener("focus",this.focusListener),this.focusListener=null),this.blurListener&&(window.removeEventListener("blur",this.blurListener),this.blurListener=null),this.clickListener&&(document.removeEventListener("click",this.clickListener),this.clickListener=null),this.keydownListener&&(document.removeEventListener("keydown",this.keydownListener),this.keydownListener=null),this.inputFocusListener&&(document.removeEventListener("focusin",this.inputFocusListener),this.inputFocusListener=null))}reset(){this.events=[],this.focusTypingPairs=[],this.actionsWhileHidden=0,this.lastVisibilityChange=null,this.resumeDelays=[],this.lastFocusedInput=null,this.hasTypedInFocusedInput=!1,this.lastActionTime=0,this.preHideActionTime=0}score(){if(this.events.length<2)return;let e=0,t=0,i=this.scoreHiddenActions();i!==void 0&&(e+=i,t++);let s=this.scoreResumeDelays();s!==void 0&&(e+=s,t++);let o=this.scoreFocusTyping();return o!==void 0&&(e+=o,t++),t>0?e/t:void 0}scoreHiddenActions(){return this.actionsWhileHidden===0?1:this.actionsWhileHidden>=5?.1:this.actionsWhileHidden>=3?.2:this.actionsWhileHidden>=1?.3:1}scoreResumeDelays(){if(this.resumeDelays.length<2)return;let t=this.resumeDelays.filter(i=>i<50).length/this.resumeDelays.length;return t>=.8?.1:t>=.5?.3:t>=.3?.5:t>0?.7:1}scoreFocusTyping(){if(this.focusTypingPairs.length<2)return;let e=0;for(let i of this.focusTypingPairs)i.delay<20&&e++;let t=e/this.focusTypingPairs.length;return t>=.8?.2:t>=.5?.4:t>=.3?.6:t>0?.8:1}getDebugInfo(){return{eventCount:this.events.length,actionsWhileHidden:this.actionsWhileHidden,visibilityChanges:this.events.filter(e=>e.type==="visibility_change").length,focusChanges:this.events.filter(e=>e.type==="focus_change").length,resumeDelays:this.resumeDelays,focusTypingPairs:this.focusTypingPairs.map(e=>({delay:e.delay,element:e.element}))}}};var O={sampleRates:{mouseMove:.1,scroll:1,keypress:1},rollingWindows:{mouseMove:3e4,scroll:3e4},weights:{mouseMovement:.3,clickAccuracy:.3,scrollBehavior:.15,keyboardTiming:.1,tabActivity:.05,resizeBehavior:.02,environmentFingerprint:.08},customScorers:{},clickMouseHistoryWindow:1e3,useWebWorker:!1};})();
2
2
  //# sourceMappingURL=behavior-detection.esm.min.js.map