added public folder back to repo bc VPS struggles building it

-1
.gitignore
··· 1 - public/
+52
public/404.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + 4 + <head> 5 + <meta charset="utf-8"> 6 + <meta name="viewport" content="width=device-width, initial-scale=1"> 7 + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src-attr 'unsafe-inline'"> 8 + 9 + <title>Page not found | Guillermo Serrahima</title> 10 + 11 + <link rel="preload" href="https://vylion.com/fonts/FiraCode-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous"> 12 + <link rel="preload" href="https://vylion.com/fonts/FiraCode-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous"> 13 + <link rel="stylesheet" href="https://vylion.com/css/style.css?h=248e65e1431b5c897468"> 14 + <script src="https://vylion.com/js/auto-close-popover-on-resize.js?h=4ef87d6fc7b98b22e044" defer></script> 15 + <script src="https://vylion.com/js/copy-code-to-clipboard.js?h=6aac77c47d552a0ac847" defer></script> 16 + 17 + 18 + <meta name="robots" content="noindex, follow"> 19 + <meta name="theme-color" content="#211f1a"> 20 + <meta name="color-scheme" content="dark"> 21 + 22 + <meta property="og:type" content="website"> 23 + <meta property="og:site_name" content="Guillermo Serrahima"> 24 + <meta property="og:updated_time" content="2025-12-11T16:34:53.465815188+01:00"> 25 + </head> 26 + 27 + <body class="layout-center"> 28 + <header class="header"> 29 + <div class="header-container"> 30 + <span class="header-logo-container"> 31 + <a href="https://vylion.com"> 32 + <span class="logo">Guillermo Serrahima</span> 33 + </a> 34 + </span> 35 + </div> 36 + </header> 37 + <main id="main"> 38 + <section class="framed"> 39 + <h1>404: Page not found...</h1> 40 + <p>Sorry, this page doesn't exist. Go back <a href="https://vylion.com">home</a>?</p> 41 + </section> 42 + </main> 43 + <footer class="footer"> 44 + <p class="copyright"> 45 + <span>© <time>2025</time></span> 46 + <span>Powered by <a href="https://www.getzola.org">Zola</a></span> 47 + <span>Theme by <a href="https://eyalkalderon.com">ebkalderon</a></span> 48 + </p> 49 + </footer> 50 + </body> 51 + 52 + </html>
+1
public/css/style.css
··· 1 + @font-face{font-family:"Fira Code";font-style:normal;font-weight:400;font-display:swap;src:url("/fonts/FiraCode-Regular.woff2") format("woff2")}@font-face{font-family:"Fira Code";font-style:normal;font-weight:800;font-display:swap;src:url("/fonts/FiraCode-Bold.woff2") format("woff2")}:root{--font-size: 1rem;--line-height: 1.54em;--radius: 0}@media (max-width: 684px){:root{--font-size: 0.95rem}}:root,[data-theme=terminus]{--background-color: #363a4f;--text-color: #c6d0f5;--accent-color: #a6da95;--footnote-color: rgba(255, 255, 255, 0.5)}[data-theme=tokyo-night]{--background-color: #1a1b26;--text-color: #c0caf5;--accent-color: #7aa2f7;--footnote-color: rgba(192, 202, 245, 0.6)}[data-theme=solarized-dark]{--background-color: #002b36;--text-color: #839496;--accent-color: #268bd2;--footnote-color: rgba(131, 148, 150, 0.6)}[data-theme=nord]{--background-color: #2e3440;--text-color: #d8dee9;--accent-color: #5e81ac;--footnote-color: rgba(216, 222, 233, 0.6)}[data-theme=one-dark]{--background-color: #282c34;--text-color: #abb2bf;--accent-color: #61afef;--footnote-color: rgba(171, 178, 191, 0.6)}[data-theme=gruvbox-dark]{--background-color: #282828;--text-color: #ebdbb2;--accent-color: #fe8019;--footnote-color: rgba(235, 219, 178, 0.6)}[data-theme=oled-abyss]{--background-color: #000000;--text-color: #ffffff;--accent-color: #00d4ff;--footnote-color: rgba(255, 255, 255, 0.7)}[data-theme=solar-flare]{--background-color: #ffffff;--text-color: #1a1a1a;--accent-color: #ff4500;--footnote-color: rgba(26, 26, 26, 0.6)}html{box-sizing:border-box;accent-color:var(--accent-color);scrollbar-color:var(--accent-color) rgba(0,0,0,0)}@media (prefers-reduced-motion: no-preference){html{scroll-behavior:smooth}}*,*::before,*::after{box-sizing:inherit}body{margin:0;padding:0;font-family:"Fira Code",Monaco,Consolas,"Ubuntu Mono",monospace;font-size:var(--font-size);line-height:var(--line-height);background:var(--background-color);color:var(--text-color);text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-webkit-overflow-scrolling:touch;text-size-adjust:100%;font-feature-settings:"liga"}body.layout-left,body.layout-center,body.layout-full-width{display:flex;flex-direction:column;padding:40px;max-width:864px;min-height:100vh;border-right:1px solid color-mix(in srgb, var(--accent-color) 10%, rgba(0,0,0,0))}@media (max-width: 684px){body.layout-left,body.layout-center,body.layout-full-width{padding:20px}}body.layout-center,body.layout-full-width{border:none;margin:0 auto}body.layout-full-width{max-width:100%}main{overflow-wrap:break-word}h1{font-size:calc(var(--font-size)*1.45);letter-spacing:0}h2{font-size:calc(var(--font-size)*1.35);letter-spacing:0}h3{font-size:calc(var(--font-size)*1.15);letter-spacing:0}h4,h5,h6{font-size:calc(var(--font-size)*1);letter-spacing:0}h1,h2,h3,h4,h5,h6,p,ul,ol,img,figure,video,table{margin:25px 0}a{color:var(--accent-color);outline:none}a.read-more{text-decoration:none}button{position:relative;font:inherit;font-weight:bold;text-decoration:none;text-align:center;align-items:center;background:rgba(0,0,0,0);color:var(--accent-color);padding:5px 18px;border:4px solid var(--accent-color);border-radius:var(--radius);transition:background .15s linear;appearance:none;cursor:pointer;outline:none}button:hover{background:color-mix(in srgb, var(--accent-color) 15%, rgba(0,0,0,0))}a:focus-visible,button:focus-visible,input:focus-visible{outline:1px solid var(--accent-color);outline-offset:2px}input{border:1px solid var(--text-color);border-radius:var(--radius);padding:10px;background:rgba(0,0,0,0);color:var(--text-color);appearance:none}input[type=checkbox]{padding:10px;vertical-align:middle;box-shadow:inset 0 0 0 3px var(--background-color)}input[type=checkbox]:active{box-shadow:none}input[type=checkbox]:checked{background:var(--accent-color)}img,video{display:block;max-inline-size:100%;block-size:auto}figure{margin:0 auto;width:fit-content}figure img,figure video{margin:0 auto}figure:not(.mastodon-post) figcaption{background:var(--accent-color);color:var(--background-color);text-align:center;font-size:var(--font-size);font-weight:normal;margin-top:5px;padding:5px 8px;border-radius:0 0 var(--radius) var(--radius)}figure:not(.mastodon-post) figcaption a{color:var(--background-color)}figure:not(.mastodon-post) figcaption p:first-child{margin:0}ul,ol{margin-inline-start:4ch;padding:0}ul ul,ul ol,ol ul,ol ol{margin-block:5px}ul li,ol li{position:relative}ul li::marker,ol li::marker{color:var(--accent-color)}code{font-family:"Fira Code",Monaco,Consolas,"Ubuntu Mono",monospace !important;font-feature-settings:normal;background:color-mix(in srgb, var(--text-color) 5%, rgba(0,0,0,0));border:1px solid var(--code-border);padding:1px 6px;margin:0 2px;font-size:calc(var(--font-size)*.95);color:var(--accent-color)}code code{background:rgba(0,0,0,0);padding:0;margin:0}kbd{font-family:"Fira Code",Monaco,Consolas,"Ubuntu Mono",monospace !important;font-feature-settings:normal;background:color-mix(in srgb, var(--text-color) 5%, rgba(0,0,0,0));border:1px solid var(--code-border);padding:1px 6px;margin:0 2px;font-size:calc(var(--font-size)*.95);border-top:1px solid color-mix(in srgb, var(--accent-color) 25%, rgba(0,0,0,0));border-left:1px solid var(--accent-color);border-right:1px solid var(--accent-color);border-bottom:4px solid var(--accent-color);border-radius:4px}pre{tab-size:4;background:color-mix(in srgb, var(--text-color) 5%, rgba(0,0,0,0));color:var(--text-color);padding:10px;font-size:calc(var(--font-size)*.95) !important;overflow:auto;border-radius:var(--radius);border:1px solid color-mix(in srgb, var(--text-color) 10%, rgba(0,0,0,0))}pre code{background:unset;color:unset;margin:0;padding:0;border:none}pre code mark{display:block;min-width:fit-content}abbr{position:relative;text-decoration-style:dotted;text-decoration-color:var(--accent-color);cursor:help}sub{bottom:-.25em}sup{line-height:0;top:-.25em}mark{background:color-mix(in srgb, var(--accent-color) 45%, rgba(0,0,0,0));color:var(--text-color)}blockquote{position:relative;border-top:1px solid var(--accent-color);border-bottom:1px solid var(--accent-color);margin:0;padding:25px}blockquote::before{content:">";display:block;position:absolute;left:0;color:var(--accent-color)}blockquote p:first-child{margin-top:0}blockquote p:last-child{margin-bottom:0}table{border-collapse:collapse}table th,table td{border:2px solid var(--text-color);padding:10px}table th{border-style:solid;color:var(--text-color);text-align:left;text-transform:uppercase;letter-spacing:.04em}hr{width:100%;height:2px;border:none;background:color-mix(in srgb, var(--text-color) 50%, rgba(0,0,0,0))}details{position:relative;margin:25px 0;width:100%;border:1px solid var(--accent-color)}details>summary{padding:3px 10px;color:var(--accent-color);transition:background .15s linear}details>summary:hover{background:color-mix(in srgb, var(--accent-color) 10%, rgba(0,0,0,0))}details>summary::marker{content:none}details>summary::before{display:inline-block;content:"";border:.35rem solid rgba(0,0,0,0);border-top-color:var(--accent-color);margin-inline-start:.3em;margin-inline-end:.75rem;transform:rotate(-90deg);transition:transform .1s ease-out}details[open]>summary::before{transform:translateY(.15rem)}details>:not(img,pre>code,summary){margin-inline:15px}details>:not(img,pre>code,summary):first-of-type{margin-top:15px}details>:not(img,pre>code,summary):last-child{margin-bottom:15px}.header{display:flex;flex-direction:column}@media (max-width: 684px){.header{flex-direction:row}}.header-container{display:flex;align-items:center;justify-content:space-between;flex:1}.header-logo-container{display:flex;flex:1}.header-logo-container::after{content:"";display:block;margin-inline-start:8px;width:100%;background:repeating-linear-gradient(90deg, var(--accent-color), var(--accent-color) 2px, rgba(0,0,0,0) 0, rgba(0,0,0,0) 10px)}.header-logo-container a{flex:0 0 auto;max-width:100%;text-decoration:none}.logo{display:flex;align-items:center;padding:5px 10px;background:var(--accent-color);color:var(--background-color);font-weight:bold;text-decoration:none}@media print{.header{display:none}}.main-menu{display:flex;align-items:flex-start;justify-content:space-between;margin:20px 1px}@media (max-width: 684px){.main-menu{margin:0}}.main-menu-items{position:static;display:flex;flex-wrap:wrap;gap:10px 20px;overflow:visible;border:none;margin:0;padding-bottom:10px;width:100%;background:unset;list-style:none}@media (max-width: 684px){.main-menu-items{display:none}.main-menu-items:popover-open{--shadow-color: rgb(from var(--accent-color) r g b / 70%);color:var(--accent-color);background:var(--background-color);border:2px solid var(--accent-color);box-shadow:0 10px var(--shadow-color),-10px 10px var(--shadow-color),10px 10px var(--shadow-color);padding:10px;display:flex;column-gap:10px;flex-direction:column;margin-top:calc(40px + var(--line-height));margin-inline:auto 20px;max-width:33vw;width:fit-content}.main-menu-items>li>a{display:block;padding:5px}}.main-menu-dropdown-button{display:none;border:2px solid;margin-inline-start:10px;padding:3px 8px;height:100%}@media (max-width: 684px){.main-menu-dropdown-button{display:flex}}.main-menu-dropdown-button:after{content:"";border:.35rem solid rgba(0,0,0,0);border-top-color:var(--accent-color);margin-inline-start:.5em;transform:translateY(.15em)}.skip-to-content{--shadow-color: rgb(from var(--accent-color) r g b / 70%);color:var(--accent-color);background:var(--background-color);border:2px solid var(--accent-color);box-shadow:0 10px var(--shadow-color),-10px 10px var(--shadow-color),10px 10px var(--shadow-color);padding:10px;position:fixed;top:40px;left:-1vw;z-index:99;transform:translateX(-100vw);text-align:center}@media (max-width: 684px){.skip-to-content{top:20px}}.skip-to-content:focus{left:50%;transform:translateX(-50%);outline:none}.footer{padding:40px 0}.footer a{color:inherit}.footer .socials{padding-bottom:25px}@media print{.footer .socials{display:none}}.footer .socials ul{display:flex;flex-wrap:wrap;gap:5px;justify-content:center;margin:0;list-style:none}.footer .socials .social-link{display:flex;padding:.66rem}.footer .socials .social-link>svg{aspect-ratio:1/1;width:1.5rem;height:auto;margin:0 auto;fill:var(--footnote-color)}.footer .socials .social-link:hover{background:var(--accent-color)}.footer .socials .social-link:hover>svg{fill:var(--background-color)}.footer .copyright{text-align:center;margin:0;color:color-mix(in srgb, var(--text-color) 65%, rgba(0,0,0,0))}.footer .copyright>*{text-wrap:nowrap}.footer .copyright>*:not(:first-child)::before{content:":: "}.content ul:not(.post-meta){list-style:none}.content ul:not(.post-meta) li:not(:last-of-type){margin-bottom:3px}.content ul:not(.post-meta) li:not(:has(input))::before{content:"⦿";position:absolute;left:-20px;color:var(--accent-color)}.content ul:not(.post-meta) li>input{margin-inline-start:-4ch}.content ul:not(.post-meta) ul li:not(:has(input))::before{content:"■"}.content ul:not(.post-meta) ul ul li:not(:has(input))::before{content:"►"}.framed{border:1px solid var(--accent-color);padding:20px;margin:25px 0}.framed *:first-child{margin-top:0}.framed *:last-child{margin-bottom:0}.post{padding:30px 0;width:100%;text-align:left}.post:not(:last-of-type){border-bottom:1px solid color-mix(in srgb, var(--text-color) 10%, rgba(0,0,0,0))}.post-title{position:relative;margin-block:0 15px;padding-bottom:15px;border-bottom:3px dotted var(--accent-color);color:var(--accent-color)}.post-title::after{content:"";position:absolute;bottom:2px;display:block;width:100%;border-bottom:3px dotted var(--accent-color)}.post-title a{text-decoration:none}ul.post-meta{list-style:none;display:block;margin:0 0 8px;color:color-mix(in srgb, var(--text-color) 65%, rgba(0,0,0,0))}ul.post-meta>li{display:inline}ul.post-meta>li::before{content:""}ul.post-meta>li[role=separator]{user-select:none}ul.post-meta>li.draft-label{display:block;float:right;margin-top:-2px;padding-block:2px;padding-inline:8px;background-color:var(--accent-color);color:var(--background-color)}.post-tags{display:flex;flex-wrap:wrap;column-gap:8px;margin-bottom:20px;color:var(--accent-color)}.post-tags>[role=separator]{user-select:none}h1 .post-anchor,h2 .post-anchor,h3 .post-anchor,h4 .post-anchor,h5 .post-anchor,h6 .post-anchor{margin-inline-start:10px;opacity:0%;color:var(--accent-color);text-decoration:none;user-select:none}@media screen and (max-width: 684px){h1 .post-anchor,h2 .post-anchor,h3 .post-anchor,h4 .post-anchor,h5 .post-anchor,h6 .post-anchor{opacity:100%}}@media print{h1 .post-anchor,h2 .post-anchor,h3 .post-anchor,h4 .post-anchor,h5 .post-anchor,h6 .post-anchor{display:none}}h1:focus-within .post-anchor,h1:hover .post-anchor,h2:focus-within .post-anchor,h2:hover .post-anchor,h3:focus-within .post-anchor,h3:hover .post-anchor,h4:focus-within .post-anchor,h4:hover .post-anchor,h5:focus-within .post-anchor,h5:hover .post-anchor,h6:focus-within .post-anchor,h6:hover .post-anchor{opacity:100%}.footnote-reference{font-family:var(--serif-font);font-size:.7rem}.footnote-definition{color:var(--footnote-color);margin-block-end:.6rem}.footnote-definition sup{color:var(--accent-color);margin-inline-end:.15rem;font-size:.75rem}.footnote-definition p{display:inline}.footnotes{border-top:2px solid var(--footnote-color)}.footnotes .footnotes-list p{color:var(--footnote-color);text-align:start}@media print{.post-navigation{display:none}}.post-navigation-title{display:flex;text-align:center;position:relative;margin:45px 0 20px}.post-navigation-title h2{text-align:center;margin:0 auto;padding:5px 10px;background:var(--background-color);color:color-mix(in srgb var(--text-color) 30%, rgba(0,0,0,0));font-size:calc(var(--font-size)*.8);font-weight:normal;text-transform:uppercase;text-decoration:none;letter-spacing:.1em;z-index:1}.post-navigation-title hr{background:var(--accent-color);position:absolute;left:0;right:0;width:100%;margin-top:15px;z-index:0}.post-navigation-buttons{display:flex;align-items:center;justify-content:center;flex-flow:row wrap;gap:10px;padding-bottom:30px}.post-navigation-buttons>a{display:inline;text-align:center;text-decoration:none}:root{--code-border: color-mix(in srgb, var(--text-color) 10%, transparent)}.copy-button{position:absolute;top:6px;right:10px;padding:3px 8px;width:4.5rem;border:1px solid color-mix(in srgb, var(--accent-color) 15%, rgba(0,0,0,0));font-size:calc(var(--font-size)*.8);font-weight:normal;line-height:1em}@media print{.copy-button{display:none}}pre[data-lang]{display:block;position:relative;padding:0;overflow-y:hidden}pre[data-lang]::before{content:attr(data-lang);display:block;padding:6px 10px;border-bottom:1px solid var(--code-border);color:color-mix(in srgb, var(--text-color) 53%, rgba(0,0,0,0));font-size:calc(var(--font-size)*.8);text-transform:uppercase;line-height:21px}pre[data-lang] code[data-lang]{display:block;overflow-x:auto;padding:10px}pre[data-lang] code[data-lang][data-name]::before{content:attr(data-name);position:absolute;top:0;right:0;display:block;padding:6px 10px;max-width:60%;color:color-mix(in srgb, var(--text-color) 53%, rgba(0,0,0,0));font-size:calc(var(--font-size)*.8);line-height:21px;overflow:hidden;text-overflow:ellipsis}@media screen{pre[data-lang] code[data-lang]:has(.copy-button)::before{right:calc(4.5rem + 10px)}}pre[data-lang] code[data-lang] mark{margin-inline:-10px;padding-inline:10px;color:unset}pre[data-lang] code[data-lang] table{margin-block:0;width:100%;border-collapse:collapse}pre[data-lang] code[data-lang] table td,pre[data-lang] code[data-lang] table th,pre[data-lang] code[data-lang] table tr{border:none;padding:0}pre[data-lang] code[data-lang] table tr td:first-child{color:color-mix(in srgb, var(--text-color) 53%, rgba(0,0,0,0));text-align:end;user-select:none;padding-inline-end:20px}.pagination{margin-top:50px}@media print{.pagination{display:none}}.pagination ul{display:flex;align-items:center;justify-content:center;flex-flow:row wrap;padding-bottom:30px;list-style:none;margin:0}.pagination ul>*:not(:first-child)::before{content:"::";margin:0 10px}.pagination ul li{display:inline-flex}.pagination ul li a{display:inline-flex;text-wrap:nowrap;text-decoration:none}ul.taxonomy-list{list-style:none}ul.taxonomy-list>li{margin-block-end:1rem}.three-column{column-count:3}.two-column{column-count:2}:root{--alert-note-border: #F5F5F5;--alert-note-bg: #696969;--alert-note-code: #707070;--alert-tip-border: #A6E22E;--alert-tip-bg: #405A0C;--alert-tip-code: #50700F;--alert-info-border: #66D9EF;--alert-info-bg: #0B5666;--alert-info-code: #0D687D;--alert-important-border: var(--alert-info-border);--alert-important-bg: var(--alert-info-bg);--alert-important-code: var(--alert-info-code);--alert-warning-border: #EEC35E;--alert-warning-bg: #61470A;--alert-warning-code: #78580D;--alert-danger-border: #FD2774;--alert-danger-bg: #2D0111;--alert-danger-code: #5F0224;--alert-caution-border: var(--alert-danger-border);--alert-caution-bg: var(--alert-danger-bg);--alert-caution-code: var(--alert-danger-code)}.alert,.markdown-alert-caution,.markdown-alert-warning,.markdown-alert-important,.markdown-alert-tip,.markdown-alert-note{display:flex;align-items:flex-start;margin-block:25px;border-radius:var(--radius);border:1px solid;padding:25px}.alert-content,.markdown-alert-caution>p,.markdown-alert-warning>p,.markdown-alert-important>p,.markdown-alert-tip>p,.markdown-alert-note>p{flex:1;margin-inline-start:-2rem}.alert-content>:not(:first-child),.markdown-alert-caution>p>:not(:first-child),.markdown-alert-warning>p>:not(:first-child),.markdown-alert-important>p>:not(:first-child),.markdown-alert-tip>p>:not(:first-child),.markdown-alert-note>p>:not(:first-child){margin-block:1rem 0}.alert-content code,.markdown-alert-caution>p code,.markdown-alert-warning>p code,.markdown-alert-important>p code,.markdown-alert-tip>p code,.markdown-alert-note>p code{color:inherit}.alert-content strong,.markdown-alert-caution>p strong,.markdown-alert-warning>p strong,.markdown-alert-important>p strong,.markdown-alert-tip>p strong,.markdown-alert-note>p strong{font-weight:580}.alert-icon,.markdown-alert-caution::before,.markdown-alert-warning::before,.markdown-alert-important::before,.markdown-alert-tip::before,.markdown-alert-note::before{display:flex;align-items:center;margin-inline-end:.5rem;background-size:contain;background-repeat:no-repeat;aspect-ratio:1/1;width:1.5rem}.alert-title,.markdown-alert-caution>p::before,.markdown-alert-warning>p::before,.markdown-alert-important>p::before,.markdown-alert-tip>p::before,.markdown-alert-note>p::before{display:flex;align-items:center;margin-inline-start:2rem;font-weight:bold}.alert-icon-note,.markdown-alert-note::before{mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3E%3C/svg%3E")}.alert-icon-tip,.markdown-alert-tip::before{mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M480-78.258q-33.718 0-56.974-22.166-23.256-22.167-23.59-55.885h161.128q-.334 33.718-23.59 55.885Q513.718-78.258 480-78.258ZM318.257-210.515v-67.588h323.486v67.588H318.257Zm7.846-121.128q-67.692-42.487-106.896-109.134-39.205-66.648-39.205-147.479 0-123.769 88.149-211.884 88.149-88.115 211.967-88.115 123.817 0 211.849 88.115 88.031 88.115 88.031 211.884 0 80.831-38.999 147.479-39 66.647-107.102 109.134H326.103Zm21.927-67.588h264.351q46.311-32 73.17-81.681 26.859-49.68 26.859-107.144 0-96.918-68-164.765-68-67.846-164.564-67.846t-164.41 67.713q-67.846 67.712-67.846 164.725 0 57.52 26.859 107.259t73.581 81.739Zm131.97 0Z'/%3E%3C/svg%3E")}.alert-icon-info,.alert-icon-important,.markdown-alert-important::before{mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M479.789-288Q495-288 505.5-298.289q10.5-10.29 10.5-25.5Q516-339 505.711-349.5q-10.29-10.5-25.5-10.5Q465-360 454.5-349.711q-10.5 10.29-10.5 25.5Q444-309 454.289-298.5q10.29 10.5 25.5 10.5ZM444-432h72v-240h-72v240Zm36.276 336Q401-96 331-126q-70-30-122.5-82.5T126-330.958q-30-69.959-30-149.5Q96-560 126-629.5t82.5-122Q261-804 330.958-834q69.959-30 149.5-30Q560-864 629.5-834t122 82.5Q804-699 834-629.276q30 69.725 30 149Q864-401 834-331q-30 70-82.5 122.5T629.276-126q-69.725 30-149 30ZM480-168q130 0 221-91t91-221q0-130-91-221t-221-91q-130 0-221 91t-91 221q0 130 91 221t221 91Zm0-312Z'/%3E%3C/svg%3E")}.alert-icon-warning,.markdown-alert-warning::before{mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M109-120q-11 0-20-5.5T75-140q-5-9-5.5-19.5T75-180l370-640q6-10 15.5-15t19.5-5q10 0 19.5 5t15.5 15l370 640q6 10 5.5 20.5T885-140q-5 9-14 14.5t-20 5.5H109Zm69-80h604L480-720 178-200Zm302-40q17 0 28.5-11.5T520-280q0-17-11.5-28.5T480-320q-17 0-28.5 11.5T440-280q0 17 11.5 28.5T480-240Zm0-120q17 0 28.5-11.5T520-400v-120q0-17-11.5-28.5T480-560q-17 0-28.5 11.5T440-520v120q0 17 11.5 28.5T480-360Zm0-100Z'/%3E%3C/svg%3E")}.alert-icon-danger,.alert-icon-caution,.markdown-alert-caution::before{mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M239.256-400q0 58.091 27.975 108.995t76.13 81.237q-5.616-8.513-8.487-18.398-2.872-9.885-2.872-19.167 1.333-26.436 12.153-50.307 10.821-23.872 31.41-43.461L480-443.921l105.819 102.82q18.923 19.311 29.885 43.321 10.961 24.011 12.294 50.447 0 9.282-2.872 19.167-2.871 9.885-7.82 18.398 47.488-30.333 75.796-81.237Q721.41-341.909 721.41-400q0-47.622-19.258-93.169-19.259-45.547-53.998-82.549-19.951 13.41-42.202 19.859Q583.7-549.41 561-549.41q-62.448 0-105.108-38.039-42.661-38.038-51.225-98.628v-9.744q-39.385 31.949-69.898 67.68-30.513 35.73-51.987 74.166t-32.5 77.464Q239.256-437.483 239.256-400ZM480-349.539l-57.436 56.436q-12.154 11.821-17.731 26.029-5.577 14.208-5.577 29.074 0 32.769 23.498 55.757 23.497 22.987 57.246 22.987 33.432 0 57.421-22.906 23.989-22.906 23.989-55.561 0-16.162-6.116-30.162-6.116-13.999-17.454-25.154l-57.84-56.5Zm-11.002-469.022V-708q0 38.637 26.832 64.819 26.831 26.183 65.17 26.183 15.609 0 30.818-5.923 15.208-5.923 28.131-17.718l22.615-24.102q67.564 44.128 106.999 114.917 39.435 70.79 39.435 150.156 0 128.206-89.846 218.103Q609.307-91.668 480-91.668q-129.027 0-218.68-89.652-89.652-89.653-89.652-218.68 0-119.178 79.371-232.447t217.959-186.114Z'/%3E%3C/svg%3E")}.alert.note,.note.markdown-alert-caution,.note.markdown-alert-warning,.note.markdown-alert-important,.note.markdown-alert-tip,.note.markdown-alert-note{border-color:var(--alert-note-border);background-color:color-mix(in srgb, var(--alert-note-bg) 15%, rgba(0,0,0,0))}.alert.note>.alert-content>p>code,.note.markdown-alert-caution>.alert-content>p>code,.markdown-alert-caution.note>p>p>code,.note.markdown-alert-warning>.alert-content>p>code,.markdown-alert-warning.note>p>p>code,.note.markdown-alert-important>.alert-content>p>code,.markdown-alert-important.note>p>p>code,.note.markdown-alert-tip>.alert-content>p>code,.markdown-alert-tip.note>p>p>code,.note.markdown-alert-note>.alert-content>p>code,.markdown-alert-note.note>p>p>code{background-color:var(--alert-note-code)}.alert.note a,.note.markdown-alert-caution a,.note.markdown-alert-warning a,.note.markdown-alert-important a,.note.markdown-alert-tip a,.note.markdown-alert-note a{color:var(--alert-note-border)}.alert.note a code,.note.markdown-alert-caution a code,.note.markdown-alert-warning a code,.note.markdown-alert-important a code,.note.markdown-alert-tip a code,.note.markdown-alert-note a code{background-color:var(--alert-note-bg)}.alert.note .alert-title,.alert.note .markdown-alert-caution>p::before,.note.markdown-alert-caution .alert-title,.note.markdown-alert-caution .markdown-alert-caution>p::before,.alert.note .markdown-alert-warning>p::before,.note.markdown-alert-caution .markdown-alert-warning>p::before,.note.markdown-alert-warning .alert-title,.note.markdown-alert-warning .markdown-alert-caution>p::before,.note.markdown-alert-warning .markdown-alert-warning>p::before,.alert.note .markdown-alert-important>p::before,.note.markdown-alert-caution .markdown-alert-important>p::before,.note.markdown-alert-warning .markdown-alert-important>p::before,.note.markdown-alert-important .alert-title,.note.markdown-alert-important .markdown-alert-caution>p::before,.note.markdown-alert-important .markdown-alert-warning>p::before,.note.markdown-alert-important .markdown-alert-important>p::before,.alert.note .markdown-alert-tip>p::before,.note.markdown-alert-caution .markdown-alert-tip>p::before,.note.markdown-alert-warning .markdown-alert-tip>p::before,.note.markdown-alert-important .markdown-alert-tip>p::before,.note.markdown-alert-tip .alert-title,.note.markdown-alert-tip .markdown-alert-caution>p::before,.note.markdown-alert-tip .markdown-alert-warning>p::before,.note.markdown-alert-tip .markdown-alert-important>p::before,.note.markdown-alert-tip .markdown-alert-tip>p::before,.alert.note .markdown-alert-note>p::before,.note.markdown-alert-caution .markdown-alert-note>p::before,.note.markdown-alert-warning .markdown-alert-note>p::before,.note.markdown-alert-important .markdown-alert-note>p::before,.note.markdown-alert-tip .markdown-alert-note>p::before,.note.markdown-alert-note .alert-title,.note.markdown-alert-note .markdown-alert-caution>p::before,.note.markdown-alert-note .markdown-alert-warning>p::before,.note.markdown-alert-note .markdown-alert-important>p::before,.note.markdown-alert-note .markdown-alert-tip>p::before,.note.markdown-alert-note .markdown-alert-note>p::before{color:var(--alert-note-border)}.alert.note .alert-icon,.alert.note .markdown-alert-caution::before,.note.markdown-alert-caution .alert-icon,.note.markdown-alert-caution .markdown-alert-caution::before,.alert.note .markdown-alert-warning::before,.note.markdown-alert-caution .markdown-alert-warning::before,.note.markdown-alert-warning .alert-icon,.note.markdown-alert-warning .markdown-alert-caution::before,.note.markdown-alert-warning .markdown-alert-warning::before,.alert.note .markdown-alert-important::before,.note.markdown-alert-caution .markdown-alert-important::before,.note.markdown-alert-warning .markdown-alert-important::before,.note.markdown-alert-important .alert-icon,.note.markdown-alert-important .markdown-alert-caution::before,.note.markdown-alert-important .markdown-alert-warning::before,.note.markdown-alert-important .markdown-alert-important::before,.alert.note .markdown-alert-tip::before,.note.markdown-alert-caution .markdown-alert-tip::before,.note.markdown-alert-warning .markdown-alert-tip::before,.note.markdown-alert-important .markdown-alert-tip::before,.note.markdown-alert-tip .alert-icon,.note.markdown-alert-tip .markdown-alert-caution::before,.note.markdown-alert-tip .markdown-alert-warning::before,.note.markdown-alert-tip .markdown-alert-important::before,.note.markdown-alert-tip .markdown-alert-tip::before,.alert.note .markdown-alert-note::before,.note.markdown-alert-caution .markdown-alert-note::before,.note.markdown-alert-warning .markdown-alert-note::before,.note.markdown-alert-important .markdown-alert-note::before,.note.markdown-alert-tip .markdown-alert-note::before,.note.markdown-alert-note .alert-icon,.note.markdown-alert-note .markdown-alert-caution::before,.note.markdown-alert-note .markdown-alert-warning::before,.note.markdown-alert-note .markdown-alert-important::before,.note.markdown-alert-note .markdown-alert-tip::before,.note.markdown-alert-note .markdown-alert-note::before{background-color:var(--alert-note-border)}.alert.tip,.tip.markdown-alert-caution,.tip.markdown-alert-warning,.tip.markdown-alert-important,.tip.markdown-alert-tip,.tip.markdown-alert-note{border-color:var(--alert-tip-border);background-color:color-mix(in srgb, var(--alert-tip-bg) 15%, rgba(0,0,0,0))}.alert.tip>.alert-content>p>code,.tip.markdown-alert-caution>.alert-content>p>code,.markdown-alert-caution.tip>p>p>code,.tip.markdown-alert-warning>.alert-content>p>code,.markdown-alert-warning.tip>p>p>code,.tip.markdown-alert-important>.alert-content>p>code,.markdown-alert-important.tip>p>p>code,.tip.markdown-alert-tip>.alert-content>p>code,.markdown-alert-tip.tip>p>p>code,.tip.markdown-alert-note>.alert-content>p>code,.markdown-alert-note.tip>p>p>code{background-color:var(--alert-tip-code)}.alert.tip a,.tip.markdown-alert-caution a,.tip.markdown-alert-warning a,.tip.markdown-alert-important a,.tip.markdown-alert-tip a,.tip.markdown-alert-note a{color:var(--alert-tip-border)}.alert.tip a code,.tip.markdown-alert-caution a code,.tip.markdown-alert-warning a code,.tip.markdown-alert-important a code,.tip.markdown-alert-tip a code,.tip.markdown-alert-note a code{background-color:var(--alert-tip-bg)}.alert.tip .alert-title,.alert.tip .markdown-alert-caution>p::before,.tip.markdown-alert-caution .alert-title,.tip.markdown-alert-caution .markdown-alert-caution>p::before,.alert.tip .markdown-alert-warning>p::before,.tip.markdown-alert-caution .markdown-alert-warning>p::before,.tip.markdown-alert-warning .alert-title,.tip.markdown-alert-warning .markdown-alert-caution>p::before,.tip.markdown-alert-warning .markdown-alert-warning>p::before,.alert.tip .markdown-alert-important>p::before,.tip.markdown-alert-caution .markdown-alert-important>p::before,.tip.markdown-alert-warning .markdown-alert-important>p::before,.tip.markdown-alert-important .alert-title,.tip.markdown-alert-important .markdown-alert-caution>p::before,.tip.markdown-alert-important .markdown-alert-warning>p::before,.tip.markdown-alert-important .markdown-alert-important>p::before,.alert.tip .markdown-alert-tip>p::before,.tip.markdown-alert-caution .markdown-alert-tip>p::before,.tip.markdown-alert-warning .markdown-alert-tip>p::before,.tip.markdown-alert-important .markdown-alert-tip>p::before,.tip.markdown-alert-tip .alert-title,.tip.markdown-alert-tip .markdown-alert-caution>p::before,.tip.markdown-alert-tip .markdown-alert-warning>p::before,.tip.markdown-alert-tip .markdown-alert-important>p::before,.tip.markdown-alert-tip .markdown-alert-tip>p::before,.alert.tip .markdown-alert-note>p::before,.tip.markdown-alert-caution .markdown-alert-note>p::before,.tip.markdown-alert-warning .markdown-alert-note>p::before,.tip.markdown-alert-important .markdown-alert-note>p::before,.tip.markdown-alert-tip .markdown-alert-note>p::before,.tip.markdown-alert-note .alert-title,.tip.markdown-alert-note .markdown-alert-caution>p::before,.tip.markdown-alert-note .markdown-alert-warning>p::before,.tip.markdown-alert-note .markdown-alert-important>p::before,.tip.markdown-alert-note .markdown-alert-tip>p::before,.tip.markdown-alert-note .markdown-alert-note>p::before{color:var(--alert-tip-border)}.alert.tip .alert-icon,.alert.tip .markdown-alert-caution::before,.tip.markdown-alert-caution .alert-icon,.tip.markdown-alert-caution .markdown-alert-caution::before,.alert.tip .markdown-alert-warning::before,.tip.markdown-alert-caution .markdown-alert-warning::before,.tip.markdown-alert-warning .alert-icon,.tip.markdown-alert-warning .markdown-alert-caution::before,.tip.markdown-alert-warning .markdown-alert-warning::before,.alert.tip .markdown-alert-important::before,.tip.markdown-alert-caution .markdown-alert-important::before,.tip.markdown-alert-warning .markdown-alert-important::before,.tip.markdown-alert-important .alert-icon,.tip.markdown-alert-important .markdown-alert-caution::before,.tip.markdown-alert-important .markdown-alert-warning::before,.tip.markdown-alert-important .markdown-alert-important::before,.alert.tip .markdown-alert-tip::before,.tip.markdown-alert-caution .markdown-alert-tip::before,.tip.markdown-alert-warning .markdown-alert-tip::before,.tip.markdown-alert-important .markdown-alert-tip::before,.tip.markdown-alert-tip .alert-icon,.tip.markdown-alert-tip .markdown-alert-caution::before,.tip.markdown-alert-tip .markdown-alert-warning::before,.tip.markdown-alert-tip .markdown-alert-important::before,.tip.markdown-alert-tip .markdown-alert-tip::before,.alert.tip .markdown-alert-note::before,.tip.markdown-alert-caution .markdown-alert-note::before,.tip.markdown-alert-warning .markdown-alert-note::before,.tip.markdown-alert-important .markdown-alert-note::before,.tip.markdown-alert-tip .markdown-alert-note::before,.tip.markdown-alert-note .alert-icon,.tip.markdown-alert-note .markdown-alert-caution::before,.tip.markdown-alert-note .markdown-alert-warning::before,.tip.markdown-alert-note .markdown-alert-important::before,.tip.markdown-alert-note .markdown-alert-tip::before,.tip.markdown-alert-note .markdown-alert-note::before{background-color:var(--alert-tip-border)}.alert.info,.info.markdown-alert-caution,.info.markdown-alert-warning,.info.markdown-alert-important,.info.markdown-alert-tip,.info.markdown-alert-note{border-color:var(--alert-info-border);background-color:color-mix(in srgb, var(--alert-info-bg) 15%, rgba(0,0,0,0))}.alert.info>.alert-content>p>code,.info.markdown-alert-caution>.alert-content>p>code,.markdown-alert-caution.info>p>p>code,.info.markdown-alert-warning>.alert-content>p>code,.markdown-alert-warning.info>p>p>code,.info.markdown-alert-important>.alert-content>p>code,.markdown-alert-important.info>p>p>code,.info.markdown-alert-tip>.alert-content>p>code,.markdown-alert-tip.info>p>p>code,.info.markdown-alert-note>.alert-content>p>code,.markdown-alert-note.info>p>p>code{background-color:var(--alert-info-code)}.alert.info a,.info.markdown-alert-caution a,.info.markdown-alert-warning a,.info.markdown-alert-important a,.info.markdown-alert-tip a,.info.markdown-alert-note a{color:var(--alert-info-border)}.alert.info a code,.info.markdown-alert-caution a code,.info.markdown-alert-warning a code,.info.markdown-alert-important a code,.info.markdown-alert-tip a code,.info.markdown-alert-note a code{background-color:var(--alert-info-bg)}.alert.info .alert-title,.alert.info .markdown-alert-caution>p::before,.info.markdown-alert-caution .alert-title,.info.markdown-alert-caution .markdown-alert-caution>p::before,.alert.info .markdown-alert-warning>p::before,.info.markdown-alert-caution .markdown-alert-warning>p::before,.info.markdown-alert-warning .alert-title,.info.markdown-alert-warning .markdown-alert-caution>p::before,.info.markdown-alert-warning .markdown-alert-warning>p::before,.alert.info .markdown-alert-important>p::before,.info.markdown-alert-caution .markdown-alert-important>p::before,.info.markdown-alert-warning .markdown-alert-important>p::before,.info.markdown-alert-important .alert-title,.info.markdown-alert-important .markdown-alert-caution>p::before,.info.markdown-alert-important .markdown-alert-warning>p::before,.info.markdown-alert-important .markdown-alert-important>p::before,.alert.info .markdown-alert-tip>p::before,.info.markdown-alert-caution .markdown-alert-tip>p::before,.info.markdown-alert-warning .markdown-alert-tip>p::before,.info.markdown-alert-important .markdown-alert-tip>p::before,.info.markdown-alert-tip .alert-title,.info.markdown-alert-tip .markdown-alert-caution>p::before,.info.markdown-alert-tip .markdown-alert-warning>p::before,.info.markdown-alert-tip .markdown-alert-important>p::before,.info.markdown-alert-tip .markdown-alert-tip>p::before,.alert.info .markdown-alert-note>p::before,.info.markdown-alert-caution .markdown-alert-note>p::before,.info.markdown-alert-warning .markdown-alert-note>p::before,.info.markdown-alert-important .markdown-alert-note>p::before,.info.markdown-alert-tip .markdown-alert-note>p::before,.info.markdown-alert-note .alert-title,.info.markdown-alert-note .markdown-alert-caution>p::before,.info.markdown-alert-note .markdown-alert-warning>p::before,.info.markdown-alert-note .markdown-alert-important>p::before,.info.markdown-alert-note .markdown-alert-tip>p::before,.info.markdown-alert-note .markdown-alert-note>p::before{color:var(--alert-info-border)}.alert.info .alert-icon,.alert.info .markdown-alert-caution::before,.info.markdown-alert-caution .alert-icon,.info.markdown-alert-caution .markdown-alert-caution::before,.alert.info .markdown-alert-warning::before,.info.markdown-alert-caution .markdown-alert-warning::before,.info.markdown-alert-warning .alert-icon,.info.markdown-alert-warning .markdown-alert-caution::before,.info.markdown-alert-warning .markdown-alert-warning::before,.alert.info .markdown-alert-important::before,.info.markdown-alert-caution .markdown-alert-important::before,.info.markdown-alert-warning .markdown-alert-important::before,.info.markdown-alert-important .alert-icon,.info.markdown-alert-important .markdown-alert-caution::before,.info.markdown-alert-important .markdown-alert-warning::before,.info.markdown-alert-important .markdown-alert-important::before,.alert.info .markdown-alert-tip::before,.info.markdown-alert-caution .markdown-alert-tip::before,.info.markdown-alert-warning .markdown-alert-tip::before,.info.markdown-alert-important .markdown-alert-tip::before,.info.markdown-alert-tip .alert-icon,.info.markdown-alert-tip .markdown-alert-caution::before,.info.markdown-alert-tip .markdown-alert-warning::before,.info.markdown-alert-tip .markdown-alert-important::before,.info.markdown-alert-tip .markdown-alert-tip::before,.alert.info .markdown-alert-note::before,.info.markdown-alert-caution .markdown-alert-note::before,.info.markdown-alert-warning .markdown-alert-note::before,.info.markdown-alert-important .markdown-alert-note::before,.info.markdown-alert-tip .markdown-alert-note::before,.info.markdown-alert-note .alert-icon,.info.markdown-alert-note .markdown-alert-caution::before,.info.markdown-alert-note .markdown-alert-warning::before,.info.markdown-alert-note .markdown-alert-important::before,.info.markdown-alert-note .markdown-alert-tip::before,.info.markdown-alert-note .markdown-alert-note::before{background-color:var(--alert-info-border)}.alert.warning,.warning.markdown-alert-caution,.warning.markdown-alert-warning,.warning.markdown-alert-important,.warning.markdown-alert-tip,.warning.markdown-alert-note{border-color:var(--alert-warning-border);background-color:color-mix(in srgb, var(--alert-warning-bg) 15%, rgba(0,0,0,0))}.alert.warning>.alert-content>p>code,.warning.markdown-alert-caution>.alert-content>p>code,.markdown-alert-caution.warning>p>p>code,.warning.markdown-alert-warning>.alert-content>p>code,.markdown-alert-warning.warning>p>p>code,.warning.markdown-alert-important>.alert-content>p>code,.markdown-alert-important.warning>p>p>code,.warning.markdown-alert-tip>.alert-content>p>code,.markdown-alert-tip.warning>p>p>code,.warning.markdown-alert-note>.alert-content>p>code,.markdown-alert-note.warning>p>p>code{background-color:var(--alert-warning-code)}.alert.warning a,.warning.markdown-alert-caution a,.warning.markdown-alert-warning a,.warning.markdown-alert-important a,.warning.markdown-alert-tip a,.warning.markdown-alert-note a{color:var(--alert-warning-border)}.alert.warning a code,.warning.markdown-alert-caution a code,.warning.markdown-alert-warning a code,.warning.markdown-alert-important a code,.warning.markdown-alert-tip a code,.warning.markdown-alert-note a code{background-color:var(--alert-warning-bg)}.alert.warning .alert-title,.alert.warning .markdown-alert-caution>p::before,.warning.markdown-alert-caution .alert-title,.warning.markdown-alert-caution .markdown-alert-caution>p::before,.alert.warning .markdown-alert-warning>p::before,.warning.markdown-alert-caution .markdown-alert-warning>p::before,.warning.markdown-alert-warning .alert-title,.warning.markdown-alert-warning .markdown-alert-caution>p::before,.warning.markdown-alert-warning .markdown-alert-warning>p::before,.alert.warning .markdown-alert-important>p::before,.warning.markdown-alert-caution .markdown-alert-important>p::before,.warning.markdown-alert-warning .markdown-alert-important>p::before,.warning.markdown-alert-important .alert-title,.warning.markdown-alert-important .markdown-alert-caution>p::before,.warning.markdown-alert-important .markdown-alert-warning>p::before,.warning.markdown-alert-important .markdown-alert-important>p::before,.alert.warning .markdown-alert-tip>p::before,.warning.markdown-alert-caution .markdown-alert-tip>p::before,.warning.markdown-alert-warning .markdown-alert-tip>p::before,.warning.markdown-alert-important .markdown-alert-tip>p::before,.warning.markdown-alert-tip .alert-title,.warning.markdown-alert-tip .markdown-alert-caution>p::before,.warning.markdown-alert-tip .markdown-alert-warning>p::before,.warning.markdown-alert-tip .markdown-alert-important>p::before,.warning.markdown-alert-tip .markdown-alert-tip>p::before,.alert.warning .markdown-alert-note>p::before,.warning.markdown-alert-caution .markdown-alert-note>p::before,.warning.markdown-alert-warning .markdown-alert-note>p::before,.warning.markdown-alert-important .markdown-alert-note>p::before,.warning.markdown-alert-tip .markdown-alert-note>p::before,.warning.markdown-alert-note .alert-title,.warning.markdown-alert-note .markdown-alert-caution>p::before,.warning.markdown-alert-note .markdown-alert-warning>p::before,.warning.markdown-alert-note .markdown-alert-important>p::before,.warning.markdown-alert-note .markdown-alert-tip>p::before,.warning.markdown-alert-note .markdown-alert-note>p::before{color:var(--alert-warning-border)}.alert.warning .alert-icon,.alert.warning .markdown-alert-caution::before,.warning.markdown-alert-caution .alert-icon,.warning.markdown-alert-caution .markdown-alert-caution::before,.alert.warning .markdown-alert-warning::before,.warning.markdown-alert-caution .markdown-alert-warning::before,.warning.markdown-alert-warning .alert-icon,.warning.markdown-alert-warning .markdown-alert-caution::before,.warning.markdown-alert-warning .markdown-alert-warning::before,.alert.warning .markdown-alert-important::before,.warning.markdown-alert-caution .markdown-alert-important::before,.warning.markdown-alert-warning .markdown-alert-important::before,.warning.markdown-alert-important .alert-icon,.warning.markdown-alert-important .markdown-alert-caution::before,.warning.markdown-alert-important .markdown-alert-warning::before,.warning.markdown-alert-important .markdown-alert-important::before,.alert.warning .markdown-alert-tip::before,.warning.markdown-alert-caution .markdown-alert-tip::before,.warning.markdown-alert-warning .markdown-alert-tip::before,.warning.markdown-alert-important .markdown-alert-tip::before,.warning.markdown-alert-tip .alert-icon,.warning.markdown-alert-tip .markdown-alert-caution::before,.warning.markdown-alert-tip .markdown-alert-warning::before,.warning.markdown-alert-tip .markdown-alert-important::before,.warning.markdown-alert-tip .markdown-alert-tip::before,.alert.warning .markdown-alert-note::before,.warning.markdown-alert-caution .markdown-alert-note::before,.warning.markdown-alert-warning .markdown-alert-note::before,.warning.markdown-alert-important .markdown-alert-note::before,.warning.markdown-alert-tip .markdown-alert-note::before,.warning.markdown-alert-note .alert-icon,.warning.markdown-alert-note .markdown-alert-caution::before,.warning.markdown-alert-note .markdown-alert-warning::before,.warning.markdown-alert-note .markdown-alert-important::before,.warning.markdown-alert-note .markdown-alert-tip::before,.warning.markdown-alert-note .markdown-alert-note::before{background-color:var(--alert-warning-border)}.alert.danger,.danger.markdown-alert-caution,.danger.markdown-alert-warning,.danger.markdown-alert-important,.danger.markdown-alert-tip,.danger.markdown-alert-note{border-color:var(--alert-danger-border);background-color:color-mix(in srgb, var(--alert-danger-bg) 15%, rgba(0,0,0,0))}.alert.danger>.alert-content>p>code,.danger.markdown-alert-caution>.alert-content>p>code,.markdown-alert-caution.danger>p>p>code,.danger.markdown-alert-warning>.alert-content>p>code,.markdown-alert-warning.danger>p>p>code,.danger.markdown-alert-important>.alert-content>p>code,.markdown-alert-important.danger>p>p>code,.danger.markdown-alert-tip>.alert-content>p>code,.markdown-alert-tip.danger>p>p>code,.danger.markdown-alert-note>.alert-content>p>code,.markdown-alert-note.danger>p>p>code{background-color:var(--alert-danger-code)}.alert.danger a,.danger.markdown-alert-caution a,.danger.markdown-alert-warning a,.danger.markdown-alert-important a,.danger.markdown-alert-tip a,.danger.markdown-alert-note a{color:var(--alert-danger-border)}.alert.danger a code,.danger.markdown-alert-caution a code,.danger.markdown-alert-warning a code,.danger.markdown-alert-important a code,.danger.markdown-alert-tip a code,.danger.markdown-alert-note a code{background-color:var(--alert-danger-bg)}.alert.danger .alert-title,.alert.danger .markdown-alert-caution>p::before,.danger.markdown-alert-caution .alert-title,.danger.markdown-alert-caution .markdown-alert-caution>p::before,.alert.danger .markdown-alert-warning>p::before,.danger.markdown-alert-caution .markdown-alert-warning>p::before,.danger.markdown-alert-warning .alert-title,.danger.markdown-alert-warning .markdown-alert-caution>p::before,.danger.markdown-alert-warning .markdown-alert-warning>p::before,.alert.danger .markdown-alert-important>p::before,.danger.markdown-alert-caution .markdown-alert-important>p::before,.danger.markdown-alert-warning .markdown-alert-important>p::before,.danger.markdown-alert-important .alert-title,.danger.markdown-alert-important .markdown-alert-caution>p::before,.danger.markdown-alert-important .markdown-alert-warning>p::before,.danger.markdown-alert-important .markdown-alert-important>p::before,.alert.danger .markdown-alert-tip>p::before,.danger.markdown-alert-caution .markdown-alert-tip>p::before,.danger.markdown-alert-warning .markdown-alert-tip>p::before,.danger.markdown-alert-important .markdown-alert-tip>p::before,.danger.markdown-alert-tip .alert-title,.danger.markdown-alert-tip .markdown-alert-caution>p::before,.danger.markdown-alert-tip .markdown-alert-warning>p::before,.danger.markdown-alert-tip .markdown-alert-important>p::before,.danger.markdown-alert-tip .markdown-alert-tip>p::before,.alert.danger .markdown-alert-note>p::before,.danger.markdown-alert-caution .markdown-alert-note>p::before,.danger.markdown-alert-warning .markdown-alert-note>p::before,.danger.markdown-alert-important .markdown-alert-note>p::before,.danger.markdown-alert-tip .markdown-alert-note>p::before,.danger.markdown-alert-note .alert-title,.danger.markdown-alert-note .markdown-alert-caution>p::before,.danger.markdown-alert-note .markdown-alert-warning>p::before,.danger.markdown-alert-note .markdown-alert-important>p::before,.danger.markdown-alert-note .markdown-alert-tip>p::before,.danger.markdown-alert-note .markdown-alert-note>p::before{color:var(--alert-danger-border)}.alert.danger .alert-icon,.alert.danger .markdown-alert-caution::before,.danger.markdown-alert-caution .alert-icon,.danger.markdown-alert-caution .markdown-alert-caution::before,.alert.danger .markdown-alert-warning::before,.danger.markdown-alert-caution .markdown-alert-warning::before,.danger.markdown-alert-warning .alert-icon,.danger.markdown-alert-warning .markdown-alert-caution::before,.danger.markdown-alert-warning .markdown-alert-warning::before,.alert.danger .markdown-alert-important::before,.danger.markdown-alert-caution .markdown-alert-important::before,.danger.markdown-alert-warning .markdown-alert-important::before,.danger.markdown-alert-important .alert-icon,.danger.markdown-alert-important .markdown-alert-caution::before,.danger.markdown-alert-important .markdown-alert-warning::before,.danger.markdown-alert-important .markdown-alert-important::before,.alert.danger .markdown-alert-tip::before,.danger.markdown-alert-caution .markdown-alert-tip::before,.danger.markdown-alert-warning .markdown-alert-tip::before,.danger.markdown-alert-important .markdown-alert-tip::before,.danger.markdown-alert-tip .alert-icon,.danger.markdown-alert-tip .markdown-alert-caution::before,.danger.markdown-alert-tip .markdown-alert-warning::before,.danger.markdown-alert-tip .markdown-alert-important::before,.danger.markdown-alert-tip .markdown-alert-tip::before,.alert.danger .markdown-alert-note::before,.danger.markdown-alert-caution .markdown-alert-note::before,.danger.markdown-alert-warning .markdown-alert-note::before,.danger.markdown-alert-important .markdown-alert-note::before,.danger.markdown-alert-tip .markdown-alert-note::before,.danger.markdown-alert-note .alert-icon,.danger.markdown-alert-note .markdown-alert-caution::before,.danger.markdown-alert-note .markdown-alert-warning::before,.danger.markdown-alert-note .markdown-alert-important::before,.danger.markdown-alert-note .markdown-alert-tip::before,.danger.markdown-alert-note .markdown-alert-note::before{background-color:var(--alert-danger-border)}.markdown-alert-note{border-color:var(--alert-note-border);background-color:color-mix(in srgb, var(--alert-note-bg) 15%, rgba(0,0,0,0))}.markdown-alert-note::before{content:"";background-color:var(--alert-note-border);margin-inline-start:25px}.markdown-alert-note>p{margin-inline-start:unset}.markdown-alert-note>p::before{content:"NOTE";color:var(--alert-note-border);margin-block-end:1rem}.markdown-alert-note>p>code{background-color:var(--alert-note-code)}.markdown-alert-note a{color:var(--alert-note-border)}.markdown-alert-note a code{background-color:var(--alert-note-bg)}.markdown-alert-tip{border-color:var(--alert-tip-border);background-color:color-mix(in srgb, var(--alert-tip-bg) 15%, rgba(0,0,0,0))}.markdown-alert-tip::before{content:"";background-color:var(--alert-tip-border);margin-inline-start:25px}.markdown-alert-tip>p{margin-inline-start:unset}.markdown-alert-tip>p::before{content:"TIP";color:var(--alert-tip-border);margin-block-end:1rem}.markdown-alert-tip>p>code{background-color:var(--alert-tip-code)}.markdown-alert-tip a{color:var(--alert-tip-border)}.markdown-alert-tip a code{background-color:var(--alert-tip-bg)}.markdown-alert-important{border-color:var(--alert-important-border);background-color:color-mix(in srgb, var(--alert-important-bg) 15%, rgba(0,0,0,0))}.markdown-alert-important::before{content:"";background-color:var(--alert-important-border);margin-inline-start:25px}.markdown-alert-important>p{margin-inline-start:unset}.markdown-alert-important>p::before{content:"IMPORTANT";color:var(--alert-important-border);margin-block-end:1rem}.markdown-alert-important>p>code{background-color:var(--alert-important-code)}.markdown-alert-important a{color:var(--alert-important-border)}.markdown-alert-important a code{background-color:var(--alert-important-bg)}.markdown-alert-warning{border-color:var(--alert-warning-border);background-color:color-mix(in srgb, var(--alert-warning-bg) 15%, rgba(0,0,0,0))}.markdown-alert-warning::before{content:"";background-color:var(--alert-warning-border);margin-inline-start:25px}.markdown-alert-warning>p{margin-inline-start:unset}.markdown-alert-warning>p::before{content:"WARNING";color:var(--alert-warning-border);margin-block-end:1rem}.markdown-alert-warning>p>code{background-color:var(--alert-warning-code)}.markdown-alert-warning a{color:var(--alert-warning-border)}.markdown-alert-warning a code{background-color:var(--alert-warning-bg)}.markdown-alert-caution{border-color:var(--alert-caution-border);background-color:color-mix(in srgb, var(--alert-caution-bg) 15%, rgba(0,0,0,0))}.markdown-alert-caution::before{content:"";background-color:var(--alert-caution-border);margin-inline-start:25px}.markdown-alert-caution>p{margin-inline-start:unset}.markdown-alert-caution>p::before{content:"CAUTION";color:var(--alert-caution-border);margin-block-end:1rem}.markdown-alert-caution>p>code{background-color:var(--alert-caution-code)}.markdown-alert-caution a{color:var(--alert-caution-border)}.markdown-alert-caution a code{background-color:var(--alert-caution-bg)}figure.mastodon-post{position:relative;border:1px solid var(--accent-color);margin:0;padding:60px 25px 25px}figure.mastodon-post::before{content:"> From Mastodon:";position:absolute;top:20px;left:20px;display:block;color:var(--accent-color);font-weight:bold}figure.mastodon-post blockquote{padding:unset;border:unset;overflow-wrap:anywhere}figure.mastodon-post blockquote::before{content:none}figure.mastodon-post figcaption{margin-top:25px}.references-list p{text-indent:-2.4rem;margin-inline-start:2.4rem}.wide-container{margin:0}@media (max-width: 684px){.wide-container{overflow-x:auto}}.main-menu-items{position:relative}.main-menu-items .theme-selector{position:relative;margin-left:auto}.main-menu-items .theme-selector .theme-trigger{text-decoration:none;cursor:pointer;padding:2px 4px;border-radius:3px;transition:all .15s ease;color:var(--text-color)}[data-theme=solar-flare] .main-menu-items .theme-selector .theme-trigger{color:#1a1a1a;background:rgba(26,26,26,.05)}[data-theme=solar-flare] .main-menu-items .theme-selector .theme-trigger:hover{background:rgba(255,69,0,.1);color:#ff4500}[data-theme=oled-abyss] .main-menu-items .theme-selector .theme-trigger{color:#fff}[data-theme=oled-abyss] .main-menu-items .theme-selector .theme-trigger:hover{color:#00d4ff}.main-menu-items .theme-selector .theme-trigger:hover{color:var(--accent-color)}.main-menu-items .theme-selector .theme-dropdown{position:absolute;top:100%;right:0;z-index:100;display:none;min-width:160px;margin:0;padding:10px;list-style:none;background:#2a2a2a;border:2px solid var(--accent-color);box-shadow:0 10px color-mix(in srgb, var(--accent-color) 70%, rgba(0,0,0,0)),-10px 10px color-mix(in srgb, var(--accent-color) 70%, rgba(0,0,0,0)),10px 10px color-mix(in srgb, var(--accent-color) 70%, rgba(0,0,0,0))}.main-menu-items .theme-selector .theme-dropdown.show{display:block}.main-menu-items .theme-selector .theme-dropdown li{margin:0}.main-menu-items .theme-selector .theme-dropdown a{display:block;padding:5px 8px;color:#e0e0e0;text-decoration:none;transition:all .15s ease;border-radius:3px}.main-menu-items .theme-selector .theme-dropdown a:hover{background:color-mix(in srgb, var(--accent-color) 15%, rgba(0,0,0,0));color:#fff}.main-menu-items .theme-selector .theme-dropdown a.current{color:var(--accent-color);background:color-mix(in srgb, var(--accent-color) 10%, rgba(0,0,0,0));font-weight:bold}.main-menu-items .theme-selector .theme-dropdown a.current::before{content:"→ "}@media (max-width: 684px){.main-menu-items .theme-selector .theme-dropdown{position:static;margin:10px 0 0 0;box-shadow:none;border:1px solid var(--accent-color)}.main-menu-items .theme-selector .theme-dropdown.show{display:block}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}
+160
public/cv/index.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + 4 + <head> 5 + <meta charset="utf-8"> 6 + <meta name="viewport" content="width=device-width, initial-scale=1"> 7 + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src-attr 'unsafe-inline'"> 8 + 9 + <title>My CV | Guillermo Serrahima</title> 10 + 11 + <link rel="preload" href="https://vylion.com/fonts/FiraCode-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous"> 12 + <link rel="preload" href="https://vylion.com/fonts/FiraCode-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous"> 13 + <link rel="stylesheet" href="https://vylion.com/css/style.css?h=248e65e1431b5c897468"> 14 + <script src="https://vylion.com/js/auto-close-popover-on-resize.js?h=4ef87d6fc7b98b22e044" defer></script> 15 + <script src="https://vylion.com/js/copy-code-to-clipboard.js?h=6aac77c47d552a0ac847" defer></script> 16 + 17 + <link rel="canonical" href="https://vylion.com/cv/"> 18 + 19 + <meta name="robots" content="index, follow"> 20 + <meta name="theme-color" content="#211f1a"> 21 + <meta name="color-scheme" content="dark"> 22 + 23 + <meta property="og:title" content="My CV"> 24 + <meta property="og:type" content="article"> 25 + <meta property="og:url" content="https://vylion.com/cv/"> 26 + <meta property="og:site_name" content="Guillermo Serrahima"> 27 + <meta property="og:updated_time" content="2025-12-11T16:34:53.465143902+01:00"> 28 + </head> 29 + 30 + <body class="layout-center"> 31 + <header class="header"> 32 + <div class="header-container"> 33 + <span class="header-logo-container"> 34 + <a href="https://vylion.com"> 35 + <span class="logo">Guillermo Serrahima</span> 36 + </a> 37 + </span> 38 + </div> 39 + </header> 40 + <main id="main"> 41 + <article class="post content"> 42 + <header> 43 + <h1 class="post-title"> 44 + <a href="https://vylion.com/cv/">My CV</a> 45 + </h1> 46 + <ul class="post-meta hidden"> 47 + </ul> 48 + </header> 49 + 50 + <h1 id="who-am-i">Who am I</h1> 51 + <p>I am Guillermo Serrahima, a Software Engineer from the area of Barcelona, where I currently live. I graduated from the <a href="https://www.upc.edu/en">Polytechnic University of Barcelona</a> with a <code>Degree in Informatics Engineering</code> in 2018.</p> 52 + <p>I am most comfortable when I am working with <code>C++</code>, <code>Java</code>, <code>Python</code> and <code>Rust</code> code. I am familiar with <code>Git</code>, <code>Linux</code>, and the command line. In my day to day I use <strong>Arch Linux</strong> as my main <abbr title="Operative System">OS</abbr>.</p> 53 + <p>In addition, I have worked in the past with other languages like <code>Golang</code>, <code>C</code>, <code>C#</code>. I have worked on projects that used <code>PostgreSQL</code>, and I maintain <code>SQLite</code> and <code>MySQL</code> databases on my personal servers (depending on the scope.) I have used testing frameworks like <code>GoogleTest</code> and <code>Pytest</code>, and used CI/CD pipelines like <code>Jenkins</code> and <code>GitHub CI/CD</code>. I also regularly use <code>Docker</code> containers on both a profesional environment and my personal servers.</p> 54 + <h1 id="languages">Languages</h1> 55 + <p>I speak <code>Spanish</code> and <code>Catalan</code> natively, and I obtained a <strong>C1</strong> level recognition in <code>English</code> through the <abbr title="Certificate in Advanced English">CAE</abbr> in 2012.</p> 56 + <h1 id="previous-experience">Previous Experience</h1> 57 + <h3 id="ansys-now-part-of-synopsys">Ansys (now part of Synopsys)</h3> 58 + <ul> 59 + <li>Location: Madrid (remote)</li> 60 + <li>Position: R&amp;D Engineer</li> 61 + <li>Projects: 62 + <ul> 63 + <li>Developing a software tool on Python, to allow configuration of model-based physics simuations by clients with no code knowledge required, by way of drag-and-drop design.</li> 64 + <li>Refactoring a Dash Mantine wrapper library for Python, with the goal of open-sourcing said library.</li> 65 + </ul> 66 + </li> 67 + <li>Tools: Python, Pytest, Poetry, GitHub CI/CD, GitHub Actions, Docker, WSL, Windows</li> 68 + <li>Period: 2024 Aug. - 2025 Nov.</li> 69 + </ul> 70 + <h3 id="verbio-now-verbio-by-capacity">Verbio (now Verbio by Capacity)</h3> 71 + <ul> 72 + <li>Location: Barcelona (remote)</li> 73 + <li>Position: Backend Developer</li> 74 + <li>Projects: 75 + <ul> 76 + <li>Developing a GRPC API gateway for a SaaS product written in Rust during the initial stages of commercialization of the product.</li> 77 + <li>Developing client tools written in Python for integrating AWS storage with the SaaS product.</li> 78 + <li>Developing Terraform deployment scripts for hosting the different components of the SaaS product on AWS infrastructure.</li> 79 + <li>Extension of the internal REST API and database backend for a Dashboard of product metrics.</li> 80 + </ul> 81 + </li> 82 + <li>Tools: Jetbrains CLion (with Rust plugin), Cargo, GitLab CI/CD, Terraform, Python, Docker, Linux</li> 83 + <li>Period: 2022 Jun. - 2024 Jul.</li> 84 + </ul> 85 + <h3 id="qad-dynasys">QAD DynaSys</h3> 86 + <ul> 87 + <li>Location: Barcelona (remote)</li> 88 + <li>Position: Software Developer</li> 89 + <li>Projects: 90 + <ul> 91 + <li>Refactoring of a C++ desktop app to allow servicing the desktop app as a SaaS product.</li> 92 + <li>Developing a C#-based frontend for interfacing with the C++ desktop app code.</li> 93 + </ul> 94 + </li> 95 + <li>Tools: Visual Studio, Windows</li> 96 + <li>Period: 2021 Jun. - 2022 Jun.</li> 97 + </ul> 98 + <h3 id="capitole-consulting">Capitole Consulting</h3> 99 + <ul> 100 + <li>Location: Barcelona (remote)</li> 101 + <li>Position: Software Developer</li> 102 + <li>Projects: 103 + <ul> 104 + <li>Developing a Python tool for the processing of analysis results and generation of PDF reports.</li> 105 + <li>Refactoring of the analysis results data structures for use in the previous tool, and improve maintainability.</li> 106 + <li>Fixing bugs and performance issues in a C++ application.</li> 107 + </ul> 108 + </li> 109 + <li>Period: 2021 Jan. - Jun.</li> 110 + </ul> 111 + <h3 id="hp-inc">HP Inc.</h3> 112 + <ul> 113 + <li>Location: Barcelona</li> 114 + <li>Position: Junior SDET (2018), Junior DevOps (2019)</li> 115 + <li>Projects: 116 + <ul> 117 + <li>Developing C++ unit and integration tests.</li> 118 + <li>Maintaining several Jenkins instances as a private CI/CD pipeline solution.</li> 119 + </ul> 120 + </li> 121 + <li>Tools: GoogleTest, VS Code, Jenkins, Jira, Linux</li> 122 + <li>Period: Sep. 2018 - Sep. 2020</li> 123 + </ul> 124 + <h1 id="miscellanea">Miscellanea</h1> 125 + <p>I host several tiny personal servers (recycled computers at home + a cloud VPS) with services for my own needs. Some of the services I host are:</p> 126 + <ul> 127 + <li>An instance of <a href="https://nextcloud.com/">Nextcloud</a> (a cloud drive solution) at <a href="https://cloud.sepo.family">cloud.sepo.family</a></li> 128 + <li>An instance of <a href="https://goauthentik.io/">Authentik</a> (an <abbr title="Single Sign-On">SSO</abbr> solution) at <a href="https://login.sepo.family">login.sepo.family</a></li> 129 + <li>Several private instances of <a href="https://www.portainer.io/">Portainer</a> <abbr title="Community Edition">CE</abbr> (one for each of my servers)</li> 130 + <li>A private instance of <a href="https://rustdesk.com/">RustDesk</a></li> 131 + <li>A <abbr title="Personal Data Server">PDS</abbr> <abbr title="Authenticated Transfer Protocol">ATProto</abbr> server for hosting my own <a href="https://bsky.app/profile/did:plc:hyyqbqqhpxt2bnn7s2e2iuxd">profile</a></li> 132 + <li>A knot server on <code>knot1.tngl.vylion.com</code> for <a href="https://tangled.org/did:plc:hyyqbqqhpxt2bnn7s2e2iuxd">my own</a> <a href="https://tangled.org/">Tangled</a> repos</li> 133 + </ul> 134 + <p>I currently use a custom built keyboard running my own firmware developed in C++ with <a href="https://qmk.fm/">QMK</a>.</p> 135 + <p>In the past I have developed <a href="https://github.com/vylion/velascobot">a Markov chain bot</a> for <a href="https://telegram.org/">Telegram</a>.</p> 136 + <p>I want to work on the following projects next:</p> 137 + <ul> 138 + <li>Fill my personal site with content.</li> 139 + <li>Set up an <a href="https://anubis.techaro.lol/">Anubis</a> instance in front of my personal site.</li> 140 + <li>Set up a private instance of Jenkins for personal use.</li> 141 + <li>Set up my own Spindle instance as a Tangled CI/CD pipeline for my personal Tangled projects.</li> 142 + <li>Learn JavaScript, TypeScript and React for fullstack development.</li> 143 + </ul> 144 + <h1 id="contact">Contact</h1> 145 + <p>I can be contacted by email at <code>gserrahima at mailbox.org</code>.</p> 146 + <p>My phone number is <code>(+ ES Prefix) 637 911 884</code>.</p> 147 + <p>My address is <code>Carrer Ignasi Iglesias 78, 2-2</code>, in <code>Esplugues de Llobregat</code>, with postal code <code>08950</code> (in Spain, Europe.)</p> 148 + 149 + </article> 150 + </main> 151 + <footer class="footer"> 152 + <p class="copyright"> 153 + <span>© <time>2025</time></span> 154 + <span>Powered by <a href="https://www.getzola.org">Zola</a></span> 155 + <span>Theme by <a href="https://eyalkalderon.com">ebkalderon</a></span> 156 + </p> 157 + </footer> 158 + </body> 159 + 160 + </html>
+10
public/elasticlunr.min.js
··· 1 + /** 2 + * elasticlunr - http://weixsong.github.io 3 + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.6 4 + * 5 + * Copyright (C) 2017 Oliver Nightingale 6 + * Copyright (C) 2017 Wei Song 7 + * MIT Licensed 8 + * @license 9 + */ 10 + !function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u<s.length;u++){var a=s[u];r[a]=this.pipeline.run(t.tokenizer(e[a]))}var l={};for(var c in o){var d=r[c]||r.any;if(d){var f=this.fieldSearch(d,c,o),h=o[c].boost;for(var p in f)f[p]=f[p]*h;for(var p in f)p in l?l[p]+=f[p]:l[p]=f[p]}}var v,g=[];for(var p in l)v={ref:p,score:l[p]},this.documentStore.hasDoc(p)&&(v.doc=this.documentStore.getDoc(p)),g.push(v);return g.sort(function(e,t){return t.score-e.score}),g},t.Index.prototype.fieldSearch=function(e,t,n){var i=n[t].bool,o=n[t].expand,r=n[t].boost,s=null,u={};return 0!==r?(e.forEach(function(e){var n=[e];1==o&&(n=this.index[t].expandToken(e));var r={};n.forEach(function(n){var o=this.index[t].getDocs(n),a=this.idf(n,t);if(s&&"AND"==i){var l={};for(var c in s)c in o&&(l[c]=o[c]);o=l}n==e&&this.fieldSearchStats(u,n,o);for(var c in o){var d=this.index[t].getTermFrequency(n,c),f=this.documentStore.getFieldLength(c,t),h=1;0!=f&&(h=1/Math.sqrt(f));var p=1;n!=e&&(p=.15*(1-(n.length-e.length)/n.length));var v=d*a*h*p;c in r?r[c]+=v:r[c]=v}},this),s=this.mergeScores(s,r,i)},this),s=this.coordNorm(s,u,e.length)):void 0},t.Index.prototype.mergeScores=function(e,t,n){if(!e)return t;if("AND"==n){var i={};for(var o in t)o in e&&(i[o]=e[o]+t[o]);return i}for(var o in t)o in e?e[o]+=t[o]:e[o]=t[o];return e},t.Index.prototype.fieldSearchStats=function(e,t,n){for(var i in n)i in e?e[i].push(t):e[i]=[t]},t.Index.prototype.coordNorm=function(e,t,n){for(var i in e)if(i in t){var o=t[i].length;e[i]=e[i]*o/n}return e},t.Index.prototype.toJSON=function(){var e={};return this._fields.forEach(function(t){e[t]=this.index[t].toJSON()},this),{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),index:e,pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},t.DocumentStore=function(e){this._save=null===e||void 0===e?!0:e,this.docs={},this.docInfo={},this.length=0},t.DocumentStore.load=function(e){var t=new this;return t.length=e.length,t.docs=e.docs,t.docInfo=e.docInfo,t._save=e.save,t},t.DocumentStore.prototype.isDocStored=function(){return this._save},t.DocumentStore.prototype.addDoc=function(t,n){this.hasDoc(t)||this.length++,this.docs[t]=this._save===!0?e(n):null},t.DocumentStore.prototype.getDoc=function(e){return this.hasDoc(e)===!1?null:this.docs[e]},t.DocumentStore.prototype.hasDoc=function(e){return e in this.docs},t.DocumentStore.prototype.removeDoc=function(e){this.hasDoc(e)&&(delete this.docs[e],delete this.docInfo[e],this.length--)},t.DocumentStore.prototype.addFieldLength=function(e,t,n){null!==e&&void 0!==e&&0!=this.hasDoc(e)&&(this.docInfo[e]||(this.docInfo[e]={}),this.docInfo[e][t]=n)},t.DocumentStore.prototype.updateFieldLength=function(e,t,n){null!==e&&void 0!==e&&0!=this.hasDoc(e)&&this.addFieldLength(e,t,n)},t.DocumentStore.prototype.getFieldLength=function(e,t){return null===e||void 0===e?0:e in this.docs&&t in this.docInfo[e]?this.docInfo[e][t]:0},t.DocumentStore.prototype.toJSON=function(){return{docs:this.docs,docInfo:this.docInfo,length:this.length,save:this._save}},t.stemmer=function(){var e={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},t={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,u="^("+o+")?"+r+o+"("+r+")?$",a="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,c=new RegExp(s),d=new RegExp(a),f=new RegExp(u),h=new RegExp(l),p=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,x=new RegExp("([^aeiouylsz])\\1$"),w=new RegExp("^"+o+i+"[^aeiouwxy]$"),I=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,D=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,_=/^(.+?)e$/,P=/ll$/,k=new RegExp("^"+o+i+"[^aeiouwxy]$"),z=function(n){var i,o,r,s,u,a,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,u=v,s.test(n)?n=n.replace(s,"$1$2"):u.test(n)&&(n=n.replace(u,"$1$2")),s=g,u=m,s.test(n)){var z=s.exec(n);s=c,s.test(z[1])&&(s=y,n=n.replace(s,""))}else if(u.test(n)){var z=u.exec(n);i=z[1],u=h,u.test(i)&&(n=i,u=S,a=x,l=w,u.test(n)?n+="e":a.test(n)?(s=y,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=I,s.test(n)){var z=s.exec(n);i=z[1],n=i+"i"}if(s=b,s.test(n)){var z=s.exec(n);i=z[1],o=z[2],s=c,s.test(i)&&(n=i+e[o])}if(s=E,s.test(n)){var z=s.exec(n);i=z[1],o=z[2],s=c,s.test(i)&&(n=i+t[o])}if(s=D,u=F,s.test(n)){var z=s.exec(n);i=z[1],s=d,s.test(i)&&(n=i)}else if(u.test(n)){var z=u.exec(n);i=z[1]+z[2],u=d,u.test(i)&&(n=i)}if(s=_,s.test(n)){var z=s.exec(n);i=z[1],s=d,u=f,a=k,(s.test(i)||u.test(i)&&!a.test(i))&&(n=i)}return s=P,u=d,s.test(n)&&u.test(n)&&(s=y,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return z}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==!0?e:void 0},t.clearStopWords=function(){t.stopWordFilter.stopWords={}},t.addStopWords=function(e){null!=e&&Array.isArray(e)!==!1&&e.forEach(function(e){t.stopWordFilter.stopWords[e]=!0},this)},t.resetStopWords=function(){t.stopWordFilter.stopWords=t.defaultStopWords},t.defaultStopWords={"":!0,a:!0,able:!0,about:!0,across:!0,after:!0,all:!0,almost:!0,also:!0,am:!0,among:!0,an:!0,and:!0,any:!0,are:!0,as:!0,at:!0,be:!0,because:!0,been:!0,but:!0,by:!0,can:!0,cannot:!0,could:!0,dear:!0,did:!0,"do":!0,does:!0,either:!0,"else":!0,ever:!0,every:!0,"for":!0,from:!0,get:!0,got:!0,had:!0,has:!0,have:!0,he:!0,her:!0,hers:!0,him:!0,his:!0,how:!0,however:!0,i:!0,"if":!0,"in":!0,into:!0,is:!0,it:!0,its:!0,just:!0,least:!0,let:!0,like:!0,likely:!0,may:!0,me:!0,might:!0,most:!0,must:!0,my:!0,neither:!0,no:!0,nor:!0,not:!0,of:!0,off:!0,often:!0,on:!0,only:!0,or:!0,other:!0,our:!0,own:!0,rather:!0,said:!0,say:!0,says:!0,she:!0,should:!0,since:!0,so:!0,some:!0,than:!0,that:!0,the:!0,their:!0,them:!0,then:!0,there:!0,these:!0,they:!0,"this":!0,tis:!0,to:!0,too:!0,twas:!0,us:!0,wants:!0,was:!0,we:!0,were:!0,what:!0,when:!0,where:!0,which:!0,"while":!0,who:!0,whom:!0,why:!0,will:!0,"with":!0,would:!0,yet:!0,you:!0,your:!0},t.stopWordFilter.stopWords=t.defaultStopWords,t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(e){if(null===e||void 0===e)throw new Error("token should not be undefined");return e.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.InvertedIndex=function(){this.root={docs:{},df:0}},t.InvertedIndex.load=function(e){var t=new this;return t.root=e.root,t},t.InvertedIndex.prototype.addToken=function(e,t,n){for(var n=n||this.root,i=0;i<=e.length-1;){var o=e[i];o in n||(n[o]={docs:{},df:0}),i+=1,n=n[o]}var r=t.ref;n.docs[r]?n.docs[r]={tf:t.tf}:(n.docs[r]={tf:t.tf},n.df+=1)},t.InvertedIndex.prototype.hasToken=function(e){if(!e)return!1;for(var t=this.root,n=0;n<e.length;n++){if(!t[e[n]])return!1;t=t[e[n]]}return!0},t.InvertedIndex.prototype.getNode=function(e){if(!e)return null;for(var t=this.root,n=0;n<e.length;n++){if(!t[e[n]])return null;t=t[e[n]]}return t},t.InvertedIndex.prototype.getDocs=function(e){var t=this.getNode(e);return null==t?{}:t.docs},t.InvertedIndex.prototype.getTermFrequency=function(e,t){var n=this.getNode(e);return null==n?0:t in n.docs?n.docs[t].tf:0},t.InvertedIndex.prototype.getDocFreq=function(e){var t=this.getNode(e);return null==t?0:t.df},t.InvertedIndex.prototype.removeToken=function(e,t){if(e){var n=this.getNode(e);null!=n&&t in n.docs&&(delete n.docs[t],n.df-=1)}},t.InvertedIndex.prototype.expandToken=function(e,t,n){if(null==e||""==e)return[];var t=t||[];if(void 0==n&&(n=this.getNode(e),null==n))return t;n.df>0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e<arguments.length;e++)t=arguments[e],~this.indexOf(t)||this.elements.splice(this.locationFor(t),0,t);this.length=this.elements.length},lunr.SortedSet.prototype.toArray=function(){return this.elements.slice()},lunr.SortedSet.prototype.map=function(e,t){return this.elements.map(e,t)},lunr.SortedSet.prototype.forEach=function(e,t){return this.elements.forEach(e,t)},lunr.SortedSet.prototype.indexOf=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]<u[i]?n++:s[n]>u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o<r.length;o++)i.add(r[o]);return i},lunr.SortedSet.prototype.toJSON=function(){return this.toArray()},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.elasticlunr=t()}(this,function(){return t})}();
public/fonts/FiraCode-Bold.woff2

This is a binary file and will not be displayed.

public/fonts/FiraCode-Regular.woff2

This is a binary file and will not be displayed.

+93
public/fonts/LICENSE
··· 1 + Copyright (c) 2014, The Fira Code Project Authors (https://github.com/tonsky/FiraCode) 2 + 3 + This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 + This license is copied below, and is also available with a FAQ at: 5 + http://scripts.sil.org/OFL 6 + 7 + 8 + ----------------------------------------------------------- 9 + SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 + ----------------------------------------------------------- 11 + 12 + PREAMBLE 13 + The goals of the Open Font License (OFL) are to stimulate worldwide 14 + development of collaborative font projects, to support the font creation 15 + efforts of academic and linguistic communities, and to provide a free and 16 + open framework in which fonts may be shared and improved in partnership 17 + with others. 18 + 19 + The OFL allows the licensed fonts to be used, studied, modified and 20 + redistributed freely as long as they are not sold by themselves. The 21 + fonts, including any derivative works, can be bundled, embedded, 22 + redistributed and/or sold with any software provided that any reserved 23 + names are not used by derivative works. The fonts and derivatives, 24 + however, cannot be released under any other type of license. The 25 + requirement for fonts to remain under this license does not apply 26 + to any document created using the fonts or their derivatives. 27 + 28 + DEFINITIONS 29 + "Font Software" refers to the set of files released by the Copyright 30 + Holder(s) under this license and clearly marked as such. This may 31 + include source files, build scripts and documentation. 32 + 33 + "Reserved Font Name" refers to any names specified as such after the 34 + copyright statement(s). 35 + 36 + "Original Version" refers to the collection of Font Software components as 37 + distributed by the Copyright Holder(s). 38 + 39 + "Modified Version" refers to any derivative made by adding to, deleting, 40 + or substituting -- in part or in whole -- any of the components of the 41 + Original Version, by changing formats or by porting the Font Software to a 42 + new environment. 43 + 44 + "Author" refers to any designer, engineer, programmer, technical 45 + writer or other person who contributed to the Font Software. 46 + 47 + PERMISSION & CONDITIONS 48 + Permission is hereby granted, free of charge, to any person obtaining 49 + a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 + redistribute, and sell modified and unmodified copies of the Font 51 + Software, subject to the following conditions: 52 + 53 + 1) Neither the Font Software nor any of its individual components, 54 + in Original or Modified Versions, may be sold by itself. 55 + 56 + 2) Original or Modified Versions of the Font Software may be bundled, 57 + redistributed and/or sold with any software, provided that each copy 58 + contains the above copyright notice and this license. These can be 59 + included either as stand-alone text files, human-readable headers or 60 + in the appropriate machine-readable metadata fields within text or 61 + binary files as long as those fields can be easily viewed by the user. 62 + 63 + 3) No Modified Version of the Font Software may use the Reserved Font 64 + Name(s) unless explicit written permission is granted by the corresponding 65 + Copyright Holder. This restriction only applies to the primary font name as 66 + presented to the users. 67 + 68 + 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 + Software shall not be used to promote, endorse or advertise any 70 + Modified Version, except to acknowledge the contribution(s) of the 71 + Copyright Holder(s) and the Author(s) or with their explicit written 72 + permission. 73 + 74 + 5) The Font Software, modified or unmodified, in part or in whole, 75 + must be distributed entirely under this license, and must not be 76 + distributed under any other license. The requirement for fonts to 77 + remain under this license does not apply to any document created 78 + using the Font Software. 79 + 80 + TERMINATION 81 + This license becomes null and void if any of the above conditions are 82 + not met. 83 + 84 + DISCLAIMER 85 + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 + OTHER DEALINGS IN THE FONT SOFTWARE.
+11
public/images/social_icons/LICENSE
··· 1 + Most icons in this directory are downloaded from [Font Awesome]. They are part 2 + of the [free offer] and are licensed under [CC BY 4.0]. 3 + 4 + [Font Awesome]: https://fontawesome.com/ 5 + [free offer]: https://fontawesome.com/license/free 6 + [CC BY 4.0]: https://creativecommons.org/licenses/by/4.0/ 7 + 8 + Exceptions: 9 + - Atom, licensed under [CC0](https://creativecommons.org/publicdomain/zero/1.0/) by [Eyal Kalderon](https://eyalkalderon.com/). Source (prior to modification in Inkscape): https://commons.wikimedia.org/wiki/File:Application_atom%2Bxml.svg 10 + - Keybase, licensed under [CC0](https://creativecommons.org/publicdomain/zero/1.0/) by [Simple Icons](https://simpleicons.org/). Source: https://github.com/simple-icons/simple-icons/blob/develop/icons/keybase.svg 11 + - Keyoxide, licensed under [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by the [Keyoxide Project](https://codeberg.org/keyoxide/keyoxide-artwork). Source: https://codeberg.org/keyoxide/keyoxide-web/src/commit/569fcf1/static-src/files/img/keyoxide.svg
+1
public/images/social_icons/atom.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="-25 -26.75 50 50"><path d="m 20,5 c -2.215061,0 -4,1.7849387 -4,4 0,2.215061 1.784939,4 4,4 2.215061,0 4,-1.784939 4,-4 0,-2.2150613 -1.784939,-4 -4,-4 z m -40,0 c -2.215061,0 -4,1.7849387 -4,4 0,2.215061 1.784939,4 4,4 2.215061,0 4,-1.784939 4,-4 0,-2.2150613 -1.784939,-4 -4,-4 z M 0,-26 c -2.2150613,0 -4,1.784939 -4,4 0,2.215061 1.7849387,4 4,4 2.2150613,0 4,-1.784939 4,-4 0,-2.215061 -1.7849387,-4 -4,-4 z m 0,20 c -3.3196308,0 -6,2.6803692 -6,6 0,3.3196308 2.6803692,6 6,6 C 3.3196308,6 6,3.3196308 6,0 6,-3.3196308 3.3196308,-6 0,-6 Z M -5,-21.941406 C -15.016622,-19.666091 -22.5,-10.702303 -22.5,0 c 0,1.5215429 0.151155,3.0082575 0.439453,4.4453125 0.303447,-0.1379177 0.623158,-0.246965 0.955078,-0.3222656 C -21.364332,2.7886652 -21.5,1.4104072 -21.5,0 c 0,-10.198695 7.090329,-18.732318 16.6132813,-20.943359 C -4.956536,-21.266022 -4.9960716,-21.599168 -5,-21.941406 Z m 10,0 c -0.00393,0.342238 -0.043464,0.675384 -0.1132813,0.998047 C 14.409671,-18.732318 21.5,-10.198695 21.5,0 c 0,1.4104072 -0.135668,2.7886652 -0.394531,4.1230469 0.331919,0.075301 0.651632,0.1843481 0.955078,0.3222656 C 22.348845,3.0082574 22.5,1.521543 22.5,0 22.5,-10.702303 15.016622,-19.666091 5,-21.941406 Z m -22.083984,35 c -0.270321,0.194772 -0.562364,0.363552 -0.869141,0.501953 C -13.844268,18.99004 -7.3292479,22.5 0,22.5 7.3292479,22.5 13.844268,18.99004 17.953125,13.560547 17.646348,13.422146 17.354305,13.253366 17.083984,13.058594 13.155961,18.191093 6.9669574,21.5 0,21.5 c -6.9669574,0 -13.155961,-3.308907 -17.083984,-8.441406 z M 18.826172,-9.8632813 c -0.255464,0.00159 -0.533918,0.022037 -0.837891,0.054687 -1.215891,0.1306001 -2.835986,0.4960661 -4.78125,1.0625 -2.533579,0.7377433 -5.6122163,1.8166747 -8.988281,3.1640626 0.2983595,0.2260913 0.5794973,0.4760734 0.8378906,0.7460937 3.1711157,-1.2513933 6.0561644,-2.2555596 8.4316404,-2.9472656 1.912574,-0.5569153 3.499271,-0.9120128 4.609375,-1.03125 0.277527,-0.029809 0.523875,-0.043491 0.736328,-0.044922 0.212454,-0.00143 0.390497,0.010196 0.525391,0.033203 0.133381,0.022749 0.206862,0.052844 0.246094,0.072266 -0.164313,-0.367593 -0.306238,-0.7472047 -0.490235,-1.1035156 -0.09289,-0.00491 -0.189538,-0.00648 -0.289062,-0.00586 z m 1.697265,0.6503907 c 0.02711,0.06026 0.04958,0.123054 0.07617,0.1835937 -0.01193,-0.04108 -0.0267,-0.082129 -0.04492,-0.1230469 -0.0095,-0.021321 -0.02056,-0.040487 -0.03125,-0.060547 z M 19.625,-8.7109375 c -0.01162,0.04164 -0.03824,0.1149281 -0.111328,0.2304687 -0.146328,0.2312815 -0.437808,0.5570958 -0.853516,0.9296876 -0.831415,0.7451831 -2.155979,1.6876577 -3.849609,2.7363281 -2.103133,1.3022281 -4.779148,2.7746372 -7.8300783,4.29296873 C 6.9932435,-0.34904854 7,-0.175646 7,0 7,0.20125365 6.991337,0.40066067 6.9746094,0.59765625 10.23333,-1.0092335 13.09305,-2.5741285 15.335938,-3.9628906 c 1.722577,-1.0665941 3.079589,-2.0256019 3.990234,-2.8417969 0.316865,-0.2840007 0.580347,-0.5491596 0.789062,-0.8066406 C 19.97247,-7.9887616 19.788046,-8.3440051 19.625,-8.7109375 Z M -6.9746094,-0.59765625 C -10.233329,1.0092335 -13.09305,2.5741285 -15.335938,3.9628906 c -0.590929,0.3658943 -1.138999,0.7194437 -1.640624,1.0585938 0.273188,0.2081686 0.524887,0.4442478 0.75,0.703125 0.436932,-0.2920141 0.909837,-0.5967385 1.416015,-0.9101563 2.103133,-1.3022282 4.779148,-2.7746372 7.8300783,-4.29296873 C -6.9932435,0.34904855 -7,0.17564599 -7,0 c 0,-0.20125361 0.00866,-0.4006607 0.025391,-0.59765625 z M -5.0566406,4.8359375 C -8.2277563,6.0873308 -11.112805,7.0914971 -13.488281,7.7832031 -14.041195,7.9442039 -14.567699,8.0883994 -15.0625,8.2148438 -15.02191,8.4707307 -15,8.7329344 -15,9 c 0,0.078905 -0.0022,0.1583035 -0.0059,0.2363281 0.562993,-0.1409023 1.163774,-0.3053153 1.798828,-0.4902343 2.53362,-0.7377433 5.6122573,-1.8166747 8.988322,-3.1640626 C -4.5171095,5.3559399 -4.7982473,5.1059578 -5.0566406,4.8359375 Z M -18.826172,-9.8632813 c -0.09952,-6.179e-4 -0.196172,9.54e-4 -0.289062,0.00586 -0.183997,0.3563109 -0.325922,0.7359226 -0.490235,1.1035156 0.03923,-0.019416 0.112706,-0.049504 0.246094,-0.072266 0.134894,-0.023007 0.312937,-0.034634 0.525391,-0.033203 0.212453,0.00143 0.458801,0.015113 0.736328,0.044922 1.110104,0.1192372 2.696801,0.4743347 4.609375,1.03125 2.375478,0.6917067 5.2605212,1.6958707 8.4316404,2.9472656 0.2583882,-0.2700232 0.5395341,-0.5200008 0.8378906,-0.7460937 -3.3760628,-1.347387 -6.454704,-2.4263196 -8.988281,-3.1640626 -1.945264,-0.5664339 -3.565359,-0.9318999 -4.78125,-1.0625 -0.303973,-0.03265 -0.582427,-0.053101 -0.837891,-0.054688 z m -1.697265,0.6503907 c -0.01069,0.02006 -0.02176,0.039226 -0.03125,0.060547 -0.01822,0.040918 -0.03299,0.081967 -0.04492,0.1230469 0.0266,-0.06054 0.04906,-0.1233339 0.07617,-0.1835939 z m 0.898437,0.5019531 c -0.163046,0.3669324 -0.34747,0.7221759 -0.490234,1.0996094 0.208715,0.257481 0.472197,0.5226399 0.789062,0.8066406 0.910645,0.816195 2.267657,1.7752028 3.990234,2.8417969 1.963831,1.2159743 4.400698,2.5669168 7.164063,3.9628906 0.3671392,-0.18546998 0.7388588,-0.37174662 1.1171875,-0.55859375 -3.0206095,-1.50545905 -5.6695215,-2.96403065 -7.7558595,-4.25585935 -1.69363,-1.0486704 -3.018194,-1.991145 -3.849609,-2.7363281 -0.415708,-0.3725918 -0.707188,-0.6984061 -0.853516,-0.9296876 -0.07309,-0.1155281 -0.09971,-0.1888228 -0.111328,-0.2304687 z m 26.5996094,8.11328125 c 0.00216,0.0253704 0.00397,0.050726 0.00586,0.0761719 0.024644,-0.0122643 0.049624,-0.0248511 0.074219,-0.0371094 -0.026614,-0.0131441 -0.053411,-0.0259127 -0.080078,-0.0390625 z M 8.171875,0 C 7.8047358,0.18546998 7.4330162,0.37174662 7.0546875,0.55859375 10.075297,2.0640528 12.724209,3.5226244 14.810547,4.8144531 c 0.506178,0.3134178 0.979083,0.6181422 1.416015,0.9101563 0.225113,-0.2588772 0.476812,-0.4949564 0.75,-0.703125 C 16.474937,4.6823343 15.926867,4.3287849 15.335938,3.9628906 13.372107,2.7469163 10.93524,1.3959738 8.171875,0 Z M -6.9804687,0.52148437 c -0.024644,0.0122643 -0.049624,0.0248511 -0.074219,0.0371094 0.026614,0.0131441 0.053411,0.0259127 0.080078,0.0390625 -0.00216,-0.0253704 -0.00397,-0.050726 -0.00586,-0.0761719 z M 5.0566406,4.8359375 C 4.7982524,5.1059607 4.5171065,5.3559383 4.21875,5.5820312 c 3.3760628,1.347387 6.454704,2.4263196 8.988281,3.1640626 0.635054,0.184919 1.235835,0.349332 1.798828,0.4902343 C 15.002222,9.1583035 15,9.0789054 15,9 15,8.7329344 15.02191,8.4707307 15.0625,8.2148438 14.567699,8.0883994 14.041195,7.9442039 13.488281,7.7832031 11.112803,7.0914964 8.2277598,6.0873324 5.0566406,4.8359375 Z M -2.3144531,-17.570312 c -0.1068846,0.601064 -0.2079011,1.251821 -0.3027344,1.947265 -0.3565005,2.614337 -0.6230454,5.8642731 -0.765625,9.4960939 0.3253152,-0.1804077 0.667235,-0.3354745 1.0214844,-0.4628906 0.1464595,-3.4046565 0.4021315,-6.4476633 0.7363281,-8.8984373 0.082388,-0.60418 0.1703696,-1.172697 0.2617188,-1.701172 -0.3321646,-0.09445 -0.6508379,-0.223138 -0.9511719,-0.380859 z m 4.6289062,0 c -0.300334,0.157721 -0.6190073,0.286404 -0.9511719,0.380859 0.091349,0.528475 0.1793306,1.096992 0.2617188,1.701172 0.3341968,2.450776 0.5898687,5.4937783 0.7363281,8.8984373 0.3542481,0.1274164 0.696168,0.2824833 1.0214844,0.4628906 C 3.240233,-9.7587764 2.9736882,-13.008708 2.6171875,-15.623047 2.5223542,-16.318491 2.4213377,-16.969248 2.3144531,-17.570312 Z M -3.3828125,6.1269531 c 0.1425795,3.6318233 0.4091243,6.8817549 0.765625,9.4960939 0.2737467,2.007476 0.5974177,3.636889 0.9726563,4.800781 0.129425,0.401443 0.2632236,0.747211 0.4121093,1.041016 C -0.82453295,21.487866 -0.41368517,21.5 0,21.5 0.41368517,21.5 0.82453295,21.48787 1.2324219,21.46484 1.3813076,21.171039 1.5151062,20.825271 1.6445312,20.423828 2.0197698,19.259936 2.3434408,17.630523 2.6171875,15.623047 2.973688,13.00871 3.2402329,9.7587739 3.3828125,6.1269531 3.0574973,6.3073608 2.7155775,6.4624276 2.3613281,6.5898437 2.2148686,9.9945002 1.9591966,13.037507 1.625,15.488281 1.3558535,17.462022 1.0339978,19.054558 0.69140625,20.117187 0.52011045,20.648502 0.34122221,21.047643 0.18945312,21.275391 0.09199353,21.42164 0.02483219,21.472433 0,21.490234 -0.02482169,21.472433 -0.09197642,21.421641 -0.18945312,21.275391 -0.34122222,21.047643 -0.52011045,20.648503 -0.69140625,20.117187 -1.0339978,19.054558 -1.3558535,17.462022 -1.625,15.488281 -1.9591968,13.037505 -2.2148687,9.9945027 -2.3613281,6.5898437 -2.7155762,6.4624273 -3.0574961,6.3073604 -3.3828125,6.1269531 Z m 3.28125,16.3671879 C -0.06836288,22.497642 -0.03465715,22.5 0,22.5 c -0.03436788,0 -0.06723059,-0.0057 -0.1015625,-0.0059 z M 0,22.5 c 0.03465715,0 0.06836288,-0.0024 0.1015625,-0.0059 C 0.06723059,22.494295 0.03436788,22.5 0,22.5 Z" /></svg>
+1
public/images/social_icons/bitcoin.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zm-141.651-35.33c4.937-32.999-20.191-50.739-54.55-62.573l11.146-44.702-27.213-6.781-10.851 43.524c-7.154-1.783-14.502-3.464-21.803-5.13l10.929-43.81-27.198-6.781-11.153 44.686c-5.922-1.349-11.735-2.682-17.377-4.084l.031-.14-37.53-9.37-7.239 29.062s20.191 4.627 19.765 4.913c11.022 2.751 13.014 10.044 12.68 15.825l-12.696 50.925c.76.194 1.744.473 2.829.907-.907-.225-1.876-.473-2.876-.713l-17.796 71.338c-1.349 3.348-4.767 8.37-12.471 6.464.271.395-19.78-4.937-19.78-4.937l-13.51 31.147 35.414 8.827c6.588 1.651 13.045 3.379 19.4 5.006l-11.262 45.213 27.182 6.781 11.153-44.733a1038.209 1038.209 0 0 0 21.687 5.627l-11.115 44.523 27.213 6.781 11.262-45.128c46.404 8.781 81.299 5.239 95.986-36.727 11.836-33.79-.589-53.281-25.004-65.991 17.78-4.098 31.174-15.792 34.747-39.949zm-62.177 87.179c-8.41 33.79-65.308 15.523-83.755 10.943l14.944-59.899c18.446 4.603 77.6 13.717 68.811 48.956zm8.417-87.667c-7.673 30.736-55.031 15.12-70.393 11.292l13.548-54.327c15.363 3.828 64.836 10.973 56.845 43.035z"/></svg>
+1
public/images/social_icons/bluesky.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M407.8 294.7c-3.3-.4-6.7-.8-10-1.3c3.4 .4 6.7 .9 10 1.3zM288 227.1C261.9 176.4 190.9 81.9 124.9 35.3C61.6-9.4 37.5-1.7 21.6 5.5C3.3 13.8 0 41.9 0 58.4S9.1 194 15 213.9c19.5 65.7 89.1 87.9 153.2 80.7c3.3-.5 6.6-.9 10-1.4c-3.3 .5-6.6 1-10 1.4C74.3 308.6-9.1 342.8 100.3 464.5C220.6 589.1 265.1 437.8 288 361.1c22.9 76.7 49.2 222.5 185.6 103.4c102.4-103.4 28.1-156-65.8-169.9c-3.3-.4-6.7-.8-10-1.3c3.4 .4 6.7 .9 10 1.3c64.1 7.1 133.6-15.1 153.2-80.7C566.9 194 576 75 576 58.4s-3.3-44.7-21.6-52.9c-15.8-7.1-40-14.9-103.2 29.8C385.1 81.9 314.1 176.4 288 227.1z"/></svg>
+3
public/images/social_icons/codeberg.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4.233 4.233"> 2 + <path d="M0 2.265c0 .398.112.788.323 1.125l1.765-2.281c.013-.016.044-.016.057 0l.737.953h-.528l.011.042h.549l.156.201h-.648l.018.066h.681l.137.177H2.49l.024.085h.81l.122.158h-.888l.029.104h.939l.107.139H2.625l.032.115h1.065l.099.128H2.693l.032.115H3.91c.211-.337.323-.727.323-1.125 0-1.169-.947-2.116-2.117-2.116S0 1.096 0 2.265zm2.761 1.253l.032.115h.939l.091-.115zm.068.243l.032.115h.628l.126-.115zm.067.243l.032.114h.212l.184-.114z" paint-order="markers fill stroke"/> 3 + </svg>
+1
public/images/social_icons/discord.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M524.531,69.836a1.5,1.5,0,0,0-.764-.7A485.065,485.065,0,0,0,404.081,32.03a1.816,1.816,0,0,0-1.923.91,337.461,337.461,0,0,0-14.9,30.6,447.848,447.848,0,0,0-134.426,0,309.541,309.541,0,0,0-15.135-30.6,1.89,1.89,0,0,0-1.924-.91A483.689,483.689,0,0,0,116.085,69.137a1.712,1.712,0,0,0-.788.676C39.068,183.651,18.186,294.69,28.43,404.354a2.016,2.016,0,0,0,.765,1.375A487.666,487.666,0,0,0,176.02,479.918a1.9,1.9,0,0,0,2.063-.676A348.2,348.2,0,0,0,208.12,430.4a1.86,1.86,0,0,0-1.019-2.588,321.173,321.173,0,0,1-45.868-21.853,1.885,1.885,0,0,1-.185-3.126c3.082-2.309,6.166-4.711,9.109-7.137a1.819,1.819,0,0,1,1.9-.256c96.229,43.917,200.41,43.917,295.5,0a1.812,1.812,0,0,1,1.924.233c2.944,2.426,6.027,4.851,9.132,7.16a1.884,1.884,0,0,1-.162,3.126,301.407,301.407,0,0,1-45.89,21.83,1.875,1.875,0,0,0-1,2.611,391.055,391.055,0,0,0,30.014,48.815,1.864,1.864,0,0,0,2.063.7A486.048,486.048,0,0,0,610.7,405.729a1.882,1.882,0,0,0,.765-1.352C623.729,277.594,590.933,167.465,524.531,69.836ZM222.491,337.58c-28.972,0-52.844-26.587-52.844-59.239S193.056,219.1,222.491,219.1c29.665,0,53.306,26.82,52.843,59.239C275.334,310.993,251.924,337.58,222.491,337.58Zm195.38,0c-28.971,0-52.843-26.587-52.843-59.239S388.437,219.1,417.871,219.1c29.667,0,53.307,26.82,52.844,59.239C470.715,310.993,447.538,337.58,417.871,337.58Z"/></svg>
+1
public/images/social_icons/email.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4L236.8 313.6c11.4 8.5 27 8.5 38.4 0L492.8 150.4c12.1-9.1 19.2-23.3 19.2-38.4c0-26.5-21.5-48-48-48H48zM0 176V384c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V176L294.4 339.2c-22.8 17.1-54 17.1-76.8 0L0 176z"/></svg>
+1
public/images/social_icons/facebook.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z"/></svg>
+1
public/images/social_icons/flickr.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free v7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M400 32L48 32C21.5 32 0 53.5 0 80L0 432c0 26.5 21.5 48 48 48l352 0c26.5 0 48-21.5 48-48l0-352c0-26.5-21.5-48-48-48zM144.5 192a63.5 63.5 0 1 1 0 127 63.5 63.5 0 1 1 0-127zm159 0a63.5 63.5 0 1 1 0 127 63.5 63.5 0 1 1 0-127z"/></svg>
+4
public/images/social_icons/forgejo.svg
··· 1 + <!-- CC-BY - https://github.com/reiver/fediverse-icons --> 2 + <svg id="icon" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"> 3 + <path fill-rule="evenodd" clip-rule="evenodd" d="M181 77C123.562 77 77 123.562 77 181V332C77 389.438 123.562 436 181 436H332C389.438 436 436 389.438 436 332V181C436 123.562 389.438 77 332 77H181ZM303.03 151.269C294.762 151.269 288.06 157.971 288.06 166.239C288.06 174.506 294.762 181.209 303.03 181.209C311.297 181.209 318 174.506 318 166.239C318 157.971 311.297 151.269 303.03 151.269ZM271.173 157.714C274.93 143.638 287.769 133.269 303.03 133.269C321.239 133.269 336 148.03 336 166.239C336 184.448 321.239 199.209 303.03 199.209C288.153 199.209 275.577 189.355 271.473 175.818C242.538 179.872 220.271 204.724 220.271 234.777V275.467C232.746 260.426 250.741 250.13 271.15 247.686C274.879 233.566 287.739 223.156 303.03 223.156C321.239 223.156 336 237.917 336 256.126C336 274.335 321.239 289.096 303.03 289.096C288.188 289.096 275.637 279.289 271.503 265.802C245.851 269.666 225.495 289.692 221.136 315.179C234.719 319.254 244.615 331.852 244.615 346.762C244.615 364.971 229.854 379.732 211.645 379.732C193.436 379.732 178.675 364.971 178.675 346.762C178.675 331.81 188.629 319.182 202.271 315.144V234.777C202.271 194.874 232.414 162.01 271.173 157.714ZM288.06 256.126C288.06 247.858 294.762 241.156 303.03 241.156C311.297 241.156 318 247.858 318 256.126C318 264.394 311.297 271.096 303.03 271.096C294.762 271.096 288.06 264.394 288.06 256.126ZM196.675 346.762C196.675 338.494 203.378 331.792 211.645 331.792C219.913 331.792 226.615 338.494 226.615 346.762C226.615 355.029 219.913 361.732 211.645 361.732C203.378 361.732 196.675 355.029 196.675 346.762Z"/> 4 + </svg>
+5
public/images/social_icons/gitea.svg
··· 1 + <!-- CC-BY - https://github.com/reiver/fediverse-icons --> 2 + <svg id="icon" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"> 3 + <path d="M111 262C91.374 262 72.5518 254.204 58.6741 240.326C44.7964 226.448 37 207.626 37 188C37 168.374 44.7964 149.552 58.6741 135.674C72.5518 121.796 91.374 114 111 114L123 114" stroke-width="18"/> 4 + <path fill-rule="evenodd" clip-rule="evenodd" d="M158 76C131.49 76 110 97.4903 110 124V285.5C110 367.79 176.71 434.5 259 434.5H334C416.29 434.5 483 367.79 483 285.5V124C483 97.4903 461.51 76 435 76H158ZM323 161.201V93.5H305V150.808L288.773 141.44C273.946 132.879 254.987 137.96 246.426 152.787L182.121 264.167C173.561 278.994 178.641 297.953 193.468 306.514L304.848 370.819C319.675 379.379 338.634 374.299 347.195 359.472L411.5 248.092C420.06 233.265 414.98 214.306 400.153 205.745L323 161.201ZM316.845 178.432L391.153 221.334C397.371 224.924 399.501 232.874 395.912 239.092L331.606 350.472C328.016 356.69 320.066 358.82 313.848 355.231L202.468 290.925C196.25 287.335 194.12 279.385 197.709 273.167L262.015 161.787C265.605 155.569 273.555 153.438 279.773 157.028L301.257 169.432L291.498 186.335C284.705 186.123 278.018 189.561 274.382 195.859C270.746 202.157 271.112 209.667 274.692 215.444L253.853 251.539C247.06 251.328 240.372 254.765 236.736 261.063C231.473 270.18 234.597 281.838 243.713 287.101C252.83 292.365 264.488 289.241 269.751 280.124C273.387 273.826 273.021 266.316 269.441 260.538L290.28 224.445C293.284 224.538 296.268 223.918 298.976 222.652L329.227 240.118L305.306 281.551C298.702 281.535 292.273 284.956 288.735 291.085C283.471 300.202 286.595 311.859 295.711 317.123C304.828 322.386 316.486 319.263 321.749 310.146C325.481 303.682 324.997 295.941 321.15 290.108L353.816 233.529L309.763 208.095C310.398 203.65 309.433 199.12 307.087 195.334L316.845 178.432Z"/> 5 + </svg>
+1
public/images/social_icons/github.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
+1
public/images/social_icons/gitlab.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M503.5 204.6L502.8 202.8L433.1 21.02C431.7 17.45 429.2 14.43 425.9 12.38C423.5 10.83 420.8 9.865 417.9 9.57C415 9.275 412.2 9.653 409.5 10.68C406.8 11.7 404.4 13.34 402.4 15.46C400.5 17.58 399.1 20.13 398.3 22.9L351.3 166.9H160.8L113.7 22.9C112.9 20.13 111.5 17.59 109.6 15.47C107.6 13.35 105.2 11.72 102.5 10.7C99.86 9.675 96.98 9.295 94.12 9.587C91.26 9.878 88.51 10.83 86.08 12.38C82.84 14.43 80.33 17.45 78.92 21.02L9.267 202.8L8.543 204.6C-1.484 230.8-2.72 259.6 5.023 286.6C12.77 313.5 29.07 337.3 51.47 354.2L51.74 354.4L52.33 354.8L158.3 434.3L210.9 474L242.9 498.2C246.6 500.1 251.2 502.5 255.9 502.5C260.6 502.5 265.2 500.1 268.9 498.2L300.9 474L353.5 434.3L460.2 354.4L460.5 354.1C482.9 337.2 499.2 313.5 506.1 286.6C514.7 259.6 513.5 230.8 503.5 204.6z"/></svg>
+1
public/images/social_icons/instagram.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"/></svg>
+1
public/images/social_icons/keybase.svg
··· 1 + <svg id="icon" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Keybase</title><path d="M10.445 21.372a.953.953 0 1 1-.955-.954c.524 0 .951.43.951.955m5.923-.001a.953.953 0 1 1-.958-.954c.526 0 .954.43.954.955m4.544-9.16l-.156-.204c-.046-.06-.096-.116-.143-.175-.045-.06-.094-.113-.141-.169-.104-.12-.21-.239-.32-.359l-.075-.08-.091-.099-.135-.13c-.015-.019-.032-.035-.05-.054a10.87 10.87 0 0 0-3.955-2.504l-.23-.078.035-.083a4.109 4.109 0 0 0-.12-3.255 4.11 4.11 0 0 0-2.438-2.16c-.656-.216-1.23-.319-1.712-.305-.033-.105-.1-.577.496-1.848L10.662 0l-.287.399c-.33.455-.648.895-.945 1.328a1.857 1.857 0 0 0-1.245-.58L6.79 1.061h-.012c-.033-.003-.07-.003-.104-.003-.99 0-1.81.771-1.87 1.755l-.088 1.402v.003a1.876 1.876 0 0 0 1.755 1.98l1.002.06c-.065.84.073 1.62.405 2.306a11.28 11.28 0 0 0-3.66 2.484C.912 14.392.912 18.052.912 20.995v1.775l1.305-1.387c.266.93.652 1.807 1.145 2.615H5.06a9.197 9.197 0 0 1-1.68-3.848l1.913-2.03-.985 3.09 1.74-1.267c3.075-2.234 6.745-2.75 10.91-1.53 1.806.533 3.56.04 4.474-1.256l.104-.165c.09.498.14.998.14 1.496 0 1.563-.254 3.687-1.38 5.512h1.612c.776-1.563 1.181-3.432 1.181-5.512-.001-2.2-.786-4.421-2.184-6.274zM8.894 6.192c.122-1.002.577-1.949 1.23-2.97a1.36 1.36 0 0 0 1.283.749c.216-.008.604.025 1.233.232a2.706 2.706 0 0 1 1.608 1.425c.322.681.349 1.442.079 2.15a2.69 2.69 0 0 1-.806 1.108l-.408-.502-.002-.003a1.468 1.468 0 0 0-2.06-.205c-.334.27-.514.66-.534 1.058-1.2-.54-1.8-1.643-1.628-3.04zm4.304 5.11l-.52.425a.228.228 0 0 1-.323-.032l-.11-.135a.238.238 0 0 1 .034-.334l.51-.42-1.056-1.299a.307.307 0 0 1 .044-.436.303.303 0 0 1 .435.041l2.963 3.646a.309.309 0 0 1-.168.499.315.315 0 0 1-.31-.104l-.295-.365-1.045.854a.244.244 0 0 1-.154.055.237.237 0 0 1-.186-.09l-.477-.58a.24.24 0 0 1 .035-.335l1.05-.858-.425-.533zM7.752 4.866l-1.196-.075a.463.463 0 0 1-.435-.488l.09-1.4a.462.462 0 0 1 .461-.437h.024l1.401.091a.459.459 0 0 1 .433.488l-.007.101a9.27 9.27 0 0 0-.773 1.72zm12.525 11.482c-.565.805-1.687 1.08-2.924.718-3.886-1.141-7.397-.903-10.469.7l1.636-5.122-5.29 5.609c.098-3.762 2.452-6.967 5.757-8.312.471.373 1.034.66 1.673.841.16.044.322.074.48.102a1.41 1.41 0 0 0 .21 1.408l.075.09c-.172.45-.105.975.221 1.374l.476.582a1.39 1.39 0 0 0 1.079.513c.32 0 .635-.111.886-.314l.285-.232c.174.074.367.113.566.113a1.45 1.45 0 0 0 .928-.326c.623-.51.72-1.435.209-2.06l-1.67-2.057a4.07 4.07 0 0 0 .408-.38c.135.036.27.077.4.12.266.096.533.197.795.314a9.55 9.55 0 0 1 2.77 1.897c.03.03.06.055.086.083l.17.176c.038.039.076.079.11.12.08.085.16.175.24.267l.126.15c.045.053.086.104.13.16l.114.15c.04.05.079.102.117.154.838 1.149.987 2.329.404 3.157v.005zM7.718 4.115l-.835-.05.053-.836.834.051z"/></svg>
+7
public/images/social_icons/keyoxide.svg
··· 1 + <svg id="icon" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> 2 + <path d="m14.662 2.7734c-0.86914 8.5e-6 -1.5742 0.70509-1.5742 1.5742 0 0.52528 0.26095 1.006 0.67773 1.2949 0.12007 0.083138 0.18912 0.092562 0.20508 0.22266 0.01604 0.13001-0.16211 0.25-0.16211 0.25l-3.3242 2.5859v-0.5293c0.14724-1.4561-0.83223-2.9405-2.2754-3.2793-1.719-0.502-3.7931 1.0298-3.7931 2.6452 0 1.9182 0.00778 8.9247 0.00211 13.429-0.00211 1.6772 1.3577 3.0332 3.0332 3.0332s3.0352-1.3576 3.0352-3.0332v-0.39648c1.365 0.90898 2.7303 1.8174 4.0938 2.7285 1.1299 0.93021 2.9078 0.93859 3.9902-0.07422 1.3712-1.1518 1.323-3.4999-0.0918-4.5957-1.935-1.3219-3.8897-2.6181-5.8418-3.916l5.7734-4.4883c1.1632-0.90466 1.4954-2.5005 0.83398-3.7832-0.04938-0.095755-0.06511-0.12998-0.16797-0.16992-0.10277-0.039938-0.18425 0.00439-0.28711 0.042969-0.14138 0.053062-0.29257 0.080078-0.44531 0.080078-0.69894 0-1.2656-0.56662-1.2656-1.2656 9.4e-5 -0.094853 0.01636-0.14996-0.01172-0.20898-0.02807-0.059023-0.10233-0.097092-0.17578-0.10547-0.12191-0.013926-0.24437-0.020476-0.36719-0.019531-0.12049 8.587e-4 -0.21169-0.00952-0.26367-0.097656-0.05189-0.088142-0.02344-0.18975-0.02344-0.34961 0-0.86915-0.70504-1.5742-1.5742-1.5742z"/> 3 + <path d="m12.806 3.085a1.0735 1.0735 0 0 1-1.0735 1.0735 1.0735 1.0735 0 0 1-1.0735-1.0735 1.0735 1.0735 0 0 1 1.0735-1.0735 1.0735 1.0735 0 0 1 1.0735 1.0735z"/> 4 + <path d="m13.458 1.0033a0.70038 0.70038 0 0 1-0.70038 0.70038 0.70038 0.70038 0 0 1-0.70038-0.70038 0.70038 0.70038 0 0 1 0.70038-0.70038 0.70038 0.70038 0 0 1 0.70038 0.70038z"/> 5 + <path d="m11.339 0.48902a0.48902 0.48902 0 0 1-0.48902 0.48902 0.48902 0.48902 0 0 1-0.48902-0.48902 0.48902 0.48902 0 0 1 0.48902-0.48902 0.48902 0.48902 0 0 1 0.48902 0.48902z"/> 6 + <path d="m19.203 5.1296a0.85797 0.85797 0 0 1-0.85797 0.85797 0.85797 0.85797 0 0 1-0.85797-0.85797 0.85797 0.85797 0 0 1 0.85797-0.85797 0.85797 0.85797 0 0 1 0.85797 0.85797z"/> 7 + </svg>
+1
public/images/social_icons/linkedin.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/></svg>
+1
public/images/social_icons/mastodon.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M433 179.11c0-97.2-63.71-125.7-63.71-125.7-62.52-28.7-228.56-28.4-290.48 0 0 0-63.72 28.5-63.72 125.7 0 115.7-6.6 259.4 105.63 289.1 40.51 10.7 75.32 13 103.33 11.4 50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.54 102.54 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7 56.12-6.7 105-41.3 111.23-72.9 9.8-49.8 9-121.5 9-121.5zm-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175 25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5 11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1 23.71 27.3 18.4 53 18.4 175z"/></svg>
+6
public/images/social_icons/matrix.svg
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <svg version="1.1" id="icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 520 520" style="enable-background:new 0 0 520 520;" xml:space="preserve"> 3 + <path d="M13.7,11.9v496.2h35.7V520H0V0h49.4v11.9H13.7z"/> 4 + <path d="M166.3,169.2v25.1h0.7c6.7-9.6,14.8-17,24.2-22.2c9.4-5.3,20.3-7.9,32.5-7.9c11.7,0,22.4,2.3,32.1,6.8 c9.7,4.5,17,12.6,22.1,24c5.5-8.1,13-15.3,22.4-21.5c9.4-6.2,20.6-9.3,33.5-9.3c9.8,0,18.9,1.2,27.3,3.6c8.4,2.4,15.5,6.2,21.5,11.5 c6,5.3,10.6,12.1,14,20.6c3.3,8.5,5,18.7,5,30.7v124.1h-50.9V249.6c0-6.2-0.2-12.1-0.7-17.6c-0.5-5.5-1.8-10.3-3.9-14.3 c-2.2-4.1-5.3-7.3-9.5-9.7c-4.2-2.4-9.9-3.6-17-3.6c-7.2,0-13,1.4-17.4,4.1c-4.4,2.8-7.9,6.3-10.4,10.8c-2.5,4.4-4.2,9.4-5,15.1 c-0.8,5.6-1.3,11.3-1.3,17v103.3h-50.9v-104c0-5.5-0.1-10.9-0.4-16.3c-0.2-5.4-1.3-10.3-3.1-14.9c-1.8-4.5-4.8-8.2-9-10.9 c-4.2-2.7-10.3-4.1-18.5-4.1c-2.4,0-5.6,0.5-9.5,1.6c-3.9,1.1-7.8,3.1-11.5,6.1c-3.7,3-6.9,7.3-9.5,12.9c-2.6,5.6-3.9,13-3.9,22.1 v107.6h-50.9V169.2H166.3z"/> 5 + <path d="M506.3,508.1V11.9h-35.7V0H520v520h-49.4v-11.9H506.3z"/> 6 + </svg>
+1
public/images/social_icons/reddit.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M201.5 305.5c-13.8 0-24.9-11.1-24.9-24.6 0-13.8 11.1-24.9 24.9-24.9 13.6 0 24.6 11.1 24.6 24.9 0 13.6-11.1 24.6-24.6 24.6zM504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-132.3-41.2c-9.4 0-17.7 3.9-23.8 10-22.4-15.5-52.6-25.5-86.1-26.6l17.4-78.3 55.4 12.5c0 13.6 11.1 24.6 24.6 24.6 13.8 0 24.9-11.3 24.9-24.9s-11.1-24.9-24.9-24.9c-9.7 0-18 5.8-22.1 13.8l-61.2-13.6c-3-.8-6.1 1.4-6.9 4.4l-19.1 86.4c-33.2 1.4-63.1 11.3-85.5 26.8-6.1-6.4-14.7-10.2-24.1-10.2-34.9 0-46.3 46.9-14.4 62.8-1.1 5-1.7 10.2-1.7 15.5 0 52.6 59.2 95.2 132 95.2 73.1 0 132.3-42.6 132.3-95.2 0-5.3-.6-10.8-1.9-15.8 31.3-16 19.8-62.5-14.9-62.5zM302.8 331c-18.2 18.2-76.1 17.9-93.6 0-2.2-2.2-6.1-2.2-8.3 0-2.5 2.5-2.5 6.4 0 8.6 22.8 22.8 87.3 22.8 110.2 0 2.5-2.2 2.5-6.1 0-8.6-2.2-2.2-6.1-2.2-8.3 0zm7.7-75c-13.6 0-24.6 11.1-24.6 24.9 0 13.6 11.1 24.6 24.6 24.6 13.8 0 24.9-11.1 24.9-24.6 0-13.8-11-24.9-24.9-24.9z"/></svg>
+1
public/images/social_icons/rss.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M0 64C0 46.3 14.3 32 32 32c229.8 0 416 186.2 416 416c0 17.7-14.3 32-32 32s-32-14.3-32-32C384 253.6 226.4 96 32 96C14.3 96 0 81.7 0 64zM128 416c0 35.3-28.7 64-64 64s-64-28.7-64-64s28.7-64 64-64s64 28.7 64 64zM32 160c159.1 0 288 128.9 288 288c0 17.7-14.3 32-32 32s-32-14.3-32-32c0-123.7-100.3-224-224-224c-17.7 0-32-14.3-32-32s14.3-32 32-32z"/></svg>
+1
public/images/social_icons/signal.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M194.6 7.5l5.8 23.3C177.7 36.3 156 45.3 136 57.4L123.7 36.8c22-13.3 45.9-23.2 70.9-29.3zm122.9 0l-5.8 23.3C334.3 36.3 356 45.3 376 57.4l12.4-20.6c-22-13.3-46-23.2-71-29.3zM36.8 123.7c-13.3 22-23.2 45.9-29.3 70.9l23.3 5.8C36.3 177.7 45.3 156 57.4 136L36.8 123.7zM24 256c0-11.6 .9-23.3 2.6-34.8L2.9 217.6c-3.8 25.4-3.8 51.3 0 76.7l23.7-3.6C24.9 279.3 24 267.6 24 256zM388.3 475.2L376 454.6c-20 12.1-41.6 21-64.2 26.6l5.8 23.3c24.9-6.2 48.8-16 70.8-29.3zM488 256c0 11.6-.9 23.3-2.6 34.8l23.7 3.6c3.8-25.4 3.8-51.3 0-76.7l-23.7 3.6c1.7 11.5 2.6 23.1 2.6 34.8zm16.5 61.4l-23.3-5.8c-5.6 22.7-14.5 44.3-26.6 64.3l20.6 12.4c13.3-22 23.2-46 29.3-71zm-213.8 168c-23 3.5-46.5 3.5-69.5 0l-3.6 23.7c25.4 3.8 51.3 3.8 76.7 0l-3.6-23.7zm152-91.8c-13.8 18.7-30.4 35.3-49.2 49.1l14.2 19.3c20.7-15.2 39-33.4 54.2-54.1l-19.3-14.4zM393.6 69.2c18.8 13.8 35.3 30.4 49.2 49.2L462.1 104C446.9 83.4 428.6 65.1 408 49.9L393.6 69.2zM69.2 118.4c13.8-18.8 30.4-35.3 49.2-49.2L104 49.9C83.4 65.1 65.1 83.4 49.9 104l19.3 14.4zm406 5.3L454.6 136c12.1 20 21 41.6 26.6 64.2l23.3-5.8c-6.2-24.9-16-48.8-29.3-70.8zm-254-97.1c23-3.5 46.5-3.5 69.5 0l3.6-23.7C268.9-1 243.1-1 217.6 2.9l3.6 23.7zM81.6 468.4L32 480l11.6-49.6L20.2 425 8.6 474.5c-.9 4-.8 8.1 .3 12.1s3.2 7.5 6.1 10.4s6.5 5 10.4 6.1s8.1 1.2 12.1 .3L87 492l-5.4-23.6zM25.2 403.6L48.6 409l8-34.4c-11.7-19.6-20.4-40.8-25.8-63L7.5 317.4c5.2 21.2 13.2 41.7 23.6 60.8l-5.9 25.3zm112 52l-34.4 8 5.4 23.4 25.3-5.9c19.2 10.4 39.6 18.4 60.8 23.6l5.8-23.3c-22.1-5.5-43.3-14.3-62.8-26l-.2 .2zM256 48c-37.2 0-73.6 10-105.6 28.9s-58.4 46-76.3 78.6s-26.9 69.3-25.8 106.4s12 73.3 31.8 104.8L60 452l85.3-20c27.3 17.2 58.2 27.8 90.3 31s64.5-1.1 94.6-12.6s57.2-29.8 79-53.6s37.8-52.2 46.8-83.2s10.5-63.6 4.7-95.3s-19-61.6-38.4-87.4s-44.5-46.7-73.4-61S288.3 48 256 48z"/></svg>
+1
public/images/social_icons/spotify.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M248 8C111.1 8 0 119.1 0 256s111.1 248 248 248 248-111.1 248-248S384.9 8 248 8zm100.7 364.9c-4.2 0-6.8-1.3-10.7-3.6-62.4-37.6-135-39.2-206.7-24.5-3.9 1-9 2.6-11.9 2.6-9.7 0-15.8-7.7-15.8-15.8 0-10.3 6.1-15.2 13.6-16.8 81.9-18.1 165.6-16.5 237 26.2 6.1 3.9 9.7 7.4 9.7 16.5s-7.1 15.4-15.2 15.4zm26.9-65.6c-5.2 0-8.7-2.3-12.3-4.2-62.5-37-155.7-51.9-238.6-29.4-4.8 1.3-7.4 2.6-11.9 2.6-10.7 0-19.4-8.7-19.4-19.4s5.2-17.8 15.5-20.7c27.8-7.8 56.2-13.6 97.8-13.6 64.9 0 127.6 16.1 177 45.5 8.1 4.8 11.3 11 11.3 19.7-.1 10.8-8.5 19.5-19.4 19.5zm31-76.2c-5.2 0-8.4-1.3-12.9-3.9-71.2-42.5-198.5-52.7-280.9-29.7-3.6 1-8.1 2.6-12.9 2.6-13.2 0-23.3-10.3-23.3-23.6 0-13.6 8.4-21.3 17.4-23.9 35.2-10.3 74.6-15.2 117.5-15.2 73 0 149.5 15.2 205.4 47.8 7.8 4.5 12.9 10.7 12.9 22.6 0 13.6-11 23.3-23.2 23.3z"/></svg>
+1
public/images/social_icons/stackexchange.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free v7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M18.1 332.3l412.7 0 0 22c0 37.7-29.3 68-65.3 68l-19 0-86.8 89.7 0-89.7-176.3 0c-36 0-65.3-30.3-65.3-68l0-22zm0-23.6l412.7 0 0-85-412.7 0 0 85zm0-109.4l412.7 0 0-85-412.7 0 0 85zM365.4 0L83.4 0c-36 0-65.3 30.3-65.3 67.7l0 22.3 412.7 0 0-22.3C430.7 30.3 401.4 0 365.4 0z"/></svg>
+1
public/images/social_icons/stackoverflow.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free v7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M419 375L223.3 333.7L215.1 373L410.8 414L419 375zM470 288L316.5 159.7L291 190.5L444.5 318.8L470 288zM438.8 327.7L257.5 243L240.8 279.5L422 364L438.8 327.7zM390.3 96L358.3 120L477.6 280.3L509.6 256.3L390.3 96zM410.8 424L210.8 424L210.8 463.7L410.8 463.7L410.8 424zM450.5 504L171 504L171 384L131 384L131 544L490.5 544L490.5 384L450.5 384L450.5 504z"/></svg>
+1
public/images/social_icons/steam.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M496 256c0 137-111.2 248-248.4 248-113.8 0-209.6-76.3-239-180.4l95.2 39.3c6.4 32.1 34.9 56.4 68.9 56.4 39.2 0 71.9-32.4 70.2-73.5l84.5-60.2c52.1 1.3 95.8-40.9 95.8-93.5 0-51.6-42-93.5-93.7-93.5s-93.7 42-93.7 93.5v1.2L176.6 279c-15.5-.9-30.7 3.4-43.5 12.1L0 236.1C10.2 108.4 117.1 8 247.6 8 384.8 8 496 119 496 256zM155.7 384.3l-30.5-12.6a52.8 52.8 0 0 0 27.2 25.8c26.9 11.2 57.8-1.6 69-28.4 5.4-13 5.5-27.3 .1-40.3-5.4-13-15.5-23.2-28.5-28.6-12.9-5.4-26.7-5.2-38.9-.6l31.5 13c19.8 8.2 29.2 30.9 20.9 50.7-8.3 19.9-31 29.2-50.8 21zm173.8-129.9c-34.4 0-62.4-28-62.4-62.3s28-62.3 62.4-62.3 62.4 28 62.4 62.3-27.9 62.3-62.4 62.3zm.1-15.6c25.9 0 46.9-21 46.9-46.8 0-25.9-21-46.8-46.9-46.8s-46.9 21-46.9 46.8c.1 25.8 21.1 46.8 46.9 46.8z"/></svg>
+1
public/images/social_icons/telegram.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M248,8C111.033,8,0,119.033,0,256S111.033,504,248,504,496,392.967,496,256,384.967,8,248,8ZM362.952,176.66c-3.732,39.215-19.881,134.378-28.1,178.3-3.476,18.584-10.322,24.816-16.948,25.425-14.4,1.326-25.338-9.517-39.287-18.661-21.827-14.308-34.158-23.215-55.346-37.177-24.485-16.135-8.612-25,5.342-39.5,3.652-3.793,67.107-61.51,68.335-66.746.153-.655.3-3.1-1.154-4.384s-3.59-.849-5.135-.5q-3.283.746-104.608,69.142-14.845,10.194-26.894,9.934c-8.855-.191-25.888-5.006-38.551-9.123-15.531-5.048-27.875-7.717-26.8-16.291q.84-6.7,18.45-13.7,108.446-47.248,144.628-62.3c68.872-28.647,83.183-33.623,92.511-33.789,2.052-.034,6.639.474,9.61,2.885a10.452,10.452,0,0,1,3.53,6.716A43.765,43.765,0,0,1,362.952,176.66Z"/></svg>
+1
public/images/social_icons/x.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/></svg>
+1
public/images/social_icons/youtube.svg
··· 1 + <svg id="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"/></svg>
+65
public/index.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + 4 + <head> 5 + <meta charset="utf-8"> 6 + <meta name="viewport" content="width=device-width, initial-scale=1"> 7 + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src-attr 'unsafe-inline'"> 8 + 9 + <title>Guillermo Serrahima</title> 10 + 11 + <link rel="preload" href="https://vylion.com/fonts/FiraCode-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous"> 12 + <link rel="preload" href="https://vylion.com/fonts/FiraCode-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous"> 13 + <link rel="stylesheet" href="https://vylion.com/css/style.css?h=248e65e1431b5c897468"> 14 + <script src="https://vylion.com/js/auto-close-popover-on-resize.js?h=4ef87d6fc7b98b22e044" defer></script> 15 + <script src="https://vylion.com/js/copy-code-to-clipboard.js?h=6aac77c47d552a0ac847" defer></script> 16 + 17 + <link rel="canonical" href="https://vylion.com/"> 18 + 19 + <meta name="robots" content="index, follow"> 20 + <meta name="theme-color" content="#211f1a"> 21 + <meta name="color-scheme" content="dark"> 22 + 23 + <meta property="og:title" content="Guillermo Serrahima"> 24 + <meta property="og:type" content="website"> 25 + <meta property="og:url" content="https://vylion.com/"> 26 + <meta property="og:site_name" content="Guillermo Serrahima"> 27 + <meta property="og:updated_time" content="2025-12-11T16:34:53.465510625+01:00"> 28 + </head> 29 + 30 + <body class="layout-center"> 31 + <header class="header"> 32 + <div class="header-container"> 33 + <span class="header-logo-container"> 34 + <a href="https://vylion.com"> 35 + <span class="logo">Guillermo Serrahima</span> 36 + </a> 37 + </span> 38 + </div> 39 + </header> 40 + <main id="main"> 41 + <header class="content"> 42 + <p>Hello! I'm Guillermo Serrahima, a Software Engineer from the area of Barcelona, Spain. This is my personal site.</p> 43 + <p>Maybe you'd like to check out the different sections:</p> 44 + </header> 45 + <article class="post"> 46 + <header> 47 + <h2 class="post-title"> 48 + <a href="https://vylion.com/cv/">My CV</a> 49 + </h2> 50 + <ul class="post-meta hidden"> 51 + </ul> 52 + </header> 53 + <a class="read-more" href="https://vylion.com/cv/" aria-label="Read more about My CV">read more →</a> 54 + </article> 55 + </main> 56 + <footer class="footer"> 57 + <p class="copyright"> 58 + <span>© <time>2025</time></span> 59 + <span>Powered by <a href="https://www.getzola.org">Zola</a></span> 60 + <span>Theme by <a href="https://eyalkalderon.com">ebkalderon</a></span> 61 + </p> 62 + </footer> 63 + </body> 64 + 65 + </html>
+8
public/js/auto-close-popover-on-resize.js
··· 1 + const menu = document.querySelector("[popover]"); 2 + const query = matchMedia("(min-width: 684px)"); 3 + 4 + query.addEventListener("change", (event) => { 5 + if (event.matches && menu.checkVisibility()) { 6 + menu.hidePopover(); 7 + } 8 + })
+30
public/js/copy-code-to-clipboard.js
··· 1 + const code_blocks = document.querySelectorAll("pre code[data-lang]"); 2 + 3 + for (const code_block of code_blocks) { 4 + let content; 5 + if (code_block.parentElement.hasAttribute("data-linenos")) { 6 + content = [...code_block.querySelectorAll("tr")] 7 + .map((row) => row.querySelector("td:last-child")?.innerText ?? "") 8 + .join(""); 9 + } else { 10 + content = code_block.innerText.split("\n").filter(Boolean).join("\n"); 11 + } 12 + 13 + // Copy to clipboard 14 + if (navigator.clipboard !== undefined) { 15 + const copyButton = document.createElement("button"); 16 + copyButton.classList.add("copy-button"); 17 + copyButton.innerText = "Copy"; 18 + 19 + copyButton.addEventListener("click", () => { 20 + copyButton.innerText = "Copied!"; 21 + setTimeout(() => { 22 + copyButton.innerText = "Copy"; 23 + }, 1000); 24 + 25 + navigator.clipboard.writeText(content); 26 + }); 27 + 28 + code_block.prepend(copyButton); 29 + } 30 + }
+211
public/js/theme-switcher.js
··· 1 + /** 2 + * Theme Switcher - Runtime theme switching with localStorage persistence 3 + */ 4 + class ThemeSwitcher { 5 + constructor() { 6 + this.themes = { 7 + terminus: "🔥 Terminus", 8 + "tokyo-night": "🌃 Tokyo Night", 9 + "solarized-dark": "🌅 Solarized", 10 + nord: "❄️ Nord", 11 + "one-dark": "🌙 One Dark", 12 + "gruvbox-dark": "🍂 Gruvbox", 13 + "oled-abyss": "🌑 OLED Abyss", 14 + "solar-flare": "☀️ Solar Flare", 15 + }; 16 + 17 + this.currentTheme = this.getStoredTheme(); 18 + this.originalTheme = this.currentTheme; // Track the persistent theme 19 + this.init(); 20 + } 21 + 22 + getStoredTheme() { 23 + // Priority: localStorage > system preference > default 24 + const stored = localStorage.getItem("theme"); 25 + if (stored && this.themes[stored]) { 26 + return stored; 27 + } 28 + 29 + // Fallback if no system preference detected 30 + return document.body.getAttribute("data-theme"); 31 + } 32 + 33 + init() { 34 + this.applyTheme(this.currentTheme); 35 + this.createThemeSelector(); 36 + } 37 + 38 + applyTheme(themeName) { 39 + if (!this.themes[themeName]) return; 40 + 41 + document.body.setAttribute("data-theme", themeName); 42 + localStorage.setItem("theme", themeName); 43 + this.currentTheme = themeName; 44 + this.originalTheme = themeName; // Track the "real" theme 45 + 46 + // Update selector if it exists 47 + const selector = document.querySelector(".theme-selector select"); 48 + if (selector) { 49 + selector.value = themeName; 50 + } 51 + 52 + // Update meta theme-color for browser chrome 53 + this.updateMetaThemeColor(themeName); 54 + } 55 + 56 + previewTheme(themeName) { 57 + if (!this.themes[themeName]) return; 58 + 59 + // Store original theme if not already stored 60 + if (!this.originalTheme) { 61 + this.originalTheme = this.currentTheme; 62 + } 63 + 64 + // Apply preview theme (but don't save to localStorage) 65 + document.body.setAttribute("data-theme", themeName); 66 + this.updateMetaThemeColor(themeName); 67 + } 68 + 69 + restoreTheme() { 70 + if ( 71 + this.originalTheme && 72 + this.originalTheme !== document.body.getAttribute("data-theme") 73 + ) { 74 + document.body.setAttribute("data-theme", this.originalTheme); 75 + this.updateMetaThemeColor(this.originalTheme); 76 + } 77 + } 78 + 79 + updateMetaThemeColor(themeName) { 80 + const themeColors = { 81 + terminus: "#211f1a", 82 + "tokyo-night": "#1a1b26", 83 + "solarized-dark": "#002b36", 84 + nord: "#2e3440", 85 + "one-dark": "#282c34", 86 + "gruvbox-dark": "#282828", 87 + "oled-abyss": "#000000", 88 + "solar-flare": "#ffffff", 89 + }; 90 + 91 + const metaTheme = document.querySelector('meta[name="theme-color"]'); 92 + if (metaTheme && themeColors[themeName]) { 93 + metaTheme.setAttribute("content", themeColors[themeName]); 94 + } 95 + } 96 + 97 + createThemeSelector() { 98 + // Find the menu items list to add theme selector 99 + const menuItems = document.querySelector(".main-menu-items"); 100 + if (!menuItems) { 101 + console.warn("Could not find menu to add theme selector"); 102 + return; 103 + } 104 + 105 + const selectorHTML = ` 106 + <li class="theme-selector"> 107 + <a href="#" class="theme-trigger" aria-expanded="false" aria-haspopup="true"> 108 + Theme ↓<span class="sr-only"> (click to change theme)</span> 109 + </a> 110 + <ul class="theme-dropdown" role="menu"> 111 + ${Object.entries(this.themes) 112 + .map( 113 + ([key, name]) => 114 + `<li><a href="#" class="theme-option ${key === this.currentTheme ? "terminus" : ""}" data-theme="${key}" role="menuitem">${name}</a></li>`, 115 + ) 116 + .join("")} 117 + </ul> 118 + </li> 119 + `; 120 + 121 + menuItems.insertAdjacentHTML("beforeend", selectorHTML); 122 + 123 + // Add event listeners 124 + const trigger = menuItems.querySelector(".theme-trigger"); 125 + const dropdown = menuItems.querySelector(".theme-dropdown"); 126 + const options = menuItems.querySelectorAll(".theme-option"); 127 + 128 + // Show dropdown on hover and click 129 + const showDropdown = () => { 130 + dropdown.classList.add("show"); 131 + trigger.setAttribute("aria-expanded", "true"); 132 + }; 133 + 134 + const hideDropdown = () => { 135 + dropdown.classList.remove("show"); 136 + trigger.setAttribute("aria-expanded", "false"); 137 + }; 138 + 139 + // Toggle dropdown on click 140 + trigger.addEventListener("click", (e) => { 141 + e.preventDefault(); 142 + const isOpen = dropdown.classList.contains("show"); 143 + if (isOpen) { 144 + hideDropdown(); 145 + } else { 146 + showDropdown(); 147 + } 148 + }); 149 + 150 + // Get the selector container for hover management 151 + const selector = menuItems.querySelector(".theme-selector"); 152 + 153 + // Show on hover (with slight delay to prevent flicker) 154 + let hoverTimeout; 155 + selector.addEventListener("mouseenter", () => { 156 + clearTimeout(hoverTimeout); 157 + showDropdown(); 158 + }); 159 + 160 + // Hide when leaving the entire selector area (with small delay) 161 + selector.addEventListener("mouseleave", () => { 162 + hoverTimeout = setTimeout(() => { 163 + hideDropdown(); 164 + this.restoreTheme(); // Restore original theme when closing dropdown 165 + }, 100); 166 + }); 167 + 168 + // Cancel hide if mouse re-enters 169 + selector.addEventListener("mouseenter", () => { 170 + clearTimeout(hoverTimeout); 171 + }); 172 + 173 + // Theme selection and preview 174 + options.forEach((option) => { 175 + // Preview theme on hover 176 + option.addEventListener("mouseenter", (e) => { 177 + const previewTheme = e.target.dataset.theme; 178 + this.previewTheme(previewTheme); 179 + }); 180 + 181 + // Apply theme permanently on click 182 + option.addEventListener("click", (e) => { 183 + e.preventDefault(); 184 + const theme = e.target.dataset.theme; 185 + this.applyTheme(theme); 186 + 187 + // Update current selection highlighting 188 + options.forEach((opt) => opt.classList.remove("current")); 189 + e.target.classList.add("current"); 190 + 191 + // Close dropdown 192 + hideDropdown(); 193 + }); 194 + }); 195 + 196 + // Close dropdown when clicking outside 197 + document.addEventListener("click", (e) => { 198 + if (!e.target.closest(".theme-selector")) { 199 + hideDropdown(); 200 + this.restoreTheme(); // Restore original theme when clicking outside 201 + } 202 + }); 203 + } 204 + } 205 + 206 + // Initialize when DOM is ready 207 + if (document.readyState === "loading") { 208 + document.addEventListener("DOMContentLoaded", () => new ThemeSwitcher()); 209 + } else { 210 + new ThemeSwitcher(); 211 + }
+4
public/robots.txt
··· 1 + User-agent: * 2 + Disallow: 3 + Allow: / 4 + Sitemap: https://vylion.com/sitemap.xml
+1
public/search_index.en.js
··· 1 + window.searchIndex = {"fields":["title","body"],"pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5","index":{"body":{"root":{"docs":{},"df":0,"0":{"docs":{},"df":0,"8":{"docs":{},"df":0,"9":{"docs":{},"df":0,"5":{"docs":{},"df":0,"0":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"2":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1,"0":{"docs":{},"df":0,"1":{"docs":{},"df":0,"2":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"8":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1},"9":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"2":{"docs":{},"df":0,"0":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"1":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1},"2":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1},"4":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1},"5":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"6":{"docs":{},"df":0,"3":{"docs":{},"df":0,"7":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"7":{"docs":{},"df":0,"8":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"8":{"docs":{},"df":0,"8":{"docs":{},"df":0,"4":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"9":{"docs":{},"df":0,"1":{"docs":{},"df":0,"1":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"d":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}},"s":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1},"p":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"a":{"docs":{"https://vylion.com/":{"tf":1.0},"https://vylion.com/cv/":{"tf":1.0}},"df":2}}},"t":{"docs":{},"df":0,"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"g":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"k":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}},"w":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}},"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{"https://vylion.com/":{"tf":1.0},"https://vylion.com/cv/":{"tf":2.449489742783178}},"df":2}}}}}}},"s":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}},"o":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1,"h":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"g":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"c":{"docs":{"https://vylion.com/cv/":{"tf":3.0}},"df":1,"1":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"a":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://vylion.com/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"/":{"docs":{},"df":0,"c":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":2.449489742783178}},"df":1}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1,".":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,".":{"docs":{},"df":0,"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/cv/":{"tf":2.23606797749979}},"df":1}},"m":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"v":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}},"y":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}},"e":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"y":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"k":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"https://vylion.com/cv/":{"tf":3.605551275463989}},"df":1}}}},"o":{"docs":{},"df":0,"p":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/":{"tf":1.0},"https://vylion.com/cv/":{"tf":1.0}},"df":2}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"p":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/":{"tf":1.0},"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":2}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"x":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"x":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1,"h":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"c":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}}},"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{"https://vylion.com/":{"tf":1.0},"https://vylion.com/cv/":{"tf":1.0}},"df":2}}}}}}}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{"https://vylion.com/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/":{"tf":1.0},"https://vylion.com/cv/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":2.0}},"df":1}}},"p":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"'":{"docs":{},"df":0,"m":{"docs":{"https://vylion.com/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"v":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"c":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://vylion.com/cv/":{"tf":2.8284271247461903}},"df":1}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}},"r":{"docs":{},"df":0,"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"u":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"j":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"v":{"docs":{},"df":0,"a":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"k":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":2.0}},"df":1}}}},"t":{"docs":{},"df":0,"b":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"n":{"docs":{"https://vylion.com/cv/":{"tf":2.0}},"df":1,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}}},"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"y":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1,"1":{"docs":{},"df":0,".":{"docs":{},"df":0,"t":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{},"df":0,".":{"docs":{},"df":0,"v":{"docs":{},"df":0,"y":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,".":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}},"w":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"g":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}},"n":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"x":{"docs":{"https://vylion.com/cv/":{"tf":2.0}},"df":1}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":2.23606797749979}},"df":1}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,".":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,".":{"docs":{},"df":0,"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"x":{"docs":{},"df":0,".":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"g":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}},"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1}}}}}},"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"k":{"docs":{},"df":0,"o":{"docs":{},"df":0,"v":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"y":{"docs":{},"df":0,"b":{"docs":{"https://vylion.com/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"q":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"x":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1,"c":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}},"o":{"docs":{},"df":0,"v":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"w":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}},"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"s":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}},"d":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1,"f":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":2.23606797749979}},"df":1}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/":{"tf":1.0},"https://vylion.com/cv/":{"tf":2.6457513110645907}},"df":2}}}}},"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1}}}}}},"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"y":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":2.23606797749979}},"df":1}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"q":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"x":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}},"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":2.0}},"df":1}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":2.449489742783178}},"df":1}}}},"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":2.8284271247461903}},"df":1}}}}}},"y":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}},"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":2.6457513110645907}},"df":1}}}}}},"q":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"k":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"&":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,";":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"y":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1}}}}}},"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}},"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":2.0}},"df":1}}},"p":{"docs":{},"df":0,"o":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1,"r":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}},"u":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"k":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"a":{"docs":{"https://vylion.com/cv/":{"tf":2.0}},"df":1}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{"https://vylion.com/":{"tf":1.0},"https://vylion.com/cv/":{"tf":1.0}},"df":2}}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":2.449489742783178}},"df":1}},"i":{"docs":{},"df":0,"c":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1}}}},"t":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1}}}},"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/":{"tf":1.0},"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":2}}},"o":{"docs":{},"df":0,"f":{"docs":{},"df":0,"t":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/":{"tf":1.0},"https://vylion.com/cv/":{"tf":2.0}},"df":2}}}}},"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/":{"tf":1.0},"https://vylion.com/cv/":{"tf":1.0}},"df":2}},"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"q":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"o":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1}}}},"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}},"h":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":2.8284271247461903}},"df":1}}},"y":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}}}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"s":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}}},"p":{"docs":{"https://vylion.com/cv/":{"tf":1.7320508075688772}},"df":1},"s":{"docs":{"https://vylion.com/cv/":{"tf":2.8284271247461903}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1},"s":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"y":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://vylion.com/cv/":{"tf":2.0}},"df":1}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vylion.com/cv/":{"tf":1.4142135623730951}},"df":1}}}}}},"s":{"docs":{},"df":0,"l":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}}},"y":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"'":{"docs":{},"df":0,"d":{"docs":{"https://vylion.com/":{"tf":1.0}},"df":1}}}}}}},"title":{"root":{"docs":{},"df":0,"c":{"docs":{},"df":0,"v":{"docs":{"https://vylion.com/cv/":{"tf":1.0}},"df":1}},"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://vylion.com/":{"tf":1.0}},"df":1}}}}}}},"documentStore":{"save":true,"docs":{"https://vylion.com/":{"body":"Hello! I'm Guillermo Serrahima, a Software Engineer from the area of Barcelona, Spain. This is my personal site.\nMaybe you'd like to check out the different sections:\n","id":"https://vylion.com/","title":"Home"},"https://vylion.com/cv/":{"body":"Who am I\nI am Guillermo Serrahima, a Software Engineer from the area of Barcelona, where I currently live. I graduated from the Polytechnic University of Barcelona with a Degree in Informatics Engineering in 2018.\nI am most comfortable when I am working with C++, Java, Python and Rust code. I am familiar with Git, Linux, and the command line. In my day to day I use Arch Linux as my main OS.\nIn addition, I have worked in the past with other languages like Golang, C, C#. I have worked on projects that used PostgreSQL, and I maintain SQLite and MySQL databases on my personal servers (depending on the scope.) I have used testing frameworks like GoogleTest and Pytest, and used CI/CD pipelines like Jenkins and GitHub CI/CD. I also regularly use Docker containers on both a profesional environment and my personal servers.\nLanguages\nI speak Spanish and Catalan natively, and I obtained a C1 level recognition in English through the CAE in 2012.\nPrevious Experience\nAnsys (now part of Synopsys)\n\nLocation: Madrid (remote)\nPosition: R&amp;D Engineer\nProjects:\n\nDeveloping a software tool on Python, to allow configuration of model-based physics simuations by clients with no code knowledge required, by way of drag-and-drop design.\nRefactoring a Dash Mantine wrapper library for Python, with the goal of open-sourcing said library.\n\n\nTools: Python, Pytest, Poetry, GitHub CI/CD, GitHub Actions, Docker, WSL, Windows\nPeriod: 2024 Aug. - 2025 Nov.\n\nVerbio (now Verbio by Capacity)\n\nLocation: Barcelona (remote)\nPosition: Backend Developer\nProjects:\n\nDeveloping a GRPC API gateway for a SaaS product written in Rust during the initial stages of commercialization of the product.\nDeveloping client tools written in Python for integrating AWS storage with the SaaS product.\nDeveloping Terraform deployment scripts for hosting the different components of the SaaS product on AWS infrastructure.\nExtension of the internal REST API and database backend for a Dashboard of product metrics.\n\n\nTools: Jetbrains CLion (with Rust plugin), Cargo, GitLab CI/CD, Terraform, Python, Docker, Linux\nPeriod: 2022 Jun. - 2024 Jul.\n\nQAD DynaSys\n\nLocation: Barcelona (remote)\nPosition: Software Developer\nProjects:\n\nRefactoring of a C++ desktop app to allow servicing the desktop app as a SaaS product.\nDeveloping a C#-based frontend for interfacing with the C++ desktop app code.\n\n\nTools: Visual Studio, Windows\nPeriod: 2021 Jun. - 2022 Jun.\n\nCapitole Consulting\n\nLocation: Barcelona (remote)\nPosition: Software Developer\nProjects:\n\nDeveloping a Python tool for the processing of analysis results and generation of PDF reports.\nRefactoring of the analysis results data structures for use in the previous tool, and improve maintainability.\nFixing bugs and performance issues in a C++ application.\n\n\nPeriod: 2021 Jan. - Jun.\n\nHP Inc.\n\nLocation: Barcelona\nPosition: Junior SDET (2018), Junior DevOps (2019)\nProjects:\n\nDeveloping C++ unit and integration tests.\nMaintaining several Jenkins instances as a private CI/CD pipeline solution.\n\n\nTools: GoogleTest, VS Code, Jenkins, Jira, Linux\nPeriod: Sep. 2018 - Sep. 2020\n\nMiscellanea\nI host several tiny personal servers (recycled computers at home + a cloud VPS) with services for my own needs. Some of the services I host are:\n\nAn instance of Nextcloud (a cloud drive solution) at cloud.sepo.family\nAn instance of Authentik (an SSO solution) at login.sepo.family\nSeveral private instances of Portainer CE (one for each of my servers)\nA private instance of RustDesk\nA PDS ATProto server for hosting my own profile\nA knot server on knot1.tngl.vylion.com for my own Tangled repos\n\nI currently use a custom built keyboard running my own firmware developed in C++ with QMK.\nIn the past I have developed a Markov chain bot for Telegram.\nI want to work on the following projects next:\n\nFill my personal site with content.\nSet up an Anubis instance in front of my personal site.\nSet up a private instance of Jenkins for personal use.\nSet up my own Spindle instance as a Tangled CI/CD pipeline for my personal Tangled projects.\nLearn JavaScript, TypeScript and React for fullstack development.\n\nContact\nI can be contacted by email at gserrahima at mailbox.org.\nMy phone number is (+ ES Prefix) 637 911 884.\nMy address is Carrer Ignasi Iglesias 78, 2-2, in Esplugues de Llobregat, with postal code 08950 (in Spain, Europe.)\n","id":"https://vylion.com/cv/","title":"My CV"}},"docInfo":{"https://vylion.com/":{"body":17,"title":1},"https://vylion.com/cv/":{"body":456,"title":1}},"length":2},"lang":"English"}
+9
public/sitemap.xml
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 3 + <url> 4 + <loc>https://vylion.com/</loc> 5 + </url> 6 + <url> 7 + <loc>https://vylion.com/cv/</loc> 8 + </url> 9 + </urlset>