CINXE.COM

X Icon

<!DOCTYPE html><html lang="en-US"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="generator" content="Gatsby 5.14.1"/><meta data-react-helmet="true" name="google-site-verification" content="en27v9Bb5fxAoaP6VjWYyT36MC4x7hLSH3k1Gk2QH74"/><meta data-react-helmet="true" name="description" content="Implement custom authentication within an OAuth flow"/><meta data-react-helmet="true" property="og:title" content="Implement custom authentication within an OAuth flow | Curity"/><meta data-react-helmet="true" property="og:description" content="Implement custom authentication within an OAuth flow"/><meta data-react-helmet="true" property="og:type" content="website"/><meta data-react-helmet="true" name="image" property="og:image" content="https://curity.io/images/resources/tutorials/frontend/authentication-plugins-getting-started.png"/><meta data-react-helmet="true" property="og:image" content="https://curity.io/images/resources/tutorials/frontend/authentication-plugins-getting-started.png"/><meta data-react-helmet="true" property="twitter:image" content="https://curity.io/images/resources/tutorials/frontend/authentication-plugins-getting-started.png"/><meta data-react-helmet="true" itemProp="image" content="https://curity.io/images/resources/tutorials/frontend/authentication-plugins-getting-started.png"/><meta data-react-helmet="true" name="twitter:card" content="summary_large_image"/><meta data-react-helmet="true" name="twitter:creator" content="@curityio"/><meta data-react-helmet="true" name="twitter:title" content="Implement custom authentication within an OAuth flow | Curity"/><meta data-react-helmet="true" name="twitter:description" content="Implement custom authentication within an OAuth flow"/><meta name="theme-color" content="#2a2f3a"/><style data-href="/styles.6ceb6a0e91b37a31049d.css" data-identity="gatsby-global-css">:root{--reach-dialog:1}[data-reach-dialog-overlay]{background:rgba(0,0,0,.33);bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}[data-reach-dialog-content]{background:#fff;margin:10vh auto;outline:none;padding:2rem;width:50vw}[data-sal]{transition-delay:0s;transition-delay:var(--sal-delay,0s);transition-duration:.2s;transition-duration:var(--sal-duration,.2s);transition-timing-function:ease;transition-timing-function:var(--sal-easing,ease)}[data-sal][data-sal-duration="200"]{transition-duration:.2s}[data-sal][data-sal-duration="250"]{transition-duration:.25s}[data-sal][data-sal-duration="300"]{transition-duration:.3s}[data-sal][data-sal-duration="350"]{transition-duration:.35s}[data-sal][data-sal-duration="400"]{transition-duration:.4s}[data-sal][data-sal-duration="450"]{transition-duration:.45s}[data-sal][data-sal-duration="500"]{transition-duration:.5s}[data-sal][data-sal-duration="550"]{transition-duration:.55s}[data-sal][data-sal-duration="600"]{transition-duration:.6s}[data-sal][data-sal-duration="650"]{transition-duration:.65s}[data-sal][data-sal-duration="700"]{transition-duration:.7s}[data-sal][data-sal-duration="750"]{transition-duration:.75s}[data-sal][data-sal-duration="800"]{transition-duration:.8s}[data-sal][data-sal-duration="850"]{transition-duration:.85s}[data-sal][data-sal-duration="900"]{transition-duration:.9s}[data-sal][data-sal-duration="950"]{transition-duration:.95s}[data-sal][data-sal-duration="1000"]{transition-duration:1s}[data-sal][data-sal-duration="1050"]{transition-duration:1.05s}[data-sal][data-sal-duration="1100"]{transition-duration:1.1s}[data-sal][data-sal-duration="1150"]{transition-duration:1.15s}[data-sal][data-sal-duration="1200"]{transition-duration:1.2s}[data-sal][data-sal-duration="1250"]{transition-duration:1.25s}[data-sal][data-sal-duration="1300"]{transition-duration:1.3s}[data-sal][data-sal-duration="1350"]{transition-duration:1.35s}[data-sal][data-sal-duration="1400"]{transition-duration:1.4s}[data-sal][data-sal-duration="1450"]{transition-duration:1.45s}[data-sal][data-sal-duration="1500"]{transition-duration:1.5s}[data-sal][data-sal-duration="1550"]{transition-duration:1.55s}[data-sal][data-sal-duration="1600"]{transition-duration:1.6s}[data-sal][data-sal-duration="1650"]{transition-duration:1.65s}[data-sal][data-sal-duration="1700"]{transition-duration:1.7s}[data-sal][data-sal-duration="1750"]{transition-duration:1.75s}[data-sal][data-sal-duration="1800"]{transition-duration:1.8s}[data-sal][data-sal-duration="1850"]{transition-duration:1.85s}[data-sal][data-sal-duration="1900"]{transition-duration:1.9s}[data-sal][data-sal-duration="1950"]{transition-duration:1.95s}[data-sal][data-sal-duration="2000"]{transition-duration:2s}[data-sal][data-sal-delay="50"]{transition-delay:.05s}[data-sal][data-sal-delay="100"]{transition-delay:.1s}[data-sal][data-sal-delay="150"]{transition-delay:.15s}[data-sal][data-sal-delay="200"]{transition-delay:.2s}[data-sal][data-sal-delay="250"]{transition-delay:.25s}[data-sal][data-sal-delay="300"]{transition-delay:.3s}[data-sal][data-sal-delay="350"]{transition-delay:.35s}[data-sal][data-sal-delay="400"]{transition-delay:.4s}[data-sal][data-sal-delay="450"]{transition-delay:.45s}[data-sal][data-sal-delay="500"]{transition-delay:.5s}[data-sal][data-sal-delay="550"]{transition-delay:.55s}[data-sal][data-sal-delay="600"]{transition-delay:.6s}[data-sal][data-sal-delay="650"]{transition-delay:.65s}[data-sal][data-sal-delay="700"]{transition-delay:.7s}[data-sal][data-sal-delay="750"]{transition-delay:.75s}[data-sal][data-sal-delay="800"]{transition-delay:.8s}[data-sal][data-sal-delay="850"]{transition-delay:.85s}[data-sal][data-sal-delay="900"]{transition-delay:.9s}[data-sal][data-sal-delay="950"]{transition-delay:.95s}[data-sal][data-sal-delay="1000"]{transition-delay:1s}[data-sal][data-sal-easing=linear]{transition-timing-function:linear}[data-sal][data-sal-easing=ease]{transition-timing-function:ease}[data-sal][data-sal-easing=ease-in]{transition-timing-function:ease-in}[data-sal][data-sal-easing=ease-out]{transition-timing-function:ease-out}[data-sal][data-sal-easing=ease-in-out]{transition-timing-function:ease-in-out}[data-sal][data-sal-easing=ease-in-cubic]{transition-timing-function:cubic-bezier(.55,.055,.675,.19)}[data-sal][data-sal-easing=ease-out-cubic]{transition-timing-function:cubic-bezier(.215,.61,.355,1)}[data-sal][data-sal-easing=ease-in-out-cubic]{transition-timing-function:cubic-bezier(.645,.045,.355,1)}[data-sal][data-sal-easing=ease-in-circ]{transition-timing-function:cubic-bezier(.6,.04,.98,.335)}[data-sal][data-sal-easing=ease-out-circ]{transition-timing-function:cubic-bezier(.075,.82,.165,1)}[data-sal][data-sal-easing=ease-in-out-circ]{transition-timing-function:cubic-bezier(.785,.135,.15,.86)}[data-sal][data-sal-easing=ease-in-expo]{transition-timing-function:cubic-bezier(.95,.05,.795,.035)}[data-sal][data-sal-easing=ease-out-expo]{transition-timing-function:cubic-bezier(.19,1,.22,1)}[data-sal][data-sal-easing=ease-in-out-expo]{transition-timing-function:cubic-bezier(1,0,0,1)}[data-sal][data-sal-easing=ease-in-quad]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-sal][data-sal-easing=ease-out-quad]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-sal][data-sal-easing=ease-in-out-quad]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-sal][data-sal-easing=ease-in-quart]{transition-timing-function:cubic-bezier(.895,.03,.685,.22)}[data-sal][data-sal-easing=ease-out-quart]{transition-timing-function:cubic-bezier(.165,.84,.44,1)}[data-sal][data-sal-easing=ease-in-out-quart]{transition-timing-function:cubic-bezier(.77,0,.175,1)}[data-sal][data-sal-easing=ease-in-quint]{transition-timing-function:cubic-bezier(.755,.05,.855,.06)}[data-sal][data-sal-easing=ease-out-quint]{transition-timing-function:cubic-bezier(.23,1,.32,1)}[data-sal][data-sal-easing=ease-in-out-quint]{transition-timing-function:cubic-bezier(.86,0,.07,1)}[data-sal][data-sal-easing=ease-in-sine]{transition-timing-function:cubic-bezier(.47,0,.745,.715)}[data-sal][data-sal-easing=ease-out-sine]{transition-timing-function:cubic-bezier(.39,.575,.565,1)}[data-sal][data-sal-easing=ease-in-out-sine]{transition-timing-function:cubic-bezier(.445,.05,.55,.95)}[data-sal][data-sal-easing=ease-in-back]{transition-timing-function:cubic-bezier(.6,-.28,.735,.045)}[data-sal][data-sal-easing=ease-out-back]{transition-timing-function:cubic-bezier(.175,.885,.32,1.275)}[data-sal][data-sal-easing=ease-in-out-back]{transition-timing-function:cubic-bezier(.68,-.55,.265,1.55)}[data-sal|=fade]{opacity:0;transition-property:opacity}[data-sal|=fade].sal-animate,body.sal-disabled [data-sal|=fade]{opacity:1}[data-sal|=slide]{opacity:0;transition-property:opacity,transform}[data-sal=slide-up]{transform:translateY(20%)}[data-sal=slide-down]{transform:translateY(-20%)}[data-sal=slide-left]{transform:translateX(20%)}[data-sal=slide-right]{transform:translateX(-20%)}[data-sal|=slide].sal-animate,body.sal-disabled [data-sal|=slide]{opacity:1;transform:none}[data-sal|=zoom]{opacity:0;transition-property:opacity,transform}[data-sal=zoom-in]{transform:scale(.5)}[data-sal=zoom-out]{transform:scale(1.1)}[data-sal|=zoom].sal-animate,body.sal-disabled [data-sal|=zoom]{opacity:1;transform:none}[data-sal|=flip]{backface-visibility:hidden;transition-property:transform}[data-sal=flip-left]{transform:perspective(2000px) rotateY(-91deg)}[data-sal=flip-right]{transform:perspective(2000px) rotateY(91deg)}[data-sal=flip-up]{transform:perspective(2000px) rotateX(-91deg)}[data-sal=flip-down]{transform:perspective(2000px) rotateX(91deg)}[data-sal|=flip].sal-animate,body.sal-disabled [data-sal|=flip]{transform:none}.yt-lite{background-color:#000;background-position:50%;background-size:cover;contain:content;cursor:pointer;display:block;position:relative}.yt-lite.lyt-activated:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:top;background-repeat:repeat-x;box-sizing:content-box;content:"";display:block;height:60px;padding-bottom:50px;position:absolute;top:0;transition:all .2s cubic-bezier(0,0,.2,1);width:100%}.yt-lite:after{content:"";display:block;padding-bottom:var(--aspect-ratio)}.yt-lite>iframe{height:100%;left:0;position:absolute;top:0;width:100%}.yt-lite>.lty-playbtn{background-color:#212121;border-radius:14%;height:46px;opacity:.8;transition:all .2s cubic-bezier(0,0,.2,1);width:70px;z-index:1}.yt-lite:hover>.lty-playbtn{background-color:red;opacity:1}.yt-lite>.lty-playbtn:before{border-color:transparent transparent transparent #fff;border-style:solid;border-width:11px 0 11px 19px;content:""}.yt-lite>.lty-playbtn,.yt-lite>.lty-playbtn:before{left:50%;position:absolute;top:50%;transform:translate3d(-50%,-50%,0)}.yt-lite.lyt-activated{cursor:unset}.yt-lite.lyt-activated:before,.yt-lite.lyt-activated>.lty-playbtn{opacity:0;pointer-events:none}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;height:100%;scroll-padding-top:168px}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:var(--type-regular);font-size:100%;font-weight:400;margin:0;min-height:100%;position:relative;text-rendering:optimizeSpeed}body:after{transition:background-color .3s}body.guides{padding-top:0}.container{margin:0 auto;max-width:60em;padding-left:1rem;padding-right:1rem}@media(min-width:52em){.container{padding-left:3em;padding-right:3em}.container-medium{max-width:85em}}.container-wide{max-width:90em}@media(min-width:114em){.container-wide{max-width:95em}}@media(min-width:140em){.container-wide{max-width:125em}}.container-xl{max-width:100em}@media(min-width:114em){.container-xl{max-width:105em}}@media(min-width:140em){.container-xl{max-width:135em}}[role=main]{min-height:75vh}::selection{background:var(--color-spot);color:#fff}img::selection{background:transparent}img::-moz-selection{background:transparent}.anchor-link{cursor:pointer;opacity:0}.anchor-link svg *{pointer-events:none}:where(h1,h2,h3,h4):hover .anchor-link{opacity:1}a a[ID]{display:none}.preheader{color:var(--color-spot);font-size:1.2em}.scroller{-webkit-overflow-scrolling:touch;overflow-x:scroll}@media(min-width:74em){.scroller{overflow-x:initial}}.scroller .side-nav{display:flex;white-space:nowrap}@media(min-width:74em){.scroller .side-nav{justify-content:center}}.ion,.ion-alert-circled:before,.ion-alert:before,.ion-android-add-circle:before,.ion-android-add:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-cloud:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done-all:before,.ion-android-done:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite-outline:before,.ion-android-favorite:before,.ion-android-film:before,.ion-android-folder-open:before,.ion-android-folder:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone-off:before,.ion-android-microphone:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-notifications:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person-add:before,.ion-android-person:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove-circle:before,.ion-android-remove:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share-alt:before,.ion-android-share:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-star:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace-outline:before,.ion-backspace:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox-working:before,.ion-chatbox:before,.ion-chatboxes:before,.ion-chatbubble-working:before,.ion-chatbubble:before,.ion-chatbubbles:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-checkmark:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close-circled:before,.ion-close-round:before,.ion-close:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code-download:before,.ion-code-working:before,.ion-code:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document-text:before,.ion-document:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email-unread:before,.ion-email:before,.ion-erlenmeyer-flask-bubbles:before,.ion-erlenmeyer-flask:before,.ion-eye-disabled:before,.ion-eye:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash-off:before,.ion-flash:before,.ion-folder:before,.ion-fork-repo:before,.ion-fork:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy-outline:before,.ion-happy:before,.ion-headphone:before,.ion-heart-broken:before,.ion-heart:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-help:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information-circled:before,.ion-information:before,.ion-ionic:before,.ion-ios-alarm-outline:before,.ion-ios-alarm:before,.ion-ios-albums-outline:before,.ion-ios-albums:before,.ion-ios-americanfootball-outline:before,.ion-ios-americanfootball:before,.ion-ios-analytics-outline:before,.ion-ios-analytics:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at-outline:before,.ion-ios-at:before,.ion-ios-barcode-outline:before,.ion-ios-barcode:before,.ion-ios-baseball-outline:before,.ion-ios-baseball:before,.ion-ios-basketball-outline:before,.ion-ios-basketball:before,.ion-ios-bell-outline:before,.ion-ios-bell:before,.ion-ios-body-outline:before,.ion-ios-body:before,.ion-ios-bolt-outline:before,.ion-ios-bolt:before,.ion-ios-book-outline:before,.ion-ios-book:before,.ion-ios-bookmarks-outline:before,.ion-ios-bookmarks:before,.ion-ios-box-outline:before,.ion-ios-box:before,.ion-ios-briefcase-outline:before,.ion-ios-briefcase:before,.ion-ios-browsers-outline:before,.ion-ios-browsers:before,.ion-ios-calculator-outline:before,.ion-ios-calculator:before,.ion-ios-calendar-outline:before,.ion-ios-calendar:before,.ion-ios-camera-outline:before,.ion-ios-camera:before,.ion-ios-cart-outline:before,.ion-ios-cart:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatbubble-outline:before,.ion-ios-chatbubble:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-checkmark:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock-outline:before,.ion-ios-clock:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-close:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-download:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-outline:before,.ion-ios-cloudy:before,.ion-ios-cog-outline:before,.ion-ios-cog:before,.ion-ios-color-filter-outline:before,.ion-ios-color-filter:before,.ion-ios-color-wand-outline:before,.ion-ios-color-wand:before,.ion-ios-compose-outline:before,.ion-ios-compose:before,.ion-ios-contact-outline:before,.ion-ios-contact:before,.ion-ios-copy-outline:before,.ion-ios-copy:before,.ion-ios-crop-strong:before,.ion-ios-crop:before,.ion-ios-download-outline:before,.ion-ios-download:before,.ion-ios-drag:before,.ion-ios-email-outline:before,.ion-ios-email:before,.ion-ios-eye-outline:before,.ion-ios-eye:before,.ion-ios-fastforward-outline:before,.ion-ios-fastforward:before,.ion-ios-filing-outline:before,.ion-ios-filing:before,.ion-ios-film-outline:before,.ion-ios-film:before,.ion-ios-flag-outline:before,.ion-ios-flag:before,.ion-ios-flame-outline:before,.ion-ios-flame:before,.ion-ios-flask-outline:before,.ion-ios-flask:before,.ion-ios-flower-outline:before,.ion-ios-flower:before,.ion-ios-folder-outline:before,.ion-ios-folder:before,.ion-ios-football-outline:before,.ion-ios-football:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-b-outline:before,.ion-ios-game-controller-b:before,.ion-ios-gear-outline:before,.ion-ios-gear:before,.ion-ios-glasses-outline:before,.ion-ios-glasses:before,.ion-ios-grid-view-outline:before,.ion-ios-grid-view:before,.ion-ios-heart-outline:before,.ion-ios-heart:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-help:before,.ion-ios-home-outline:before,.ion-ios-home:before,.ion-ios-infinite-outline:before,.ion-ios-infinite:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-information:before,.ion-ios-ionic-outline:before,.ion-ios-keypad-outline:before,.ion-ios-keypad:before,.ion-ios-lightbulb-outline:before,.ion-ios-lightbulb:before,.ion-ios-list-outline:before,.ion-ios-list:before,.ion-ios-location-outline:before,.ion-ios-location:before,.ion-ios-locked-outline:before,.ion-ios-locked:before,.ion-ios-loop-strong:before,.ion-ios-loop:before,.ion-ios-medical-outline:before,.ion-ios-medical:before,.ion-ios-medkit-outline:before,.ion-ios-medkit:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-mic:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-minus:before,.ion-ios-monitor-outline:before,.ion-ios-monitor:before,.ion-ios-moon-outline:before,.ion-ios-moon:before,.ion-ios-more-outline:before,.ion-ios-more:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate-outline:before,.ion-ios-navigate:before,.ion-ios-nutrition-outline:before,.ion-ios-nutrition:before,.ion-ios-paper-outline:before,.ion-ios-paper:before,.ion-ios-paperplane-outline:before,.ion-ios-paperplane:before,.ion-ios-partlysunny-outline:before,.ion-ios-partlysunny:before,.ion-ios-pause-outline:before,.ion-ios-pause:before,.ion-ios-paw-outline:before,.ion-ios-paw:before,.ion-ios-people-outline:before,.ion-ios-people:before,.ion-ios-person-outline:before,.ion-ios-person:before,.ion-ios-personadd-outline:before,.ion-ios-personadd:before,.ion-ios-photos-outline:before,.ion-ios-photos:before,.ion-ios-pie-outline:before,.ion-ios-pie:before,.ion-ios-pint-outline:before,.ion-ios-pint:before,.ion-ios-play-outline:before,.ion-ios-play:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-plus:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetags-outline:before,.ion-ios-pricetags:before,.ion-ios-printer-outline:before,.ion-ios-printer:before,.ion-ios-pulse-strong:before,.ion-ios-pulse:before,.ion-ios-rainy-outline:before,.ion-ios-rainy:before,.ion-ios-recording-outline:before,.ion-ios-recording:before,.ion-ios-redo-outline:before,.ion-ios-redo:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-refresh:before,.ion-ios-reload:before,.ion-ios-reverse-camera-outline:before,.ion-ios-reverse-camera:before,.ion-ios-rewind-outline:before,.ion-ios-rewind:before,.ion-ios-rose-outline:before,.ion-ios-rose:before,.ion-ios-search-strong:before,.ion-ios-search:before,.ion-ios-settings-strong:before,.ion-ios-settings:before,.ion-ios-shuffle-strong:before,.ion-ios-shuffle:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipbackward:before,.ion-ios-skipforward-outline:before,.ion-ios-skipforward:before,.ion-ios-snowy:before,.ion-ios-speedometer-outline:before,.ion-ios-speedometer:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-star:before,.ion-ios-stopwatch-outline:before,.ion-ios-stopwatch:before,.ion-ios-sunny-outline:before,.ion-ios-sunny:before,.ion-ios-telephone-outline:before,.ion-ios-telephone:before,.ion-ios-tennisball-outline:before,.ion-ios-tennisball:before,.ion-ios-thunderstorm-outline:before,.ion-ios-thunderstorm:before,.ion-ios-time-outline:before,.ion-ios-time:before,.ion-ios-timer-outline:before,.ion-ios-timer:before,.ion-ios-toggle-outline:before,.ion-ios-toggle:before,.ion-ios-trash-outline:before,.ion-ios-trash:before,.ion-ios-undo-outline:before,.ion-ios-undo:before,.ion-ios-unlocked-outline:before,.ion-ios-unlocked:before,.ion-ios-upload-outline:before,.ion-ios-upload:before,.ion-ios-videocam-outline:before,.ion-ios-videocam:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass-outline:before,.ion-ios-wineglass:before,.ion-ios-world-outline:before,.ion-ios-world:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-minus:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon-round:before,.ion-navicon:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person-add:before,.ion-person-stalker:before,.ion-person:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-plus:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply-all:before,.ion-reply:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad-outline:before,.ion-sad:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android-outline:before,.ion-social-android:before,.ion-social-angular-outline:before,.ion-social-angular:before,.ion-social-apple-outline:before,.ion-social-apple:before,.ion-social-bitcoin-outline:before,.ion-social-bitcoin:before,.ion-social-buffer-outline:before,.ion-social-buffer:before,.ion-social-chrome-outline:before,.ion-social-chrome:before,.ion-social-codepen-outline:before,.ion-social-codepen:before,.ion-social-css3-outline:before,.ion-social-css3:before,.ion-social-designernews-outline:before,.ion-social-designernews:before,.ion-social-dribbble-outline:before,.ion-social-dribbble:before,.ion-social-dropbox-outline:before,.ion-social-dropbox:before,.ion-social-euro-outline:before,.ion-social-euro:before,.ion-social-facebook-outline:before,.ion-social-facebook:before,.ion-social-foursquare-outline:before,.ion-social-foursquare:before,.ion-social-freebsd-devil:before,.ion-social-github-outline:before,.ion-social-github:before,.ion-social-google-outline:before,.ion-social-google:before,.ion-social-googleplus-outline:before,.ion-social-googleplus:before,.ion-social-hackernews-outline:before,.ion-social-hackernews:before,.ion-social-html5-outline:before,.ion-social-html5:before,.ion-social-instagram-outline:before,.ion-social-instagram:before,.ion-social-javascript-outline:before,.ion-social-javascript:before,.ion-social-linkedin-outline:before,.ion-social-linkedin:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest-outline:before,.ion-social-pinterest:before,.ion-social-python:before,.ion-social-reddit-outline:before,.ion-social-reddit:before,.ion-social-rss-outline:before,.ion-social-rss:before,.ion-social-sass:before,.ion-social-skype-outline:before,.ion-social-skype:before,.ion-social-snapchat-outline:before,.ion-social-snapchat:before,.ion-social-tumblr-outline:before,.ion-social-tumblr:before,.ion-social-tux:before,.ion-social-twitch-outline:before,.ion-social-twitch:before,.ion-social-twitter-outline:before,.ion-social-twitter:before,.ion-social-usd-outline:before,.ion-social-usd:before,.ion-social-vimeo-outline:before,.ion-social-vimeo:before,.ion-social-whatsapp-outline:before,.ion-social-whatsapp:before,.ion-social-windows-outline:before,.ion-social-windows:before,.ion-social-wordpress-outline:before,.ion-social-wordpress:before,.ion-social-yahoo-outline:before,.ion-social-yahoo:before,.ion-social-yen-outline:before,.ion-social-yen:before,.ion-social-youtube-outline:before,.ion-social-youtube:before,.ion-soup-can-outline:before,.ion-soup-can:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle-filled:before,.ion-toggle:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt-outline:before,.ion-tshirt:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before,.ionicons{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-display:optional;font-family:Ionicons;font-style:normal;font-variant:normal;line-height:1;text-rendering:auto;text-transform:none}.ion-alert:before{content:""}.ion-alert-circled:before{content:""}.ion-android-add:before{content:""}.ion-android-add-circle:before{content:""}.ion-android-alarm-clock:before{content:""}.ion-android-alert:before{content:""}.ion-android-apps:before{content:""}.ion-android-archive:before{content:""}.ion-android-arrow-back:before{content:""}.ion-android-arrow-down:before{content:""}.ion-android-arrow-dropdown:before{content:""}.ion-android-arrow-dropdown-circle:before{content:""}.ion-android-arrow-dropleft:before{content:""}.ion-android-arrow-dropleft-circle:before{content:""}.ion-android-arrow-dropright:before{content:""}.ion-android-arrow-dropright-circle:before{content:""}.ion-android-arrow-dropup:before{content:""}.ion-android-arrow-dropup-circle:before{content:""}.ion-android-arrow-forward:before{content:""}.ion-android-arrow-up:before{content:""}.ion-android-attach:before{content:""}.ion-android-bar:before{content:""}.ion-android-bicycle:before{content:""}.ion-android-boat:before{content:""}.ion-android-bookmark:before{content:""}.ion-android-bulb:before{content:""}.ion-android-bus:before{content:""}.ion-android-calendar:before{content:""}.ion-android-call:before{content:""}.ion-android-camera:before{content:""}.ion-android-cancel:before{content:""}.ion-android-car:before{content:""}.ion-android-cart:before{content:""}.ion-android-chat:before{content:""}.ion-android-checkbox:before{content:""}.ion-android-checkbox-blank:before{content:""}.ion-android-checkbox-outline:before{content:""}.ion-android-checkbox-outline-blank:before{content:""}.ion-android-checkmark-circle:before{content:""}.ion-android-clipboard:before{content:""}.ion-android-close:before{content:""}.ion-android-cloud:before{content:""}.ion-android-cloud-circle:before{content:""}.ion-android-cloud-done:before{content:""}.ion-android-cloud-outline:before{content:""}.ion-android-color-palette:before{content:""}.ion-android-compass:before{content:""}.ion-android-contact:before{content:""}.ion-android-contacts:before{content:""}.ion-android-contract:before{content:""}.ion-android-create:before{content:""}.ion-android-delete:before{content:""}.ion-android-desktop:before{content:""}.ion-android-document:before{content:""}.ion-android-done:before{content:""}.ion-android-done-all:before{content:""}.ion-android-download:before{content:""}.ion-android-drafts:before{content:""}.ion-android-exit:before{content:""}.ion-android-expand:before{content:""}.ion-android-favorite:before{content:""}.ion-android-favorite-outline:before{content:""}.ion-android-film:before{content:""}.ion-android-folder:before{content:""}.ion-android-folder-open:before{content:""}.ion-android-funnel:before{content:""}.ion-android-globe:before{content:""}.ion-android-hand:before{content:""}.ion-android-hangout:before{content:""}.ion-android-happy:before{content:""}.ion-android-home:before{content:""}.ion-android-image:before{content:""}.ion-android-laptop:before{content:""}.ion-android-list:before{content:""}.ion-android-locate:before{content:""}.ion-android-lock:before{content:""}.ion-android-mail:before{content:""}.ion-android-map:before{content:""}.ion-android-menu:before{content:""}.ion-android-microphone:before{content:""}.ion-android-microphone-off:before{content:""}.ion-android-more-horizontal:before{content:""}.ion-android-more-vertical:before{content:""}.ion-android-navigate:before{content:""}.ion-android-notifications:before{content:""}.ion-android-notifications-none:before{content:""}.ion-android-notifications-off:before{content:""}.ion-android-open:before{content:""}.ion-android-options:before{content:""}.ion-android-people:before{content:""}.ion-android-person:before{content:""}.ion-android-person-add:before{content:""}.ion-android-phone-landscape:before{content:""}.ion-android-phone-portrait:before{content:""}.ion-android-pin:before{content:""}.ion-android-plane:before{content:""}.ion-android-playstore:before{content:""}.ion-android-print:before{content:""}.ion-android-radio-button-off:before{content:""}.ion-android-radio-button-on:before{content:""}.ion-android-refresh:before{content:""}.ion-android-remove:before{content:""}.ion-android-remove-circle:before{content:""}.ion-android-restaurant:before{content:""}.ion-android-sad:before{content:""}.ion-android-search:before{content:""}.ion-android-send:before{content:""}.ion-android-settings:before{content:""}.ion-android-share:before{content:""}.ion-android-share-alt:before{content:""}.ion-android-star:before{content:""}.ion-android-star-half:before{content:""}.ion-android-star-outline:before{content:""}.ion-android-stopwatch:before{content:""}.ion-android-subway:before{content:""}.ion-android-sunny:before{content:""}.ion-android-sync:before{content:""}.ion-android-textsms:before{content:""}.ion-android-time:before{content:""}.ion-android-train:before{content:""}.ion-android-unlock:before{content:""}.ion-android-upload:before{content:""}.ion-android-volume-down:before{content:""}.ion-android-volume-mute:before{content:""}.ion-android-volume-off:before{content:""}.ion-android-volume-up:before{content:""}.ion-android-walk:before{content:""}.ion-android-warning:before{content:""}.ion-android-watch:before{content:""}.ion-android-wifi:before{content:""}.ion-aperture:before{content:""}.ion-archive:before{content:""}.ion-arrow-down-a:before{content:""}.ion-arrow-down-b:before{content:""}.ion-arrow-down-c:before{content:""}.ion-arrow-expand:before{content:""}.ion-arrow-graph-down-left:before{content:""}.ion-arrow-graph-down-right:before{content:""}.ion-arrow-graph-up-left:before{content:""}.ion-arrow-graph-up-right:before{content:""}.ion-arrow-left-a:before{content:""}.ion-arrow-left-b:before{content:""}.ion-arrow-left-c:before{content:""}.ion-arrow-move:before{content:""}.ion-arrow-resize:before{content:""}.ion-arrow-return-left:before{content:""}.ion-arrow-return-right:before{content:""}.ion-arrow-right-a:before{content:""}.ion-arrow-right-b:before{content:""}.ion-arrow-right-c:before{content:""}.ion-arrow-shrink:before{content:""}.ion-arrow-swap:before{content:""}.ion-arrow-up-a:before{content:""}.ion-arrow-up-b:before{content:""}.ion-arrow-up-c:before{content:""}.ion-asterisk:before{content:""}.ion-at:before{content:""}.ion-backspace:before{content:""}.ion-backspace-outline:before{content:""}.ion-bag:before{content:""}.ion-battery-charging:before{content:""}.ion-battery-empty:before{content:""}.ion-battery-full:before{content:""}.ion-battery-half:before{content:""}.ion-battery-low:before{content:""}.ion-beaker:before{content:""}.ion-beer:before{content:""}.ion-bluetooth:before{content:""}.ion-bonfire:before{content:""}.ion-bookmark:before{content:""}.ion-bowtie:before{content:""}.ion-briefcase:before{content:""}.ion-bug:before{content:""}.ion-calculator:before{content:""}.ion-calendar:before{content:""}.ion-camera:before{content:""}.ion-card:before{content:""}.ion-cash:before{content:""}.ion-chatbox:before{content:""}.ion-chatbox-working:before{content:""}.ion-chatboxes:before{content:""}.ion-chatbubble:before{content:""}.ion-chatbubble-working:before{content:""}.ion-chatbubbles:before{content:""}.ion-checkmark:before{content:""}.ion-checkmark-circled:before{content:""}.ion-checkmark-round:before{content:""}.ion-chevron-down:before{content:""}.ion-chevron-left:before{content:""}.ion-chevron-right:before{content:""}.ion-chevron-up:before{content:""}.ion-clipboard:before{content:""}.ion-clock:before{content:""}.ion-close:before{content:""}.ion-close-circled:before{content:""}.ion-close-round:before{content:""}.ion-closed-captioning:before{content:""}.ion-cloud:before{content:""}.ion-code:before{content:""}.ion-code-download:before{content:""}.ion-code-working:before{content:""}.ion-coffee:before{content:""}.ion-compass:before{content:""}.ion-compose:before{content:""}.ion-connection-bars:before{content:""}.ion-contrast:before{content:""}.ion-crop:before{content:""}.ion-cube:before{content:""}.ion-disc:before{content:""}.ion-document:before{content:""}.ion-document-text:before{content:""}.ion-drag:before{content:""}.ion-earth:before{content:""}.ion-easel:before{content:""}.ion-edit:before{content:""}.ion-egg:before{content:""}.ion-eject:before{content:""}.ion-email:before{content:""}.ion-email-unread:before{content:""}.ion-erlenmeyer-flask:before{content:""}.ion-erlenmeyer-flask-bubbles:before{content:""}.ion-eye:before{content:""}.ion-eye-disabled:before{content:""}.ion-female:before{content:""}.ion-filing:before{content:""}.ion-film-marker:before{content:""}.ion-fireball:before{content:""}.ion-flag:before{content:""}.ion-flame:before{content:""}.ion-flash:before{content:""}.ion-flash-off:before{content:""}.ion-folder:before{content:""}.ion-fork:before{content:""}.ion-fork-repo:before{content:""}.ion-forward:before{content:""}.ion-funnel:before{content:""}.ion-gear-a:before{content:""}.ion-gear-b:before{content:""}.ion-grid:before{content:""}.ion-hammer:before{content:""}.ion-happy:before{content:""}.ion-happy-outline:before{content:""}.ion-headphone:before{content:""}.ion-heart:before{content:""}.ion-heart-broken:before{content:""}.ion-help:before{content:""}.ion-help-buoy:before{content:""}.ion-help-circled:before{content:""}.ion-home:before{content:""}.ion-icecream:before{content:""}.ion-image:before{content:""}.ion-images:before{content:""}.ion-information:before{content:""}.ion-information-circled:before{content:""}.ion-ionic:before{content:""}.ion-ios-alarm:before{content:""}.ion-ios-alarm-outline:before{content:""}.ion-ios-albums:before{content:""}.ion-ios-albums-outline:before{content:""}.ion-ios-americanfootball:before{content:""}.ion-ios-americanfootball-outline:before{content:""}.ion-ios-analytics:before{content:""}.ion-ios-analytics-outline:before{content:""}.ion-ios-arrow-back:before{content:""}.ion-ios-arrow-down:before{content:""}.ion-ios-arrow-forward:before{content:""}.ion-ios-arrow-left:before{content:""}.ion-ios-arrow-right:before{content:""}.ion-ios-arrow-thin-down:before{content:""}.ion-ios-arrow-thin-left:before{content:""}.ion-ios-arrow-thin-right:before{content:""}.ion-ios-arrow-thin-up:before{content:""}.ion-ios-arrow-up:before{content:""}.ion-ios-at:before{content:""}.ion-ios-at-outline:before{content:""}.ion-ios-barcode:before{content:""}.ion-ios-barcode-outline:before{content:""}.ion-ios-baseball:before{content:""}.ion-ios-baseball-outline:before{content:""}.ion-ios-basketball:before{content:""}.ion-ios-basketball-outline:before{content:""}.ion-ios-bell:before{content:""}.ion-ios-bell-outline:before{content:""}.ion-ios-body:before{content:""}.ion-ios-body-outline:before{content:""}.ion-ios-bolt:before{content:""}.ion-ios-bolt-outline:before{content:""}.ion-ios-book:before{content:""}.ion-ios-book-outline:before{content:""}.ion-ios-bookmarks:before{content:""}.ion-ios-bookmarks-outline:before{content:""}.ion-ios-box:before{content:""}.ion-ios-box-outline:before{content:""}.ion-ios-briefcase:before{content:""}.ion-ios-briefcase-outline:before{content:""}.ion-ios-browsers:before{content:""}.ion-ios-browsers-outline:before{content:""}.ion-ios-calculator:before{content:""}.ion-ios-calculator-outline:before{content:""}.ion-ios-calendar:before{content:""}.ion-ios-calendar-outline:before{content:""}.ion-ios-camera:before{content:""}.ion-ios-camera-outline:before{content:""}.ion-ios-cart:before{content:""}.ion-ios-cart-outline:before{content:""}.ion-ios-chatboxes:before{content:""}.ion-ios-chatboxes-outline:before{content:""}.ion-ios-chatbubble:before{content:""}.ion-ios-chatbubble-outline:before{content:""}.ion-ios-checkmark:before{content:""}.ion-ios-checkmark-empty:before{content:""}.ion-ios-checkmark-outline:before{content:""}.ion-ios-circle-filled:before{content:""}.ion-ios-circle-outline:before{content:""}.ion-ios-clock:before{content:""}.ion-ios-clock-outline:before{content:""}.ion-ios-close:before{content:""}.ion-ios-close-empty:before{content:""}.ion-ios-close-outline:before{content:""}.ion-ios-cloud:before{content:""}.ion-ios-cloud-download:before{content:""}.ion-ios-cloud-download-outline:before{content:""}.ion-ios-cloud-outline:before{content:""}.ion-ios-cloud-upload:before{content:""}.ion-ios-cloud-upload-outline:before{content:""}.ion-ios-cloudy:before{content:""}.ion-ios-cloudy-night:before{content:""}.ion-ios-cloudy-night-outline:before{content:""}.ion-ios-cloudy-outline:before{content:""}.ion-ios-cog:before{content:""}.ion-ios-cog-outline:before{content:""}.ion-ios-color-filter:before{content:""}.ion-ios-color-filter-outline:before{content:""}.ion-ios-color-wand:before{content:""}.ion-ios-color-wand-outline:before{content:""}.ion-ios-compose:before{content:""}.ion-ios-compose-outline:before{content:""}.ion-ios-contact:before{content:""}.ion-ios-contact-outline:before{content:""}.ion-ios-copy:before{content:""}.ion-ios-copy-outline:before{content:""}.ion-ios-crop:before{content:""}.ion-ios-crop-strong:before{content:""}.ion-ios-download:before{content:""}.ion-ios-download-outline:before{content:""}.ion-ios-drag:before{content:""}.ion-ios-email:before{content:""}.ion-ios-email-outline:before{content:""}.ion-ios-eye:before{content:""}.ion-ios-eye-outline:before{content:""}.ion-ios-fastforward:before{content:""}.ion-ios-fastforward-outline:before{content:""}.ion-ios-filing:before{content:""}.ion-ios-filing-outline:before{content:""}.ion-ios-film:before{content:""}.ion-ios-film-outline:before{content:""}.ion-ios-flag:before{content:""}.ion-ios-flag-outline:before{content:""}.ion-ios-flame:before{content:""}.ion-ios-flame-outline:before{content:""}.ion-ios-flask:before{content:""}.ion-ios-flask-outline:before{content:""}.ion-ios-flower:before{content:""}.ion-ios-flower-outline:before{content:""}.ion-ios-folder:before{content:""}.ion-ios-folder-outline:before{content:""}.ion-ios-football:before{content:""}.ion-ios-football-outline:before{content:""}.ion-ios-game-controller-a:before{content:""}.ion-ios-game-controller-a-outline:before{content:""}.ion-ios-game-controller-b:before{content:""}.ion-ios-game-controller-b-outline:before{content:""}.ion-ios-gear:before{content:""}.ion-ios-gear-outline:before{content:""}.ion-ios-glasses:before{content:""}.ion-ios-glasses-outline:before{content:""}.ion-ios-grid-view:before{content:""}.ion-ios-grid-view-outline:before{content:""}.ion-ios-heart:before{content:""}.ion-ios-heart-outline:before{content:""}.ion-ios-help:before{content:""}.ion-ios-help-empty:before{content:""}.ion-ios-help-outline:before{content:""}.ion-ios-home:before{content:""}.ion-ios-home-outline:before{content:""}.ion-ios-infinite:before{content:""}.ion-ios-infinite-outline:before{content:""}.ion-ios-information:before{content:""}.ion-ios-information-empty:before{content:""}.ion-ios-information-outline:before{content:""}.ion-ios-ionic-outline:before{content:""}.ion-ios-keypad:before{content:""}.ion-ios-keypad-outline:before{content:""}.ion-ios-lightbulb:before{content:""}.ion-ios-lightbulb-outline:before{content:""}.ion-ios-list:before{content:""}.ion-ios-list-outline:before{content:""}.ion-ios-location:before{content:""}.ion-ios-location-outline:before{content:""}.ion-ios-locked:before{content:""}.ion-ios-locked-outline:before{content:""}.ion-ios-loop:before{content:""}.ion-ios-loop-strong:before{content:""}.ion-ios-medical:before{content:""}.ion-ios-medical-outline:before{content:""}.ion-ios-medkit:before{content:""}.ion-ios-medkit-outline:before{content:""}.ion-ios-mic:before{content:""}.ion-ios-mic-off:before{content:""}.ion-ios-mic-outline:before{content:""}.ion-ios-minus:before{content:""}.ion-ios-minus-empty:before{content:""}.ion-ios-minus-outline:before{content:""}.ion-ios-monitor:before{content:""}.ion-ios-monitor-outline:before{content:""}.ion-ios-moon:before{content:""}.ion-ios-moon-outline:before{content:""}.ion-ios-more:before{content:""}.ion-ios-more-outline:before{content:""}.ion-ios-musical-note:before{content:""}.ion-ios-musical-notes:before{content:""}.ion-ios-navigate:before{content:""}.ion-ios-navigate-outline:before{content:""}.ion-ios-nutrition:before{content:""}.ion-ios-nutrition-outline:before{content:""}.ion-ios-paper:before{content:""}.ion-ios-paper-outline:before{content:""}.ion-ios-paperplane:before{content:""}.ion-ios-paperplane-outline:before{content:""}.ion-ios-partlysunny:before{content:""}.ion-ios-partlysunny-outline:before{content:""}.ion-ios-pause:before{content:""}.ion-ios-pause-outline:before{content:""}.ion-ios-paw:before{content:""}.ion-ios-paw-outline:before{content:""}.ion-ios-people:before{content:""}.ion-ios-people-outline:before{content:""}.ion-ios-person:before{content:""}.ion-ios-person-outline:before{content:""}.ion-ios-personadd:before{content:""}.ion-ios-personadd-outline:before{content:""}.ion-ios-photos:before{content:""}.ion-ios-photos-outline:before{content:""}.ion-ios-pie:before{content:""}.ion-ios-pie-outline:before{content:""}.ion-ios-pint:before{content:""}.ion-ios-pint-outline:before{content:""}.ion-ios-play:before{content:""}.ion-ios-play-outline:before{content:""}.ion-ios-plus:before{content:""}.ion-ios-plus-empty:before{content:""}.ion-ios-plus-outline:before{content:""}.ion-ios-pricetag:before{content:""}.ion-ios-pricetag-outline:before{content:""}.ion-ios-pricetags:before{content:""}.ion-ios-pricetags-outline:before{content:""}.ion-ios-printer:before{content:""}.ion-ios-printer-outline:before{content:""}.ion-ios-pulse:before{content:""}.ion-ios-pulse-strong:before{content:""}.ion-ios-rainy:before{content:""}.ion-ios-rainy-outline:before{content:""}.ion-ios-recording:before{content:""}.ion-ios-recording-outline:before{content:""}.ion-ios-redo:before{content:""}.ion-ios-redo-outline:before{content:""}.ion-ios-refresh:before{content:""}.ion-ios-refresh-empty:before{content:""}.ion-ios-refresh-outline:before{content:""}.ion-ios-reload:before{content:""}.ion-ios-reverse-camera:before{content:""}.ion-ios-reverse-camera-outline:before{content:""}.ion-ios-rewind:before{content:""}.ion-ios-rewind-outline:before{content:""}.ion-ios-rose:before{content:""}.ion-ios-rose-outline:before{content:""}.ion-ios-search:before{content:""}.ion-ios-search-strong:before{content:""}.ion-ios-settings:before{content:""}.ion-ios-settings-strong:before{content:""}.ion-ios-shuffle:before{content:""}.ion-ios-shuffle-strong:before{content:""}.ion-ios-skipbackward:before{content:""}.ion-ios-skipbackward-outline:before{content:""}.ion-ios-skipforward:before{content:""}.ion-ios-skipforward-outline:before{content:""}.ion-ios-snowy:before{content:""}.ion-ios-speedometer:before{content:""}.ion-ios-speedometer-outline:before{content:""}.ion-ios-star:before{content:""}.ion-ios-star-half:before{content:""}.ion-ios-star-outline:before{content:""}.ion-ios-stopwatch:before{content:""}.ion-ios-stopwatch-outline:before{content:""}.ion-ios-sunny:before{content:""}.ion-ios-sunny-outline:before{content:""}.ion-ios-telephone:before{content:""}.ion-ios-telephone-outline:before{content:""}.ion-ios-tennisball:before{content:""}.ion-ios-tennisball-outline:before{content:""}.ion-ios-thunderstorm:before{content:""}.ion-ios-thunderstorm-outline:before{content:""}.ion-ios-time:before{content:""}.ion-ios-time-outline:before{content:""}.ion-ios-timer:before{content:""}.ion-ios-timer-outline:before{content:""}.ion-ios-toggle:before{content:""}.ion-ios-toggle-outline:before{content:""}.ion-ios-trash:before{content:""}.ion-ios-trash-outline:before{content:""}.ion-ios-undo:before{content:""}.ion-ios-undo-outline:before{content:""}.ion-ios-unlocked:before{content:""}.ion-ios-unlocked-outline:before{content:""}.ion-ios-upload:before{content:""}.ion-ios-upload-outline:before{content:""}.ion-ios-videocam:before{content:""}.ion-ios-videocam-outline:before{content:""}.ion-ios-volume-high:before{content:""}.ion-ios-volume-low:before{content:""}.ion-ios-wineglass:before{content:""}.ion-ios-wineglass-outline:before{content:""}.ion-ios-world:before{content:""}.ion-ios-world-outline:before{content:""}.ion-ipad:before{content:""}.ion-iphone:before{content:""}.ion-ipod:before{content:""}.ion-jet:before{content:""}.ion-key:before{content:""}.ion-knife:before{content:""}.ion-laptop:before{content:""}.ion-leaf:before{content:""}.ion-levels:before{content:""}.ion-lightbulb:before{content:""}.ion-link:before{content:""}.ion-load-a:before{content:""}.ion-load-b:before{content:""}.ion-load-c:before{content:""}.ion-load-d:before{content:""}.ion-location:before{content:""}.ion-lock-combination:before{content:""}.ion-locked:before{content:""}.ion-log-in:before{content:""}.ion-log-out:before{content:""}.ion-loop:before{content:""}.ion-magnet:before{content:""}.ion-male:before{content:""}.ion-man:before{content:""}.ion-map:before{content:""}.ion-medkit:before{content:""}.ion-merge:before{content:""}.ion-mic-a:before{content:""}.ion-mic-b:before{content:""}.ion-mic-c:before{content:""}.ion-minus:before{content:""}.ion-minus-circled:before{content:""}.ion-minus-round:before{content:""}.ion-model-s:before{content:""}.ion-monitor:before{content:""}.ion-more:before{content:""}.ion-mouse:before{content:""}.ion-music-note:before{content:""}.ion-navicon:before{content:""}.ion-navicon-round:before{content:""}.ion-navigate:before{content:""}.ion-network:before{content:""}.ion-no-smoking:before{content:""}.ion-nuclear:before{content:""}.ion-outlet:before{content:""}.ion-paintbrush:before{content:""}.ion-paintbucket:before{content:""}.ion-paper-airplane:before{content:""}.ion-paperclip:before{content:""}.ion-pause:before{content:""}.ion-person:before{content:""}.ion-person-add:before{content:""}.ion-person-stalker:before{content:""}.ion-pie-graph:before{content:""}.ion-pin:before{content:""}.ion-pinpoint:before{content:""}.ion-pizza:before{content:""}.ion-plane:before{content:""}.ion-planet:before{content:""}.ion-play:before{content:""}.ion-playstation:before{content:""}.ion-plus:before{content:""}.ion-plus-circled:before{content:""}.ion-plus-round:before{content:""}.ion-podium:before{content:""}.ion-pound:before{content:""}.ion-power:before{content:""}.ion-pricetag:before{content:""}.ion-pricetags:before{content:""}.ion-printer:before{content:""}.ion-pull-request:before{content:""}.ion-qr-scanner:before{content:""}.ion-quote:before{content:""}.ion-radio-waves:before{content:""}.ion-record:before{content:""}.ion-refresh:before{content:""}.ion-reply:before{content:""}.ion-reply-all:before{content:""}.ion-ribbon-a:before{content:""}.ion-ribbon-b:before{content:""}.ion-sad:before{content:""}.ion-sad-outline:before{content:""}.ion-scissors:before{content:""}.ion-search:before{content:""}.ion-settings:before{content:""}.ion-share:before{content:""}.ion-shuffle:before{content:""}.ion-skip-backward:before{content:""}.ion-skip-forward:before{content:""}.ion-social-android:before{content:""}.ion-social-android-outline:before{content:""}.ion-social-angular:before{content:""}.ion-social-angular-outline:before{content:""}.ion-social-apple:before{content:""}.ion-social-apple-outline:before{content:""}.ion-social-bitcoin:before{content:""}.ion-social-bitcoin-outline:before{content:""}.ion-social-buffer:before{content:""}.ion-social-buffer-outline:before{content:""}.ion-social-chrome:before{content:""}.ion-social-chrome-outline:before{content:""}.ion-social-codepen:before{content:""}.ion-social-codepen-outline:before{content:""}.ion-social-css3:before{content:""}.ion-social-css3-outline:before{content:""}.ion-social-designernews:before{content:""}.ion-social-designernews-outline:before{content:""}.ion-social-dribbble:before{content:""}.ion-social-dribbble-outline:before{content:""}.ion-social-dropbox:before{content:""}.ion-social-dropbox-outline:before{content:""}.ion-social-euro:before{content:""}.ion-social-euro-outline:before{content:""}.ion-social-facebook:before{content:""}.ion-social-facebook-outline:before{content:""}.ion-social-foursquare:before{content:""}.ion-social-foursquare-outline:before{content:""}.ion-social-freebsd-devil:before{content:""}.ion-social-github:before{content:""}.ion-social-github-outline:before{content:""}.ion-social-google:before{content:""}.ion-social-google-outline:before{content:""}.ion-social-googleplus:before{content:""}.ion-social-googleplus-outline:before{content:""}.ion-social-hackernews:before{content:""}.ion-social-hackernews-outline:before{content:""}.ion-social-html5:before{content:""}.ion-social-html5-outline:before{content:""}.ion-social-instagram:before{content:""}.ion-social-instagram-outline:before{content:""}.ion-social-javascript:before{content:""}.ion-social-javascript-outline:before{content:""}.ion-social-linkedin:before{content:""}.ion-social-linkedin-outline:before{content:""}.ion-social-markdown:before{content:""}.ion-social-nodejs:before{content:""}.ion-social-octocat:before{content:""}.ion-social-pinterest:before{content:""}.ion-social-pinterest-outline:before{content:""}.ion-social-python:before{content:""}.ion-social-reddit:before{content:""}.ion-social-reddit-outline:before{content:""}.ion-social-rss:before{content:""}.ion-social-rss-outline:before{content:""}.ion-social-sass:before{content:""}.ion-social-skype:before{content:""}.ion-social-skype-outline:before{content:""}.ion-social-snapchat:before{content:""}.ion-social-snapchat-outline:before{content:""}.ion-social-tumblr:before{content:""}.ion-social-tumblr-outline:before{content:""}.ion-social-tux:before{content:""}.ion-social-twitch:before{content:""}.ion-social-twitch-outline:before{content:""}.ion-social-twitter:before{content:""}.ion-social-twitter-outline:before{content:""}.ion-social-usd:before{content:""}.ion-social-usd-outline:before{content:""}.ion-social-vimeo:before{content:""}.ion-social-vimeo-outline:before{content:""}.ion-social-whatsapp:before{content:""}.ion-social-whatsapp-outline:before{content:""}.ion-social-windows:before{content:""}.ion-social-windows-outline:before{content:""}.ion-social-wordpress:before{content:""}.ion-social-wordpress-outline:before{content:""}.ion-social-yahoo:before{content:""}.ion-social-yahoo-outline:before{content:""}.ion-social-yen:before{content:""}.ion-social-yen-outline:before{content:""}.ion-social-youtube:before{content:""}.ion-social-youtube-outline:before{content:""}.ion-soup-can:before{content:""}.ion-soup-can-outline:before{content:""}.ion-speakerphone:before{content:""}.ion-speedometer:before{content:""}.ion-spoon:before{content:""}.ion-star:before{content:""}.ion-stats-bars:before{content:""}.ion-steam:before{content:""}.ion-stop:before{content:""}.ion-thermometer:before{content:""}.ion-thumbsdown:before{content:""}.ion-thumbsup:before{content:""}.ion-toggle:before{content:""}.ion-toggle-filled:before{content:""}.ion-transgender:before{content:""}.ion-trash-a:before{content:""}.ion-trash-b:before{content:""}.ion-trophy:before{content:""}.ion-tshirt:before{content:""}.ion-tshirt-outline:before{content:""}.ion-umbrella:before{content:""}.ion-university:before{content:""}.ion-unlocked:before{content:""}.ion-upload:before{content:""}.ion-usb:before{content:""}.ion-videocamera:before{content:""}.ion-volume-high:before{content:""}.ion-volume-low:before{content:""}.ion-volume-medium:before{content:""}.ion-volume-mute:before{content:""}.ion-wand:before{content:""}.ion-waterdrop:before{content:""}.ion-wifi:before{content:""}.ion-wineglass:before{content:""}.ion-woman:before{content:""}.ion-wrench:before{content:""}.ion-xbox:before{content:""}table{max-width:100%;overflow:auto;table-layout:fixed;width:100%}@media(min-width:40em){table{table-layout:auto}}table{border-collapse:collapse;border-spacing:0;margin-bottom:16px;margin-top:0}table tr{border-top:1px solid #c6cbd1}table td,table th{border:1px solid #dfe2e5;color:var(--color-paragraphs);padding:.375rem .825rem}table td{overflow-wrap:break-word}@media(min-width:40em){table td{overflow-wrap:normal}}table th{font-family:var(--type-bold)}table tr:nth-child(2n){background-color:#fafafa}table.rfc-table{overflow-x:scroll;white-space:nowrap;width:auto}@media(min-width:52em){table.rfc-table{overflow-x:initial;white-space:normal;width:100%}}table.rfc-table td{border:none}table.rfc-table tr{border-top:none}table.rfc-table thead{text-align:left}table.rfc-table th{border:none;border-bottom:1px solid #c6cbd1}table.rfc-table td{vertical-align:middle}table.rfc-table tr:hover td{background-color:#f5f5f5}table.borderless,table.borderless td,table.borderless tr{border:none}table :not(pre) code[class*=language-]{-webkit-hyphens:auto;hyphens:auto;word-break:break-all;word-break:break-word}@media(min-width:52em){table :not(pre) code[class*=language-]{white-space:nowrap}}.scroller table{max-width:unset;table-layout:unset;width:max-content}@media(min-width:52em){.scroller table{table-layout:fixed;width:100%}}.scroller table code[class*=language-]{white-space:nowrap}.scroller table .ref{white-space:pre-wrap}address{color:var(--color-paragraphs);font-style:normal}b,strong{font-family:var(--type-bold)}em,i{font-family:var(--type-italic);font-style:italic}.paragraph,p{color:var(--color-paragraphs);font-size:1rem;font-weight:400;line-height:1.85}@media(min-width:64em){.paragraph,p{font-size:1.1rem}}@media(min-width:114em){.paragraph,p{font-size:1.15rem}}.blog article li[style^=line-height]{line-height:revert!important}abbr{cursor:help;font-variant:small-caps;letter-spacing:.1em;text-transform:lowercase}time{font-size:.85rem;font-weight:400;line-height:1.85}sub,sup{font-size:65%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}kbd{border:1px solid var(--color-grey-light);border-radius:4px;padding:.25rem}blockquote{font-style:normal}blockquote p{margin:0}blockquote{font-size:1.25rem;font-weight:400;padding:1em;position:relative}blockquote:before{color:var(--color-spot);content:"“";font-family:serif;font-size:68px;line-height:0px;position:absolute;top:20px}@media(min-width:64em){blockquote:before{font-size:96px;right:100%;top:50px}}blockquote:after{background:linear-gradient(70deg,#ffdd40,var(--color-spot));content:"";display:block;height:4px;left:1em;position:absolute;top:100%;width:80px}.monospaced,code,pre,pre:not([class^=language]),samp{font-family:Roboto-Mono,Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace}.monospaced,pre:not([class^=language]){word-wrap:normal;background:#282a36;color:#fff;font-size:.875rem;-webkit-hyphens:none;hyphens:none;line-height:1.5;overflow:auto;padding:1em;tab-size:4;text-align:left;white-space:pre-wrap;word-break:normal;word-spacing:normal}pre[class*=language-]{--scrollbar:var(--color-primary);--scrollbar-track:var(--color-primary) -dark;--scrollbar-track-radius:6px;--scrollbar-thumb-radius:10px;--scrollbar-thumb:var(--color-primary-light);--scrollbar-height:8px;--scrollbar-width:8px}pre[class*=language-]::-webkit-scrollbar{background-color:var(--scrollbar);height:var(--scrollbar-height);width:var(--scrollbar-width)}pre[class*=language-]::-webkit-scrollbar-track{background-color:var(--scrollbar-track);border-radius:var(--scrollbar-track-radius)}pre[class*=language-]::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:var(--scrollbar-thumb-radius)}.section-dark pre[class*=language-],.section-primary pre[class*=language-]{--scrollbar:var(--color-primary);--scrollbar-track:var(--color-primary) -dark;--scrollbar-thumb:var(--color-primary)}h1,h2,h3,h4,h5,h6{font-family:var(--type-regular);font-weight:400;line-height:1.25;margin-bottom:.5em;margin-top:1em}.h1,h1{font-size:2rem}@media(min-width:64em){.h1,h1{font-size:3rem}}.h2,h2{font-size:1.5rem}@media(min-width:64em){.h2,h2{font-size:2rem}}.h3,h3{font-size:1.25rem}@media(min-width:64em){.h3,h3{font-size:1.5rem}}.h4,h4{font-size:.95rem}@media(min-width:64em){.h4,h4{font-size:1.15rem}}.h5,h5{font-size:.95rem}@media(min-width:64em){.h5,h5{font-size:1rem}}ol,ul{margin-left:0}ul{list-style-type:disc}ol,ul{color:var(--color-paragraphs);font-size:1rem;line-height:1.85}@media(min-width:64em){ol,ul{font-size:1.1rem}}li ol,li ul,ol ol,ul ul{margin-bottom:0;margin-top:0}ol.numbers{counter-reset:section;list-style-type:none}ol.numbers li{margin-bottom:1rem}ol.numbers li:before{align-items:center;background-color:var(--color-spot);border-radius:50%;color:#fff;content:counters(section,".") " ";counter-increment:section;display:inline-flex;flex:none;font-size:1rem;height:32px;justify-content:center;margin-right:1rem;width:32px}ul li>p{margin:0}details{background-color:#fff;border:1px solid #d6d6d6;border-radius:4px;overflow:hidden;padding:3rem 0 0;position:relative}details>summary{cursor:pointer;left:0;padding:.75rem 1rem;position:absolute;top:0;width:100%}details>summary>*{display:inline}details[open]{padding:3rem 1rem 1rem}details[open]>summary{border-bottom:1px solid #efefef}a{color:var(--color-link);text-decoration:none}a:hover{color:var(--color-link-hover);text-decoration:underline}.link-primary,.link-primary:hover{color:var(--color-primary)}.link-white,.link-white:hover{color:#fff}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}article a{word-break:break-word}:focus{outline:2px solid rgba(var(--color-primary),.5)}:focus-visible{outline:2px solid rgba(var(--color-primary),.5)}:focus:not(:focus-visible){outline:none}.button,button{-webkit-tap-highlight-color:rgba(0,0,0,0);appearance:none;border:0;cursor:pointer;display:inline-block;font-size:inherit;font-weight:400;height:auto;line-height:1.125rem;padding:.5rem 1rem;text-decoration:none;vertical-align:middle}.button,.button:after,.button:before,button,button:after,button:before{box-sizing:border-box}::-moz-focus-inner{border:0;padding:0}.button:hover{text-decoration:none}.button,a.button,button{-webkit-font-smoothing:antialiased;align-items:center;background-color:transparent;border-radius:4px;color:var(--color-primary);display:inline-flex;font-family:var(--font-bold);line-height:1.40625rem;padding:.625rem 1.25rem;transition:background-color .2s ease,transform .15s}.button:focus,a.button:focus,button:focus{outline:none}.button:focus-visible,a.button:focus-visible,button:focus-visible{box-shadow:0 0 0 2px rgba(var(--color-primary),.5)}.button:active,a.button:active,button:active{box-shadow:0 0 0 2px rgba(var(--color-primary),.5)}.button .icon,a.button .icon,button .icon{display:inline-block;font-size:1.2rem;vertical-align:top}.button-primary,a.button-primary{background-color:var(--color-primary);border:.075rem solid var(--color-primary);color:#fff}.button-primary-dark,.button-primary:active,.button-primary:hover,a.button-primary-dark,a.button-primary:active,a.button-primary:hover{background-color:var(--color-primary-dark);color:#fff}.button-primary-dark,a.button-primary-dark{border:.075rem solid var(--color-primary-dark)}.button-primary-dark:active,.button-primary-dark:hover,a.button-primary-dark:active,a.button-primary-dark:hover{background-color:var(--color-primary-dark);color:#fff}.button-yellow,a.button-yellow{background-color:color-mix(in srgb,var(--color-tertiary),#000 30%);color:#fff}.button-yellow:active,.button-yellow:hover,a.button-yellow:active,a.button-yellow:hover{background-color:color-mix(in srgb,var(--color-tertiary),#000 36%);color:#fff}.button-white,a.button-white{background-color:#fff;color:var(--color-primary)}.button-white:active,.button-white:hover,a.button-white:active,a.button-white:hover{background-color:#f5f5f5;color:var(--color-primary)}.button-white-outline,a.button-white-outline{background-color:transparent;border:.075rem solid #fff;color:#fff}.button-white-outline:active,.button-white-outline:hover,a.button-white-outline:active,a.button-white-outline:hover{background-color:#fff;border:.075rem solid #fff;color:var(--color-primary)}.button-primary-outline,a.button-primary-outline{background-color:transparent;border:.075rem solid var(--color-primary);color:var(--color-primary)}.button-primary-outline:active,.button-primary-outline:hover,a.button-primary-outline:active,a.button-primary-outline:hover{background-color:var(--color-primary);box-shadow:none;color:#fff}.button-bright,a.button-bright{background-color:var(--color-spot);border:.075rem solid var(--color-spot);color:#fff}.button-bright:active,.button-bright:hover,a.button-bright:active,a.button-bright:hover{background-color:color-mix(in srgb,var(--color-spot),#000 5%);border:.075rem solid color-mix(in srgb,var(--color-spot),#000 5%);color:#fff}.button-green,a.button-green{background-color:var(--color-resources-develop);border:.075rem solid var(--color-resources-develop);color:#fff}.button-green:active,.button-green:hover,a.button-green:active,a.button-green:hover{background-color:color-mix(in srgb,var(--color-resources-develop),#000 5%);border:.075rem solid color-mix(in srgb,var(--color-resources-develop),#000 5%);color:#fff}.button-m0,a.button-m0{margin-bottom:0}.button-warning,a.button-warning{background-color:color-mix(in srgb,var(--color-warning),#000 25%);color:#fff}.button-warning:active,.button-warning:hover,a.button-warning:active,a.button-warning:hover{background-color:color-mix(in srgb,var(--color-warning),#000 35%);color:#fff}.button-danger,a.button-danger{background-color:color-mix(in srgb,var(--color-danger),#fff 15%);color:#fff}.button-danger:active,.button-danger:hover,a.button-danger:active,a.button-danger:hover{background-color:color-mix(in srgb,var(--color-danger),#fff 5%);color:#fff}.button-success,a.button-success{background-color:color-mix(in srgb,var(--color-success),#fff 5%);color:#fff}.button-success:active,.button-success:hover,a.button-success:active,a.button-success:hover{background-color:var(--color-success);color:#fff}.button-info,a.button-info{background-color:color-mix(in srgb,var(--color-info),#000 20%);color:#fff}.button-info:active,.button-info:hover,a.button-info:active,a.button-info:hover{background-color:color-mix(in srgb,var(--color-info),#000 30%);color:#fff}.button-success-outline,a.button-success-outline{background-color:transparent;border:.075rem solid var(--color-success);color:var(--color-success)}.button-success-outline:active,.button-success-outline:hover,a.button-success-outline:active,a.button-success-outline:hover{background-color:var(--color-success);box-shadow:none;color:#fff}.button-social,a.button-social,button.button-social,button[type=submit].button-social{margin-top:0;padding-left:80px;text-align:left}.button-social .icon,a.button-social .icon,button.button-social .icon,button[type=submit].button-social .icon{align-items:center;display:inline-block;display:flex;font-size:1.95rem;height:100%;justify-content:center;left:0;position:absolute;top:0;width:65px}.button-github,a.button-github{background-color:var(--color-github)}.button-github:hover,a.button-github:hover{background-color:color-mix(in srgb,var(--color-github),#000 10%)}.button-xtiny,a.button-xtiny{font-size:.6em;min-height:24px;padding:.1rem .75rem}.button-xtiny .icon,a.button-xtiny .icon{font-size:.75rem}@media(min-width:52em){.button-xtiny,a.button-xtiny{font-size:.6em}}.button-tiny,a.button-tiny{font-size:.85em;min-height:32px;padding:.25rem .75rem}@media(min-width:52em){.button-tiny,a.button-tiny{font-size:.8em}}.button-small,a.button-small{font-size:.85em;line-height:1.2375rem;min-height:34px;padding:.425rem 1rem}@media(min-width:52em){.button-small,a.button-small{font-size:.85em;min-height:34px}}.button-medium,a.button-medium{font-size:1em;line-height:1.4625rem;min-height:38px;padding:.575rem 1.25rem}@media(min-width:52em){.button-medium,a.button-medium{font-size:1.1em;min-height:42px}}.button-large,a.button-large{font-size:1.25em;line-height:2.25rem;min-height:58px;padding:.625rem 1.75rem}@media(min-width:52em){.button-large,a.button-large{font-size:1.6em}}.button-transparent,a.button-transparent{background-color:transparent;box-shadow:none}.button-transparent.light,a.button-transparent.light{color:var(--color-primary-light)}.button-transparent:active,.button-transparent:focus,a.button-transparent:active,a.button-transparent:focus{background-color:transparent;box-shadow:none;color:var(--color-primary)}.button-transparent:hover,a.button-transparent:hover{background-color:#f6f6f6;box-shadow:none;color:var(--color-primary)}.button-transparent:before{display:none}.button-transparent:visited,a.button-transparent:visited{background-color:transparent}.button-link{color:currentColor;padding:0}.button-link:hover{background-color:transparent;color:currentColor;text-decoration:underline}.button-invisible,a.button-invisible{background-color:transparent;box-shadow:none;margin:0;padding:0}.button-invisible:active,.button-invisible:focus,a.button-invisible:active,a.button-invisible:focus{background-color:transparent;border:none;box-shadow:none;color:initial}.button-invisible:hover,a.button-invisible:hover{box-shadow:none;color:currentColor}.button-invisible:before{display:none}.button-invisible:visited,a.button-invisible:visited{background-color:transparent}.button-inline-label,a.button-inline-label{font-size:revert}.button-inline-label:active,.button-inline-label:focus,a.button-inline-label:active,a.button-inline-label:focus{color:var(--color-spot)}.button-fullwidth,a.button-fullwidth{display:flex;justify-content:center;width:100%}.button-mobile-nav:hover,a.button-mobile-nav:hover{box-shadow:none}.IN-widget{position:relative;top:-.38rem}.button-group{display:flex}.button-group-inline{display:inline-flex}.button-group .button{border-radius:0}.button-group .button:not(:last-child){border-right:none}.button-group .button:first-of-type{border-bottom-left-radius:3px;border-top-left-radius:3px}.button-group .button:last-of-type{border-bottom-right-radius:3px;border-top-right-radius:3px}a.button-github,button.button-github{background-color:#333;color:#fff}a.button-github:hover,button.button-github:hover{background-color:#000}.button-loading,a.button-loading{position:relative}.button-loading-active span,a.button-loading-active span{opacity:0}.button-loading-active:after,a.button-loading-active:after{animation:loading .3s linear infinite;border-color:transparent transparent currentcolor currentcolor;border-radius:100%;border-style:solid;border-width:.15rem;content:"";display:block;height:16px;left:calc(50% - 8px);position:absolute;top:calc(50% - 8px);width:16px}.dropdown-content-user .dropdown-content-link.dropdown-content-link-logout{display:inline-flex;min-width:auto}.dropdown-content-user .dropdown-content-link.dropdown-content-link-logout.button-loading-text-active{padding-left:3.25rem}.button-loading-text-active span,a.button-loading-text-active span{opacity:1}.button-loading-text-active:after,a.button-loading-text-active:after{display:inline-block;left:1.5rem;margin-right:.5rem}.button-disabled,a.button-disabled,button:disabled,button[disabled]{box-shadow:none;filter:grayscale(100%);pointer-events:none;-webkit-user-select:none;user-select:none}.button-disabled:hover,a.button-disabled:hover,button:disabled:hover,button[disabled]:hover{box-shadow:none;transform:none}.call-to-action{align-items:center;display:flex;flex-direction:column;gap:1rem;max-width:30em}@media(min-width:40em){.call-to-action{flex-direction:row;justify-content:center}}@media(min-width:64em){.call-to-action{flex-direction:row;justify-content:center;justify-content:flex-start;margin:unset;max-width:none}}.call-to-action .button{justify-content:center;white-space:nowrap;width:100%}@media(min-width:64em){.call-to-action .button{justify-content:normal;width:auto}}button.button-has-dropdown{display:inline-flex;height:44px;justify-content:space-between;padding:0 0 0 1.425rem;position:relative}.button-has-dropdown .icon{align-items:center;background-color:#4a5266;border-radius:0;border-bottom-right-radius:4px;border-top-right-radius:4px;color:#fff;display:flex;font-size:1rem;height:38px;justify-content:center;margin-left:.5rem;position:relative;width:38px}@media(min-width:52em){.button-has-dropdown .icon{height:44px;width:44px}}.button-dropdown{background-color:#fff;border:none;border-bottom-left-radius:12px;border-bottom-right-radius:12px;box-shadow:1px 2px 6px rgba(0,0,0,.2);left:-1px;list-style:none;margin:0;padding:0;position:absolute;text-align:left;top:100%;width:100%;z-index:1}.button-dropdown .dropdown-content-link{align-items:center;border-radius:0;display:inline-flex}.button-dropdown .dropdown-content-link:hover{border-radius:0}.button-dropdown li:last-child .dropdown-content-link{border-bottom-left-radius:12px;border-bottom-right-radius:12px}img{height:auto;max-width:100%}svg{max-height:100%}figure{margin:0;padding:0}iframe{border:none}article iframe{aspect-ratio:16/9;height:100%;width:100%}canvas{background-color:transparent;height:auto!important;max-width:100%}.mobile-screenshot{--bg-color:#333;--border-color:#666;--figure-padding:16px;--max-width:95%;background-color:var(--bg-color);border-radius:48px;box-shadow:0 1px 2px 0 rgba(60,64,67,.3),0 1px 3px 1px rgba(60,64,67,.15);margin:1rem auto;max-width:var(--max-width);padding:var(--figure-padding);position:relative;width:max-content}.mobile-screenshot:before{background-color:var(--bg-color);border-bottom-left-radius:2rem;border-bottom-right-radius:2rem;content:"";height:20px;left:calc(50% - 60px);position:absolute;top:16px;width:120px}@media(min-width:52em){.mobile-screenshot{--max-width:20em;--figure-padding:20px}}@media(min-width:64em){.mobile-screenshot{--max-width:24em}}.mobile-screenshot:no-notch:before{display:none}.mobile-screenshot img{border:1px solid #666;border-radius:28px;display:block;max-height:700px}@media(min-width:64em){.mobile-screenshot img{max-height:unset}.mobile-screenshot-background{background-color:#f6f6f6;padding:2rem}.mobile-screenshot-background-dark{background-color:var(--color-primary)}}[data-tooltip]{position:relative}[data-tooltip]:after,[data-tooltip]:before{display:none;font-size:.9em;line-height:1.2;opacity:0;pointer-events:none;position:absolute;text-transform:none;-webkit-user-select:none;user-select:none}[data-tooltip][tooltip-visible]:after,[data-tooltip][tooltip-visible]:before{display:block;opacity:1}[data-tooltip]:before{border:5px solid transparent;content:"";z-index:1001}[data-tooltip]:after{background:#333;border-radius:4px;box-shadow:0 1em 2em -.5em rgba(0,0,0,.35);color:#fff;content:attr(data-tooltip);font-size:.85rem;max-width:200px;min-width:100px;padding:.5rem 1rem;text-align:center;width:max-content;z-index:1000}[data-tooltip]:hover:after,[data-tooltip]:hover:before{display:block}[tooltip=""]:after,[tooltip=""]:before{display:none!important}[data-tooltip]:not([flow]):before,[data-tooltip][flow^=up]:before{border-bottom-width:0;border-top-color:#333;bottom:100%}[data-tooltip]:not([flow]):after,[data-tooltip][flow^=up]:after{bottom:calc(100% + 5px)}[data-tooltip]:not([flow]):after,[data-tooltip]:not([flow]):before,[data-tooltip][flow^=up]:after,[data-tooltip][flow^=up]:before{left:50%;transform:translate(-50%,-.5em)}[data-tooltip][flow^=down]:before{border-bottom-color:#333;border-top-width:0;top:100%}[data-tooltip][flow^=down]:after{top:calc(100% + 5px)}[data-tooltip][flow^=down]:after,[data-tooltip][flow^=down]:before{left:50%;transform:translate(-50%,.5em)}[data-tooltip][flow^=left]:before{border-left-color:#333;border-right-width:0;left:-5px;top:50%;transform:translate(-.5em,-50%)}[data-tooltip][flow^=left]:after{right:calc(100% + 5px);top:50%;transform:translate(-.5em,-50%)}[data-tooltip][flow^=right]:before{border-left-width:0;border-right-color:#333;right:-5px;top:50%;transform:translate(.5em,-50%)}[data-tooltip][flow^=right]:after{left:calc(100% + 5px);top:50%;transform:translate(.5em,-50%)}@keyframes tooltips-vert{to{opacity:.9;transform:translate(-50%)}}@keyframes tooltips-horz{to{opacity:.9;transform:translateY(-50%)}}[data-tooltip]:not([flow]):hover:after,[data-tooltip]:not([flow]):hover:before,[data-tooltip][flow^=down]:hover:after,[data-tooltip][flow^=down]:hover:before,[data-tooltip][flow^=up]:hover:after,[data-tooltip][flow^=up]:hover:before{animation:tooltips-vert .3s ease-out forwards}[data-tooltip][flow^=left]:hover:after,[data-tooltip][flow^=left]:hover:before,[data-tooltip][flow^=right]:hover:after,[data-tooltip][flow^=right]:hover:before{animation:tooltips-horz .3s ease-out forwards}[data-tooltip][tooltip-light]:after{background:var(--color-primary)}[data-tooltip][tooltip-light]:before{border-top-color:var(--color-primary)}[tooltip="Visit article"]:after{white-space:nowrap}.content-tooltip{box-shadow:none;outline:none;padding:0;position:relative}.content-tooltip:focus{outline:1px solid var(--color-primary)}.content-tooltip-trigger{display:inline-block;vertical-align:text-top}.content-tooltip-bubble{animation:tooltip-reveal .3s ease-out forwards;max-width:200px;min-width:100px;opacity:0;position:absolute;width:max-content;z-index:10}.content-tooltip-bubble:after{content:"";position:absolute}.content-tooltip-bubble a{text-decoration:underline}@keyframes tooltip-reveal{to{opacity:1}}.content-tooltip-bubble a{color:var(--color-tertiary)}.content-tooltip-top{bottom:100%;left:50%;padding-bottom:9px;transform:translateX(-50%)}.content-tooltip-top:after{border-left:9px solid transparent;border-right:9px solid transparent;border-top:9px solid rgba(0,0,0,.7);bottom:0;left:50%;transform:translateX(-50%)}.content-tooltip-bottom{left:50%;padding-top:9px;top:100%;transform:translateX(-50%)}.content-tooltip-bottom:after{border-bottom:9px solid rgba(0,0,0,.7);border-left:9px solid transparent;border-right:9px solid transparent;left:50%;top:0;transform:translateX(-50%)}.content-tooltip-left{padding-right:9px;right:100%;top:50%;transform:translateY(-50%)}.content-tooltip-left:after{border-bottom:9px solid transparent;border-left:9px solid rgba(0,0,0,.7);border-top:9px solid transparent;right:0;top:50%;transform:translateY(-50%)}.content-tooltip-right{left:100%;padding-left:9px;top:50%;transform:translateY(-50%)}.content-tooltip-right:after{border-bottom:9px solid transparent;border-right:9px solid rgba(0,0,0,.7);border-top:9px solid transparent;left:0;top:50%;transform:translateY(-50%)}.content-tooltip-message{background:rgba(0,0,0,.7);border-radius:3px;color:#fff;font-size:.75rem;line-height:1.4;padding:.75em;text-align:center}[data-reach-dialog-overlay]{background:rgba(0,0,0,.8);z-index:100}[data-reach-dialog-content]{align-items:center;background-color:#fff;border-radius:4px;display:flex;height:calc(90vh - 1rem);justify-content:center;margin:5vh auto;padding:0;position:relative;width:calc(95vw - 1rem)}[data-reach-dialog-content][aria-label=Modal]{border-radius:0;display:block;height:100%;margin:0 auto;width:100%}@media(min-width:64em){[data-reach-dialog-content][aria-label=Modal]{border-radius:4px;height:auto;margin:5vh auto;max-width:1100px;min-height:auto;width:calc(65vw - 1rem)}}[data-reach-dialog-content][mode=dialog],[data-reach-dialog-content][mode=video]{fill:transparent;animation-delay:0s;animation-duration:.25s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:fadeIn;animation-timing-function:ease;display:block;height:auto;opacity:0;overflow:auto;width:100%}@media(min-width:64em){[data-reach-dialog-content][mode=dialog],[data-reach-dialog-content][mode=video]{border-radius:4px;height:calc(80% - 2.5vmin);height:auto;margin:5vh auto;max-width:calc(75vw - 2.5vmin);top:unset;width:calc(80% - 2.5vmin)}}[data-reach-dialog-content][mode=dialog] h1,[data-reach-dialog-content][mode=dialog] h2,[data-reach-dialog-content][mode=dialog] h3,[data-reach-dialog-content][mode=dialog] p{color:var(--color-paragraphs)}[data-reach-dialog-content][mode=dialog] .lightbox-content-has-cta h2,[data-reach-dialog-content][mode=dialog] .lightbox-content-has-cta h3,[data-reach-dialog-content][mode=dialog] .lightbox-content-has-cta h4{color:#fff}[data-reach-dialog-content][aria-label=Modal] h1:first-of-type{margin-top:0}[data-reach-dialog-content][aria-label=Modal]>div{max-height:80vh;overflow-y:auto}[data-reach-dialog-content][aria-label=Modal] header{align-items:center;border-bottom:1px solid #ccc;display:flex;justify-content:space-between;padding:1rem 1.5rem}[data-reach-dialog-content][aria-label=Modal] .button-close:hover i{background-color:#f6f6f6;color:#666}[data-reach-dialog-content][aria-label=Modal] .button-close i{align-items:center;border-radius:50%;color:#ccc;cursor:pointer;display:flex;height:24px;justify-content:center;width:24px}[data-reach-dialog-content][theme=dark]{background-color:#000}.lightbox-image{position:relative}.lightbox-caption{background-color:rgba(0,0,0,.8);border-bottom-left-radius:4px;border-bottom-right-radius:4px;bottom:0;color:#fff;margin:0;padding:1rem;position:absolute;width:100%}.lightbox-image{align-items:center;display:flex;height:100%;justify-content:center;margin:0;object-fit:cover;overflow:hidden;padding:0;width:100%}.lightbox-image img{height:calc(70vh - 2px - 1rem);object-fit:contain;width:calc(75vw - 2px - 1rem)}.lightbox-header{align-items:center;border-bottom:1px solid #ccc;display:flex;justify-content:space-between;padding:1rem 1.5rem}.lightbox-header .button-transparent:hover{background-color:transparent}.lightbox-header .icon{align-items:center;border-radius:50%;color:#ccc;cursor:pointer;display:flex;font-size:1rem;height:34px;justify-content:center;transition:background-color .3s ease;width:34px}.lightbox-header .icon:hover{background-color:var(--color-grey-subtle);color:#fff}.lightbox-content{padding:2rem}button.lightbox-button{align-items:center;cursor:zoom-in;display:flex;justify-content:center;padding:0;position:relative}button.lightbox-button img{display:block;object-fit:contain}button.lightbox-button:before{display:none}button.lightbox-button:after{align-items:center;background-color:rgba(0,0,0,.4);border-radius:8px;color:#fff;content:"Click to zoom";display:flex;font-size:.75rem;justify-content:center;opacity:0;padding:.15rem .5rem;position:absolute;right:0;top:0;transition:opacity .3s;visibility:hidden}button.lightbox-button:hover{background-color:transparent;box-shadow:none;opacity:1}button.lightbox-button:hover:after{opacity:1;visibility:visible}.grid-container[theme=dark]{background-color:color-mix(in srgb,var(--color-primary),#000 30%)}.grid-container[theme=light]{background-color:#fff}button.button-lightbox-player{align-items:center;display:flex;height:100%;justify-content:center;width:100%}button.button-lightbox-player .icon{align-items:center;aspect-ratio:1/1;background-color:#fff;border:1px solid #fff;border-radius:100%;color:var(--color-spot);display:flex;font-size:calc(1rem + 1vw);height:calc(1rem + 3vh);justify-content:center;transform:translateX(.2rem);transform-origin:center;transition:transform .2s}button.button-lightbox-player:hover{background-color:rgba(0,0,0,.4)}button.button-lightbox-player:hover .icon{transform:scale(1.2)}@media print{body{background-color:#fff;color:#000;font-size:50%!important;margin-top:0!important;max-width:none;width:100%}#hubspot-messages-iframe-container,.adslot,.hero,.menu,.newsletter-contact,.resources-article-meta,.resources-breadcrumbs,.resources-searchbar,.section-getstarted,.was-this-helpful,aside,footer,form,header,iframe,nav{display:none}section{margin:0}*{background-image:none!important}img,svg{margin-bottom:1rem;margin-top:1rem}code,h1,h2,h3,h4,li,ol,p,pre,ul{color:#000;margin:revert}h1{font-size:18pt;margin-top:0}h2{font-size:14pt}h3{font-size:12pt}code,ol,p,pre,pre.prism-code,ul{font-size:10pt!important}img,svg,table{break-inside:avoid}@page{size:auto;margin:15mm 15mm 15mm 15mm}body{margin:0}.container{max-width:none;padding:0}.legal article{column-span:all;columns:50 2}.legal *{font-family:serif}#hubspot-messages-iframe-container{opacity:0;visibility:hidden}details.lg-hide{display:none}}fieldset,input,select,textarea{box-sizing:border-box;font-family:inherit;font-size:1rem;margin-bottom:0;margin-top:0}label{vertical-align:middle}.full-width{width:100%}.field,.field-light{border:1px solid rgba(0,0,0,.125);border-radius:4px}.field-light:focus{border-color:var(--color-primary-light)}input{accent-color:var(--color-spot)}fieldset{border:1px solid #ddd;border-radius:4px;margin-bottom:2rem;padding:1.5rem}label{color:#666;line-height:2;position:relative}input[type=checkbox]{cursor:pointer;margin:0 .5rem 0 0;outline-offset:5px;transform-style:preserve-3d}input[type=checkbox]:before{--thumb-scale:0.01;--thumb-highlight-size:3rem;background-color:hsla(0,0%,50%,.1);block-size:var(--thumb-highlight-size);clip-path:circle(50%);content:"";inline-size:var(--thumb-highlight-size);inset-block-start:50%;inset-inline-start:50%;position:absolute;transform:translateX(-50%) translateY(-50%) translateZ(-1px) scale(var(--thumb-scale));transform-origin:center center;will-change:transform}@media(prefers-reduced-motion:no-preference){input[type=checkbox]:before{transition:transform .2s ease}}input[type=checkbox]:hover:before{--thumb-scale:1}input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{color:var(--color-primary);font-size:1rem;height:2.55rem;padding:.75rem;transition:border-color .15s}input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{background-color:#fff;border-color:var(--color-primary);color:var(--color-primary);outline:0}textarea{padding:.75rem}textarea:focus{background-color:#fff;border-color:var(--color-primary);color:var(--color-primary);outline:0}select{appearance:none;background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;border-color:#e2e8f0;border-radius:.25rem;border-width:1px;color:unset;font-size:1rem;line-height:1.2;padding:.5rem 2.5rem .5rem .75rem;-webkit-print-color-adjust:exact;print-color-adjust:exact;width:100%}::placeholder{color:#999}.newsletter input[type=email],.newsletter input[type=submit]{height:36px}.legal-consent-container p{font-size:.75rem;line-height:unset}.legal-consent-container p a{color:var(--color-spot)}.legal-consent-container .hs-form-booleancheckbox-display input{margin-right:.5rem;margin-top:.25rem}input:-webkit-autofill{background:transparent}input:autofill{background:transparent}input:-webkit-autofill,input:-webkit-autofill:focus{-webkit-transition:background-color 600000s 0s,color 600000s 0s;transition:background-color 600000s 0s,color 600000s 0s}input[data-autocompleted]{background-color:transparent!important}.grecaptcha-badge{visibility:hidden}.inputfile{height:.1px;opacity:0;overflow:hidden;position:absolute;width:.1px;z-index:-1}.inputfile+label{border-radius:4px;box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);cursor:pointer;display:inline-block;font-family:Roboto-Medium;font-size:.85em;line-height:1.40625rem;min-height:34px;overflow:hidden;padding:.625rem 1.25rem;text-overflow:ellipsis;white-space:nowrap}@media(min-width:52em){.inputfile+label{font-size:1em;min-height:36px}}.inputfile.has-focus+label,.inputfile:focus+label{outline:1px dotted #000;outline:5px auto -webkit-focus-ring-color}.inputfile+label svg{fill:currentColor;height:1em;margin-right:.25em;margin-top:-.25em;vertical-align:middle;width:1em}.inputfile-1+label{background-color:color-mix(in srgb,var(--color-primary),#000 5%);color:#fff}.inputfile-1+label:hover,.inputfile-1.has-focus+label,.inputfile-1:focus+label{background-color:color-mix(in srgb,var(--color-primary),#000 10%);color:#fff}.inputfile-1:active+label{background-color:color-mix(in srgb,var(--color-primary),#000 20%);color:#fff}body:has(#hs-eu-cookie-confirmation:not([style*="display: none"])) #hubspot-messages-iframe-container{bottom:160px!important}@media(min-width:52em){body:has(#hs-eu-cookie-confirmation:not([style*="display: none"])) #hubspot-messages-iframe-container{bottom:210px!important}}#hubspot-messages-iframe-container{z-index:1000!important}button.open-hs-chat{background-color:var(--color-primary);border-radius:50%;bottom:1rem;color:#fff;height:60px;position:fixed;right:1rem;width:60px;z-index:10001!important}button.open-hs-chat i{font-size:2rem;left:-.25rem;position:relative}#hubspotForm *{font-family:var(--type-regular)}.hs-form-booleancheckbox label{line-height:1}#hs-form-iframe-0{border:none;display:block;overflow:hidden;position:static;width:100%!important}.field.hs-form-field{background-color:transparent!important;border:none!important}.hs-input{border:1px solid rgba(0,0,0,.125);border-radius:3px;font:inherit;position:relative;transition:border-color .15s ease-in-out}.hs-input:focus{background-color:#fff;border-color:color-mix(in srgb,var(--color-primary),#000 20%);color:#495057;outline:0}.hs-input:not([type=checkbox]){width:100%}.hs-input:not([type=file]){background-color:#f8f8f8}input[type=email].hs-input,input[type=text].hs-input{height:40px!important}input[type=email].hs-input textarea.hs-input,input[type=text].hs-input textarea.hs-input{color:var(--color-primary);font-size:1rem;height:2.55rem;padding:.75rem;transition:border-color .15s ease-in-out;width:100%}input[type=email].hs-input textarea.hs-input:focus,input[type=text].hs-input textarea.hs-input:focus{background-color:#fff;border-color:color-mix(in srgb,var(--third-color) 60%,#fff);color:#495057;outline:0}ul.inputs-list{align-items:center;display:flex;list-style:none;padding:0}textarea.hs-input{height:auto;min-height:50px}input[type=email].hs-input,input[type=text].hs-input{height:2.55rem}input[type=email].hs-input{height:36px}input[type=submit].hs-button{background-color:var(--color-spot);border:0;border-radius:4px;color:#fff;cursor:pointer;height:40px;line-height:1.125rem;padding:.5rem 1rem}input[type=submit].hs-button:active,input[type=submit].hs-button:hover{background-color:color-mix(in srgb,var(--color-spot),#000 5%);color:#fff}.hs-error-msgs{list-style:none;padding:0}label.hs-error-msg{color:red;display:block;font-size:.75rem;line-height:1.5;margin-top:.25rem}.hs-form-required{color:red;display:inline-block;font-size:.85rem;margin-left:.25rem}#hubspotForm .hs-form-field label{line-height:2!important}label.is-error{color:var(--color-danger)}.field:invalid{border-color:rgba(0,0,0,.125)}.field.is-error{border-color:var(--color-danger)}.blog-post-signup form{display:flex;gap:.5rem}.blog-post-signup label[placeholder="Enter your Email"]{display:none}.blog-post-signup .submitted-message{color:#fff}.h100{height:100%}.w100{width:100%}.w50{width:50%}.h100vh{height:100vh}.h-auto{height:auto}.w-auto{width:auto}.inlineicon{display:inline-block;margin-right:.5rem;vertical-align:middle}.uppercase,.uppercasecaps{text-transform:uppercase}.uppercasecaps{-webkit-font-smoothing:antialiased;font-family:var(--font-bold);letter-spacing:.085em}.no-decoration,.no-decoration:hover,a.no-decoration,a.no-decoration:hover{text-decoration:none}.visuallyhidden{clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}@media(min-width:64em){.white-space-nowrap{white-space:nowrap}}.circle,.circle.skeleton-loading{border-radius:50%}.read-more-link .ion-chevron-right{align-items:center;background-color:var(--color-primary);border-radius:50%;color:#fff;display:inline-flex;font-size:.75rem;height:24px;justify-content:center;margin-right:1rem;width:24px}.bg-light-grey{background:#fbfafc}.numbered-list{list-style:none;max-width:100%}.numbered-list li{counter-increment:list}.numbered-list li:before{align-items:center;background-color:var(--color-success);border-radius:50%;color:#fff;content:counter(list);display:inline-flex;font-size:1rem;font-weight:700;height:24px;justify-content:center;line-height:24px;margin-right:1rem;text-indent:0;vertical-align:middle;width:24px}.numbered-list{counter-reset:numbered-list-counter}.numbered-list-checked li:before{background:url(/images/checked-list.svg);background-repeat:no-repeat;content:"";display:inline-block;flex:none;height:11px;margin-right:1rem;vertical-align:1px;width:12px}.is-forbidden{cursor:not-allowed}.is-disabled{pointer-events:none}.border{border:1px solid #e3e3e3}.underline-white{border-bottom:1px solid #fff}.underline-black{border-bottom:1px solid #000}.tint-shadow-bright{box-shadow:5px 5px rgba(240,46,170,.4),10px 10px rgba(240,46,170,.3),15px 15px rgba(240,46,170,.2),20px 20px rgba(240,46,170,.1),25px 25px rgba(240,46,170,.05)}.aspect-ratio-16\:9,[class*=" aspect-ratio"],[class^=aspect-ratio]{aspect-ratio:16/9}.aspect-ratio-3\:2{aspect-ratio:3/2}.aspect-ratio-4\:3{aspect-ratio:4/3}.aspect-ratio-5\:4{aspect-ratio:5/4}.aspect-ratio-1\:1{aspect-ratio:1/1}.aspect-ratio-4\:5{aspect-ratio:4/5}.aspect-ratio-3\:4{aspect-ratio:3/4}.aspect-ratio-2\:3{aspect-ratio:2/3}.aspect-ratio-9\:16{aspect-ratio:9/16}.ofc{object-fit:cover}.oft{object-fit:contain}.off{object-fit:fill}.video-wrapper{aspect-ratio:16/9;position:relative}.video-wrapper-square{aspect-ratio:1/1}.video-wrapper iframe,.video-wrapper img,.video-wrapper video{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.video-wrapper img{object-fit:cover}.pill{-webkit-font-smoothing:antialiased;align-items:center;border:none;border-radius:1rem;color:#fff;display:inline-flex;font-family:var(--font-bold);font-size:.75rem;height:24px;justify-content:space-between;letter-spacing:.025em;padding:0 .5rem;text-rendering:optimizeLegibility;text-transform:uppercase}.pill:hover{color:inherit;text-decoration:none}.pill-grey{background-color:#eee;border-color:#ddd;color:#666}.pill-grey:hover{background-color:color-mix(in srgb,#eee,#000 10%)}.pill-success{border:1px solid var(--color-success);color:var(--color-success)}.pill-warning{border:1px solid var(--color-warning);color:var(--color-warning)}.pill-danger{border:1px solid var(--color-danger);color:var(--color-danger)}.pill-bright-gradient{background-image:linear-gradient(90deg,var(--color-spot) 0,color-mix(in srgb,var(--color-spot),#000 15%) 97%);border:none;color:#fff}.pill-primary-gradient{background-image:linear-gradient(90deg,var(--color-primary-light),color-mix(in srgb,var(--color-primary),#000 45%) 97%);border:none;color:#fff}.pill-danger-gradient{background-image:linear-gradient(-45deg,color-mix(in srgb,var(--color-danger),#fff 20%) color-mix(in srgb,var(--color-danger),#000 5%) 97%);border:none;color:#fff}.examples-grid .tag{align-items:center;background-color:#fff;border:2px solid color-mix(in srgb,var(--color-resources-develop) 40%,#fff);border-radius:20px;color:var(--color-resources-develop);display:flex;font-size:.85em;justify-content:center;min-width:70px;padding:.15rem .5rem;text-align:center;top:50%}.examples-grid .tag-bright{border:2px solid var(--color-spot);color:var(--color-spot)}.examples-grid .tag.tag-red{border:2px solid red;color:red}.examples-grid .tag.tag-blue{border:2px solid blue;color:blue}.examples-grid .tag.tag-transparent{border:none}.examples-grid .tag-filled{background-color:var(--color-resources-develop);border:2px solid var(--color-resources-develop);color:#fff}.italic{font-style:italic}.left-align{text-align:left}.center{text-align:center}.right-align{text-align:right}.justify{text-align:justify}.list-reset{list-style:none;padding-left:0}.lh-unset{line-height:unset}.nowrap{white-space:nowrap}.text-balanced{text-wrap:balance}.primary{color:var(--color-primary)}.primary-dark{color:color-mix(in srgb,var(--color-primary),#000 20%)}.primary-light{color:var(--color-primary-light)}.yellow{color:var(--color-tertiary)}.bright{color:var(--color-spot)}.green{color:var(--color-resources-develop)}.white{color:#fff}.red{color:red}.section-grey{background-color:#fafafa}.develop{color:var(--color-resources-develop)}.architect{color:var(--color-resources-architect)}.operate{color:var(--primary-dark)}.grey{color:var(--color-grey)}.grey-light{color:var(--color-grey-light)}.grey-subtle{color:var(--color-grey-subtle)}.bg-light{background-color:#f6f6f6}.bg-light-hover:hover{background-color:#fafafa}.bg-dark{background-color:color-mix(in srgb,var(--color-primary),#000 50%)}.bg-primary{background-color:color-mix(in srgb,var(--color-primary),#000 40%)}.bg-green{background-color:var(--color-resources-develop)}.bg-gradient-primary{background-color:color-mix(in srgb,var(--color-primary),#000 22%);background-image:linear-gradient(13deg,color-mix(in srgb,var(--color-primary),#000 36%) 0,color-mix(in srgb,var(--color-primary),#000 14%) 66%,color-mix(in srgb,var(--color-primary),#000 12%) 100%)}.cta-success{color:var(--color-success)}.cta-info{color:var(--color-info)}.cta-danger,.cta-warning{color:var(--color-danger)}.gradient-callout{--bg-color:#22232f;--start-color:#ebdbf1;--end-color:hotpink;--border-width:5px;background-color:var(--bg-color);background-image:linear-gradient(43deg,#4158d0,#c850c0 46%,#ffcc70);border-radius:12px;border-radius:8px;padding:2px;position:relative}.gradient-callout-light{--bg-color:#fff}.gradient-callout-border{background-color:var(--bg-color);border-radius:8px;height:100%}.border-grey{border:1px solid #ccc}.w-1{width:1.5rem}.w-2{width:2.5rem}.w-3{width:3.5rem}.w-4{width:4.5rem}.w-5{width:5.5rem}.w-6{width:6.5rem}.w-7{width:7.5rem}.w-8{width:8.5rem}.w-9{width:9.5rem}.w-10{width:10.5rem}.w-11{width:11.5rem}.w-12{width:12.5rem}.w-13{width:13.5rem}.w-14{width:14.5rem}.w-15{width:15.5rem}.w-16{width:16.5rem}.w-17{width:17.5rem}.w-18{width:18.5rem}.w-19{width:19.5rem}.w-20{width:20.5rem}.w-21{width:21.5rem}.w-22{width:22.5rem}.w-23{width:23.5rem}.w-24{width:24.5rem}.w-25{width:25.5rem}.w-26{width:26.5rem}.w-27{width:27.5rem}.w-28{width:28.5rem}.w-29{width:29.5rem}.w-30{width:30.5rem}.w-31{width:31.5rem}.w-32{width:32.5rem}.w-33{width:33.5rem}.w-34{width:34.5rem}.w-35{width:35.5rem}.w-36{width:36.5rem}.w-37{width:37.5rem}.w-38{width:38.5rem}.w-39{width:39.5rem}.w-40{width:40.5rem}.w-41{width:41.5rem}.w-42{width:42.5rem}.w-43{width:43.5rem}.w-44{width:44.5rem}.w-45{width:45.5rem}.md-w-1{width:1rem}@media(min-width:52em){.md-w-1{width:1.5rem}}@media(min-width:64em){.md-w-1{width:1.575rem}}@media(min-width:74em){.md-w-1{width:1.725rem}}.md-w-2{width:1.66667rem}@media(min-width:52em){.md-w-2{width:2.5rem}}@media(min-width:64em){.md-w-2{width:2.625rem}}@media(min-width:74em){.md-w-2{width:2.875rem}}.md-w-3{width:2.33333rem}@media(min-width:52em){.md-w-3{width:3.5rem}}@media(min-width:64em){.md-w-3{width:3.675rem}}@media(min-width:74em){.md-w-3{width:4.025rem}}.md-w-4{width:3rem}@media(min-width:52em){.md-w-4{width:4.5rem}}@media(min-width:64em){.md-w-4{width:4.725rem}}@media(min-width:74em){.md-w-4{width:5.175rem}}.md-w-5{width:3.66667rem}@media(min-width:52em){.md-w-5{width:5.5rem}}@media(min-width:64em){.md-w-5{width:5.775rem}}@media(min-width:74em){.md-w-5{width:6.325rem}}.md-w-6{width:4.33333rem}@media(min-width:52em){.md-w-6{width:6.5rem}}@media(min-width:64em){.md-w-6{width:6.825rem}}@media(min-width:74em){.md-w-6{width:7.475rem}}.md-w-7{width:5rem}@media(min-width:52em){.md-w-7{width:7.5rem}}@media(min-width:64em){.md-w-7{width:7.875rem}}@media(min-width:74em){.md-w-7{width:8.625rem}}.md-w-8{width:5.66667rem}@media(min-width:52em){.md-w-8{width:8.5rem}}@media(min-width:64em){.md-w-8{width:8.925rem}}@media(min-width:74em){.md-w-8{width:9.775rem}}.md-w-9{width:6.33333rem}@media(min-width:52em){.md-w-9{width:9.5rem}}@media(min-width:64em){.md-w-9{width:9.975rem}}@media(min-width:74em){.md-w-9{width:10.925rem}}.md-w-10{width:7rem}@media(min-width:52em){.md-w-10{width:10.5rem}}@media(min-width:64em){.md-w-10{width:11.025rem}}@media(min-width:74em){.md-w-10{width:12.075rem}}.md-w-11{width:7.66667rem}@media(min-width:52em){.md-w-11{width:11.5rem}}@media(min-width:64em){.md-w-11{width:12.075rem}}@media(min-width:74em){.md-w-11{width:13.225rem}}.md-w-12{width:8.33333rem}@media(min-width:52em){.md-w-12{width:12.5rem}}@media(min-width:64em){.md-w-12{width:13.125rem}}@media(min-width:74em){.md-w-12{width:14.375rem}}.md-w-13{width:9rem}@media(min-width:52em){.md-w-13{width:13.5rem}}@media(min-width:64em){.md-w-13{width:14.175rem}}@media(min-width:74em){.md-w-13{width:15.525rem}}.md-w-14{width:9.66667rem}@media(min-width:52em){.md-w-14{width:14.5rem}}@media(min-width:64em){.md-w-14{width:15.225rem}}@media(min-width:74em){.md-w-14{width:16.675rem}}.md-w-15{width:10.33333rem}@media(min-width:52em){.md-w-15{width:15.5rem}}@media(min-width:64em){.md-w-15{width:16.275rem}}@media(min-width:74em){.md-w-15{width:17.825rem}}.md-w-16{width:11rem}@media(min-width:52em){.md-w-16{width:16.5rem}}@media(min-width:64em){.md-w-16{width:17.325rem}}@media(min-width:74em){.md-w-16{width:18.975rem}}.md-w-17{width:11.66667rem}@media(min-width:52em){.md-w-17{width:17.5rem}}@media(min-width:64em){.md-w-17{width:18.375rem}}@media(min-width:74em){.md-w-17{width:20.125rem}}.md-w-18{width:12.33333rem}@media(min-width:52em){.md-w-18{width:18.5rem}}@media(min-width:64em){.md-w-18{width:19.425rem}}@media(min-width:74em){.md-w-18{width:21.275rem}}.md-w-19{width:13rem}@media(min-width:52em){.md-w-19{width:19.5rem}}@media(min-width:64em){.md-w-19{width:20.475rem}}@media(min-width:74em){.md-w-19{width:22.425rem}}.md-w-20{width:13.66667rem}@media(min-width:52em){.md-w-20{width:20.5rem}}@media(min-width:64em){.md-w-20{width:21.525rem}}@media(min-width:74em){.md-w-20{width:23.575rem}}.md-w-21{width:14.33333rem}@media(min-width:52em){.md-w-21{width:21.5rem}}@media(min-width:64em){.md-w-21{width:22.575rem}}@media(min-width:74em){.md-w-21{width:24.725rem}}.md-w-22{width:15rem}@media(min-width:52em){.md-w-22{width:22.5rem}}@media(min-width:64em){.md-w-22{width:23.625rem}}@media(min-width:74em){.md-w-22{width:25.875rem}}.md-w-23{width:15.66667rem}@media(min-width:52em){.md-w-23{width:23.5rem}}@media(min-width:64em){.md-w-23{width:24.675rem}}@media(min-width:74em){.md-w-23{width:27.025rem}}.md-w-24{width:16.33333rem}@media(min-width:52em){.md-w-24{width:24.5rem}}@media(min-width:64em){.md-w-24{width:25.725rem}}@media(min-width:74em){.md-w-24{width:28.175rem}}.md-w-25{width:17rem}@media(min-width:52em){.md-w-25{width:25.5rem}}@media(min-width:64em){.md-w-25{width:26.775rem}}@media(min-width:74em){.md-w-25{width:29.325rem}}.md-w-26{width:17.66667rem}@media(min-width:52em){.md-w-26{width:26.5rem}}@media(min-width:64em){.md-w-26{width:27.825rem}}@media(min-width:74em){.md-w-26{width:30.475rem}}.md-w-27{width:18.33333rem}@media(min-width:52em){.md-w-27{width:27.5rem}}@media(min-width:64em){.md-w-27{width:28.875rem}}@media(min-width:74em){.md-w-27{width:31.625rem}}.md-w-28{width:19rem}@media(min-width:52em){.md-w-28{width:28.5rem}}@media(min-width:64em){.md-w-28{width:29.925rem}}@media(min-width:74em){.md-w-28{width:32.775rem}}.md-w-29{width:19.66667rem}@media(min-width:52em){.md-w-29{width:29.5rem}}@media(min-width:64em){.md-w-29{width:30.975rem}}@media(min-width:74em){.md-w-29{width:33.925rem}}.md-w-30{width:20.33333rem}@media(min-width:52em){.md-w-30{width:30.5rem}}@media(min-width:64em){.md-w-30{width:32.025rem}}@media(min-width:74em){.md-w-30{width:35.075rem}}.md-w-31{width:21rem}@media(min-width:52em){.md-w-31{width:31.5rem}}@media(min-width:64em){.md-w-31{width:33.075rem}}@media(min-width:74em){.md-w-31{width:36.225rem}}.md-w-32{width:21.66667rem}@media(min-width:52em){.md-w-32{width:32.5rem}}@media(min-width:64em){.md-w-32{width:34.125rem}}@media(min-width:74em){.md-w-32{width:37.375rem}}.md-w-33{width:22.33333rem}@media(min-width:52em){.md-w-33{width:33.5rem}}@media(min-width:64em){.md-w-33{width:35.175rem}}@media(min-width:74em){.md-w-33{width:38.525rem}}.md-w-34{width:23rem}@media(min-width:52em){.md-w-34{width:34.5rem}}@media(min-width:64em){.md-w-34{width:36.225rem}}@media(min-width:74em){.md-w-34{width:39.675rem}}.md-w-35{width:23.66667rem}@media(min-width:52em){.md-w-35{width:35.5rem}}@media(min-width:64em){.md-w-35{width:37.275rem}}@media(min-width:74em){.md-w-35{width:40.825rem}}.md-w-36{width:24.33333rem}@media(min-width:52em){.md-w-36{width:36.5rem}}@media(min-width:64em){.md-w-36{width:38.325rem}}@media(min-width:74em){.md-w-36{width:41.975rem}}.md-w-37{width:25rem}@media(min-width:52em){.md-w-37{width:37.5rem}}@media(min-width:64em){.md-w-37{width:39.375rem}}@media(min-width:74em){.md-w-37{width:43.125rem}}.md-w-38{width:25.66667rem}@media(min-width:52em){.md-w-38{width:38.5rem}}@media(min-width:64em){.md-w-38{width:40.425rem}}@media(min-width:74em){.md-w-38{width:44.275rem}}.md-w-39{width:26.33333rem}@media(min-width:52em){.md-w-39{width:39.5rem}}@media(min-width:64em){.md-w-39{width:41.475rem}}@media(min-width:74em){.md-w-39{width:45.425rem}}.md-w-40{width:27rem}@media(min-width:52em){.md-w-40{width:40.5rem}}@media(min-width:64em){.md-w-40{width:42.525rem}}@media(min-width:74em){.md-w-40{width:46.575rem}}.md-w-41{width:27.66667rem}@media(min-width:52em){.md-w-41{width:41.5rem}}@media(min-width:64em){.md-w-41{width:43.575rem}}@media(min-width:74em){.md-w-41{width:47.725rem}}.md-w-42{width:28.33333rem}@media(min-width:52em){.md-w-42{width:42.5rem}}@media(min-width:64em){.md-w-42{width:44.625rem}}@media(min-width:74em){.md-w-42{width:48.875rem}}.md-w-43{width:29rem}@media(min-width:52em){.md-w-43{width:43.5rem}}@media(min-width:64em){.md-w-43{width:45.675rem}}@media(min-width:74em){.md-w-43{width:50.025rem}}.md-w-44{width:29.66667rem}@media(min-width:52em){.md-w-44{width:44.5rem}}@media(min-width:64em){.md-w-44{width:46.725rem}}@media(min-width:74em){.md-w-44{width:51.175rem}}.md-w-45{width:30.33333rem}@media(min-width:52em){.md-w-45{width:45.5rem}}@media(min-width:64em){.md-w-45{width:47.775rem}}@media(min-width:74em){.md-w-45{width:52.325rem}}@media(min-width:52em){.mw-1{max-width:1rem}.mw-2{max-width:2rem}.mw-3{max-width:3rem}.mw-4{max-width:4rem}.mw-5{max-width:5rem}.mw-6{max-width:6rem}.mw-7{max-width:7rem}.mw-8{max-width:8rem}.mw-9{max-width:9rem}.mw-10{max-width:10rem}.mw-11{max-width:11rem}.mw-12{max-width:12rem}.mw-13{max-width:13rem}.mw-14{max-width:14rem}.mw-15{max-width:15rem}.mw-16{max-width:16rem}.mw-17{max-width:17rem}.mw-18{max-width:18rem}.mw-19{max-width:19rem}.mw-20{max-width:20rem}.mw-21{max-width:21rem}.mw-22{max-width:22rem}.mw-23{max-width:23rem}.mw-24{max-width:24rem}.mw-25{max-width:25rem}.mw-26{max-width:26rem}.mw-27{max-width:27rem}.mw-28{max-width:28rem}.mw-29{max-width:29rem}.mw-30{max-width:30rem}.mw-31{max-width:31rem}.mw-32{max-width:32rem}.mw-33{max-width:33rem}.mw-34{max-width:34rem}.mw-35{max-width:35rem}.mw-36{max-width:36rem}.mw-37{max-width:37rem}.mw-38{max-width:38rem}.mw-39{max-width:39rem}.mw-40{max-width:40rem}.mw-41{max-width:41rem}.mw-42{max-width:42rem}.mw-43{max-width:43rem}.mw-44{max-width:44rem}.mw-45{max-width:45rem}}.h-1{height:1.5rem}.h-2{height:2.5rem}.h-3{height:3.5rem}.h-4{height:4.5rem}.h-5{height:5.5rem}.h-6{height:6.5rem}.h-7{height:7.5rem}.h-8{height:8.5rem}.h-9{height:9.5rem}.h-10{height:10.5rem}.h-11{height:11.5rem}.h-12{height:12.5rem}.h-13{height:13.5rem}.h-14{height:14.5rem}.h-15{height:15.5rem}.h-16{height:16.5rem}.h-17{height:17.5rem}.h-18{height:18.5rem}.h-19{height:19.5rem}.h-20{height:20.5rem}.h-21{height:21.5rem}.h-22{height:22.5rem}.h-23{height:23.5rem}.h-24{height:24.5rem}.h-25{height:25.5rem}.h-26{height:26.5rem}.h-27{height:27.5rem}.h-28{height:28.5rem}.h-29{height:29.5rem}.h-30{height:30.5rem}.h-31{height:31.5rem}.h-32{height:32.5rem}.h-33{height:33.5rem}.h-34{height:34.5rem}.h-35{height:35.5rem}.h-36{height:36.5rem}.h-37{height:37.5rem}.h-38{height:38.5rem}.h-39{height:39.5rem}.h-40{height:40.5rem}.md-h-1{height:1rem}@media(min-width:52em){.md-h-1{height:1.5rem}}@media(min-width:64em){.md-h-1{height:1.575rem}}@media(min-width:74em){.md-h-1{height:1.725rem}}.md-h-2{height:1.66667rem}@media(min-width:52em){.md-h-2{height:2.5rem}}@media(min-width:64em){.md-h-2{height:2.625rem}}@media(min-width:74em){.md-h-2{height:2.875rem}}.md-h-3{height:2.33333rem}@media(min-width:52em){.md-h-3{height:3.5rem}}@media(min-width:64em){.md-h-3{height:3.675rem}}@media(min-width:74em){.md-h-3{height:4.025rem}}.md-h-4{height:3rem}@media(min-width:52em){.md-h-4{height:4.5rem}}@media(min-width:64em){.md-h-4{height:4.725rem}}@media(min-width:74em){.md-h-4{height:5.175rem}}.md-h-5{height:3.66667rem}@media(min-width:52em){.md-h-5{height:5.5rem}}@media(min-width:64em){.md-h-5{height:5.775rem}}@media(min-width:74em){.md-h-5{height:6.325rem}}.md-h-6{height:4.33333rem}@media(min-width:52em){.md-h-6{height:6.5rem}}@media(min-width:64em){.md-h-6{height:6.825rem}}@media(min-width:74em){.md-h-6{height:7.475rem}}.md-h-7{height:5rem}@media(min-width:52em){.md-h-7{height:7.5rem}}@media(min-width:64em){.md-h-7{height:7.875rem}}@media(min-width:74em){.md-h-7{height:8.625rem}}.md-h-8{height:5.66667rem}@media(min-width:52em){.md-h-8{height:8.5rem}}@media(min-width:64em){.md-h-8{height:8.925rem}}@media(min-width:74em){.md-h-8{height:9.775rem}}.md-h-9{height:6.33333rem}@media(min-width:52em){.md-h-9{height:9.5rem}}@media(min-width:64em){.md-h-9{height:9.975rem}}@media(min-width:74em){.md-h-9{height:10.925rem}}.md-h-10{height:7rem}@media(min-width:52em){.md-h-10{height:10.5rem}}@media(min-width:64em){.md-h-10{height:11.025rem}}@media(min-width:74em){.md-h-10{height:12.075rem}}.md-h-11{height:7.66667rem}@media(min-width:52em){.md-h-11{height:11.5rem}}@media(min-width:64em){.md-h-11{height:12.075rem}}@media(min-width:74em){.md-h-11{height:13.225rem}}.md-h-12{height:8.33333rem}@media(min-width:52em){.md-h-12{height:12.5rem}}@media(min-width:64em){.md-h-12{height:13.125rem}}@media(min-width:74em){.md-h-12{height:14.375rem}}.md-h-13{height:9rem}@media(min-width:52em){.md-h-13{height:13.5rem}}@media(min-width:64em){.md-h-13{height:14.175rem}}@media(min-width:74em){.md-h-13{height:15.525rem}}.md-h-14{height:9.66667rem}@media(min-width:52em){.md-h-14{height:14.5rem}}@media(min-width:64em){.md-h-14{height:15.225rem}}@media(min-width:74em){.md-h-14{height:16.675rem}}.md-h-15{height:10.33333rem}@media(min-width:52em){.md-h-15{height:15.5rem}}@media(min-width:64em){.md-h-15{height:16.275rem}}@media(min-width:74em){.md-h-15{height:17.825rem}}.md-h-16{height:11rem}@media(min-width:52em){.md-h-16{height:16.5rem}}@media(min-width:64em){.md-h-16{height:17.325rem}}@media(min-width:74em){.md-h-16{height:18.975rem}}.md-h-17{height:11.66667rem}@media(min-width:52em){.md-h-17{height:17.5rem}}@media(min-width:64em){.md-h-17{height:18.375rem}}@media(min-width:74em){.md-h-17{height:20.125rem}}.md-h-18{height:12.33333rem}@media(min-width:52em){.md-h-18{height:18.5rem}}@media(min-width:64em){.md-h-18{height:19.425rem}}@media(min-width:74em){.md-h-18{height:21.275rem}}.md-h-19{height:13rem}@media(min-width:52em){.md-h-19{height:19.5rem}}@media(min-width:64em){.md-h-19{height:20.475rem}}@media(min-width:74em){.md-h-19{height:22.425rem}}.md-h-20{height:13.66667rem}@media(min-width:52em){.md-h-20{height:20.5rem}}@media(min-width:64em){.md-h-20{height:21.525rem}}@media(min-width:74em){.md-h-20{height:23.575rem}}.md-h-21{height:14.33333rem}@media(min-width:52em){.md-h-21{height:21.5rem}}@media(min-width:64em){.md-h-21{height:22.575rem}}@media(min-width:74em){.md-h-21{height:24.725rem}}.md-h-22{height:15rem}@media(min-width:52em){.md-h-22{height:22.5rem}}@media(min-width:64em){.md-h-22{height:23.625rem}}@media(min-width:74em){.md-h-22{height:25.875rem}}.md-h-23{height:15.66667rem}@media(min-width:52em){.md-h-23{height:23.5rem}}@media(min-width:64em){.md-h-23{height:24.675rem}}@media(min-width:74em){.md-h-23{height:27.025rem}}.md-h-24{height:16.33333rem}@media(min-width:52em){.md-h-24{height:24.5rem}}@media(min-width:64em){.md-h-24{height:25.725rem}}@media(min-width:74em){.md-h-24{height:28.175rem}}.md-h-25{height:17rem}@media(min-width:52em){.md-h-25{height:25.5rem}}@media(min-width:64em){.md-h-25{height:26.775rem}}@media(min-width:74em){.md-h-25{height:29.325rem}}.md-h-26{height:17.66667rem}@media(min-width:52em){.md-h-26{height:26.5rem}}@media(min-width:64em){.md-h-26{height:27.825rem}}@media(min-width:74em){.md-h-26{height:30.475rem}}.md-h-27{height:18.33333rem}@media(min-width:52em){.md-h-27{height:27.5rem}}@media(min-width:64em){.md-h-27{height:28.875rem}}@media(min-width:74em){.md-h-27{height:31.625rem}}.md-h-28{height:19rem}@media(min-width:52em){.md-h-28{height:28.5rem}}@media(min-width:64em){.md-h-28{height:29.925rem}}@media(min-width:74em){.md-h-28{height:32.775rem}}.md-h-29{height:19.66667rem}@media(min-width:52em){.md-h-29{height:29.5rem}}@media(min-width:64em){.md-h-29{height:30.975rem}}@media(min-width:74em){.md-h-29{height:33.925rem}}.md-h-30{height:20.33333rem}@media(min-width:52em){.md-h-30{height:30.5rem}}@media(min-width:64em){.md-h-30{height:32.025rem}}@media(min-width:74em){.md-h-30{height:35.075rem}}.md-h-31{height:21rem}@media(min-width:52em){.md-h-31{height:31.5rem}}@media(min-width:64em){.md-h-31{height:33.075rem}}@media(min-width:74em){.md-h-31{height:36.225rem}}.md-h-32{height:21.66667rem}@media(min-width:52em){.md-h-32{height:32.5rem}}@media(min-width:64em){.md-h-32{height:34.125rem}}@media(min-width:74em){.md-h-32{height:37.375rem}}.md-h-33{height:22.33333rem}@media(min-width:52em){.md-h-33{height:33.5rem}}@media(min-width:64em){.md-h-33{height:35.175rem}}@media(min-width:74em){.md-h-33{height:38.525rem}}.md-h-34{height:23rem}@media(min-width:52em){.md-h-34{height:34.5rem}}@media(min-width:64em){.md-h-34{height:36.225rem}}@media(min-width:74em){.md-h-34{height:39.675rem}}.md-h-35{height:23.66667rem}@media(min-width:52em){.md-h-35{height:35.5rem}}@media(min-width:64em){.md-h-35{height:37.275rem}}@media(min-width:74em){.md-h-35{height:40.825rem}}.md-h-36{height:24.33333rem}@media(min-width:52em){.md-h-36{height:36.5rem}}@media(min-width:64em){.md-h-36{height:38.325rem}}@media(min-width:74em){.md-h-36{height:41.975rem}}.md-h-37{height:25rem}@media(min-width:52em){.md-h-37{height:37.5rem}}@media(min-width:64em){.md-h-37{height:39.375rem}}@media(min-width:74em){.md-h-37{height:43.125rem}}.md-h-38{height:25.66667rem}@media(min-width:52em){.md-h-38{height:38.5rem}}@media(min-width:64em){.md-h-38{height:40.425rem}}@media(min-width:74em){.md-h-38{height:44.275rem}}.md-h-39{height:26.33333rem}@media(min-width:52em){.md-h-39{height:39.5rem}}@media(min-width:64em){.md-h-39{height:41.475rem}}@media(min-width:74em){.md-h-39{height:45.425rem}}.md-h-40{height:27rem}@media(min-width:52em){.md-h-40{height:40.5rem}}@media(min-width:64em){.md-h-40{height:42.525rem}}@media(min-width:74em){.md-h-40{height:46.575rem}}.mh-1{max-height:250px}@media(min-width:52em){.mh-1{max-height:1.5rem}}.mh-2{max-height:250px}@media(min-width:52em){.mh-2{max-height:2.5rem}}.mh-3{max-height:250px}@media(min-width:52em){.mh-3{max-height:3.5rem}}.mh-4{max-height:250px}@media(min-width:52em){.mh-4{max-height:4.5rem}}.mh-5{max-height:250px}@media(min-width:52em){.mh-5{max-height:5.5rem}}.mh-6{max-height:250px}@media(min-width:52em){.mh-6{max-height:6.5rem}}.mh-7{max-height:250px}@media(min-width:52em){.mh-7{max-height:7.5rem}}.mh-8{max-height:250px}@media(min-width:52em){.mh-8{max-height:8.5rem}}.mh-9{max-height:250px}@media(min-width:52em){.mh-9{max-height:9.5rem}}.mh-10{max-height:250px}@media(min-width:52em){.mh-10{max-height:10.5rem}}.mh-11{max-height:250px}@media(min-width:52em){.mh-11{max-height:11.5rem}}.mh-12{max-height:250px}@media(min-width:52em){.mh-12{max-height:12.5rem}}.mh-13{max-height:250px}@media(min-width:52em){.mh-13{max-height:13.5rem}}.mh-14{max-height:250px}@media(min-width:52em){.mh-14{max-height:14.5rem}}.mh-15{max-height:250px}@media(min-width:52em){.mh-15{max-height:15.5rem}}.mh-16{max-height:250px}@media(min-width:52em){.mh-16{max-height:16.5rem}}.mh-17{max-height:250px}@media(min-width:52em){.mh-17{max-height:17.5rem}}.mh-18{max-height:250px}@media(min-width:52em){.mh-18{max-height:18.5rem}}.mh-19{max-height:250px}@media(min-width:52em){.mh-19{max-height:19.5rem}}.mh-20{max-height:250px}@media(min-width:52em){.mh-20{max-height:20.5rem}}.mh-21{max-height:250px}@media(min-width:52em){.mh-21{max-height:21.5rem}}.mh-22{max-height:250px}@media(min-width:52em){.mh-22{max-height:22.5rem}}.mh-23{max-height:250px}@media(min-width:52em){.mh-23{max-height:23.5rem}}.mh-24{max-height:250px}@media(min-width:52em){.mh-24{max-height:24.5rem}}.mh-25{max-height:250px}@media(min-width:52em){.mh-25{max-height:25.5rem}}.mh-26{max-height:250px}@media(min-width:52em){.mh-26{max-height:26.5rem}}.mh-27{max-height:250px}@media(min-width:52em){.mh-27{max-height:27.5rem}}.mh-28{max-height:250px}@media(min-width:52em){.mh-28{max-height:28.5rem}}.mh-29{max-height:250px}@media(min-width:52em){.mh-29{max-height:29.5rem}}.mh-30{max-height:250px}@media(min-width:52em){.mh-30{max-height:30.5rem}}.mh-31{max-height:250px}@media(min-width:52em){.mh-31{max-height:31.5rem}}.mh-32{max-height:250px}@media(min-width:52em){.mh-32{max-height:32.5rem}}.mh-33{max-height:250px}@media(min-width:52em){.mh-33{max-height:33.5rem}}.mh-34{max-height:250px}@media(min-width:52em){.mh-34{max-height:34.5rem}}.mh-35{max-height:250px}@media(min-width:52em){.mh-35{max-height:35.5rem}}.mh-36{max-height:250px}@media(min-width:52em){.mh-36{max-height:36.5rem}}.mh-37{max-height:250px}@media(min-width:52em){.mh-37{max-height:37.5rem}}.mh-38{max-height:250px}@media(min-width:52em){.mh-38{max-height:38.5rem}}.mh-39{max-height:250px}@media(min-width:52em){.mh-39{max-height:39.5rem}}.mh-40{max-height:250px}@media(min-width:52em){.mh-40{max-height:40.5rem}}.bg-grey-light{background-color:#f6f6f6}.bg-white{background-color:#fff}.bg-primary{background-color:var(--color-primary)}.bg-bright{background-color:var(--color-spot)}.hover-bg{transition:background-color .2s ease-in-out}.hover-bg-primary:hover{background-color:color-mix(in srgb,var(--color-primary),#000 10%)}.grid-container{grid-gap:1rem;display:grid}.sm-grid-container{display:revert}@media(min-width:40em){.sm-grid-container{display:grid}}.md-grid-container{display:revert}@media(min-width:52em){.md-grid-container{display:grid}}.lg-grid-container{display:revert}@media(min-width:64em){.lg-grid-container{display:grid}}[grid-auto-flow=column]{grid-auto-flow:column}@media(min-width:52em){[md-grid-auto-flow=column]{grid-auto-flow:column}}[grid-auto-columns=max-content]{grid-auto-columns:max-content}[grid-justify=center]{justify-content:center}[grid-justify=start]{justify-content:start}[grid-align=start]{align-items:start}[align-items=center]{align-items:center}[justify-items=center]{justify-items:center}.span-all-columns{grid-column:1/-1}[grid-auto-rows]{grid-auto-rows:1fr}[gap="0"]{grid-gap:.5rem}@media(min-width:52em){[gap="0"]{grid-gap:0}}[gap="1"]{grid-gap:.5rem}@media(min-width:52em){[gap="1"]{grid-gap:1rem}}[gap="2"]{grid-gap:1rem}@media(min-width:52em){[gap="2"]{grid-gap:2rem}}[gap="3"]{grid-gap:1rem}@media(min-width:52em){[gap="3"]{grid-gap:3rem}}[gap="4"]{grid-gap:1rem}@media(min-width:52em){[gap="4"]{grid-gap:4rem}}[columns="1"]{grid-template-columns:repeat(1,minmax(0,1fr))}[columns="2"]{grid-template-columns:repeat(2,minmax(0,1fr))}@media(min-width:40em){[sm-columns="2"]{grid-template-columns:repeat(2,minmax(0,1fr))}[sm-columns="3"]{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:52em){[md-columns="2"]{grid-template-columns:repeat(2,minmax(0,1fr))}[md-columns="3"]{grid-template-columns:repeat(3,minmax(0,1fr))}[md-columns="4"]{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:64em){[lg-columns="2"]{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:74em){[xlg-columns="2"]{grid-template-columns:repeat(2,minmax(0,1fr))}[xlg-columns="3"]{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:84em){[xxlg-columns="2"]{grid-template-columns:repeat(2,minmax(0,1fr))}[xxlg-columns="3"]{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:64em){[lg-columns="3"]{grid-template-columns:repeat(3,minmax(0,1fr))}[lg-columns="4"]{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:74em){[xlg-columns="4"]{grid-template-columns:repeat(4,minmax(0,1fr))}[xlg-columns="5"]{grid-template-columns:repeat(5,minmax(0,1fr))}}@media(min-width:64em){[lg-columns="5"]{grid-template-columns:repeat(5,minmax(0,1fr))}[lg-columns="6"]{grid-template-columns:repeat(6,minmax(0,1fr))}}[justify-self=center]{justify-self:center}.border-primary{border:1px solid var(--color-primary-light)}.border-top-primary{border-top:1px solid var(--color-primary-light)}.border-left-primary{border-left:1px solid var(--color-primary-light)}.border-bottom-primary,.border-right-primary{border-bottom:1px solid var(--color-primary-light)}.border-grey{border:1px solid var(--color-grey-light)}.border-white{border:1px solid #fff}.border-top-grey{border-top:1px solid var(--color-grey-light)}.border-left-grey{border-left:1px solid var(--color-grey-light)}.border-bottom-grey,.border-right-grey{border-bottom:1px solid var(--color-grey-light)}.br-1{border-radius:1px}.br-2{border-radius:2px}.br-3{border-radius:3px}.br-4{border-radius:4px}.br-5{border-radius:5px}.br-6{border-radius:6px}.br-7{border-radius:7px}.br-8{border-radius:8px}.br-9{border-radius:9px}.br-10{border-radius:10px}.br-11{border-radius:11px}.br-12{border-radius:12px}.br-13{border-radius:13px}.br-14{border-radius:14px}.br-15{border-radius:15px}.br-16{border-radius:16px}.br-t-1{border-top-left-radius:1px;border-top-right-radius:1px}.br-t-2{border-top-left-radius:2px;border-top-right-radius:2px}.br-t-3{border-top-left-radius:3px;border-top-right-radius:3px}.br-t-4{border-top-left-radius:4px;border-top-right-radius:4px}.br-t-5{border-top-left-radius:5px;border-top-right-radius:5px}.br-t-6{border-top-left-radius:6px;border-top-right-radius:6px}.br-t-7{border-top-left-radius:7px;border-top-right-radius:7px}.br-t-8{border-top-left-radius:8px;border-top-right-radius:8px}.br-t-9{border-top-left-radius:9px;border-top-right-radius:9px}.br-t-10{border-top-left-radius:10px;border-top-right-radius:10px}.br-t-11{border-top-left-radius:11px;border-top-right-radius:11px}.br-t-12{border-top-left-radius:12px;border-top-right-radius:12px}.br-t-13{border-top-left-radius:13px;border-top-right-radius:13px}.br-t-14{border-top-left-radius:14px;border-top-right-radius:14px}.br-t-15{border-top-left-radius:15px;border-top-right-radius:15px}.br-t-16{border-top-left-radius:16px;border-top-right-radius:16px}.br-b-1{border-bottom-left-radius:1px;border-bottom-right-radius:1px}.br-b-2{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.br-b-3{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.br-b-4{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.br-b-5{border-bottom-left-radius:5px;border-bottom-right-radius:5px}.br-b-6{border-bottom-left-radius:6px;border-bottom-right-radius:6px}.br-b-7{border-bottom-left-radius:7px;border-bottom-right-radius:7px}.br-b-8{border-bottom-left-radius:8px;border-bottom-right-radius:8px}.br-b-9{border-bottom-left-radius:9px;border-bottom-right-radius:9px}.br-b-10{border-bottom-left-radius:10px;border-bottom-right-radius:10px}.br-b-11{border-bottom-left-radius:11px;border-bottom-right-radius:11px}.br-b-12{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.br-b-13{border-bottom-left-radius:13px;border-bottom-right-radius:13px}.br-b-14{border-bottom-left-radius:14px;border-bottom-right-radius:14px}.br-b-15{border-bottom-left-radius:15px;border-bottom-right-radius:15px}.br-b-16{border-bottom-left-radius:16px;border-bottom-right-radius:16px}.br-t-l-1{border-top-left-radius:1px}.br-t-l-2{border-top-left-radius:2px}.br-t-l-3{border-top-left-radius:3px}.br-t-l-4{border-top-left-radius:4px}.br-t-l-5{border-top-left-radius:5px}.br-t-l-6{border-top-left-radius:6px}.br-t-l-7{border-top-left-radius:7px}.br-t-l-8{border-top-left-radius:8px}.br-t-l-9{border-top-left-radius:9px}.br-t-l-10{border-top-left-radius:10px}.br-t-l-11{border-top-left-radius:11px}.br-t-l-12{border-top-left-radius:12px}.br-t-l-13{border-top-left-radius:13px}.br-t-l-14{border-top-left-radius:14px}.br-t-l-15{border-top-left-radius:15px}.br-t-l-16{border-top-left-radius:16px}.br-t-r-1{border-top-right-radius:1px}.br-t-r-2{border-top-right-radius:2px}.br-t-r-3{border-top-right-radius:3px}.br-t-r-4{border-top-right-radius:4px}.br-t-r-5{border-top-right-radius:5px}.br-t-r-6{border-top-right-radius:6px}.br-t-r-7{border-top-right-radius:7px}.br-t-r-8{border-top-right-radius:8px}.br-t-r-9{border-top-right-radius:9px}.br-t-r-10{border-top-right-radius:10px}.br-t-r-11{border-top-right-radius:11px}.br-t-r-12{border-top-right-radius:12px}.br-t-r-13{border-top-right-radius:13px}.br-t-r-14{border-top-right-radius:14px}.br-t-r-15{border-top-right-radius:15px}.br-t-r-16{border-top-right-radius:16px}.br-b-r-1{border-bottom-right-radius:1px}.br-b-r-2{border-bottom-right-radius:2px}.br-b-r-3{border-bottom-right-radius:3px}.br-b-r-4{border-bottom-right-radius:4px}.br-b-r-5{border-bottom-right-radius:5px}.br-b-r-6{border-bottom-right-radius:6px}.br-b-r-7{border-bottom-right-radius:7px}.br-b-r-8{border-bottom-right-radius:8px}.br-b-r-9{border-bottom-right-radius:9px}.br-b-r-10{border-bottom-right-radius:10px}.br-b-r-11{border-bottom-right-radius:11px}.br-b-r-12{border-bottom-right-radius:12px}.br-b-r-13{border-bottom-right-radius:13px}.br-b-r-14{border-bottom-right-radius:14px}.br-b-r-15{border-bottom-right-radius:15px}.br-b-r-16{border-bottom-right-radius:16px}.br-b-l-1{border-bottom-left-radius:1px}.br-b-l-2{border-bottom-left-radius:2px}.br-b-l-3{border-bottom-left-radius:3px}.br-b-l-4{border-bottom-left-radius:4px}.br-b-l-5{border-bottom-left-radius:5px}.br-b-l-6{border-bottom-left-radius:6px}.br-b-l-7{border-bottom-left-radius:7px}.br-b-l-8{border-bottom-left-radius:8px}.br-b-l-9{border-bottom-left-radius:9px}.br-b-l-10{border-bottom-left-radius:10px}.br-b-l-11{border-bottom-left-radius:11px}.br-b-l-12{border-bottom-left-radius:12px}.br-b-l-13{border-bottom-left-radius:13px}.br-b-l-14{border-bottom-left-radius:14px}.br-b-l-15{border-bottom-left-radius:15px}.br-b-l-16{border-bottom-left-radius:16px}.z-1{z-index:1}.z-2{z-index:2}.z-3{z-index:3}.z-4{z-index:4}.z-5{z-index:5}.z-6{z-index:6}.z-7{z-index:7}.z-8{z-index:8}.z-9{z-index:9}.z-10{z-index:10}.z-11{z-index:11}.z-12{z-index:12}.z-13{z-index:13}.z-14{z-index:14}.z-15{z-index:15}.z-16{z-index:16}.z-17{z-index:17}.z-18{z-index:18}.z-19{z-index:19}.z-20{z-index:20}.z-21{z-index:21}.z-22{z-index:22}.z-23{z-index:23}.z-24{z-index:24}.z-25{z-index:25}.z-26{z-index:26}.z-27{z-index:27}.z-28{z-index:28}.z-29{z-index:29}.z-30{z-index:30}.z-31{z-index:31}.z-32{z-index:32}.z-33{z-index:33}.z-34{z-index:34}.z-35{z-index:35}.z-36{z-index:36}.z-37{z-index:37}.z-38{z-index:38}.z-39{z-index:39}.z-40{z-index:40}.flex{display:flex}.flex-column{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-center{align-items:center}.flex-baseline{align-items:baseline}.flex-start{align-items:flex-start}.flex-end{align-items:flex-end}.flex-justify{justify-content:space-between}.flex-auto{flex:1 1 auto}.flex-grow{flex:1 0 auto}.flex-none{flex:none}@media(min-width:40em){.sm-flex{display:flex}}@media(min-width:52em){.md-flex{display:flex}}@media(min-width:64em){.lg-flex{display:flex}}@media(min-width:40em){.flex-10{flex:0 0 10%}.flex-20{flex:0 0 20%}.flex-25{flex:0 0 25%}.flex-33{flex:0 0 33.3333%}.flex-30{flex:0 0 30%}.flex-40{flex:0 0 40%}.flex-45{flex:0 0 45%}.flex-50{flex:0 0 50%}.flex-60{flex:0 0 60%}.flex-66{flex:0 0 66.6667%}.flex-70{flex:0 0 70%}.flex-75{flex:0 0 75%}.flex-80{flex:0 0 80%}.flex-90{flex:0 0 90%}.flex-100{flex:0 0 100%}}.justify-start{justify-content:flex-start}.justify-between{justify-content:space-between}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}@media(min-width:64em){.justify-center-lg{justify-content:center}}@media(min-width:74em){.xlg-flex{display:flex}}.inline-flex{display:inline-flex}.lg-inline-flex{display:none}@media(min-width:64em){.lg-inline-flex{display:inline-flex}}.lg-inline-flex-hide{display:inline-flex}@media(min-width:64em){.lg-inline-flex-hide{display:none}}.flex-stretch{align-items:stretch}.flex-nostretch{align-self:center}.flex-nostretch-start{align-self:flex-start}.flex-nostretch-end{align-self:flex-end}.flex-noshrink{flex-shrink:0}@media(min-width:40em){.sm-mb0{margin-bottom:0}.flex-row-reverse{flex-direction:row-reverse}}.flex-column-reverse-sm-unset{flex-direction:column-reverse}@media(min-width:40em){.flex-column-reverse-sm-unset{flex-direction:unset}}.flex-column-reverse-md-unset{flex-direction:column-reverse}@media(min-width:52em){.flex-column-reverse-md-unset{flex-direction:unset}}.flex-column-reverse-lg-unset{flex-direction:column-reverse}@media(min-width:64em){.flex-column-reverse-lg-unset{flex-direction:unset}}@media(min-width:40em){.sm-justify-center{justify-content:center}}.sm-flex-row{flex-direction:column}@media(min-width:40em){.sm-flex-row{flex-direction:row}}.lg-flex-row{flex-direction:column}@media(min-width:64em){.lg-flex-row{flex-direction:row}}.no-flex{flex:none}.flex-gap-1{gap:.5rem}.flex-gap-2{gap:1rem}.flex-gap-3{gap:2rem}.flex-gap-4{gap:4rem}@media(min-width:40em){.sm-row-reverse{flex-direction:row-reverse}}@media(min-width:52em){.md-row-reverse{flex-direction:row-reverse}}.xlg-show{display:none}@media(min-width:74em){.xlg-show{display:unset}}:root{--ease-in-quad:cubic-bezier(0.55,0.085,0.68,0.53);--ease-in-cubic:cubic-bezier(0.55,0.055,0.675,0.19);--ease-in-quart:cubic-bezier(0.895,0.03,0.685,0.22);--ease-in-quint:cubic-bezier(0.755,0.05,0.855,0.06);--ease-in-expo:cubic-bezier(0.95,0.05,0.795,0.035);--ease-in-circ:cubic-bezier(0.6,0.04,0.98,0.335);--ease-out-quad:cubic-bezier(0.25,0.46,0.45,0.94);--ease-out-cubic:cubic-bezier(0.215,0.61,0.355,1);--ease-out-quart:cubic-bezier(0.165,0.84,0.44,1);--ease-out-quint:cubic-bezier(0.23,1,0.32,1);--ease-out-expo:cubic-bezier(0.19,1,0.22,1);--ease-out-circ:cubic-bezier(0.075,0.82,0.165,1);--ease-in-out-quad:cubic-bezier(0.455,0.03,0.515,0.955);--ease-in-out-cubic:cubic-bezier(0.645,0.045,0.355,1);--ease-in-out-quart:cubic-bezier(0.77,0,0.175,1);--ease-in-out-quint:cubic-bezier(0.86,0,0.07,1);--ease-in-out-expo:cubic-bezier(1,0,0,1);--ease-in-out-circ:cubic-bezier(0.785,0.135,0.15,0.86)}.fade{--yvalue:40px;opacity:0;transform:translateY(var(--yvalue));transition-delay:.5s;transition-duration:.5s;transition-timing-function:var(--ease-out-cubic)}.fade-reveal{transform:unset}.fade.active{opacity:1;transform:translateY(0)}.hover-item{transform-origin:center}.hover-item:hover{transform:scale(1.05)}.ease-in-quad{transition-timing-function:var(--ease-in-quad)}.ease-in-cubic{transition-timing-function:var(--ease-in-cubic)}.ease-in-quart{transition-timing-function:var(--ease-in-quart)}.ease-in-quint{transition-timing-function:var(--ease-in-quint)}.ease-in-expo{transition-timing-function:var(--ease-in-expo)}.ease-in-circ{transition-timing-function:var(--ease-in-circ)}.ease-out-quad{transition-timing-function:var(--ease-out-quad)}.ease-out-cubic{transition-timing-function:var(--ease-out-cubic)}.ease-out-quart{transition-timing-function:var(--ease-out-quart)}.ease-out-quint{transition-timing-function:var(--ease-out-quint)}.ease-out-expo{transition-timing-function:var(--ease-out-expo)}.ease-out-circ{transition-timing-function:var(--ease-out-circ)}.ease-in-out-quad{transition-timing-function:var(--ease-in-out-quad)}.ease-in-out-cubic{transition-timing-function:var(--ease-in-out-cubic)}.ease-in-out-quart{transition-timing-function:var(--ease-in-out-quart)}.ease-in-out-quint{transition-timing-function:var(--ease-in-out-quint)}.ease-in-out-expo{transition-timing-function:var(--ease-in-out-expo)}.ease-in-out-circ{transition-timing-function:var(--ease-in-out-circ)}.show{opacity:1;transform:none}.notify{animation:notify .1s cubic-bezier(1,0,0,1) 2 alternate}@keyframes notify{0%{transform:scale(1)}to{transform:scale(1.1)}}.m-auto{margin:0 auto}.m-unset{margin:unset}.p-unset{padding:unset}.m0{margin:0}.mt0{margin-top:0}.mr0{margin-right:0}.mb0{margin-bottom:0}.ml0{margin-left:0}.m1{margin:.5rem}.mt1{margin-top:.5rem}.mr1{margin-right:.5rem}.mb1{margin-bottom:.5rem}.ml1{margin-left:.5rem}.m2{margin:1rem}.mt2{margin-top:1rem}.mr2{margin-right:1rem}.mb2{margin-bottom:1rem}.ml2{margin-left:1rem}.m3{margin:2rem}.mt3{margin-top:2rem}.mr3{margin-right:2rem}.mb3{margin-bottom:2rem}.ml3{margin-left:2rem}.m4{margin:4rem}.mt4{margin-top:4rem}.mr4{margin-right:4rem}.mb4{margin-bottom:4rem}.ml4{margin-left:4rem}.mxn1{margin-left:-.5rem;margin-right:-.5rem}.mxn2{margin-left:-1rem;margin-right:-1rem}.mxn3{margin-left:-2rem;margin-right:-2rem}.mxn4{margin-left:-4rem;margin-right:-4rem}.mx-auto{margin-left:auto;margin-right:auto}.p0{padding:0}.p1{padding:.5rem}.py1{padding-bottom:.5rem;padding-top:.5rem}.px1{padding-left:.5rem;padding-right:.5rem}.p2{padding:1rem}.py2{padding-bottom:1rem;padding-top:1rem}.px2{padding-left:1rem;padding-right:1rem}.p3{padding:2rem}.py3{padding-bottom:2rem;padding-top:2rem}.px3{padding-left:2rem;padding-right:2rem}.p4{padding:4rem}.py4{padding-bottom:4rem;padding-top:4rem}.px4{padding-left:4rem;padding-right:4rem}.pt1{padding-top:1rem}.pt2{padding-top:2rem}.pt3{padding-top:3rem}.pt4{padding-top:4rem}@media(min-width:64em){.lg-px2{padding-left:1rem;padding-right:1rem}.lg-px3{padding-left:2rem;padding-right:2rem}.lg-px4{padding-left:4rem;padding-right:4rem}.lg-p2{padding:1rem}.lg-p3{padding:2rem}.lg-p4{padding:4rem}.lg-mt0{margin-top:0}.lg-mt1{margin-top:1rem}.lg-mt2,.lg-mt3,.lg-mt4{margin-top:2rem}.lg-mb0{margin-bottom:0}.lg-mt1{margin-bottom:1rem}.lg-mb2,.lg-mb3,.lg-mb4{margin-bottom:2rem}}.line-clamp{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-3{-webkit-line-clamp:3}.inline{display:inline}.block{display:block}.inline-block{display:inline-block}.table{display:table}.table-cell{display:table-cell}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.overflow-auto{overflow:auto}.overflow-x-hidden,.overflow-y-hidden{overflow-x:hidden}.m0auto{margin:0 auto}.relative{position:relative}.absolute{position:absolute}.fixed{position:fixed}.lg-show,.md-show,.sm-show{display:none!important}@media(min-width:40em){.sm-show{display:block!important}}@media(min-width:52em){.md-show{display:block!important}}@media(min-width:64em){.lg-show{display:block!important}}@media(min-width:40em){.sm-hide{display:none!important}}@media(min-width:52em){.md-hide{display:none!important}}@media(min-width:64em){.lg-hide{display:none!important}}.display-none{display:none!important}.hide{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px}.card{text-wrap:balance;background-color:#fff;border:1px solid #f6f6f6;border-radius:6px;box-shadow:0 3px 8px 0 rgba(0,0,0,.12);color:unset;display:flex;flex-direction:column;justify-content:center;position:relative;transition:box-shadow .2s ease-in-out 0s,border-color .3s,transform .2s;width:100%}.card:active{box-shadow:none}.card:hover{box-shadow:0 8px 20px 0 rgba(0,0,0,.12)}.card:hover,.card>a:hover{text-decoration:none}.card.card-no-hover{transform:none}.card.card-no-hover:hover{box-shadow:none}.card-md-flex,a.card-md-flex{display:block}@media(min-width:52em){.card-md-flex,a.card-md-flex{display:flex}}.card-flex-row,a.card-flex-row{flex-direction:row}.card-align-start,a.card-align-start{align-items:flex-start}.card-justify-start,a.card-justify-start{justify-content:flex-start}.card-dark,a.card-dark{background-color:color-mix(in srgb,var(--color-primary),#000 60%);border:none;position:relative}.card-dark:hover:after,a.card-dark:hover:after{background:linear-gradient(hsla(0,0%,100%,.5),hsla(0,0%,100%,.15));opacity:1}#what-analysts-say figure{position:relative}.card-dark:after{background:linear-gradient(hsla(0,0%,100%,.2),hsla(0,0%,100%,.05));border-radius:inherit;bottom:0;content:"";left:0;opacity:.8;pointer-events:none;position:absolute;right:0;top:0;inset:0;mask:linear-gradient(#000,#000) content-box content-box,linear-gradient(#000,#000);-webkit-mask:linear-gradient(#000,#000) content-box content-box,linear-gradient(#000,#000);-webkit-mask-clip:content-box,border-box;mask-clip:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-image:linear-gradient(#000,#000),linear-gradient(#000,#000);mask-image:linear-gradient(#000,#000),linear-gradient(#000,#000);mask-mode:match-source,match-source;-webkit-mask-origin:content-box,border-box;mask-origin:content-box,border-box;-webkit-mask-position:0 0,0 0;mask-position:0 0,0 0;-webkit-mask-repeat:repeat,repeat;mask-repeat:repeat,repeat;-webkit-mask-size:auto,auto;mask-size:auto,auto;padding:1px;transition:opacity .4s ease-in-out;-webkit-user-select:none;user-select:none}.alert{border-radius:16px;margin-bottom:1rem;padding:1.25rem 1.5rem 1.25rem 3.5rem;position:relative}.alert p{font-size:.75rem;margin:0;max-width:80%;vertical-align:middle}@media(min-width:52em){.alert p{font-size:1rem}}.alert-title{font-family:var(--font-bold);font-size:1.25rem}.alert a{color:currentColor}.alert p strong{font-family:var(--font-bold)}.alert-warning{background-color:color-mix(in srgb,var(--color-warning),#fff 90%);color:color-mix(in srgb,var(--color-warning),#000 20%)}.alert-warning a,.alert-warning p{color:color-mix(in srgb,var(--color-warning),#000 25%)}.alert-danger{background-color:color-mix(in srgb,var(--color-danger) 5%,#fff)}.alert-danger,.alert-danger a,.alert-danger p{color:var(--color-danger)}.alert-success{background-color:color-mix(in srgb,var(--color-success),#fff 85%);color:color-mix(in srgb,var(--color-sucess),#000 10%)}.alert-success a,.alert-success p{color:color-mix(in srgb,var(--color-success),#fff 5%)}.alert-info{background-color:color-mix(in srgb,var(--color-info) 10%,#fff)}.alert-info,.alert-info a,.alert-info p{color:var(--color-info)}.alert-note{background-color:color-mix(in srgb,var(--color-spot) 10%,#fff)}.alert-note,.alert-note a,.alert-note p,.alert-tip{color:var(--color-spot)}.alert-tip{background-color:color-mix(in srgb,var(--color-spot) 10%,#fff)}.alert-tip a,.alert-tip p{color:var(--color-spot)}.alert:before{background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;height:24px;left:1rem;margin-right:8px;position:absolute;top:1.5rem;vertical-align:middle;width:24px}.alert-warning:before{background-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="orange" stroke-linecap="round" stroke-linejoin="round" viewBox="0 0 24 24"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3M12 9v4M12 17h.01"/></svg>')}.alert-danger:before{background-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="red" stroke-linecap="round" stroke-linejoin="round" viewBox="0 0 24 24"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3M12 9v4M12 17h.01"/></svg>')}.alert-success:before{background-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="green" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>')}.alert-info:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='%23aeaeae' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' x2='12' y1='8' y2='12'/%3E%3Cline x1='12' x2='12.01' y1='16' y2='16'/%3E%3C/svg%3E")}.alert-note:before{background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none" stroke="%23d859a1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 2h10l4 4v12H4V2z"/><path d="M14 2v4h4"/></svg>')}.alert-tip:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='%23d859a1' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5M9 18h6M10 22h4'/%3E%3C/svg%3E")}button.alert-close{appearance:none;background-color:transparent;border:0;box-shadow:none;color:inherit;padding:.75rem 1.25rem;position:absolute;right:0}button.alert-close:hover{box-shadow:none;outline:none}button.alert-close.active,button.alert-close:hover .icon{color:initial}.alert-close .icon{cursor:pointer;font-size:1rem}.badge{color:#fff;padding:3px 6px}.badge-warning{background-color:var(--color-warning)}.badge-danger{background-color:var(--color-danger)}.badge-success{background-color:var(--color-success)}p .badge{margin-left:4px;margin-right:4px;top:0}.toast{bottom:0;box-shadow:0 0 1px rgba(67,90,111,.3),0 8px 10px -4px rgba(67,90,111,.47);left:50%;left:0;margin:0 auto;position:fixed;right:0;text-align:left;transform:translateY(100px);transition:all .3s cubic-bezier(.175,.885,.32,1.275);visibility:hidden;width:auto;width:300px;z-index:100}.toast.show{transform:translateY(-30px);visibility:visible}.toast.hide{transform:translateY(100px)}.toast-success{border-left:8px solid var(--color-success)}.toast-success .icon,.toast-success a{color:var(--color-success)}.toast-warning{border-left:8px solid var(--color-danger)}.toast-warning .icon,.toast-warning a{color:var(--color-danger)}.toast-danger{border-left:8px solid var(--color-danger)}.toast-danger .icon,.toast-danger a{color:var(--color-danger)}.mock-ui-c-holder{display:inline-flex;flex-direction:column;margin-right:100px;position:relative}.mock-ui-c-holder-end{margin-right:0}.mock-ui-c-holder.mock-ui-c-holder-row{align-items:flex-start;flex-direction:row;margin-right:0}.mock-ui-c-selectbox{align-items:center;background-color:#fff;border-radius:4px;box-shadow:0 6px 12px -2px rgba(50,50,93,.25),0 3px 7px -3px rgba(0,0,0,.3);color:var(--color-primary);display:inline-flex;justify-content:space-between;max-width:200px;min-width:150px;padding:.35rem 1rem;position:relative;white-space:nowrap}.mock-ui-c-selectbox .icon{margin-left:1rem;transform:translateY(2px) scale(.7);transition:transform .2s ease-in-out}.mock-ui-c-selectbox.active{background-color:var(--color-primary);color:#fff}.mock-ui-c-selectbox.active .icon{transform:translateY(2px) scale(.7) rotate(180deg)}.mock-ui-c-selectbox.mock-ui-c-search{padding:.35rem}.mock-ui-c-selectbox.mock-ui-c-search .icon{margin-left:0}.mock-ui-c-connector{border-bottom:2px solid #7e8185;border-bottom-left-radius:9px;border-left:2px solid #cfd7df;height:2px;left:100%;position:absolute;top:calc(50% - 1px);width:100px;z-index:3}.mock-ui-c-connector-down{height:136px;left:calc(50% - 1px);top:calc(100% - 3px);width:2px}.mock-ui-c-connector:before{left:0;top:0}.mock-ui-c-connector:after,.mock-ui-c-connector:before{background-color:#fff;border:2px solid #cfd7df;border-radius:50%;content:"";height:12px;position:absolute;transform:translate(-50%,-50%);width:12px;z-index:5}.mock-ui-c-connector:after{left:100%;top:100%}.mock-ui-c-header{border-bottom:1px solid #ccc}.mock-ui-c-header-dark{background-color:color-mix(in srgb,var(--color-primary),#000 20%);border-bottom:1px solid color-mix(in srgb,var(--color-primary),#000 20%);border-top-left-radius:4px;border-top-right-radius:4px}.mock-ui-c-header p{font-size:1rem}.mock-ui-c-header .button-xtiny{font-size:.85rem}.mock-ui-c-section{background-color:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 6px 12px -2px rgba(50,50,93,.25),0 3px 7px -3px rgba(0,0,0,.3);min-width:250px}.mock-ui-c-section-dark{background-color:color-mix(in srgb,var(--color-primary),#000 20%)}.mock-ui-c-textarea{background-color:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 6px 12px -2px rgba(50,50,93,.25),0 3px 7px -3px rgba(0,0,0,.3);min-height:150px;min-width:250px;padding:2rem;width:100%}.mock-ui-c-dummy-content{background-color:rgba(77,85,106,.1);border-radius:8px;height:8px}.mock-ui-c-section-dark .mock-ui-c-dummy-content{background-color:var(--color-primary-dark)}.mock-ui-c-selectbox-options{background-color:#fff;border-bottom-left-radius:4px;border-bottom-right-radius:4px;box-shadow:0 6px 12px -2px rgba(50,50,93,.25),0 3px 7px -3px rgba(0,0,0,.3);display:flex;flex-direction:column;left:0;position:absolute;top:100%;width:100%;z-index:10}.mock-ui-c-selectbox-options li{color:var(--color-primary);font-size:.85rem;padding:.35rem 1rem}.mock-ui-flow{grid-gap:0;border-bottom:1px solid var(--color-primary-light);display:grid;grid-template-columns:265px 400px 220px 120px}.mock-ui-flow p .icon{color:#ccc;margin-left:.5rem}.mock-ui-c-section-capabilities{position:relative;transform:translate(-1rem,-1rem);z-index:5}.mock-ui-c-capabilities{grid-gap:1rem;display:grid;grid-template-columns:repeat(3,1fr)}.mock-ui-c-capabilities svg{height:auto;margin-bottom:1rem;max-height:50px;max-width:50px}.mock-ui-c-capabilities-item{text-align:center}.mock-ui-c-capabilities-item i{font-size:1.5rem}.mock-ui-c-capabilities-item p{font-size:.75rem;line-height:1}.mock-ui-c-alarm-status{align-items:center;background-color:var(--color-success);border-radius:4px;display:inline-flex;justify-content:space-between;padding:.25rem 1rem}.mock-ui-c-alarm-status-alarm,.mock-ui-c-alarm-status-alarm:focus,.mock-ui-c-alarm-status-alarm:hover{background-color:#cb2d2b}.mock-ui-c-alarm-status-inactive{background-color:color-mix(in srgb,var(--color-primary),#000 30%)}.mock-ui-c-alarm-status-text{color:#fff;font-size:.75rem}.mock-ui-c-alarm-status-pulse{background-color:var(--color-success);border-radius:50%;cursor:pointer;display:inline-flex;height:10px;position:relative;width:10px;will-change:transform}.mock-ui-c-alarm-status-alarm .mock-ui-c-alarm-status-pulse:before{animation:alarm_pulse 1.5s infinite;background-color:var(--color-danger);border-radius:100%;content:"";height:100%;left:0;position:absolute;top:0;width:100%;will-change:transform;z-index:-1}.mock-ui-c-alarm-status-alarm .mock-ui-c-alarm-status-pulse{background-color:var(--color-danger)}.mock-ui-c-section:first-child .mock-ui-c-alarm-status-pulse{animation-delay:1.5s}.mock-ui-c-section:nth-child(2) .mock-ui-c-alarm-status-pulse{animation-delay:3s}.mock-ui-c-section:nth-child(3) .mock-ui-c-alarm-status-pulse{animation-delay:4.5s}.mock-ui-c-section:nth-child(4) .mock-ui-c-alarm-status-pulse{animation-delay:6s}.mock-ui-c-section:nth-child(5) .mock-ui-c-alarm-status-pulse{animation-delay:7.5s}.mock-ui-c-section:nth-child(6) .mock-ui-c-alarm-status-pulse{animation-delay:9s}.mock-ui-c-section:nth-child(7) .mock-ui-c-alarm-status-pulse{animation-delay:10.5s}.mock-ui-c-section:nth-child(8) .mock-ui-c-alarm-status-pulse{animation-delay:12s}.mock-ui-c-section:nth-child(9) .mock-ui-c-alarm-status-pulse{animation-delay:13.5s}.mock-ui-c-section:nth-child(10) .mock-ui-c-alarm-status-pulse{animation-delay:15s}.severity{border:1px solid var(--color-primary);border-radius:2rem;color:#fff;display:inline-flex;font-family:Roboto-Medium;letter-spacing:.01em;padding:.1rem 1rem;pointer-events:none;text-align:center;text-transform:uppercase}.severity-indeterminate,.severity-warning{border:1px solid var(--color-warning);color:var(--color-warning)}.severity-major{border:1px solid #cb2d2b;color:#cb2d2b}.severity-critical{background-color:#cb2d2b;border:1px solid #cb2d2b;color:#fff}.severity-minor{border:1px solid salmon;color:salmon}.severity-cleared{border:1px solid var(--color-success);color:var(--color-success)}.mock-ui-c-admin-dashboard{background-color:#424a56}.mock-ui-c-admin-dashboard-grid-container{--min:6em;--gap:1rem;grid-gap:var(--gap);display:grid;grid-template-columns:repeat(2,1fr)}@media(min-width:52em){.section-alarms .mock-ui-c-section{min-width:250px}}.mock-ui-c-alarms-modal{background-color:#fdf7f7;height:440px;max-height:200px;max-width:200px;overflow:hidden;position:absolute;right:1rem;top:2rem;width:300px}@media(min-width:40em){.mock-ui-c-alarms-modal{max-height:340px;top:-6rem}}@media(min-width:52em){.mock-ui-c-alarms-modal{height:440px;left:auto;max-height:none;overflow:initial;right:2rem;top:-8rem;width:300px}}.mock-ui-c-alarms-modal-simple{background-color:#fdf7f7}.mock-ui-c-alarms-modal-regular{background-color:#fafafa}@media(min-width:52em){.mock-ui-c-alarms-modal-regular{height:max-content;right:-2rem;top:-3rem}}.mock-ui-c-alarms-modal-line{display:none;left:58%;position:absolute;top:-50px;transform:scaleX(1) scaleY(-1)}@media(min-width:40em){.mock-ui-c-alarms-modal-line{display:block;left:44%}}@media(min-width:64em){.mock-ui-c-alarms-modal-line{left:34%}}.mock-ui-c-alarms-modal-card{background:#fff;border:1px solid #f6f6f6;border-radius:6px;box-shadow:0 3px 8px 0 rgba(0,0,0,.12)}.mock-ui-c-alarms-modal-card-heading{background-color:#cb2d2b;border-top-left-radius:6px;border-top-right-radius:6px;color:#fff}ol.alarms-impacted-resources-list{counter-reset:item}.alarms-impacted-resources-list li{list-style-type:none;margin:10px 0;position:relative}.alarms-impacted-resources-list .collapsed{display:none}.alarms-impacted-resources-list li button{margin-left:auto}.alarms-impacted-resources-list>li:before{display:none}.alarms-impacted-resources-list li:before{border-bottom:1px solid #ddd;border-left:1px solid #ddd;content:"";counter-increment:item;height:35px;left:-30px;position:absolute;top:-10px;width:30px}.alarms-impacted-resources-list li:after{border-left:1px solid #ddd;content:"";height:100%;left:-30px;position:absolute;top:5px;width:30px}.alarms-impacted-resources-list li:last-child:after{display:none}.alarms-impacted-resources-list li span{align-items:center;background-color:#fff;border:1px solid #ddd;border-radius:4px;color:#666;display:block;display:flex;justify-content:space-between;padding:10px;position:relative;text-decoration:none}.alarm-impacted-resources-line-reverse-x{transform:scaleX(-1)}.alarm-impacted-resources-line-line{stroke:var(--color-danger);stroke-width:1;stroke-dasharray:8;animation-delay:.95s;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.alarm-impacted-resources-line-line-reversed,.alarm-impacted-resources-line-reverse-xy .alarm-impacted-resources-line-line,.alarm-impacted-resources-line-reverse-y .alarm-impacted-resources-line-line{animation-direction:reverse}.alarm-impacted-resources-line-arrow{fill:var(--color-danger)}.mock-ui-c-impact-icon{padding:1rem 0 1rem 1rem}@media(min-width:52em){.mock-ui-c-impact-icon{padding:3rem 0 3rem 3rem}}.mock-ui-c-impact-icon svg g{transform:scale(.8);transform-origin:center center}.mock-ui-c-impact-tree{padding:1rem 1rem 1rem 0}@media(min-width:52em){.mock-ui-c-impact-tree{padding:3rem 3rem 3rem 0}}.mock-ui-c-browser aside{flex:0 0 30%}.mock-ui-c-browser main{flex:0 0 70%}.mock-ui-c pre{background-color:#f6f6f6;color:#000}.mock-ui-c-federated-login-holder{transform:scale(.75)}.mock-ui-c-federated-login{border:1px solid var(--color-primary);max-width:260px;min-width:260px;transform:scale(.85)}.mock-ui-c-federated-login-federated{left:2rem;max-width:280px;min-width:280px;position:absolute;top:-1rem}@media(min-width:64em){.mock-ui-c-federated-login-federated{left:4rem}}.mock-ui-c-federated-login .circle{background-color:var(--color-primary)}.share-button{align-items:center;background-color:transparent;border-radius:50%;color:#fff;cursor:pointer;display:none;font-size:1.2rem;height:36px;justify-content:center;transition:box-shadow .2s ease-out;width:36px}@media(min-width:64em){.share-button{display:inline-flex}}.share-button:focus,.share-button:hover{background-color:#f6f6f6}.share-button a{align-items:center;display:flex;justify-content:center}.share-button svg{height:18px;line-height:1;transition:fill .3s;width:18px}.share-button:has(svg path[fill=white]){background-color:transparent}.share-button:has(svg path[fill=white]):hover{background-color:#000}:root{--login-width:460px}#___loginIframe___backdrop{background-color:rgba(0,0,0,.9);z-index:20000!important}#___loginIframe___{background-color:#fff;border-radius:12px;left:0!important;margin-left:0!important;overflow-y:auto!important;top:0!important;width:100%!important;z-index:25000!important}@media(min-width:52em){#___loginIframe___{left:calc(50% - var(--login-width)/2)!important;margin-left:0!important;min-height:calc(640px + 1.5rem);top:10vh!important;width:460px!important}}#___loginIframe___closeButton{left:auto!important;right:2rem!important;top:1.5rem!important;z-index:30000!important}@media(min-width:52em){#___loginIframe___closeButton{left:calc(50% - var(--login-width)/2 + var(--login-width) - 5rem)!important;right:auto!important;top:calc(10vh + 1.5rem)!important}}#___loginIframe___closeButton button{background-color:#fff!important;box-shadow:none!important;color:#ccc!important;font-size:2rem!important;height:40px!important;width:40px!important}#___loginIframe___closeButton button.close:hover{background-color:#ccc!important;color:#fff!important}div#hs-eu-cookie-confirmation{--noticeFromBottom:0;--noticeHeight:192px;--ease-in-out-cubic:cubic-bezier(0.645,0.045,0.355,1);--link-color:var(--color-spot);--decline-color:#000;animation-delay:.5s;animation-duration:.5s;animation-fill-mode:forwards;animation-name:slide-up;animation-timing-function:var(--ease-in-out-cubic);background:#fff!important;border:1px solid #ccc!important;border-radius:8px;bottom:1rem!important;box-shadow:none!important;color:color-mix(in srgb,var(--color-primary) 40%,#fff)!important;content-visibility:auto!important;font-family:inherit;font-size:inherit;font-size:1rem!important;font-weight:400!important;height:auto;line-height:inherit;line-height:1.875!important;max-width:560px!important;padding:.5rem!important;position:fixed;text-align:left;text-shadow:none!important;transform:translateY(calc(var(--noticeHeight) + var(--noticeFromBottom)));transition:transform .2s var(--ease-in-out-cubic);width:100%!important;z-index:100000000!important}div#hs-eu-cookie-confirmation.hs-cookie-notification-position-bottom{bottom:var(--noticeFromBottom)!important;left:auto!important;right:0!important}@media screen and (min-width:480px){div#hs-eu-cookie-confirmation.hs-cookie-notification-position-bottom{--noticeFromBottom:1rem;left:auto!important;right:1rem!important}}@keyframes slide-up{0%{transform:translateY(calc(var(--noticeHeight) + var(--noticeFromBottom)))}to{transform:translateY(0)}}div#hs-eu-cookie-confirmation *{box-sizing:border-box!important}div#hs-eu-cookie-confirmation a:not([role=button]),div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner #hs-eu-policy-wording p a{color:var(--link-color)!important;text-decoration:underline!important}body div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner{background:transparent!important;border-radius:6px!important;margin:0 auto;margin:0 auto!important;max-width:1200px!important;padding:50px!important}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner a{text-decoration:underline!important}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner a:not[role=button]:after{color:var(--color-tertiary)!important;content:""!important;font-family:Ionicons!important;margin-left:.5rem!important}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner a:hover{text-decoration:underline!important}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner div#hs-eu-policy-wording{margin-bottom:12px}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner div#hs-en-cookie-confirmation-buttons-area{display:flex;justify-content:flex-start!important;margin:10px 0 0!important;text-align:left!important}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner a#hs-eu-confirmation-button,div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner a#hs-eu-decline-button{border-radius:3px;display:inline-block;padding:.25rem 1rem!important;text-decoration:none!important}body div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner{color:var(--color-primary)!important;margin-right:1rem!important;padding:.5rem!important}body div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner p{color:unset!important}body div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner div#hs-en-cookie-confirmation-buttons-area{text-align:left!important}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner p{color:color-mix(in srgb,var(--color-primary) 40%,#fff)!important;font-size:inherit;line-height:inherit;margin:0 0 12px;text-align:left;text-shadow:none!important}@media print{div#hs-eu-cookie-confirmation{display:none!important}}@media screen and (max-width:480px){div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner{padding:30px!important}body div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner p{font-size:.875rem!important;line-height:1.65!important;margin-bottom:12px!important}}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner #hs-en-cookie-confirmation-buttons-area #hs-eu-confirmation-button{background-color:#fff!important;color:#000!important}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner #hs-en-cookie-confirmation-buttons-area #hs-eu-confirmation-button,div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner #hs-en-cookie-confirmation-buttons-area #hs-eu-decline-button,div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner #hs-en-cookie-confirmation-buttons-area a#hs-eu-cookie-settings-button{border:1px solid var(--decline-color)!important;border-radius:8px!important;padding:.25rem 2rem!important;transition:transform .2s}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner #hs-en-cookie-confirmation-buttons-area #hs-eu-confirmation-button:hover,div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner #hs-en-cookie-confirmation-buttons-area #hs-eu-decline-button:hover,div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner #hs-en-cookie-confirmation-buttons-area a#hs-eu-cookie-settings-button:hover{transform:scale(1.05)}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner #hs-en-cookie-confirmation-buttons-area #hs-eu-confirmation-button{background-color:var(--color-spot)!important;border-color:var(--color-spot)!important;color:#fff!important}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner #hs-en-cookie-confirmation-buttons-area a#hs-eu-cookie-settings-button{background-color:#000!important;color:#fff!important;order:4!important;text-decoration:none!important}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner #hs-en-cookie-confirmation-buttons-area #hs-eu-decline-button{background-color:#fff!important;color:#000!important}@media screen and (max-width:480px){div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner a,div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner a#hs-eu-confirmation-button{font-size:inherit!important}}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner a#hs-eu-decline-button{border:1px solid var(--decline-color)!important;color:var(--decline-color)!important}div#hs-en-cookie-confirmation-buttons-area{display:flex}div#hs-eu-cookie-confirmation div#hs-eu-cookie-confirmation-inner p{margin:0!important}#hs-eu-cookie-confirmation-button-group{order:2}.partner-intro-graphic{display:none;height:auto;object-fit:contain;opacity:.5;position:absolute;right:-10vw;top:10vh;width:50vh;z-index:1}@media(min-width:64em){.partner-intro-graphic{display:block}}.partner .intro .intro-wrapper{max-width:60em}.partner .intro .intro-overlay{background-attachment:fixed;background-color:#fff;background-image:none;background-image:radial-gradient(#ddd 1px,transparent 0),radial-gradient(#ddd 1px,transparent 0);background-position:0 0,25px 25px;background-size:50px 50px}.partner .intro .intro-copy h1,.partner .intro .intro-copy h2,.partner .intro .intro-copy p{color:revert}.partner .intro .intro-copy h2{font-size:medium}.partner-form aside{align-items:center;background-image:linear-gradient(45deg,color-mix(in srgb,var(--color-primary),#000 38%) 0,color-mix(in srgb,var(--color-primary),#000 18%) 66%,color-mix(in srgb,var(--color-primary),#000 16%) 100%);display:none;flex-direction:column;justify-content:center;padding:3rem;text-align:center}.partner-form aside *{color:#fff}@media(min-width:74em){.partner-form aside{display:flex}}.section-testimonials{background-position:50%;background-size:cover;content-visibility:auto}.section-testimonials-overlay{align-items:center;background-color:#000;background-image:radial-gradient(at 77% 78%,#272527 0,transparent 50%),radial-gradient(at 5% 55%,#2c211c 0,transparent 50%),radial-gradient(at 29% 76%,#3d5794 0,transparent 50%),radial-gradient(at 32% 33%,#373e48 0,transparent 50%);background-size:100%;display:flex;height:100%;min-height:50vh;padding:2rem 0;width:100%}@media(min-width:64em){.section-testimonials-overlay{padding:4rem 2rem}}.partners-intro-animation{display:block;height:20em;margin:0 auto;max-height:none;position:absolute;top:calc(50% - 10em);width:20em}@media(min-width:40em){.partners-intro-animation{display:initial;height:32em;margin:unset;top:calc(50% - 16em);width:32em}}.partners-intro-animation-holder{display:inline-flex;margin-bottom:10rem}@media(min-width:40em){.partners-intro-animation-holder{height:auto;margin-bottom:20rem;transform:none}}@media(min-width:64em){.partners-intro-animation-holder{margin-bottom:0}}.partners-intro-animation-logo{display:block;height:8em;position:absolute;right:calc(50% - 4em);top:calc(50% - 2em);width:8em}@media(min-width:40em){.partners-intro-animation-logo{height:16em;right:calc(50% - 8em);top:calc(50% - 8em);width:16em}}.header-anchor{margin-left:.5rem;opacity:0;transition:opacity .3s ease-in-out}h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor{opacity:1}.header-stripe{align-items:center;color:#fff;display:flex;font-size:.85rem;gap:4rem;justify-content:center;overflow:hidden;padding:.75rem;text-overflow:ellipsis;white-space:nowrap;width:100%}.header-stripe .ion-android-arrow-forward{display:inline-block;transition:transform .3s}.header-stripe a{color:#fff;font-size:.85rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.header-stripe a,.header-stripe a .ion-android-arrow-forward{display:inline-block}.header-stripe .icon.ion-close{align-items:center;border-radius:50%;cursor:pointer;display:inline-flex;font-size:.75rem;height:24px;justify-content:center;line-height:0;transition:background-color .3s ease;width:24px;z-index:1}@media(min-width:64em){.header-stripe .icon.ion-close{position:static}}.header-stripe .icon.ion-close:hover{color:#fff}.header-stripe strong{color:#fff;text-decoration:underline}.benefit-list{background-color:#f6f6f6;border-radius:4px;justify-content:center}@media(min-width:64em){.benefit-list{justify-content:normal}}.benefit-list-transparent{background-color:transparent}.benefit-list-green{background-color:color-mix(in srgb,var(--color-resources-develop) 10%,#fff)}.benefit-list p{line-height:1.2;text-align:left}.benefit-list .icon{line-height:0}.avatar img{border:1px solid #f2f2f2;border-radius:100%;box-shadow:0 1px 2px rgba(0,0,0,.2);object-fit:cover}.avatar[data-size=sm] img{height:60px;width:60px}@media(min-width:64em){.avatar[data-size=sm] img{height:100px;width:100px}}.avatar[data-size=md] img{height:80px;width:80px}@media(min-width:64em){.avatar[data-size=md] img{height:140px;width:140px}}.gradient-line{display:block;position:relative}.gradient-line:after{background:linear-gradient(70deg,#ffdd40,var(--color-spot));content:"";height:4px;left:0;position:absolute;right:0;top:0;width:100%;z-index:1}.skeleton-loading{--accents-1:#fafafa;--accents-2:#e4e4e4;animation:skeleton_loading 8s ease-in-out infinite;background-image:linear-gradient(270deg,var(--accents-1),var(--accents-2),var(--accents-2),var(--accents-1));background-size:400% 100%;display:block}@keyframes skeleton_loading{0%{background-position:200% 0}to{background-position:-200% 0}}@media print{.was-this-helpful{display:none}}.was-this-helpful .hs-no,.was-this-helpful .hs-yes{display:inline-block}.was-this-helpful .inputs-list{list-style:none;padding:0}.was-this-helpful .field.hs-form-field{background-color:transparent;border:none}.was-this-helpful input[type=email],.was-this-helpful input[type=text],.was-this-helpful textarea{border:1px solid rgba(0,0,0,.125);border-radius:3px;width:100%}.was-this-helpful #hubspot-form form>div{display:none}.was-this-helpful.active #hubspot-form form>div{display:block}.was-this-helpful .hs_company,.was-this-helpful .hs_email,.was-this-helpful .hs_firstname,.was-this-helpful .hs_lastname,.was-this-helpful .hs_provide_feedback,.was-this-helpful .hs_submit,.was-this-helpful .legal-consent-container{display:none}.was-this-helpful.active .hs_company,.was-this-helpful.active .hs_email,.was-this-helpful.active .hs_firstname,.was-this-helpful.active .hs_lastname,.was-this-helpful.active .hs_provide_feedback,.was-this-helpful.active .hs_submit,.was-this-helpful.active .legal-consent-container{display:block}.was-this-helpful form>div:first-child{display:flex;flex-direction:column}.was-this-helpful form>div:first-child .hs-form-required{display:none}.was-this-helpful .hs-button{width:auto}.was-this-helpful .hs_feedback_buttons{align-items:center;display:flex}.was-this-helpful .hs_feedback_buttons label{flex:0 0 auto;order:1}.was-this-helpful .hs_feedback_buttons legend.hs-field-desc{display:none!important}.was-this-helpful .hs_feedback_buttons ul{border:2px solid #ccc;border-radius:2rem;padding:.5rem}.was-this-helpful .hs_feedback_buttons .input{order:2}.was-this-helpful .hs_feedback_buttons>label{color:var(--color-paragraphs);font-family:var(--type-regular);font-size:1.5rem}.was-this-helpful .hs_feedback_buttons .input ul{align-items:center;display:flex;gap:.5rem}.was-this-helpful .hs_feedback_buttons input{clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.was-this-helpful .hs_feedback_buttons .input label{align-items:center;background-color:#ddd;border:4px solid transparent;border-radius:50%;color:#333;cursor:pointer;display:flex;flex-direction:column;font-size:1rem;height:48px;justify-content:center;padding:.25rem 1rem;position:relative;transition:all .2s;width:48px}.was-this-helpful .hs_feedback_buttons li:first-child label{color:var(--color-success)}.was-this-helpful .hs_feedback_buttons li:first-child label:hover{background-color:var(--color-success)}.was-this-helpful .hs_feedback_buttons li:nth-child(2) label{color:var(--color-danger)}.was-this-helpful .hs_feedback_buttons li:nth-child(2) label:hover{background-color:var(--color-danger)}.was-this-helpful .hs_feedback_buttons li label span{align-items:center;display:none;flex-direction:column;line-height:1.2}.was-this-helpful .hs_feedback_buttons li:first-child label:before,.was-this-helpful .hs_feedback_buttons li:nth-child(2) label:before{background-position:50%;background-repeat:no-repeat;background-size:24px;display:block;height:24px;width:24px}.was-this-helpful .hs_feedback_buttons li:first-child label.active{background-color:var(--color-success);border:4px solid var(--color-success);color:#fff}.was-this-helpful .hs_feedback_buttons li:first-child label.active:before{color:#fff}.was-this-helpful .hs_feedback_buttons li:nth-child(2) label.active{background-color:var(--color-danger);border:4px solid var(--color-danger);color:#fff}.was-this-helpful .hs_feedback_buttons li:nth-child(2) label.active:before{color:#fff}.was-this-helpful .hs_feedback_buttons li:first-child label:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3'/%3E%3C/svg%3E");content:""}.was-this-helpful .hs_feedback_buttons li:nth-child(2) label:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17'/%3E%3C/svg%3E");content:""}.was-this-helpful .was-this-helpful-close{align-items:center;border-radius:50%;color:#ccc;cursor:pointer;display:flex;font-size:1rem;height:34px;justify-content:center;position:absolute;right:.5rem;top:.5rem;transition:background-color .3s ease;width:34px}.was-this-helpful .was-this-helpful-close:hover{background-color:var(--color-grey);color:#fff}.was-this-helpful .legal-consent-container .hs-form-booleancheckbox-display>span{margin-left:.5rem}.was-this-helpful .legal-consent-container label{align-items:center;display:flex;font-size:.85rem}.was-this-helpful .legal-consent-container a{color:var(--color-spot)}.was-this-helpful .legal-consent-container p{font-size:.85rem}.carousel{--scrollbar-offset:14px;--color-bg:#ccc;--gap:3rem;--track-width:150px;--height:360px;grid-column-gap:1rem;grid-row-gap:1rem;display:grid;grid-template-rows:1fr;height:var(--height);max-width:100%;overflow-x:scroll;overflow-y:hidden;overscroll-behavior-x:contain;padding:1rem;position:relative;scroll-snap-type:x mandatory}@media(min-width:40em){.carousel{--height:680px}}@media(min-width:52em){.carousel{--height:580px}}@media(min-width:64em){.carousel{--height:580px}}.carousel:hover{cursor:grab}.carousel-large{cursor:grab;grid-template-columns:repeat(2,75vw);height:unset}.carousel img{cursor:grab}.carousel.active{scroll-snap-type:unset}.carousel li{display:inline-block;scroll-snap-align:center}.carousel{--scrollbar:var(--color-primary);--scrollbar-track:#f6f6f6;--scrollbar-track-radius:6px;--scrollbar-thumb-radius:10px;--scrollbar-thumb:var(--color-primary-light);--scrollbar-height:8px;--scrollbar-width:8px}.carousel::-webkit-scrollbar{background-color:transparent;height:var(--scrollbar-height);width:var(--scrollbar-width)}.carousel:hover::-webkit-scrollbar{background-color:var(--scrollbar)}.carousel::-webkit-scrollbar-track{background-color:var(--scrollbar-track);border-radius:var(--scrollbar-track-radius)}.carousel::-webkit-scrollbar-thumb{background-color:transparent}.carousel:hover::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:var(--scrollbar-thumb-radius)}code{background-color:#f7fafc;border:1px solid rgba(0,0,0,.05);border-radius:4px;font-size:14px;padding:.15em .2em .05em;white-space:normal;word-break:break-word}.code-pre-wrapper{min-width:calc(100% - 2rem)}.code-pre-wrapper-no-linenumbers{min-width:100%}.code-wrapper:has(::-webkit-scrollbar){background-color:color-mix(in srgb,var(--color-primary),#000 20%)}pre.prism-code{margin-top:0;min-width:calc(100% - 2rem);overflow:auto;white-space:pre;word-break:normal}.button-copy-code{border-radius:6px;box-shadow:0 0 0 2px rgba(0,0,0,.05),0 0 0 1px hsla(0,0%,100%,.1),inset 0 .5px 0 hsla(0,0%,100%,.4);color:color-mix(in srgb,var(--color-primary) 40%,#fff);font-size:.75em;line-height:normal;padding:.25rem .5rem}.button-copy-code.copied{background-color:var(--color-success);color:#fff}.button-copy-code-wrapper{align-items:center;background-color:color-mix(in srgb,var(--color-primary),#000 20%);border-top-left-radius:6px;border-top-right-radius:6px;display:flex;height:32px;justify-content:space-between;padding-left:.25rem;padding-right:.25rem}.button-copy-code-wrapper-title{color:color-mix(in srgb,var(--color-primary) 40%,#fff);display:block;font-size:.75rem;padding:.25rem;text-transform:uppercase}.code-line-numbers{word-wrap:normal;background:#282a36;color:#fff;flex:0 0 2rem;font-family:Roboto-Mono,Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:.875rem;height:calc(100% - 1rem);-webkit-hyphens:none;hyphens:none;line-height:1.5;overflow:hidden;padding:1em;tab-size:4;text-align:left;white-space:nowrap;word-break:normal;word-spacing:normal}[data-line-style=highlighted]{background-color:rgba(0,245,196,.149)}.code-line-numbers-highlights span:last-child{display:none}.button-dropdown-holder{position:relative}.button-dropdown-holder>button:hover{background-color:#f5f5f5;color:initial}.button-dropdown-content,.button-dropdown-holder>button:focus{border:1px solid color-mix(in srgb,var(--color-primary),#000 5%)}.button-dropdown-content{background-color:#fff;border-radius:6px;box-shadow:2.8px 2.8px 2.2px rgba(0,0,0,.02),6.7px 6.7px 5.3px rgba(0,0,0,.028),12.5px 12.5px 10px rgba(0,0,0,.035),22.3px 22.3px 17.9px rgba(0,0,0,.042),41.8px 41.8px 33.4px rgba(0,0,0,.05),100px 100px 80px rgba(0,0,0,.07);left:0;min-width:250px;opacity:0;position:absolute;text-align:left;top:calc(100% + .25rem);transform:scale(.9);transition-duration:.15s;transition-property:transform,opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);visibility:hidden;width:auto;z-index:10}.button-dropdown-content.active{opacity:1;transform:scale(1);visibility:visible}.button-dropdown-content li{display:block}.button-dropdown-content li:first-child>a,.button-dropdown-content li:first-child>button{border-top-left-radius:6px;border-top-right-radius:6px}.button-dropdown-content li:last-child>a,.button-dropdown-content li:last-child>button{border-bottom-left-radius:6px;border-bottom-right-radius:6px}.button-dropdown-content li{align-items:center;display:flex;font-size:.85rem;padding:.75rem 1rem;transition:all .15s}.button-dropdown-content li:first-child{border-top-left-radius:6px;border-top-right-radius:6px}.button-dropdown-content li:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}.button-dropdown-content li:hover{background-color:#f6f6f6}.button-dropdown-content li button{align-items:normal;box-shadow:none;font-family:inherit;font-size:1rem;margin:0;padding:0}.button-dropdown-holder i.ion-ios-checkmark-empty{font-size:2rem;margin-left:auto}.button-dropdown-holder .button i.ion-ios-arrow-down{transform-origin:50% 50%;transition:transform .2s}.button-dropdown-holder.active i.ion-ios-arrow-down{transform:rotate(180deg)}.button-dropdown-content li p{color:var(--color-primary);font-size:1rem;line-height:1.2;text-align:left}.search-container{min-height:80vh}@media(min-width:64em){.search-container{display:grid;grid-template-areas:"leftbar head" "leftbar main";grid-template-columns:360px minmax(0,2fr);grid-template-rows:min-content minmax(0,1fr)}}.search-main{grid-area:main}@media(min-width:64em){.search-sidebar{grid-area:leftbar}.search-sidebar-inner{max-height:calc(100vh - 98px - 2rem);overflow-y:auto;position:sticky;top:calc(98px + 2rem)}}.search-header{background-color:#fff}@media(min-width:64em){.search-header{grid-area:head}}input[type=search].header-search-field{appearance:none;background-color:transparent;background-color:color-mix(in srgb,var(--color-primary),#000 20%);border:none;border-radius:34px;caret-color:var(--color-spot);font-size:2rem;font-size:1.5rem;height:auto;height:68px;line-height:normal;outline:none;padding-left:2rem;padding-right:2rem;position:relative;text-indent:1rem;transition:background-color .4s;width:100%}input[type=search].header-search-field::placeholder{color:color-mix(in srgb,var(--color-primary) 40%,#fff)}input[type=search].header-search-field:focus{color:color-mix(in srgb,var(--color-primary) 40%,#fff)}input[type=search].header-search-field:focus::placeholder{color:color-mix(in srgb,var(--color-primary) 40%,#fff)}.search-loader{display:block;height:28px;margin:1rem;width:28px}.search-loader span{color:var(--color-primary);position:relative}.search-loader span:after{animation:loading .4s linear infinite;border-color:transparent transparent currentcolor currentcolor;border-radius:100%;border-style:solid;border-width:.15rem;content:"";display:block;height:20px;position:absolute;width:20px}.ais-SearchBox-form{position:relative}.ais-SearchBox-form input[type=search]{appearance:none;background-color:#fff;border:1px solid transparent;border-radius:34px;box-shadow:0 4px 8px rgba(6,8,9,.16);caret-color:var(--color-spot);font-size:2rem;font-size:1rem;height:auto;height:38px;line-height:normal;min-width:100%;padding-left:4rem;padding-right:2rem;position:relative;transition:box-shadow .2s}@media(min-width:64em){.ais-SearchBox-form input[type=search]{font-size:1.15rem;height:48px;min-width:600px;padding-left:4rem;padding-right:2rem}}.ais-SearchBox-form input[type=search]:focus{box-shadow:0 4px 8px rgba(6,8,9,.16);outline:none}.ais-SearchBox-form input[type=search]::placeholder{color:#666}.ais-SearchBox-form input[type=search]::-ms-clear,.ais-SearchBox-form input[type=search]::-ms-reveal{display:none;height:0;width:0}.ais-SearchBox-form input[type=search]::-webkit-search-cancel-button,.ais-SearchBox-form input[type=search]::-webkit-search-decoration,.ais-SearchBox-form input[type=search]::-webkit-search-results-button,.ais-SearchBox-form input[type=search]::-webkit-search-results-decoration{display:none}input[type=search]::placeholder{color:#666}.ais-SearchBox-form input[type=search]:not(:placeholder-shown)~.ais-SearchBox-reset{display:block}.ais-SearchBox-reset{background-color:#fff;border-radius:50%;box-shadow:none;color:var(--color-primary-light);display:none;height:28px;height:26px;padding:initial;position:absolute;right:6px;top:6px;transition:background-color .3s;width:26px;z-index:2}@media(min-width:64em){.ais-SearchBox-reset{height:36px;left:556px;right:auto;top:16px;top:6px;width:36px}}.ais-SearchBox-reset:hover{background-color:var(--color-primary);color:#fff}.ais-SearchBox-resetIcon{fill:currentColor}.ais-SearchBox-submit{display:none}.search-icon{fill:var(--color-primary);left:26px;position:absolute;top:8px;z-index:2}@media(min-width:64em){.search-icon{top:12px}}.search-loading-indicator{position:absolute;position:relative;right:1.5rem;top:0;z-index:2}.search-loading-indicator.active:after{animation:loading .3s linear infinite;border-color:transparent transparent currentcolor currentcolor;border-radius:100%;border-style:solid;border-width:.15rem;content:"";display:block;height:16px;left:calc(50% - 8px);position:absolute;top:calc(50% - 8px);width:16px}@keyframes loading{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.ais-Hits-list{list-style:none;margin:0;padding:0}.ais-Highlight-highlighted{background-color:#fafad2}.ais-Hits-item a{color:var(--color-primary);display:block}.ais-Hits-item a:hover{background-color:#f6f6f6;text-decoration:none}.hit-icon{font-size:3rem}.HitCount{margin-bottom:1.5rem;margin-top:1rem}.hit-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;line-clamp:2;display:-webkit-box;overflow:hidden;width:min(75%,600px)}.ais-Hits-item img{box-shadow:0 4px 8px rgba(6,8,9,.16)}.ais-Pagination{margin-bottom:2rem}.ais-Pagination-list{-webkit-overflow-scrolling:touch;display:flex;gap:.5rem;list-style:none;margin:0 auto;overflow-x:scroll;padding:0;white-space:nowrap}@media(min-width:64em){.ais-Pagination-list{flex-wrap:wrap;overflow-x:initial}}.ais-Pagination-link{align-items:center;border-radius:50%;color:#000;cursor:pointer;display:flex;height:38px;justify-content:center;text-decoration:none;width:38px}.ais-Pagination-link:hover{text-decoration:none}.ais-Pagination-link--selected,.ais-Pagination-link:hover{background-color:var(--color-spot);color:#fff}.ais-RefinementList-list{display:flex;flex-direction:column;flex-wrap:wrap;list-style:none;margin:0 0 2rem;padding:0}.ais-RefinementList-item{flex:0 0 100%;margin-bottom:.5rem;margin-right:1rem}@media(min-width:64em){.ais-RefinementList-item{margin-right:0}}.ais-RefinementList-list.ais-CurrentRefinements-list--noRefinement{margin-bottom:0}.ais-RefinementList-label{align-items:center;display:flex;line-height:2}.ais-RefinementList-labelText{line-height:1;margin-left:.25rem;overflow-wrap:break-word}.ais-CurrentRefinements-item,.ais-CurrentRefinements-list{display:flex;flex-direction:column}.ais-CurrentRefinements-category{align-items:center;background-color:transparent;border:.075rem solid var(--color-primary-light);border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top-left-radius:4px;border-top-right-radius:4px;color:var(--color-primary-light);display:inline-flex;font-size:.6em;justify-content:space-between;overflow:hidden;width:max-content}.ais-CurrentRefinements-category:not(:last-child){margin-bottom:.5rem;margin-right:.5rem}@media(min-width:52em){.ais-CurrentRefinements-category{font-size:.6em}}.ais-CurrentRefinements-categoryLabel{padding:.1rem .5rem}.ais-CurrentRefinements-delete{background-color:color-mix(in srgb,var(--color-primary) 50%,#fff);border:none;border-left:.075rem solid var(--color-primary-light);border-radius:0;box-shadow:none;color:var(--color-primary);font-size:.75rem;padding:.1rem .5rem}.ais-CurrentRefinements-delete:active,.ais-CurrentRefinements-delete:focus{background-color:transparent;box-shadow:none;color:var(--color-primary)}.ais-CurrentRefinements-delete:hover{background-color:color-mix(in srgb,var(--color-primary),#000 6%);box-shadow:none;color:#fff}.ais-CurrentRefinements-list{list-style:none;margin:0;padding:0}.ais-CurrentRefinements-label{display:none}.ais-RefinementList-item--selected .ais-RefinementList-labelText,.ais-RefinementList-label:hover .ais-RefinementList-labelText{color:var(--color-spot)}.ais-ClearRefinements-button--disabled,.ais-CurrentRefinements--noRefinement{display:none}.ais-ClearRefinements-button{background-color:var(--color-primary);color:#fff;font-size:.75em;margin-bottom:2rem;margin-top:2rem;min-height:24px;padding:.1rem .75rem}.ais-ClearRefinements-button:disabled{opacity:.25}.ais-ClearRefinements-button:active,.ais-ClearRefinements-button:hover{background-color:var(--color-primary-light);box-shadow:none;color:#fff}.ais-ClearRefinements-button:active .icon,.ais-ClearRefinements-button:hover .icon{color:#fff}.ais-RefinementList-count{-webkit-font-smoothing:antialiased;align-items:center;align-self:center;background-color:#eee;border:#ddd;border-radius:1rem;color:#fff;color:#666;display:inline-flex;font-family:var(--font-bold);font-size:.75rem;height:24px;justify-content:space-between;letter-spacing:.025em;line-height:1;margin-left:.25rem;padding:0 .5rem;text-rendering:optimizeLegibility;text-transform:uppercase}.ais-RefinementList-count:hover{background-color:color-mix(in srgb,#eee,#000 10%)}body{margin-top:98px}.header[role=banner]{background-color:color-mix(in srgb,var(--color-primary),#000 50%);left:0;position:fixed;top:0;width:100%;z-index:100}.header-top{height:50px}.header-top ul{gap:.5rem}.header-top ul.first-level{align-items:center;display:flex;height:100%;justify-content:center}.header-top ul{font-size:unset}.header-top ul.first-level li{align-items:center;height:100%;justify-content:center}.header-top .first-level>li:not(.header-top-link-hamburger){display:none}@media(min-width:84em){.header-top .first-level>li:not(.header-top-link-hamburger){display:inline-flex}}.header-top ul .header-nav-demo{display:none}@media(min-width:100em){.header-top ul .header-nav-demo{display:inline-flex}}.header-nav-login-text-label,.header-top ul:first-of-type>li.header-nav-search span{display:none}@media(min-width:100em){.header-nav-login-text-label,.header-top ul:first-of-type>li.header-nav-search span{display:inline-block}}.header-top .header-nav-trial{display:none}@media(min-width:84em){.header-top .header-nav-trial{display:inline-flex}}.header-top ul .header-nav-demo,.header-top ul .header-nav-trial{white-space:nowrap}.header-top ul:first-of-type>li.header-top-link-hamburger{display:inline-flex}@media(min-width:84em){.header-top ul:first-of-type>li.header-top-link-hamburger{display:none}}.header-top ul:first-of-type>li.header-top-link-hamburger button{padding-left:0;padding-right:0}.header-top ul:first-of-type>li a{align-items:center;display:inline-flex}.header-top ul:first-of-type>li a:not(.dropdown-content-link){justify-content:center}.header-top>.container{position:relative}@media(min-width:52em){.header-top>.container{max-width:2400px}}.intro{align-items:center;background-color:#000;display:flex;justify-content:center;min-height:50vh;position:relative}.intro,.intro-full,.intro-full .intro-full{height:auto}@media(min-width:74em){.intro-full,.intro-full .intro-full{min-height:calc(100vh - 98px)}}@media(min-width:40em){.intro-medium,.intro-medium .intro-overlay{min-height:70vh}}@media(min-width:74em){.intro-mediumlow,.intro-mediumlow .intro-overlay{min-height:55vh}.intro-large,.intro-large .intro-overlay{min-height:75vh}}.intro-low,.intro-low .intro-overlay{min-height:25vh}@media(min-width:74em){.intro-low,.intro-low .intro-overlay{min-height:35vh}}.intro-tiny,.intro-tiny .intro-overlay{min-height:15vh}@media(min-width:74em){.intro-tiny,.intro-tiny .intro-overlay{min-height:25vh}}.intro-overlay{align-items:center;background-size:100%;display:flex;height:100%;min-height:50vh;padding-bottom:2rem;padding-top:2rem;width:100%}.intro-full .intro-overlay{min-height:calc(100vh - 98px)}.intro h1{text-wrap:balance;font-family:var(--font-extra-bold)}.intro-copy .h1,.intro-copy h1{font-size:clamp(2.25rem,1.99rem + 1.3vw,4.75rem);letter-spacing:.005em}.intro-copy h2{font-size:.95rem;line-height:1.5}@media(min-width:52em){.intro-copy h2{font-size:1.5rem}}.intro-copy p{font-size:clamp(1rem,1.114rem + .18vw,1.5rem);line-height:1.5}@media(min-width:52em){.intro-copy p{line-height:1.75}}.intro-copy h1,.intro-copy h2,.intro-copy p{color:#fff}.intro-copy .intro-subheading{color:var(--color-primary)}.intro-link{color:#fff;transition:.4s ease;vertical-align:middle}.intro-link:hover{text-decoration:none;transform:translateY(-.25rem)}.intro .intro-overlay{background-image:linear-gradient(45deg,color-mix(in srgb,var(--color-primary),#000 38%) 0,color-mix(in srgb,var(--color-primary),#000 18%) 66%,color-mix(in srgb,var(--color-primary),#000 16%) 100%)}.tokenservice .intro .intro-overlay{background-image:url(/images/bg-lines-green.svg),linear-gradient(13deg,color-mix(in srgb,var(--color-primary),#000 70%) 0,color-mix(in srgb,var(--color-primary),#000 40%) 70%,var(--color-resources-develop) 100%)}.authentication .intro .intro-overlay,.tokenservice .intro .intro-overlay{background-color:#20242e;background-position:50%;background-repeat:no-repeat;background-size:40%,cover}.authentication .intro .intro-overlay{background-image:url(/images/bg-lines-magenta.svg),linear-gradient(13deg,color-mix(in srgb,var(--color-primary),#000 70%) 0,color-mix(in srgb,var(--color-primary),#000 40%) 70%,#d859a1 100%)}.usermanagement .intro .intro-overlay{background-image:url(/images/bg-lines-yellow.svg),linear-gradient(13deg,color-mix(in srgb,var(--color-primary),#000 70%) 0,color-mix(in srgb,var(--color-primary),#000 40%) 70%,var(--color-tertiary) 100%)}.alarms .intro .intro-overlay,.usermanagement .intro .intro-overlay{background-color:#20242e;background-position:50%;background-repeat:no-repeat;background-size:40%,cover}.alarms .intro .intro-overlay{background-image:url(/images/bg-lines-blue.svg),linear-gradient(13deg,color-mix(in srgb,var(--color-primary),#000 70%) 0,color-mix(in srgb,var(--color-primary),#000 40%) 70%,#ad2020 100%)}.intro-wrapper{display:flex;flex-direction:column;margin:0 auto;max-width:100em;padding-left:1rem;padding-right:1rem;width:100%}@media(min-width:52em){.intro-wrapper{align-items:center;flex-direction:row;flex-wrap:wrap;justify-content:center;padding-left:2rem;padding-right:2rem}}@media(min-width:64em){.intro-wrapper{flex-direction:row}}@media(min-width:140em){.intro-wrapper{max-width:120em}}.plans .intro-wrapper{max-width:90%}.intro-presentation{flex:0 0 100%;order:2}@media(min-width:64em){.intro-presentation{flex:0 0 50%;order:1;text-align:initial}}.intro-animation{flex:0 0 100%;order:1}@media(min-width:64em){.intro-animation{flex:0 0 50%;order:2}}.intro-section .intro-overlay{padding-top:calc(64px + 1rem)}@media(min-width:52em){.intro-section .intro-overlay{padding-top:calc(96px + 1rem)}}.intro-section svg{stroke:#fff;border-radius:4px;border-top-left-radius:0;border-top-right-radius:0;box-shadow:0 5px 15px 0 rgba(112,128,175,.2);height:64px;left:calc(50% - 32px);margin:0 auto;padding:1rem;position:absolute;top:0;width:64px}@media(min-width:52em){.intro-section svg{height:96px;left:calc(50% - 48px);width:96px}}.intro-order{display:flex;flex-direction:column}.intro-order-copy{order:2}@media(min-width:52em){.intro-order-copy{order:1}}.intro-order-benefits{order:3}@media(min-width:52em){.intro-order-benefits{order:2}}.intro-order-cta{order:1}@media(min-width:52em){.intro-order-cta{order:3}}.intro-subheading-logos img{filter:grayscale(1) contrast(.2) brightness(.85) sepia(1) hue-rotate(180deg) saturate(1);position:relative}.intro-animation-start figure{align-items:center;display:none;justify-content:flex-end;margin:0 auto}@media(min-width:64em){.intro-animation-start figure{display:none}@supports(offset-distance:100%){.intro-animation-start figure{display:flex}}}.intro-animation-start-image{display:block}@media(min-width:64em){.intro-animation-start-image{display:none}@supports not (offset-distance:100%){.intro-animation-start-image{display:block}}}.intro.intro-careers .intro-overlay{background-blend-mode:overlay;background-color:color-mix(in srgb,var(--color-primary),#000 20%);background-image:url(/images/careers/careers-intro.jpg);background-position:center 55%;background-size:cover}.intro.intro-careers-interview .intro-overlay{background-blend-mode:overlay;background-color:color-mix(in srgb,var(--color-primary),#000 15%);background-image:url(/images/careers/intro-careers-interview.webp);background-position:center 40%;background-size:cover}.intro.intro-careers-how-we-hire .intro-overlay{background-blend-mode:overlay;background-color:var(--color-primary);background-image:url(/images/careers/intro-careers-how-we-hire.jpg);background-position:center 80%;background-size:cover}.intro.intro-careers-whoweare .intro-overlay{background-blend-mode:overlay;background-image:url(/images/careers/intro-careers-who-we-are.jpg)}.intro.intro-careers-whoweare .intro-overlay,.intro.intro-careers-working-at-curity .intro-overlay{background-color:color-mix(in srgb,var(--color-primary),#000 18%);background-position:center 80%;background-size:cover}.intro.intro-careers-working-at-curity .intro-overlay{background-blend-mode:overlay;background-image:url(/images/careers/intro-careers-working-at-curity.jpg)}.intro.intro-careers-job .intro-overlay{background-blend-mode:overlay;background-color:color-mix(in srgb,var(--color-primary),#000 18%);background-image:url(/images/careers/intro-careers-job.jpg);background-position:center 20%;background-size:cover}.intro .intro-overlay{background-color:#20242e;background-image:url(/images/bg-lines-magenta.svg);background-position:50%;background-repeat:no-repeat;background-size:40%}section.section h2:first-of-type svg{cursor:pointer;opacity:0}section.section h2:first-of-type:hover svg{opacity:1}.customer-intro-logo{align-items:center;border:none;border:4px solid rgba(var(--color-primary),.25);border-radius:50%;display:flex;justify-content:center;position:absolute}.customer-story-item,a.customer-story-item{background-color:#fff;transition:box-shadow .2s ease-in-out 0s}.customer-story-item-card{box-shadow:0 2px 8px 0 rgba(99,99,99,.2);position:relative}.card-circled-link{align-items:center;background-color:#fff;border-radius:50%;bottom:2rem;box-shadow:0 3px 8px 0 rgba(0,0,0,.12);display:flex;height:48px;justify-content:center;opacity:0;position:absolute;right:2rem;transform:translateY(1rem);transition:all .6s var(--ease-out-expo);width:48px}.card-circled-link,.card-circled-link:hover{color:var(--color-primary)}.customer-story-item-card:hover .card-circled-link{opacity:1;transform:translateY(0)}.customer-story-item-card h3:before{color:var(--color-spot);font-family:Cambria,Cochin,Georgia,Times,Times New Roman,serif;font-size:5rem;position:absolute}.customer-story-item-card h3{position:relative}.customer-story-item-card h3>div{-webkit-box-orient:vertical;-webkit-line-clamp:4;line-clamp:4;display:-webkit-box;overflow:hidden;width:90%}@media(min-width:52em){.customer-story-item-card h3>div{-webkit-line-clamp:6}}@media(min-width:74em){.customer-story-item-card h3>div{-webkit-box-orient:initial;-webkit-line-clamp:none;display:initial;overflow:initial;width:auto}}.customer-story-item-card h3:before{content:"“";left:-2rem;top:-2rem}.customer-story-item-card p,a.customer-story-item-card p{line-height:unset}.customer-story-item-image-wrapper img{display:block;height:240px;object-fit:cover;width:100%}@media(min-width:52em){.customer-story-item-image-wrapper img{border-bottom-left-radius:14px;border-top-left-radius:14px;border-top-right-radius:0;height:100%}}.customer-story-item-content p{position:relative}.customer-story-item-image-credit{bottom:10px;position:absolute;right:10px}.customer-story-item-image-credit .icon{opacity:.5}.customer-story-item-image-credit:hover .icon{opacity:1}.customer-story-item.customer-story-item-single{box-shadow:none}@media(min-width:52em){.customer-story-item.customer-story-item-single{display:grid;grid-template-columns:1.5fr 2fr}}.customer-story-item-single .customer-story-item-image img{border-bottom-left-radius:0;border-top-left-radius:0;object-fit:cover}@media(min-width:52em){.customer-story-item-single .customer-story-item-image img{border-bottom-left-radius:0;border-bottom-right-radius:80px;border-top-left-radius:0}}.customer-story-item-single .customer-story-item-content p:after,.customer-story-item-single .customer-story-item-content p:before{display:none}.footer{background-position:90% 15%;background-size:20%;overflow:hidden;padding-bottom:2rem;position:relative}@media(min-width:84em){.footer{padding-bottom:16rem}}.footer-lines{bottom:-60px;height:360px;left:0;pointer-events:none;position:absolute;width:100%;z-index:0}@media(min-width:84em){.footer-lines{background-image:url(/images/footer-lines.svg);background-repeat:no-repeat;background-size:100%}}@media(min-width:140em){.footer-lines{background-position:calc(100% + 1rem) bottom;background-size:cover;bottom:-100px;height:560px}}.footer li a{display:block;font-size:.85rem;padding:.35rem 0}.footer [itemprop],.footer address,.footer h3,.footer h4,.footer li,.footer li a,.footer p,.footer small,.footer ul{color:color-mix(in srgb,var(--color-primary) 30%,#fff)}.footer .newsletter-privacy-validation small{color:red}.footer h4{color:#fff;font-family:Roboto-Medium;font-size:.85rem;letter-spacing:.025rem;text-transform:uppercase}.footer a:hover{color:#fff}.footer-logo{max-width:120px}@media(min-width:52em){.footer-logo{max-width:160px}}.footer-container{grid-gap:2rem;display:grid;grid-template-columns:repeat(1,minmax(0,1fr))}@media(min-width:64em){.footer-container{grid-template-columns:minmax(500px,1fr) 1fr 1fr 1fr 1fr}}.footer-social{grid-gap:1rem;display:grid;grid-template-columns:repeat(4,minmax(0,48px))}.footer-social li a{padding:0}.footer-social svg:hover path{fill:#fff}.section{padding:2rem 0}@media(min-width:64em){.section{padding:3rem 2rem}}.legal .section:not(.section-getstarted){padding:0}.section-sm{padding:2rem 0}@media(min-width:64em){.section-sm{padding:2rem 1rem}}.section-xl{padding:2rem 0}@media(min-width:64em){.section-xl{padding:4rem}}.section-xxl{padding:2rem 0}@media(min-width:64em){.section-xxl{padding:8rem 2rem}}.section-bottom-overflow{padding-bottom:0}.section-white{background-color:#fff}.section-light{background-color:#f6f6f6}.section-alarms{background-color:#fdf7f7}.section-dark{background-color:color-mix(in srgb,var(--color-primary),#000 70%)}.section-primary{background-color:color-mix(in srgb,var(--color-primary),#000 50%)}.section-primary-light{background-color:color-mix(in srgb,var(--color-primary),#000 40%)}.section-green{background-color:color-mix(in srgb,var(--color-resources-develop),#fff 45%)}.section-dotted{background-attachment:fixed;background-image:radial-gradient(#ddd 1px,transparent 0),radial-gradient(#ddd 1px,transparent 0);background-position:0 0,25px 25px;background-size:50px 50px}@media(min-width:64em){.section-boxbg{background-image:url(/images/emptybox.svg);background-position:left 120%;background-repeat:no-repeat;background-size:110%}.section-boxbg-fixed{background-position:left -1000px}.section-rounded{border-bottom-left-radius:80% 20%;border-bottom-right-radius:80% 20%}}.section-featured{background-image:linear-gradient(90deg,#eaebef,#fff);position:relative}.section-featured:before{background:linear-gradient(-45deg,#b9dcf2,#f6cfbe);filter:blur(20px);opacity:var(.7);transform:translate3d(0,20px,0) scale(.95);transition:opacity .3s}.section-featured:after,.section-featured:before{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:-1}.section-featured:after{background:inherit;border-radius:8px}.section-unique-combination{padding-top:calc(180px + 3vmin)}@media(min-width:74em){.section-unique-combination{padding-top:calc(480px + 3vmin)}}.unique-combination-image{--width:25em;--height:auto;height:var(--height);left:calc(50% - var(--width)/2);object-fit:contain;opacity:.7;pointer-events:none;position:absolute;top:6vmin;width:var(--width);z-index:1}@media(min-width:74em){.unique-combination-image{--width:60em}}.section-deploy-anywhere{padding-top:calc(180px + 3vmin)}@media(min-width:74em){.section-deploy-anywhere{padding-top:calc(380px + 3vmin)}}.deploy-anywhere-image{--width:25em;--height:auto;height:var(--height);left:calc(50% - var(--width)/2);object-fit:contain;pointer-events:none;position:absolute;top:6vmin;width:var(--width);z-index:1}@media(min-width:74em){.deploy-anywhere-image{--width:60em}}.section-unique-combination .fade:not(:last-child):before{--size:120px;background-image:url(/images/start/card-arrow.svg);background-position:50%;background-repeat:no-repeat;background-size:var(--size);content:"";display:none;height:var(--size);position:absolute;right:calc(var(--size)/3*-1);top:calc(50% - var(--size)/2);width:var(--size);z-index:1}@media(min-width:74em){.section-unique-combination .fade:not(:last-child):before{display:block}}.tab-group{--radius:8px;margin-bottom:1rem;margin-top:1rem}.tab-group>[role=tablist]{-webkit-overflow-scrolling:touch;align-self:center;background-color:#f0f3f9;border:1px solid #dcdfe4;border-radius:var(--radius);display:flex;gap:.25rem;list-style:none;margin-bottom:1rem;overflow-x:auto;padding:.25rem;position:relative}@media(min-width:74em){.tab-group>[role=tablist]{margin-bottom:2rem;overflow-x:initial;width:min-content}}.tab-group-center>[role=tablist]{margin:0 auto 2rem}.tab-group>[role=tablist]>button{align-items:center;border-radius:calc(var(--radius)/1.5);box-shadow:none;color:var(--color-primary);display:inline-flex;justify-content:flex-start;padding:.25rem 1.5rem;position:relative;transition:box-shadow .2s,border-color .2s,background-color .2s;white-space:nowrap}.tab-group>[role=tablist]>button:hover{background-color:#e7eaf1}.tab-group>[role=tablist]>button.active{background-color:#fff;color:var(--color-primary);outline:none}.tab-group>[role=tablist]>button.active:before,.tab-group>[role=tablist]>button.active:hover{color:var(--color-primary)}.tab-group>div[data-item]{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);background-color:#fff;color:var(--color-paragraphs);font-size:.85rem;font-weight:300;height:1px;line-height:1.85;overflow:hidden;overflow-x:auto;position:absolute;white-space:nowrap;width:1px;z-index:1}.tab-group>div[data-item].active{clip:unset;height:unset;position:relative;white-space:unset;width:unset;z-index:2}@media(min-width:52em){.tab-group>div[data-item]{white-space:normal}.tab-group>div[data-item].active{overflow-x:initial}}@media(min-width:64em){.tab-group>div[data-item]{font-size:1rem}}.tab-group-files [role=tablist]{align-items:center;background-color:#2a2f3a;border:1px solid #2a2f3a;border-radius:0;display:flex;justify-content:flex-start;margin-bottom:0;padding:0}.tab-group-files [role=tablist]>button{background-color:color-mix(in srgb,var(--color-primary),#000 50%);border-radius:0;border-top-left-radius:var(--radius);border-top-right-radius:var(--radius);color:var(--color-primary-light);font-family:Roboto Mono,Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:.85rem;height:auto;padding:.5rem 1.5rem;text-transform:none}.tab-group-files [role=tablist]>button:hover{background-color:transparent;color:var(--color-tertiary)}.tab-group-files [role=tablist]>button.active{border-bottom:none}.tab-group-files [role=tablist]>button.active:hover{background-color:transparent;color:var(--color-tertiary)}.tab-group-files>[role=tablist]{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.tab-group-files>[role=tablist]>button:not(:last-child){margin-right:0}.tab-group-files [role=tablist]>button.active{background-color:transparent;color:#fff}.tab-group-files>div[data-item] .button-copy-code-wrapper-title{display:none}.tab-group-files>div .button-copy-code-wrapper{border-radius:0}.tab-group-dark>[role=tablist]{background-color:transparent;border:1px solid color-mix(in srgb,var(--color-primary) 5%,#fff)}.tab-group-dark>div[data-item]{background-color:transparent}.tab-group-dark>[role=tablist]>button{background-color:transparent;color:#fff}.tab-group-dark>[role=tablist]>button:hover{background-color:color-mix(in srgb,var(--color-primary),#000 10%);color:#fff}.tab-group-dark>[role=tablist]>button.active{background-color:color-mix(in srgb,var(--color-primary),#000 55%);color:#fff}.tab-group-dark>[role=tablist]>button.active:hover{background-color:color-mix(in srgb,var(--color-primary),#000 25%);color:#fff}.tab-group-primary>[role=tablist]{background-color:transparent;border:1px solid color-mix(in srgb,var(--color-primary) 45%,#fff)}.tab-group-primary>[role=tablist]>button{background-color:transparent}.tab-group-primary>[role=tablist]>button:hover{background-color:color-mix(in srgb,var(--color-primary),#000 0);color:#fff}.tab-group-primary>[role=tablist]>button:active{background-color:#fff}.tab-group-primary>[role=tablist]>button.active{background-color:color-mix(in srgb,var(--color-primary),#000 6%)}.tab-group-primary>[role=tablist]>button.active:hover{background-color:color-mix(in srgb,var(--color-primary),#000 40%)}.faq-question{border-bottom:1px solid #f0f0f0;border-radius:8px;cursor:pointer;padding:1rem;text-align:initial;transition:background-color .2s ease-in-out}@media(min-width:74em){.faq-question{padding:2rem}}.faq-question h2{-webkit-user-select:none;user-select:none}.faq-question a{color:var(--color-spot)}.faq-question.active{background-color:#fafafa}.faq-question.active.faq-highlighted{background-color:rgba(216,89,161,.2);border-radius:6px}.faq-question.active.faq-highlighted:hover{background-color:rgba(216,89,161,.4)}.faq-question-chevron{align-items:center;border-radius:50%;color:var(--color-spot);display:flex;flex:0 0 30px;font-size:.85rem;height:30px;justify-content:center;margin-right:16px;transition:transform .15s;width:30px}@media(min-width:74em){.faq-question-chevron{flex:0 0 40px;height:40px;margin-right:20px;width:40px}}.faq-question-chevron .ion-chevron-down{transform:translateY(2px);transform-origin:center center;transition:transform .3s ease-in-out}.faq-question:hover{background-color:#fafafa}.faq-question .button-transparent{opacity:0}.faq-question.active:hover .button-transparent{opacity:1}.faq-question:hover .faq-question-chevron{transform:scale(1.1)}.faq-question.active .faq-question-chevron{border:2px solid var(--color-spot)}.faq-question.active .faq-question-chevron .ion-chevron-down{transform:rotate(180deg)}.faq-answer{margin-top:.5rem}@media(min-width:74em){.faq-answer{margin-top:1rem}}.faq-categories{position:sticky;top:calc(168px + 1rem)}.faq-categories .scroller ul a{padding:.25rem}.faq-categories .scroller ul a:hover{background-color:#fafafa;text-decoration:none}.faq-categories .scroller li{white-space:nowrap}@media(min-width:74em){.faq-categories .scroller li{justify-content:center}}body.resources{margin-top:calc(100vh - 98px)}body.contact{background-color:color-mix(in srgb,var(--color-primary),#000 70%)}.contact-layout{grid-gap:2rem;display:grid;margin:0 auto;max-width:90em;padding-top:2rem}.contact-layout-right{grid-template-columns:1fr;grid-template-rows:repeat(6,auto)}@media(min-width:64em){.contact-layout-right{grid-template-columns:1.5fr 2.25fr;grid-template-rows:1fr 1fr;padding-bottom:4rem;padding-top:4rem}}.contact-layout-left{grid-template-columns:1fr;grid-template-rows:repeat(6,auto)}@media(min-width:64em){.contact-layout-left{grid-template-columns:2.25fr 1.5fr;grid-template-rows:1fr 1fr;padding-bottom:4rem;padding-top:4rem}}.contact-layout-center{grid-template-columns:1fr;grid-template-rows:repeat(6,auto);max-width:50em}@media(min-width:64em){.contact-layout-center{grid-template-columns:1fr;padding-bottom:4rem;padding-top:4rem}.contact-layout-left .benefit{grid-column-end:2;grid-column-start:2;grid-row-end:2;grid-row-start:1}.contact-layout-right .benefit{grid-column-end:2;grid-column-start:1;grid-row-end:2;grid-row-start:1}}.contact-layout-center .benefit{order:1}.contact-layout-left .hq{grid-area:5/1/6/2}@media(min-width:64em){.contact-layout-left .hq{align-self:end;grid-column-end:2;grid-column-start:2;grid-row-end:2;grid-row-start:3}}.contact-layout-right .hq{grid-area:5/1/6/2}@media(min-width:64em){.contact-layout-right .hq{align-self:end;grid-column-end:1;grid-column-start:1;grid-row-end:2;grid-row-start:3}}.contact-layout-center .hq{order:3}.contact-layout-left .form{grid-area:2/1/5/2}@media(min-width:64em){.contact-layout-left .form{grid-column-end:1;grid-column-start:1;grid-row:1/span 2}}.contact-layout-right .form{grid-area:2/1/5/2}@media(min-width:64em){.contact-layout-right .form{grid-column-end:2;grid-column-start:2;grid-row:1/span 2}}.contact-layout-center .form{order:2}.contact-layout aside li{font-size:1.25rem;line-height:1.5}.contact-layout aside li:before{border-radius:50%;color:var(--color-spot);content:"";font-family:Ionicons;font-size:1.5rem;margin-inline-end:1ch;padding-inline:1ch}.contact .contact-layout form{background-color:#fff;border-radius:6px;padding:2rem}@media(min-width:40em){.contact form .grid-container{column-gap:1rem;display:grid;grid-template-columns:140px 2fr}}.contact form input[type=email],.contact form input[type=text],.contact form textarea{background-color:#f8f8f8}@media(min-width:40em){#contact_form #reason{grid-gap:.5rem;display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}}#contact_form #reason label{border:1px solid rgba(0,0,0,.125);border-radius:6px;cursor:pointer;display:block;padding:.5rem;transition:background-color .2s ease-in-out,border-color .2s ease-in-out;width:100%}#contact_form #reason label input{margin-right:.5rem}#contact_form #reason label.active,#contact_form #reason label:hover{border:1px solid var(--color-spot)}@media(min-width:40em){#contact_form #reason label{align-items:center;display:flex}}.contact-hq-info h3{color:#fff}.contact-hq-info .paragraph,.contact-hq-info a,.contact-hq-info address{color:color-mix(in srgb,var(--color-primary) 20%,#fff);font-size:.9rem}.contact-hq-info *{line-height:1.5}.contact-hq-info a{color:color-mix(in srgb,var(--color-primary) 20%,#fff)}.contact .form .grid-container{grid-row-gap:0}@media(min-width:64em){.contact .form .grid-container{grid-row-gap:1rem}}.intro-start-rive-animation{aspect-ratio:1/1;display:none;height:clamp(300px,60vw,100%);max-width:100%;width:clamp(300px,60vw,100%)}@media(min-width:64em){.intro-start-rive-animation{display:block}}.intro-start-rive-animation-mobile{aspect-ratio:1/1;display:block;height:clamp(300px,60vw,100%);max-width:100%;width:clamp(300px,60vw,100%)}@media(min-width:64em){.intro-start-rive-animation-mobile{display:none}}.intro-dci-rive-animation{aspect-ratio:13/10;height:clamp(300px,60vw,100%);max-width:100%;width:clamp(300px,60vw,100%)}.dci-start-animation{aspect-ratio:3/2;height:clamp(150px,60vw,300px);max-width:100%;width:clamp(600px,60vw,400px)}.vci-rive-animation{aspect-ratio:16/9;height:clamp(300px,80vw,100%);max-width:100%;position:relative;width:clamp(300px,80vw,100%)}.vci-rive-animation:after{background-color:#1d1f28;bottom:0;content:"";height:10%;position:absolute;right:0;width:506px;z-index:1}.bg-line-pattern{background-color:#20242e;background-position:50%;background-repeat:no-repeat;background-size:40%}.bg-line-pattern-dark{background-color:#1c1f28}.bg-line-pattern-magenta,.bg-line-pattern-magenta-light{background-image:url(/images/bg-lines-magenta.svg)}.bg-line-pattern-magenta-light{background-color:#fff}.bg-line-pattern-primary,.bg-line-pattern-primary-light{background-image:url(/images/bg-lines-blue.svg)}.bg-line-pattern-primary-light{background-color:#fff}.bg-line-pattern-yellow,.bg-line-pattern-yellow-light{background-image:url(/images/bg-lines-yellow.svg)}.bg-line-pattern-yellow-light{background-color:#fff}.bg-line-pattern-green{background-image:url(/images/bg-lines-green.svg)}.zoom-card{align-items:center;background-color:rgba(0,0,0,.25);border-radius:6px;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;visibility:hidden;z-index:10}.zoom-card,.zoom-card-content{opacity:0;overflow:hidden;transition:opacity .2s ease-in-out}.zoom-card-content{background-color:#fff;border-radius:8px;box-shadow:0 50px 100px -20px rgba(50,50,93,.25),0 30px 60px -30px rgba(0,0,0,.3),0 -18px 60px -10px rgba(0,0,0,.025);max-width:300px;min-width:200px;width:90%;will-change:opacity}@media(min-width:40em){.zoom-card-content{max-width:600px;min-width:300px}}.zoom-card-active{opacity:1;visibility:visible}.zoom-card-active .zoom-card-content{opacity:1}.zoom-card-content header{align-items:center;border-bottom:1px solid #ccc;display:flex;justify-content:space-between;padding:1rem 1.5rem}.zoom-card-content header .button-transparent:hover{background-color:transparent}.zoom-card-content header .icon{align-items:center;border-radius:50%;color:#ccc;cursor:pointer;display:flex;font-size:1rem;height:34px;justify-content:center;transition:background-color .3s ease;width:34px}.zoom-card-content header .icon:hover{background-color:var(--color-grey);color:#fff}.zoom-card-content main{padding:2rem}[zoom-card-open]{cursor:pointer;position:relative}.oauth-tools{--start-color:#ebdbf1;--end-color:hotpink;--border-width:5px;--bg-color:#22232f}.oauth-tools header~.section{content-visibility:unset}.oauth-tools .section h1,.oauth-tools .section h2,.oauth-tools .section h3{-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-image:linear-gradient(90deg,var(--start-color),var(--end-color));font-family:var(----font-bold)}.oauth-tools h1{letter-spacing:-.01em}@media(min-width:74em){.oauth-tools h1{font-size:5rem}}.oauth-tools{background-color:var(--bg-color)}.oauth-tools-isometric{display:none;height:auto;object-fit:contain;opacity:.7;position:absolute;right:0;top:10vh;width:35vw;z-index:1}@media(min-width:52em){.oauth-tools-isometric{display:block}}.oauth-tools-swoosh{height:auto;left:-12vw;object-fit:cover;position:absolute;top:15vh;width:30vw;z-index:1}.oauth-tools-app-icons svg{max-height:60px;max-width:80px}.oauth-tools-app-icons svg:first-of-type{margin-right:.2rem}.oauth-tools-app-icons svg *{fill:#fff}.unique-combination-video{margin:0 auto;max-width:480px}@media(min-width:64em){.unique-combination-video{flex:0 0 50%;max-width:unset}}.logo-parade{--gap:3rem;--track-width:150px;--height:100px;display:flex;gap:var(--gap);overflow:hidden;position:relative;-webkit-user-select:none;user-select:none}.logo-parade-content{--scroll-speed:30s;animation-play-state:paused;display:flex;flex-shrink:0;gap:var(--gap);justify-content:space-around;list-style:none;min-width:100%}.enable-animation .logo-parade-content{animation:scroll var(--scroll-speed) linear infinite}@keyframes scroll{0%{transform:translateX(0)}to{transform:translateX(calc(-100% - var(--gap)))}}.logo-parade:after,.logo-parade:before{content:"";height:var(--height);position:absolute;width:var(--track-width);z-index:2}@media(min-width:600px){.logo-parade:after,.logo-parade:before{background:linear-gradient(90deg,#fff 0,hsla(0,0%,100%,0))}}.logo-parade:after{right:0;top:0;transform:rotate(180deg)}.logo-parade:before{left:0;top:0}.landing-form-layout-container .intro-animation{display:none}@media(min-width:74em){.landing-form-layout-container .intro-animation{display:block}}.landing-form-layout-container .intro-presentation{flex:0 0 100%;order:2;text-align:center}@media(min-width:74em){.landing-form-layout-container .intro-presentation{flex:0 0 50%;order:1;text-align:initial}}@media(min-width:52em){.landing-form-layout-container .intro-wrapper{padding-left:4rem;padding-right:4rem}}.landing-form-layout-container .intro-presentation{text-align:initial}@media(min-width:52em){.landing-form-layout-container .intro-presentation{flex:0 0 80%}}@media(min-width:64em){.landing-form-layout-container .intro-presentation{flex:0 0 80%;order:1;padding-bottom:4rem;padding-top:4rem;text-align:initial}}@media(min-width:74em){.landing-form-layout-container .intro-presentation{flex:0 0 70%}}.landing-form-layout-container .intro-copy .h1,.landing-form-layout-container .intro-copy h1{font-size:2.25rem;letter-spacing:-.02em}@media(min-width:74em){.landing-form-layout-container .intro-copy .h1,.landing-form-layout-container .intro-copy h1{font-size:2.5rem}}@media(min-width:114em){.landing-form-layout-container .intro-copy .h1,.landing-form-layout-container .intro-copy h1{font-size:3rem}}.landing-form-layout .intro-overlay a{color:#fff}.landing-form-layout-container{--page-bg:#fff;background:#fff;min-height:100vh;min-width:100%}@media(min-width:64em){.landing-form-layout-container{display:grid;grid-template-columns:2fr 400px}}.landing-form-layout-form{background-attachment:fixed;background-image:radial-gradient(#ddd 1px,transparent 0),radial-gradient(#ddd 1px,transparent 0);background-position:0 0,25px 25px;background-size:50px 50px;min-height:100%;padding:2rem}@media(min-width:64em){.landing-form-layout-form{align-self:start;border-left:1px solid #ccc;padding:3rem}}.landing-form-layout-form-wrapper{position:sticky;top:calc(98px + 2rem)}.landing-form-layout-main{background-color:var(--page-bg)}.section-wallet-use-cases{--color-primary:#323c53;--color-primary-dark:#262c3d;background-color:var(--color-primary-dark);background-image:repeating-radial-gradient(circle at 0 0,transparent 0,var(--color-primary) 10px),repeating-linear-gradient(var(--color-primary),var(--color-primary-dark))}.wallet-gallery{grid-column-gap:2rem;grid-row-gap:2rem;grid-template-columns:repeat(4,1fr);grid-template-rows:repeat(2,1fr);margin:0 auto;max-width:90em}@media(min-width:52em){.wallet-gallery{display:grid}}.wallet-gallery-item,.wallet-gallery-item img{height:100%;object-fit:cover;width:100%}.wallet-gallery-item-1{grid-area:1/1/3/3}.wallet-gallery-item-2{display:none;grid-area:1/3/2/5}@media(min-width:52em){.wallet-gallery-item-2{display:block}}.wallet-gallery-item-3{display:none;grid-area:2/3/3/4}@media(min-width:52em){.wallet-gallery-item-3{display:block}}.wallet-gallery-item-4{display:none;grid-area:2/4/3/5}@media(min-width:52em){.wallet-gallery-item-4{display:block}}.wallet .grid-container-example>div:not(:last-child){position:relative}@media(min-width:74em){.wallet .grid-container-example>div:not(:last-child):after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' stroke='%23d859a1' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' class='prefix__lucide prefix__lucide-arrow-right' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:24px;content:"";height:100px;left:calc(100% - 50px + .5rem);position:absolute;top:30%;width:100px;z-index:1}}.wallet-guidance{background-color:color-mix(in srgb,var(--color-primary),#000 25%);box-shadow:0 0 0 2px rgba(0,0,0,.05),0 0 0 1px hsla(0,0%,100%,.1),inset 0 1.5px 0 hsla(0,0%,100%,.4)}.wallet-guidance header{border-bottom:1px solid var(--color-primary);padding:1rem 1.5rem}.wallet-guidance-omni-field{background-color:var(--color-primary-dark);border:1px solid var(--color-primary-light);font-size:.85rem}.wallet-guidance-omni-field span:first-child{background-color:#262930;border-right:1px solid var(--color-primary-light);color:var(--color-primary-light)}.wallet-guidance-omni-field-url{color:#f5f5f5}.landing-page table td:first-child p{white-space:nowrap}body.training{margin-top:168px}body.training .intro-full{min-height:calc(100vh - 168px)}.training-container{height:100%}.training-container,.training-main{min-height:calc(100vh - 172px)}@media(min-width:52em){.training-main{margin-left:320px;width:calc(100% - 320px)}}.training-main .container{position:relative;top:6rem}body.training .footer{display:none}.resources-searchbar-course-title+.training-progressbar-holder{max-width:200px}.training-progressbar-holder{align-items:flex-end;display:flex;flex-direction:column;justify-content:space-between}.training-progressbar{background-color:#ccc;border-radius:40px;height:6px;min-width:120px;width:100%}.training-progressbar-fill{background-color:var(--color-spot);border-radius:inherit;height:6px;text-align:right;transition:width .5s ease-in-out;width:0}.training-progressbar-label{font-size:.85rem;line-height:1;margin-top:.25rem}.quiz [type=radio]:checked,.quiz [type=radio]:not(:checked){clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.quiz [type=radio]:checked+label,.quiz [type=radio]:not(:checked)+label{color:#666;cursor:pointer;display:flex;line-height:1;padding-left:28px;position:relative}.quiz [type=radio]:checked+label:before,.quiz [type=radio]:not(:checked)+label:before{align-items:center;background:#fff;border:1px solid #ddd;border-radius:100%;content:"";display:flex;height:18px;justify-content:center;left:0;position:absolute;top:0;width:18px}.quiz [type=radio]:checked+label:after,.quiz [type=radio]:not(:checked)+label:after{background:var(--color-spot);border-radius:50%;content:"";height:10px;left:4px;position:absolute;top:4px;transition:all .2s ease;width:10px}.quiz [type=radio]:not(:checked)+label:after{opacity:0;transform:scale(0)}.quiz [type=radio]:checked+label:after{opacity:1;transform:scale(1)}.training-finished-course{border-radius:12px;box-shadow:0 6px 24px 0 rgba(0,0,0,.05),0 0 0 1px rgba(0,0,0,.08);margin-bottom:8rem}.training-checkmark-circle{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:3;stroke-miterlimit:10;stroke:var(--color-success);fill:none;animation:training-stroke .6s cubic-bezier(.65,0,.45,1) forwards}.training-checkmark{stroke-width:3;stroke:var(--color-success);stroke-miterlimit:10;animation:training-fill .4s ease-in-out .4s forwards,scale .3s ease-in-out .9s both;border-radius:50%;box-shadow:inset 0 0 0 var(--color-success);display:block;height:56px;margin:2rem auto;width:56px}.training-checkmark-check{stroke-dasharray:48;stroke-dashoffset:48;animation:training-stroke .3s cubic-bezier(.65,0,.45,1) .8s forwards;transform-origin:50% 50%}@keyframes training-stroke{to{stroke-dashoffset:0}}@keyframes training-scale{0%,to{transform:none}50%{transform:scale3d(1.1,1.1,1)}}@keyframes training-fill{to{box-shadow:inset 0 0 0 30px #fff}}.training-sidebar{border-right:1px solid #ddd;height:calc(100vh - 70px);left:0;position:fixed;top:167px;width:100%;width:320px;z-index:3}.training-sidebar-inner{background-color:color-mix(in srgb,var(--color-primary) 8%,#fff);height:calc(100vh - 167px);overflow-y:auto;position:absolute;top:0;width:100%}.training-sidebar-inner li:first-child{background-color:color-mix(in srgb,var(--color-primary) 5%,#fff);border-bottom:1px solid #ccc}@media(min-width:64em){.training-sidebar-inner li:first-child{position:sticky;top:0}}.training-sidebar-inner li a{color:var(--color-primary);transition:background-color .2s}.training-sidebar-inner li a:hover{text-decoration:none}.training-sidebar-inner li:not(:first-child) a{padding:.5rem 1rem .5rem 2rem}.training-sidebar-inner li a.level-1{padding:.5rem 1rem .5rem 1.5rem}.training-sidebar-inner li a.level-1 .icon{font-size:2rem}.training-sidebar-inner li a.level-2{padding:.35rem 1rem .35rem 3rem}.training-sidebar-inner li a.level-2 h4{font-family:Roboto-Regular,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;font-size:.85rem}.training-sidebar-inner li a.level-2 .icon{font-size:1.5rem}.training-sidebar-inner h4{font-family:Roboto-Medium;font-size:1rem}.training-sidebar-inner li a.active,.training-sidebar-inner li:not(:first-child) a:hover{background-color:#fff}.training-sidebar-inner li a .icon{transform-origin:center;transition:transform;transition:.3s ease-in}.training-sidebar-inner li a .icon:after{content:"";font-family:Ionicons;font-style:normal}.training-sidebar-inner li a.active .icon{animation:notify .1s cubic-bezier(1,0,0,1) 2 alternate}.training-sidebar-inner li a.active .icon:after{color:var(--color-spot);content:""}.training-sidebar-inner li a.finished .icon:after{color:var(--color-resources-develop);content:""}.solutions [class*=solutions-line]{display:none;position:absolute;z-index:1}@media(min-width:74em){.solutions [class*=solutions-line]{display:block}}.solutions [class*=solutions-line-line]{stroke:#ccc;stroke-width:2;stroke-dasharray:8;animation-delay:.95s;animation-direction:reverse;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.intro-animation-open-banking{align-items:center;display:flex;justify-content:center}.solutions-openbanking .intro-animation-holder{display:inline-flex;transform:translateX(2rem)}@media(min-width:64em){.solutions-openbanking .intro-animation-holder{transform:none}}.open-banking-psd2{height:60px;left:0;object-fit:contain;position:absolute;top:120px;width:60px}@media(min-width:40em){.open-banking-psd2{height:86px;left:0;top:200px;width:86px}}@media(min-width:64em){.open-banking-psd2{height:86px;left:0;top:260px;width:86px}}.oauth-and-openid-connect{bottom:-128px;display:none;position:absolute;z-index:1}@media(min-width:64em){.oauth-and-openid-connect{display:grid;grid-auto-flow:column}}.oauth-and-openid-connect figure:nth-child(2){transform:translateX(-1rem);z-index:10}.open-banking-intro-bank{display:block;height:16em;margin:0 auto;width:16em}@media(min-width:40em){.open-banking-intro-bank{display:initial;height:26em;margin:unset;width:26em}}@media(min-width:64em){.open-banking-intro-bank{display:initial;height:32em;margin:unset;width:32em}}.solutions-openbanking-brazil .intro-overlay{background-blend-mode:overlay;background-color:#2a303a;background-image:url(/images/solutions/open-banking-brazil/open-banking-brazil-background.webp);background-position:center 80%;background-size:cover}.solutions-openbanking-uk .intro-overlay{background-blend-mode:overlay;background-color:rgba(0,0,0,.75);background-image:url(/images/solutions/open-banking-uk/intro-background.avif);background-position:center 40%;background-size:cover}.solutions-openbanking-us .intro-overlay{background-blend-mode:overlay;background-color:rgba(0,0,0,.75);background-image:url(/images/solutions/open-banking-us/ferdinand-stohr-PeFk7fzxTdk-unsplash.jpg);background-position:center 20%;background-size:cover}.zero-trust-intro-animation{display:block;height:12em;margin:0 auto;max-height:none;position:absolute;right:calc(50% - 6em - 1.5rem);top:50%;width:12em}@media(min-width:40em){.zero-trust-intro-animation{display:initial;height:20em;margin:unset;right:calc(50% - 12em);top:auto;top:0;width:20em}}@media(min-width:64em){.zero-trust-intro-animation{height:26em;right:calc(50% - 13em);top:calc(50% - 13em);width:26em}}@media(min-width:74em){.zero-trust-intro-animation{height:36em;right:calc(50% - 21em);top:calc(50% - 21em);width:36em}}.solutions-zero-trust .intro-animation-holder{display:inline-flex;margin-bottom:12rem}@media(min-width:40em){.solutions-zero-trust .intro-animation-holder{margin-bottom:24rem}}@media(min-width:64em){.solutions-zero-trust .intro-animation-holder{margin-bottom:0;transform:none}}.zero-trust-intro-image{display:block;height:5em;margin:0 auto;position:absolute;right:calc(50% - 2.5em);top:calc(50% + 3.5rem);width:5em}@media(min-width:40em){.zero-trust-intro-image{height:9em;right:calc(50% - 4.5em);top:calc(50% + 6em);width:9em}}@media(min-width:64em){.zero-trust-intro-image{height:11em;right:calc(50% - 2.5em);top:calc(50% - 5.5em);width:11em}}@media(min-width:74em){.zero-trust-intro-image{height:14em;right:calc(50% - 5.5em);top:calc(50% - 8.5em);width:14em}}.frictionless-intro-checkmark{display:block;height:6.5em;position:absolute;right:calc(50% - 3.25em);top:calc(50% - .75rem);width:6.5em}@media(min-width:40em){.frictionless-intro-checkmark{height:13em;right:calc(50% - 6.5rem);top:calc(42% - 2rem - 50px);width:13em}}@media(min-width:64em){.frictionless-intro-checkmark{right:calc(50% - 3.25rem)}}.frictionless-intro-lock{display:block;height:2em;left:calc(50% - 8rem);position:absolute;top:-1em;width:2em}@media(min-width:40em){.frictionless-intro-lock{height:4em;left:9.65rem;top:calc(-9.7rem - 40px);width:4em}}.frictionless-intro-user{display:block;height:4em;position:absolute;right:calc(50% - 7em);top:4em;width:4em}@media(min-width:40em){.frictionless-intro-user{height:7em;right:10rem;top:calc(-7.5em - 30px);width:7em}}.frictionless-intro-animation{display:block;height:14em;margin:0 auto;max-height:none;position:absolute;top:calc(50% - 7em);width:14em}@media(min-width:40em){.frictionless-intro-animation{display:initial;height:26em;margin:unset;top:calc(50% - 13em - 50px);width:26em}}@media(min-width:74em){.frictionless-intro-animation{right:calc(50% - 10em)}}.solutions-frictionless .intro-animation-holder{display:inline-flex;margin-bottom:6rem}@media(min-width:40em){.solutions-frictionless .intro-animation-holder{height:auto;margin-bottom:10rem;transform:none}}@media(min-width:64em){.solutions-frictionless .intro-animation-holder{margin-bottom:0}}.modernizing-intro-image{display:block;height:7em;margin:0 auto;position:absolute;right:calc(50% - 3.5em);top:calc(50% - 1em);width:7em}@media(min-width:40em){.modernizing-intro-image{height:12em;right:calc(50% - 6em);top:calc(50% + 4em);width:12em}}@media(min-width:64em){.modernizing-intro-image{height:16em;right:calc(50% - 8em);top:calc(50% - 5.5em);width:16em}}.modernizing-intro-animation{display:block;height:14em;margin:0 auto;max-height:none;position:absolute;top:calc(50% - 7em);width:14em}@media(min-width:40em){.modernizing-intro-animation{height:30em;right:calc(50% - 15em);top:calc(50% - 8em);width:30em}}@media(min-width:64em){.modernizing-intro-animation{height:30em;right:calc(50% - 15em);top:calc(50% - 20em);width:30em}}.solutions-modernizing .intro-animation-holder{display:inline-flex;margin-bottom:6rem}@media(min-width:40em){.solutions-modernizing .intro-animation-holder{margin-bottom:16rem}}@media(min-width:64em){.solutions-modernizing .intro-animation-holder{height:auto;margin-bottom:0;transform:none}}@media(min-width:52em){.modernizing-standards-figure{height:12em;width:32em}}@media(min-width:40em){.modernizing-standards-image{height:37em;left:-1em;position:absolute;top:-18rem;width:37em;z-index:1}}@media(min-width:64em){.modernizing-standards-image{height:40em;left:-1em;top:-20rem;width:40em;z-index:1}}.common-identity-platform-intro-logo-figure{margin:0 auto 6rem;max-width:160px}@media(min-width:64em){.common-identity-platform-intro-logo-figure{margin-bottom:0}}.common-identity-platform-intro-logo{margin:0 auto;max-width:100px}@media(min-width:40em){.common-identity-platform-intro-logo{animation:pulses 1s linear infinite;left:calc(50% - 80px);max-width:160px;position:absolute;top:calc(50% - 80px);transition-timing-function:var(--ease-in-cubic)}}@media(min-width:74em){.common-identity-platform-intro-logo{animation:pulses 1s linear infinite;left:calc(50% - 116px);max-width:232px;position:absolute;top:calc(50% - 18px);transition-timing-function:var(--ease-in-cubic)}}.common-identity-platform-intro-top{margin:0 auto;max-width:280px}@media(min-width:40em){.common-identity-platform-intro-top{margin-bottom:5rem;max-width:400px}}@media(min-width:74em){.common-identity-platform-intro-top{left:calc(50% - 300px);max-width:600px;position:absolute;top:-150px}}@keyframes pulses{0%{transform:scale(.9)}50%{transform:scale(1)}to{transform:scale(.9)}}.header-top-link{color:#fff;font-size:.9rem}.header-top-link:hover{color:currentColor;text-decoration:none}.header-top-link{align-items:center;border-radius:2rem;display:flex;height:32px;padding:.15rem .75rem;white-space:nowrap}.header-top-link:hover{background-color:color-mix(in srgb,var(--color-primary),#000 14%)}.header-nav-contact{color:#fff}.header-nav-contact a{justify-content:center;padding:.15rem .75rem}.header-top-link-dropdown{align-items:center;cursor:pointer;display:inline-flex;height:100%;padding:0;position:relative}.header-top-link-dropdown .header-top-link{color:#fff}.header-top-link-dropdown:focus:not(:focus-visible){box-shadow:none;outline:none}.header-top-link-dropdown:hover .header-top-link{background-color:color-mix(in srgb,var(--color-primary),#000 14%);text-decoration:none}.header-top-link-dropdown.active .header-top-link{background-color:var(--color-primary);border-radius:2rem}.dropdown-content{background-color:#fff;border-bottom-left-radius:8px;border-bottom-right-radius:8px;box-shadow:0 10px 30px 0 rgba(0,0,0,.16);left:0;max-height:80vh;min-width:280px;opacity:0;overflow:auto;position:absolute;text-align:left;top:50px;transform:scale(.9);transition-duration:.15s;transition-property:opacity;transition-property:transform,opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);visibility:hidden;z-index:10}.dropdown-content-link{border-radius:0;color:var(--color-primary);font-size:.9rem;padding:.75rem 2.5rem .75rem 1.5rem;position:relative;transition-duration:.3s;transition-property:fill;width:100%}.dropdown-content-link:hover:not(.dropdown-content-link-dark):first-child{border-top-left-radius:8px;border-top-right-radius:8px}.dropdown-content-link:hover:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px}.dropdown-content-link:hover{background-color:#fafafa;color:var(--color-primary);text-decoration:none}.dropdown-content-link.active,.dropdown-content-link[aria-current=page]{background-color:#f6f6f6}.dropdown-content-link:not(.dropdown-content-link-logout,.dropdown-content-link-noarrow):after{background-image:url(/images/right-arrow.svg);background-position:50%;background-repeat:no-repeat;background-size:10px 8px;content:" ";display:inline-block;height:8px;margin-left:8px;opacity:.5;position:absolute;right:1rem;transition:transform .1s ease 0s,opacity .1s ease 0s;vertical-align:-1px;width:10px}.dropdown-content .dropdown-content-link-text-heading{align-items:center;display:flex;font-size:1rem;line-height:1.5}.dropdown-content .dropdown-content-link-text-description{color:#666;display:flex;font-size:.75rem;line-height:1.25}.dropdown-content p{font-family:var(--type-regular);font-size:1rem;font-weight:400}.dropdown-content.active{opacity:1;transform:scale(1);visibility:visible}.header-top-link-dropdown svg{display:inline-flex;margin-left:.25rem;transform-origin:50% 50%;transition:transform .2s}.dropdown-content h5{font-size:.75rem}.header-top-link .ion-ios-arrow-down.active{transform:rotate(180deg)}.header-top-link-dropdown .dropdown-content.dropdown-content-product{left:0;min-width:1480px;top:100%;width:min-content}.dropdown-content-product-columns div.flex-33:first-child,.dropdown-content-product-columns div.flex-33:nth-child(2){border-right:1px solid #e2e2e2}.dropdown-content-link-sub-page{padding-left:3rem}.dropdown-content-link-sub-page .dropdown-content-link-text-heading{font-size:.85rem}.product-nav-holder{border:1px solid #ccc;border-radius:8px;overflow:hidden;position:relative}.header-top-link-dropdown .dropdown-content.dropdown-content-resources{left:0;min-width:1000px;top:100%;width:min-content}.dropdown-content-user{color:var(--color-primary)}.dropdown-content-user,.dropdown-content-user .dropdown-content-link{min-width:180px}.header-top-link-dropdown .dropdown-content.dropdown-content-solutions{left:0;min-width:800px;top:100%;width:min-content}.dropdown-content-product-columns>div{border-right:1px solid #e2e2e2}.header-top-link-dropdown .dropdown-content.dropdown-content-developer{overflow:hidden;position:absolute;width:350px}.dropdown-content-link-dark{background-image:url(/images/emptybox.svg);background-position:left -240px;background-repeat:no-repeat;background-size:110%;position:relative}.dropdown-content-link-dark,.dropdown-content-link-dark.active{background-color:color-mix(in srgb,var(--color-primary),#000 50%)}.dropdown-content-link-dark:after{background-image:url(/images/right-arrow-white.svg);opacity:1}.dropdown-content-link-dark:focus{background-color:color-mix(in srgb,var(--color-primary),#000 30%)}.dropdown-content-link-dark:hover{background-color:color-mix(in srgb,var(--color-primary),#000 28%)}.header-top-link-dropdown .dropdown-content.dropdown-content-user{left:auto;position:absolute;right:0;top:49px;width:240px}@media(min-width:100em){.header-top-link-dropdown .dropdown-content.dropdown-content-user{left:0;right:auto}}.header-nav-login{justify-content:flex-end}@media(min-width:100em){.header-nav-login{min-width:100px}}.header-top-link-dropdown .dropdown-content.dropdown-content-company{left:0;min-width:800px;top:100%;width:min-content}.mobile-nav{--width:100vw;-webkit-overflow-scrolling:touch;align-items:center;background-color:var(--color-primary-dark);border-radius:4px;box-shadow:2.8px 2.8px 2.2px rgba(0,0,0,.02),6.7px 6.7px 5.3px rgba(0,0,0,.028),12.5px 12.5px 10px rgba(0,0,0,.035),22.3px 22.3px 17.9px rgba(0,0,0,.042),41.8px 41.8px 33.4px rgba(0,0,0,.05),100px 100px 80px rgba(0,0,0,.07);content-visibility:auto;justify-content:center;left:auto;margin-left:auto;margin-right:auto;max-height:100vh;min-height:100vh;opacity:0;overflow:auto;overflow-y:scroll;position:fixed;right:0;top:0;transform:translateX(100%);transform:translateX(var(--width));transition:transform .3s;visibility:hidden;width:var(--width);z-index:600}.mobile-nav.active{opacity:1;transform:translateX(0);visibility:visible}@media(min-width:40em){.mobile-nav{--width:400px}}.mobile-nav button.button-has-dropdown{height:unset;padding:.25rem .75rem}.mobile-nav .button-has-dropdown .icon{display:none}.mobile-nav nav ul{content-visibility:auto}.mobile-nav button.navigation-expand{-webkit-tap-highlight-color:rgba(0,0,0,0);align-items:center;border:none;border-radius:0;display:flex;justify-content:space-between;outline:none;width:100%}.mobile-nav li button.navigation-expand,.mobile-nav ul>li a{color:#fff;font-size:1.25rem;line-height:1.6875rem;padding:.75rem 1.5rem}.mobile-nav li button.navigation-expand:hover,.mobile-nav ul>li a:hover{text-decoration:none}.mobile-nav li button.navigation-expand{font-family:var(--type-regular);opacity:1}.mobile-nav li button.navigation-expand:hover{box-shadow:none;text-decoration:none}.mobile-nav li button.navigation-expand.navigation-expand-active{background-color:color-mix(in srgb,var(--color-primary),#000 20%);color:#fff}button.navigation-expand .icon{color:var(--color-primary-light);cursor:pointer;font-size:.85rem;outline:0;transition:transform .2s ease}button.navigation-expand-active .icon{transform:rotate(180deg)}.mobile-nav-logo{max-width:120px}.mobile-nav .mobile-nav-children li a{color:#fff;display:block;font-size:.95rem;opacity:1;padding:.75rem .75rem .75rem 4rem;text-decoration:none;transition:.3s}.mobile-nav .mobile-nav-children li a:hover{text-decoration:none}.mobile-nav .mobile-nav-children{content-visibility:auto;display:grid;grid-template-columns:1fr;margin:0;max-height:0;overflow:hidden;transition:max-height .3s ease-out}.mobile-nav .mobile-nav-children.is-visible{max-height:1600px;transition:max-height .2s ease-in}.mobile-nav .mobile-nav-close{align-items:center;color:#fff;display:flex;font-size:32px;height:36px;justify-content:center;line-height:36px;padding:0;text-align:center;width:36px}.mobile-nav .mobile-nav-close:hover{background-color:color-mix(in srgb,var(--color-primary),#000 20%);color:#fff;text-decoration:none}.hamburger{align-items:flex-start;cursor:pointer;display:flex;position:relative}.header-top-link-hamburger:hover{background-color:transparent}.hamburger__text{align-self:center;color:#fff;content:"Menu";flex:1 1;font-size:.9rem;letter-spacing:.1rem;margin:0 .5rem 0 0;text-transform:uppercase;-webkit-user-select:none;user-select:none}.hamburger__icon{align-self:center;cursor:pointer;flex:1 1;height:20px;position:relative;transform:rotate(0deg);transition:.5s ease-in-out;width:28px}.hamburger__icon span{background:var(--color-spot);border-radius:0;display:block;height:3px;left:0;opacity:1;position:absolute;transform:rotate(0deg);transition:.25s ease-in-out;width:100%}.hamburger__icon span:first-child{top:0}.hamburger__icon span:nth-child(2),.hamburger__icon span:nth-child(3){top:8px;width:70%}.hamburger__icon span:nth-child(4){top:16px}.hamburger__icon:hover span:nth-child(2){width:100%}.hamburger__icon.open span{background:var(--color-spot)}.hamburger__icon.open span:first-child{left:50%;top:16px;width:0}.hamburger__icon.open span:nth-child(2){transform:rotate(45deg)}.hamburger__icon.open span:nth-child(3){transform:rotate(-45deg)}.hamburger__icon.open span:nth-child(4){left:50%;top:16px;width:0}.release-nav a{display:block;font-size:1.25;margin-right:.5rem}@media(min-width:52em){.release-nav a{display:inline-block}}.resources-topic small{align-items:center;display:flex;justify-content:center}.resources-time{align-items:center;border-radius:2px;color:var(--color-primary);display:inline-flex;font-size:.85rem;justify-content:space-between;padding:.35rem .5rem}.resources-topic svg{border-radius:6px;box-shadow:0 5px 15px 0 rgba(112,128,175,.2);display:inline-flex;height:36px;padding:.5rem;transition:box-shadow .3s ease-in-out;width:36px}.resources-topic svg:hover{box-shadow:0 5px 15px 0 rgba(112,128,175,.5)}.resources-topic-develop{color:var(--color-resources-develop)}.resources-topic-architect{color:var(--color-spot)}.resources-topic-livepresentation,.resources-topic-operate,.resources-topic-usecases{color:var(--color-primary)}.career-post-meta{border:1px solid #ccc}.career-post-meta>div:first-child,.career-post-meta>div:nth-child(2),.career-post-meta>div:nth-child(3){border-bottom:1px solid #ccc}#hippo-audio-check-container,#hippo-screen-check-container,#hippo-webcam-check-container{display:none!important}.hippo-embed-widget-container{margin:0!important}.career-interview-presentation .gatsby-image-wrapper{border:4px solid #fff}@media(min-width:52em){.career-interview-presentation .gatsby-image-wrapper{margin-top:-160px;position:relative}}.career-interview-presentation{align-items:center;display:flex}@media(min-width:52em){.career-interview-presentation{display:initial}}.blog .circle{border:4px solid transparent;transition:border-color .4s}.blog .circle:hover{border:4px solid var(--color-spot)}.blog article div[itemprop=description] p,.blog article ol,.blog article ul{margin:0}.blog article>div[itemprop=description]{display:grid;gap:1rem;grid-template-columns:minmax(0,1fr)}.blog article{max-width:110ch}@media(min-width:52em){.events>li a{grid-gap:2rem;display:grid;grid-template-columns:1.5fr 4fr 1.5fr}}.events-date *{color:var(--color-paragraphs)}.events-date-date-day{color:var(--color-spot);font-size:2rem;line-height:1.2}@media(min-width:52em){.events-date-date-day{font-size:3.5rem}}ul.Conference li[href*=Conference]{display:block}ul.Conference li[href*=Livecast],ul.Conference li[href*=Webinar]{display:none}ul.Webinar li[href*=Webinar]{display:block}ul.Webinar li[href*=Conference],ul.Webinar li[href*=Livecast]{display:none}.news-pagination{grid-gap:1rem;display:grid;grid-auto-flow:column;place-items:center}.productbar{-webkit-backdrop-filter:saturate(180%) blur(5px);backdrop-filter:saturate(180%) blur(5px);background-color:rgba(0,0,0,.6);box-shadow:inset 0 -1px 0 0 hsla(0,0%,100%,.1);display:none;padding:.5rem;position:fixed;right:0;top:98px;width:100%;z-index:50}@media(min-width:64em){.productbar{display:block}}.productbar select{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");border:1px solid #fff;color:#fff;font-size:.85rem;outline:none}.productbar select option{color:initial}.white-fill{fill:#fff}.blue-stroke{stroke-width:3px;stroke:var(--color-primary)}.blue-stroke-thin{stroke-width:1px;stroke:var(--color-primary)}.white-stroke{stroke-width:3px;stroke:#fff}.white-stroke-thin{stroke-width:1px;stroke:#fff}.green-fill{fill:var(--color-resources-develop)}.dark-grey-fill{fill:#1b1b1b}.blue-fill{fill:var(--color-primary)}.dark-blue-fill{fill:color-mix(in srgb,var(--color-primary),#000 20%)}.grey-fill{fill:#e2e0e0}.transparent-fill{fill:transparent}.shadow{fill:var(--color-primary);opacity:.25}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOutVisibility{0%{opacity:1;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes fadeInVisibility{0%{opacity:0;visibility:hidden}to{opacity:1;visibility:visible}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeInScale{0%{opacity:0;transform:scale(0)}50%{opacity:1;transform:scale(1.05)}to{opacity:1;transform:scale(1)}}@keyframes slideIn{0%{transform:translateX(-50%)}50%{transform:translateX(10%)}to{opacity:1;transform:translateX(0)}}@keyframes slideInRight{0%{transform:translateX(50%)}50%{transform:translateX(-10%)}to{opacity:1;transform:translateX(0)}}@keyframes slideInTop{0%{transform:translateY(-50%)}50%{transform:translateY(-10%)}to{opacity:1;transform:translateY(0)}}@keyframes slideInBottom{0%{transform:translateY(50%)}50%{transform:translateY(10%)}to{opacity:1;transform:translateY(0)}}@keyframes flash{0%{opacity:1}50%{opacity:.1}to{opacity:1}}@keyframes dash{to{stroke-dashoffset:500}}@keyframes bounceIn{0%{opacity:0;transform:scale(.3)}50%{opacity:.9;transform:scale(1.1)}80%{opacity:1;transform:scale(.89)}to{opacity:1;transform:scale(1)}}@keyframes bounceScale{0%{transform:scale(1)}50%{transform:scale(.9)}to{transform:scale(1)}}@keyframes browserMove{to{transform:scale(.75) translateX(-35%) translateY(-25%)}}@keyframes browserMoveRight{0%{transform:scale(.75) translateX(-35%) translateY(-25%)}to{transform:translateX(50%)}}@keyframes apiMoveUp{to{transform:translateY(-100px)}}@keyframes pulsebright{0%{box-shadow:0 0 0 0 rgba(216,89,161,.4)}to{box-shadow:0 0 0 60px rgba(216,89,161,0)}}@keyframes pulseprimary{0%{box-shadow:0 0 0 0 rgba(var(--color-primary),.4)}to{box-shadow:0 0 0 60px rgba(var(--color-primary),0)}}.standard-circle{border-radius:50%;height:60px;width:60px}@media(min-width:64em){.standard-circle{height:90px;width:90px}}.section-standards-item{flex:0 0 33.333%}@media(min-width:64em){.section-standards-item{flex:0 0 33.333%}}.section-architecture{background-image:url(/images/architecture-background.svg);background-position:left -200px;background-repeat:repeat;background-size:50%}.section-architecture-stack-image{max-height:400px}@media(min-width:52em){.section-architecture-stack-image{max-height:600px}}@media(min-width:64em){.section-architecture-stack-image{max-height:700px}.section-architecture-main{align-items:center;display:flex;justify-content:space-between}}.section-architecture-side{align-items:flex-start;display:flex;flex:0 0 100%;justify-content:space-between}@media(min-width:64em){.section-architecture-side{align-items:normal;display:initial;flex:0 0 25%;height:500px;justify-content:normal}}.section-architecture-stack{flex:0 0 100%}@media(min-width:64em){.section-architecture-stack{flex:0 0 50%}}.architecture-part{padding-left:.5rem;padding-right:.5rem}@media(min-width:64em){.architecture-part-right{text-align:right}.architecture-part-right>.flex{justify-content:flex-end}}.architecture-part .section-architecture-apis,.architecture-part .section-architecture-apps,.architecture-part .section-architecture-server,.architecture-part .section-architecture-users{max-height:60px;max-width:60px;min-height:60px}@media(min-width:64em){.architecture-part .section-architecture-apis,.architecture-part .section-architecture-apps,.architecture-part .section-architecture-server,.architecture-part .section-architecture-users{max-height:120px;max-width:100px;min-height:100px}}.architecture-standards .standard-circle{height:46px;padding:.5rem;width:46px}.architecture-symbol{max-width:200px}.architecture-line-1{animation-delay:.7s;animation-duration:.5s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:fadeIn;display:none;left:calc(100% - 40px);opacity:0;position:absolute;top:10%;z-index:10}@media(min-width:64em){.architecture-line-1{display:block}}.architecture-line-1-arrow,.architecture-line-1-circle{fill:var(--color-primary-light)}.architecture-line-1-line{stroke:var(--color-primary-light);stroke-width:.05rem;stroke-dasharray:8;animation-delay:.95s;animation-direction:reverse;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.architecture-line-2{animation-delay:.7s;animation-duration:.5s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:fadeIn;display:none;left:calc(100% - 40px);opacity:0;position:absolute;top:90%;z-index:10}@media(min-width:64em){.architecture-line-2{display:block}}.architecture-line-2-line{stroke:var(--color-primary-light);stroke-width:.05rem;stroke-dasharray:8;animation-delay:.95s;animation-direction:reverse;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.architecture-line-2-arrow{fill:var(--color-primary-light)}.architecture-line-3{animation-delay:.7s;animation-duration:.5s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:fadeIn;display:none;opacity:0;position:absolute;right:calc(100% - 30px);top:10%;transform:scaleX(-1);z-index:10}@media(min-width:64em){.architecture-line-3{display:block}}.architecture-line-3-line{stroke:var(--color-primary-light);stroke-width:.05rem;stroke-dasharray:8;animation-delay:.95s;animation-direction:reverse;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.architecture-line-3-arrow{fill:var(--color-primary-light)}.architecture-line-4{animation-delay:.7s;animation-duration:.5s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:fadeIn;display:none;opacity:0;position:absolute;right:calc(100% - 30px);top:90%;transform:scaleX(-1);z-index:10}@media(min-width:64em){.architecture-line-4{display:block}}.architecture-line-4-line{stroke:var(--color-primary-light);stroke-width:.05rem;stroke-dasharray:8;animation-delay:.95s;animation-direction:reverse;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.architecture-line-4-arrow{fill:var(--color-primary-light)}.how-curity-works{animation-delay:.5s;animation-duration:.5s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:fadeInVisibility;opacity:0;transform:scale(.9);visibility:hidden}@media(min-width:64em){.how-curity-works{transform:scale(1)}}.how-curity-works-browser{background-attachment:fixed;background-color:#fff;background-color:#000;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 800 800'%3E%3Ccircle cx='400' cy='400' r='600'/%3E%3Ccircle cx='400' cy='400' r='500' fill='%23180d1c'/%3E%3Ccircle cx='400' cy='400' r='400' fill='%23261431'/%3E%3Ccircle cx='400' cy='400' r='300' fill='%23351947'/%3E%3Ccircle cx='400' cy='400' r='200' fill='%23451e5e'/%3E%3Ccircle cx='400' cy='400' r='100' fill='%23527'/%3E%3C/svg%3E");background-size:200%;border-radius:8px;box-shadow:0 10px 10px -20px rgba(50,50,93,.25),0 10px 20px -20px rgba(0,0,0,.3),0 -10px 20px -10px rgba(0,0,0,.025);flex:0 0 100%;margin:2.5rem auto;max-width:80%;position:relative;transition:transform 1s ease}.how-curity-works-browser-header{align-items:center;background-color:#e6e4e4;border-top-left-radius:8px;border-top-right-radius:8px;display:flex;padding:.5rem 1rem}.how-curity-works-browser-header-omnibar{background-color:#fff;border-radius:16px;display:flex;justify-content:center;margin:0 auto;min-width:50%;padding:.15rem 1rem}.how-curity-works-browser-header-omnibar .icon{color:#ccc}.how-curity-works-browser-header-omnibar-url{color:#666;font-size:.75rem}.how-curity-works-browser-header-omnibar-url.active{color:purple}.how-curity-works-browser-header span{background-color:#ccc;border-radius:50%;height:12px;position:relative;width:12px}.how-curity-works-browser-main{padding:3rem}.how-curity-works-browser-main-content-circle{background-color:#f2f2f2;border-radius:50%;flex:none;height:100px;width:100px}.how-curity-works-browser-main-content-loaded{align-items:center;display:flex;height:100%;justify-content:center;left:0;opacity:0;position:absolute;top:0;visibility:hidden;width:100%}.how-curity-works-browser-main-content-loaded section{align-items:flex-start;display:flex;flex:0 0 75%;justify-content:space-between}.how-curity-works-browser-main-content-loaded section aside{align-items:center;display:flex;flex:0 0 20%;flex-direction:column;justify-content:center}.how-curity-works-browser-main-content-loaded section main{flex:0 0 70%}.how-curity-works-browser-main-content-loaded-avatar{background-color:#fff;border-radius:50%;height:40px;margin-bottom:2rem;opacity:0;width:40px}.how-curity-works-browser-main-content-loaded-lines{background-color:hsla(0,0%,100%,.5);border-radius:4px;height:8px;opacity:0;width:100%}.how-curity-works-browser-main-content-loaded-lines:first-of-type{width:90%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(2){width:80%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(3){width:70%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(4){width:60%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(5){width:50%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(6){width:40%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(7){width:30%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(8){width:20%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(9){width:10%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(10){width:0}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(11){width:-10%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(12){width:-20%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(13){width:-30%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(14){width:-40%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(15){width:-50%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(16){width:-60%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(17){width:-70%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(18){width:-80%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(19){width:-90%}.how-curity-works-browser-main-content-loaded-lines:nth-of-type(20){width:-100%}.how-curity-works-browser-main-field{background-color:#fff;border:1px solid #ccc;border-radius:4px;padding:1rem 2rem;width:90%}.how-curity-works-browser-main-field span{background-color:#ccc;border-radius:50%;height:12px;opacity:0;position:relative;width:12px}.how-curity-works-browser-main-button{background-color:purple;border-radius:4px;color:#fff;font-family:Roboto-Medium;font-size:1.2rem;letter-spacing:.1em;padding:1rem 2rem;text-transform:uppercase;width:90%}.how-curity-works-browser-main-field-spinner{left:calc(50% - 25px);opacity:0;position:absolute;top:calc(50% - 25px);visibility:hidden}.how-curity-works-browser-main-field-spinner span{animation:spinning .5s linear infinite;border:3px solid hsla(0,0%,80%,.3);border-radius:50%;border-top-color:#ccc;display:inline-block;height:50px;width:50px}@keyframes spinning{to{transform:rotate(1turn)}}.how-curity-works-line{left:50%;opacity:0;position:absolute;top:10%;visibility:hidden;z-index:10}.how-curity-works-line-arrow{fill:var(--color-primary)}.how-curity-works-line-line{stroke:var(--color-primary);stroke-width:1;stroke-dasharray:4;animation-delay:.95s;animation-direction:reverse;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.how-curity-works-line-to-app{left:25%;opacity:0;position:absolute;top:55%;transform:scaleX(-1);visibility:hidden;z-index:10}.how-curity-works-line-to-app-arrow{fill:var(--color-primary)}.how-curity-works-line-to-app-line{stroke:var(--color-primary);stroke-width:1;stroke-dasharray:4;animation-delay:.95s;animation-direction:reverse;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.how-curity-works-line-vertical{opacity:0;position:absolute;right:-7%;top:50%;transform:rotate(90deg);visibility:hidden;z-index:10}.how-curity-works-line-vertical-arrow{fill:var(--color-primary)}.how-curity-works-line-vertical-line{stroke:var(--color-primary);stroke-width:1;stroke-dasharray:4;animation-delay:.95s;animation-direction:reverse;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.how-curity-works-line-api{left:0;opacity:0;position:absolute;top:-8%;transform:rotate(90deg) translateY(145%) translateX(90%);visibility:hidden;z-index:10}.how-curity-works-line-api-arrow{fill:var(--color-primary)}.how-curity-works-line-api-line{stroke:var(--color-primary);stroke-width:1;stroke-dasharray:4;animation-delay:.95s;animation-direction:reverse;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.how-curity-works-line-right{left:-10%;opacity:0;position:absolute;top:20%;transform:scaleX(-1);visibility:hidden;z-index:10}.how-curity-works-line-right-arrow{fill:var(--color-primary)}.how-curity-works-line-right-line{stroke:var(--color-primary);stroke-width:1;stroke-dasharray:4;animation-delay:.95s;animation-direction:reverse;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.how-curity-works-line-data{left:15%;opacity:0;position:absolute;top:75%;visibility:hidden;z-index:10}.how-curity-works-line-data-arrow{fill:var(--color-primary)}.how-curity-works-line-data-line{stroke:var(--color-primary);stroke-width:1;stroke-dasharray:4;animation-delay:.95s;animation-direction:reverse;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.how-curity-works-api,.how-curity-works-server,.how-curity-works-token,.how-curity-works-token2{align-items:center;background-color:#fff;border-radius:50%;box-shadow:0 6px 12px -2px rgba(50,50,93,.25),0 3px 7px -3px rgba(0,0,0,.3);display:flex;height:100px;justify-content:center;opacity:0;padding:1rem;position:absolute;visibility:hidden;width:100px}.how-curity-works-api img,.how-curity-works-server img,.how-curity-works-token img,.how-curity-works-token2 img{max-height:75%}.how-curity-works-token{bottom:30%;right:0;z-index:10}.how-curity-works-token2{left:-10%;top:10%;z-index:10}.how-curity-works-server{background-color:var(--color-primary);right:0;top:0;z-index:10}.how-curity-works-api{background-color:purple;left:-10%;top:65%;z-index:10}.how-curity-works-data{color:#000;font-family:Roboto-Mono,monospace;left:15%;opacity:0;position:absolute;top:68%;visibility:hidden;z-index:10}.how-curity-works-data span:first-child{color:#20b2aa}.multi-tenancy-colocated-label,.multi-tenancy-isolated-label{box-shadow:inset 0 0 0 0 #31302b;padding-left:.25rem;padding-right:.25rem;transition:all .5s ease}.multi-tenancy-colocated-label.marked,.multi-tenancy-isolated-label.marked{box-shadow:inset 100px 0 0 0 var(--color-spot)}.how-curity-works-browser-web-ui{background-attachment:fixed;background-color:#fff;background-image:none;background-size:200%;position:relative;transform:scale(1.1) translateX(-20px) translateY(0) perspective(1230px) rotateY(-30deg) rotateX(1deg) rotate(1deg)}.how-curity-works-browser-web-ui.active{transform:scale(1.1) translateX(-20px) translateY(0) perspective(1230px) rotateY(-10deg) rotateX(1deg) rotate(1deg)}.how-curity-works-browser-web-ui .how-curity-works-browser-main{backface-visibility:hidden;padding-left:100px;position:relative}.how-curity-works-browser-main-sidebar{background-color:color-mix(in srgb,var(--color-primary),#000 10%);border-bottom-left-radius:4px;height:calc(100% + 2px);justify-content:left;left:-1px;min-height:100%;position:absolute;top:-1px;width:80px}.how-curity-works-browser-web-ui hr{background-color:#f6f6f6;border:none;border-radius:1rem;display:block;height:8px;width:100%}.how-curity-works-browser-main-box{align-items:center;background-color:#fff;border:1px solid var(--color-primary);border-radius:2px;display:flex;height:30px;justify-content:center;position:relative;width:30px}.how-curity-works-browser-main-box:not(:last-child){margin-right:20px}.how-curity-works-browser-main-box:not(:last-child):after{background-color:var(--color-primary);content:"";height:1px;left:100%;position:absolute;top:50%;width:40px}.how-curity-works-browser-main-box-lg{background-color:var(--color-primary);border:1px solid var(--color-primary);height:60px;width:60px}@media(min-width:64em){.how-curity-works-browser-main-box-lg{font-size:3rem;height:90px;width:90px}}.how-curity-works-browser-main-box-lg:before{top:25%}.how-curity-works-browser-main-box-lg:after,.how-curity-works-browser-main-box-lg:before{background-color:var(--color-primary);content:"";height:1px;left:100%;position:absolute;width:40px}.how-curity-works-browser-main-box-lg:after{top:75%}.how-curity-works-browser-main-box-sm{height:30px}.how-curity-works-browser-main-box-sm img{object-fit:contain;width:16px}.how-curity-works-browser-main-pipeline .flex-30{padding-right:40px}.how-curity-works-browser-main-pipeline .flex-30>.flex:first-child{margin-bottom:1rem}.how-curity-works-browser-authenticators{background-attachment:fixed;background-color:#fff;background-color:color-mix(in srgb,var(--color-primary),#000 15%);background-image:none;background-size:200%;opacity:.4;transform:scale(1.1) translateX(-20px) translateY(30px) perspective(1230px) rotateY(-30deg) rotateX(1deg) rotate(1deg);transform:none}@media(min-width:84em){.how-curity-works-browser-authenticators{height:500px;position:absolute;width:620px}}.how-curity-works-browser-authenticators .how-curity-works-browser-main{backface-visibility:hidden;position:relative}.how-curity-works-browser-authenticators .how-curity-works-browser-main-button,.how-curity-works-browser-authenticators .how-curity-works-browser-main-content-circle,.how-curity-works-browser-authenticators .how-curity-works-browser-main-field{opacity:0}@media(min-width:64em){.how-curity-works-browser-authenticators .how-curity-works-browser-main-button,.how-curity-works-browser-authenticators .how-curity-works-browser-main-content-circle,.how-curity-works-browser-authenticators .how-curity-works-browser-main-field{opacity:.07}}.how-curity-works-browser-authenticators .how-curity-works-browser-main-button{background-color:var(--color-primary)}.action-list-item{flex:0 0 50%;padding:1rem}@media(min-width:64em){.action-list-item{flex:0 0 25%}}.action-list-item figure{align-items:center;background-color:#fff;border-radius:50%;box-shadow:0 10px 100px -20px rgba(50,50,93,.25),0 10px 20px -20px rgba(0,0,0,.3),0 -10px 20px -10px rgba(0,0,0,.025);color:#fff;display:flex;flex:none;font-size:1.5rem;height:48px;justify-content:center;margin:0;padding:0;width:48px}@media(min-width:64em){.action-list-item figure{height:80px;width:80px}}.action-list-item figure img{max-width:50%;object-fit:contain}.section-item-mobile img{max-height:300px}@media(min-width:64em){.section-item-mobile img{max-height:500px}}.how-curity-works-browser-selfservice{background-attachment:fixed;background-color:#fff;background-image:none;background-size:200%;position:relative;transform:scale(.75)}.how-curity-works-browser-selfservice .how-curity-works-browser-main-button{background-color:var(--color-primary)}.section-item-selfservice img{max-width:240px}@media(min-width:64em){.section-item-selfservice img{max-width:400px}}.section-item-sso img{max-width:300px}@media(min-width:64em){.section-item-sso img{max-width:500px}}.how-curity-works-browser-branding{background-image:none;border:8px solid #fff}@media(min-width:64em){.how-curity-works-browser-branding{margin:1rem;max-width:400px;min-width:380px}}.how-curity-works-browser-branding .how-curity-works-browser-main-content-circle{height:60px;width:60px}.how-curity-works-browser-branding .how-curity-works-browser-main-button{margin-top:.5rem}.how-curity-works-browser-branding .how-curity-works-browser-main-button,.how-curity-works-browser-branding .how-curity-works-browser-main-field{height:30px;padding:0 1rem}.how-curity-works-browser-branding .how-curity-works-browser-main-field{border:1px solid #f2f2f2}.how-curity-works-browser-branding .how-curity-works-browser-main-field span{height:8px;width:8px}.how-curity-works-browser-branding hr{background-color:rgba(0,0,0,.1);border:none;border-radius:1rem;display:block;height:8px;width:100%}.how-curity-works-browser-branding-1{background-color:#fafafa;flex:0 0 20%}@media(min-width:64em){.how-curity-works-browser-branding-1{transform:translateY(-2rem) translateX(5rem) scale(.8)}}.how-curity-works-browser-branding-2{background-color:#fafafa;flex:0 0 50%;position:relative;z-index:10}@media(min-width:64em){.how-curity-works-browser-branding-2{transform:translateY(1rem) scale(1)}}.how-curity-works-browser-branding-3{background-color:#fafafa;flex:0 0 20%}@media(min-width:64em){.how-curity-works-browser-branding-3{transform:translateY(-2rem) translateX(-5rem) scale(.8)}}.how-curity-works-browser-branding-1 .how-curity-works-browser-main-button,.how-curity-works-browser-branding-1 .how-curity-works-browser-main-content-circle{background-color:var(--color-spot)}.how-curity-works-browser-branding-2 .how-curity-works-browser-main-button,.how-curity-works-browser-branding-2 .how-curity-works-browser-main-content-circle{background-color:var(--color-primary)}.how-curity-works-browser-branding-3 .how-curity-works-browser-main-button,.how-curity-works-browser-branding-3 .how-curity-works-browser-main-content-circle{background-color:var(--color-tertiary)}.how-curity-works-browser-branding-1 .how-curity-works-browser-main-field span,.how-curity-works-browser-branding-2 .how-curity-works-browser-main-field span,.how-curity-works-browser-branding-3 .how-curity-works-browser-main-field span{background-color:var(--color-grey-light)}.true-mobile-image{max-width:280px}@media(min-width:64em){.true-mobile-image{bottom:-10rem;left:0;max-width:380px;position:absolute}}.full-control-image{max-width:380px}@media(min-width:40em){.full-control-image{bottom:-1rem;left:0;max-width:380px;position:absolute}}.maturity-model-illustration{transform:scale(.8)}@media(min-width:64em){.maturity-model-illustration{height:500px}}.maturity-model-illustration-item{left:calc(50% - 100px);max-width:200px;position:absolute}@media(min-width:64em){.maturity-model-illustration-item{bottom:0;left:calc(50% - 200px);max-width:400px}}.maturity-model-illustration-item-4{z-index:4}@media(min-width:64em){.maturity-model-illustration-item-4{bottom:360px;left:80px}}.maturity-model-illustration-item-3{z-index:3}@media(min-width:64em){.maturity-model-illustration-item-3{bottom:240px;left:60px}}.maturity-model-illustration-item-2{z-index:2}@media(min-width:64em){.maturity-model-illustration-item-2{bottom:120px;left:40px}}.maturity-model-illustration-item-1{z-index:1}@media(min-width:64em){.maturity-model-illustration-item-1{bottom:0;left:20px}}.maturity-model-arrow{display:block;margin:0 auto}@media(min-width:64em){.maturity-model-arrow{height:450px}}.authorization-animation{height:400px;transform:scale(.8) translateX(-100px) translateY(-40px);width:400px}@media(min-width:64em){.authorization-animation{height:500px;transform:scale(.9) translateX(-75px);width:500px}}img.authorization-circle{left:0;max-height:none;max-width:none;position:absolute;top:0}.authorization-api{height:225px;left:154px;position:absolute;top:230px;width:225px}.authorization-api-description{left:196px;position:absolute;top:470px;z-index:4}.authorization-data{background:#fff;border-radius:8px;box-shadow:0 3px 8px 0 rgba(0,0,0,.12);left:0;left:20%;padding:1rem 2rem;position:absolute;top:0;width:200px;z-index:2}.authorization-checkmark{border-radius:50%;height:50px;left:250px;position:absolute;top:116px;width:50px;z-index:30}.authorization-data-api{align-items:center;color:var(--color-resources-develop);display:flex;font-size:2rem;justify-content:center;left:370px;top:306px}.authorization-data-api:before{background-color:var(--color-resources-develop);content:"";height:3px;left:-40px;position:absolute;top:calc(50% - 1px);width:40px}.authorization-bank,.authorization-token,.authorization-user,.authorization-wallet{align-items:center;background-color:#fff;border-radius:50%;box-shadow:0 1px 2px 0 rgba(41,52,156,.1),0 2px 8px 0 rgba(119,120,171,.1);display:flex;height:114px;justify-content:center;margin:0;padding:1.5rem;position:absolute;width:114px;z-index:2}.authorization-bank img,.authorization-token img,.authorization-user img,.authorization-wallet img{object-fit:cover}.authorization-token{left:250px;top:-50px}.authorization-wallet{left:-50px;top:100px}.authorization-bank{left:30%;top:80%}.authorization-user{right:0;top:75px}.authorization-bank{left:-30px;top:275px}@media(min-width:64em){.authorization-bank{height:154px;padding:1.5rem;width:154px}}.authorization-data header{align-items:flex-start;display:flex;justify-content:space-between}.authorization-data header .avatar{background-color:var(--color-resources-develop);border-radius:50%;display:inline-flex;flex:none;height:34px;width:34px}.authorization-data header .credentials{display:inline-flex;flex-wrap:wrap}.authorization-data header .credentials span{background-color:var(--color-resources-develop);height:.5rem;margin-right:.25rem}.authorization-data header .credentials span:first-child{width:1rem}.authorization-data header .credentials span:nth-child(2){width:1.5rem}.authorization-data header .credentials span:nth-child(3){margin-top:.5rem;width:6rem}.authorization-data header .credentials span:nth-child(4){background-color:color-mix(in srgb,var(--color-resources-develop) 40%,#fff);margin-top:.5rem;width:1rem}.authorization-data header .credentials span:nth-child(5){background-color:color-mix(in srgb,var(--color-resources-develop) 40%,#fff);margin-top:.5rem;width:3rem}.authorization-data header .credentials span:nth-child(6){background-color:color-mix(in srgb,var(--color-resources-develop) 40%,#fff);margin-top:.5rem;width:6rem}.authorization-line{animation-delay:.7s;animation-duration:.5s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:fadeIn;display:block;left:160px;opacity:0;position:absolute;top:95px;width:90%;z-index:1}.authorization-line-line{stroke:var(--color-resources-develop);stroke-width:2;stroke-dasharray:8;animation-delay:.95s;animation-direction:reverse;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.token-factory-slider{animation-direction:alternate-reverse;animation-iteration-count:infinite;animation-name:bounce;animation-timing-function:cubic-bezier(.77,0,.175,1);left:160px;position:absolute;top:142px;width:30px}.token-factory-slider1{animation-delay:.5s;animation-duration:2s;left:132px;width:30px}.token-factory-slider2{animation-delay:.5s;animation-duration:1s;left:166px;width:30px}.token-factory-slider3{animation-delay:2s;animation-duration:3s;left:200px;width:30px}@keyframes bounce{0%{transform:translateY(0)}to{transform:translateY(30px)}}.token-factory-text{left:360px;position:absolute;top:10px}.token-factory-holder{height:300px;left:0;top:0;transform:scale(.8);width:600px}@media(min-width:64em){.token-factory-holder{transform:scale(1)}}.token-factory{left:0;max-width:none;top:0;width:600px}.token-factory-line{animation-delay:.7s;animation-duration:.5s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:fadeIn;left:220px;opacity:0;position:absolute;top:0;transform:scaleX(-1);width:120px;z-index:10}.token-factory-line-arrow{fill:var(--color-resources-develop)}.token-factory-line-line{stroke:var(--color-resources-develop);stroke-width:.05rem;stroke-dasharray:8;animation-delay:.95s;animation-direction:reverse;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.token-factory-input{background:#fff;border-radius:8px;box-shadow:0 3px 8px 0 rgba(0,0,0,.12);left:340px;padding:1rem 2rem;position:absolute;text-align:left;top:-20px;width:230px;z-index:2}.token-factory-input ol{font-size:.75rem}.tab-group.tab-group-everything-through-configuration>div[data-item]{background-color:#fff;border-radius:6px;padding:1rem}@media(min-width:74em){.tab-group.tab-group-everything-through-configuration>div[data-item]{padding:3rem}}.oauth-toolbox-item{background-color:transparent;box-shadow:none;padding:1rem;position:relative;text-align:center}.oauth-toolbox-item figure{align-items:center;background-color:#fff;border-radius:50%;box-shadow:0 3px 6px -2px rgba(50,50,93,.25),0 3px 5px -2px rgba(0,0,0,.1);display:flex;height:96px;justify-content:center;padding:1.5rem;width:96px}@media(min-width:74em){.oauth-toolbox-item figure{height:116px;width:116px}}.oauth-toolbox-item img{max-height:85%;object-fit:contain}.oauth-toolbox-item li{color:#fff}.oauth-features{grid-column-gap:2rem;grid-row-gap:1rem;display:grid;grid-auto-rows:1fr;grid-template-columns:1fr;grid-template-rows:auto;margin:0 auto;position:relative;z-index:2}@media(min-width:52em){.oauth-features{grid-template-columns:1fr 1fr}}@media(min-width:84em){.oauth-features{grid-row-gap:0;align-items:center;grid-template-columns:repeat(6,minmax(140px,1fr));grid-template-rows:repeat(5,minmax(0,1fr))}}.oauth-features-column-item{background-color:#fff;border-radius:8px;box-shadow:0 20px 20px 0 rgba(20,52,92,.18);min-height:180px;position:relative;text-align:left}.oauth-features-column-item.oauth-features-column-item-client-features header{cursor:pointer}.oauth-features-column-item-token{grid-column:1/-1;grid-row-start:1}.oauth-features-column-item button{background-color:var(--color-resources-develop);border-bottom:1px solid #d8d8d8;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:8px;border-top-right-radius:8px;box-shadow:none;padding:.85rem 1.45rem}.oauth-features-column-item.oauth-features-column-item-client-features button{background-color:var(--color-primary)}.oauth-features-column-item button:hover .icon{background-color:var(--color-resources-develop);color:#fff}.oauth-features-column-item button .icon{align-items:center;background-color:#fff;border-radius:50%;color:var(--color-resources-develop);cursor:pointer;display:flex;flex:none;height:24px;justify-content:center;transition:background-color .2s;width:24px}.oauth-features-column-item button .icon:hover{color:#fff}@media(min-width:84em){.oauth-features-column-item-token{grid-column-end:5;grid-column-start:3;grid-row-end:5;grid-row-start:2}.oauth-features-column-item-purpose{grid-column-end:2;grid-column-start:1;grid-row-end:6;grid-row-start:1}.oauth-features-column-item-scopes{grid-column-end:2;grid-column-start:2;grid-row-end:3;grid-row-start:1}.oauth-features-column-item-formats{grid-column-end:3;grid-column-start:2;grid-row-end:6;grid-row-start:4}.oauth-features-column-item-claims{grid-column-end:6;grid-column-start:5;grid-row-end:3;grid-row-start:1}.oauth-features-column-item-revocations{grid-column-end:6;grid-column-start:5;grid-row-end:6;grid-row-start:4}.oauth-features-column-item-protections{grid-column-end:6;grid-column-start:6;grid-row-end:6;grid-row-start:1}}.oauth-features-column-item-line{display:none;height:110px;opacity:.5;position:absolute;width:110px;z-index:-1}@media(min-width:84em){.oauth-features-column-item-line{display:block}}.oauth-features-column-item-line-protections{height:4px;left:-300px;top:calc(50% - 2px);width:300px}.oauth-features-column-item-line-purpose{height:4px;left:100%;right:100%;top:calc(50% - 2px);width:300px}.oauth-features-column-item-line-scopes{right:-80px;top:40%}.oauth-features-column-item-line-formats{right:-80px;top:-10px;transform:scaleY(-1)}.oauth-features-column-item-line-claims{left:-80px;top:40%;transform:scaleX(-1)}.oauth-features-column-item-line-revokable{left:-80px;top:-10px;transform:scaleX(-1) scaleY(-1)}.oauth-features-column-item h4{color:#fff;font-family:Roboto-Medium;font-size:.9rem;letter-spacing:.03em;position:relative}.oauth-features-column-item ul{margin:1rem}.oauth-features-column-item li{font-size:.85rem}.oauth-features-column-item header{background-color:var(--color-resources-develop);border-bottom:1px solid #d8d8d8;border-top-left-radius:8px;border-top-right-radius:8px;padding:.85rem 1.45rem}.oauth-features-column-item.oauth-features-column-item-client-features header{background-color:var(--color-primary)}.oauth-features-column-item header:hover .icon{background-color:var(--color-resources-develop);color:#fff}.oauth-features-column-item header .icon{align-items:center;background-color:#fff;border-radius:50%;color:var(--color-resources-develop);cursor:pointer;display:flex;flex:none;height:24px;justify-content:center;transition:background-color .2s;width:24px}.oauth-features-column-item [tooltip]:after{min-width:200px}.oauth-features-column-item-token{align-items:center;background:transparent;border-radius:8px;box-shadow:none;display:flex;flex-direction:column;height:300px;justify-content:center;padding:1rem 2rem;position:relative;width:100%;z-index:2}.oauth-features-column-item-token img{min-height:120px}@media(min-width:84em){.oauth-features-column-item-token img{min-height:150px}}.oauth-features-column-item-token.oauth-features-column-item-clients img{min-height:150px}@media(min-width:74em){.oauth-features-column-item-token.oauth-features-column-item-clients img{min-height:150px}}.pulse{animation:pulse 2s infinite;border:3px solid rgba(var(--color-primary),.2);border-radius:100%;height:100px;left:calc(50% - 50px);opacity:.3;position:absolute;top:calc(50% - 50px);width:100px;z-index:1}.pulse-big{animation-delay:.3s;border:3px solid rgba(var(--color-primary),.2);height:95px;width:95px}@keyframes pulse{0%{transform:scale(1)}to{opacity:0;transform:scale(2.5)}}.examples-grid-item-line{fill:transparent;animation-delay:.7s;animation-duration:.5s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:fadeIn;opacity:0}.examples-grid-item-line-reverse-x{transform:scaleX(-1)}.examples-grid-item-line-reverse-y{transform:scaleY(-1)}.examples-grid-item-line-reverse-xy{transform:scaleX(-1) scaleY(-1)}.examples-grid-item-line-line{stroke:#cfd7df;stroke-width:2;stroke-dasharray:8;animation-delay:.95s;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.examples-grid-item-line-line-reversed{animation-direction:reverse}.examples-grid-item-line-arrow{fill:#cfd7df}.examples-grid{grid-gap:1rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,max-content));justify-content:center;margin:0 auto;max-width:85%}.examples-grid.examples-grid-oauth-for-web{grid-template-columns:90px 90px 90px 90px 160px 90px 90px 90px 90px}.examples-grid.examples-grid-microservices{grid-template-columns:repeat(9,minmax(80px,100px))}.examples-grid.examples-grid-banking{grid-template-columns:repeat(5,minmax(80px,100px))}.examples-grid.examples-grid-mesh{grid-template-columns:repeat(7,minmax(80px,100px))}.examples-grid.examples-grid-support{grid-template-columns:repeat(5,minmax(80px,100px))}.examples-grid p{line-height:1.2}.filter-scroller{overflow-x:auto;overflow:auto;white-space:nowrap}.filter{align-items:center;display:flex;list-style:none;margin:0;padding:0}.filter li:not(:last-child){margin-right:1rem}.filter label{font-size:1rem}.checkbox{align-items:center;display:inline-flex;position:relative}.checkbox-visible{background:#fff;border:1px solid #ccc;border-radius:2px;height:22px;position:absolute;width:22px}.checkbox input:checked+.checkbox-visible{background:var(--color-primary);background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNNS4zNzggMTEuMzcgMiA3LjU5bDEuNDM4LTEuMjg2TDUuMzc0IDguNDdsNS4xODUtNS44NEwxMiAzLjkxbC02LjYyMiA3LjQ2Ii8+PC9zdmc+);background-position:50%;background-repeat:no-repeat;background-size:16px;border-color:var(--color-primary)}.checkbox input:focus+.checkbox-visible,.checkbox input:hover:checked+.checkbox-visible{border-color:var(--color-primary)}.checkbox span{display:inline-flex;margin-left:.5rem;-webkit-user-select:none;user-select:none}.checkbox-reset span{font-weight:700}.filter.examples-grid-mesh-filter{background-color:color-mix(in srgb,var(--color-resources-develop) 20%,#fff);border-radius:8px;line-height:normal;padding:6px}.filter.examples-grid-mesh-filter li .checkbox span{margin:0}.filter.examples-grid-mesh-filter li:not(:last-child){margin-right:.25rem}.examples-grid-mesh-filter .checkbox-visible,.examples-grid-mesh-filter input{display:none}.examples-grid-mesh-filter label{background-color:transparent;border-radius:4px;cursor:pointer;line-height:normal;padding:.15rem .75rem;transition:background-color .3s ease}.examples-grid-mesh-filter label.active,.examples-grid-mesh-filter label:hover{background-color:#fff}.examples-grid-item-first{grid-column:1/2}.examples-grid-item{align-items:center;display:flex;flex-direction:column;justify-content:center}.examples-grid-support .examples-grid-item:first-child img{max-height:75px}.examples-grid-item-center{grid-column:5/6}.examples-grid-item-token-large{height:140px;width:140px}.examples-grid-item-token-small{background-color:#fff;border-radius:50%;box-shadow:0 0 3px 0 rgba(0,0,0,.05),0 3px 10px 0 rgba(0,0,0,.01),0 18px 30px -10px rgba(75,82,94,.099);height:40px;padding:.5rem;width:40px}.examples-grid-item-token-group .examples-grid-item-token-small{position:absolute;right:-1rem;top:50%}.examples-grid-item-token-group .examples-grid-item-token-red{right:35%}.examples-grid-item-token-group .examples-grid-item-token-blue{right:10%}.examples-grid-item-token-red{border:1px solid red}.examples-grid-item-token-blue{border:1px solid blue}.zone{transition:opacity .5s ease}.examples-grid-mesh.examples-grid-mesh-zone-embed .zone:not(.zone-embed),.examples-grid-mesh.examples-grid-mesh-zone-exchange .zone:not(.zone-exchange),.examples-grid-mesh.examples-grid-mesh-zone-share .zone:not(.zone-share){opacity:.2}.examples-grid-mesh.examples-grid-mesh-zone-embed.examples-grid-mesh-zone-embed .zone-embed,.examples-grid-mesh.examples-grid-mesh-zone-embed.examples-grid-mesh-zone-exchange .zone-exchange{opacity:1}.examples-grid-mesh.examples-grid-mesh-zone-embed.examples-grid-mesh-zone-exchange .zone:not(.zone-embed):not(.zone-exchange){opacity:.2}.examples-grid-mesh.examples-grid-mesh-zone-exchange.examples-grid-mesh-zone-share .zone-exchange,.examples-grid-mesh.examples-grid-mesh-zone-exchange.examples-grid-mesh-zone-share .zone-share{opacity:1}.examples-grid-mesh.examples-grid-mesh-zone-exchange.examples-grid-mesh-zone-share .zone:not(.zone-exchange):not(.zone-share){opacity:.2}.examples-grid-mesh.examples-grid-mesh-zone-embed.examples-grid-mesh-zone-embed .zone-embed,.examples-grid-mesh.examples-grid-mesh-zone-embed.examples-grid-mesh-zone-share .zone-share{opacity:1}.examples-grid-mesh.examples-grid-mesh-zone-embed.examples-grid-mesh-zone-share .zone:not(.zone-embed):not(.zone-share){opacity:.2}.examples-grid-mesh.examples-grid-mesh-zone-embed.examples-grid-mesh-zone-exchange.examples-grid-mesh-zone-share .zone{opacity:1!important}.mtls-tunnel{animation-delay:0s;animation-direction:reverse;animation-duration:2s;animation-fill-mode:none;animation-iteration-count:infinite;animation-name:cssProgressActiveRight;animation-play-state:running;animation-timing-function:linear;background:color-mix(in srgb,var(--color-resources-develop) 20%,#fff);background-image:linear-gradient(-45deg,hsla(0,0%,100%,.125) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.125) 0,hsla(0,0%,100%,.125) 75%,transparent 0,transparent);background-size:35px 35px;box-shadow:inset 0 -1px 2px rgba(0,0,0,.1);height:20px;position:relative;width:100%}.mtls-tunnel:before{left:-5px}.mtls-tunnel:after,.mtls-tunnel:before{background-color:#fff;border:2px solid var(--color-resources-develop);border-radius:50%;content:"";height:20px;position:absolute;width:10px}.mtls-tunnel:after{left:auto;right:-5px}@keyframes cssProgressActiveRight{0%{background-position:0 0}to{background-position:-35px -35px}}.tab-completion{background-color:#000;border:4px solid #000;border-radius:8px;box-shadow:0 1px 2px rgba(0,0,0,.07),0 2px 4px rgba(0,0,0,.07),0 4px 8px rgba(0,0,0,.07),0 8px 16px rgba(0,0,0,.07),0 16px 32px rgba(0,0,0,.07),0 32px 64px rgba(0,0,0,.07);left:88px;overflow:hidden;position:absolute;top:4.5rem;width:200px;z-index:1}.tab-completion pre{color:#add8e6;margin:0}@keyframes fadeInAndOut{0%{opacity:0}to{opacity:1}}.tab-completion-cursor{animation:typing 3.6s steps(8),blink-caret .75s step-end infinite;border-right:.15em solid orange;font-family:Roboto-Mono,monospace;font-size:.7rem;font-weight:600;letter-spacing:.15em;overflow:hidden;white-space:nowrap;width:80px}@keyframes typing{0%{width:0}to{width:100%}}@keyframes blink-caret{0%,to{border-color:transparent}50%{border-color:orange}}.api-driven-management{grid-gap:1rem;align-content:center;align-items:center;display:grid;grid-template-columns:1fr;grid-template-rows:1fr .5fr 2fr .5fr 2fr;justify-content:center}@media(min-width:52em){.api-driven-management{grid-template-columns:1fr .5fr 2fr .5fr 2fr;grid-template-rows:repeat(5,1fr)}}.api-driven-management img{display:block;object-fit:cover;width:100%}.api-driven-management svg{max-height:none}.api-driven-management-scim{align-self:center;grid-column:1/-1;justify-self:center}@media(min-width:52em){.api-driven-management-scim{grid-column:initial;grid-row:1/-1}}.api-driven-management-arrow{align-self:center;grid-column:1/-1;justify-self:center}@media(min-width:52em){.api-driven-management-arrow{grid-column:initial;grid-row:1/-1}}.api-driven-management-scim img{max-height:46px;min-width:270px;object-fit:contain}.api-driven-management-main{align-self:center;grid-column:1/-1;justify-self:center}@media(min-width:52em){.api-driven-management-main{grid-column:initial;grid-row:1/-1}}.api-driven-management-main img{max-width:160px;padding:1rem;width:100%}@media(min-width:52em){.api-driven-management-main img{max-width:200px;min-width:200px}}.api-driven-management-database{align-self:center;justify-self:center;text-align:center}.api-driven-management-database img{height:50px;object-fit:contain;width:50px}.api-drive-management-line{fill:transparent;animation-delay:.7s;animation-duration:.5s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:fadeIn;opacity:0;transform:scaleX(-1) rotate(-90deg) scale(.8)}@media(min-width:52em){.api-drive-management-line{transform:scaleX(-1) scale(1)}}.api-drive-management-line-line{stroke:var(--color-tertiary);stroke-width:2;stroke-dasharray:8;animation-delay:.95s;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.api-drive-management-line-arrow{fill:var(--color-tertiary)}.examples-grid-item-stack-symbol{align-items:center;background-color:#fff;border-radius:50%;color:var(--color-tertiary);display:flex;font-size:2rem;height:30px;justify-content:center;position:absolute;right:5px;top:-15px;width:30px;z-index:10}.api-driven-connections{align-self:center;display:grid;grid-column:1/-1;grid-template-columns:repeat(3,minmax(0,1fr))}@media(min-width:52em){.api-driven-connections{gap:1rem;grid-column:initial;grid-row:1/-1}}.mock-ui-c-pill{background-color:var(--color-primary);border-radius:8px;color:#fff;display:inline-flex;font-size:.75rem;padding:.25rem 1rem}.mock-ui-c-field{background-color:#fff;border:1px solid #ccc;border-radius:4px;padding:.65rem 1rem}.mock-ui-c-field span{background-color:#ccc;border-radius:50%;height:8px;position:relative;width:8px}@media(min-width:64em){.mock-ui-webui{justify-content:flex-end}}.mock-ui-webui.step2 .mock-ui-c-field span{animation-delay:.3s;animation-duration:.5s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:bounceIn;opacity:0}.mock-ui-webui.step2 .mock-ui-c-field span:nth-child(2){animation-delay:.4s}.mock-ui-webui.step2 .mock-ui-c-field span:nth-child(3){animation-delay:.5s}.mock-ui-webui.step2 .mock-ui-c-field span:nth-child(4){animation-delay:.6s}.mock-ui-webui.step2 .mock-ui-c-field span:nth-child(5){animation-delay:.7s}.mock-ui-webui.step2 .mock-ui-c-field span:nth-child(6){animation-delay:.8s}.mock-ui-c-facilities .button-success-outline{backface-visibility:hidden}.mock-ui-webui.step1 .mock-ui-c-facilities .button-success-outline{animation-delay:0s;animation-duration:.2s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:bounceScale;background-color:var(--color-success);color:#fff}.configuration-circle{background-color:color-mix(in srgb,var(--color-primary) 30%,#fff);border:3px solid #f6f6f6;box-shadow:0 3px 8px 0 rgba(0,0,0,.12);display:none;font-family:Roboto-Medium,sans-serif;font-size:.85rem;height:90px;left:0;margin-left:auto;margin-right:auto;position:absolute;right:0;top:-45px;width:90px}@media(min-width:74em){.configuration-circle{display:flex;font-size:1.2rem;height:140px;top:-70px;width:140px}}.configuration-circle img{transform:translate(30px);width:100px}.configuration-line{fill:none;stroke:color-mix(in srgb,var(--color-primary) 45%,#fff);stroke-miterlimit:10;stroke-width:4;padding-right:1rem}@media(min-width:74em){.configuration-line{stroke-width:1}}.mock-ui-c-facilities{background-color:#fff;border-radius:4px;box-shadow:0 6px 12px -2px rgba(50,50,93,.25),0 3px 7px -3px rgba(0,0,0,.3);color:var(--color-primary);padding:.35rem 1rem;position:relative}@media(min-width:74em){.mock-ui-c-facilities{max-width:500px}}.mock-ui-c-facilities li{color:#666;font-size:.85rem;padding:.35rem 1rem}.mock-ui-c-facilities-modal{left:0;opacity:0;position:absolute;top:-1rem;z-index:5}@media(min-width:74em){.mock-ui-c-facilities-modal{left:-25%;min-width:300px;top:-4rem}}.mock-ui-webui.step3 .mock-ui-c-facilities-modal{animation-delay:1s;animation-duration:.2s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:slideInBottom}.mock-ui-webui.step5 .mock-ui-c-checkmark-circle{animation:stroke .6s cubic-bezier(.65,0,.45,1) forwards}.mock-ui-webui.step5 .mock-ui-c-checkmark{animation:fill .4s ease-in-out .4s forwards,scale .3s ease-in-out .9s both}.mock-ui-webui.step5 .mock-ui-c-checkmark-check{animation:stroke .3s cubic-bezier(.65,0,.45,1) .8s forwards}.mock-ui-c-checkmark-circle{fill:none;stroke:var(--color-success);stroke-dasharray:166;stroke-dashoffset:166;stroke-miterlimit:10;stroke-width:2}.mock-ui-c-checkmark{stroke:#fff;stroke-miterlimit:10;stroke-width:2;border-radius:50%;bottom:-23px;box-shadow:inset 0 0 0 var(--color-success);display:block;height:46px;left:calc(50% - 23px);position:absolute;width:46px}.mock-ui-c-checkmark-check{stroke-dasharray:48;stroke-dashoffset:48;transform-origin:50% 50%}@keyframes stroke{to{stroke-dashoffset:0}}@keyframes scale{0%,to{transform:none}50%{transform:scale3d(1.1,1.1,1)}}@keyframes fill{to{box-shadow:inset 0 0 0 30px var(--color-success)}}.mock-ui-webui.step3 .mock-ui-c-facilities-modal .mock-ui-c-field:first-of-type span{animation-delay:1.3s;animation-duration:.5s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:bounceIn;opacity:0}.mock-ui-webui.step3 .mock-ui-c-facilities-modal .mock-ui-c-field:first-of-type span:nth-child(2){animation-delay:1.4s}.mock-ui-webui.step3 .mock-ui-c-facilities-modal .mock-ui-c-field:first-of-type span:nth-child(3){animation-delay:1.5s}.mock-ui-webui.step3 .mock-ui-c-facilities-modal .mock-ui-c-field:first-of-type span:nth-child(4){animation-delay:1.6s}.mock-ui-webui.step3 .mock-ui-c-facilities-modal .mock-ui-c-field:first-of-type span:nth-child(5){animation-delay:1.7s}.mock-ui-webui.step3 .mock-ui-c-facilities-modal .mock-ui-c-field:first-of-type span:nth-child(6){animation-delay:1.8s}.mock-ui-webui.step3 .mock-ui-c-facilities-modal .mock-ui-c-field:nth-of-type(2) span{animation-delay:1.9s;animation-duration:.5s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:bounceIn;opacity:0}.mock-ui-webui.step3 .mock-ui-c-facilities-modal .mock-ui-c-field:nth-of-type(2) span:nth-child(2){animation-delay:2s}.mock-ui-webui.step3 .mock-ui-c-facilities-modal .mock-ui-c-field:nth-of-type(2) span:nth-child(3){animation-delay:2.1s}.mock-ui-webui.step3 .mock-ui-c-facilities-modal .mock-ui-c-field:nth-of-type(2) span:nth-child(4){animation-delay:2.2s}.mock-ui-webui.step3 .mock-ui-c-facilities-modal .mock-ui-c-field:nth-of-type(2) span:nth-child(5){animation-delay:2.3s}.mock-ui-webui.step3 .mock-ui-c-facilities-modal .mock-ui-c-field:nth-of-type(2) span:nth-child(6){animation-delay:2.4s}.cli-example-header{background:#282a36;border-top-left-radius:8px;border-top-right-radius:8px;padding:1rem 2rem;position:relative;top:4px}.cli-example-header span{background-color:var(--color-primary-light);border-radius:50%;display:inline-block;height:16px;margin-right:1rem;width:16px}.cli-example pre{word-wrap:normal;margin-top:0;min-height:100px}.cli-example pre .output{color:var(--color-tertiary)}.typed-cursor{display:none;opacity:0}.cli-example pre:after{animation:blink .7s infinite;background-color:var(--color-spot);content:"";display:inline-block;font-weight:700;height:16px;line-height:1;margin-left:.5rem;vertical-align:middle;width:4px}@keyframes blink{0%{opacity:1}50%{opacity:0}to{opacity:1}}.mock-ui-c-checkmark-cli{bottom:auto;top:-79px}.mock-ui-c-checkmark-cli.finished .mock-ui-c-checkmark-circle{animation:stroke .6s cubic-bezier(.65,0,.45,1) forwards}.mock-ui-c-checkmark-cli.finished{animation:fill .4s ease-in-out .4s forwards,scale .3s ease-in-out .9s both}.mock-ui-c-checkmark-cli.finished .mock-ui-c-checkmark-check{animation:stroke .3s cubic-bezier(.65,0,.45,1) .8s forwards}.restconf-animation{align-items:center;display:flex;justify-content:center}.restconf-animation-lines{flex-direction:column}.restconf-animation-lines,.restconf-animation-lines-holder{align-items:center;display:flex}.restconf-animation-line{width:100px}.restconf-animation-lines-holder .restconf-animation-line-line{stroke:#fff;animation-delay:.95s;animation-duration:40.5s}.restconf-animation-line-arrow{fill:#fff}.restconf-animation-lines-holder:not(:last-child){margin-bottom:1rem}.restconf-animation-lines-holder .pill{border-radius:4px;color:#fff;display:inline-block;font-size:.65rem;padding:.25rem 1rem;text-align:center;width:90px}@media(min-width:74em){.restconf-animation-lines-holder .pill{font-size:.75rem}}.restconf-animation-lines-holder-get .pill{background-color:var(--color-primary)}.restconf-animation-lines-holder-get .restconf-animation-line-line{stroke:var(--color-primary)}.restconf-animation-lines-holder-get .restconf-animation-line-arrow{fill:var(--color-primary)}.restconf-animation-lines-holder-post .pill{background-color:color-mix(in srgb,var(--color-primary),#000 10%)}.restconf-animation-lines-holder-post .restconf-animation-line-line{stroke:var(--color-primary)}.restconf-animation-lines-holder-post .restconf-animation-line-arrow{fill:var(--color-primary)}.restconf-animation-lines-holder-update .pill{background-color:color-mix(in srgb,var(--color-primary),#000 15%)}.restconf-animation-lines-holder-update .restconf-animation-line-line{stroke:var(--color-primary)}.restconf-animation-lines-holder-update .restconf-animation-line-arrow{fill:var(--color-primary)}.restconf-animation-lines-holder-patch .pill{background-color:color-mix(in srgb,var(--color-primary),#000 20%)}.restconf-animation-lines-holder-patch .restconf-animation-line-line{stroke:var(--color-primary)}.restconf-animation-lines-holder-patch .restconf-animation-line-arrow{fill:var(--color-primary)}.restconf-animation-lines-holder-head .pill{background-color:color-mix(in srgb,var(--color-primary),#000 27%)}.restconf-animation-lines-holder-head .restconf-animation-line-line{stroke:var(--color-primary)}.restconf-animation-lines-holder-head .restconf-animation-line-arrow{fill:var(--color-primary)}.restconf-animation-lines-holder-put .pill{background-color:color-mix(in srgb,var(--color-primary),#000 30%)}.restconf-animation-lines-holder-put .restconf-animation-line-line{stroke:var(--color-primary)}.restconf-animation-lines-holder-put .restconf-animation-line-arrow{fill:var(--color-primary)}.restconf-animation-lines-holder-delete .pill{background-color:color-mix(in srgb,var(--color-primary),#000 35%)}.restconf-animation-lines-holder-delete .restconf-animation-line-line{stroke:var(--color-primary)}.restconf-animation-lines-holder-delete .restconf-animation-line-arrow{fill:var(--color-primary)}.restconf-animation-server{margin-left:2rem;width:150px}.restconf-animation-line{fill:transparent;animation-delay:.7s;animation-duration:.5s;animation-fill-mode:forwards;animation-iteration-count:1;animation-name:fadeIn;opacity:0;transform:scaleX(-1)}.restconf-animation-line-line{stroke-width:2;stroke-dasharray:8;animation-delay:.95s;animation-duration:20.5s;animation-iteration-count:infinite;animation-name:dash;animation-timing-function:linear}.restconf-animation-line-arrow{fill:#cfd7df}.code-editor-fadeout{max-height:240px;overflow:hidden}.code-editor-fadeout:after{background-image:linear-gradient(transparent,#fff 95%);bottom:0;content:"";height:120px;left:0;position:absolute;text-align:center;width:100%;z-index:1}.code-editor-fadeout .button-copy-code{visibility:hidden}.code-editor-fadeout pre[class*=language-]{margin:0;padding-left:1rem}.code-editor-fadeout .line-numbers-rows{display:none}.mock-ui-c-devops-dashboard-intro{display:none;transform:translateX(-2rem)}@media(min-width:84em){.mock-ui-c-devops-dashboard-intro{display:block;position:absolute;right:-6rem;top:22%;width:500px}.devops-dashbard .intro-animation img{position:absolute;right:380px;top:20%}.devops-dashbard .intro p{max-width:35rem}}.examples-grid.examples-grid-on-premise{border-radius:12px;grid-template-columns:4fr 1fr 1fr 1fr 1fr 1fr;min-width:1000px}.pulse-on-premise{border:3px solid #fff;display:none;left:auto;right:48px;top:86px}@media(min-width:40em){.pulse-on-premise{display:block}}.examples-grid.examples-grid-one-cloud{grid-template-columns:3fr 1fr 1fr 1fr 1fr 1fr;min-width:1000px}.pulse-one-cloud{border:3px solid #fff;left:calc(50% - 40px)}.one-cloud-k8s,.pulse-one-cloud{height:80px;top:-40px;width:80px}.one-cloud-k8s{align-items:center;background-color:#fff;border-radius:50%;display:flex;justify-content:center;left:0;margin-left:auto;margin-right:auto;padding:.5rem;position:absolute;right:0}.pulse-multi-cloud{border:3px solid #fff;height:60px;left:calc(50% - 30px);top:-30px;width:60px}.examples-grid.examples-grid-multi-cloud-wrapper{grid-gap:2rem;display:initial;grid-template-columns:1fr 1fr 1fr;max-width:none}.examples-grid.examples-grid-multi-cloud-wrapper .examples-grid.examples-grid-one-cloud{margin-bottom:4rem;min-width:unset}@media(min-width:64em){.examples-grid.examples-grid-multi-cloud-wrapper{display:grid}}.examples-grid.examples-grid-multi-cloud{grid-template-columns:3fr 1fr 1fr 1fr 1fr 1fr}.examples-grid.examples-grid-multi-cloud-wrapper .examples-grid-item-line-line,.examples-grid.examples-grid-one-cloud .examples-grid-item-line-line{stroke:var(--color-primary)}.examples-grid.examples-grid-multi-cloud-wrapper .examples-grid-item-line-arrow,.examples-grid.examples-grid-one-cloud .examples-grid-item-line-arrow{fill:var(--color-primary)}.examples-grid.examples-grid-multi-cloud-wrapper .examples-grid.examples-grid-one-cloud{grid-gap:.5rem;grid-template-columns:1fr .25fr 1fr .25fr 1fr}.examples-grid-item-span{grid-column:1/-1;grid-row-start:1}.examples-grid.examples-grid-multi-cloud-wrapper .one-cloud-k8s{height:60px;top:-30px;width:60px}.intro-animation .alarm-pulse{background-color:var(--color-danger);border-radius:50%;display:inline-flex;height:10px;position:relative;transform:scale(1) rotateX(60deg) rotateY(0deg) rotate(-45deg);width:10px;will-change:transform}.examples-grid-item-line-line-alarms{stroke:#ad2021}.examples-grid-item-line-arrow-alarms{fill:#ad2021}.intro-animation .alarm-pulse-large{display:none;height:40px;left:130px;position:absolute;top:174px;width:40px;z-index:10}@media(min-width:74em){.intro-animation .alarm-pulse-large{display:block;left:264px;top:430px}}@media(min-width:140em){.intro-animation .alarm-pulse-large{left:360px;top:430px}}.intro-animation .alarm-pulse:before{background-color:var(--color-danger);border-radius:100%;content:"";height:100%;left:0;position:absolute;top:0;width:100%;will-change:transform;z-index:-1}@media(min-width:84em){.intro-animation .alarm-pulse:before{animation:alarm_pulse 1.5s infinite}}.intro-animation .alarm-pulse.alarm-pulse-large{background-color:transparent}@keyframes alarm_pulse{0%{opacity:1;transform:scale(1)}70%{opacity:0;transform:scale(8)}to{opacity:0;transform:scale(1)}}.alarm-chain-of-events{grid-gap:1rem;display:grid;grid-template-columns:1fr;grid-template-rows:1fr .5fr 1fr .5fr 1fr .5fr}@media(min-width:52em){.alarm-chain-of-events{grid-template-columns:2fr .5fr 2fr .5fr 2fr .5fr 2fr;grid-template-rows:repeat(1,1fr)}}.alarm-chain-of-events-item{align-self:center;justify-self:center;text-align:center}.alarm-chain-of-events-item-reports{display:grid;grid-template-columns:repeat(3,1fr)}@media(min-width:52em){.alarm-chain-of-events-item-reports{display:initial}}.alarm-chain-of-events-arrow{align-self:center;justify-self:center}.alarm-chain-of-events-arrow .examples-grid-item-line{width:80px}@media(min-width:52em){.alarm-chain-of-events-arrow .examples-grid-item-line{width:150px}}.alarm-chain-of-events-arrow .examples-grid-item-line{transform:scaleX(-1) rotate(-90deg) scale(.8)}@media(min-width:52em){.alarm-chain-of-events-arrow .examples-grid-item-line{transform:scaleX(-1) scale(1)}}.plans-edition{background-color:#fff;border-radius:8px;flex:0 0 20%;overflow:hidden}.plans-edition-table{border:none}.plans-edition-table td,.plans-edition-table th{border:none;font-size:.875rem;vertical-align:middle}.plans-edition-table tr.hovered td{background-color:color-mix(in srgb,var(--color-primary) 15%,#fff);color:#fff}.plans-edition-table tr.hovered .icon{color:#fff}.plans-edition-table tr:first-child{border-top:none}.plans-item h4{color:#fff;overflow:hidden;padding:1rem}@media(min-width:64em){.plans-item h4{padding:1rem 1.2rem}}.plans-item ol,.plans-item p,.plans-item ul{font-size:.9rem}.plans-item ul li .icon,.plans-item ul li.icon{line-height:1}.plans-edition.plans-edition-token-handler .plans-item h4{background-color:color-mix(in srgb,var(--color-primary),#000 5%)}.plans-edition.plans-edition-community .plans-item h4{background-color:color-mix(in srgb,var(--color-primary),#000 10%)}.plans-edition.plans-edition-basic .plans-item h4{background-color:color-mix(in srgb,var(--color-primary),#000 40%)}.plans-edition.plans-edition-standard .plans-item h4{background-color:var(--color-resources-develop)}.plans-edition.plans-edition-enterprise .plans-item h4{background-color:var(--color-spot)}.plan-comparison-scroller{-webkit-overflow-scrolling:touch;margin:0 auto;max-width:90em;overflow-x:scroll}@media(min-width:74em){.plan-comparison-scroller{margin-bottom:2rem;overflow-x:initial}}@media(min-width:140em){.plan-comparison-scroller{max-width:100em}}.plans-edition-ps{border:1px solid #f6f6f6;box-shadow:0 10px 30px 0 rgba(0,0,0,.16)}.plans-edition.plans-edition-ps:first-child .plans-item h2{background-color:var(--color-primary)}.plans-edition.plans-edition-ps:nth-child(2) .plans-item h2{background-color:color-mix(in srgb,var(--color-primary),#000 20%)}.plans-edition.plans-edition-ps:nth-child(3) .plans-item h2{background-color:var(--color-spot)}.plan-comparison{background-color:#fff;border-radius:6px;display:grid;grid-template-columns:2fr repeat(4,1fr);padding:1rem;white-space:nowrap;width:80rem}@media(min-width:64em){.plan-comparison{padding:1.5rem;white-space:normal;width:auto}}.plan-comparison-item{padding:1rem .5rem}.plan-comparison-item-community{background-color:color-mix(in srgb,var(--color-primary) 10%,#fff)}.plan-comparison-item-basic{background-color:var(--color-grey-subtle)}.plan-comparison-item-standard{background-color:color-mix(in srgb,var(--color-resources-develop) 40%,#fff)}.plan-comparison-item-enterprise{background-color:color-mix(in srgb,var(--color-spot) 20%,#fff)}.plan-comparison-item-sticky-compare{background-color:#fff;position:sticky;top:50px;z-index:20}.plan-comparison-item-sticky{background-color:#fff;border-bottom:none;position:sticky;top:98px;z-index:10}.plan-comparison-item-sticky-spread{grid-column:1/-1}.plan-comparison-item{font-size:.85rem}@media(min-width:64em){.plan-comparison-item{font-size:.85rem}}.plan-comparison-item-feature{text-align:center}.plan-comparison-item-transparent{background-color:transparent;visibility:hidden}.ref,a.ref{align-items:center;border-radius:4px;display:inline-flex;font-size:80%;padding-right:.45rem;position:relative}@media print{.ref,a.ref{all:unset}}.ref:hover,a.ref:hover{color:currentColor;text-decoration:none}@media print{.ref .icon,a.ref .icon{display:none}}.ref .icon:first-child,a.ref .icon:first-child{border-bottom-left-radius:4px;border-top-left-radius:4px;margin-right:.25rem;padding-left:.45rem;padding-right:.45rem}.ref-docs:hover,a.ref-docs:hover{color:#fff}.ref-cross{background-color:color-mix(in srgb,var(--color-primary) 15%,#fff);color:var(--color-primary)}.ref-cross:hover .icon:first-child{background-color:color-mix(in srgb,var(--color-primary),#000 5%);color:#fff}.ref-cross .icon:first-child{background-color:color-mix(in srgb,var(--color-primary) 10%,#fff);color:currentColor}.ref-docs{background-color:color-mix(in srgb,var(--color-primary) 80%,#fff)}.ref-docs,.ref-docs:hover{color:#fff}.ref-docs .icon:first-child,.ref-docs:hover .icon:first-child{background-color:color-mix(in srgb,var(--color-primary),#000 12%)}.ref-docs .icon:first-child{color:#fff}.ref-docs .icon:nth-child(2){color:lcolor-mix(in srgb,var(--color-primary) 45%,#fff)}.ref-docs span{background-color:color-mix(in srgb,var(--color-primary),#000 12%);color:#fff;padding-left:.25rem;padding-right:.25rem}.article-main{margin:0 auto;max-width:60em}@media(min-width:40em){.article-main{display:flex;padding-left:1em;padding-right:1em}}@media(min-width:64em){.article-main{max-width:90em;padding-left:2em;padding-right:2em}}@media(min-width:74em){.article-main{max-width:110em}}@media(min-width:84em){.article-main{max-width:120em}}.article-sidebar{background-color:#fff;left:0;opacity:0;overflow-y:visible;position:fixed;top:158px;transform:translateY(-300px);transition:opacity .4s;visibility:hidden;width:100%;z-index:10}@media(min-width:64em){.article-sidebar{display:block;min-width:260px;opacity:1;position:sticky;transform:none;transition:none;visibility:visible;width:25%;z-index:auto}}@media(min-width:114em){.article-sidebar{width:460px}}.article-sidebar.active{opacity:1;transform:translateY(0);visibility:visible}.article-content{width:100%}@media(min-width:52em){.article-content{display:flex}}@media(min-width:64em){.article-content{width:75%}}.article-nav-wrapper{display:block;overflow-y:auto;position:sticky;top:168px}.article-sidebar-panel{border-right:1px solid #ddd;height:calc(100vh - 200px)}@media(min-width:52em){.article-content:has(.article-toc) .article-text{width:calc(100% - 320px)}}@media(min-width:52em){.article-text-full{flex:0 0 100%;max-width:none}}.article-text-full [itemprop=articleBody]{max-width:none}body.careers,body.resources{margin-top:168px}@media(min-width:64em){body.resources.guides{margin-top:238px}}.getting-started-selector img{height:60px;width:60px}.getting-started-selector button{display:flex}.getting-started-selector button p{font-family:var(--type-regular)}.getting-started-selector button.active{background-color:var(--color-primary-light)}.getting-started-selector button.active h2{color:#fff}.getting-started-selector h2{color:var(--color-primary)}.resources-topic-card-list{border:1px solid #ededed;border-radius:6px}.resources-topic-card-list li{margin:0}.resources-topic-card-list li:first-child a{border-top-left-radius:6px;border-top-right-radius:6px}.resources-topic-card-list li:last-child a{border-bottom-left-radius:6px;border-bottom-right-radius:6px}.resources-topic-card-list a{font-size:.9rem;padding:.5rem 1rem;transition:box-shadow .2s,background-color .2s}.resources-topic-card-list a:hover{box-shadow:0 0 2px 0 rgba(0,0,0,.06),0 4px 16px 0 rgba(0,0,0,.12);text-decoration:none}.resources-topic-card-list a:active{background-color:#f6f6f6;box-shadow:none}.resources-topic-card-list li:not(:last-child) a{border-bottom:1px solid #ededed}.resources-topic-card-list .bg-tutorials{background-color:var(--color-primary)}.resources-topic-card-list .bg-develop{background-color:var(--color-resources-develop)}.resources-topic-card-list .bg-architect{background-color:var(--color-spot)}.resources-topic-card-list .bg-operate{background-color:var(--primary-dark)}.resources-topic-card-list .bg-concepts{background-color:var(--color-primary)}.grid-container-index a{display:none}.grid-container-index a:nth-child(-n+3){display:grid}.article-sidebar .resources-searchbar-areas h4{border:none;padding:0}.article-sidebar li a.resources-topic{line-height:normal;padding:0}.resources-topic-image{padding:1rem}.resources-topic-image img{display:block;max-height:120px;object-fit:contain;width:100%}.resources-topic-intro{display:flex;flex-direction:column;justify-content:center;padding:0 1rem 1rem;text-align:center}.resources-topic-intro img{margin:2rem auto;max-height:100px;max-width:100px;object-fit:cover}@media(min-width:52em){.resources-topic-intro img{max-height:200px;max-width:200px}}.resources-topic-intro p{font-size:.85rem;margin:1rem auto;max-width:40em}@media(min-width:52em){.resources-topic-intro p{font-size:1.15rem}}.resources-topic-video svg{height:36px;padding:.5rem;width:36px}.resources-article-intro img{aspect-ratio:attr(width)/attr(height);border-radius:6px;height:auto;width:100%}.resources-article-intro .resources-topic h4{justify-content:normal}.article-related{border:1px solid rgba(0,0,0,.125);border-radius:2px;box-shadow:0 3px 8px 0 rgba(116,129,141,.1);padding:1rem;transition:border-color .15s ease-in-out}.article-related a{font-size:.85rem}.article-related ul{grid-gap:.25rem;display:grid;grid-template-columns:1fr 1fr}.headerlink-anchor{opacity:0}h2[id]:hover .headerlink-anchor{opacity:1}.article-sidebar-trigger{align-items:center;background-color:var(--color-primary);border-radius:50%;color:#fff;cursor:pointer;display:flex;flex-shrink:0;font-size:2.5rem;height:44px;justify-content:center;text-align:center;width:44px;z-index:100}@media(min-width:64em){.article-sidebar-trigger{display:none}}.article-sidebar-trigger:hover{background-color:var(--color-spot)}.article-sidebar-trigger .ion-navicon{font-size:2rem}.article-sidebar-trigger .ion-close{font-size:1.5rem}[itemprop=articleBody] [id]{scroll-margin-top:168px}.article-toc{--dotColor:#ddd;--dotColorActive:#d859a1;--active:#d859a1;--activeBg:rgba(157,16,223,.05);--dotSize:10px;--lineWidth:1px;--lineColor:#ddd;--listSpacing:1rem;border-left:none;display:block;max-width:none;min-width:auto;overflow-y:visible}@media(min-width:52em){.article-toc{width:320px}}.article-toc-wrapper{display:block;overflow-y:auto;position:sticky;top:168px}.article-toc h5.uppercasecaps{font-size:.75rem;padding-bottom:.5rem}.article-toc .article-toc-panel{overflow-y:auto;padding:1rem;position:sticky}@media(min-width:52em){.article-toc .article-toc-panel{height:calc(100vh - 180px)}}.article-toc nav{position:static;top:auto}.article-related-articles ol{border-left:none}.article-toc ol{list-style:none;margin:0;padding:0;position:relative}@media(min-width:84em){.article-toc ol{max-width:300px}}.article-toc-links{min-height:200px}.article-toc-links li{grid-column-gap:1rem;display:grid;grid-template-columns:20px 1fr;overflow:visible;position:relative}.article-toc .article-toc-links ol:after{background-color:#e5e7eb;content:"";height:calc(100% - var(--listSpacing)*2);left:calc(var(--dotSize) + 2px);position:absolute;top:calc(var(--dotSize));width:var(--lineWidth);z-index:0}.article-toc li span{background-color:#bbb;border-radius:50%;display:inline-block;height:var(--dotSize);position:relative;top:calc(var(--dotSize)/1.5);transform-origin:50% 50%;transition-duration:.2s;transition-timing-function:cubic-bezier(.46,.265,.285,1.635);width:var(--dotSize);z-index:2}.article-toc li.active span{background-color:var(--dotColorActive)}.article-toc li{font-size:.85rem;padding:.5rem}.article-toc li:hover{background-color:var(--color-grey-subtle)}.article-toc li a{color:#666;display:block;text-decoration:none}.article-toc li:hover span{opacity:1;transform:scale(1.25)}.article-toc li a:focus{outline:none}.article-toc li.active a{color:var(--active);font-family:var(--font-bold)}.article-toc li a:focus-visible{background-color:var(--activeBg);color:var(--active);outline:1px solid var(--active)}.article-toc li.active a span{transform:scale(1.35)}.breadcrumbs-dark{background-color:color-mix(in srgb,var(--color-primary),#000 22%)}.breadcrumbs:not(.breadcrumbs-standalone){display:none}@media(min-width:74em){.breadcrumbs:not(.breadcrumbs-standalone){display:flex}}.breadcrumbs ol{align-items:center;color:color-mix(in srgb,var(--color-primary) 8%,#fff);display:flex;flex-wrap:wrap;justify-content:flex-start;margin:0}.breadcrumbs li{color:currentColor;display:inline-flex;white-space:nowrap}.breadcrumbs li:not(:last-child){margin-right:1rem}.breadcrumbs li{font-size:.95rem}.breadcrumbs-dark li a{color:#fff}.breadcrumbs li a:hover{text-decoration:underline}.breadcrumbs li span{max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.breadcrumbs li:first-child a:before{color:#666;content:"";display:inline-block;font-family:Ionicons;font-size:1rem;margin-right:.5rem;vertical-align:middle}.breadcrumbs li:not(:last-child) a:after{color:#666;content:"";display:inline-block;font-family:Ionicons;font-size:.6rem;margin-left:1rem;vertical-align:middle}.resources-searchbar{background-color:#fff;border-bottom:1px solid #ddd;height:70px;position:fixed;top:98px;width:100%;z-index:50}.resources-searchbar .container{margin:0 auto;max-width:60em}@media(min-width:52em){.resources-searchbar .container{display:flex;padding-left:2em;padding-right:2em}}@media(min-width:64em){.resources-searchbar .container{max-width:90em}}@media(min-width:74em){.resources-searchbar .container{max-width:110em}}@media(min-width:84em){.resources-searchbar .container{max-width:120em}}.resources-searchbar .resources-searchbar-areas{display:none}@media(min-width:64em){.resources-searchbar .resources-searchbar-areas{display:flex}}.resources-searchbar .resources-topic h4{border-top:none;margin:0;padding:0}.resources_section-develop .intro-overlay svg,.resources_section-develop .resources-topic-develop svg{stroke:#fff;background-color:var(--color-resources-develop)}.resources_section-architect .intro-overlay svg,.resources_section-architect .resources-topic-architect svg{stroke:#fff;background-color:var(--color-spot)}.resources_section-usecases .intro-overlay svg,.resources_section-usecases .resources-topic-usecases svg{stroke:#fff;background-color:color-mix(in srgb,var(--color-tertiary),#000 10%)}.resources_section-operate .intro-overlay svg,.resources_section-operate .resources-topic-operate svg{stroke:#fff;background-color:var(--primary-dark)}.resources_section-code-examples .resources-topic-tutorials svg,.resources_section-concepts .intro-overlay svg,.resources_section-concepts .resources-topic-concepts svg,.resources_section-getting-started .resources-topic-tutorials svg,.resources_section-howtos .resources-topic-tutorials svg,.resources_section-tutorials .intro-overlay svg,.resources_section-tutorials .resources-topic-tutorials svg{stroke:#fff;background-color:var(--color-primary)}.resources-searchbar nav[data-active=resources-searchbar-develop] .resources-topic-develop svg{stroke:#fff;background-color:var(--color-resources-develop)}.resources-searchbar nav[data-active=resources-searchbar-architect] .resources-topic-architect svg{stroke:#fff;background-color:var(--color-spot)}.resources-searchbar nav[data-active=resources-searchbar-usecases] .resources-topic-usecases svg{stroke:#fff;background-color:color-mix(in srgb,var(--color-tertiary),#000 10%)}.resources-searchbar nav[data-active=resources-searchbar-operate] .resources-topic-operate svg{stroke:#fff;background-color:var(--primary-dark)}.resources-searchbar nav[data-active=resources-searchbar-concepts] .resources-topic-concepts svg,.resources-searchbar nav[data-active=resources-searchbar-tutorials] .resources-topic-tutorials svg{stroke:#fff;background-color:var(--color-primary)}.resources-topic-nav{background-color:#fff;border-bottom:1px solid rgba(0,0,0,.125);padding:1rem;position:sticky;text-align:center;top:136px;z-index:2}.resources-topic-nav a{background-color:#fff;border-radius:2px;display:block;font-size:.75rem;padding:.25rem 1rem;transition:all .2s}.resources-topic-nav a:active{background-color:var(--color-primary-dark);color:#fff}.pagination{grid-gap:1rem;display:grid;grid-template-areas:"previous next";grid-template-columns:1fr 1fr}.pagination a.prev{grid-area:previous}.pagination a.next{grid-area:next}.article-entry .pagination a{font-family:Roboto-Medium;font-size:.85rem}@media(min-width:52em){.article-entry .pagination a{font-size:1.25rem}}.article-entry .pagination a span{color:var(--color-spot);display:block;line-height:1.2}.article-entry .pagination a .icon{color:#ccc;font-size:1rem;transition:color .2s ease-in-out}.related-resources{grid-gap:1rem;align-items:start;container-name:related_resources;container-type:inline-size;display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}@media(min-width:114em){.related-resources{grid-template-columns:repeat(3,minmax(0,1fr))}}@container related_resources (max-width: 600px){.related-resources .card{grid-column:span 2}}.article-sidebar h4{border-bottom:1px solid #f2f2f2;font-size:.75rem;padding-bottom:1rem}.article-sidebar li a{border-radius:2px;color:#000;display:block;font-size:.9rem;line-height:1.5;padding:.65rem 2rem .65rem 1rem;position:relative}.article-sidebar li a:hover{background-color:#f6f6f6;text-decoration:none}.article-sidebar a.active,.article-sidebar a.active:hover,.article-sidebar a[aria-current=page],.article-sidebar a[aria-current=page]:hover,.article-sidebar li a:active{background-color:#e6e6e6}.article-sidebar ul{margin-left:1px}.resources-article-intro .resources-topic{border-top:none}.resources-article-intro .resources-topic svg{height:32px;width:32px}.resources-article-intro .resources-topic h4{margin:0;padding:0}.article-sidebar button[data-pagegroup]:hover{background-color:#fff}.article-sidebar button[data-pagegroup] i{font-size:unset;transform-style:preserve-3d;transition:.3s}.article-sidebar .has-children-topic>a:is(.active) button[data-pagegroup] i,.article-sidebar button[data-pagegroup]:is(.active) i{transform:rotateX(180deg)}.has-children>a{position:relative}.has-children-topic>a{color:#000}.has-children-topic+.sublist,.has-children-topic>a+.sublist{margin-left:1.5rem}.has-children-topic .sublist .has-children>span{letter-spacing:.01em}.has-children-topic .sublist .has-children>span.active{color:#000}.article-sidebar .sublist{display:flex;flex-direction:column;height:auto;max-height:0;overflow:hidden;padding-bottom:0;padding-top:0}.article-sidebar .sublist-open{max-height:6000px;overflow:initial}.article-sidebar .has-children>a.active{background-color:#f6f6f6}.sublist:empty{display:none}.article-sidebar [title="Understanding Curity Concepts"] li a:before{background-size:24px;content:"";display:inline-flex;height:24px;margin-right:.5rem;vertical-align:middle;width:24px}.article-sidebar [title="Understanding Curity Concepts"] li a[title=Overview]:before{background-image:url(/images/resources/getting-started/concepts/icon-concepts-overview.svg)}.article-sidebar [title="Understanding Curity Concepts"] li a[title=Authentication]:before{background-image:url(/images/resources/getting-started/concepts/icon-concepts-authentication.svg)}.article-sidebar [title="Understanding Curity Concepts"] li a[title=Tokens]:before{background-image:url(/images/resources/getting-started/concepts/icon-concepts-token.svg)}.article-sidebar [title="Understanding Curity Concepts"] li a[title=Data]:before{background-image:url(/images/resources/getting-started/concepts/icon-concepts-data.svg)}.article-sidebar [title="Understanding Curity Concepts"] li a[title=Availability]:before{background-image:url(/images/resources/getting-started/concepts/icon-concepts-availability.svg)}.article-sidebar [title="Understanding Curity Concepts"] li a[title=Deployment]:before{background-image:url(/images/resources/getting-started/concepts/icon-concepts-deployment.svg)}.article-sidebar{--sidebar-number-border-color:#ccc;--sidebar-number-size:20px}.sidebar-number{align-items:center;align-self:center;background-color:#fff;border:1px solid var(--sidebar-number-border-color);border-radius:50%;color:#333;display:inline-flex;flex-shrink:0;font-size:.85rem;height:var(--sidebar-number-size);justify-content:center;margin-right:.5rem;position:relative;width:var(--sidebar-number-size);z-index:1}.article-sidebar a.active .sidebar-number{background-color:var(--color-primary);border:1px solid var(--color-primary);color:#fff}.article-sidebar li,.article-sidebar ul{position:relative}.article-sidebar .has-children-topic:has(.sidebar-number)+.sublist-open:after,.article-sidebar li:has(.sidebar-number):after{background-color:var(--sidebar-number-border-color);content:"";height:100%;left:25px;position:absolute;top:30px;width:1px;z-index:0}.article-sidebar .has-children-topic:has(.sidebar-number)+.sublist-open:after{left:1px}.article-sidebar li:has(.sidebar-number-1):after{height:100%}.article-sidebar li:has(.sidebar-number-4):after{height:calc(100% - 20px)}.resources-whats-new .timeline-header{margin:0 auto;max-width:660px}.timeline-types{background-color:#fff;margin:0 auto;max-width:700px;padding:1.5rem;position:sticky;top:168px;width:100%;z-index:2}.timeline{flex-direction:column;justify-content:flex-end;list-style-type:none;margin:20px auto 0;max-width:660px;padding:1em 0;position:relative;z-index:1}.timeline:before{background:#505050;background:linear-gradient(180deg,rgba(80,80,80,0) 0,#505050 8%,#505050 92%,rgba(80,80,80,0));content:" ";display:block;height:100%;left:0;margin-left:-2px;position:absolute;top:0;width:4px;z-index:5}.flag-wrapper{border:1px solid transparent;border-radius:4px;display:block;margin-left:2rem;padding:1rem;position:relative;transition:background-color .1s ease-in-out}.timeline li:hover .flag-wrapper{background-color:#fafafa;border:1px solid #f6f6f6}.timeline li:active .flag-wrapper,.timeline li:focus .flag-wrapper{background-color:#f6f6f6}.timeline a{color:var(--color-primary)}.timeline a:hover{text-decoration:none}.flag-wrapper strong{font-size:.75rem}.flag{display:inline}.timeline li time{display:block}.direction-r .flag:before{background:#fff;border:4px solid var(--color-spot);border-radius:10px;content:" ";display:block;height:16px;left:-41px;margin-top:-10px;position:absolute;right:auto;top:50%;transition:transform .2s;width:16px;z-index:10}.direction-r .flag-wrapper:hover .flag:before{transform:scale(1.5)}.time{background:#f8f8f8;display:block;padding:4px 6px}.guides-container{display:flex;flex-wrap:wrap;gap:1.5rem;justify-content:center;width:100%}@media(min-width:64em){.guides-container{gap:2rem}}.guides-container>div{flex-basis:calc(50% - 1.5rem);flex-grow:0;flex-shrink:0}@media(min-width:64em){.guides-container>div{flex-basis:calc(25% - 2rem);flex-grow:0;flex-shrink:0}}.guides-container>div:focus{border-radius:6px}.guides-navigation-button,.guides-navigation-button:hover{border:none;box-shadow:none;color:var(--color-primary)}.guides-navigation-button:hover{background-color:transparent}.guides-dark{background:linear-gradient(45deg,color-mix(in srgb,var(--color-primary),#000 70%) 0,color-mix(in srgb,var(--color-primary),#000 70%) 100%)}.guides .grid-container .card p{font-size:.85rem}.guides-dark .grid-container .card,.guides-dark .guides-container .card{background-color:color-mix(in srgb,var(--color-primary),#000 50%);border:1px solid transparent}.guides-dark .grid-container .card:hover,.guides-dark .guides-container .card:hover{border:1px solid hsla(0,0%,100%,.5)}.guides-dark .grid-container .card h4,.guides-dark .guides-container .card h4,.guides-dark h1,.guides-dark h2,.guides-dark h3,.guides-dark p{color:#fff}.guides-type{color:var(--color-resources-develop)}.guides-dark .guides-navigation-button{color:#fff}.guides-dark .guides-navigation-button:hover{background-color:color-mix(in srgb,var(--color-primary),#000 30%)}.guides-dark .grid-container .card.card-advanced:hover{border:1px solid var(--color-resources-develop)}.star-dimmed{color:var(--color-grey-light)}.card .star-dimmed{color:var(--color-primary)}.guides-header{background:linear-gradient(45deg,color-mix(in srgb,var(--color-primary),#000 70%) 0,color-mix(in srgb,var(--color-primary),#000 70%) 100%)}@media(min-width:64em){.guides-header{height:70px;position:fixed;top:168px;width:100%;z-index:50}.guides-header-wrapper{align-items:center;display:flex;justify-content:space-between}}.guides-header .sm-flex:first-of-type{height:56px}.guides-header .guides-header-breadrcumbs{align-items:center;display:flex;max-width:90%;overflow-x:auto;white-space:nowrap}@media(min-width:64em){.guides-header .guides-header-breadrcumbs{max-width:none;overflow-x:initial;white-space:normal}}.guides-header .guides-header-breadrcumbs li{align-items:center;color:#fff;display:block;display:flex;font-size:1rem;height:100%;justify-content:center}.guides-footer .guides-header-breadrcumbs a,.guides-header .guides-header-breadrcumbs li a{color:#fff;display:block;font-size:1rem;padding:.25rem .5rem}.guides-footer .guides-header-breadrcumbs a:hover,.guides-header .guides-header-breadrcumbs li a:hover{text-decoration:underline}.guides-header .guides-header-breadrcumbs li:first-child a:before{color:var(--color-primary-light);content:"";display:inline-block;font-family:Ionicons;margin-right:.5rem;vertical-align:middle}.guides-header .guides-header-breadrcumbs li:not(:last-child) a:after{color:#fff;content:"";display:inline-block;font-family:Ionicons;margin-left:.5rem;vertical-align:middle}.guides-security-header-levels .button-transparent:hover{background-color:transparent}.guides-footer{border-top:1px solid var(--color-primary)}.security-level-indicator{background-color:var(--color-primary-light);border-radius:50%;display:block;height:14px;margin-right:.5rem;width:14px}.security-level-indicator-advanced{background-color:var(--color-resources-develop)}.security-level-indicator-badge{border:1px solid var(--color-primary-light);border-radius:6px;font-size:.85rem;padding:.35rem 1.25rem}.security-level-indicator-badge.advanced{border:1px solid color-mix(in srgb,var(--color-resources-develop) 10%,#fff);color:#fff}.security-level-indicator-badge .security-level-indicator{height:8px;width:8px}.security-level-indicator-badge.security-level-indicator-badge-light{border:1px solid var(--color-resources-develop);color:var(--color-resources-develop)}input[type=search].searchfield{appearance:none;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cline x1='21' x2='16.65' y1='21' y2='16.65'/%3E%3C/svg%3E");background-position:.5em;background-repeat:no-repeat;background-size:16px 16px;padding-left:32px;width:100%}@media(min-width:40em){input[type=search].searchfield{width:400px}}@media(min-width:84em){table.library-table td,table.library-table th{font-size:medium;padding:1rem}table.library-table th:first-child,table.library-table th:nth-child(2),table.library-table th:nth-child(8){width:15%}}table.library-table td{border:none;color:#fff;vertical-align:top}table.library-table td,table.library-table tr:nth-child(2n){background-color:transparent}table.library-table tr{border-top:none}table.library-table th{background-color:color-mix(in srgb,var(--color-primary),#000 25%);border:none;color:#fff;cursor:pointer;font-size:1rem;padding:1rem;-webkit-user-select:none;user-select:none;white-space:nowrap}@media(min-width:64em){table.library-table th{text-align:left}}table.library-table th svg{margin-left:.25rem;vertical-align:middle}@media(min-width:64em){table.library-table tr:hover td{background-color:color-mix(in srgb,var(--color-primary),#000 35%)}}table.library-table td svg{display:inline-block;height:36px;object-fit:contain;vertical-align:middle;width:36px}table.library-table td svg:not(last-child){margin-left:.5rem}@media screen and (max-width:1024px){table.library-table thead{clip:rect(0 0 0 0);border:none;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}table.library-table tr{display:block}table.library-table td{display:block;text-align:right}table.library-table td:before{content:attr(data-label);float:left}table.library-table td[data-label=Description]:before{clip:rect(0 0 0 0);border:none;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}table.library-table td[data-label=Comment]{margin-top:1rem}table.library-table td:last-child{border-bottom:0}}#google_translate_element{margin-left:auto;width:200px}#\:0\.targetLanguage{color:transparent}#\:0\.targetLanguage>div{display:none}.goog-te-gadget{color:transparent!important}.goog-te-gadget img,.goog-te-gadget span:last-child{display:none}.goog-te-combo{color:initial}:root{--font-light:"Roboto-Light",Roboto,-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;--type-regular:"Roboto-Regular",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;--font-bold:"Roboto-Medium",Roboto,-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;--font-extra-bold:"Roboto-Bold",Roboto,-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;--color-text:#737373;--color-heading:#262c3d;--color-light:#fff;--color-primary:#4d556a;--color-primary-dark:#262c3d;--color-primary-medium:#3c4764;--color-primary-light:#7e89a8;--color-tertiary:#f2eb80;--color-success:#57c75c;--color-info:#62818f;--color-danger:#ca2e2b;--color-warning:#e0c01c;--color-add:#0092ff;--color-spot:#d859a1;--color-link:#d859a1;--color-link-hover:#87148b;--color-grey:#aeaeae;--color-grey-light:#ccc;--color-grey-subtle:#f6f6f6;--color-resources-develop:#4aa69e;--color-github:#333;--color-paragraphs:#4d4d4d;--curityToastDuration:5000}.curityToast{align-items:center;animation:pop calc(var(--curityToastDuration)*1ms) cubic-bezier(0,0,.2,1);background-color:#333;border-radius:6px;bottom:32px;box-shadow:0 1px 3px rgba(0,0,0,.15),0 2px 6px rgba(0,0,0,.15);box-sizing:border-box;color:#fff;display:flex;font-family:Roboto-Regular,system-ui;font-size:1rem;justify-content:space-between;left:50%;line-height:1.2;max-width:calc(100vw - 64px);min-height:54px;min-width:90%;opacity:0;padding:.75rem 1.5rem;position:fixed;transform:translateX(-50%) scale(.87);transform-origin:center bottom;z-index:99999999}@media only screen and (min-width:40em){.curityToast{font-size:1rem;max-width:calc(100vw - 64px);min-width:240px}}.curityToast p{color:#fff;margin:0}.curityToast span{height:24px;margin-right:1rem;width:24px}.curityToast button,.curityToast span{align-items:center;appearance:none;background-color:transparent;border:none;border-radius:50%;color:#fff;display:inline-flex;justify-content:center;outline:none;vertical-align:middle;white-space:nowrap}.curityToast button{cursor:pointer;font-size:1rem;height:34px;margin-left:1rem;transition:all .2s;width:34px}.curityToast button:hover{background-color:#fff;box-shadow:0 0 0 3px rgba(66,153,225,.3);color:initial}.curityToast button:focus{box-shadow:0 0 0 3px rgba(66,153,225,.6)}.curityToast.stay{animation:stay .15s cubic-bezier(0,0,.2,1) forwards}.curityToast-success{background-color:#00c853}.curityToast-danger{background-color:#f44336}.curityToast-warning{background-color:orange}.curityToast-info{background-color:#1a202c}.curityToast-info a{color:#fafad2}.curityToast-notify{justify-content:center}@keyframes stay{0%{opacity:0;transform:translateX(-50%) scale(.87)}to{opacity:1;transform:translateX(-50%) scale(1)}}@keyframes pop{0%{opacity:0;transform:translateX(-50%) scale(.87)}3.75%,96.25%{opacity:1;transform:translateX(-50%) scale(1)}to{animation-timing-function:cubic-bezier(.4,0,1,1);opacity:0;transform:translateX(-50%) scale(1)}}</style><link rel="sitemap" type="application/xml" href="/sitemap-index.xml"/><link rel="preconnect" href="https://www.googletagmanager.com"/><link rel="dns-prefetch" href="https://www.googletagmanager.com"/><script nonce="5e78246357cfbb1bc118c84245311b69">window.dataLayer = window.dataLayer || [];window.dataLayer.push({"platform":"gatsby"}); (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl+'';f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer', 'GTM-TCC5B9G');</script><title data-react-helmet="true">Implement custom authentication within an OAuth flow | Curity</title><link data-react-helmet="true" rel="canonical" href="https://curity.io/resources/learn/getting-started-authentication-plugins/"/><link data-react-helmet="true" rel="preconnect" crossorigin="true" href="https://sc.lfeeder.com"/><link data-react-helmet="true" rel="preconnect" crossorigin="true" href="https://www.youtube.com"/><link data-react-helmet="true" rel="preconnect" crossorigin="true" href="https://i.ytimg.com"/><link data-react-helmet="true" rel="preconnect" crossorigin="true" href="https://fonts.gstatic.com"/><link data-react-helmet="true" rel="preconnect" crossorigin="true" href="https://clarity.ms"/><link data-react-helmet="true" rel="preconnect" crossorigin="true" href="https://js.hs-analytics.net"/><link data-react-helmet="true" rel="preconnect" crossorigin="true" href="https://js.usemessages.com/conversations-embed.js"/><link data-react-helmet="true" rel="preconnect" crossorigin="true" href="https://js.hs-banner.com"/><link data-react-helmet="true" rel="preconnect" crossorigin="true" href="https://js.hscollectedforms.net"/><noscript data-react-helmet="true"> <img height="1" width="1" style="display:none;" alt="" src="https://px.ads.linkedin.com/collect/?pid=1940426&fmt=gif" /> </noscript><script nonce="5e78246357cfbb1bc118c84245311b69" data-react-helmet="true" type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","mainEntityOfPage":{"@type":"WebPage","@id":"https://google.com/article"},"headline":"Getting Started with Authentication Plugins","image":["https://curity.io/images/resources/tutorials/frontend/authentication-plugins-getting-started.png"],"datePublished":"2024-08-13","author":{"@type":"Person","name":"Gary Archer"},"url":"https://curity.io/resources/learn/getting-started-authentication-plugins/","description":"Implement custom authentication within an OAuth flow","publisher":{"@type":"Organization","name":"Curity","logo":{"@type":"ImageObject","url":"https://curity.io/images/curity-logo-landscape.png"}}}</script><style>.gatsby-image-wrapper{position:relative;overflow:hidden}.gatsby-image-wrapper picture.object-fit-polyfill{position:static!important}.gatsby-image-wrapper img{bottom:0;height:100%;left:0;margin:0;max-width:none;padding:0;position:absolute;right:0;top:0;width:100%;object-fit:cover}.gatsby-image-wrapper [data-main-image]{opacity:0;transform:translateZ(0);transition:opacity .25s linear;will-change:opacity}.gatsby-image-wrapper-constrained{display:inline-block;vertical-align:top}</style><noscript><style>.gatsby-image-wrapper noscript [data-main-image]{opacity:1!important}.gatsby-image-wrapper [data-placeholder-image]{opacity:0!important}</style></noscript><script nonce="5e78246357cfbb1bc118c84245311b69" type="module">const e="undefined"!=typeof HTMLImageElement&&"loading"in HTMLImageElement.prototype;e&&document.body.addEventListener("load",(function(e){const t=e.target;if(void 0===t.dataset.mainImage)return;if(void 0===t.dataset.gatsbyImageSsr)return;let a=null,n=t;for(;null===a&&n;)void 0!==n.parentNode.dataset.gatsbyImageWrapper&&(a=n.parentNode),n=n.parentNode;const o=a.querySelector("[data-placeholder-image]"),r=new Image;r.src=t.currentSrc,r.decode().catch((()=>{})).then((()=>{t.style.opacity=1,o&&(o.style.opacity=0,o.style.transition="opacity 500ms linear")}))}),!0);</script><link rel="icon" href="/favicon-32x32.png?v=0c3dd2c9553a933c6c79aba3c5330e3b" type="image/png"/><link rel="manifest" href="/manifest.webmanifest" crossorigin="anonymous"/><link rel="apple-touch-icon" sizes="48x48" href="/icons/icon-48x48.png?v=0c3dd2c9553a933c6c79aba3c5330e3b"/><link rel="apple-touch-icon" sizes="72x72" href="/icons/icon-72x72.png?v=0c3dd2c9553a933c6c79aba3c5330e3b"/><link rel="apple-touch-icon" sizes="96x96" href="/icons/icon-96x96.png?v=0c3dd2c9553a933c6c79aba3c5330e3b"/><link rel="apple-touch-icon" sizes="144x144" href="/icons/icon-144x144.png?v=0c3dd2c9553a933c6c79aba3c5330e3b"/><link rel="apple-touch-icon" sizes="192x192" href="/icons/icon-192x192.png?v=0c3dd2c9553a933c6c79aba3c5330e3b"/><link rel="apple-touch-icon" sizes="256x256" href="/icons/icon-256x256.png?v=0c3dd2c9553a933c6c79aba3c5330e3b"/><link rel="apple-touch-icon" sizes="384x384" href="/icons/icon-384x384.png?v=0c3dd2c9553a933c6c79aba3c5330e3b"/><link rel="apple-touch-icon" sizes="512x512" href="/icons/icon-512x512.png?v=0c3dd2c9553a933c6c79aba3c5330e3b"/><link rel="alternate" type="application/rss+xml" href="/news-feed.xml"/><link rel="alternate" type="application/json" href="/news-feed.json"/><link rel="alternate" type="application/rss+xml" href="/feed.xml"/><link rel="alternate" type="application/rss+xml" href="/howtos-feed.xml"/><link rel="alternate" type="application/rss+xml" href="/code-examples-feed.xml"/><link rel="alternate" type="application/json" href="/code-examples-feed.json"/><link rel="preload" href="/fonts/Roboto-Regular.woff2" as="font" crossorigin="anonymous" type="font/woff2"/><link rel="preload" href="/fonts/Roboto-Light.woff2" as="font" crossorigin="anonymous" type="font/woff2"/><link rel="preload" href="/fonts/Roboto-Medium.woff2" as="font" crossorigin="anonymous" type="font/woff2"/><link rel="preload" href="/fonts/roboto-mono-v12-latin-regular.woff2" as="font" crossorigin="anonymous" type="font/woff2"/><link rel="preload" href="/fonts/ionicons.woff2" as="font" crossorigin="anonymous" type="font/woff2"/><link rel="preload" href="/fonts/Roboto-Bold.woff2" as="font" crossorigin="anonymous" type="font/woff2"/><style> @font-face { font-family: "Roboto-Regular"; font-display: swap; font-style: normal; src: url("/fonts/Roboto-Regular.woff2") format("woff2"); } @font-face { font-family: "Roboto-Medium"; font-display: swap; font-style: normal; src: url("/fonts/Roboto-Medium.woff2") format("woff2"); } @font-face { font-family: "Roboto-Light"; font-display: swap; font-style: normal; src: url("/fonts/Roboto-Light.woff2") format("woff2"); } @font-face { font-family: "Roboto-Mono"; font-display: swap; font-style: normal; src: url("/fonts/roboto-mono-v12-latin-regular.woff2") format("woff2"); } @font-face { font-family: "Roboto-Bold"; font-display: swap; font-style: normal; src: url("/fonts/Roboto-Bold.woff2") format("woff2"); } @font-face { font-family: "Ionicons"; src: url("/fonts/ionicons.woff2") format("woff2"); font-style: normal; font-display: swap; } </style></head><body class="resources resources_section resources_section-tutorials"><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-TCC5B9G" height="0" width="0" style="display: none; visibility: hidden" aria-hidden="true"></iframe></noscript><div id="___gatsby"><div style="outline:none" tabindex="-1" id="gatsby-focus-wrapper"><div class="mobile-nav "><div class="flex flex-center justify-between p1"><img class="header-top-logo block" src="data:image/svg+xml;base64,PHN2ZyBkYXRhLW5hbWU9IkxheWVyIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE4Mi41NyAzNi4zMyI+PHBhdGggZD0ibTUzLjA2IDI2Ljc5LS41Ni41N2ExNS45MyAxNS45MyAwIDAgMS0xMC45MyA1IDEwIDEwIDAgMCAxLTEwLjM0LTEwLjRjMC02IDQuMjQtMTAuMzkgMTAuMDktMTAuMzlhMTYuNjcgMTYuNjcgMCAwIDEgMTAuMjIgNGwuNTYuNDkgNS42MS01Ljg2LS42My0uNTRhMjUuNzggMjUuNzggMCAwIDAtMTYuMzYtNS45MSAxOC40NCAxOC40NCAwIDAgMC0xNS4zNyA3LjY4SDE1bC0uNiA1LjA5aDguNWExNy45IDE3LjkgMCAwIDAtLjU5IDIuODZIOS42MUw5IDI0LjQ2aDEzLjMxYTE4LjU2IDE4LjU2IDAgMCAwIC41NyAyLjg2SDMuNzdsLS42MSA1LjA5SDI1LjNjMy4yOSA0Ljc0IDguOSA3LjY4IDE1LjY3IDcuNjhhMjUuNDEgMjUuNDEgMCAwIDAgMTcuMTktNi45M2wuNTktLjU2WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMuMTYgLTMuNzUpIiBzdHlsZT0iZmlsbDojZmZmIi8+PHBhdGggc3R5bGU9ImZpbGw6I2ZmZiIgZD0iTTUuMDEgMTUuNjJIMS4yNmwtLjYgNS4wOUg0LjRsLjYxLTUuMDl6Ii8+PHBhdGggZD0iTTg4IDI2LjE0YTEzLjMxIDEzLjMxIDAgMCAxLTkuMDYgMy42NmMtNS45MiAwLTkuODItNC4yMy05LjgyLTkuNDdhOS4zNiA5LjM2IDAgMCAxIDkuNjgtOS40NEExMy42NiAxMy42NiAwIDAgMSA4Ny40MSAxNEw4NSAxNi41NmE5LjU1IDkuNTUgMCAwIDAtNS44NC0yLjI5IDUuODIgNS44MiAwIDAgMC01LjkyIDYuMDkgNS44NyA1Ljg3IDAgMCAwIDYuMDYgNi4wOCA5LjE5IDkuMTkgMCAwIDAgNi4yNS0yLjgzWk0xMDcuNDQgMTEuNDN2MTEuNDFjMCA0LjQ1LTMuNDQgNy04LjE2IDdzLTguMTEtMi41MS04LjExLTdWMTEuNDNoMy45M3YxMS40MWMwIDIuMzUgMS44OCAzLjYgNC4xOCAzLjZzNC4yMy0xLjI1IDQuMjMtMy42VjExLjQzWk0xMTIuNzMgMjkuMjVWMTEuNDNoOS44OGE3IDcgMCAwIDEgNS4zOSAxLjk0IDUuMzYgNS4zNiAwIDAgMSAxLjQ3IDMuNjkgNS40NyA1LjQ3IDAgMCAxLTMuNiA1bDQuMTMgNy4xOWgtNC40N2wtMy42LTYuNTVoLTUuM3Y2LjU1Wm0zLjktMTQuNTF2NC42NkgxMjNhMi4zOCAyLjM4IDAgMCAwIDIuNDgtMi4zNCAyLjE3IDIuMTcgMCAwIDAtLjYzLTEuNTYgMi42NiAyLjY2IDAgMCAwLTIuMTMtLjc2Wk0xMzQgMjkuMjVWMTEuNDNoMy45MXYxNy44MlpNMTQxLjQ0IDExLjQzaDE2LjgxdjMuMzloLTYuNDR2MTQuNDNoLTMuOTFWMTQuODJoLTYuNDZaTTE3Ny4xMyAxMS40M2wtNy4wNyA5LjY5djguMTNoLTMuOTN2LTguMTNMMTU5IDExLjQzaDQuODVsNC4zNCA2LjIgNC4zMi02LjJaTTE3OC4wNyAxMS4wOGE0IDQgMCAwIDEgMS4xMi0yLjg2IDMuNzQgMy43NCAwIDAgMSA1LjQzIDAgNCA0IDAgMCAxIDEuMTEgMi44NiA0IDQgMCAwIDEtMS4xMiAyLjkyIDMuNzIgMy43MiAwIDAgMS01LjQyIDAgNCA0IDAgMCAxLTEuMTItMi45MlptLjY1IDBhMy4zOSAzLjM5IDAgMCAwIC45MyAyLjQyIDMgMyAwIDAgMCAyLjI2IDEgMyAzIDAgMCAwIDIuMjQtMSAzLjM3IDMuMzcgMCAwIDAgLjkzLTIuNDEgMy4zNCAzLjM0IDAgMCAwLS45My0yLjQgMyAzIDAgMCAwLTIuMjQtMSAzIDMgMCAwIDAtMi4yNiAxIDMuMzQgMy4zNCAwIDAgMC0uOTMgMi4zOVptMi40LjQxdjEuODJoLS44VjguNzJoMS41MWEyLjA2IDIuMDYgMCAwIDEgMS4yOS4zNiAxLjIxIDEuMjEgMCAwIDEgLjQ2IDEgMSAxIDAgMCAxLS4xNy41OSAxLjM4IDEuMzggMCAwIDEtLjUyLjQyIDEgMSAwIDAgMSAuNTEuNDMgMS4zNSAxLjM1IDAgMCAxIC4xNi42OXYuN2EuNzcuNzcgMCAwIDAgLjA4LjI5di4wOGgtLjgzYTEuMDggMS4wOCAwIDAgMS0uMDYtLjMzdi0uNzRhLjguOCAwIDAgMC0uMTgtLjU3LjgzLjgzIDAgMCAwLS42LS4xOFptMC0uN2guODJhMS4xMiAxLjEyIDAgMCAwIC42LS4xOC41NS41NSAwIDAgMCAuMjUtLjQ3LjY4LjY4IDAgMCAwLS4yMi0uNTYgMS4zNCAxLjM0IDAgMCAwLS43NC0uMTVoLS43MVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zLjE2IC0zLjc1KSIgc3R5bGU9ImZpbGw6I2ZmZiIvPjwvc3ZnPgo=" aria-label="Back to homepage" alt="Curity logo" width="120" height="32"/><div class="flex flex-center flex-gap-1 justify-end"><button class="mobile-nav-close"><i class="icon ion-close"></i></button></div></div><nav role="navigation"><ul class="list-reset m0 block"><li><button class="navigation-expand ">Product<i class="icon ion-chevron-down"></i></button><ul class="mobile-nav-children list-reset false"><li><a style="padding-left:4rem" href="/product/">Product Overview</a></li><li><a style="padding-left:4rem" href="/product/authentication-service/">Authentication Service</a></li><li><a style="padding-left:4rem" href="/product/token-service/">Token Service</a></li><li><a style="padding-left:4rem" href="/product/user-management-service/">User Management Service</a></li><li><a style="padding-left:4rem" href="/product/token-handler/">Curity Token Handler</a></li><li><a style="padding-left:4rem" href="/product/authentication/">Authentication</a></li><li><a style="padding-left:6rem" href="/product/authentication/passwordless-authentication/">Passwordless Authentication</a></li><li><a style="padding-left:6rem" href="/product/authentication/sso-mfa-and-social-logins/">SSO, MFA and Social Logins</a></li><li><a style="padding-left:6rem" href="/product/authentication/advanced-authentication/">Advanced Authentication</a></li><li><a style="padding-left:4rem" href="/product/secure-access/">Secure Acccess</a></li><li><a style="padding-left:6rem" href="/product/secure-access/high-grade-api-security/">High-Grade API Security</a></li><li><a style="padding-left:6rem" href="/product/secure-access/customer-iam/">Customer IAM</a></li><li><a style="padding-left:6rem" href="/product/secure-access/api-access-control/">API Access Control</a></li><li><a style="padding-left:6rem" href="/product/secure-access/spa-security/">SPA Security</a></li><li><a style="padding-left:4rem" href="/product/user-journey-orchestration/">User Journey Orchestration</a></li><li><a style="padding-left:6rem" href="/product/user-journey-orchestration/actions/">Authentication Actions</a></li><li><a style="padding-left:6rem" href="/product/user-journey-orchestration/browserless-login/">Browserless Login</a></li><li><a style="padding-left:6rem" href="/product/user-journey-orchestration/adaptive-authentication/">Adaptive Authentication</a></li><li><a style="padding-left:6rem" href="/product/user-journey-orchestration/branding-and-ux/">Branding and UX</a></li><li><a style="padding-left:4rem" href="/product/decentralized-identity/">Decentralized Identity</a></li><li><a style="padding-left:6rem" href="/product/decentralized-identity/wallet/">Digital Wallet</a></li><li><a style="padding-left:6rem" href="/product/decentralized-identity/verifiable-credentials/">Verifiable Credentials</a></li><li><a style="padding-left:4rem" href="/product/extensibility-and-sdks/">Extensibility and SDK:s</a></li><li><a style="padding-left:4rem" href="/product/identity-standards/">Identity Standards</a></li><li><a style="padding-left:6rem" href="/product/identity-standards/conformance/">Standards and Conformance</a></li><li><a style="padding-left:4rem" href="/product/community/">Community Edition</a></li><li><a style="padding-left:4rem" href="/product/plans/">Product Plans</a></li><li><a style="padding-left:4rem" href="/faq/">FAQ</a></li><li><a style="padding-left:4rem" href="/support/">Support</a></li><li><a style="padding-left:4rem" href="/product/deployment/">Deployment</a></li><li><a style="padding-left:6rem" href="/product/deployment/multi-tenancy/">Multi-Tenancy</a></li><li><a style="padding-left:6rem" href="/product/deployment/multi-region/">Multi-Region</a></li><li><a style="padding-left:4rem" href="/product/devops-and-secops/">DevOps and Secops</a></li><li><a style="padding-left:6rem" href="/product/devops-and-secops/devops-dashboard/">DevOps Dashboard</a></li><li><a style="padding-left:6rem" href="/product/devops-and-secops/configuration/">Configuration and GitOps</a></li><li><a style="padding-left:6rem" href="/product/devops-and-secops/alarms/">Alarms</a></li><li><a style="padding-left:6rem" href="/product/devops-and-secops/monitoring-and-metrics/">Monitoring and Metrics</a></li>&gt;</ul></li><li><button class="navigation-expand ">Solutions<i class="icon ion-chevron-down"></i></button><ul class="mobile-nav-children list-reset false"><li><a href="/solutions/common-identity-platform/">Common Identity Platform</a></li><li><a href="/solutions/identity-for-government-solutions/">Identity for Government Solutions</a></li><li><a href="/solutions/modernizing-infrastructure/">Modernizing Infrastructure</a></li><li><a href="/solutions/open-banking-and-fapi/">Open Banking &amp; Financial-Grade APIs</a></li><li><a href="/solutions/protecting-health-care/">Protecting Health Care</a></li><li><a href="/solutions/protecting-telecom-services/">Protecting Telecom Services</a></li><li><a href="/solutions/secure-financial-services/">Secure Financial Services</a></li><li><a href="/solutions/frictionless-authentication/">Secure Frictionless Authentication</a></li><li><a href="/solutions/tech-and-saas-security/">Tech and SaaS Security</a></li><li><a href="/solutions/zero-trust/">Zero Trust and Security Architecture</a></li></ul></li><li><button class="navigation-expand ">Resources<i class="icon ion-chevron-down"></i></button><ul class="mobile-nav-children list-reset false"><li><a href="/resources/">Resource Library</a></li><li><a href="/resources/whats-new/">What&#x27;s New</a></li><li><a href="/resources/articles/">Articles</a></li><li><a href="/resources/getting-started/">Getting Started</a></li><li><a href="/resources/how-tos/">How-tos</a></li><li><a href="/resources/code-examples/">Code Examples</a></li><li><a href="/resources/webinars/">Webinars</a></li><li><a href="/resources/documents/">Whitepapers</a></li><li><a href="/resources/documents/">Documents</a></li><li><a href="/resources/videos/">Videos</a></li><li><a href="/resources/courses/">Courses</a></li><li><a href="/oauth-tools/">OAuth Tools</a></li>&gt;</ul></li><li><button class="navigation-expand ">Company<i class="icon ion-chevron-down"></i></button><ul class="mobile-nav-children list-reset false"><li><a href="/company/">About</a></li><li><a href="/company/customers/">Customers</a></li><li><a href="/company/partners/">Partners</a></li><li><a href="/blog/">Blog</a></li><li><a href="/company/careers/">Careers</a></li><li><a href="/company/events/">Events Calendar</a></li><li><a href="/company/esg/">ESG</a></li><li><a href="/news/">News</a></li><li><a href="/investors/">Investor Relations</a></li></ul></li><li><button class="navigation-expand ">Developer<i class="icon ion-chevron-down"></i></button><ul class="mobile-nav-children list-reset false"><li><a href="https://developer.curity.io">Developer Portal</a></li><li><a href="https://developer.curity.io/release/latest/">Releases</a></li><li><a href="https://curity.io/docs/">Documentation</a></li><li><a href="https://developer.curity.io/sources/">Libraries &amp; SDKs</a></li><li><a href="https://oauth.tools/?utm_source=curity.io&amp;utm_medium=Link&amp;utm_content=navigation">OAuth Tools</a></li></ul></li><li><a class="block" href="/product/plans/">Plans &amp; Pricing</a></li><li><button class="navigation-expand ">Support<i class="icon ion-chevron-down"></i></button><ul class="mobile-nav-children list-reset false"><li><a class="block" href="/support/">Ticket-based Support</a></li><li><a class="block" href="/support/instant-message-support/">Instant Message Support</a></li><li><a class="block" href="/support/professional-services/">Professional Services</a></li><li><a class="block" href="/training/">Training</a></li></ul></li><li><a class="block" href="/contact/">Contact</a></li><li><a class="block" href="/search/">Search</a></li></ul><div class="flex flex-column flex-gap-2 p2"></div></nav></div><header class="header" role="banner"><div class="header-stripe"><a aria-current="true" href="/curity-axiomatics-london-meetup/"><span class="pill pill-bright-gradient mr2">News</span>London, March 26 – Modern Business, Secured: Customer Identity and Access for the Future. RSVP now! <i class="icon ion-android-arrow-forward ml2"></i></a></div><nav class="header-top" role="navigation"><div class="container relative h100"><div class="flex flex-center flex-justify h100"><div class="flex flex-center flex-justify h100"><a href="/"><img class="header-top-logo block mr4" src="data:image/svg+xml;base64,PHN2ZyBkYXRhLW5hbWU9IkxheWVyIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE4Mi41NyAzNi4zMyI+PHBhdGggZD0ibTUzLjA2IDI2Ljc5LS41Ni41N2ExNS45MyAxNS45MyAwIDAgMS0xMC45MyA1IDEwIDEwIDAgMCAxLTEwLjM0LTEwLjRjMC02IDQuMjQtMTAuMzkgMTAuMDktMTAuMzlhMTYuNjcgMTYuNjcgMCAwIDEgMTAuMjIgNGwuNTYuNDkgNS42MS01Ljg2LS42My0uNTRhMjUuNzggMjUuNzggMCAwIDAtMTYuMzYtNS45MSAxOC40NCAxOC40NCAwIDAgMC0xNS4zNyA3LjY4SDE1bC0uNiA1LjA5aDguNWExNy45IDE3LjkgMCAwIDAtLjU5IDIuODZIOS42MUw5IDI0LjQ2aDEzLjMxYTE4LjU2IDE4LjU2IDAgMCAwIC41NyAyLjg2SDMuNzdsLS42MSA1LjA5SDI1LjNjMy4yOSA0Ljc0IDguOSA3LjY4IDE1LjY3IDcuNjhhMjUuNDEgMjUuNDEgMCAwIDAgMTcuMTktNi45M2wuNTktLjU2WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMuMTYgLTMuNzUpIiBzdHlsZT0iZmlsbDojZmZmIi8+PHBhdGggc3R5bGU9ImZpbGw6I2ZmZiIgZD0iTTUuMDEgMTUuNjJIMS4yNmwtLjYgNS4wOUg0LjRsLjYxLTUuMDl6Ii8+PHBhdGggZD0iTTg4IDI2LjE0YTEzLjMxIDEzLjMxIDAgMCAxLTkuMDYgMy42NmMtNS45MiAwLTkuODItNC4yMy05LjgyLTkuNDdhOS4zNiA5LjM2IDAgMCAxIDkuNjgtOS40NEExMy42NiAxMy42NiAwIDAgMSA4Ny40MSAxNEw4NSAxNi41NmE5LjU1IDkuNTUgMCAwIDAtNS44NC0yLjI5IDUuODIgNS44MiAwIDAgMC01LjkyIDYuMDkgNS44NyA1Ljg3IDAgMCAwIDYuMDYgNi4wOCA5LjE5IDkuMTkgMCAwIDAgNi4yNS0yLjgzWk0xMDcuNDQgMTEuNDN2MTEuNDFjMCA0LjQ1LTMuNDQgNy04LjE2IDdzLTguMTEtMi41MS04LjExLTdWMTEuNDNoMy45M3YxMS40MWMwIDIuMzUgMS44OCAzLjYgNC4xOCAzLjZzNC4yMy0xLjI1IDQuMjMtMy42VjExLjQzWk0xMTIuNzMgMjkuMjVWMTEuNDNoOS44OGE3IDcgMCAwIDEgNS4zOSAxLjk0IDUuMzYgNS4zNiAwIDAgMSAxLjQ3IDMuNjkgNS40NyA1LjQ3IDAgMCAxLTMuNiA1bDQuMTMgNy4xOWgtNC40N2wtMy42LTYuNTVoLTUuM3Y2LjU1Wm0zLjktMTQuNTF2NC42NkgxMjNhMi4zOCAyLjM4IDAgMCAwIDIuNDgtMi4zNCAyLjE3IDIuMTcgMCAwIDAtLjYzLTEuNTYgMi42NiAyLjY2IDAgMCAwLTIuMTMtLjc2Wk0xMzQgMjkuMjVWMTEuNDNoMy45MXYxNy44MlpNMTQxLjQ0IDExLjQzaDE2LjgxdjMuMzloLTYuNDR2MTQuNDNoLTMuOTFWMTQuODJoLTYuNDZaTTE3Ny4xMyAxMS40M2wtNy4wNyA5LjY5djguMTNoLTMuOTN2LTguMTNMMTU5IDExLjQzaDQuODVsNC4zNCA2LjIgNC4zMi02LjJaTTE3OC4wNyAxMS4wOGE0IDQgMCAwIDEgMS4xMi0yLjg2IDMuNzQgMy43NCAwIDAgMSA1LjQzIDAgNCA0IDAgMCAxIDEuMTEgMi44NiA0IDQgMCAwIDEtMS4xMiAyLjkyIDMuNzIgMy43MiAwIDAgMS01LjQyIDAgNCA0IDAgMCAxLTEuMTItMi45MlptLjY1IDBhMy4zOSAzLjM5IDAgMCAwIC45MyAyLjQyIDMgMyAwIDAgMCAyLjI2IDEgMyAzIDAgMCAwIDIuMjQtMSAzLjM3IDMuMzcgMCAwIDAgLjkzLTIuNDEgMy4zNCAzLjM0IDAgMCAwLS45My0yLjQgMyAzIDAgMCAwLTIuMjQtMSAzIDMgMCAwIDAtMi4yNiAxIDMuMzQgMy4zNCAwIDAgMC0uOTMgMi4zOVptMi40LjQxdjEuODJoLS44VjguNzJoMS41MWEyLjA2IDIuMDYgMCAwIDEgMS4yOS4zNiAxLjIxIDEuMjEgMCAwIDEgLjQ2IDEgMSAxIDAgMCAxLS4xNy41OSAxLjM4IDEuMzggMCAwIDEtLjUyLjQyIDEgMSAwIDAgMSAuNTEuNDMgMS4zNSAxLjM1IDAgMCAxIC4xNi42OXYuN2EuNzcuNzcgMCAwIDAgLjA4LjI5di4wOGgtLjgzYTEuMDggMS4wOCAwIDAgMS0uMDYtLjMzdi0uNzRhLjguOCAwIDAgMC0uMTgtLjU3LjgzLjgzIDAgMCAwLS42LS4xOFptMC0uN2guODJhMS4xMiAxLjEyIDAgMCAwIC42LS4xOC41NS41NSAwIDAgMCAuMjUtLjQ3LjY4LjY4IDAgMCAwLS4yMi0uNTYgMS4zNCAxLjM0IDAgMCAwLS43NC0uMTVoLS43MVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zLjE2IC0zLjc1KSIgc3R5bGU9ImZpbGw6I2ZmZiIvPjwvc3ZnPgo=" aria-label="Back to homepage" alt="Curity logo" width="124" height="36"/></a><ul class="first-level list-reset m0"><li class="inline-block"><button class="header-top-link-dropdown false" aria-haspopup="menu" aria-label="Product" tabindex="0"><span class="header-top-link">Products<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" style="transform:rotate(0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"></path></svg></span><div class="dropdown-content dropdown-content-product false"><div class="dropdown-content-product-columns flex justify-between w100 "><div class="flex-25 p3"><h5 class="uppercasecaps primary mb2">Products</h5><div class="product-nav-holder"><a class="flex flex-center flex-gap-1 dropdown-content-link" href="/product/"><img src="/images/resources/navigation/product/identity-server.svg" alt="Product Overview" class="md-w-2" width="50" height="50" loading="lazy" decoding="async"/>Curity Identity Server</a><ul class="list-reset m0"><li><a class="dropdown-content-link" href="/product/authentication-service/">Authentication Service</a></li><li><a class="dropdown-content-link" href="/product/token-service/">Token Service</a></li><li><a class="dropdown-content-link" href="/product/user-management-service/">User Management Service</a></li></ul></div><div class="product-nav-holder mt2"><a class="flex flex-center flex-gap-1 dropdown-content-link" href="/product/token-handler/"><img src="/images/resources/navigation/product/token-handler.svg" alt="Curity Token Handler" class="md-w-2" width="50" height="50" loading="lazy" decoding="async"/>Curity Token Handler</a></div><div class="mt2"><a class="flex flex-center flex-gap-1 dropdown-content-link" href="/product/community/"><div class="flex flex-column flex-gap-1"><span>Community Edition</span><small>A free version of Curity Identity Server</small></div></a></div></div><div class="flex-auto p3"><h5 class="uppercasecaps primary mb2">Features and Capabilities</h5><div class="grid-container" columns="2" gap="1"><div><a class="flex flex-center flex-gap-1 dropdown-content-link" href="/product/authentication/"><img src="/images/resources/navigation/product/authentication.svg" alt="Authentication" class="md-w-2" width="50" height="50" loading="lazy" decoding="async"/>Authentication</a><ul class="list-reset" style="padding-left:calc(46px + 0.5rem)"><li><a class="dropdown-content-link" href="/product/authentication/advanced-authentication/">Advanced Authentication</a></li><li><a class="dropdown-content-link" href="/product/authentication/passwordless-authentication/">Passwordless Authentication</a></li><li><a class="dropdown-content-link" href="/product/authentication/sso-mfa-and-social-logins/">SSO, MFA and Social Logins</a></li></ul></div><div><a class="flex flex-center flex-gap-1 dropdown-content-link" href="/product/decentralized-identity/"><img src="/images/resources/navigation/product/decentralized-identity.svg" alt="Decentralized Identity" class="md-w-2" width="50" height="50" loading="lazy" decoding="async"/>Decentralized Identity</a><ul class="list-reset" style="padding-left:calc(46px + 0.5rem)"><li><a class="dropdown-content-link" href="/product/decentralized-identity/wallet/">Digital Wallet</a></li><li><a class="dropdown-content-link" href="/product/decentralized-identity/verifiable-credentials/">Verifiable Credentials</a></li></ul></div><div><a class="flex flex-center flex-gap-1 dropdown-content-link" href="/product/user-journey-orchestration/"><img src="/images/resources/navigation/product/orchestrate-user-journeys.svg" alt="User Journey Orchestration" class="md-w-2" width="50" height="50" loading="lazy" decoding="async"/>User Journey Orchestration</a><ul class="list-reset" style="padding-left:calc(46px + 0.5rem)"><li><a class="dropdown-content-link" href="/product/user-journey-orchestration/adaptive-authentication/">Adaptive Authentication</a></li><li><a class="dropdown-content-link" href="/product/user-journey-orchestration/actions/">Authentication Actions</a></li><li><a class="dropdown-content-link" href="/product/user-journey-orchestration/branding-and-ux/">Branding and UX</a></li><li><a class="dropdown-content-link" href="/product/user-journey-orchestration/browserless-login/">Browserless Login</a></li></ul></div><div><a class="flex flex-center flex-gap-1 dropdown-content-link" href="/product/secure-access/"><img src="/images/resources/navigation/product/secure-access.svg" alt="Secure Acccess" class="md-w-2" width="50" height="50" loading="lazy" decoding="async"/>Secure Acccess</a><ul class="list-reset" style="padding-left:calc(46px + 0.5rem)"><li><a class="dropdown-content-link" href="/product/secure-access/api-access-control/">API Access Control</a></li><li><a class="dropdown-content-link" href="/product/secure-access/customer-iam/">Customer IAM</a></li><li><a class="dropdown-content-link" href="/product/secure-access/high-grade-api-security/">High-Grade API Security</a></li><li><a class="dropdown-content-link" href="/product/secure-access/spa-security/">SPA Security</a></li></ul></div><div><a class="flex flex-center flex-gap-1 dropdown-content-link" href="/product/extensibility-and-sdks/"><img src="/images/resources/navigation/product/extensibility.svg" alt="Extensibility and SDK:s" class="md-w-2" width="50" height="50" loading="lazy" decoding="async"/>Extensibility and SDK:s</a><ul class="list-reset" style="padding-left:calc(46px + 0.5rem)"></ul></div><div><a class="flex flex-center flex-gap-1 dropdown-content-link" href="/product/identity-standards/"><img src="/images/resources/navigation/product/identity-standards.svg" alt="Identity Standards" class="md-w-2" width="50" height="50" loading="lazy" decoding="async"/>Identity Standards</a><ul class="list-reset" style="padding-left:calc(46px + 0.5rem)"><li><a class="dropdown-content-link" href="/product/identity-standards/conformance/">Standards and Conformance</a></li></ul></div></div></div><div class="flex-25 p3"><h5 class="uppercasecaps primary mb2">Deployment and Management</h5><div><a class="flex flex-center flex-gap-1 dropdown-content-link" href="/product/deployment/"><img src="/images/resources/navigation/product/deploy-on-any-platform.svg" alt="Deployment" class="md-w-2" width="50" height="50" loading="lazy" decoding="async"/>Deployment</a><ul class="list-reset" style="padding-left:calc(46px + 0.5rem)"><li><a class="dropdown-content-link" href="/product/deployment/multi-region/">Multi-Region</a></li><li><a class="dropdown-content-link" href="/product/deployment/multi-tenancy/">Multi-Tenancy</a></li></ul></div><div><a class="flex flex-center flex-gap-1 dropdown-content-link" href="/product/devops-and-secops/"><img src="/images/resources/navigation/product/devops-secops.svg" alt="DevOps and Secops" class="md-w-2" width="50" height="50" loading="lazy" decoding="async"/>DevOps and Secops</a><ul class="list-reset" style="padding-left:calc(46px + 0.5rem)"><li><a class="dropdown-content-link" href="/product/devops-and-secops/alarms/">Alarms</a></li><li><a class="dropdown-content-link" href="/product/devops-and-secops/configuration/">Configuration and GitOps</a></li><li><a class="dropdown-content-link" href="/product/devops-and-secops/devops-dashboard/">DevOps Dashboard</a></li><li><a class="dropdown-content-link" href="/product/devops-and-secops/monitoring-and-metrics/">Monitoring and Metrics</a></li></ul></div></div></div></div></button></li><li class="inline-block"><button class="header-top-link-dropdown" aria-haspopup="menu" aria-label="Solutions" tabindex="0"><span class="header-top-link">Solutions<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" style="transform:rotate(0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"></path></svg></span><div class="dropdown-content dropdown-content-solutions false"><div class="dropdown-content-product-columns flex justify-between w100 py2 flex-gap-2"><div><h5 class="uppercasecaps primary px2">SECURITY SOLUTIONS</h5><a class="dropdown-content-link" href="/solutions/common-identity-platform/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/solutions/common-identity-platform.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Common Identity Platform" width="60" height="60" loading="lazy" decoding="async"/>Common Identity Platform</span></div></a><a class="dropdown-content-link" href="/solutions/modernizing-infrastructure/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/solutions/modernizing-infrastructure.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Modernizing Infrastructure" width="60" height="60" loading="lazy" decoding="async"/>Modernizing Infrastructure</span></div></a><a class="dropdown-content-link" href="/solutions/open-banking-and-fapi/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/solutions/open-banking.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Open Banking &amp; Financial-Grade APIs" width="60" height="60" loading="lazy" decoding="async"/>Open Banking &amp; Financial-Grade APIs</span></div></a><a class="dropdown-content-link" href="/solutions/frictionless-authentication/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/solutions/frictionless-authentication.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Secure Frictionless Authentication" width="60" height="60" loading="lazy" decoding="async"/>Secure Frictionless Authentication</span></div></a><a class="dropdown-content-link" href="/solutions/zero-trust/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/solutions/zero-trust.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Zero Trust and Security Architecture" width="60" height="60" loading="lazy" decoding="async"/>Zero Trust and Security Architecture</span></div></a></div><div><h5 class="uppercasecaps primary px2">INDUSTRY</h5><a class="dropdown-content-link" href="/solutions/secure-financial-services/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/solutions/secure-financial-services.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Financial Services" width="60" height="60" loading="lazy" decoding="async"/>Financial Services</span></div></a><a class="dropdown-content-link" href="/solutions/identity-for-government-solutions/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/solutions/government.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Government" width="60" height="60" loading="lazy" decoding="async"/>Government</span></div></a><a class="dropdown-content-link" href="/solutions/protecting-health-care/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/solutions/healthcare.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Healthcare" width="60" height="60" loading="lazy" decoding="async"/>Healthcare</span></div></a><a class="dropdown-content-link" href="/solutions/tech-and-saas-security/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/solutions/saas-and-tech-security.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Technology / SaaS" width="60" height="60" loading="lazy" decoding="async"/>Technology / SaaS</span></div></a><a class="dropdown-content-link" href="/solutions/protecting-telecom-services/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/solutions/telco.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Telecom" width="60" height="60" loading="lazy" decoding="async"/>Telecom</span></div></a></div></div><div class="mt0 py3 px3"></div></div></button></li><li class="inline-block"><button class="header-top-link-dropdown active" aria-haspopup="menu" aria-label="Resources" tabindex="0"><span class="header-top-link">Resources<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" style="transform:rotate(0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"></path></svg></span><div class="dropdown-content dropdown-content-resources false"><div class="dropdown-content-product-columns flex justify-between w100 pt1" style="border-bottom:1px solid #e2e2e2"><div class="flex-33 px2"><h5 class="uppercasecaps primary px2">Resource Library</h5><a class="dropdown-content-link active" href="/resources/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/resources/library/overview.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Overview" width="60" height="60" loading="lazy" decoding="async"/>Overview</span></div></a><a class="dropdown-content-link" href="/resources/articles/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/resources/library/articles.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Articles" width="60" height="60" loading="lazy" decoding="async"/>Articles</span></div></a><a class="dropdown-content-link" href="/resources/topics/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/resources/library/topics.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Topics" width="60" height="60" loading="lazy" decoding="async"/>Topics</span></div></a><a class="dropdown-content-link" href="/resources/whats-new/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/resources/library/whats-new.svg" class="h-2 w-2 mr2 flex-noshrink" alt="What&#x27;s New" width="60" height="60" loading="lazy" decoding="async"/>What&#x27;s New</span></div></a></div><div class="flex-33 px2"><h5 class="uppercasecaps primary px2">Tutorials &amp; Guides</h5><a class="dropdown-content-link" href="/resources/getting-started/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/resources/tutorials/getting-started.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Getting Started" width="60" height="60" loading="lazy" decoding="async"/>Getting Started</span></div></a><a class="dropdown-content-link" href="/resources/guides/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/resources/tutorials/guides.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Guides" width="60" height="60" loading="lazy" decoding="async"/>Guides</span></div></a><a class="dropdown-content-link" href="/resources/how-tos/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/resources/tutorials/howtos.svg" class="h-2 w-2 mr2 flex-noshrink" alt="How-tos" width="60" height="60" loading="lazy" decoding="async"/>How-tos</span></div></a><a class="dropdown-content-link" href="/resources/code-examples/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/resources/tutorials/code-examples.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Code Examples" width="60" height="60" loading="lazy" decoding="async"/>Code Examples</span></div></a></div><div class="flex-33 px2"><h5 class="uppercasecaps primary px2">Learn More</h5><a class="dropdown-content-link" href="/resources/videos/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/resources/learnmore/videos.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Videos" width="60" height="60" loading="lazy" decoding="async"/>Videos</span></div></a><a class="dropdown-content-link" href="/resources/webinars/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/resources/learnmore/webinars.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Webinars" width="60" height="60" loading="lazy" decoding="async"/>Webinars</span></div></a><a class="dropdown-content-link" href="/resources/courses/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/resources/learnmore/courses.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Courses" width="60" height="60" loading="lazy" decoding="async"/>Courses</span></div></a><a class="dropdown-content-link" href="/resources/documents/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/resources/learnmore/documents.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Documents" width="60" height="60" loading="lazy" decoding="async"/>Documents</span></div></a></div></div><div class="flex mx-auto py2 br-6"><div class="flex-33 flex justify-center"><a class="button button-small button-transparent" href="/company/customers/">Customer Stories<i class="icon ion-android-arrow-forward bright ml1"></i></a></div><div class="flex-33 flex justify-center"><a class="button button-small button-transparent" href="/solutions/">Solutions<i class="icon ion-android-arrow-forward bright ml1"></i></a></div><div class="flex-33 flex justify-center"><a class="button button-small button-transparent" href="/docs/">Documentation<i class="icon ion-android-arrow-forward bright ml1"></i></a></div></div></div></button></li><li class="inline-block"><button class="header-top-link-dropdown false" aria-haspopup="menu" aria-label="Company" tabindex="0"><span class="header-top-link">Company<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" style="transform:rotate(0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"></path></svg></span><div class="dropdown-content dropdown-content-company false "><div class="dropdown-content-product-columns flex justify-between w100 py2 flex-gap-2" style="border-bottom:1px solid #e2e2e2"><div><a class="dropdown-content-link" href="/company/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/company/about.svg" class="h-2 w-2 mr2 flex-noshrink" alt="About" width="60" height="60" loading="lazy" decoding="async"/>About</span></div></a><a class="dropdown-content-link" href="/company/customers/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/company/customers.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Customers" width="60" height="60" loading="lazy" decoding="async"/>Customers</span></div></a><a class="dropdown-content-link" href="/company/partners/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/company/partners.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Partners" width="60" height="60" loading="lazy" decoding="async"/>Partners</span></div></a><a class="dropdown-content-link" href="/company/esg/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/company/esg.svg" class="h-2 w-2 mr2 flex-noshrink" alt="ESG" width="60" height="60" loading="lazy" decoding="async"/>ESG</span></div></a></div><div><a class="dropdown-content-link" href="/blog/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/company/blog.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Blog" width="60" height="60" loading="lazy" decoding="async"/>Blog</span></div></a><a class="dropdown-content-link" href="/company/careers/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/company/careers.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Careers" width="60" height="60" loading="lazy" decoding="async"/>Careers</span></div></a><a class="dropdown-content-link" href="/company/events/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/company/events.svg" class="h-2 w-2 mr2 flex-noshrink" alt="Events Calendar" width="60" height="60" loading="lazy" decoding="async"/>Events Calendar</span></div></a><a class="dropdown-content-link" href="/news/"><div class="dropdown-content-link-text"><span class="dropdown-content-link-text-heading"><img src="/images/resources/navigation/company/news.svg" class="h-2 w-2 mr2 flex-noshrink" alt="News" width="60" height="60" loading="lazy" decoding="async"/>News</span></div></a></div></div><div class="mt0 py3 px3"><div class="flex flex-gap-2"><div class="flex flex-column"><div class="mb1"><span class="pill pill-primary-gradient">Blog</span></div><a class="sm-flex flex-column flex-gap-1 no-decoration" style="align-items:unset" href="/blog/perspective-on-modern-credential-management/"><div class="flex-30"><figure><div data-gatsby-image-wrapper="" class="gatsby-image-wrapper gatsby-image-wrapper-constrained md-h-7 oft block br-6 bg-dark"><div style="max-width:300px;display:block"><img alt="" role="presentation" aria-hidden="true" src="data:image/svg+xml;charset=utf-8,%3Csvg%20height=&#x27;280&#x27;%20width=&#x27;300&#x27;%20xmlns=&#x27;http://www.w3.org/2000/svg&#x27;%20version=&#x27;1.1&#x27;%3E%3C/svg%3E" style="max-width:100%;display:block;position:static"/></div><div aria-hidden="true" data-placeholder-image="" style="opacity:1;transition:opacity 500ms linear;background-color:white;position:absolute;top:0;left:0;bottom:0;right:0"></div><picture><source type="image/webp" data-srcset="https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=300&amp;h=280&amp;q=50&amp;fm=webp&amp;bg=white 300w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=640&amp;h=597&amp;q=50&amp;fm=webp&amp;bg=white 640w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=832&amp;h=777&amp;q=50&amp;fm=webp&amp;bg=white 832w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=1184&amp;h=1105&amp;q=50&amp;fm=webp&amp;bg=white 1184w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=1261&amp;h=1177&amp;q=50&amp;fm=webp&amp;bg=white 1261w" sizes="(min-width: 300px) 300px, 100vw"/><img data-gatsby-image-ssr="" decoding="async" data-main-image="" style="opacity:0" sizes="(min-width: 300px) 300px, 100vw" loading="lazy" data-src="https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=300&amp;h=280&amp;q=50&amp;fm=png&amp;bg=white" data-srcset="https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=300&amp;h=280&amp;q=50&amp;fm=png&amp;bg=white 300w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=640&amp;h=597&amp;q=50&amp;fm=png&amp;bg=white 640w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=832&amp;h=777&amp;q=50&amp;fm=png&amp;bg=white 832w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=1184&amp;h=1105&amp;q=50&amp;fm=png&amp;bg=white 1184w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=1261&amp;h=1177&amp;q=50&amp;fm=png&amp;bg=white 1261w" alt="A Perspective on Modern Credential Management"/></picture><noscript><picture><source type="image/webp" srcSet="https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=300&amp;h=280&amp;q=50&amp;fm=webp&amp;bg=white 300w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=640&amp;h=597&amp;q=50&amp;fm=webp&amp;bg=white 640w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=832&amp;h=777&amp;q=50&amp;fm=webp&amp;bg=white 832w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=1184&amp;h=1105&amp;q=50&amp;fm=webp&amp;bg=white 1184w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=1261&amp;h=1177&amp;q=50&amp;fm=webp&amp;bg=white 1261w" sizes="(min-width: 300px) 300px, 100vw"/><img data-gatsby-image-ssr="" decoding="async" data-main-image="" style="opacity:0" sizes="(min-width: 300px) 300px, 100vw" loading="lazy" src="https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=300&amp;h=280&amp;q=50&amp;fm=png&amp;bg=white" srcSet="https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=300&amp;h=280&amp;q=50&amp;fm=png&amp;bg=white 300w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=640&amp;h=597&amp;q=50&amp;fm=png&amp;bg=white 640w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=832&amp;h=777&amp;q=50&amp;fm=png&amp;bg=white 832w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=1184&amp;h=1105&amp;q=50&amp;fm=png&amp;bg=white 1184w,https://images.ctfassets.net/tldhjvq55hjd/6IiEkFbSywuP4841zh3BqW/68b88cc6102153b4d9aadf4b1939904a/curity-blog-modern-iam__1_.png?w=1261&amp;h=1177&amp;q=50&amp;fm=png&amp;bg=white 1261w" alt="A Perspective on Modern Credential Management"/></picture></noscript><script nonce="5e78246357cfbb1bc118c84245311b69" type="module">const t="undefined"!=typeof HTMLImageElement&&"loading"in HTMLImageElement.prototype;if(t){const t=document.querySelectorAll("img[data-main-image]");for(let e of t){e.dataset.src&&(e.setAttribute("src",e.dataset.src),e.removeAttribute("data-src")),e.dataset.srcset&&(e.setAttribute("srcset",e.dataset.srcset),e.removeAttribute("data-srcset"));const t=e.parentNode.querySelectorAll("source[data-srcset]");for(let e of t)e.setAttribute("srcset",e.dataset.srcset),e.removeAttribute("data-srcset");e.complete&&(e.style.opacity=1,e.parentNode.parentNode.querySelector("[data-placeholder-image]").style.opacity=0)}}</script></div></figure></div><div class="flex flex-column"><h4 class="primary m0">A Perspective on Modern Credential Management</h4></div></a></div><div class="flex flex-column flex-50"><div class="mb1"><span class="pill pill-bright-gradient">News</span></div><a class="sm-flex flex-column flex-gap-1 no-decoration" style="align-items:unset" href="/news/curity-identity-server-10-0/"><div class="flex-30"><figure><div data-gatsby-image-wrapper="" class="gatsby-image-wrapper gatsby-image-wrapper-constrained md-h-7 oft block br-6 bg-dark"><div style="max-width:300px;display:block"><img alt="" role="presentation" aria-hidden="true" src="data:image/svg+xml;charset=utf-8,%3Csvg%20height=&#x27;280&#x27;%20width=&#x27;300&#x27;%20xmlns=&#x27;http://www.w3.org/2000/svg&#x27;%20version=&#x27;1.1&#x27;%3E%3C/svg%3E" style="max-width:100%;display:block;position:static"/></div><div aria-hidden="true" data-placeholder-image="" style="opacity:1;transition:opacity 500ms linear;background-color:white;position:absolute;top:0;left:0;bottom:0;right:0"></div><picture><source type="image/webp" data-srcset="https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=300&amp;h=280&amp;q=50&amp;fm=webp&amp;bg=white 300w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=640&amp;h=597&amp;q=50&amp;fm=webp&amp;bg=white 640w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=832&amp;h=777&amp;q=50&amp;fm=webp&amp;bg=white 832w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=1184&amp;h=1105&amp;q=50&amp;fm=webp&amp;bg=white 1184w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=1200&amp;h=1120&amp;q=50&amp;fm=webp&amp;bg=white 1200w" sizes="(min-width: 300px) 300px, 100vw"/><img data-gatsby-image-ssr="" decoding="async" data-main-image="" style="opacity:0" sizes="(min-width: 300px) 300px, 100vw" loading="lazy" data-src="https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=300&amp;h=280&amp;q=50&amp;fm=png&amp;bg=white" data-srcset="https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=300&amp;h=280&amp;q=50&amp;fm=png&amp;bg=white 300w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=640&amp;h=597&amp;q=50&amp;fm=png&amp;bg=white 640w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=832&amp;h=777&amp;q=50&amp;fm=png&amp;bg=white 832w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=1184&amp;h=1105&amp;q=50&amp;fm=png&amp;bg=white 1184w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=1200&amp;h=1120&amp;q=50&amp;fm=png&amp;bg=white 1200w" alt="New Release: Curity Identity Server 10.0"/></picture><noscript><picture><source type="image/webp" srcSet="https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=300&amp;h=280&amp;q=50&amp;fm=webp&amp;bg=white 300w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=640&amp;h=597&amp;q=50&amp;fm=webp&amp;bg=white 640w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=832&amp;h=777&amp;q=50&amp;fm=webp&amp;bg=white 832w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=1184&amp;h=1105&amp;q=50&amp;fm=webp&amp;bg=white 1184w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=1200&amp;h=1120&amp;q=50&amp;fm=webp&amp;bg=white 1200w" sizes="(min-width: 300px) 300px, 100vw"/><img data-gatsby-image-ssr="" decoding="async" data-main-image="" style="opacity:0" sizes="(min-width: 300px) 300px, 100vw" loading="lazy" src="https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=300&amp;h=280&amp;q=50&amp;fm=png&amp;bg=white" srcSet="https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=300&amp;h=280&amp;q=50&amp;fm=png&amp;bg=white 300w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=640&amp;h=597&amp;q=50&amp;fm=png&amp;bg=white 640w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=832&amp;h=777&amp;q=50&amp;fm=png&amp;bg=white 832w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=1184&amp;h=1105&amp;q=50&amp;fm=png&amp;bg=white 1184w,https://images.ctfassets.net/tldhjvq55hjd/1JxRkIc3xF3XjCqgv0Bi5P/610a44c34eac799ab7e85828941a8a87/curity-website-news-release_10.png?w=1200&amp;h=1120&amp;q=50&amp;fm=png&amp;bg=white 1200w" alt="New Release: Curity Identity Server 10.0"/></picture></noscript><script nonce="5e78246357cfbb1bc118c84245311b69" type="module">const t="undefined"!=typeof HTMLImageElement&&"loading"in HTMLImageElement.prototype;if(t){const t=document.querySelectorAll("img[data-main-image]");for(let e of t){e.dataset.src&&(e.setAttribute("src",e.dataset.src),e.removeAttribute("data-src")),e.dataset.srcset&&(e.setAttribute("srcset",e.dataset.srcset),e.removeAttribute("data-srcset"));const t=e.parentNode.querySelectorAll("source[data-srcset]");for(let e of t)e.setAttribute("srcset",e.dataset.srcset),e.removeAttribute("data-srcset");e.complete&&(e.style.opacity=1,e.parentNode.parentNode.querySelector("[data-placeholder-image]").style.opacity=0)}}</script></div></figure></div><div class="flex flex-column"><h4 class="primary m0">New Release: Curity Identity Server 10.0</h4></div></a></div></div></div></div></button></li><li class="header-developer-link"><button class="header-top-link-dropdown" aria-haspopup="menu" aria-label="Developers" tabindex="0"><span class="header-top-link">Developers<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" style="transform:rotate(0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"></path></svg></span><div class="dropdown-content dropdown-content-developer flex-wrap false"><a href="https://developer.curity.io/" class="dropdown-content-link dropdown-content-link-dark"><img class="w-6 h-6 mr3 inline-block" src="/images/developer-portal.svg" alt="Curity Developer Portal" width="100" height="100"/><div class="dropdown-content-link-text px2"><span class="dropdown-content-link-text-heading white">Curity Developer Portal</span></div></a><a class="dropdown-content-link" href="/docs/">Documentation</a><a href="https://developer.curity.io/sources/" class="dropdown-content-link">Libraries &amp; SDKs</a><a class="dropdown-content-link" href="/training/">Training</a><a class="dropdown-content-link" href="https://oauth.tools/?utm_source=curity.io&amp;utm_medium=Link&amp;utm_content=navigation">OAuth Tools</a><a href="https://curity.io/changelog/" target="_blank" rel="noopener noreferrer" class="dropdown-content-link">Changelog</a></div></button></li><li class="header-nav-contact"><a class="header-top-link" href="/product/plans/">Plans &amp; Pricing</a></li><li class="header-nav-support"><button class="header-top-link-dropdown false" aria-haspopup="menu" aria-label="Support" tabindex="0"><span class="header-top-link">Support<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" style="transform:rotate(0" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"></path></svg></span><div class="dropdown-content dropdown-content-support false "><a class="dropdown-content-link" href="/support/">Ticket-based Support</a><a class="dropdown-content-link" href="/support/instant-message-support/">Instant Message Support</a><a class="dropdown-content-link" href="/support/professional-services/">Professional Services</a></div></button></li><li class="header-nav-contact"><a class="header-top-link" href="/contact/">Contact</a></li></ul></div><div class="flex flex-center flex-justify h100"><ul class="first-level list-reset m0"><li class="header-nav-contact header-nav-search"><a aria-label="Search curity.io" class="header-top-link" href="/search/"><svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" class="white" aria-hidden="true"><path d="M0 0h24v24H0z" fill="none"></path><path fill="currentColor" d="M15.5 14h-.79l-.28-.27A6.471 6.471 0 0016 9.5 6.5 6.5 0 109.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path></svg><span class="inline-block ml1">Search</span></a></li><li class="header-nav-login"><button tabindex="0" class="header-top-link-dropdown header-nav-login"><span class="header-top-link"><svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" class="white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg><span class="inline-block ml1">Login</span></span></button></li><li class="inline-block header-nav-demo" style="height:initial"><a class="button button-tiny button-primary" href="/schedule-a-demo/"><i class="icon ion-calendar inlineicon"></i>Schedule a Demo</a></li><li class="inline-block header-nav-trial" style="height:initial"><a class="button button-bright button-tiny nowrap" href="https://developer.curity.io/free-trial/?utm_source=curity.io&amp;utm_medium=Link&amp;utm_content=Navigation">Start Free Trial</a></li><li class="header-top-link-hamburger"><button aria-label="Open mobile navigation"><div class="hamburger"><div class="hamburger__icon"><span></span><span></span><span></span><span></span></div></div></button></li></ul></div></div></div></nav></header><main><div class="resources-searchbar"><div class="container container-wide h100"><div class="flex flex-center justify-between w100 h100"><div class="scroller w100 nowrap mb0"><div class="flex justify-between"><div><a class="button button-small mr1 button-transparent" href="/resources/articles/">Articles</a><a class="button button-small mr1 button-transparent" href="/resources/getting-started/">Getting Started</a><a class="button button-small mr1 button-primary" href="/resources/how-tos/">How-tos</a><a class="button button-small mr1 button-transparent" href="/resources/guides/">Guides</a><a class="button button-small mr1 button-transparent" href="/resources/code-examples/">Code Examples</a><a class="button button-small mr1 button-transparent" href="/docs/">Documentation</a><a class="button button-small mr1 button-transparent" href="/resources/videos/">Videos</a><a class="button button-small mr1 button-transparent" href="/resources/webinars/">Webinars</a><a class="button button-small mr1 button-transparent" href="/resources/courses/">Courses</a><a class="button button-small" href="/training/">Training</a><a class="button button-small mr1 button-transparent" href="/resources/documents/">Documents</a></div><div><a class="button button-small button-transparent" href="/resources/whats-new/"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20px" height="20px" class="mr1 inlineicon" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect><line x1="16" y1="2" x2="16" y2="6"></line><line x1="8" y1="2" x2="8" y2="6"></line><line x1="3" y1="10" x2="21" y2="10"></line></svg>What&#x27;s new</a><a class="button button-small button-transparent" href="/feeds/"><svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" class="mr1 inlineicon" fill="none" stroke="orange" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" viewBox="0 0 24 24"><path d="M4 11a9 9 0 019 9M4 4a16 16 0 0116 16"></path><circle cx="5" cy="19" r="1"></circle></svg>RSS</a></div></div></div><button class="article-sidebar-trigger ml2" aria-label="Toggle sidebar navigation"><i class="icon ion-navicon"></i></button></div></div></div><main class="article-main"><aside class="article-sidebar"><div class="article-nav-wrapper"><div class="article-sidebar-panel"><h4 class="uppercasecaps mt0 flex flex-center flex-gap-1 p2"><img src="/images/resources/sidebar/authentication-authorizaation.svg" alt="Authentication and Authorization" class="h-3"/>Authentication and Authorization</h4><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="authentication" class=" " href="/resources/authentication/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between"> Authentication</div><button class="button button-small button-transparent" data-pagegroup="authentication"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Authentication Overview" href="/resources/learn/authentication-overview/">Authentication Overview</a></li><li data-area="tutorials"><a class="block " title="WebAuthn Authenticator" href="/resources/learn/webauthn-authenticator/">WebAuthn Authenticator</a></li><li data-area="tutorials"><a class="block " title="Passkeys Authenticator" href="/resources/learn/passkeys-authenticator/">Passkeys Authenticator</a></li><li data-area="tutorials"><a class="block " title="Google Authenticator App" href="/resources/learn/authenticate-with-google-authenticator/">Google Authenticator App</a></li><li data-area="tutorials"><a class="block " title="Handling Expired Sessions During Authentication" href="/resources/learn/application-url/">Handling Expired Sessions During Authentication</a></li><li data-area="tutorials"><a class="block " title="Manage User Account Lockout" href="/resources/learn/user-account-lockout/">Manage User Account Lockout</a></li><li data-area="tutorials"><a class="block " title="Preregister Devices in a WebAuthn Authenticator" href="/resources/learn/preregister-devices-in-webauthn-authenticator/">Preregister Devices in a WebAuthn Authenticator</a></li><li data-area="tutorials"><a class="block " title="Geo-Location Authenticator Filter" href="/resources/learn/geolocation-authenticator-filter/">Geo-Location Authenticator Filter</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="external-idps" class=" " href="/resources/external-idps/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Integration With Identity Providers</div><button class="button button-small button-transparent" data-pagegroup="external-idps"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Identity Providers Overview" href="/resources/learn/external-idps-overview/">Identity Providers Overview</a></li><li data-area="tutorials"><a class="block " title="Authenticate Using Microsoft Entra ID" href="/resources/learn/oicd-authenticator-azure/">Authenticate Using Microsoft Entra ID</a></li><li data-area="tutorials"><a class="block " title="Authenticate Using Okta" href="/resources/learn/okta-external-idp/">Authenticate Using Okta</a></li><li data-area="tutorials"><a class="block " title="Authenticate Using Sign in With Apple" href="/resources/learn/sign-in-with-apple/">Authenticate Using Sign in With Apple</a></li><li data-area="tutorials"><a class="block " title="Authenticate Using Beyond Identity" href="/resources/learn/beyondidentity-integration/">Authenticate Using Beyond Identity</a></li><li data-area="tutorials"><a class="block " title="Authenticate Using Signicat" href="/resources/learn/oidc-signicat/">Authenticate Using Signicat</a></li><li data-area="tutorials"><a class="block " title="Authenticate Using BankID v6" href="/resources/learn/integrating-with-bankid-v6/">Authenticate Using BankID v6</a></li><li data-area="tutorials"><a class="block " title="Authenticate Using SITHS Authentication" href="/resources/learn/SITHS-authentication/">Authenticate Using SITHS Authentication</a></li><li data-area="tutorials"><a class="block " title="Authenticate Using Norwegian BankID" href="/resources/learn/norwegian-bankid/">Authenticate Using Norwegian BankID</a></li><li data-area="tutorials"><a class="block " title="Integrating with SAML Identity Providers" href="/resources/learn/connecting-to-saml-idp/">Integrating with SAML Identity Providers</a></li><li data-area="tutorials"><a class="block " title="Using the Dynamic Authenticator" href="/resources/learn/dynamic-authenticator/">Using the Dynamic Authenticator</a></li><li data-area="tutorials"><a class="block " title="Credential Verification With Entra ID" href="/resources/learn/use-azure-ad-for-credential-verification/">Credential Verification With Entra ID</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="authentication-actions" class=" " href="/resources/authentication-actions/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between"> Authentication Actions</div><button class="button button-small button-transparent" data-pagegroup="authentication-actions"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Authentication Actions Concepts" href="/resources/learn/control-authentication-using-actions/">Authentication Actions Concepts</a></li><li data-area="tutorials"><a class="block " title="MFA Using Authentication Actions" href="/resources/learn/add-authentication-action/">MFA Using Authentication Actions</a></li><li data-area="tutorials"><a class="block " title="Opt-in Multi-Factor Authentication" href="/resources/learn/optin-mfa-howto/">Opt-in Multi-Factor Authentication</a></li><li data-area="tutorials"><a class="block " title="Scripted Attribute Transformation" href="/resources/learn/scripted-attribute-transformation/">Scripted Attribute Transformation</a></li><li data-area="tutorials"><a class="block " title="Authentication Actions Data Example" href="/resources/learn/authentication-actions-example/">Authentication Actions Data Example</a></li><li data-area="tutorials"><a class="block " title="Action Bundles" href="/resources/learn/action-bundles/">Action Bundles</a></li><li data-area="tutorials"><a class="block " title="Account Creation after Login" href="/resources/learn/account-creation-after-login/">Account Creation after Login</a></li><li data-area="tutorials"><a class="block " title="Account Linking With Social Identity Providers" href="/resources/learn/account-linking-with-social/">Account Linking With Social Identity Providers</a></li><li data-area="tutorials"><a class="block " title="Migrating to Passkeys" href="/resources/learn/migrating-to-passwordless/">Migrating to Passkeys</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="flows" class=" " href="/resources/flows/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">OAuth &amp; OpenID Connect</div><button class="button button-small button-transparent" data-pagegroup="flows"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Code Flow" href="/resources/learn/code-flow/">Code Flow</a></li><li data-area="tutorials"><a class="block " title="Implicit Flow" href="/resources/learn/implicit-flow/">Implicit Flow</a></li><li data-area="tutorials"><a class="block " title="Hybrid Flow" href="/resources/learn/hybrid-flow/">Hybrid Flow</a></li><li data-area="tutorials"><a class="block " title="Client Credentials Flow" href="/resources/learn/client-credentials/">Client Credentials Flow</a></li><li data-area="tutorials"><a class="block " title="Refresh Tokens" href="/resources/learn/refresh-tokens/">Refresh Tokens</a></li><li data-area="tutorials"><a class="block " title="Revoking OAuth Tokens" href="/resources/learn/revoke/">Revoking OAuth Tokens</a></li><li data-area="tutorials"><a class="block " title="Resource Owner Password Flow" href="/resources/learn/ropc/">Resource Owner Password Flow</a></li><li data-area="tutorials"><a class="block " title="User Consent" href="/resources/learn/user-consent/">User Consent</a></li><li data-area="tutorials"><a class="block " title="Device Authorization Grant" href="/resources/learn/device-flow/">Device Authorization Grant</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="advanced" class=" " href="/resources/advanced/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Advanced OAuth &amp; OpenID Connect</div><button class="button button-small button-transparent" data-pagegroup="advanced"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Configuring Proof Key for Code Exchange" href="/resources/learn/pkce/">Configuring Proof Key for Code Exchange</a></li><li data-area="tutorials"><a class="block " title="Non-Templatized DCR" href="/resources/learn/non-templatized-dcr/">Non-Templatized DCR</a></li><li data-area="tutorials"><a class="block " title="Templatized DCR" href="/resources/learn/templatized-dcr/">Templatized DCR</a></li><li data-area="tutorials"><a class="block " title="Custom DCR Request Validation" href="/resources/learn/dcr-validation-in-pre-processing-procedure/">Custom DCR Request Validation</a></li><li data-area="tutorials"><a class="block " title="Using PPIDs" href="/resources/learn/ppid/">Using PPIDs</a></li><li data-area="tutorials"><a class="block " title="Entitlements in Introspection" href="/resources/learn/oauth-entitlements-in-introspection/">Entitlements in Introspection</a></li><li data-area="tutorials"><a class="block " title="JWT Assertions" href="/resources/learn/jwt-assertion/">JWT Assertions</a></li><li data-area="tutorials"><a class="block " title="Using JWT Authorization Requests" href="/resources/learn/jar-tutorial/">Using JWT Authorization Requests</a></li><li data-area="tutorials"><a class="block " title="Using Pushed Authorization Requests" href="/resources/learn/par-tutorial/">Using Pushed Authorization Requests</a></li><li data-area="tutorials"><a class="block " title="Consuming Responses with JARM" href="/resources/learn/jarm-tutorial/">Consuming Responses with JARM</a></li><li data-area="tutorials"><a class="block " title="Running a CIBA Flow" href="/resources/learn/ciba-tutorial/">Running a CIBA Flow</a></li><li data-area="tutorials"><a class="block " title="Using SAN to Authenticate an OAuth Client" href="/resources/learn/san-in-mtls/">Using SAN to Authenticate an OAuth Client</a></li><li data-area="tutorials"><a class="block " title="mTLS Client Credentials in a Service Mesh" href="/resources/learn/service-mesh-mtls-client-credentials/">mTLS Client Credentials in a Service Mesh</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="tokens-and-claims" class=" " href="/resources/tokens-and-claims/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between"> Tokens and Claims</div><button class="button button-small button-transparent" data-pagegroup="tokens-and-claims"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Token Designer Overview" href="/resources/learn/token-designer/">Token Designer Overview</a></li><li data-area="tutorials"><a class="block " title="Custom Token Issuer" href="/resources/learn/custom-token-issuer/">Custom Token Issuer</a></li><li data-area="tutorials"><a class="block " title="Working With Claims" href="/resources/learn/working-with-claims/">Working With Claims</a></li><li data-area="tutorials"><a class="block " title="Adding Claims from Authentication" href="/resources/learn/claims-from-authenticated-subject/">Adding Claims from Authentication</a></li><li data-area="tutorials"><a class="block " title="Implementing Custom Claims" href="/resources/learn/implementing-custom-claims/">Implementing Custom Claims</a></li><li data-area="tutorials"><a class="block " title="Implementing Token Exchange" href="/resources/learn/implementing-token-exchange/">Implementing Token Exchange</a></li><li data-area="tutorials"><a class="block " title="Verified Claims and Identity Assurance" href="/resources/learn/verified-claims-identity-assurance/">Verified Claims and Identity Assurance</a></li><li data-area="tutorials"><a class="block " title="EdDSA Signatures in Tokens" href="/resources/learn/sign-tokens-with-eddsa/">EdDSA Signatures in Tokens</a></li><li data-area="tutorials"><a class="block " title="Implementing Impersonation" href="/resources/learn/impersonation-implementation/">Implementing Impersonation</a></li><li data-area="tutorials"><a class="block " title="Implementing Dynamic User Routing" href="/resources/learn/implementing-dynamic-user-routing/">Implementing Dynamic User Routing</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="decentralized-identities-tutorials" class=" " href="/resources/decentralized-identities-tutorials/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Decentralized Identities</div><button class="button button-small button-transparent" data-pagegroup="decentralized-identities-tutorials"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Run Verifiable Credentials Demo Wallet" href="/resources/learn/use-verifiable-credentials/">Run Verifiable Credentials Demo Wallet</a></li><li data-area="tutorials"><a class="block " title="Issue a Verifiable Credential" href="/resources/learn/configure-verifiable-credential-issuance/">Issue a Verifiable Credential</a></li><li data-area="tutorials"><a class="block " title="VCI with Pre-authorized Code" href="/resources/learn/pre-authorized-code/">VCI with Pre-authorized Code</a></li></ul></ul><h4 class="uppercasecaps mt0 flex flex-center flex-gap-1 p2"><img src="/images/resources/sidebar/onboarding.svg" alt="Onboarding" class="h-3"/>Onboarding</h4><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="configuration" class=" " href="/resources/configuration/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Configuration Management</div><button class="button button-small button-transparent" data-pagegroup="configuration"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Configuration Overview" href="/resources/learn/configuration-overview/">Configuration Overview</a></li><li data-area="tutorials"><a class="block " title="Import and Export Configurations" href="/resources/learn/import-export-config/">Import and Export Configurations</a></li><li data-area="tutorials"><a class="block " title="Configure Deployed Environments" href="/resources/learn/configure-deployed-environments/">Configure Deployed Environments</a></li><li data-area="tutorials"><a class="block " title="Introduction to the CLI" href="/resources/learn/intro-to-cli/">Introduction to the CLI</a></li><li data-area="tutorials"><a class="block " title="Keys, Certificates and Trust Stores" href="/resources/learn/curity-crypto/">Keys, Certificates and Trust Stores</a></li><li data-area="tutorials"><a class="block " title="Automate Certificate Renewal" href="/resources/learn/auto-certificate-renewal/">Automate Certificate Renewal</a></li><li data-area="tutorials"><a class="block " title="Configuration as Code" href="/resources/learn/gitops-configuration-management/">Configuration as Code</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="deploy" class=" " href="/resources/deploy/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Deployment</div><button class="button button-small button-transparent" data-pagegroup="deploy"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Docker Container Customization" href="/resources/learn/customizing-the-curity-docker-container/">Docker Container Customization</a></li><li data-area="tutorials"><a class="block " title="Exposing an Instance Using ngrok" href="/resources/learn/expose-local-curity-ngrok/">Exposing an Instance Using ngrok</a></li><li data-area="tutorials"><a class="block " title="Running in Cluster Mode" href="/resources/learn/intro-to-cluster/">Running in Cluster Mode</a></li><li data-area="tutorials"><a class="block " title="Clustering with Docker Compose" href="/resources/learn/clustering-using-docker-compose/">Clustering with Docker Compose</a></li><li data-area="tutorials"><a class="block " title="Testing the Curity Identity Server" href="/resources/learn/testing-an-instance-of-curity/">Testing the Curity Identity Server</a></li><li data-area="tutorials"><a class="block " title="AWS Deployment Overview" href="/resources/learn/deploy-on-aws/">AWS Deployment Overview</a></li><li data-area="tutorials"><a class="block " title="Install on AWS using CloudFormation" href="/resources/learn/clustering-using-aws-cloudformation/">Install on AWS using CloudFormation</a></li><li data-area="tutorials"><a class="block " title="Install on AWS using the CDK" href="/resources/learn/install-using-aws-cdk/">Install on AWS using the CDK</a></li><li data-area="tutorials"><a class="block " title="Azure Deployment Overview" href="/resources/learn/how-to-deploy-on-azure/">Azure Deployment Overview</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="kubernetes" class=" " href="/resources/kubernetes/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Kubernetes</div><button class="button button-small button-transparent" data-pagegroup="kubernetes"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Configure Deployments using Helm" href="/resources/learn/configure-deployments-using-helm/">Configure Deployments using Helm</a></li><li data-area="tutorials"><a class="block " title="Expose OAuth Endpoints from Kubernetes" href="/resources/learn/kubernetes-ingress/">Expose OAuth Endpoints from Kubernetes</a></li><li data-area="tutorials"><a class="block " title="Use Kubernetes Data Storage" href="/resources/learn/kubernetes-data-storage/">Use Kubernetes Data Storage</a></li><li data-area="tutorials"><a class="block " title="Use Kubernetes API Gateway Plugins" href="/resources/learn/integrating-plugins-with-kubernetes-ingress/">Use Kubernetes API Gateway Plugins</a></li><li data-area="tutorials"><a class="block " title="Deploy to Google Kubernetes Engine (GKE)" href="/resources/learn/kubernetes-gke-idsvr-kong-phantom/">Deploy to Google Kubernetes Engine (GKE)</a></li><li data-area="tutorials"><a class="block " title="Deploy to Elastic Kubernetes Service (EKS)" href="/resources/learn/kubernetes-aws-eks-idsvr-deployment/">Deploy to Elastic Kubernetes Service (EKS)</a></li><li data-area="tutorials"><a class="block " title="Deploy to Azure Kubernetes Service (AKS)" href="/resources/learn/kubernetes-azure-aks-idsvr-deployment/">Deploy to Azure Kubernetes Service (AKS)</a></li><li data-area="tutorials"><a class="block " title="Deploy to an Istio Service Mesh" href="/resources/learn/istio-demo-installation/">Deploy to an Istio Service Mesh</a></li><li data-area="tutorials"><a class="block " title="Kubernetes Auto Scaling" href="/resources/learn/kubernetes-autoscaling/">Kubernetes Auto Scaling</a></li><li data-area="tutorials"><a class="block " title="Encrypted Configuration using Helm" href="/resources/learn/using-helm-chart-with-config/">Encrypted Configuration using Helm</a></li><li data-area="tutorials"><a class="block " title="Configuration Backups and Logging using Helm" href="/resources/learn/run-cluster-helm/">Configuration Backups and Logging using Helm</a></li><li data-area="tutorials"><a class="block " title="IAM Role for Service Accounts" href="/resources/learn/kubernetes-eks-dynamo-access-irsa/">IAM Role for Service Accounts</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="migrations" class=" " href="/resources/migrations/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Migrations</div><button class="button button-small button-transparent" data-pagegroup="migrations"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Migrating from Spring Security OAuth" href="/resources/learn/migrating-from-spring-security-oauth/">Migrating from Spring Security OAuth</a></li><li data-area="tutorials"><a class="block " title="Migrating from Keycloak" href="/resources/learn/migrating-from-keycloak/">Migrating from Keycloak</a></li><li data-area="tutorials"><a class="block " title="Migrating from IdentityServer4" href="/resources/learn/migrating-from-identityserver/">Migrating from IdentityServer4</a></li></ul></ul><h4 class="uppercasecaps mt0 flex flex-center flex-gap-1 p2"><img src="/images/resources/sidebar/devops.svg" alt="Operation" class="h-3"/>Operation</h4><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="devops-administration" class=" " href="/resources/devops-administration/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Administration</div><button class="button button-small button-transparent" data-pagegroup="devops-administration"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Using AD for Admin UI Users" href="/resources/learn/use-ad-for-admin-users/">Using AD for Admin UI Users</a></li><li data-area="tutorials"><a class="block " title="Federated Login to the Admin UI" href="/resources/learn/federated-login-to-admin-ui/">Federated Login to the Admin UI</a></li><li data-area="tutorials"><a class="block " title="DevOps Dashboard Overview" href="/resources/learn/devops-dashboard/">DevOps Dashboard Overview</a></li><li data-area="tutorials"><a class="block " title="Token Signing Key Rotation" href="/resources/learn/token-signing-key-rotation/">Token Signing Key Rotation</a></li><li data-area="tutorials"><a class="block " title="Curity Access Control Rules" href="/resources/learn/admin-access-rules/">Curity Access Control Rules</a></li><li data-area="tutorials"><a class="block " title="Authorization Rules for the RESTCONF API" href="/resources/learn/access-rules-in-restconf/">Authorization Rules for the RESTCONF API</a></li><li data-area="tutorials"><a class="block " title="Configuring Redirect URI Policies" href="/resources/learn/redirect-uri-policies/">Configuring Redirect URI Policies</a></li><li data-area="tutorials"><a class="block " title="Using DKIM" href="/resources/learn/dkim/">Using DKIM</a></li><li data-area="tutorials"><a class="block " title="Integrating PKCS#11-based High Security Modules" href="/resources/learn/yubihsm-integration/">Integrating PKCS#11-based High Security Modules</a></li><li data-area="tutorials"><a class="block " title="Endpoints and their URLs" href="/resources/learn/endpoints/">Endpoints and their URLs</a></li><li data-area="tutorials"><a class="block " title="Running in a Multi-Tenant Architecture" href="/resources/learn/curity-multitenancy/">Running in a Multi-Tenant Architecture</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="users" class=" " href="/resources/users/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Dashboard and API Access</div><button class="button button-small button-transparent" data-pagegroup="users"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="User Management with SCIM" href="/resources/learn/user-management/">User Management with SCIM</a></li><li data-area="tutorials"><a class="block " title="User Management with GraphQL" href="/resources/learn/graphql-user-management/">User Management with GraphQL</a></li><li data-area="tutorials"><a class="block " title="Database Client Management with GraphQL" href="/resources/learn/graphql-client-management/">Database Client Management with GraphQL</a></li><li data-area="tutorials"><a class="block " title="Running the DevOps Dashboard" href="/resources/learn/devops-dashboard-user-administration/">Running the DevOps Dashboard</a></li><li data-area="tutorials"><a class="block " title="Scope Authorization Manager" href="/resources/learn/scope-management/">Scope Authorization Manager</a></li><li data-area="tutorials"><a class="block " title="Groups Authorization Manager" href="/resources/learn/groups-authorization-manager/">Groups Authorization Manager</a></li><li data-area="tutorials"><a class="block " title="Attribute Authorization Manager" href="/resources/learn/attribute-authorization-manager/">Attribute Authorization Manager</a></li><li data-area="tutorials"><a class="block " title="Implementing Role Based Security" href="/resources/learn/implementing-role-based-security/">Implementing Role Based Security</a></li><li data-area="tutorials"><a class="block " title="Email Activation When Using SCIM" href="/resources/learn/email-activation-scim/">Email Activation When Using SCIM</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="branding-user-experience" class=" " href="/resources/branding-user-experience/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Branding and User Experience</div><button class="button button-small button-transparent" data-pagegroup="branding-user-experience"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Customization Overview" href="/resources/learn/managing-custom-login-screens/">Customization Overview</a></li><li data-area="tutorials"><a class="block " title="Fast Look and Feel Customization" href="/resources/learn/customize-look-and-feel-simple/">Fast Look and Feel Customization</a></li><li data-area="tutorials"><a class="block " title="Extended Look and Feel Customization" href="/resources/learn/customize-look-and-feel/">Extended Look and Feel Customization</a></li><li data-area="tutorials"><a class="block " title="Single Brand Customization Example" href="/resources/learn/customize-recipe-basic-brand/">Single Brand Customization Example</a></li><li data-area="tutorials"><a class="block " title="Multi-Brand Customization Example" href="/resources/learn/customize-recipe-multi-brand/">Multi-Brand Customization Example</a></li><li data-area="tutorials"><a class="block " title="Email Customization Example" href="/resources/learn/customize-recipe-emails/">Email Customization Example</a></li><li data-area="tutorials"><a class="block " title="Custom Password Validation" href="/resources/learn/customize-password-validation/">Custom Password Validation</a></li><li data-area="tutorials"><a class="block " title="Customizing User Consent" href="/resources/learn/consent/">Customizing User Consent</a></li><li data-area="tutorials"><a class="block " title="Right-to-Left Language Support" href="/resources/learn/right-to-left-kanguage-support/">Right-to-Left Language Support</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="logging-monitoring" class=" " href="/resources/logging-monitoring/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Logging and Monitoring</div><button class="button button-small button-transparent" data-pagegroup="logging-monitoring"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="The Grafana Dashboard" href="/resources/learn/grafana-dashboard/">The Grafana Dashboard</a></li><li data-area="tutorials"><a class="block " title="OpenTelemetry Tracing" href="/resources/learn/opentelemetry-tracing/">OpenTelemetry Tracing</a></li><li data-area="tutorials"><a class="block " title="Debug Logging" href="/resources/learn/debug-logging/">Debug Logging</a></li><li data-area="tutorials"><a class="block " title="Per-client Debug Logging" href="/resources/learn/per-client-debug-logging/">Per-client Debug Logging</a></li><li data-area="tutorials"><a class="block " title="Log Aggegation to Splunk" href="/resources/learn/log-to-splunk/">Log Aggegation to Splunk</a></li><li data-area="tutorials"><a class="block " title="Log Aggregation to Datadog" href="/resources/learn/log-to-datadog/">Log Aggregation to Datadog</a></li><li data-area="tutorials"><a class="block " title="Log Aggregation to Elasticsearch" href="/resources/learn/log-to-elasticsearch/">Log Aggregation to Elasticsearch</a></li><li data-area="tutorials"><a class="block " title="Health and Auto Healing" href="/resources/learn/health-and-auto-healing/">Health and Auto Healing</a></li><li data-area="tutorials"><a class="block " title="Integrate Alarms with Cloud Monitoring" href="/resources/learn/cloud-alarm-integration/">Integrate Alarms with Cloud Monitoring</a></li><li data-area="tutorials"><a class="block " title="Java Runtime Monitoring" href="/resources/learn/java-monitoring-overview/">Java Runtime Monitoring</a></li><li data-area="tutorials"><a class="block " title="How to Record a Browser Trace" href="/resources/learn/record-browser-trace/">How to Record a Browser Trace</a></li><li data-area="tutorials"><a class="block " title="Logging Client IP Address" href="/resources/learn/log-client-ip-to-auditdb/">Logging Client IP Address</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="integrations" class=" " href="/resources/integrations/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Integrations</div><button class="button button-small button-transparent" data-pagegroup="integrations"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Apache mod_auth_openidc module" href="/resources/learn/apache-mod-auth-openidc/">Apache mod_auth_openidc module</a></li><li data-area="tutorials"><a class="block " title="Curity as IdP in Salesforce" href="/resources/learn/salesforce/">Curity as IdP in Salesforce</a></li><li data-area="tutorials"><a class="block " title="Curity as an IdP in Cloudflare" href="/resources/learn/idp-in-cloudflare/">Curity as an IdP in Cloudflare</a></li><li data-area="tutorials"><a class="block " title="Integrating with Microsoft Entra ID" href="/resources/learn/azuread-integration/">Integrating with Microsoft Entra ID</a></li><li data-area="tutorials"><a class="block " title="Setting up OIDC in MuleSoft Anypoint" href="/resources/learn/mulesoft-anypoint/">Setting up OIDC in MuleSoft Anypoint</a></li><li data-area="tutorials"><a class="block " title="Integrating with Kong Developer Portal" href="/resources/learn/kong-dev-portal/">Integrating with Kong Developer Portal</a></li><li data-area="tutorials"><a class="block " title="Integrating with Tyk Developer Portal" href="/resources/learn/integration-tyk/">Integrating with Tyk Developer Portal</a></li><li data-area="tutorials"><a class="block " title="Integrating with the Jetty &quot;openid&quot; module" href="/resources/learn/jetty-opeind-module/">Integrating with the Jetty &quot;openid&quot; module</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="writing-plugins" class=" active " href="/resources/writing-plugins/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Writing Plugins</div><button class="button button-small button-transparent" data-pagegroup="writing-plugins"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist sublist-open"><li data-area="tutorials"><a class="block " title="OAuth Customization using Scripting" href="/resources/learn/getting-started-scripting/">OAuth Customization using Scripting</a></li><li data-area="tutorials"><a class="block " title="OAuth Customization using Plugins" href="/resources/learn/getting-started-plugins/">OAuth Customization using Plugins</a></li><li data-area="tutorials"><a aria-current="page" class="block active" title="Getting Started with Authentication Plugins" href="/resources/learn/getting-started-authentication-plugins/">Getting Started with Authentication Plugins</a></li><li data-area="tutorials"><a class="block " title="Authentication Plugin Techniques" href="/resources/learn/authentication-plugin-techniques/">Authentication Plugin Techniques</a></li><li data-area="tutorials"><a class="block " title="Simple Authentication Action" href="/resources/learn/authentication-action/">Simple Authentication Action</a></li><li data-area="tutorials"><a class="block " title="Generic Consentor Plugin" href="/resources/learn/generic-consentor-plugin/">Generic Consentor Plugin</a></li><li data-area="tutorials"><a class="block " title="Attaching a Remote Debugger" href="/resources/learn/attach-debugger/">Attaching a Remote Debugger</a></li></ul></ul><h4 class="uppercasecaps mt0 flex flex-center flex-gap-1 p2"><img src="/images/resources/sidebar/api-gateway-integration.svg" alt="API Gateway Integration" class="h-3"/>API Gateway Integration</h4><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="phantom-token-integration" class=" " href="/resources/phantom-token-integration/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Phantom Token</div><button class="button button-small button-transparent" data-pagegroup="phantom-token-integration"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="OAuth Introspection and Phantom Tokens" href="/resources/learn/introspect-with-phantom-token/">OAuth Introspection and Phantom Tokens</a></li><li data-area="tutorials"><a class="block " title="Integrating with NGINX" href="/resources/learn/nginx-phantom-token-module/">Integrating with NGINX</a></li><li data-area="tutorials"><a class="block " title="Integrating with Kong Enterprise" href="/resources/learn/integration-kong/">Integrating with Kong Enterprise</a></li><li data-area="tutorials"><a class="block " title="Integrating with Kong Open Source" href="/resources/learn/integration-kong-open-source/">Integrating with Kong Open Source</a></li><li data-area="tutorials"><a class="block " title="Integrating with OpenResty" href="/resources/learn/integration-openresty/">Integrating with OpenResty</a></li><li data-area="tutorials"><a class="block " title="Integrating with Apigee Edge" href="/resources/learn/integration-apigee/">Integrating with Apigee Edge</a></li><li data-area="tutorials"><a class="block " title="Integrating With Microsoft Azure API Management" href="/resources/learn/integration-azure-api-management/">Integrating With Microsoft Azure API Management</a></li><li data-area="tutorials"><a class="block " title="Integrating with the AWS API Gateway" href="/resources/learn/integration-aws-phantom-token/">Integrating with the AWS API Gateway</a></li><li data-area="tutorials"><a class="block " title="Integrating with Broadcom CA Layer7" href="/resources/learn/integration-layer7/">Integrating with Broadcom CA Layer7</a></li><li data-area="tutorials"><a class="block " title="Integrating other API Gateways" href="/resources/learn/integration-other-phantom-token/">Integrating other API Gateways</a></li><li data-area="tutorials"><a class="block " title="Integrating with Zuplo" href="/resources/learn/integration-zuplo/">Integrating with Zuplo</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="split-token-integration" class=" " href="/resources/split-token-integration/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Split Token</div><button class="button button-small button-transparent" data-pagegroup="split-token-integration"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Integrating with Apigee Edge" href="/resources/learn/integration-apigee-split-token/">Integrating with Apigee Edge</a></li><li data-area="tutorials"><a class="block " title="Integrating with the AWS API Gateway" href="/resources/learn/integration-aws-split-token/">Integrating with the AWS API Gateway</a></li><li data-area="tutorials"><a class="block " title="Integrating with the Cloudflare Gateway" href="/resources/learn/cloudflare-split-tokens/">Integrating with the Cloudflare Gateway</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="oauth-proxy-integration" class=" " href="/resources/oauth-proxy-integration/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">OAuth Proxy</div><button class="button button-small button-transparent" data-pagegroup="oauth-proxy-integration"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Integrating with Kong API Gateway" href="/resources/learn/kong-oauth-proxy/">Integrating with Kong API Gateway</a></li><li data-area="tutorials"><a class="block " title="Integrating with OpenResty" href="/resources/learn/openresty-oauth-proxy/">Integrating with OpenResty</a></li><li data-area="tutorials"><a class="block " title="Integrating with NGINX" href="/resources/learn/nginx-oauth-proxy/">Integrating with NGINX</a></li><li data-area="tutorials"><a class="block " title="Integrating with Azure API Management" href="/resources/learn/azure-api-management-oauth-proxy/">Integrating with Azure API Management</a></li><li data-area="tutorials"><a class="block " title="Integrating with AWS API Gateway" href="/resources/learn/aws-oauth-proxy/">Integrating with AWS API Gateway</a></li><li data-area="tutorials"><a class="block " title="Integrating with Google Apigee API Management" href="/resources/learn/google-apigee-oauth-proxy/">Integrating with Google Apigee API Management</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="api-gateway-advanced" class=" " href="/resources/api-gateway-advanced/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Advanced Integration</div><button class="button button-small button-transparent" data-pagegroup="api-gateway-advanced"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Dynamic User Routing with NGINX" href="/resources/learn/nginx-user-routing-plugin/">Dynamic User Routing with NGINX</a></li><li data-area="tutorials"><a class="block " title="Dynamic User Routing with Kong Open Source" href="/resources/learn/kong-user-routing-plugin/">Dynamic User Routing with Kong Open Source</a></li><li data-area="tutorials"><a class="block " title="Dynamic User Routing with Cloudflare Gateway" href="/resources/learn/cloudflare-dynamic-user-routing/">Dynamic User Routing with Cloudflare Gateway</a></li><li data-area="tutorials"><a class="block " title="Dynamic User Routing with Cloud Platforms" href="/resources/learn/cloud-user-routing/">Dynamic User Routing with Cloud Platforms</a></li><li data-area="tutorials"><a class="block " title="API Authorization using Open Policy Agent and Kong" href="/resources/learn/curity-opa-kong-api/">API Authorization using Open Policy Agent and Kong</a></li><li data-area="tutorials"><a class="block " title="Open Banking Brazil DCR Request Validation" href="/resources/learn/nginx-obb-dcr-validation/">Open Banking Brazil DCR Request Validation</a></li></ul></ul><h4 class="uppercasecaps mt0 flex flex-center flex-gap-1 p2"><img src="/images/resources/sidebar/hypermedia-authentication-api.svg" alt="Applications" class="h-3"/>Applications</h4><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="spa" class=" " href="/resources/spa/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">Single Page Applications</div><button class="button button-small button-transparent" data-pagegroup="spa"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Create a Token Handler" href="/resources/learn/curity-token-handler/">Create a Token Handler</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="haapi-setup" class=" " href="/resources/haapi-setup/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">HAAPI Configuration</div><button class="button button-small button-transparent" data-pagegroup="haapi-setup"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Web Client HAAPI Setup" href="/resources/learn/api-driven-demo-client/">Web Client HAAPI Setup</a></li><li data-area="tutorials"><a class="block " title="Android Client HAAPI Setup" href="/resources/learn/authentication-api-android-sdk/">Android Client HAAPI Setup</a></li><li data-area="tutorials"><a class="block " title="iOS Client HAAPI Setup" href="/resources/learn/authentication-api-ios-sdk/">iOS Client HAAPI Setup</a></li><li data-area="tutorials"><a class="block " title="Native Passkeys Configuration" href="/resources/learn/mobile-logins-using-native-passkeys/">Native Passkeys Configuration</a></li></ul></ul><ul class="list-reset m0"><li class="has-children has-children-topic"><a id="haapi-ui-sdk" class=" " href="/resources/haapi-ui-sdk/"><div class="flex flex-center justify-between"><div class="flex flex-center justify-between">HAAPI Mobile Guides</div><button class="button button-small button-transparent" data-pagegroup="haapi-ui-sdk"><i class="icon ion-chevron-down"></i></button></div></a></li><ul class="list-reset m0 sublist false"><li data-area="tutorials"><a class="block " title="Android Integration" href="/resources/learn/haapi-mobile-android-integration/">Android Integration</a></li><li data-area="tutorials"><a class="block " title="iOS Integration" href="/resources/learn/haapi-mobile-ios-integration/">iOS Integration</a></li><li data-area="tutorials"><a class="block " title="Password Flows" href="/resources/learn/haapi-mobile-username-password-flows/">Password Flows</a></li><li data-area="tutorials"><a class="block " title="Android Customization" href="/resources/learn/haapi-mobile-android-customization/">Android Customization</a></li><li data-area="tutorials"><a class="block " title="iOS Customization" href="/resources/learn/haapi-mobile-ios-customization/">iOS Customization</a></li><li data-area="tutorials"><a class="block " title="Advanced Flows" href="/resources/learn/haapi-mobile-advanced-authentication-flows/">Advanced Flows</a></li><li data-area="tutorials"><a class="block " title="App2App Logins using BankID" href="/resources/learn/app2app-via-hypermedia/">App2App Logins using BankID</a></li><li data-area="tutorials"><a class="block " title="Security Lifecycle" href="/resources/learn/haapi-mobile-security-lifecycle/">Security Lifecycle</a></li><li data-area="tutorials"><a class="block " title="Attestation Fallback" href="/resources/learn/implementing-haapi-fallback/">Attestation Fallback</a></li></ul></ul><h4 class="uppercasecaps mt0 flex flex-center flex-gap-1 p2"><img src="/images/resources/sidebar/learnmore.svg" alt="Learn More" class="h-3"/>Learn more</h4><ul class="list-reset m0"><li><a href="/resources/webinars/">Webinars</a></li><li><a href="/resources/documents/">Documents</a></li><li><a href="/resources/videos/">Videos</a></li></ul></div></div></aside><section class="article-content"><div class="article-text"><div class="resources-article-intro"><div class="py2"><div class="container container-wide"><div class="resources-article-intro-image"><img src="/images/resources/tutorials/frontend/authentication-plugins-getting-started.png" alt="Implement custom authentication within an OAuth flow" width="930" height="416" class="skeleton-loading"/></div><h1>Getting Started with Authentication Plugins</h1><div class="resources-article-meta xlg-flex flex-center mb3 flex-gap-2"><div class="flex flex-center mt2 lg-mt0"><button class="lg-inline-flex-hide button button-tiny flex-noshrink mr2 button-primary-outline"><i class="icon ion-android-share-alt inlineicon"></i>Share</button><button class="lg-inline-flex button button-tiny flex-noshrink mr2 button-transparent" data-tooltip="Copy URL to clipboard" flow="down"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" title="Copy to clipboard"><path d="M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71"></path></svg></button><a class="share-button flex-noshrink mr1" target="_blank" rel="noopener noreferrer" href="https://twitter.com/intent/tweet?url=https://curity.io/resources/learn/getting-started-authentication-plugins/&amp;text=Getting%20Started%20with%20Authentication%20Plugins&amp;via=curityio" aria-label="Share on X" data-tooltip="Share on X" flow="down"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 1227" width="48" height="48"><title>X Icon</title><path fill="#000" d="M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894-377.686-540.24h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z"></path></svg></a><a class="share-button flex-noshrink mr1" target="_blank" rel="noopener noreferrer" href="https://bsky.app/intent/compose?text=Getting%20Started%20with%20Authentication%20Plugins - https://curity.io/resources/learn/getting-started-authentication-plugins/" aria-label="Share on Bluesky" data-tooltip="Share on Bluesky" flow="down"><svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24"><path fill="#000" d="M12 10.8c-1.087-2.114-4.046-6.053-6.798-7.995C2.566.944 1.561 1.266.902 1.565.139 1.908 0 3.08 0 3.768c0 .69.378 5.65.624 6.479.815 2.736 3.713 3.66 6.383 3.364q.204-.03.415-.056-.207.033-.415.056c-3.912.58-7.387 2.005-2.83 7.078 5.013 5.19 6.87-1.113 7.823-4.308.953 3.195 2.05 9.271 7.733 4.308 4.267-4.308 1.172-6.498-2.74-7.078a9 9 0 0 1-.415-.056q.21.026.415.056c2.67.297 5.568-.628 6.383-3.364.246-.828.624-5.79.624-6.478 0-.69-.139-1.861-.902-2.206-.659-.298-1.664-.62-4.3 1.24C16.046 4.748 13.087 8.687 12 10.8"></path></svg></a><a class="share-button share-button-linkedin flex-noshrink mr1" target="_blank" rel="noopener noreferrer" href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://curity.io/resources/learn/getting-started-authentication-plugins/&amp;title=&amp;summary=Getting Started with Authentication Plugins&amp;source=" aria-label="Share on LinkedIn" data-tooltip="Share on LinkedIn" flow="down"> <svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 430.1 430.1" version="1.1" viewBox="0 0 430.1 430.1" xml:space="preserve"><path fill="#0077b5" d="M430.1 261.5v159h-92.2V272.2c0-37.3-13.3-62.7-46.7-62.7-25.5 0-40.6 17.1-47.3 33.7-2.4 5.9-3.1 14.2-3.1 22.5v154.9h-92.2s1.2-251.3 0-277.3h92.2v39.3l-.6.9h.6v-.9c12.3-18.9 34.1-45.8 83.1-45.8 60.7-.1 106.2 39.6 106.2 124.7zM52.2 9.6C20.6 9.6 0 30.3 0 57.5c0 26.6 20 47.9 51 47.9h.6c32.2 0 52.2-21.3 52.2-47.9-.7-27.2-20.1-47.9-51.6-47.9zm-46.7 411h92.2V143.2H5.5v277.4z"></path></svg></a></div></div><div class="sm-flex justify-between flex-center bg-light p2 br-6"><a class="outbound button button-primary-dark button-small button-github" href="https://github.com/curityio/getting-started-authenticator" target="_blank" rel="noopener noreferrer"><i class="icon ion-social-github inlineicon"></i>Download on GitHub</a></div></div></div></div><div class="container container-wide"><div class="article-entry mt1 lg-mt2 py2 lg-py2"><article itemProp="articleBody"><details class="lg-hide"><summary>On this page</summary><nav class="article-mobile-toc-links" role="navigation"><ol class="m0"></ol></nav></details><p>The <a class="ref ref-cross" href="/resources/learn/getting-started-plugins/"><i class="icon ion-android-list inlineicon"></i>OAuth Customization using Plugins<i class="icon ion-android-arrow-forward ml1"></i></a> tutorial explains the base development and deployment setup when working with plugins. Many plugins are relatively straightforward to develop, yet authentication plugins are more intricate, since they deal with frontend concerns like forms, user experience and navigation, and also backend concerns like account data, custom logic and proof validation.</p> <p>When getting started with plugins, you first need to understand the following foundational techniques:</p> <ul> <li>How to create HTTP GET and POST endpoints used by login forms.</li> <li>How to create frontend forms for both browser-based and native login flows.</li> <li>How to collect data client-side, validate it server-side, and integrate custom data.</li> <li>How to manage navigation and session state during an authentication workflow.</li> </ul> <p>Once you understand these core behaviors you will be well placed to develop any kind of custom authentication solution. You can also incorporate additional techniques from <a rel="noopener noreferrer" href="https://github.com/orgs/curityio/repositories?language=&amp;q=topic%3Aplugin+topic%3Aauthenticator&amp;sort=&amp;type=all">Curity&#x27;s GitHub repositories</a>. You use Kotlin or Java to develop an authentication plugin, but you do not need to be an expert in those technologies.</p> <h2>Wizard-Based Example</h2> <p>To explain the concepts, this tutorial uses a wizard-based authenticator. Some online authorities use this type of login user experience, to capture multiple proofs of the user identity one stage at a time. The wizard runs during an OpenID Connect code flow and presents a number of screens. First, a <code>user credentials login form</code> prompts the user to provide an account ID and password:</p> <figure class="mx-auto block w-20"><img src="/images/resources/tutorials/writing-plugins/getting-started/wizard-form-1.jpg" alt="Wizard Form 1"/></figure> <p>Next, a <code>user details login form</code> prompts the user for further proof of their identity. The user must provide their social security number and date of birth, to be verified using details stored against the user&#x27;s account.</p> <figure class="mx-auto block w-20"><img src="/images/resources/tutorials/writing-plugins/getting-started/wizard-form-2.jpg" alt="Wizard Form 2"/></figure> <p>If required, you could add extra forms, like those that prove ownership of an email or phone. You could do so using SDK objects that send the user email or text (SMS) messages.</p> <p>Finally, once the user has successfully proven their identity, a <code>success login form</code> is displayed, as an example of completing a wizard-based login user experience. Authentication completes when the user clicks the <strong>Continue</strong> button:</p> <figure class="mx-auto block w-20"><img src="/images/resources/tutorials/writing-plugins/getting-started/wizard-form-3.jpg" alt="Wizard Form 3"/></figure> <p>If you configure user consent for the client, the user interacts with consent screens, after which the client receives an authorization response. The client can then complete the code flow to get access tokens and send them to its APIs.</p> <div class="alert alert-note"><p class="alert-title">Designing Authentication Workflows</p><p>Usually, a better approach is to compose <a class="ref ref-cross" href="/resources/learn/authentication-overview/"><i class="icon ion-android-list inlineicon"></i>authenticators<i class="icon ion-android-arrow-forward ml1"></i></a> and <a class="ref ref-cross" href="/resources/learn/control-authentication-using-actions/"><i class="icon ion-android-list inlineicon"></i>authentication actions<i class="icon ion-android-arrow-forward ml1"></i></a>. This tutorial uses a wizard-based approach to teach navigation and demonstrate that an authenticator is not limited to a single form.</p></div> <h2>Code Layout</h2> <p>The following command generated the files for the initial Kotlin classes for this tutorial:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">bash</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div><div class="code-pre-wrapper"><pre class="prism-code language-bash" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">mvn </span><span class="token parameter variable" style="color:#f5b83d">-B</span><span class="token plain"> archetype:generate </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token parameter variable" style="color:#f5b83d">-DarchetypeArtifactId</span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain">identityserver.plugins.archetypes.kotlin-authenticator </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token parameter variable" style="color:#f5b83d">-DarchetypeGroupId</span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain">io.curity </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token parameter variable" style="color:#f5b83d">-DarchetypeVersion</span><span class="token operator" style="color:#ff79c6">=</span><span class="token number" style="color:rgb(247, 140, 108)">3.0</span><span class="token plain">.0 </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token parameter variable" style="color:#f5b83d">-DartifactId</span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain">example-authenticator </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token parameter variable" style="color:#f5b83d">-DgroupId</span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain">com.example.plugins.exampleauthenticator </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token parameter variable" style="color:#f5b83d">-DpluginName</span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain">Example </span><span class="token punctuation" style="color:rgb(199, 146, 234)">\</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token parameter variable" style="color:#f5b83d">-Dversion</span><span class="token operator" style="color:#ff79c6">=</span><span class="token number" style="color:rgb(247, 140, 108)">1.0</span><span class="token plain">.0-SNAPSHOT</span></div></pre></div></div></div> <p>The <code>mvn archetype</code> command produces the following Kotlin classes, which are the minimal files needed to develop an authenticator. By default there is no user interface, since an authenticator does not always need one.</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">text</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span></div><div class="code-pre-wrapper"><pre class="prism-code language-text" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">├── authentication</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ ├── ExampleAuthenticatorRequestHandler.kt</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ ├── RequestModel</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">├── config</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── ExampleAuthenticatorPluginConfig.kt</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">├── descriptor</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── ExampleAuthenticatorPluginDescriptor.kt</span></div></pre></div></div></div> <p>Each authenticator can have multiple functional areas like authentication, account recovery and user registration. Each area&#x27;s implementation can use multiple forms. The example authenticator only requires authentication behavior and uses an authentication wizard with three forms:</p> <ul> <li>The user credentials login form, where the account ID and password are entered</li> <li>The user details login form, where the social security number and date of birth are entered</li> <li>The success login form, that completes the authentication wizard</li> </ul> <p>The example authenticator&#x27;s file layout is therefore customized to use three forms and the following source files:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">text</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span><span>15</span><span>16</span><span>17</span><span>18</span><span>19</span><span>20</span><span>21</span><span>22</span><span>23</span><span>24</span></div><div class="code-pre-wrapper"><pre class="prism-code language-text" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">├── authenticate</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ ├── handlers</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── UserCredentialsRequestHandler.kt</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── UserDetailsRequestHandler.kt</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── SuccessRequestHandler.kt</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ ├── models</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── UserCredentialsRequestModel.kt</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── UserDetailsRequestModel.kt</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── SuccessRequestModel.kt</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ ├── representations</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── UserCredentialsRepresentationFunction.kt</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── UserDetailsRepresentationFunction.kt</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── SuccessRepresentationFunction.kt</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">├── config</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── ExampleAuthenticatorPluginConfig.kt</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">├── descriptor</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── ExampleAuthenticatorPluginDescriptor.kt</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">├── resources</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ ├── messages.en.authenticator.example.authenticate</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── messages</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ ├── templates.authenticator.example.authenticate</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── usercredentials.vm</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── userdetails.vm</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">│ │ └── success.vm</span></div></pre></div></div></div> <p>Each login form of the example authenticator uses multiple resources, summarized in the following table. The following sections of this tutorial further explain the behavior of each resource.</p> <table><thead><tr><th>Resource Type</th><th>Description</th></tr></thead><tbody><tr><td>Request Handler</td><td>The login form&#x27;s HTTP GET and POST endpoints and main backend logic</td></tr><tr><td>Request Model</td><td>The form data and its validation rules</td></tr><tr><td>HAAPI Representation</td><td>Representation functions provide data needed to render native login forms</td></tr><tr><td>HTML Form</td><td>The <code>.vm</code> files are downloaded by the browser as HTML login forms</td></tr></tbody></table> <p>Frontend login forms use resource files to control their presentation, including a <code>messages</code> file that contains text values. Resource files are explained shortly, in the section on frontend form development.</p> <h2>Plugin Configuration</h2> <p>Plugins use a configuration interface, which can reference primitive values or system components represented as SDK objects. The example plugin uses a <a href="https://curity.io/docs/idsvr-java-plugin-sdk/latest/se/curity/identityserver/sdk/service/credential/UserCredentialManager.html" target="_blank" rel="noopener noreferrer" class="ref ref-docs" data-tooltip="Open Documentation"><i class="icon ion-android-document"></i>UserCredentialManager<i class="icon ion-android-share ml1"></i></a> and an <a href="https://curity.io/docs/idsvr-java-plugin-sdk/latest/se/curity/identityserver/sdk/service/AccountManager.html" target="_blank" rel="noopener noreferrer" class="ref ref-docs" data-tooltip="Open Documentation"><i class="icon ion-android-document"></i>AccountManager<i class="icon ion-android-share ml1"></i></a>. You configure specific instances of these objects, whereas utility objects like the <a href="https://curity.io/docs/idsvr-java-plugin-sdk/latest/se/curity/identityserver/sdk/service/SessionManager.html" target="_blank" rel="noopener noreferrer" class="ref ref-docs" data-tooltip="Open Documentation"><i class="icon ion-android-document"></i>SessionManager<i class="icon ion-android-share ml1"></i></a> are simply injected:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">kotlin</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span></div><div class="code-pre-wrapper"><pre class="prism-code language-kotlin" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token keyword" style="color:#ff79c6;font-style:normal">interface</span><span class="token plain"> ExampleAuthenticatorPluginConfig </span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Configuration</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">getCredentialManager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> UserCredentialManager</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">getAccountManager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> AccountManager</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> sessionManager</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> SessionManager</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> authenticatorInformationProvider</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> AuthenticatorInformationProvider</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> exceptionFactory</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> ExceptionFactory</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></div></pre></div></div></div> <p>Later, when you deploy the plugin, you create one or more instances of it. You often first do so by running the Admin UI and navigating to <strong>System</strong> → <strong>Authentication Service</strong> → <strong>Authenticators</strong>. You then apply any non-optional configuration settings:</p> <img src="/images/resources/tutorials/writing-plugins/getting-started/plugin-settings.jpg" alt="Plugin Settings"/> <h2>HTTP Routes</h2> <p>You declare HTTP routes for your plugin&#x27;s forms using a plugin descriptor. By default, an authenticator called <code>example</code> uses an HTTP base path of <code>/authentication/authn/example</code>. The example authenticator uses the following routes, where the first login form uses an <code>index</code> route to match the base path:</p> <div class="scroller"><table><thead><tr><th>Form</th><th>Route</th><th>Full Path</th></tr></thead><tbody><tr><td>User Credentials</td><td>index</td><td>/authentication/authn/example</td></tr><tr><td>User Details</td><td>userdetails</td><td>/authentication/authn/example/userdetails</td></tr><tr><td>Success</td><td>success</td><td>/authentication/authn/example/success</td></tr></tbody></table></div> <p>To define routes, you implement the <code>getAuthenticationRequestHandlerTypes</code> method of the plugin descriptor class. The main part of the example authenticator&#x27;s plugin descriptor is shown here:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">kotlin</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span><span>15</span></div><div class="code-pre-wrapper"><pre class="prism-code language-kotlin" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token keyword" style="color:#ff79c6;font-style:normal">class</span><span class="token plain"> ExampleAuthenticatorPluginDescriptor </span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> AuthenticatorPluginDescriptor</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token plain">ExampleAuthenticatorPluginConfig</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">override</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">getConfigurationType</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Class</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token keyword" style="color:#ff79c6;font-style:normal">out</span><span class="token plain"> ExampleAuthenticatorPluginConfig</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> ExampleAuthenticatorPluginConfig</span><span class="token operator" style="color:#ff79c6">::</span><span class="token keyword" style="color:#ff79c6;font-style:normal">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">java</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">override</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">getPluginImplementationType</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> String </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;example&quot;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">override</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">getAuthenticationRequestHandlerTypes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Map</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token plain">String</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Class</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token keyword" style="color:#ff79c6;font-style:normal">out</span><span class="token plain"> AuthenticatorRequestHandler</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token operator" style="color:#ff79c6">*</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">mapOf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;index&quot;</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">to</span><span class="token plain"> UserCredentialsRequestHandler</span><span class="token operator" style="color:#ff79c6">::</span><span class="token keyword" style="color:#ff79c6;font-style:normal">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">java</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;userdetails&quot;</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">to</span><span class="token plain"> UserDetailsRequestHandler</span><span class="token operator" style="color:#ff79c6">::</span><span class="token keyword" style="color:#ff79c6;font-style:normal">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">java</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;success&quot;</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">to</span><span class="token plain"> SuccessRequestHandler</span><span class="token operator" style="color:#ff79c6">::</span><span class="token keyword" style="color:#ff79c6;font-style:normal">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">java</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></div></pre></div></div></div> <h3>HTTP Route Implementations</h3> <p>You implement HTTP routes in your request handler classes by implementing <code>preProcess</code>, <code>get</code> and <code>post</code> methods. The following code provides a skeleton implementation of one of the example authenticator&#x27;s login forms, where the <code>preProcess</code> method connects the handler to its form resource:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">kotlin</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span><span>15</span><span>16</span><span>17</span><span>18</span><span>19</span><span>20</span><span>21</span><span>22</span><span>23</span><span>24</span><span>25</span></div><div class="code-pre-wrapper"><pre class="prism-code language-kotlin" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token keyword" style="color:#ff79c6;font-style:normal">class</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">UserDetailsRequestHandler</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token keyword" style="color:#ff79c6;font-style:normal">private</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> _config</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> ExampleAuthenticatorPluginConfig</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> AuthenticatorRequestHandler</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token plain">UserDetailsRequestModel</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">override</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">preProcess</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">request</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> response</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Response</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> UserDetailsRequestModel</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> response</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">setResponseModel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">templateResponseModel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">emptyMap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;authenticate/userdetails&quot;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ResponseModelScope</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">ANY</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">return</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">UserDetailsRequestModel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">override</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">get</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">requestModel</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> UserDetailsRequestModel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> response</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Response</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Optional</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token plain">AuthenticationResult</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">return</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">empty</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">override</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">post</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">requestModel</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> UserDetailsRequestModel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> response</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Response</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Optional</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token plain">AuthenticationResult</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">return</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">empty</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></div></pre></div></div></div> <p>When users authenticate, login forms are downloaded using an HTTP GET request, which runs the <code>preProcess</code> and <code>get</code> methods. The user then enters data in the login form and submits the data to the server in an HTTP POST request, which runs the <code>preProcess</code> and <code>post</code> methods. This tutorial says more about request handlers and request models shortly, after showing how to implement your frontend login forms.</p> <h2>Frontend Form Development</h2> <p>There are two types of forms that an authenticator can present to users. Most commonly, an application runs a browser-based flow where a browser downloads HTML forms and renders them. You develop frontend HTML-based logic in <code>.vm</code> files, using web technologies. The <code>.vm</code> files are velocity templates which provide some extra programmatic convenience over raw HTML. The example authenticator uses the following HTML forms:</p> <div class="scroller"><table><thead><tr><th>Request Handler</th><th>HTML Form</th></tr></thead><tbody><tr><td>UserCredentialsRequestHandler</td><td>usercredentials.vm</td></tr><tr><td>UserDetailsRequestHandler</td><td>userdetails.vm</td></tr><tr><td>SuccessRequestHandler</td><td>success.vm</td></tr></tbody></table></div> <p>If you use the <a class="ref ref-cross" href="/resources/learn/what-is-hypermedia-authentication-api/"><i class="icon ion-android-list inlineicon"></i>Hypermedia Authentication API (HAAPI)<i class="icon ion-android-arrow-forward ml1"></i></a>, your clients can present native login forms rather than rendering HTML forms in the system browser. To enable this you provide HAAPI representations of each form, by mapping the name of each <code>.vm</code> file to a representation class.</p> <p>To provide HAAPI representations, you implement the <code>getRepresentationFunctions</code> method of the plugin descriptor class. The example authenticator uses the following code to provide HAAPI representations for its login forms:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">kotlin</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span></div><div class="code-pre-wrapper"><pre class="prism-code language-kotlin" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token keyword" style="color:#ff79c6;font-style:normal">override</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">getRepresentationFunctions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Map</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token plain">String</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Class</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token keyword" style="color:#ff79c6;font-style:normal">out</span><span class="token plain"> RepresentationFunction</span><span class="token operator" style="color:#ff79c6">?</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">mapOf</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;authenticate/usercredentials&quot;</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">to</span><span class="token plain"> UserCredentialsRepresentationFunction</span><span class="token operator" style="color:#ff79c6">::</span><span class="token keyword" style="color:#ff79c6;font-style:normal">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">java</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;authenticate/userdetails&quot;</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">to</span><span class="token plain"> UserDetailsRepresentationFunction</span><span class="token operator" style="color:#ff79c6">::</span><span class="token keyword" style="color:#ff79c6;font-style:normal">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">java</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;authenticate/success&quot;</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">to</span><span class="token plain"> SuccessRepresentationFunction</span><span class="token operator" style="color:#ff79c6">::</span><span class="token keyword" style="color:#ff79c6;font-style:normal">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">java</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span></div></pre></div></div></div> <p>The frontend can then receive a JSON API response containing the form data, instead of an HTML response. The client can use a HAAPI SDK to dynamically render native forms from the API response.</p> <div class="alert alert-tip"><p class="alert-title">HAAPI User Experience Benefits</p><p>When using native forms you can often implement authentication using a modal dialog, without users being redirected away from the app. You can also make frontend customizations per client without dependencies on a central identity team.</p></div> <h3>HTML Forms</h3> <p>To get an HTML form the browser sends an HTTP request with a default HTTP <code>accept</code> header, such as <code>text/html</code>. The server then translates the contents of a <code>.vm</code> file to an HTML response.</p> <p>To define your HTML login forms you develop HTML markup in <code>.vm</code> files. When first using authentication plugins, start with simple labels and input controls, along with a submit button. The following example form represents the user details form of the example plugin. When the user submits the HTML form its values are posted to the server:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">html</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span><span>15</span></div><div class="code-pre-wrapper"><pre class="prism-code language-html" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">#define ($_body)</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:#ff79c6">h2</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">#message(&quot;authenticator.example.authenticate.meta.title.userdetails&quot;)</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:#ff79c6">h2</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:#ff79c6">form</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">method</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">post</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:#ff79c6">label</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">for</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">socialSecurityNumber</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">$!_errorClass</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">#message(&quot;authenticator.example.authenticate.view.social-security-number&quot;)</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:#ff79c6">label</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:#ff79c6">input</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">type</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">text</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">socialSecurityNumber</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">name</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">socialSecurityNumber</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">autocomplete</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">off</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">block full-width mb1 field-light</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">value</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">$!socialSecurityNumberValue</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:#ff79c6">label</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">for</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">dateOfBirth</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">#message(&quot;authenticator.example.authenticate.view.date-of-birth&quot;)</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:#ff79c6">label</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:#ff79c6">input</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">type</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">text</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">dateOfBirth</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">name</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">dateOfBirth</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">autocomplete</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">off</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">block full-width mb1 field-light</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">value</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">$!dateOfBirthValue</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:#ff79c6">button</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">type</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">submit</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">button button-fullwidth button-primary</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">#message(&quot;authenticator.example.authenticate.view.next&quot;)</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:#ff79c6">button</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:#ff79c6">form</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">#end</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">#parse(&quot;layouts/default&quot;)</span></div></pre></div></div></div> <p>Statements in the markup that begin with a <code>#</code> character occur server-side, before returning the final HTML to the browser. CSS styling and layout is applied, which you can customize in various ways, per client when required. See the <a class="ref ref-cross" href="/resources/learn/managing-custom-login-screens/"><i class="icon ion-android-list inlineicon"></i>branding customization tutorials<i class="icon ion-android-arrow-forward ml1"></i></a> to learn more.</p> <p>You can also insert custom frontend logic into HTML forms. The following snippet shows an entry point, to which you could add event handlers to customize behaviors. For example you might override a particular input control&#x27;s <code>change</code> event to restrict the characters accepted. When adding JavaScript, a nonce must be included, to comply with the content security policy (CSP) of the Curity Identity Server:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">html</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span></div><div class="code-pre-wrapper"><pre class="prism-code language-html" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:#ff79c6">form</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">method</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">post</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> ...</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> #parse(&quot;fragments/jquery&quot;)</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:#ff79c6">script</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">type</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag attr-value" style="color:#f1fa8c">text/javascript</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">&quot;</span><span class="token tag" style="color:#ff79c6"> </span><span class="token tag attr-name" style="color:rgb(173, 219, 103);font-style:italic">$!nonceAttr</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token script language-javascript"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token script language-javascript"> </span><span class="token script language-javascript function" style="color:rgb(130, 170, 255)">jQuery</span><span class="token script language-javascript punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token script language-javascript dom variable" style="color:#f5b83d">document</span><span class="token script language-javascript punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token script language-javascript punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token script language-javascript method function property-access" style="color:rgb(130, 170, 255)">ready</span><span class="token script language-javascript punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token script language-javascript keyword" style="color:#ff79c6;font-style:normal">function</span><span class="token script language-javascript punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token script language-javascript punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token script language-javascript"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token script language-javascript"> </span><span class="token script language-javascript comment" style="color:rgb(99, 119, 119);font-style:italic">// Add frontend logic here</span><span class="token script language-javascript"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token script language-javascript"> </span><span class="token script language-javascript punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token script language-javascript punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token script language-javascript"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token script language-javascript"> </span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:#ff79c6">script</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:#ff79c6">form</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span></div></pre></div></div></div> <h3>Native Forms</h3> <p>To get a native form, the frontend sends an HTTP request with a custom HTTP <code>accept</code> header of <code>accept=application/vnd.auth+json</code>. The server then returns the HAAPI representation as a JSON API response.</p> <p>To define your native login forms you override the <code>apply</code> method of your <code>RepresentationFunction</code> classes. The following code shows a HAAPI representation for the example plugin&#x27;s user details form. When first using HAAPI representations, start with simple labels and input controls, along with a submit button. When the user submits the native form its values are posted to the server:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">kotlin</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span><span>15</span><span>16</span><span>17</span><span>18</span><span>19</span><span>20</span><span>21</span><span>22</span><span>23</span><span>24</span><span>25</span></div><div class="code-pre-wrapper"><pre class="prism-code language-kotlin" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token keyword" style="color:#ff79c6;font-style:normal">class</span><span class="token plain"> UserDetailsRepresentationFunction </span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> RepresentationFunction </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">override</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">apply</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">model</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> RepresentationModel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> factory</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> RepresentationFactory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Representation </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> baseUrl </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> model</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">getString</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;_authUrl&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> postbackUrl </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;</span><span class="token string-literal singleline interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">$</span><span class="token string-literal singleline interpolation expression">baseUrl</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">/userdetails&quot;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> socialSecurityNumberValue </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;&quot;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> dateOfBirthValue </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;&quot;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">return</span><span class="token plain"> factory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">newAuthenticationStep</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> step</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> AuthenticationStepConfigurator </span><span class="token operator" style="color:#ff79c6">-&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">addFormAction</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> HaapiContract</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Actions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Kinds</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">CONTINUE</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> URI</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">create</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">postbackUrl</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> HttpMethod</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">POST</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> MediaType</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">X_WWW_FORM_URLENCODED</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> Message</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">ofKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;authenticator.example.authenticate.meta.title.userdetails&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> Message</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">ofKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;authenticator.example.authenticate.view.next&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"> fields </span><span class="token operator" style="color:#ff79c6">-&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> fields</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">addTextField</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;socialSecurityNumber&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Message</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">ofKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;authenticator.example.authenticate.view.social-security-number&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> socialSecurityNumberValue</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> fields</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">addTextField</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;dateOfBirth&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Message</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">ofKey</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;authenticator.example.authenticate.view.date-of-birth&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> dateOfBirthValue</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></div></pre></div></div></div> <p>This HAAPI representation results in the server returning the following API response:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">json</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span><span>15</span><span>16</span><span>17</span><span>18</span><span>19</span><span>20</span><span>21</span><span>22</span><span>23</span><span>24</span><span>25</span><span>26</span><span>27</span><span>28</span><span>29</span><span>30</span><span>31</span></div><div class="code-pre-wrapper"><pre class="prism-code language-json" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;metadata&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;viewName&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;authenticator/example/authenticate/userdetails&quot;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;type&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;authentication-step&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;actions&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;template&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;form&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;kind&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;continue&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;title&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;Confirm Your Details&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;model&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;href&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;/authn/authentication/example/userdetails&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;method&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;POST&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;type&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;application/x-www-form-urlencoded&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;actionTitle&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;Next&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;fields&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;name&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;socialSecurityNumber&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;type&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;text&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;label&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;Social Security Number&quot;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;name&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;dateOfBirth&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;type&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;text&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token property" style="color:rgb(128, 203, 196)">&quot;label&quot;</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(173, 219, 103)">&quot;Date Of Birth&quot;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></div></pre></div></div></div> <p>The client, or an SDK that it uses, can render the response data as a native form. The HAAPI Android and iOS SDKs renders this payload as the following user interfaces. The user then provides values to populate the form:</p> <div class="sm-flex flex-center justify-between flex-gap-2"><figure class="mx-auto block w-20"><img src="/images/resources/tutorials/writing-plugins/getting-started/haapi-android-representation.jpg" alt="Plugin Native Form for Android"/></figure><figure class="mx-auto block w-20"><img src="/images/resources/tutorials/writing-plugins/getting-started/haapi-ios-representation.jpg" alt="Plugin Native Form for iOS"/></figure></div> <p>To learn more about the options you can use in HAAPI representations and their meanings, you can browse the guide to the <a href="https://curity.io/docs/haapi-data-model/latest/" target="_blank" rel="noopener noreferrer" class="ref ref-docs" data-tooltip="Open Documentation"><i class="icon ion-android-document"></i>HAAPI Data Model<i class="icon ion-android-share ml1"></i></a>. You can also apply frontend customizations to logic or styling using the SDK&#x27;s extensibility features. See the following HAAPI mobile SDK guides for examples:</p> <ul> <li> <a class="ref ref-cross" href="/resources/learn/haapi-mobile-android-customization/"><i class="icon ion-android-list inlineicon"></i>Customizing the Android HAAPI Mobile Login User Experience<i class="icon ion-android-arrow-forward ml1"></i></a> </li> <li> <a class="ref ref-cross" href="/resources/learn/haapi-mobile-ios-customization/"><i class="icon ion-android-list inlineicon"></i>Customizing the iOS HAAPI Mobile Login User Experience<i class="icon ion-android-arrow-forward ml1"></i></a> </li> </ul> <h3>Text Values</h3> <p>Both HTML and native forms can present the same text in login forms. To do so you use a <code>messages</code> file that defines string identifiers and values. You then use the same identifiers in both types of forms. You can use multiple message files to enable localization, which you can read more about in the branding customization tutorials. The example plugin uses a single messages file with the following content:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">text</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span><span>15</span><span>16</span><span>17</span><span>18</span><span>19</span><span>20</span></div><div class="code-pre-wrapper"><pre class="prism-code language-text" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">meta.title.usercredentials=Enter Your Credentials</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">meta.title.userdetails=Confirm Your Details</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">meta.title.success=Authentication Successful</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">view.accountid=Account ID</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">view.password=Password</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">validation.error.accountid.format=The account ID must be 8 numeric digits</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">validation.error.password.required=Please enter your password</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">validation.error.incorrect.credentials=The credentials entered were not valid</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">view.social-security-number=Social Security Number</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">view.date-of-birth=Date Of Birth</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">validation.error.social-security-number.format=Please enter your social security number</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">validation.error.date-of-birth.format=Please enter your date of birth in the format YYYY/MM/DD</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">validation.error.social-security-number.required=Please enter your social security number</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">validation.error.incorrect.social-security-number=The social security number does not match your account</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">validation.error.incorrect.date-of-birth=The date of birth does not match your account</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">view.next=Next</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">view.continue=Continue</span></div></pre></div></div></div> <h2>Backend Form Logic</h2> <p>After the user provides input and clicks the <strong>Next</strong> button, the frontend sends the login form&#x27;s data to the request handler&#x27;s HTTP POST endpoint. User input is then validated. If any data is invalid, the backend returns a response containing error messages that the frontend renders.</p> <h3>Request Models</h3> <p>You define the data for a form in a <code>RequestModel</code> object. The user details form of the example plugin uses the following model. With a simple form you typically only need a POST request model.</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">kotlin</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span><span>15</span><span>16</span><span>17</span><span>18</span><span>19</span><span>20</span><span>21</span></div><div class="code-pre-wrapper"><pre class="prism-code language-kotlin" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token keyword" style="color:#ff79c6;font-style:normal">class</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">UserDetailsRequestModel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">request</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token annotation builtin" style="color:rgb(130, 170, 255)">@Valid</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> postRequestModel</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> UserDetailsPost</span><span class="token operator" style="color:#ff79c6">?</span><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">isPostRequest</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">UserDetailsPost</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">else</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">null</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token keyword" style="color:#ff79c6;font-style:normal">class</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">UserDetailsPost</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">request</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token annotation builtin" style="color:rgb(130, 170, 255)">@NotBlank</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">message </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;validation.error.social-security-number.required&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> socialSecurityNumber</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> String</span><span class="token operator" style="color:#ff79c6">?</span><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">getFormParameterValueOrError</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;socialSecurityNumber&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token annotation builtin" style="color:rgb(130, 170, 255)">@Pattern</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">regexp </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;^[0-9]{4}/[0-9]{2}/[0-9]{2}$&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> message </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;validation.error.date-of-birth.format&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> dateOfBirth</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> String</span><span class="token operator" style="color:#ff79c6">?</span><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">getFormParameterValueOrError</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;dateOfBirth&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">dataOnError</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Map</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token plain">String</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Any</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">data</span><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> HashMap</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token plain">String</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Any</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">data</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;socialSecurityNumber&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> socialSecurityNumber </span><span class="token operator" style="color:#ff79c6">?:</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;&quot;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">data</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;dateOfBirth&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> dateOfBirth </span><span class="token operator" style="color:#ff79c6">?:</span><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;&quot;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">return</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">data</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></div></pre></div></div></div> <p>You express simple field-level validation using <a rel="noopener noreferrer" href="https://jakarta.ee/specifications/bean-validation/3.0/apidocs/jakarta/validation/constraints/package-summary">Jakarta validation annotations</a>. For example, the <code>pattern</code> annotation enables you to set a regular expression that the user input must match. When a user submits invalid data, the error message configured against the annotation is returned to the frontend and displayed to the user.</p> <h3>Data Validation</h3> <p>If a user submits invalid input that fails model validation, the user&#x27;s HTML form input is lost by default. To maintain it, you override the <code>onRequestModelValidationFailure</code> method in your request handler class, to return postback data.</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">kotlin</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span></div><div class="code-pre-wrapper"><pre class="prism-code language-kotlin" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token keyword" style="color:#ff79c6;font-style:normal">override</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">onRequestModelValidationFailure</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> request</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> response</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Response</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> errorMessages</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Set</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token plain">ErrorMessage</span><span class="token operator" style="color:#ff79c6">?</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token operator" style="color:#ff79c6">?</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">isPostRequest</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> model </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">UserDetailsPost</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">request</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> response</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">putViewData</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;_postBack&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> model</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">dataOnError</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ResponseModelScope</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">FAILURE</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></div></pre></div></div></div> <p>You must also use server logic in the <code>.vm</code> file to populate values before the frontend receives the HTML:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">text</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span></div><div class="code-pre-wrapper"><pre class="prism-code language-text" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">#if($_postBack)</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> #if($_postBack.socialSecurityNumber)</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> #set($socialSecurityNumberValue = $_postBack.socialSecurityNumber)</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> #end</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> #if($_postBack.dateOfBirth)</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> #set($dateOfBirthValue = $_postBack.dateOfBirth)</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> #end</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain">#end</span></div></pre></div></div></div> <p>This results in an experience where the user sees an error dialog but does not lose their existing input:</p> <figure class="mx-auto block w-20"><img src="/images/resources/tutorials/writing-plugins/getting-started/error-form.jpg" alt="Error Form"/></figure> <p>Once you understand the basics of HTTP routes, frontend forms and backend form processing, you can move on to the deeper identity logic.</p> <h2>Backend Identity Logic</h2> <p>For a simple form, you implement proof validation in the <code>post</code> method of the request handler class. You can implement proof validation in many possible ways. For example, you could connect to a legacy data source using custom code to validate passwords. Often, though, a better choice is to use SDK objects.</p> <p>In the example plugin, the user credentials request handler validates an account ID and password using its credential manager. This shows how to run the same logic as the built-in HTML Form authenticator (which uses usernames and passwords) in your own forms, without needing to re-implement any low-level security.</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">kotlin</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span></div><div class="code-pre-wrapper"><pre class="prism-code language-kotlin" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token keyword" style="color:#ff79c6;font-style:normal">override</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">post</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">requestModel</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> UserCredentialsRequestModel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> response</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Response</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Optional</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token plain">AuthenticationResult</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> model </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> requestModel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">postRequestModel</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> subjectAttributes </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> SubjectAttributes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">of</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">model</span><span class="token operator" style="color:#ff79c6">?</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">accountId</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> result </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> _config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">getCredentialManager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">verify</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">subjectAttributes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> model</span><span class="token operator" style="color:#ff79c6">?</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">password</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">..</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></div></pre></div></div></div> <p>If credential validation succeeds, the user credentials request handler saves the account ID to the session and redirects the user to the user details form:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">kotlin</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span></div><div class="code-pre-wrapper"><pre class="prism-code language-kotlin" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token keyword" style="color:#ff79c6;font-style:normal">override</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">post</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">requestModel</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> UserCredentialsRequestModel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> response</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Response</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Optional</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token plain">AuthenticationResult</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">..</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">result </span><span class="token keyword" style="color:#ff79c6;font-style:normal">is</span><span class="token plain"> CredentialVerificationResult</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">Accepted</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> _config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">sessionManager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">put</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">Attribute</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">of</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;accountId&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> model</span><span class="token operator" style="color:#ff79c6">?</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">accountId</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">throw</span><span class="token plain"> _config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">exceptionFactory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">redirectException</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;</span><span class="token string-literal singleline interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token string-literal singleline interpolation expression">_config</span><span class="token string-literal singleline interpolation expression punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token string-literal singleline interpolation expression">authenticatorInformationProvider</span><span class="token string-literal singleline interpolation expression punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token string-literal singleline interpolation expression">fullyQualifiedAuthenticationUri</span><span class="token string-literal singleline interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">/userdetails&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> RedirectStatusCode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">MOVED_TEMPORARILY</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">..</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></div></pre></div></div></div> <p>The user details request handler demonstrates one way to involve custom data in an authentication flow. Custom fields for <code>social security number</code> and <code>date of birth</code> are stored in the user account data. The user details request handler looks up these values using its account manager and verifies the values received in the model. If they match, the plugin navigates to the success form:</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">kotlin</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span></div><div class="code-pre-wrapper"><pre class="prism-code language-kotlin" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token keyword" style="color:#ff79c6;font-style:normal">override</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">post</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">requestModel</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> UserDetailsRequestModel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> response</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Response</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Optional</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token plain">AuthenticationResult</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">..</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> user </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> _config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">getAccountManager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">getByUserName</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">accountId</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token function" style="color:rgb(130, 170, 255)">validateSocialSecurityNumber</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">user</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> model</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">validateDateOfBirth</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">user</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> model</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> _config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">sessionManager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">put</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">Attribute</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">of</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;detailsVerified&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">true</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">throw</span><span class="token plain"> _config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">exceptionFactory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">redirectException</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;</span><span class="token string-literal singleline interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">${</span><span class="token string-literal singleline interpolation expression">_config</span><span class="token string-literal singleline interpolation expression punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token string-literal singleline interpolation expression">authenticatorInformationProvider</span><span class="token string-literal singleline interpolation expression punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token string-literal singleline interpolation expression">fullyQualifiedAuthenticationUri</span><span class="token string-literal singleline interpolation interpolation-punctuation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">/success&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> RedirectStatusCode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">MOVED_TEMPORARILY</span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">..</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></div></pre></div></div></div> <p>The final request handler simply needs to retrieve values from the session and then set an authentication result whose authenticated subject is the account ID from the user credentials login form. After authentication completes, OAuth tokens issued include this user identity.</p> <div class="code-wrapper"><div class="button-copy-code-wrapper"><span class="button-copy-code-wrapper-title">kotlin</span><button class="button button-copy-code" tooltip="Copy to clipboard" flow="left"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24"><rect width="13" height="13" x="9" y="9" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button></div><div class="flex"><div class="flex flex-column code-line-numbers "><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span></div><div class="code-pre-wrapper"><pre class="prism-code language-kotlin" style="color:#d6deeb;background-color:#011627"><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token keyword" style="color:#ff79c6;font-style:normal">override</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">fun</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">post</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">requestModel</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> SuccessRequestModel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> response</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Response</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">:</span><span class="token plain"> Optional</span><span class="token operator" style="color:#ff79c6">&lt;</span><span class="token plain">AuthenticationResult</span><span class="token operator" style="color:#ff79c6">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">val</span><span class="token plain"> accountId </span><span class="token operator" style="color:#ff79c6">=</span><span class="token plain"> _config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">sessionManager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">get</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;accountId&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">?</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">attributeValue</span><span class="token operator" style="color:#ff79c6">?</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">value </span><span class="token keyword" style="color:#ff79c6;font-style:normal">as</span><span class="token plain"> String</span><span class="token operator" style="color:#ff79c6">?</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">?:</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">throw</span><span class="token plain"> _config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">exceptionFactory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">badRequestException</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> ErrorCode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">MISSING_PARAMETERS</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;The success form could not find the account ID field in the session&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> _config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">sessionManager</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">get</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;detailsVerified&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:#ff79c6">?</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">attributeValue</span><span class="token operator" style="color:#ff79c6">?</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">value </span><span class="token keyword" style="color:#ff79c6;font-style:normal">as</span><span class="token plain"> Boolean</span><span class="token operator" style="color:#ff79c6">?</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token operator" style="color:#ff79c6">?:</span><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">throw</span><span class="token plain"> _config</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">exceptionFactory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">badRequestException</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> ErrorCode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">MISSING_PARAMETERS</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token string-literal singleline string" style="color:rgb(173, 219, 103)">&quot;The success form could not find the detailsVerified field in the session&quot;</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"> </span><span class="token keyword" style="color:#ff79c6;font-style:normal">return</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">of</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token function" style="color:rgb(130, 170, 255)">AuthenticationResult</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">accountId</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb" data-line-style=""><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span></div></pre></div></div></div> <h2>Run the Example Plugin</h2> <p>You can clone the GitHub link at the top of this tutorial to run the example plugin on a development computer. The README document explains the prerequisites and commands to run, after which you can test the example plugin in both browser-based and native flows:</p> <ul> <li>To run the plugin in browser-based mode, use OAuth Tools as a client</li> <li>To run the plugin in native mode, use a HAAPI mobile code example as the client</li> </ul> <p>The GitHub repository also provides a development setup and an automated deployment. You can change the plugin code and redeploy to get fast feedback on your code changes. The deployment enables any mobile device or emulator to call the plugin&#x27;s endpoints via an <a class="ref ref-cross" href="/resources/learn/expose-local-curity-ngrok/"><i class="icon ion-android-list inlineicon"></i>ngrok internet URL<i class="icon ion-android-arrow-forward ml1"></i></a>. You can also use the <code>ngrok inspection</code> feature to capture HAAPI requests and responses:</p> <figure class="mx-auto block md-w-20"><img src="/images/resources/tutorials/writing-plugins/getting-started/inspected-request.jpg" alt="Inspected Request"/></figure> <h2>Additional Techniques</h2> <p>Once you understand the example plugin, there are a number of other behaviors that you can use. For example, you could use a composition-based approach to integrate features such as email or SMS verification. Or you can do more work to enrich frontend forms. Or you can integrate with external systems and use polling to wait for external operations to complete. To learn more, read the <a class="ref ref-cross" href="/resources/learn/authentication-plugin-techniques/"><i class="icon ion-android-list inlineicon"></i>Authentication Plugin Techniques<i class="icon ion-android-arrow-forward ml1"></i></a> tutorial.</p> <h2>Conclusion</h2> <p>This tutorial explained how you can integrate custom authentication when using the Curity Identity Server. Any developer should be able to learn the techniques by following the tutorials and examples. It may require some work to implement your preferred solution, but you have complete control, as well as a toolbox of SDK objects.</p> <p>By developing authentication in the authorization server you implement the responsibility in the correct place. Rather than adding complexity to your applications you produce a shareable component that can be reused across multiple clients. Once authentication completes, clients receive OAuth tokens correctly and can call their APIs.</p><div class="gradient-callout gradient-callout-light relative mt4"><div class="sm-flex flex-gap-2 bg-white p3 br-6"><div class="bg-light flex-50 p3"><h3 class="mt0">Join our Newsletter</h3><p><small>Get the latest on identity management, API Security and authentication straight to your inbox.</small></p><form class="newsletter mb2" method="post"><div class="mb2"><div class="sm-flex flex-gap-1"><div class="w100"><label for="newsletterSignupEmail-undefined " class="visuallyhidden">Email</label><input type="email" placeholder="Your Email" id="newsletterSignupEmail-undefined " name="user_email" class="required field w100" required=""/></div><button type="submit" name="subscribe" id="mc-embedded-subscribe-undefined " class="button button-primary button-small"><i class="icon ion-ios-paperplane inlineicon"></i>Subscribe</button></div></div><small class="bright"><label for="newsletterSignupConsent-undefined " class="label mt1 lg-mt0 flex flex-center"><input id="newsletterSignupConsent-undefined " name="newsletterSignupConsent" type="checkbox"/>I agree to Curity&#x27;s <a class="bright" href="/terms-of-service/" target="_blank">Privacy Policy</a></label></small><input type="hidden" name="listid" id="listid-undefined " value="348"/><div class="recaptcha"></div></form></div><div class="p3 center br-6 flex-50"><h3 class="mt0">Start Free Trial</h3><p><small>Try the Curity Identity Server for Free. Get up and running in 10 minutes.</small></p><a class="button button-primary button-tiny" href="https://developer.curity.io/free-trial/?utm_source=curity.io&amp;utm_medium=Link&amp;utm_content=Navigation">Start Free Trial</a></div></div></div><div class="resources-breadcrumbs"><div class="sm-flex justify-between w100"><div class="breadcrumbs p2 lg-show false false"><div class="lg-flex justify-between"><ol class="m0 p0" itemscope="" itemType="http://schema.org/BreadcrumbList"><li itemProp="itemListElement" itemscope="" itemType="http://schema.org/ListItem"><a itemProp="item" class="link-primary" itemType="https://schema.org/WebPage" itemID="/" href="/"><span itemProp="name">Home</span><meta itemProp="position" content="1"/></a></li><li itemProp="itemListElement" itemscope="" itemType="http://schema.org/ListItem"><a itemProp="item" class="link-primary" itemType="https://schema.org/WebPage" itemID="/resources" href="/resources/"><span itemProp="name">Resources</span><meta itemProp="position" content="2"/></a></li><li itemProp="itemListElement" itemscope="" itemType="http://schema.org/ListItem"><a aria-current="page" itemProp="item" class="link-primary" itemType="https://schema.org/WebPage" itemID="/resources/learn/getting-started-authentication-plugins/" href="/resources/learn/getting-started-authentication-plugins/"><span itemProp="name">Getting Started with Authentication Plugins</span><meta itemProp="position" content="3"/></a></li></ol></div></div></div><section class="was-this-helpful p2 relative mt2 mb2 false "><div class="was-this-helpful-initial-ui mx-auto block"><div class="hs_feedback_buttons flex justify-center flex-column"><p>Was this helpful?</p><ul class="input list-reset flex flex-gap-1"><li><label for="was-this-helpful-initial-ui-yes"><input type="radio" id="was-this-helpful-initial-ui-yes" class="visuallyhidden"/></label></li><li><label for="was-this-helpful-initial-ui-no"><input type="text" id="was-this-helpful-initial-ui-no"/><input type="radio" id="was-this-helpful-initial-ui-no" class="visuallyhidden"/></label><input type="text" id="was-this-helpful-initial-ui-no"/></li></ul></div></div></section></div></article></div></div></div><aside class="article-toc"><div class="article-toc-wrapper"><div class="article-toc-panel"><nav class="article-toc-links" role="navigation"><span class="mt2 mb2 block h5">On This Page</span><ol class="m0"></ol></nav><nav class="mt2 py2" role="navigation"><span class="mt2 mb2 block h5">Related Articles</span><ol class="m0"><li data-area="tutorials"><a href="/resources/learn/codeexamples-username-password-authenticator/">Username Password Authenticator</a></li><li data-area="tutorials"><a href="/resources/learn/authentication-overview/">Authentication Overview</a></li><li data-area="tutorials"><a href="/resources/learn/authentication-plugin-techniques/">Authentication Plugin Techniques</a></li><li data-area="tutorials"><a href="/resources/learn/getting-started-plugins/">OAuth Customization using Plugins</a></li></ol></nav></div></div></aside></section></main><section class="section bg-line-pattern bg-line-pattern-dark bg-line-pattern-magenta section-xxl" style="background-position:20% 45%;background-size:40%" id="starttoday"><div class="container container-wide"><div class="sm-flex justify-between flex-center"><div class="flex-40"><p class="preheader uppercasecaps">Next steps</p><h2 class="white">Ready to modernize IAM?</h2><p class="white">Start Today - Build security and improve ease of use to stay ahead of the competition.</p></div><div class="flex-50"><div class="grid-container" columns="1" sm-columns="2" gap="2"><a href="https://developer.curity.io/free-trial/?utm_source=curity.io&amp;utm_medium=Link&amp;utm_content=Start" class="card card-dark card-dark p3 center" style="background-position:90% 15%;background-size:90%"><img src="/images/start/free-trial.svg" class="md-w-4 md-h-4 mx-auto block" alt="Free trial icon representing Start a free trial" loading="lazy" width="82" height="82"/><p class="white m0">Start a Free Trial</p></a><a class="card card-dark card-dark p3 center" style="background-position:90% 15%;background-size:90%" href="/schedule-a-demo/"><img src="/images/start/demo.svg" class="md-w-4 md-h-4 mx-auto block" alt="Calendar icon representing Schedule a demo" loading="lazy" width="82" height="82"/><p class="white m0">Schedule a demo</p></a><a class="card card-dark card-dark p3 center" style="background-position:90% 15%;background-size:90%" href="/contact/?cta=tech"><img src="/images/start/expert.svg" class="md-w-4 md-h-4 mx-auto block" alt="User with a computer icon representing Speak to an Identity Specialist" loading="lazy" width="82" height="82"/><p class="white m0">Speak to an Identity Specialist</p></a><a class="card card-dark card-dark p3 center" style="background-position:90% 15%;background-size:90%" href="/resources/"><img src="/images/start/resources.svg" class="md-w-4 md-h-4 mx-auto block" alt="Book icon representing Explore learning resources" loading="lazy" width="82" height="82"/><p class="white m0">Explore learning resources</p></a></div></div></div></div></section></main><footer class="footer bg-line-pattern bg-line-pattern-primary"><div class="footer-lines"></div><div class="container container-wide"><div class="footer-container mt3"><div><img class="footer-logo mt2 mb2" src="data:image/svg+xml;base64,PHN2ZyBkYXRhLW5hbWU9IkxheWVyIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDE4Mi41NyAzNi4zMyI+PHBhdGggZD0ibTUzLjA2IDI2Ljc5LS41Ni41N2ExNS45MyAxNS45MyAwIDAgMS0xMC45MyA1IDEwIDEwIDAgMCAxLTEwLjM0LTEwLjRjMC02IDQuMjQtMTAuMzkgMTAuMDktMTAuMzlhMTYuNjcgMTYuNjcgMCAwIDEgMTAuMjIgNGwuNTYuNDkgNS42MS01Ljg2LS42My0uNTRhMjUuNzggMjUuNzggMCAwIDAtMTYuMzYtNS45MSAxOC40NCAxOC40NCAwIDAgMC0xNS4zNyA3LjY4SDE1bC0uNiA1LjA5aDguNWExNy45IDE3LjkgMCAwIDAtLjU5IDIuODZIOS42MUw5IDI0LjQ2aDEzLjMxYTE4LjU2IDE4LjU2IDAgMCAwIC41NyAyLjg2SDMuNzdsLS42MSA1LjA5SDI1LjNjMy4yOSA0Ljc0IDguOSA3LjY4IDE1LjY3IDcuNjhhMjUuNDEgMjUuNDEgMCAwIDAgMTcuMTktNi45M2wuNTktLjU2WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTMuMTYgLTMuNzUpIiBzdHlsZT0iZmlsbDojZmZmIi8+PHBhdGggc3R5bGU9ImZpbGw6I2ZmZiIgZD0iTTUuMDEgMTUuNjJIMS4yNmwtLjYgNS4wOUg0LjRsLjYxLTUuMDl6Ii8+PHBhdGggZD0iTTg4IDI2LjE0YTEzLjMxIDEzLjMxIDAgMCAxLTkuMDYgMy42NmMtNS45MiAwLTkuODItNC4yMy05LjgyLTkuNDdhOS4zNiA5LjM2IDAgMCAxIDkuNjgtOS40NEExMy42NiAxMy42NiAwIDAgMSA4Ny40MSAxNEw4NSAxNi41NmE5LjU1IDkuNTUgMCAwIDAtNS44NC0yLjI5IDUuODIgNS44MiAwIDAgMC01LjkyIDYuMDkgNS44NyA1Ljg3IDAgMCAwIDYuMDYgNi4wOCA5LjE5IDkuMTkgMCAwIDAgNi4yNS0yLjgzWk0xMDcuNDQgMTEuNDN2MTEuNDFjMCA0LjQ1LTMuNDQgNy04LjE2IDdzLTguMTEtMi41MS04LjExLTdWMTEuNDNoMy45M3YxMS40MWMwIDIuMzUgMS44OCAzLjYgNC4xOCAzLjZzNC4yMy0xLjI1IDQuMjMtMy42VjExLjQzWk0xMTIuNzMgMjkuMjVWMTEuNDNoOS44OGE3IDcgMCAwIDEgNS4zOSAxLjk0IDUuMzYgNS4zNiAwIDAgMSAxLjQ3IDMuNjkgNS40NyA1LjQ3IDAgMCAxLTMuNiA1bDQuMTMgNy4xOWgtNC40N2wtMy42LTYuNTVoLTUuM3Y2LjU1Wm0zLjktMTQuNTF2NC42NkgxMjNhMi4zOCAyLjM4IDAgMCAwIDIuNDgtMi4zNCAyLjE3IDIuMTcgMCAwIDAtLjYzLTEuNTYgMi42NiAyLjY2IDAgMCAwLTIuMTMtLjc2Wk0xMzQgMjkuMjVWMTEuNDNoMy45MXYxNy44MlpNMTQxLjQ0IDExLjQzaDE2LjgxdjMuMzloLTYuNDR2MTQuNDNoLTMuOTFWMTQuODJoLTYuNDZaTTE3Ny4xMyAxMS40M2wtNy4wNyA5LjY5djguMTNoLTMuOTN2LTguMTNMMTU5IDExLjQzaDQuODVsNC4zNCA2LjIgNC4zMi02LjJaTTE3OC4wNyAxMS4wOGE0IDQgMCAwIDEgMS4xMi0yLjg2IDMuNzQgMy43NCAwIDAgMSA1LjQzIDAgNCA0IDAgMCAxIDEuMTEgMi44NiA0IDQgMCAwIDEtMS4xMiAyLjkyIDMuNzIgMy43MiAwIDAgMS01LjQyIDAgNCA0IDAgMCAxLTEuMTItMi45MlptLjY1IDBhMy4zOSAzLjM5IDAgMCAwIC45MyAyLjQyIDMgMyAwIDAgMCAyLjI2IDEgMyAzIDAgMCAwIDIuMjQtMSAzLjM3IDMuMzcgMCAwIDAgLjkzLTIuNDEgMy4zNCAzLjM0IDAgMCAwLS45My0yLjQgMyAzIDAgMCAwLTIuMjQtMSAzIDMgMCAwIDAtMi4yNiAxIDMuMzQgMy4zNCAwIDAgMC0uOTMgMi4zOVptMi40LjQxdjEuODJoLS44VjguNzJoMS41MWEyLjA2IDIuMDYgMCAwIDEgMS4yOS4zNiAxLjIxIDEuMjEgMCAwIDEgLjQ2IDEgMSAxIDAgMCAxLS4xNy41OSAxLjM4IDEuMzggMCAwIDEtLjUyLjQyIDEgMSAwIDAgMSAuNTEuNDMgMS4zNSAxLjM1IDAgMCAxIC4xNi42OXYuN2EuNzcuNzcgMCAwIDAgLjA4LjI5di4wOGgtLjgzYTEuMDggMS4wOCAwIDAgMS0uMDYtLjMzdi0uNzRhLjguOCAwIDAgMC0uMTgtLjU3LjgzLjgzIDAgMCAwLS42LS4xOFptMC0uN2guODJhMS4xMiAxLjEyIDAgMCAwIC42LS4xOC41NS41NSAwIDAgMCAuMjUtLjQ3LjY4LjY4IDAgMCAwLS4yMi0uNTYgMS4zNCAxLjM0IDAgMCAwLS43NC0uMTVoLS43MVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zLjE2IC0zLjc1KSIgc3R5bGU9ImZpbGw6I2ZmZiIvPjwvc3ZnPgo=" alt="Curity logo" width="124" height="36"/><p><a class="block" itemProp="email" href="mailto:info@curity.io">info@curity.io</a></p><p class="mt2"><a aria-label="Get in Touch" class="button button-medium button-primary" href="/contact/">Get in touch</a></p><ul class="footer-social list-reset m0 mt2"><li><a target="_blank" rel="noopener noreferrer" aria-label="Follow Curity on X" tooltip="Follow Curity on X" href="https://x.com/curityio"><img src="/images/footer/social-x.svg" alt="X icon" loading="lazy" decoding="async" width="40" height="40"/></a></li><li><a target="_blank" rel="noopener noreferrer" aria-label="Follow Curity on LinkedIn" tooltip="Follow Curity on LinkedIn" href="https://www.linkedin.com/company/curity/"><img src="/images/footer/social-linkedin.svg" alt="LinkedIn icon" loading="lazy" decoding="async" width="40" height="40"/></a></li><li><a target="_blank" rel="noopener noreferrer" aria-label="Follow Curity on YouTube" tooltip="Follow Curity on YouTube" href="https://www.youtube.com/c/Curity"><img src="/images/footer/social-youtube.svg" alt="YouTube icon" loading="lazy" decoding="async" width="40" height="40"/></a></li><li><a target="_blank" rel="noopener noreferrer" aria-label="Follow Curity on Bluesky" tooltip="Follow Curity on Bluesky" href="https://bsky.app/profile/curity.bsky.social"><img src="/images/footer/social-bsky.svg" alt="Bluesky icon" loading="lazy" decoding="async" width="40" height="40"/></a></li><li><a target="_blank" rel="noopener noreferrer" aria-label="Follow Curity on GitHub" tooltip="Follow Curity on GitHub" href="https://github.com/curityio"><img src="/images/footer/social-github.svg" alt="GitHub icon" loading="lazy" decoding="async" width="40" height="40"/></a></li><li><a aria-label="Subscribe to Curity&#x27;s RSS Feeds" tooltip="Subscribe to Curity&#x27;s RSS Feeds" href="/feeds/"><img src="/images/footer/social-rss.svg" alt="Subscribe to Curity&#x27;s RSS Feeds icon" loading="lazy" decoding="async" width="40" height="40"/></a></li><li><a target="_blank" rel="noopener noreferrer" aria-label="Follow Curity on Medium" tooltip="Follow Curity on Medium" href="https://curity.medium.com/"><img src="/images/footer/social-medium.svg" alt="Medium icon" loading="lazy" decoding="async" width="40" height="40"/></a></li><li><a target="_blank" rel="noopener noreferrer" aria-label="Follow Curity on Nordic APIs" tooltip="Follow Curity on Nordic APIs" href="https://nordicapis.com/blog/?company=curity"><img src="/images/footer/social-nordicapis.svg" alt="Nordic APIs icon" loading="lazy" decoding="async" width="40" height="40"/></a></li></ul><a class="flex flex-center flex-gap-1 mt2" href="/newsletter/"><i class="icon ion-email white h3"></i>Sign up for API Security Insights.</a><p><small>© Curity AB<!-- --> <a aria-label="Terms Of Service" href="/terms-of-service/">Terms of Service</a></small></p></div><div><h3 class="mb2">Product</h3><ul class="list-reset m0"><li><a href="/product/">Product Overview</a></li><li><a href="/product/authentication-service/">Authentication Service</a></li><li><a href="/product/token-service/">Token Service</a></li><li><a href="/product/user-management-service/">User Management Service</a></li><li><a href="/product/token-handler/">Curity Token Handler</a></li><li><a href="/product/authentication/">Authentication</a></li><li><a href="/product/secure-access/">Secure Acccess</a></li><li><a href="/product/user-journey-orchestration/">User Journey Orchestration</a></li><li><a href="/product/decentralized-identity/">Decentralized Identity</a></li><li><a href="/product/extensibility-and-sdks/">Extensibility and SDK:s</a></li><li><a href="/product/identity-standards/">Identity Standards</a></li><li><a href="/product/community/">Community Edition</a></li><li><a href="/product/plans/">Product Plans</a></li><li><a href="/faq/">FAQ</a></li><li><a href="/support/">Support</a></li><li><a href="/product/deployment/">Deployment</a></li><li><a href="/product/devops-and-secops/">DevOps and Secops</a></li></ul></div><div><h3 class="mb2">Solutions</h3><ul class="list-reset m0"><li><a href="/solutions/common-identity-platform/">Common Identity Platform</a></li><li><a href="/solutions/modernizing-infrastructure/">Modernizing Infrastructure</a></li><li><a href="/solutions/open-banking-and-fapi/">Open Banking &amp; Financial-Grade APIs</a></li><li><a href="/solutions/frictionless-authentication/">Secure Frictionless Authentication</a></li><li><a href="/solutions/zero-trust/">Zero Trust and Security Architecture</a></li><li><a href="/solutions/secure-financial-services/">Financial Services</a></li><li><a href="/solutions/identity-for-government-solutions/">Government</a></li><li><a href="/solutions/protecting-health-care/">Healthcare</a></li><li><a href="/solutions/tech-and-saas-security/">Technology / SaaS</a></li><li><a href="/solutions/protecting-telecom-services/">Telecom</a></li></ul></div><div><h3 class="mb2">Resources</h3><ul class="list-reset m0"><li><a href="/resources/">Resource Library</a></li><li><a href="/resources/whats-new/">What&#x27;s New</a></li><li><a href="/resources/articles/">Articles</a></li><li><a href="/resources/getting-started/">Getting Started</a></li><li><a href="/resources/how-tos/">How-tos</a></li><li><a href="/resources/code-examples/">Code Examples</a></li><li><a href="/resources/webinars/">Webinars</a></li><li><a href="/resources/documents/">Whitepapers</a></li><li><a href="/resources/documents/">Documents</a></li><li><a href="/resources/videos/">Videos</a></li><li><a href="/resources/courses/">Courses</a></li><li><a href="/oauth-tools/">OAuth Tools</a></li></ul></div><div><h3 class="mb2">Company</h3><ul class="list-reset m0"><li><a href="/company/">About</a></li><li><a href="/company/customers/">Customers</a></li><li><a href="/company/partners/">Partners</a></li><li><a href="/blog/">Blog</a></li><li><a href="/company/careers/">Careers</a></li><li><a href="/company/events/">Events Calendar</a></li><li><a href="/company/esg/">ESG</a></li><li><a href="/news/">News</a></li><li><a href="/investors/">Investor Relations</a></li></ul></div></div><div class="flex flex-gap-3 flex-center flex-wrap"><a class="block" target="_blank" rel="noopener noreferrer" href="https://securityscorecard.com/security-rating/curity.io?utm_medium=badge&amp;utm_source=curity.io&amp;utm_campaign=seal-of-trust&amp;utm_content=https://platform.securityscorecard.io/"><img src="/images/footer/security-scorecard.svg" alt="Security ScoreCard" class="md-w-14" width="292" height="92" loading="lazy"/></a><a href="/product/identity-standards/conformance/#soc2"><img class="block md-w-4" src="/images/conformance/soc.webp" alt="SOC 2 Type 1 Compliance" width="100" height="100" loading="lazy"/></a><div><a href="https://observatory.mozilla.org/analyze/curity.io" target="_blank" rel="noopener noreferrer"><svg xmlns="http://www.w3.org/2000/svg" width="162" height="20" aria-label="observatory: A+ (100/100)"><title>observatory: A+ (100/100)</title><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity="0.1"></stop><stop offset="1" stop-opacity="0.1"></stop></linearGradient><clipPath id="a"><rect width="162" height="20" fill="#fff" rx="3"></rect></clipPath><g clip-path="url(#a)"><path fill="#555" d="M0 0h75v20H0z"></path><path fill="#4c1" d="M75 0h87v20H75z"></path><path fill="url(#b)" d="M0 0h162v20H0z"></path></g><g fill="#fff" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" font-size="110" text-anchor="middle" text-rendering="geometricPrecision"><text x="385" y="150" fill="#010101" fill-opacity="0.3" aria-hidden="true" textLength="650" transform="scale(.1)">observatory</text><text x="385" y="140" textLength="650" transform="scale(.1)">observatory</text><text x="1175" y="150" fill="#010101" fill-opacity="0.3" aria-hidden="true" textLength="770" transform="scale(.1)">A+ (100/100)</text><text x="1175" y="140" textLength="770" transform="scale(.1)">A+ (100/100)</text></g></svg></a></div><div><a href="https://www.ssllabs.com/ssltest/analyze?d=curity.io" target="_blank" rel="noopener noreferrer"><svg xmlns="http://www.w3.org/2000/svg" width="58" height="20" aria-label="SSL: A+"><title>SSL: A+</title><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity="0.1"></stop><stop offset="1" stop-opacity="0.1"></stop></linearGradient><clipPath id="a"><rect width="58" height="20" fill="#fff" rx="3"></rect></clipPath><g clip-path="url(#a)"><path fill="#555" d="M0 0h31v20H0z"></path><path fill="#4c1" d="M31 0h27v20H31z"></path><path fill="url(#b)" d="M0 0h58v20H0z"></path></g><g fill="#fff" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" font-size="110" text-anchor="middle" text-rendering="geometricPrecision"><text x="165" y="150" fill="#010101" fill-opacity="0.3" aria-hidden="true" textLength="210" transform="scale(.1)"> SSL </text><text x="165" y="140" textLength="210" transform="scale(.1)"> SSL </text><text x="435" y="150" fill="#010101" fill-opacity="0.3" aria-hidden="true" textLength="170" transform="scale(.1)"> A+ </text><text x="435" y="140" textLength="170" transform="scale(.1)"> A+ </text></g></svg></a></div></div></div></footer></div><div id="gatsby-announcer" style="position:absolute;top:0;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0" aria-live="assertive" aria-atomic="true"></div></div><script nonce="5e78246357cfbb1bc118c84245311b69" async="" src="https://www.googletagmanager.com/gtag/js?id=G-389DDQHZJC"></script><script nonce="5e78246357cfbb1bc118c84245311b69"> window.excludeGtagPaths=[/^(?:\/preview\/(?:(?!(?:\/|^)\.).)*?)$/,/^(?:\/resources\/webinars\/thank\-you\/)$/,/^(?:\/contact\/thank\-you\/)$/,/^(?:\/callback\/(?:(?!(?:\/|^)\.).)*?)$/,/^(?:\/frontchannel\-logout\/(?:(?!(?:\/|^)\.).)*?)$/]; function gaOptout(){document.cookie=disableStr+'=true; expires=Thu, 31 Dec 2099 23:59:59 UTC;path=/',window[disableStr]=!0}var gaProperty='G-389DDQHZJC',disableStr='ga-disable-'+gaProperty;document.cookie.indexOf(disableStr+'=true')>-1&&(window[disableStr]=!0); if(!(navigator.doNotTrack == "1" || window.doNotTrack == "1")) { window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-389DDQHZJC', {"anonymize_ip":true,"cookie_expires":0,"allow_enhanced_conversions":true,"send_page_view":false});gtag('config', 'AW-835310060', {"anonymize_ip":true,"cookie_expires":0,"allow_enhanced_conversions":true,"send_page_view":false}); } </script><script nonce="5e78246357cfbb1bc118c84245311b69" id="gatsby-script-loader">/*<![CDATA[*/window.pagePath="/resources/learn/getting-started-authentication-plugins/";/*]]>*/</script><!-- slice-start id="_gatsby-scripts-1" --> <script nonce="5e78246357cfbb1bc118c84245311b69" id="gatsby-chunk-mapping" > window.___chunkMapping="{\"app\":[\"/app-6cd5d01753c74c4ca40b.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-dfafab635c69876c3091.js\"],\"component---src-pages-api-security-mdx\":[\"/component---src-pages-api-security-mdx-1d25a6d5066cd3f96c95.js\"],\"component---src-pages-api-world-js\":[\"/component---src-pages-api-world-js-f205e21c7b768d924fef.js\"],\"component---src-pages-authentication-service-mdx\":[\"/component---src-pages-authentication-service-mdx-6f3d28aab5e7d39995a2.js\"],\"component---src-pages-blog-authors-js\":[\"/component---src-pages-blog-authors-js-c0145416c637cc7047b4.js\"],\"component---src-pages-blog-tags-js\":[\"/component---src-pages-blog-tags-js-3c42ab9b6d893c20678a.js\"],\"component---src-pages-ciam-for-digital-banking-mdx\":[\"/component---src-pages-ciam-for-digital-banking-mdx-cc325ac5daf0a97b4078.js\"],\"component---src-pages-ciam-for-fintech-mdx\":[\"/component---src-pages-ciam-for-fintech-mdx-6ec8a5367c055b494411.js\"],\"component---src-pages-company-careers-how-we-hire-js\":[\"/component---src-pages-company-careers-how-we-hire-js-da3444e9c95426b07269.js\"],\"component---src-pages-company-careers-js\":[\"/component---src-pages-company-careers-js-666b45a4767648ea7162.js\"],\"component---src-pages-company-careers-thank-you-js\":[\"/component---src-pages-company-careers-thank-you-js-965d4673960cdbe10c03.js\"],\"component---src-pages-company-careers-who-we-are-js\":[\"/component---src-pages-company-careers-who-we-are-js-30338baf81837af28710.js\"],\"component---src-pages-company-careers-working-at-curity-js\":[\"/component---src-pages-company-careers-working-at-curity-js-90eec85967a49c3232ff.js\"],\"component---src-pages-company-customers-js\":[\"/component---src-pages-company-customers-js-e58b0873f69d2d8d92b8.js\"],\"component---src-pages-company-esg-environmental-js\":[\"/component---src-pages-company-esg-environmental-js-ddaa45a3ff9f2aec95c8.js\"],\"component---src-pages-company-esg-governance-js\":[\"/component---src-pages-company-esg-governance-js-bd25c53148c11e26eaf2.js\"],\"component---src-pages-company-esg-js\":[\"/component---src-pages-company-esg-js-50f61a61d5b746de4492.js\"],\"component---src-pages-company-esg-social-js\":[\"/component---src-pages-company-esg-social-js-2c5daacc58b9ba7bc8da.js\"],\"component---src-pages-company-events-js\":[\"/component---src-pages-company-events-js-efceef20aaa4f21f595d.js\"],\"component---src-pages-company-mdx\":[\"/component---src-pages-company-mdx-22dd25a077856e6a2a0a.js\"],\"component---src-pages-company-partners-become-a-partner-js\":[\"/component---src-pages-company-partners-become-a-partner-js-0b9d8a304d6d10521b98.js\"],\"component---src-pages-company-partners-js\":[\"/component---src-pages-company-partners-js-72dc575e1527e01f6a62.js\"],\"component---src-pages-contact-js\":[\"/component---src-pages-contact-js-95bfe7738f6b8269512a.js\"],\"component---src-pages-contact-thank-you-js\":[\"/component---src-pages-contact-thank-you-js-e722285601e048024cc9.js\"],\"component---src-pages-curity-axiomatics-london-meetup-thank-you-js\":[\"/component---src-pages-curity-axiomatics-london-meetup-thank-you-js-e86595add2780f0c99aa.js\"],\"component---src-pages-curity-security-breakfast-brussels-thank-you-js\":[\"/component---src-pages-curity-security-breakfast-brussels-thank-you-js-d7a92e85ae19998271b0.js\"],\"component---src-pages-curity-security-breakfast-copenhagen-thank-you-js\":[\"/component---src-pages-curity-security-breakfast-copenhagen-thank-you-js-f68f39bae2c1417235cb.js\"],\"component---src-pages-docs-js\":[\"/component---src-pages-docs-js-5b098ec6b2a3887bcafd.js\"],\"component---src-pages-faq-js\":[\"/component---src-pages-faq-js-d66db1bdf49507f323db.js\"],\"component---src-pages-feeds-mdx\":[\"/component---src-pages-feeds-mdx-23e63cd4f874eae9bc51.js\"],\"component---src-pages-gartner-iam-js\":[\"/component---src-pages-gartner-iam-js-bb304c53561f82a406b0.js\"],\"component---src-pages-gartner-iam-us-js\":[\"/component---src-pages-gartner-iam-us-js-049171ca0030460d1007.js\"],\"component---src-pages-gartner-iam-us-thank-you-js\":[\"/component---src-pages-gartner-iam-us-thank-you-js-d93f91dbe7889a5231a2.js\"],\"component---src-pages-gartner-marketing-mdx\":[\"/component---src-pages-gartner-marketing-mdx-76ede4c7b6a355f0ab15.js\"],\"component---src-pages-identiverse-js\":[\"/component---src-pages-identiverse-js-af16b264bb15d569ba22.js\"],\"component---src-pages-idp-mdx\":[\"/component---src-pages-idp-mdx-bae5f4529f7a294567df.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-6bf1c0207adb617a62ab.js\"],\"component---src-pages-investors-mdx\":[\"/component---src-pages-investors-mdx-e90eb8907f6264a02a7b.js\"],\"component---src-pages-legal-call-off-js\":[\"/component---src-pages-legal-call-off-js-41c4dfcf583f86b11bdb.js\"],\"component---src-pages-legal-js\":[\"/component---src-pages-legal-js-01c5b972b0ffcf407b4d.js\"],\"component---src-pages-legal-license-agreement-js\":[\"/component---src-pages-legal-license-agreement-js-e88252fa222a6dff2801.js\"],\"component---src-pages-legal-license-agreement-pre-2024-03-25-js\":[\"/component---src-pages-legal-license-agreement-pre-2024-03-25-js-f2eda6fa23b88a7d6412.js\"],\"component---src-pages-legal-support-terms-js\":[\"/component---src-pages-legal-support-terms-js-7118769cf45ea6f57d99.js\"],\"component---src-pages-newsletter-mdx\":[\"/component---src-pages-newsletter-mdx-80ad18ba2ac721dec1f4.js\"],\"component---src-pages-oauth-tools-mdx\":[\"/component---src-pages-oauth-tools-mdx-8a7128122c0f2da227e9.js\"],\"component---src-pages-open-banking-brazil-js\":[\"/component---src-pages-open-banking-brazil-js-f7687aa4b0b4089dd5b4.js\"],\"component---src-pages-open-banking-uk-js\":[\"/component---src-pages-open-banking-uk-js-66bd56f5780554080329.js\"],\"component---src-pages-open-banking-us-mdx\":[\"/component---src-pages-open-banking-us-mdx-fcf4a9e66c57e67b7627.js\"],\"component---src-pages-passkeys-mdx\":[\"/component---src-pages-passkeys-mdx-33cc9dac20131175054d.js\"],\"component---src-pages-prizedraw-js\":[\"/component---src-pages-prizedraw-js-a3a17c65c9159229bcee.js\"],\"component---src-pages-product-authentication-advanced-authentication-mdx\":[\"/component---src-pages-product-authentication-advanced-authentication-mdx-821be794bfc6457f1207.js\"],\"component---src-pages-product-authentication-mdx\":[\"/component---src-pages-product-authentication-mdx-77693a49a89084fc4327.js\"],\"component---src-pages-product-authentication-passwordless-authentication-mdx\":[\"/component---src-pages-product-authentication-passwordless-authentication-mdx-4d63711d5e24206f4203.js\"],\"component---src-pages-product-authentication-service-mdx\":[\"/component---src-pages-product-authentication-service-mdx-0bd03abf4f861976d031.js\"],\"component---src-pages-product-authentication-service-ways-to-authenticate-mdx\":[\"/component---src-pages-product-authentication-service-ways-to-authenticate-mdx-f9c383fd1f9f7e56ba44.js\"],\"component---src-pages-product-authentication-sso-mfa-and-social-logins-mdx\":[\"/component---src-pages-product-authentication-sso-mfa-and-social-logins-mdx-2b684938ec46e08b9ce1.js\"],\"component---src-pages-product-community-mdx\":[\"/component---src-pages-product-community-mdx-82c221fde2ed4382945c.js\"],\"component---src-pages-product-decentralized-identity-mdx\":[\"/component---src-pages-product-decentralized-identity-mdx-0a1e9340a93db44ef8d7.js\"],\"component---src-pages-product-decentralized-identity-verifiable-credentials-mdx\":[\"/component---src-pages-product-decentralized-identity-verifiable-credentials-mdx-7b127515332b3cd97c87.js\"],\"component---src-pages-product-decentralized-identity-wallet-mdx\":[\"/component---src-pages-product-decentralized-identity-wallet-mdx-aae2fa0cf0fbd1e13c48.js\"],\"component---src-pages-product-deployment-mdx\":[\"/component---src-pages-product-deployment-mdx-c554fc9b7c32bb1b6d50.js\"],\"component---src-pages-product-deployment-multi-region-mdx\":[\"/component---src-pages-product-deployment-multi-region-mdx-3db5f90c159c8868311d.js\"],\"component---src-pages-product-deployment-multi-tenancy-mdx\":[\"/component---src-pages-product-deployment-multi-tenancy-mdx-fa26ce13b0b4214b3b52.js\"],\"component---src-pages-product-devops-and-secops-alarms-mdx\":[\"/component---src-pages-product-devops-and-secops-alarms-mdx-55c899f762c0353a8fbd.js\"],\"component---src-pages-product-devops-and-secops-alarms-pagerduty-alarm-handling-mdx\":[\"/component---src-pages-product-devops-and-secops-alarms-pagerduty-alarm-handling-mdx-1a6f61c3db110acd2ac7.js\"],\"component---src-pages-product-devops-and-secops-configuration-mdx\":[\"/component---src-pages-product-devops-and-secops-configuration-mdx-707746e5cb3985949f11.js\"],\"component---src-pages-product-devops-and-secops-devops-dashboard-mdx\":[\"/component---src-pages-product-devops-and-secops-devops-dashboard-mdx-e138250d15ea8250dd8d.js\"],\"component---src-pages-product-devops-and-secops-mdx\":[\"/component---src-pages-product-devops-and-secops-mdx-9da4be274d08925f0c3e.js\"],\"component---src-pages-product-devops-and-secops-monitoring-and-metrics-mdx\":[\"/component---src-pages-product-devops-and-secops-monitoring-and-metrics-mdx-f4cbb8fae1922bb7aab6.js\"],\"component---src-pages-product-extensibility-and-sdks-mdx\":[\"/component---src-pages-product-extensibility-and-sdks-mdx-0cd9e53c7b2f93e7bc65.js\"],\"component---src-pages-product-financial-grade-package-mdx\":[\"/component---src-pages-product-financial-grade-package-mdx-0f3599fde6fba95488c7.js\"],\"component---src-pages-product-identity-standards-conformance-mdx\":[\"/component---src-pages-product-identity-standards-conformance-mdx-31948722d1a03aa73733.js\"],\"component---src-pages-product-identity-standards-mdx\":[\"/component---src-pages-product-identity-standards-mdx-113b68bb9ee14ed45af1.js\"],\"component---src-pages-product-mdx\":[\"/component---src-pages-product-mdx-7a9c09f19917f2cc84c8.js\"],\"component---src-pages-product-plans-mdx\":[\"/component---src-pages-product-plans-mdx-263eafe50d9ed36f7778.js\"],\"component---src-pages-product-secure-access-api-access-control-mdx\":[\"/component---src-pages-product-secure-access-api-access-control-mdx-8322c223f3c85e1158f5.js\"],\"component---src-pages-product-secure-access-customer-iam-mdx\":[\"/component---src-pages-product-secure-access-customer-iam-mdx-3408ad1ff5ef1b2b6f65.js\"],\"component---src-pages-product-secure-access-high-grade-api-security-mdx\":[\"/component---src-pages-product-secure-access-high-grade-api-security-mdx-6e592dae7a160033a85c.js\"],\"component---src-pages-product-secure-access-mdx\":[\"/component---src-pages-product-secure-access-mdx-fada989a07c9bc60fe9d.js\"],\"component---src-pages-product-secure-access-spa-security-mdx\":[\"/component---src-pages-product-secure-access-spa-security-mdx-bf400485fda97a6444ca.js\"],\"component---src-pages-product-token-handler-mdx\":[\"/component---src-pages-product-token-handler-mdx-394c0abd7aece2569a75.js\"],\"component---src-pages-product-token-service-mdx\":[\"/component---src-pages-product-token-service-mdx-2afc8c3d094ba40c19f2.js\"],\"component---src-pages-product-user-journey-orchestration-actions-mdx\":[\"/component---src-pages-product-user-journey-orchestration-actions-mdx-437ae21bdef7792cdc8a.js\"],\"component---src-pages-product-user-journey-orchestration-adaptive-authentication-mdx\":[\"/component---src-pages-product-user-journey-orchestration-adaptive-authentication-mdx-299b748314efd9f8c040.js\"],\"component---src-pages-product-user-journey-orchestration-branding-and-ux-mdx\":[\"/component---src-pages-product-user-journey-orchestration-branding-and-ux-mdx-0f1913a7e10cf92195e4.js\"],\"component---src-pages-product-user-journey-orchestration-browserless-login-mdx\":[\"/component---src-pages-product-user-journey-orchestration-browserless-login-mdx-7d538bd81ff5340a1f8e.js\"],\"component---src-pages-product-user-journey-orchestration-mdx\":[\"/component---src-pages-product-user-journey-orchestration-mdx-64319261b72219085035.js\"],\"component---src-pages-product-user-management-service-databases-mdx\":[\"/component---src-pages-product-user-management-service-databases-mdx-51843b69d5d65a6f60df.js\"],\"component---src-pages-product-user-management-service-mdx\":[\"/component---src-pages-product-user-management-service-mdx-c6ffd7a77e5ee638c908.js\"],\"component---src-pages-resources-articles-mdx\":[\"/component---src-pages-resources-articles-mdx-3bafab266e2f46afa9f0.js\"],\"component---src-pages-resources-code-examples-mdx\":[\"/component---src-pages-resources-code-examples-mdx-3217beb075cbca9d9ee9.js\"],\"component---src-pages-resources-code-examples-status-js\":[\"/component---src-pages-resources-code-examples-status-js-9d80d207906ab623a15f.js\"],\"component---src-pages-resources-courses-api-security-and-authorization-js\":[\"/component---src-pages-resources-courses-api-security-and-authorization-js-df1013724d636b471da8.js\"],\"component---src-pages-resources-courses-building-an-identity-architecture-js\":[\"/component---src-pages-resources-courses-building-an-identity-architecture-js-4cd06d751a6cb2afa8fb.js\"],\"component---src-pages-resources-courses-deploying-the-curity-identity-server-js\":[\"/component---src-pages-resources-courses-deploying-the-curity-identity-server-js-667f8b698bc9b3b5f323.js\"],\"component---src-pages-resources-courses-getting-started-with-oauth-and-openid-connect-js\":[\"/component---src-pages-resources-courses-getting-started-with-oauth-and-openid-connect-js-b6451ba687760f00d54c.js\"],\"component---src-pages-resources-courses-js\":[\"/component---src-pages-resources-courses-js-747b0b0726872c9fc901.js\"],\"component---src-pages-resources-courses-jwt-best-practice-js\":[\"/component---src-pages-resources-courses-jwt-best-practice-js-3b1c95373ad0b6be2f84.js\"],\"component---src-pages-resources-courses-openid-connect-in-detail-js\":[\"/component---src-pages-resources-courses-openid-connect-in-detail-js-8200fb17178e46751130.js\"],\"component---src-pages-resources-documents-js\":[\"/component---src-pages-resources-documents-js-4d600a5f145025cc1a8f.js\"],\"component---src-pages-resources-getting-started-mdx\":[\"/component---src-pages-resources-getting-started-mdx-8ffb5874073e28b6c4cf.js\"],\"component---src-pages-resources-guides-mdx\":[\"/component---src-pages-resources-guides-mdx-2e63984230a30ee3c0eb.js\"],\"component---src-pages-resources-how-tos-mdx\":[\"/component---src-pages-resources-how-tos-mdx-8ab076d0978def771a86.js\"],\"component---src-pages-resources-mdx\":[\"/component---src-pages-resources-mdx-87ee5028285305931906.js\"],\"component---src-pages-resources-topics-js\":[\"/component---src-pages-resources-topics-js-2c0c252fcdef36013131.js\"],\"component---src-pages-resources-videos-curity-shorts-js\":[\"/component---src-pages-resources-videos-curity-shorts-js-950cf34f2cf1ad3e0e06.js\"],\"component---src-pages-resources-videos-demos-js\":[\"/component---src-pages-resources-videos-demos-js-cd19a534bcebefe5788f.js\"],\"component---src-pages-resources-videos-developer-how-tos-js\":[\"/component---src-pages-resources-videos-developer-how-tos-js-d28f847fbd8eea58b566.js\"],\"component---src-pages-resources-videos-js\":[\"/component---src-pages-resources-videos-js-bc47afbfbad6ba4a59df.js\"],\"component---src-pages-resources-videos-live-js\":[\"/component---src-pages-resources-videos-live-js-f376c45479a6a41b8963.js\"],\"component---src-pages-resources-webinars-js\":[\"/component---src-pages-resources-webinars-js-9924f2b8f73aeb20145a.js\"],\"component---src-pages-resources-webinars-thank-you-js\":[\"/component---src-pages-resources-webinars-thank-you-js-5b9db25c7cd1e298053b.js\"],\"component---src-pages-resources-whats-new-mdx\":[\"/component---src-pages-resources-whats-new-mdx-407474e032c8b8caad2d.js\"],\"component---src-pages-schedule-a-demo-js\":[\"/component---src-pages-schedule-a-demo-js-877e0d9a32fb8955a0a1.js\"],\"component---src-pages-schedule-a-meeting-curt-js\":[\"/component---src-pages-schedule-a-meeting-curt-js-eba8bb6494d99ad51467.js\"],\"component---src-pages-schedule-a-meeting-emea-js\":[\"/component---src-pages-schedule-a-meeting-emea-js-d632198632f6bba7d07f.js\"],\"component---src-pages-schedule-a-meeting-jonas-js\":[\"/component---src-pages-schedule-a-meeting-jonas-js-a3006e73c79a4044d34f.js\"],\"component---src-pages-schedule-a-meeting-js\":[\"/component---src-pages-schedule-a-meeting-js-d1cd57363c7a84becf30.js\"],\"component---src-pages-schedule-a-meeting-kay-js\":[\"/component---src-pages-schedule-a-meeting-kay-js-fa53ca99534dbcf45298.js\"],\"component---src-pages-schedule-a-meeting-kim-js\":[\"/component---src-pages-schedule-a-meeting-kim-js-43d13fa5fe0a1f9524d6.js\"],\"component---src-pages-schedule-a-meeting-us-js\":[\"/component---src-pages-schedule-a-meeting-us-js-a1f5d501b0411a156b77.js\"],\"component---src-pages-search-js\":[\"/component---src-pages-search-js-27034e7d1416dafe2384.js\"],\"component---src-pages-solutions-common-identity-platform-mdx\":[\"/component---src-pages-solutions-common-identity-platform-mdx-ef051b48945d66835321.js\"],\"component---src-pages-solutions-frictionless-authentication-mdx\":[\"/component---src-pages-solutions-frictionless-authentication-mdx-2b1a16d3db562fe14f24.js\"],\"component---src-pages-solutions-identity-for-government-solutions-mdx\":[\"/component---src-pages-solutions-identity-for-government-solutions-mdx-8088bcacbf1106030766.js\"],\"component---src-pages-solutions-mdx\":[\"/component---src-pages-solutions-mdx-0b8bcbdad31c19664c0a.js\"],\"component---src-pages-solutions-modernizing-infrastructure-mdx\":[\"/component---src-pages-solutions-modernizing-infrastructure-mdx-0536a51be40954028c76.js\"],\"component---src-pages-solutions-open-banking-and-fapi-mdx\":[\"/component---src-pages-solutions-open-banking-and-fapi-mdx-71e19cf86dacd5874531.js\"],\"component---src-pages-solutions-open-banking-and-psd-2-mdx\":[\"/component---src-pages-solutions-open-banking-and-psd-2-mdx-601673f8554b193fd6f0.js\"],\"component---src-pages-solutions-protecting-health-care-mdx\":[\"/component---src-pages-solutions-protecting-health-care-mdx-0cb88643f4a863b9a4bb.js\"],\"component---src-pages-solutions-protecting-telecom-services-mdx\":[\"/component---src-pages-solutions-protecting-telecom-services-mdx-f52d78191ede6cc30616.js\"],\"component---src-pages-solutions-secure-financial-services-mdx\":[\"/component---src-pages-solutions-secure-financial-services-mdx-2017d6cde84859491ff9.js\"],\"component---src-pages-solutions-tech-and-saas-security-mdx\":[\"/component---src-pages-solutions-tech-and-saas-security-mdx-bc7e26e51e15f6c6774f.js\"],\"component---src-pages-solutions-zero-trust-mdx\":[\"/component---src-pages-solutions-zero-trust-mdx-c9d9a520c251f1b171cf.js\"],\"component---src-pages-support-instant-message-support-mdx\":[\"/component---src-pages-support-instant-message-support-mdx-242d8d0a51b21f9386cc.js\"],\"component---src-pages-support-js\":[\"/component---src-pages-support-js-986888d6816aeb313526.js\"],\"component---src-pages-support-professional-services-mdx\":[\"/component---src-pages-support-professional-services-mdx-a65637922c781aba9330.js\"],\"component---src-pages-terms-of-service-js\":[\"/component---src-pages-terms-of-service-js-98284a446729579842cb.js\"],\"component---src-pages-training-js\":[\"/component---src-pages-training-js-ba8d7e7e169846d6c209.js\"],\"component---src-pages-what-analysts-say-mdx\":[\"/component---src-pages-what-analysts-say-mdx-b04aa0db4402f77d2cbe.js\"],\"component---src-templates-area-js\":[\"/component---src-templates-area-js-f103669fdbe366acdc3f.js\"],\"component---src-templates-blog-author-js\":[\"/component---src-templates-blog-author-js-c4b7dd0d35ddaf6205c4.js\"],\"component---src-templates-blog-js\":[\"/component---src-templates-blog-js-7d91464a74cad1acbae8.js\"],\"component---src-templates-blog-post-js\":[\"/component---src-templates-blog-post-js-adfae467b412a0c2e785.js\"],\"component---src-templates-blog-tag-js\":[\"/component---src-templates-blog-tag-js-57496afe8d8d9cd4b5ac.js\"],\"component---src-templates-career-post-js\":[\"/component---src-templates-career-post-js-48fa5d387fa9e0e31030.js\"],\"component---src-templates-course-session-js\":[\"/component---src-templates-course-session-js-9a52924049a42836387c.js\"],\"component---src-templates-customer-story-js\":[\"/component---src-templates-customer-story-js-cbc9a1e8084654dc1aef.js\"],\"component---src-templates-document-post-js\":[\"/component---src-templates-document-post-js-8dad6d32702b4b5c27e6.js\"],\"component---src-templates-guides-application-type-js\":[\"/component---src-templates-guides-application-type-js-a350207402cbf86b4a86.js\"],\"component---src-templates-guides-libraries-js\":[\"/component---src-templates-guides-libraries-js-7d7df481fc1309cf1b78.js\"],\"component---src-templates-guides-technology-js\":[\"/component---src-templates-guides-technology-js-e7b7a9d880b5752ac6cc.js\"],\"component---src-templates-landing-page-js\":[\"/component---src-templates-landing-page-js-1d60a22355e055fae164.js\"],\"component---src-templates-news-js\":[\"/component---src-templates-news-js-af42ef88b405a4e555c2.js\"],\"component---src-templates-news-post-js\":[\"/component---src-templates-news-post-js-b9a9c51114b46bb6e4cb.js\"],\"component---src-templates-pagegroup-js\":[\"/component---src-templates-pagegroup-js-a067ad35b6136948937d.js\"],\"component---src-templates-partner-page-js\":[\"/component---src-templates-partner-page-js-b535c10ce0d59721d0ab.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-api-security-best-practices-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-api-security-best-practices-mdx-0149f4151b21d4aec438.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-identity-in-a-k-8-s-environment-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-identity-in-a-k-8-s-environment-mdx-8d22ab600705fa919e84.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-impersonation-flow-approaches-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-impersonation-flow-approaches-mdx-e5403df00e62d382c4df.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-implementing-zero-trust-apis-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-implementing-zero-trust-apis-mdx-82c6196e0051e96cb016.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-jwt-best-practices-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-jwt-best-practices-mdx-125a49d1af8ccf818d8b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-jwt-signatures-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-jwt-signatures-mdx-2a02e048404e7b16fc14.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-owasp-top-ten-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-owasp-top-ten-mdx-a0f4dc0a374e17f237eb.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-phantom-token-pattern-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-phantom-token-pattern-mdx-730fce8b00b6e489c917.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-self-contained-jwts-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-self-contained-jwts-mdx-310b4b40b385e64a4794.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-split-token-pattern-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-split-token-pattern-mdx-f98ac297b8585978a0c0.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-the-api-security-maturity-model-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-the-api-security-maturity-model-mdx-d587de3d389c7b57ef68.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-token-sharing-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-token-sharing-mdx-6023d670f73fb1413459.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-zero-trust-api-events-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-api-security-zero-trust-api-events-mdx-669515aeb3fde723cae1.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-banking-curity-and-psd-2-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-banking-curity-and-psd-2-mdx-5c246682ae27d908c773.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-ciam-ciam-overview-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-ciam-ciam-overview-mdx-cc3eb150f5345e6e71c6.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-ciam-how-ciam-protects-data-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-ciam-how-ciam-protects-data-mdx-ec98afcc07eb0a01905b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-ciam-iam-vs-ciam-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-ciam-iam-vs-ciam-mdx-c578c9c55748ffde532e.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-centralizing-identity-data-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-centralizing-identity-data-mdx-d7eae946965c89511fba.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-claims-best-practices-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-claims-best-practices-mdx-c7619375a491d7741630.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-default-scopes-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-default-scopes-mdx-32e3db6ab2a48c2c299a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-scope-best-practices-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-scope-best-practices-mdx-0c7bc486cddab5d29716.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-scopes-and-how-they-relate-to-claims-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-scopes-and-how-they-relate-to-claims-mdx-80e93e1d2742cd94e8c9.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-scopes-claims-and-the-client-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-scopes-claims-and-the-client-mdx-d16bf75f70071d434eb7.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-scopes-claims-tokens-and-all-the-things-in-between-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-scopes-claims-tokens-and-all-the-things-in-between-mdx-71d38188930caf9636aa.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-scopes-vs-claims-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-scopes-vs-claims-mdx-b73a338d8fa61b7fe979.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-selective-disclosure-jwt-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-selective-disclosure-jwt-mdx-177e1f55375e9e8f7a63.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-the-relationship-between-consent-and-claims-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-the-relationship-between-consent-and-claims-mdx-2eda8d6e12d107a29a8b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-using-claims-in-apis-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-using-claims-in-apis-mdx-e42109535d85547edccc.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-vectors-of-trust-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-vectors-of-trust-mdx-730ede9d160f6da1067f.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-what-are-claims-and-how-they-are-used-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-what-are-claims-and-how-they-are-used-mdx-06cfb54b71484c970dba.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-what-is-a-claims-authority-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-claims-what-is-a-claims-authority-mdx-5457bd579c296a2f8e50.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-client-security-nonce-authenticator-pattern-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-client-security-nonce-authenticator-pattern-mdx-0507d3ad7ac6721331ee.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-client-security-oauth-cookie-best-practices-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-client-security-oauth-cookie-best-practices-mdx-5a26d35203db57cda2e8.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-client-security-oauth-for-mobile-apps-best-practices-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-client-security-oauth-for-mobile-apps-best-practices-mdx-ae34eb1bcae054302d65.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-client-security-spa-best-practices-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-client-security-spa-best-practices-mdx-6950045b998bc95aec48.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-client-security-token-handler-deployment-patterns-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-client-security-token-handler-deployment-patterns-mdx-03c07363f50ae2b3a836.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-client-security-token-handler-overview-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-client-security-token-handler-overview-mdx-bf29738459176c88b9b0.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-alarm-handlers-alarm-integration-plugin-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-alarm-handlers-alarm-integration-plugin-mdx-322e460429f5ddfff80d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-blink-id-scan-action-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-blink-id-scan-action-mdx-50c27c80bbd6a0770a6a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-choose-account-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-choose-account-mdx-f8b5ccedb48ce2a967fa.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-debug-attribute-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-debug-attribute-mdx-2e01fa7ccabc37bd5a37.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-iproov-action-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-iproov-action-mdx-6f56c4005d5d6915ad3e.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-provision-azure-api-management-user-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-provision-azure-api-management-user-mdx-bb076f4f23bdf31038fd.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-provision-kong-dev-portal-user-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-provision-kong-dev-portal-user-mdx-2ad9ae4ac69f62a16685.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-redirect-action-example-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-redirect-action-example-mdx-81da4bd3d74ed81b7a49.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-send-email-action-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-send-email-action-mdx-bd01adcceb9a21f94168.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-time-based-deny-authentication-action-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authentication-actions-time-based-deny-authentication-action-mdx-aa13fc2a9fbf8ce1bf5b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-bitbucket-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-bitbucket-authenticator-mdx-10778f0c7ff3aa8780b6.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-box-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-box-authenticator-mdx-52c1d426f3e5bea09105.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-codeexamples-username-password-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-codeexamples-username-password-authenticator-mdx-9e37979c0da7577b021b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-criipto-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-criipto-authenticator-mdx-5fbe26a1b808855b69a5.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-dropbox-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-dropbox-authenticator-mdx-a76ede829426c867b207.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-entrust-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-entrust-authenticator-mdx-c2821e12c4b9f6a0e67d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-freja-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-freja-authenticator-mdx-0665cb5fbd54a8e027d0.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-github-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-github-authenticator-mdx-058ad02a873b416614c9.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-instagram-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-instagram-authenticator-mdx-e1321e2180377d1b66b2.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-linkedin-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-linkedin-authenticator-mdx-2ce539f962f627125517.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-nonce-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-nonce-authenticator-mdx-22576cf41684599a02ae.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-recaptcha-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-recaptcha-authenticator-mdx-66d788e7ae92127d21e7.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-salesforce-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-salesforce-authenticator-mdx-e68fd068b95e9e4583b9.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-slack-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-slack-authenticator-mdx-e0b4f5167629d0a54402.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-stackexchange-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-stackexchange-authenticator-mdx-52398dafe599508c92c0.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-twitter-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-twitter-authenticator-mdx-479b3ff9bb42030b3c5f.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-windows-live-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authenticators-windows-live-authenticator-mdx-7b20689a55e4681c62ca.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authorization-managers-authzen-authorization-manager-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authorization-managers-authzen-authorization-manager-mdx-c70fab0b154b7d6ed52c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authorization-managers-opa-authorization-manager-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authorization-managers-opa-authorization-manager-mdx-ff53b547a148987f15ce.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authorization-managers-xacml-authorization-manager-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-authorization-managers-xacml-authorization-manager-mdx-07cf99085b1382bb8247.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-claims-providers-salesforce-claims-provider-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-claims-providers-salesforce-claims-provider-mdx-4dc6ac5ef7a90bf609c3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-consentors-example-generic-consentor-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-consentors-example-generic-consentor-mdx-f4ce2921bfeb55e032d7.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-data-access-mongo-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-data-access-mongo-mdx-06d73eef927ebf39eb30.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-data-access-pbkdf-2-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-data-access-pbkdf-2-mdx-beca598a30c061daef63.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-data-access-restful-data-access-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-data-access-restful-data-access-mdx-ecfe4edebc270d76de1d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-emailers-restful-emailer-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-emailers-restful-emailer-mdx-7f9d5ca25a0ee322a711.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-emailers-sendgrid-emailer-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-emailers-sendgrid-emailer-mdx-26762de9756b77ea27ac.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-event-listeners-amazon-sqs-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-event-listeners-amazon-sqs-mdx-bb7c4ff4f8f6f578a69f.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-event-listeners-apigee-edge-token-publisher-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-event-listeners-apigee-edge-token-publisher-mdx-4ac317f22184c8b7fa24.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-event-listeners-apigee-split-token-publisher-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-event-listeners-apigee-split-token-publisher-mdx-949e3337c1afbe92cdf5.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-event-listeners-aws-token-publisher-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-event-listeners-aws-token-publisher-mdx-9e557feafe4a24ad3102.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-event-listeners-client-authentication-attempt-counter-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-event-listeners-client-authentication-attempt-counter-mdx-a2124a4e76f0f6cbc9fe.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-event-listeners-cloudflare-token-publisher-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-event-listeners-cloudflare-token-publisher-mdx-1e568c8545d546102529.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-sms-senders-restful-sender-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-sms-senders-restful-sender-mdx-31093c389bbeea5f40d7.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-sms-senders-tele-2-sms-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-sms-senders-tele-2-sms-mdx-cfa9d08a6bf80dcec274.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-token-procedures-long-lived-tokens-on-refresh-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-token-procedures-long-lived-tokens-on-refresh-mdx-9641bc99e383eefd946b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-token-procedures-token-exchange-opaque-to-jwt-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-plugins-token-procedures-token-exchange-opaque-to-jwt-mdx-71354f482a8f0d1f15e3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-api-jwt-assertions-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-api-jwt-assertions-mdx-57a3a7c94a94c0ee7ec8.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-dotnet-api-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-dotnet-api-mdx-92e00de7f669a32a709c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-express-jwt-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-express-jwt-mdx-496585872f441b4fb19c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-go-api-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-go-api-mdx-433f7173f5fa4c83b5a3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-kotlin-api-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-kotlin-api-mdx-e0f1de0cda65f3782182.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-mutual-tls-api-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-mutual-tls-api-mdx-ed38b5cc6c717451666d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-oauth-filter-for-java-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-oauth-filter-for-java-mdx-9c2450e6b305d272b47c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-oauth-filter-for-python-flask-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-oauth-filter-for-python-flask-mdx-e8fe1a5bb3f11dc26a4a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-securing-api-events-using-jwts-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-securing-api-events-using-jwts-mdx-842e4a2867e5a055e134.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-serverless-zero-trust-api-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-serverless-zero-trust-api-mdx-086d987c52db834b57d3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-serverless-zero-trust-api-on-vercel-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-serverless-zero-trust-api-on-vercel-mdx-d5579494c8fc6b40d2c6.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-spring-boot-api-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-spring-boot-api-mdx-7eb5432b747621cfaf7d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-symfony-api-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-symfony-api-mdx-2214018135d2543455c6.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-testing-zero-trust-apis-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-apis-testing-zero-trust-apis-mdx-8a8490cda7f8ab87bb08.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-authenticated-dcr-example-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-authenticated-dcr-example-mdx-07ac924ebc0348f1ae72.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-kotlin-android-appauth-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-kotlin-android-appauth-mdx-cadcf047e4b2e2fb4cce.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-kotlin-android-haapi-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-kotlin-android-haapi-mdx-402bf39bb90af9953e17.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-mobile-setup-ngrok-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-mobile-setup-ngrok-mdx-995938eb394e2819b9fe.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-mobile-web-sso-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-mobile-web-sso-mdx-fc044d82eef95a1bc23c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-reactnative-haapi-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-reactnative-haapi-mdx-d200ba5f06e3f38e2a65.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-swift-ios-appauth-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-swift-ios-appauth-mdx-d925fd0204cbb91d69b7.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-swift-ios-haapi-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-mobileapps-swift-ios-haapi-mdx-e00f1a509f1f19169465.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-angular-assisted-token-website-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-angular-assisted-token-website-mdx-ef96ce680f1239d6c1d5.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-javascript-assisted-token-sample-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-javascript-assisted-token-sample-mdx-beffa333eeb9c8083bf7.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-javascript-pkce-client-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-javascript-pkce-client-mdx-5bbaa622e30615e5b2a3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-oauth-assistant-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-oauth-assistant-mdx-a6015741c054afdf1257.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-react-assisted-token-website-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-react-assisted-token-website-mdx-bf57435ddbf460d451c0.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-react-haapi-demo-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-react-haapi-demo-mdx-99a62a2ed3942e8f4397.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-token-handler-deployment-example-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-token-handler-deployment-example-mdx-4cc46270a5861feef545.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-token-handler-spa-example-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-spas-token-handler-spa-example-mdx-e8236c4c45ce7408e572.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-dotnet-openid-connect-website-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-dotnet-openid-connect-website-mdx-d37498368b7425ce2509.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-dotnetframework-openid-connect-client-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-dotnetframework-openid-connect-client-mdx-b4403b17c1bbd657e19c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-mitreid-connect-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-mitreid-connect-mdx-a9a58b0e3d697e6a4ec6.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-oidc-java-undertow-pac-4-j-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-oidc-java-undertow-pac-4-j-mdx-b76ceaaf4a77b98ee0fb.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-oidc-node-express-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-oidc-node-express-mdx-e2b4672d0b8e917b540e.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-oidc-spring-boot-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-oidc-spring-boot-mdx-66e442a31377f09cc102.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-oidc-spring-boot-mtls-auth-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-oidc-spring-boot-mtls-auth-mdx-80560f3a43cdae9f624b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-python-openid-connect-client-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-python-openid-connect-client-mdx-a6b9c45dcae7d0d7768b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-website-using-encrypted-id-tokens-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-code-examples-writing-websites-website-using-encrypted-id-tokens-mdx-04ed7a39c52e2197ac57.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-decentralized-identities-decentralized-identifiers-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-decentralized-identities-decentralized-identifiers-mdx-9ed0e0a41047b3ecca6f.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-decentralized-identities-overview-of-decentralized-identities-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-decentralized-identities-overview-of-decentralized-identities-mdx-f771aed211f5af720057.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-decentralized-identities-verifiable-credentials-issuance-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-decentralized-identities-verifiable-credentials-issuance-mdx-8c2a7a7f650c0ea3993c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-decentralized-identities-verifiable-credentials-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-decentralized-identities-verifiable-credentials-mdx-cb0075f897f508a2d1ee.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-dynamic-user-routing-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-dynamic-user-routing-mdx-38d4e236ecfca70b829f.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-external-idps-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-external-idps-mdx-002c9569a1fc1fab656b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-iam-configuration-best-practices-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-iam-configuration-best-practices-mdx-e6cb364a526362df6852.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-logging-best-practices-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-logging-best-practices-mdx-290a6f806f464eef9352.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-multi-region-deployment-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-multi-region-deployment-mdx-ae3537bc6505cead1126.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-oauth-troubleshooting-developers-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-oauth-troubleshooting-developers-mdx-2df8984611c52cc24510.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-oauth-troubleshooting-devops-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-deploy-oauth-troubleshooting-devops-mdx-8705c0404ecc23bd7c3b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-app-2-app-architecture-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-app-2-app-architecture-mdx-c42ca9e8bec50807dce4.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-consentors-in-financial-grade-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-consentors-in-financial-grade-mdx-dffbafb056bbba1c8dda.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-implement-financial-grade-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-implement-financial-grade-mdx-ee41c7850e6adcd0cc0d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-obb-dcr-validation-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-obb-dcr-validation-mdx-469fb522a04de44d5cb9.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-what-is-financial-grade-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-what-is-financial-grade-mdx-82610e59685dd32ee7ed.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-what-is-open-banking-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-what-is-open-banking-mdx-c36ff651cafc8d691a1f.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-what-is-psd-2-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-financial-grade-what-is-psd-2-mdx-f815574d83f75a827205.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-concepts-concepts-authentication-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-concepts-concepts-authentication-mdx-0115c5beb44abfc9e124.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-concepts-concepts-availability-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-concepts-concepts-availability-mdx-18d7cefb5c2a9993b35a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-concepts-concepts-data-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-concepts-concepts-data-mdx-95086dbdd88582d4c248.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-concepts-concepts-deployment-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-concepts-concepts-deployment-mdx-42ba3ec7a6b6d2b08897.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-concepts-concepts-overview-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-concepts-concepts-overview-mdx-f334d53f3fb107c4430e.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-concepts-concepts-tokens-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-concepts-concepts-tokens-mdx-0651fbe680e49a99cd31.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-configure-client-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-configure-client-mdx-77307786151104ccf846.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-first-config-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-first-config-mdx-94e179f015b5cb8c67da.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-getting-started-summary-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-getting-started-summary-mdx-c108f7a4118d04d06802.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-setup-install-curity-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-setup-install-curity-mdx-64d329c26204eccb46a3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-setup-install-helm-chart-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-setup-install-helm-chart-mdx-59a07edbdbcfee14bbbc.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-setup-install-on-azure-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-setup-install-on-azure-mdx-b54464851c9907d3db27.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-setup-install-on-gcp-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-setup-install-on-gcp-mdx-4d8ada016b1627dfcd92.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-setup-run-curity-aws-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-setup-run-curity-aws-mdx-30a54dac8adc191bfaa2.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-setup-run-curity-docker-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-setup-run-curity-docker-mdx-a71e1bad76ca6a2c6597.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tokenhandler-token-handler-first-configuration-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tokenhandler-token-handler-first-configuration-mdx-d5b40ae661147fec0bd3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tokenhandler-token-handler-getting-started-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tokenhandler-token-handler-getting-started-mdx-0c854a0b6acc387e46ce.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tokenhandler-token-handler-integrate-gateway-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tokenhandler-token-handler-integrate-gateway-mdx-8983997f108c04a80dbf.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tokenhandler-token-handler-integrate-spa-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tokenhandler-token-handler-integrate-spa-mdx-84991d1f35d02acec97c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tokenhandler-token-handler-summary-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tokenhandler-token-handler-summary-mdx-c7c5b63c94a44c0d563a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tryit-test-using-curl-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tryit-test-using-curl-mdx-c87de4c3bd0adf957580.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tryit-test-using-oauth-assistant-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tryit-test-using-oauth-assistant-mdx-91f643f4c326343e652b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tryit-test-using-oauth-tools-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-tryit-test-using-oauth-tools-mdx-8d7c854b2d1b51ef7c87.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-username-password-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-getting-started-username-password-authenticator-mdx-bdb2a93a45f595ea2ad2.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-haapi-mobile-fallback-attestation-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-haapi-mobile-fallback-attestation-mdx-f8e282e0761f1c1b8969.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-haapi-what-is-hypermedia-authentication-api-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-haapi-what-is-hypermedia-authentication-api-mdx-88550e17a4c96017de25.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-ciba-tutorial-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-ciba-tutorial-mdx-a83300701bce1ce405f4.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-dcr-validation-in-pre-processing-procedure-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-dcr-validation-in-pre-processing-procedure-mdx-4f33548ffd107a00bfe3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-jar-tutorial-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-jar-tutorial-mdx-def0ecfe2580d4265f99.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-jarm-tutorial-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-jarm-tutorial-mdx-0f3f1bdf62e5c60d741b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-jwt-assertion-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-jwt-assertion-mdx-1f1b511abdd6ec7b9b30.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-non-templatized-dcr-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-non-templatized-dcr-mdx-fe4fe04eecc567ea0e66.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-oauth-entitlements-in-introspection-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-oauth-entitlements-in-introspection-mdx-c3ecf97684ce5c846786.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-par-tutorial-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-par-tutorial-mdx-150cf67f020d1b4f3d0d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-pkce-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-pkce-mdx-5d382d1ef417a8002959.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-ppid-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-ppid-mdx-7d973793a1f53d5ee582.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-san-in-mtls-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-san-in-mtls-mdx-07ef0d7d47df216d52ac.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-service-mesh-mtls-client-credentials-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-service-mesh-mtls-client-credentials-mdx-826121fba8bdf4bfe74c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-templatized-dcr-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-advanced-templatized-dcr-mdx-7209e0a47ff44cb51b28.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-advanced-cloud-user-routing-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-advanced-cloud-user-routing-mdx-225e53fffd5a8445aa3d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-advanced-cloudflare-dynamic-user-routing-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-advanced-cloudflare-dynamic-user-routing-mdx-1398f40ad47f6cde98e1.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-advanced-curity-opa-kong-api-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-advanced-curity-opa-kong-api-mdx-92cf9af036e59a0d3c83.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-advanced-kong-user-routing-plugin-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-advanced-kong-user-routing-plugin-mdx-1c85b5f8a261fa7188ff.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-advanced-nginx-obb-dcr-validation-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-advanced-nginx-obb-dcr-validation-mdx-73cc9621051f5b007cc8.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-advanced-nginx-user-routing-plugin-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-advanced-nginx-user-routing-plugin-mdx-d5543a29546303fdd32c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-oauth-proxy-aws-oauth-proxy-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-oauth-proxy-aws-oauth-proxy-mdx-e718b3f94c1a37036723.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-oauth-proxy-azure-api-management-oauth-proxy-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-oauth-proxy-azure-api-management-oauth-proxy-mdx-2b2179889516ef6f3e2a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-oauth-proxy-google-apigee-oauth-proxy-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-oauth-proxy-google-apigee-oauth-proxy-mdx-566360c3aab6512718c3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-oauth-proxy-kong-oauth-proxy-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-oauth-proxy-kong-oauth-proxy-mdx-a89142c92959a463c259.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-oauth-proxy-nginx-oauth-proxy-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-oauth-proxy-nginx-oauth-proxy-mdx-84fa541a2dd4baedda03.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-oauth-proxy-openresty-oauth-proxy-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-oauth-proxy-openresty-oauth-proxy-mdx-e7313a93906f4c998b91.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-apigee-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-apigee-mdx-7aa5e2f38ebec11509ff.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-aws-phantom-token-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-aws-phantom-token-mdx-a9f1327fb9be017c0c69.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-azure-api-management-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-azure-api-management-mdx-4b22eab6d648bb62e45e.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-kong-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-kong-mdx-593dd952309f97da4f32.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-kong-open-source-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-kong-open-source-mdx-b1b1447e2d30d2dcb274.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-layer-7-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-layer-7-mdx-11ad66e18658f5fb6a7b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-openresty-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-openresty-mdx-091a6988dd34f95e6369.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-other-phantom-token-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-other-phantom-token-mdx-26e34ecc8bde91e941f0.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-zuplo-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-integration-zuplo-mdx-a5a5e146519d7b17bd5a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-introspect-with-phantom-token-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-introspect-with-phantom-token-mdx-534e0e4f7f441d1028de.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-nginx-phantom-token-module-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-phantom-token-nginx-phantom-token-module-mdx-0a4d4a6169b061fe9dcc.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-split-token-cloudflare-split-tokens-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-split-token-cloudflare-split-tokens-mdx-459f8dd342a68b5a5b3e.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-split-token-integration-apigee-split-token-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-split-token-integration-apigee-split-token-mdx-44708b04b4752086501a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-split-token-integration-aws-split-token-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-api-gateway-split-token-integration-aws-split-token-mdx-d70e5754135a4236de76.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-account-creation-after-login-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-account-creation-after-login-mdx-7730835b20dfdd89a2b2.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-account-linking-with-social-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-account-linking-with-social-mdx-2b453d94ba74b5382bd4.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-action-bundles-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-action-bundles-mdx-f87519f4de1cdc6a7963.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-add-authentication-action-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-add-authentication-action-mdx-12b8553f10e764aa5456.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-authentication-actions-example-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-authentication-actions-example-mdx-4c6d3572659f5f8b781c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-control-authentication-using-actions-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-control-authentication-using-actions-mdx-34e474f3af99e9ee43e9.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-migrating-to-passwordless-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-migrating-to-passwordless-mdx-3bb86064a4959032b452.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-optin-mfa-howto-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-optin-mfa-howto-mdx-52da0cfba794b48ec612.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-scripted-attribute-transformation-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-actions-scripted-attribute-transformation-mdx-acd7abbe0e208d344eed.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-application-url-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-application-url-mdx-da33bc19bed491a23392.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-authenticate-with-google-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-authenticate-with-google-authenticator-mdx-552e2c9536bf3e8e9492.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-authentication-overview-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-authentication-overview-mdx-8227eb1148bdfcc6dece.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-beyondidentity-integration-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-beyondidentity-integration-mdx-f6dd710fc3605c99ebdb.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-connecting-to-saml-idp-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-connecting-to-saml-idp-mdx-42efef8c8a41ddde85d6.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-dynamic-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-dynamic-authenticator-mdx-cf785e0ab6416be6b652.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-geolocation-authenticator-filter-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-geolocation-authenticator-filter-mdx-453ad8219134d016dd59.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-integrating-with-bankid-v-6-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-integrating-with-bankid-v-6-mdx-609854ce6b53e5cd78ad.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-norwegian-bankid-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-norwegian-bankid-mdx-8d1828d0da453141ee28.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-oicd-authenticator-azure-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-oicd-authenticator-azure-mdx-b0c9d1d9242403143f21.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-oidc-signicat-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-oidc-signicat-mdx-65c160a539d76b2937c2.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-passkeys-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-passkeys-authenticator-mdx-5da082c31a4771b4c488.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-preregister-devices-in-webauthn-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-preregister-devices-in-webauthn-authenticator-mdx-1161a33032ce7e3138ac.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-sign-in-with-apple-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-sign-in-with-apple-mdx-f25d9725e5066991b6a2.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-siths-authentication-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-siths-authentication-mdx-50017d7a823bc415f82d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-use-azure-ad-for-credential-verification-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-use-azure-ad-for-credential-verification-mdx-3835dbc4dd0b0728b70a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-user-account-lockout-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-user-account-lockout-mdx-88ee79fce3b4a93e1d36.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-webauthn-authenticator-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-authentication-webauthn-authenticator-mdx-5eab76edf23a7887db8d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-consent-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-consent-mdx-60ceaccaacdad8b93e74.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-customize-look-and-feel-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-customize-look-and-feel-mdx-ed5a89a399119c61fd61.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-customize-look-and-feel-simple-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-customize-look-and-feel-simple-mdx-da8ff152f72bc3bf001a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-customize-password-validation-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-customize-password-validation-mdx-5073355d17c4374b0072.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-customize-recipe-basic-brand-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-customize-recipe-basic-brand-mdx-50aa8e493f931727753b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-customize-recipe-emails-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-customize-recipe-emails-mdx-122ca2bbe6ffa22f78e3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-customize-recipe-multi-brand-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-customize-recipe-multi-brand-mdx-674a2d7979cbdc7d8643.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-managing-custom-login-screens-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-branding-user-experience-managing-custom-login-screens-mdx-d93683feb7d2a09b1d34.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-auto-certificate-renewal-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-auto-certificate-renewal-mdx-c33d2ea2b6645ed88369.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-configuration-overview-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-configuration-overview-mdx-e47639432907c8ec1e3b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-configure-deployed-environments-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-configure-deployed-environments-mdx-3119637ac9d5bd1bdedd.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-curity-crypto-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-curity-crypto-mdx-fb89c56c7ff48c2cbfca.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-gitops-configuration-management-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-gitops-configuration-management-mdx-6aab17254511bb63a7ac.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-import-export-config-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-import-export-config-mdx-813d8010fbf5f516d016.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-intro-to-cli-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-configuration-intro-to-cli-mdx-a9ca7882d6ee85c7d725.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-decentralized-identities-configure-verifiable-credential-issuance-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-decentralized-identities-configure-verifiable-credential-issuance-mdx-77c730b01be1583ce41d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-decentralized-identities-pre-authorized-code-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-decentralized-identities-pre-authorized-code-mdx-867ee9bcb01d79f6e66a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-decentralized-identities-use-verifiable-credentials-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-decentralized-identities-use-verifiable-credentials-mdx-22396e186ba4b7e56ddc.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-clustering-using-aws-cloudformation-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-clustering-using-aws-cloudformation-mdx-d82119c3d2a748fdae44.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-clustering-using-docker-compose-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-clustering-using-docker-compose-mdx-d082e3f4e998cf886fd7.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-customizing-the-curity-docker-container-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-customizing-the-curity-docker-container-mdx-3e0ac9e41dc4c335b6ef.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-deploy-on-aws-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-deploy-on-aws-mdx-014da915ef50ec88d540.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-expose-local-curity-ngrok-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-expose-local-curity-ngrok-mdx-c2ca40fd7dbcd1bfd1a6.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-how-to-deploy-on-azure-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-how-to-deploy-on-azure-mdx-99e10db4c1b04afbb14b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-install-using-aws-cdk-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-install-using-aws-cdk-mdx-79d222cd33ba415fc5cc.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-intro-to-cluster-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-intro-to-cluster-mdx-a115d37af5383270fb7d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-testing-an-instance-of-curity-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-deploy-testing-an-instance-of-curity-mdx-12f9cfaaad0fdde3f6d0.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-access-rules-in-restconf-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-access-rules-in-restconf-mdx-3fb08e1267c24937e6e2.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-admin-access-rules-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-admin-access-rules-mdx-5c62dd8167bdebcbebaa.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-curity-multitenancy-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-curity-multitenancy-mdx-d5cda855d2dad2b3b244.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-devops-dashboard-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-devops-dashboard-mdx-87fbd186a4d15e1cad7c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-dkim-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-dkim-mdx-3a6163f5698b136aafa7.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-endpoints-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-endpoints-mdx-02b73bb78dd38a0567d1.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-federated-login-to-admin-ui-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-federated-login-to-admin-ui-mdx-c26a398306baec0a93c7.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-redirect-uri-policies-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-redirect-uri-policies-mdx-7c6a4ae7f9e7f6b1a606.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-token-signing-key-rotation-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-token-signing-key-rotation-mdx-6544cf5b44fe502ee9ec.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-use-ad-for-admin-users-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-use-ad-for-admin-users-mdx-40ee34e52261288e3baa.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-yubihsm-integration-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-devops-administration-yubihsm-integration-mdx-2e0f3dda31ab71d6c6b6.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-external-idps-external-idps-overview-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-external-idps-external-idps-overview-mdx-0f4bfb9ab4b1e50d0cd2.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-external-idps-okta-external-idp-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-external-idps-okta-external-idp-mdx-90568955f060da0358af.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-client-credentials-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-client-credentials-mdx-a9656f5d9a835c5f4634.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-code-flow-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-code-flow-mdx-68de232ed831e405ee58.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-device-flow-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-device-flow-mdx-312d4912f522ff4e2f0f.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-hybrid-flow-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-hybrid-flow-mdx-1419a0b397a0fbec95a5.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-implicit-flow-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-implicit-flow-mdx-d031429d1436931054e4.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-refresh-tokens-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-refresh-tokens-mdx-4c9f2cacba1f7901f72c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-revoke-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-revoke-mdx-adfe90559dc3fc5bc306.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-ropc-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-ropc-mdx-fbf4e566e057e1475867.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-user-consent-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-flows-user-consent-mdx-081673f9e999d00b4415.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-setup-api-driven-demo-client-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-setup-api-driven-demo-client-mdx-c9a6122fabb6f00f1dc8.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-setup-authentication-api-android-sdk-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-setup-authentication-api-android-sdk-mdx-6819dea8a17bc3f1bf16.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-setup-authentication-api-ios-sdk-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-setup-authentication-api-ios-sdk-mdx-0f3c101a7edbdc1b4372.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-setup-mobile-logins-using-native-passkeys-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-setup-mobile-logins-using-native-passkeys-mdx-3c6aedad0860e5a592a4.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-app-2-app-via-hypermedia-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-app-2-app-via-hypermedia-mdx-e6ca02bcb2524206441d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-advanced-authentication-flows-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-advanced-authentication-flows-mdx-b8da0b474d1d9fe04070.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-android-customization-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-android-customization-mdx-43c26d1409b30d628297.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-android-integration-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-android-integration-mdx-6d5ae2beeed393b3838c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-ios-customization-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-ios-customization-mdx-9d2f9604747f731f0fd1.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-ios-integration-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-ios-integration-mdx-cd2d7418cd78622d27bb.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-security-lifecycle-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-security-lifecycle-mdx-0f00c6a226403cf0385b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-username-password-flows-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-haapi-mobile-username-password-flows-mdx-65b1de5eda315c6cca2e.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-implementing-haapi-fallback-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-haapi-ui-sdk-implementing-haapi-fallback-mdx-700ca1d99d82f1c11b0d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-apache-mod-auth-openidc-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-apache-mod-auth-openidc-mdx-951f0f1d960df4b1b2d9.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-azuread-integration-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-azuread-integration-mdx-797ca37e1f174c20b589.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-idp-in-cloudflare-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-idp-in-cloudflare-mdx-a30065a85ebb0c7ef4ac.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-integration-tyk-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-integration-tyk-mdx-eb413d3aee03f18362de.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-jetty-opeind-module-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-jetty-opeind-module-mdx-e1701c4b65113ae08ce8.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-kong-dev-portal-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-kong-dev-portal-mdx-55e24007e64b4a22ddae.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-mulesoft-anypoint-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-mulesoft-anypoint-mdx-e9824d0acc376e7eeafe.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-salesforce-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-integrations-salesforce-mdx-c813de8eec34fdf3013c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-configure-deployments-using-helm-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-configure-deployments-using-helm-mdx-4a9e4749a5a3c3342f06.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-integrating-plugins-with-kubernetes-ingress-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-integrating-plugins-with-kubernetes-ingress-mdx-f9e3ebbcae7f7babab06.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-istio-demo-installation-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-istio-demo-installation-mdx-20643f2bf4d53e3512fb.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-autoscaling-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-autoscaling-mdx-406c32abbcf8877ba06a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-aws-eks-idsvr-deployment-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-aws-eks-idsvr-deployment-mdx-1e0397f3ed3d19f8bf1d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-azure-aks-idsvr-deployment-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-azure-aks-idsvr-deployment-mdx-80e5e2049c1e2935697b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-data-storage-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-data-storage-mdx-43911a8aef754e3808ad.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-eks-dynamo-access-irsa-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-eks-dynamo-access-irsa-mdx-ddb3fd6f13750a2362c6.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-gke-idsvr-kong-phantom-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-gke-idsvr-kong-phantom-mdx-0c9f79a8d76db2533ace.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-ingress-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-kubernetes-ingress-mdx-c1bc5ac7347c3a20b292.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-run-cluster-helm-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-run-cluster-helm-mdx-4a16e36f7dbe02cc9c65.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-using-helm-chart-with-config-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-kubernetes-using-helm-chart-with-config-mdx-909366aeb91dd522a2cd.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-alarm-pagerduty-integration-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-alarm-pagerduty-integration-mdx-06a2137438326c7b07d4.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-cloud-alarm-integration-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-cloud-alarm-integration-mdx-6f520e13198b956aafba.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-debug-logging-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-debug-logging-mdx-a8fb213b86aa14d984b7.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-grafana-dashboard-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-grafana-dashboard-mdx-c41fe69470b3b088134e.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-health-and-auto-healing-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-health-and-auto-healing-mdx-b20b9c988a61cc896a7a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-java-monitoring-overview-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-java-monitoring-overview-mdx-38af50aa90f605f579c3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-log-client-ip-to-auditdb-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-log-client-ip-to-auditdb-mdx-dc3c7a3476e159447662.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-log-to-datadog-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-log-to-datadog-mdx-53cd8d575e239c47c779.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-log-to-elasticsearch-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-log-to-elasticsearch-mdx-8e735c5b90cf223ad882.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-log-to-splunk-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-log-to-splunk-mdx-016e4dc77cf9b00b83e9.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-opentelemetry-tracing-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-opentelemetry-tracing-mdx-51d824f2d2e2352496c4.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-per-client-debug-logging-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-per-client-debug-logging-mdx-daeee922a4baf4a4a410.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-record-browser-trace-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-logging-monitoring-record-browser-trace-mdx-281d47cae22f5b232073.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-migrations-migrating-from-identityserver-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-migrations-migrating-from-identityserver-mdx-58c78e081a720fbe0a4c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-migrations-migrating-from-keycloak-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-migrations-migrating-from-keycloak-mdx-df95e5f53156711a08a8.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-migrations-migrating-from-spring-security-oauth-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-migrations-migrating-from-spring-security-oauth-mdx-535117146839e9590501.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-right-to-left-kanguage-support-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-right-to-left-kanguage-support-mdx-269d5c2a0948995afd08.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-spa-curity-token-handler-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-spa-curity-token-handler-mdx-dd9d4fb5fec705d1408d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-claims-from-authenticated-subject-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-claims-from-authenticated-subject-mdx-470b76bfe972d00291be.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-custom-token-issuer-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-custom-token-issuer-mdx-25bdfa933dc99ec6924d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-impersonation-implementation-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-impersonation-implementation-mdx-95c5b14027699e4d45b8.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-implementing-custom-claims-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-implementing-custom-claims-mdx-9761fb108f180898d4d2.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-implementing-dynamic-user-routing-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-implementing-dynamic-user-routing-mdx-dddded4b8b61e1490b4f.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-implementing-token-exchange-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-implementing-token-exchange-mdx-958419ea8163d4d05ac9.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-sign-tokens-with-eddsa-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-sign-tokens-with-eddsa-mdx-4aba9296a9fa8456f86b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-token-designer-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-token-designer-mdx-6f663d7da7b6263003ca.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-verified-claims-identity-assurance-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-verified-claims-identity-assurance-mdx-b57d6d1c5d9aa7747e35.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-working-with-claims-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-tokens-and-claims-working-with-claims-mdx-53dc6b24b21cc1518d1d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-attribute-authorization-manager-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-attribute-authorization-manager-mdx-6fdf0b5ecc383eb8060d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-devops-dashboard-user-administration-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-devops-dashboard-user-administration-mdx-5c760bfeeeb22f621a98.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-email-activation-scim-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-email-activation-scim-mdx-b878d4b0191a4a1b87b7.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-graphql-client-management-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-graphql-client-management-mdx-b5c2cfb3015f78d86de0.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-graphql-user-management-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-graphql-user-management-mdx-a6268fe7d9f985a4ed7b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-groups-authorization-manager-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-groups-authorization-manager-mdx-54f0398159f78423e95e.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-implementing-role-based-security-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-implementing-role-based-security-mdx-bfff711ac96d2b66c26e.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-scope-management-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-scope-management-mdx-09e0f124234ad31415d3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-user-management-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-users-user-management-mdx-3f559ee545e2cf13cf43.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-attach-debugger-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-attach-debugger-mdx-34a484f4e58d7322ff03.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-authentication-action-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-authentication-action-mdx-c2ee8397a09d8594443c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-authentication-plugin-techniques-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-authentication-plugin-techniques-mdx-99a78b97bb6f0bae2a81.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-generic-consentor-plugin-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-generic-consentor-plugin-mdx-ca86728d7475cffc31a7.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-getting-started-authentication-plugins-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-getting-started-authentication-plugins-mdx-3a3d5dbe6c624cd126ed.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-getting-started-plugins-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-getting-started-plugins-mdx-fdf4e265181e897d9fe6.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-getting-started-scripting-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-howtos-writing-plugins-getting-started-scripting-mdx-d8d3515a0509f2510e5d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-account-linking-recipes-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-account-linking-recipes-mdx-8ea9413980ac407a3cc5.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-approaches-to-mfa-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-approaches-to-mfa-mdx-8793983acdff27d97949.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-geolocation-overview-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-geolocation-overview-mdx-88db0595bdf26a991c6d.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-impossible-journey-action-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-impossible-journey-action-mdx-4468fa65363ac4cbb1f6.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-introduction-to-mfa-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-introduction-to-mfa-mdx-a4f2e66a40e5e9ba0271.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-mfa-in-curity-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-mfa-in-curity-mdx-ffca3dafff03407e9243.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-new-vs-changed-country-action-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-new-vs-changed-country-action-mdx-bf68250c6c59fcec7955.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-passkeys-design-your-solution-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-passkeys-design-your-solution-mdx-903d4f0b5a4f34ead864.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-webauthn-overview-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-webauthn-overview-mdx-d84abe32c33514c16ee4.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-what-are-passkeys-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-mfa-what-are-passkeys-mdx-a4f504f3e0c3e66cf947.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-api-management-system-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-api-management-system-mdx-2b27e3f712f1da362f3f.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-authentication-vs-authorization-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-authentication-vs-authorization-mdx-4462c8943f5df7ca0e59.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-curity-neo-security-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-curity-neo-security-mdx-8b4e1a4dee8cab2cfc32.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-entitlement-management-system-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-entitlement-management-system-mdx-ff5496d9d7059b74c5e3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-fips-201-3-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-fips-201-3-mdx-631d89af5f236f06fb64.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-glossary-of-identity-management-terms-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-glossary-of-identity-management-terms-mdx-ef06d2a47aea79c29752.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-iam-primer-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-iam-primer-mdx-ec5c59f6fe3892942d39.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-identity-management-system-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-identity-management-system-mdx-ed2d1ca0ba6f3d6b0c76.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-integrate-identity-business-data-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-integrate-identity-business-data-mdx-0c3d1d16d5d3a9ae41e1.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-introduction-identity-and-access-management-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-introduction-identity-and-access-management-mdx-696595b09b6222e76186.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-opa-integration-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-opa-integration-mdx-21bd141398cbd0d7d4bb.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-privacy-and-gdpr-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-privacy-and-gdpr-mdx-6f9e7dd02f4f348612e8.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-the-token-handler-pattern-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-the-token-handler-pattern-mdx-336617d73017b5d9fef2.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-what-is-neosecurity-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-what-is-neosecurity-mdx-eb7a5621de32b771cf8f.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-zero-trust-overview-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-neo-security-zero-trust-overview-mdx-4850dc229c437e660d02.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-client-assertions-jwks-uri-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-client-assertions-jwks-uri-mdx-6ae250739e584f4d2559.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-dpop-overview-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-dpop-overview-mdx-58211b24f06281b2078c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-certificate-bound-access-token-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-certificate-bound-access-token-mdx-e356c6d6bdbadbd0c38b.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-client-authentication-mutual-tls-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-client-authentication-mutual-tls-mdx-4bdf36c3cac83d6fb13c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-client-credentials-flow-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-client-credentials-flow-mdx-c81b56d343e64f3433eb.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-code-flow-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-code-flow-mdx-07b5c857fcba5a26982c.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-device-flow-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-device-flow-mdx-245fa86610e19bedb20a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-implicit-flow-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-implicit-flow-mdx-447d08ddfd136ad4c03a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-overview-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-overview-mdx-cda3eb356d94990d83fc.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-pkce-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-pkce-mdx-5b939a991584ef856800.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-refresh-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-refresh-mdx-d10f1ed6c7e4b0221894.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-resource-owner-password-credential-flow-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-resource-owner-password-credential-flow-mdx-bd83dcc31f8ced257dcc.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-revoke-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-revoke-mdx-50b3376687160168f0a5.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-supported-standards-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-oauth-supported-standards-mdx-42fca70f883b880f3dc3.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-pushed-authorization-requests-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-pushed-authorization-requests-mdx-578db6a4f8107a834603.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-token-exchange-flow-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-oauth-token-exchange-flow-mdx-dd2f8cb8d67959a0c0a8.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-ciba-flow-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-ciba-flow-mdx-c331074ac2a9d19f0c3a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-client-initiated-backchannel-authentication-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-client-initiated-backchannel-authentication-mdx-25b33b29e09999bada83.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-device-flow-vs-ciba-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-device-flow-vs-ciba-mdx-56d4d2e87b009daba255.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-dynamic-client-registration-authentication-methods-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-dynamic-client-registration-authentication-methods-mdx-08b783e2a3f1208e7906.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-dynamic-client-registration-management-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-dynamic-client-registration-management-mdx-2740c589919caae06254.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-encrypted-id-tokens-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-encrypted-id-tokens-mdx-d4eee97be61b2cb93977.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-jwt-secured-authorization-response-mode-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-jwt-secured-authorization-response-mode-mdx-a702682af602328e0ad0.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-oauth-hybrid-flow-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-oauth-hybrid-flow-mdx-b84445dcb6d7171a4aad.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-openid-code-flow-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-openid-code-flow-mdx-a99662ccf103c776546a.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-openid-connect-logout-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-openid-connect-logout-mdx-c8827aef53cdffe1ec58.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-openid-connect-overview-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-openid-connect-overview-mdx-aa221f512ad0bccefeac.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-openid-connect-standards-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-openid-connect-standards-mdx-1a58d5c15647d010b3f1.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-openid-connect-understanding-dcr-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-openid-connect-understanding-dcr-mdx-32b9cf086fce041c1dfc.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-ppid-intro-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-ppid-intro-mdx-91d0bf28e18a730f87da.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-signed-request-object-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-signed-request-object-mdx-d41b3f176a5cf1f5831e.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-using-dynamic-client-registration-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-using-dynamic-client-registration-mdx-d0b8cdb150787e28a6eb.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-validating-an-id-token-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-openid-connect-validating-an-id-token-mdx-b4a9bc2d5093600b9651.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-administrative-management-of-sso-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-administrative-management-of-sso-mdx-9435ca2c058dc71d33ef.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-prompting-for-login-during-sso-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-prompting-for-login-during-sso-mdx-a63bafb6b8b8ff2284c9.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-sessions-and-sso-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-sessions-and-sso-mdx-62651273fdebbd04a708.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-single-sign-on-introduction-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-single-sign-on-introduction-mdx-ddab9d128795f208c6f9.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-sso-and-authentication-methods-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-sso-and-authentication-methods-mdx-c1f9b780b8d4b24c5f89.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-sso-for-mobile-apps-with-openid-connect-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-sso-for-mobile-apps-with-openid-connect-mdx-77ac0bfc61a92a15584f.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-sso-for-web-with-openid-connect-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-sso-for-web-with-openid-connect-mdx-ca330972c101b702fb3e.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-web-client-sso-with-openid-connect-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-sso-web-client-sso-with-openid-connect-mdx-515c0fb03dc707be8cb7.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-user-management-managing-users-with-scim-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-user-management-managing-users-with-scim-mdx-3b75d4ce44757daaa220.js\"],\"component---src-templates-resource-article-js-content-file-path-src-resource-pages-user-management-user-provisioning-with-scim-mdx\":[\"/component---src-templates-resource-article-js-content-file-path-src-resource-pages-user-management-user-provisioning-with-scim-mdx-f3eb8df638db6164cfdf.js\"],\"component---src-templates-topic-js\":[\"/component---src-templates-topic-js-8ebd54ce06464b29c0bf.js\"],\"component---src-templates-training-course-js\":[\"/component---src-templates-training-course-js-ce6d85848d6c1814c156.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-admin-ui-admin-ui-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-admin-ui-admin-ui-mdx-dae5a0a48c404065a431.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-admin-ui-quiz-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-admin-ui-quiz-mdx-769d6860f57bc8e93af6.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-basic-setup-basic-setup-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-basic-setup-basic-setup-mdx-4255f1c9ba76c96b2bb8.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-basic-setup-first-config-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-basic-setup-first-config-mdx-ebc4a285e304b8e6aa32.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-basic-setup-quiz-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-basic-setup-quiz-mdx-acff789b7e41885a00d3.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-basic-setup-run-curity-in-docker-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-basic-setup-run-curity-in-docker-mdx-afc45d04012d8ac98769.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-configuration-management-configuration-management-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-configuration-management-configuration-management-mdx-eefe69ba3f2dee6a1ade.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-configuration-management-quiz-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-configuration-management-quiz-mdx-c9082b37924b28cea9e4.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-an-overview-of-oauth-tools-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-an-overview-of-oauth-tools-mdx-1afd8bf962f929628980.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-configure-authenticator-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-configure-authenticator-mdx-f629986b4e37112eb858.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-configure-client-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-configure-client-mdx-cb558d40b683377421b1.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-expose-curity-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-expose-curity-mdx-6d22ef9023e854c50f1a.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-quiz-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-quiz-mdx-2c38434d7bd94a4d29a2.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-test-with-oauth-tools-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-test-with-oauth-tools-mdx-737075c13030e05114d0.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-testing-with-oauth-tools-introduction-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-oauth-tools-testing-with-oauth-tools-introduction-mdx-166b234764df24c39031.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-scim-quiz-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-scim-quiz-mdx-b1d36e7aa263d44607e9.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-scim-scim-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-scim-scim-mdx-a84151869b4a3c1678f4.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-sdks-plugin-types-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-sdks-plugin-types-mdx-c566336f10cfc13c47a4.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-sdks-quiz-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-sdks-quiz-mdx-ec80869840f2d04e2ee4.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-sdks-sdks-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-sdks-sdks-mdx-de80b4cf0b8cf007d491.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-the-phantom-token-flow-configuring-the-phantom-token-flow-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-the-phantom-token-flow-configuring-the-phantom-token-flow-mdx-9814bac9928271d9c37d.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-the-phantom-token-flow-quiz-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-the-phantom-token-flow-quiz-mdx-cc005b8e101114003027.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-the-phantom-token-flow-the-phantom-token-flow-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-the-phantom-token-flow-the-phantom-token-flow-mdx-b7e165d470bcfe9ee94a.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-token-issuance-how-to-configure-claims-in-tokens-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-token-issuance-how-to-configure-claims-in-tokens-mdx-4097efb60e5e4150e496.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-token-issuance-quiz-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-token-issuance-quiz-mdx-1a5aec48b5e7f101ac5d.js\"],\"component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-token-issuance-token-issuance-introduction-to-claims-and-scopes-mdx\":[\"/component---src-templates-training-course-lesson-js-content-file-path-src-training-pages-getting-started-token-issuance-token-issuance-introduction-to-claims-and-scopes-mdx-de0539bcd2131a157cd3.js\"],\"component---src-templates-video-post-js\":[\"/component---src-templates-video-post-js-1c37bf134e679c2fcead.js\"],\"component---src-templates-webinar-post-js\":[\"/component---src-templates-webinar-post-js-07552d28e9aeb5d59a9f.js\"],\"component---src-templates-words-from-our-team-interview-js\":[\"/component---src-templates-words-from-our-team-interview-js-5184a9fa800d166c46e0.js\"]}"; </script> <script nonce="5e78246357cfbb1bc118c84245311b69">window.___webpackCompilationHash="0be1d4807c457b5c5fe1";</script><script nonce="5e78246357cfbb1bc118c84245311b69" src="/webpack-runtime-0a2f15a99a9692ff17ce.js" async></script><script nonce="5e78246357cfbb1bc118c84245311b69" src="/framework-698c06806a800b7cf7a0.js" async></script><script nonce="5e78246357cfbb1bc118c84245311b69" src="/aaa5778d-375167b075701680ae9a.js" async></script><script nonce="5e78246357cfbb1bc118c84245311b69" src="/app-6cd5d01753c74c4ca40b.js" async></script><!-- slice-end id="_gatsby-scripts-1" --></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10