@import url("https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=Source+Sans+3:ital,wght@0,400;0,500;0,600;0,700;1,400&display=swap");html{height:100%}body{margin:0;min-height:100%}h2,h3,h4,h5{margin-top:1.5em}hr{margin:1em 0}hr.page-break{text-align:center;border:0}hr.page-break:before{content:"-----"}hr.page-break:after{content:attr(data-content) "-----"}p{margin:1em 0}li{margin:0.4em 0}.w{max-width:860px;margin:0 auto;padding:3.25rem 1.5rem 4rem}table,th,td{width:100%;border:thin solid black;border-collapse:collapse;padding:0.4em}div.highlighter-rouge pre code,pre code.highlighter-rouge{display:block;overflow-x:auto;padding:1em}blockquote{font-style:italic;border:thin solid black;padding:1em}blockquote p{margin:0}img{max-width:100%;display:block;margin:0 auto}html{--bg: #FFF;--bg-secondary: #f4f6f8;--headings: #111827;--text: #374151;--links: #2563eb;--highlight: #A5F3FC;--code-text: #9D174D;--share-text: #999}html[data-theme="dark"] html,html[data-theme="dark"] body{--headings: #74c0fc;--links: #91A7FF;--highlight: #41C7C7;--bg: #1f242A;--bg-secondary: #323945;--text: #adb5bd;--code-text: #91A7FF;--share-text: #C4C4C4}@media (prefers-color-scheme: dark){body[data-theme="auto"] html,body[data-theme="auto"] body{--headings: #74c0fc;--links: #91A7FF;--highlight: #41C7C7;--bg: #1f242A;--bg-secondary: #323945;--text: #adb5bd;--code-text: #91A7FF;--share-text: #C4C4C4}}html,body{background-color:var(--bg);color:var(--text)}h1,h2,h3,h4,h5,h6{color:var(--headings)}p,strong,b,em,small,li,hr,table,figcaption{color:var(--text)}.highlight,pre code,blockquote{border-radius:0.5em}blockquote{background-color:var(--bg-secondary);border:1px var(--border) solid}a{color:var(--links)}*:target{background-color:var(--bg-secondary)}html.transition,html.transition *,html.transition *:before,html.transition *:after{transition:all 250ms !important;transition-delay:0 !important}.theme-toggle{color:var(--text);background-color:transparent;padding:4px;cursor:pointer;margin:1em;position:fixed;right:0;top:0;border:2px transparent solid;outline:none}.theme-toggle:hover{color:var(--links);outline:none}.theme-toggle:focus{outline:none}.dashed{border-top:1px var(--text) dashed;margin:0.5em 0}mark{padding:0.2em 0.4em;background-color:var(--highlight);font-size:0.68em;letter-spacing:0.04em}.post-date{color:var(--secondary-text);font-size:0.8em}.home-date{font-family:monospace}.post-list-item a{text-decoration:none}.text-bold{font-weight:bold}.text-upcase{text-transform:uppercase}p code,li code{background-color:var(--bg-secondary);padding:0.2rem;color:var(--code-text);font-weight:bold}.post-title{margin-bottom:-1.5rem}.project-title{margin-bottom:0.8rem}.credits{font-size:0.8em;color:var(--text);margin:8em auto -4em auto;text-align:center}.credits a{color:var(--text);text-decoration:none;font-weight:bold}.credits a:hover{color:var(--links)}ul.horizontal-list{display:flex;margin-top:0;margin-left:0;padding-left:0;flex-wrap:wrap;list-style:none;gap:0.25rem 1.25rem}ul.horizontal-list li{display:inline;margin:0}ul.horizontal-list li a{text-decoration:none;font-weight:500;font-size:0.95rem}.card-grid{display:grid;grid-template-columns:repeat(2, minmax(0, 1fr));gap:1rem;margin:0;padding:0;list-style:none}.card{margin:0;padding:0;border:1px solid var(--card-border);border-radius:0.65rem;background-color:var(--bg-secondary);text-align:left;transition:border-color 160ms ease, background-color 160ms ease}.card .card-link{display:flex;flex-direction:column;gap:0.55rem;height:100%;padding:1.1rem 1.15rem 1.15rem;text-decoration:none;color:inherit}.card .card-link-static{cursor:default}.card .card-top{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:0.35rem 0.75rem}.card .header{color:var(--links);font-weight:600;font-size:1.02rem;line-height:1.35;flex:1 1 10rem}.card .card-time{color:var(--text-muted);font-family:"IBM Plex Mono", ui-monospace, monospace;font-size:0.78rem;letter-spacing:0.02em;white-space:nowrap}.card .card-meta{display:flex;flex-direction:column;gap:0.4rem}.card .card-stars{display:inline-flex;gap:0.08rem;line-height:1;font-size:0.85rem;letter-spacing:0.02em}.card .star{color:var(--star-off)}.card .star-on{color:var(--star-on)}.card .card-tags{display:flex;flex-wrap:wrap;gap:0.35rem}.card .body{margin:0;font-size:0.88rem;line-height:1.5;color:var(--text-muted)}.card hr{display:none}.card:hover{border-color:var(--links)}.card-static:hover{border-color:var(--card-border)}.chip{display:inline-block;padding:0.12em 0.48em;border-radius:0.28em;border:1px solid var(--chip-border);background:var(--chip-bg);color:var(--text);font-size:0.68rem;font-weight:500;letter-spacing:0.02em;line-height:1.35;white-space:nowrap}.chip-category{font-family:"IBM Plex Mono", ui-monospace, monospace;background:var(--highlight);border-color:transparent;color:var(--tag-text);letter-spacing:0.04em}.tag-track-pro{border-color:var(--chip-pro-border);color:var(--chip-pro-text)}.tag-track-hobby{border-color:var(--chip-hobby-border);color:var(--chip-hobby-text)}.tag-context-work{border-color:var(--chip-work-border);color:var(--chip-work-text)}.tag-context-academic{border-color:var(--chip-academic-border);color:var(--chip-academic-text)}.tag-context-both{border-color:var(--chip-both-border);color:var(--chip-both-text)}.chip-extra{opacity:0.9}.card-tag,mark.card-tag{display:inline-block;padding:0.15em 0.45em;border-radius:0.3em;background-color:var(--highlight);color:var(--tag-text);font-family:"IBM Plex Mono", ui-monospace, monospace;font-size:0.68rem;font-weight:500;letter-spacing:0.04em;line-height:1.3;white-space:nowrap}.tag-legend{margin:-0.2rem 0 1rem;color:var(--text-muted);font-size:0.82rem;line-height:1.5}.tag-legend code{font-family:"IBM Plex Mono", ui-monospace, monospace;font-size:0.78em;font-weight:500;background:transparent;padding:0;color:var(--text-muted)}@media screen and (max-width: 700px){.card-grid{grid-template-columns:1fr}}.highlight .hll{background-color:#515151}.highlight{background:#1A1F35;color:#f2f0ec}.highlight .c{color:#747369}.highlight .err{color:#f2777a}.highlight .k{color:#c9c}.highlight .l{color:#f99157}.highlight .n{color:#f2f0ec}.highlight .o{color:#6cc}.highlight .p{color:#f2f0ec}.highlight .ch{color:#747369}.highlight .cm{color:#747369}.highlight .cp{color:#747369}.highlight .cpf{color:#747369}.highlight .c1{color:#747369}.highlight .cs{color:#747369}.highlight .gd{color:#f2777a}.highlight .ge{font-style:italic}.highlight .gh{color:#f2f0ec;font-weight:bold}.highlight .gi{color:#9c9}.highlight .gp{color:#747369;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#66cccc;font-weight:bold}.highlight .kc{color:#c9c}.highlight .kd{color:#c9c}.highlight .kn{color:#6cc}.highlight .kp{color:#c9c}.highlight .kr{color:#c9c}.highlight .kt{color:#fc6}.highlight .ld{color:#9c9}.highlight .m{color:#f99157}.highlight .s{color:#9c9}.highlight .na{color:#69c}.highlight .nb{color:#f2f0ec}.highlight .nc{color:#fc6}.highlight .no{color:#f2777a}.highlight .nd{color:#6cc}.highlight .ni{color:#f2f0ec}.highlight .ne{color:#f2777a}.highlight .nf{color:#69c}.highlight .nl{color:#f2f0ec}.highlight .nn{color:#fc6}.highlight .nx{color:#69c}.highlight .py{color:#f2f0ec}.highlight .nt{color:#6cc}.highlight .nv{color:#f2777a}.highlight .ow{color:#6cc}.highlight .w{color:#f2f0ec}.highlight .mb{color:#f99157}.highlight .mf{color:#f99157}.highlight .mh{color:#f99157}.highlight .mi{color:#f99157}.highlight .mo{color:#f99157}.highlight .sa{color:#9c9}.highlight .sb{color:#9c9}.highlight .sc{color:#f2f0ec}.highlight .dl{color:#9c9}.highlight .sd{color:#747369}.highlight .s2{color:#9c9}.highlight .se{color:#f99157}.highlight .sh{color:#9c9}.highlight .si{color:#f99157}.highlight .sx{color:#9c9}.highlight .sr{color:#9c9}.highlight .s1{color:#9c9}.highlight .ss{color:#9c9}.highlight .bp{color:#f2f0ec}.highlight .fm{color:#69c}.highlight .vc{color:#f2777a}.highlight .vg{color:#f2777a}.highlight .vi{color:#f2777a}.highlight .vm{color:#f2777a}.highlight .il{color:#f99157}:root{--text-muted: #5c6570;--card-border: rgba(0, 0, 0, 0.14);--tag-text: #1a1a1a;--star-on: #d97706;--star-off: rgba(0, 0, 0, 0.18);--chip-bg: rgba(0, 0, 0, 0.03);--chip-border: rgba(0, 0, 0, 0.12);--chip-pro-border: #0f766e;--chip-pro-text: #0f766e;--chip-hobby-border: #be185d;--chip-hobby-text: #9d174d;--chip-work-border: #0369a1;--chip-work-text: #0369a1;--chip-academic-border: #b45309;--chip-academic-text: #b45309;--chip-both-border: #4b5563;--chip-both-text: #374151}html[data-theme="dark"]{--text-muted: #8b949e;--card-border: rgba(255, 255, 255, 0.12);--tag-text: #0d1117;--star-on: #fbbf24;--star-off: rgba(255, 255, 255, 0.18);--chip-bg: rgba(255, 255, 255, 0.04);--chip-border: rgba(255, 255, 255, 0.14);--chip-pro-border: #2dd4bf;--chip-pro-text: #5eead4;--chip-hobby-border: #f9a8d4;--chip-hobby-text: #fbcfe8;--chip-work-border: #7dd3fc;--chip-work-text: #bae6fd;--chip-academic-border: #fcd34d;--chip-academic-text: #fde68a;--chip-both-border: #9ca3af;--chip-both-text: #d1d5db}@media (prefers-color-scheme: dark){body[data-theme="auto"]{--text-muted: #8b949e;--card-border: rgba(255, 255, 255, 0.12);--tag-text: #0d1117;--star-on: #fbbf24;--star-off: rgba(255, 255, 255, 0.18);--chip-bg: rgba(255, 255, 255, 0.04);--chip-border: rgba(255, 255, 255, 0.14);--chip-pro-border: #2dd4bf;--chip-pro-text: #5eead4;--chip-hobby-border: #f9a8d4;--chip-hobby-text: #fbcfe8;--chip-work-border: #7dd3fc;--chip-work-text: #bae6fd;--chip-academic-border: #fcd34d;--chip-academic-text: #fde68a;--chip-both-border: #9ca3af;--chip-both-text: #d1d5db}}body{font-family:"Source Sans 3", "Segoe UI", sans-serif;font-size:1.05rem;line-height:1.6}pre,code{font-family:"IBM Plex Mono", ui-monospace, monospace;font-size:0.9rem}.w{max-width:860px;margin:0 auto;padding:3.25rem 1.5rem 4rem}header h1{margin:0.35em 0 0.2em;font-size:clamp(2rem, 4vw, 2.55rem);font-weight:700;letter-spacing:-0.02em;line-height:1.15}.site-desc{margin:0.4em 0 0.2em;max-width:42rem;color:var(--text-muted);font-size:1.02rem;line-height:1.55}.home-section{margin-top:2.4rem}.home-section h2{margin:0 0 0.9rem;font-size:1.2rem;font-weight:600;letter-spacing:0.01em}.home-section-featured h2{font-size:1.35rem}.home-section-notes{margin-top:2.8rem;opacity:0.92}.home-section-notes h2{font-size:1.05rem;color:var(--text-muted)}.home-section-archive h2{font-size:1.1rem}footer{margin-top:3rem}.dashed{margin:0.85em 0;opacity:0.55}mark:not(.card-tag){padding:0.2em 0.4em;font-family:"IBM Plex Mono", ui-monospace, monospace;font-size:0.68em;letter-spacing:0.04em}
