Files
nexus/sreweekly/articles/149/07-progressive-service-architecture-at-auth0.html
2026-09-12 17:23:01 +08:00

975 lines
294 KiB
HTML

<!DOCTYPE html><html lang="en"><head><link rel="stylesheet" href="https://cdn.auth0.com/styleguide/core/3.0.0/core.min.css"/><script class="optanon-category-4" type="text/plain">window.twttr=function(t,e,r){var n,i=t.getElementsByTagName(e)[0],w=window.twttr||{};return t.getElementById(r)?w:((n=t.createElement(e)).id=r,n.src="https://platform.twitter.com/widgets.js",i.parentNode.insertBefore(n,i),w._e=[],w.ready=function(t){w._e.push(t)},w)}(document,"script","twitter-wjs");</script><script defer="" src="https://assets.adobedtm.com/6bb3f7663515/7006851c9849/launch-af624fe9e34f.min.js"></script><script class="optanon-category-4" type="text/plain">
window._6si = window._6si || [];
window._6si.push(['enableEventTracking', true]);
window._6si.push(['setToken', '17aa5119e1d44eeab301f44113230d69']);
window._6si.push(['setEndpoint', 'b.6sc.co']);
(function() {
var gd = document.createElement('script');
gd.type = 'text/javascript';
gd.async = true;
gd.src = '//j.6sc.co/6si.min.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(gd, s);
})();</script><link rel="preload" href="/blog/api/ab/" as="fetch" crossorigin="use-credentials"/><link rel="canonical" href="https://auth0.com/blog/progressive-service-architecture-at-auth0/"/><title>Progressive Service Architecture Eng. and Feature Flags at Auth0</title><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0"/><meta charSet="utf-8"/><meta name="description" content="Learn how to create a mature service architecture for scalability and high availability by building its topology progressively. See a deep dive into Auth0&#x27;s feature flags and progressive services."/><meta property="fb:app_id" content="534074790006350"/><meta property="og:type" content="article"/><meta property="og:title" content="Progressive Service Architecture Eng. and Feature Flags at Auth0"/><meta property="og:site_name" content="Auth0 - Blog"/><meta property="og:description" content="Learn how to create a mature service architecture for scalability and high availability by building its topology progressively. See a dee..."/><meta property="og:image" content="https://images.ctfassets.net/23aumh6u8s0i/56S9oDWKVeNY8AIszkZvw1/7d6794f3d31d4eedb5a3d3699e796e5c/default"/><meta property="og:url" content="https://auth0.com/blog/progressive-service-architecture-at-auth0/"/><meta name="twitter:site" content="@auth0"/><meta name="twitter:creator" content="@auth0"/><meta name="twitter:title" content="Progressive Service Architecture Eng. and Feature Flags at Auth0"/><meta name="twitter:description" content="Learn how to create a mature service architecture for scalability and high availability by building its topology progressively. See a deep dive into Auth0&#x27;s feature flags and progressive services."/><meta name="twitter:url" content="https://auth0.com/blog/progressive-service-architecture-at-auth0/"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:image" content="https://images.ctfassets.net/23aumh6u8s0i/56S9oDWKVeNY8AIszkZvw1/7d6794f3d31d4eedb5a3d3699e796e5c/default"/><meta name="twitter:image:height" content="512"/><meta name="twitter:image:width" content="1024"/><meta name="HandheldFriendly" content="True"/><meta name="MobileOptimized" content="320"/><link rel="manifest" href="https://auth0.com/blog/manifest.json"/><link type="application/atom+xml" rel="alternate" href="https://auth0.com/blog/rss.xml" title="Auth0 Blog"/><link type="application/opensearchdescription+xml" rel="search" href="https://auth0.com/blog/osd.xml"/><link rel="alternate" type="text/markdown" href="/blog/progressive-service-architecture-at-auth0.md" title="Progressive Service Architecture At Auth0 (Markdown)"/><meta name="next-head-count" content="32"/><link rel="shortcut icon mask-icon" type="image/svg+xml" href="https://cdn.auth0.com/website/website/favicons/auth0-favicon.svg"/><link rel="shortcut icon" type="image/svg+xml" href="https://cdn.auth0.com/website/website/favicons/auth0-favicon.svg"/><link rel="shortcut icon" type="image/png" href="https://cdn.auth0.com/website/website/favicons/auth0-favicon-48.png"/><link rel="icon" sizes="16x16" type="image/png" href="https://cdn.auth0.com/website/website/favicons/auth0-favicon-16.png"/><link rel="icon" sizes="32x32" type="image/png" href="https://cdn.auth0.com/website/website/favicons/auth0-favicon-32.png"/><link rel="icon" sizes="48x48" type="image/png" href="https://cdn.auth0.com/website/website/favicons/auth0-favicon-48.png"/><link rel="icon" sizes="96x96" type="image/png" href="https://cdn.auth0.com/website/website/favicons/auth0-favicon-96.png"/><link rel="icon" sizes="144x144" type="image/png" href="https://cdn.auth0.com/website/website/favicons/auth0-favicon-144.png"/><link rel="apple-touch-icon" sizes="180x180" href="https://cdn.auth0.com/website/website/favicons/auth0-favicon-180.png"/><script id="blogposting-jsonld" type="application/ld+json" data-nscript="beforeInteractive">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://auth0.com/#organization","url":"https://auth0.com","name":"Auth0","logo":{"@type":"ImageObject","url":"https://cdn.auth0.com/website/home-page/evolution_logo_Auth0_black.svg","width":250,"height":60}},{"@type":"Blog","@id":"https://auth0.com/blog","url":"https://auth0.com/blog","name":"Blog","description":"Auth0 Blog","publisher":{"@id":"https://auth0.com/#organization"}},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://auth0.com"},{"@type":"ListItem","position":2,"name":"Blog","item":"https://auth0.com/blog/"},{"@type":"ListItem","position":3,"name":"Progressive Service Architecture At Auth0","item":"https://auth0.com/blog/progressive-service-architecture-at-auth0/"}]},{"@type":"BlogPosting","headline":"Progressive Service Architecture At Auth0","description":"Learn how to build a mature service architecture for high availability by creating its topology progressively.","image":{"@type":"ImageObject","url":"https://images.ctfassets.net/23aumh6u8s0i/56S9oDWKVeNY8AIszkZvw1/7d6794f3d31d4eedb5a3d3699e796e5c/default","width":1200,"height":630},"thumbnailUrl":"https://images.ctfassets.net/23aumh6u8s0i/56S9oDWKVeNY8AIszkZvw1/7d6794f3d31d4eedb5a3d3699e796e5c/default","author":[{"@type":"Person","@id":"https://auth0.com/blog/authors/dan-arias/","url":"https://auth0.com/blog/authors/dan-arias/","name":"Dan Arias","image":{"@type":"ImageObject","url":"https://images.ctfassets.net/23aumh6u8s0i/6WmRCtZz0eDp6KE7pw8cJ3/7329ebb6302316cab8f55705100abab5/37590801_s_460_v_4","width":298,"height":298}}],"datePublished":"2018-11-14T11:27","dateModified":"2018-11-14T11:27","publisher":{"@id":"https://auth0.com/#organization"},"mainEntityOfPage":{"@type":"WebPage","@id":"https://auth0.com/blog/progressive-service-architecture-at-auth0/"},"isPartOf":{"@id":"https://auth0.com/blog"},"url":"https://auth0.com/blog/progressive-service-architecture-at-auth0/","inLanguage":"en-US","wordCount":3042}]}</script><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/blog/_next/static/chunks/polyfills-42372ed130431b0a.js?dpl=dpl_4eLuLZa3zjDUG91awT2RHuU39Tdg"></script><script src="/blog/_next/static/chunks/webpack-06480556beda951b.js?dpl=dpl_4eLuLZa3zjDUG91awT2RHuU39Tdg" defer=""></script><script src="/blog/_next/static/chunks/framework-b60356c5de8aef10.js?dpl=dpl_4eLuLZa3zjDUG91awT2RHuU39Tdg" defer=""></script><script src="/blog/_next/static/chunks/main-91fd171b59dc213f.js?dpl=dpl_4eLuLZa3zjDUG91awT2RHuU39Tdg" defer=""></script><script src="/blog/_next/static/chunks/pages/_app-be4335b045bf72f8.js?dpl=dpl_4eLuLZa3zjDUG91awT2RHuU39Tdg" defer=""></script><script src="/blog/_next/static/chunks/d81dd7c5-6b7f1fa4d5ce2748.js?dpl=dpl_4eLuLZa3zjDUG91awT2RHuU39Tdg" defer=""></script><script src="/blog/_next/static/chunks/9236dd9e-924d9d8ba2b8b09f.js?dpl=dpl_4eLuLZa3zjDUG91awT2RHuU39Tdg" defer=""></script><script src="/blog/_next/static/chunks/3871-f26bb5a3584faece.js?dpl=dpl_4eLuLZa3zjDUG91awT2RHuU39Tdg" defer=""></script><script src="/blog/_next/static/chunks/2623-6e313dc807342ce8.js?dpl=dpl_4eLuLZa3zjDUG91awT2RHuU39Tdg" defer=""></script><script src="/blog/_next/static/chunks/pages/blog/%5Bslug%5D-b7a01b8045423d3d.js?dpl=dpl_4eLuLZa3zjDUG91awT2RHuU39Tdg" defer=""></script><script src="/blog/_next/static/naQFbCp8zGZYbeqX1B0dN/_buildManifest.js?dpl=dpl_4eLuLZa3zjDUG91awT2RHuU39Tdg" defer=""></script><script src="/blog/_next/static/naQFbCp8zGZYbeqX1B0dN/_ssgManifest.js?dpl=dpl_4eLuLZa3zjDUG91awT2RHuU39Tdg" defer=""></script><style data-styled="" data-styled-version="5.3.11">html{line-height:1.15;-webkit-text-size-adjust:100%;}/*!sc*/
body{margin:0;}/*!sc*/
main{display:block;}/*!sc*/
h1{font-size:2em;margin:0.67em 0;}/*!sc*/
hr{box-sizing:content-box;height:0;overflow:visible;}/*!sc*/
pre{font-family:monospace,monospace;font-size:1em;}/*!sc*/
a{background-color:transparent;}/*!sc*/
abbr[title]{border-bottom:none;-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;}/*!sc*/
b,strong{font-weight:bolder;}/*!sc*/
code,kbd,samp{font-family:monospace,monospace;font-size:1em;}/*!sc*/
small{font-size:80%;}/*!sc*/
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}/*!sc*/
sub{bottom:-0.25em;}/*!sc*/
sup{top:-0.5em;}/*!sc*/
img{border-style:none;}/*!sc*/
button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0;}/*!sc*/
button,input{overflow:visible;}/*!sc*/
button,select{text-transform:none;}/*!sc*/
button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button;}/*!sc*/
button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0;}/*!sc*/
button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText;}/*!sc*/
fieldset{padding:0.35em 0.75em 0.625em;}/*!sc*/
legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal;}/*!sc*/
progress{vertical-align:baseline;}/*!sc*/
textarea{overflow:auto;}/*!sc*/
[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0;}/*!sc*/
[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto;}/*!sc*/
[type="search"]{-webkit-appearance:textfield;outline-offset:-2px;}/*!sc*/
[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}/*!sc*/
::-webkit-file-upload-button{-webkit-appearance:button;font:inherit;}/*!sc*/
details{display:block;}/*!sc*/
summary{display:list-item;}/*!sc*/
template{display:none;}/*!sc*/
[hidden]{display:none;}/*!sc*/
data-styled.g1[id="sc-global-ecVvVt1"]{content:"sc-global-ecVvVt1,"}/*!sc*/
@font-face{font-family:'Aeonik';font-style:normal;font-weight:400;font-display:swap;src:local('Aeonik-Regular'),url('https://cdn.auth0.com/website/cic-homepage/fonts/Aeonik-Regular.woff2') format('woff2');}/*!sc*/
@font-face{font-family:'Aeonik';font-style:normal;font-weight:500;font-display:swap;src:local('Aeonik-Medium'),url('https://cdn.auth0.com/website/cic-homepage/fonts/Aeonik-Medium.woff2') format('woff2');}/*!sc*/
@font-face{font-family:'Aeonik Mono';font-style:normal;font-weight:400;font-display:swap;src:local('AeonikMono-Regular'),url('https://cdn.auth0.com/website/okta-fonts/AeonikMono-Regular.woff2') format('woff2');}/*!sc*/
@font-face{font-family:'Aeonik Mono';font-style:normal;font-weight:500;font-display:swap;src:local('AeonikMono-Medium'),url('https://cdn.auth0.com/website/okta-fonts/AeonikMono-Medium.ttf') format('woff2');}/*!sc*/
@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:local('Inter-Regular'),url('https://cdn.auth0.com/website/fonts/Inter-Regular.woff2') format('woff2');}/*!sc*/
@font-face{font-family:'Inter';font-style:normal;font-weight:500;font-display:swap;src:local('Inter-Medium'),url('https://cdn.auth0.com/website/fonts/Inter-Medium.woff2') format('woff2');}/*!sc*/
@font-face{font-family:'Inter';font-style:normal;font-weight:700;font-display:swap;src:local('Inter-Bold'),url('https://cdn.auth0.com/website/fonts/Inter-Bold.woff2') format('woff2');}/*!sc*/
:root{--content-width:120rem;--font-main:'fakt-web',sans-serif;}/*!sc*/
.lightbox{width:100%;height:100%;position:fixed;top:0;left:0;background:rgba(0,0,0,0.85);z-index:9999999;line-height:0;cursor:pointer;}/*!sc*/
.lightbox-image{max-width:100%;cursor:pointer;margin:0 auto;display:block;}/*!sc*/
.lightbox img{position:relative;top:50%;left:50%;-ms-transform:translateX(-50%) translateY(-50%);-webkit-transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);max-width:100%;max-height:100%;}/*!sc*/
@media screen and (min-width:1200px){.lightbox img{max-width:1200px;}}/*!sc*/
@media screen and (min-height:1200px){.lightbox img{max-height:1200px;}}/*!sc*/
.lightbox span{display:block;position:fixed;bottom:13px;height:1.5em;line-height:1.4em;width:100%;text-align:center;color:white;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000;font-family:'fakt-web','Helvetica Neue',Hevetica,sans-serif;font-size:18px;}/*!sc*/
.lightbox .videoWrapperContainer{position:relative;top:50%;left:50%;-ms-transform:translateX(-50%) translateY(-50%);-webkit-transform:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);max-width:900px;max-height:100%;}/*!sc*/
.lightbox .videoWrapperContainer .videoWrapper{height:0;line-height:0;margin:0;padding:0;position:relative;padding-bottom:56.333%;background:black;}/*!sc*/
.lightbox .videoWrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:0;display:block;}/*!sc*/
.lightbox #prev,.lightbox #next{height:50px;line-height:36px;display:none;margin-top:-25px;position:fixed;top:50%;padding:0 15px;cursor:pointer;-webkit-text-decoration:none;text-decoration:none;z-index:99;color:white;font-size:60px;font-family:'fakt-web','Helvetica Neue',Hevetica,sans-serif;}/*!sc*/
.lightbox.gallery #prev,.lightbox.gallery #next{display:block;}/*!sc*/
.lightbox #prev{left:0;}/*!sc*/
.lightbox #next{right:0;}/*!sc*/
.lightbox #close{height:50px;width:50px;position:fixed;cursor:pointer;-webkit-text-decoration:none;text-decoration:none;z-index:99;right:0;top:0;}/*!sc*/
.lightbox #close:after,.lightbox #close:before{position:absolute;margin-top:22px;margin-left:14px;content:'';height:3px;background:white;width:23px;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);}/*!sc*/
.lightbox #close:after{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);}/*!sc*/
.lightbox,.lightbox *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}/*!sc*/
body{box-sizing:border-box;font-family:var(--font-main);font-size:2rem;line-height:3.2rem;}/*!sc*/
html{font-size:10px;}/*!sc*/
data-styled.g2[id="sc-global-fvjmty1"]{content:"sc-global-fvjmty1,"}/*!sc*/
html{font-size:62.5%;}/*!sc*/
body.modal-open{overflow:hidden;}/*!sc*/
data-styled.g3[id="sc-global-jTSlVj1"]{content:"sc-global-jTSlVj1,"}/*!sc*/
.kSiIA{margin:0;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:linear-gradient(0deg,rgba(255,255,255,0.40) 0%,rgba(255,255,255,0.40) 100%),radial-gradient(123.72% 71.29% at 7.15% 100%,#FFF 0%,rgba(255,255,255,0.00) 100%),radial-gradient(234.4% 144.94% at 84.62% 0%,#FFF 0%,rgba(255,255,255,0.00) 100%),linear-gradient(26deg,rgba(255,255,255,0.17) -32.04%,rgba(255,255,255,0.00) 133.43%);border-width:0;border-radius:0.6rem;border-style:solid;color:#000000;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:1.6rem;line-height:2.4rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1.2rem 3.2rem;width:100%;position:relative;z-index:2;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;-webkit-text-decoration:none;text-decoration:none;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out;font-family:Aeonik,sans-serif;font-style:normal;font-weight:500;overflow:hidden;box-shadow:0px -16px 24px 0px rgba(255,255,255,0.48) inset,0px 4px 4px 0px rgba(0,0,0,0.25);}/*!sc*/
@media screen and (min-width:900px){.kSiIA{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}}/*!sc*/
.kSiIA:active{color:#191919;background:linear-gradient(0deg,rgba(0,0,0,0.20) 0%,rgba(0,0,0,0.20) 100%),linear-gradient(0deg,rgba(255,255,255,0.70) 0%,rgba(255,255,255,0.70) 100%),radial-gradient(120.32% 83.76% at 50% 100%,#FFF 0%,rgba(255,255,255,0.00) 100%),radial-gradient(47.47% 14.92% at 50% 0%,#FFF 0%,rgba(255,255,255,0.00) 100%),radial-gradient(67.49% 95.06% at 50% 15.5%,#FFF 0%,rgba(255,255,255,0.36) 100%),radial-gradient(33.16% 50% at 50% 0%,#FFF 0%,rgba(255,255,255,0.00) 100%);}/*!sc*/
.kSiIA:hover{-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out;color:#191919;background:linear-gradient(0deg,rgba(255,255,255,0.70) 0%,rgba(255,255,255,0.70) 100%),radial-gradient(120.32% 83.76% at 50% 100%,#FFF 0%,rgba(255,255,255,0.00) 100%),radial-gradient(47.47% 14.92% at 50% 0%,#FFF 0%,rgba(255,255,255,0.00) 100%),radial-gradient(67.49% 95.06% at 50% 15.5%,#FFF 0%,rgba(255,255,255,0.36) 100%),radial-gradient(33.16% 50% at 50% 0%,#FFF 0%,rgba(255,255,255,0.00) 100%);cursor:pointer;}/*!sc*/
.kSiIA:hover{box-shadow:0px 8px 28px 0px rgba(255,255,255,0.08);}/*!sc*/
.kSiIA:active{box-shadow:0px 8px 28px 0px rgba(255,255,255,0.08);}/*!sc*/
.kSiIA:disabled{box-shadow:0px -16px 24px 0px rgba(255,255,255,0.48) inset,0px 4px 4px 0px rgba(0,0,0,0.25);}/*!sc*/
.kSiIA span{z-index:3;}/*!sc*/
.kSiIA:hover{background:linear-gradient(0deg,rgba(255,255,255,0.40) 0%,rgba(255,255,255,0.40) 100%),radial-gradient(123.72% 71.29% at 7.15% 100%,#FFF 0%,rgba(255,255,255,0.00) 100%),radial-gradient(234.4% 144.94% at 84.62% 0%,#FFF 0%,rgba(255,255,255,0.00) 100%),linear-gradient(26deg,rgba(255,255,255,0.17) -32.04%,rgba(255,255,255,0.00) 133.43%);}/*!sc*/
.kSiIA::before{content:'';width:100%;height:100%;display:inline-block;background:linear-gradient(0deg,rgba(255,255,255,0.70) 0%,rgba(255,255,255,0.70) 100%),radial-gradient(120.32% 83.76% at 50% 100%,#FFF 0%,rgba(255,255,255,0.00) 100%),radial-gradient(47.47% 14.92% at 50% 0%,#FFF 0%,rgba(255,255,255,0.00) 100%),radial-gradient(67.49% 95.06% at 50% 15.5%,#FFF 0%,rgba(255,255,255,0.36) 100%),radial-gradient(33.16% 50% at 50% 0%,#FFF 0%,rgba(255,255,255,0.00) 100%);opacity:0;position:absolute;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out;}/*!sc*/
.kSiIA:hover::before{opacity:1;}/*!sc*/
.frejTe{margin:0;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:linear-gradient(26deg,rgba(255,255,255,0.15) -32.04%,rgba(255,255,255,0.00) 133.43%);border-width:1.5px;border-color:linear-gradient(29.98deg,rgba(255,254,250,0.7) 23.72%,rgba(255,254,250,0) 107.71%);border-radius:0.6rem;border-style:solid;color:#FFFEFA;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:1.6rem;line-height:2.4rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1.2rem 3.2rem;width:100%;position:relative;z-index:2;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;-webkit-text-decoration:none;text-decoration:none;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out;font-family:Aeonik,sans-serif;font-style:normal;font-weight:500;overflow:hidden;border:none;}/*!sc*/
@media screen and (min-width:900px){.frejTe{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}}/*!sc*/
.frejTe:active{color:rgba(255,254,250,0.8);border-color:linear-gradient(29.98deg,rgba(255,254,250,0.8) 23.72%,rgba(255,254,250,0) 107.71%);background:linear-gradient(0deg,rgba(0,0,0,0.20) 0%,rgba(0,0,0,0.20) 100%),linear-gradient(26deg,rgba(255,255,255,0.08) -32.04%,rgba(255,255,255,0.00) 133.43%);}/*!sc*/
.frejTe:hover{-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out;border-color:linear-gradient(29.98deg,rgba(255,254,250,0.8) 23.72%,rgba(255,254,250,0) 107.71%);color:#FFFEFA;background:radial-gradient(72.18% 56.98% at 50% 100%,rgba(255,255,255,0.20) 0%,rgba(255,255,255,0.00) 100%),radial-gradient(100.79% 100% at 50% 0%,rgba(255,255,255,0.40) 0%,rgba(255,255,255,0.00) 100%),linear-gradient(26deg,rgba(255,255,255,0.08) -32.04%,rgba(255,255,255,0.00) 133.43%);cursor:pointer;}/*!sc*/
.frejTe span{z-index:3;}/*!sc*/
.frejTe:hover{background:linear-gradient(26deg,rgba(255,255,255,0.15) -32.04%,rgba(255,255,255,0.00) 133.43%);}/*!sc*/
.frejTe::before{content:'';width:100%;height:100%;display:inline-block;background:radial-gradient(72.18% 56.98% at 50% 100%,rgba(255,255,255,0.20) 0%,rgba(255,255,255,0.00) 100%),radial-gradient(100.79% 100% at 50% 0%,rgba(255,255,255,0.40) 0%,rgba(255,255,255,0.00) 100%),linear-gradient(26deg,rgba(255,255,255,0.08) -32.04%,rgba(255,255,255,0.00) 133.43%);opacity:0;position:absolute;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out;}/*!sc*/
.frejTe:hover::before{opacity:1;}/*!sc*/
.frejTe span{z-index:10;}/*!sc*/
.frejTe::after{content:'';width:100%;height:100%;display:inline-block;position:absolute;border-radius:6px;padding:1.5px;z-index:800;background:linear-gradient(29.98deg,rgba(255,254,250,0.7) 23.72%,rgba(255,254,250,0) 107.71%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;-webkit-mask-composite:exclude;mask-composite:exclude;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out;}/*!sc*/
.frejTe:active::after{background:linear-gradient(0deg,rgba(0,0,0,0.2),rgba(0,0,0,0.2)),linear-gradient(29.98deg,rgba(255,254,250,0.7) 23.72%,rgba(255,254,250,0) 107.71%);}/*!sc*/
.frejTe:hover::after{background:linear-gradient(29.98deg,rgba(255,254,250,0.8) 23.72%,rgba(255,254,250,0) 107.71%);}/*!sc*/
.frejTe:disabled::after{background:linear-gradient(29.98deg,rgba(255,254,250,0.7) 23.72%,rgba(255,254,250,0) 107.71%);}/*!sc*/
data-styled.g46[id="styled__Button-sc-1hwml9q-0"]{content:"kSiIA,frejTe,"}/*!sc*/
.ghiElA.ghiElA.ghiElA{color:#99A7F1;-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/
.jgibCU.jgibCU.jgibCU{width:100%;}/*!sc*/
.cydknG.cydknG.cydknG{margin-top:1.6rem;width:100%;}/*!sc*/
.kqDxFL.kqDxFL.kqDxFL{color:#ABABAB;font-weight:500;line-height:1.8rem;margin-bottom:2.1rem;}/*!sc*/
.gdLUMv.gdLUMv.gdLUMv{-webkit-text-decoration:none;text-decoration:none;line-height:2.2rem;}/*!sc*/
.hAZkEV.hAZkEV.hAZkEV{color:#8c929c;margin:0;}/*!sc*/
.ioVNuq.ioVNuq.ioVNuq{font-family:Aeonik,sans-serif;color:#FFFFFF;margin:0.4rem 0 0;font-weight:500;font-size:1.6rem;line-height:2rem;}/*!sc*/
.hrigFo.hrigFo.hrigFo{display:block;-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/
.jKVeGi.jKVeGi.jKVeGi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-text-decoration:none;text-decoration:none;}/*!sc*/
.bbibKK.bbibKK.bbibKK{font-family:Aeonik,sans-serif;color:#e5e5e5;font-size:1.4rem;-webkit-letter-spacing:0.015rem;-moz-letter-spacing:0.015rem;-ms-letter-spacing:0.015rem;letter-spacing:0.015rem;line-height:2rem;}/*!sc*/
.hTjqEq.hTjqEq.hTjqEq{color:#8c929c;}/*!sc*/
.ctSvSw.ctSvSw.ctSvSw{-webkit-text-decoration:none;text-decoration:none;display:block;}/*!sc*/
.bbQQEs.bbQQEs.bbQQEs{margin-right:1.6rem;-webkit-letter-spacing:0.032rem;-moz-letter-spacing:0.032rem;-ms-letter-spacing:0.032rem;letter-spacing:0.032rem;white-space:nowrap;}/*!sc*/
@media screen and (min-width:1200px){.bbQQEs.bbQQEs.bbQQEs{padding:0.8rem 2.4rem;}}/*!sc*/
.jmsZjj.jmsZjj.jmsZjj{-webkit-letter-spacing:0.032rem;-moz-letter-spacing:0.032rem;-ms-letter-spacing:0.032rem;letter-spacing:0.032rem;white-space:nowrap;}/*!sc*/
@media screen and (min-width:1200px){.jmsZjj.jmsZjj.jmsZjj{padding:0.8rem 2.2rem;}}/*!sc*/
.daGTxQ.daGTxQ.daGTxQ{color:#FFFEFA;}/*!sc*/
.wneoK.wneoK.wneoK{padding:1.6rem;color:#8E8E8E;}/*!sc*/
.dNAcKM.dNAcKM.dNAcKM{text-transform:capitalize;color:#7192EC;border:1px solid #7192EC54;background:rgba(0,0,0,0.33);width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;padding:0.2rem 0.6rem;border-radius:.6rem;white-space:nowrap;}/*!sc*/
.hRTnrT.hRTnrT.hRTnrT{margin:2.4rem 0 1.6rem;font-weight:500;}/*!sc*/
@media screen and (min-width:900px){.hRTnrT.hRTnrT.hRTnrT{margin:2.4rem 0 1.6rem;}}/*!sc*/
@media screen and (min-width:1200px){.hRTnrT.hRTnrT.hRTnrT{margin:1.6rem 0;}}/*!sc*/
.iUMEFg.iUMEFg.iUMEFg{color:#E5E5E5;}/*!sc*/
.eywyFj.eywyFj.eywyFj{color:#FFFEFA;opacity:0.5;}/*!sc*/
.bSjAPd.bSjAPd.bSjAPd{border-bottom:0.1rem solid #555555;padding-bottom:0.8rem;}/*!sc*/
.jmVJtT.jmVJtT.jmVJtT{color:#E5E5E5;font-weight:400;}/*!sc*/
.hPXnTc.hPXnTc.hPXnTc{font-weight:400;}/*!sc*/
.kAWGyf.kAWGyf.kAWGyf{color:#808080;margin:0;}/*!sc*/
.eOzIEM.eOzIEM.eOzIEM{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin-top:2.4rem;}/*!sc*/
.GEyYG.GEyYG.GEyYG{padding-bottom:1.6rem;border-bottom:0.1rem solid #2A2A2A;margin-bottom:3.2rem;max-width:131.2rem;}/*!sc*/
@media screen and (min-width:900px){.fiJSa-d.fiJSa-d.fiJSa-d{font-size:1.3rem;}}/*!sc*/
@media screen and (min-width:900px){.fiJSa-d.fiJSa-d.fiJSa-d{-webkit-letter-spacing:0.05rem;-moz-letter-spacing:0.05rem;-ms-letter-spacing:0.05rem;letter-spacing:0.05rem;}}/*!sc*/
@media screen and (min-width:1200px){.hhJSkn.hhJSkn.hhJSkn{font-size:2.8rem;}}/*!sc*/
@media screen and (min-width:1200px){.hhJSkn.hhJSkn.hhJSkn{line-height:3.6rem;}}/*!sc*/
.jBbHiM.jBbHiM.jBbHiM{text-transform:capitalize;color:#B49BFC;border:1px solid #B49BFC54;background:rgba(0,0,0,0.33);width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;padding:0.2rem 0.6rem;border-radius:.6rem;white-space:nowrap;}/*!sc*/
.kfRWXJ.kfRWXJ.kfRWXJ{font-weight:500;}/*!sc*/
.KYCXS.KYCXS.KYCXS{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-text-decoration:none;text-decoration:none;}/*!sc*/
.jxtigD.jxtigD.jxtigD{color:#80868F;margin:0;}/*!sc*/
.grCsyJ.grCsyJ.grCsyJ{border-top:0.1rem solid #5a5f66;padding:2.4rem 1.6rem;color:#80868F;margin:0;}/*!sc*/
data-styled.g47[id="utils-sc-11hlfw-0"]{content:"ghiElA,jgibCU,cydknG,kqDxFL,gdLUMv,hAZkEV,ioVNuq,hrigFo,jKVeGi,bbibKK,hTjqEq,ctSvSw,bbQQEs,jmsZjj,daGTxQ,wneoK,kHaByn,dNAcKM,hRTnrT,iUMEFg,eywyFj,bSjAPd,jmVJtT,hPXnTc,kAWGyf,eOzIEM,GEyYG,fiJSa-d,hhJSkn,jBbHiM,kfRWXJ,KYCXS,jxtigD,grCsyJ,"}/*!sc*/
.cruTcJ{margin:0 0 1.6rem 0;color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;text-transform:uppercase;padding:0;}/*!sc*/
@media screen and (min-width:900px){.cruTcJ{color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;}}/*!sc*/
@media screen and (min-width:1200px){.cruTcJ{color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;}}/*!sc*/
.jIzwLe{margin:0;color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;text-transform:uppercase;padding:0;}/*!sc*/
@media screen and (min-width:900px){.jIzwLe{color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;}}/*!sc*/
@media screen and (min-width:1200px){.jIzwLe{color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;}}/*!sc*/
.fRlbrh{margin:0 0 1.6rem;color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;text-transform:uppercase;padding:0;}/*!sc*/
@media screen and (min-width:900px){.fRlbrh{color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;}}/*!sc*/
@media screen and (min-width:1200px){.fRlbrh{color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;}}/*!sc*/
.akErW{margin:0 0 0.8rem;color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;text-transform:uppercase;padding:0;}/*!sc*/
@media screen and (min-width:900px){.akErW{color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;}}/*!sc*/
@media screen and (min-width:1200px){.akErW{color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;}}/*!sc*/
.egLsFq{margin:0.8rem 0 1.6rem;color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;text-transform:uppercase;padding:0;}/*!sc*/
@media screen and (min-width:1200px){.egLsFq{margin:0;}}/*!sc*/
@media screen and (min-width:900px){.egLsFq{color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;}}/*!sc*/
@media screen and (min-width:1200px){.egLsFq{color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;}}/*!sc*/
.bHhyEy{margin:0.4rem 0 2rem;color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;text-transform:uppercase;padding:0;}/*!sc*/
@media screen and (min-width:900px){.bHhyEy{color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;}}/*!sc*/
@media screen and (min-width:1200px){.bHhyEy{color:#ABABAB;font-family:'Aeonik Mono',monospace;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0.1rem;-moz-letter-spacing:0.1rem;-ms-letter-spacing:0.1rem;letter-spacing:0.1rem;line-height:2rem;}}/*!sc*/
.gahICZ{margin:0 0 1.6rem 0;color:#8B929B;font-family:SpaceGrotesk,monospace;font-style:NORMAL;font-weight:600;font-size:1.2rem;-webkit-letter-spacing:0.12rem;-moz-letter-spacing:0.12rem;-ms-letter-spacing:0.12rem;letter-spacing:0.12rem;line-height:1.8rem;text-transform:uppercase;padding:0;}/*!sc*/
@media screen and (min-width:900px){.gahICZ{color:#8B929B;font-family:SpaceGrotesk,monospace;font-style:NORMAL;font-weight:600;font-size:1.4rem;-webkit-letter-spacing:0.15rem;-moz-letter-spacing:0.15rem;-ms-letter-spacing:0.15rem;letter-spacing:0.15rem;line-height:2rem;}}/*!sc*/
@media screen and (min-width:1200px){.gahICZ{color:#8B929B;font-family:SpaceGrotesk,monospace;font-style:NORMAL;font-weight:600;font-size:1.4rem;-webkit-letter-spacing:0.15rem;-moz-letter-spacing:0.15rem;-ms-letter-spacing:0.15rem;letter-spacing:0.15rem;line-height:2rem;}}/*!sc*/
data-styled.g51[id="styled__Overline-sc-165cfko-0"]{content:"cruTcJ,jIzwLe,fRlbrh,akErW,egLsFq,bHhyEy,gahICZ,"}/*!sc*/
.cykLRO{margin:0 0 1.6rem 0;color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.8rem;-webkit-letter-spacing:0.0125rem;-moz-letter-spacing:0.0125rem;-ms-letter-spacing:0.0125rem;letter-spacing:0.0125rem;line-height:2.5rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:900px){.cykLRO{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.8rem;-webkit-letter-spacing:0.0125rem;-moz-letter-spacing:0.0125rem;-ms-letter-spacing:0.0125rem;letter-spacing:0.0125rem;line-height:2.5rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.cykLRO{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.8rem;-webkit-letter-spacing:0.0125rem;-moz-letter-spacing:0.0125rem;-ms-letter-spacing:0.0125rem;letter-spacing:0.0125rem;line-height:2.5rem;color:#FFFEFA;}}/*!sc*/
.dEYVdf{margin:0 0 1.6rem 0;color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.4rem;-webkit-letter-spacing:0.015rem;-moz-letter-spacing:0.015rem;-ms-letter-spacing:0.015rem;letter-spacing:0.015rem;line-height:2rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:900px){.dEYVdf{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.4rem;-webkit-letter-spacing:0.015rem;-moz-letter-spacing:0.015rem;-ms-letter-spacing:0.015rem;letter-spacing:0.015rem;line-height:2rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.dEYVdf{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.4rem;-webkit-letter-spacing:0.015rem;-moz-letter-spacing:0.015rem;-ms-letter-spacing:0.015rem;letter-spacing:0.015rem;line-height:2rem;color:#FFFEFA;}}/*!sc*/
.dOFALE{margin:0 .8rem 0 0;color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.6rem;-webkit-letter-spacing:0.0125rem;-moz-letter-spacing:0.0125rem;-ms-letter-spacing:0.0125rem;letter-spacing:0.0125rem;line-height:2.2rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:900px){.dOFALE{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.6rem;-webkit-letter-spacing:0.0125rem;-moz-letter-spacing:0.0125rem;-ms-letter-spacing:0.0125rem;letter-spacing:0.0125rem;line-height:2.2rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.dOFALE{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.6rem;-webkit-letter-spacing:0.0125rem;-moz-letter-spacing:0.0125rem;-ms-letter-spacing:0.0125rem;letter-spacing:0.0125rem;line-height:2.2rem;color:#FFFEFA;}}/*!sc*/
.jeLiTk{margin:0;color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.6rem;-webkit-letter-spacing:0.0125rem;-moz-letter-spacing:0.0125rem;-ms-letter-spacing:0.0125rem;letter-spacing:0.0125rem;line-height:2.2rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:900px){.jeLiTk{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.6rem;-webkit-letter-spacing:0.0125rem;-moz-letter-spacing:0.0125rem;-ms-letter-spacing:0.0125rem;letter-spacing:0.0125rem;line-height:2.2rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.jeLiTk{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.6rem;-webkit-letter-spacing:0.0125rem;-moz-letter-spacing:0.0125rem;-ms-letter-spacing:0.0125rem;letter-spacing:0.0125rem;line-height:2.2rem;color:#FFFEFA;}}/*!sc*/
.jYylMA{margin:0;color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.4rem;-webkit-letter-spacing:0.015rem;-moz-letter-spacing:0.015rem;-ms-letter-spacing:0.015rem;letter-spacing:0.015rem;line-height:2rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:900px){.jYylMA{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.4rem;-webkit-letter-spacing:0.015rem;-moz-letter-spacing:0.015rem;-ms-letter-spacing:0.015rem;letter-spacing:0.015rem;line-height:2rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.jYylMA{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.4rem;-webkit-letter-spacing:0.015rem;-moz-letter-spacing:0.015rem;-ms-letter-spacing:0.015rem;letter-spacing:0.015rem;line-height:2rem;color:#FFFEFA;}}/*!sc*/
.cRPvKS{margin:0;color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:2rem;-webkit-letter-spacing:0.005rem;-moz-letter-spacing:0.005rem;-ms-letter-spacing:0.005rem;letter-spacing:0.005rem;line-height:2.8rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:900px){.cRPvKS{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:2.4rem;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;line-height:3.2rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.cRPvKS{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:2.4rem;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;line-height:3.2rem;color:#FFFEFA;}}/*!sc*/
.evZbox{margin:0 0 1.6rem 0;color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:2rem;-webkit-letter-spacing:0.005rem;-moz-letter-spacing:0.005rem;-ms-letter-spacing:0.005rem;letter-spacing:0.005rem;line-height:2.8rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:900px){.evZbox{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:2rem;-webkit-letter-spacing:0.005rem;-moz-letter-spacing:0.005rem;-ms-letter-spacing:0.005rem;letter-spacing:0.005rem;line-height:2.8rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.evZbox{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:2rem;-webkit-letter-spacing:0.005rem;-moz-letter-spacing:0.005rem;-ms-letter-spacing:0.005rem;letter-spacing:0.005rem;line-height:2.8rem;color:#FFFEFA;}}/*!sc*/
.eKCpKG{margin:0 0 0.8rem;color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:2rem;-webkit-letter-spacing:0.005rem;-moz-letter-spacing:0.005rem;-ms-letter-spacing:0.005rem;letter-spacing:0.005rem;line-height:2.8rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:900px){.eKCpKG{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:2rem;-webkit-letter-spacing:0.005rem;-moz-letter-spacing:0.005rem;-ms-letter-spacing:0.005rem;letter-spacing:0.005rem;line-height:2.8rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.eKCpKG{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:2rem;-webkit-letter-spacing:0.005rem;-moz-letter-spacing:0.005rem;-ms-letter-spacing:0.005rem;letter-spacing:0.005rem;line-height:2.8rem;color:#FFFEFA;}}/*!sc*/
.kwcFPE{margin:0 0 0.8rem;color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.6rem;-webkit-letter-spacing:0.0125rem;-moz-letter-spacing:0.0125rem;-ms-letter-spacing:0.0125rem;letter-spacing:0.0125rem;line-height:2.2rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:900px){.kwcFPE{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.6rem;-webkit-letter-spacing:0.0125rem;-moz-letter-spacing:0.0125rem;-ms-letter-spacing:0.0125rem;letter-spacing:0.0125rem;line-height:2.2rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.kwcFPE{color:#E5E5E5;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.6rem;-webkit-letter-spacing:0.0125rem;-moz-letter-spacing:0.0125rem;-ms-letter-spacing:0.0125rem;letter-spacing:0.0125rem;line-height:2.2rem;color:#FFFEFA;}}/*!sc*/
.krhoHS{margin:0;color:#41454C;font-family:Inter,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#FFFFFF;padding:0;}/*!sc*/
@media screen and (min-width:900px){.krhoHS{color:#41454C;font-family:Inter,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#FFFFFF;}}/*!sc*/
@media screen and (min-width:1200px){.krhoHS{color:#41454C;font-family:Inter,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#FFFFFF;}}/*!sc*/
.dfnlHp{margin:0 0 1.6rem 0;color:#41454C;font-family:Inter,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#FFFFFF;padding:0;}/*!sc*/
@media screen and (min-width:900px){.dfnlHp{color:#41454C;font-family:Inter,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#FFFFFF;}}/*!sc*/
@media screen and (min-width:1200px){.dfnlHp{color:#41454C;font-family:Inter,sans-serif;font-style:NORMAL;font-weight:400;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#FFFFFF;}}/*!sc*/
data-styled.g52[id="styled__Paragraph-sc-165cfko-1"]{content:"cykLRO,dEYVdf,dOFALE,jeLiTk,jYylMA,cRPvKS,evZbox,eKCpKG,kwcFPE,krhoHS,dfnlHp,"}/*!sc*/
.dvPXaj{margin:0 0 1.6rem 0;color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:3.2rem;-webkit-letter-spacing:-0.01rem;-moz-letter-spacing:-0.01rem;-ms-letter-spacing:-0.01rem;letter-spacing:-0.01rem;line-height:4.4rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:900px){.dvPXaj{color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:4rem;-webkit-letter-spacing:-0.02rem;-moz-letter-spacing:-0.02rem;-ms-letter-spacing:-0.02rem;letter-spacing:-0.02rem;line-height:4.8rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.dvPXaj{color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:4.8rem;-webkit-letter-spacing:-0.02rem;-moz-letter-spacing:-0.02rem;-ms-letter-spacing:-0.02rem;letter-spacing:-0.02rem;line-height:5.6rem;color:#FFFEFA;}}/*!sc*/
.bQHbCW{margin:4rem 0 2.4rem;color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:3.2rem;-webkit-letter-spacing:-0.01rem;-moz-letter-spacing:-0.01rem;-ms-letter-spacing:-0.01rem;letter-spacing:-0.01rem;line-height:4.4rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:1200px){.bQHbCW{margin:6.4rem 0 2.4rem;}}/*!sc*/
@media screen and (min-width:900px){.bQHbCW{color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:4rem;-webkit-letter-spacing:-0.02rem;-moz-letter-spacing:-0.02rem;-ms-letter-spacing:-0.02rem;letter-spacing:-0.02rem;line-height:4.8rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.bQHbCW{color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:4rem;-webkit-letter-spacing:-0.02rem;-moz-letter-spacing:-0.02rem;-ms-letter-spacing:-0.02rem;letter-spacing:-0.02rem;line-height:4.8rem;color:#FFFEFA;}}/*!sc*/
.fTNKiF{margin:0 0 1.6rem 0;color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:500;font-size:2.4rem;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;line-height:3.2rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:900px){.fTNKiF{color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:500;font-size:2.4rem;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;line-height:3.2rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.fTNKiF{color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:500;font-size:2.4rem;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;line-height:3.2rem;color:#FFFEFA;}}/*!sc*/
.bwECpK{margin:4rem 0 2.4rem;color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:2.4rem;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;line-height:3.2rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:1200px){.bwECpK{margin:6.4rem 0 2.4rem;}}/*!sc*/
@media screen and (min-width:900px){.bwECpK{color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:2.4rem;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;line-height:3.2rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.bwECpK{color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:3.2rem;-webkit-letter-spacing:-0.01rem;-moz-letter-spacing:-0.01rem;-ms-letter-spacing:-0.01rem;letter-spacing:-0.01rem;line-height:4.4rem;color:#FFFEFA;}}/*!sc*/
.kAwpoB{margin:0 0 .4rem;color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:2.4rem;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;line-height:3.2rem;color:#FFFEFA;padding:0;}/*!sc*/
@media screen and (min-width:900px){.kAwpoB{color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:2.4rem;-webkit-letter-spacing:0;-moz-letter-spacing:0;-ms-letter-spacing:0;letter-spacing:0;line-height:3.2rem;color:#FFFEFA;}}/*!sc*/
@media screen and (min-width:1200px){.kAwpoB{color:#FFFEFA;font-family:Aeonik,sans-serif;font-style:NORMAL;font-weight:400;font-size:3.2rem;-webkit-letter-spacing:-0.01rem;-moz-letter-spacing:-0.01rem;-ms-letter-spacing:-0.01rem;letter-spacing:-0.01rem;line-height:4.4rem;color:#FFFEFA;}}/*!sc*/
data-styled.g53[id="styled__Heading-sc-165cfko-2"]{content:"dvPXaj,bQHbCW,fTNKiF,bwECpK,kAwpoB,"}/*!sc*/
.gOnbZW{margin:0;display:inline-block;padding:0;font-family:Aeonik,sans-serif !important;color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.8rem;-webkit-letter-spacing:-0.005rem;-moz-letter-spacing:-0.005rem;-ms-letter-spacing:-0.005rem;letter-spacing:-0.005rem;line-height:2.8rem;color:#99A7F1;-webkit-text-decoration:underline;text-decoration:underline;text-underline-offset:0.3rem;cursor:pointer;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}/*!sc*/
@media screen and (min-width:900px){.gOnbZW{color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.8rem;-webkit-letter-spacing:-0.005rem;-moz-letter-spacing:-0.005rem;-ms-letter-spacing:-0.005rem;letter-spacing:-0.005rem;line-height:2.8rem;color:#99A7F1;}}/*!sc*/
@media screen and (min-width:1200px){.gOnbZW{color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.8rem;-webkit-letter-spacing:-0.005rem;-moz-letter-spacing:-0.005rem;-ms-letter-spacing:-0.005rem;letter-spacing:-0.005rem;line-height:2.8rem;color:#99A7F1;}}/*!sc*/
.gOnbZW:hover{color:#B6CAFF;cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/
.gOnbZW:active{color:#3F59E4;}/*!sc*/
.gOnbZW:focus{color:#99A7F1;}/*!sc*/
.gOnbZW:focus-visible{outline:0.2rem solid #99A7F1;border-radius:0.4rem;color:#99A7F1;}/*!sc*/
.gOnbZW:after{content:'→';padding-left:0.8rem;display:inline-block;}/*!sc*/
.bTQHxM{margin:0;display:inline-block;padding:0;font-family:Aeonik,sans-serif !important;color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#99A7F1;-webkit-text-decoration:underline;text-decoration:underline;text-underline-offset:0.3rem;cursor:pointer;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}/*!sc*/
@media screen and (min-width:900px){.bTQHxM{color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.6rem;-webkit-letter-spacing:-0.001rem;-moz-letter-spacing:-0.001rem;-ms-letter-spacing:-0.001rem;letter-spacing:-0.001rem;line-height:2.4rem;color:#99A7F1;}}/*!sc*/
@media screen and (min-width:1200px){.bTQHxM{color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.6rem;-webkit-letter-spacing:-0.001rem;-moz-letter-spacing:-0.001rem;-ms-letter-spacing:-0.001rem;letter-spacing:-0.001rem;line-height:2.4rem;color:#99A7F1;}}/*!sc*/
.bTQHxM:hover{color:#B6CAFF;cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/
.bTQHxM:active{color:#3F59E4;}/*!sc*/
.bTQHxM:focus{color:#99A7F1;}/*!sc*/
.bTQHxM:focus-visible{outline:0.2rem solid #99A7F1;border-radius:0.4rem;color:#99A7F1;}/*!sc*/
.eqZICC{margin:0;display:inline-block;padding:0;font-family:Aeonik,sans-serif !important;color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#99A7F1;-webkit-text-decoration:underline;text-decoration:underline;text-underline-offset:0.3rem;cursor:pointer;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}/*!sc*/
@media screen and (min-width:900px){.eqZICC{color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#99A7F1;}}/*!sc*/
@media screen and (min-width:1200px){.eqZICC{color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#99A7F1;}}/*!sc*/
.eqZICC:hover{color:#B6CAFF;cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/
.eqZICC:active{color:#3F59E4;}/*!sc*/
.eqZICC:focus{color:#99A7F1;}/*!sc*/
.eqZICC:focus-visible{outline:0.2rem solid #99A7F1;border-radius:0.4rem;color:#99A7F1;}/*!sc*/
.eqZICC:after{content:'→';padding-left:0.8rem;display:inline-block;}/*!sc*/
.jKUWSc{margin:0;display:inline-block;padding:0;font-family:Aeonik,sans-serif !important;color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.8rem;-webkit-letter-spacing:-0.005rem;-moz-letter-spacing:-0.005rem;-ms-letter-spacing:-0.005rem;letter-spacing:-0.005rem;line-height:2.8rem;color:#99A7F1;-webkit-text-decoration:underline;text-decoration:underline;text-underline-offset:0.3rem;cursor:pointer;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}/*!sc*/
@media screen and (min-width:900px){.jKUWSc{color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.8rem;-webkit-letter-spacing:-0.005rem;-moz-letter-spacing:-0.005rem;-ms-letter-spacing:-0.005rem;letter-spacing:-0.005rem;line-height:2.8rem;color:#99A7F1;}}/*!sc*/
@media screen and (min-width:1200px){.jKUWSc{color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.8rem;-webkit-letter-spacing:-0.005rem;-moz-letter-spacing:-0.005rem;-ms-letter-spacing:-0.005rem;letter-spacing:-0.005rem;line-height:2.8rem;color:#99A7F1;}}/*!sc*/
.jKUWSc:hover{color:#B6CAFF;cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/
.jKUWSc:active{color:#3F59E4;}/*!sc*/
.jKUWSc:focus{color:#99A7F1;}/*!sc*/
.jKUWSc:focus-visible{outline:0.2rem solid #99A7F1;border-radius:0.4rem;color:#99A7F1;}/*!sc*/
.edSzJI{margin:0.8rem 0 0;display:inline-block;padding:0;font-family:Aeonik,sans-serif !important;color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#99A7F1;-webkit-text-decoration:underline;text-decoration:underline;text-underline-offset:0.3rem;cursor:pointer;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}/*!sc*/
@media screen and (min-width:900px){.edSzJI{color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#99A7F1;}}/*!sc*/
@media screen and (min-width:1200px){.edSzJI{color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#99A7F1;}}/*!sc*/
.edSzJI:hover{color:#B6CAFF;cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/
.edSzJI:active{color:#3F59E4;}/*!sc*/
.edSzJI:focus{color:#99A7F1;}/*!sc*/
.edSzJI:focus-visible{outline:0.2rem solid #99A7F1;border-radius:0.4rem;color:#99A7F1;}/*!sc*/
.fFCiQj{margin:0;display:inline-block;padding:0;font-family:Inter,sans-serif !important;color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#BCBAFF;-webkit-text-decoration:none;text-decoration:none;text-underline-offset:0.3rem;cursor:pointer;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}/*!sc*/
@media screen and (min-width:900px){.fFCiQj{color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#BCBAFF;}}/*!sc*/
@media screen and (min-width:1200px){.fFCiQj{color:#635DFF;font-family:Inter;font-style:NORMAL;font-weight:500;font-size:1.4rem;-webkit-letter-spacing:0rem;-moz-letter-spacing:0rem;-ms-letter-spacing:0rem;letter-spacing:0rem;line-height:2.2rem;color:#BCBAFF;}}/*!sc*/
.fFCiQj:hover{color:#E9E8FF;cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/
.fFCiQj:active{color:#908BFF;}/*!sc*/
.fFCiQj:focus{color:#BCBAFF;}/*!sc*/
.fFCiQj:focus-visible{outline:0.4rem solid #635DFFCC;border-radius:0.4rem;color:#BCBAFF;}/*!sc*/
data-styled.g55[id="styled__Link-sc-bubr9x-0"]{content:"gOnbZW,bTQHxM,eqZICC,jKUWSc,edSzJI,fFCiQj,"}/*!sc*/
.bbZpJT{font-family:Aeonik,sans-serif;width:100%;min-width:17.3rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:1.6rem;height:100%;line-height:2.4rem;-webkit-letter-spacing:0.015rem;-moz-letter-spacing:0.015rem;-ms-letter-spacing:0.015rem;letter-spacing:0.015rem;padding:0 0 0 4rem;border-radius:0.6rem;box-sizing:border-box;color:#FFFEFA;background:#111111;outline:none;border:0.1rem solid #555555;}/*!sc*/
.bbZpJT::-webkit-input-placeholder{color:#808080;}/*!sc*/
.bbZpJT::-moz-placeholder{color:#808080;}/*!sc*/
.bbZpJT:-ms-input-placeholder{color:#808080;}/*!sc*/
.bbZpJT::placeholder{color:#808080;}/*!sc*/
.bbZpJT:disabled{background-color:#383838;border:0.1rem solid #555555;color:#555555;}/*!sc*/
.bbZpJT:hover{border:0.1rem solid #808080;}/*!sc*/
data-styled.g57[id="styled__TextInput-sc-zjpc1c-1"]{content:"bbZpJT,"}/*!sc*/
.egtBcg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;min-width:17.3rem;border-radius:0.8rem;padding:0;height:4.8rem;box-sizing:border-box;margin-inline-start:0;margin-inline-end:0;padding-block-start:0;padding-inline-start:0;padding-inline-end:0;padding-block-end:0;border:none;}/*!sc*/
data-styled.g58[id="styled__InputWrapper-sc-zjpc1c-2"]{content:"egtBcg,"}/*!sc*/
.fiFjBn{position:absolute;margin:0 0 0 1.6rem;}/*!sc*/
data-styled.g59[id="styled__SearchIcon-sc-zjpc1c-3"]{content:"fiFjBn,"}/*!sc*/
.dIMmPH{max-width:144rem;padding:0 1.6rem;margin:0 auto;position:relative;}/*!sc*/
@media screen and (min-width:900px){.dIMmPH{padding:0 6.4rem;}}/*!sc*/
@media screen and (min-width:1600px){.dIMmPH{padding:0 0 0 14.4rem!important;max-width:160rem;}.dIMmPH:after{content:" ";position:absolute;top:0;bottom:0;right:-0.1rem;width:14.4rem;background:linear-gradient(90deg,rgba(17,17,17,0.00) 0%,#111 91.67%);}}/*!sc*/
data-styled.g232[id="styled__Wrapper-sc-1xhxac-0"]{content:"dIMmPH,"}/*!sc*/
.ergSSi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;margin-bottom:1.4rem;-webkit-transition:all 0.5s cubic-bezier(0.23,1,0.32,1);transition:all 0.5s cubic-bezier(0.23,1,0.32,1);-webkit-transform:translateX( calc( -0% - 0 ) );-ms-transform:translateX( calc( -0% - 0 ) );transform:translateX( calc( -0% - 0 ) );}/*!sc*/
@media screen and (min-width:900px){.ergSSi{margin-bottom:3.2rem;-webkit-transform:translateX( calc( -0% - 0 ) );-ms-transform:translateX( calc( -0% - 0 ) );transform:translateX( calc( -0% - 0 ) );}}/*!sc*/
@media screen and (min-width:1200px){.ergSSi{-webkit-transform:translateX(calc(-0% - 0));-ms-transform:translateX(calc(-0% - 0));transform:translateX(calc(-0% - 0));}}/*!sc*/
data-styled.g233[id="styled__Container-sc-1xhxac-1"]{content:"ergSSi,"}/*!sc*/
.fPZLSj{overflow-x:hidden;max-width:131.2rem;margin:0 auto;}/*!sc*/
@media screen and (min-width:1600px){.fPZLSj{padding-right:14.4rem;max-width:145.6rem;}}/*!sc*/
data-styled.g238[id="styled__SliderWrapper-sc-1xhxac-6"]{content:"fPZLSj,"}/*!sc*/
.ftYCoM{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:none;border:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:0.4rem;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}/*!sc*/
.ftYCoM p{-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}/*!sc*/
.ftYCoM:hover p{-webkit-text-decoration:underline;text-decoration:underline;text-underline-position:from-font;}/*!sc*/
data-styled.g319[id="sc-1xszjru-0"]{content:"ftYCoM,"}/*!sc*/
.fytga-d{border-bottom:0.1rem solid #555555;width:100%;}/*!sc*/
.fytga-d span{display:block;}/*!sc*/
@media screen and (min-width:1200px){.fytga-d span{display:inline;}.fytga-d span:first-child{margin-right:0.8rem;}}/*!sc*/
data-styled.g320[id="sc-dh4ait-0"]{content:"fytga-d,"}/*!sc*/
.TIjHP{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:1.2rem;}/*!sc*/
data-styled.g325[id="sc-i8q3i5-0"]{content:"TIjHP,"}/*!sc*/
.csAers{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:0.8rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;height:4rem;overflow:hidden;width:4rem;}/*!sc*/
data-styled.g326[id="sc-i8q3i5-1"]{content:"csAers,"}/*!sc*/
.flhvbZ{height:100%;width:100%;}/*!sc*/
data-styled.g327[id="sc-i8q3i5-2"]{content:"flhvbZ,"}/*!sc*/
.xbOra{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:0rem;white-space:nowrap;}/*!sc*/
data-styled.g328[id="sc-i8q3i5-3"]{content:"xbOra,"}/*!sc*/
.fLWZEZ{background:#111;display:none;position:fixed;z-index:100;top:10.4rem;bottom:0;left:0;right:0;width:100%;overflow:auto;}/*!sc*/
data-styled.g334[id="styled__Wrapper-sc-85iotp-0"]{content:"fLWZEZ,"}/*!sc*/
.bKVCoK{margin-bottom:15rem;padding-left:0;}/*!sc*/
data-styled.g335[id="styled__ContentWrapper-sc-85iotp-1"]{content:"bKVCoK,"}/*!sc*/
.gFUsAX{list-style:none;width:100%;border-bottom:0.1rem solid #2A2A2A;}/*!sc*/
.gFUsAX:first-of-type{border-top:0.1rem solid #2A2A2A;}/*!sc*/
data-styled.g336[id="styled__NavItemContainer-sc-85iotp-2"]{content:"gFUsAX,"}/*!sc*/
.iPznvT{padding:2.4rem 2rem 2.4rem 1.6rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/
@media screen and (min-width:900px){.iPznvT{padding-left:6.4rem;padding-right:6.4rem;}}/*!sc*/
data-styled.g337[id="styled__NavLinkContainer-sc-85iotp-3"]{content:"iPznvT,"}/*!sc*/
.hMQycd{font-family:Aeonik,sans-serif;font-weight:500;font-size:2rem;line-height:2.8rem;-webkit-letter-spacing:-0.01rem;-moz-letter-spacing:-0.01rem;-ms-letter-spacing:-0.01rem;letter-spacing:-0.01rem;color:#FFFEFA;display:inline-block;width:100%;}/*!sc*/
.hMQycd:hover{color:#BCBAFF;}/*!sc*/
data-styled.g338[id="styled__NavLink-sc-85iotp-4"]{content:"hMQycd,"}/*!sc*/
.fiLHFG{font-family:Aeonik,sans-serif;font-weight:500;font-size:2rem;line-height:2.8rem;-webkit-letter-spacing:0.01rem;-moz-letter-spacing:0.01rem;-ms-letter-spacing:0.01rem;letter-spacing:0.01rem;color:#FFFEFA;margin:0;padding:2.4rem 0 2.4rem 1.6rem;position:relative;-webkit-transition:color 0.2s;transition:color 0.2s;}/*!sc*/
.fiLHFG::before{border-style:solid;border-width:0.1em 0.1em 0 0;content:'';display:inline-block;height:1.4rem;right:3rem;top:calc(50% - 0.83rem);position:absolute;vertical-align:top;width:1.4rem;-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);-webkit-transition:-webkit-transform 0.4s ease;-webkit-transition:transform 0.4s ease;transition:transform 0.4s ease;}/*!sc*/
@media screen and (min-width:900px){.fiLHFG{padding-left:6.4rem;}.fiLHFG:before{right:7rem;}}/*!sc*/
data-styled.g339[id="styled__NavItemTitle-sc-85iotp-5"]{content:"fiLHFG,"}/*!sc*/
.iaTRLv{overflow:hidden;height:auto;-webkit-transition:max-height 0.3s ease-out;transition:max-height 0.3s ease-out;padding-left:1.6rem;background:#191919;height:0;max-height:0;}/*!sc*/
@media screen and (min-width:900px){.iaTRLv{padding-left:6.4rem;}}/*!sc*/
data-styled.g340[id="styled__NavItem-sc-85iotp-6"]{content:"iaTRLv,"}/*!sc*/
.jNLPXV:not(:last-of-type){margin-bottom:3.2rem;}/*!sc*/
.jNLPXV:last-of-type{padding-bottom:1.6rem;}/*!sc*/
data-styled.g341[id="styled__ColumnContainer-sc-85iotp-7"]{content:"jNLPXV,"}/*!sc*/
.gpNudx{font-family:Aeonik Mono,monospace;font-size:1.4rem;line-height:2rem;font-weight:500;-webkit-letter-spacing:0.14rem;-moz-letter-spacing:0.14rem;-ms-letter-spacing:0.14rem;letter-spacing:0.14rem;text-transform:uppercase;color:#8c929c;margin:0 0 2rem;padding-top:3.2rem;}/*!sc*/
data-styled.g342[id="styled__ColumnItemTitle-sc-85iotp-8"]{content:"gpNudx,"}/*!sc*/
.iiHmil{list-style:none;padding:0;margin:0;}/*!sc*/
data-styled.g344[id="styled__ColumnList-sc-85iotp-10"]{content:"iiHmil,"}/*!sc*/
.iWwpGx{font-family:Aeonik,sans-serif;font-size:2rem;line-height:2.8rem;-webkit-letter-spacing:0.01rem;-moz-letter-spacing:0.01rem;-ms-letter-spacing:0.01rem;letter-spacing:0.01rem;margin-bottom:2rem;}/*!sc*/
.iWwpGx a{color:#FFFEFA;display:inline-block;width:100%;}/*!sc*/
.iWwpGx a:hover{color:#BCBAFF;}/*!sc*/
data-styled.g345[id="styled__ColumnListItem-sc-85iotp-11"]{content:"iWwpGx,"}/*!sc*/
.hHGyKV{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%;padding:1.6rem;margin:0 auto;border-top:0.1rem solid #2A2A2A;position:fixed;bottom:0;left:0;right:0;text-align:center;background:#111;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/
@media screen and (min-width:900px){.hHGyKV{padding:3.2rem 6.4rem;}}/*!sc*/
data-styled.g349[id="styled__ButtonContainer-sc-85iotp-15"]{content:"hHGyKV,"}/*!sc*/
.uBLyR{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:1.6rem;}/*!sc*/
data-styled.g352[id="styled__SecondaryButtonContainer-sc-85iotp-18"]{content:"uBLyR,"}/*!sc*/
.dNgXDO{background:#242424;color:#FFFFFF;width:100%;margin:auto;font-size:1.4rem;line-height:2rem;text-align:left;font-family:Aeonik,sans-serif;border-bottom:0.1rem solid #41454C;border-bottom:0.2rem solid;border-image-slice:1;border-image-source:linear-gradient( 135deg,#4cb7a3 0%,#3f59e4 50%,#4016a0 100% );}/*!sc*/
@media screen and (min-width:900px){.dNgXDO{text-align:left;}}/*!sc*/
data-styled.g354[id="styled__Wrapper-sc-q607n8-0"]{content:"dNgXDO,"}/*!sc*/
.iLiwVc{width:100%;max-width:144rem;min-height:4rem;margin:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:1rem 1.6rem;}/*!sc*/
@media screen and (min-width:900px){.iLiwVc{padding:1rem 6.4rem;}}/*!sc*/
@media screen and (min-width:1200px){.iLiwVc{padding:0 6.4rem;}}/*!sc*/
data-styled.g355[id="styled__Container-sc-q607n8-1"]{content:"iLiwVc,"}/*!sc*/
.abKWi{-webkit-flex:1;-ms-flex:1;flex:1;padding:0;cursor:pointer;}/*!sc*/
@media screen and (min-width:900px){.abKWi{padding:0;}}/*!sc*/
@media screen and (min-width:1200px){.abKWi{padding:0.9rem 0;margin-right:2.4rem;}}/*!sc*/
.abKWi:hover .styled__CTA-sc-q607n8-4{color:#B6CAFF;}/*!sc*/
data-styled.g359[id="styled__Message-sc-q607n8-5"]{content:"abKWi,"}/*!sc*/
.hYamDF{display:none;}/*!sc*/
@media screen and (min-width:1200px){.hYamDF{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}/*!sc*/
data-styled.g360[id="styled__Buttons-sc-q607n8-6"]{content:"hYamDF,"}/*!sc*/
.kBIbqR{color:#FFFFFF;cursor:pointer;font-weight:500;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/
.kBIbqR:focus{outline:none;}/*!sc*/
.kBIbqR:hover,.kBIbqR:focus{color:#B6CAFF;}/*!sc*/
data-styled.g361[id="styled__Login-sc-q607n8-7"]{content:"kBIbqR,"}/*!sc*/
.eEIir{height:10.4rem;width:100%;margin:0 auto;}/*!sc*/
@media screen and (min-width:1200px){.eEIir{display:none;}}/*!sc*/
data-styled.g369[id="styled__HeaderBackMobile-sc-1755fzv-1"]{content:"eEIir,"}/*!sc*/
.zthfc{height:0.1rem;position:absolute;visibility:hidden;top:0;}/*!sc*/
data-styled.g370[id="styled__ObservedPixel-sc-1755fzv-2"]{content:"zthfc,"}/*!sc*/
.dkiGRF{position:fixed;top:0;left:0;width:100%;z-index:1000;color:#FFFEFA;}/*!sc*/
data-styled.g371[id="styled__Header-sc-1755fzv-3"]{content:"dkiGRF,"}/*!sc*/
.fFJcFb{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/
data-styled.g372[id="styled__LogoWrapper-sc-1755fzv-4"]{content:"fFJcFb,"}/*!sc*/
.fGauJV{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex:1;-ms-flex:1;flex:1;}/*!sc*/
data-styled.g373[id="styled__LogoWrapperMobile-sc-1755fzv-5"]{content:"fGauJV,"}/*!sc*/
.dNWFIo{-webkit-transition:background-color 0.2s ease,border-radius 0.2s ease;transition:background-color 0.2s ease,border-radius 0.2s ease;position:relative;display:none;width:100%;max-width:100%;margin:auto;padding:0 6.4rem;background-color:#111;}/*!sc*/
@media screen and (min-width:1200px){.dNWFIo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}}/*!sc*/
.dNWFIo:hover{background-color:#111;border-radius:0 0 1.6rem 1.6rem;}/*!sc*/
data-styled.g374[id="styled__NavDesktop-sc-1755fzv-6"]{content:"dNWFIo,"}/*!sc*/
.fRLSLz{max-width:131.2rem;width:100%;margin:auto;-webkit-transition:background-color 0.2s ease,border-radius 0.2s ease;transition:background-color 0.2s ease,border-radius 0.2s ease;position:relative;padding:0 6.4rem;background-color:#111;}/*!sc*/
@media screen and (min-width:1200px){.fRLSLz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:0;}}/*!sc*/
.fRLSLz:hover{background-color:#111;border-radius:0 0 1.6rem 1.6rem;}/*!sc*/
data-styled.g375[id="styled__NavDesktopContainer-sc-1755fzv-7"]{content:"fRLSLz,"}/*!sc*/
.bRCGlX{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/
data-styled.g376[id="styled__ButtonList-sc-1755fzv-8"]{content:"bRCGlX,"}/*!sc*/
.jNurLP{max-width:144rem;width:100%;margin:auto;padding:1.2rem 1.6rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;background-color:#111;height:6.4rem;box-shadow:inset 0 -0.1rem 0 #2A2A2A;position:relative;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/
@media screen and (min-width:900px){.jNurLP{padding:1.6rem 6.4rem;}}/*!sc*/
@media screen and (min-width:1200px){.jNurLP{display:none;}}/*!sc*/
data-styled.g377[id="styled__NavMobile-sc-1755fzv-9"]{content:"jNurLP,"}/*!sc*/
.bqIEwD{justify-self:flex-end;padding:2rem 0;}/*!sc*/
data-styled.g378[id="styled__RightColumnMobile-sc-1755fzv-10"]{content:"bqIEwD,"}/*!sc*/
.bFjHZg{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;background:transparent;height:2.4rem;margin:0;padding:0;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;cursor:pointer;-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out;}/*!sc*/
data-styled.g379[id="styled__BurgerIconWrapper-sc-1755fzv-11"]{content:"bFjHZg,"}/*!sc*/
.hRkwQd{width:2.2rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:0.25rem;background:#FFFFFF;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;margin-top:1.2rem;}/*!sc*/
.hRkwQd::before,.hRkwQd::after{content:'';position:absolute;width:2.2rem;height:0.25rem;background:#FFFFFF;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}/*!sc*/
.hRkwQd::before{-webkit-transform:translateY(-0.7rem);-ms-transform:translateY(-0.7rem);transform:translateY(-0.7rem);}/*!sc*/
.hRkwQd::after{-webkit-transform:translateY(0.7rem);-ms-transform:translateY(0.7rem);transform:translateY(0.7rem);}/*!sc*/
data-styled.g380[id="styled__BurgerIcon-sc-1755fzv-12"]{content:"hRkwQd,"}/*!sc*/
.eQMbwJ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0;list-style:none;margin:0;line-height:2.4rem;}/*!sc*/
data-styled.g381[id="styled__NavList-sc-1755fzv-13"]{content:"eQMbwJ,"}/*!sc*/
.fGxoAJ{color:#FFFEFA;cursor:initial;padding-top:0.9rem;width:104.4rem;position:absolute;left:0;right:0;margin:-0.1rem auto 0;top:6.4rem;display:inline-block;visibility:hidden;opacity:0;-webkit-transform:translateX(-1.6rem);-ms-transform:translateX(-1.6rem);transform:translateX(-1.6rem);-webkit-transition:visibility 0s,opacity 0.2s linear,-webkit-transform 0.2s linear;-webkit-transition:visibility 0s,opacity 0.2s linear,transform 0.2s linear;transition:visibility 0s,opacity 0.2s linear,transform 0.2s linear;}/*!sc*/
data-styled.g382[id="styled__NavElementContentWrapper-sc-1755fzv-14"]{content:"fGxoAJ,"}/*!sc*/
.bJSalM{position:relative;-webkit-transition:color 0.2s ease;transition:color 0.2s ease;color:#FFFEFA;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/
.bJSalM::after{content:'';-webkit-transition:border-color 0.2s ease,-webkit-transform 0.2s ease;-webkit-transition:border-color 0.2s ease,transform 0.2s ease;transition:border-color 0.2s ease,transform 0.2s ease;width:100%;height:0.2rem;border-bottom:0.2rem solid transparent;display:block;bottom:-1.6rem;position:absolute;left:0;-webkit-transform:scale(0,1);-ms-transform:scale(0,1);transform:scale(0,1);}/*!sc*/
data-styled.g383[id="styled__NavElementButton-sc-1755fzv-15"]{content:"bJSalM,"}/*!sc*/
.iKTrpL{font-family:Aeonik,sans-serif;padding:1.6rem 1.8rem;cursor:pointer;font-size:1.6rem;font-weight:500;line-height:3.2rem;-webkit-letter-spacing:0.02rem;-moz-letter-spacing:0.02rem;-ms-letter-spacing:0.02rem;letter-spacing:0.02rem;}/*!sc*/
.iKTrpL .styled__NavElementButton-sc-1755fzv-15 > svg{stroke:#FFFEFA;-webkit-transition:stroke 0.2s ease;transition:stroke 0.2s ease;padding-left:0.4rem;}/*!sc*/
.iKTrpL:hover{color:#BCBAFF;}/*!sc*/
.iKTrpL:hover .styled__NavElementContentWrapper-sc-1755fzv-14{visibility:visible;opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0);}/*!sc*/
.iKTrpL:hover .styled__NavElementButton-sc-1755fzv-15{color:#BCBAFF;}/*!sc*/
.iKTrpL:hover .styled__NavElementButton-sc-1755fzv-15::after{border-bottom-color:#BCBAFF;-webkit-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1);}/*!sc*/
.iKTrpL:hover .styled__NavElementButton-sc-1755fzv-15 > svg{stroke:#BCBAFF;}/*!sc*/
.iKTrpL:focus-visible{color:#BCBAFF;}/*!sc*/
.iKTrpL:focus-visible .styled__NavElementContentWrapper-sc-1755fzv-14{visibility:visible;opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0);}/*!sc*/
.iKTrpL:focus-visible .styled__NavElementButton-sc-1755fzv-15{color:#BCBAFF;}/*!sc*/
.iKTrpL:focus-visible .styled__NavElementButton-sc-1755fzv-15::after{border-bottom-color:#BCBAFF;-webkit-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1);}/*!sc*/
.iKTrpL:focus-visible .styled__NavElementButton-sc-1755fzv-15 > svg{stroke:#BCBAFF;}/*!sc*/
.iKTrpL:focus-within{color:#BCBAFF;}/*!sc*/
.iKTrpL:focus-within .styled__NavElementContentWrapper-sc-1755fzv-14{visibility:visible;opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0);}/*!sc*/
.iKTrpL:focus-within .styled__NavElementButton-sc-1755fzv-15{color:#BCBAFF;}/*!sc*/
.iKTrpL:focus-within .styled__NavElementButton-sc-1755fzv-15::after{border-bottom-color:#BCBAFF;-webkit-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1);}/*!sc*/
.iKTrpL:focus-within .styled__NavElementButton-sc-1755fzv-15 > svg{stroke:#BCBAFF;}/*!sc*/
data-styled.g384[id="styled__NavListEl-sc-1755fzv-16"]{content:"iKTrpL,"}/*!sc*/
.dGsguq{background:rgba(23,23,23,0.96);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);border:0.1rem solid #2A2A2A;border-radius:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/
data-styled.g385[id="styled__NavElementContent-sc-1755fzv-17"]{content:"dGsguq,"}/*!sc*/
.gvEHvo{min-width:31.1rem;width:31.1rem;padding:3.2rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/
data-styled.g390[id="styled__Column-sc-1ff7bch-0"]{content:"gvEHvo,"}/*!sc*/
.hRsuJa{border-right:0.1rem solid #2A2A2A;-webkit-flex:1;-ms-flex:1;flex:1;width:100%;min-width:33%;}/*!sc*/
.gBcyVH{border-right:0.1rem solid #2A2A2A;}/*!sc*/
data-styled.g391[id="styled__FirstColumn-sc-1ff7bch-1"]{content:"hRsuJa,gBcyVH,"}/*!sc*/
.bIPKhj{border-right:0.1rem solid #2A2A2A;-webkit-flex:1;-ms-flex:1;flex:1;width:100%;min-width:33%;}/*!sc*/
.ivjYJO{border-right:0.1rem solid #2A2A2A;}/*!sc*/
data-styled.g392[id="styled__SecondColumn-sc-1ff7bch-2"]{content:"bIPKhj,ivjYJO,"}/*!sc*/
.jCSyQN{width:auto;-webkit-flex:1;-ms-flex:1;flex:1;padding:3.2rem;width:100%;min-width:33%;}/*!sc*/
.cyrbvp{width:auto;-webkit-flex:1;-ms-flex:1;flex:1;padding:3.2rem 0;}/*!sc*/
.iEyNAY{width:auto;-webkit-flex:1;-ms-flex:1;flex:1;padding:0;width:100%;min-width:33%;}/*!sc*/
data-styled.g393[id="styled__ThirdColumn-sc-1ff7bch-3"]{content:"jCSyQN,cyrbvp,iEyNAY,"}/*!sc*/
.eyfGoo{list-style:none;padding:0;height:100%;}/*!sc*/
data-styled.g395[id="styled__List-sc-1p6pq9n-1"]{content:"eyfGoo,"}/*!sc*/
.RiFTv{margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-family:Aeonik,sans-serif;font-weight:500;font-size:1.4rem;line-height:2.4rem;color:#FFFFFF;}/*!sc*/
.RiFTv + li{margin-top:1.6rem;}/*!sc*/
.RiFTv svg{margin-right:1.4rem;min-width:2.4rem;}/*!sc*/
.RiFTv a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#FFFFFF;-webkit-transition:color 0.2s ease;transition:color 0.2s ease;width:100%;}/*!sc*/
.RiFTv a:hover{color:#BCBAFF;}/*!sc*/
.RiFTv:last-of-type{margin-bottom:3.2rem;}/*!sc*/
data-styled.g396[id="styled__Element-sc-1p6pq9n-2"]{content:"RiFTv,"}/*!sc*/
.jHuHbb{border-top:0.1rem solid #2A2A2A;padding-top:2.4rem;}/*!sc*/
data-styled.g398[id="styled__BottomLinkWrapper-sc-1p6pq9n-4"]{content:"jHuHbb,"}/*!sc*/
.eBvIde{list-style:none;padding:0;display:grid;grid-template-columns:1fr;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100%;}/*!sc*/
data-styled.g399[id="styled__List-sc-12vkkep-0"]{content:"eBvIde,"}/*!sc*/
.cudvhT{margin:0;padding:3.2rem;height:14.47rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/
.cudvhT + li{border-top:0.1rem solid #2A2A2A;}/*!sc*/
.cudvhT div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/
.cudvhT a{color:#BDC4CF;width:100%;}/*!sc*/
.cudvhT a svg{margin-right:1.4rem;}/*!sc*/
.cudvhT a p{margin:0;}/*!sc*/
.cudvhT a p:first-child{font-weight:500;color:#FFFFFF;-webkit-transition:color 0.2s ease;transition:color 0.2s ease;}/*!sc*/
.cudvhT a:hover p{color:#BDC4CF;}/*!sc*/
.cudvhT a:hover p:first-child{color:#BCBAFF;}/*!sc*/
data-styled.g400[id="styled__Element-sc-12vkkep-1"]{content:"cudvhT,"}/*!sc*/
.bRqMXF a{display:block;color:#FFFFFF;}/*!sc*/
.bRqMXF a:hover{color:#BCBAFF;}/*!sc*/
.bRqMXF a span{font-weight:500;}/*!sc*/
.bRqMXF a + a{margin-top:2.4rem;}/*!sc*/
.bRqMXF a + p{margin-top:3.6rem;}/*!sc*/
data-styled.g401[id="styled__Wrapper-sc-mvo3b8-0"]{content:"bRqMXF,"}/*!sc*/
.ayvvO{padding:0 3.2rem;display:block;margin-bottom:3.2rem;}/*!sc*/
.ayvvO:hover p:last-of-type{color:#BCBAFF;}/*!sc*/
data-styled.g405[id="styled__Link-sc-k7d9qa-0"]{content:"ayvvO,"}/*!sc*/
.fbWQZU{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/
data-styled.g406[id="styled__Container-sc-k7d9qa-1"]{content:"fbWQZU,"}/*!sc*/
.hokSGA{border-radius:0.8rem;width:100%;max-width:13rem;height:9rem;margin-right:1.9rem;object-fit:cover;}/*!sc*/
data-styled.g408[id="styled__Image-sc-k7d9qa-3"]{content:"hokSGA,"}/*!sc*/
.cxsqkw{border-top:0.1rem solid #2A2A2A;}/*!sc*/
data-styled.g409[id="styled__Divider-sc-25clja-0"]{content:"cxsqkw,"}/*!sc*/
.cGOMzv{padding:3.2rem 3.2rem 0 3.2rem;}/*!sc*/
data-styled.g410[id="styled__ItemsListContainer-sc-25clja-1"]{content:"cGOMzv,"}/*!sc*/
.kucwhF{position:relative;padding-left:0.8rem;z-index:100;}/*!sc*/
.kucwhF:after{content:'';position:absolute;left:0;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);display:inline-block;width:0.1rem;background:#242424;height:2.6rem;}/*!sc*/
data-styled.g411[id="sc-8aqj4j-0"]{content:"kucwhF,"}/*!sc*/
.jKKTiw{padding:0.6rem 0.55rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;background:#1E1E1E;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0.4rem;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;outline:0.4rem solid transparent;border:0.2rem solid #1E1E1E;outline-offset:0;}/*!sc*/
.jKKTiw:hover{background:#2A2A2A;}/*!sc*/
.jKKTiw:focus{outline-color:#6B665FCC;border-color:#B6CAFF;}/*!sc*/
data-styled.g412[id="sc-8aqj4j-1"]{content:"jKKTiw,"}/*!sc*/
.dfYoJq{display:none;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}/*!sc*/
data-styled.g413[id="sc-8aqj4j-2"]{content:"dfYoJq,"}/*!sc*/
.mKcbB{list-style:none;}/*!sc*/
data-styled.g414[id="sc-8aqj4j-3"]{content:"mKcbB,"}/*!sc*/
.iiTJAp{background:none;width:100%;text-align:left;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:0.8rem;padding:0.6rem 1.4rem;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;border-radius:0.6rem;outline:0.4rem solid transparent;border:0.2rem solid transparent;}/*!sc*/
.iiTJAp:hover{background:#2A2A2A;}/*!sc*/
.iiTJAp:disabled:hover{background:none;}/*!sc*/
.iiTJAp:disabled span{color:#383838;}/*!sc*/
.iiTJAp:disabled svg path{stroke:#383838;}/*!sc*/
.iiTJAp span{color:#B6CAFF;}/*!sc*/
.iiTJAp svg path{stroke:#B6CAFF;}/*!sc*/
.iiTJAp:focus{outline-color:#6B665FCC;border-color:#B6CAFF;}/*!sc*/
.jEjMME{background:none;width:100%;text-align:left;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:0.8rem;padding:0.6rem 1.4rem;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;border-radius:0.6rem;outline:0.4rem solid transparent;border:0.2rem solid transparent;}/*!sc*/
.jEjMME:hover{background:#2A2A2A;}/*!sc*/
.jEjMME:disabled:hover{background:none;}/*!sc*/
.jEjMME:disabled span{color:#383838;}/*!sc*/
.jEjMME:disabled svg path{fill:#383838;}/*!sc*/
.jEjMME:focus{outline-color:#6B665FCC;border-color:#B6CAFF;}/*!sc*/
data-styled.g415[id="sc-8aqj4j-4"]{content:"iiTJAp,jEjMME,"}/*!sc*/
.elIpEt{position:fixed;z-index:999;display:none;}/*!sc*/
@media screen and (min-width:1200px){.elIpEt{display:block;background:#171717;border-top:0.1rem solid #555555;width:100%;margin-top:10.6rem;top:0;}}/*!sc*/
data-styled.g416[id="sc-19z8ym3-0"]{content:"elIpEt,"}/*!sc*/
@media screen and (min-width:1200px){.hrcptN{height:6.4rem;width:100%;background:#111;position:absolute;top:-6.4rem;}}/*!sc*/
data-styled.g417[id="sc-19z8ym3-1"]{content:"hrcptN,"}/*!sc*/
.gcSNEs{max-width:144rem;padding:0 6.4rem;margin:0 auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:5.2rem;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/
.gcSNEs a:hover,.gcSNEs a:focus{color:#FFFEFA;}/*!sc*/
.gcSNEs a{outline:0.4rem solid transparent;border:0.2rem solid transparent;}/*!sc*/
@media screen and (min-width:1200px) and (max-width:1300px){.gcSNEs{gap:3.2rem;}}/*!sc*/
data-styled.g418[id="sc-19z8ym3-2"]{content:"gcSNEs,"}/*!sc*/
.cniTVj{margin:0;padding:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:2.8rem;}/*!sc*/
@media screen and (min-width:1200px) and (max-width:1300px){.cniTVj{gap:2rem;}.cniTVj a{font-size:1.4rem;line-height:1.8rem;}}/*!sc*/
data-styled.g419[id="sc-19z8ym3-3"]{content:"cniTVj,"}/*!sc*/
.bKPdrf{list-style:none;}/*!sc*/
.bKPdrf a{display:block;padding:2rem 0 1.8rem;}/*!sc*/
.bKPdrf:after{display:block;content:'';border-bottom:0.2rem solid #62C0EB;-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);-webkit-transition:-webkit-transform 0.4s ease-in-out;-webkit-transition:transform 0.4s ease-in-out;transition:transform 0.4s ease-in-out;}/*!sc*/
.bKPdrf:hover{color:inherit;}/*!sc*/
.bKPdrf:hover:after{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1);}/*!sc*/
.bKPdrf:hover a{color:#FFFEFA;}/*!sc*/
.hIcssb{list-style:none;}/*!sc*/
.hIcssb a{display:block;padding:2rem 0 1.8rem;}/*!sc*/
.hIcssb:after{display:block;content:'';border-bottom:0.2rem solid #4CB7A3;-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);-webkit-transition:-webkit-transform 0.4s ease-in-out;-webkit-transition:transform 0.4s ease-in-out;transition:transform 0.4s ease-in-out;}/*!sc*/
.hIcssb:hover{color:inherit;}/*!sc*/
.hIcssb:hover:after{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1);}/*!sc*/
.hIcssb:hover a{color:#FFFEFA;}/*!sc*/
.bUkNwj{list-style:none;}/*!sc*/
.bUkNwj a{display:block;padding:2rem 0 1.8rem;}/*!sc*/
.bUkNwj:after{display:block;content:'';border-bottom:0.2rem solid #B49BFC;-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);-webkit-transition:-webkit-transform 0.4s ease-in-out;-webkit-transition:transform 0.4s ease-in-out;transition:transform 0.4s ease-in-out;}/*!sc*/
.bUkNwj:hover{color:inherit;}/*!sc*/
.bUkNwj:hover:after{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1);}/*!sc*/
.bUkNwj:hover a{color:#FFFEFA;}/*!sc*/
.eLbgUW{list-style:none;}/*!sc*/
.eLbgUW a{display:block;padding:2rem 0 1.8rem;}/*!sc*/
.eLbgUW:after{display:block;content:'';border-bottom:0.2rem solid #E27133;-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);-webkit-transition:-webkit-transform 0.4s ease-in-out;-webkit-transition:transform 0.4s ease-in-out;transition:transform 0.4s ease-in-out;}/*!sc*/
.eLbgUW:hover{color:inherit;}/*!sc*/
.eLbgUW:hover:after{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1);}/*!sc*/
.eLbgUW:hover a{color:#FFFEFA;}/*!sc*/
.gQryoF{list-style:none;}/*!sc*/
.gQryoF a{display:block;padding:2rem 0 1.8rem;}/*!sc*/
.gQryoF:after{display:block;content:'';border-bottom:0.2rem solid #F4D594;-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);-webkit-transition:-webkit-transform 0.4s ease-in-out;-webkit-transition:transform 0.4s ease-in-out;transition:transform 0.4s ease-in-out;}/*!sc*/
.gQryoF:hover{color:inherit;}/*!sc*/
.gQryoF:hover:after{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1);}/*!sc*/
.gQryoF:hover a{color:#FFFEFA;}/*!sc*/
.fApbHo{list-style:none;}/*!sc*/
.fApbHo a{display:block;padding:2rem 0 1.8rem;}/*!sc*/
.fApbHo:after{display:block;content:'';border-bottom:0.2rem solid #7192EC;-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);-webkit-transition:-webkit-transform 0.4s ease-in-out;-webkit-transition:transform 0.4s ease-in-out;transition:transform 0.4s ease-in-out;}/*!sc*/
.fApbHo:hover{color:inherit;}/*!sc*/
.fApbHo:hover:after{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1);}/*!sc*/
.fApbHo:hover a{color:#FFFEFA;}/*!sc*/
.irGsht{list-style:none;}/*!sc*/
.irGsht a{display:block;padding:2rem 0 1.8rem;}/*!sc*/
.irGsht:after{display:block;content:'';border-bottom:0.2rem solid #E991B0;-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);-webkit-transition:-webkit-transform 0.4s ease-in-out;-webkit-transition:transform 0.4s ease-in-out;transition:transform 0.4s ease-in-out;}/*!sc*/
.irGsht:hover{color:inherit;}/*!sc*/
.irGsht:hover:after{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1);}/*!sc*/
.irGsht:hover a{color:#FFFEFA;}/*!sc*/
data-styled.g420[id="sc-19z8ym3-4"]{content:"bKPdrf,hIcssb,bUkNwj,eLbgUW,gQryoF,fApbHo,irGsht,"}/*!sc*/
.dyPfIj{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;}/*!sc*/
data-styled.g421[id="sc-19z8ym3-5"]{content:"dyPfIj,"}/*!sc*/
.eSPUCq{width:100vw;display:none;position:fixed;left:0;top:16rem;}/*!sc*/
.eSPUCq br{display:none;}/*!sc*/
.eSPUCq fieldset,.eSPUCq input{min-width:12.5rem;}/*!sc*/
.eSPUCq input{width:100%;}/*!sc*/
.eSPUCq input:focus{border-width:0.1rem;}/*!sc*/
@media screen and (min-width:900px){.eSPUCq{padding:0 6.4rem;}}/*!sc*/
@media screen and (max-width:1200px){.eSPUCq input{border-radius:0;border-width:0.1rem 0;}.eSPUCq input:hover{border-width:0.1rem 0;}}/*!sc*/
@media screen and (min-width:1200px) and (max-width:1300px){.eSPUCq{padding:0;padding-right:0.8rem;}}/*!sc*/
@media screen and (min-width:1200px){.eSPUCq{display:block;max-width:29rem;width:100%;position:relative;top:0;padding-right:1.6rem;}.eSPUCq input{max-height:4rem;max-width:29rem;width:100%;}.eSPUCq input:focus{border-width:0.1rem;}}/*!sc*/
data-styled.g424[id="sc-8jxe5n-1"]{content:"eSPUCq,"}/*!sc*/
.hvSkoO{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;margin:0;padding:0;}/*!sc*/
@media screen and (min-width:1200px){.hvSkoO{display:none;}}/*!sc*/
data-styled.g426[id="sc-8jxe5n-3"]{content:"hvSkoO,"}/*!sc*/
.bhCwNT{position:relative;}/*!sc*/
data-styled.g428[id="sc-1q6s0ef-0"]{content:"bhCwNT,"}/*!sc*/
.fbxvbT{display:block;background:#171717;border-top:0.1rem solid #555555;width:100%;z-index:200;position:fixed;}/*!sc*/
@media screen and (min-width:1200px){.fbxvbT{display:none;}}/*!sc*/
data-styled.g455[id="sc-1gkkh2j-0"]{content:"fbxvbT,"}/*!sc*/
.eVErOA{max-width:144rem;padding:1.2rem 1.6rem;margin:0 auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/
@media screen and (min-width:900px){.eVErOA{padding:1.2rem 6.4rem;}}/*!sc*/
data-styled.g456[id="sc-1gkkh2j-1"]{content:"eVErOA,"}/*!sc*/
.jPNeZR{visibility:hidden;z-index:8;position:absolute;background:#171717;width:100%;height:100vh;-webkit-transform:translateY(-1rem);-ms-transform:translateY(-1rem);transform:translateY(-1rem);-webkit-transition:-webkit-transform 0.5s ease,visibility 0.4s ease;-webkit-transition:transform 0.5s ease,visibility 0.4s ease;transition:transform 0.5s ease,visibility 0.4s ease;display:block;overflow-y:scroll;overflow-x:hidden;top:5.6rem;left:0;right:0;}/*!sc*/
data-styled.g457[id="sc-1gkkh2j-2"]{content:"jPNeZR,"}/*!sc*/
.fXwxQg{padding:0;margin:0;border:none;background:none;height:2.4rem;width:2.4rem;-webkit-transition:-webkit-transform 0.5s ease-in-out;-webkit-transition:transform 0.5s ease-in-out;transition:transform 0.5s ease-in-out;-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}/*!sc*/
data-styled.g459[id="sc-1gkkh2j-4"]{content:"fXwxQg,"}/*!sc*/
.cBqRxe{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/
data-styled.g460[id="sc-1gkkh2j-5"]{content:"cBqRxe,"}/*!sc*/
.iwsMfc{margin:0;padding:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;list-style:none;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;}/*!sc*/
data-styled.g461[id="sc-1gkkh2j-6"]{content:"iwsMfc,"}/*!sc*/
.jaXHAq{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:2.4rem 1.6rem;}/*!sc*/
data-styled.g462[id="sc-1gkkh2j-7"]{content:"jaXHAq,"}/*!sc*/
.jlBvRJ{list-style:none;border-bottom:0.1rem solid rgba(128,128,128,0.6);width:100%;background:linear-gradient(90deg,rgba(17,17,17,0.00) 0%,rgba(98,192,235,0.12) 100%);}/*!sc*/
.dwKbEo{list-style:none;border-bottom:0.1rem solid rgba(128,128,128,0.6);width:100%;background:linear-gradient(90deg,rgba(17,17,17,0.00) 0%,rgba(9,98,86,0.12) 100%);}/*!sc*/
.iAITpl{list-style:none;border-bottom:0.1rem solid rgba(128,128,128,0.6);width:100%;background:linear-gradient(90deg,rgba(17,17,17,0.00) 0%,rgba(117,73,242,0.12) 100%);}/*!sc*/
.iShXyr{list-style:none;border-bottom:0.1rem solid rgba(128,128,128,0.6);width:100%;background:linear-gradient(90deg,rgba(17,17,17,0.00) 0%,rgba(226,113,51,0.12) 100%);}/*!sc*/
.ekMTdZ{list-style:none;border-bottom:0.1rem solid rgba(128,128,128,0.6);width:100%;background:linear-gradient(90deg,rgba(17,17,17,0.00) 0%,rgba(244,213,148,0.12) 100%);}/*!sc*/
.jozhwi{list-style:none;border-bottom:0.1rem solid rgba(128,128,128,0.6);width:100%;background:linear-gradient(90deg,rgba(17,17,17,0.00) 0%,rgba(153,167,241,0.12) 100%);}/*!sc*/
.fJnPUQ{list-style:none;border-bottom:0.1rem solid rgba(128,128,128,0.6);width:100%;background:linear-gradient(90deg,rgba(17,17,17,0.00) 0%,rgba(233,145,176,0.12) 100%);}/*!sc*/
data-styled.g463[id="sc-1gkkh2j-8"]{content:"jlBvRJ,dwKbEo,iAITpl,iShXyr,ekMTdZ,jozhwi,fJnPUQ,"}/*!sc*/
.fnbKjy{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/
data-styled.g464[id="sc-1gkkh2j-9"]{content:"fnbKjy,"}/*!sc*/
.fdWrIp{border-bottom:0.1rem solid #808080;}/*!sc*/
data-styled.g466[id="sc-1gkkh2j-11"]{content:"fdWrIp,"}/*!sc*/
.jzgOkx{margin-right:1.6rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/
data-styled.g471[id="sc-1gkkh2j-16"]{content:"jzgOkx,"}/*!sc*/
.eqcnId{display:block;background:#E8DCC7;min-height:14rem;height:14rem;-webkit-transition:all 0.2s ease;transition:all 0.2s ease;width:100%;z-index:1;}/*!sc*/
@media screen and (min-width:1200px){.eqcnId{display:block;min-height:19.2rem;height:19.2rem;}}/*!sc*/
data-styled.g478[id="sc-1akycv5-0"]{content:"eqcnId,"}/*!sc*/
.bzOlzO{background-image:url(https://images.ctfassets.net/23aumh6u8s0i/6L2SgKnOjAgtu4asmHaBOW/67be3bef8f36e7ce5cb0a0b796415f23/01_HowWeHireEngineers-blog_588x528_3x-Alina);background-size:cover;background-position:center;height:100%;}/*!sc*/
.hqHxlx{background-image:url(https://images.ctfassets.net/23aumh6u8s0i/56S9oDWKVeNY8AIszkZvw1/7d6794f3d31d4eedb5a3d3699e796e5c/default);background-size:cover;background-position:center;height:100%;}/*!sc*/
data-styled.g479[id="sc-1akycv5-1"]{content:"bzOlzO,hqHxlx,"}/*!sc*/
.irkzRp{background:#1E1E1E;border-radius:1.6rem;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-transition:all 0.2s ease-in;transition:all 0.2s ease-in;overflow:hidden;position:relative;border-bottom:0.1rem solid #2A2A2A;}/*!sc*/
.irkzRp:before{position:absolute;content:'';inset:0;background:radial-gradient(70.73% 156.97% at 50% -67.43%,#4352A4 0%,#1E1E1E 100%);z-index:1;opacity:0;-webkit-transition:opacity 0.25s ease-in-out;transition:opacity 0.25s ease-in-out;}/*!sc*/
.irkzRp:hover:before{opacity:1;}/*!sc*/
.irkzRp:hover .sc-1akycv5-0{background:#3F59E4;opacity:1;}/*!sc*/
data-styled.g480[id="sc-1akycv5-2"]{content:"irkzRp,"}/*!sc*/
@media screen and (min-width:1200px){.bPXVfK{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:0.8rem;gap:1.6rem;}}/*!sc*/
data-styled.g481[id="sc-1akycv5-3"]{content:"bPXVfK,"}/*!sc*/
.dPYFps{padding:2.4rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;z-index:1;}/*!sc*/
@media screen and (min-width:1200px){.dPYFps{min-height:29.6rem;}}/*!sc*/
data-styled.g482[id="sc-1akycv5-4"]{content:"dPYFps,"}/*!sc*/
.ehBEGM{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:auto 0 0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:0 1.2rem;}/*!sc*/
.ehBEGM button{padding:0;}/*!sc*/
.ehBEGM button p:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/
data-styled.g483[id="sc-1akycv5-5"]{content:"ehBEGM,"}/*!sc*/
.xCgE{max-width:144rem;padding:5.6rem 1.6rem 0;margin:0 auto 4rem;}/*!sc*/
@media screen and (min-width:900px){.xCgE{padding:5.8rem 6.4rem 0;}}/*!sc*/
@media screen and (min-width:1200px){.xCgE{padding:23.6rem 6.4rem 0;position:relative;margin-bottom:8rem;}.xCgE:before{content:'';position:absolute;background:#7192EC;width:90rem;height:29.5rem;border-radius:96.7rem;-webkit-filter:blur(23rem);filter:blur(23rem);top:-27.2rem;left:-14rem;}@-moz-document url-prefix(){.xCgE:before{top:-15rem;}}}/*!sc*/
data-styled.g485[id="sc-1vditak-0"]{content:"xCgE,"}/*!sc*/
.fRpMLr{max-width:144rem;margin:0 auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;gap:3.2rem;border-bottom:0.1rem solid #2A2A2A;}/*!sc*/
@media screen and (min-width:1200px){.fRpMLr{display:grid;grid-template-columns:repeat(12,1fr);position:relative;padding-bottom:8rem;}}/*!sc*/
data-styled.g486[id="sc-1vditak-1"]{content:"fRpMLr,"}/*!sc*/
@media screen and (min-width:1200px){.gcBBOg{grid-column:1/7;z-index:2;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;}}/*!sc*/
data-styled.g487[id="sc-1vditak-2"]{content:"gcBBOg,"}/*!sc*/
.TDLvO{margin:3.2rem 0 4rem;}/*!sc*/
@media screen and (min-width:1200px){.TDLvO{margin-bottom:0;}}/*!sc*/
data-styled.g488[id="sc-1vditak-3"]{content:"TDLvO,"}/*!sc*/
.fqoTOq{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:2.4rem;margin-bottom:3.2rem;}/*!sc*/
@media screen and (min-width:900px){.fqoTOq{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}}/*!sc*/
@media screen and (min-width:1200px){.fqoTOq{gap:2.4rem 4rem;margin-bottom:2.4rem;}}/*!sc*/
data-styled.g489[id="sc-1vditak-4"]{content:"fqoTOq,"}/*!sc*/
.kPYhCI{margin:0 -1.6rem;width:calc(100% + 3.2rem);}/*!sc*/
@media screen and (min-width:900px){.kPYhCI{width:100%;margin:0 auto;}}/*!sc*/
@media screen and (min-width:1200px){.kPYhCI{grid-column:7 / 13;justify-self:flex-end;margin:0 0;border-radius:1.6rem;overflow:hidden;z-index:2;max-width:60rem;width:100%;}}/*!sc*/
data-styled.g490[id="sc-1vditak-5"]{content:"kPYhCI,"}/*!sc*/
.csokAW{width:100%;object-fit:cover;}/*!sc*/
@media screen and (min-width:1200px){.csokAW{height:45.6rem;width:60rem;}}/*!sc*/
data-styled.g491[id="sc-1vditak-6"]{content:"csokAW,"}/*!sc*/
.cjaJus{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:3.2rem;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/
data-styled.g492[id="sc-1vditak-7"]{content:"cjaJus,"}/*!sc*/
.iIECrc{border-color:#B6CAFF;border-left-width:0.4rem;margin:4.8rem 0;padding:2.4rem 0 2.4rem 2.4rem;}/*!sc*/
@media screen and (min-width:1200px){.iIECrc{padding:1.6rem 0 1.6rem 4rem;}}/*!sc*/
data-styled.g519[id="sc-7ovv77-0"]{content:"iIECrc,"}/*!sc*/
.ixUiOW{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;margin:1.6rem 0 0;border:0.1rem solid #555555;gap:0.8rem;padding:0.8rem;border-radius:0.8rem;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:border 0.2s ease-in-out;transition:border 0.2s ease-in-out;}/*!sc*/
.ixUiOW span{-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}/*!sc*/
.ixUiOW:hover{border:0.1rem solid #B6CAFF;}/*!sc*/
.ixUiOW:hover span{color:#B6CAFF;}/*!sc*/
data-styled.g553[id="sc-1w6xcbn-0"]{content:"ixUiOW,"}/*!sc*/
.hthBSw{font-family:Inter,sans-serif;color:#E5E5E5;font-size:2rem;line-height:3.6rem;}/*!sc*/
@media screen and (min-width:1200px){.hthBSw{font-size:1.8rem;line-height:3.2rem;}}/*!sc*/
data-styled.g561[id="sc-1v0wo3i-0"]{content:"hthBSw,"}/*!sc*/
.heSQis{display:inline-block;border:0.1rem solid rgba(220,221,225,0.16);background:linear-gradient(126deg,rgba(24,24,25,0.77) 0%,rgba(24,24,25,0.5) 100%);color:#E5E5E5;-webkit-scrollbar-color:#808080 transparent;-moz-scrollbar-color:#808080 transparent;-ms-scrollbar-color:#808080 transparent;scrollbar-color:#808080 transparent;-webkit-scrollbar-width:thin;-moz-scrollbar-width:thin;-ms-scrollbar-width:thin;scrollbar-width:thin;border-radius:0.4rem;padding:0.4rem;white-space:pre;line-height:1.6rem;font-size:1.6rem;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;max-width:100%;overflow-x:auto;vertical-align:middle;}/*!sc*/
data-styled.g562[id="sc-1xg6er-0"]{content:"heSQis,"}/*!sc*/
.cLBDjU{font-family:Inter,sans-serif;color:#E5E5E5;font-size:2rem;line-height:3.6rem;}/*!sc*/
.cLBDjU pre{display:inline-block;font-size:2rem;line-height:2rem;padding:0.4rem !important;margin:0 !important;overflow:unset !important;}/*!sc*/
@media screen and (min-width:1200px){.cLBDjU{font-size:1.8rem;line-height:3.2rem;}.cLBDjU pre{display:inline-block;font-size:1.6rem;line-height:2rem;}}/*!sc*/
data-styled.g570[id="sc-13lpndi-7"]{content:"cLBDjU,"}/*!sc*/
.ifMAwf{font-family:Inter,sans-serif;color:#E5E5E5;font-size:2rem;line-height:3.6rem;margin-inline-start:-0.8rem;}/*!sc*/
.ifMAwf li{padding-left:0.4rem;}/*!sc*/
.ifMAwf pre{display:inline-block;font-size:2rem;line-height:2rem;padding:0.4rem !important;margin:0 !important;overflow:unset !important;}/*!sc*/
@media screen and (min-width:1200px){.ifMAwf{font-size:1.8rem;line-height:3.2rem;}.ifMAwf pre{display:inline-block;font-size:1.6rem;line-height:2rem;}}/*!sc*/
data-styled.g571[id="sc-13lpndi-8"]{content:"ifMAwf,"}/*!sc*/
.uiRQQ{color:#99A7F1;}/*!sc*/
.uiRQQ:hover{color:#B6CAFF;}/*!sc*/
data-styled.g572[id="sc-13lpndi-9"]{content:"uiRQQ,"}/*!sc*/
.lgnrbm{font-style:normal;border-color:#B6CAFF;border-width:0.4rem;padding:2.4rem 0 2.4rem 2.4rem;margin:4.8rem 0;}/*!sc*/
.lgnrbm p{font-family:Aeonik,sans-serif;font-size:2.4rem;margin:0;line-height:4rem;color:#FFFEFA!important;}/*!sc*/
@media screen and (min-width:1200px){.lgnrbm{padding:1.6rem 0 1.6rem 4rem;}}/*!sc*/
data-styled.g573[id="sc-13lpndi-10"]{content:"lgnrbm,"}/*!sc*/
div:has(> .sc-13lpndi-12){color:#E5E5E5;}/*!sc*/
data-styled.g575[id="sc-13lpndi-12"]{content:"gMCFZd,"}/*!sc*/
.lhHlKO{overflow-y:hidden;}/*!sc*/
.lhHlKO img,.lhHlKO .embed-container,.lhHlKO video{border-radius:1.6rem;margin:2.4rem 0;}/*!sc*/
.lhHlKO img,.lhHlKO video{max-width:100%;}/*!sc*/
.lhHlKO iframe{width:100%;height:auto;aspect-ratio:16 / 9;margin-bottom:2.4rem;}/*!sc*/
.lhHlKO > div >:first-child{margin-top:0;}/*!sc*/
.lhHlKO p,.lhHlKO ul,.lhHlKO ol{color:#E5E5E5;}/*!sc*/
.lhHlKO p a,.lhHlKO ul a,.lhHlKO ol a{color:#99A7F1;-webkit-text-decoration:underline;text-decoration:underline;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;position:relative;text-underline-position:from-font;}/*!sc*/
.lhHlKO p a:hover,.lhHlKO ul a:hover,.lhHlKO ol a:hover{color:#B6CAFF;}/*!sc*/
.lhHlKO p a:active,.lhHlKO ul a:active,.lhHlKO ol a:active{color:#3F59E4;}/*!sc*/
.lhHlKO p a:focus,.lhHlKO ul a:focus,.lhHlKO ol a:focus{border-radius:0.8rem;color:#99A7F1;outline:0;}/*!sc*/
.lhHlKO p a:focus:before,.lhHlKO ul a:focus:before,.lhHlKO ol a:focus:before{content:'';position:absolute;width:calc(100% + 0.5rem);height:calc(100% + 0.3rem);top:-0.1rem;left:-0.2rem;border-radius:0.8rem;border:0.2rem solid #B6CAFF;}/*!sc*/
.lhHlKO pre{padding:0 !important;margin-bottom:3.2rem;}/*!sc*/
.lhHlKO pre > pre{-webkit-backdrop-filter:blur(4rem);backdrop-filter:blur(4rem);padding:2.4rem !important;margin:0 !important;max-height:39rem;-webkit-scrollbar-color:#808080 transparent;-moz-scrollbar-color:#808080 transparent;-ms-scrollbar-color:#808080 transparent;scrollbar-color:#808080 transparent;}/*!sc*/
.lhHlKO p pre,.lhHlKO li pre,.lhHlKO h2 pre,.lhHlKO h3 pre,.lhHlKO h4 pre,.lhHlKO h4 pre,.lhHlKO h5 pre,.lhHlKO h6 pre,.lhHlKO .alert pre{padding:0rem 0.4rem !important;display:inline-block;font-size:2rem;line-height:2rem;margin:0 !important;overflow:unset !important;vertical-align:baseline;}/*!sc*/
.lhHlKO h2 pre{vertical-align:text-bottom;font-size:3.2rem !important;}/*!sc*/
.lhHlKO h2 code{vertical-align:middle;font-size:2.4rem !important;}/*!sc*/
.lhHlKO h3 pre,.lhHlKO h4 pre,.lhHlKO h4 pre,.lhHlKO h5 pre,.lhHlKO h6 pre{vertical-align:text-bottom;}/*!sc*/
.lhHlKO p code,.lhHlKO h2 code,.lhHlKO h3 code,.lhHlKO h4 code,.lhHlKO h5 code,.lhHlKO h6 code,.lhHlKO ul code,.lhHlKO table code{white-space:break-spaces !important;overflow-x:auto !important;overflow-wrap:anywhere !important;vertical-align:middle;}/*!sc*/
.lhHlKO .alert{padding:2.4rem;display:grid;grid-template-columns:2.4rem auto;grid-template-areas:'img text' 'img text' 'img text' 'img text';-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:0 2.4rem;font-family:Aeonik,sans-serif;font-size:1.6rem;font-style:normal;font-weight:400;line-height:2.8rem;-webkit-letter-spacing:0.0032rem;-moz-letter-spacing:0.0032rem;-ms-letter-spacing:0.0032rem;letter-spacing:0.0032rem;position:relative;color:#E5E5E5;margin-bottom:3.2rem;border-radius:0.8rem;}/*!sc*/
.lhHlKO .alert strong,.lhHlKO .alert b{font-weight:500;}/*!sc*/
.lhHlKO .alert br{display:none;}/*!sc*/
.lhHlKO .alert svg{grid-area:img;justify-self:center;width:100%;margin:0;}/*!sc*/
.lhHlKO .alert-info{border:0.1rem solid #B6CAFF;background:linear-gradient( 0deg, rgba(30,30,30,0.9) 0%, rgba(30,30,30,0.9) 100% ),#B6CAFF;}/*!sc*/
.lhHlKO .alert-danger{border:0.1rem solid #F2AC84;background:linear-gradient( 0deg, rgba(30,30,30,0.9) 0%, rgba(30,30,30,0.9) 100% ),#F2AC84;}/*!sc*/
.lhHlKO .alert-success{border:0.1rem solid #8FC88A;background:linear-gradient( 0deg, rgba(30,30,30,0.9) 0%, rgba(30,30,30,0.9) 100% ),#8FC88A;}/*!sc*/
.lhHlKO th{color:#191919;}/*!sc*/
@media screen and (min-width:1200px){.lhHlKO{grid-column:5 / 13;padding:0;}.lhHlKO p pre,.lhHlKO li pre{display:inline-block;font-size:1.6rem;line-height:2rem;}}/*!sc*/
data-styled.g576[id="sc-k4hn9e-0"]{content:"lhHlKO,"}/*!sc*/
.cUEqsB{background:linear-gradient(90deg,#4016a0 0%,#f2ac84 100%);height:0.4rem;position:fixed;top:16.1rem;left:0;opacity:0;-webkit-transition:width 0.2s ease;transition:width 0.2s ease;}/*!sc*/
@media screen and (min-width:1200px){.cUEqsB{display:none;}}/*!sc*/
data-styled.g577[id="sc-k4hn9e-1"]{content:"cUEqsB,"}/*!sc*/
.kXubaV{padding:4rem 2.4rem;margin:4rem auto 0;max-width:144rem;background:#1E1E1E;border-radius:2.4rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/
.kXubaV span{color:#E5E5E5;}/*!sc*/
@media screen and (min-width:900px){.kXubaV{padding:4rem 4.8rem;}}/*!sc*/
data-styled.g578[id="sc-k4hn9e-2"]{content:"kXubaV,"}/*!sc*/
.bWnqDv{display:grid;grid-template-columns:8rem 1fr;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:2.4rem;margin:2.4rem 0;}/*!sc*/
data-styled.g579[id="sc-k4hn9e-3"]{content:"bWnqDv,"}/*!sc*/
.dMCDEs{width:6.4rem;height:6.4rem;border-radius:0.8rem;margin:0 !important;}/*!sc*/
@media screen and (min-width:900px){.dMCDEs{width:7.2rem;height:7.2rem;}}/*!sc*/
@media screen and (min-width:1200px){.dMCDEs{width:8rem;height:8rem;}}/*!sc*/
data-styled.g580[id="sc-k4hn9e-4"]{content:"dMCDEs,"}/*!sc*/
.BmSii{background:#111111;padding-top:1.2rem;}/*!sc*/
data-styled.g686[id="styled__Wrapper-sc-1gk46x3-0"]{content:"BmSii,"}/*!sc*/
.jxcAek{width:100%;max-width:144rem;margin:auto;font-family:Inter,sans-serif;padding:0 1.6rem;}/*!sc*/
@media screen and (min-width:900px){.jxcAek{padding:0 6.4rem;}}/*!sc*/
data-styled.g687[id="styled__Content-sc-1gk46x3-1"]{content:"jxcAek,"}/*!sc*/
.jzCMRh{display:grid;grid-template-columns:1fr 1fr;grid-row-gap:4.8rem;margin:4.8rem auto auto;}/*!sc*/
@media screen and (min-width:900px){.jzCMRh{margin:6.4rem auto auto;}}/*!sc*/
@media screen and (min-width:1200px){.jzCMRh{grid-template-columns:1fr 1fr 1fr 1fr;grid-template-rows:1fr 1fr;margin:8rem auto auto;max-width:131.2rem;}}/*!sc*/
data-styled.g688[id="styled__Nav-sc-1gk46x3-2"]{content:"jzCMRh,"}/*!sc*/
.djugOZ{list-style:none;margin-bottom:0;padding-left:0;}/*!sc*/
data-styled.g689[id="styled__LinksList-sc-1gk46x3-3"]{content:"djugOZ,"}/*!sc*/
.kFpsIR{font-weight:500;font-size:1.4rem;line-height:3.2rem;-webkit-letter-spacing:-0.001rem;-moz-letter-spacing:-0.001rem;-ms-letter-spacing:-0.001rem;letter-spacing:-0.001rem;padding-right:3.2rem;}/*!sc*/
.kFpsIR a{color:#fff;}/*!sc*/
.kFpsIR a span{background:linear-gradient( 59deg,#4016a0 -18.49%,#3f59e4 38.74%,#4cb7a3 106.36% );padding:0.1rem 0.6rem;border-radius:0.4rem;margin-left:0.8rem;color:#fff;font-weight:600;}/*!sc*/
.kFpsIR a:hover{color:#bcbaff;}/*!sc*/
@media screen and (min-width:900px){.kFpsIR p::before{content:'';margin-right:0.8rem;border-left:0.1rem solid #8c929c;height:1.2rem;display:inline-block;}}/*!sc*/
data-styled.g691[id="styled__LinksListItem-sc-1gk46x3-5"]{content:"kFpsIR,"}/*!sc*/
.hLaJwg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/
.hLaJwg > ul{-webkit-flex:1;-ms-flex:1;flex:1;}/*!sc*/
data-styled.g692[id="styled__LastSection-sc-1gk46x3-6"]{content:"hLaJwg,"}/*!sc*/
.gMSNHd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;grid-gap:1.6rem;margin-left:1.6rem;display:none;}/*!sc*/
@media screen and (min-width:900px){.gMSNHd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-left:0;}}/*!sc*/
.iMfwFS{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;grid-gap:1.6rem;margin-left:1.6rem;}/*!sc*/
@media screen and (min-width:900px){.iMfwFS{display:none;}}/*!sc*/
data-styled.g693[id="styled__Icons-sc-1gk46x3-7"]{content:"gMSNHd,iMfwFS,"}/*!sc*/
.gkIZFT{height:2.4rem;}/*!sc*/
.gkIZFT:hover{cursor:pointer;}/*!sc*/
.gkIZFT:hover path{fill:#bcbaff;}/*!sc*/
data-styled.g694[id="styled__IconsLink-sc-1gk46x3-8"]{content:"gkIZFT,"}/*!sc*/
.cmjEfG{padding:2.4rem 0 0;position:relative;margin-top:4.8rem;}/*!sc*/
@media screen and (min-width:900px){.cmjEfG{display:none;}}/*!sc*/
data-styled.g695[id="styled__FooterBottomMobile-sc-1gk46x3-9"]{content:"cmjEfG,"}/*!sc*/
.eUSWhy{display:none;}/*!sc*/
@media screen and (min-width:900px){.eUSWhy{display:block;border-top:0.1rem solid #5a5f66;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2.4rem 0;position:relative;margin-top:4.8rem;}}/*!sc*/
@media screen and (min-width:1200px){.eUSWhy{margin-top:10rem;}}/*!sc*/
data-styled.g696[id="styled__FooterBottom-sc-1gk46x3-10"]{content:"eUSWhy,"}/*!sc*/
.cGOVjJ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:2.4rem 1.6rem;}/*!sc*/
data-styled.g697[id="styled__LegalAndLangMobile-sc-1gk46x3-11"]{content:"cGOVjJ,"}/*!sc*/
.gczZFN{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-weight:500;color:#8c929c;grid-gap:0.6rem;font-size:1.2rem;line-height:1.8rem;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-flow:wrap;-ms-flex-flow:wrap;flex-flow:wrap;}/*!sc*/
.gczZFN img{max-width:4rem;}/*!sc*/
.gczZFN a{color:#8c929c;}/*!sc*/
.gczZFN a:hover{color:#bcbaff;}/*!sc*/
@media screen and (min-width:900px){.gczZFN{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;}}/*!sc*/
@media screen and (min-width:1200px){.gczZFN{font-size:1.4rem;line-height:2.2rem;}}/*!sc*/
data-styled.g698[id="styled__Legal-sc-1gk46x3-12"]{content:"gczZFN,"}/*!sc*/
.bGvBko{padding:1.6rem;border:0.1rem solid transparent;border-radius:0.8rem;background:linear-gradient( to right, #1E1E1E, #1E1E1E ), linear-gradient( 96deg, #191919 -24.32%, #4016a0 1.41%, #3f59e4 20.57%, #f2ac84 56.75%, #f6f1e7 79.7%, #191919 96.24% );background-clip:padding-box,border-box;background-origin:padding-box,border-box;}/*!sc*/
data-styled.g732[id="sc-1lvx3a4-0"]{content:"bGvBko,"}/*!sc*/
.NHmSD{display:none;max-width:30.4rem;}/*!sc*/
@media screen and (min-width:1200px){.NHmSD{grid-column:1/5;display:block;}}/*!sc*/
data-styled.g733[id="sc-5jonrv-0"]{content:"NHmSD,"}/*!sc*/
.gIutRo{display:unset;}/*!sc*/
data-styled.g734[id="sc-5jonrv-1"]{content:"gIutRo,"}/*!sc*/
.ShPZw{position:-webkit-sticky;position:sticky;top:19rem;}/*!sc*/
data-styled.g737[id="sc-5jonrv-4"]{content:"ShPZw,"}/*!sc*/
.hrXGXz{list-style:none;margin:0;padding:0;}/*!sc*/
data-styled.g741[id="sc-5jonrv-8"]{content:"hrXGXz,"}/*!sc*/
.fZRVTq{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:1.2rem;margin-bottom:5.6rem;}/*!sc*/
data-styled.g743[id="sc-1iw8hf7-0"]{content:"fZRVTq,"}/*!sc*/
.gMKMkL{margin-bottom:5.6rem;}/*!sc*/
data-styled.g744[id="sc-2sym2c-0"]{content:"gMKMkL,"}/*!sc*/
.kIyLtY{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:1.2rem;}/*!sc*/
data-styled.g745[id="sc-2sym2c-1"]{content:"kIyLtY,"}/*!sc*/
.kjXFtJ{padding:0;background:none;width:4rem;height:4rem;border:0.01rem solid #555555;border-radius:0.8rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/
.kjXFtJ:hover{background:linear-gradient( 180deg, rgba(153,153,153,0.23) -4.35%, rgba(255,255,255,0) 100% );border-radius:0.8rem;border:0.01rem solid #808080;}/*!sc*/
data-styled.g746[id="sc-2sym2c-2"]{content:"kjXFtJ,"}/*!sc*/
.ccdMVH{position:relative;}/*!sc*/
data-styled.g750[id="sc-2sym2c-6"]{content:"ccdMVH,"}/*!sc*/
.gRFZvM{margin:4rem 0;}/*!sc*/
.gRFZvM > div > p:first-of-type{border-bottom-color:!important;}/*!sc*/
@media screen and (min-width:1200px){.gRFZvM{margin:0 0 8rem;}}/*!sc*/
data-styled.g753[id="sc-k75pvh-0"]{content:"gRFZvM,"}/*!sc*/
.jYsUzS{width:100%;min-width:100%;min-height:100%;}/*!sc*/
.jYsUzS:not(:last-of-type){margin-right:3.2rem;}/*!sc*/
.jYsUzS > a{height:100%;}/*!sc*/
@media screen and (min-width:900px){.jYsUzS{min-width:calc(50% - 1.6rem);}}/*!sc*/
@media screen and (min-width:1200px){.jYsUzS{min-width:calc(33% - 1.8rem);}}/*!sc*/
data-styled.g754[id="sc-k75pvh-1"]{content:"jYsUzS,"}/*!sc*/
.ifwtBO{max-width:144rem;margin:0 auto;padding:0 1.6rem;}/*!sc*/
@media screen and (min-width:900px){.ifwtBO{padding:0 6.4rem;}}/*!sc*/
@media screen and (min-width:1200px){.ifwtBO{display:grid;grid-template-columns:repeat(12,1fr);gap:3.2rem;}}/*!sc*/
data-styled.g755[id="sc-t4xvu3-0"]{content:"ifwtBO,"}/*!sc*/
.bPENYC{display:block;}/*!sc*/
@media screen and (min-width:1200px){.bPENYC{margin-top:8rem;}}/*!sc*/
data-styled.g756[id="sc-t4xvu3-1"]{content:"bPENYC,"}/*!sc*/
.ivrKga{padding:4rem 1.6rem 0;}/*!sc*/
@media screen and (min-width:900px){.ivrKga{padding:4rem 6.4rem 0;}}/*!sc*/
@media screen and (min-width:1200px){.ivrKga{display:none;}}/*!sc*/
data-styled.g757[id="sc-t4xvu3-2"]{content:"ivrKga,"}/*!sc*/
body{background:#111;}/*!sc*/
data-styled.g759[id="sc-global-dSHlga1"]{content:"sc-global-dSHlga1,"}/*!sc*/
</style></head><body itemscope="" itemType="http://schema.org/WebPage"><div id="__next"><script src="https://cdn.cookielaw.org/scripttemplates/otSDKStub.js" type="text/javascript" charSet="UTF-8" data-domain-script="96e22fd8-d619-4cdd-a3c6-d51529d21faf" id="consent-script"></script><script>
function OptanonWrapper() {
const status = document.getElementById("onetrust-accept-btn-handler") ? 'waitingForConsent' : 'expressedConsent';
window.top.postMessage(status, '*');
}
</script><script>window.datafile=undefined</script><div class="styled__ObservedPixel-sc-1755fzv-2 zthfc"></div><div class="styled__HeaderBackMobile-sc-1755fzv-1 eEIir"></div><header class="styled__Header-sc-1755fzv-3 dkiGRF"><div class="styled__Wrapper-sc-q607n8-0 dNgXDO"><div class="styled__Container-sc-q607n8-1 iLiwVc"><a class="styled__Message-sc-q607n8-5 abKWi"></a><div class="styled__Buttons-sc-q607n8-6 hYamDF"><a href="/api/auth/login?redirectTo=dashboard" rel="external" class="styled__Login-sc-q607n8-7 kBIbqR">Login</a></div></div></div><nav aria-label="Mobile nav" class="styled__NavMobile-sc-1755fzv-9 jNurLP"><a rel="external" href="/" aria-label="Auth0 logo" class="styled__LogoWrapperMobile-sc-1755fzv-5 fGauJV"><svg xmlns="http://www.w3.org/2000/svg" width="106" height="40" viewBox="0 0 106 40" fill="none"><path d="M1.69096 17.4795C6.93608 16.6184 11.0487 12.5058 11.9098 7.26068L12.3326 4.70858C12.4108 4.21277 12.009 3.77959 11.5079 3.81612C7.51539 4.12404 3.75249 5.44967 1.67009 6.30037C0.662823 6.71268 0 7.69386 0 8.78985V16.8532C0 17.3282 0.422753 17.6883 0.892465 17.61L1.69096 17.4795Z" fill="#FFFEFA"></path><path d="M14.4356 7.26056C15.2968 12.5057 19.4094 16.6183 24.6545 17.4794L25.453 17.6099C25.9227 17.6882 26.3454 17.3281 26.3454 16.8531V8.78973C26.3454 7.69895 25.6826 6.71777 24.6753 6.30025C22.5982 5.44433 18.83 4.12392 14.8375 3.816C14.3365 3.77947 13.9294 4.21265 14.0129 4.70846L14.4356 7.26056Z" fill="#FFFEFA"></path><path d="M24.6589 20.0112C19.4138 20.8723 15.3012 24.9849 14.44 30.23L13.9181 35.209C13.8712 35.6578 14.367 35.9762 14.7428 35.7257C14.7428 35.7257 14.748 35.7257 14.7532 35.7205C18.0412 33.5024 25.5461 27.6936 26.2872 20.4392C26.3238 20.0843 26.0054 19.792 25.6557 19.8494L24.6641 20.0112H24.6589Z" fill="#FFFEFA"></path><path d="M11.9075 30.2277C11.0464 24.9826 6.9338 20.87 1.68868 20.0088L0.618783 19.8314C0.305641 19.7792 0.0238052 20.0401 0.0551193 20.3585C0.759688 27.6547 8.36904 33.5 11.6831 35.7181C12.0276 35.9477 12.4816 35.6711 12.4399 35.2588L11.9128 30.2225L11.9075 30.2277Z" fill="#FFFEFA"></path><path d="M62.7942 13.954H60.297C60.1456 13.954 60.0267 14.073 60.0267 14.2243V21.4295C60.0267 22.3105 59.8807 23.0835 59.5889 23.7483C59.297 24.4132 58.8862 24.9213 58.3511 25.2672C57.8159 25.6132 57.1835 25.7861 56.4538 25.7861C55.4052 25.7861 54.616 25.4402 54.0917 24.7483C53.5674 24.0564 53.3026 23.0619 53.3026 21.77V14.2243C53.3026 14.073 53.1837 13.954 53.0323 13.954H50.5081C50.3567 13.954 50.2378 14.073 50.2378 14.2243V22.0781C50.2378 23.2943 50.3891 24.3105 50.6864 25.1267C50.9837 25.9429 51.3945 26.6023 51.908 27.1104C52.4215 27.6185 53.0107 27.9752 53.6809 28.1915C54.3458 28.4077 55.0431 28.5158 55.7728 28.5158C56.8214 28.5158 57.6916 28.3158 58.3889 27.9104C58.9024 27.6131 59.3348 27.2834 59.697 26.9158C59.8483 26.7591 60.1078 26.8455 60.151 27.0564L60.3456 28.1212C60.3672 28.2509 60.4807 28.3428 60.6105 28.3428H62.7834C62.9347 28.3428 63.0536 28.2239 63.0536 28.0725V14.2243C63.0536 14.073 62.9347 13.954 62.7834 13.954H62.7942Z" fill="#FFFEFA"></path><path d="M73.644 25.6751H70.3846C69.8062 25.6751 69.3954 25.5562 69.163 25.3237C68.9306 25.0913 68.8117 24.6913 68.8117 24.1292V16.897C68.8117 16.7456 68.9306 16.6267 69.0819 16.6267H73.5034C73.6548 16.6267 73.7737 16.5078 73.7737 16.3564V14.2268C73.7737 14.0754 73.6548 13.9565 73.5034 13.9565H69.3522C69.0549 13.9565 68.8117 13.7133 68.8117 13.416V9.85394C68.8117 9.70259 68.6928 9.58368 68.5414 9.58368H66.0442C65.8928 9.58368 65.7739 9.70259 65.7739 9.85394V24.4427C65.7739 25.7562 66.082 26.7345 66.7036 27.3777C67.3198 28.0264 68.3144 28.3453 69.6819 28.3453H73.644C73.7953 28.3453 73.9142 28.2264 73.9142 28.075V25.9453C73.9142 25.794 73.7953 25.6751 73.644 25.6751Z" fill="#FFFEFA"></path><path d="M86.3392 14.5169C85.4852 14.0304 84.4907 13.7872 83.3447 13.7872C82.4475 13.7872 81.6205 13.9655 80.8691 14.3223C80.3286 14.5817 79.8475 14.9006 79.4367 15.2844C79.2638 15.4466 78.9881 15.3223 78.9881 15.0898V8.93866C78.9881 8.78731 78.8692 8.6684 78.7178 8.6684H76.1936C76.0423 8.6684 75.9233 8.78731 75.9233 8.93866V28.0732C75.9233 28.2246 76.0423 28.3435 76.1936 28.3435H78.7178C78.8692 28.3435 78.9881 28.2246 78.9881 28.0732V21.0626C78.9881 20.1275 79.1395 19.3167 79.4367 18.6303C79.734 17.9492 80.1611 17.4195 80.7178 17.0411C81.2691 16.6682 81.9232 16.479 82.6691 16.479C83.415 16.479 84.0096 16.6465 84.4961 16.9871C84.9825 17.3222 85.3501 17.7979 85.5933 18.4086C85.8366 19.0194 85.9609 19.7437 85.9609 20.587V28.0732C85.9609 28.2246 86.0798 28.3435 86.2311 28.3435H88.7284C88.8797 28.3435 88.9986 28.2246 88.9986 28.0732V20.3329C88.9986 18.8735 88.7716 17.6573 88.3122 16.6952C87.8527 15.7276 87.1987 15.0033 86.3446 14.5169H86.3392Z" fill="#FFFEFA"></path><path d="M104.469 12.9455C103.891 11.5239 103.064 10.4267 101.994 9.65913C100.923 8.89158 99.6423 8.50781 98.1451 8.50781C96.6478 8.50781 95.3884 8.89158 94.3073 9.65913C93.2317 10.4267 92.3993 11.5239 91.8209 12.9455C91.2426 14.3725 90.9507 16.0752 90.9507 18.0589V18.9561C90.9507 20.9615 91.2426 22.6804 91.8209 24.1128C92.3993 25.5451 93.2317 26.637 94.3073 27.3883C95.383 28.1397 96.664 28.5126 98.1451 28.5126C99.6261 28.5126 100.929 28.1397 101.994 27.3883C103.058 26.637 103.885 25.5451 104.469 24.1128C105.048 22.6804 105.339 20.9615 105.339 18.9561V18.0589C105.339 16.0752 105.048 14.3671 104.469 12.9455ZM94.0155 19.3021C94.0155 19.1507 94.0155 18.9994 94.0155 18.848V18.1724C94.0155 15.886 94.3722 14.1347 95.0857 12.9185C95.7992 11.7023 96.8208 11.0915 98.1505 11.0915C99.3883 11.0915 100.356 11.6158 101.058 12.6699C101.329 13.0482 101.096 13.5293 100.983 13.659L95.4424 19.8372C94.9506 20.3885 94.0425 20.048 94.0263 19.3129L94.0155 19.3021ZM102.275 18.848C102.275 21.1182 101.918 22.8587 101.204 24.0749C100.491 25.2911 99.4693 25.9019 98.1397 25.9019C96.9181 25.9019 95.9559 25.3884 95.2587 24.3614C94.9884 23.9884 95.2208 23.5128 95.3343 23.3776L100.853 17.1886C101.345 16.6373 102.253 16.9724 102.269 17.7129C102.269 17.8643 102.269 18.021 102.269 18.1778V18.8534L102.275 18.848Z" fill="#FFFEFA"></path><path d="M48.5034 25.7039H48.4277C48.125 25.7039 47.9142 25.6391 47.7791 25.5093C47.6493 25.3796 47.5845 25.1364 47.5845 24.7796V19.0176C47.5845 17.315 47.0602 16.0177 46.0115 15.1259C44.9629 14.234 43.4927 13.7908 41.6009 13.7908C40.4009 13.7908 39.3469 13.98 38.4388 14.3529C37.5307 14.7259 36.8064 15.2556 36.2605 15.9421C35.7794 16.5474 35.4767 17.2447 35.347 18.0339C35.32 18.196 35.4551 18.3474 35.6173 18.3474H38.0712C38.1956 18.3474 38.2983 18.2609 38.3307 18.1366C38.4766 17.5961 38.7955 17.1528 39.2982 16.8123C39.8604 16.4285 40.5793 16.2339 41.4603 16.2339C42.4333 16.2339 43.1954 16.461 43.7359 16.9204C44.2765 17.3799 44.5521 18.0123 44.5521 18.8176V19.4176C44.5521 19.569 44.4332 19.6879 44.2819 19.6879H41.0117C39.028 19.6879 37.5145 20.0879 36.4713 20.8825C35.4335 21.677 34.9092 22.8175 34.9092 24.2986C34.9092 25.1796 35.1362 25.9364 35.5848 26.5742C36.0335 27.212 36.6551 27.6931 37.455 28.0228C38.2496 28.3525 39.1631 28.5147 40.1955 28.5147C41.5468 28.5147 42.6441 28.2012 43.4981 27.5741C43.8711 27.2985 44.2062 26.985 44.4981 26.6444C44.6386 26.4769 44.9143 26.5363 44.9629 26.7471C45.0386 27.1039 45.1845 27.4174 45.3954 27.6714C45.7683 28.1201 46.4656 28.3471 47.4764 28.3471H48.779C48.9304 28.3471 49.0493 28.2282 49.0493 28.0768V26.1526C49.0493 25.785 48.9304 25.7039 48.5088 25.7039H48.5034ZM44.5467 22.5311C44.5467 23.2229 44.39 23.8499 44.0711 24.4013C43.7522 24.9526 43.3035 25.385 42.7198 25.6931C42.1414 26.0012 41.4333 26.158 40.6117 26.158C39.7901 26.158 39.1631 25.9634 38.6874 25.5796C38.2118 25.1958 37.9685 24.704 37.9685 24.104C37.9685 23.3743 38.2172 22.8283 38.7145 22.4716C39.2118 22.1148 39.9252 21.9365 40.8658 21.9365H44.5467V22.5256V22.5311Z" fill="#FFFEFA"></path></svg></a><div class="styled__RightColumnMobile-sc-1755fzv-10 bqIEwD"><button aria-label="Menu" aria-expanded="false" class="styled__BurgerIconWrapper-sc-1755fzv-11 bFjHZg"><span class="styled__BurgerIcon-sc-1755fzv-12 hRkwQd"></span></button></div><section class="styled__Wrapper-sc-85iotp-0 fLWZEZ"><ul class="styled__ContentWrapper-sc-85iotp-1 bKVCoK"><li class="styled__NavItemContainer-sc-85iotp-2 gFUsAX"><p class="styled__NavItemTitle-sc-85iotp-5 fiLHFG">Developers</p><div class="styled__NavItem-sc-85iotp-6 iaTRLv"><div class="styled__ColumnContainer-sc-85iotp-7 jNLPXV"><p class="styled__ColumnItemTitle-sc-85iotp-8 gpNudx">Developers</p><ul class="styled__ColumnList-sc-85iotp-10 iiHmil"><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://developer.auth0.com/" rel="external">Developer Center</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://developer.auth0.com/resources/code-samples" rel="external">Code Samples</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://developer.auth0.com/resources/guides" rel="external">Guides</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://identityunlocked.auth0.com/public/49/Identity,-Unlocked.--bed7fada" rel="external">Identity Unlocked - Podcasts</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://developer.auth0.com/newsletter" rel="external">Zero Index Newsletter</a></li></ul></div><div class="styled__ColumnContainer-sc-85iotp-7 jNLPXV"><p class="styled__ColumnItemTitle-sc-85iotp-8 gpNudx">Developer Tools</p><ul class="styled__ColumnList-sc-85iotp-10 iiHmil"><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://openidconnect.net/" rel="external">OIDC Connect Playground</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://samltool.io/" rel="external">SAML Tool</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="http://jwt.io/" rel="external">JWT.io</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="http://webauthn.me/" rel="external">Webauthn.me</a></li></ul></div><div class="styled__ColumnContainer-sc-85iotp-7 jNLPXV"><p class="styled__ColumnItemTitle-sc-85iotp-8 gpNudx">Get Involved</p><ul class="styled__ColumnList-sc-85iotp-10 iiHmil"><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://developer.auth0.com/events" rel="external">Events</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/research-program" rel="external">Auth0 Research Program</a></li></ul></div></div></li><li class="styled__NavItemContainer-sc-85iotp-2 gFUsAX"><p class="styled__NavItemTitle-sc-85iotp-5 fiLHFG">Documentation</p><div class="styled__NavItem-sc-85iotp-6 iaTRLv"><div class="styled__ColumnContainer-sc-85iotp-7 jNLPXV"><p class="styled__ColumnItemTitle-sc-85iotp-8 gpNudx">Documentation</p><ul class="styled__ColumnList-sc-85iotp-10 iiHmil"><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/docs" rel="external">Auth0 Docs</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/docs/articles" rel="external">Articles</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/docs/quickstarts" rel="external">Quickstarts</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/docs/api" rel="external">APIs</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/docs/libraries" rel="external">SDK Libraries</a></li></ul></div><div class="styled__ColumnContainer-sc-85iotp-7 jNLPXV"><p class="styled__ColumnItemTitle-sc-85iotp-8 gpNudx">Support Center</p><ul class="styled__ColumnList-sc-85iotp-10 iiHmil"><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://community.auth0.com/" rel="external">Community</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://support.auth0.com/" rel="external">Support</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://support.auth0.com/center/s/knowledge" rel="external">Knowledge Base</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://marketplace.auth0.com" rel="external">Explore Auth0 Marketplace</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/resources" rel="external">Resources</a></li></ul></div><div class="styled__ColumnContainer-sc-85iotp-7 jNLPXV"><ul class="styled__ColumnList-sc-85iotp-10 iiHmil"><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/blog/" rel="external">Blog</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://support.auth0.com/center/s/learning" rel="external">Learn</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/intro-to-iam" rel="external">Intro to IAM (CIAM)</a></li></ul></div></div></li><li class="styled__NavItemContainer-sc-85iotp-2 gFUsAX"><p class="styled__NavItemTitle-sc-85iotp-5 fiLHFG">Product</p><div class="styled__NavItem-sc-85iotp-6 iaTRLv"><div class="styled__ColumnContainer-sc-85iotp-7 jNLPXV"><p class="styled__ColumnItemTitle-sc-85iotp-8 gpNudx">Platform</p><ul class="styled__ColumnList-sc-85iotp-10 iiHmil"><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://auth0.com/ai" rel="external">Auth0 for AI Agents</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/platform/access-management" rel="external">Access Management</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/platform/extensibility" rel="external">Extensibility</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/platform/login-security" rel="external">Security</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/platform/user-management" rel="external">User Management</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/platform/authentication" rel="external">Authentication</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/fine-grained-authorization" rel="external">Fine-Grained Authorization</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://auth0.com/platform" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 gOnbZW ghiElA">View platform</a></li></ul></div><div class="styled__ColumnContainer-sc-85iotp-7 jNLPXV"><p class="styled__ColumnItemTitle-sc-85iotp-8 gpNudx">Features</p><ul class="styled__ColumnList-sc-85iotp-10 iiHmil"><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/features/universal-login" rel="external">Universal Login</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/features/single-sign-on" rel="external">Single Sign-On</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/features/multifactor-authentication" rel="external">Multifactor Authentication</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/features/actions" rel="external">Actions</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/features/machine-to-machine" rel="external">Machine to Machine</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/features/passwordless" rel="external">Passwordless</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/features/breached-passwords" rel="external">Breached Passwords</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/features/token-vault" rel="external">Token Vault</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://auth0.com/features" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 gOnbZW ghiElA">View features</a></li></ul></div></div></li><li class="styled__NavItemContainer-sc-85iotp-2 gFUsAX"><p class="styled__NavItemTitle-sc-85iotp-5 fiLHFG">Solutions</p><div class="styled__NavItem-sc-85iotp-6 iaTRLv"><div class="styled__ColumnContainer-sc-85iotp-7 jNLPXV"><p class="styled__ColumnItemTitle-sc-85iotp-8 gpNudx"> </p><ul class="styled__ColumnList-sc-85iotp-10 iiHmil"><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="https://auth0.com/customer-identity-trends-report" rel="external">Customer Identity Trends Report 2025</a></li></ul></div><div class="styled__ColumnContainer-sc-85iotp-7 jNLPXV"><p class="styled__ColumnItemTitle-sc-85iotp-8 gpNudx">Industries</p><ul class="styled__ColumnList-sc-85iotp-10 iiHmil"><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/retail" rel="external">Retail</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/financial-services" rel="external">Financial Services</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/nonprofits" rel="external">Nonprofits &amp; Charities</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/startups" rel="external">Startups</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/healthcare" rel="external">Healthcare</a></li></ul></div><div class="styled__ColumnContainer-sc-85iotp-7 jNLPXV"><p class="styled__ColumnItemTitle-sc-85iotp-8 gpNudx">Use Cases</p><ul class="styled__ColumnList-sc-85iotp-10 iiHmil"><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/b2c-customer-identity-management" rel="external">Consumer Applications</a></li><li class="styled__ColumnListItem-sc-85iotp-11 iWwpGx"><a href="/b2b-saas" rel="external">B2B SaaS Applications</a></li></ul></div></div></li><li class="styled__NavItemContainer-sc-85iotp-2 styled__NavLinkContainer-sc-85iotp-3 gFUsAX iPznvT"><a href="/blog/" rel="external" class="styled__NavLink-sc-85iotp-4 hMQycd">Blog</a></li><li class="styled__NavItemContainer-sc-85iotp-2 styled__NavLinkContainer-sc-85iotp-3 gFUsAX iPznvT"><a href="/pricing/" rel="external" class="styled__NavLink-sc-85iotp-4 hMQycd">Pricing</a></li></ul><div class="styled__ButtonContainer-sc-85iotp-15 hHGyKV"><div class="styled__SecondaryButtonContainer-sc-85iotp-18 uBLyR"><a rel="external" href="/signup?place=header&amp;type=button&amp;text=sign%20up" role="button" tabindex="0" class="styled__Button-sc-1hwml9q-0 utils-sc-11hlfw-0 kSiIA jgibCU"><span>Sign up</span></a><a href="/api/auth/login?redirectTo=dashboard" rel="external" role="button" tabindex="0" class="styled__Button-sc-1hwml9q-0 utils-sc-11hlfw-0 frejTe jgibCU"><span>Login</span></a></div><a href="/contact-us?place=header&amp;type=button&amp;text=let&#x27;s%20connect" role="button" tabindex="0" class="styled__Button-sc-1hwml9q-0 utils-sc-11hlfw-0 kSiIA cydknG"><span>Let&#x27;s connect</span></a></div></section></nav><nav aria-label="Desktop nav" class="styled__NavDesktop-sc-1755fzv-6 dNWFIo"><div class="styled__NavDesktopContainer-sc-1755fzv-7 fRLSLz"><a rel="external" href="/" aria-label="Auth0 logo" class="styled__LogoWrapper-sc-1755fzv-4 fFJcFb"><svg xmlns="http://www.w3.org/2000/svg" width="106" height="40" viewBox="0 0 106 40" fill="none"><path d="M1.69096 17.4795C6.93608 16.6184 11.0487 12.5058 11.9098 7.26068L12.3326 4.70858C12.4108 4.21277 12.009 3.77959 11.5079 3.81612C7.51539 4.12404 3.75249 5.44967 1.67009 6.30037C0.662823 6.71268 0 7.69386 0 8.78985V16.8532C0 17.3282 0.422753 17.6883 0.892465 17.61L1.69096 17.4795Z" fill="#FFFEFA"></path><path d="M14.4356 7.26056C15.2968 12.5057 19.4094 16.6183 24.6545 17.4794L25.453 17.6099C25.9227 17.6882 26.3454 17.3281 26.3454 16.8531V8.78973C26.3454 7.69895 25.6826 6.71777 24.6753 6.30025C22.5982 5.44433 18.83 4.12392 14.8375 3.816C14.3365 3.77947 13.9294 4.21265 14.0129 4.70846L14.4356 7.26056Z" fill="#FFFEFA"></path><path d="M24.6589 20.0112C19.4138 20.8723 15.3012 24.9849 14.44 30.23L13.9181 35.209C13.8712 35.6578 14.367 35.9762 14.7428 35.7257C14.7428 35.7257 14.748 35.7257 14.7532 35.7205C18.0412 33.5024 25.5461 27.6936 26.2872 20.4392C26.3238 20.0843 26.0054 19.792 25.6557 19.8494L24.6641 20.0112H24.6589Z" fill="#FFFEFA"></path><path d="M11.9075 30.2277C11.0464 24.9826 6.9338 20.87 1.68868 20.0088L0.618783 19.8314C0.305641 19.7792 0.0238052 20.0401 0.0551193 20.3585C0.759688 27.6547 8.36904 33.5 11.6831 35.7181C12.0276 35.9477 12.4816 35.6711 12.4399 35.2588L11.9128 30.2225L11.9075 30.2277Z" fill="#FFFEFA"></path><path d="M62.7942 13.954H60.297C60.1456 13.954 60.0267 14.073 60.0267 14.2243V21.4295C60.0267 22.3105 59.8807 23.0835 59.5889 23.7483C59.297 24.4132 58.8862 24.9213 58.3511 25.2672C57.8159 25.6132 57.1835 25.7861 56.4538 25.7861C55.4052 25.7861 54.616 25.4402 54.0917 24.7483C53.5674 24.0564 53.3026 23.0619 53.3026 21.77V14.2243C53.3026 14.073 53.1837 13.954 53.0323 13.954H50.5081C50.3567 13.954 50.2378 14.073 50.2378 14.2243V22.0781C50.2378 23.2943 50.3891 24.3105 50.6864 25.1267C50.9837 25.9429 51.3945 26.6023 51.908 27.1104C52.4215 27.6185 53.0107 27.9752 53.6809 28.1915C54.3458 28.4077 55.0431 28.5158 55.7728 28.5158C56.8214 28.5158 57.6916 28.3158 58.3889 27.9104C58.9024 27.6131 59.3348 27.2834 59.697 26.9158C59.8483 26.7591 60.1078 26.8455 60.151 27.0564L60.3456 28.1212C60.3672 28.2509 60.4807 28.3428 60.6105 28.3428H62.7834C62.9347 28.3428 63.0536 28.2239 63.0536 28.0725V14.2243C63.0536 14.073 62.9347 13.954 62.7834 13.954H62.7942Z" fill="#FFFEFA"></path><path d="M73.644 25.6751H70.3846C69.8062 25.6751 69.3954 25.5562 69.163 25.3237C68.9306 25.0913 68.8117 24.6913 68.8117 24.1292V16.897C68.8117 16.7456 68.9306 16.6267 69.0819 16.6267H73.5034C73.6548 16.6267 73.7737 16.5078 73.7737 16.3564V14.2268C73.7737 14.0754 73.6548 13.9565 73.5034 13.9565H69.3522C69.0549 13.9565 68.8117 13.7133 68.8117 13.416V9.85394C68.8117 9.70259 68.6928 9.58368 68.5414 9.58368H66.0442C65.8928 9.58368 65.7739 9.70259 65.7739 9.85394V24.4427C65.7739 25.7562 66.082 26.7345 66.7036 27.3777C67.3198 28.0264 68.3144 28.3453 69.6819 28.3453H73.644C73.7953 28.3453 73.9142 28.2264 73.9142 28.075V25.9453C73.9142 25.794 73.7953 25.6751 73.644 25.6751Z" fill="#FFFEFA"></path><path d="M86.3392 14.5169C85.4852 14.0304 84.4907 13.7872 83.3447 13.7872C82.4475 13.7872 81.6205 13.9655 80.8691 14.3223C80.3286 14.5817 79.8475 14.9006 79.4367 15.2844C79.2638 15.4466 78.9881 15.3223 78.9881 15.0898V8.93866C78.9881 8.78731 78.8692 8.6684 78.7178 8.6684H76.1936C76.0423 8.6684 75.9233 8.78731 75.9233 8.93866V28.0732C75.9233 28.2246 76.0423 28.3435 76.1936 28.3435H78.7178C78.8692 28.3435 78.9881 28.2246 78.9881 28.0732V21.0626C78.9881 20.1275 79.1395 19.3167 79.4367 18.6303C79.734 17.9492 80.1611 17.4195 80.7178 17.0411C81.2691 16.6682 81.9232 16.479 82.6691 16.479C83.415 16.479 84.0096 16.6465 84.4961 16.9871C84.9825 17.3222 85.3501 17.7979 85.5933 18.4086C85.8366 19.0194 85.9609 19.7437 85.9609 20.587V28.0732C85.9609 28.2246 86.0798 28.3435 86.2311 28.3435H88.7284C88.8797 28.3435 88.9986 28.2246 88.9986 28.0732V20.3329C88.9986 18.8735 88.7716 17.6573 88.3122 16.6952C87.8527 15.7276 87.1987 15.0033 86.3446 14.5169H86.3392Z" fill="#FFFEFA"></path><path d="M104.469 12.9455C103.891 11.5239 103.064 10.4267 101.994 9.65913C100.923 8.89158 99.6423 8.50781 98.1451 8.50781C96.6478 8.50781 95.3884 8.89158 94.3073 9.65913C93.2317 10.4267 92.3993 11.5239 91.8209 12.9455C91.2426 14.3725 90.9507 16.0752 90.9507 18.0589V18.9561C90.9507 20.9615 91.2426 22.6804 91.8209 24.1128C92.3993 25.5451 93.2317 26.637 94.3073 27.3883C95.383 28.1397 96.664 28.5126 98.1451 28.5126C99.6261 28.5126 100.929 28.1397 101.994 27.3883C103.058 26.637 103.885 25.5451 104.469 24.1128C105.048 22.6804 105.339 20.9615 105.339 18.9561V18.0589C105.339 16.0752 105.048 14.3671 104.469 12.9455ZM94.0155 19.3021C94.0155 19.1507 94.0155 18.9994 94.0155 18.848V18.1724C94.0155 15.886 94.3722 14.1347 95.0857 12.9185C95.7992 11.7023 96.8208 11.0915 98.1505 11.0915C99.3883 11.0915 100.356 11.6158 101.058 12.6699C101.329 13.0482 101.096 13.5293 100.983 13.659L95.4424 19.8372C94.9506 20.3885 94.0425 20.048 94.0263 19.3129L94.0155 19.3021ZM102.275 18.848C102.275 21.1182 101.918 22.8587 101.204 24.0749C100.491 25.2911 99.4693 25.9019 98.1397 25.9019C96.9181 25.9019 95.9559 25.3884 95.2587 24.3614C94.9884 23.9884 95.2208 23.5128 95.3343 23.3776L100.853 17.1886C101.345 16.6373 102.253 16.9724 102.269 17.7129C102.269 17.8643 102.269 18.021 102.269 18.1778V18.8534L102.275 18.848Z" fill="#FFFEFA"></path><path d="M48.5034 25.7039H48.4277C48.125 25.7039 47.9142 25.6391 47.7791 25.5093C47.6493 25.3796 47.5845 25.1364 47.5845 24.7796V19.0176C47.5845 17.315 47.0602 16.0177 46.0115 15.1259C44.9629 14.234 43.4927 13.7908 41.6009 13.7908C40.4009 13.7908 39.3469 13.98 38.4388 14.3529C37.5307 14.7259 36.8064 15.2556 36.2605 15.9421C35.7794 16.5474 35.4767 17.2447 35.347 18.0339C35.32 18.196 35.4551 18.3474 35.6173 18.3474H38.0712C38.1956 18.3474 38.2983 18.2609 38.3307 18.1366C38.4766 17.5961 38.7955 17.1528 39.2982 16.8123C39.8604 16.4285 40.5793 16.2339 41.4603 16.2339C42.4333 16.2339 43.1954 16.461 43.7359 16.9204C44.2765 17.3799 44.5521 18.0123 44.5521 18.8176V19.4176C44.5521 19.569 44.4332 19.6879 44.2819 19.6879H41.0117C39.028 19.6879 37.5145 20.0879 36.4713 20.8825C35.4335 21.677 34.9092 22.8175 34.9092 24.2986C34.9092 25.1796 35.1362 25.9364 35.5848 26.5742C36.0335 27.212 36.6551 27.6931 37.455 28.0228C38.2496 28.3525 39.1631 28.5147 40.1955 28.5147C41.5468 28.5147 42.6441 28.2012 43.4981 27.5741C43.8711 27.2985 44.2062 26.985 44.4981 26.6444C44.6386 26.4769 44.9143 26.5363 44.9629 26.7471C45.0386 27.1039 45.1845 27.4174 45.3954 27.6714C45.7683 28.1201 46.4656 28.3471 47.4764 28.3471H48.779C48.9304 28.3471 49.0493 28.2282 49.0493 28.0768V26.1526C49.0493 25.785 48.9304 25.7039 48.5088 25.7039H48.5034ZM44.5467 22.5311C44.5467 23.2229 44.39 23.8499 44.0711 24.4013C43.7522 24.9526 43.3035 25.385 42.7198 25.6931C42.1414 26.0012 41.4333 26.158 40.6117 26.158C39.7901 26.158 39.1631 25.9634 38.6874 25.5796C38.2118 25.1958 37.9685 24.704 37.9685 24.104C37.9685 23.3743 38.2172 22.8283 38.7145 22.4716C39.2118 22.1148 39.9252 21.9365 40.8658 21.9365H44.5467V22.5256V22.5311Z" fill="#FFFEFA"></path></svg></a><ul role="menubar" class="styled__NavList-sc-1755fzv-13 eQMbwJ"><li role="menuitem" aria-haspopup="true" tabindex="0" class="styled__NavListEl-sc-1755fzv-16 iKTrpL"><div class="styled__NavElementButton-sc-1755fzv-15 bJSalM"><span>Developers</span><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="chevron-down"><path id="icon" fill-rule="evenodd" clip-rule="evenodd" d="M7.99994 9.93934L12.4696 5.46967L13.5303 6.53033L8.53027 11.5303C8.23738 11.8232 7.76251 11.8232 7.46961 11.5303L2.46961 6.53033L3.53027 5.46967L7.99994 9.93934Z" fill="#FFFEFA"></path></g></svg></div><div class="styled__NavElementContentWrapper-sc-1755fzv-14 fGxoAJ"><section class="styled__NavElementContent-sc-1755fzv-17 dGsguq"><section class="styled__Column-sc-1ff7bch-0 styled__FirstColumn-sc-1ff7bch-1 gvEHvo hRsuJa"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ kqDxFL">Developers</p><ul role="menubar" class="styled__List-sc-1p6pq9n-1 eyfGoo"><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://developer.auth0.com/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Developer Center</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://developer.auth0.com/resources/code-samples" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Code Samples</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://developer.auth0.com/resources/guides" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Guides</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://identityunlocked.auth0.com/public/49/Identity,-Unlocked.--bed7fada" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Identity Unlocked - Podcasts</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://developer.auth0.com/newsletter" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Zero Index Newsletter</a></li></ul></section><section class="styled__Column-sc-1ff7bch-0 styled__SecondColumn-sc-1ff7bch-2 gvEHvo bIPKhj"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ kqDxFL">Developer Tools</p><ul role="menubar" class="styled__List-sc-1p6pq9n-1 eyfGoo"><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://openidconnect.net/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">OIDC Connect Playground</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://samltool.io/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">SAML Tool</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="http://jwt.io/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">JWT.io</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="http://webauthn.me/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Webauthn.me</a></li></ul></section><section class="styled__Column-sc-1ff7bch-0 styled__ThirdColumn-sc-1ff7bch-3 gvEHvo jCSyQN"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ kqDxFL">Get Involved</p><ul role="menubar" class="styled__List-sc-1p6pq9n-1 eyfGoo"><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://developer.auth0.com/events" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Events</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/research-program" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Auth0 Research Program</a></li></ul></section></section></div></li><li role="menuitem" aria-haspopup="true" tabindex="0" class="styled__NavListEl-sc-1755fzv-16 iKTrpL"><div class="styled__NavElementButton-sc-1755fzv-15 bJSalM"><span>Documentation</span><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="chevron-down"><path id="icon" fill-rule="evenodd" clip-rule="evenodd" d="M7.99994 9.93934L12.4696 5.46967L13.5303 6.53033L8.53027 11.5303C8.23738 11.8232 7.76251 11.8232 7.46961 11.5303L2.46961 6.53033L3.53027 5.46967L7.99994 9.93934Z" fill="#FFFEFA"></path></g></svg></div><div class="styled__NavElementContentWrapper-sc-1755fzv-14 fGxoAJ"><section class="styled__NavElementContent-sc-1755fzv-17 dGsguq"><section class="styled__Column-sc-1ff7bch-0 styled__FirstColumn-sc-1ff7bch-1 gvEHvo gBcyVH"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ kqDxFL">Documentation</p><ul role="menubar" class="styled__List-sc-1p6pq9n-1 eyfGoo"><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/docs" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Auth0 Docs</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/docs/articles" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Articles</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/docs/quickstarts" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Quickstarts</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/docs/api" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">APIs</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/docs/libraries" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">SDK Libraries</a></li></ul></section><section class="styled__Column-sc-1ff7bch-0 styled__SecondColumn-sc-1ff7bch-2 gvEHvo ivjYJO"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ kqDxFL">Support Center</p><ul role="menubar" class="styled__List-sc-1p6pq9n-1 eyfGoo"><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://community.auth0.com/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Community</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://support.auth0.com/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Support</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://support.auth0.com/center/s/knowledge" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Knowledge Base</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://marketplace.auth0.com" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Explore Auth0 Marketplace</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/resources" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Resources</a></li></ul></section><section class="styled__Column-sc-1ff7bch-0 styled__ThirdColumn-sc-1ff7bch-3 gvEHvo cyrbvp"><a href="/blog/getting-unlimited-scalability-with-okta-fine-grained-authorization/" rel="external" class="styled__Link-sc-k7d9qa-0 ayvvO"><div class="styled__Container-sc-k7d9qa-1 fbWQZU"><img loading="lazy" src="https://cdn.auth0.com/website/website/cic-header/hero/blog-thumbnail.png" alt="" class="styled__Image-sc-k7d9qa-3 hokSGA"/><div><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ hAZkEV">BLOG</p><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 cykLRO ioVNuq">Getting Unlimited Scalability with Okta Fine-Grained Authorization</p></div></div></a><div class="styled__Divider-sc-25clja-0 cxsqkw"></div><div class="styled__ItemsListContainer-sc-25clja-1 cGOMzv"><ul role="menubar" class="styled__List-sc-1p6pq9n-1 eyfGoo"><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/blog/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Blog</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://support.auth0.com/center/s/learning" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Learn</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/intro-to-iam" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Intro to IAM (CIAM)</a></li></ul></div></section></section></div></li><li role="menuitem" aria-haspopup="true" tabindex="0" class="styled__NavListEl-sc-1755fzv-16 iKTrpL"><div class="styled__NavElementButton-sc-1755fzv-15 bJSalM"><span>Product</span><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="chevron-down"><path id="icon" fill-rule="evenodd" clip-rule="evenodd" d="M7.99994 9.93934L12.4696 5.46967L13.5303 6.53033L8.53027 11.5303C8.23738 11.8232 7.76251 11.8232 7.46961 11.5303L2.46961 6.53033L3.53027 5.46967L7.99994 9.93934Z" fill="#FFFEFA"></path></g></svg></div><div class="styled__NavElementContentWrapper-sc-1755fzv-14 fGxoAJ"><section class="styled__NavElementContent-sc-1755fzv-17 dGsguq"><section class="styled__Column-sc-1ff7bch-0 styled__FirstColumn-sc-1ff7bch-1 gvEHvo hRsuJa"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ kqDxFL">Platform</p><ul role="menubar" class="styled__List-sc-1p6pq9n-1 eyfGoo"><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="https://auth0.com/ai" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Auth0 for AI Agents</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/platform/access-management" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Access Management</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/platform/extensibility" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Extensibility</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/platform/login-security" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Security</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/platform/user-management" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">User Management</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/platform/authentication" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Authentication</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/fine-grained-authorization" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Fine-Grained Authorization</a></li></ul><div class="styled__BottomLinkWrapper-sc-1p6pq9n-4 jHuHbb"><a href="https://auth0.com/platform" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 eqZICC hrigFo">View platform</a></div></section><section class="styled__Column-sc-1ff7bch-0 styled__SecondColumn-sc-1ff7bch-2 gvEHvo bIPKhj"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ kqDxFL">Features</p><ul role="menubar" class="styled__List-sc-1p6pq9n-1 eyfGoo"><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/features/universal-login" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Universal Login</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/features/single-sign-on" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Single Sign-On</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/features/multifactor-authentication" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Multifactor Authentication</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/features/actions" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Actions</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/features/machine-to-machine" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Machine to Machine</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/features/passwordless" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Passwordless</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/features/breached-passwords" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Breached Passwords</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/features/token-vault" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Token Vault</a></li></ul><div class="styled__BottomLinkWrapper-sc-1p6pq9n-4 jHuHbb"><a href="https://auth0.com/features" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 eqZICC hrigFo">View features</a></div></section><section class="styled__Column-sc-1ff7bch-0 styled__ThirdColumn-sc-1ff7bch-3 gvEHvo iEyNAY"><ul class="styled__List-sc-12vkkep-0 eBvIde"><li class="styled__Element-sc-12vkkep-1 cudvhT"><a rel="external" href="/resources/videos/platform-introduction-video-2020" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 jKUWSc jKVeGi"><div><p>Technology Overview</p><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 dEYVdf bbibKK">Watch a walkthrough of the Auth0 Platform</p></div></a></li><li class="styled__Element-sc-12vkkep-1 cudvhT"><a rel="external" href="/platform/cloud-deployment" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 jKUWSc jKVeGi"><div><p>Cloud Deployments</p><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 dEYVdf bbibKK">Deploy to the cloud, your way</p></div></a></li><li class="styled__Element-sc-12vkkep-1 cudvhT"><a rel="external" href="/marketplace" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 jKUWSc jKVeGi"><div><p>Auth0 Marketplace</p><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 dEYVdf bbibKK">Discover the integrations you need to solve identity</p></div></a></li></ul></section></section></div></li><li role="menuitem" aria-haspopup="true" tabindex="0" class="styled__NavListEl-sc-1755fzv-16 iKTrpL"><div class="styled__NavElementButton-sc-1755fzv-15 bJSalM"><span>Solutions</span><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="chevron-down"><path id="icon" fill-rule="evenodd" clip-rule="evenodd" d="M7.99994 9.93934L12.4696 5.46967L13.5303 6.53033L8.53027 11.5303C8.23738 11.8232 7.76251 11.8232 7.46961 11.5303L2.46961 6.53033L3.53027 5.46967L7.99994 9.93934Z" fill="#FFFEFA"></path></g></svg></div><div class="styled__NavElementContentWrapper-sc-1755fzv-14 fGxoAJ"><section class="styled__NavElementContent-sc-1755fzv-17 dGsguq"><section class="styled__Column-sc-1ff7bch-0 styled__FirstColumn-sc-1ff7bch-1 gvEHvo gBcyVH"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ kqDxFL">Industries</p><ul role="menubar" class="styled__List-sc-1p6pq9n-1 eyfGoo"><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/retail" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Retail</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/financial-services" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Financial Services</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/nonprofits" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Nonprofits &amp; Charities</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/startups" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Startups</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/healthcare" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Healthcare</a></li></ul><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ kqDxFL">Your goals</p><ul role="menubar" class="styled__List-sc-1p6pq9n-1 eyfGoo"><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/enterprise" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Enterprise-Grade Identity at Scale</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/solutions/ship-ai-agents" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Ship AI Agents</a></li><li role="menuitem" class="styled__Element-sc-1p6pq9n-2 RiFTv"><a rel="external" href="/architectural-playbook/identity" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM gdLUMv">Architecture Playbook</a></li></ul></section><section class="styled__Column-sc-1ff7bch-0 styled__SecondColumn-sc-1ff7bch-2 gvEHvo ivjYJO"><div class="styled__Wrapper-sc-mvo3b8-0 bRqMXF"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ hTjqEq">Use Cases</p><a rel="external" href="/b2c-customer-identity-management" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM ctSvSw"><span>Consumer Applications</span></a><a rel="external" href="/b2b-saas" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM ctSvSw"><span>B2B SaaS Applications</span></a><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ hTjqEq">Case Studies</p><a rel="external" href="/customers" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 bTQHxM ctSvSw"><span>Read our customers stories</span></a></div></section><section class="styled__Column-sc-1ff7bch-0 styled__ThirdColumn-sc-1ff7bch-3 gvEHvo cyrbvp"><a href="https://auth0.com/customer-identity-trends-report" rel="external" class="styled__Link-sc-k7d9qa-0 ayvvO"><div class="styled__Container-sc-k7d9qa-1 fbWQZU"><img loading="lazy" src="https://cdn.auth0.com/website/header/citr-thumbnail.png" alt="" class="styled__Image-sc-k7d9qa-3 hokSGA"/><div><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ hAZkEV">Customer Identity Trends Report 2025</p><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 cykLRO ioVNuq">Securing customer trust in the age of AI</p></div></div></a><a href="https://okta.valuestoryapp.com/okta/?utm_Origin=Auth0" rel="external" class="styled__Link-sc-k7d9qa-0 ayvvO"><div class="styled__Container-sc-k7d9qa-1 fbWQZU"><img loading="lazy" src="https://cdn.auth0.com/website/header/ROI_thumb_2x.png" alt="" class="styled__Image-sc-k7d9qa-3 hokSGA"/><div><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ hAZkEV">CIAM ROI Calculator</p><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 cykLRO ioVNuq">Estimate the revenue impact to your customer-facing business</p></div></div></a><a href="https://www.okta.com/newsroom/articles/auth0-may-2026-product-innovations/" rel="external" class="styled__Link-sc-k7d9qa-0 ayvvO"><div class="styled__Container-sc-k7d9qa-1 fbWQZU"><img loading="lazy" src="https://cdn.auth0.com/website/header/solutions/ai-innovations.png" alt="" class="styled__Image-sc-k7d9qa-3 hokSGA"/><div><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ hAZkEV">AI PRODUCT INNOVATIONS</p><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 cykLRO ioVNuq">New tools to safely ship and scale agentic apps</p></div></div></a></section></section></div></li><li role="menuitem" aria-haspopup="false" tabindex="0" class="styled__NavListEl-sc-1755fzv-16 iKTrpL"><a href="/blog/" rel="external" class="styled__NavElementButton-sc-1755fzv-15 bJSalM"><span>Blog</span></a></li><li role="menuitem" aria-haspopup="false" class="styled__NavListEl-sc-1755fzv-16 iKTrpL"><a href="/pricing/" rel="external" class="styled__NavElementButton-sc-1755fzv-15 bJSalM"><span>Pricing</span></a></li></ul><div class="styled__ButtonList-sc-1755fzv-8 bRCGlX"><a role="button" rel="external" href="/signup?place=header&amp;type=button&amp;text=sign%20up" tabindex="0" class="styled__Button-sc-1hwml9q-0 utils-sc-11hlfw-0 frejTe bbQQEs"><span>Sign up</span></a><a role="button" rel="external" href="/contact-us?place=header&amp;type=button&amp;text=let&#x27;s%20connect" tabindex="0" class="styled__Button-sc-1hwml9q-0 utils-sc-11hlfw-0 kSiIA jmsZjj"><span>Let&#x27;s connect</span></a></div></div></nav></header><nav id="blog-header" class="sc-1gkkh2j-0 fbxvbT"><div class="sc-1gkkh2j-1 eVErOA"><div class="sc-1gkkh2j-5 cBqRxe"><a href="/blog" class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 dOFALE daGTxQ">Blog</a><button aria-label="chevron icon, open menu" class="sc-1gkkh2j-4 fXwxQg"><svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="icon-chevron-down"><path id="Vector" d="M13.6314 15.7829L19.7072 9.70712L18.293 8.29291L12.5001 14.0858L6.70718 8.29291L5.29297 9.70712L11.3687 15.7829C11.9935 16.4077 13.0066 16.4077 13.6314 15.7829Z" fill="#FFFEFA"></path></g></svg></button></div><div class="sc-1gkkh2j-2 jPNeZR"><div class="sc-1gkkh2j-11 fdWrIp"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 jIzwLe wneoK">Explore Topics</p></div><ul class="sc-1gkkh2j-6 iwsMfc"><li class="sc-1gkkh2j-8 jlBvRJ"><a href="/blog/ai" class="sc-1gkkh2j-7 jaXHAq"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">AI</p><svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M16.9572 12.7071L10.4572 19.2071L9.04297 17.7928L14.8359 12L9.04297 6.20706L10.4572 4.79285L16.9572 11.2928C17.1447 11.4804 17.2501 11.7347 17.2501 12C17.2501 12.2652 17.1447 12.5195 16.9572 12.7071Z" fill="#FFFEFA"></path></svg></a></li><li class="sc-1gkkh2j-8 dwKbEo"><a href="/blog/developers" class="sc-1gkkh2j-7 jaXHAq"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Developers</p><svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M16.9572 12.7071L10.4572 19.2071L9.04297 17.7928L14.8359 12L9.04297 6.20706L10.4572 4.79285L16.9572 11.2928C17.1447 11.4804 17.2501 11.7347 17.2501 12C17.2501 12.2652 17.1447 12.5195 16.9572 12.7071Z" fill="#FFFEFA"></path></svg></a></li><li class="sc-1gkkh2j-8 iAITpl"><a href="/blog/identity-and-security" class="sc-1gkkh2j-7 jaXHAq"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Identity &amp; Security</p><svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M16.9572 12.7071L10.4572 19.2071L9.04297 17.7928L14.8359 12L9.04297 6.20706L10.4572 4.79285L16.9572 11.2928C17.1447 11.4804 17.2501 11.7347 17.2501 12C17.2501 12.2652 17.1447 12.5195 16.9572 12.7071Z" fill="#FFFEFA"></path></svg></a></li><li class="sc-1gkkh2j-8 iShXyr"><a href="/blog/business" class="sc-1gkkh2j-7 jaXHAq"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Business</p><svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M16.9572 12.7071L10.4572 19.2071L9.04297 17.7928L14.8359 12L9.04297 6.20706L10.4572 4.79285L16.9572 11.2928C17.1447 11.4804 17.2501 11.7347 17.2501 12C17.2501 12.2652 17.1447 12.5195 16.9572 12.7071Z" fill="#FFFEFA"></path></svg></a></li><li class="sc-1gkkh2j-8 ekMTdZ"><a href="/blog/culture" class="sc-1gkkh2j-7 jaXHAq"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Culture</p><svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M16.9572 12.7071L10.4572 19.2071L9.04297 17.7928L14.8359 12L9.04297 6.20706L10.4572 4.79285L16.9572 11.2928C17.1447 11.4804 17.2501 11.7347 17.2501 12C17.2501 12.2652 17.1447 12.5195 16.9572 12.7071Z" fill="#FFFEFA"></path></svg></a></li><li class="sc-1gkkh2j-8 jozhwi"><a href="/blog/engineering" class="sc-1gkkh2j-7 jaXHAq"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Engineering</p><svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M16.9572 12.7071L10.4572 19.2071L9.04297 17.7928L14.8359 12L9.04297 6.20706L10.4572 4.79285L16.9572 11.2928C17.1447 11.4804 17.2501 11.7347 17.2501 12C17.2501 12.2652 17.1447 12.5195 16.9572 12.7071Z" fill="#FFFEFA"></path></svg></a></li><li class="sc-1gkkh2j-8 fJnPUQ"><a href="/blog/announcements" class="sc-1gkkh2j-7 jaXHAq"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Announcements</p><svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M16.9572 12.7071L10.4572 19.2071L9.04297 17.7928L14.8359 12L9.04297 6.20706L10.4572 4.79285L16.9572 11.2928C17.1447 11.4804 17.2501 11.7347 17.2501 12C17.2501 12.2652 17.1447 12.5195 16.9572 12.7071Z" fill="#FFFEFA"></path></svg></a></li></ul></div><div class="sc-1gkkh2j-9 fnbKjy"><div class="sc-1gkkh2j-16 jzgOkx"><div class="sc-1q6s0ef-0 bhCwNT"><div class="sc-8jxe5n-0 fLFHxB"><button aria-label="Open search bar" id="open-search-mobile" class="sc-8jxe5n-3 hvSkoO"><svg width="17" height="16" viewBox="0 0 17 16" fill="#FFFEFA" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.16634 1.33331C4.22082 1.33331 1.83301 3.72113 1.83301 6.66665C1.83301 9.61217 4.22082 12 7.16634 12C8.38796 12 9.51365 11.5893 10.4129 10.8984L14.0283 14.5138L14.9711 13.571L11.361 9.96087C12.0742 9.05392 12.4997 7.90997 12.4997 6.66665C12.4997 3.72113 10.1119 1.33331 7.16634 1.33331ZM3.16634 6.66665C3.16634 4.45751 4.9572 2.66665 7.16634 2.66665C9.37548 2.66665 11.1663 4.45751 11.1663 6.66665C11.1663 8.87579 9.37548 10.6666 7.16634 10.6666C4.9572 10.6666 3.16634 8.87579 3.16634 6.66665Z" fill="#FFFEFA"></path></svg></button><form action="/blog/search" method="get" class="sc-8jxe5n-1 eSPUCq"><div class="sc-8jxe5n-4 ceWOiJ"><fieldset id="react-aria-:RmcmqcpmH5:" class="styled__InputWrapper-sc-zjpc1c-2 egtBcg"><svg class="styled__SearchIcon-sc-zjpc1c-3 fiFjBn" width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path clip-rule="evenodd" d="M7 12A5 5 0 1 0 7 2a5 5 0 0 0 0 10Z" stroke="#8C929C" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="m14 14-3.467-3.467" stroke="#8C929C" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg><input placeholder="Search..." aria-label="search" type="text" autoComplete="off" name="query" tabindex="0" id="react-aria-:Rmcmqcpm:" aria-describedby="react-aria-:RmcmqcpmH3: react-aria-:RmcmqcpmH4:" class="styled__TextInput-sc-zjpc1c-1 bbZpJT" value=""/></fieldset></div><input type="hidden" name="page" value="1"/></form></div></div></div><div class="sc-8aqj4j-0 kucwhF"><button id="theme__selector" aria-label="Open theme selector" class="sc-8aqj4j-1 jKKTiw"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M13.3335 2H2.66683C1.93045 2 1.3335 2.59695 1.3335 3.33333V10C1.3335 10.7364 1.93045 11.3333 2.66683 11.3333H13.3335C14.0699 11.3333 14.6668 10.7364 14.6668 10V3.33333C14.6668 2.59695 14.0699 2 13.3335 2Z" stroke="#FFFEFA" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"></path><path d="M5.3335 14H10.6668" stroke="#FFFEFA" stroke-width="1.33333" stroke-linecap="square" stroke-linejoin="round"></path><path d="M8 11.3335V14.0002" stroke="#FFFEFA" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"></path></svg></button><ul class="sc-8aqj4j-2 dfYoJq"><li class="sc-8aqj4j-3 mKcbB"><button id="theme__system" selected="" class="sc-8aqj4j-4 iiTJAp"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M13.3335 2H2.66683C1.93045 2 1.3335 2.59695 1.3335 3.33333V10C1.3335 10.7364 1.93045 11.3333 2.66683 11.3333H13.3335C14.0699 11.3333 14.6668 10.7364 14.6668 10V3.33333C14.6668 2.59695 14.0699 2 13.3335 2Z" stroke="#FFFEFA" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"></path><path d="M5.3335 14H10.6668" stroke="#FFFEFA" stroke-width="1.33333" stroke-linecap="square" stroke-linejoin="round"></path><path d="M8 11.3335V14.0002" stroke="#FFFEFA" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"></path></svg> <span class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA kHaByn">System</span></button></li><li class="sc-8aqj4j-3 mKcbB"><button id="theme__dark" class="sc-8aqj4j-4 jEjMME"><svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M8.55426 1.6727C8.68328 1.90162 8.66579 2.18497 8.50959 2.39629C7.33265 3.98854 7.49774 6.20226 8.89782 7.60234C10.2979 9.00243 12.5116 9.16751 14.1039 7.99057C14.3152 7.83438 14.5985 7.81688 14.8275 7.9459C15.0564 8.07491 15.1882 8.32637 15.164 8.58803C14.8398 12.096 11.8421 14.7463 8.32086 14.6381C4.79957 14.5299 1.97028 11.7006 1.86208 8.1793C1.75389 4.65801 4.40413 1.66036 7.91213 1.33618C8.17379 1.312 8.42525 1.44377 8.55426 1.6727ZM6.71057 2.95845C4.58978 3.72467 3.12249 5.78538 3.19479 8.13835C3.28135 10.9554 5.54477 13.2188 8.36181 13.3054C10.7148 13.3777 12.7755 11.9104 13.5417 9.78959C11.6386 10.4786 9.44928 10.0394 7.95501 8.54515C6.46075 7.05089 6.02154 4.86154 6.71057 2.95845Z" fill="#FFFEFA"></path></svg> <span class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA kHaByn">Dark mode</span></button></li><li class="sc-8aqj4j-3 mKcbB"><button id="theme__light" class="sc-8aqj4j-4 jEjMME"><svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M7.83317 2.66667V0.666672H9.1665V2.66667H7.83317Z" fill="#FFFEFA"></path><path d="M4.36175 4.80474L2.84175 3.28474L3.78456 2.34193L5.30455 3.86193L4.36175 4.80474Z" fill="#FFFEFA"></path><path d="M14.1579 3.28474L12.6379 4.80474L11.6951 3.86194L13.2151 2.34194L14.1579 3.28474Z" fill="#FFFEFA"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M4.49984 8C4.49984 5.79087 6.2907 4 8.49984 4C10.709 4 12.4998 5.79087 12.4998 8C12.4998 10.2091 10.709 12 8.49984 12C6.2907 12 4.49984 10.2091 4.49984 8ZM8.49984 5.33334C7.02708 5.33334 5.83317 6.52725 5.83317 8C5.83317 9.47276 7.02708 10.6667 8.49984 10.6667C9.9726 10.6667 11.1665 9.47276 11.1665 8C11.1665 6.52725 9.9726 5.33334 8.49984 5.33334Z" fill="#FFFEFA"></path><path d="M3.1665 8.66667H1.1665V7.33334H3.1665V8.66667Z" fill="#FFFEFA"></path><path d="M15.8332 8.66667H13.8332V7.33334H15.8332V8.66667Z" fill="#FFFEFA"></path><path d="M5.30455 12.1381L3.78456 13.6581L2.84175 12.7153L4.36175 11.1953L5.30455 12.1381Z" fill="#FFFEFA"></path><path d="M13.2151 13.6581L11.6951 12.1381L12.6379 11.1953L14.1579 12.7153L13.2151 13.6581Z" fill="#FFFEFA"></path><path d="M7.83317 15.3333V13.3333H9.1665V15.3333H7.83317Z" fill="#FFFEFA"></path></svg> <span class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA kHaByn">Light mode</span></button></li></ul></div></div></div></nav><nav class="sc-19z8ym3-0 elIpEt"><div class="sc-19z8ym3-1 hrcptN"></div><div class="sc-19z8ym3-2 gcSNEs"><a href="/blog" class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 cRPvKS kHaByn">Blog</a><ul class="sc-19z8ym3-3 cniTVj"><li class="sc-19z8ym3-4 bKPdrf"><a href="/blog/ai" class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">AI</a></li><li class="sc-19z8ym3-4 hIcssb"><a href="/blog/developers" class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Developers</a></li><li class="sc-19z8ym3-4 bUkNwj"><a href="/blog/identity-and-security" class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Identity &amp; Security</a></li><li class="sc-19z8ym3-4 eLbgUW"><a href="/blog/business" class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Business</a></li><li class="sc-19z8ym3-4 gQryoF"><a href="/blog/culture" class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Culture</a></li><li class="sc-19z8ym3-4 fApbHo"><a href="/blog/engineering" class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Engineering</a></li><li class="sc-19z8ym3-4 irGsht"><a href="/blog/announcements" class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Announcements</a></li></ul><div class="sc-19z8ym3-5 dyPfIj"><div class="sc-1q6s0ef-0 bhCwNT"><div class="sc-8jxe5n-0 fLFHxB"><button aria-label="Open search bar" id="open-search-mobile" class="sc-8jxe5n-3 hvSkoO"><svg width="17" height="16" viewBox="0 0 17 16" fill="#FFFEFA" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.16634 1.33331C4.22082 1.33331 1.83301 3.72113 1.83301 6.66665C1.83301 9.61217 4.22082 12 7.16634 12C8.38796 12 9.51365 11.5893 10.4129 10.8984L14.0283 14.5138L14.9711 13.571L11.361 9.96087C12.0742 9.05392 12.4997 7.90997 12.4997 6.66665C12.4997 3.72113 10.1119 1.33331 7.16634 1.33331ZM3.16634 6.66665C3.16634 4.45751 4.9572 2.66665 7.16634 2.66665C9.37548 2.66665 11.1663 4.45751 11.1663 6.66665C11.1663 8.87579 9.37548 10.6666 7.16634 10.6666C4.9572 10.6666 3.16634 8.87579 3.16634 6.66665Z" fill="#FFFEFA"></path></svg></button><form action="/blog/search" method="get" class="sc-8jxe5n-1 eSPUCq"><div class="sc-8jxe5n-4 ceWOiJ"><fieldset id="react-aria-:R2pfecpmH5:" class="styled__InputWrapper-sc-zjpc1c-2 egtBcg"><svg class="styled__SearchIcon-sc-zjpc1c-3 fiFjBn" width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path clip-rule="evenodd" d="M7 12A5 5 0 1 0 7 2a5 5 0 0 0 0 10Z" stroke="#8C929C" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path><path d="m14 14-3.467-3.467" stroke="#8C929C" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg><input placeholder="Search..." aria-label="search" type="text" autoComplete="off" name="query" tabindex="0" id="react-aria-:R2pfecpm:" aria-describedby="react-aria-:R2pfecpmH3: react-aria-:R2pfecpmH4:" class="styled__TextInput-sc-zjpc1c-1 bbZpJT" value=""/></fieldset></div><input type="hidden" name="page" value="1"/></form></div></div><div class="sc-8aqj4j-0 kucwhF"><button id="theme__selector" aria-label="Open theme selector" class="sc-8aqj4j-1 jKKTiw"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M13.3335 2H2.66683C1.93045 2 1.3335 2.59695 1.3335 3.33333V10C1.3335 10.7364 1.93045 11.3333 2.66683 11.3333H13.3335C14.0699 11.3333 14.6668 10.7364 14.6668 10V3.33333C14.6668 2.59695 14.0699 2 13.3335 2Z" stroke="#FFFEFA" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"></path><path d="M5.3335 14H10.6668" stroke="#FFFEFA" stroke-width="1.33333" stroke-linecap="square" stroke-linejoin="round"></path><path d="M8 11.3335V14.0002" stroke="#FFFEFA" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"></path></svg></button><ul class="sc-8aqj4j-2 dfYoJq"><li class="sc-8aqj4j-3 mKcbB"><button id="theme__system" selected="" class="sc-8aqj4j-4 iiTJAp"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M13.3335 2H2.66683C1.93045 2 1.3335 2.59695 1.3335 3.33333V10C1.3335 10.7364 1.93045 11.3333 2.66683 11.3333H13.3335C14.0699 11.3333 14.6668 10.7364 14.6668 10V3.33333C14.6668 2.59695 14.0699 2 13.3335 2Z" stroke="#FFFEFA" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"></path><path d="M5.3335 14H10.6668" stroke="#FFFEFA" stroke-width="1.33333" stroke-linecap="square" stroke-linejoin="round"></path><path d="M8 11.3335V14.0002" stroke="#FFFEFA" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"></path></svg> <span class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA kHaByn">System</span></button></li><li class="sc-8aqj4j-3 mKcbB"><button id="theme__dark" class="sc-8aqj4j-4 jEjMME"><svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M8.55426 1.6727C8.68328 1.90162 8.66579 2.18497 8.50959 2.39629C7.33265 3.98854 7.49774 6.20226 8.89782 7.60234C10.2979 9.00243 12.5116 9.16751 14.1039 7.99057C14.3152 7.83438 14.5985 7.81688 14.8275 7.9459C15.0564 8.07491 15.1882 8.32637 15.164 8.58803C14.8398 12.096 11.8421 14.7463 8.32086 14.6381C4.79957 14.5299 1.97028 11.7006 1.86208 8.1793C1.75389 4.65801 4.40413 1.66036 7.91213 1.33618C8.17379 1.312 8.42525 1.44377 8.55426 1.6727ZM6.71057 2.95845C4.58978 3.72467 3.12249 5.78538 3.19479 8.13835C3.28135 10.9554 5.54477 13.2188 8.36181 13.3054C10.7148 13.3777 12.7755 11.9104 13.5417 9.78959C11.6386 10.4786 9.44928 10.0394 7.95501 8.54515C6.46075 7.05089 6.02154 4.86154 6.71057 2.95845Z" fill="#FFFEFA"></path></svg> <span class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA kHaByn">Dark mode</span></button></li><li class="sc-8aqj4j-3 mKcbB"><button id="theme__light" class="sc-8aqj4j-4 jEjMME"><svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M7.83317 2.66667V0.666672H9.1665V2.66667H7.83317Z" fill="#FFFEFA"></path><path d="M4.36175 4.80474L2.84175 3.28474L3.78456 2.34193L5.30455 3.86193L4.36175 4.80474Z" fill="#FFFEFA"></path><path d="M14.1579 3.28474L12.6379 4.80474L11.6951 3.86194L13.2151 2.34194L14.1579 3.28474Z" fill="#FFFEFA"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M4.49984 8C4.49984 5.79087 6.2907 4 8.49984 4C10.709 4 12.4998 5.79087 12.4998 8C12.4998 10.2091 10.709 12 8.49984 12C6.2907 12 4.49984 10.2091 4.49984 8ZM8.49984 5.33334C7.02708 5.33334 5.83317 6.52725 5.83317 8C5.83317 9.47276 7.02708 10.6667 8.49984 10.6667C9.9726 10.6667 11.1665 9.47276 11.1665 8C11.1665 6.52725 9.9726 5.33334 8.49984 5.33334Z" fill="#FFFEFA"></path><path d="M3.1665 8.66667H1.1665V7.33334H3.1665V8.66667Z" fill="#FFFEFA"></path><path d="M15.8332 8.66667H13.8332V7.33334H15.8332V8.66667Z" fill="#FFFEFA"></path><path d="M5.30455 12.1381L3.78456 13.6581L2.84175 12.7153L4.36175 11.1953L5.30455 12.1381Z" fill="#FFFEFA"></path><path d="M13.2151 13.6581L11.6951 12.1381L12.6379 11.1953L14.1579 12.7153L13.2151 13.6581Z" fill="#FFFEFA"></path><path d="M7.83317 15.3333V13.3333H9.1665V15.3333H7.83317Z" fill="#FFFEFA"></path></svg> <span class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA kHaByn">Light mode</span></button></li></ul></div></div></div></nav><div><section class="sc-1vditak-0 xCgE"><div class="sc-1vditak-1 fRpMLr"><div class="sc-1vditak-2 gcBBOg"><div class="sc-1vditak-7 cjaJus"><span class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA dNAcKM">engineering</span></div><h1 class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 dvPXaj hRTnrT">Progressive Service Architecture At Auth0</h1><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 evZbox iUMEFg">Learn how to build a mature service architecture for high availability by creating its topology progressively.</p><div class="sc-1vditak-3 TDLvO"><div class="sc-1vditak-4 fqoTOq"><a href="https://auth0.com/blog/authors/dan-arias" class="sc-i8q3i5-0 TIjHP"><div class="sc-i8q3i5-1 csAers"><img alt="" src="https://images.ctfassets.net/23aumh6u8s0i/6WmRCtZz0eDp6KE7pw8cJ3/7329ebb6302316cab8f55705100abab5/37590801_s_460_v_4" class="sc-i8q3i5-2 flhvbZ"/></div><div class="sc-i8q3i5-3 xbOra"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 jIzwLe iUMEFg">Dan Arias</p><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA eywyFj">Software Engineer (Auth0 Alumni)</p></div></a></div><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 jIzwLe kHaByn">Nov 14, 2018<!-- --> • <!-- -->16 min read</p></div></div><figure class="sc-1vditak-5 kPYhCI"><img src="https://images.ctfassets.net/23aumh6u8s0i/56S9oDWKVeNY8AIszkZvw1/7d6794f3d31d4eedb5a3d3699e796e5c/default" alt="" class="sc-1vditak-6 csokAW"/></figure></div></section><div class="sc-t4xvu3-0 ifwtBO"><aside class="sc-5jonrv-0 NHmSD"><div class="sc-5jonrv-1 gIutRo"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 fRlbrh bSjAPd">Related Tags</p><div class="sc-1iw8hf7-0 fZRVTq"><a href="/blog/search/?query=architecture&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#architecture</p></a><a href="/blog/search/?query=engineering&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#engineering</p></a><a href="/blog/search/?query=enterprise&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#enterprise</p></a><a href="/blog/search/?query=scalability&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#scalability</p></a><a href="/blog/search/?query=high-availability&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#high-availability</p></a><a href="/blog/search/?query=monitoring&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#monitoring</p></a><a href="/blog/search/?query=feature-flags&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#feature-flags</p></a><a href="/blog/search/?query=feature-toggles&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#feature-toggles</p></a><a href="/blog/search/?query=mongoDB&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#mongoDB</p></a></div><div class="sc-5jonrv-4 ShPZw"><div class="sc-2sym2c-0 gMKMkL"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 fRlbrh bSjAPd">Share</p><div class="sc-2sym2c-1 kIyLtY"><button href="#" aria-label="Share on X social media button" class="sc-2sym2c-2 kjXFtJ"><svg width="25" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" class="sc-2sym2c-3 jSsmae"><path d="M14.118 10.775L19.947 4h-1.382l-5.06 5.883L9.463 4H4.8l6.112 8.896L4.801 20h1.381l5.344-6.212L15.795 20h4.662l-6.34-9.225h.001zm-1.892 2.199l-.619-.886L6.68 5.04H8.8l3.977 5.688.619.886 5.169 7.393h-2.121l-4.219-6.033z" fill="#FFFEFA"></path><path d="M14.161 10.775L19.99 4h-1.382l-5.06 5.883L9.506 4H4.844l6.112 8.896L4.844 20h1.38l5.345-6.212L15.838 20H20.5l-6.34-9.225h.001zm-1.892 2.199l-.619-.886L6.723 5.04h2.121l3.977 5.688.619.886 5.169 7.393h-2.121l-4.219-6.033z" fill="#FFFEFA"></path><path d="M14.661 10.775L20.49 4h-1.382l-5.06 5.883L10.006 4H5.344l6.112 8.896L5.344 20h1.38l5.345-6.212L16.338 20H21l-6.34-9.225h.001zm-1.892 2.199l-.619-.886L7.223 5.04h2.121l3.977 5.688.619.886 5.169 7.393h-2.121l-4.219-6.033z" fill="#FFFEFA"></path></svg></button><button href="#" aria-label="Share on LinkedIn social media button" class="sc-2sym2c-2 kjXFtJ"><svg width="25" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" class="sc-2sym2c-4 iEyEOd"><path d="M20.511 3H5.173c-.735 0-1.33.58-1.33 1.297V19.7c0 .717.595 1.301 1.33 1.301H20.51c.735 0 1.333-.584 1.333-1.297V4.297C21.844 3.58 21.246 3 20.51 3zM9.184 18.339H6.512V9.746h2.672v8.593zM7.848 8.576a1.548 1.548 0 11-.005-3.096 1.548 1.548 0 01.005 3.096zm11.334 9.763h-2.668v-4.177c0-.995-.017-2.278-1.389-2.278-1.388 0-1.6 1.086-1.6 2.208v4.247h-2.664V9.746h2.56v1.175h.035c.354-.675 1.226-1.389 2.524-1.389 2.703 0 3.202 1.779 3.202 4.092v4.715z" fill="#FFFEFA"></path></svg></button><div class="sc-2sym2c-6 ccdMVH"><button aria-label="Copy to clipboard button" class="sc-2sym2c-2 kjXFtJ"><svg width="25" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" class="sc-2sym2c-5 dCrKRg"><path d="M21.771 2.934l.137.137c.395.395.688.688.899.994a4 4 0 010 4.526c-.21.306-.504.6-.899.994l-4.12 4.12c-.57.57-1.04 1.04-1.453 1.391-.43.365-.865.66-1.383.83a4 4 0 01-2.473 0c-.518-.17-.953-.465-1.383-.83a21.82 21.82 0 01-1.2-1.138l1.414-1.414c.457.455.793.783 1.08 1.027.336.285.54.398.707.452a2 2 0 001.237 0c.167-.054.37-.167.706-.451.345-.293.757-.704 1.363-1.31l4.023-4.023c.493-.493.64-.646.731-.78a2 2 0 000-2.262c-.09-.133-.238-.287-.732-.78-.493-.494-.646-.64-.78-.732a2 2 0 00-2.262 0c-.133.091-.287.238-.78.732L15.42 5.598a5.158 5.158 0 00-.72-.296 6 6 0 00-1.527-.285l2.083-2.083c.395-.395.688-.688.994-.898a4 4 0 014.526 0c.306.21.6.503.994.898z" fill="#FFFEFA"></path><path d="M15.466 8.033c.35.298.742.68 1.2 1.137l-1.414 1.415a19.946 19.946 0 00-1.08-1.028c-.336-.284-.54-.397-.707-.451a2 2 0 00-1.236 0c-.167.054-.372.167-.707.451-.344.293-.757.704-1.362 1.31l-4.9 4.899c-.493.493-.64.646-.731.78a2 2 0 000 2.262c.09.133.238.287.732.78.493.494.646.64.78.732a2 2 0 002.262 0c.133-.091.287-.238.78-.732l2.058-2.058c.223.113.463.214.72.297.498.162 1.01.257 1.527.285l-2.959 2.959c-.395.395-.688.688-.994.898a4 4 0 01-4.526 0c-.306-.21-.6-.503-.994-.898l-.137-.137c-.395-.395-.688-.688-.899-.994a4 4 0 010-4.526c.21-.306.504-.6.899-.994l4.997-4.997c.569-.57 1.039-1.039 1.453-1.39.43-.365.865-.661 1.383-.83a4 4 0 012.472 0c.518.169.953.465 1.383.83z" fill="#FFFEFA"></path></svg></button></div></div></div><ul class="sc-5jonrv-8 hrXGXz"><li data-element-id="blogSidebarAdCTA" class="sc-5jonrv-9 bHwIOW"><div class="sc-1lvx3a4-0 bGvBko"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 jIzwLe iUMEFg">OAuth2 And OpenID Connect: The Professional Guide</p><a href="https://auth0.com/resources/ebooks/oauth-openid-connect-professional-guide" rel="noopener" target="_blank" aria-label="(Get the free ebook!, open in a new window)" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 edSzJI kHaByn">Get the free ebook!</a></div></li></ul></div></div></aside><div class="sc-k4hn9e-1 cUEqsB"></div><article class="sc-k4hn9e-0 lhHlKO"><div><p class="sc-13lpndi-7 cLBDjU">In this blog post, we are going to discuss how the Auth0 Site Reliability team, led by <strong>Hernán Meydac Jean</strong>, used a progressive approach to build a mature service architecture characterized by high availability and reliability.</p><p class="sc-13lpndi-7 cLBDjU">At Auth0, we manage different features for our clients. We use feature flags to enable features into codebases without breaking anything or having to change the code. As defined by <a href="http://blog.thepete.net/about/" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">Pete Hodgson</a>, feature flags, or feature toggles, are a flexible and powerful technique that <a href="https://martinfowler.com/articles/feature-toggles.html" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">allow developers to modify the behavior of a system without changing its code</a>. A feature flag lets a development team turn features on and off in the system even after it is live in production.</p><h2 id="Motivation-for-a-Feature-Flags-Router-Service" class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bQHbCW kHaByn">Motivation for a Feature Flags Router Service</h2><p class="sc-13lpndi-7 cLBDjU">To help us manage feature flags, our SRE team created a <strong>feature flags router</strong> service. As defined by <a href="https://martinfowler.com/articles/feature-toggles.html" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">Martin Fowler</a>, a feature flags router can be used to dynamically control which code path to a feature is live. The router lets us centralize all the feature flags logic in a single place allowing different services and products to retrieve the same information at any time to turn on and off feature flags across different functions.</p><p class="sc-13lpndi-7 cLBDjU"><img src="https://images.ctfassets.net/23aumh6u8s0i/A2xHacMuGa6gCe8VQNWVo/9ce0442499d1766afb0027925d985618/01-flags-router-architecture" alt="Flags Router Architecture" class=" lightbox-image"/></p><p class="sc-13lpndi-7 cLBDjU">Our vision for this feature flags router service is to make it a generic service that can be used by multiple products and services within and outside our organization. Because of the extensive number of clients that this generic service will support and the massive amount of requests these clients will generate, we needed to design this service with an architecture that makes it easy to scale and promotes high availability.</p><h2 id="Engineering-an-SDK-for-Feature-Parity" class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bQHbCW kHaByn">Engineering an SDK for Feature Parity</h2><p class="sc-13lpndi-7 cLBDjU">With this in mind, the SRE team came up with a feature flags SDK designed to act as an abstract client so that we can use any kind of provider or database with it. The goal of the SDK is to have the same language and the same syntax across services. Therefore, in order to retrieve a feature flag value, we don&#x27;t need to access a database directly or make a direct request to a server; instead, we simply use the SDK which offers the same code everywhere. If we make changes to the logic behind the SDK, we just need to bump up version of the SDK to apply the updates.</p><blockquote itemscope="" itemType="https://schema.org/citation" itemProp="citation" class="sc-7ovv77-0 iIECrc"><p class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 fTNKiF hPXnTc">“<!-- -->Learn how the @auth0 SRE team created a standardized library to help them manage feature flags and promote feature parity.<!-- -->”</p><a href="https://twitter.com/intent/tweet?text=&quot;Learn%20how%20the%20%40auth0%20SRE%20team%20created%20a%20standardized%20library%20to%20help%20them%20manage%20feature%20flags%20and%20promote%20feature%20parity.&quot; via @auth0 https://auth0.com/blog/progressive-service-architecture-at-auth0" target="_blank" rel="noopener noreferrer" class="sc-1w6xcbn-0 ixUiOW"><svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="Group 427319653"><path id="Vector" d="M9.31742 7.36182L15.1457 0.586914H13.7646L8.70389 6.46947L4.66193 0.586914H0L6.11224 9.48238L0 16.5869H1.38119L6.72542 10.3747L10.994 16.5869H15.656L9.31708 7.36182H9.31742ZM7.42569 9.56075L6.80639 8.67497L1.87886 1.62666H4.00029L7.97687 7.31487L8.59617 8.20065L13.7652 15.5945H11.6438L7.42569 9.56109V9.56075Z" fill="#FFFEFA"></path><path id="Vector_2" d="M9.81742 7.36182L15.6457 0.586914H14.2646L9.20389 6.46947L5.16193 0.586914H0.5L6.61224 9.48238L0.5 16.5869H1.88119L7.22542 10.3747L11.494 16.5869H16.156L9.81708 7.36182H9.81742ZM7.92569 9.56075L7.30639 8.67497L2.37886 1.62666H4.50029L8.47687 7.31487L9.09617 8.20065L14.2652 15.5945H12.1438L7.92569 9.56109V9.56075Z" fill="#FFFEFA"></path></g></svg><span class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Tweet This</span></a></blockquote><p class="sc-13lpndi-7 cLBDjU">The final design of this client was the result of a progressive service architecture that provides us with fallbacks, self-healing, high availability, and high scalability. We started with a basic topology that gave the client direct access to the database and ended with a sophisticated topology that integrates a self-healing strategy for the feature flags router service.</p><p class="sc-13lpndi-7 cLBDjU">Let&#x27;s explore the system topology of each stage of this process as it was explained by Hernán during one of our internal engineering talks. These topologies can be abstracted to use any kind of provider and different databases.</p><blockquote class="sc-13lpndi-10 lgnrbm"><p class="sc-13lpndi-7 cLBDjU">Would you like to tackle reliability and scalability challenges? We are currently looking for new teammates to <a href="https://auth0.com/careers/job/senior-software-engineer-site-reliability:e90541c4-d211-4d47-be6d-e0f1dc2673be?level-origin=applied&amp;level-source=auth0blog" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener"><strong>join our SRE team</strong></a>!</p></blockquote>
<h2 id="Connecting-Directly-to-the-Database" class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bQHbCW kHaByn">Connecting Directly to the Database</h2><p class="sc-13lpndi-7 cLBDjU">This is the scenario where the client connects directly to a database such as MongoDB. In essence, this is the most basic configuration to have for the service. We simply connect the client to any database of our choice and retrieve data — in this case, feature flags. The client could be limited to have read-only permissions to the database but write operations could be added if necessary.</p><p class="sc-13lpndi-7 cLBDjU"><img src="https://images.ctfassets.net/23aumh6u8s0i/GhUtdb58nlZHen2X7RQmV/3aab49faf0d5cb87af88ca3bf1ab768c/02-connecting-the-service" alt="Connecting the service client directly to the database" class=" lightbox-image"/></p><blockquote class="sc-13lpndi-10 lgnrbm"><p class="sc-13lpndi-7 cLBDjU">Our current client for our feature flags service is read-only.</p></blockquote>
<p class="sc-13lpndi-7 cLBDjU">Let&#x27;s look at some of the pros and cons of this architecture.</p><h3 class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bwECpK kHaByn">Pros</h3><ul class="sc-13lpndi-8 ifMAwf"><li>Easy to set up.</li><li>Doesn&#x27;t require additional infrastructure.</li><li>Configurable for <a href="https://auth0.com/docs/appliance" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">Auth0 appliances</a>.
<ul class="sc-13lpndi-8 ifMAwf"><li>An Auth0 appliance is an Auth0 deployment that exists in a dedicated area of Auth0&#x27;s cloud, your cloud, or your own data center.</li><li>For example, a self-hosted Auth0 instance doesn&#x27;t need to connect to the Auth0 server that manages the service; instead, it can connect to the database directly.</li></ul></li></ul><h3 class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bwECpK kHaByn">Cons</h3><ul class="sc-13lpndi-8 ifMAwf"><li>No <a href="https://en.wikipedia.org/wiki/Failover" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">failover</a>.
<ul class="sc-13lpndi-8 ifMAwf"><li>If the database is down, the service is also down.</li></ul></li><li>Database stress occurs if the client application doesn&#x27;t enforce limits.</li><li>Higher security complexity.
<ul class="sc-13lpndi-8 ifMAwf"><li>You have to grant database access to a service.</li><li>It requires you to open permissions, create security groups, etc. to control access levels to the database by services.</li></ul></li></ul><p class="sc-13lpndi-7 cLBDjU">Although this basic approach is straightforward, we thought of a better approach: integrate the concept of a <em class="sc-13lpndi-12 gMCFZd">store</em> in the service architecture.</p><h2 id="Using-a-Data-Store" class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bQHbCW kHaByn">Using a Data Store</h2><p class="sc-13lpndi-7 cLBDjU">To augment the previously discussed architecture, we added the concept of a store. A store is basically a service provider. It can be a primary or a secondary provider that we can connect to different services. In turn, a service can be an API or a direct database connection. The core principle here is that we can use the stores to design a fallback strategy and optimize service availability. For example, the secondary store serves as a fallback for any kind of incident that we could have with the primary store to guarantee data access for the service.</p><p class="sc-13lpndi-7 cLBDjU"><img src="https://images.ctfassets.net/23aumh6u8s0i/1IbTfLNZaEqbfQ5mddowG8/994da8630dc45cd8122d54743e001b89/03-service-architecture" alt="Service architecture implementing a primary and secondary store" class=" lightbox-image"/></p><p class="sc-13lpndi-7 cLBDjU">Let&#x27;s look at the architecture flow of this topology:</p><ul class="sc-13lpndi-8 ifMAwf"><li>The client tries to connect to the primary store to use an API to retrieve data.</li></ul><p class="sc-13lpndi-7 cLBDjU"><img src="https://images.ctfassets.net/23aumh6u8s0i/1prv772HvNajP6rXqo2Cgi/233b7849db86f2b8b92774731b6b668e/04-primary-secondary-stores" alt="Service client tries to connect to the primary store" class=" lightbox-image"/></p><ul class="sc-13lpndi-8 ifMAwf"><li>If API is down for whatever reason, after 5 attempts, a logic circuit is opened.</li><li>The open circuit takes the client request to the secondary store.</li><li>The data is then retrieved from the secondary store.</li></ul><p class="sc-13lpndi-7 cLBDjU"><img src="https://images.ctfassets.net/23aumh6u8s0i/1JdGGtMNSCMJnLtnDr8rEz/81ab3ea83b584cf2da194aa9b09a4f1a/05-primary-secondary-stores-secondary" alt="Service client request routed to secondary store" class=" lightbox-image"/></p><p class="sc-13lpndi-7 cLBDjU">This flow may incur performance degradation or other problems but at least the service is operational. Additionally, the stores have the ability to self-heal. Once the primary store is up and running again, the circuit is closed and we go back to using the primary store.</p><h3 class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bwECpK kHaByn">Pros</h3><ul class="sc-13lpndi-8 ifMAwf"><li>Circuit-breaking to handle failures.</li><li>Automatic fallback and restoration.</li><li>Scalable with company growth by abstracting underlying providers.</li><li>Services with different access can query data.</li></ul><h3 class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bwECpK kHaByn">Cons</h3><ul class="sc-13lpndi-8 ifMAwf"><li>Additional infrastructure and maintenance required.</li><li>Additional cost.</li><li>Difficult to perform a <a href="https://en.wikipedia.org/wiki/Capacity_planning" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">capacity plan</a> for both stores.
<ul class="sc-13lpndi-8 ifMAwf"><li>When the primary store is down, all the requests go to the secondary one.</li><li>You must understand the capacity of the secondary store and the traffic on its region; otherwise, this store will have a huge performance impact on the system.</li><li>Capacity planning is not easy.
<ul class="sc-13lpndi-8 ifMAwf"><li>Depends on traffic, use cases, client applications.</li><li>Must account for applications having an internal cache or not.</li><li>Must strategize how services are scaled.</li></ul></li></ul></li><li>Need to balance stores to avoid major outage when the circuit is open.
<ul class="sc-13lpndi-8 ifMAwf"><li>Avoid stampedes while the circuit is open.</li><li>Requests are going to flood the secondary store and may crash it.</li></ul></li></ul><p class="sc-13lpndi-7 cLBDjU">To solve the problems present in this topology, we needed to add another layer: the cache. Let&#x27;s explore that next.</p><h2 id="Adding-Caching-to-the-Stores" class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bQHbCW kHaByn">Adding Caching to the Stores</h2><p class="sc-13lpndi-7 cLBDjU">In this stage, we now have three layers: cache, primary store, and secondary store.</p><p class="sc-13lpndi-7 cLBDjU"><img src="https://images.ctfassets.net/23aumh6u8s0i/74VOXPoFGNIVYXy4fj0dSn/ff91590956cd0412fce71ae350fea4fe/06-adding-caching" alt="Adding caching to the service architecture" class=" lightbox-image"/></p><p class="sc-13lpndi-7 cLBDjU">Let&#x27;s understand how these layers interact with each other by analyzing the architectural flow of this topology:</p><ul class="sc-13lpndi-8 ifMAwf"><li>The client first retrieves data from the cache, such as Redis.</li></ul><p class="sc-13lpndi-7 cLBDjU"><img src="https://images.ctfassets.net/23aumh6u8s0i/6GasF46CTEOmTgntR1uerQ/5dbb3cfec0c88afa919445885c4e3676/07-cache-stores-cache" alt="Service request retrieving data from cache" class=" lightbox-image"/></p><ul class="sc-13lpndi-8 ifMAwf"><li>If data is not in the cache, the request goes to the primary store.</li><li>When the primary store provides the data response, it also updates the cache.</li><li>Subsequent requests will then retrieve that data from the cache.</li></ul><p class="sc-13lpndi-7 cLBDjU"><img src="https://images.ctfassets.net/23aumh6u8s0i/1KHdaMKEL7UFD00iZ79N1J/033c8cda9e155dafbc32c1f77bfc5679/08-cache-stores-primary" alt="Service request retrieving data from primary store and primary store updating cache" class=" lightbox-image"/></p><ul class="sc-13lpndi-8 ifMAwf"><li><p class="sc-13lpndi-7 cLBDjU">If the cache is up but doesn&#x27;t have the needed value (the cache is outdated) and the primary store is down, the request is served by the secondary store which acts as a fallback.</p></li><li><p class="sc-13lpndi-7 cLBDjU">If both the cache and the primary store are down, the request is also served by the secondary store.</p></li></ul><p class="sc-13lpndi-7 cLBDjU"><img src="https://images.ctfassets.net/23aumh6u8s0i/63HKAlYVg5FEjThveOJrUv/7d35d714bee61ee9ad2cc091886b9aad/09-cache-stores-secondary" alt="Service request retrieving data from secondary store as fallback" class=" lightbox-image"/></p><ul class="sc-13lpndi-8 ifMAwf"><li>To create a service outage, all three layers need to be down: cache, primary store, and secondary store.</li></ul><p class="sc-13lpndi-7 cLBDjU"><img src="https://images.ctfassets.net/23aumh6u8s0i/v0E5GhQTjncPZ0YkkJPbo/4a65459c208d29af5766fc58baa92338/10-service-outage" alt="Service outage created when primary store, secondary store, and cache are down" class=" lightbox-image"/></p><p class="sc-13lpndi-7 cLBDjU">This three-layer system model creates a high availability setup to keep the service up and running.</p><blockquote class="sc-13lpndi-10 lgnrbm"><p class="sc-13lpndi-7 cLBDjU">We highly benefit from this architecture at Auth0, since we can keep some of our services operational in a similar way to our authentication server.</p></blockquote>
<h3 class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bwECpK kHaByn">Pros</h3><ul class="sc-13lpndi-8 ifMAwf"><li>Faster response times.
<ul class="sc-13lpndi-8 ifMAwf"><li>Ideal for data that doesn&#x27;t change much, such as feature flags in our case.</li><li>Great benefit to have flags cached.</li></ul></li><li>Reduction of stress on stores.</li><li>Same benefits as stores (circuit-breaking, fallback, restoration).</li></ul><h3 class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bwECpK kHaByn">Cons</h3><ul class="sc-13lpndi-8 ifMAwf"><li>Yet more infrastructure to add and maintain with additional cost.
<ul class="sc-13lpndi-8 ifMAwf"><li>You now need a distributed cache.</li></ul></li><li>Another point of failure to consider.</li><li>Caching requires additional balance (proper <a href="https://en.wikipedia.org/wiki/Time_to_live" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">time to live (TTL)</a> values, <a href="https://en.wikipedia.org/wiki/Cache_invalidation" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">cache invalidation</a>)</li><li>Same problems as stores in relation to capacity planning.</li></ul><p class="sc-13lpndi-7 cLBDjU">This is the most mature progression of the service architecture for our feature flags service. Part of its success is counting with a performant circuit-breaking mechanism that allows us to switch between the different layers of the model as needed. Let&#x27;s explore more in-depth our current circuit-breaking strategy.</p><h2 id="Circuit-Breaking" class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bQHbCW kHaByn">Circuit-Breaking</h2><p class="sc-13lpndi-7 cLBDjU"><a href="https://en.wikipedia.org/wiki/Circuit_breaker_design_pattern" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">Circuit breaking is a design pattern</a> implemented in software architecture and popularized by <a href="https://twitter.com/mtnygard" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">Michael Nygard</a> in his book, <a href="https://pragprog.com/book/mnee/release-it" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener"><em class="sc-13lpndi-12 gMCFZd">Release It!</em></a>. This pattern is used to detect system failures and prevent the system from attempting to execute operations that will fail during events such as maintenance or outages.</p><p class="sc-13lpndi-7 cLBDjU">At Auth0, we implement the circuit-breaking pattern using a custom library created by our Head of Engineering, <a href="https://twitter.com/jfroma" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">José Romaniello</a>, called <a href="https://github.com/auth0/disyuntor" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">disyuntor</a>.</p><p class="sc-13lpndi-7 cLBDjU">Our engineers use this library to easily configure different paths for exceptions and problems:</p><pre><pre style="color:#E5E5E5;background:linear-gradient(126deg, rgba(24, 24, 25, 0.77) 0%, rgba(24, 24, 25, 0.5) 100%);font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:2.4rem;margin:4rem 0;overflow:auto;border-radius:0.8rem;border:0.1rem solid rgba(220, 221, 225, 0.16)"><code class="language-javascript" style="white-space:pre;color:#E5E5E5;background:none;font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.6rem;font-size:1.6rem;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none">const disyuntor = require(&#x27;disyuntor&#x27;);
const dnsSafeLookup = disyuntor.wrapCallbackApi({
//This is used in error messages.
name: &#x27;dns.lookup&#x27;,
//Timeout for the protected function.
// timeout: &#x27;2s&#x27;,
//The number of consecutive failures before switching to open mode
//and stop calling the underlying service.
// maxFailures: 5,
//The minimum time the circuit remains open before doing another attempt.
// cooldown: &#x27;15s&#x27;,
//The maximum amount of time the circuit remains open before doing a new attempt.
// maxCooldown: &#x27;60s&#x27;,
//optionally log errors
onTrip: (err, failures, cooldown) =&gt; {
console.log(`dns.lookup triped because it failed ${failures} times.
Last error was ${err.message}! There will be no more attempts for ${cooldown}ms.`);
},
onClose: (cooldown) =&gt; {
console.log(`dns.lookup circuit closed after ${cooldown}ms.`;
}
// //optional callback to prevent some errors to trigger the disyuntor logic
// //in this case ENOTFOUND is passed to the callback and will
// //not trigger the breaker eg:
// trigger: (err) =&gt; err.code !== &#x27;ENOTFOUND&#x27;
}, dns.lookup);
//then use as you will normally use dns.lookup
dnsSafeLookup(&#x27;google.com&#x27;, (err, ip) =&gt; {
if (err) { return console.error(err.message); }
console.log(ip);
})
</code></pre></pre>
<p class="sc-13lpndi-7 cLBDjU">For example, if we have a problem after 4 failures, we open the circuit and we go on a different path. For this path, you can have a recovery, a fallback, or any kind of preferred alternative in your code. Whenever the service trips the wire, using the <code class="sc-1xg6er-0 heSQis">onTrip</code> method, we log an exception:</p><pre><pre style="color:#E5E5E5;background:linear-gradient(126deg, rgba(24, 24, 25, 0.77) 0%, rgba(24, 24, 25, 0.5) 100%);font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:2.4rem;margin:4rem 0;overflow:auto;border-radius:0.8rem;border:0.1rem solid rgba(220, 221, 225, 0.16)"><code class="language-javascript" style="white-space:pre;color:#E5E5E5;background:none;font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.6rem;font-size:1.6rem;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none">// Configure protected functions with circuit-breaker
const disyuntorOptions = {
name: &quot;client&quot;,
maxFailures: 4,
cooldown: &quot;15s&quot;,
timeout: options.api &amp;&amp; options.api.type === &quot;rest&quot; ? &quot;5s&quot; : &quot;1s&quot;,
trigger: err =&gt; {
// increment the number of attempts only for transient errors
return this._isTransientError(err);
},
onTrip: (err, failures) =&gt;
agent.logger.error(
{ err },
`An error occurred while reading from primary store after ${failures} attempts.`
)
};
</code></pre></pre>
<p class="sc-13lpndi-7 cLBDjU">This is the basic configuration we have for our feature flags service. At every 4 failures, we open the circuit, go to the secondary store, and we have a cooldown of 15 seconds before we try to use the primary store again.</p><p class="sc-13lpndi-7 cLBDjU">Our service has a RESTful implementation using <a href="https://hapijs.com/" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">HapiJS</a> and another one using <a href="https://grpc.io/" class="sc-13lpndi-9 uiRQQ" target="_blank" rel="noreferrer noopener">gRPC</a>. In the circuit-breaking configuration, we also specify a timeout whose length depends on the type of API request. For HapiJS, if servicing the request takes longer than 5 seconds, we automatically time out. For gRPC, the timeout is 1 second:</p><pre><pre style="color:#E5E5E5;background:linear-gradient(126deg, rgba(24, 24, 25, 0.77) 0%, rgba(24, 24, 25, 0.5) 100%);font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:2.4rem;margin:4rem 0;overflow:auto;border-radius:0.8rem;border:0.1rem solid rgba(220, 221, 225, 0.16)"><code class="language-javascript" style="white-space:pre;color:#E5E5E5;background:none;font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.6rem;font-size:1.6rem;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none">const disyuntorOptions = {
//...
timeout: options.api &amp;&amp; options.api.type === &quot;rest&quot; ? &quot;5s&quot; : &quot;1s&quot;
//...
};
</code></pre></pre>
<p class="sc-13lpndi-7 cLBDjU">Additionally, the timeout depends on the trigger:</p><pre><pre style="color:#E5E5E5;background:linear-gradient(126deg, rgba(24, 24, 25, 0.77) 0%, rgba(24, 24, 25, 0.5) 100%);font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:2.4rem;margin:4rem 0;overflow:auto;border-radius:0.8rem;border:0.1rem solid rgba(220, 221, 225, 0.16)"><code class="language-javascript" style="white-space:pre;color:#E5E5E5;background:none;font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.6rem;font-size:1.6rem;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none">const disyuntorOptions = {
//...
trigger: err =&gt; {
// increment the number of attempts only for transient errors
return this._isTransientError(err);
}
//...
};
</code></pre></pre>
<p class="sc-13lpndi-7 cLBDjU">We have to detect if we are experiencing a transient error or not. There are errors that warrant opening the circuit and others that don&#x27;t. For example, in our feature flags service, an invalid flag is not an error that calls for opening the circuit. Instead, it is just a bad request from the client application.</p><p class="sc-13lpndi-7 cLBDjU">Using <code class="sc-1xg6er-0 heSQis">disyuntor</code>, this is how it looks to open the circuit:</p><pre><pre style="color:#E5E5E5;background:linear-gradient(126deg, rgba(24, 24, 25, 0.77) 0%, rgba(24, 24, 25, 0.5) 100%);font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:2.4rem;margin:4rem 0;overflow:auto;border-radius:0.8rem;border:0.1rem solid rgba(220, 221, 225, 0.16)"><code class="language-javascript" style="white-space:pre;color:#E5E5E5;background:none;font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.6rem;font-size:1.6rem;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none">_getFlagsFromStore(entityId, flagsIds) {
const self = this;
return self.protectedGetFlags(entityId, flagsIds)
.then(flags =&gt; { return flags; })
.catch(err =&gt; {
if (!self.stores.secondary || !self._isTransientError(err)) {
// don&#x27;t use fallback for non transient errors
throw err;
}
agent.logger.error(err.error || err, &#x27;getFlags.fromPrimaryStore.error&#x27;);
return self.stores.secondary.Entities.getFlags(entityId, flagsIds)
.then(flag =&gt; { return flag; })
.catch(err =&gt; {
throw err;
});
});
}
</code></pre></pre>
<p class="sc-13lpndi-7 cLBDjU"><code class="sc-1xg6er-0 heSQis">disyuntor</code> creates a <code class="sc-1xg6er-0 heSQis">Promise</code> to get the feature flags. If the <code class="sc-1xg6er-0 heSQis">Promise</code> resolves, it returns the flags; otherwise, it goes into the <code class="sc-1xg6er-0 heSQis">catch</code> block. Once there, we verify that we have configured a secondary store and that we are not experiencing a transient error and then retrieve the flags from the secondary store. Translating this into our final service architecture goes like this:</p><p class="sc-13lpndi-7 cLBDjU">First, we go to the cache:</p><pre><pre style="color:#E5E5E5;background:linear-gradient(126deg, rgba(24, 24, 25, 0.77) 0%, rgba(24, 24, 25, 0.5) 100%);font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:2.4rem;margin:4rem 0;overflow:auto;border-radius:0.8rem;border:0.1rem solid rgba(220, 221, 225, 0.16)"><code class="language-javascript" style="white-space:pre;color:#E5E5E5;background:none;font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.6rem;font-size:1.6rem;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none">_getFlagsFromStore(entityId, flagsIds) {
// ...
}
</code></pre></pre>
<p class="sc-13lpndi-7 cLBDjU">If the cache doesn&#x27;t have the value, we go to the primary store, for example, our gRPC API:</p><pre><pre style="color:#E5E5E5;background:linear-gradient(126deg, rgba(24, 24, 25, 0.77) 0%, rgba(24, 24, 25, 0.5) 100%);font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:2.4rem;margin:4rem 0;overflow:auto;border-radius:0.8rem;border:0.1rem solid rgba(220, 221, 225, 0.16)"><code class="language-javascript" style="white-space:pre;color:#E5E5E5;background:none;font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.6rem;font-size:1.6rem;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none">_getFlagsFromStore(entityId, flagsIds) {
// ...
return self.protectedGetFlags(entityId, flagsIds)
.then(flags =&gt; { return flags; })
.catch(err =&gt; {
// ...
});
}
</code></pre></pre>
<p class="sc-13lpndi-7 cLBDjU">If after 4 attempts the primary store fails to service the request, we go to the secondary store, which is MongoDB, to retrieve the flag:</p><pre><pre style="color:#E5E5E5;background:linear-gradient(126deg, rgba(24, 24, 25, 0.77) 0%, rgba(24, 24, 25, 0.5) 100%);font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:2.4rem;margin:4rem 0;overflow:auto;border-radius:0.8rem;border:0.1rem solid rgba(220, 221, 225, 0.16)"><code class="language-javascript" style="white-space:pre;color:#E5E5E5;background:none;font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.6rem;font-size:1.6rem;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none">_getFlagsFromStore(entityId, flagsIds) {
// ...
return self.protectedGetFlags(entityId, flagsIds)
.then(flags =&gt; { return flags; })
.catch(err =&gt; {
if (!self.stores.secondary || !self._isTransientError(err)) {
// don&#x27;t use fallback for non transient errors
throw err;
}
agent.logger.error(err.error || err, &#x27;getFlags.fromPrimaryStore.error&#x27;);
return self.stores.secondary.Entities.getFlags(entityId, flagsIds)
.then(flag =&gt; { return flag; })
.catch(err =&gt; {
throw err;
});
});
}
</code></pre></pre>
<p class="sc-13lpndi-7 cLBDjU">Going to the secondary store is our last resource when we are having issues with our cache and primary store. It allows us to continue serving flags to all other services.</p><p class="sc-13lpndi-7 cLBDjU">Finally, let&#x27;s look into our caching strategy a bit closer.</p><blockquote itemscope="" itemType="https://schema.org/citation" itemProp="citation" class="sc-7ovv77-0 iIECrc"><p class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 fTNKiF hPXnTc">“<!-- -->Learn more about circuit breaking: a design pattern to detect system failures and prevent the system from attempting to execute operations that will fail during events such as maintenance or outages.<!-- -->”</p><a href="https://twitter.com/intent/tweet?text=&quot;Learn%20more%20about%20circuit%20breaking%3A%20a%20design%20pattern%20to%20detect%20system%20failures%20and%20prevent%20the%20system%20from%20attempting%20to%20execute%20operations%20that%20will%20fail%20during%20events%20such%20as%20maintenance%20or%20outages.&quot; via @auth0 https://auth0.com/blog/progressive-service-architecture-at-auth0" target="_blank" rel="noopener noreferrer" class="sc-1w6xcbn-0 ixUiOW"><svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="Group 427319653"><path id="Vector" d="M9.31742 7.36182L15.1457 0.586914H13.7646L8.70389 6.46947L4.66193 0.586914H0L6.11224 9.48238L0 16.5869H1.38119L6.72542 10.3747L10.994 16.5869H15.656L9.31708 7.36182H9.31742ZM7.42569 9.56075L6.80639 8.67497L1.87886 1.62666H4.00029L7.97687 7.31487L8.59617 8.20065L13.7652 15.5945H11.6438L7.42569 9.56109V9.56075Z" fill="#FFFEFA"></path><path id="Vector_2" d="M9.81742 7.36182L15.6457 0.586914H14.2646L9.20389 6.46947L5.16193 0.586914H0.5L6.61224 9.48238L0.5 16.5869H1.88119L7.22542 10.3747L11.494 16.5869H16.156L9.81708 7.36182H9.81742ZM7.92569 9.56075L7.30639 8.67497L2.37886 1.62666H4.50029L8.47687 7.31487L9.09617 8.20065L14.2652 15.5945H12.1438L7.92569 9.56109V9.56075Z" fill="#FFFEFA"></path></g></svg><span class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jeLiTk kHaByn">Tweet This</span></a></blockquote><h2 id="Cache" class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bQHbCW kHaByn">Cache</h2><p class="sc-13lpndi-7 cLBDjU">For caching, we simply add Redis as cache and create cache strategies without any complex configuration:</p><pre><pre style="color:#E5E5E5;background:linear-gradient(126deg, rgba(24, 24, 25, 0.77) 0%, rgba(24, 24, 25, 0.5) 100%);font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:2.4rem;margin:4rem 0;overflow:auto;border-radius:0.8rem;border:0.1rem solid rgba(220, 221, 225, 0.16)"><code class="language-javascript" style="white-space:pre;color:#E5E5E5;background:none;font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.6rem;font-size:1.6rem;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none">&quot;use strict&quot;;
const _ = require(&quot;lodash&quot;);
module.exports = class CacheConfigurator {
constructor(strategies) {
this.Strategies = _.extend(
{
redis: require(&quot;./redis-cache&quot;),
memory: require(&quot;./memory-cache&quot;)
},
strategies
);
}
build(options) {
if (!options) {
return;
}
const strategy = this.Strategies[options.type];
if (!strategy) {
throw new Error(&quot;Unknown cache strategy &quot; + options.type);
}
return new strategy(options);
}
};
</code></pre></pre>
<p class="sc-13lpndi-7 cLBDjU">We use a <code class="sc-1xg6er-0 heSQis">CacheConfiguration</code> class that allows us to pick different caching strategies: a distributed cache, such as Redis, or an in-memory cache. Essentially, we initialize the SDK and specify which cache we want. The initialization strategy determines how the SDK will retrieve flag information from the cache:</p><pre><pre style="color:#E5E5E5;background:linear-gradient(126deg, rgba(24, 24, 25, 0.77) 0%, rgba(24, 24, 25, 0.5) 100%);font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;padding:2.4rem;margin:4rem 0;overflow:auto;border-radius:0.8rem;border:0.1rem solid rgba(220, 221, 225, 0.16)"><code class="language-javascript" style="white-space:pre;color:#E5E5E5;background:none;font-family:Consolas, Monaco, &#x27;Andale Mono&#x27;, &#x27;Ubuntu Mono&#x27;, monospace;text-align:left;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.6rem;font-size:1.6rem;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none">_getFlagFromCache(entityId, flagId) {
return this.cache ? this.cache.getEntityFlag(entityId, flagId) : Promise.resolve();
}
</code></pre></pre>
<p class="sc-13lpndi-7 cLBDjU">If the cache is configured, we retrieve the flag from the provider; otherwise, return a <code class="sc-1xg6er-0 heSQis">Promise</code>. If the cache misses, the request is handled by the primary store; otherwise, we return the value retrieved from the cache.</p><p class="sc-13lpndi-7 cLBDjU">We have the freedom to extend our caching strategies. We could replace Redis with MongoDB as a distributed cache, for example. We can do the same for the primary and secondary stores. We could use PostgreSQL as a primary store, for example, or any other provider that meets our present and future requirements.</p><h2 id="Managing-Disaster-Scenarios" class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bQHbCW kHaByn">Managing Disaster Scenarios</h2><p class="sc-13lpndi-7 cLBDjU">Our self-healing service architecture is simple and it allows us to implement disaster management solutions easily as we have seen:</p><p class="sc-13lpndi-7 cLBDjU">🛑 Cache times out.</p><p class="sc-13lpndi-7 cLBDjU">✅ Connect to primary store.</p><p class="sc-13lpndi-7 cLBDjU">🛑 Cache is down.</p><p class="sc-13lpndi-7 cLBDjU">✅ Connect to primary store.</p><p class="sc-13lpndi-7 cLBDjU">🛑 Primary store times out.</p><p class="sc-13lpndi-7 cLBDjU">✅ After a certain number of attempts, open the circuit to secondary store.</p><p class="sc-13lpndi-7 cLBDjU">🛑 Primary store is down.</p><p class="sc-13lpndi-7 cLBDjU">✅ After a certain number of attempts, open the circuit to secondary store.</p><p class="sc-13lpndi-7 cLBDjU">🛑 Secondary store is down.</p><p class="sc-13lpndi-7 cLBDjU">🙏 Pray… light a candle… everything is down!</p><p class="sc-13lpndi-7 cLBDjU">Ideally, the data that supports the service feature should be moved into its own database. In our case, this would mean moving our feature flags data into its own separate MongoDB instance with separate backups and monitoring.</p><h2 id="Next-Steps-For-Our-Architecture" class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bQHbCW kHaByn">Next Steps For Our Architecture</h2><p class="sc-13lpndi-7 cLBDjU">We are planning to perform the following infrastructure and system upgrades to further optimize our service architecture:</p><ul class="sc-13lpndi-8 ifMAwf"><li>Improve caching strategies further.</li><li>Augment the size of our caching instances to have even better reliability in each region.</li><li>Introduce circuit-breaking at the cache layer.
<ul class="sc-13lpndi-8 ifMAwf"><li>In case Redis fails, we can then talk to a memory cache.</li></ul></li><li>Memoize incoming requests for faster performance.
<ul class="sc-13lpndi-8 ifMAwf"><li>We could cache promises and return their resolution.</li></ul></li></ul><h2 id="Conclusion" class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bQHbCW kHaByn">Conclusion</h2><p class="sc-13lpndi-7 cLBDjU">Why did we build our own feature flags service anyway? We wanted a hosted version to use different providers and for any Auth0 appliance. By building our own service we gained provider flexibility that we can tailor to our specific needs. We considered offerings such as LaunchDarkly but it did not meet our service requirements. What we like best about our feature flags service is that we can define the complexity level of the service layer by layer. In the future, we may consider open sourcing this project.</p><div><h3 id="About-Auth0" class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 bwECpK kHaByn">About Auth0</h3><p class="sc-1v0wo3i-0 hthBSw">Auth0 by Okta takes a modern approach to customer identity and enables organizations to provide secure access to any application, for any user. Auth0 is a highly customizable platform that is as simple as development teams want, and as flexible as they need. Safeguarding billions of login transactions each month, Auth0 delivers convenience, privacy, and security so customers can focus on innovation. For more information, visit<!-- --> <a href="https://auth0.com/" target="_blank" rel="noopener noreferrer">https://auth0.com</a>.</p></div></div><div class="sc-k4hn9e-2 kXubaV"><div class="sc-dh4ait-0 fytga-d"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 akErW eywyFj">About the author</p></div><div class="sc-k4hn9e-3 bWnqDv"><img src="https://images.ctfassets.net/23aumh6u8s0i/6WmRCtZz0eDp6KE7pw8cJ3/7329ebb6302316cab8f55705100abab5/37590801_s_460_v_4" width="298" height="298" alt="Dan Arias" class="sc-k4hn9e-4 dMCDEs"/><div class="sc-k4hn9e-5 iPpHsR"><h4 class="styled__Heading-sc-165cfko-2 utils-sc-11hlfw-0 kAwpoB kHaByn">Dan Arias</h4><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 evZbox kAWGyf">Software Engineer (Auth0 Alumni)</p></div></div><span>A software engineer who dreams about non-electric sheep and autonomous vehicles and likes to champion security.</span><a href="/blog/authors/dan-arias/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 gOnbZW eOzIEM">View profile</a></div></article></div><aside class="sc-t4xvu3-1 bPENYC"><div class="sc-t4xvu3-2 ivrKga"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 fRlbrh bSjAPd">Related Tags</p><div class="sc-1iw8hf7-0 fZRVTq"><a href="/blog/search/?query=architecture&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#architecture</p></a><a href="/blog/search/?query=engineering&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#engineering</p></a><a href="/blog/search/?query=enterprise&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#enterprise</p></a><a href="/blog/search/?query=scalability&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#scalability</p></a><a href="/blog/search/?query=high-availability&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#high-availability</p></a><a href="/blog/search/?query=monitoring&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#monitoring</p></a><a href="/blog/search/?query=feature-flags&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#feature-flags</p></a><a href="/blog/search/?query=feature-toggles&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#feature-toggles</p></a><a href="/blog/search/?query=mongoDB&amp;page=1" class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#mongoDB</p></a></div><div class="sc-2sym2c-0 gMKMkL"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 fRlbrh bSjAPd">Share</p><div class="sc-2sym2c-1 kIyLtY"><button href="#" aria-label="Share on X social media button" class="sc-2sym2c-2 kjXFtJ"><svg width="25" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" class="sc-2sym2c-3 jSsmae"><path d="M14.118 10.775L19.947 4h-1.382l-5.06 5.883L9.463 4H4.8l6.112 8.896L4.801 20h1.381l5.344-6.212L15.795 20h4.662l-6.34-9.225h.001zm-1.892 2.199l-.619-.886L6.68 5.04H8.8l3.977 5.688.619.886 5.169 7.393h-2.121l-4.219-6.033z" fill="#FFFEFA"></path><path d="M14.161 10.775L19.99 4h-1.382l-5.06 5.883L9.506 4H4.844l6.112 8.896L4.844 20h1.38l5.345-6.212L15.838 20H20.5l-6.34-9.225h.001zm-1.892 2.199l-.619-.886L6.723 5.04h2.121l3.977 5.688.619.886 5.169 7.393h-2.121l-4.219-6.033z" fill="#FFFEFA"></path><path d="M14.661 10.775L20.49 4h-1.382l-5.06 5.883L10.006 4H5.344l6.112 8.896L5.344 20h1.38l5.345-6.212L16.338 20H21l-6.34-9.225h.001zm-1.892 2.199l-.619-.886L7.223 5.04h2.121l3.977 5.688.619.886 5.169 7.393h-2.121l-4.219-6.033z" fill="#FFFEFA"></path></svg></button><button href="#" aria-label="Share on LinkedIn social media button" class="sc-2sym2c-2 kjXFtJ"><svg width="25" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" class="sc-2sym2c-4 iEyEOd"><path d="M20.511 3H5.173c-.735 0-1.33.58-1.33 1.297V19.7c0 .717.595 1.301 1.33 1.301H20.51c.735 0 1.333-.584 1.333-1.297V4.297C21.844 3.58 21.246 3 20.51 3zM9.184 18.339H6.512V9.746h2.672v8.593zM7.848 8.576a1.548 1.548 0 11-.005-3.096 1.548 1.548 0 01.005 3.096zm11.334 9.763h-2.668v-4.177c0-.995-.017-2.278-1.389-2.278-1.388 0-1.6 1.086-1.6 2.208v4.247h-2.664V9.746h2.56v1.175h.035c.354-.675 1.226-1.389 2.524-1.389 2.703 0 3.202 1.779 3.202 4.092v4.715z" fill="#FFFEFA"></path></svg></button><div class="sc-2sym2c-6 ccdMVH"><button aria-label="Copy to clipboard button" class="sc-2sym2c-2 kjXFtJ"><svg width="25" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" class="sc-2sym2c-5 dCrKRg"><path d="M21.771 2.934l.137.137c.395.395.688.688.899.994a4 4 0 010 4.526c-.21.306-.504.6-.899.994l-4.12 4.12c-.57.57-1.04 1.04-1.453 1.391-.43.365-.865.66-1.383.83a4 4 0 01-2.473 0c-.518-.17-.953-.465-1.383-.83a21.82 21.82 0 01-1.2-1.138l1.414-1.414c.457.455.793.783 1.08 1.027.336.285.54.398.707.452a2 2 0 001.237 0c.167-.054.37-.167.706-.451.345-.293.757-.704 1.363-1.31l4.023-4.023c.493-.493.64-.646.731-.78a2 2 0 000-2.262c-.09-.133-.238-.287-.732-.78-.493-.494-.646-.64-.78-.732a2 2 0 00-2.262 0c-.133.091-.287.238-.78.732L15.42 5.598a5.158 5.158 0 00-.72-.296 6 6 0 00-1.527-.285l2.083-2.083c.395-.395.688-.688.994-.898a4 4 0 014.526 0c.306.21.6.503.994.898z" fill="#FFFEFA"></path><path d="M15.466 8.033c.35.298.742.68 1.2 1.137l-1.414 1.415a19.946 19.946 0 00-1.08-1.028c-.336-.284-.54-.397-.707-.451a2 2 0 00-1.236 0c-.167.054-.372.167-.707.451-.344.293-.757.704-1.362 1.31l-4.9 4.899c-.493.493-.64.646-.731.78a2 2 0 000 2.262c.09.133.238.287.732.78.493.494.646.64.78.732a2 2 0 002.262 0c.133-.091.287-.238.78-.732l2.058-2.058c.223.113.463.214.72.297.498.162 1.01.257 1.527.285l-2.959 2.959c-.395.395-.688.688-.994.898a4 4 0 01-4.526 0c-.306-.21-.6-.503-.994-.898l-.137-.137c-.395-.395-.688-.688-.899-.994a4 4 0 010-4.526c.21-.306.504-.6.899-.994l4.997-4.997c.569-.57 1.039-1.039 1.453-1.39.43-.365.865-.661 1.383-.83a4 4 0 012.472 0c.518.169.953.465 1.383.83z" fill="#FFFEFA"></path></svg></button></div></div></div></div><section class="sc-k75pvh-0 gRFZvM"><div class="styled__Wrapper-sc-1xhxac-0 dIMmPH"><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 cruTcJ GEyYG">Go even deeper</p><div class="styled__SliderWrapper-sc-1xhxac-6 fPZLSj"><div class="styled__Container-sc-1xhxac-1 ergSSi"><div class="sc-k75pvh-1 jYsUzS"><a href="/blog/how-we-hire-engineers/" class="sc-1akycv5-2 irkzRp"><div class="sc-1akycv5-0 eqcnId"><figure class="sc-1akycv5-1 bzOlzO"></figure></div><div class="sc-1akycv5-4 dPYFps"><div class="sc-1akycv5-3 bPXVfK"><span class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA dNAcKM">engineering</span><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 egLsFq fiJSa-d">Mar 22, 2016 • 7 min read</p></div><h3 class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 eKCpKG hhJSkn">How We Hire Engineers</h3><h4 class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 kwcFPE kHaByn">Providing transparency about the hiring process at Auth0 and the rationale behind it.</h4><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 bHhyEy kHaByn">Damian Schenkelman</p><div class="sc-1akycv5-5 ehBEGM"><button class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#engineering</p></button><button class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#hiring</p></button><button class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#auth0</p></button></div></div></a></div><div class="sc-k75pvh-1 jYsUzS"><a href="/blog/auth0-architecture-running-in-multiple-cloud-providers-and-regions/" class="sc-1akycv5-2 irkzRp"><div class="sc-1akycv5-0 eqcnId"><figure class="sc-1akycv5-1 hqHxlx"></figure></div><div class="sc-1akycv5-4 dPYFps"><div class="sc-1akycv5-3 bPXVfK"><span class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA dNAcKM">engineering</span><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 egLsFq fiJSa-d">Aug 15, 2018 • 11 min read</p></div><h3 class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 eKCpKG hhJSkn">Auth0 Architecture: 5 Years In</h3><h4 class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 kwcFPE kHaByn">Learn more about how Auth0 architects its services to ensure scalability and high availability to handle more than 1.5 billion logins per month.</h4><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 bHhyEy kHaByn">Dirceu Tiegs</p><div class="sc-1akycv5-5 ehBEGM"><button class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#architecture</p></button><button class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#engineering</p></button><button class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#enterprise</p></button></div></div></a></div><div class="sc-k75pvh-1 jYsUzS"><a href="/blog/5-massive-benefits-of-identity-as-a-service-for-developers/" class="sc-1akycv5-2 irkzRp"><div class="sc-1akycv5-0 eqcnId"><figure class="sc-1akycv5-1 hqHxlx"></figure></div><div class="sc-1akycv5-4 dPYFps"><div class="sc-1akycv5-3 bPXVfK"><span class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jBbHiM">identity &amp; security</span><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 egLsFq fiJSa-d">Nov 29, 2017 • 7 min read</p></div><h3 class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 eKCpKG hhJSkn">5 Massive Benefits Of Identity As A Service For Developers</h3><h4 class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 kwcFPE kHaByn">Identity as a service provides lots of benefits for companies and developers looking to iterate quickly. Focus on building customer value not authentication.</h4><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 bHhyEy kHaByn">Kyle Galbraith</p><div class="sc-1akycv5-5 ehBEGM"><button class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#identity</p></button><button class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#user</p></button><button class="sc-1xszjru-0 ftYCoM"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 jYylMA jmVJtT">#management</p></button></div></div></a></div></div></div></div></section></aside></div><div class="styled__Wrapper-sc-1gk46x3-0 BmSii"><footer class="styled__Content-sc-1gk46x3-1 jxcAek"><nav class="styled__Nav-sc-1gk46x3-2 jzCMRh"><section><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 gahICZ kfRWXJ">Developers</p><ul class="styled__LinksList-sc-1gk46x3-3 djugOZ"><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://developer.auth0.com/resources" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Developer Hub<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://developer.auth0.com/resources/code-samples" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Code Samples and Guides<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/blog/developers/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Blog posts<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://identityunlocked.auth0.com/public/49/Identity,-Unlocked.--bed7fada" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Identity Unlocked - Podcasts<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://developer.auth0.com/newsletter" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Zero Index Newsletter<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/agent-experience" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Agent Experience Score<!-- --> </a></li></ul></section><section><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 gahICZ kfRWXJ">Documentation</p><ul class="styled__LinksList-sc-1gk46x3-3 djugOZ"><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/docs/articles" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Articles<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/docs/quickstarts" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Quickstarts<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/docs/api" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">APIs<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/docs/libraries" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">SDK Libraries<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/changelog" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Changelog<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://auth0.com/blog/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Blog<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://auth0.com/resources/ebooks" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Reports<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://auth0.com/resources/webinars" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Webinars<!-- --> </a></li></ul></section><section><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 gahICZ kfRWXJ">Support Center</p><ul class="styled__LinksList-sc-1gk46x3-3 djugOZ"><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://community.auth0.com/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Community<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://support.auth0.com/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Support<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://support.auth0.com/center/s/knowledge" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Knowledge Base<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://marketplace.auth0.com" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Auth0 Marketplace<!-- --> </a></li></ul></section><section><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 gahICZ kfRWXJ">Company</p><ul class="styled__LinksList-sc-1gk46x3-3 djugOZ"><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/customers" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Our Customers<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/security" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Compliance - Ensuring privacy and security<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/partners" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Partners<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://www.okta.com/company/careers/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Careers<!-- --> <span class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 krhoHS kHaByn">We&#x27;re hiring!</span></a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://www.okta.com/company/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">About us<!-- --> </a></li></ul></section><section><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 gahICZ kfRWXJ">Get Involved</p><ul class="styled__LinksList-sc-1gk46x3-3 djugOZ"><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://developer.auth0.com/events" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Events<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/research-program" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Auth0 Research Program<!-- --> </a></li></ul></section><section><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 gahICZ kfRWXJ">Learning</p><ul class="styled__LinksList-sc-1gk46x3-3 djugOZ"><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://support.auth0.com/center/s/learning" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Learn<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/intro-to-iam" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Intro to IAM (CIAM)<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://auth0.com/blog/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Blog<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/architectural-playbook/identity" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Architecture Playbook<!-- --> </a></li></ul></section><section><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 gahICZ kfRWXJ">Platform</p><ul class="styled__LinksList-sc-1gk46x3-3 djugOZ"><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="https://auth0.com/ai" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Auth0 for AI Agents<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/platform/access-management" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Access Management<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/platform/extensibility" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Extensibility<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/platform/login-security" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Security<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/platform/user-management" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">User Management<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/platform/authentication" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Authentication<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/platform/cloud-deployment" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Cloud deployments<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/fine-grained-authorization" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Fine-Grained Authorization<!-- --> </a></li></ul></section><section><p class="styled__Overline-sc-165cfko-0 utils-sc-11hlfw-0 gahICZ kfRWXJ">Features</p><ul class="styled__LinksList-sc-1gk46x3-3 djugOZ"><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/features/universal-login" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Universal Login<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/features/single-sign-on" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Single Sign-On<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/features/multifactor-authentication" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Multifactor Authentication<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/features/actions" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Actions<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/features/machine-to-machine" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Machine to Machine<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/features/passwordless" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Passwordless<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/features/breached-passwords" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Breached Passwords<!-- --> </a></li><li class="styled__LinksListItem-sc-1gk46x3-5 kFpsIR"><a href="/features/token-vault" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj KYCXS">Token Vault<!-- --> </a></li></ul></section><section class="styled__LastSection-sc-1gk46x3-6 hLaJwg"><div class="styled__Icons-sc-1gk46x3-7 gMSNHd"><a href="https://twitter.com/auth0" target="_blank" rel="noopener noreferrer" aria-label="Twitter link" class="styled__IconsLink-sc-1gk46x3-8 gkIZFT"><svg viewBox="0 0 24 24" aria-hidden="true" width="24" height="24" fill="none"><g><path fill="#fff" d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a href="https://linkedin.com/company/auth0" target="_blank" rel="noopener noreferrer" aria-label="Linkedin link" class="styled__IconsLink-sc-1gk46x3-8 gkIZFT"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M19.5561 3H4.53738C3.71707 3 2.99988 3.59063 2.99988 4.40156V19.4531C2.99988 20.2687 3.71707 20.9953 4.53738 20.9953H19.5514C20.3764 20.9953 20.9952 20.2641 20.9952 19.4531V4.40156C20.9999 3.59063 20.3764 3 19.5561 3ZM8.578 18H5.99988V9.98438H8.578V18ZM7.378 8.76562H7.35925C6.53425 8.76562 5.99988 8.15156 5.99988 7.38281C5.99988 6.6 6.54831 6 7.39206 6C8.23581 6 8.75144 6.59531 8.77019 7.38281C8.77019 8.15156 8.23581 8.76562 7.378 8.76562ZM17.9999 18H15.4218V13.6172C15.4218 12.5672 15.0468 11.85 14.1139 11.85C13.4014 11.85 12.9796 12.3328 12.7921 12.8016C12.7218 12.9703 12.703 13.2 12.703 13.4344V18H10.1249V9.98438H12.703V11.1C13.078 10.5656 13.6639 9.79688 15.028 9.79688C16.7202 9.79688 17.9999 10.9125 17.9999 13.3172V18Z" fill="#fff"></path></svg></a><a href="https://github.com/auth0" target="_blank" rel="noopener noreferrer" aria-label="Github link" class="styled__IconsLink-sc-1gk46x3-8 gkIZFT"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 1.5C6.20156 1.5 1.5 6.32344 1.5 12.2672C1.5 17.025 4.50937 21.0562 8.68125 22.4813C8.74687 22.4953 8.80312 22.5 8.85938 22.5C9.24844 22.5 9.39844 22.2141 9.39844 21.9656C9.39844 21.7078 9.38906 21.0328 9.38437 20.1328C8.99062 20.2219 8.63906 20.2594 8.325 20.2594C6.30469 20.2594 5.84531 18.6891 5.84531 18.6891C5.36719 17.4469 4.67813 17.1141 4.67813 17.1141C3.76406 16.4719 4.67344 16.4531 4.74375 16.4531H4.74844C5.80313 16.5469 6.35625 17.5687 6.35625 17.5687C6.88125 18.4875 7.58437 18.7453 8.2125 18.7453C8.70469 18.7453 9.15 18.5859 9.4125 18.4641C9.50625 17.7703 9.77812 17.2969 10.0781 17.025C7.74844 16.7531 5.29688 15.8297 5.29688 11.7047C5.29688 10.5281 5.70469 9.56719 6.375 8.81719C6.26719 8.54531 5.90625 7.44844 6.47812 5.96719C6.47812 5.96719 6.55312 5.94375 6.7125 5.94375C7.09219 5.94375 7.95 6.08906 9.36563 7.07344C10.2047 6.83437 11.1 6.71719 11.9953 6.7125C12.8859 6.71719 13.7859 6.83437 14.625 7.07344C16.0406 6.08906 16.8984 5.94375 17.2781 5.94375C17.4375 5.94375 17.5125 5.96719 17.5125 5.96719C18.0844 7.44844 17.7234 8.54531 17.6156 8.81719C18.2859 9.57188 18.6937 10.5328 18.6937 11.7047C18.6937 15.8391 16.2375 16.7484 13.8984 17.0156C14.2734 17.3484 14.6109 18.0047 14.6109 19.0078C14.6109 20.4469 14.5969 21.6094 14.5969 21.9609C14.5969 22.2141 14.7422 22.5 15.1312 22.5C15.1875 22.5 15.2531 22.4953 15.3187 22.4813C19.4953 21.0562 22.5 17.0203 22.5 12.2672C22.5 6.32344 17.7984 1.5 12 1.5Z" fill="#fff"></path></svg></a></div></section></nav><section class="styled__FooterBottom-sc-1gk46x3-10 eUSWhy"><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 dfnlHp jxtigD">© <!-- -->2026<!-- --> Okta, Inc. All Rights Reserved.</p><div class="styled__Legal-sc-1gk46x3-12 gczZFN"><a href="https://status.auth0.com" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj kHaByn">Status</a> <!-- -->•<!-- --> <a href="https://www.okta.com/agreements/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj kHaByn">Legal</a> <!-- -->•<!-- --> <a href="/privacy" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj kHaByn">Privacy</a> <!-- -->•<!-- --> <a href="https://www.okta.com/terms-of-service" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj kHaByn">Terms</a> <!-- -->•<!-- --> <a href="/your-privacy-choices" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj kHaByn">Your Privacy Choices</a><img alt="" src="https://cdn.auth0.com/website/footer/ccpa.svg"/></div></section><section class="styled__FooterBottomMobile-sc-1gk46x3-9 cmjEfG"><div class="styled__Icons-sc-1gk46x3-7 iMfwFS"><a href="https://twitter.com/auth0" target="_blank" rel="noopener noreferrer" aria-label="Twitter link" class="styled__IconsLink-sc-1gk46x3-8 gkIZFT"><svg viewBox="0 0 24 24" aria-hidden="true" width="24" height="24" fill="none"><g><path fill="#fff" d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a href="https://linkedin.com/company/auth0" target="_blank" rel="noopener noreferrer" aria-label="Linkedin link" class="styled__IconsLink-sc-1gk46x3-8 gkIZFT"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M19.5561 3H4.53738C3.71707 3 2.99988 3.59063 2.99988 4.40156V19.4531C2.99988 20.2687 3.71707 20.9953 4.53738 20.9953H19.5514C20.3764 20.9953 20.9952 20.2641 20.9952 19.4531V4.40156C20.9999 3.59063 20.3764 3 19.5561 3ZM8.578 18H5.99988V9.98438H8.578V18ZM7.378 8.76562H7.35925C6.53425 8.76562 5.99988 8.15156 5.99988 7.38281C5.99988 6.6 6.54831 6 7.39206 6C8.23581 6 8.75144 6.59531 8.77019 7.38281C8.77019 8.15156 8.23581 8.76562 7.378 8.76562ZM17.9999 18H15.4218V13.6172C15.4218 12.5672 15.0468 11.85 14.1139 11.85C13.4014 11.85 12.9796 12.3328 12.7921 12.8016C12.7218 12.9703 12.703 13.2 12.703 13.4344V18H10.1249V9.98438H12.703V11.1C13.078 10.5656 13.6639 9.79688 15.028 9.79688C16.7202 9.79688 17.9999 10.9125 17.9999 13.3172V18Z" fill="#fff"></path></svg></a><a href="https://github.com/auth0" target="_blank" rel="noopener noreferrer" aria-label="Github link" class="styled__IconsLink-sc-1gk46x3-8 gkIZFT"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 1.5C6.20156 1.5 1.5 6.32344 1.5 12.2672C1.5 17.025 4.50937 21.0562 8.68125 22.4813C8.74687 22.4953 8.80312 22.5 8.85938 22.5C9.24844 22.5 9.39844 22.2141 9.39844 21.9656C9.39844 21.7078 9.38906 21.0328 9.38437 20.1328C8.99062 20.2219 8.63906 20.2594 8.325 20.2594C6.30469 20.2594 5.84531 18.6891 5.84531 18.6891C5.36719 17.4469 4.67813 17.1141 4.67813 17.1141C3.76406 16.4719 4.67344 16.4531 4.74375 16.4531H4.74844C5.80313 16.5469 6.35625 17.5687 6.35625 17.5687C6.88125 18.4875 7.58437 18.7453 8.2125 18.7453C8.70469 18.7453 9.15 18.5859 9.4125 18.4641C9.50625 17.7703 9.77812 17.2969 10.0781 17.025C7.74844 16.7531 5.29688 15.8297 5.29688 11.7047C5.29688 10.5281 5.70469 9.56719 6.375 8.81719C6.26719 8.54531 5.90625 7.44844 6.47812 5.96719C6.47812 5.96719 6.55312 5.94375 6.7125 5.94375C7.09219 5.94375 7.95 6.08906 9.36563 7.07344C10.2047 6.83437 11.1 6.71719 11.9953 6.7125C12.8859 6.71719 13.7859 6.83437 14.625 7.07344C16.0406 6.08906 16.8984 5.94375 17.2781 5.94375C17.4375 5.94375 17.5125 5.96719 17.5125 5.96719C18.0844 7.44844 17.7234 8.54531 17.6156 8.81719C18.2859 9.57188 18.6937 10.5328 18.6937 11.7047C18.6937 15.8391 16.2375 16.7484 13.8984 17.0156C14.2734 17.3484 14.6109 18.0047 14.6109 19.0078C14.6109 20.4469 14.5969 21.6094 14.5969 21.9609C14.5969 22.2141 14.7422 22.5 15.1312 22.5C15.1875 22.5 15.2531 22.4953 15.3187 22.4813C19.4953 21.0562 22.5 17.0203 22.5 12.2672C22.5 6.32344 17.7984 1.5 12 1.5Z" fill="#fff"></path></svg></a></div><div class="styled__LegalAndLangMobile-sc-1gk46x3-11 cGOVjJ"><div class="styled__Legal-sc-1gk46x3-12 gczZFN"><a href="https://status.auth0.com" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj kHaByn">Status</a> <!-- -->•<!-- --> <a href="https://www.okta.com/agreements/" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj kHaByn">Legal</a> <!-- -->•<!-- --> <a href="/privacy" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj kHaByn">Privacy</a> <!-- -->•<!-- --> <a href="https://www.okta.com/terms-of-service" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj kHaByn">Terms</a> <!-- -->•<!-- --> <a href="/your-privacy-choices" class="styled__Link-sc-bubr9x-0 utils-sc-11hlfw-0 fFCiQj kHaByn">Your Privacy Choices</a><img alt="" src="https://cdn.auth0.com/website/footer/ccpa.svg"/></div></div><p class="styled__Paragraph-sc-165cfko-1 utils-sc-11hlfw-0 dfnlHp grCsyJ">© <!-- -->2026<!-- --> Okta, Inc. All Rights Reserved.</p></section></footer></div><div id="asset-library-root"></div><div id="modal-root"></div><div id="alert-root"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"path":"progressive-service-architecture-at-auth0","lastUpdatedBy":"Unknown during the migration","layout":"post","title":"Progressive Service Architecture At Auth0","description":"Learn how to build a mature service architecture for high availability by creating its topology progressively.","metaTitle":"Progressive Service Architecture Eng. and Feature Flags at Auth0","metaDescription":"Learn how to create a mature service architecture for scalability and high availability by building its topology progressively. See a deep dive into Auth0's feature flags and progressive services.","heroImage":{"url":"https://images.ctfassets.net/23aumh6u8s0i/56S9oDWKVeNY8AIszkZvw1/7d6794f3d31d4eedb5a3d3699e796e5c/default","size":{"width":1764,"height":1584}},"dateCreated":"2018-11-14T11:27","dateLastUpdated":null,"category":["Engineering","Best Practices","Scalability"],"tags":["architecture","engineering","enterprise","scalability","high-availability","monitoring","feature-flags","feature-toggles","mongoDB"],"lang":"en","orderOfFeaturedPost":null,"communityTopicId":null,"metaRobots":null,"designArtistLink":null,"designArtistName":null,"postContent":"\n\nIn this blog post, we are going to discuss how the Auth0 Site Reliability team, led by **Hernán Meydac Jean**, used a progressive approach to build a mature service architecture characterized by high availability and reliability.\n\nAt Auth0, we manage different features for our clients. We use feature flags to enable features into codebases without breaking anything or having to change the code. As defined by [Pete Hodgson](http://blog.thepete.net/about/), feature flags, or feature toggles, are a flexible and powerful technique that [allow developers to modify the behavior of a system without changing its code](https://martinfowler.com/articles/feature-toggles.html). A feature flag lets a development team turn features on and off in the system even after it is live in production.\n\n## Motivation for a Feature Flags Router Service\n\nTo help us manage feature flags, our SRE team created a **feature flags router** service. As defined by [Martin Fowler](https://martinfowler.com/articles/feature-toggles.html), a feature flags router can be used to dynamically control which code path to a feature is live. The router lets us centralize all the feature flags logic in a single place allowing different services and products to retrieve the same information at any time to turn on and off feature flags across different functions.\n\n![Flags Router Architecture](https://images.ctfassets.net/23aumh6u8s0i/A2xHacMuGa6gCe8VQNWVo/9ce0442499d1766afb0027925d985618/01-flags-router-architecture)\n\nOur vision for this feature flags router service is to make it a generic service that can be used by multiple products and services within and outside our organization. Because of the extensive number of clients that this generic service will support and the massive amount of requests these clients will generate, we needed to design this service with an architecture that makes it easy to scale and promotes high availability.\n\n## Engineering an SDK for Feature Parity\n\nWith this in mind, the SRE team came up with a feature flags SDK designed to act as an abstract client so that we can use any kind of provider or database with it. The goal of the SDK is to have the same language and the same syntax across services. Therefore, in order to retrieve a feature flag value, we don't need to access a database directly or make a direct request to a server; instead, we simply use the SDK which offers the same code everywhere. If we make changes to the logic behind the SDK, we just need to bump up version of the SDK to apply the updates.\n\n\u003cinclude src=\"TweetQuote\" quoteText=\"Learn how the @auth0 SRE team created a standardized library to help them manage feature flags and promote feature parity.\"/\u003e\n\nThe final design of this client was the result of a progressive service architecture that provides us with fallbacks, self-healing, high availability, and high scalability. We started with a basic topology that gave the client direct access to the database and ended with a sophisticated topology that integrates a self-healing strategy for the feature flags router service.\n\nLet's explore the system topology of each stage of this process as it was explained by Hernán during one of our internal engineering talks. These topologies can be abstracted to use any kind of provider and different databases.\n\n\u003e Would you like to tackle reliability and scalability challenges? We are currently looking for new teammates to [**join our SRE team**](https://auth0.com/careers/job/senior-software-engineer-site-reliability:e90541c4-d211-4d47-be6d-e0f1dc2673be?level-origin=applied\u0026level-source=auth0blog)!\n\n## Connecting Directly to the Database\n\nThis is the scenario where the client connects directly to a database such as MongoDB. In essence, this is the most basic configuration to have for the service. We simply connect the client to any database of our choice and retrieve data \u0026mdash; in this case, feature flags. The client could be limited to have read-only permissions to the database but write operations could be added if necessary.\n\n![Connecting the service client directly to the database](https://images.ctfassets.net/23aumh6u8s0i/GhUtdb58nlZHen2X7RQmV/3aab49faf0d5cb87af88ca3bf1ab768c/02-connecting-the-service)\n\n\u003e Our current client for our feature flags service is read-only.\n\nLet's look at some of the pros and cons of this architecture.\n\n### Pros\n\n- Easy to set up.\n- Doesn't require additional infrastructure.\n- Configurable for [Auth0 appliances](https://auth0.com/docs/appliance).\n - An Auth0 appliance is an Auth0 deployment that exists in a dedicated area of Auth0's cloud, your cloud, or your own data center.\n - For example, a self-hosted Auth0 instance doesn't need to connect to the Auth0 server that manages the service; instead, it can connect to the database directly.\n\n### Cons\n\n- No [failover](https://en.wikipedia.org/wiki/Failover).\n - If the database is down, the service is also down.\n- Database stress occurs if the client application doesn't enforce limits.\n- Higher security complexity.\n - You have to grant database access to a service.\n - It requires you to open permissions, create security groups, etc. to control access levels to the database by services.\n\nAlthough this basic approach is straightforward, we thought of a better approach: integrate the concept of a _store_ in the service architecture.\n\n## Using a Data Store\n\nTo augment the previously discussed architecture, we added the concept of a store. A store is basically a service provider. It can be a primary or a secondary provider that we can connect to different services. In turn, a service can be an API or a direct database connection. The core principle here is that we can use the stores to design a fallback strategy and optimize service availability. For example, the secondary store serves as a fallback for any kind of incident that we could have with the primary store to guarantee data access for the service.\n\n![Service architecture implementing a primary and secondary store](https://images.ctfassets.net/23aumh6u8s0i/1IbTfLNZaEqbfQ5mddowG8/994da8630dc45cd8122d54743e001b89/03-service-architecture)\n\nLet's look at the architecture flow of this topology:\n\n- The client tries to connect to the primary store to use an API to retrieve data.\n\n![Service client tries to connect to the primary store](https://images.ctfassets.net/23aumh6u8s0i/1prv772HvNajP6rXqo2Cgi/233b7849db86f2b8b92774731b6b668e/04-primary-secondary-stores)\n\n- If API is down for whatever reason, after 5 attempts, a logic circuit is opened.\n- The open circuit takes the client request to the secondary store.\n- The data is then retrieved from the secondary store.\n\n![Service client request routed to secondary store](https://images.ctfassets.net/23aumh6u8s0i/1JdGGtMNSCMJnLtnDr8rEz/81ab3ea83b584cf2da194aa9b09a4f1a/05-primary-secondary-stores-secondary)\n\nThis flow may incur performance degradation or other problems but at least the service is operational. Additionally, the stores have the ability to self-heal. Once the primary store is up and running again, the circuit is closed and we go back to using the primary store.\n\n### Pros\n\n- Circuit-breaking to handle failures.\n- Automatic fallback and restoration.\n- Scalable with company growth by abstracting underlying providers.\n- Services with different access can query data.\n\n### Cons\n\n- Additional infrastructure and maintenance required.\n- Additional cost.\n- Difficult to perform a [capacity plan](https://en.wikipedia.org/wiki/Capacity_planning) for both stores.\n - When the primary store is down, all the requests go to the secondary one.\n - You must understand the capacity of the secondary store and the traffic on its region; otherwise, this store will have a huge performance impact on the system.\n - Capacity planning is not easy.\n - Depends on traffic, use cases, client applications.\n - Must account for applications having an internal cache or not.\n - Must strategize how services are scaled.\n- Need to balance stores to avoid major outage when the circuit is open.\n - Avoid stampedes while the circuit is open.\n - Requests are going to flood the secondary store and may crash it.\n\nTo solve the problems present in this topology, we needed to add another layer: the cache. Let's explore that next.\n\n## Adding Caching to the Stores\n\nIn this stage, we now have three layers: cache, primary store, and secondary store.\n\n![Adding caching to the service architecture](https://images.ctfassets.net/23aumh6u8s0i/74VOXPoFGNIVYXy4fj0dSn/ff91590956cd0412fce71ae350fea4fe/06-adding-caching)\n\nLet's understand how these layers interact with each other by analyzing the architectural flow of this topology:\n\n- The client first retrieves data from the cache, such as Redis.\n\n![Service request retrieving data from cache](https://images.ctfassets.net/23aumh6u8s0i/6GasF46CTEOmTgntR1uerQ/5dbb3cfec0c88afa919445885c4e3676/07-cache-stores-cache)\n\n- If data is not in the cache, the request goes to the primary store.\n- When the primary store provides the data response, it also updates the cache.\n- Subsequent requests will then retrieve that data from the cache.\n\n![Service request retrieving data from primary store and primary store updating cache](https://images.ctfassets.net/23aumh6u8s0i/1KHdaMKEL7UFD00iZ79N1J/033c8cda9e155dafbc32c1f77bfc5679/08-cache-stores-primary)\n\n- If the cache is up but doesn't have the needed value (the cache is outdated) and the primary store is down, the request is served by the secondary store which acts as a fallback.\n\n- If both the cache and the primary store are down, the request is also served by the secondary store.\n\n![Service request retrieving data from secondary store as fallback](https://images.ctfassets.net/23aumh6u8s0i/63HKAlYVg5FEjThveOJrUv/7d35d714bee61ee9ad2cc091886b9aad/09-cache-stores-secondary)\n\n- To create a service outage, all three layers need to be down: cache, primary store, and secondary store.\n\n![Service outage created when primary store, secondary store, and cache are down](https://images.ctfassets.net/23aumh6u8s0i/v0E5GhQTjncPZ0YkkJPbo/4a65459c208d29af5766fc58baa92338/10-service-outage)\n\nThis three-layer system model creates a high availability setup to keep the service up and running.\n\n\u003e We highly benefit from this architecture at Auth0, since we can keep some of our services operational in a similar way to our authentication server.\n\n### Pros\n\n- Faster response times.\n - Ideal for data that doesn't change much, such as feature flags in our case.\n - Great benefit to have flags cached.\n- Reduction of stress on stores.\n- Same benefits as stores (circuit-breaking, fallback, restoration).\n\n### Cons\n\n- Yet more infrastructure to add and maintain with additional cost.\n - You now need a distributed cache.\n- Another point of failure to consider.\n- Caching requires additional balance (proper [time to live (TTL)](https://en.wikipedia.org/wiki/Time_to_live) values, [cache invalidation](https://en.wikipedia.org/wiki/Cache_invalidation))\n- Same problems as stores in relation to capacity planning.\n\nThis is the most mature progression of the service architecture for our feature flags service. Part of its success is counting with a performant circuit-breaking mechanism that allows us to switch between the different layers of the model as needed. Let's explore more in-depth our current circuit-breaking strategy.\n\n## Circuit-Breaking\n\n[Circuit breaking is a design pattern](https://en.wikipedia.org/wiki/Circuit_breaker_design_pattern) implemented in software architecture and popularized by [Michael Nygard](https://twitter.com/mtnygard) in his book, [_Release It!_](https://pragprog.com/book/mnee/release-it). This pattern is used to detect system failures and prevent the system from attempting to execute operations that will fail during events such as maintenance or outages.\n\nAt Auth0, we implement the circuit-breaking pattern using a custom library created by our Head of Engineering, [José Romaniello](https://twitter.com/jfroma), called [disyuntor](https://github.com/auth0/disyuntor).\n\nOur engineers use this library to easily configure different paths for exceptions and problems:\n\n```javascript\nconst disyuntor = require('disyuntor');\n\nconst dnsSafeLookup = disyuntor.wrapCallbackApi({\n //This is used in error messages.\n name: 'dns.lookup',\n\n //Timeout for the protected function.\n // timeout: '2s',\n\n //The number of consecutive failures before switching to open mode\n //and stop calling the underlying service.\n // maxFailures: 5,\n\n //The minimum time the circuit remains open before doing another attempt.\n // cooldown: '15s',\n\n //The maximum amount of time the circuit remains open before doing a new attempt.\n // maxCooldown: '60s',\n\n //optionally log errors\n onTrip: (err, failures, cooldown) =\u003e {\n console.log(`dns.lookup triped because it failed ${failures} times.\nLast error was ${err.message}! There will be no more attempts for ${cooldown}ms.`);\n },\n\n onClose: (cooldown) =\u003e {\n console.log(`dns.lookup circuit closed after ${cooldown}ms.`;\n }\n\n // //optional callback to prevent some errors to trigger the disyuntor logic\n // //in this case ENOTFOUND is passed to the callback and will\n // //not trigger the breaker eg:\n // trigger: (err) =\u003e err.code !== 'ENOTFOUND'\n}, dns.lookup);\n\n//then use as you will normally use dns.lookup\ndnsSafeLookup('google.com', (err, ip) =\u003e {\n if (err) { return console.error(err.message); }\n console.log(ip);\n})\n```\n\nFor example, if we have a problem after 4 failures, we open the circuit and we go on a different path. For this path, you can have a recovery, a fallback, or any kind of preferred alternative in your code. Whenever the service trips the wire, using the `onTrip` method, we log an exception:\n\n```javascript\n// Configure protected functions with circuit-breaker\nconst disyuntorOptions = {\n name: \"client\",\n maxFailures: 4,\n cooldown: \"15s\",\n timeout: options.api \u0026\u0026 options.api.type === \"rest\" ? \"5s\" : \"1s\",\n trigger: err =\u003e {\n // increment the number of attempts only for transient errors\n return this._isTransientError(err);\n },\n onTrip: (err, failures) =\u003e\n agent.logger.error(\n { err },\n `An error occurred while reading from primary store after ${failures} attempts.`\n )\n};\n```\n\nThis is the basic configuration we have for our feature flags service. At every 4 failures, we open the circuit, go to the secondary store, and we have a cooldown of 15 seconds before we try to use the primary store again.\n\nOur service has a RESTful implementation using [HapiJS](https://hapijs.com/) and another one using [gRPC](https://grpc.io/). In the circuit-breaking configuration, we also specify a timeout whose length depends on the type of API request. For HapiJS, if servicing the request takes longer than 5 seconds, we automatically time out. For gRPC, the timeout is 1 second:\n\n```javascript\nconst disyuntorOptions = {\n //...\n timeout: options.api \u0026\u0026 options.api.type === \"rest\" ? \"5s\" : \"1s\"\n //...\n};\n```\n\nAdditionally, the timeout depends on the trigger:\n\n```javascript\nconst disyuntorOptions = {\n //...\n trigger: err =\u003e {\n // increment the number of attempts only for transient errors\n return this._isTransientError(err);\n }\n //...\n};\n```\n\nWe have to detect if we are experiencing a transient error or not. There are errors that warrant opening the circuit and others that don't. For example, in our feature flags service, an invalid flag is not an error that calls for opening the circuit. Instead, it is just a bad request from the client application.\n\nUsing `disyuntor`, this is how it looks to open the circuit:\n\n```javascript\n_getFlagsFromStore(entityId, flagsIds) {\n const self = this;\n return self.protectedGetFlags(entityId, flagsIds)\n .then(flags =\u003e { return flags; })\n .catch(err =\u003e {\n if (!self.stores.secondary || !self._isTransientError(err)) {\n // don't use fallback for non transient errors\n throw err;\n }\n agent.logger.error(err.error || err, 'getFlags.fromPrimaryStore.error');\n return self.stores.secondary.Entities.getFlags(entityId, flagsIds)\n .then(flag =\u003e { return flag; })\n .catch(err =\u003e {\n throw err;\n });\n });\n}\n```\n\n`disyuntor` creates a `Promise` to get the feature flags. If the `Promise` resolves, it returns the flags; otherwise, it goes into the `catch` block. Once there, we verify that we have configured a secondary store and that we are not experiencing a transient error and then retrieve the flags from the secondary store. Translating this into our final service architecture goes like this:\n\nFirst, we go to the cache:\n\n```javascript\n_getFlagsFromStore(entityId, flagsIds) {\n // ...\n}\n```\n\nIf the cache doesn't have the value, we go to the primary store, for example, our gRPC API:\n\n```javascript\n_getFlagsFromStore(entityId, flagsIds) {\n // ...\n return self.protectedGetFlags(entityId, flagsIds)\n .then(flags =\u003e { return flags; })\n .catch(err =\u003e {\n // ...\n });\n}\n```\n\nIf after 4 attempts the primary store fails to service the request, we go to the secondary store, which is MongoDB, to retrieve the flag:\n\n```javascript\n_getFlagsFromStore(entityId, flagsIds) {\n // ...\n return self.protectedGetFlags(entityId, flagsIds)\n .then(flags =\u003e { return flags; })\n .catch(err =\u003e {\n if (!self.stores.secondary || !self._isTransientError(err)) {\n // don't use fallback for non transient errors\n throw err;\n }\n agent.logger.error(err.error || err, 'getFlags.fromPrimaryStore.error');\n return self.stores.secondary.Entities.getFlags(entityId, flagsIds)\n .then(flag =\u003e { return flag; })\n .catch(err =\u003e {\n throw err;\n });\n });\n}\n```\n\nGoing to the secondary store is our last resource when we are having issues with our cache and primary store. It allows us to continue serving flags to all other services.\n\nFinally, let's look into our caching strategy a bit closer.\n\n\u003cinclude src=\"TweetQuote\" quoteText=\"Learn more about circuit breaking: a design pattern to detect system failures and prevent the system from attempting to execute operations that will fail during events such as maintenance or outages.\"/\u003e\n\n## Cache\n\nFor caching, we simply add Redis as cache and create cache strategies without any complex configuration:\n\n```javascript\n\"use strict\";\nconst _ = require(\"lodash\");\nmodule.exports = class CacheConfigurator {\n constructor(strategies) {\n this.Strategies = _.extend(\n {\n redis: require(\"./redis-cache\"),\n memory: require(\"./memory-cache\")\n },\n strategies\n );\n }\n build(options) {\n if (!options) {\n return;\n }\n const strategy = this.Strategies[options.type];\n if (!strategy) {\n throw new Error(\"Unknown cache strategy \" + options.type);\n }\n return new strategy(options);\n }\n};\n```\n\nWe use a `CacheConfiguration` class that allows us to pick different caching strategies: a distributed cache, such as Redis, or an in-memory cache. Essentially, we initialize the SDK and specify which cache we want. The initialization strategy determines how the SDK will retrieve flag information from the cache:\n\n```javascript\n_getFlagFromCache(entityId, flagId) {\n return this.cache ? this.cache.getEntityFlag(entityId, flagId) : Promise.resolve();\n}\n```\n\nIf the cache is configured, we retrieve the flag from the provider; otherwise, return a `Promise`. If the cache misses, the request is handled by the primary store; otherwise, we return the value retrieved from the cache.\n\nWe have the freedom to extend our caching strategies. We could replace Redis with MongoDB as a distributed cache, for example. We can do the same for the primary and secondary stores. We could use PostgreSQL as a primary store, for example, or any other provider that meets our present and future requirements.\n\n## Managing Disaster Scenarios\n\nOur self-healing service architecture is simple and it allows us to implement disaster management solutions easily as we have seen:\n\n🛑 Cache times out.\n\n✅ Connect to primary store.\n\n🛑 Cache is down.\n\n✅ Connect to primary store.\n\n🛑 Primary store times out.\n\n✅ After a certain number of attempts, open the circuit to secondary store.\n\n🛑 Primary store is down.\n\n✅ After a certain number of attempts, open the circuit to secondary store.\n\n🛑 Secondary store is down.\n\n🙏 Pray… light a candle… everything is down!\n\nIdeally, the data that supports the service feature should be moved into its own database. In our case, this would mean moving our feature flags data into its own separate MongoDB instance with separate backups and monitoring.\n\n## Next Steps For Our Architecture\n\nWe are planning to perform the following infrastructure and system upgrades to further optimize our service architecture:\n\n- Improve caching strategies further.\n- Augment the size of our caching instances to have even better reliability in each region.\n- Introduce circuit-breaking at the cache layer.\n - In case Redis fails, we can then talk to a memory cache.\n- Memoize incoming requests for faster performance.\n - We could cache promises and return their resolution.\n\n## Conclusion\n\nWhy did we build our own feature flags service anyway? We wanted a hosted version to use different providers and for any Auth0 appliance. By building our own service we gained provider flexibility that we can tailor to our specific needs. We considered offerings such as LaunchDarkly but it did not meet our service requirements. What we like best about our feature flags service is that we can define the complexity level of the service layer by layer. In the future, we may consider open sourcing this project.\n\n\u003cinclude src=\"asides/AboutAuth0\" /\u003e\n","tutorialChapterTitle":null,"redirectTo":null,"reportingAuthorType":"Auth0 Employee","reportingPostType":null,"reportingIsAuth0cta":true,"authors":[{"path":"dan-arias","name":"Dan Arias","avatar":{"url":"https://images.ctfassets.net/23aumh6u8s0i/6WmRCtZz0eDp6KE7pw8cJ3/7329ebb6302316cab8f55705100abab5/37590801_s_460_v_4","size":{"width":298,"height":298}},"lastUpdatedBy":"Robertino Calcaterra","email":null,"twitter":null,"github":null,"linkedin":null,"isPopular":false,"personalWebsite":null,"type":"Former Auth0 Employee","jobTitle":"Software Engineer (Auth0 Alumni)","description":"A software engineer who dreams about non-electric sheep and autonomous vehicles and likes to champion security."}],"relatedPosts":[{"path":"how-we-hire-engineers","title":"How We Hire Engineers","description":"Providing transparency about the hiring process at Auth0 and the rationale behind it.","heroImage":{"url":"https://images.ctfassets.net/23aumh6u8s0i/6L2SgKnOjAgtu4asmHaBOW/67be3bef8f36e7ce5cb0a0b796415f23/01_HowWeHireEngineers-blog_588x528_3x-Alina","size":{"width":1764,"height":1584}},"category":["Engineering","Hires","Engineers"],"layout":"post","tutorialChapterTitle":null,"lang":"en","authors":["Damian Schenkelman"],"dateCreated":"2016-03-22T12:00","tags":["engineering","hiring","auth0","enterprise","hr","developers","engineers","work","jobs","careers","career","auziro","professional","networking"],"readTime":7},{"path":"auth0-architecture-running-in-multiple-cloud-providers-and-regions","title":"Auth0 Architecture: 5 Years In","description":"Learn more about how Auth0 architects its services to ensure scalability and high availability to handle more than 1.5 billion logins per month.","heroImage":{"url":"https://images.ctfassets.net/23aumh6u8s0i/56S9oDWKVeNY8AIszkZvw1/7d6794f3d31d4eedb5a3d3699e796e5c/default","size":{"width":1764,"height":1584}},"category":["Engineering","Best Practices","Scalability"],"layout":"post","tutorialChapterTitle":null,"lang":"en","authors":["Dirceu Tiegs"],"dateCreated":"2018-08-15T08:30","tags":["architecture","engineering","enterprise","authorization","scalability","high-availability","cloud","monitoring","aws","mongoDB","testing","automation","cdn"],"readTime":11},{"path":"5-massive-benefits-of-identity-as-a-service-for-developers","title":"5 Massive Benefits Of Identity As A Service For Developers","description":"Identity as a service provides lots of benefits for companies and developers looking to iterate quickly. Focus on building customer value not authentication.","heroImage":{"url":"https://images.ctfassets.net/23aumh6u8s0i/56S9oDWKVeNY8AIszkZvw1/7d6794f3d31d4eedb5a3d3699e796e5c/default","size":{"width":1764,"height":1584}},"category":["Identity \u0026 Security","Identity","IDaaS"],"layout":"post","tutorialChapterTitle":null,"lang":"en","authors":["Kyle Galbraith"],"dateCreated":"2017-11-29T16:55","tags":["identity","user","management","service","auth0"],"readTime":7}],"mlRecommendations":["/blog/surprises-in-my-switch-to-remote-work/","/blog/demand-for-identity-management-drives-auth0-partner-growth/","/blog/chromedevsummit-summary/"],"isFeatured":null,"isHiddenFromBlogPostGrid":null,"isInPressRelease":null,"sidebarAd":null,"formattedDate":"Nov 14, 2018","postDate":"2018-11-14T11:27","mlRecommendationsData":[{"path":"/blog/chromedevsummit-summary/","heroImage":{"url":"https://images.ctfassets.net/23aumh6u8s0i/56S9oDWKVeNY8AIszkZvw1/7d6794f3d31d4eedb5a3d3699e796e5c/default","size":{"width":1764,"height":1584}},"title":"Chrome Developer Summit 2016 - Summary","category":["Developers","Events","Chrome Developer Summit"]},{"path":"/blog/demand-for-identity-management-drives-auth0-partner-growth/","heroImage":{"url":"https://images.ctfassets.net/23aumh6u8s0i/6Hq5mTYMepM8VaykLB4ZiH/3433dcd57b355b8d14a9e542bea0f17e/Announcements3","size":{"width":1764,"height":1584}},"title":"Demand for Identity Management Drives Auth0 Partner Growth","category":["Announcements","Partners","Growth"]},{"path":"/blog/surprises-in-my-switch-to-remote-work/","heroImage":{"url":"https://images.ctfassets.net/23aumh6u8s0i/6KlU5OZBEuHVQXFM1kivZ0/57d88d1206672dc60316d1a55803aaa4/Blog-post-azul-profundo-v3_3x","size":{"width":3601,"height":3781}},"title":"Surprises in My Switch to Remote Work","category":["Culture","Benefits","Remote"]}],"withAB":true,"searchTags":["api","management-api","google-login","react","social-connection","authentication","rate-limit","agent skill","ai agent","jwt","access token","rbac","xaa","oin","b2b","retail","ecommerce","ai","rust","axum","startups","vibe-coding","ai agents","pricing","b2c","enterprise","email","universal-login","custom domains","mcp","mcp-server","saas","enteprise","cross-app-access","dotnet","blazor","token-vault","identity","auth0-fga","fga","rag","ibac","authorization","android","kotlin","security","next-js","privileged-worker","billing","b2b-saas","subcriptions","ai-agents","llm","agentic-ai","multi-agent","python","flask","cursor","auth0-cli","oauth","consent","scope","rar","par","sdk","terraform","cli","agent skills","organizations","tenant","ciba","token vault","universal login","acul","embedded login","cloudflare","hono","architecture","biometric","incode","login","documentation","secret","agent-skills","tools","passkeys","app development","software engineer","vercel","csharp","device-authorization","device-flow","self-service","oauth2","claude-code","design","ios","apple","swift","token-exchange","tanstack","back-channel logout","typescript","openfga","express configuration","aws bedrock agents","aws","akamai","scopes","roles","client grants","ai tools","skills","permissions index","model context protocol","mcp servers","java","dpop","custom token exhange","token exchange","event streams","scim","actions","infrastructure","enterprise connection","event stream","event","stripe projects","tenancy-as-a-service","oidc","bff","design-pattern","google","open-source","audit","auth0","b2b saas","reports","quota-utilization","my-organization-api","embeddable-ui-components","openclaw","credentials","ruby-on-rails","fga ","mcd","multiple custom domains","llamaindex","rebac","per-member authorization","ciam","auth0 mcp server","gemini cli","gemini","government","fapi","openid-connect","multi-tenancy","c#","aspnetcore","ja4","ja3","bot detection","telesign","sms","session","metadata","refresh token","okta","go","golang","nonprofits","agentic commerce","auth0 fga","owasp","listobjects","sso","single sign-on","federated identity","amazon bedrock agentcore agents","openid","authorization-api","custom domain","github actions","automation","configuration","scaling identity","multitenancy","fastapi","bac","broken access control","acl","mau","auth0 actions","mcp authorization","mcp authentication","cimd","tool-calling","agents","streamable http","#attack protection","myaccount-js","node","nodejs","testing","mtls","wcag","accessible authentication","auth0 teams","tenants","api gateway","honeypot","spam","aspnet-core","authentication ","nextjs","monthly active user","state","nonce","pkce","prompt injection","ai browsers","#security","mfa bypass","hijacking","attack protection","auth0 for ai agents","security posture","log streaming","credential stuffing"," mfa exploit prevention","compliance","agent-framework","social login","idp","identity provider","fine-grained authorization","audit logs","logging","updates","abac","cedar","customer identity","ai security","token","oauth 2.0","jose","jws","jwe","jwa","jwk","b2b onboarding","security policies","plan","scale","fraud detection","shopify","authentication flows","oktane","paid plan","free plan","growth","ugrade","customer identity and access management","chatgpt","remote mcp server","private cloud","vs code","github copilot","non-human-identities","nhi","machine-to-machine","m2m","api-key","access-token","accessibility","passwordless","webauthn","api keys","llms","langgraph","langchain","python mcp server","mcp server","threat detection","access_token","sender_constraint","ai in financial services","data privacy","pii obfuscation","developers","healthcare","json","id_token","customer data","api security","openid foundation","agentic agent","genai","integration","finance","hri","highly-regulated-identity","financial-services","banking","google sign in","least-privilege","privacy","users","onboarding","passkey","management api","customization","extensibility","event-streams","mfa","delegated-administration","mcp auth","tool calling","access-control","auth0-organizations","identity-management","developer-tools","customer-experience","data-security","appstore","langchain4j","iam","devday","agent","developer-experience","api-design","user-experience","customer-identity","digital-experience","saas-provider","cloud-security","idaas","identity-as-a-service","a2a","user-lifecycle","real-time-events","data-synchronization","asynchronous-processing","user-migration","bulk-migration","automatic-migration","dual-write","auth0fga","hospitality","customer","mdl","events","conference","attacks","sift","application","social-login","digital-identity","survey","guide","fastify","fastify-sdk","auth","modelcontextprotocol","dashboard","docs","japan","organization","product","netlify","aaa","learning","developer experience","innovation","Identity","solutions","logout","ruby","rails","decoupled-authentication","mindfuel","datadog","announcements","stigg","otp","password","cypress","test","pap","protocol","csrf","single-tenant","multi-tenant","byok","cyok","single-sign-on","native-login","pushed-authorization-requests","gke","microservices","aspnet","proxy","load-balancer","container","releases","form","provider","identity-provider","access","bearer-token","developer","authtoberfest","plans","free","rest","amazon","forms","fido-credentials","verification","kubernetes","jhipster","artificial-intelligence","species360","private-jwt-authentication","developer-day","early access","ea","rfc9068","sca","strong-customer-authentication","okta-fga","okta fga","saastart","spring-boot","auth0-templates","templates","session-management-api","mobile","native","refresh-token","refresh","backend-for-frontend","ansible","devops","action","javascript","verifiable","spring","blazor-server","blazor-wasm","biometrics","marketplace","migration","risks","productivity","engineering","template","post-quantum","cryptography","hashing","nist","vision","experience","teams","signup","woman","tech","fido","passwords","maui","earlyaccess","startup","blazor-webassembly","management","community","rules","hooks","fido2","honeytokens","screenly","release","announcement","next.js","aspnet-core-identity","cookie","id","partner","fingerprint","keycloak","liquid","html","ab-test","performance",".net","customizations","vittorio","browse-ai","brand","spring-cloud","spring-cloud-config","auth0-community","ama-series","ask-me-anything","features","catalysts-program","bonfida","solana","public-cloud","private-cloud","react-native","idme","json-web-token","laravel","no-code","role","control","node18","developerday","demos","springboot","single-logout","customer-data","recidiviz","safebase","angular","crud","technology","azure","azure-swa","azure-static-web-apps","catalyst","jetty","date","time","akto","itl","thread","cloud-native","history","uk","cloud","accesibility","quality","sinatra","tls","blockchain","web3","jakartaee","dotnet-maui","id-token","secure-storage","blazor-maui","blazor-hybrid","library","nfts","ens","ethereum","ageware","captcha","bot","bot-protection","vue","pangea","mastodon","social","twitter","social-media","security-keys","yubikey","integrations","darkmode","job","market","dotnet-7","web-api","sealed-secrets","devsecops","Iuncta","mongodb","nocode","program","digitalocean","vault","unstoppable","domains","js","scripts","encryption","desktop","anonomatic","schematics","pulumi","microfrontends","code","repository","report","log-streaming","flutter","post-login","value","public-sector","applications","saml","web","errors","http","express","streamlit","partners","https","ssl","research","cdp","deduce","platform","haventec","multi-cloud","cla","contributor","license","agreement","public","sector","xss","csp","ebook","replatforming","detection","asp.net","razor","razor-pages","risk","data-protection","business","ionic","barcelona","office","ngxs","url","uri","urn","ttl","impact","auth0-actions","auth0-hooks","nft","cryptocurrency","spa","framework","components","dotnet-core",".net-core","web-development","wasm","webassembly","ncbi","ecosystem","virtual-reallity","vr","social-impact","americorps","development","localhost","encoding","digital-transformation","govtech","modernization","data-location","org","ankita","tutorial","breaches","breach","commitment","services","php","lumen","kafka","restapi","module-federation","country","geolocation","geoblocking","id-tokens","auth0-rules","ably","silent-authentication","remote","work","trial","webhooks","slack","skyscanner","KuppingerCole","Index","user-login","node-js","user-registration","fauna","db","status-code","401-status-code","403-status-code","forbidden","unauthorized","vulnerability","incidents","plivo","fine-grained","mvc","clojure","pedestal","permissions","privileges","minimal-web-api","rgnx","ngrx","dotnet6","whats-new","supabase","latam","symfony","apache","tdd","singpass","qr","hackathon","standard","rfc","reactjs","gartner","webapi","awards","bestplaces","employee","team","education","outages","protection","ransomware","phishing","smishing","cybersecurity","ncsam","registration","predictions","showcase","microsoft","database","postgresql","svp","netcore","api-gateway","ocelot","microservice","zanzibar","academy","dart","refresh-tokens","ctf","game","boot","elk","lambda","public-key","private-key","koin","Injection","monorepo","nx","ux","smart","heathcare","iot","chalice","hr","hire","careers","pattern","tinygo","async","await","async-programming","asynchronous-programming","github","lgpd","brazil","svelte","europe","netid","tactics","strategy","conferences","deployment","ktor","lombok","solution","hacker","ethical-hacking","tweet","tweepy","databreach","attack","2fa","django","zappa","spraying","transactions","software","pyjwt","jwt tutorial","caching","clm","threats","type","low-code","agile","Insights","access-management","quarkus","secrets","managed-identities","azure-key-vault","specification","mattr","verificable-credentials","scc","trusted-types","visualization","coding","rsocket","new","typing","crypto","regulation","best-places","redux","context","soc2","hipaa","hitech","vuejs","vuex","Survey","realtime","nanoservices","dei","Diversity","diversity","equity","inclusion","animations","cache","optimization","puppeteer-sharp","state-management","os","login-box","auth0-integrations","maturity","credential-stuffing","stuffing-attacks","identity-unlocked","podcast","india","acquisition","scalability","dev-rel","benefits","quantum","qubit","brick-and-mortar","state management","ecmascript","data","statistics","racism","values","health","covid","pandemic","command-line","terminal","assian","partnership","hiring","vp","playwright","gpu","processing","guest-authors","blogging","inclusive","language","meetings","people","leadership","exif","images-process","mapstruct","ide","collisions","react-sdk","auth0-react-sdk","raspberry-pi","arduino","amido","availability","jameeka-green-aaron","ciso","cracking","vuepress","talent","award","ranking","g2","workforce","culture","csa","certification",".net-framework","cross-site-scripting","damage","project-template","company","iso27018","vertex","nest","full-stack","frontend","backend","prediction","best-companies","workplace","data-breach","server","web-services","directors","product-management","leader","cosmos-db","serverless","functional-programming","lisp","advent-of-code","code-puzzle","coding-contest","phpunit","fraud","data-breaches","communication","mfa-adaptive","spa-authentication","evolution","resilience","settings","https-downgrade","ccpa","cpra","emea","refactoring","third-party-assets","third-party-dependency","gnap","validation","deloitte","custom-databases","sumo-logic","salesforce","subaru","client-credentials-grant","access-tokens","composition-api","pci","signals","clickjacking","graphql","injection","crowdsource","bcp","believe","emphasize","enviroment","username","signify","component","facebook","agility","slice","multifactor-authentication","authenticator-apps","identity-access-management","security-access","cross-site-request-forgery","appi","data-privacy","laws","carolyn-moore","auth0-marketplace","identity-proofing","caisson","iddataweb","onfido","vouched","build","identity-services","auth0-org","pledge","tides-foundation","consent-management","onetrust","mylife-digital","digital-operations","retailers","stores","identity-platform","corporate-network","network-security"]},"__N_SSG":true},"page":"/blog/[slug]","query":{"slug":"progressive-service-architecture-at-auth0"},"buildId":"naQFbCp8zGZYbeqX1B0dN","assetPrefix":"/blog","runtimeConfig":{"ADOBEDTM_SCRIPT":"https://assets.adobedtm.com/6bb3f7663515/7006851c9849/launch-af624fe9e34f.min.js"},"isFallback":false,"isExperimentalCompile":false,"gsp":true,"scriptLoader":[]}</script></body></html>