[{"data":1,"prerenderedAt":2834},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fshield-base":64,"navigation":138,"navLinks_footer":802,"\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor_page":815,"\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor_surround":1942,"\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor":1945},{"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":40,"path":42,"stem":70,"children":71},"docs\u002Fshield-base\u002Findex",[72,73,76,80,122,126,130,134],{"title":40,"path":42,"stem":70},{"title":14,"path":74,"stem":75},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":77,"path":78,"stem":79},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":81,"path":82,"stem":83,"children":84},"Data Sources","\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[85,86,90,94,98,102,106,110,114,118],{"title":81,"path":82,"stem":83},{"title":87,"path":88,"stem":89},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":91,"path":92,"stem":93},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":95,"path":96,"stem":97},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":99,"path":100,"stem":101},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":103,"path":104,"stem":105},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":107,"path":108,"stem":109},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":111,"path":112,"stem":113},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":115,"path":116,"stem":117},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":119,"path":120,"stem":121},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":123,"path":124,"stem":125},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":127,"path":128,"stem":129},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":131,"path":132,"stem":133},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":135,"path":136,"stem":137},"API Reference","\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",[139],{"title":9,"path":66,"stem":67,"children":140,"page":53},[141,288,405,410,588,609],{"title":20,"path":22,"stem":142,"children":143},"docs\u002Fauth-h3client\u002Findex",[144,145,154,191,217,239,242,263,267],{"title":20,"path":22,"stem":142},{"title":14,"path":146,"stem":147,"children":148},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[149,150],{"title":14,"path":146,"stem":147},{"title":151,"path":152,"stem":153},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":155,"path":156,"stem":157,"children":158},"Essentials","\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[159,160,164,168,172,176,180,183,187],{"title":155,"path":156,"stem":157},{"title":161,"path":162,"stem":163},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":165,"path":166,"stem":167},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":169,"path":170,"stem":171},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":173,"path":174,"stem":175},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":177,"path":178,"stem":179},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":181,"stem":182},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":184,"path":185,"stem":186},"Cookies","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":188,"path":189,"stem":190},"Logging","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":192,"path":193,"stem":194,"children":195},"MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[196,197,201,205,209,213],{"title":192,"path":193,"stem":194},{"title":198,"path":199,"stem":200},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":202,"path":203,"stem":204},"Password Reset","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":206,"path":207,"stem":208},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":210,"path":211,"stem":212},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":214,"path":215,"stem":216},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":218,"path":219,"stem":220,"children":221},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[222,223,227,231,235],{"title":218,"path":219,"stem":220},{"title":224,"path":225,"stem":226},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":228,"path":229,"stem":230},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":232,"path":233,"stem":234},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":236,"path":237,"stem":238},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":240,"stem":241},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":243,"path":244,"stem":245,"children":246,"page":53},"Guides","\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[247,251,255,259],{"title":248,"path":249,"stem":250},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":252,"path":253,"stem":254},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":256,"path":257,"stem":258},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":260,"path":261,"stem":262},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":264,"path":265,"stem":266},"Configuration","\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":135,"path":268,"stem":269,"children":270},"\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[271,272,276,280,284],{"title":135,"path":268,"stem":269},{"title":273,"path":274,"stem":275},"Routes Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":277,"path":278,"stem":279},"Middleware Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":281,"path":282,"stem":283},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":285,"path":286,"stem":287},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":289,"path":35,"stem":290,"children":291},"Bot Detector","docs\u002Fbot-detection\u002Findex",[292,293,296,300,303,322,396,399,402],{"title":289,"path":35,"stem":290},{"title":14,"path":294,"stem":295},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":297,"path":298,"stem":299},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":81,"path":301,"stem":302},"\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":243,"path":304,"stem":305,"children":306,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[307,311,315,318],{"title":308,"path":309,"stem":310},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":312,"path":313,"stem":314},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":188,"path":316,"stem":317},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":319,"path":320,"stem":321},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":323,"path":324,"stem":325,"children":326},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[327,328,332,336,340,344,348,352,356,360,364,368,372,376,380,384,388,392],{"title":323,"path":324,"stem":325},{"title":329,"path":330,"stem":331},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":333,"path":334,"stem":335},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":337,"path":338,"stem":339},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":341,"path":342,"stem":343},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":345,"path":346,"stem":347},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":349,"path":350,"stem":351},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":353,"path":354,"stem":355},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":357,"path":358,"stem":359},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":361,"path":362,"stem":363},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":365,"path":366,"stem":367},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":369,"path":370,"stem":371},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":373,"path":374,"stem":375},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":377,"path":378,"stem":379},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":381,"path":382,"stem":383},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":385,"path":386,"stem":387},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":389,"path":390,"stem":391},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":393,"path":394,"stem":395},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":397,"stem":398},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":135,"path":400,"stem":401},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":264,"path":403,"stem":404},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":406,"path":11,"stem":407,"children":408},"Introduction","docs\u002Fgetting-started\u002Findex",[409],{"title":406,"path":11,"stem":407},{"title":27,"path":29,"stem":411,"children":412},"docs\u002Fiam\u002Findex",[413,414,417,552,555,571,574],{"title":27,"path":29,"stem":411},{"title":14,"path":415,"stem":416},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":155,"path":418,"stem":419,"children":420},"\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[421,422,426,430,434,438,442,446,450,454,458,462,465,469,473,477,481,484,488,492,495,499,502],{"title":155,"path":418,"stem":419},{"title":423,"path":424,"stem":425},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":427,"path":428,"stem":429},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":431,"path":432,"stem":433},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":435,"path":436,"stem":437},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":439,"path":440,"stem":441},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":443,"path":444,"stem":445},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":447,"path":448,"stem":449},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":451,"path":452,"stem":453},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":455,"path":456,"stem":457},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":459,"path":460,"stem":461},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":192,"path":463,"stem":464},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":466,"path":467,"stem":468},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":470,"path":471,"stem":472},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":474,"path":475,"stem":476},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":478,"path":479,"stem":480},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":188,"path":482,"stem":483},"\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":485,"path":486,"stem":487},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":489,"path":490,"stem":491},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":184,"path":493,"stem":494},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":496,"path":497,"stem":498},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":202,"path":500,"stem":501},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":503,"path":504,"stem":505,"children":506},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[507,508,512,516,546,549],{"title":503,"path":504,"stem":505},{"title":509,"path":510,"stem":511},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":513,"path":514,"stem":515},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":517,"path":518,"stem":519,"children":520},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[521,522,526,530,534,538,542],{"title":517,"path":518,"stem":519},{"title":523,"path":524,"stem":525},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":527,"path":528,"stem":529},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":531,"path":532,"stem":533},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":535,"path":536,"stem":537},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":539,"path":540,"stem":541},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":543,"path":544,"stem":545},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":485,"path":547,"stem":548},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":550,"stem":551},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":553,"stem":554},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":243,"path":556,"stem":557,"children":558,"page":53},"\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[559,563,567],{"title":560,"path":561,"stem":562},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":564,"path":565,"stem":566},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":568,"path":569,"stem":570},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":264,"path":572,"stem":573},"\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":575,"path":576,"stem":577,"children":578,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[579,582,585],{"title":135,"path":580,"stem":581},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":277,"path":583,"stem":584},"\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":273,"path":586,"stem":587},"\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",{"title":40,"path":42,"stem":70,"children":589},[590,591,592,593,605,606,607,608],{"title":40,"path":42,"stem":70},{"title":14,"path":74,"stem":75},{"title":77,"path":78,"stem":79},{"title":81,"path":82,"stem":83,"children":594},[595,596,597,598,599,600,601,602,603,604],{"title":81,"path":82,"stem":83},{"title":87,"path":88,"stem":89},{"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},{"title":111,"path":112,"stem":113},{"title":115,"path":116,"stem":117},{"title":119,"path":120,"stem":121},{"title":123,"path":124,"stem":125},{"title":127,"path":128,"stem":129},{"title":131,"path":132,"stem":133},{"title":135,"path":136,"stem":137},{"title":285,"path":48,"stem":610,"children":611},"docs\u002Futils\u002Findex",[612,613,630,663,760],{"title":285,"path":48,"stem":610},{"title":614,"path":615,"stem":616,"children":617,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[618,622,626],{"title":619,"path":620,"stem":621},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":623,"path":624,"stem":625},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":627,"path":628,"stem":629},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":631,"path":632,"stem":633,"children":634,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[635,639,643,647,651,655,659],{"title":636,"path":637,"stem":638},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":640,"path":641,"stem":642},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":644,"path":645,"stem":646},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":648,"path":649,"stem":650},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":652,"path":653,"stem":654},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":656,"path":657,"stem":658},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":660,"path":661,"stem":662},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":664,"path":665,"stem":666,"children":667,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[668,672,676,680,684,688,692,696,700,704,708,712,716,720,724,728,732,736,740,744,748,752,756],{"title":669,"path":670,"stem":671},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":673,"path":674,"stem":675},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":677,"path":678,"stem":679},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":681,"path":682,"stem":683},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":685,"path":686,"stem":687},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":689,"path":690,"stem":691},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":693,"path":694,"stem":695},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":697,"path":698,"stem":699},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":701,"path":702,"stem":703},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":705,"path":706,"stem":707},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":709,"path":710,"stem":711},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":713,"path":714,"stem":715},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":717,"path":718,"stem":719},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":721,"path":722,"stem":723},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":725,"path":726,"stem":727},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":729,"path":730,"stem":731},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":733,"path":734,"stem":735},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":737,"path":738,"stem":739},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":741,"path":742,"stem":743},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":745,"path":746,"stem":747},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":749,"path":750,"stem":751},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":753,"path":754,"stem":755},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":757,"path":758,"stem":759},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":761,"path":762,"stem":763,"children":764},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[765,766,770,774,778,782,786,790,794,798],{"title":761,"path":762,"stem":763},{"title":767,"path":768,"stem":769},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":771,"path":772,"stem":773},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":775,"path":776,"stem":777},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":779,"path":780,"stem":781},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":783,"path":784,"stem":785},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":787,"path":788,"stem":789},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":791,"path":792,"stem":793},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":795,"path":796,"stem":797},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":799,"path":800,"stem":801},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":803,"meta":814,"stem":62,"__hash__":63},[804,812,813],{"nested":8,"label":9,"icon":10,"to":11,"children":805},[806,807,808,809,810,811],{"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":816,"title":115,"body":817,"description":1934,"extension":1935,"icon":1936,"meta":1937,"module":1938,"navigation":8,"path":116,"rawbody":1939,"seo":1940,"stem":117,"__hash__":1941},"docs\u002Fdocs\u002Fshield-base\u002F02.data-sources\u002Ftor.md",{"type":818,"value":819,"toc":1928},"minimark",[820,859,869,872,877,889,891,895,1051,1053,1057,1370,1372,1376,1402,1915,1924],[821,822,823,824,831,832,836,837,836,840,836,843,846,847,850,851,854,855,858],"p",{},"The Tor source fetches live relay data directly from the ",[825,826,830],"a",{"href":827,"rel":828},"https:\u002F\u002Fmetrics.torproject.org\u002Fonionoo.html",[829],"nofollow","Tor Project's Onionoo API"," and compiles it into an MMDB database. The script filters for relay nodes with the following flags: ",[833,834,835],"code",{},"Exit",", ",[833,838,839],{},"Valid",[833,841,842],{},"Running",[833,844,845],{},"Stable",", or ",[833,848,849],{},"HSDir",". IP addresses are normalized to ",[833,852,853],{},"\u002F24"," (IPv4) or ",[833,856,857],{},"\u002F64"," (IPv6) CIDR blocks.",[821,860,861,865,866],{},[862,863,864],"strong",{},"Output file:"," ",[833,867,868],{},"tor.mmdb",[870,871],"hr",{},[873,874,876],"h2",{"id":875},"data-source","Data Source",[878,879,880],"ul",{},[881,882,883,884],"li",{},"Onionoo details endpoint: ",[825,885,888],{"href":886,"rel":887},"https:\u002F\u002Fonionoo.torproject.org\u002Fdetails",[829],"onionoo.torproject.org\u002Fdetails",[870,890],{},[873,892,894],{"id":893},"usage","Usage",[896,897,898,927,943,958,973],"code-group",{},[899,900,906],"pre",{"className":901,"code":902,"filename":903,"language":904,"meta":905,"style":905},"language-bash shiki shiki-themes light-plus light-plus dracula","pnpm dlx @riavzon\u002Fshield-base --tor\n","pnpm","bash","",[833,907,908],{"__ignoreMap":905},[909,910,913,916,920,923],"span",{"class":911,"line":912},"line",1,[909,914,903],{"class":915},"sHOzp",[909,917,919],{"class":918},"sFB1V"," dlx",[909,921,922],{"class":918}," @riavzon\u002Fshield-base",[909,924,926],{"class":925},"sjR7W"," --tor\n",[899,928,931],{"className":901,"code":929,"filename":930,"language":904,"meta":905,"style":905},"yarn dlx @riavzon\u002Fshield-base --tor\n","yarn",[833,932,933],{"__ignoreMap":905},[909,934,935,937,939,941],{"class":911,"line":912},[909,936,930],{"class":915},[909,938,919],{"class":918},[909,940,922],{"class":918},[909,942,926],{"class":925},[899,944,947],{"className":901,"code":945,"filename":946,"language":904,"meta":905,"style":905},"npx @riavzon\u002Fshield-base --tor\n","npm",[833,948,949],{"__ignoreMap":905},[909,950,951,954,956],{"class":911,"line":912},[909,952,953],{"class":915},"npx",[909,955,922],{"class":918},[909,957,926],{"class":925},[899,959,962],{"className":901,"code":960,"filename":961,"language":904,"meta":905,"style":905},"bunx @riavzon\u002Fshield-base --tor\n","bun",[833,963,964],{"__ignoreMap":905},[909,965,966,969,971],{"class":911,"line":912},[909,967,968],{"class":915},"bunx",[909,970,922],{"class":918},[909,972,926],{"class":925},[899,974,979],{"className":975,"code":976,"filename":977,"language":978,"meta":905,"style":905},"language-ts shiki shiki-themes light-plus light-plus dracula","import { getTorLists } from '@riavzon\u002Fshield-base';\n\nawait getTorLists('.\u002Fout', 'mmdbctl');\n","Programmatic","ts",[833,980,981,1014,1020],{"__ignoreMap":905},[909,982,983,987,991,995,998,1001,1005,1008,1011],{"class":911,"line":912},[909,984,986],{"class":985},"sZ328","import",[909,988,990],{"class":989},"sDd4n"," { ",[909,992,994],{"class":993},"sjsA6","getTorLists",[909,996,997],{"class":989}," } ",[909,999,1000],{"class":985},"from",[909,1002,1004],{"class":1003},"sFkSl"," '",[909,1006,1007],{"class":918},"@riavzon\u002Fshield-base",[909,1009,1010],{"class":1003},"'",[909,1012,1013],{"class":989},";\n",[909,1015,1017],{"class":911,"line":1016},2,[909,1018,1019],{"emptyLinePlaceholder":8},"\n",[909,1021,1023,1026,1029,1032,1034,1037,1039,1041,1043,1046,1048],{"class":911,"line":1022},3,[909,1024,1025],{"class":985},"await",[909,1027,1028],{"class":915}," getTorLists",[909,1030,1031],{"class":989},"(",[909,1033,1010],{"class":1003},[909,1035,1036],{"class":918},".\u002Fout",[909,1038,1010],{"class":1003},[909,1040,836],{"class":989},[909,1042,1010],{"class":1003},[909,1044,1045],{"class":918},"mmdbctl",[909,1047,1010],{"class":1003},[909,1049,1050],{"class":989},");\n",[870,1052],{},[873,1054,1056],{"id":1055},"record-structure","Record Structure",[899,1058,1060],{"className":975,"code":1059,"language":978,"meta":905,"style":905},"interface TorRecord {\n  range: string;\n  or_addresses: string;\n  exit_addresses: string;\n  last_seen: string;\n  last_changed_address_or_port: string;\n  first_seen: string;\n  running: boolean;\n  flags: string;                \u002F\u002F e.g. \"Exit,Fast,Running,Valid\"\n  country: string;\n  country_name: string;\n  as: string;                   \u002F\u002F ASN identifier, e.g. \"AS215125\"\n  as_name: string;\n  last_restarted: string;\n  exit_policy: string;\n  exit_policy_summary: string;\n  exit_policy_v6_summary?: string;\n  contact: string;\n  version_status: string;\n  guard_probability: number;\n  middle_probability: number;\n  exit_probability: number;\n  recommended_version: boolean;\n  measured: boolean;\n}\n",[833,1061,1062,1075,1089,1100,1112,1124,1136,1148,1161,1178,1190,1202,1218,1230,1242,1254,1266,1279,1291,1303,1316,1328,1340,1352,1364],{"__ignoreMap":905},[909,1063,1064,1068,1072],{"class":911,"line":912},[909,1065,1067],{"class":1066},"sl46w","interface",[909,1069,1071],{"class":1070},"sFs1U"," TorRecord",[909,1073,1074],{"class":989}," {\n",[909,1076,1077,1080,1084,1087],{"class":911,"line":1016},[909,1078,1079],{"class":993},"  range",[909,1081,1083],{"class":1082},"saOXh",":",[909,1085,1086],{"class":1070}," string",[909,1088,1013],{"class":989},[909,1090,1091,1094,1096,1098],{"class":911,"line":1022},[909,1092,1093],{"class":993},"  or_addresses",[909,1095,1083],{"class":1082},[909,1097,1086],{"class":1070},[909,1099,1013],{"class":989},[909,1101,1103,1106,1108,1110],{"class":911,"line":1102},4,[909,1104,1105],{"class":993},"  exit_addresses",[909,1107,1083],{"class":1082},[909,1109,1086],{"class":1070},[909,1111,1013],{"class":989},[909,1113,1115,1118,1120,1122],{"class":911,"line":1114},5,[909,1116,1117],{"class":993},"  last_seen",[909,1119,1083],{"class":1082},[909,1121,1086],{"class":1070},[909,1123,1013],{"class":989},[909,1125,1127,1130,1132,1134],{"class":911,"line":1126},6,[909,1128,1129],{"class":993},"  last_changed_address_or_port",[909,1131,1083],{"class":1082},[909,1133,1086],{"class":1070},[909,1135,1013],{"class":989},[909,1137,1139,1142,1144,1146],{"class":911,"line":1138},7,[909,1140,1141],{"class":993},"  first_seen",[909,1143,1083],{"class":1082},[909,1145,1086],{"class":1070},[909,1147,1013],{"class":989},[909,1149,1151,1154,1156,1159],{"class":911,"line":1150},8,[909,1152,1153],{"class":993},"  running",[909,1155,1083],{"class":1082},[909,1157,1158],{"class":1070}," boolean",[909,1160,1013],{"class":989},[909,1162,1164,1167,1169,1171,1174],{"class":911,"line":1163},9,[909,1165,1166],{"class":993},"  flags",[909,1168,1083],{"class":1082},[909,1170,1086],{"class":1070},[909,1172,1173],{"class":989},";                ",[909,1175,1177],{"class":1176},"sghk6","\u002F\u002F e.g. \"Exit,Fast,Running,Valid\"\n",[909,1179,1181,1184,1186,1188],{"class":911,"line":1180},10,[909,1182,1183],{"class":993},"  country",[909,1185,1083],{"class":1082},[909,1187,1086],{"class":1070},[909,1189,1013],{"class":989},[909,1191,1193,1196,1198,1200],{"class":911,"line":1192},11,[909,1194,1195],{"class":993},"  country_name",[909,1197,1083],{"class":1082},[909,1199,1086],{"class":1070},[909,1201,1013],{"class":989},[909,1203,1205,1208,1210,1212,1215],{"class":911,"line":1204},12,[909,1206,1207],{"class":993},"  as",[909,1209,1083],{"class":1082},[909,1211,1086],{"class":1070},[909,1213,1214],{"class":989},";                   ",[909,1216,1217],{"class":1176},"\u002F\u002F ASN identifier, e.g. \"AS215125\"\n",[909,1219,1221,1224,1226,1228],{"class":911,"line":1220},13,[909,1222,1223],{"class":993},"  as_name",[909,1225,1083],{"class":1082},[909,1227,1086],{"class":1070},[909,1229,1013],{"class":989},[909,1231,1233,1236,1238,1240],{"class":911,"line":1232},14,[909,1234,1235],{"class":993},"  last_restarted",[909,1237,1083],{"class":1082},[909,1239,1086],{"class":1070},[909,1241,1013],{"class":989},[909,1243,1245,1248,1250,1252],{"class":911,"line":1244},15,[909,1246,1247],{"class":993},"  exit_policy",[909,1249,1083],{"class":1082},[909,1251,1086],{"class":1070},[909,1253,1013],{"class":989},[909,1255,1257,1260,1262,1264],{"class":911,"line":1256},16,[909,1258,1259],{"class":993},"  exit_policy_summary",[909,1261,1083],{"class":1082},[909,1263,1086],{"class":1070},[909,1265,1013],{"class":989},[909,1267,1269,1272,1275,1277],{"class":911,"line":1268},17,[909,1270,1271],{"class":993},"  exit_policy_v6_summary",[909,1273,1274],{"class":1082},"?:",[909,1276,1086],{"class":1070},[909,1278,1013],{"class":989},[909,1280,1282,1285,1287,1289],{"class":911,"line":1281},18,[909,1283,1284],{"class":993},"  contact",[909,1286,1083],{"class":1082},[909,1288,1086],{"class":1070},[909,1290,1013],{"class":989},[909,1292,1294,1297,1299,1301],{"class":911,"line":1293},19,[909,1295,1296],{"class":993},"  version_status",[909,1298,1083],{"class":1082},[909,1300,1086],{"class":1070},[909,1302,1013],{"class":989},[909,1304,1306,1309,1311,1314],{"class":911,"line":1305},20,[909,1307,1308],{"class":993},"  guard_probability",[909,1310,1083],{"class":1082},[909,1312,1313],{"class":1070}," number",[909,1315,1013],{"class":989},[909,1317,1319,1322,1324,1326],{"class":911,"line":1318},21,[909,1320,1321],{"class":993},"  middle_probability",[909,1323,1083],{"class":1082},[909,1325,1313],{"class":1070},[909,1327,1013],{"class":989},[909,1329,1331,1334,1336,1338],{"class":911,"line":1330},22,[909,1332,1333],{"class":993},"  exit_probability",[909,1335,1083],{"class":1082},[909,1337,1313],{"class":1070},[909,1339,1013],{"class":989},[909,1341,1343,1346,1348,1350],{"class":911,"line":1342},23,[909,1344,1345],{"class":993},"  recommended_version",[909,1347,1083],{"class":1082},[909,1349,1158],{"class":1070},[909,1351,1013],{"class":989},[909,1353,1355,1358,1360,1362],{"class":911,"line":1354},24,[909,1356,1357],{"class":993},"  measured",[909,1359,1083],{"class":1082},[909,1361,1158],{"class":1070},[909,1363,1013],{"class":989},[909,1365,1367],{"class":911,"line":1366},25,[909,1368,1369],{"class":989},"}\n",[870,1371],{},[873,1373,1375],{"id":1374},"example-lookup","Example Lookup",[899,1377,1380],{"className":901,"code":1378,"filename":1379,"language":904,"meta":905,"style":905},"mmdbctl read -f json-pretty 192.42.116.52 outputDirectory\u002Ftor.mmdb\n","Terminal",[833,1381,1382],{"__ignoreMap":905},[909,1383,1384,1386,1389,1392,1395,1399],{"class":911,"line":912},[909,1385,1045],{"class":915},[909,1387,1388],{"class":918}," read",[909,1390,1391],{"class":925}," -f",[909,1393,1394],{"class":918}," json-pretty",[909,1396,1398],{"class":1397},"spgvN"," 192.42.116.52",[909,1400,1401],{"class":918}," outputDirectory\u002Ftor.mmdb\n",[899,1403,1406],{"className":1404,"code":1405,"language":5,"meta":905,"style":905},"language-json shiki shiki-themes light-plus light-plus dracula","{\n  \"as\": \"AS215125\",\n  \"as_name\": \"Church of Cyberology\",\n  \"contact\": \"email:mail[]nothingtohide.nl url:nothingtohide.nl proof:uri-rsa abuse:abuse[]nothingtohide.nl ciissversion:2\",\n  \"country\": \"nl\",\n  \"country_name\": \"Netherlands\",\n  \"exit_addresses\": \"192.42.116.49\",\n  \"exit_policy_summary\": \"{\\\"accept\\\":[\\\"43\\\",\\\"53\\\",\\\"80\\\",\\\"110\\\",\\\"143\\\",\\\"194\\\",\\\"220\\\",\\\"443\\\",\\\"465\\\",\\\"587\\\",\\\"853\\\",\\\"873\\\",\\\"993\\\",\\\"995\\\",...]}\",\n  \"exit_probability\": 0.0005507535,\n  \"first_seen\": \"2023-07-07 00:00:00\",\n  \"flags\": \"Exit,Fast,Running,Valid\",\n  \"guard_probability\": 0,\n  \"last_restarted\": \"2026-03-07 17:44:13\",\n  \"last_seen\": \"2026-03-08 10:00:00\",\n  \"measured\": true,\n  \"middle_probability\": 0,\n  \"or_addresses\": \"192.42.116.49:9004\",\n  \"recommended_version\": true,\n  \"running\": true,\n  \"version_status\": \"recommended\"\n}\n",[833,1407,1408,1413,1439,1459,1479,1499,1519,1539,1699,1715,1735,1755,1771,1791,1811,1827,1842,1862,1877,1892,1911],{"__ignoreMap":905},[909,1409,1410],{"class":911,"line":912},[909,1411,1412],{"class":989},"{\n",[909,1414,1415,1419,1423,1426,1428,1431,1434,1436],{"class":911,"line":1016},[909,1416,1418],{"class":1417},"saJyd","  \"",[909,1420,1422],{"class":1421},"s_W10","as",[909,1424,1425],{"class":1417},"\"",[909,1427,1083],{"class":1082},[909,1429,1430],{"class":1003}," \"",[909,1432,1433],{"class":918},"AS215125",[909,1435,1425],{"class":1003},[909,1437,1438],{"class":989},",\n",[909,1440,1441,1443,1446,1448,1450,1452,1455,1457],{"class":911,"line":1022},[909,1442,1418],{"class":1417},[909,1444,1445],{"class":1421},"as_name",[909,1447,1425],{"class":1417},[909,1449,1083],{"class":1082},[909,1451,1430],{"class":1003},[909,1453,1454],{"class":918},"Church of Cyberology",[909,1456,1425],{"class":1003},[909,1458,1438],{"class":989},[909,1460,1461,1463,1466,1468,1470,1472,1475,1477],{"class":911,"line":1102},[909,1462,1418],{"class":1417},[909,1464,1465],{"class":1421},"contact",[909,1467,1425],{"class":1417},[909,1469,1083],{"class":1082},[909,1471,1430],{"class":1003},[909,1473,1474],{"class":918},"email:mail[]nothingtohide.nl url:nothingtohide.nl proof:uri-rsa abuse:abuse[]nothingtohide.nl ciissversion:2",[909,1476,1425],{"class":1003},[909,1478,1438],{"class":989},[909,1480,1481,1483,1486,1488,1490,1492,1495,1497],{"class":911,"line":1114},[909,1482,1418],{"class":1417},[909,1484,1485],{"class":1421},"country",[909,1487,1425],{"class":1417},[909,1489,1083],{"class":1082},[909,1491,1430],{"class":1003},[909,1493,1494],{"class":918},"nl",[909,1496,1425],{"class":1003},[909,1498,1438],{"class":989},[909,1500,1501,1503,1506,1508,1510,1512,1515,1517],{"class":911,"line":1126},[909,1502,1418],{"class":1417},[909,1504,1505],{"class":1421},"country_name",[909,1507,1425],{"class":1417},[909,1509,1083],{"class":1082},[909,1511,1430],{"class":1003},[909,1513,1514],{"class":918},"Netherlands",[909,1516,1425],{"class":1003},[909,1518,1438],{"class":989},[909,1520,1521,1523,1526,1528,1530,1532,1535,1537],{"class":911,"line":1138},[909,1522,1418],{"class":1417},[909,1524,1525],{"class":1421},"exit_addresses",[909,1527,1425],{"class":1417},[909,1529,1083],{"class":1082},[909,1531,1430],{"class":1003},[909,1533,1534],{"class":918},"192.42.116.49",[909,1536,1425],{"class":1003},[909,1538,1438],{"class":989},[909,1540,1541,1543,1546,1548,1550,1552,1555,1559,1562,1564,1567,1569,1572,1574,1577,1579,1582,1584,1586,1588,1591,1593,1595,1597,1600,1602,1604,1606,1609,1611,1613,1615,1618,1620,1622,1624,1627,1629,1631,1633,1636,1638,1640,1642,1645,1647,1649,1651,1654,1656,1658,1660,1663,1665,1667,1669,1672,1674,1676,1678,1681,1683,1685,1687,1690,1692,1695,1697],{"class":911,"line":1150},[909,1542,1418],{"class":1417},[909,1544,1545],{"class":1421},"exit_policy_summary",[909,1547,1425],{"class":1417},[909,1549,1083],{"class":1082},[909,1551,1430],{"class":1003},[909,1553,1554],{"class":918},"{",[909,1556,1558],{"class":1557},"st6lo","\\\"",[909,1560,1561],{"class":918},"accept",[909,1563,1558],{"class":1557},[909,1565,1566],{"class":918},":[",[909,1568,1558],{"class":1557},[909,1570,1571],{"class":918},"43",[909,1573,1558],{"class":1557},[909,1575,1576],{"class":918},",",[909,1578,1558],{"class":1557},[909,1580,1581],{"class":918},"53",[909,1583,1558],{"class":1557},[909,1585,1576],{"class":918},[909,1587,1558],{"class":1557},[909,1589,1590],{"class":918},"80",[909,1592,1558],{"class":1557},[909,1594,1576],{"class":918},[909,1596,1558],{"class":1557},[909,1598,1599],{"class":918},"110",[909,1601,1558],{"class":1557},[909,1603,1576],{"class":918},[909,1605,1558],{"class":1557},[909,1607,1608],{"class":918},"143",[909,1610,1558],{"class":1557},[909,1612,1576],{"class":918},[909,1614,1558],{"class":1557},[909,1616,1617],{"class":918},"194",[909,1619,1558],{"class":1557},[909,1621,1576],{"class":918},[909,1623,1558],{"class":1557},[909,1625,1626],{"class":918},"220",[909,1628,1558],{"class":1557},[909,1630,1576],{"class":918},[909,1632,1558],{"class":1557},[909,1634,1635],{"class":918},"443",[909,1637,1558],{"class":1557},[909,1639,1576],{"class":918},[909,1641,1558],{"class":1557},[909,1643,1644],{"class":918},"465",[909,1646,1558],{"class":1557},[909,1648,1576],{"class":918},[909,1650,1558],{"class":1557},[909,1652,1653],{"class":918},"587",[909,1655,1558],{"class":1557},[909,1657,1576],{"class":918},[909,1659,1558],{"class":1557},[909,1661,1662],{"class":918},"853",[909,1664,1558],{"class":1557},[909,1666,1576],{"class":918},[909,1668,1558],{"class":1557},[909,1670,1671],{"class":918},"873",[909,1673,1558],{"class":1557},[909,1675,1576],{"class":918},[909,1677,1558],{"class":1557},[909,1679,1680],{"class":918},"993",[909,1682,1558],{"class":1557},[909,1684,1576],{"class":918},[909,1686,1558],{"class":1557},[909,1688,1689],{"class":918},"995",[909,1691,1558],{"class":1557},[909,1693,1694],{"class":918},",...]}",[909,1696,1425],{"class":1003},[909,1698,1438],{"class":989},[909,1700,1701,1703,1706,1708,1710,1713],{"class":911,"line":1163},[909,1702,1418],{"class":1417},[909,1704,1705],{"class":1421},"exit_probability",[909,1707,1425],{"class":1417},[909,1709,1083],{"class":1082},[909,1711,1712],{"class":1397}," 0.0005507535",[909,1714,1438],{"class":989},[909,1716,1717,1719,1722,1724,1726,1728,1731,1733],{"class":911,"line":1180},[909,1718,1418],{"class":1417},[909,1720,1721],{"class":1421},"first_seen",[909,1723,1425],{"class":1417},[909,1725,1083],{"class":1082},[909,1727,1430],{"class":1003},[909,1729,1730],{"class":918},"2023-07-07 00:00:00",[909,1732,1425],{"class":1003},[909,1734,1438],{"class":989},[909,1736,1737,1739,1742,1744,1746,1748,1751,1753],{"class":911,"line":1192},[909,1738,1418],{"class":1417},[909,1740,1741],{"class":1421},"flags",[909,1743,1425],{"class":1417},[909,1745,1083],{"class":1082},[909,1747,1430],{"class":1003},[909,1749,1750],{"class":918},"Exit,Fast,Running,Valid",[909,1752,1425],{"class":1003},[909,1754,1438],{"class":989},[909,1756,1757,1759,1762,1764,1766,1769],{"class":911,"line":1204},[909,1758,1418],{"class":1417},[909,1760,1761],{"class":1421},"guard_probability",[909,1763,1425],{"class":1417},[909,1765,1083],{"class":1082},[909,1767,1768],{"class":1397}," 0",[909,1770,1438],{"class":989},[909,1772,1773,1775,1778,1780,1782,1784,1787,1789],{"class":911,"line":1220},[909,1774,1418],{"class":1417},[909,1776,1777],{"class":1421},"last_restarted",[909,1779,1425],{"class":1417},[909,1781,1083],{"class":1082},[909,1783,1430],{"class":1003},[909,1785,1786],{"class":918},"2026-03-07 17:44:13",[909,1788,1425],{"class":1003},[909,1790,1438],{"class":989},[909,1792,1793,1795,1798,1800,1802,1804,1807,1809],{"class":911,"line":1232},[909,1794,1418],{"class":1417},[909,1796,1797],{"class":1421},"last_seen",[909,1799,1425],{"class":1417},[909,1801,1083],{"class":1082},[909,1803,1430],{"class":1003},[909,1805,1806],{"class":918},"2026-03-08 10:00:00",[909,1808,1425],{"class":1003},[909,1810,1438],{"class":989},[909,1812,1813,1815,1818,1820,1822,1825],{"class":911,"line":1244},[909,1814,1418],{"class":1417},[909,1816,1817],{"class":1421},"measured",[909,1819,1425],{"class":1417},[909,1821,1083],{"class":1082},[909,1823,1824],{"class":925}," true",[909,1826,1438],{"class":989},[909,1828,1829,1831,1834,1836,1838,1840],{"class":911,"line":1256},[909,1830,1418],{"class":1417},[909,1832,1833],{"class":1421},"middle_probability",[909,1835,1425],{"class":1417},[909,1837,1083],{"class":1082},[909,1839,1768],{"class":1397},[909,1841,1438],{"class":989},[909,1843,1844,1846,1849,1851,1853,1855,1858,1860],{"class":911,"line":1268},[909,1845,1418],{"class":1417},[909,1847,1848],{"class":1421},"or_addresses",[909,1850,1425],{"class":1417},[909,1852,1083],{"class":1082},[909,1854,1430],{"class":1003},[909,1856,1857],{"class":918},"192.42.116.49:9004",[909,1859,1425],{"class":1003},[909,1861,1438],{"class":989},[909,1863,1864,1866,1869,1871,1873,1875],{"class":911,"line":1281},[909,1865,1418],{"class":1417},[909,1867,1868],{"class":1421},"recommended_version",[909,1870,1425],{"class":1417},[909,1872,1083],{"class":1082},[909,1874,1824],{"class":925},[909,1876,1438],{"class":989},[909,1878,1879,1881,1884,1886,1888,1890],{"class":911,"line":1293},[909,1880,1418],{"class":1417},[909,1882,1883],{"class":1421},"running",[909,1885,1425],{"class":1417},[909,1887,1083],{"class":1082},[909,1889,1824],{"class":925},[909,1891,1438],{"class":989},[909,1893,1894,1896,1899,1901,1903,1905,1908],{"class":911,"line":1305},[909,1895,1418],{"class":1417},[909,1897,1898],{"class":1421},"version_status",[909,1900,1425],{"class":1417},[909,1902,1083],{"class":1082},[909,1904,1430],{"class":1003},[909,1906,1907],{"class":918},"recommended",[909,1909,1910],{"class":1003},"\"\n",[909,1912,1913],{"class":911,"line":1318},[909,1914,1369],{"class":989},[1916,1917,1918],"tip",{},[821,1919,1920,1921,1923],{},"The ",[825,1922,353],{"href":354}," checker in Bot Detector reads this database and applies configurable penalties for exit nodes, guard nodes, bad exits, and obsolete versions.",[1925,1926,1927],"style",{},"html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}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 .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 .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}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 .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .sFs1U, html code.shiki .sFs1U{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .saJyd, html code.shiki .saJyd{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FE}html pre.shiki code .s_W10, html code.shiki .s_W10{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FD}html pre.shiki code .st6lo, html code.shiki .st6lo{--shiki-light:#EE0000;--shiki-default:#EE0000;--shiki-dark:#FF79C6}",{"title":905,"searchDepth":1016,"depth":1016,"links":1929},[1930,1931,1932,1933],{"id":875,"depth":1016,"text":876},{"id":893,"depth":1016,"text":894},{"id":1055,"depth":1016,"text":1056},{"id":1374,"depth":1016,"text":1375},"Live Tor relay and exit node data fetched from the Tor Project's Onionoo API, compiled into tor.mmdb.","md","i-lucide-globe-lock",{},null,"---\ntitle: Tor Nodes\ndescription: Live Tor relay and exit node data fetched from the Tor Project's Onionoo API, compiled into tor.mmdb.\nicon: i-lucide-globe-lock\n---\n\nThe Tor source fetches live relay data directly from the [Tor Project's Onionoo API](https:\u002F\u002Fmetrics.torproject.org\u002Fonionoo.html) and compiles it into an MMDB database. The script filters for relay nodes with the following flags: `Exit`, `Valid`, `Running`, `Stable`, or `HSDir`. IP addresses are normalized to `\u002F24` (IPv4) or `\u002F64` (IPv6) CIDR blocks.\n\n**Output file:** `tor.mmdb`\n\n---\n\n## Data Source\n\n- Onionoo details endpoint: [onionoo.torproject.org\u002Fdetails](https:\u002F\u002Fonionoo.torproject.org\u002Fdetails)\n\n---\n\n## Usage\n\n::code-group\n```bash [pnpm]\npnpm dlx @riavzon\u002Fshield-base --tor\n```\n\n```bash [yarn]\nyarn dlx @riavzon\u002Fshield-base --tor\n```\n\n```bash [npm]\nnpx @riavzon\u002Fshield-base --tor\n```\n\n```bash [bun]\nbunx @riavzon\u002Fshield-base --tor\n```\n```ts [Programmatic]\nimport { getTorLists } from '@riavzon\u002Fshield-base';\n\nawait getTorLists('.\u002Fout', 'mmdbctl');\n```\n::\n\n---\n\n## Record Structure\n\n```ts\ninterface TorRecord {\n  range: string;\n  or_addresses: string;\n  exit_addresses: string;\n  last_seen: string;\n  last_changed_address_or_port: string;\n  first_seen: string;\n  running: boolean;\n  flags: string;                \u002F\u002F e.g. \"Exit,Fast,Running,Valid\"\n  country: string;\n  country_name: string;\n  as: string;                   \u002F\u002F ASN identifier, e.g. \"AS215125\"\n  as_name: string;\n  last_restarted: string;\n  exit_policy: string;\n  exit_policy_summary: string;\n  exit_policy_v6_summary?: string;\n  contact: string;\n  version_status: string;\n  guard_probability: number;\n  middle_probability: number;\n  exit_probability: number;\n  recommended_version: boolean;\n  measured: boolean;\n}\n```\n\n---\n\n## Example Lookup\n\n```bash [Terminal]\nmmdbctl read -f json-pretty 192.42.116.52 outputDirectory\u002Ftor.mmdb\n```\n\n```json\n{\n  \"as\": \"AS215125\",\n  \"as_name\": \"Church of Cyberology\",\n  \"contact\": \"email:mail[]nothingtohide.nl url:nothingtohide.nl proof:uri-rsa abuse:abuse[]nothingtohide.nl ciissversion:2\",\n  \"country\": \"nl\",\n  \"country_name\": \"Netherlands\",\n  \"exit_addresses\": \"192.42.116.49\",\n  \"exit_policy_summary\": \"{\\\"accept\\\":[\\\"43\\\",\\\"53\\\",\\\"80\\\",\\\"110\\\",\\\"143\\\",\\\"194\\\",\\\"220\\\",\\\"443\\\",\\\"465\\\",\\\"587\\\",\\\"853\\\",\\\"873\\\",\\\"993\\\",\\\"995\\\",...]}\",\n  \"exit_probability\": 0.0005507535,\n  \"first_seen\": \"2023-07-07 00:00:00\",\n  \"flags\": \"Exit,Fast,Running,Valid\",\n  \"guard_probability\": 0,\n  \"last_restarted\": \"2026-03-07 17:44:13\",\n  \"last_seen\": \"2026-03-08 10:00:00\",\n  \"measured\": true,\n  \"middle_probability\": 0,\n  \"or_addresses\": \"192.42.116.49:9004\",\n  \"recommended_version\": true,\n  \"running\": true,\n  \"version_status\": \"recommended\"\n}\n```\n\n::tip\nThe [Tor Analysis](\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis) checker in Bot Detector reads this database and applies configurable penalties for exit nodes, guard nodes, bad exits, and obsolete versions.\n::\n",{"title":115,"description":1934},"i8vmpOGxnkyN0tkCcVk55V9EDbXznS4IFoMp5EO2i74",[1943,1944],{"title":111,"path":112,"stem":113,"children":-1},{"title":119,"path":120,"stem":121,"children":-1},{"id":816,"title":115,"body":1946,"description":1934,"extension":1935,"icon":1936,"meta":2832,"module":1938,"navigation":8,"path":116,"rawbody":1939,"seo":2833,"stem":117,"__hash__":1941},{"type":818,"value":1947,"toc":2826},[1948,1967,1973,1975,1977,1984,1986,1988,2094,2096,2098,2348,2350,2352,2370,2818,2824],[821,1949,823,1950,831,1953,836,1955,836,1957,836,1959,846,1961,850,1963,854,1965,858],{},[825,1951,830],{"href":827,"rel":1952},[829],[833,1954,835],{},[833,1956,839],{},[833,1958,842],{},[833,1960,845],{},[833,1962,849],{},[833,1964,853],{},[833,1966,857],{},[821,1968,1969,865,1971],{},[862,1970,864],{},[833,1972,868],{},[870,1974],{},[873,1976,876],{"id":875},[878,1978,1979],{},[881,1980,883,1981],{},[825,1982,888],{"href":886,"rel":1983},[829],[870,1985],{},[873,1987,894],{"id":893},[896,1989,1990,2004,2018,2030,2042],{},[899,1991,1992],{"className":901,"code":902,"filename":903,"language":904,"meta":905,"style":905},[833,1993,1994],{"__ignoreMap":905},[909,1995,1996,1998,2000,2002],{"class":911,"line":912},[909,1997,903],{"class":915},[909,1999,919],{"class":918},[909,2001,922],{"class":918},[909,2003,926],{"class":925},[899,2005,2006],{"className":901,"code":929,"filename":930,"language":904,"meta":905,"style":905},[833,2007,2008],{"__ignoreMap":905},[909,2009,2010,2012,2014,2016],{"class":911,"line":912},[909,2011,930],{"class":915},[909,2013,919],{"class":918},[909,2015,922],{"class":918},[909,2017,926],{"class":925},[899,2019,2020],{"className":901,"code":945,"filename":946,"language":904,"meta":905,"style":905},[833,2021,2022],{"__ignoreMap":905},[909,2023,2024,2026,2028],{"class":911,"line":912},[909,2025,953],{"class":915},[909,2027,922],{"class":918},[909,2029,926],{"class":925},[899,2031,2032],{"className":901,"code":960,"filename":961,"language":904,"meta":905,"style":905},[833,2033,2034],{"__ignoreMap":905},[909,2035,2036,2038,2040],{"class":911,"line":912},[909,2037,968],{"class":915},[909,2039,922],{"class":918},[909,2041,926],{"class":925},[899,2043,2044],{"className":975,"code":976,"filename":977,"language":978,"meta":905,"style":905},[833,2045,2046,2066,2070],{"__ignoreMap":905},[909,2047,2048,2050,2052,2054,2056,2058,2060,2062,2064],{"class":911,"line":912},[909,2049,986],{"class":985},[909,2051,990],{"class":989},[909,2053,994],{"class":993},[909,2055,997],{"class":989},[909,2057,1000],{"class":985},[909,2059,1004],{"class":1003},[909,2061,1007],{"class":918},[909,2063,1010],{"class":1003},[909,2065,1013],{"class":989},[909,2067,2068],{"class":911,"line":1016},[909,2069,1019],{"emptyLinePlaceholder":8},[909,2071,2072,2074,2076,2078,2080,2082,2084,2086,2088,2090,2092],{"class":911,"line":1022},[909,2073,1025],{"class":985},[909,2075,1028],{"class":915},[909,2077,1031],{"class":989},[909,2079,1010],{"class":1003},[909,2081,1036],{"class":918},[909,2083,1010],{"class":1003},[909,2085,836],{"class":989},[909,2087,1010],{"class":1003},[909,2089,1045],{"class":918},[909,2091,1010],{"class":1003},[909,2093,1050],{"class":989},[870,2095],{},[873,2097,1056],{"id":1055},[899,2099,2100],{"className":975,"code":1059,"language":978,"meta":905,"style":905},[833,2101,2102,2110,2120,2130,2140,2150,2160,2170,2180,2192,2202,2212,2224,2234,2244,2254,2264,2274,2284,2294,2304,2314,2324,2334,2344],{"__ignoreMap":905},[909,2103,2104,2106,2108],{"class":911,"line":912},[909,2105,1067],{"class":1066},[909,2107,1071],{"class":1070},[909,2109,1074],{"class":989},[909,2111,2112,2114,2116,2118],{"class":911,"line":1016},[909,2113,1079],{"class":993},[909,2115,1083],{"class":1082},[909,2117,1086],{"class":1070},[909,2119,1013],{"class":989},[909,2121,2122,2124,2126,2128],{"class":911,"line":1022},[909,2123,1093],{"class":993},[909,2125,1083],{"class":1082},[909,2127,1086],{"class":1070},[909,2129,1013],{"class":989},[909,2131,2132,2134,2136,2138],{"class":911,"line":1102},[909,2133,1105],{"class":993},[909,2135,1083],{"class":1082},[909,2137,1086],{"class":1070},[909,2139,1013],{"class":989},[909,2141,2142,2144,2146,2148],{"class":911,"line":1114},[909,2143,1117],{"class":993},[909,2145,1083],{"class":1082},[909,2147,1086],{"class":1070},[909,2149,1013],{"class":989},[909,2151,2152,2154,2156,2158],{"class":911,"line":1126},[909,2153,1129],{"class":993},[909,2155,1083],{"class":1082},[909,2157,1086],{"class":1070},[909,2159,1013],{"class":989},[909,2161,2162,2164,2166,2168],{"class":911,"line":1138},[909,2163,1141],{"class":993},[909,2165,1083],{"class":1082},[909,2167,1086],{"class":1070},[909,2169,1013],{"class":989},[909,2171,2172,2174,2176,2178],{"class":911,"line":1150},[909,2173,1153],{"class":993},[909,2175,1083],{"class":1082},[909,2177,1158],{"class":1070},[909,2179,1013],{"class":989},[909,2181,2182,2184,2186,2188,2190],{"class":911,"line":1163},[909,2183,1166],{"class":993},[909,2185,1083],{"class":1082},[909,2187,1086],{"class":1070},[909,2189,1173],{"class":989},[909,2191,1177],{"class":1176},[909,2193,2194,2196,2198,2200],{"class":911,"line":1180},[909,2195,1183],{"class":993},[909,2197,1083],{"class":1082},[909,2199,1086],{"class":1070},[909,2201,1013],{"class":989},[909,2203,2204,2206,2208,2210],{"class":911,"line":1192},[909,2205,1195],{"class":993},[909,2207,1083],{"class":1082},[909,2209,1086],{"class":1070},[909,2211,1013],{"class":989},[909,2213,2214,2216,2218,2220,2222],{"class":911,"line":1204},[909,2215,1207],{"class":993},[909,2217,1083],{"class":1082},[909,2219,1086],{"class":1070},[909,2221,1214],{"class":989},[909,2223,1217],{"class":1176},[909,2225,2226,2228,2230,2232],{"class":911,"line":1220},[909,2227,1223],{"class":993},[909,2229,1083],{"class":1082},[909,2231,1086],{"class":1070},[909,2233,1013],{"class":989},[909,2235,2236,2238,2240,2242],{"class":911,"line":1232},[909,2237,1235],{"class":993},[909,2239,1083],{"class":1082},[909,2241,1086],{"class":1070},[909,2243,1013],{"class":989},[909,2245,2246,2248,2250,2252],{"class":911,"line":1244},[909,2247,1247],{"class":993},[909,2249,1083],{"class":1082},[909,2251,1086],{"class":1070},[909,2253,1013],{"class":989},[909,2255,2256,2258,2260,2262],{"class":911,"line":1256},[909,2257,1259],{"class":993},[909,2259,1083],{"class":1082},[909,2261,1086],{"class":1070},[909,2263,1013],{"class":989},[909,2265,2266,2268,2270,2272],{"class":911,"line":1268},[909,2267,1271],{"class":993},[909,2269,1274],{"class":1082},[909,2271,1086],{"class":1070},[909,2273,1013],{"class":989},[909,2275,2276,2278,2280,2282],{"class":911,"line":1281},[909,2277,1284],{"class":993},[909,2279,1083],{"class":1082},[909,2281,1086],{"class":1070},[909,2283,1013],{"class":989},[909,2285,2286,2288,2290,2292],{"class":911,"line":1293},[909,2287,1296],{"class":993},[909,2289,1083],{"class":1082},[909,2291,1086],{"class":1070},[909,2293,1013],{"class":989},[909,2295,2296,2298,2300,2302],{"class":911,"line":1305},[909,2297,1308],{"class":993},[909,2299,1083],{"class":1082},[909,2301,1313],{"class":1070},[909,2303,1013],{"class":989},[909,2305,2306,2308,2310,2312],{"class":911,"line":1318},[909,2307,1321],{"class":993},[909,2309,1083],{"class":1082},[909,2311,1313],{"class":1070},[909,2313,1013],{"class":989},[909,2315,2316,2318,2320,2322],{"class":911,"line":1330},[909,2317,1333],{"class":993},[909,2319,1083],{"class":1082},[909,2321,1313],{"class":1070},[909,2323,1013],{"class":989},[909,2325,2326,2328,2330,2332],{"class":911,"line":1342},[909,2327,1345],{"class":993},[909,2329,1083],{"class":1082},[909,2331,1158],{"class":1070},[909,2333,1013],{"class":989},[909,2335,2336,2338,2340,2342],{"class":911,"line":1354},[909,2337,1357],{"class":993},[909,2339,1083],{"class":1082},[909,2341,1158],{"class":1070},[909,2343,1013],{"class":989},[909,2345,2346],{"class":911,"line":1366},[909,2347,1369],{"class":989},[870,2349],{},[873,2351,1375],{"id":1374},[899,2353,2354],{"className":901,"code":1378,"filename":1379,"language":904,"meta":905,"style":905},[833,2355,2356],{"__ignoreMap":905},[909,2357,2358,2360,2362,2364,2366,2368],{"class":911,"line":912},[909,2359,1045],{"class":915},[909,2361,1388],{"class":918},[909,2363,1391],{"class":925},[909,2365,1394],{"class":918},[909,2367,1398],{"class":1397},[909,2369,1401],{"class":918},[899,2371,2372],{"className":1404,"code":1405,"language":5,"meta":905,"style":905},[833,2373,2374,2378,2396,2414,2432,2450,2468,2486,2624,2638,2656,2674,2688,2706,2724,2738,2752,2770,2784,2798,2814],{"__ignoreMap":905},[909,2375,2376],{"class":911,"line":912},[909,2377,1412],{"class":989},[909,2379,2380,2382,2384,2386,2388,2390,2392,2394],{"class":911,"line":1016},[909,2381,1418],{"class":1417},[909,2383,1422],{"class":1421},[909,2385,1425],{"class":1417},[909,2387,1083],{"class":1082},[909,2389,1430],{"class":1003},[909,2391,1433],{"class":918},[909,2393,1425],{"class":1003},[909,2395,1438],{"class":989},[909,2397,2398,2400,2402,2404,2406,2408,2410,2412],{"class":911,"line":1022},[909,2399,1418],{"class":1417},[909,2401,1445],{"class":1421},[909,2403,1425],{"class":1417},[909,2405,1083],{"class":1082},[909,2407,1430],{"class":1003},[909,2409,1454],{"class":918},[909,2411,1425],{"class":1003},[909,2413,1438],{"class":989},[909,2415,2416,2418,2420,2422,2424,2426,2428,2430],{"class":911,"line":1102},[909,2417,1418],{"class":1417},[909,2419,1465],{"class":1421},[909,2421,1425],{"class":1417},[909,2423,1083],{"class":1082},[909,2425,1430],{"class":1003},[909,2427,1474],{"class":918},[909,2429,1425],{"class":1003},[909,2431,1438],{"class":989},[909,2433,2434,2436,2438,2440,2442,2444,2446,2448],{"class":911,"line":1114},[909,2435,1418],{"class":1417},[909,2437,1485],{"class":1421},[909,2439,1425],{"class":1417},[909,2441,1083],{"class":1082},[909,2443,1430],{"class":1003},[909,2445,1494],{"class":918},[909,2447,1425],{"class":1003},[909,2449,1438],{"class":989},[909,2451,2452,2454,2456,2458,2460,2462,2464,2466],{"class":911,"line":1126},[909,2453,1418],{"class":1417},[909,2455,1505],{"class":1421},[909,2457,1425],{"class":1417},[909,2459,1083],{"class":1082},[909,2461,1430],{"class":1003},[909,2463,1514],{"class":918},[909,2465,1425],{"class":1003},[909,2467,1438],{"class":989},[909,2469,2470,2472,2474,2476,2478,2480,2482,2484],{"class":911,"line":1138},[909,2471,1418],{"class":1417},[909,2473,1525],{"class":1421},[909,2475,1425],{"class":1417},[909,2477,1083],{"class":1082},[909,2479,1430],{"class":1003},[909,2481,1534],{"class":918},[909,2483,1425],{"class":1003},[909,2485,1438],{"class":989},[909,2487,2488,2490,2492,2494,2496,2498,2500,2502,2504,2506,2508,2510,2512,2514,2516,2518,2520,2522,2524,2526,2528,2530,2532,2534,2536,2538,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560,2562,2564,2566,2568,2570,2572,2574,2576,2578,2580,2582,2584,2586,2588,2590,2592,2594,2596,2598,2600,2602,2604,2606,2608,2610,2612,2614,2616,2618,2620,2622],{"class":911,"line":1150},[909,2489,1418],{"class":1417},[909,2491,1545],{"class":1421},[909,2493,1425],{"class":1417},[909,2495,1083],{"class":1082},[909,2497,1430],{"class":1003},[909,2499,1554],{"class":918},[909,2501,1558],{"class":1557},[909,2503,1561],{"class":918},[909,2505,1558],{"class":1557},[909,2507,1566],{"class":918},[909,2509,1558],{"class":1557},[909,2511,1571],{"class":918},[909,2513,1558],{"class":1557},[909,2515,1576],{"class":918},[909,2517,1558],{"class":1557},[909,2519,1581],{"class":918},[909,2521,1558],{"class":1557},[909,2523,1576],{"class":918},[909,2525,1558],{"class":1557},[909,2527,1590],{"class":918},[909,2529,1558],{"class":1557},[909,2531,1576],{"class":918},[909,2533,1558],{"class":1557},[909,2535,1599],{"class":918},[909,2537,1558],{"class":1557},[909,2539,1576],{"class":918},[909,2541,1558],{"class":1557},[909,2543,1608],{"class":918},[909,2545,1558],{"class":1557},[909,2547,1576],{"class":918},[909,2549,1558],{"class":1557},[909,2551,1617],{"class":918},[909,2553,1558],{"class":1557},[909,2555,1576],{"class":918},[909,2557,1558],{"class":1557},[909,2559,1626],{"class":918},[909,2561,1558],{"class":1557},[909,2563,1576],{"class":918},[909,2565,1558],{"class":1557},[909,2567,1635],{"class":918},[909,2569,1558],{"class":1557},[909,2571,1576],{"class":918},[909,2573,1558],{"class":1557},[909,2575,1644],{"class":918},[909,2577,1558],{"class":1557},[909,2579,1576],{"class":918},[909,2581,1558],{"class":1557},[909,2583,1653],{"class":918},[909,2585,1558],{"class":1557},[909,2587,1576],{"class":918},[909,2589,1558],{"class":1557},[909,2591,1662],{"class":918},[909,2593,1558],{"class":1557},[909,2595,1576],{"class":918},[909,2597,1558],{"class":1557},[909,2599,1671],{"class":918},[909,2601,1558],{"class":1557},[909,2603,1576],{"class":918},[909,2605,1558],{"class":1557},[909,2607,1680],{"class":918},[909,2609,1558],{"class":1557},[909,2611,1576],{"class":918},[909,2613,1558],{"class":1557},[909,2615,1689],{"class":918},[909,2617,1558],{"class":1557},[909,2619,1694],{"class":918},[909,2621,1425],{"class":1003},[909,2623,1438],{"class":989},[909,2625,2626,2628,2630,2632,2634,2636],{"class":911,"line":1163},[909,2627,1418],{"class":1417},[909,2629,1705],{"class":1421},[909,2631,1425],{"class":1417},[909,2633,1083],{"class":1082},[909,2635,1712],{"class":1397},[909,2637,1438],{"class":989},[909,2639,2640,2642,2644,2646,2648,2650,2652,2654],{"class":911,"line":1180},[909,2641,1418],{"class":1417},[909,2643,1721],{"class":1421},[909,2645,1425],{"class":1417},[909,2647,1083],{"class":1082},[909,2649,1430],{"class":1003},[909,2651,1730],{"class":918},[909,2653,1425],{"class":1003},[909,2655,1438],{"class":989},[909,2657,2658,2660,2662,2664,2666,2668,2670,2672],{"class":911,"line":1192},[909,2659,1418],{"class":1417},[909,2661,1741],{"class":1421},[909,2663,1425],{"class":1417},[909,2665,1083],{"class":1082},[909,2667,1430],{"class":1003},[909,2669,1750],{"class":918},[909,2671,1425],{"class":1003},[909,2673,1438],{"class":989},[909,2675,2676,2678,2680,2682,2684,2686],{"class":911,"line":1204},[909,2677,1418],{"class":1417},[909,2679,1761],{"class":1421},[909,2681,1425],{"class":1417},[909,2683,1083],{"class":1082},[909,2685,1768],{"class":1397},[909,2687,1438],{"class":989},[909,2689,2690,2692,2694,2696,2698,2700,2702,2704],{"class":911,"line":1220},[909,2691,1418],{"class":1417},[909,2693,1777],{"class":1421},[909,2695,1425],{"class":1417},[909,2697,1083],{"class":1082},[909,2699,1430],{"class":1003},[909,2701,1786],{"class":918},[909,2703,1425],{"class":1003},[909,2705,1438],{"class":989},[909,2707,2708,2710,2712,2714,2716,2718,2720,2722],{"class":911,"line":1232},[909,2709,1418],{"class":1417},[909,2711,1797],{"class":1421},[909,2713,1425],{"class":1417},[909,2715,1083],{"class":1082},[909,2717,1430],{"class":1003},[909,2719,1806],{"class":918},[909,2721,1425],{"class":1003},[909,2723,1438],{"class":989},[909,2725,2726,2728,2730,2732,2734,2736],{"class":911,"line":1244},[909,2727,1418],{"class":1417},[909,2729,1817],{"class":1421},[909,2731,1425],{"class":1417},[909,2733,1083],{"class":1082},[909,2735,1824],{"class":925},[909,2737,1438],{"class":989},[909,2739,2740,2742,2744,2746,2748,2750],{"class":911,"line":1256},[909,2741,1418],{"class":1417},[909,2743,1833],{"class":1421},[909,2745,1425],{"class":1417},[909,2747,1083],{"class":1082},[909,2749,1768],{"class":1397},[909,2751,1438],{"class":989},[909,2753,2754,2756,2758,2760,2762,2764,2766,2768],{"class":911,"line":1268},[909,2755,1418],{"class":1417},[909,2757,1848],{"class":1421},[909,2759,1425],{"class":1417},[909,2761,1083],{"class":1082},[909,2763,1430],{"class":1003},[909,2765,1857],{"class":918},[909,2767,1425],{"class":1003},[909,2769,1438],{"class":989},[909,2771,2772,2774,2776,2778,2780,2782],{"class":911,"line":1281},[909,2773,1418],{"class":1417},[909,2775,1868],{"class":1421},[909,2777,1425],{"class":1417},[909,2779,1083],{"class":1082},[909,2781,1824],{"class":925},[909,2783,1438],{"class":989},[909,2785,2786,2788,2790,2792,2794,2796],{"class":911,"line":1293},[909,2787,1418],{"class":1417},[909,2789,1883],{"class":1421},[909,2791,1425],{"class":1417},[909,2793,1083],{"class":1082},[909,2795,1824],{"class":925},[909,2797,1438],{"class":989},[909,2799,2800,2802,2804,2806,2808,2810,2812],{"class":911,"line":1305},[909,2801,1418],{"class":1417},[909,2803,1898],{"class":1421},[909,2805,1425],{"class":1417},[909,2807,1083],{"class":1082},[909,2809,1430],{"class":1003},[909,2811,1907],{"class":918},[909,2813,1910],{"class":1003},[909,2815,2816],{"class":911,"line":1318},[909,2817,1369],{"class":989},[1916,2819,2820],{},[821,2821,1920,2822,1923],{},[825,2823,353],{"href":354},[1925,2825,1927],{},{"title":905,"searchDepth":1016,"depth":1016,"links":2827},[2828,2829,2830,2831],{"id":875,"depth":1016,"text":876},{"id":893,"depth":1016,"text":894},{"id":1055,"depth":1016,"text":1056},{"id":1374,"depth":1016,"text":1375},{},{"title":115,"description":1934},1780436289413]