-1
.gitignore
-1
.gitignore
···
1
-
public/
+52
public/404.html
+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
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
+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&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
+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
public/fonts/FiraCode-Bold.woff2
This is a binary file and will not be displayed.
public/fonts/FiraCode-Regular.woff2
public/fonts/FiraCode-Regular.woff2
This is a binary file and will not be displayed.
+93
public/fonts/LICENSE
+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.
+65
public/index.html
+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
+8
public/js/auto-close-popover-on-resize.js
+30
public/js/copy-code-to-clipboard.js
+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
+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
+4
public/robots.txt
+1
public/search_index.en.js
+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&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"}