[{"data":1,"prerenderedAt":3608},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fiam":64,"navigation":257,"navLinks_footer":837,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation_page":850,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation_surround":2401,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation":2404},{"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":27,"path":29,"stem":70,"children":71},"docs\u002Fiam\u002Findex",[72,73,76,216,219,236,240],{"title":27,"path":29,"stem":70},{"title":14,"path":74,"stem":75},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":77,"path":78,"stem":79,"children":80},"Essentials","\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[81,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166],{"title":77,"path":78,"stem":79},{"title":83,"path":84,"stem":85},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":87,"path":88,"stem":89},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":91,"path":92,"stem":93},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":95,"path":96,"stem":97},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":99,"path":100,"stem":101},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":103,"path":104,"stem":105},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":107,"path":108,"stem":109},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":111,"path":112,"stem":113},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":115,"path":116,"stem":117},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":119,"path":120,"stem":121},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":123,"path":124,"stem":125},"MFA","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":127,"path":128,"stem":129},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":131,"path":132,"stem":133},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":135,"path":136,"stem":137},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":139,"path":140,"stem":141},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":143,"path":144,"stem":145},"Logging","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":147,"path":148,"stem":149},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":151,"path":152,"stem":153},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":155,"path":156,"stem":157},"Cookies","\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":159,"path":160,"stem":161},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":163,"path":164,"stem":165},"Password Reset","\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":167,"path":168,"stem":169,"children":170},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[171,172,176,180,210,213],{"title":167,"path":168,"stem":169},{"title":173,"path":174,"stem":175},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":177,"path":178,"stem":179},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":181,"path":182,"stem":183,"children":184},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[185,186,190,194,198,202,206],{"title":181,"path":182,"stem":183},{"title":187,"path":188,"stem":189},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":191,"path":192,"stem":193},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":195,"path":196,"stem":197},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":199,"path":200,"stem":201},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":203,"path":204,"stem":205},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":207,"path":208,"stem":209},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":147,"path":211,"stem":212},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":214,"stem":215},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":217,"stem":218},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":220,"path":221,"stem":222,"children":223,"page":53},"Guides","\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[224,228,232],{"title":225,"path":226,"stem":227},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":229,"path":230,"stem":231},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":233,"path":234,"stem":235},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":237,"path":238,"stem":239},"Configuration","\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":241,"path":242,"stem":243,"children":244,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[245,249,253],{"title":246,"path":247,"stem":248},"API Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":250,"path":251,"stem":252},"Middleware Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":254,"path":255,"stem":256},"Routes Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",[258],{"title":9,"path":66,"stem":67,"children":259,"page":53},[260,398,516,521,577,644],{"title":20,"path":22,"stem":261,"children":262},"docs\u002Fauth-h3client\u002Findex",[263,264,273,307,331,353,356,376,379],{"title":20,"path":22,"stem":261},{"title":14,"path":265,"stem":266,"children":267},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[268,269],{"title":14,"path":265,"stem":266},{"title":270,"path":271,"stem":272},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":77,"path":274,"stem":275,"children":276},"\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[277,278,282,286,290,294,298,301,304],{"title":77,"path":274,"stem":275},{"title":279,"path":280,"stem":281},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":283,"path":284,"stem":285},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":287,"path":288,"stem":289},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":291,"path":292,"stem":293},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":295,"path":296,"stem":297},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":299,"stem":300},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":155,"path":302,"stem":303},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":143,"path":305,"stem":306},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":123,"path":308,"stem":309,"children":310},"\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[311,312,316,319,323,327],{"title":123,"path":308,"stem":309},{"title":313,"path":314,"stem":315},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":163,"path":317,"stem":318},"\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":320,"path":321,"stem":322},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":324,"path":325,"stem":326},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":328,"path":329,"stem":330},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":332,"path":333,"stem":334,"children":335},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[336,337,341,345,349],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":342,"path":343,"stem":344},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":346,"path":347,"stem":348},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":350,"path":351,"stem":352},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":354,"stem":355},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":220,"path":357,"stem":358,"children":359,"page":53},"\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[360,364,368,372],{"title":361,"path":362,"stem":363},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":365,"path":366,"stem":367},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":369,"path":370,"stem":371},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":373,"path":374,"stem":375},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":237,"path":377,"stem":378},"\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":246,"path":380,"stem":381,"children":382},"\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[383,384,387,390,394],{"title":246,"path":380,"stem":381},{"title":254,"path":385,"stem":386},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":250,"path":388,"stem":389},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":391,"path":392,"stem":393},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":395,"path":396,"stem":397},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":399,"path":35,"stem":400,"children":401},"Bot Detector","docs\u002Fbot-detection\u002Findex",[402,403,406,410,414,433,507,510,513],{"title":399,"path":35,"stem":400},{"title":14,"path":404,"stem":405},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":407,"path":408,"stem":409},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":411,"path":412,"stem":413},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":220,"path":415,"stem":416,"children":417,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[418,422,426,429],{"title":419,"path":420,"stem":421},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":423,"path":424,"stem":425},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":143,"path":427,"stem":428},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":430,"path":431,"stem":432},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":434,"path":435,"stem":436,"children":437},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[438,439,443,447,451,455,459,463,467,471,475,479,483,487,491,495,499,503],{"title":434,"path":435,"stem":436},{"title":440,"path":441,"stem":442},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":444,"path":445,"stem":446},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":448,"path":449,"stem":450},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":452,"path":453,"stem":454},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":456,"path":457,"stem":458},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":460,"path":461,"stem":462},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":464,"path":465,"stem":466},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":468,"path":469,"stem":470},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":472,"path":473,"stem":474},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":476,"path":477,"stem":478},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":480,"path":481,"stem":482},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":484,"path":485,"stem":486},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":488,"path":489,"stem":490},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":492,"path":493,"stem":494},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":496,"path":497,"stem":498},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":500,"path":501,"stem":502},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":504,"path":505,"stem":506},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":508,"stem":509},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":246,"path":511,"stem":512},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":237,"path":514,"stem":515},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":517,"path":11,"stem":518,"children":519},"Introduction","docs\u002Fgetting-started\u002Findex",[520],{"title":517,"path":11,"stem":518},{"title":27,"path":29,"stem":70,"children":522},[523,524,525,565,566,571,572],{"title":27,"path":29,"stem":70},{"title":14,"path":74,"stem":75},{"title":77,"path":78,"stem":79,"children":526},[527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549],{"title":77,"path":78,"stem":79},{"title":83,"path":84,"stem":85},{"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":139,"path":140,"stem":141},{"title":143,"path":144,"stem":145},{"title":147,"path":148,"stem":149},{"title":151,"path":152,"stem":153},{"title":155,"path":156,"stem":157},{"title":159,"path":160,"stem":161},{"title":163,"path":164,"stem":165},{"title":167,"path":168,"stem":169,"children":550},[551,552,553,554,563,564],{"title":167,"path":168,"stem":169},{"title":173,"path":174,"stem":175},{"title":177,"path":178,"stem":179},{"title":181,"path":182,"stem":183,"children":555},[556,557,558,559,560,561,562],{"title":181,"path":182,"stem":183},{"title":187,"path":188,"stem":189},{"title":191,"path":192,"stem":193},{"title":195,"path":196,"stem":197},{"title":199,"path":200,"stem":201},{"title":203,"path":204,"stem":205},{"title":207,"path":208,"stem":209},{"title":147,"path":211,"stem":212},{"title":38,"path":214,"stem":215},{"title":38,"path":217,"stem":218},{"title":220,"path":221,"stem":222,"children":567,"page":53},[568,569,570],{"title":225,"path":226,"stem":227},{"title":229,"path":230,"stem":231},{"title":233,"path":234,"stem":235},{"title":237,"path":238,"stem":239},{"title":241,"path":242,"stem":243,"children":573,"page":53},[574,575,576],{"title":246,"path":247,"stem":248},{"title":250,"path":251,"stem":252},{"title":254,"path":255,"stem":256},{"title":40,"path":42,"stem":578,"children":579},"docs\u002Fshield-base\u002Findex",[580,581,584,588,629,633,637,641],{"title":40,"path":42,"stem":578},{"title":14,"path":582,"stem":583},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":585,"path":586,"stem":587},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":411,"path":589,"stem":590,"children":591},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[592,593,597,601,605,609,613,617,621,625],{"title":411,"path":589,"stem":590},{"title":594,"path":595,"stem":596},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":598,"path":599,"stem":600},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":602,"path":603,"stem":604},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":606,"path":607,"stem":608},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":610,"path":611,"stem":612},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":614,"path":615,"stem":616},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":618,"path":619,"stem":620},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":622,"path":623,"stem":624},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":626,"path":627,"stem":628},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":630,"path":631,"stem":632},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":634,"path":635,"stem":636},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":638,"path":639,"stem":640},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":246,"path":642,"stem":643},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":395,"path":48,"stem":645,"children":646},"docs\u002Futils\u002Findex",[647,648,665,698,795],{"title":395,"path":48,"stem":645},{"title":649,"path":650,"stem":651,"children":652,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[653,657,661],{"title":654,"path":655,"stem":656},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":658,"path":659,"stem":660},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":662,"path":663,"stem":664},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":666,"path":667,"stem":668,"children":669,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[670,674,678,682,686,690,694],{"title":671,"path":672,"stem":673},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":675,"path":676,"stem":677},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":679,"path":680,"stem":681},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":683,"path":684,"stem":685},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":687,"path":688,"stem":689},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":691,"path":692,"stem":693},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":695,"path":696,"stem":697},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":699,"path":700,"stem":701,"children":702,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[703,707,711,715,719,723,727,731,735,739,743,747,751,755,759,763,767,771,775,779,783,787,791],{"title":704,"path":705,"stem":706},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":708,"path":709,"stem":710},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":712,"path":713,"stem":714},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":716,"path":717,"stem":718},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":720,"path":721,"stem":722},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":724,"path":725,"stem":726},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":728,"path":729,"stem":730},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":732,"path":733,"stem":734},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":736,"path":737,"stem":738},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":740,"path":741,"stem":742},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":744,"path":745,"stem":746},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":748,"path":749,"stem":750},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":752,"path":753,"stem":754},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":756,"path":757,"stem":758},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":760,"path":761,"stem":762},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":764,"path":765,"stem":766},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":768,"path":769,"stem":770},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":772,"path":773,"stem":774},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":776,"path":777,"stem":778},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":780,"path":781,"stem":782},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":784,"path":785,"stem":786},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":788,"path":789,"stem":790},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":792,"path":793,"stem":794},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":796,"path":797,"stem":798,"children":799},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[800,801,805,809,813,817,821,825,829,833],{"title":796,"path":797,"stem":798},{"title":802,"path":803,"stem":804},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":806,"path":807,"stem":808},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":810,"path":811,"stem":812},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":814,"path":815,"stem":816},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":818,"path":819,"stem":820},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":822,"path":823,"stem":824},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":826,"path":827,"stem":828},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":830,"path":831,"stem":832},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":834,"path":835,"stem":836},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":838,"meta":849,"stem":62,"__hash__":63},[839,847,848],{"nested":8,"label":9,"icon":10,"to":11,"children":840},[841,842,843,844,845,846],{"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":851,"title":173,"body":852,"description":2393,"extension":2394,"icon":2395,"meta":2396,"module":2397,"navigation":8,"path":174,"rawbody":2398,"seo":2399,"stem":175,"__hash__":2400},"docs\u002Fdocs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation.md",{"type":853,"value":854,"toc":2380},"minimark",[855,859,862,870,876,879,884,887,905,910,1093,1112,1115,1196,1216,1222,1228,1231,1277,1285,1288,1303,1308,1312,1337,1354,1473,1476,1638,1643,1648,1655,1745,1748,1800,1805,1892,1895,1977,1980,2034,2037,2041,2044,2084,2088,2105,2112,2116,2126,2171,2175,2206,2212,2376],[856,857,858],"p",{},"Before creating tokens, you need to decide on the privilege type associated with that token, prefix, name, how long it will be valid, and if you want to restrict the usage of it for a specific host.\nA mismatch in any of these values will cause the token to fail verification, and to perform sensitive actions associated with it.",[856,860,861],{},"The IAM scopes a privilege for a token and fails verification if the privilege doesn't match the one associated with a token.",[856,863,864,865,869],{},"That means your app(s) need to ",[866,867,868],"em",{},"know"," what each privilege means to it, and how it affects its functionality. The IAM role is to create, store, verify it securely, and send to your app\u002Fclient the metadata about that token. Above that it doesn't have any understanding of what privilege means to your client.",[871,872,873],"caution",{},[856,874,875],{},"Do not allow un trusted client to control the privilege value",[877,878],"hr",{},[880,881,883],"h2",{"id":882},"creating-a-token","Creating a token",[856,885,886],{},"Two ways to create a token:",[888,889,890,898],"ul",{},[891,892,893,894],"li",{},"If you use the service as a library you use ",[895,896,897],"code",{},"createApiToken",[891,899,900,901,904],{},"If you run the service directly you call ",[895,902,903],{},"POST \u002Fapi\u002Fmanage\u002Fnew-token"," with a full authenticated session and the associated body.",[906,907,909],"h3",{"id":908},"using-the-library","Using the library",[911,912,918],"pre",{"className":913,"code":914,"filename":915,"language":916,"meta":917,"style":917},"language-ts shiki shiki-themes light-plus light-plus dracula","import { createApiToken } from '@riavzon\u002Fauth'\n\nconst expires = 1000 * 60 * 60; \u002F\u002Fms\nconst ips = [\"1.1.1.1\", \"2.2.2.2\"]\nconst newCreatedToken = await createApiKey(userId, 'demo', 'mytoken', 'app', expires, ips);\n\n","example.ts","ts","",[895,919,920,953,959,995,1029],{"__ignoreMap":917},[921,922,925,929,933,936,939,942,946,950],"span",{"class":923,"line":924},"line",1,[921,926,928],{"class":927},"sZ328","import",[921,930,932],{"class":931},"sDd4n"," { ",[921,934,897],{"class":935},"sjsA6",[921,937,938],{"class":931}," } ",[921,940,941],{"class":927},"from",[921,943,945],{"class":944},"sFkSl"," '",[921,947,949],{"class":948},"sFB1V","@riavzon\u002Fauth",[921,951,952],{"class":944},"'\n",[921,954,956],{"class":923,"line":955},2,[921,957,958],{"emptyLinePlaceholder":8},"\n",[921,960,962,966,970,974,978,981,984,986,988,991],{"class":923,"line":961},3,[921,963,965],{"class":964},"sl46w","const",[921,967,969],{"class":968},"s3JHE"," expires",[921,971,973],{"class":972},"saOXh"," =",[921,975,977],{"class":976},"spgvN"," 1000",[921,979,980],{"class":972}," *",[921,982,983],{"class":976}," 60",[921,985,980],{"class":972},[921,987,983],{"class":976},[921,989,990],{"class":931},"; ",[921,992,994],{"class":993},"sghk6","\u002F\u002Fms\n",[921,996,998,1000,1003,1005,1008,1011,1014,1016,1019,1021,1024,1026],{"class":923,"line":997},4,[921,999,965],{"class":964},[921,1001,1002],{"class":968}," ips",[921,1004,973],{"class":972},[921,1006,1007],{"class":931}," [",[921,1009,1010],{"class":944},"\"",[921,1012,1013],{"class":948},"1.1.1.1",[921,1015,1010],{"class":944},[921,1017,1018],{"class":931},", ",[921,1020,1010],{"class":944},[921,1022,1023],{"class":948},"2.2.2.2",[921,1025,1010],{"class":944},[921,1027,1028],{"class":931},"]\n",[921,1030,1032,1034,1037,1039,1042,1046,1049,1052,1054,1057,1060,1062,1064,1066,1069,1071,1073,1075,1078,1080,1082,1085,1087,1090],{"class":923,"line":1031},5,[921,1033,965],{"class":964},[921,1035,1036],{"class":968}," newCreatedToken",[921,1038,973],{"class":972},[921,1040,1041],{"class":927}," await",[921,1043,1045],{"class":1044},"sHOzp"," createApiKey",[921,1047,1048],{"class":931},"(",[921,1050,1051],{"class":935},"userId",[921,1053,1018],{"class":931},[921,1055,1056],{"class":944},"'",[921,1058,1059],{"class":948},"demo",[921,1061,1056],{"class":944},[921,1063,1018],{"class":931},[921,1065,1056],{"class":944},[921,1067,1068],{"class":948},"mytoken",[921,1070,1056],{"class":944},[921,1072,1018],{"class":931},[921,1074,1056],{"class":944},[921,1076,1077],{"class":948},"app",[921,1079,1056],{"class":944},[921,1081,1018],{"class":931},[921,1083,1084],{"class":935},"expires",[921,1086,1018],{"class":931},[921,1088,1089],{"class":935},"ips",[921,1091,1092],{"class":931},");\n",[856,1094,1095,1096,1098,1099,1101,1102,1104,1105,1018,1108,1111],{},"The above code will generate a token with a privilege of ",[895,1097,1059],{}," a name of ",[895,1100,1068],{}," with a prefix of ",[895,1103,1077],{},", that will be restricted\nto ",[895,1106,1107],{},"\"1.1.1.1\"",[895,1109,1110],{},"\"2.2.2.2\""," ip addresses and will expire in 1 hour.",[856,1113,1114],{},"If succeeded the above will return:",[911,1116,1118],{"className":913,"code":1117,"language":916,"meta":917,"style":917},"{\n   ok: true,\n   date: new Date().toISOString(),\n   data: {\n       rawApiKey,\n       rawPublicId,\n       expiresAt\n   }\n}\n",[895,1119,1120,1125,1137,1158,1163,1170,1178,1184,1190],{"__ignoreMap":917},[921,1121,1122],{"class":923,"line":924},[921,1123,1124],{"class":931},"{\n",[921,1126,1127,1130,1134],{"class":923,"line":955},[921,1128,1129],{"class":931},"   ok: ",[921,1131,1133],{"class":1132},"sjR7W","true",[921,1135,1136],{"class":931},",\n",[921,1138,1139,1142,1146,1149,1152,1155],{"class":923,"line":961},[921,1140,1141],{"class":931},"   date: ",[921,1143,1145],{"class":1144},"sakC6","new",[921,1147,1148],{"class":1044}," Date",[921,1150,1151],{"class":931},"().",[921,1153,1154],{"class":1044},"toISOString",[921,1156,1157],{"class":931},"(),\n",[921,1159,1160],{"class":923,"line":997},[921,1161,1162],{"class":931},"   data: {\n",[921,1164,1165,1168],{"class":923,"line":1031},[921,1166,1167],{"class":935},"       rawApiKey",[921,1169,1136],{"class":931},[921,1171,1173,1176],{"class":923,"line":1172},6,[921,1174,1175],{"class":935},"       rawPublicId",[921,1177,1136],{"class":931},[921,1179,1181],{"class":923,"line":1180},7,[921,1182,1183],{"class":935},"       expiresAt\n",[921,1185,1187],{"class":923,"line":1186},8,[921,1188,1189],{"class":931},"   }\n",[921,1191,1193],{"class":923,"line":1192},9,[921,1194,1195],{"class":931},"}\n",[888,1197,1198,1204,1210],{},[891,1199,1200,1203],{},[895,1201,1202],{},"rawApiKey"," - The raw un hashed api key",[891,1205,1206,1209],{},[895,1207,1208],{},"rawPublicId"," - The public id",[891,1211,1212,1215],{},[895,1213,1214],{},"expiresAt"," - When the token will be expired",[1217,1218,1219],"warning",{},[856,1220,1221],{},"This is the only time the server and you would see the token, you should return it to the authenticate client immediately.\nAfter this point if the client looses it, it would need to generate a new one, or rotate it.",[1223,1224,1225],"note",{},[856,1226,1227],{},"The prefix should not include a \"_\" character in its value, or the function will throw.",[856,1229,1230],{},"The function will return:",[911,1232,1234],{"className":913,"code":1233,"language":916,"meta":917,"style":917},"{\n ok: false,\n date: new Date().toISOString(),\n reason: string\n}\n",[895,1235,1236,1240,1250,1265,1273],{"__ignoreMap":917},[921,1237,1238],{"class":923,"line":924},[921,1239,1124],{"class":931},[921,1241,1242,1245,1248],{"class":923,"line":955},[921,1243,1244],{"class":931}," ok: ",[921,1246,1247],{"class":1132},"false",[921,1249,1136],{"class":931},[921,1251,1252,1255,1257,1259,1261,1263],{"class":923,"line":961},[921,1253,1254],{"class":931}," date: ",[921,1256,1145],{"class":1144},[921,1258,1148],{"class":1044},[921,1260,1151],{"class":931},[921,1262,1154],{"class":1044},[921,1264,1157],{"class":931},[921,1266,1267,1270],{"class":923,"line":997},[921,1268,1269],{"class":931}," reason: ",[921,1271,1272],{"class":935},"string\n",[921,1274,1275],{"class":923,"line":1031},[921,1276,1195],{"class":931},[856,1278,1279,1280,1284],{},"If the creation is failed, and ",[1281,1282,1283],"strong",{},"throw"," only if the database failed to create a new token.",[856,1286,1287],{},"Possible reasons are:",[888,1289,1290,1297,1300],{},[891,1291,1292,1293,1296],{},"The user have reached the maximum allowed valid tokens he can have at a time (configured under ",[895,1294,1295],{},"apiTokens.limitTokensPerUser",")",[891,1298,1299],{},"The character \"_\" is being used in the prefix",[891,1301,1302],{},"Database connection issues",[871,1304,1305],{},[856,1306,1307],{},"Authentication is not checked inside this function. You should fully authenticate the session before allowing access to it in a route.",[906,1309,1311],{"id":1310},"running-the-service","Running the service",[856,1313,1314,1315,1319,1320,1323,1324,1329,1330,1332,1333,1336],{},"To create a token with the service, your client needs to be fully authenticated, with a valid ",[1316,1317,1318],"a",{"href":92},"refresh token"," a valid ",[1316,1321,1322],{"href":88},"access token"," and a ",[1316,1325,1326],{"href":84},[895,1327,1328],{},"canary_id"," cookie.\nThe session also should not have any active ",[1316,1331,123],{"href":124}," or ",[1316,1334,1335],{"href":96},"anomaly"," associated with it.",[856,1338,1339,1340,1343,1344,1353],{},"Send a ",[895,1341,1342],{},"POST"," request to ",[895,1345,1348,1350],{"className":1346,"language":1347,"style":917},"language-http shiki shiki-themes light-plus light-plus dracula","http",[921,1349,1342],{"class":927},[921,1351,1352],{"class":931}," \u002Fapi\u002Fmanage\u002Fnew-token"," with the following body:",[911,1355,1358],{"className":1356,"code":1357,"language":5,"meta":917,"style":917},"language-json shiki shiki-themes light-plus light-plus dracula","{\n    \"privilege\": \"demo\",\n    \"name\": \"mytoken\",\n    \"prefix\": \"app\",\n    \"ipv4\": [\"1.1.1.1\", \"2.2.2.2\"],\n    \"expires\": 3600000\n}\n",[895,1359,1360,1364,1388,1407,1426,1456,1469],{"__ignoreMap":917},[921,1361,1362],{"class":923,"line":924},[921,1363,1124],{"class":931},[921,1365,1366,1370,1374,1376,1379,1382,1384,1386],{"class":923,"line":955},[921,1367,1369],{"class":1368},"saJyd","    \"",[921,1371,1373],{"class":1372},"s_W10","privilege",[921,1375,1010],{"class":1368},[921,1377,1378],{"class":972},":",[921,1380,1381],{"class":944}," \"",[921,1383,1059],{"class":948},[921,1385,1010],{"class":944},[921,1387,1136],{"class":931},[921,1389,1390,1392,1395,1397,1399,1401,1403,1405],{"class":923,"line":961},[921,1391,1369],{"class":1368},[921,1393,1394],{"class":1372},"name",[921,1396,1010],{"class":1368},[921,1398,1378],{"class":972},[921,1400,1381],{"class":944},[921,1402,1068],{"class":948},[921,1404,1010],{"class":944},[921,1406,1136],{"class":931},[921,1408,1409,1411,1414,1416,1418,1420,1422,1424],{"class":923,"line":997},[921,1410,1369],{"class":1368},[921,1412,1413],{"class":1372},"prefix",[921,1415,1010],{"class":1368},[921,1417,1378],{"class":972},[921,1419,1381],{"class":944},[921,1421,1077],{"class":948},[921,1423,1010],{"class":944},[921,1425,1136],{"class":931},[921,1427,1428,1430,1433,1435,1437,1439,1441,1443,1445,1447,1449,1451,1453],{"class":923,"line":1031},[921,1429,1369],{"class":1368},[921,1431,1432],{"class":1372},"ipv4",[921,1434,1010],{"class":1368},[921,1436,1378],{"class":972},[921,1438,1007],{"class":931},[921,1440,1010],{"class":944},[921,1442,1013],{"class":948},[921,1444,1010],{"class":944},[921,1446,1018],{"class":931},[921,1448,1010],{"class":944},[921,1450,1023],{"class":948},[921,1452,1010],{"class":944},[921,1454,1455],{"class":931},"],\n",[921,1457,1458,1460,1462,1464,1466],{"class":923,"line":1172},[921,1459,1369],{"class":1368},[921,1461,1084],{"class":1372},[921,1463,1010],{"class":1368},[921,1465,1378],{"class":972},[921,1467,1468],{"class":976}," 3600000\n",[921,1470,1471],{"class":923,"line":1180},[921,1472,1195],{"class":931},[856,1474,1475],{},"This will generate a token with the same conventions as above, and return the following response:",[911,1477,1479],{"className":1346,"code":1478,"language":1347,"meta":917,"style":917},"HTTP\u002F1.1 201 Created\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n  \"ok\": true,\n  \"date\": \"current date\",\n  \"data\": {\n        \"rawApiKey\": \"token\",\n        \"rawPublicId\": \"pubid\",\n         \"expiresAt\": \"expiry\"\n    }\n}\n",[895,1480,1481,1498,1509,1513,1517,1534,1554,1568,1588,1607,1627,1633],{"__ignoreMap":917},[921,1482,1483,1486,1489,1492,1495],{"class":923,"line":924},[921,1484,1485],{"class":964},"HTTP",[921,1487,1488],{"class":931},"\u002F",[921,1490,1491],{"class":976},"1.1",[921,1493,1494],{"class":976}," 201",[921,1496,1497],{"class":948}," Created\n",[921,1499,1500,1504,1506],{"class":923,"line":955},[921,1501,1503],{"class":1502},"scd-l","Content-Type",[921,1505,1378],{"class":964},[921,1507,1508],{"class":948}," application\u002Fjson; charset=utf-8\n",[921,1510,1511],{"class":923,"line":961},[921,1512,958],{"emptyLinePlaceholder":8},[921,1514,1515],{"class":923,"line":997},[921,1516,1124],{"class":931},[921,1518,1519,1522,1525,1527,1529,1532],{"class":923,"line":1031},[921,1520,1521],{"class":1368},"  \"",[921,1523,1524],{"class":1372},"ok",[921,1526,1010],{"class":1368},[921,1528,1378],{"class":972},[921,1530,1531],{"class":1132}," true",[921,1533,1136],{"class":931},[921,1535,1536,1538,1541,1543,1545,1547,1550,1552],{"class":923,"line":1172},[921,1537,1521],{"class":1368},[921,1539,1540],{"class":1372},"date",[921,1542,1010],{"class":1368},[921,1544,1378],{"class":972},[921,1546,1381],{"class":944},[921,1548,1549],{"class":948},"current date",[921,1551,1010],{"class":944},[921,1553,1136],{"class":931},[921,1555,1556,1558,1561,1563,1565],{"class":923,"line":1180},[921,1557,1521],{"class":1368},[921,1559,1560],{"class":1372},"data",[921,1562,1010],{"class":1368},[921,1564,1378],{"class":972},[921,1566,1567],{"class":931}," {\n",[921,1569,1570,1573,1575,1577,1579,1581,1584,1586],{"class":923,"line":1186},[921,1571,1572],{"class":1368},"        \"",[921,1574,1202],{"class":1372},[921,1576,1010],{"class":1368},[921,1578,1378],{"class":972},[921,1580,1381],{"class":944},[921,1582,1583],{"class":948},"token",[921,1585,1010],{"class":944},[921,1587,1136],{"class":931},[921,1589,1590,1592,1594,1596,1598,1600,1603,1605],{"class":923,"line":1192},[921,1591,1572],{"class":1368},[921,1593,1208],{"class":1372},[921,1595,1010],{"class":1368},[921,1597,1378],{"class":972},[921,1599,1381],{"class":944},[921,1601,1602],{"class":948},"pubid",[921,1604,1010],{"class":944},[921,1606,1136],{"class":931},[921,1608,1610,1613,1615,1617,1619,1621,1624],{"class":923,"line":1609},10,[921,1611,1612],{"class":1368},"         \"",[921,1614,1214],{"class":1372},[921,1616,1010],{"class":1368},[921,1618,1378],{"class":972},[921,1620,1381],{"class":944},[921,1622,1623],{"class":948},"expiry",[921,1625,1626],{"class":944},"\"\n",[921,1628,1630],{"class":923,"line":1629},11,[921,1631,1632],{"class":931},"    }\n",[921,1634,1636],{"class":923,"line":1635},12,[921,1637,1195],{"class":931},[1217,1639,1640],{},[856,1641,1642],{},"Same applies as above, this is the only time the server and you would see the token, you should return it to the authenticate client immediately. After this point if the client looses it, it would need to generate a new one, or rotate it.",[1644,1645,1647],"h4",{"id":1646},"possible-failure","Possible failure",[856,1649,1650,1651,1654],{},"If the body is not valid or missing required values ",[895,1652,1653],{},"400"," will be returned:",[911,1656,1658],{"className":1346,"code":1657,"language":1347,"meta":917,"style":917},"HTTP\u002F1.1 400 Bad request\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n  \"ok\": false,\n  \"date\": \"current date\",\n  \"reason\": \"Bad Request\"\n}\n",[895,1659,1660,1674,1682,1686,1690,1705,1723,1741],{"__ignoreMap":917},[921,1661,1662,1664,1666,1668,1671],{"class":923,"line":924},[921,1663,1485],{"class":964},[921,1665,1488],{"class":931},[921,1667,1491],{"class":976},[921,1669,1670],{"class":976}," 400",[921,1672,1673],{"class":948}," Bad request\n",[921,1675,1676,1678,1680],{"class":923,"line":955},[921,1677,1503],{"class":1502},[921,1679,1378],{"class":964},[921,1681,1508],{"class":948},[921,1683,1684],{"class":923,"line":961},[921,1685,958],{"emptyLinePlaceholder":8},[921,1687,1688],{"class":923,"line":997},[921,1689,1124],{"class":931},[921,1691,1692,1694,1696,1698,1700,1703],{"class":923,"line":1031},[921,1693,1521],{"class":1368},[921,1695,1524],{"class":1372},[921,1697,1010],{"class":1368},[921,1699,1378],{"class":972},[921,1701,1702],{"class":1132}," false",[921,1704,1136],{"class":931},[921,1706,1707,1709,1711,1713,1715,1717,1719,1721],{"class":923,"line":1172},[921,1708,1521],{"class":1368},[921,1710,1540],{"class":1372},[921,1712,1010],{"class":1368},[921,1714,1378],{"class":972},[921,1716,1381],{"class":944},[921,1718,1549],{"class":948},[921,1720,1010],{"class":944},[921,1722,1136],{"class":931},[921,1724,1725,1727,1730,1732,1734,1736,1739],{"class":923,"line":1180},[921,1726,1521],{"class":1368},[921,1728,1729],{"class":1372},"reason",[921,1731,1010],{"class":1368},[921,1733,1378],{"class":972},[921,1735,1381],{"class":944},[921,1737,1738],{"class":948},"Bad Request",[921,1740,1626],{"class":944},[921,1742,1743],{"class":923,"line":1186},[921,1744,1195],{"class":931},[856,1746,1747],{},"If the body contains HTML:",[911,1749,1751],{"className":1346,"code":1750,"language":1347,"meta":917,"style":917},"HTTP\u002F1.1 403 Bad request\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n \"banned\": true\n}\n",[895,1752,1753,1766,1774,1778,1782,1796],{"__ignoreMap":917},[921,1754,1755,1757,1759,1761,1764],{"class":923,"line":924},[921,1756,1485],{"class":964},[921,1758,1488],{"class":931},[921,1760,1491],{"class":976},[921,1762,1763],{"class":976}," 403",[921,1765,1673],{"class":948},[921,1767,1768,1770,1772],{"class":923,"line":955},[921,1769,1503],{"class":1502},[921,1771,1378],{"class":964},[921,1773,1508],{"class":948},[921,1775,1776],{"class":923,"line":961},[921,1777,958],{"emptyLinePlaceholder":8},[921,1779,1780],{"class":923,"line":997},[921,1781,1124],{"class":931},[921,1783,1784,1786,1789,1791,1793],{"class":923,"line":1031},[921,1785,1381],{"class":1368},[921,1787,1788],{"class":1372},"banned",[921,1790,1010],{"class":1368},[921,1792,1378],{"class":972},[921,1794,1795],{"class":1132}," true\n",[921,1797,1798],{"class":923,"line":1172},[921,1799,1195],{"class":931},[856,1801,1802,1803,1378],{},"For issues related to ",[895,1804,897],{},[911,1806,1808],{"className":1346,"code":1807,"language":1347,"meta":917,"style":917},"HTTP\u002F1.1 400 OR 500\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n  \"ok\": false,\n  \"date\": \"current date\",\n  \"reason\": \"reason from `createApiToken`\"\n}\n",[895,1809,1810,1823,1831,1835,1839,1853,1871,1888],{"__ignoreMap":917},[921,1811,1812,1814,1816,1818,1820],{"class":923,"line":924},[921,1813,1485],{"class":964},[921,1815,1488],{"class":931},[921,1817,1491],{"class":976},[921,1819,1670],{"class":976},[921,1821,1822],{"class":948}," OR 500\n",[921,1824,1825,1827,1829],{"class":923,"line":955},[921,1826,1503],{"class":1502},[921,1828,1378],{"class":964},[921,1830,1508],{"class":948},[921,1832,1833],{"class":923,"line":961},[921,1834,958],{"emptyLinePlaceholder":8},[921,1836,1837],{"class":923,"line":997},[921,1838,1124],{"class":931},[921,1840,1841,1843,1845,1847,1849,1851],{"class":923,"line":1031},[921,1842,1521],{"class":1368},[921,1844,1524],{"class":1372},[921,1846,1010],{"class":1368},[921,1848,1378],{"class":972},[921,1850,1702],{"class":1132},[921,1852,1136],{"class":931},[921,1854,1855,1857,1859,1861,1863,1865,1867,1869],{"class":923,"line":1172},[921,1856,1521],{"class":1368},[921,1858,1540],{"class":1372},[921,1860,1010],{"class":1368},[921,1862,1378],{"class":972},[921,1864,1381],{"class":944},[921,1866,1549],{"class":948},[921,1868,1010],{"class":944},[921,1870,1136],{"class":931},[921,1872,1873,1875,1877,1879,1881,1883,1886],{"class":923,"line":1180},[921,1874,1521],{"class":1368},[921,1876,1729],{"class":1372},[921,1878,1010],{"class":1368},[921,1880,1378],{"class":972},[921,1882,1381],{"class":944},[921,1884,1885],{"class":948},"reason from `createApiToken`",[921,1887,1626],{"class":944},[921,1889,1890],{"class":923,"line":1186},[921,1891,1195],{"class":931},[856,1893,1894],{},"Rate Limits:",[911,1896,1898],{"className":1346,"code":1897,"language":1347,"meta":917,"style":917},"HTTP\u002F1.1 429\nContent-Type: application\u002Fjson; charset=utf-8\nRetry-After: number\n{\n  \"error\": \"Too many requests\",\n  \"retry\": \"number\",\n}\n",[895,1899,1900,1911,1919,1929,1933,1953,1973],{"__ignoreMap":917},[921,1901,1902,1904,1906,1908],{"class":923,"line":924},[921,1903,1485],{"class":964},[921,1905,1488],{"class":931},[921,1907,1491],{"class":976},[921,1909,1910],{"class":976}," 429\n",[921,1912,1913,1915,1917],{"class":923,"line":955},[921,1914,1503],{"class":1502},[921,1916,1378],{"class":964},[921,1918,1508],{"class":948},[921,1920,1921,1924,1926],{"class":923,"line":961},[921,1922,1923],{"class":1502},"Retry-After",[921,1925,1378],{"class":964},[921,1927,1928],{"class":948}," number\n",[921,1930,1931],{"class":923,"line":997},[921,1932,1124],{"class":931},[921,1934,1935,1937,1940,1942,1944,1946,1949,1951],{"class":923,"line":1031},[921,1936,1521],{"class":1368},[921,1938,1939],{"class":1372},"error",[921,1941,1010],{"class":1368},[921,1943,1378],{"class":972},[921,1945,1381],{"class":944},[921,1947,1948],{"class":948},"Too many requests",[921,1950,1010],{"class":944},[921,1952,1136],{"class":931},[921,1954,1955,1957,1960,1962,1964,1966,1969,1971],{"class":923,"line":1172},[921,1956,1521],{"class":1368},[921,1958,1959],{"class":1372},"retry",[921,1961,1010],{"class":1368},[921,1963,1378],{"class":972},[921,1965,1381],{"class":944},[921,1967,1968],{"class":948},"number",[921,1970,1010],{"class":944},[921,1972,1136],{"class":931},[921,1974,1975],{"class":923,"line":1180},[921,1976,1195],{"class":931},[856,1978,1979],{},"The route is behind a full authentication flow, each needs to succeeded before the token is created:",[888,1981,1982,1988,1994,2000,2006,2012,2022,2028],{},[891,1983,1984,1987],{},[895,1985,1986],{},"requireAccessToken"," Requires the access token header to be present",[891,1989,1990,1993],{},[895,1991,1992],{},"requireRefreshToken"," Requires the refresh token to be present",[891,1995,1996,1999],{},[895,1997,1998],{},"getFingerPrint"," Gets the finger prints for MFA",[891,2001,2002,2005],{},[895,2003,2004],{},"checkForActiveMfa"," MFA cache",[891,2007,2008,2011],{},[895,2009,2010],{},"protectRoute"," Enforces authentication, and perform the 9 mfa checks,",[891,2013,2014,2017,2018,2021],{},[895,2015,2016],{},"contentType('application\u002Fjson')"," Enforces ",[895,2019,2020],{},"application\u002Fjson",",",[891,2023,2024,2027],{},[895,2025,2026],{},"express.json"," To limit the body size to 1kb",[891,2029,2030,2033],{},[895,2031,2032],{},"apiTokensController"," The creations happens here",[856,2035,2036],{},"If the client is not authenticate, cannot be found, have an active MFA the creation will fail, with the appropriate response.",[880,2038,2040],{"id":2039},"rate-limits","Rate Limits",[856,2042,2043],{},"The endpoint also enforce rate limits controlled under the following configuration options:",[888,2045,2046,2052],{},[891,2047,2048,2051],{},[895,2049,2050],{},"rate_limiters.apiTokensLimiters.operationRateLimits.newTokenCreationLimiter"," - The main limiter for the new tokens creation endpoint. The default allows 5 creations in a window of 10 minutes and will trigger a block for 1 hour if this limit is met. Consecutive triggers in this period will block the client permanently.",[891,2053,2054,2057,2058,1323,2061,2064,2065,2071,2072],{},[895,2055,2056],{},"rate_limiters.apiTokensLimiters.generalUnionLimiter"," - A ",[895,2059,2060],{},"burstLimiter",[895,2062,2063],{},"slowLimiter"," ",[1316,2066,2070],{"href":2067,"rel":2068},"https:\u002F\u002Fgithub.com\u002Fanimir\u002Fnode-rate-limiter-flexible\u002Fwiki\u002FRateLimiterUnion",[2069],"nofollow","union limiter",". Enforces no more than one request per second, and only 50 per minute. No Consecutive triggers in this limiter, triggering it again will result in a permanent ban.",[888,2073,2074,2079],{},[891,2075,2076,2078],{},[895,2077,2060],{}," - Will block the client for 15 minutes.",[891,2080,2081,2083],{},[895,2082,2063],{}," - Will block for 1 hour.",[880,2085,2087],{"id":2086},"ip-restrictions-expiry","Ip restrictions & Expiry",[856,2089,2090,2091,2094,2095,2097,2098,2101,2102,2104],{},"Both ip restrictions and expiry are ",[1281,2092,2093],{},"optional",". To make a token live forever omit ",[895,2096,1214],{}," or provide ",[895,2099,2100],{},"null",", to allow a token to be used from any host omit ",[895,2103,1432],{},".",[856,2106,2107,2108,2111],{},"However prefix are required, and ",[895,2109,2110],{},"api"," will be used as a default if not provided.",[880,2113,2115],{"id":2114},"configuration-reference","Configuration Reference",[856,2117,2118,2119,2122,2123,2104],{},"All options live under ",[895,2120,2121],{},"apiTokens"," in the object passed to ",[895,2124,2125],{},"configuration()",[2127,2128,2129,2148],"table",{},[2130,2131,2132],"thead",{},[2133,2134,2135,2139,2142,2145],"tr",{},[2136,2137,2138],"th",{},"Option",[2136,2140,2141],{},"Type",[2136,2143,2144],{},"Default",[2136,2146,2147],{},"Description",[2149,2150,2151],"tbody",{},[2133,2152,2153,2159,2163,2168],{},[2154,2155,2156],"td",{},[895,2157,2158],{},"limitTokensPerUser",[2154,2160,2161],{},[895,2162,1968],{},[2154,2164,2165],{},[895,2166,2167],{},"20",[2154,2169,2170],{},"Allowed valid tokens the user can have at a time",[906,2172,2174],{"id":2173},"rate-limiters","Rate limiters",[2127,2176,2177,2186],{},[2130,2178,2179],{},[2133,2180,2181,2184],{},[2136,2182,2183],{},"Limiter",[2136,2185,2147],{},[2149,2187,2188,2197],{},[2133,2189,2190,2194],{},[2154,2191,2192],{},[895,2193,2050],{},[2154,2195,2196],{},"The main rate limiter for token creations",[2133,2198,2199,2203],{},[2154,2200,2201],{},[895,2202,2056],{},[2154,2204,2205],{},"General burst limiter",[906,2207,2209,2211],{"id":2208},"createapitoken-definition",[895,2210,897],{}," Definition",[911,2213,2215],{"className":913,"code":2214,"language":916,"meta":917,"style":917},"async function createApiKey(\n    userId: number, \n    privilegeType: 'demo' | 'restricted' | 'protected' | 'full' | 'custom',\n    name: string,\n    prefix: string = 'api',\n    expires?: number,\n    ipAddresses?: string[]\n): Promise\u003CResults\u003CCreationSuccess>>\n",[895,2216,2217,2230,2245,2297,2309,2328,2340,2352],{"__ignoreMap":917},[921,2218,2219,2222,2225,2227],{"class":923,"line":924},[921,2220,2221],{"class":964},"async",[921,2223,2224],{"class":964}," function",[921,2226,1045],{"class":1044},[921,2228,2229],{"class":931},"(\n",[921,2231,2232,2236,2238,2242],{"class":923,"line":955},[921,2233,2235],{"class":2234},"sygFZ","    userId",[921,2237,1378],{"class":972},[921,2239,2241],{"class":2240},"sFs1U"," number",[921,2243,2244],{"class":931},", \n",[921,2246,2247,2250,2252,2254,2256,2258,2261,2263,2266,2268,2270,2272,2275,2277,2279,2281,2284,2286,2288,2290,2293,2295],{"class":923,"line":961},[921,2248,2249],{"class":2234},"    privilegeType",[921,2251,1378],{"class":972},[921,2253,945],{"class":944},[921,2255,1059],{"class":948},[921,2257,1056],{"class":944},[921,2259,2260],{"class":972}," |",[921,2262,945],{"class":944},[921,2264,2265],{"class":948},"restricted",[921,2267,1056],{"class":944},[921,2269,2260],{"class":972},[921,2271,945],{"class":944},[921,2273,2274],{"class":948},"protected",[921,2276,1056],{"class":944},[921,2278,2260],{"class":972},[921,2280,945],{"class":944},[921,2282,2283],{"class":948},"full",[921,2285,1056],{"class":944},[921,2287,2260],{"class":972},[921,2289,945],{"class":944},[921,2291,2292],{"class":948},"custom",[921,2294,1056],{"class":944},[921,2296,1136],{"class":931},[921,2298,2299,2302,2304,2307],{"class":923,"line":997},[921,2300,2301],{"class":2234},"    name",[921,2303,1378],{"class":972},[921,2305,2306],{"class":2240}," string",[921,2308,1136],{"class":931},[921,2310,2311,2314,2316,2318,2320,2322,2324,2326],{"class":923,"line":1031},[921,2312,2313],{"class":2234},"    prefix",[921,2315,1378],{"class":972},[921,2317,2306],{"class":2240},[921,2319,973],{"class":972},[921,2321,945],{"class":944},[921,2323,2110],{"class":948},[921,2325,1056],{"class":944},[921,2327,1136],{"class":931},[921,2329,2330,2333,2336,2338],{"class":923,"line":1172},[921,2331,2332],{"class":2234},"    expires",[921,2334,2335],{"class":972},"?:",[921,2337,2241],{"class":2240},[921,2339,1136],{"class":931},[921,2341,2342,2345,2347,2349],{"class":923,"line":1180},[921,2343,2344],{"class":2234},"    ipAddresses",[921,2346,2335],{"class":972},[921,2348,2306],{"class":2240},[921,2350,2351],{"class":931},"[]\n",[921,2353,2354,2356,2358,2361,2364,2368,2370,2373],{"class":923,"line":1186},[921,2355,1296],{"class":931},[921,2357,1378],{"class":972},[921,2359,2360],{"class":2240}," Promise",[921,2362,2363],{"class":931},"\u003C",[921,2365,2367],{"class":2366},"sW-rI","Results",[921,2369,2363],{"class":931},[921,2371,2372],{"class":2366},"CreationSuccess",[921,2374,2375],{"class":931},">>\n",[2377,2378,2379],"style",{},"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 .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#F8F8F2}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}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 .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html pre.shiki code .sakC6, html code.shiki .sakC6{--shiki-light:#0000FF;--shiki-light-font-weight:inherit;--shiki-default:#0000FF;--shiki-default-font-weight:inherit;--shiki-dark:#FF79C6;--shiki-dark-font-weight:bold}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 .scd-l, html code.shiki .scd-l{--shiki-light:#800000;--shiki-default:#800000;--shiki-dark:#FF79C6}html pre.shiki code .sygFZ, html code.shiki .sygFZ{--shiki-light:#001080;--shiki-light-font-style:inherit;--shiki-default:#001080;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}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 .sW-rI, html code.shiki .sW-rI{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}",{"title":917,"searchDepth":955,"depth":955,"links":2381},[2382,2386,2387,2388],{"id":882,"depth":955,"text":883,"children":2383},[2384,2385],{"id":908,"depth":961,"text":909},{"id":1310,"depth":961,"text":1311},{"id":2039,"depth":955,"text":2040},{"id":2086,"depth":955,"text":2087},{"id":2114,"depth":955,"text":2115,"children":2389},[2390,2391],{"id":2173,"depth":961,"text":2174},{"id":2208,"depth":961,"text":2392},"createApiToken Definition","How to generate API tokens, configure prefixes, privileges, expiration, and IP restrictions.","md","i-lucide-key",{},null,"---\ntitle: Creating Tokens\ndescription: How to generate API tokens, configure prefixes, privileges, expiration, and IP restrictions.\nicon: i-lucide-key\n---\n\nBefore creating tokens, you need to decide on the privilege type associated with that token, prefix, name, how long it will be valid, and if you want to restrict the usage of it for a specific host.\nA mismatch in any of these values will cause the token to fail verification, and to perform sensitive actions associated with it.\n\nThe IAM scopes a privilege for a token and fails verification if the privilege doesn't match the one associated with a token.\n\nThat means your app(s) need to *know* what each privilege means to it, and how it affects its functionality. The IAM role is to create, store, verify it securely, and send to your app\u002Fclient the metadata about that token. Above that it doesn't have any understanding of what privilege means to your client.\n\n::caution\nDo not allow un trusted client to control the privilege value\n::\n\n---\n\n## Creating a token\n\nTwo ways to create a token:\n\n- If you use the service as a library you use `createApiToken`\n- If you run the service directly you call `POST \u002Fapi\u002Fmanage\u002Fnew-token` with a full authenticated session and the associated body.\n\n\n### Using the library\n\n```ts [example.ts]\nimport { createApiToken } from '@riavzon\u002Fauth'\n\nconst expires = 1000 * 60 * 60; \u002F\u002Fms\nconst ips = [\"1.1.1.1\", \"2.2.2.2\"]\nconst newCreatedToken = await createApiKey(userId, 'demo', 'mytoken', 'app', expires, ips);\n\n```\n\nThe above code will generate a token with a privilege of `demo` a name of `mytoken` with a prefix of `app`, that will be restricted \nto `\"1.1.1.1\"`, `\"2.2.2.2\"` ip addresses and will expire in 1 hour.\n\nIf succeeded the above will return: \n\n ```ts\n{\n    ok: true,\n    date: new Date().toISOString(),\n    data: {\n        rawApiKey,\n        rawPublicId,\n        expiresAt\n    }\n}\n ```\n- `rawApiKey` - The raw un hashed api key\n- `rawPublicId` - The public id\n- `expiresAt` - When the token will be expired\n\n::warning\n This is the only time the server and you would see the token, you should return it to the authenticate client immediately.\n After this point if the client looses it, it would need to generate a new one, or rotate it.\n::\n\n::note\n The prefix should not include a \"_\" character in its value, or the function will throw.\n::\n\n\nThe function will return: \n\n```ts\n{\n ok: false,\n date: new Date().toISOString(),\n reason: string\n}\n```\nIf the creation is failed, and **throw** only if the database failed to create a new token.\n\nPossible reasons are:\n\n- The user have reached the maximum allowed valid tokens he can have at a time (configured under `apiTokens.limitTokensPerUser`)\n- The character \"_\" is being used in the prefix\n- Database connection issues\n\n::caution\n Authentication is not checked inside this function. You should fully authenticate the session before allowing access to it in a route.\n::\n\n### Running the service\n\nTo create a token with the service, your client needs to be fully authenticated, with a valid [refresh token](\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens) a valid [access token](\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens) and a [`canary_id`](\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens) cookie.\nThe session also should not have any active [MFA](\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa) or [anomaly](\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies) associated with it.\n\nSend a `POST` request to `POST \u002Fapi\u002Fmanage\u002Fnew-token`{lang=\"http\"} with the following body:\n\n\n```json\n{\n    \"privilege\": \"demo\",\n    \"name\": \"mytoken\",\n    \"prefix\": \"app\",\n    \"ipv4\": [\"1.1.1.1\", \"2.2.2.2\"],\n    \"expires\": 3600000\n}\n```\nThis will generate a token with the same conventions as above, and return the following response:\n\n```http\nHTTP\u002F1.1 201 Created\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n  \"ok\": true,\n  \"date\": \"current date\",\n  \"data\": {\n        \"rawApiKey\": \"token\",\n        \"rawPublicId\": \"pubid\",\n         \"expiresAt\": \"expiry\"\n    }\n}\n```\n\n::warning\nSame applies as above, this is the only time the server and you would see the token, you should return it to the authenticate client immediately. After this point if the client looses it, it would need to generate a new one, or rotate it.\n::\n\n#### Possible failure\n\nIf the body is not valid or missing required values `400` will be returned:\n\n```http\nHTTP\u002F1.1 400 Bad request\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n  \"ok\": false,\n  \"date\": \"current date\",\n  \"reason\": \"Bad Request\"\n}\n```\n\nIf the body contains HTML:\n\n```http\nHTTP\u002F1.1 403 Bad request\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n \"banned\": true\n}\n```\n\nFor issues related to `createApiToken`:\n\n```http\nHTTP\u002F1.1 400 OR 500\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n  \"ok\": false,\n  \"date\": \"current date\",\n  \"reason\": \"reason from `createApiToken`\"\n}\n```\n\nRate Limits:\n\n```http\nHTTP\u002F1.1 429\nContent-Type: application\u002Fjson; charset=utf-8\nRetry-After: number\n{\n  \"error\": \"Too many requests\",\n  \"retry\": \"number\",\n}\n```\nThe route is behind a full authentication flow, each needs to succeeded before the token is created: \n\n - `requireAccessToken` Requires the access token header to be present\n - `requireRefreshToken` Requires the refresh token to be present\n - `getFingerPrint` Gets the finger prints for MFA\n - `checkForActiveMfa` MFA cache\n - `protectRoute` Enforces authentication, and perform the 9 mfa checks,\n - `contentType('application\u002Fjson')` Enforces `application\u002Fjson`,\n - `express.json` To limit the body size to 1kb\n - `apiTokensController` The creations happens here\n\nIf the client is not authenticate, cannot be found, have an active MFA the creation will fail, with the appropriate response.\n\n## Rate Limits\n\nThe endpoint also enforce rate limits controlled under the following configuration options:\n\n- `rate_limiters.apiTokensLimiters.operationRateLimits.newTokenCreationLimiter` - The main limiter for the new tokens creation endpoint. The default allows 5 creations in a window of 10 minutes and will trigger a block for 1 hour if this limit is met. Consecutive triggers in this period will block the client permanently.\n\n- `rate_limiters.apiTokensLimiters.generalUnionLimiter` - A `burstLimiter` and a `slowLimiter` [union limiter](https:\u002F\u002Fgithub.com\u002Fanimir\u002Fnode-rate-limiter-flexible\u002Fwiki\u002FRateLimiterUnion). Enforces no more than one request per second, and only 50 per minute. No Consecutive triggers in this limiter, triggering it again will result in a permanent ban.\n   - `burstLimiter` - Will block the client for 15 minutes.\n   - `slowLimiter` - Will block for 1 hour.\n\n\n## Ip restrictions & Expiry \n\nBoth ip restrictions and expiry are **optional**. To make a token live forever omit `expiresAt` or provide `null`, to allow a token to be used from any host omit `ipv4`.\n\nHowever prefix are required, and `api` will be used as a default if not provided.\n\n\n## Configuration Reference\n\nAll options live under `apiTokens` in the object passed to `configuration()`.\n\n| Option | Type | Default | Description |\n|---|---|---|---|\n| `limitTokensPerUser` | `number` | `20` | Allowed valid tokens the user can have at a time |\n\n### Rate limiters\n| Limiter | Description |\n|---|---|\n| `rate_limiters.apiTokensLimiters.operationRateLimits.newTokenCreationLimiter` | The main rate limiter for token creations |\n| `rate_limiters.apiTokensLimiters.generalUnionLimiter` | General burst limiter |\n\n\n### `createApiToken` Definition\n\n```ts\nasync function createApiKey(\n    userId: number, \n    privilegeType: 'demo' | 'restricted' | 'protected' | 'full' | 'custom',\n    name: string,\n    prefix: string = 'api',\n    expires?: number,\n    ipAddresses?: string[]\n): Promise\u003CResults\u003CCreationSuccess>>\n```",{"title":173,"description":2393},"XkhX-2eUhUfoYYsbsWaEViFo7p3dGgKsj8IxtH9xU-4",[2402,2403],{"title":167,"path":168,"stem":169,"children":-1},{"title":177,"path":178,"stem":179,"children":-1},{"id":851,"title":173,"body":2405,"description":2393,"extension":2394,"icon":2395,"meta":3606,"module":2397,"navigation":8,"path":174,"rawbody":2398,"seo":3607,"stem":175,"__hash__":2400},{"type":853,"value":2406,"toc":3594},[2407,2409,2411,2415,2419,2421,2423,2425,2435,2437,2561,2573,2575,2633,2647,2651,2655,2657,2697,2701,2703,2713,2717,2719,2733,2743,2849,2851,2987,2991,2993,2997,3081,3083,3131,3135,3219,3221,3295,3297,3333,3335,3337,3339,3366,3368,3378,3382,3384,3390,3422,3424,3452,3456,3592],[856,2408,858],{},[856,2410,861],{},[856,2412,864,2413,869],{},[866,2414,868],{},[871,2416,2417],{},[856,2418,875],{},[877,2420],{},[880,2422,883],{"id":882},[856,2424,886],{},[888,2426,2427,2431],{},[891,2428,893,2429],{},[895,2430,897],{},[891,2432,900,2433,904],{},[895,2434,903],{},[906,2436,909],{"id":908},[911,2438,2439],{"className":913,"code":914,"filename":915,"language":916,"meta":917,"style":917},[895,2440,2441,2459,2463,2485,2511],{"__ignoreMap":917},[921,2442,2443,2445,2447,2449,2451,2453,2455,2457],{"class":923,"line":924},[921,2444,928],{"class":927},[921,2446,932],{"class":931},[921,2448,897],{"class":935},[921,2450,938],{"class":931},[921,2452,941],{"class":927},[921,2454,945],{"class":944},[921,2456,949],{"class":948},[921,2458,952],{"class":944},[921,2460,2461],{"class":923,"line":955},[921,2462,958],{"emptyLinePlaceholder":8},[921,2464,2465,2467,2469,2471,2473,2475,2477,2479,2481,2483],{"class":923,"line":961},[921,2466,965],{"class":964},[921,2468,969],{"class":968},[921,2470,973],{"class":972},[921,2472,977],{"class":976},[921,2474,980],{"class":972},[921,2476,983],{"class":976},[921,2478,980],{"class":972},[921,2480,983],{"class":976},[921,2482,990],{"class":931},[921,2484,994],{"class":993},[921,2486,2487,2489,2491,2493,2495,2497,2499,2501,2503,2505,2507,2509],{"class":923,"line":997},[921,2488,965],{"class":964},[921,2490,1002],{"class":968},[921,2492,973],{"class":972},[921,2494,1007],{"class":931},[921,2496,1010],{"class":944},[921,2498,1013],{"class":948},[921,2500,1010],{"class":944},[921,2502,1018],{"class":931},[921,2504,1010],{"class":944},[921,2506,1023],{"class":948},[921,2508,1010],{"class":944},[921,2510,1028],{"class":931},[921,2512,2513,2515,2517,2519,2521,2523,2525,2527,2529,2531,2533,2535,2537,2539,2541,2543,2545,2547,2549,2551,2553,2555,2557,2559],{"class":923,"line":1031},[921,2514,965],{"class":964},[921,2516,1036],{"class":968},[921,2518,973],{"class":972},[921,2520,1041],{"class":927},[921,2522,1045],{"class":1044},[921,2524,1048],{"class":931},[921,2526,1051],{"class":935},[921,2528,1018],{"class":931},[921,2530,1056],{"class":944},[921,2532,1059],{"class":948},[921,2534,1056],{"class":944},[921,2536,1018],{"class":931},[921,2538,1056],{"class":944},[921,2540,1068],{"class":948},[921,2542,1056],{"class":944},[921,2544,1018],{"class":931},[921,2546,1056],{"class":944},[921,2548,1077],{"class":948},[921,2550,1056],{"class":944},[921,2552,1018],{"class":931},[921,2554,1084],{"class":935},[921,2556,1018],{"class":931},[921,2558,1089],{"class":935},[921,2560,1092],{"class":931},[856,2562,1095,2563,1098,2565,1101,2567,1104,2569,1018,2571,1111],{},[895,2564,1059],{},[895,2566,1068],{},[895,2568,1077],{},[895,2570,1107],{},[895,2572,1110],{},[856,2574,1114],{},[911,2576,2577],{"className":913,"code":1117,"language":916,"meta":917,"style":917},[895,2578,2579,2583,2591,2605,2609,2615,2621,2625,2629],{"__ignoreMap":917},[921,2580,2581],{"class":923,"line":924},[921,2582,1124],{"class":931},[921,2584,2585,2587,2589],{"class":923,"line":955},[921,2586,1129],{"class":931},[921,2588,1133],{"class":1132},[921,2590,1136],{"class":931},[921,2592,2593,2595,2597,2599,2601,2603],{"class":923,"line":961},[921,2594,1141],{"class":931},[921,2596,1145],{"class":1144},[921,2598,1148],{"class":1044},[921,2600,1151],{"class":931},[921,2602,1154],{"class":1044},[921,2604,1157],{"class":931},[921,2606,2607],{"class":923,"line":997},[921,2608,1162],{"class":931},[921,2610,2611,2613],{"class":923,"line":1031},[921,2612,1167],{"class":935},[921,2614,1136],{"class":931},[921,2616,2617,2619],{"class":923,"line":1172},[921,2618,1175],{"class":935},[921,2620,1136],{"class":931},[921,2622,2623],{"class":923,"line":1180},[921,2624,1183],{"class":935},[921,2626,2627],{"class":923,"line":1186},[921,2628,1189],{"class":931},[921,2630,2631],{"class":923,"line":1192},[921,2632,1195],{"class":931},[888,2634,2635,2639,2643],{},[891,2636,2637,1203],{},[895,2638,1202],{},[891,2640,2641,1209],{},[895,2642,1208],{},[891,2644,2645,1215],{},[895,2646,1214],{},[1217,2648,2649],{},[856,2650,1221],{},[1223,2652,2653],{},[856,2654,1227],{},[856,2656,1230],{},[911,2658,2659],{"className":913,"code":1233,"language":916,"meta":917,"style":917},[895,2660,2661,2665,2673,2687,2693],{"__ignoreMap":917},[921,2662,2663],{"class":923,"line":924},[921,2664,1124],{"class":931},[921,2666,2667,2669,2671],{"class":923,"line":955},[921,2668,1244],{"class":931},[921,2670,1247],{"class":1132},[921,2672,1136],{"class":931},[921,2674,2675,2677,2679,2681,2683,2685],{"class":923,"line":961},[921,2676,1254],{"class":931},[921,2678,1145],{"class":1144},[921,2680,1148],{"class":1044},[921,2682,1151],{"class":931},[921,2684,1154],{"class":1044},[921,2686,1157],{"class":931},[921,2688,2689,2691],{"class":923,"line":997},[921,2690,1269],{"class":931},[921,2692,1272],{"class":935},[921,2694,2695],{"class":923,"line":1031},[921,2696,1195],{"class":931},[856,2698,1279,2699,1284],{},[1281,2700,1283],{},[856,2702,1287],{},[888,2704,2705,2709,2711],{},[891,2706,1292,2707,1296],{},[895,2708,1295],{},[891,2710,1299],{},[891,2712,1302],{},[871,2714,2715],{},[856,2716,1307],{},[906,2718,1311],{"id":1310},[856,2720,1314,2721,1319,2723,1323,2725,1329,2729,1332,2731,1336],{},[1316,2722,1318],{"href":92},[1316,2724,1322],{"href":88},[1316,2726,2727],{"href":84},[895,2728,1328],{},[1316,2730,123],{"href":124},[1316,2732,1335],{"href":96},[856,2734,1339,2735,1343,2737,1353],{},[895,2736,1342],{},[895,2738,2739,2741],{"className":1346,"language":1347,"style":917},[921,2740,1342],{"class":927},[921,2742,1352],{"class":931},[911,2744,2745],{"className":1356,"code":1357,"language":5,"meta":917,"style":917},[895,2746,2747,2751,2769,2787,2805,2833,2845],{"__ignoreMap":917},[921,2748,2749],{"class":923,"line":924},[921,2750,1124],{"class":931},[921,2752,2753,2755,2757,2759,2761,2763,2765,2767],{"class":923,"line":955},[921,2754,1369],{"class":1368},[921,2756,1373],{"class":1372},[921,2758,1010],{"class":1368},[921,2760,1378],{"class":972},[921,2762,1381],{"class":944},[921,2764,1059],{"class":948},[921,2766,1010],{"class":944},[921,2768,1136],{"class":931},[921,2770,2771,2773,2775,2777,2779,2781,2783,2785],{"class":923,"line":961},[921,2772,1369],{"class":1368},[921,2774,1394],{"class":1372},[921,2776,1010],{"class":1368},[921,2778,1378],{"class":972},[921,2780,1381],{"class":944},[921,2782,1068],{"class":948},[921,2784,1010],{"class":944},[921,2786,1136],{"class":931},[921,2788,2789,2791,2793,2795,2797,2799,2801,2803],{"class":923,"line":997},[921,2790,1369],{"class":1368},[921,2792,1413],{"class":1372},[921,2794,1010],{"class":1368},[921,2796,1378],{"class":972},[921,2798,1381],{"class":944},[921,2800,1077],{"class":948},[921,2802,1010],{"class":944},[921,2804,1136],{"class":931},[921,2806,2807,2809,2811,2813,2815,2817,2819,2821,2823,2825,2827,2829,2831],{"class":923,"line":1031},[921,2808,1369],{"class":1368},[921,2810,1432],{"class":1372},[921,2812,1010],{"class":1368},[921,2814,1378],{"class":972},[921,2816,1007],{"class":931},[921,2818,1010],{"class":944},[921,2820,1013],{"class":948},[921,2822,1010],{"class":944},[921,2824,1018],{"class":931},[921,2826,1010],{"class":944},[921,2828,1023],{"class":948},[921,2830,1010],{"class":944},[921,2832,1455],{"class":931},[921,2834,2835,2837,2839,2841,2843],{"class":923,"line":1172},[921,2836,1369],{"class":1368},[921,2838,1084],{"class":1372},[921,2840,1010],{"class":1368},[921,2842,1378],{"class":972},[921,2844,1468],{"class":976},[921,2846,2847],{"class":923,"line":1180},[921,2848,1195],{"class":931},[856,2850,1475],{},[911,2852,2853],{"className":1346,"code":1478,"language":1347,"meta":917,"style":917},[895,2854,2855,2867,2875,2879,2883,2897,2915,2927,2945,2963,2979,2983],{"__ignoreMap":917},[921,2856,2857,2859,2861,2863,2865],{"class":923,"line":924},[921,2858,1485],{"class":964},[921,2860,1488],{"class":931},[921,2862,1491],{"class":976},[921,2864,1494],{"class":976},[921,2866,1497],{"class":948},[921,2868,2869,2871,2873],{"class":923,"line":955},[921,2870,1503],{"class":1502},[921,2872,1378],{"class":964},[921,2874,1508],{"class":948},[921,2876,2877],{"class":923,"line":961},[921,2878,958],{"emptyLinePlaceholder":8},[921,2880,2881],{"class":923,"line":997},[921,2882,1124],{"class":931},[921,2884,2885,2887,2889,2891,2893,2895],{"class":923,"line":1031},[921,2886,1521],{"class":1368},[921,2888,1524],{"class":1372},[921,2890,1010],{"class":1368},[921,2892,1378],{"class":972},[921,2894,1531],{"class":1132},[921,2896,1136],{"class":931},[921,2898,2899,2901,2903,2905,2907,2909,2911,2913],{"class":923,"line":1172},[921,2900,1521],{"class":1368},[921,2902,1540],{"class":1372},[921,2904,1010],{"class":1368},[921,2906,1378],{"class":972},[921,2908,1381],{"class":944},[921,2910,1549],{"class":948},[921,2912,1010],{"class":944},[921,2914,1136],{"class":931},[921,2916,2917,2919,2921,2923,2925],{"class":923,"line":1180},[921,2918,1521],{"class":1368},[921,2920,1560],{"class":1372},[921,2922,1010],{"class":1368},[921,2924,1378],{"class":972},[921,2926,1567],{"class":931},[921,2928,2929,2931,2933,2935,2937,2939,2941,2943],{"class":923,"line":1186},[921,2930,1572],{"class":1368},[921,2932,1202],{"class":1372},[921,2934,1010],{"class":1368},[921,2936,1378],{"class":972},[921,2938,1381],{"class":944},[921,2940,1583],{"class":948},[921,2942,1010],{"class":944},[921,2944,1136],{"class":931},[921,2946,2947,2949,2951,2953,2955,2957,2959,2961],{"class":923,"line":1192},[921,2948,1572],{"class":1368},[921,2950,1208],{"class":1372},[921,2952,1010],{"class":1368},[921,2954,1378],{"class":972},[921,2956,1381],{"class":944},[921,2958,1602],{"class":948},[921,2960,1010],{"class":944},[921,2962,1136],{"class":931},[921,2964,2965,2967,2969,2971,2973,2975,2977],{"class":923,"line":1609},[921,2966,1612],{"class":1368},[921,2968,1214],{"class":1372},[921,2970,1010],{"class":1368},[921,2972,1378],{"class":972},[921,2974,1381],{"class":944},[921,2976,1623],{"class":948},[921,2978,1626],{"class":944},[921,2980,2981],{"class":923,"line":1629},[921,2982,1632],{"class":931},[921,2984,2985],{"class":923,"line":1635},[921,2986,1195],{"class":931},[1217,2988,2989],{},[856,2990,1642],{},[1644,2992,1647],{"id":1646},[856,2994,1650,2995,1654],{},[895,2996,1653],{},[911,2998,2999],{"className":1346,"code":1657,"language":1347,"meta":917,"style":917},[895,3000,3001,3013,3021,3025,3029,3043,3061,3077],{"__ignoreMap":917},[921,3002,3003,3005,3007,3009,3011],{"class":923,"line":924},[921,3004,1485],{"class":964},[921,3006,1488],{"class":931},[921,3008,1491],{"class":976},[921,3010,1670],{"class":976},[921,3012,1673],{"class":948},[921,3014,3015,3017,3019],{"class":923,"line":955},[921,3016,1503],{"class":1502},[921,3018,1378],{"class":964},[921,3020,1508],{"class":948},[921,3022,3023],{"class":923,"line":961},[921,3024,958],{"emptyLinePlaceholder":8},[921,3026,3027],{"class":923,"line":997},[921,3028,1124],{"class":931},[921,3030,3031,3033,3035,3037,3039,3041],{"class":923,"line":1031},[921,3032,1521],{"class":1368},[921,3034,1524],{"class":1372},[921,3036,1010],{"class":1368},[921,3038,1378],{"class":972},[921,3040,1702],{"class":1132},[921,3042,1136],{"class":931},[921,3044,3045,3047,3049,3051,3053,3055,3057,3059],{"class":923,"line":1172},[921,3046,1521],{"class":1368},[921,3048,1540],{"class":1372},[921,3050,1010],{"class":1368},[921,3052,1378],{"class":972},[921,3054,1381],{"class":944},[921,3056,1549],{"class":948},[921,3058,1010],{"class":944},[921,3060,1136],{"class":931},[921,3062,3063,3065,3067,3069,3071,3073,3075],{"class":923,"line":1180},[921,3064,1521],{"class":1368},[921,3066,1729],{"class":1372},[921,3068,1010],{"class":1368},[921,3070,1378],{"class":972},[921,3072,1381],{"class":944},[921,3074,1738],{"class":948},[921,3076,1626],{"class":944},[921,3078,3079],{"class":923,"line":1186},[921,3080,1195],{"class":931},[856,3082,1747],{},[911,3084,3085],{"className":1346,"code":1750,"language":1347,"meta":917,"style":917},[895,3086,3087,3099,3107,3111,3115,3127],{"__ignoreMap":917},[921,3088,3089,3091,3093,3095,3097],{"class":923,"line":924},[921,3090,1485],{"class":964},[921,3092,1488],{"class":931},[921,3094,1491],{"class":976},[921,3096,1763],{"class":976},[921,3098,1673],{"class":948},[921,3100,3101,3103,3105],{"class":923,"line":955},[921,3102,1503],{"class":1502},[921,3104,1378],{"class":964},[921,3106,1508],{"class":948},[921,3108,3109],{"class":923,"line":961},[921,3110,958],{"emptyLinePlaceholder":8},[921,3112,3113],{"class":923,"line":997},[921,3114,1124],{"class":931},[921,3116,3117,3119,3121,3123,3125],{"class":923,"line":1031},[921,3118,1381],{"class":1368},[921,3120,1788],{"class":1372},[921,3122,1010],{"class":1368},[921,3124,1378],{"class":972},[921,3126,1795],{"class":1132},[921,3128,3129],{"class":923,"line":1172},[921,3130,1195],{"class":931},[856,3132,1802,3133,1378],{},[895,3134,897],{},[911,3136,3137],{"className":1346,"code":1807,"language":1347,"meta":917,"style":917},[895,3138,3139,3151,3159,3163,3167,3181,3199,3215],{"__ignoreMap":917},[921,3140,3141,3143,3145,3147,3149],{"class":923,"line":924},[921,3142,1485],{"class":964},[921,3144,1488],{"class":931},[921,3146,1491],{"class":976},[921,3148,1670],{"class":976},[921,3150,1822],{"class":948},[921,3152,3153,3155,3157],{"class":923,"line":955},[921,3154,1503],{"class":1502},[921,3156,1378],{"class":964},[921,3158,1508],{"class":948},[921,3160,3161],{"class":923,"line":961},[921,3162,958],{"emptyLinePlaceholder":8},[921,3164,3165],{"class":923,"line":997},[921,3166,1124],{"class":931},[921,3168,3169,3171,3173,3175,3177,3179],{"class":923,"line":1031},[921,3170,1521],{"class":1368},[921,3172,1524],{"class":1372},[921,3174,1010],{"class":1368},[921,3176,1378],{"class":972},[921,3178,1702],{"class":1132},[921,3180,1136],{"class":931},[921,3182,3183,3185,3187,3189,3191,3193,3195,3197],{"class":923,"line":1172},[921,3184,1521],{"class":1368},[921,3186,1540],{"class":1372},[921,3188,1010],{"class":1368},[921,3190,1378],{"class":972},[921,3192,1381],{"class":944},[921,3194,1549],{"class":948},[921,3196,1010],{"class":944},[921,3198,1136],{"class":931},[921,3200,3201,3203,3205,3207,3209,3211,3213],{"class":923,"line":1180},[921,3202,1521],{"class":1368},[921,3204,1729],{"class":1372},[921,3206,1010],{"class":1368},[921,3208,1378],{"class":972},[921,3210,1381],{"class":944},[921,3212,1885],{"class":948},[921,3214,1626],{"class":944},[921,3216,3217],{"class":923,"line":1186},[921,3218,1195],{"class":931},[856,3220,1894],{},[911,3222,3223],{"className":1346,"code":1897,"language":1347,"meta":917,"style":917},[895,3224,3225,3235,3243,3251,3255,3273,3291],{"__ignoreMap":917},[921,3226,3227,3229,3231,3233],{"class":923,"line":924},[921,3228,1485],{"class":964},[921,3230,1488],{"class":931},[921,3232,1491],{"class":976},[921,3234,1910],{"class":976},[921,3236,3237,3239,3241],{"class":923,"line":955},[921,3238,1503],{"class":1502},[921,3240,1378],{"class":964},[921,3242,1508],{"class":948},[921,3244,3245,3247,3249],{"class":923,"line":961},[921,3246,1923],{"class":1502},[921,3248,1378],{"class":964},[921,3250,1928],{"class":948},[921,3252,3253],{"class":923,"line":997},[921,3254,1124],{"class":931},[921,3256,3257,3259,3261,3263,3265,3267,3269,3271],{"class":923,"line":1031},[921,3258,1521],{"class":1368},[921,3260,1939],{"class":1372},[921,3262,1010],{"class":1368},[921,3264,1378],{"class":972},[921,3266,1381],{"class":944},[921,3268,1948],{"class":948},[921,3270,1010],{"class":944},[921,3272,1136],{"class":931},[921,3274,3275,3277,3279,3281,3283,3285,3287,3289],{"class":923,"line":1172},[921,3276,1521],{"class":1368},[921,3278,1959],{"class":1372},[921,3280,1010],{"class":1368},[921,3282,1378],{"class":972},[921,3284,1381],{"class":944},[921,3286,1968],{"class":948},[921,3288,1010],{"class":944},[921,3290,1136],{"class":931},[921,3292,3293],{"class":923,"line":1180},[921,3294,1195],{"class":931},[856,3296,1979],{},[888,3298,3299,3303,3307,3311,3315,3319,3325,3329],{},[891,3300,3301,1987],{},[895,3302,1986],{},[891,3304,3305,1993],{},[895,3306,1992],{},[891,3308,3309,1999],{},[895,3310,1998],{},[891,3312,3313,2005],{},[895,3314,2004],{},[891,3316,3317,2011],{},[895,3318,2010],{},[891,3320,3321,2017,3323,2021],{},[895,3322,2016],{},[895,3324,2020],{},[891,3326,3327,2027],{},[895,3328,2026],{},[891,3330,3331,2033],{},[895,3332,2032],{},[856,3334,2036],{},[880,3336,2040],{"id":2039},[856,3338,2043],{},[888,3340,3341,3345],{},[891,3342,3343,2051],{},[895,3344,2050],{},[891,3346,3347,2057,3349,1323,3351,2064,3353,2071,3356],{},[895,3348,2056],{},[895,3350,2060],{},[895,3352,2063],{},[1316,3354,2070],{"href":2067,"rel":3355},[2069],[888,3357,3358,3362],{},[891,3359,3360,2078],{},[895,3361,2060],{},[891,3363,3364,2083],{},[895,3365,2063],{},[880,3367,2087],{"id":2086},[856,3369,2090,3370,2094,3372,2097,3374,2101,3376,2104],{},[1281,3371,2093],{},[895,3373,1214],{},[895,3375,2100],{},[895,3377,1432],{},[856,3379,2107,3380,2111],{},[895,3381,2110],{},[880,3383,2115],{"id":2114},[856,3385,2118,3386,2122,3388,2104],{},[895,3387,2121],{},[895,3389,2125],{},[2127,3391,3392,3404],{},[2130,3393,3394],{},[2133,3395,3396,3398,3400,3402],{},[2136,3397,2138],{},[2136,3399,2141],{},[2136,3401,2144],{},[2136,3403,2147],{},[2149,3405,3406],{},[2133,3407,3408,3412,3416,3420],{},[2154,3409,3410],{},[895,3411,2158],{},[2154,3413,3414],{},[895,3415,1968],{},[2154,3417,3418],{},[895,3419,2167],{},[2154,3421,2170],{},[906,3423,2174],{"id":2173},[2127,3425,3426,3434],{},[2130,3427,3428],{},[2133,3429,3430,3432],{},[2136,3431,2183],{},[2136,3433,2147],{},[2149,3435,3436,3444],{},[2133,3437,3438,3442],{},[2154,3439,3440],{},[895,3441,2050],{},[2154,3443,2196],{},[2133,3445,3446,3450],{},[2154,3447,3448],{},[895,3449,2056],{},[2154,3451,2205],{},[906,3453,3454,2211],{"id":2208},[895,3455,897],{},[911,3457,3458],{"className":913,"code":2214,"language":916,"meta":917,"style":917},[895,3459,3460,3470,3480,3526,3536,3554,3564,3574],{"__ignoreMap":917},[921,3461,3462,3464,3466,3468],{"class":923,"line":924},[921,3463,2221],{"class":964},[921,3465,2224],{"class":964},[921,3467,1045],{"class":1044},[921,3469,2229],{"class":931},[921,3471,3472,3474,3476,3478],{"class":923,"line":955},[921,3473,2235],{"class":2234},[921,3475,1378],{"class":972},[921,3477,2241],{"class":2240},[921,3479,2244],{"class":931},[921,3481,3482,3484,3486,3488,3490,3492,3494,3496,3498,3500,3502,3504,3506,3508,3510,3512,3514,3516,3518,3520,3522,3524],{"class":923,"line":961},[921,3483,2249],{"class":2234},[921,3485,1378],{"class":972},[921,3487,945],{"class":944},[921,3489,1059],{"class":948},[921,3491,1056],{"class":944},[921,3493,2260],{"class":972},[921,3495,945],{"class":944},[921,3497,2265],{"class":948},[921,3499,1056],{"class":944},[921,3501,2260],{"class":972},[921,3503,945],{"class":944},[921,3505,2274],{"class":948},[921,3507,1056],{"class":944},[921,3509,2260],{"class":972},[921,3511,945],{"class":944},[921,3513,2283],{"class":948},[921,3515,1056],{"class":944},[921,3517,2260],{"class":972},[921,3519,945],{"class":944},[921,3521,2292],{"class":948},[921,3523,1056],{"class":944},[921,3525,1136],{"class":931},[921,3527,3528,3530,3532,3534],{"class":923,"line":997},[921,3529,2301],{"class":2234},[921,3531,1378],{"class":972},[921,3533,2306],{"class":2240},[921,3535,1136],{"class":931},[921,3537,3538,3540,3542,3544,3546,3548,3550,3552],{"class":923,"line":1031},[921,3539,2313],{"class":2234},[921,3541,1378],{"class":972},[921,3543,2306],{"class":2240},[921,3545,973],{"class":972},[921,3547,945],{"class":944},[921,3549,2110],{"class":948},[921,3551,1056],{"class":944},[921,3553,1136],{"class":931},[921,3555,3556,3558,3560,3562],{"class":923,"line":1172},[921,3557,2332],{"class":2234},[921,3559,2335],{"class":972},[921,3561,2241],{"class":2240},[921,3563,1136],{"class":931},[921,3565,3566,3568,3570,3572],{"class":923,"line":1180},[921,3567,2344],{"class":2234},[921,3569,2335],{"class":972},[921,3571,2306],{"class":2240},[921,3573,2351],{"class":931},[921,3575,3576,3578,3580,3582,3584,3586,3588,3590],{"class":923,"line":1186},[921,3577,1296],{"class":931},[921,3579,1378],{"class":972},[921,3581,2360],{"class":2240},[921,3583,2363],{"class":931},[921,3585,2367],{"class":2366},[921,3587,2363],{"class":931},[921,3589,2372],{"class":2366},[921,3591,2375],{"class":931},[2377,3593,2379],{},{"title":917,"searchDepth":955,"depth":955,"links":3595},[3596,3600,3601,3602],{"id":882,"depth":955,"text":883,"children":3597},[3598,3599],{"id":908,"depth":961,"text":909},{"id":1310,"depth":961,"text":1311},{"id":2039,"depth":955,"text":2040},{"id":2086,"depth":955,"text":2087},{"id":2114,"depth":955,"text":2115,"children":3603},[3604,3605],{"id":2173,"depth":961,"text":2174},{"id":2208,"depth":961,"text":2392},{},{"title":173,"description":2393},1780436285225]