@import "https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap";@import "https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap";/*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:initial}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}:root{--theme-hue:0;--accent-hue:250;--accent-color:hsl(var(--accent-hue), 86%, 57%);--accent-color-hover:hsl(var(--accent-hue), 76%, 49%);--text-color-richer:hsl(var(--theme-hue), 0%, 5%);--text-color-normal:hsl(var(--theme-hue), 0%, 13%);--text-color-softer:hsl(var(--theme-hue), 0%, 33%);--border-color:hsl(var(--theme-hue), 0%, 73%);--border-color-softer:hsl(var(--theme-hue), 0%, 82%);--background-color:white;--background-color-softer:hsl(var(--theme-hue), 0%, 95%);--code-background:hsl(var(--theme-hue), 0%, 95%);--space-xs:0.5rem;--space-sm:0.75rem;--space-md:1.25rem;--space-lg:2rem;--space-xl:2.5rem;--space-2xl:3rem;--entry-list-gap:var(--space-md);--entry-card-padding:var(--space-md);--entry-header-gap:1rem;--entry-body-gap:var(--space-sm);--interactive-transition:0.15s ease}@media(prefers-color-scheme:dark){:root{--text-color-richer:hsl(var(--theme-hue), 0%, 95%);--text-color-normal:hsl(var(--theme-hue), 0%, 80%);--text-color-softer:hsl(var(--theme-hue), 0%, 67%);--border-color:hsl(var(--theme-hue), 0%, 27%);--border-color-softer:hsl(var(--theme-hue), 0%, 20%);--background-color:hsl(var(--theme-hue), 0%, 12%);--background-color-softer:hsl(var(--theme-hue), 0%, 18%);--code-background:hsl(var(--theme-hue), 0%, 5%);--accent-color:hsl(var(--accent-hue), 76%, 68%);--accent-color-hover:hsl(var(--accent-hue), 86%, 76%)}}html{scroll-behavior:smooth;font-size:16px}body{max-width:1e3px;margin:0 auto;font-size:1rem;line-height:1.5;font-weight:400;font-family:Inter,sans-serif;color:var(--text-color-normal);background-color:var(--background-color)}h1,h2,h3,h4,h5,h6{margin-top:var(--space-xl);margin-bottom:var(--space-sm);line-height:1.25}h1:first-child{margin-top:0}h1{font-weight:700;font-size:3rem;letter-spacing:-.1rem;margin-bottom:var(--space-md)}h2{font-weight:700;font-size:2.3rem;letter-spacing:-.05rem}h3{font-weight:700;font-size:1.7rem;letter-spacing:-.05rem}h4{font-weight:400;font-size:1.3rem}h5{font-weight:400;font-size:1rem}h6{font-weight:400;font-size:.7rem}.highlight{color:var(--accent-color)}@media(min-width:900px){html{font-size:18px}}a{color:var(--accent-color);transition:color var(--interactive-transition)}a:hover{color:var(--accent-color-hover)}button,.button{margin-top:0;margin-bottom:var(--space-sm)}input,textarea,select,fieldset{margin-top:0;margin-bottom:var(--space-md)}p{margin-top:0;margin-bottom:var(--space-md)}pre,blockquote,dl,figure,table,form{margin-top:0;margin-bottom:var(--space-lg)}ul,ol{margin-top:0;margin-bottom:var(--space-lg)}hr{margin-top:var(--space-xl);margin-bottom:var(--space-2xl);border-width:0;border-top:1px solid var(--border-color-softer)}blockquote{margin-left:0;margin-right:0;padding:0 0 0 1em;border-left:.25em solid var(--border-color-softer);color:var(--text-color-softer)}blockquote>:last-child{margin-bottom:0}ul{list-style:disc outside}ol{list-style:decimal outside}ol,ul{padding-left:1rem}ul ul,ul ol,ol ol,ol ul{font-size:100%;margin:1rem 0 1rem 2rem}li{margin-bottom:var(--space-xs)}table ul,table ol{margin-bottom:0}code{padding:.2rem .5rem;margin:0 .2rem;font-size:90%;white-space:nowrap;background:var(--code-background);border:1px solid var(--border-color-softer);border-radius:4px}pre>code{display:block;padding:1rem 1.5rem;white-space:pre;overflow:auto}table{width:100%;border-collapse:collapse}th,td{padding:12px 15px;text-align:left;border-bottom:1px solid var(--border-color-softer)}th:first-child,td:first-child{padding-left:0}th:last-child,td:last-child{padding-right:0}.u-x-overflow-box{width:100%;overflow-x:auto}.katex-display{width:100%;overflow-x:auto;overflow-y:hidden;padding-bottom:.4em}.u-x-overflow-box+:is(h2,h3,h4,h5,h6){margin-top:calc(var(--space-xl) - var(--space-lg))}.u-indent-cell{padding-left:15px}body{padding:var(--space-lg)}@media(max-width:640px){body{padding:var(--space-md)}}header{min-height:2rem}header a{color:var(--text-color-normal);font-weight:700;font-family:Roboto Mono,monospace,sans-serif;text-decoration:none}header #main-header{width:100%;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}header #main-header #logo svg{display:block;stroke:currentColor;width:2rem;height:2rem}header #menu-toggle-btn{display:none;color:var(--text-color-normal);transition:color var(--interactive-transition);height:2rem;width:2rem;margin:0;padding:0;background:0 0;border:none;border-radius:0;box-sizing:content-box}header #menu-toggle-btn svg{fill:currentColor}header #menu-toggle-btn #hamburger[hidden],header #menu-toggle-btn #x-mark[hidden]{display:none}header #menu-toggle-btn:hover{color:var(--accent-color-hover)}header #mobile-nav ul,header #desktop-nav ul{display:flex;list-style:none;margin:0;padding:0}header #mobile-nav ul li,header #desktop-nav ul li{margin:0}header #desktop-nav ul{flex-direction:row;gap:1rem}header #mobile-nav{display:none}header #mobile-nav ul{flex-direction:column;margin-top:1rem}header #mobile-nav ul li{text-align:right}@media screen and (max-width:500px){header #mobile-nav.active{display:block}}@media screen and (max-width:500px){header #menu-toggle-btn{display:block}header #desktop-nav{display:none}}main{margin:var(--space-lg)0}.site-footer{height:3rem;display:flex;justify-content:center;align-items:center}.link-chip-group{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-bottom:0}.link-chip{border:1px solid var(--border-color-softer);border-radius:4px;background-color:var(--background-color);color:var(--text-color-normal);text-decoration:none;transition:border-color var(--interactive-transition),background-color var(--interactive-transition)}.link-chip:hover{border-color:var(--accent-color);background-color:var(--background-color-softer);color:var(--text-color-normal)}.link-chip{display:inline-flex;align-items:center;gap:.375rem;padding:.25rem .625rem;font-size:.875rem;line-height:1.4}@media(max-width:640px){.link-chip{justify-content:center;padding:.375rem;line-height:1}.link-chip i{font-size:1rem}.link-chip-label{display:none}}#landing-container{display:flex;flex-direction:column;align-items:center}#landing-hero{display:flex;flex-direction:column;align-items:center;gap:var(--space-md)}#landing-greeting{text-align:left}#hi{margin-bottom:var(--space-xs)}#profile{display:block;width:192px;border-radius:100px;box-shadow:0 0 10px rgba(0,0,0,.3333333333)}@media(prefers-color-scheme:dark){#profile{box-shadow:0 0 10px rgba(255,255,255,.3333333333)}}#name{line-height:1;font-size:clamp(2.5rem,1.5rem + 4vw,4rem);font-weight:700;letter-spacing:-.1rem}#links{margin-top:var(--space-md);justify-content:center;width:100%}#description{margin-top:var(--space-lg);width:100%}@media(min-width:800px){#landing-hero{flex-direction:row;justify-content:center;gap:var(--space-lg)}#profile{width:292px;border-radius:150px}}.blog-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--entry-list-gap)}.blog-meta{margin-top:0;margin-bottom:var(--space-lg);font-size:.875rem;color:var(--text-color-softer)}.blog-back{margin-top:0;margin-bottom:var(--space-md);font-size:.875rem;color:var(--text-color-softer)}.blog-post-nav--end{margin-top:var(--space-lg)}.blog-post-nav--end .blog-back{margin-bottom:0}.blog-entry{margin:0;min-width:0}.blog-entry-link{border:1px solid var(--border-color-softer);border-radius:4px;background-color:var(--background-color);display:block;padding:var(--entry-card-padding);color:var(--text-color-normal);text-decoration:none;transition:border-color var(--interactive-transition),background-color var(--interactive-transition)}.blog-entry-link:hover{border-color:var(--accent-color);background-color:var(--background-color-softer);color:var(--text-color-normal)}.blog-entry-header{display:flex;justify-content:space-between;align-items:baseline;gap:var(--entry-header-gap);margin-bottom:var(--entry-body-gap)}@media(max-width:640px){.blog-entry-header{flex-direction:column;align-items:flex-start;gap:var(--space-xs)}}.blog-entry-header:last-child{margin-bottom:0}.blog-entry-title{min-width:0;font-weight:700}.blog-entry-date{font-size:.875rem;color:var(--text-color-softer);flex-shrink:0;white-space:nowrap}.blog-entry-keywords{display:flex;flex-wrap:wrap;gap:var(--space-xs);margin-bottom:var(--entry-body-gap)}.blog-entry-keywords:last-child{margin-bottom:0}.blog-entry-keyword{display:inline-block;padding:.125rem .5rem;border-radius:999px;font-size:.75rem;line-height:1.4;background-color:var(--background-color-softer);color:var(--text-color-softer);background-color:hsl(var(--accent-hue),86%,95%);color:var(--accent-color)}@media(prefers-color-scheme:dark){.blog-entry-keyword{background-color:hsl(var(--accent-hue),30%,22%);color:var(--accent-color)}}.software-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--entry-list-gap)}.software-card{margin:0;border:1px solid var(--border-color-softer);border-radius:4px;background-color:var(--background-color);display:block;padding:var(--entry-card-padding)}.software-card-header{display:flex;justify-content:space-between;align-items:baseline;gap:var(--entry-header-gap);margin-bottom:var(--entry-body-gap)}@media(max-width:640px){.software-card-header{flex-direction:column;align-items:flex-start;gap:var(--space-xs)}}.software-card-header:last-child{margin-bottom:0}.software-card-identity{display:flex;flex-wrap:wrap;align-items:baseline;gap:.375rem;min-width:0}.software-card-name{margin:0;min-width:0;font-size:1.3rem;line-height:1.25}.software-card-role{font-size:.875rem;color:var(--text-color-softer)}.software-card-role::before{content:"·";margin-right:.375rem;color:var(--text-color-softer)}.software-card-description{margin-top:0;margin-bottom:var(--entry-body-gap)}.software-card-meta{font-size:.875rem;color:var(--text-color-softer);display:flex;flex-shrink:0;align-items:center;gap:var(--space-xs)}.software-stage{display:inline-block;padding:.125rem .5rem;border-radius:999px;font-size:.75rem;line-height:1.4;background-color:var(--background-color-softer);color:var(--text-color-softer);text-transform:capitalize}.software-stage--production{display:inline-block;padding:.125rem .5rem;border-radius:999px;font-size:.75rem;line-height:1.4;background-color:var(--background-color-softer);color:var(--text-color-softer);background-color:hsl(var(--accent-hue),86%,95%);color:var(--accent-color)}@media(prefers-color-scheme:dark){.software-stage--production{background-color:hsl(var(--accent-hue),30%,22%);color:var(--accent-color)}}.software-language::before{content:"·";margin-right:var(--space-sm)}@media(max-width:640px){.software-card-identity{flex-direction:column;align-items:flex-start;gap:0}.software-card-role::before{content:none}.software-card-meta{flex-shrink:1;flex-wrap:wrap;row-gap:var(--space-xs)}}.publication-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--entry-list-gap)}.publication-card{margin:0;min-width:0}.publication-card-surface{border:1px solid var(--border-color-softer);border-radius:4px;background-color:var(--background-color);display:block;padding:var(--entry-card-padding)}.publication-card-link{border:1px solid var(--border-color-softer);border-radius:4px;background-color:var(--background-color);display:block;padding:var(--entry-card-padding);color:var(--text-color-normal);text-decoration:none;transition:border-color var(--interactive-transition),background-color var(--interactive-transition)}.publication-card-link:hover{border-color:var(--accent-color);background-color:var(--background-color-softer);color:var(--text-color-normal)}.publication-card-header{display:flex;justify-content:space-between;align-items:baseline;gap:var(--entry-header-gap);margin-bottom:var(--entry-body-gap)}@media(max-width:640px){.publication-card-header{flex-direction:column;align-items:flex-start;gap:var(--space-xs)}}.publication-card-header:last-child{margin-bottom:0}.publication-card-title{margin:0;min-width:0;font-size:1.3rem;line-height:1.25}.publication-card-year{font-size:.875rem;color:var(--text-color-softer);flex-shrink:0;white-space:nowrap}.publication-card-keywords{display:flex;flex-wrap:wrap;gap:var(--space-xs);margin-bottom:var(--entry-body-gap)}.publication-card-keywords:last-child{margin-bottom:0}.publication-keyword{display:inline-block;padding:.125rem .5rem;border-radius:999px;font-size:.75rem;line-height:1.4;background-color:var(--background-color-softer);color:var(--text-color-softer);background-color:hsl(var(--accent-hue),86%,95%);color:var(--accent-color)}@media(prefers-color-scheme:dark){.publication-keyword{background-color:hsl(var(--accent-hue),30%,22%);color:var(--accent-color)}}.publication-card-authors,.publication-card-venue{font-size:.875rem;color:var(--text-color-softer);margin:0}.publication-card-authors{margin-bottom:var(--space-xs)}