@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2)format("woff2"),url(/_astro/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2)format("woff2"),url(/_astro/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2)format("woff2"),url(/_astro/ibm-plex-mono-vietnamese-400-normal.DDuiU_S-.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2)format("woff2"),url(/_astro/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2)format("woff2"),url(/_astro/ibm-plex-mono-latin-400-normal.CvHOgSBP.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/ibm-plex-mono-cyrillic-ext-600-normal.V-xxqcpd.woff2)format("woff2"),url(/_astro/ibm-plex-mono-cyrillic-ext-600-normal.9HEixskS.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/ibm-plex-mono-cyrillic-600-normal.CTOM6hUh.woff2)format("woff2"),url(/_astro/ibm-plex-mono-cyrillic-600-normal.fLZuRloM.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/ibm-plex-mono-vietnamese-600-normal.D2EvbN8M.woff2)format("woff2"),url(/_astro/ibm-plex-mono-vietnamese-600-normal.iLQfcSjf.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/ibm-plex-mono-latin-ext-600-normal.D38SheWl.woff2)format("woff2"),url(/_astro/ibm-plex-mono-latin-ext-600-normal.DmB0ttJJ.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:600;src:url(/_astro/ibm-plex-mono-latin-600-normal.BgSNZQsw.woff2)format("woff2"),url(/_astro/ibm-plex-mono-latin-600-normal.DWFSQ4vo.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-sans-cyrillic-ext-400-normal.g30qAdWV.woff2)format("woff2"),url(/_astro/ibm-plex-sans-cyrillic-ext-400-normal.Dsrv2Tcn.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-sans-cyrillic-400-normal.DZqxrq2p.woff2)format("woff2"),url(/_astro/ibm-plex-sans-cyrillic-400-normal.BTotfTJu.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-sans-greek-400-normal._efipK4i.woff2)format("woff2"),url(/_astro/ibm-plex-sans-greek-400-normal.D9ESIMu3.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-sans-vietnamese-400-normal.DG4YqDda.woff2)format("woff2"),url(/_astro/ibm-plex-sans-vietnamese-400-normal.fK1oJ5dG.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-sans-latin-ext-400-normal.C5H60-Va.woff2)format("woff2"),url(/_astro/ibm-plex-sans-latin-ext-400-normal.RBey6euL.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-sans-latin-400-normal.CDDApCn2.woff2)format("woff2"),url(/_astro/ibm-plex-sans-latin-400-normal.CYLoc0-x.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--paper:#f4f2ec;--ink:#111;--grey-text:#4a4843;--accent:#c8102e;--mono:"IBM Plex Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;--sans:"IBM Plex Sans", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--border:2px solid var(--ink);--shadow:6px 6px 0 var(--ink);--shadow-sm:3px 3px 0 var(--ink);color-scheme:light}*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;text-size-adjust:100%}body{background:var(--paper);color:var(--ink);font-family:var(--sans);overflow-wrap:break-word;margin:0;font-size:1.0625rem;font-weight:400;line-height:1.6}h1,h2,h3,p,ul{margin:0}img{max-width:100%;height:auto;display:block}.nowrap{white-space:nowrap}.accent{color:var(--accent)}.sr-only{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}a{color:var(--ink);text-underline-offset:.2em;text-decoration:underline 1px}a:hover{text-decoration-thickness:2px}:focus-visible{outline:3px solid var(--accent);outline-offset:3px}.skip-link{z-index:10;background:var(--paper);border:var(--border);box-shadow:var(--shadow-sm);font-family:var(--mono);padding:.5rem .75rem;font-size:.9375rem;text-decoration:none;position:absolute;top:-10rem;left:.75rem}.skip-link:focus{top:.75rem}.page{max-width:1000px;margin:0 auto;padding:0 1rem}.bar{font-family:var(--mono);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem 1.5rem;padding:.75rem 0;font-size:.9375rem;display:flex}header.bar{border-bottom:var(--border)}footer.bar{border-top:var(--border);color:var(--grey-text);margin-top:2.5rem;padding:.5rem 0}.brand{letter-spacing:-.01em;align-items:center;gap:.5rem;font-size:1.1875rem;font-weight:600;line-height:1.2;text-decoration:none;display:inline-flex}.brand img{flex:none;width:28px;height:28px}.brand:hover span{text-underline-offset:.2em;text-decoration:underline 2px}.hero{padding:3.5rem 0 3rem}.wordmark{font-family:var(--mono);letter-spacing:-.03em;font-size:clamp(2.5rem,9vw,4.5rem);font-weight:600;line-height:1}.wordmark.not-found{letter-spacing:-.02em;font-size:clamp(1.75rem,6vw,3rem);line-height:1.15}.intro{max-width:60ch;color:var(--grey-text);margin-top:1.25rem}.prose{max-width:65ch;padding:3rem 0 1rem}.prose h1{font-family:var(--mono);letter-spacing:-.02em;font-size:clamp(1.75rem,6vw,2.5rem);font-weight:600;line-height:1.15}.prose .meta{color:var(--grey-text);font-family:var(--mono);margin-top:.5rem;font-size:.9375rem}.prose section{border-top:var(--border);margin-top:2rem;padding-top:1rem}.prose h2{font-family:var(--mono);font-size:1.125rem;font-weight:600;line-height:1.3}.prose p,.prose ul{margin-top:.75rem}.prose ul{padding-left:1.25rem}.prose li+li{margin-top:.25rem}.prose .back{margin-top:2.5rem}.projects{padding-top:1.75rem}.grid{grid-template-columns:1fr;align-items:start;gap:1.5rem;display:grid}.card{background:var(--paper);border:var(--border);min-width:0;box-shadow:var(--shadow);flex-direction:column;display:flex}.panel{background:var(--ink);justify-content:center;align-items:center;padding:.5rem;display:flex}.panel:focus-visible{outline-offset:-3px}.panel img{image-rendering:auto;background:#fff;width:100%}.card-body{border-top:var(--border);flex-direction:column;align-items:flex-start;gap:.625rem;padding:.75rem .875rem .875rem;display:flex}.card-body h3{font-family:var(--mono);font-size:1.125rem;font-weight:600;line-height:1.3}.card-body h3 a{text-decoration:none}.card-body h3 a:hover{text-decoration:underline 2px}.links{flex-wrap:wrap;gap:.625rem;padding:0;list-style:none;display:flex}.links a{background:var(--paper);border:var(--border);min-height:44px;box-shadow:var(--shadow-sm);font-family:var(--mono);align-items:center;gap:.4rem;padding:.375rem .625rem;font-size:.875rem;line-height:1.2;text-decoration:none;display:inline-flex}@media (pointer:fine) and (not (any-pointer:coarse)){.links a{min-height:38px}}.links a:hover{background:var(--ink);color:var(--paper)}.links a:active{box-shadow:none;transform:translate(3px,3px)}.icon{flex:none;display:block}.social{gap:.25rem;margin:0;padding:0;list-style:none;display:flex}.social a{width:44px;height:44px;color:var(--ink);border:2px solid #0000;place-items:center;display:grid}.social a:hover{border-color:var(--ink)}.social a:active{background:var(--ink);color:var(--paper)}@media (width>=760px){.page{padding:0 1.5rem}.grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}.links a:active{transform:none}}
