Files
website-build/build/article-make-regex-engine-1.typ.min.html
2025-08-29 15:28:30 +02:00

490 lines
101 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<title>Introduction to RegEx</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" sizes="512x512" href="res/favicon.png">
<link rel="image_src" type="image/png" href="res/favicon.png">
<link type="application/atom+xml" rel="alternate" title="alexs168's blog" href="atom.xml">
</head>
<body>
<style>
@font-face {
font-family: 'DejaVu Sans Mono';
src:local('DejaVu Sans Mono'),
url('res/DejaVuSansMono.woff2') format('woff2'),
local('Courier New'),
local(Courier),
local(monospace);
font-weight: normal;
font-style: normal;
font-display: swap;
}
/*
@font-face {
font-family: 'DejaVu Sans Mono';
src:local('DejaVu Sans Mono'),
url('res/DejaVuSansMono-Bold.woff2') format('woff2'),
local('Courier New'),
local(Courier),
local(monospace);
font-weight: bold;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'DejaVu Sans';
src:local('DejaVu Sans'),
url('res/DejaVuSans-Bold.woff2') format('woff2'),
local('Courier New');
font-weight: bold;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'DejaVu Sans';
src:local('DejaVu Sans'),
url('res/DejaVuSans.woff2') format('woff2'),
local('Courier New');
font-weight: normal;
font-style: normal;
font-display: swap;
}*/
body {
font-family: DejaVu Sans Mono;
font-size: 10pt;
}
td {
width: 100%;
display: inline;
vertical-align: top;
}
h1,h2,h3,h4 {
margin-top: 1%;
margin-bottom: 0.75%;
}
p {
margin-top: 0.75%;
margin-bottom: 0.75%;
}
ul {
margin-top: 0%;
}
.current {
font-weight: bold;
}
pre {
margin-top: 0px;
margin-bottom: 0px;
display: inline;
}
a {
color: #3f51b5;
text-decoration: none;
}
a:visited {
color: #3f51b5;
text-decoration: none;
}
</style>
<div style="
">
<p><br></p>
<h1>Making a simple RegEx engine:
Part 1: Introduction to RegEx</h1>
<p><span style="font-size: 9pt"><p>Git revision <a href="https://github.com/alex-s168/website/tree/fee2a36453b624f2e6ede5186b5f3e59aa3e6cc7">#fee2a364</a></p><p><br>Modified at 26. July 2025 14:20</p><p>Written by <a href="https://alex.vxcc.dev">alex_s168</a></p></span></p>
</div>
<div style="
">
<p><br><span style="text-decoration: underline"><h2>Introduction</h2></span> If you are any kind of programmer, youve probably heard of <a href="https://en.wikipedia.org/wiki/Regular_expression">RegEx</a></p>
<p>RegEx (Regular expression) is kind of like a small programming language used to define string search and replace patterns.</p>
<p><br>RegEx might seem overwhelming at first, but you can learn the most important features of RegEx very quickly.</p>
<p><br>It is important to mention that there is not a single standard for RegEx syntax, but instead each “implementation” has its own quirks, and additional features. Most common features however behave identically on most RegEx “engines”/implementations.</p>
</div>
<div style="
">
<p><br><span style="text-decoration: underline"><h2>Syntax</h2></span> The behavior of RegEx expressions / patterns depends on the match options passed to the RegEx engine.</p>
<p>Common match options<span id="match-options">:</span></p>
<ul>
<li>Anchored at start and end of line</li>
<li>Case insensitive</li>
<li>multi-line or instead whole string</li>
</ul>
</div>
<div style="
"><br><span style="text-decoration: underline"><h3>“Atoms”</h3></span> In this article, we will refer to single expression parts as “atoms”.</div>
<div style="
"><br><span style="text-decoration: underline"><h4>Characters</h4></span> Just use the character that you want to match. For example <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">a</code></span> to match an <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">a</code></span>. This however does not work for all characters, because many are part of special RegEx syntax.</div>
<div style="
">
<p><br><span id="escaped-chars" style="text-decoration: underline"><h4>Escaped Characters</h4></span> Thee previously mentioned special characters like <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">[</code></span> can be matched by putting a backslash in front of them: <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap"><span style="color: #1d6c76">\[</span></code></span></p>
<svg class="typst-frame" style="overflow: visible; width: 21.265625em; height: 6.975390625em;" viewBox="0 0 212.65625 69.75390625" width="212.65625pt" height="69.75390625pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml"><g><g transform="translate(0 0)"><g class="typst-group"><g><g transform="translate(0 -0.5)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 0 70.75391 "/></g><g transform="translate(52.1435546875 -0.5)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 0 70.75391 "/></g><g transform="translate(212.65625 -0.5)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 0 70.75391 "/></g><g transform="translate(-0.5 0)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 213.65625 0 "/></g><g transform="translate(-0.5 17.59765625)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 213.65625 0 "/></g><g transform="translate(-0.5 43.67578125)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 213.65625 0 "/></g><g transform="translate(-0.5 69.75390625)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 213.65625 0 "/></g><g transform="translate(5 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gA9630BC7DC7C1A3B2772AC4EAF5E6A4E" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gF2D21C82F46AFB157CA5E1AB14665E2F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/></g></g><g transform="translate(0 17.59765625)"><g class="typst-group"><g><g transform="translate(5 5)"><g class="typst-group"><g><g transform="translate(-0 -0)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0 "/></g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#1d6c76" fill-rule="nonzero"/><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="4.81640625" y="0" fill="#1d6c76" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gB83FD8DF61FB2E4EAD552878F3E8DD3F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="78.2666015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g77AA3201A93C8F4113E19CCDA185B6F5" x="96.328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g958F64BF87063D7EAFEDE953DDA2BF9F" x="114.3896484375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="120.41015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="132.451171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="144.4921875" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 43.67578125)"><g class="typst-group"><g><g transform="translate(5 5)"><g class="typst-group"><g><g transform="translate(-0 -0)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0 "/></g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#1d6c76" fill-rule="nonzero"/><use xlink:href="#g1E73FB87418835A88E58B2B7006EB72B" x="4.81640625" y="0" fill="#1d6c76" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gB83FD8DF61FB2E4EAD552878F3E8DD3F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3D5EE249F6894FA38DD21E85E2FD5F05" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gD77243764E4306BD6D683907293F12D5" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="78.2666015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g></g></g></g></g><defs id="glyph"><symbol id="gA9630BC7DC7C1A3B2772AC4EAF5E6A4E" overflow="visible"><path d="M 1.9482422 6.479492 L 1.9482422 3.7402344 L 3.0908203 3.7402344 Q 3.774414 3.7402344 4.157715 4.1015625 Q 4.5410156 4.4628906 4.5410156 5.1123047 Q 4.5410156 5.7617188 4.1601563 6.1206055 Q 3.7792969 6.479492 3.0908203 6.479492 L 1.9482422 6.479492 Z M 0.96191406 7.290039 L 3.0908203 7.290039 Q 4.3115234 7.290039 4.9414063 6.73584 Q 5.571289 6.1816406 5.571289 5.1123047 Q 5.571289 4.033203 4.9438477 3.4814453 Q 4.3164063 2.9296875 3.0908203 2.9296875 L 1.9482422 2.9296875 L 1.9482422 0 L 0.96191406 0 L 0.96191406 7.290039 Z "/></symbol><symbol id="g37BF1C0F714F2658F35D194C9E053C6F" overflow="visible"><path d="M 3.4277344 2.7490234 L 3.1298828 2.7490234 Q 2.34375 2.7490234 1.9458008 2.4731445 Q 1.5478516 2.1972656 1.5478516 1.6503906 Q 1.5478516 1.1572266 1.8457031 0.88378906 Q 2.1435547 0.61035156 2.6708984 0.61035156 Q 3.413086 0.61035156 3.8378906 1.1254883 Q 4.2626953 1.640625 4.267578 2.5488281 L 4.267578 2.7490234 L 3.4277344 2.7490234 Z M 5.1708984 3.1201172 L 5.1708984 0 L 4.267578 0 L 4.267578 0.8105469 Q 3.9794922 0.32226563 3.5424805 0.09033203 Q 3.1054688 -0.14160156 2.4804688 -0.14160156 Q 1.6455078 -0.14160156 1.1474609 0.32958984 Q 0.64941406 0.80078125 0.64941406 1.5917969 Q 0.64941406 2.5048828 1.262207 2.9785156 Q 1.875 3.4521484 3.0615234 3.4521484 L 4.267578 3.4521484 L 4.267578 3.59375 Q 4.2626953 4.248047 3.9355469 4.543457 Q 3.6083984 4.838867 2.890625 4.838867 Q 2.4316406 4.838867 1.9628906 4.7070313 Q 1.4941406 4.5751953 1.0498047 4.321289 L 1.0498047 5.2197266 Q 1.5478516 5.4101563 2.0043945 5.505371 Q 2.4609375 5.600586 2.890625 5.600586 Q 3.569336 5.600586 4.050293 5.4003906 Q 4.53125 5.2001953 4.8291016 4.7998047 Q 5.0146484 4.555664 5.0927734 4.1967773 Q 5.1708984 3.8378906 5.1708984 3.1201172 Z "/></symbol><symbol id="g8EFE1C4A2E0CD0A03B7633D0C324134A" overflow="visible"><path d="M 2.9980469 7.0214844 L 2.9980469 5.46875 L 5.0390625 5.46875 L 5.0390625 4.770508 L 2.9980469 4.770508 L 2.9980469 1.8017578 Q 2.9980469 1.1962891 3.227539 0.95703125 Q 3.4570313 0.71777344 4.0283203 0.71777344 L 5.0390625 0.71777344 L 5.0390625 0 L 3.9404297 0 Q 2.9296875 0 2.5146484 0.40527344 Q 2.0996094 0.8105469 2.0996094 1.8017578 L 2.0996094 4.770508 L 0.63964844 4.770508 L 0.63964844 5.46875 L 2.0996094 5.46875 L 2.0996094 7.0214844 L 2.9980469 7.0214844 Z "/></symbol><symbol id="g9CEA08D585A10BDF30AE748A6F2738E3" overflow="visible"><path d="M 5.4296875 2.9589844 L 5.4296875 2.5195313 L 1.5380859 2.5195313 L 1.5380859 2.4902344 Q 1.5380859 1.5966797 2.0043945 1.1083984 Q 2.4707031 0.6201172 3.3203125 0.6201172 Q 3.75 0.6201172 4.21875 0.75683594 Q 4.6875 0.8935547 5.2197266 1.171875 L 5.2197266 0.2783203 Q 4.7070313 0.068359375 4.230957 -0.036621094 Q 3.7548828 -0.14160156 3.3105469 -0.14160156 Q 2.0361328 -0.14160156 1.3183594 0.6225586 Q 0.60058594 1.3867188 0.60058594 2.7294922 Q 0.60058594 4.038086 1.3037109 4.819336 Q 2.006836 5.600586 3.178711 5.600586 Q 4.223633 5.600586 4.82666 4.892578 Q 5.4296875 4.1845703 5.4296875 2.9589844 Z M 4.53125 3.2226563 Q 4.5117188 4.013672 4.157715 4.4262695 Q 3.803711 4.838867 3.1396484 4.838867 Q 2.4902344 4.838867 2.0703125 4.4091797 Q 1.6503906 3.9794922 1.5722656 3.2177734 L 4.53125 3.2226563 Z "/></symbol><symbol id="g8B1CFD5A71F51FD444694A31ACE7ED10" overflow="visible"><path d="M 5.6396484 4.3408203 Q 5.3515625 4.5654297 5.053711 4.6679688 Q 4.7558594 4.770508 4.399414 4.770508 Q 3.5595703 4.770508 3.1152344 4.243164 Q 2.6708984 3.7158203 2.6708984 2.7197266 L 2.6708984 0 L 1.7675781 0 L 1.7675781 5.46875 L 2.6708984 5.46875 L 2.6708984 4.399414 Q 2.8955078 4.9804688 3.3618164 5.2905273 Q 3.828125 5.600586 4.4677734 5.600586 Q 4.7998047 5.600586 5.0878906 5.517578 Q 5.3759766 5.4345703 5.6396484 5.258789 L 5.6396484 4.3408203 Z "/></symbol><symbol id="gDDF33CCACF8520FD5879FCDAE37BD86" overflow="visible"><path d="M 5.131836 3.3886719 L 5.131836 0 L 4.2285156 0 L 4.2285156 3.3886719 Q 4.2285156 4.1259766 3.9697266 4.4726563 Q 3.7109375 4.819336 3.1591797 4.819336 Q 2.5292969 4.819336 2.1899414 4.3725586 Q 1.8505859 3.9257813 1.8505859 3.0908203 L 1.8505859 0 L 0.95214844 0 L 0.95214844 5.46875 L 1.8505859 5.46875 L 1.8505859 4.6484375 Q 2.0898438 5.1171875 2.5 5.3588867 Q 2.9101563 5.600586 3.4716797 5.600586 Q 4.3066406 5.600586 4.7192383 5.0512695 Q 5.131836 4.501953 5.131836 3.3886719 Z "/></symbol><symbol id="gF2D21C82F46AFB157CA5E1AB14665E2F" overflow="visible"><path d="M 2.1289063 0.8105469 Q 3.3740234 0.8105469 3.8671875 1.4233398 Q 4.3603516 2.0361328 4.3603516 3.6376953 Q 4.3603516 5.2539063 3.869629 5.866699 Q 3.3789063 6.479492 2.1289063 6.479492 L 1.6601563 6.479492 L 1.6601563 0.8105469 L 2.1289063 0.8105469 Z M 2.1484375 7.290039 Q 3.8183594 7.290039 4.609375 6.401367 Q 5.4003906 5.5126953 5.4003906 3.6376953 Q 5.4003906 1.7724609 4.609375 0.88623047 Q 3.8183594 0 2.1484375 0 L 0.6689453 0 L 0.6689453 7.290039 L 2.1484375 7.290039 Z "/></symbol><symbol id="g23E41626515445E1BB7071D28C59ADA4" overflow="visible"><path d="M 4.7509766 5.2783203 L 4.7509766 4.399414 Q 4.3652344 4.6240234 3.9746094 4.736328 Q 3.5839844 4.848633 3.178711 4.848633 Q 2.5683594 4.848633 2.2680664 4.650879 Q 1.9677734 4.453125 1.9677734 4.0478516 Q 1.9677734 3.6816406 2.1923828 3.5009766 Q 2.4169922 3.3203125 3.3105469 3.149414 L 3.671875 3.0810547 Q 4.3408203 2.9541016 4.6850586 2.5732422 Q 5.029297 2.1923828 5.029297 1.5820313 Q 5.029297 0.7714844 4.453125 0.3149414 Q 3.8769531 -0.14160156 2.8515625 -0.14160156 Q 2.446289 -0.14160156 2.0019531 -0.056152344 Q 1.5576172 0.029296875 1.0400391 0.20019531 L 1.0400391 1.1279297 Q 1.5429688 0.8691406 2.0019531 0.7397461 Q 2.4609375 0.61035156 2.8710938 0.61035156 Q 3.4667969 0.61035156 3.7939453 0.8520508 Q 4.1210938 1.09375 4.1210938 1.5283203 Q 4.1210938 2.1533203 2.9248047 2.3925781 L 2.8857422 2.4023438 L 2.5488281 2.4707031 Q 1.7724609 2.6220703 1.4160156 2.980957 Q 1.0595703 3.3398438 1.0595703 3.959961 Q 1.0595703 4.7460938 1.5917969 5.17334 Q 2.1240234 5.600586 3.1103516 5.600586 Q 3.5498047 5.600586 3.9550781 5.5200195 Q 4.3603516 5.439453 4.7509766 5.2783203 Z "/></symbol><symbol id="gAB79A30431405AF14CCB1B23143BD7F1" overflow="visible"><path d="M 5.180664 0.2783203 Q 4.819336 0.068359375 4.436035 -0.036621094 Q 4.0527344 -0.14160156 3.6523438 -0.14160156 Q 2.3828125 -0.14160156 1.6674805 0.6201172 Q 0.95214844 1.3818359 0.95214844 2.7294922 Q 0.95214844 4.0771484 1.6674805 4.838867 Q 2.3828125 5.600586 3.6523438 5.600586 Q 4.0478516 5.600586 4.423828 5.498047 Q 4.7998047 5.395508 5.180664 5.180664 L 5.180664 4.2382813 Q 4.8242188 4.555664 4.465332 4.6972656 Q 4.1064453 4.838867 3.6523438 4.838867 Q 2.8076172 4.838867 2.3535156 4.291992 Q 1.8994141 3.7451172 1.8994141 2.7294922 Q 1.8994141 1.71875 2.355957 1.1694336 Q 2.8125 0.6201172 3.6523438 0.6201172 Q 4.1210938 0.6201172 4.4921875 0.76416016 Q 4.8632813 0.9082031 5.180664 1.2109375 L 5.180664 0.2783203 Z "/></symbol><symbol id="gF1D16D3439F586916205801D07D97589" overflow="visible"><path d="M 1.25 5.46875 L 3.5498047 5.46875 L 3.5498047 0.6982422 L 5.3320313 0.6982422 L 5.3320313 0 L 0.8691406 0 L 0.8691406 0.6982422 L 2.6513672 0.6982422 L 2.6513672 4.770508 L 1.25 4.770508 L 1.25 5.46875 Z M 2.6513672 7.5976563 L 3.5498047 7.5976563 L 3.5498047 6.459961 L 2.6513672 6.459961 L 2.6513672 7.5976563 Z "/></symbol><symbol id="gC5CB98F12AF1494D83D230F6647F5A66" overflow="visible"><path d="M 1.8310547 0.68847656 L 1.8310547 -2.0800781 L 0.9277344 -2.0800781 L 0.9277344 5.46875 L 1.8310547 5.46875 L 1.8310547 4.770508 Q 2.055664 5.1757813 2.4291992 5.3881836 Q 2.8027344 5.600586 3.2910156 5.600586 Q 4.2822266 5.600586 4.8461914 4.8339844 Q 5.4101563 4.067383 5.4101563 2.709961 Q 5.4101563 1.3769531 4.84375 0.6176758 Q 4.2773438 -0.14160156 3.2910156 -0.14160156 Q 2.7929688 -0.14160156 2.4194336 0.07080078 Q 2.0458984 0.28320313 1.8310547 0.68847656 Z M 4.4677734 2.7294922 Q 4.4677734 3.774414 4.1381836 4.3066406 Q 3.8085938 4.838867 3.1591797 4.838867 Q 2.5048828 4.838867 2.1679688 4.304199 Q 1.8310547 3.7695313 1.8310547 2.7294922 Q 1.8310547 1.6943359 2.1679688 1.1572266 Q 2.5048828 0.6201172 3.1591797 0.6201172 Q 3.8085938 0.6201172 4.1381836 1.1523438 Q 4.4677734 1.6845703 4.4677734 2.7294922 Z "/></symbol><symbol id="gDAC4E5B9EA78940BD8041CFC64F1642E" overflow="visible"><path d="M 3.0078125 4.838867 Q 2.3242188 4.838867 1.9726563 4.3066406 Q 1.6210938 3.774414 1.6210938 2.7294922 Q 1.6210938 1.6894531 1.9726563 1.1547852 Q 2.3242188 0.6201172 3.0078125 0.6201172 Q 3.696289 0.6201172 4.0478516 1.1547852 Q 4.399414 1.6894531 4.399414 2.7294922 Q 4.399414 3.774414 4.0478516 4.3066406 Q 3.696289 4.838867 3.0078125 4.838867 Z M 3.0078125 5.600586 Q 4.145508 5.600586 4.748535 4.8632813 Q 5.3515625 4.1259766 5.3515625 2.7294922 Q 5.3515625 1.328125 4.7509766 0.5932617 Q 4.1503906 -0.14160156 3.0078125 -0.14160156 Q 1.8701172 -0.14160156 1.2695313 0.5932617 Q 0.6689453 1.328125 0.6689453 2.7294922 Q 0.6689453 4.1259766 1.2695313 4.8632813 Q 1.8701172 5.600586 3.0078125 5.600586 Z "/></symbol><symbol id="gD3E02A90146443F5D1C908F343BC0F25" overflow="visible"><path d="M 1.1445313 5.8320313 L 4.2148438 -0.7421875 L 3.4726563 -0.7421875 L 0.3984375 5.8320313 L 1.1445313 5.8320313 Z "/></symbol><symbol id="gB83FD8DF61FB2E4EAD552878F3E8DD3F" overflow="visible"><path d="M 3.3007813 4.9121094 Q 3.4667969 5.263672 3.7231445 5.432129 Q 3.9794922 5.600586 4.3408203 5.600586 Q 5 5.600586 5.270996 5.090332 Q 5.541992 4.580078 5.541992 3.1689453 L 5.541992 0 L 4.7216797 0 L 4.7216797 3.1298828 Q 4.7216797 4.2871094 4.592285 4.567871 Q 4.4628906 4.848633 4.1210938 4.848633 Q 3.7304688 4.848633 3.5864258 4.54834 Q 3.4423828 4.248047 3.4423828 3.1298828 L 3.4423828 0 L 2.6220703 0 L 2.6220703 3.1298828 Q 2.6220703 4.301758 2.4829102 4.5751953 Q 2.34375 4.848633 1.9824219 4.848633 Q 1.6259766 4.848633 1.4868164 4.54834 Q 1.3476563 4.248047 1.3476563 3.1298828 L 1.3476563 0 L 0.53222656 0 L 0.53222656 5.46875 L 1.3476563 5.46875 L 1.3476563 5 Q 1.5087891 5.2929688 1.7504883 5.4467773 Q 1.9921875 5.600586 2.2998047 5.600586 Q 2.6708984 5.600586 2.9174805 5.4296875 Q 3.1640625 5.258789 3.3007813 4.9121094 Z "/></symbol><symbol id="g54B52F8AE89AD429D6D3AD95B2D89739" overflow="visible"><path d="M 5.131836 3.3886719 L 5.131836 0 L 4.2285156 0 L 4.2285156 3.3886719 Q 4.2285156 4.1259766 3.9697266 4.4726563 Q 3.7109375 4.819336 3.1591797 4.819336 Q 2.5292969 4.819336 2.1899414 4.3725586 Q 1.8505859 3.9257813 1.8505859 3.0908203 L 1.8505859 0 L 0.95214844 0 L 0.95214844 7.5976563 L 1.8505859 7.5976563 L 1.8505859 4.6484375 Q 2.0898438 5.1171875 2.5 5.3588867 Q 2.9101563 5.600586 3.4716797 5.600586 Q 4.3066406 5.600586 4.7192383 5.0512695 Q 5.131836 4.501953 5.131836 3.3886719 Z "/></symbol><symbol id="g961CAE06C7AAE8EB428417D81D5AEE72" overflow="visible"><path d="M 3.1201172 1.9824219 Q 3.1201172 1.3769531 3.3422852 1.0693359 Q 3.5644531 0.76171875 3.9990234 0.76171875 L 5.048828 0.76171875 L 5.048828 0 L 3.9111328 0 Q 3.1054688 0 2.6635742 0.5175781 Q 2.2216797 1.0351563 2.2216797 1.9824219 L 2.2216797 6.948242 L 0.78125 6.948242 L 0.78125 7.651367 L 3.1201172 7.651367 L 3.1201172 1.9824219 Z "/></symbol><symbol id="g77AA3201A93C8F4113E19CCDA185B6F5" overflow="visible"><path d="M 4.482422 2.7294922 Q 4.482422 3.774414 4.1503906 4.3066406 Q 3.8183594 4.838867 3.1689453 4.838867 Q 2.5146484 4.838867 2.1777344 4.304199 Q 1.8408203 3.7695313 1.8408203 2.7294922 Q 1.8408203 1.6943359 2.1777344 1.1572266 Q 2.5146484 0.6201172 3.1689453 0.6201172 Q 3.8183594 0.6201172 4.1503906 1.1523438 Q 4.482422 1.6845703 4.482422 2.7294922 Z M 1.8408203 4.770508 Q 2.055664 5.1708984 2.434082 5.385742 Q 2.8125 5.600586 3.3105469 5.600586 Q 4.296875 5.600586 4.8632813 4.8413086 Q 5.4296875 4.0820313 5.4296875 2.7490234 Q 5.4296875 1.3964844 4.86084 0.6274414 Q 4.291992 -0.14160156 3.3007813 -0.14160156 Q 2.8125 -0.14160156 2.4389648 0.07080078 Q 2.0654297 0.28320313 1.8408203 0.68847656 L 1.8408203 0 L 0.9423828 0 L 0.9423828 7.5976563 L 1.8408203 7.5976563 L 1.8408203 4.770508 Z "/></symbol><symbol id="g958F64BF87063D7EAFEDE953DDA2BF9F" overflow="visible"><path d="M 1.1523438 7.5976563 L 2.0800781 7.5976563 L 2.0800781 3.1982422 L 4.4384766 5.46875 L 5.5322266 5.46875 L 3.3789063 3.4082031 L 5.8691406 0 L 4.770508 0 L 2.7490234 2.8222656 L 2.0800781 2.1923828 L 2.0800781 0 L 1.1523438 0 L 1.1523438 7.5976563 Z "/></symbol><symbol id="g1E73FB87418835A88E58B2B7006EB72B" overflow="visible"><path d="M 4.1054688 2.7109375 L 4.1054688 0 L 3.3828125 0 L 3.3828125 2.7109375 Q 3.3828125 3.3007813 3.1757813 3.578125 Q 2.96875 3.8554688 2.5273438 3.8554688 Q 2.0234375 3.8554688 1.7519531 3.4980469 Q 1.4804688 3.140625 1.4804688 2.4726563 L 1.4804688 0 L 0.76171875 0 L 0.76171875 4.375 L 1.4804688 4.375 L 1.4804688 3.71875 Q 1.671875 4.09375 2 4.2871094 Q 2.328125 4.4804688 2.7773438 4.4804688 Q 3.4453125 4.4804688 3.7753906 4.0410156 Q 4.1054688 3.6015625 4.1054688 2.7109375 Z "/></symbol><symbol id="g3D5EE249F6894FA38DD21E85E2FD5F05" overflow="visible"><path d="M 0 5.46875 L 0.8886719 5.46875 L 1.8408203 1.0498047 L 2.6220703 3.8720703 L 3.3886719 3.8720703 L 4.1796875 1.0498047 L 5.131836 5.46875 L 6.020508 5.46875 L 4.741211 0 L 3.881836 0 L 3.0078125 2.9980469 L 2.1386719 0 L 1.2792969 0 L 0 5.46875 Z "/></symbol><symbol id="gD77243764E4306BD6D683907293F12D5" overflow="visible"><path d="M 1.7382813 3.1396484 L 4.2822266 3.1396484 L 4.2822266 2.3388672 L 1.7382813 2.3388672 L 1.7382813 3.1396484 Z "/></symbol></defs></svg>
</div>
<div style="
">
<p><br><span id="char-groups" style="text-decoration: underline"><h4>Character Groups</h4></span> RegEx engines already define some groups of characters that can make writing RegEx expressions quicker.</p>
<svg class="typst-frame" style="overflow: visible; width: 40.53125em; height: 20.014453125em;" viewBox="0 0 405.3125 200.14453125" width="405.3125pt" height="200.14453125pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:h5="http://www.w3.org/1999/xhtml"><g><g transform="translate(0 0)"><g class="typst-group"><g><g transform="translate(0 -0.5)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 0 201.14453 "/></g><g transform="translate(52.1435546875 -0.5)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 0 201.14453 "/></g><g transform="translate(405.3125 -0.5)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 0 201.14453 "/></g><g transform="translate(-0.5 0)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 17.59765625)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 43.67578125)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 69.75390625)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 95.83203125)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 121.91015625)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 147.98828125)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 174.06640625)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(-0.5 200.14453125)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 0 0 L 406.3125 0 "/></g><g transform="translate(5 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gA9630BC7DC7C1A3B2772AC4EAF5E6A4E" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gF2D21C82F46AFB157CA5E1AB14665E2F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/></g></g><g transform="translate(0 17.59765625)"><g class="typst-group"><g><g transform="translate(5 5)"><g class="typst-group"><g><g transform="translate(-0 -0)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 1.5 0 L 13.316406 0 C 14.144834 0 14.816406 0.67157286 14.816406 1.5 L 14.816406 14.578125 C 14.816406 15.406552 14.144834 16.078125 13.316406 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0 "/></g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gE671651E4E76A7E6A66592123F7CB0EF" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1FA38BF5C517F615C367E61F0044A197" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gBB49C9F26722473D147EE93A203A972A" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="96.328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="114.3896484375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1D505C2B8EC47EA4C26743DADEC508A3" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="132.451171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="150.5126953125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="156.533203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="162.5537109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="168.57421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g77AA3201A93C8F4113E19CCDA185B6F5" x="180.615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="186.6357421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="192.65625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="198.6767578125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g958F64BF87063D7EAFEDE953DDA2BF9F" x="204.697265625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="210.7177734375" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 43.67578125)"><g class="typst-group"><g><g transform="translate(5 5)"><g class="typst-group"><g><g transform="translate(-0 -0)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0 "/></g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/><use xlink:href="#gC58E40CCEEAAE4A011790927FE560B0C" x="4.81640625" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1FA38BF5C517F615C367E61F0044A197" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3D5EE249F6894FA38DD21E85E2FD5F05" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="78.2666015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="96.328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="114.3896484375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="120.41015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g77AA3201A93C8F4113E19CCDA185B6F5" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="144.4921875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="150.5126953125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="156.533203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g958F64BF87063D7EAFEDE953DDA2BF9F" x="162.5537109375" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 69.75390625)"><g class="typst-group"><g><g transform="translate(5 5)"><g class="typst-group"><g><g transform="translate(-0 -0)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0 "/></g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/><use xlink:href="#gF953090ED8E474A6BDB5C112B8614419" x="4.81640625" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1FA38BF5C517F615C367E61F0044A197" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gBB49C9F26722473D147EE93A203A972A" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="96.328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="114.3896484375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3D5EE249F6894FA38DD21E85E2FD5F05" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="132.451171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="144.4921875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="150.5126953125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="156.533203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="162.5537109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="168.57421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="174.5947265625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="180.615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="186.6357421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="198.6767578125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="204.697265625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="216.73828125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="222.7587890625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="228.779296875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="234.7998046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g77AA3201A93C8F4113E19CCDA185B6F5" x="246.8408203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="252.861328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="258.8818359375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="264.90234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g958F64BF87063D7EAFEDE953DDA2BF9F" x="270.9228515625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="276.943359375" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 95.83203125)"><g class="typst-group"><g><g transform="translate(5 5)"><g class="typst-group"><g><g transform="translate(-0 -0)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0 "/></g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/><use xlink:href="#gF5F7ADACD3C8648021D0891B6403D353" x="4.81640625" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1FA38BF5C517F615C367E61F0044A197" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9E9C649267338B7BCF3BB51B9816396A" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1D505C2B8EC47EA4C26743DADEC508A3" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gB83FD8DF61FB2E4EAD552878F3E8DD3F" x="78.2666015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g807B89443FA0EF4D7A7A613982FE96F6" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gA06F636B71996BA7070F256843DCE7EE" x="120.41015625" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 121.91015625)"><g class="typst-group"><g><g transform="translate(5 5)"><g class="typst-group"><g><g transform="translate(-0 -0)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0 "/></g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/><use xlink:href="#g27C321132E0A6A9E6B99ED77584BAD53" x="4.81640625" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1FA38BF5C517F615C367E61F0044A197" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gBB49C9F26722473D147EE93A203A972A" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="96.328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="114.3896484375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="132.451171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9E9C649267338B7BCF3BB51B9816396A" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="144.4921875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="150.5126953125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="156.533203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1D505C2B8EC47EA4C26743DADEC508A3" x="168.57421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="174.5947265625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="180.615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gB83FD8DF61FB2E4EAD552878F3E8DD3F" x="186.6357421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g807B89443FA0EF4D7A7A613982FE96F6" x="198.6767578125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="210.7177734375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="216.73828125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gA06F636B71996BA7070F256843DCE7EE" x="228.779296875" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 147.98828125)"><g class="typst-group"><g><g transform="translate(5 5)"><g class="typst-group"><g><g transform="translate(-0 -0)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0 "/></g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/><use xlink:href="#g7342E383B6C704BD4B47D4672216B35D" x="4.81640625" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="18.0615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5F336A8E4AF2A41DBA4980BEB90D9CD" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9E9C649267338B7BCF3BB51B9816396A" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="78.2666015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5F336A8E4AF2A41DBA4980BEB90D9CD" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g952AB916CC2FCD530DE73925A36C7F0D" x="120.41015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="132.451171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="144.4921875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="150.5126953125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="156.533203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="162.5537109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="168.57421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="174.5947265625" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(0 174.06640625)"><g class="typst-group"><g><g transform="translate(5 5)"><g class="typst-group"><g><g transform="translate(-0 -0)"><path class="typst-shape" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="4" d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0 "/></g><g transform="translate(5 11.078125)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#gD3E02A90146443F5D1C908F343BC0F25" x="0" y="0" fill="#d73a49" fill-rule="nonzero"/><use xlink:href="#g9A4F7CA79966390D26B2F6FED68DC851" x="4.81640625" y="0" fill="#d73a49" fill-rule="nonzero"/></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g class="typst-text" transform="scale(1, -1)"><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="0" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="6.0205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1FA38BF5C517F615C367E61F0044A197" x="12.041015625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="24.08203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g54B52F8AE89AD429D6D3AD95B2D89739" x="30.1025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="36.123046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="42.1435546875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="48.1640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="54.1845703125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="60.205078125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="66.2255859375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="72.24609375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="84.287109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gBB49C9F26722473D147EE93A203A972A" x="90.3076171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="96.328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="102.3486328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5CB98F12AF1494D83D230F6647F5A66" x="108.369140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="114.3896484375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g1D505C2B8EC47EA4C26743DADEC508A3" x="126.4306640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="132.451171875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="138.4716796875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g961CAE06C7AAE8EB428417D81D5AEE72" x="150.5126953125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="156.533203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="162.5537109375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="168.57421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="174.5947265625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="180.615234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="186.6357421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5F336A8E4AF2A41DBA4980BEB90D9CD" x="192.65625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="204.697265625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="210.7177734375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9E9C649267338B7BCF3BB51B9816396A" x="216.73828125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gF1D16D3439F586916205801D07D97589" x="222.7587890625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8EFE1C4A2E0CD0A03B7633D0C324134A" x="228.779296875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="234.7998046875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gC5F336A8E4AF2A41DBA4980BEB90D9CD" x="240.8203125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g37BF1C0F714F2658F35D194C9E053C6F" x="252.861328125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="258.8818359375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="264.90234375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g952AB916CC2FCD530DE73925A36C7F0D" x="276.943359375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDDF33CCACF8520FD5879FCDAE37BD86" x="282.9638671875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g3402EB21D38B9A8AFC4DFC6262792511" x="288.984375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="295.0048828125" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="301.025390625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="307.0458984375" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gAB79A30431405AF14CCB1B23143BD7F1" x="313.06640625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#gDAC4E5B9EA78940BD8041CFC64F1642E" x="319.0869140625" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g8B1CFD5A71F51FD444694A31ACE7ED10" x="325.107421875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g9CEA08D585A10BDF30AE748A6F2738E3" x="331.1279296875" y="0" fill="#000000" fill-rule="nonzero"/><use xlink:href="#g23E41626515445E1BB7071D28C59ADA4" x="337.1484375" y="0" fill="#000000" fill-rule="nonzero"/></g></g></g></g></g></g></g></g></g><defs id="glyph"><symbol id="gA9630BC7DC7C1A3B2772AC4EAF5E6A4E" overflow="visible"><path d="M 1.9482422 6.479492 L 1.9482422 3.7402344 L 3.0908203 3.7402344 Q 3.774414 3.7402344 4.157715 4.1015625 Q 4.5410156 4.4628906 4.5410156 5.1123047 Q 4.5410156 5.7617188 4.1601563 6.1206055 Q 3.7792969 6.479492 3.0908203 6.479492 L 1.9482422 6.479492 Z M 0.96191406 7.290039 L 3.0908203 7.290039 Q 4.3115234 7.290039 4.9414063 6.73584 Q 5.571289 6.1816406 5.571289 5.1123047 Q 5.571289 4.033203 4.9438477 3.4814453 Q 4.3164063 2.9296875 3.0908203 2.9296875 L 1.9482422 2.9296875 L 1.9482422 0 L 0.96191406 0 L 0.96191406 7.290039 Z "/></symbol><symbol id="g37BF1C0F714F2658F35D194C9E053C6F" overflow="visible"><path d="M 3.4277344 2.7490234 L 3.1298828 2.7490234 Q 2.34375 2.7490234 1.9458008 2.4731445 Q 1.5478516 2.1972656 1.5478516 1.6503906 Q 1.5478516 1.1572266 1.8457031 0.88378906 Q 2.1435547 0.61035156 2.6708984 0.61035156 Q 3.413086 0.61035156 3.8378906 1.1254883 Q 4.2626953 1.640625 4.267578 2.5488281 L 4.267578 2.7490234 L 3.4277344 2.7490234 Z M 5.1708984 3.1201172 L 5.1708984 0 L 4.267578 0 L 4.267578 0.8105469 Q 3.9794922 0.32226563 3.5424805 0.09033203 Q 3.1054688 -0.14160156 2.4804688 -0.14160156 Q 1.6455078 -0.14160156 1.1474609 0.32958984 Q 0.64941406 0.80078125 0.64941406 1.5917969 Q 0.64941406 2.5048828 1.262207 2.9785156 Q 1.875 3.4521484 3.0615234 3.4521484 L 4.267578 3.4521484 L 4.267578 3.59375 Q 4.2626953 4.248047 3.9355469 4.543457 Q 3.6083984 4.838867 2.890625 4.838867 Q 2.4316406 4.838867 1.9628906 4.7070313 Q 1.4941406 4.5751953 1.0498047 4.321289 L 1.0498047 5.2197266 Q 1.5478516 5.4101563 2.0043945 5.505371 Q 2.4609375 5.600586 2.890625 5.600586 Q 3.569336 5.600586 4.050293 5.4003906 Q 4.53125 5.2001953 4.8291016 4.7998047 Q 5.0146484 4.555664 5.0927734 4.1967773 Q 5.1708984 3.8378906 5.1708984 3.1201172 Z "/></symbol><symbol id="g8EFE1C4A2E0CD0A03B7633D0C324134A" overflow="visible"><path d="M 2.9980469 7.0214844 L 2.9980469 5.46875 L 5.0390625 5.46875 L 5.0390625 4.770508 L 2.9980469 4.770508 L 2.9980469 1.8017578 Q 2.9980469 1.1962891 3.227539 0.95703125 Q 3.4570313 0.71777344 4.0283203 0.71777344 L 5.0390625 0.71777344 L 5.0390625 0 L 3.9404297 0 Q 2.9296875 0 2.5146484 0.40527344 Q 2.0996094 0.8105469 2.0996094 1.8017578 L 2.0996094 4.770508 L 0.63964844 4.770508 L 0.63964844 5.46875 L 2.0996094 5.46875 L 2.0996094 7.0214844 L 2.9980469 7.0214844 Z "/></symbol><symbol id="g9CEA08D585A10BDF30AE748A6F2738E3" overflow="visible"><path d="M 5.4296875 2.9589844 L 5.4296875 2.5195313 L 1.5380859 2.5195313 L 1.5380859 2.4902344 Q 1.5380859 1.5966797 2.0043945 1.1083984 Q 2.4707031 0.6201172 3.3203125 0.6201172 Q 3.75 0.6201172 4.21875 0.75683594 Q 4.6875 0.8935547 5.2197266 1.171875 L 5.2197266 0.2783203 Q 4.7070313 0.068359375 4.230957 -0.036621094 Q 3.7548828 -0.14160156 3.3105469 -0.14160156 Q 2.0361328 -0.14160156 1.3183594 0.6225586 Q 0.60058594 1.3867188 0.60058594 2.7294922 Q 0.60058594 4.038086 1.3037109 4.819336 Q 2.006836 5.600586 3.178711 5.600586 Q 4.223633 5.600586 4.82666 4.892578 Q 5.4296875 4.1845703 5.4296875 2.9589844 Z M 4.53125 3.2226563 Q 4.5117188 4.013672 4.157715 4.4262695 Q 3.803711 4.838867 3.1396484 4.838867 Q 2.4902344 4.838867 2.0703125 4.4091797 Q 1.6503906 3.9794922 1.5722656 3.2177734 L 4.53125 3.2226563 Z "/></symbol><symbol id="g8B1CFD5A71F51FD444694A31ACE7ED10" overflow="visible"><path d="M 5.6396484 4.3408203 Q 5.3515625 4.5654297 5.053711 4.6679688 Q 4.7558594 4.770508 4.399414 4.770508 Q 3.5595703 4.770508 3.1152344 4.243164 Q 2.6708984 3.7158203 2.6708984 2.7197266 L 2.6708984 0 L 1.7675781 0 L 1.7675781 5.46875 L 2.6708984 5.46875 L 2.6708984 4.399414 Q 2.8955078 4.9804688 3.3618164 5.2905273 Q 3.828125 5.600586 4.4677734 5.600586 Q 4.7998047 5.600586 5.0878906 5.517578 Q 5.3759766 5.4345703 5.6396484 5.258789 L 5.6396484 4.3408203 Z "/></symbol><symbol id="gDDF33CCACF8520FD5879FCDAE37BD86" overflow="visible"><path d="M 5.131836 3.3886719 L 5.131836 0 L 4.2285156 0 L 4.2285156 3.3886719 Q 4.2285156 4.1259766 3.9697266 4.4726563 Q 3.7109375 4.819336 3.1591797 4.819336 Q 2.5292969 4.819336 2.1899414 4.3725586 Q 1.8505859 3.9257813 1.8505859 3.0908203 L 1.8505859 0 L 0.95214844 0 L 0.95214844 5.46875 L 1.8505859 5.46875 L 1.8505859 4.6484375 Q 2.0898438 5.1171875 2.5 5.3588867 Q 2.9101563 5.600586 3.4716797 5.600586 Q 4.3066406 5.600586 4.7192383 5.0512695 Q 5.131836 4.501953 5.131836 3.3886719 Z "/></symbol><symbol id="gF2D21C82F46AFB157CA5E1AB14665E2F" overflow="visible"><path d="M 2.1289063 0.8105469 Q 3.3740234 0.8105469 3.8671875 1.4233398 Q 4.3603516 2.0361328 4.3603516 3.6376953 Q 4.3603516 5.2539063 3.869629 5.866699 Q 3.3789063 6.479492 2.1289063 6.479492 L 1.6601563 6.479492 L 1.6601563 0.8105469 L 2.1289063 0.8105469 Z M 2.1484375 7.290039 Q 3.8183594 7.290039 4.609375 6.401367 Q 5.4003906 5.5126953 5.4003906 3.6376953 Q 5.4003906 1.7724609 4.609375 0.88623047 Q 3.8183594 0 2.1484375 0 L 0.6689453 0 L 0.6689453 7.290039 L 2.1484375 7.290039 Z "/></symbol><symbol id="g23E41626515445E1BB7071D28C59ADA4" overflow="visible"><path d="M 4.7509766 5.2783203 L 4.7509766 4.399414 Q 4.3652344 4.6240234 3.9746094 4.736328 Q 3.5839844 4.848633 3.178711 4.848633 Q 2.5683594 4.848633 2.2680664 4.650879 Q 1.9677734 4.453125 1.9677734 4.0478516 Q 1.9677734 3.6816406 2.1923828 3.5009766 Q 2.4169922 3.3203125 3.3105469 3.149414 L 3.671875 3.0810547 Q 4.3408203 2.9541016 4.6850586 2.5732422 Q 5.029297 2.1923828 5.029297 1.5820313 Q 5.029297 0.7714844 4.453125 0.3149414 Q 3.8769531 -0.14160156 2.8515625 -0.14160156 Q 2.446289 -0.14160156 2.0019531 -0.056152344 Q 1.5576172 0.029296875 1.0400391 0.20019531 L 1.0400391 1.1279297 Q 1.5429688 0.8691406 2.0019531 0.7397461 Q 2.4609375 0.61035156 2.8710938 0.61035156 Q 3.4667969 0.61035156 3.7939453 0.8520508 Q 4.1210938 1.09375 4.1210938 1.5283203 Q 4.1210938 2.1533203 2.9248047 2.3925781 L 2.8857422 2.4023438 L 2.5488281 2.4707031 Q 1.7724609 2.6220703 1.4160156 2.980957 Q 1.0595703 3.3398438 1.0595703 3.959961 Q 1.0595703 4.7460938 1.5917969 5.17334 Q 2.1240234 5.600586 3.1103516 5.600586 Q 3.5498047 5.600586 3.9550781 5.5200195 Q 4.3603516 5.439453 4.7509766 5.2783203 Z "/></symbol><symbol id="gAB79A30431405AF14CCB1B23143BD7F1" overflow="visible"><path d="M 5.180664 0.2783203 Q 4.819336 0.068359375 4.436035 -0.036621094 Q 4.0527344 -0.14160156 3.6523438 -0.14160156 Q 2.3828125 -0.14160156 1.6674805 0.6201172 Q 0.95214844 1.3818359 0.95214844 2.7294922 Q 0.95214844 4.0771484 1.6674805 4.838867 Q 2.3828125 5.600586 3.6523438 5.600586 Q 4.0478516 5.600586 4.423828 5.498047 Q 4.7998047 5.395508 5.180664 5.180664 L 5.180664 4.2382813 Q 4.8242188 4.555664 4.465332 4.6972656 Q 4.1064453 4.838867 3.6523438 4.838867 Q 2.8076172 4.838867 2.3535156 4.291992 Q 1.8994141 3.7451172 1.8994141 2.7294922 Q 1.8994141 1.71875 2.355957 1.1694336 Q 2.8125 0.6201172 3.6523438 0.6201172 Q 4.1210938 0.6201172 4.4921875 0.76416016 Q 4.8632813 0.9082031 5.180664 1.2109375 L 5.180664 0.2783203 Z "/></symbol><symbol id="gF1D16D3439F586916205801D07D97589" overflow="visible"><path d="M 1.25 5.46875 L 3.5498047 5.46875 L 3.5498047 0.6982422 L 5.3320313 0.6982422 L 5.3320313 0 L 0.8691406 0 L 0.8691406 0.6982422 L 2.6513672 0.6982422 L 2.6513672 4.770508 L 1.25 4.770508 L 1.25 5.46875 Z M 2.6513672 7.5976563 L 3.5498047 7.5976563 L 3.5498047 6.459961 L 2.6513672 6.459961 L 2.6513672 7.5976563 Z "/></symbol><symbol id="gC5CB98F12AF1494D83D230F6647F5A66" overflow="visible"><path d="M 1.8310547 0.68847656 L 1.8310547 -2.0800781 L 0.9277344 -2.0800781 L 0.9277344 5.46875 L 1.8310547 5.46875 L 1.8310547 4.770508 Q 2.055664 5.1757813 2.4291992 5.3881836 Q 2.8027344 5.600586 3.2910156 5.600586 Q 4.2822266 5.600586 4.8461914 4.8339844 Q 5.4101563 4.067383 5.4101563 2.709961 Q 5.4101563 1.3769531 4.84375 0.6176758 Q 4.2773438 -0.14160156 3.2910156 -0.14160156 Q 2.7929688 -0.14160156 2.4194336 0.07080078 Q 2.0458984 0.28320313 1.8310547 0.68847656 Z M 4.4677734 2.7294922 Q 4.4677734 3.774414 4.1381836 4.3066406 Q 3.8085938 4.838867 3.1591797 4.838867 Q 2.5048828 4.838867 2.1679688 4.304199 Q 1.8310547 3.7695313 1.8310547 2.7294922 Q 1.8310547 1.6943359 2.1679688 1.1572266 Q 2.5048828 0.6201172 3.1591797 0.6201172 Q 3.8085938 0.6201172 4.1381836 1.1523438 Q 4.4677734 1.6845703 4.4677734 2.7294922 Z "/></symbol><symbol id="gDAC4E5B9EA78940BD8041CFC64F1642E" overflow="visible"><path d="M 3.0078125 4.838867 Q 2.3242188 4.838867 1.9726563 4.3066406 Q 1.6210938 3.774414 1.6210938 2.7294922 Q 1.6210938 1.6894531 1.9726563 1.1547852 Q 2.3242188 0.6201172 3.0078125 0.6201172 Q 3.696289 0.6201172 4.0478516 1.1547852 Q 4.399414 1.6894531 4.399414 2.7294922 Q 4.399414 3.774414 4.0478516 4.3066406 Q 3.696289 4.838867 3.0078125 4.838867 Z M 3.0078125 5.600586 Q 4.145508 5.600586 4.748535 4.8632813 Q 5.3515625 4.1259766 5.3515625 2.7294922 Q 5.3515625 1.328125 4.7509766 0.5932617 Q 4.1503906 -0.14160156 3.0078125 -0.14160156 Q 1.8701172 -0.14160156 1.2695313 0.5932617 Q 0.6689453 1.328125 0.6689453 2.7294922 Q 0.6689453 4.1259766 1.2695313 4.8632813 Q 1.8701172 5.600586 3.0078125 5.600586 Z "/></symbol><symbol id="gE671651E4E76A7E6A66592123F7CB0EF" overflow="visible"><path d="M 1.9101563 1.1914063 L 2.8945313 1.1914063 L 2.8945313 0 L 1.9101563 0 L 1.9101563 1.1914063 Z "/></symbol><symbol id="g1FA38BF5C517F615C367E61F0044A197" overflow="visible"><path d="M 4.189453 1.7578125 Q 3.9648438 1.1865234 3.618164 0.25390625 Q 3.1347656 -1.0351563 2.96875 -1.3183594 Q 2.7441406 -1.6992188 2.4072266 -1.8896484 Q 2.0703125 -2.0800781 1.6210938 -2.0800781 L 0.8984375 -2.0800781 L 0.8984375 -1.328125 L 1.4306641 -1.328125 Q 1.8261719 -1.328125 2.0507813 -1.0986328 Q 2.2753906 -0.8691406 2.6220703 0.087890625 L 0.5078125 5.46875 L 1.4599609 5.46875 L 3.0810547 1.1914063 L 4.6777344 5.46875 L 5.629883 5.46875 L 4.189453 1.7578125 Z "/></symbol><symbol id="g54B52F8AE89AD429D6D3AD95B2D89739" overflow="visible"><path d="M 5.131836 3.3886719 L 5.131836 0 L 4.2285156 0 L 4.2285156 3.3886719 Q 4.2285156 4.1259766 3.9697266 4.4726563 Q 3.7109375 4.819336 3.1591797 4.819336 Q 2.5292969 4.819336 2.1899414 4.3725586 Q 1.8505859 3.9257813 1.8505859 3.0908203 L 1.8505859 0 L 0.95214844 0 L 0.95214844 7.5976563 L 1.8505859 7.5976563 L 1.8505859 4.6484375 Q 2.0898438 5.1171875 2.5 5.3588867 Q 2.9101563 5.600586 3.4716797 5.600586 Q 4.3066406 5.600586 4.7192383 5.0512695 Q 5.131836 4.501953 5.131836 3.3886719 Z "/></symbol><symbol id="gBB49C9F26722473D147EE93A203A972A" overflow="visible"><path d="M 5.4589844 5.46875 L 3.5009766 2.8515625 L 5.649414 0 L 4.609375 0 L 3.0078125 2.1923828 L 1.4111328 0 L 0.37109375 0 L 2.5195313 2.8515625 L 0.56152344 5.46875 L 1.5576172 5.46875 L 3.0078125 3.491211 L 4.448242 5.46875 L 5.4589844 5.46875 Z "/></symbol><symbol id="g1D505C2B8EC47EA4C26743DADEC508A3" overflow="visible"><path d="M 5.1904297 7.5976563 L 5.1904297 6.850586 L 4.169922 6.850586 Q 3.6865234 6.850586 3.4985352 6.652832 Q 3.3105469 6.455078 3.3105469 5.9521484 L 3.3105469 5.46875 L 5.1904297 5.46875 L 5.1904297 4.770508 L 3.3105469 4.770508 L 3.3105469 0 L 2.4121094 0 L 2.4121094 4.770508 L 0.95214844 4.770508 L 0.95214844 5.46875 L 2.4121094 5.46875 L 2.4121094 5.8496094 Q 2.4121094 6.748047 2.824707 7.1728516 Q 3.2373047 7.5976563 4.111328 7.5976563 L 5.1904297 7.5976563 Z "/></symbol><symbol id="g961CAE06C7AAE8EB428417D81D5AEE72" overflow="visible"><path d="M 3.1201172 1.9824219 Q 3.1201172 1.3769531 3.3422852 1.0693359 Q 3.5644531 0.76171875 3.9990234 0.76171875 L 5.048828 0.76171875 L 5.048828 0 L 3.9111328 0 Q 3.1054688 0 2.6635742 0.5175781 Q 2.2216797 1.0351563 2.2216797 1.9824219 L 2.2216797 6.948242 L 0.78125 6.948242 L 0.78125 7.651367 L 3.1201172 7.651367 L 3.1201172 1.9824219 Z "/></symbol><symbol id="g77AA3201A93C8F4113E19CCDA185B6F5" overflow="visible"><path d="M 4.482422 2.7294922 Q 4.482422 3.774414 4.1503906 4.3066406 Q 3.8183594 4.838867 3.1689453 4.838867 Q 2.5146484 4.838867 2.1777344 4.304199 Q 1.8408203 3.7695313 1.8408203 2.7294922 Q 1.8408203 1.6943359 2.1777344 1.1572266 Q 2.5146484 0.6201172 3.1689453 0.6201172 Q 3.8183594 0.6201172 4.1503906 1.1523438 Q 4.482422 1.6845703 4.482422 2.7294922 Z M 1.8408203 4.770508 Q 2.055664 5.1708984 2.434082 5.385742 Q 2.8125 5.600586 3.3105469 5.600586 Q 4.296875 5.600586 4.8632813 4.8413086 Q 5.4296875 4.0820313 5.4296875 2.7490234 Q 5.4296875 1.3964844 4.86084 0.6274414 Q 4.291992 -0.14160156 3.3007813 -0.14160156 Q 2.8125 -0.14160156 2.4389648 0.07080078 Q 2.0654297 0.28320313 1.8408203 0.68847656 L 1.8408203 0 L 0.9423828 0 L 0.9423828 7.5976563 L 1.8408203 7.5976563 L 1.8408203 4.770508 Z "/></symbol><symbol id="g958F64BF87063D7EAFEDE953DDA2BF9F" overflow="visible"><path d="M 1.1523438 7.5976563 L 2.0800781 7.5976563 L 2.0800781 3.1982422 L 4.4384766 5.46875 L 5.5322266 5.46875 L 3.3789063 3.4082031 L 5.8691406 0 L 4.770508 0 L 2.7490234 2.8222656 L 2.0800781 2.1923828 L 2.0800781 0 L 1.1523438 0 L 1.1523438 7.5976563 Z "/></symbol><symbol id="gD3E02A90146443F5D1C908F343BC0F25" overflow="visible"><path d="M 1.1445313 5.8320313 L 4.2148438 -0.7421875 L 3.4726563 -0.7421875 L 0.3984375 5.8320313 L 1.1445313 5.8320313 Z "/></symbol><symbol id="gC58E40CCEEAAE4A011790927FE560B0C" overflow="visible"><path d="M 3.8007813 4.2226563 L 3.8007813 3.5195313 Q 3.4921875 3.6992188 3.1796875 3.7890625 Q 2.8671875 3.8789063 2.5429688 3.8789063 Q 2.0546875 3.8789063 1.8144531 3.7207031 Q 1.5742188 3.5625 1.5742188 3.2382813 Q 1.5742188 2.9453125 1.7539063 2.8007813 Q 1.9335938 2.65625 2.6484375 2.5195313 L 2.9375 2.4648438 Q 3.4726563 2.3632813 3.7480469 2.0585938 Q 4.0234375 1.7539063 4.0234375 1.265625 Q 4.0234375 0.6171875 3.5625 0.25195313 Q 3.1015625 -0.11328125 2.28125 -0.11328125 Q 1.9570313 -0.11328125 1.6015625 -0.044921875 Q 1.2460938 0.0234375 0.83203125 0.16015625 L 0.83203125 0.90234375 Q 1.234375 0.6953125 1.6015625 0.5917969 Q 1.96875 0.48828125 2.296875 0.48828125 Q 2.7734375 0.48828125 3.0351563 0.6816406 Q 3.296875 0.875 3.296875 1.2226563 Q 3.296875 1.7226563 2.3398438 1.9140625 L 2.3085938 1.921875 L 2.0390625 1.9765625 Q 1.4179688 2.0976563 1.1328125 2.3847656 Q 0.84765625 2.671875 0.84765625 3.1679688 Q 0.84765625 3.796875 1.2734375 4.138672 Q 1.6992188 4.4804688 2.4882813 4.4804688 Q 2.8398438 4.4804688 3.1640625 4.4160156 Q 3.4882813 4.3515625 3.8007813 4.2226563 Z "/></symbol><symbol id="g3D5EE249F6894FA38DD21E85E2FD5F05" overflow="visible"><path d="M 0 5.46875 L 0.8886719 5.46875 L 1.8408203 1.0498047 L 2.6220703 3.8720703 L 3.3886719 3.8720703 L 4.1796875 1.0498047 L 5.131836 5.46875 L 6.020508 5.46875 L 4.741211 0 L 3.881836 0 L 3.0078125 2.9980469 L 2.1386719 0 L 1.2792969 0 L 0 5.46875 Z "/></symbol><symbol id="gF953090ED8E474A6BDB5C112B8614419" overflow="visible"><path d="M 3.953125 5.6328125 L 3.953125 4.8320313 Q 3.59375 5.0625 3.2324219 5.1796875 Q 2.8710938 5.296875 2.5039063 5.296875 Q 1.9453125 5.296875 1.6210938 5.0371094 Q 1.296875 4.7773438 1.296875 4.3359375 Q 1.296875 3.9492188 1.5097656 3.7460938 Q 1.7226563 3.5429688 2.3046875 3.40625 L 2.71875 3.3125 Q 3.5390625 3.1210938 3.9140625 2.7109375 Q 4.2890625 2.3007813 4.2890625 1.59375 Q 4.2890625 0.76171875 3.7734375 0.32421875 Q 3.2578125 -0.11328125 2.2734375 -0.11328125 Q 1.8632813 -0.11328125 1.4492188 -0.025390625 Q 1.0351563 0.0625 0.6171875 0.23828125 L 0.6171875 1.078125 Q 1.0664063 0.79296875 1.4667969 0.66015625 Q 1.8671875 0.52734375 2.2734375 0.52734375 Q 2.8710938 0.52734375 3.203125 0.7949219 Q 3.5351563 1.0625 3.5351563 1.5429688 Q 3.5351563 1.9804688 3.3066406 2.2109375 Q 3.078125 2.4414063 2.5117188 2.5664063 L 2.0898438 2.6640625 Q 1.2773438 2.8476563 0.91015625 3.21875 Q 0.54296875 3.5898438 0.54296875 4.2148438 Q 0.54296875 4.9960938 1.0683594 5.466797 Q 1.59375 5.9375 2.4648438 5.9375 Q 2.8007813 5.9375 3.171875 5.861328 Q 3.5429688 5.7851563 3.953125 5.6328125 Z "/></symbol><symbol id="gF5F7ADACD3C8648021D0891B6403D353" overflow="visible"><path d="M 3.3515625 3.8164063 L 3.3515625 6.078125 L 4.0703125 6.078125 L 4.0703125 0 L 3.3515625 0 L 3.3515625 0.55078125 Q 3.171875 0.2265625 2.8730469 0.056640625 Q 2.5742188 -0.11328125 2.1835938 -0.11328125 Q 1.390625 -0.11328125 0.9355469 0.5019531 Q 0.48046875 1.1171875 0.48046875 2.1992188 Q 0.48046875 3.265625 0.9375 3.8730469 Q 1.3945313 4.4804688 2.1835938 4.4804688 Q 2.578125 4.4804688 2.8789063 4.310547 Q 3.1796875 4.140625 3.3515625 3.8164063 Z M 1.2382813 2.1835938 Q 1.2382813 1.3476563 1.5039063 0.921875 Q 1.7695313 0.49609375 2.2890625 0.49609375 Q 2.8085938 0.49609375 3.0800781 0.92578125 Q 3.3515625 1.3554688 3.3515625 2.1835938 Q 3.3515625 3.015625 3.0800781 3.4433594 Q 2.8085938 3.8710938 2.2890625 3.8710938 Q 1.7695313 3.8710938 1.5039063 3.4453125 Q 1.2382813 3.0195313 1.2382813 2.1835938 Z "/></symbol><symbol id="g3402EB21D38B9A8AFC4DFC6262792511" overflow="visible"><path d="M 4.189453 4.770508 L 4.189453 7.5976563 L 5.0878906 7.5976563 L 5.0878906 0 L 4.189453 0 L 4.189453 0.68847656 Q 3.9648438 0.28320313 3.5913086 0.07080078 Q 3.2177734 -0.14160156 2.7294922 -0.14160156 Q 1.7382813 -0.14160156 1.1694336 0.6274414 Q 0.60058594 1.3964844 0.60058594 2.7490234 Q 0.60058594 4.0820313 1.171875 4.8413086 Q 1.7431641 5.600586 2.7294922 5.600586 Q 3.2226563 5.600586 3.5986328 5.3881836 Q 3.9746094 5.1757813 4.189453 4.770508 Z M 1.5478516 2.7294922 Q 1.5478516 1.6845703 1.8798828 1.1523438 Q 2.211914 0.6201172 2.8613281 0.6201172 Q 3.5107422 0.6201172 3.8500977 1.1572266 Q 4.189453 1.6943359 4.189453 2.7294922 Q 4.189453 3.7695313 3.8500977 4.304199 Q 3.5107422 4.838867 2.8613281 4.838867 Q 2.211914 4.838867 1.8798828 4.3066406 Q 1.5478516 3.774414 1.5478516 2.7294922 Z "/></symbol><symbol id="g9E9C649267338B7BCF3BB51B9816396A" overflow="visible"><path d="M 4.189453 2.7783203 Q 4.189453 3.7890625 3.8598633 4.313965 Q 3.5302734 4.838867 2.9003906 4.838867 Q 2.241211 4.838867 1.8945313 4.313965 Q 1.5478516 3.7890625 1.5478516 2.7783203 Q 1.5478516 1.7675781 1.8969727 1.237793 Q 2.2460938 0.7080078 2.9101563 0.7080078 Q 3.5302734 0.7080078 3.8598633 1.2402344 Q 4.189453 1.7724609 4.189453 2.7783203 Z M 5.0878906 0.3515625 Q 5.0878906 -0.87890625 4.506836 -1.5136719 Q 3.9257813 -2.1484375 2.7978516 -2.1484375 Q 2.4267578 -2.1484375 2.0214844 -2.0800781 Q 1.6162109 -2.0117188 1.2109375 -1.8798828 L 1.2109375 -0.99121094 Q 1.6894531 -1.2158203 2.0800781 -1.3232422 Q 2.4707031 -1.4306641 2.7978516 -1.4306641 Q 3.5253906 -1.4306641 3.8574219 -1.0351563 Q 4.189453 -0.63964844 4.189453 0.21972656 L 4.189453 0.25878906 L 4.189453 0.8691406 Q 3.9746094 0.41015625 3.6035156 0.18554688 Q 3.2324219 -0.0390625 2.7001953 -0.0390625 Q 1.7431641 -0.0390625 1.171875 0.72753906 Q 0.60058594 1.4941406 0.60058594 2.7783203 Q 0.60058594 4.067383 1.171875 4.8339844 Q 1.7431641 5.600586 2.7001953 5.600586 Q 3.227539 5.600586 3.59375 5.390625 Q 3.959961 5.180664 4.189453 4.741211 L 4.189453 5.4492188 L 5.0878906 5.4492188 L 5.0878906 0.3515625 Z "/></symbol><symbol id="gB83FD8DF61FB2E4EAD552878F3E8DD3F" overflow="visible"><path d="M 3.3007813 4.9121094 Q 3.4667969 5.263672 3.7231445 5.432129 Q 3.9794922 5.600586 4.3408203 5.600586 Q 5 5.600586 5.270996 5.090332 Q 5.541992 4.580078 5.541992 3.1689453 L 5.541992 0 L 4.7216797 0 L 4.7216797 3.1298828 Q 4.7216797 4.2871094 4.592285 4.567871 Q 4.4628906 4.848633 4.1210938 4.848633 Q 3.7304688 4.848633 3.5864258 4.54834 Q 3.4423828 4.248047 3.4423828 3.1298828 L 3.4423828 0 L 2.6220703 0 L 2.6220703 3.1298828 Q 2.6220703 4.301758 2.4829102 4.5751953 Q 2.34375 4.848633 1.9824219 4.848633 Q 1.6259766 4.848633 1.4868164 4.54834 Q 1.3476563 4.248047 1.3476563 3.1298828 L 1.3476563 0 L 0.53222656 0 L 0.53222656 5.46875 L 1.3476563 5.46875 L 1.3476563 5 Q 1.5087891 5.2929688 1.7504883 5.4467773 Q 1.9921875 5.600586 2.2998047 5.600586 Q 2.6708984 5.600586 2.9174805 5.4296875 Q 3.1640625 5.258789 3.3007813 4.9121094 Z "/></symbol><symbol id="g807B89443FA0EF4D7A7A613982FE96F6" overflow="visible"><path d="M 2.3583984 3.6621094 Q 2.3583984 3.930664 2.5463867 4.1259766 Q 2.734375 4.321289 2.9980469 4.321289 Q 3.2714844 4.321289 3.4667969 4.1259766 Q 3.6621094 3.930664 3.6621094 3.6621094 Q 3.6621094 3.3886719 3.4692383 3.1982422 Q 3.2763672 3.0078125 2.9980469 3.0078125 Q 2.7246094 3.0078125 2.541504 3.1933594 Q 2.3583984 3.3789063 2.3583984 3.6621094 Z M 3.0078125 6.640625 Q 2.319336 6.640625 1.9799805 5.8984375 Q 1.640625 5.15625 1.640625 3.6376953 Q 1.640625 2.1240234 1.9799805 1.3818359 Q 2.319336 0.63964844 3.0078125 0.63964844 Q 3.7011719 0.63964844 4.0405273 1.3818359 Q 4.379883 2.1240234 4.379883 3.6376953 Q 4.379883 5.15625 4.0405273 5.8984375 Q 3.7011719 6.640625 3.0078125 6.640625 Z M 3.0078125 7.421875 Q 4.1748047 7.421875 4.772949 6.4648438 Q 5.3710938 5.5078125 5.3710938 3.6376953 Q 5.3710938 1.7724609 4.772949 0.8154297 Q 4.1748047 -0.14160156 3.0078125 -0.14160156 Q 1.8408203 -0.14160156 1.2451172 0.8154297 Q 0.64941406 1.7724609 0.64941406 3.6376953 Q 0.64941406 5.5078125 1.2451172 6.4648438 Q 1.8408203 7.421875 3.0078125 7.421875 Z "/></symbol><symbol id="gA06F636B71996BA7070F256843DCE7EE" overflow="visible"><path d="M 2.9101563 3.2324219 Q 3.540039 3.2324219 3.8989258 3.6865234 Q 4.2578125 4.140625 4.2578125 4.9414063 Q 4.2578125 5.7421875 3.8989258 6.196289 Q 3.540039 6.6503906 2.9101563 6.6503906 Q 2.2558594 6.6503906 1.9238281 6.2182617 Q 1.5917969 5.786133 1.5917969 4.9414063 Q 1.5917969 4.091797 1.9213867 3.6621094 Q 2.2509766 3.2324219 2.9101563 3.2324219 Z M 1.1523438 0.15136719 L 1.1523438 1.0595703 Q 1.4599609 0.87890625 1.8066406 0.7836914 Q 2.1533203 0.68847656 2.5292969 0.68847656 Q 3.4667969 0.68847656 3.947754 1.394043 Q 4.428711 2.0996094 4.428711 3.4716797 Q 4.1992188 2.9833984 3.7841797 2.722168 Q 3.3691406 2.4609375 2.8320313 2.4609375 Q 1.7773438 2.4609375 1.1987305 3.1103516 Q 0.6201172 3.7597656 0.6201172 4.951172 Q 0.6201172 6.1279297 1.2133789 6.7749023 Q 1.8066406 7.421875 2.890625 7.421875 Q 4.1601563 7.421875 4.7509766 6.508789 Q 5.341797 5.595703 5.341797 3.6376953 Q 5.341797 1.796875 4.6313477 0.8276367 Q 3.9208984 -0.14160156 2.5683594 -0.14160156 Q 2.211914 -0.14160156 1.8505859 -0.06591797 Q 1.4892578 0.009765625 1.1523438 0.15136719 Z "/></symbol><symbol id="g27C321132E0A6A9E6B99ED77584BAD53" overflow="visible"><path d="M 1.703125 0.6484375 Q 2.6992188 0.6484375 3.09375 1.1386719 Q 3.4882813 1.6289063 3.4882813 2.9101563 Q 3.4882813 4.203125 3.0957031 4.6933594 Q 2.703125 5.1835938 1.703125 5.1835938 L 1.328125 5.1835938 L 1.328125 0.6484375 L 1.703125 0.6484375 Z M 1.71875 5.8320313 Q 3.0546875 5.8320313 3.6875 5.1210938 Q 4.3203125 4.4101563 4.3203125 2.9101563 Q 4.3203125 1.4179688 3.6875 0.7089844 Q 3.0546875 0 1.71875 0 L 0.53515625 0 L 0.53515625 5.8320313 L 1.71875 5.8320313 Z "/></symbol><symbol id="g7342E383B6C704BD4B47D4672216B35D" overflow="visible"><path d="M 0 4.375 L 0.7109375 4.375 L 1.4726563 0.83984375 L 2.0976563 3.0976563 L 2.7109375 3.0976563 L 3.34375 0.83984375 L 4.1054688 4.375 L 4.8164063 4.375 L 3.7929688 0 L 3.1054688 0 L 2.40625 2.3984375 L 1.7109375 0 L 1.0234375 0 L 0 4.375 Z "/></symbol><symbol id="gC5F336A8E4AF2A41DBA4980BEB90D9CD" overflow="visible"><path d="M 2.4511719 1.4794922 L 3.6816406 1.4794922 L 3.6816406 0.46875 L 2.7197266 -1.4013672 L 1.9677734 -1.4013672 L 2.4511719 0.46875 L 2.4511719 1.4794922 Z "/></symbol><symbol id="g952AB916CC2FCD530DE73925A36C7F0D" overflow="visible"><path d="M 0.95214844 2.0703125 L 0.95214844 5.4589844 L 1.8505859 5.4589844 L 1.8505859 2.0703125 Q 1.8505859 1.3330078 2.1118164 0.9863281 Q 2.3730469 0.63964844 2.9199219 0.63964844 Q 3.5546875 0.63964844 3.8916016 1.0864258 Q 4.2285156 1.5332031 4.2285156 2.368164 L 4.2285156 5.4589844 L 5.131836 5.4589844 L 5.131836 0 L 4.2285156 0 L 4.2285156 0.8203125 Q 3.9892578 0.3466797 3.5766602 0.10253906 Q 3.1640625 -0.14160156 2.6123047 -0.14160156 Q 1.7724609 -0.14160156 1.3623047 0.40771484 Q 0.95214844 0.95703125 0.95214844 2.0703125 Z "/></symbol><symbol id="g9A4F7CA79966390D26B2F6FED68DC851" overflow="visible"><path d="M 0 5.8320313 L 0.76953125 5.8320313 L 1.328125 1.0976563 L 1.9921875 4.2304688 L 2.8164063 4.2304688 L 3.4882813 1.0898438 L 4.046875 5.8320313 L 4.8164063 5.8320313 L 3.9453125 0 L 3.1992188 0 L 2.40625 3.4648438 L 1.6171875 0 L 0.87109375 0 L 0 5.8320313 Z "/></symbol></defs></svg>
</div>
<div style="
">
<p><br><span style="text-decoration: underline"><h4>Anchors</h4></span> <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap"><span style="color: #d73a49">^</span></code></span> is used to assert the beginning of a line in multi-line mode, or the beginning of the string in whole-string mode.</p>
<p><span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap"><span style="color: #d73a49">$</span></code></span> is used to assert the end of a line in multi-line mode, or the end of the string in whole-string mode.</p>
<p>The behaviours of these depend on the <a href="#match-options">match options</a></p>
</div>
<div style="
">
<p><br><span id="greedy" style="text-decoration: underline"><h3>Greedy VS Lazy</h3></span> Some combinators will either match “lazy”, or “greedy”.</p>
<p>Lazy is when the engine only matches as many characters required to get to the next step. This should almost always be used.</p>
<p>Greedy matching is when the engine tries to match as many characters as possible. The problem with this is that it might cause “backtracking”, which happens when the engine goes back in the pattern multiple times to ensure that as many characters as possible where matched. This can cause big performance issues.</p>
</div>
<div style="
"><br><span style="text-decoration: underline"><h3>Combinators</h3></span> Multiple atoms can be combined together to form more complex patterns.</div>
<div style="
">
<p><br><span style="text-decoration: underline"><h4>Chain</h4></span> When two expressions are next to each other, they will be chained together, which means that both will be evaluated in-order.</p>
<p>Example: <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">x<span style="color: #d73a49">\d</span></code></span> matches a <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">x</code></span> and then a digit, like for example <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">x9</code></span></p>
</div>
<div style="
">
<p><br><span style="text-decoration: underline"><h4>Or</h4></span> Two expressions separated by a <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">|</code></span> cause the RegEx engine to first try to match the left side, and only if it fails, it tries the right side instead.</p>
<p>Note that “or” has a long left and right scope, which means that <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">ab<span style="color: #d73a49">|</span>cd</code></span> will match either <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">ab</code></span> or <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">cd</code></span></p>
</div>
<div style="
">
<p><br><span style="text-decoration: underline"><h4>Or-Not</h4></span> Tries to match the expression on the left to it, but wont error if it doesnt succeed.</p>
<p>Note that “or-not” has a short left scope, which means that <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">ab<span style="color: #d73a49">?</span></code></span> will always match <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">a</code></span>, and then try to match <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">b</code></span></p>
</div>
<div style="
">
<p><br><span style="text-decoration: underline"><h4>Repeated</h4></span> A expression followed by either a <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">*</code></span> for <a href="#greedy">greedy</a> repeat, or a <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">*?</code></span> for <a href="#greedy">lazy</a> repeat.</p>
<p>This matches as many times as possible, but can also match the pattern zero times.</p>
<p>Note that this has a short left scope.</p>
</div>
<div style="
">
<p><br><span style="text-decoration: underline"><h4>Repeated At Least Once</h4></span> A expression followed by either a <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">+</code></span> for <a href="#greedy">greedy</a> repeat, or a <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">+?</code></span> for <a href="#greedy">lazy</a> repeat.</p>
<p>This matches as many times as possible, and at least one time.</p>
<p>Note that this has a short left scope.</p>
</div>
<div style="
">
<p><br><span id="non-capture-group" style="text-decoration: underline"><h4>(Non-Capture) Group</h4></span> Groups multiple expressions together for scoping.</p>
<p>Example: <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap"><span style="color: #d73a49">(</span><span style="color: #b60157">?:</span>abc<span style="color: #d73a49">)</span></code></span> will just match <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">abc</code></span></p>
</div>
<div style="
">
<p><br><span style="text-decoration: underline"><h4>Capture Group</h4></span> Similar to <a href="#non-capture-group">Non-Capture Groups</a> except that they capture the matched text. This allows the matched text of the inner expression to be extracted later.</p>
<p>Capture group IDs are enumerated from left to right, starting with 1.</p>
<p>Example: <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap"><span style="color: #d73a49">(</span>abc<span style="color: #d73a49">)</span>de</code></span> will match <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">abcde</code></span>, and store <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">abc</code></span> in group 1.</p>
</div>
<div style="
">
<p><br><span style="text-decoration: underline"><h4>Character Set</h4></span> By surrounding multiple characters in square brackets, the engine will match any of them. Special characters or expressions wont be parsed inside them, which means that this can also be used to escape characters.</p>
<p>For example: <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap"><span style="color: #d73a49">[</span>abc<span style="color: #d73a49">]</span></code></span> will match either <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">a</code></span>, <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">b</code></span> or <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">c</code></span>.</p>
<p>and <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap"><span style="color: #d73a49">[</span>ab(?:c)<span style="color: #d73a49">]</span></code></span> will match either <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">a</code></span>, <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">b</code></span>, <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">(</code></span>, <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">?</code></span>, <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">:</code></span>, <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">c</code></span>, or <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap">)</code></span>.</p>
<p><a href="#char-groups">Character groups</a> and <a href="#escaped-chars">escaped characters</a> still work inside character sets.</p>
<p>Character sets can also contain ranges. For example: <span style="
border:1pt solid black;
border-radius:2pt;
padding:1.6pt;display:inline-block"><code style="white-space: pre-wrap"><span style="color: #d73a49">[</span><span style="color: #b60157">0</span><span style="color: #b60157">-9</span><span style="color: #b60157">a</span><span style="color: #b60157">-z</span><span style="color: #d73a49">]</span></code></span> will match either any digit, or any lowercase letter.</p>
</div>
<div style="
">
<p><br><span style="text-decoration: underline"><h2>Conclusion</h2></span> RegEx is perfect for when you just want to match some patterns, but the syntax can make patterns very hard to read or modify.</p>
<p>In the next article, we will start to dive into implementing RegEx.</p>
<p>Stay tuned!</p>
</div>
<script>
function gotoVariant(variant) {
window.location.href = window.location.href.replace(/\.\w+.html/g, variant);
}
window.addEventListener('beforeprint', (event) => {
gotoVariant('.min.pdf');
});
</script>
<script src="coffee.js" async>
</script>
</body>
</html>