[{"data":1,"prerenderedAt":2114},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fbot-detection":64,"navigation":191,"navLinks_footer":816,"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore_page":829,"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore_surround":1566,"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore":1569},{"id":4,"extension":5,"links":6,"meta":61,"stem":62,"__hash__":63},"navigationMenu\u002Fnavigation.json","json",[7,52,57],{"nested":8,"label":9,"icon":10,"to":11,"children":12},true,"Docs","i-lucide-book-open","\u002Fdocs\u002Fgetting-started",[13,19,26,32,39,45],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},"Getting Started","i-lucide-rocket","An introduction to help you understand the core components.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fdocshub","Start Here",{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},"Auth H3 Client","i-lucide-key-round","\u002Fdocs\u002Fauth-h3client","Seamlessly enforce OAuth 2.0 authentication and session management integrated directly as the client of the IAM module.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth-h3client","Core",{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},"IAM","i-lucide-shield-check","\u002Fdocs\u002Fiam","Identity and Access Management featuring granular roles, permissions, and security policies.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth",{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},"Bot Detection","i-lucide-cpu","\u002Fdocs\u002Fbot-detection","Advanced behavioral analysis and request fingerprinting to stop malicious automated traffic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fbot-detector","Security",{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},"Shield Base","i-lucide-database-zap","\u002Fdocs\u002Fshield-base","CLI and programmatic toolkit for compiling offline-ready IP intelligence databases from BGP, GeoIP, Tor, FireHOL, and other public threat feeds.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fshield-base-cli",{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},"Utils","i-lucide-wrench","\u002Fdocs\u002Futils","A standard library of highly optimized helpers for formatting, validation, and core logic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Futils","Library",{"nested":53,"label":54,"icon":55,"to":56},false,"Blog","i-lucide-pen-line","\u002Fblog",{"nested":53,"label":58,"icon":59,"to":60},"Website","lucide:app-window-mac","https:\u002F\u002Friavzon.com",{},"navigation","gkaQ0xRGxSLrLyM3kttLe0oBwkrR1EBjlepF8LSbwF8",[65],{"title":9,"path":66,"stem":67,"children":68,"page":53},"\u002Fdocs","docs",[69],{"title":70,"path":35,"stem":71,"children":72},"Bot Detector","docs\u002Fbot-detection\u002Findex",[73,74,77,81,85,106,180,183,187],{"title":70,"path":35,"stem":71},{"title":14,"path":75,"stem":76},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":78,"path":79,"stem":80},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":82,"path":83,"stem":84},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":86,"path":87,"stem":88,"children":89,"page":53},"Guides","\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[90,94,98,102],{"title":91,"path":92,"stem":93},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":95,"path":96,"stem":97},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":99,"path":100,"stem":101},"Logging","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":103,"path":104,"stem":105},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":107,"path":108,"stem":109,"children":110},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[111,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176],{"title":107,"path":108,"stem":109},{"title":113,"path":114,"stem":115},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":117,"path":118,"stem":119},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":121,"path":122,"stem":123},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":125,"path":126,"stem":127},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":129,"path":130,"stem":131},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":133,"path":134,"stem":135},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":137,"path":138,"stem":139},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":141,"path":142,"stem":143},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":145,"path":146,"stem":147},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":149,"path":150,"stem":151},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":153,"path":154,"stem":155},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":157,"path":158,"stem":159},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":161,"path":162,"stem":163},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":165,"path":166,"stem":167},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":169,"path":170,"stem":171},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":173,"path":174,"stem":175},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":177,"path":178,"stem":179},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":181,"stem":182},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":184,"path":185,"stem":186},"API Reference","\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":188,"path":189,"stem":190},"Configuration","\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",[192],{"title":9,"path":66,"stem":67,"children":193,"page":53},[194,338,373,378,556,623],{"title":20,"path":22,"stem":195,"children":196},"docs\u002Fauth-h3client\u002Findex",[197,198,207,243,269,291,294,314,317],{"title":20,"path":22,"stem":195},{"title":14,"path":199,"stem":200,"children":201},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[202,203],{"title":14,"path":199,"stem":200},{"title":204,"path":205,"stem":206},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":208,"path":209,"stem":210,"children":211},"Essentials","\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[212,213,217,221,225,229,233,236,240],{"title":208,"path":209,"stem":210},{"title":214,"path":215,"stem":216},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":218,"path":219,"stem":220},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":222,"path":223,"stem":224},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":226,"path":227,"stem":228},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":230,"path":231,"stem":232},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":234,"stem":235},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":237,"path":238,"stem":239},"Cookies","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":99,"path":241,"stem":242},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":244,"path":245,"stem":246,"children":247},"MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[248,249,253,257,261,265],{"title":244,"path":245,"stem":246},{"title":250,"path":251,"stem":252},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":254,"path":255,"stem":256},"Password Reset","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":258,"path":259,"stem":260},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":262,"path":263,"stem":264},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":266,"path":267,"stem":268},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":270,"path":271,"stem":272,"children":273},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[274,275,279,283,287],{"title":270,"path":271,"stem":272},{"title":276,"path":277,"stem":278},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":280,"path":281,"stem":282},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":284,"path":285,"stem":286},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":288,"path":289,"stem":290},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":292,"stem":293},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":86,"path":295,"stem":296,"children":297,"page":53},"\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[298,302,306,310],{"title":299,"path":300,"stem":301},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":303,"path":304,"stem":305},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":307,"path":308,"stem":309},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":311,"path":312,"stem":313},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":188,"path":315,"stem":316},"\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":184,"path":318,"stem":319,"children":320},"\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[321,322,326,330,334],{"title":184,"path":318,"stem":319},{"title":323,"path":324,"stem":325},"Routes Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":327,"path":328,"stem":329},"Middleware Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":331,"path":332,"stem":333},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":335,"path":336,"stem":337},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":70,"path":35,"stem":71,"children":339},[340,341,342,343,344,350,370,371,372],{"title":70,"path":35,"stem":71},{"title":14,"path":75,"stem":76},{"title":78,"path":79,"stem":80},{"title":82,"path":83,"stem":84},{"title":86,"path":87,"stem":88,"children":345,"page":53},[346,347,348,349],{"title":91,"path":92,"stem":93},{"title":95,"path":96,"stem":97},{"title":99,"path":100,"stem":101},{"title":103,"path":104,"stem":105},{"title":107,"path":108,"stem":109,"children":351},[352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369],{"title":107,"path":108,"stem":109},{"title":113,"path":114,"stem":115},{"title":117,"path":118,"stem":119},{"title":121,"path":122,"stem":123},{"title":125,"path":126,"stem":127},{"title":129,"path":130,"stem":131},{"title":133,"path":134,"stem":135},{"title":137,"path":138,"stem":139},{"title":141,"path":142,"stem":143},{"title":145,"path":146,"stem":147},{"title":149,"path":150,"stem":151},{"title":153,"path":154,"stem":155},{"title":157,"path":158,"stem":159},{"title":161,"path":162,"stem":163},{"title":165,"path":166,"stem":167},{"title":169,"path":170,"stem":171},{"title":173,"path":174,"stem":175},{"title":177,"path":178,"stem":179},{"title":38,"path":181,"stem":182},{"title":184,"path":185,"stem":186},{"title":188,"path":189,"stem":190},{"title":374,"path":11,"stem":375,"children":376},"Introduction","docs\u002Fgetting-started\u002Findex",[377],{"title":374,"path":11,"stem":375},{"title":27,"path":29,"stem":379,"children":380},"docs\u002Fiam\u002Findex",[381,382,385,520,523,539,542],{"title":27,"path":29,"stem":379},{"title":14,"path":383,"stem":384},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":208,"path":386,"stem":387,"children":388},"\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[389,390,394,398,402,406,410,414,418,422,426,430,433,437,441,445,449,452,456,460,463,467,470],{"title":208,"path":386,"stem":387},{"title":391,"path":392,"stem":393},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":395,"path":396,"stem":397},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":399,"path":400,"stem":401},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":403,"path":404,"stem":405},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":407,"path":408,"stem":409},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":411,"path":412,"stem":413},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":415,"path":416,"stem":417},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":419,"path":420,"stem":421},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":423,"path":424,"stem":425},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":427,"path":428,"stem":429},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":244,"path":431,"stem":432},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":434,"path":435,"stem":436},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":438,"path":439,"stem":440},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":442,"path":443,"stem":444},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":446,"path":447,"stem":448},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":99,"path":450,"stem":451},"\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":453,"path":454,"stem":455},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":457,"path":458,"stem":459},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":237,"path":461,"stem":462},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":464,"path":465,"stem":466},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":254,"path":468,"stem":469},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":471,"path":472,"stem":473,"children":474},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[475,476,480,484,514,517],{"title":471,"path":472,"stem":473},{"title":477,"path":478,"stem":479},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":481,"path":482,"stem":483},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":485,"path":486,"stem":487,"children":488},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[489,490,494,498,502,506,510],{"title":485,"path":486,"stem":487},{"title":491,"path":492,"stem":493},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":495,"path":496,"stem":497},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":499,"path":500,"stem":501},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":503,"path":504,"stem":505},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":507,"path":508,"stem":509},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":511,"path":512,"stem":513},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":453,"path":515,"stem":516},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":518,"stem":519},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":521,"stem":522},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":86,"path":524,"stem":525,"children":526,"page":53},"\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[527,531,535],{"title":528,"path":529,"stem":530},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":532,"path":533,"stem":534},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":536,"path":537,"stem":538},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":188,"path":540,"stem":541},"\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":543,"path":544,"stem":545,"children":546,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[547,550,553],{"title":184,"path":548,"stem":549},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":327,"path":551,"stem":552},"\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":323,"path":554,"stem":555},"\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",{"title":40,"path":42,"stem":557,"children":558},"docs\u002Fshield-base\u002Findex",[559,560,563,567,608,612,616,620],{"title":40,"path":42,"stem":557},{"title":14,"path":561,"stem":562},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":564,"path":565,"stem":566},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":82,"path":568,"stem":569,"children":570},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[571,572,576,580,584,588,592,596,600,604],{"title":82,"path":568,"stem":569},{"title":573,"path":574,"stem":575},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":577,"path":578,"stem":579},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":581,"path":582,"stem":583},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":585,"path":586,"stem":587},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":589,"path":590,"stem":591},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":593,"path":594,"stem":595},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":597,"path":598,"stem":599},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":601,"path":602,"stem":603},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":605,"path":606,"stem":607},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":609,"path":610,"stem":611},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":613,"path":614,"stem":615},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":617,"path":618,"stem":619},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":184,"path":621,"stem":622},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":335,"path":48,"stem":624,"children":625},"docs\u002Futils\u002Findex",[626,627,644,677,774],{"title":335,"path":48,"stem":624},{"title":628,"path":629,"stem":630,"children":631,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[632,636,640],{"title":633,"path":634,"stem":635},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":637,"path":638,"stem":639},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":641,"path":642,"stem":643},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":645,"path":646,"stem":647,"children":648,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[649,653,657,661,665,669,673],{"title":650,"path":651,"stem":652},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":654,"path":655,"stem":656},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":658,"path":659,"stem":660},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":662,"path":663,"stem":664},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":666,"path":667,"stem":668},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":670,"path":671,"stem":672},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":674,"path":675,"stem":676},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":678,"path":679,"stem":680,"children":681,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[682,686,690,694,698,702,706,710,714,718,722,726,730,734,738,742,746,750,754,758,762,766,770],{"title":683,"path":684,"stem":685},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":687,"path":688,"stem":689},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":691,"path":692,"stem":693},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":695,"path":696,"stem":697},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":699,"path":700,"stem":701},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":703,"path":704,"stem":705},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":707,"path":708,"stem":709},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":711,"path":712,"stem":713},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":715,"path":716,"stem":717},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":719,"path":720,"stem":721},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":723,"path":724,"stem":725},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":727,"path":728,"stem":729},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":731,"path":732,"stem":733},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":735,"path":736,"stem":737},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":739,"path":740,"stem":741},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":743,"path":744,"stem":745},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":747,"path":748,"stem":749},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":751,"path":752,"stem":753},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":755,"path":756,"stem":757},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":759,"path":760,"stem":761},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":763,"path":764,"stem":765},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":767,"path":768,"stem":769},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":771,"path":772,"stem":773},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":775,"path":776,"stem":777,"children":778},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[779,780,784,788,792,796,800,804,808,812],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":785,"path":786,"stem":787},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":789,"path":790,"stem":791},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":793,"path":794,"stem":795},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":797,"path":798,"stem":799},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":801,"path":802,"stem":803},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":805,"path":806,"stem":807},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":809,"path":810,"stem":811},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":813,"path":814,"stem":815},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":817,"meta":828,"stem":62,"__hash__":63},[818,826,827],{"nested":8,"label":9,"icon":10,"to":11,"children":819},[820,821,822,823,824,825],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},{"nested":53,"label":54,"icon":55,"to":56},{"nested":53,"label":58,"icon":59,"to":60},{},{"id":830,"title":103,"body":831,"description":1558,"extension":1559,"icon":1560,"meta":1561,"module":1562,"navigation":8,"path":104,"rawbody":1563,"seo":1564,"stem":105,"__hash__":1565},"docs\u002Fdocs\u002Fbot-detection\u002F03.guides\u002FSCORE.md",{"type":832,"value":833,"toc":1549},"minimark",[834,860,863,868,881,891,897,899,906,913,916,930,1020,1023,1029,1031,1037,1044,1049,1104,1111,1119,1128,1130,1135,1138,1266,1280,1290,1346,1348,1352,1448,1482,1484,1488,1545],[835,836,837,838,842,843,846,847,851,852,855,856,859],"p",{},"Every non-banned visitor carries a ",[839,840,841],"code",{},"suspicious_activity_score"," in the ",[839,844,845],{},"visitors"," table. Two processes write to this score on every request: the ",[848,849,850],"strong",{},"detector",", which computes a fresh risk score by running all checkers, and the ",[848,853,854],{},"reputation healer",", which decrements the stored score after each clean request. The ",[839,857,858],{},"setNewComputedScore"," flag controls how these two processes cooperate.",[861,862],"hr",{},[864,865,867],"h2",{"id":866},"the-two-actors","The Two Actors",[835,869,870,873,874,877,878,880],{},[848,871,872],{},"The detector"," runs the 17-checker pipeline and produces a ",[839,875,876],{},"botScore"," for the current request. What it does with that score afterward depends on ",[839,879,858],{},".",[835,882,883,886,887,890],{},[848,884,885],{},"The reputation healer"," runs on every non-banned request. It reads the visitor's current score from cache (or from the database on a cache miss), then decrements it by ",[839,888,889],{},"restoredReputationPoints"," and writes the lower value back to cache and the database queue. This is the mechanism by which legitimate visitors with an accidentally elevated score recover over time.",[835,892,893,894,896],{},"Both actors run on every request. Their interaction is what ",[839,895,858],{}," controls.",[861,898],{},[864,900,902,905],{"id":901},"setnewcomputedscore-false-default",[839,903,904],{},"setNewComputedScore: false"," (default)",[835,907,908,909,912],{},"In this mode the detector writes its computed score to the database and cache ",[848,910,911],{},"only on the first request"," for a given canary cookie (or when the cache entry is missing or zero). After that, the healer owns the score and decrements it each request until it reaches zero or the cache expires.",[835,914,915],{},"The score only decreases between cache expirations. When the cache expires, the next request triggers a fresh detection cycle and the score is re-established from whatever the current pipeline computes.",[835,917,918,921,922,925,926,929],{},[848,919,920],{},"Example"," with ",[839,923,924],{},"banScore: 10",", ",[839,927,928],{},"restoredReputationPoints: 1",":",[931,932,933,955],"table",{},[934,935,936],"thead",{},[937,938,939,943,946,949,952],"tr",{},[940,941,942],"th",{},"Request",[940,944,945],{},"Detector computes",[940,947,948],{},"Cache before healer",[940,950,951],{},"Healer writes",[940,953,954],{},"DB score",[956,957,958,975,990,1005],"tbody",{},[937,959,960,964,967,970,973],{},[961,962,963],"td",{},"R1",[961,965,966],{},"8",[961,968,969],{},"no cache",[961,971,972],{},"7",[961,974,972],{},[937,976,977,980,982,985,988],{},[961,978,979],{},"R2",[961,981,966],{},[961,983,984],{},"7 (hit)",[961,986,987],{},"6",[961,989,987],{},[937,991,992,995,997,1000,1003],{},[961,993,994],{},"R3",[961,996,966],{},[961,998,999],{},"6 (hit)",[961,1001,1002],{},"5",[961,1004,1002],{},[937,1006,1007,1010,1012,1015,1018],{},[961,1008,1009],{},"R4",[961,1011,966],{},[961,1013,1014],{},"5 (hit)",[961,1016,1017],{},"4",[961,1019,1017],{},[835,1021,1022],{},"The detector recomputes 8 on every request but does not overwrite the cache once a non-zero entry exists. The score decays toward zero.",[835,1024,1025,1028],{},[848,1026,1027],{},"When to use:"," Most applications. Visitors who trigger a few cheap-phase signals due to a VPN or unusual network conditions gradually recover without requiring manual intervention.",[861,1030],{},[864,1032,1034],{"id":1033},"setnewcomputedscore-true",[839,1035,1036],{},"setNewComputedScore: true",[835,1038,1039,1040,1043],{},"In this mode the detector writes its computed score on ",[848,1041,1042],{},"every request",", overwriting whatever the healer wrote on the previous request. The score oscillates: the detector pushes it up to the computed value, then the healer immediately decrements it by one heal step, then the detector pushes it back up on the next request.",[835,1045,1046,1048],{},[848,1047,920],{}," with the same settings:",[931,1050,1051,1066],{},[934,1052,1053],{},[937,1054,1055,1057,1059,1062,1064],{},[940,1056,942],{},[940,1058,945],{},[940,1060,1061],{},"Detector writes",[940,1063,951],{},[940,1065,954],{},[956,1067,1068,1080,1092],{},[937,1069,1070,1072,1074,1076,1078],{},[961,1071,963],{},[961,1073,966],{},[961,1075,966],{},[961,1077,972],{},[961,1079,972],{},[937,1081,1082,1084,1086,1088,1090],{},[961,1083,979],{},[961,1085,966],{},[961,1087,966],{},[961,1089,972],{},[961,1091,972],{},[937,1093,1094,1096,1098,1100,1102],{},[961,1095,994],{},[961,1097,966],{},[961,1099,966],{},[961,1101,972],{},[961,1103,972],{},[835,1105,1106,1107,1110],{},"The DB score after each full request cycle is always ",[839,1108,1109],{},"computed - restoredReputationPoints",", regardless of how many requests the visitor makes. The score never truly heals.",[835,1112,1113,1115,1116,1118],{},[848,1114,1027],{}," When you want the ",[839,1117,845],{}," table to always reflect the visitor's current computed risk, not a decayed snapshot. This is useful when you query the database for monitoring or review and need the scores to represent the live pipeline output rather than historical state.",[1120,1121,1122],"warning",{},[835,1123,1124,1125,1127],{},"With ",[839,1126,1036],{},", a visitor whose network conditions consistently produce a non-zero score will never reach zero and can accumulate enough score to eventually be banned, even if their behavior is otherwise legitimate. Use this mode only when current-state visibility in the database is more important than natural score recovery.",[861,1129],{},[864,1131,1133],{"id":1132},"restoredreputationpoints",[839,1134,889],{},[835,1136,1137],{},"This setting controls how much score the healer subtracts per clean request. It applies in both modes.",[1139,1140,1146],"pre",{"className":1141,"code":1142,"filename":1143,"language":1144,"meta":1145,"style":1145},"language-ts shiki shiki-themes light-plus light-plus dracula","await defineConfiguration({\n  store: { main: { driver: 'sqlite', name: '.\u002Fbot-detector.db' } },\n  setNewComputedScore: false,\n  restoredReputationPoints: 10,\n  banScore: 100,\n})\n","server.ts","ts","",[839,1147,1148,1165,1218,1233,1247,1260],{"__ignoreMap":1145},[1149,1150,1153,1157,1161],"span",{"class":1151,"line":1152},"line",1,[1149,1154,1156],{"class":1155},"sZ328","await",[1149,1158,1160],{"class":1159},"sHOzp"," defineConfiguration",[1149,1162,1164],{"class":1163},"sDd4n","({\n",[1149,1166,1168,1172,1175,1178,1181,1183,1185,1188,1190,1194,1198,1201,1203,1206,1208,1210,1213,1215],{"class":1151,"line":1167},2,[1149,1169,1171],{"class":1170},"sjsA6","  store",[1149,1173,929],{"class":1174},"s34zl",[1149,1176,1177],{"class":1163}," { ",[1149,1179,1180],{"class":1170},"main",[1149,1182,929],{"class":1174},[1149,1184,1177],{"class":1163},[1149,1186,1187],{"class":1170},"driver",[1149,1189,929],{"class":1174},[1149,1191,1193],{"class":1192},"sFkSl"," '",[1149,1195,1197],{"class":1196},"sFB1V","sqlite",[1149,1199,1200],{"class":1192},"'",[1149,1202,925],{"class":1163},[1149,1204,1205],{"class":1170},"name",[1149,1207,929],{"class":1174},[1149,1209,1193],{"class":1192},[1149,1211,1212],{"class":1196},".\u002Fbot-detector.db",[1149,1214,1200],{"class":1192},[1149,1216,1217],{"class":1163}," } },\n",[1149,1219,1221,1224,1226,1230],{"class":1151,"line":1220},3,[1149,1222,1223],{"class":1170},"  setNewComputedScore",[1149,1225,929],{"class":1174},[1149,1227,1229],{"class":1228},"sjR7W"," false",[1149,1231,1232],{"class":1163},",\n",[1149,1234,1236,1239,1241,1245],{"class":1151,"line":1235},4,[1149,1237,1238],{"class":1170},"  restoredReputationPoints",[1149,1240,929],{"class":1174},[1149,1242,1244],{"class":1243},"spgvN"," 10",[1149,1246,1232],{"class":1163},[1149,1248,1250,1253,1255,1258],{"class":1151,"line":1249},5,[1149,1251,1252],{"class":1170},"  banScore",[1149,1254,929],{"class":1174},[1149,1256,1257],{"class":1243}," 100",[1149,1259,1232],{"class":1163},[1149,1261,1263],{"class":1151,"line":1262},6,[1149,1264,1265],{"class":1163},"})\n",[835,1267,1268,1269,925,1272,1275,1276,1279],{},"With the defaults (",[839,1270,1271],{},"restoredReputationPoints: 10",[839,1273,1274],{},"banScore: 100","), a visitor at score ",[839,1277,1278],{},"40"," returns to zero after four clean requests.",[835,1281,1282,1283,1286,1287,880],{},"Setting ",[839,1284,1285],{},"restoredReputationPoints: 0"," disables healing entirely. Scores accumulate permanently until you manually reset them with ",[839,1288,1289],{},"updateIsBot",[931,1291,1292,1302],{},[934,1293,1294],{},[937,1295,1296,1299],{},[940,1297,1298],{},"Value",[940,1300,1301],{},"Effect",[956,1303,1304,1314,1323,1336],{},[937,1305,1306,1311],{},[961,1307,1308],{},[839,1309,1310],{},"0",[961,1312,1313],{},"Healing disabled. Scores only increase.",[937,1315,1316,1320],{},[961,1317,1318],{},[839,1319,1002],{},[961,1321,1322],{},"Slow recovery. Useful when you want score history to persist longer.",[937,1324,1325,1330],{},[961,1326,1327,905],{},[839,1328,1329],{},"10",[961,1331,1332,1333,880],{},"Moderate recovery. 10 clean requests recover from a full ",[839,1334,1335],{},"banScore",[937,1337,1338,1343],{},[961,1339,1340],{},[839,1341,1342],{},"25",[961,1344,1345],{},"Fast recovery. Suitable for environments with many false positives.",[861,1347],{},[864,1349,1351],{"id":1350},"configuration-reference","Configuration Reference",[1139,1353,1355],{"className":1141,"code":1354,"filename":1143,"language":1144,"meta":1145,"style":1145},"await defineConfiguration({\n  store: { main: { driver: 'sqlite', name: '.\u002Fbot-detector.db' } },\n  setNewComputedScore: false,      \u002F\u002F default\n  restoredReputationPoints: 10,    \u002F\u002F default\n  banScore: 100,                   \u002F\u002F default\n})\n",[839,1356,1357,1365,1403,1418,1431,1444],{"__ignoreMap":1145},[1149,1358,1359,1361,1363],{"class":1151,"line":1152},[1149,1360,1156],{"class":1155},[1149,1362,1160],{"class":1159},[1149,1364,1164],{"class":1163},[1149,1366,1367,1369,1371,1373,1375,1377,1379,1381,1383,1385,1387,1389,1391,1393,1395,1397,1399,1401],{"class":1151,"line":1167},[1149,1368,1171],{"class":1170},[1149,1370,929],{"class":1174},[1149,1372,1177],{"class":1163},[1149,1374,1180],{"class":1170},[1149,1376,929],{"class":1174},[1149,1378,1177],{"class":1163},[1149,1380,1187],{"class":1170},[1149,1382,929],{"class":1174},[1149,1384,1193],{"class":1192},[1149,1386,1197],{"class":1196},[1149,1388,1200],{"class":1192},[1149,1390,925],{"class":1163},[1149,1392,1205],{"class":1170},[1149,1394,929],{"class":1174},[1149,1396,1193],{"class":1192},[1149,1398,1212],{"class":1196},[1149,1400,1200],{"class":1192},[1149,1402,1217],{"class":1163},[1149,1404,1405,1407,1409,1411,1414],{"class":1151,"line":1220},[1149,1406,1223],{"class":1170},[1149,1408,929],{"class":1174},[1149,1410,1229],{"class":1228},[1149,1412,1413],{"class":1163},",      ",[1149,1415,1417],{"class":1416},"sghk6","\u002F\u002F default\n",[1149,1419,1420,1422,1424,1426,1429],{"class":1151,"line":1235},[1149,1421,1238],{"class":1170},[1149,1423,929],{"class":1174},[1149,1425,1244],{"class":1243},[1149,1427,1428],{"class":1163},",    ",[1149,1430,1417],{"class":1416},[1149,1432,1433,1435,1437,1439,1442],{"class":1151,"line":1249},[1149,1434,1252],{"class":1170},[1149,1436,929],{"class":1174},[1149,1438,1257],{"class":1243},[1149,1440,1441],{"class":1163},",                   ",[1149,1443,1417],{"class":1416},[1149,1445,1446],{"class":1151,"line":1262},[1149,1447,1265],{"class":1163},[1449,1450,1451,1471],"field-group",{},[1452,1453,1455,1466],"field",{"name":858,"type":1454},"boolean",[835,1456,1457,1458,1461,1462,1465],{},"When ",[839,1459,1460],{},"false",", the detector writes its computed score only when no cache entry exists. The healer then owns the score and decrements it each request. When ",[839,1463,1464],{},"true",", the detector overwrites the score on every request, causing the score to oscillate around the computed value.",[835,1467,1468,1469,880],{},"Default: ",[839,1470,1460],{},[1452,1472,1474],{"name":889,"type":1473},"number",[835,1475,1476,1477,1479,1480,880],{},"Points subtracted from the visitor's stored score after each non-banned request. Set to ",[839,1478,1310],{}," to disable healing. Default: ",[839,1481,1329],{},[861,1483],{},[864,1485,1487],{"id":1486},"choosing-a-mode","Choosing a Mode",[931,1489,1490,1500],{},[934,1491,1492],{},[937,1493,1494,1497],{},[940,1495,1496],{},"Scenario",[940,1498,1499],{},"Recommended mode",[956,1501,1502,1512,1522,1534],{},[937,1503,1504,1507],{},[961,1505,1506],{},"Normal production traffic with occasional false positives",[961,1508,1509,1511],{},[839,1510,1460],{}," - scores decay naturally",[937,1513,1514,1517],{},[961,1515,1516],{},"Dashboard or admin UI that needs live risk visibility",[961,1518,1519,1521],{},[839,1520,1464],{}," - DB always shows current pipeline output",[937,1523,1524,1527],{},[961,1525,1526],{},"High false-positive environment (corporate proxies, VPNs)",[961,1528,1529,1531,1532],{},[839,1530,1460],{}," with higher ",[839,1533,889],{},[937,1535,1536,1539],{},[961,1537,1538],{},"Strict enforcement where score should never decay",[961,1540,1541,921,1543],{},[839,1542,1460],{},[839,1544,1285],{},[1546,1547,1548],"style",{},"html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .sjsA6, html code.shiki .sjsA6{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#F8F8F2}html pre.shiki code .s34zl, html code.shiki .s34zl{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#FF79C6}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}",{"title":1145,"searchDepth":1167,"depth":1167,"links":1550},[1551,1552,1554,1555,1556,1557],{"id":866,"depth":1167,"text":867},{"id":901,"depth":1167,"text":1553},"setNewComputedScore: false (default)",{"id":1033,"depth":1167,"text":1036},{"id":1132,"depth":1167,"text":889},{"id":1350,"depth":1167,"text":1351},{"id":1486,"depth":1167,"text":1487},"How setNewComputedScore and restoredReputationPoints interact to control how visitor risk scores evolve over time.","md","i-lucide-chart-line",{},null,"---\ntitle: Score Modes and Reputation Healing\ndescription: How setNewComputedScore and restoredReputationPoints interact to control how visitor risk scores evolve over time.\nicon: i-lucide-chart-line\n---\n\nEvery non-banned visitor carries a `suspicious_activity_score` in the `visitors` table. Two processes write to this score on every request: the **detector**, which computes a fresh risk score by running all checkers, and the **reputation healer**, which decrements the stored score after each clean request. The `setNewComputedScore` flag controls how these two processes cooperate.\n\n---\n\n## The Two Actors\n\n**The detector** runs the 17-checker pipeline and produces a `botScore` for the current request. What it does with that score afterward depends on `setNewComputedScore`.\n\n**The reputation healer** runs on every non-banned request. It reads the visitor's current score from cache (or from the database on a cache miss), then decrements it by `restoredReputationPoints` and writes the lower value back to cache and the database queue. This is the mechanism by which legitimate visitors with an accidentally elevated score recover over time.\n\nBoth actors run on every request. Their interaction is what `setNewComputedScore` controls.\n\n---\n\n## `setNewComputedScore: false` (default)\n\nIn this mode the detector writes its computed score to the database and cache **only on the first request** for a given canary cookie (or when the cache entry is missing or zero). After that, the healer owns the score and decrements it each request until it reaches zero or the cache expires.\n\nThe score only decreases between cache expirations. When the cache expires, the next request triggers a fresh detection cycle and the score is re-established from whatever the current pipeline computes.\n\n**Example** with `banScore: 10`, `restoredReputationPoints: 1`:\n\n| Request | Detector computes | Cache before healer | Healer writes | DB score |\n| --- | --- | --- | --- | --- |\n| R1 | 8 | no cache | 7 | 7 |\n| R2 | 8 | 7 (hit) | 6 | 6 |\n| R3 | 8 | 6 (hit) | 5 | 5 |\n| R4 | 8 | 5 (hit) | 4 | 4 |\n\nThe detector recomputes 8 on every request but does not overwrite the cache once a non-zero entry exists. The score decays toward zero.\n\n**When to use:** Most applications. Visitors who trigger a few cheap-phase signals due to a VPN or unusual network conditions gradually recover without requiring manual intervention.\n\n---\n\n## `setNewComputedScore: true`\n\nIn this mode the detector writes its computed score on **every request**, overwriting whatever the healer wrote on the previous request. The score oscillates: the detector pushes it up to the computed value, then the healer immediately decrements it by one heal step, then the detector pushes it back up on the next request.\n\n**Example** with the same settings:\n\n| Request | Detector computes | Detector writes | Healer writes | DB score |\n| --- | --- | --- | --- | --- |\n| R1 | 8 | 8 | 7 | 7 |\n| R2 | 8 | 8 | 7 | 7 |\n| R3 | 8 | 8 | 7 | 7 |\n\nThe DB score after each full request cycle is always `computed - restoredReputationPoints`, regardless of how many requests the visitor makes. The score never truly heals.\n\n**When to use:** When you want the `visitors` table to always reflect the visitor's current computed risk, not a decayed snapshot. This is useful when you query the database for monitoring or review and need the scores to represent the live pipeline output rather than historical state.\n\n::warning\nWith `setNewComputedScore: true`, a visitor whose network conditions consistently produce a non-zero score will never reach zero and can accumulate enough score to eventually be banned, even if their behavior is otherwise legitimate. Use this mode only when current-state visibility in the database is more important than natural score recovery.\n::\n\n---\n\n## `restoredReputationPoints`\n\nThis setting controls how much score the healer subtracts per clean request. It applies in both modes.\n\n```ts [server.ts]\nawait defineConfiguration({\n  store: { main: { driver: 'sqlite', name: '.\u002Fbot-detector.db' } },\n  setNewComputedScore: false,\n  restoredReputationPoints: 10,\n  banScore: 100,\n})\n```\n\nWith the defaults (`restoredReputationPoints: 10`, `banScore: 100`), a visitor at score `40` returns to zero after four clean requests.\n\nSetting `restoredReputationPoints: 0` disables healing entirely. Scores accumulate permanently until you manually reset them with `updateIsBot`.\n\n| Value | Effect |\n| --- | --- |\n| `0` | Healing disabled. Scores only increase. |\n| `5` | Slow recovery. Useful when you want score history to persist longer. |\n| `10` (default) | Moderate recovery. 10 clean requests recover from a full `banScore`. |\n| `25` | Fast recovery. Suitable for environments with many false positives. |\n\n---\n\n## Configuration Reference\n\n```ts [server.ts]\nawait defineConfiguration({\n  store: { main: { driver: 'sqlite', name: '.\u002Fbot-detector.db' } },\n  setNewComputedScore: false,      \u002F\u002F default\n  restoredReputationPoints: 10,    \u002F\u002F default\n  banScore: 100,                   \u002F\u002F default\n})\n```\n\n::field-group\n::field{name=\"setNewComputedScore\" type=\"boolean\"}\nWhen `false`, the detector writes its computed score only when no cache entry exists. The healer then owns the score and decrements it each request. When `true`, the detector overwrites the score on every request, causing the score to oscillate around the computed value. \n\nDefault: `false`.\n::\n\n::field{name=\"restoredReputationPoints\" type=\"number\"}\nPoints subtracted from the visitor's stored score after each non-banned request. Set to `0` to disable healing. Default: `10`.\n::\n::\n\n---\n\n## Choosing a Mode\n\n| Scenario | Recommended mode |\n| --- | --- |\n| Normal production traffic with occasional false positives | `false` - scores decay naturally |\n| Dashboard or admin UI that needs live risk visibility | `true` - DB always shows current pipeline output |\n| High false-positive environment (corporate proxies, VPNs) | `false` with higher `restoredReputationPoints` |\n| Strict enforcement where score should never decay | `false` with `restoredReputationPoints: 0` |\n",{"title":103,"description":1558},"BzrYGMSCjr6viwJYSws-9Pf5O-1yNSArhstH54Nib-g",[1567,1568],{"title":99,"path":100,"stem":101,"children":-1},{"title":107,"path":108,"stem":109,"children":-1},{"id":830,"title":103,"body":1570,"description":1558,"extension":1559,"icon":1560,"meta":2112,"module":1562,"navigation":8,"path":104,"rawbody":1563,"seo":2113,"stem":105,"__hash__":1565},{"type":832,"value":1571,"toc":2104},[1572,1584,1586,1588,1596,1602,1606,1608,1612,1616,1618,1626,1692,1694,1698,1700,1704,1708,1712,1766,1770,1776,1782,1784,1788,1790,1874,1882,1888,1934,1936,1938,2028,2050,2052,2054,2102],[835,1573,837,1574,842,1576,846,1578,851,1580,855,1582,859],{},[839,1575,841],{},[839,1577,845],{},[848,1579,850],{},[848,1581,854],{},[839,1583,858],{},[861,1585],{},[864,1587,867],{"id":866},[835,1589,1590,873,1592,877,1594,880],{},[848,1591,872],{},[839,1593,876],{},[839,1595,858],{},[835,1597,1598,886,1600,890],{},[848,1599,885],{},[839,1601,889],{},[835,1603,893,1604,896],{},[839,1605,858],{},[861,1607],{},[864,1609,1610,905],{"id":901},[839,1611,904],{},[835,1613,908,1614,912],{},[848,1615,911],{},[835,1617,915],{},[835,1619,1620,921,1622,925,1624,929],{},[848,1621,920],{},[839,1623,924],{},[839,1625,928],{},[931,1627,1628,1642],{},[934,1629,1630],{},[937,1631,1632,1634,1636,1638,1640],{},[940,1633,942],{},[940,1635,945],{},[940,1637,948],{},[940,1639,951],{},[940,1641,954],{},[956,1643,1644,1656,1668,1680],{},[937,1645,1646,1648,1650,1652,1654],{},[961,1647,963],{},[961,1649,966],{},[961,1651,969],{},[961,1653,972],{},[961,1655,972],{},[937,1657,1658,1660,1662,1664,1666],{},[961,1659,979],{},[961,1661,966],{},[961,1663,984],{},[961,1665,987],{},[961,1667,987],{},[937,1669,1670,1672,1674,1676,1678],{},[961,1671,994],{},[961,1673,966],{},[961,1675,999],{},[961,1677,1002],{},[961,1679,1002],{},[937,1681,1682,1684,1686,1688,1690],{},[961,1683,1009],{},[961,1685,966],{},[961,1687,1014],{},[961,1689,1017],{},[961,1691,1017],{},[835,1693,1022],{},[835,1695,1696,1028],{},[848,1697,1027],{},[861,1699],{},[864,1701,1702],{"id":1033},[839,1703,1036],{},[835,1705,1039,1706,1043],{},[848,1707,1042],{},[835,1709,1710,1048],{},[848,1711,920],{},[931,1713,1714,1728],{},[934,1715,1716],{},[937,1717,1718,1720,1722,1724,1726],{},[940,1719,942],{},[940,1721,945],{},[940,1723,1061],{},[940,1725,951],{},[940,1727,954],{},[956,1729,1730,1742,1754],{},[937,1731,1732,1734,1736,1738,1740],{},[961,1733,963],{},[961,1735,966],{},[961,1737,966],{},[961,1739,972],{},[961,1741,972],{},[937,1743,1744,1746,1748,1750,1752],{},[961,1745,979],{},[961,1747,966],{},[961,1749,966],{},[961,1751,972],{},[961,1753,972],{},[937,1755,1756,1758,1760,1762,1764],{},[961,1757,994],{},[961,1759,966],{},[961,1761,966],{},[961,1763,972],{},[961,1765,972],{},[835,1767,1106,1768,1110],{},[839,1769,1109],{},[835,1771,1772,1115,1774,1118],{},[848,1773,1027],{},[839,1775,845],{},[1120,1777,1778],{},[835,1779,1124,1780,1127],{},[839,1781,1036],{},[861,1783],{},[864,1785,1786],{"id":1132},[839,1787,889],{},[835,1789,1137],{},[1139,1791,1792],{"className":1141,"code":1142,"filename":1143,"language":1144,"meta":1145,"style":1145},[839,1793,1794,1802,1840,1850,1860,1870],{"__ignoreMap":1145},[1149,1795,1796,1798,1800],{"class":1151,"line":1152},[1149,1797,1156],{"class":1155},[1149,1799,1160],{"class":1159},[1149,1801,1164],{"class":1163},[1149,1803,1804,1806,1808,1810,1812,1814,1816,1818,1820,1822,1824,1826,1828,1830,1832,1834,1836,1838],{"class":1151,"line":1167},[1149,1805,1171],{"class":1170},[1149,1807,929],{"class":1174},[1149,1809,1177],{"class":1163},[1149,1811,1180],{"class":1170},[1149,1813,929],{"class":1174},[1149,1815,1177],{"class":1163},[1149,1817,1187],{"class":1170},[1149,1819,929],{"class":1174},[1149,1821,1193],{"class":1192},[1149,1823,1197],{"class":1196},[1149,1825,1200],{"class":1192},[1149,1827,925],{"class":1163},[1149,1829,1205],{"class":1170},[1149,1831,929],{"class":1174},[1149,1833,1193],{"class":1192},[1149,1835,1212],{"class":1196},[1149,1837,1200],{"class":1192},[1149,1839,1217],{"class":1163},[1149,1841,1842,1844,1846,1848],{"class":1151,"line":1220},[1149,1843,1223],{"class":1170},[1149,1845,929],{"class":1174},[1149,1847,1229],{"class":1228},[1149,1849,1232],{"class":1163},[1149,1851,1852,1854,1856,1858],{"class":1151,"line":1235},[1149,1853,1238],{"class":1170},[1149,1855,929],{"class":1174},[1149,1857,1244],{"class":1243},[1149,1859,1232],{"class":1163},[1149,1861,1862,1864,1866,1868],{"class":1151,"line":1249},[1149,1863,1252],{"class":1170},[1149,1865,929],{"class":1174},[1149,1867,1257],{"class":1243},[1149,1869,1232],{"class":1163},[1149,1871,1872],{"class":1151,"line":1262},[1149,1873,1265],{"class":1163},[835,1875,1268,1876,925,1878,1275,1880,1279],{},[839,1877,1271],{},[839,1879,1274],{},[839,1881,1278],{},[835,1883,1282,1884,1286,1886,880],{},[839,1885,1285],{},[839,1887,1289],{},[931,1889,1890,1898],{},[934,1891,1892],{},[937,1893,1894,1896],{},[940,1895,1298],{},[940,1897,1301],{},[956,1899,1900,1908,1916,1926],{},[937,1901,1902,1906],{},[961,1903,1904],{},[839,1905,1310],{},[961,1907,1313],{},[937,1909,1910,1914],{},[961,1911,1912],{},[839,1913,1002],{},[961,1915,1322],{},[937,1917,1918,1922],{},[961,1919,1920,905],{},[839,1921,1329],{},[961,1923,1332,1924,880],{},[839,1925,1335],{},[937,1927,1928,1932],{},[961,1929,1930],{},[839,1931,1342],{},[961,1933,1345],{},[861,1935],{},[864,1937,1351],{"id":1350},[1139,1939,1940],{"className":1141,"code":1354,"filename":1143,"language":1144,"meta":1145,"style":1145},[839,1941,1942,1950,1988,2000,2012,2024],{"__ignoreMap":1145},[1149,1943,1944,1946,1948],{"class":1151,"line":1152},[1149,1945,1156],{"class":1155},[1149,1947,1160],{"class":1159},[1149,1949,1164],{"class":1163},[1149,1951,1952,1954,1956,1958,1960,1962,1964,1966,1968,1970,1972,1974,1976,1978,1980,1982,1984,1986],{"class":1151,"line":1167},[1149,1953,1171],{"class":1170},[1149,1955,929],{"class":1174},[1149,1957,1177],{"class":1163},[1149,1959,1180],{"class":1170},[1149,1961,929],{"class":1174},[1149,1963,1177],{"class":1163},[1149,1965,1187],{"class":1170},[1149,1967,929],{"class":1174},[1149,1969,1193],{"class":1192},[1149,1971,1197],{"class":1196},[1149,1973,1200],{"class":1192},[1149,1975,925],{"class":1163},[1149,1977,1205],{"class":1170},[1149,1979,929],{"class":1174},[1149,1981,1193],{"class":1192},[1149,1983,1212],{"class":1196},[1149,1985,1200],{"class":1192},[1149,1987,1217],{"class":1163},[1149,1989,1990,1992,1994,1996,1998],{"class":1151,"line":1220},[1149,1991,1223],{"class":1170},[1149,1993,929],{"class":1174},[1149,1995,1229],{"class":1228},[1149,1997,1413],{"class":1163},[1149,1999,1417],{"class":1416},[1149,2001,2002,2004,2006,2008,2010],{"class":1151,"line":1235},[1149,2003,1238],{"class":1170},[1149,2005,929],{"class":1174},[1149,2007,1244],{"class":1243},[1149,2009,1428],{"class":1163},[1149,2011,1417],{"class":1416},[1149,2013,2014,2016,2018,2020,2022],{"class":1151,"line":1249},[1149,2015,1252],{"class":1170},[1149,2017,929],{"class":1174},[1149,2019,1257],{"class":1243},[1149,2021,1441],{"class":1163},[1149,2023,1417],{"class":1416},[1149,2025,2026],{"class":1151,"line":1262},[1149,2027,1265],{"class":1163},[1449,2029,2030,2042],{},[1452,2031,2032,2038],{"name":858,"type":1454},[835,2033,1457,2034,1461,2036,1465],{},[839,2035,1460],{},[839,2037,1464],{},[835,2039,1468,2040,880],{},[839,2041,1460],{},[1452,2043,2044],{"name":889,"type":1473},[835,2045,1476,2046,1479,2048,880],{},[839,2047,1310],{},[839,2049,1329],{},[861,2051],{},[864,2053,1487],{"id":1486},[931,2055,2056,2064],{},[934,2057,2058],{},[937,2059,2060,2062],{},[940,2061,1496],{},[940,2063,1499],{},[956,2065,2066,2074,2082,2092],{},[937,2067,2068,2070],{},[961,2069,1506],{},[961,2071,2072,1511],{},[839,2073,1460],{},[937,2075,2076,2078],{},[961,2077,1516],{},[961,2079,2080,1521],{},[839,2081,1464],{},[937,2083,2084,2086],{},[961,2085,1526],{},[961,2087,2088,1531,2090],{},[839,2089,1460],{},[839,2091,889],{},[937,2093,2094,2096],{},[961,2095,1538],{},[961,2097,2098,921,2100],{},[839,2099,1460],{},[839,2101,1285],{},[1546,2103,1548],{},{"title":1145,"searchDepth":1167,"depth":1167,"links":2105},[2106,2107,2108,2109,2110,2111],{"id":866,"depth":1167,"text":867},{"id":901,"depth":1167,"text":1553},{"id":1033,"depth":1167,"text":1036},{"id":1132,"depth":1167,"text":889},{"id":1350,"depth":1167,"text":1351},{"id":1486,"depth":1167,"text":1487},{},{"title":103,"description":1558},1780436275117]