This commit is contained in:
LASTA_DEV01\lasta
2026-05-13 19:57:34 +09:00
parent 2e9204243d
commit 9e88f4c7ad
4310 changed files with 48538 additions and 905279 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96">
<!-- White circle background -->
<circle cx="48" cy="48" r="45" fill="white"/>
<!-- Original diagram, centered in the white circle -->
<g transform="translate(-2 0)">
<circle cx="65" cy="32" r="15" fill="none" stroke-width="4" stroke="#8b1f6b" />
<circle cx="22" cy="44" r="8" fill="none" stroke-width="4" stroke="#8b1f6b" />
<circle cx="63" cy="73" r="8" fill="none" stroke-width="4" stroke="#8b1f6b" />
<line x1="30" y1="39" x2="49" y2="33" stroke-width="3" stroke="#8b1f6b" stroke-linecap="round" />
<line x1="31" y1="45" x2="51" y2="39" stroke-width="3" stroke="#8b1f6b" stroke-linecap="round" />
<line x1="64" y1="48" x2="63" y2="64" stroke-width="4" stroke="#8b1f6b" stroke-linecap="round" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 808 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 KiB

View File

@@ -0,0 +1,341 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="355" height="836" viewBox="0 0 355 836">
<defs>
<g>
<g id="glyph-0-0">
<path d="M 6.03125 -2.484375 C 6.03125 -1.703125 5.753906 -1.09375 5.203125 -0.65625 C 4.648438 -0.21875 3.90625 0 2.96875 0 C 2.488281 0 2.039062 -0.03125 1.625 -0.09375 C 1.21875 -0.164062 0.878906 -0.257812 0.609375 -0.375 L 0.609375 -1.421875 C 0.898438 -1.296875 1.257812 -1.179688 1.6875 -1.078125 C 2.113281 -0.972656 2.554688 -0.921875 3.015625 -0.921875 C 3.648438 -0.921875 4.128906 -1.046875 4.453125 -1.296875 C 4.773438 -1.554688 4.9375 -1.90625 4.9375 -2.34375 C 4.9375 -2.625 4.875 -2.863281 4.75 -3.0625 C 4.632812 -3.257812 4.429688 -3.441406 4.140625 -3.609375 C 3.847656 -3.773438 3.441406 -3.953125 2.921875 -4.140625 C 2.203125 -4.410156 1.65625 -4.742188 1.28125 -5.140625 C 0.90625 -5.535156 0.71875 -6.078125 0.71875 -6.765625 C 0.71875 -7.222656 0.832031 -7.617188 1.0625 -7.953125 C 1.300781 -8.285156 1.625 -8.539062 2.03125 -8.71875 C 2.445312 -8.90625 2.921875 -9 3.453125 -9 C 3.921875 -9 4.351562 -8.957031 4.75 -8.875 C 5.144531 -8.789062 5.5 -8.675781 5.8125 -8.53125 L 5.484375 -7.515625 C 5.191406 -7.671875 4.867188 -7.800781 4.515625 -7.90625 C 4.171875 -8.019531 3.8125 -8.078125 3.4375 -8.078125 C 2.894531 -8.078125 2.488281 -7.957031 2.21875 -7.71875 C 1.945312 -7.488281 1.8125 -7.179688 1.8125 -6.796875 C 1.8125 -6.492188 1.867188 -6.242188 1.984375 -6.046875 C 2.109375 -5.859375 2.304688 -5.6875 2.578125 -5.53125 C 2.847656 -5.375 3.21875 -5.203125 3.6875 -5.015625 C 4.1875 -4.828125 4.609375 -4.625 4.953125 -4.40625 C 5.304688 -4.1875 5.570312 -3.925781 5.75 -3.625 C 5.9375 -3.320312 6.03125 -2.941406 6.03125 -2.484375 Z M 6.03125 -2.484375 "/>
</g>
<g id="glyph-0-1">
<path d="M 3.875 0 L 2.796875 0 L 2.796875 -8.078125 L 0.125 -8.078125 L 0.125 -9 L 6.546875 -9 L 6.546875 -8.078125 L 3.875 -8.078125 Z M 3.875 0 "/>
</g>
<g id="glyph-0-2">
<path d="M 6.546875 0 L 5.515625 -2.90625 L 2.109375 -2.90625 L 1.09375 0 L 0 0 L 3.34375 -9 L 4.3125 -9 L 7.65625 0 Z M 4.21875 -6.53125 C 4.195312 -6.59375 4.15625 -6.707031 4.09375 -6.875 C 4.039062 -7.039062 3.988281 -7.210938 3.9375 -7.390625 C 3.882812 -7.578125 3.84375 -7.71875 3.8125 -7.8125 C 3.757812 -7.5625 3.695312 -7.316406 3.625 -7.078125 C 3.550781 -6.847656 3.488281 -6.664062 3.4375 -6.53125 L 2.46875 -3.921875 L 5.1875 -3.921875 Z M 4.21875 -6.53125 "/>
</g>
<g id="glyph-0-3">
<path d="M 3.53125 -9 C 4.59375 -9 5.375 -8.800781 5.875 -8.40625 C 6.382812 -8.007812 6.640625 -7.410156 6.640625 -6.609375 C 6.640625 -6.160156 6.554688 -5.785156 6.390625 -5.484375 C 6.222656 -5.191406 6.007812 -4.957031 5.75 -4.78125 C 5.488281 -4.601562 5.21875 -4.460938 4.9375 -4.359375 L 7.28125 0 L 6.03125 0 L 3.953125 -4.046875 L 2.25 -4.046875 L 2.25 0 L 1.15625 0 L 1.15625 -9 Z M 3.46875 -8.078125 L 2.25 -8.078125 L 2.25 -4.96875 L 3.53125 -4.96875 C 4.226562 -4.96875 4.734375 -5.101562 5.046875 -5.375 C 5.367188 -5.644531 5.53125 -6.039062 5.53125 -6.5625 C 5.53125 -7.113281 5.363281 -7.503906 5.03125 -7.734375 C 4.695312 -7.960938 4.175781 -8.078125 3.46875 -8.078125 Z M 3.46875 -8.078125 "/>
</g>
<g id="glyph-0-4">
<path d="M 4.84375 -8.078125 C 3.914062 -8.078125 3.1875 -7.757812 2.65625 -7.125 C 2.132812 -6.488281 1.875 -5.613281 1.875 -4.5 C 1.875 -3.394531 2.117188 -2.519531 2.609375 -1.875 C 3.097656 -1.238281 3.835938 -0.921875 4.828125 -0.921875 C 5.203125 -0.921875 5.554688 -0.953125 5.890625 -1.015625 C 6.222656 -1.085938 6.550781 -1.171875 6.875 -1.265625 L 6.875 -0.328125 C 6.550781 -0.210938 6.21875 -0.128906 5.875 -0.078125 C 5.539062 -0.0234375 5.140625 0 4.671875 0 C 3.796875 0 3.066406 -0.179688 2.484375 -0.546875 C 1.898438 -0.921875 1.460938 -1.445312 1.171875 -2.125 C 0.878906 -2.800781 0.734375 -3.597656 0.734375 -4.515625 C 0.734375 -5.398438 0.890625 -6.175781 1.203125 -6.84375 C 1.523438 -7.519531 1.992188 -8.046875 2.609375 -8.421875 C 3.222656 -8.804688 3.96875 -9 4.84375 -9 C 5.75 -9 6.539062 -8.835938 7.21875 -8.515625 L 6.78125 -7.484375 C 6.519531 -7.640625 6.222656 -7.773438 5.890625 -7.890625 C 5.566406 -8.015625 5.21875 -8.078125 4.84375 -8.078125 Z M 4.84375 -8.078125 "/>
</g>
<g id="glyph-0-5">
<path d="M 6.609375 -3.515625 C 6.609375 -2.398438 6.335938 -1.535156 5.796875 -0.921875 C 5.253906 -0.304688 4.523438 0 3.609375 0 C 3.046875 0 2.539062 -0.132812 2.09375 -0.40625 C 1.644531 -0.675781 1.289062 -1.070312 1.03125 -1.59375 C 0.78125 -2.125 0.65625 -2.765625 0.65625 -3.515625 C 0.65625 -4.628906 0.921875 -5.488281 1.453125 -6.09375 C 1.992188 -6.695312 2.722656 -7 3.640625 -7 C 4.234375 -7 4.75 -6.863281 5.1875 -6.59375 C 5.632812 -6.320312 5.984375 -5.925781 6.234375 -5.40625 C 6.484375 -4.894531 6.609375 -4.265625 6.609375 -3.515625 Z M 1.75 -3.515625 C 1.75 -2.722656 1.898438 -2.09375 2.203125 -1.625 C 2.503906 -1.15625 2.984375 -0.921875 3.640625 -0.921875 C 4.285156 -0.921875 4.757812 -1.15625 5.0625 -1.625 C 5.363281 -2.09375 5.515625 -2.722656 5.515625 -3.515625 C 5.515625 -4.316406 5.363281 -4.941406 5.0625 -5.390625 C 4.757812 -5.847656 4.28125 -6.078125 3.625 -6.078125 C 2.96875 -6.078125 2.488281 -5.847656 2.1875 -5.390625 C 1.894531 -4.941406 1.75 -4.316406 1.75 -3.515625 Z M 1.75 -3.515625 "/>
</g>
<g id="glyph-0-6">
<path d="M 4.109375 -7 C 4.878906 -7 5.457031 -6.800781 5.84375 -6.40625 C 6.238281 -6.007812 6.4375 -5.363281 6.4375 -4.46875 L 6.4375 0 L 5.40625 0 L 5.40625 -4.421875 C 5.40625 -5.523438 4.921875 -6.078125 3.953125 -6.078125 C 3.242188 -6.078125 2.753906 -5.863281 2.484375 -5.4375 C 2.210938 -5.007812 2.078125 -4.390625 2.078125 -3.578125 L 2.078125 0 L 1.015625 0 L 1.015625 -7 L 1.875 -7 L 2.03125 -5.9375 L 2.09375 -5.9375 C 2.300781 -6.289062 2.585938 -6.554688 2.953125 -6.734375 C 3.316406 -6.910156 3.703125 -7 4.109375 -7 Z M 4.109375 -7 "/>
</g>
<g id="glyph-0-7">
<path d="M 2.4375 0 L 0 -7 L 1.125 -7 L 2.5 -2.875 C 2.5625 -2.675781 2.628906 -2.457031 2.703125 -2.21875 C 2.773438 -1.988281 2.835938 -1.765625 2.890625 -1.546875 C 2.941406 -1.335938 2.984375 -1.160156 3.015625 -1.015625 L 3.0625 -1.015625 C 3.09375 -1.160156 3.132812 -1.34375 3.1875 -1.5625 C 3.25 -1.78125 3.316406 -2.003906 3.390625 -2.234375 C 3.472656 -2.472656 3.539062 -2.6875 3.59375 -2.875 L 4.96875 -7 L 6.09375 -7 L 3.640625 0 Z M 2.4375 0 "/>
</g>
<g id="glyph-0-8">
<path d="M 3.5 -7 C 4.050781 -7 4.523438 -6.863281 4.921875 -6.59375 C 5.316406 -6.332031 5.617188 -5.957031 5.828125 -5.46875 C 6.046875 -4.976562 6.15625 -4.40625 6.15625 -3.75 L 6.15625 -3.046875 L 1.75 -3.046875 C 1.769531 -2.347656 1.957031 -1.816406 2.3125 -1.453125 C 2.664062 -1.097656 3.160156 -0.921875 3.796875 -0.921875 C 4.210938 -0.921875 4.578125 -0.953125 4.890625 -1.015625 C 5.203125 -1.085938 5.53125 -1.191406 5.875 -1.328125 L 5.875 -0.40625 C 5.539062 -0.269531 5.210938 -0.164062 4.890625 -0.09375 C 4.578125 -0.03125 4.195312 0 3.75 0 C 3.144531 0 2.609375 -0.128906 2.140625 -0.390625 C 1.671875 -0.648438 1.304688 -1.035156 1.046875 -1.546875 C 0.785156 -2.066406 0.65625 -2.703125 0.65625 -3.453125 C 0.65625 -4.191406 0.773438 -4.820312 1.015625 -5.34375 C 1.253906 -5.875 1.585938 -6.28125 2.015625 -6.5625 C 2.441406 -6.851562 2.9375 -7 3.5 -7 Z M 3.484375 -6.078125 C 2.984375 -6.078125 2.585938 -5.890625 2.296875 -5.515625 C 2.003906 -5.148438 1.832031 -4.632812 1.78125 -3.96875 L 5.046875 -3.96875 C 5.046875 -4.59375 4.921875 -5.097656 4.671875 -5.484375 C 4.421875 -5.878906 4.023438 -6.078125 3.484375 -6.078125 Z M 3.484375 -6.078125 "/>
</g>
<g id="glyph-0-9">
<path d="M 4.015625 -7 C 4.140625 -7 4.269531 -6.992188 4.40625 -6.984375 C 4.550781 -6.972656 4.675781 -6.957031 4.78125 -6.9375 L 4.640625 -5.984375 C 4.535156 -6.015625 4.421875 -6.035156 4.296875 -6.046875 C 4.171875 -6.066406 4.054688 -6.078125 3.953125 -6.078125 C 3.617188 -6.078125 3.304688 -5.976562 3.015625 -5.78125 C 2.734375 -5.582031 2.503906 -5.304688 2.328125 -4.953125 C 2.160156 -4.609375 2.078125 -4.203125 2.078125 -3.734375 L 2.078125 0 L 1.015625 0 L 1.015625 -7 L 1.890625 -7 L 2 -5.703125 L 2.046875 -5.703125 C 2.253906 -6.054688 2.519531 -6.359375 2.84375 -6.609375 C 3.175781 -6.867188 3.566406 -7 4.015625 -7 Z M 4.015625 -7 "/>
</g>
<g id="glyph-0-10">
<path d="M 3.171875 -0.921875 C 3.328125 -0.921875 3.488281 -0.929688 3.65625 -0.953125 C 3.820312 -0.984375 3.957031 -1.015625 4.0625 -1.046875 L 4.0625 -0.1875 C 3.957031 -0.132812 3.800781 -0.0859375 3.59375 -0.046875 C 3.382812 -0.015625 3.179688 0 2.984375 0 C 2.648438 0 2.335938 -0.0625 2.046875 -0.1875 C 1.765625 -0.3125 1.535156 -0.523438 1.359375 -0.828125 C 1.191406 -1.128906 1.109375 -1.554688 1.109375 -2.109375 L 1.109375 -6.078125 L 0.1875 -6.078125 L 0.1875 -6.65625 L 1.109375 -7.09375 L 1.53125 -8.5 L 2.15625 -8.5 L 2.15625 -7 L 4.015625 -7 L 4.015625 -6.078125 L 2.15625 -6.078125 L 2.15625 -2.140625 C 2.15625 -1.722656 2.25 -1.414062 2.4375 -1.21875 C 2.625 -1.019531 2.867188 -0.921875 3.171875 -0.921875 Z M 3.171875 -0.921875 "/>
</g>
<g id="glyph-0-11">
</g>
<g id="glyph-0-12">
<path d="M 4.9375 0 L 2.125 -7.90625 L 2.078125 -7.90625 C 2.097656 -7.644531 2.113281 -7.289062 2.125 -6.84375 C 2.144531 -6.40625 2.15625 -5.945312 2.15625 -5.46875 L 2.15625 0 L 1.15625 0 L 1.15625 -9 L 2.765625 -9 L 5.40625 -1.609375 L 5.453125 -1.609375 L 8.140625 -9 L 9.71875 -9 L 9.71875 0 L 8.65625 0 L 8.65625 -5.546875 C 8.65625 -5.984375 8.664062 -6.414062 8.6875 -6.84375 C 8.707031 -7.269531 8.722656 -7.617188 8.734375 -7.890625 L 8.6875 -7.890625 L 5.828125 0 Z M 4.9375 0 "/>
</g>
<g id="glyph-0-13">
<path d="M 3.453125 -7 C 4.234375 -7 4.8125 -6.8125 5.1875 -6.4375 C 5.570312 -6.070312 5.765625 -5.488281 5.765625 -4.6875 L 5.765625 0 L 4.984375 0 L 4.78125 -1.078125 L 4.734375 -1.078125 C 4.453125 -0.710938 4.15625 -0.441406 3.84375 -0.265625 C 3.539062 -0.0859375 3.117188 0 2.578125 0 C 1.992188 0 1.507812 -0.15625 1.125 -0.46875 C 0.738281 -0.78125 0.546875 -1.269531 0.546875 -1.9375 C 0.546875 -2.582031 0.796875 -3.082031 1.296875 -3.4375 C 1.804688 -3.789062 2.585938 -3.96875 3.640625 -3.96875 L 4.734375 -3.96875 L 4.734375 -4.421875 C 4.734375 -5.046875 4.613281 -5.476562 4.375 -5.71875 C 4.144531 -5.957031 3.816406 -6.078125 3.390625 -6.078125 C 3.054688 -6.078125 2.738281 -6.019531 2.4375 -5.90625 C 2.132812 -5.789062 1.847656 -5.660156 1.578125 -5.515625 L 1.265625 -6.390625 C 1.546875 -6.554688 1.875 -6.695312 2.25 -6.8125 C 2.632812 -6.9375 3.035156 -7 3.453125 -7 Z M 3.765625 -3.046875 C 2.960938 -3.046875 2.40625 -2.941406 2.09375 -2.734375 C 1.789062 -2.535156 1.640625 -2.25 1.640625 -1.875 C 1.640625 -1.539062 1.75 -1.296875 1.96875 -1.140625 C 2.1875 -0.992188 2.46875 -0.921875 2.8125 -0.921875 C 3.363281 -0.921875 3.816406 -1.050781 4.171875 -1.3125 C 4.535156 -1.582031 4.71875 -1.992188 4.71875 -2.546875 L 4.71875 -3.046875 Z M 3.765625 -3.046875 "/>
</g>
<g id="glyph-0-14">
<path d="M 2.0625 -4.75 C 2.0625 -4.601562 2.054688 -4.414062 2.046875 -4.1875 C 2.035156 -3.957031 2.023438 -3.757812 2.015625 -3.59375 L 2.0625 -3.59375 C 2.113281 -3.664062 2.1875 -3.765625 2.28125 -3.890625 C 2.375 -4.023438 2.46875 -4.160156 2.5625 -4.296875 C 2.664062 -4.429688 2.753906 -4.539062 2.828125 -4.625 L 4.890625 -7 L 6.125 -7 L 3.515625 -4 L 6.296875 0 L 5.03125 0 L 2.796875 -3.25 L 2.0625 -2.5625 L 2.0625 0 L 1.015625 0 L 1.015625 -10 L 2.0625 -10 Z M 2.0625 -4.75 "/>
</g>
<g id="glyph-0-15">
<path d="M 3.296875 0 C 2.492188 0 1.851562 -0.289062 1.375 -0.875 C 0.894531 -1.457031 0.65625 -2.328125 0.65625 -3.484375 C 0.65625 -4.640625 0.894531 -5.515625 1.375 -6.109375 C 1.863281 -6.703125 2.507812 -7 3.3125 -7 C 3.8125 -7 4.21875 -6.894531 4.53125 -6.6875 C 4.84375 -6.488281 5.097656 -6.242188 5.296875 -5.953125 L 5.375 -5.953125 C 5.363281 -6.066406 5.347656 -6.242188 5.328125 -6.484375 C 5.304688 -6.722656 5.296875 -6.910156 5.296875 -7.046875 L 5.296875 -10 L 6.359375 -10 L 6.359375 0 L 5.515625 0 L 5.359375 -1.03125 L 5.296875 -1.03125 C 5.109375 -0.75 4.851562 -0.503906 4.53125 -0.296875 C 4.21875 -0.0976562 3.804688 0 3.296875 0 Z M 3.46875 -0.921875 C 4.144531 -0.921875 4.617188 -1.113281 4.890625 -1.5 C 5.171875 -1.894531 5.3125 -2.488281 5.3125 -3.28125 L 5.3125 -3.46875 C 5.3125 -4.3125 5.179688 -4.957031 4.921875 -5.40625 C 4.660156 -5.851562 4.171875 -6.078125 3.453125 -6.078125 C 2.890625 -6.078125 2.460938 -5.835938 2.171875 -5.359375 C 1.890625 -4.890625 1.75 -4.257812 1.75 -3.46875 C 1.75 -2.65625 1.890625 -2.023438 2.171875 -1.578125 C 2.460938 -1.140625 2.894531 -0.921875 3.46875 -0.921875 Z M 3.46875 -0.921875 "/>
</g>
<g id="glyph-0-16">
<path d="M 5.171875 -3.9375 C 5.066406 -4.289062 4.972656 -4.640625 4.890625 -4.984375 C 4.816406 -5.328125 4.765625 -5.59375 4.734375 -5.78125 L 4.6875 -5.78125 C 4.644531 -5.59375 4.585938 -5.328125 4.515625 -4.984375 C 4.453125 -4.640625 4.363281 -4.285156 4.25 -3.921875 L 3.09375 0 L 1.890625 0 L 0.125 -7 L 1.21875 -7 L 2.109375 -3.25 C 2.203125 -2.875 2.285156 -2.492188 2.359375 -2.109375 C 2.441406 -1.722656 2.5 -1.40625 2.53125 -1.15625 L 2.578125 -1.15625 C 2.609375 -1.300781 2.644531 -1.484375 2.6875 -1.703125 C 2.738281 -1.921875 2.789062 -2.148438 2.84375 -2.390625 C 2.894531 -2.628906 2.953125 -2.847656 3.015625 -3.046875 L 4.15625 -7 L 5.296875 -7 L 6.40625 -3.046875 C 6.5 -2.742188 6.585938 -2.414062 6.671875 -2.0625 C 6.753906 -1.71875 6.8125 -1.421875 6.84375 -1.171875 L 6.890625 -1.171875 C 6.910156 -1.390625 6.960938 -1.691406 7.046875 -2.078125 C 7.128906 -2.460938 7.21875 -2.851562 7.3125 -3.25 L 8.21875 -7 L 9.296875 -7 L 7.515625 0 L 6.28125 0 Z M 5.171875 -3.9375 "/>
</g>
<g id="glyph-0-17">
<path d="M 2.078125 -6.953125 C 2.078125 -6.585938 2.054688 -6.242188 2.015625 -5.921875 L 2.09375 -5.921875 C 2.300781 -6.273438 2.582031 -6.539062 2.9375 -6.71875 C 3.289062 -6.90625 3.675781 -7 4.09375 -7 C 4.875 -7 5.457031 -6.800781 5.84375 -6.40625 C 6.238281 -6.007812 6.4375 -5.367188 6.4375 -4.484375 L 6.4375 0 L 5.40625 0 L 5.40625 -4.421875 C 5.40625 -5.523438 4.921875 -6.078125 3.953125 -6.078125 C 3.234375 -6.078125 2.738281 -5.859375 2.46875 -5.421875 C 2.207031 -4.992188 2.078125 -4.375 2.078125 -3.5625 L 2.078125 0 L 1.015625 0 L 1.015625 -10 L 2.078125 -10 Z M 2.078125 -6.953125 "/>
</g>
<g id="glyph-0-18">
<path d="M 6.390625 -7 L 6.390625 0 L 5.53125 0 L 5.375 -1.03125 L 5.328125 -1.03125 C 5.117188 -0.675781 4.828125 -0.414062 4.453125 -0.25 C 4.085938 -0.0820312 3.695312 0 3.28125 0 C 2.507812 0 1.925781 -0.195312 1.53125 -0.59375 C 1.144531 -0.988281 0.953125 -1.625 0.953125 -2.5 L 0.953125 -7 L 2.015625 -7 L 2.015625 -2.5625 C 2.015625 -1.46875 2.488281 -0.921875 3.4375 -0.921875 C 4.15625 -0.921875 4.648438 -1.132812 4.921875 -1.5625 C 5.203125 -1.988281 5.34375 -2.609375 5.34375 -3.421875 L 5.34375 -7 Z M 6.390625 -7 "/>
</g>
<g id="glyph-0-19">
<path d="M 2.546875 -3.578125 L 0.328125 -7 L 1.53125 -7 L 3.1875 -4.34375 L 4.828125 -7 L 6.015625 -7 L 3.796875 -3.5625 L 6.125 0 L 4.9375 0 L 3.1875 -2.78125 L 1.40625 0 L 0.21875 0 Z M 2.546875 -3.578125 "/>
</g>
<g id="glyph-0-20">
<path d="M 2.078125 0 L 1.015625 0 L 1.015625 -10 L 2.078125 -10 Z M 2.078125 0 "/>
</g>
<g id="glyph-0-21">
<path d="M 3.59375 0 C 3.03125 0 2.523438 -0.117188 2.078125 -0.359375 C 1.640625 -0.609375 1.289062 -0.988281 1.03125 -1.5 C 0.78125 -2.007812 0.65625 -2.664062 0.65625 -3.46875 C 0.65625 -4.289062 0.785156 -4.960938 1.046875 -5.484375 C 1.316406 -6.003906 1.675781 -6.382812 2.125 -6.625 C 2.582031 -6.875 3.097656 -7 3.671875 -7 C 3.992188 -7 4.304688 -6.960938 4.609375 -6.890625 C 4.921875 -6.828125 5.171875 -6.75 5.359375 -6.65625 L 5.046875 -5.765625 C 4.847656 -5.835938 4.617188 -5.90625 4.359375 -5.96875 C 4.109375 -6.039062 3.867188 -6.078125 3.640625 -6.078125 C 2.378906 -6.078125 1.75 -5.210938 1.75 -3.484375 C 1.75 -2.648438 1.898438 -2.015625 2.203125 -1.578125 C 2.515625 -1.140625 2.976562 -0.921875 3.59375 -0.921875 C 3.9375 -0.921875 4.242188 -0.957031 4.515625 -1.03125 C 4.785156 -1.113281 5.03125 -1.207031 5.25 -1.3125 L 5.25 -0.34375 C 5.039062 -0.226562 4.804688 -0.140625 4.546875 -0.078125 C 4.285156 -0.0234375 3.96875 0 3.59375 0 Z M 3.59375 0 "/>
</g>
<g id="glyph-0-22">
<path d="M 8.640625 -4.5 C 8.640625 -3.59375 8.488281 -2.800781 8.1875 -2.125 C 7.882812 -1.457031 7.441406 -0.9375 6.859375 -0.5625 C 6.273438 -0.1875 5.550781 0 4.6875 0 C 3.800781 0 3.0625 -0.1875 2.46875 -0.5625 C 1.882812 -0.9375 1.445312 -1.460938 1.15625 -2.140625 C 0.875 -2.816406 0.734375 -3.609375 0.734375 -4.515625 C 0.734375 -5.410156 0.875 -6.191406 1.15625 -6.859375 C 1.445312 -7.535156 1.882812 -8.0625 2.46875 -8.4375 C 3.0625 -8.8125 3.804688 -9 4.703125 -9 C 5.554688 -9 6.273438 -8.8125 6.859375 -8.4375 C 7.441406 -8.070312 7.882812 -7.550781 8.1875 -6.875 C 8.488281 -6.195312 8.640625 -5.40625 8.640625 -4.5 Z M 1.875 -4.515625 C 1.875 -3.398438 2.097656 -2.519531 2.546875 -1.875 C 3.003906 -1.238281 3.71875 -0.921875 4.6875 -0.921875 C 5.664062 -0.921875 6.378906 -1.238281 6.828125 -1.875 C 7.273438 -2.519531 7.5 -3.398438 7.5 -4.515625 C 7.5 -5.628906 7.273438 -6.5 6.828125 -7.125 C 6.378906 -7.757812 5.671875 -8.078125 4.703125 -8.078125 C 3.734375 -8.078125 3.019531 -7.757812 2.5625 -7.125 C 2.101562 -6.5 1.875 -5.628906 1.875 -4.515625 Z M 1.875 -4.515625 "/>
</g>
<g id="glyph-0-23">
<path d="M 3.296875 -7 C 3.722656 -7 4.101562 -6.910156 4.4375 -6.734375 C 4.78125 -6.554688 5.070312 -6.285156 5.3125 -5.921875 L 5.375 -5.921875 L 5.515625 -7 L 6.359375 -7 L 6.359375 0.015625 C 6.359375 1.003906 6.125 1.75 5.65625 2.25 C 5.1875 2.75 4.460938 3 3.484375 3 C 2.535156 3 1.757812 2.863281 1.15625 2.59375 L 1.15625 1.546875 C 1.789062 1.898438 2.585938 2.078125 3.546875 2.078125 C 4.097656 2.078125 4.53125 1.898438 4.84375 1.546875 C 5.15625 1.191406 5.3125 0.710938 5.3125 0.109375 L 5.3125 -0.171875 C 5.3125 -0.273438 5.316406 -0.421875 5.328125 -0.609375 C 5.335938 -0.804688 5.347656 -0.945312 5.359375 -1.03125 L 5.296875 -1.03125 C 4.867188 -0.34375 4.207031 0 3.3125 0 C 2.476562 0 1.828125 -0.304688 1.359375 -0.921875 C 0.890625 -1.535156 0.65625 -2.390625 0.65625 -3.484375 C 0.65625 -4.554688 0.890625 -5.410156 1.359375 -6.046875 C 1.828125 -6.679688 2.472656 -7 3.296875 -7 Z M 3.4375 -6.078125 C 2.90625 -6.078125 2.488281 -5.851562 2.1875 -5.40625 C 1.894531 -4.957031 1.75 -4.316406 1.75 -3.484375 C 1.75 -2.660156 1.894531 -2.023438 2.1875 -1.578125 C 2.476562 -1.140625 2.90625 -0.921875 3.46875 -0.921875 C 4.113281 -0.921875 4.582031 -1.101562 4.875 -1.46875 C 5.175781 -1.832031 5.328125 -2.421875 5.328125 -3.234375 L 5.328125 -3.5 C 5.328125 -4.425781 5.175781 -5.085938 4.875 -5.484375 C 4.570312 -5.878906 4.09375 -6.078125 3.4375 -6.078125 Z M 3.4375 -6.078125 "/>
</g>
<g id="glyph-0-24">
<path d="M 0.015625 -7 L 1.140625 -7 L 2.53125 -3.03125 C 2.65625 -2.675781 2.765625 -2.34375 2.859375 -2.03125 C 2.953125 -1.71875 3.023438 -1.414062 3.078125 -1.125 L 3.125 -1.125 C 3.164062 -1.34375 3.238281 -1.625 3.34375 -1.96875 C 3.445312 -2.320312 3.554688 -2.679688 3.671875 -3.046875 L 4.984375 -7 L 6.125 -7 L 3.34375 0.859375 C 3.125 1.515625 2.832031 2.035156 2.46875 2.421875 C 2.113281 2.804688 1.628906 3 1.015625 3 C 0.816406 3 0.644531 2.988281 0.5 2.96875 C 0.351562 2.957031 0.226562 2.941406 0.125 2.921875 L 0.125 2.015625 C 0.21875 2.023438 0.328125 2.035156 0.453125 2.046875 C 0.578125 2.066406 0.707031 2.078125 0.84375 2.078125 C 1.207031 2.078125 1.503906 1.96875 1.734375 1.75 C 1.960938 1.53125 2.140625 1.238281 2.265625 0.875 L 2.609375 -0.015625 Z M 0.015625 -7 "/>
</g>
<g id="glyph-0-25">
<path d="M 3.609375 -9 C 4.679688 -9 5.488281 -8.828125 6.03125 -8.484375 C 6.582031 -8.140625 6.859375 -7.535156 6.859375 -6.671875 C 6.859375 -6.117188 6.71875 -5.660156 6.4375 -5.296875 C 6.164062 -4.929688 5.765625 -4.695312 5.234375 -4.59375 L 5.234375 -4.53125 C 5.585938 -4.476562 5.910156 -4.375 6.203125 -4.21875 C 6.492188 -4.0625 6.722656 -3.84375 6.890625 -3.5625 C 7.066406 -3.28125 7.15625 -2.910156 7.15625 -2.453125 C 7.15625 -1.671875 6.890625 -1.066406 6.359375 -0.640625 C 5.828125 -0.210938 5.097656 0 4.171875 0 L 1.15625 0 L 1.15625 -9 Z M 3.828125 -4.96875 C 4.566406 -4.96875 5.070312 -5.101562 5.34375 -5.375 C 5.613281 -5.644531 5.75 -6.046875 5.75 -6.578125 C 5.75 -7.109375 5.582031 -7.488281 5.25 -7.71875 C 4.914062 -7.957031 4.382812 -8.078125 3.65625 -8.078125 L 2.25 -8.078125 L 2.25 -4.96875 Z M 2.25 -4.046875 L 2.25 -0.921875 L 3.96875 -0.921875 C 4.726562 -0.921875 5.253906 -1.066406 5.546875 -1.359375 C 5.847656 -1.660156 6 -2.050781 6 -2.53125 C 6 -2.988281 5.84375 -3.351562 5.53125 -3.625 C 5.226562 -3.90625 4.679688 -4.046875 3.890625 -4.046875 Z M 2.25 -4.046875 "/>
</g>
<g id="glyph-0-26">
<path d="M 5.203125 -1.984375 C 5.203125 -1.328125 4.96875 -0.832031 4.5 -0.5 C 4.039062 -0.164062 3.421875 0 2.640625 0 C 2.191406 0 1.804688 -0.0351562 1.484375 -0.109375 C 1.160156 -0.179688 0.875 -0.285156 0.625 -0.421875 L 0.625 -1.453125 C 0.882812 -1.316406 1.191406 -1.191406 1.546875 -1.078125 C 1.910156 -0.972656 2.28125 -0.921875 2.65625 -0.921875 C 3.195312 -0.921875 3.585938 -1.007812 3.828125 -1.1875 C 4.066406 -1.363281 4.1875 -1.601562 4.1875 -1.90625 C 4.1875 -2.070312 4.140625 -2.222656 4.046875 -2.359375 C 3.960938 -2.492188 3.804688 -2.628906 3.578125 -2.765625 C 3.347656 -2.898438 3.023438 -3.050781 2.609375 -3.21875 C 2.191406 -3.382812 1.832031 -3.550781 1.53125 -3.71875 C 1.238281 -3.882812 1.007812 -4.082031 0.84375 -4.3125 C 0.6875 -4.550781 0.609375 -4.851562 0.609375 -5.21875 C 0.609375 -5.789062 0.828125 -6.226562 1.265625 -6.53125 C 1.710938 -6.84375 2.300781 -7 3.03125 -7 C 3.414062 -7 3.773438 -6.957031 4.109375 -6.875 C 4.453125 -6.800781 4.773438 -6.691406 5.078125 -6.546875 L 4.71875 -5.625 C 4.445312 -5.75 4.160156 -5.851562 3.859375 -5.9375 C 3.566406 -6.03125 3.265625 -6.078125 2.953125 -6.078125 C 2.515625 -6.078125 2.179688 -6.003906 1.953125 -5.859375 C 1.734375 -5.710938 1.625 -5.515625 1.625 -5.265625 C 1.625 -5.078125 1.675781 -4.914062 1.78125 -4.78125 C 1.882812 -4.65625 2.054688 -4.53125 2.296875 -4.40625 C 2.535156 -4.289062 2.863281 -4.148438 3.28125 -3.984375 C 3.6875 -3.828125 4.03125 -3.660156 4.3125 -3.484375 C 4.601562 -3.316406 4.820312 -3.113281 4.96875 -2.875 C 5.125 -2.644531 5.203125 -2.347656 5.203125 -1.984375 Z M 5.203125 -1.984375 "/>
</g>
<g id="glyph-0-27">
<path d="M 4.078125 -7 C 4.867188 -7 5.503906 -6.707031 5.984375 -6.125 C 6.472656 -5.550781 6.71875 -4.679688 6.71875 -3.515625 C 6.71875 -2.359375 6.472656 -1.484375 5.984375 -0.890625 C 5.503906 -0.296875 4.863281 0 4.0625 0 C 3.570312 0 3.164062 -0.0976562 2.84375 -0.296875 C 2.519531 -0.492188 2.265625 -0.722656 2.078125 -0.984375 L 2 -0.984375 C 2.019531 -0.835938 2.035156 -0.648438 2.046875 -0.421875 C 2.066406 -0.203125 2.078125 -0.0078125 2.078125 0.15625 L 2.078125 3 L 1.015625 3 L 1.015625 -7 L 1.890625 -7 L 2.03125 -5.90625 L 2.078125 -5.90625 C 2.265625 -6.21875 2.515625 -6.476562 2.828125 -6.6875 C 3.140625 -6.894531 3.554688 -7 4.078125 -7 Z M 3.890625 -6.078125 C 3.234375 -6.078125 2.769531 -5.882812 2.5 -5.5 C 2.226562 -5.113281 2.085938 -4.523438 2.078125 -3.734375 L 2.078125 -3.515625 C 2.078125 -2.679688 2.207031 -2.039062 2.46875 -1.59375 C 2.726562 -1.144531 3.207031 -0.921875 3.90625 -0.921875 C 4.300781 -0.921875 4.625 -1.035156 4.875 -1.265625 C 5.125 -1.492188 5.3125 -1.800781 5.4375 -2.1875 C 5.5625 -2.582031 5.625 -3.03125 5.625 -3.53125 C 5.625 -4.300781 5.484375 -4.914062 5.203125 -5.375 C 4.921875 -5.84375 4.484375 -6.078125 3.890625 -6.078125 Z M 3.890625 -6.078125 "/>
</g>
<g id="glyph-0-28">
<path d="M 7.6875 -3.25 C 7.6875 -2.644531 7.5625 -2.09375 7.3125 -1.59375 C 7.070312 -1.101562 6.707031 -0.710938 6.21875 -0.421875 C 5.726562 -0.140625 5.101562 0 4.34375 0 C 3.28125 0 2.46875 -0.296875 1.90625 -0.890625 C 1.351562 -1.492188 1.078125 -2.289062 1.078125 -3.28125 L 1.078125 -9 L 2.15625 -9 L 2.15625 -3.203125 C 2.15625 -2.484375 2.34375 -1.921875 2.71875 -1.515625 C 3.09375 -1.117188 3.65625 -0.921875 4.40625 -0.921875 C 5.175781 -0.921875 5.734375 -1.132812 6.078125 -1.5625 C 6.429688 -1.988281 6.609375 -2.539062 6.609375 -3.21875 L 6.609375 -9 L 7.6875 -9 Z M 7.6875 -3.25 "/>
</g>
<g id="glyph-0-29">
<path d="M 2.25 0 L 1.15625 0 L 1.15625 -9 L 5.953125 -9 L 5.953125 -8.078125 L 2.25 -8.078125 L 2.25 -4.96875 L 5.71875 -4.96875 L 5.71875 -4.046875 L 2.25 -4.046875 Z M 2.25 0 "/>
</g>
<g id="glyph-0-30">
<path d="M 7.953125 0 L 6.703125 0 L 2.109375 -7.46875 L 2.0625 -7.46875 C 2.082031 -7.175781 2.101562 -6.8125 2.125 -6.375 C 2.144531 -5.9375 2.15625 -5.488281 2.15625 -5.03125 L 2.15625 0 L 1.15625 0 L 1.15625 -9 L 2.40625 -9 L 6.984375 -1.90625 L 7.03125 -1.90625 C 7.019531 -2.039062 7.007812 -2.234375 7 -2.484375 C 6.988281 -2.742188 6.976562 -3.023438 6.96875 -3.328125 C 6.957031 -3.628906 6.953125 -3.910156 6.953125 -4.171875 L 6.953125 -9 L 7.953125 -9 Z M 7.953125 0 "/>
</g>
<g id="glyph-0-31">
<path d="M 8.078125 -7 C 8.804688 -7 9.347656 -6.800781 9.703125 -6.40625 C 10.066406 -6.007812 10.25 -5.363281 10.25 -4.46875 L 10.25 0 L 9.203125 0 L 9.203125 -4.4375 C 9.203125 -5.53125 8.765625 -6.078125 7.890625 -6.078125 C 7.265625 -6.078125 6.816406 -5.882812 6.546875 -5.5 C 6.285156 -5.113281 6.15625 -4.550781 6.15625 -3.8125 L 6.15625 0 L 5.109375 0 L 5.109375 -4.4375 C 5.109375 -5.53125 4.671875 -6.078125 3.796875 -6.078125 C 3.140625 -6.078125 2.6875 -5.863281 2.4375 -5.4375 C 2.195312 -5.007812 2.078125 -4.390625 2.078125 -3.578125 L 2.078125 0 L 1.015625 0 L 1.015625 -7 L 1.875 -7 L 2.03125 -5.9375 L 2.09375 -5.9375 C 2.289062 -6.289062 2.554688 -6.554688 2.890625 -6.734375 C 3.234375 -6.910156 3.597656 -7 3.984375 -7 C 4.992188 -7 5.648438 -6.613281 5.953125 -5.84375 L 6.015625 -5.84375 C 6.234375 -6.238281 6.523438 -6.53125 6.890625 -6.71875 C 7.265625 -6.90625 7.660156 -7 8.078125 -7 Z M 8.078125 -7 "/>
</g>
<g id="glyph-0-32">
<path d="M 1.5625 -10 C 1.71875 -10 1.859375 -9.960938 1.984375 -9.890625 C 2.109375 -9.816406 2.171875 -9.695312 2.171875 -9.53125 C 2.171875 -9.382812 2.109375 -9.269531 1.984375 -9.1875 C 1.859375 -9.113281 1.71875 -9.078125 1.5625 -9.078125 C 1.382812 -9.078125 1.234375 -9.113281 1.109375 -9.1875 C 0.992188 -9.269531 0.9375 -9.382812 0.9375 -9.53125 C 0.9375 -9.695312 0.992188 -9.816406 1.109375 -9.890625 C 1.234375 -9.960938 1.382812 -10 1.5625 -10 Z M 2.078125 -7 L 2.078125 0 L 1.015625 0 L 1.015625 -7 Z M 2.078125 -7 "/>
</g>
<g id="glyph-0-33">
<path d="M 5.171875 0 L 0.46875 0 L 0.46875 -0.796875 L 3.921875 -6.078125 L 0.671875 -6.078125 L 0.671875 -7 L 5.09375 -7 L 5.09375 -6.109375 L 1.6875 -0.921875 L 5.171875 -0.921875 Z M 5.171875 0 "/>
</g>
<g id="glyph-0-34">
<path d="M 5.953125 0 L 1.15625 0 L 1.15625 -9 L 5.953125 -9 L 5.953125 -8.078125 L 2.25 -8.078125 L 2.25 -4.96875 L 5.734375 -4.96875 L 5.734375 -4.046875 L 2.25 -4.046875 L 2.25 -0.921875 L 5.953125 -0.921875 Z M 5.953125 0 "/>
</g>
<g id="glyph-0-35">
<path d="M 8.03125 -4.59375 C 8.03125 -3.070312 7.632812 -1.925781 6.84375 -1.15625 C 6.050781 -0.382812 4.953125 0 3.546875 0 L 1.15625 0 L 1.15625 -9 L 3.796875 -9 C 4.660156 -9 5.410156 -8.828125 6.046875 -8.484375 C 6.679688 -8.148438 7.171875 -7.65625 7.515625 -7 C 7.859375 -6.351562 8.03125 -5.550781 8.03125 -4.59375 Z M 6.890625 -4.546875 C 6.890625 -5.765625 6.609375 -6.65625 6.046875 -7.21875 C 5.484375 -7.789062 4.679688 -8.078125 3.640625 -8.078125 L 2.25 -8.078125 L 2.25 -0.921875 L 3.40625 -0.921875 C 5.726562 -0.921875 6.890625 -2.128906 6.890625 -4.546875 Z M 6.890625 -4.546875 "/>
</g>
</g>
</defs>
<path fill-rule="nonzero" fill="rgb(100%, 85.882353%, 60%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 265.085938 -810 C 265.085938 -800.058594 251.078125 -792 233.796875 -792 C 216.515625 -792 202.503906 -800.058594 202.503906 -810 C 202.503906 -819.941406 216.515625 -828 233.796875 -828 C 251.078125 -828 265.085938 -819.941406 265.085938 -810 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="220.296875" y="25.101562"/>
<use xlink:href="#glyph-0-1" x="227.046875" y="25.101562"/>
<use xlink:href="#glyph-0-2" x="233.046875" y="25.101562"/>
<use xlink:href="#glyph-0-3" x="240.546875" y="25.101562"/>
<use xlink:href="#glyph-0-1" x="248.046875" y="25.101562"/>
</g>
<path fill-rule="nonzero" fill="rgb(66.27451%, 80%, 66.27451%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 320.390625 -738 C 320.390625 -728.058594 281.621094 -720 233.796875 -720 C 185.96875 -720 147.199219 -728.058594 147.199219 -738 C 147.199219 -747.941406 185.96875 -756 233.796875 -756 C 281.621094 -756 320.390625 -747.941406 320.390625 -738 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-4" x="175.296875" y="97.101562"/>
<use xlink:href="#glyph-0-5" x="182.796875" y="97.101562"/>
<use xlink:href="#glyph-0-6" x="190.296875" y="97.101562"/>
<use xlink:href="#glyph-0-7" x="197.796875" y="97.101562"/>
<use xlink:href="#glyph-0-8" x="203.796875" y="97.101562"/>
<use xlink:href="#glyph-0-9" x="210.546875" y="97.101562"/>
<use xlink:href="#glyph-0-10" x="215.796875" y="97.101562"/>
<use xlink:href="#glyph-0-11" x="220.296875" y="97.101562"/>
<use xlink:href="#glyph-0-10" x="223.296875" y="97.101562"/>
<use xlink:href="#glyph-0-5" x="227.796875" y="97.101562"/>
<use xlink:href="#glyph-0-11" x="235.296875" y="97.101562"/>
<use xlink:href="#glyph-0-12" x="238.296875" y="97.101562"/>
<use xlink:href="#glyph-0-13" x="249.546875" y="97.101562"/>
<use xlink:href="#glyph-0-9" x="256.296875" y="97.101562"/>
<use xlink:href="#glyph-0-14" x="261.546875" y="97.101562"/>
<use xlink:href="#glyph-0-15" x="268.296875" y="97.101562"/>
<use xlink:href="#glyph-0-5" x="275.796875" y="97.101562"/>
<use xlink:href="#glyph-0-16" x="282.546875" y="97.101562"/>
<use xlink:href="#glyph-0-6" x="292.296875" y="97.101562"/>
</g>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 233.796875 -791.695312 C 233.796875 -783.984375 233.796875 -774.710938 233.796875 -766.113281 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 237.296875 -766.105469 L 233.796875 -756.105469 L 230.296875 -766.105469 Z M 237.296875 -766.105469 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(66.27451%, 80%, 66.27451%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 283.289062 -666 C 283.289062 -656.058594 261.128906 -648 233.796875 -648 C 206.460938 -648 184.300781 -656.058594 184.300781 -666 C 184.300781 -675.941406 206.460938 -684 233.796875 -684 C 261.128906 -684 283.289062 -675.941406 283.289062 -666 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-4" x="205.796875" y="169.101562"/>
<use xlink:href="#glyph-0-17" x="213.296875" y="169.101562"/>
<use xlink:href="#glyph-0-18" x="220.796875" y="169.101562"/>
<use xlink:href="#glyph-0-6" x="228.296875" y="169.101562"/>
<use xlink:href="#glyph-0-14" x="235.796875" y="169.101562"/>
<use xlink:href="#glyph-0-11" x="242.546875" y="169.101562"/>
<use xlink:href="#glyph-0-1" x="245.546875" y="169.101562"/>
<use xlink:href="#glyph-0-8" x="251.546875" y="169.101562"/>
<use xlink:href="#glyph-0-19" x="258.296875" y="169.101562"/>
<use xlink:href="#glyph-0-10" x="264.296875" y="169.101562"/>
</g>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 233.796875 -719.695312 C 233.796875 -711.984375 233.796875 -702.710938 233.796875 -694.113281 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 237.296875 -694.105469 L 233.796875 -684.105469 L 230.296875 -694.105469 Z M 237.296875 -694.105469 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(66.27451%, 80%, 66.27451%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 298.800781 -594 C 298.800781 -584.058594 269.695312 -576 233.796875 -576 C 197.894531 -576 168.789062 -584.058594 168.789062 -594 C 168.789062 -603.941406 197.894531 -612 233.796875 -612 C 269.695312 -612 298.800781 -603.941406 298.800781 -594 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="192.796875" y="241.101562"/>
<use xlink:href="#glyph-0-8" x="199.546875" y="241.101562"/>
<use xlink:href="#glyph-0-20" x="206.296875" y="241.101562"/>
<use xlink:href="#glyph-0-8" x="209.296875" y="241.101562"/>
<use xlink:href="#glyph-0-21" x="216.046875" y="241.101562"/>
<use xlink:href="#glyph-0-10" x="222.046875" y="241.101562"/>
<use xlink:href="#glyph-0-11" x="226.546875" y="241.101562"/>
<use xlink:href="#glyph-0-22" x="229.546875" y="241.101562"/>
<use xlink:href="#glyph-0-6" x="238.546875" y="241.101562"/>
<use xlink:href="#glyph-0-10" x="246.046875" y="241.101562"/>
<use xlink:href="#glyph-0-5" x="250.546875" y="241.101562"/>
<use xlink:href="#glyph-0-20" x="258.046875" y="241.101562"/>
<use xlink:href="#glyph-0-5" x="261.046875" y="241.101562"/>
<use xlink:href="#glyph-0-23" x="268.546875" y="241.101562"/>
<use xlink:href="#glyph-0-24" x="276.046875" y="241.101562"/>
</g>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 233.796875 -647.695312 C 233.796875 -639.984375 233.796875 -630.710938 233.796875 -622.113281 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 237.296875 -622.105469 L 233.796875 -612.105469 L 230.296875 -622.105469 Z M 237.296875 -622.105469 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(66.27451%, 80%, 66.27451%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 157.386719 -522 C 157.386719 -512.058594 122.199219 -504 78.796875 -504 C 35.390625 -504 0.203125 -512.058594 0.203125 -522 C 0.203125 -531.941406 35.390625 -540 78.796875 -540 C 122.199219 -540 157.386719 -531.941406 157.386719 -522 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-25" x="26.796875" y="313.101562"/>
<use xlink:href="#glyph-0-5" x="34.296875" y="313.101562"/>
<use xlink:href="#glyph-0-5" x="41.796875" y="313.101562"/>
<use xlink:href="#glyph-0-10" x="49.296875" y="313.101562"/>
<use xlink:href="#glyph-0-26" x="53.796875" y="313.101562"/>
<use xlink:href="#glyph-0-10" x="59.796875" y="313.101562"/>
<use xlink:href="#glyph-0-9" x="64.296875" y="313.101562"/>
<use xlink:href="#glyph-0-13" x="68.796875" y="313.101562"/>
<use xlink:href="#glyph-0-27" x="75.546875" y="313.101562"/>
<use xlink:href="#glyph-0-11" x="83.046875" y="313.101562"/>
<use xlink:href="#glyph-0-22" x="86.046875" y="313.101562"/>
<use xlink:href="#glyph-0-6" x="95.046875" y="313.101562"/>
<use xlink:href="#glyph-0-10" x="102.546875" y="313.101562"/>
<use xlink:href="#glyph-0-5" x="107.046875" y="313.101562"/>
<use xlink:href="#glyph-0-20" x="114.546875" y="313.101562"/>
<use xlink:href="#glyph-0-5" x="117.546875" y="313.101562"/>
<use xlink:href="#glyph-0-23" x="125.046875" y="313.101562"/>
<use xlink:href="#glyph-0-24" x="132.546875" y="313.101562"/>
</g>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-dasharray="6" stroke-miterlimit="10" d="M 201.300781 -578.324219 C 178.316406 -567.945312 147.25 -553.914062 122.152344 -542.582031 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 123.410156 -539.308594 L 112.855469 -538.382812 L 120.527344 -545.6875 Z M 123.410156 -539.308594 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(66.27451%, 80%, 66.27451%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 218.148438 -450 C 218.148438 -440.058594 186.652344 -432 147.796875 -432 C 108.941406 -432 77.441406 -440.058594 77.441406 -450 C 77.441406 -459.941406 108.941406 -468 147.796875 -468 C 186.652344 -468 218.148438 -459.941406 218.148438 -450 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-28" x="102.796875" y="385.101563"/>
<use xlink:href="#glyph-0-27" x="111.796875" y="385.101563"/>
<use xlink:href="#glyph-0-15" x="119.296875" y="385.101563"/>
<use xlink:href="#glyph-0-13" x="126.796875" y="385.101563"/>
<use xlink:href="#glyph-0-10" x="133.546875" y="385.101563"/>
<use xlink:href="#glyph-0-8" x="138.046875" y="385.101563"/>
<use xlink:href="#glyph-0-11" x="144.796875" y="385.101563"/>
<use xlink:href="#glyph-0-22" x="147.796875" y="385.101563"/>
<use xlink:href="#glyph-0-6" x="156.796875" y="385.101563"/>
<use xlink:href="#glyph-0-10" x="164.296875" y="385.101563"/>
<use xlink:href="#glyph-0-5" x="168.796875" y="385.101563"/>
<use xlink:href="#glyph-0-20" x="176.296875" y="385.101563"/>
<use xlink:href="#glyph-0-5" x="179.296875" y="385.101563"/>
<use xlink:href="#glyph-0-23" x="186.796875" y="385.101563"/>
<use xlink:href="#glyph-0-24" x="194.296875" y="385.101563"/>
</g>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-dasharray="6" stroke-miterlimit="10" d="M 224.519531 -576.082031 C 214.53125 -558.039062 198.015625 -528.714844 182.796875 -504 C 177.214844 -494.941406 170.871094 -485.183594 165.128906 -476.539062 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 167.890625 -474.371094 L 159.421875 -468.007812 L 162.074219 -478.265625 Z M 167.890625 -474.371094 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(66.27451%, 80%, 66.27451%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 347.101562 -234 C 347.101562 -224.058594 322.339844 -216 291.796875 -216 C 261.25 -216 236.488281 -224.058594 236.488281 -234 C 236.488281 -243.941406 261.25 -252 291.796875 -252 C 322.339844 -252 347.101562 -243.941406 347.101562 -234 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-3" x="258.796875" y="601.101562"/>
<use xlink:href="#glyph-0-8" x="266.296875" y="601.101562"/>
<use xlink:href="#glyph-0-6" x="273.046875" y="601.101562"/>
<use xlink:href="#glyph-0-15" x="280.546875" y="601.101562"/>
<use xlink:href="#glyph-0-8" x="288.046875" y="601.101562"/>
<use xlink:href="#glyph-0-9" x="294.796875" y="601.101562"/>
<use xlink:href="#glyph-0-11" x="300.046875" y="601.101562"/>
<use xlink:href="#glyph-0-29" x="303.046875" y="601.101562"/>
<use xlink:href="#glyph-0-13" x="309.046875" y="601.101562"/>
<use xlink:href="#glyph-0-21" x="315.796875" y="601.101562"/>
<use xlink:href="#glyph-0-10" x="321.796875" y="601.101562"/>
<use xlink:href="#glyph-0-26" x="326.296875" y="601.101562"/>
</g>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-dasharray="6" stroke-miterlimit="10" d="M 255.925781 -576.933594 C 285.925781 -553.109375 335.796875 -505.332031 335.796875 -451 C 335.796875 -451 335.796875 -451 335.796875 -377 C 335.796875 -334.980469 318 -288.976562 305.042969 -261.050781 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 308.167969 -259.472656 L 300.699219 -251.960938 L 301.855469 -262.492188 Z M 308.167969 -259.472656 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 95.5 -504.054688 C 104.058594 -495.371094 114.632812 -484.644531 124.027344 -475.113281 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 126.71875 -477.367188 L 131.246094 -467.789062 L 121.734375 -472.453125 Z M 126.71875 -477.367188 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(66.27451%, 80%, 66.27451%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 259.867188 -378 C 259.867188 -368.058594 209.691406 -360 147.796875 -360 C 85.898438 -360 35.722656 -368.058594 35.722656 -378 C 35.722656 -387.941406 85.898438 -396 147.796875 -396 C 209.691406 -396 259.867188 -387.941406 259.867188 -378 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-30" x="68.796875" y="457.101563"/>
<use xlink:href="#glyph-0-5" x="77.796875" y="457.101563"/>
<use xlink:href="#glyph-0-9" x="85.296875" y="457.101563"/>
<use xlink:href="#glyph-0-31" x="90.546875" y="457.101563"/>
<use xlink:href="#glyph-0-13" x="101.796875" y="457.101563"/>
<use xlink:href="#glyph-0-20" x="108.546875" y="457.101563"/>
<use xlink:href="#glyph-0-32" x="111.546875" y="457.101563"/>
<use xlink:href="#glyph-0-33" x="114.546875" y="457.101563"/>
<use xlink:href="#glyph-0-8" x="120.546875" y="457.101563"/>
<use xlink:href="#glyph-0-11" x="127.296875" y="457.101563"/>
<use xlink:href="#glyph-0-22" x="130.296875" y="457.101563"/>
<use xlink:href="#glyph-0-6" x="139.296875" y="457.101563"/>
<use xlink:href="#glyph-0-10" x="146.796875" y="457.101563"/>
<use xlink:href="#glyph-0-5" x="151.296875" y="457.101563"/>
<use xlink:href="#glyph-0-20" x="158.796875" y="457.101563"/>
<use xlink:href="#glyph-0-5" x="161.796875" y="457.101563"/>
<use xlink:href="#glyph-0-23" x="169.296875" y="457.101563"/>
<use xlink:href="#glyph-0-24" x="176.796875" y="457.101563"/>
<use xlink:href="#glyph-0-11" x="182.796875" y="457.101563"/>
<use xlink:href="#glyph-0-28" x="185.796875" y="457.101563"/>
<use xlink:href="#glyph-0-27" x="194.796875" y="457.101563"/>
<use xlink:href="#glyph-0-15" x="202.296875" y="457.101563"/>
<use xlink:href="#glyph-0-13" x="209.796875" y="457.101563"/>
<use xlink:href="#glyph-0-10" x="216.546875" y="457.101563"/>
<use xlink:href="#glyph-0-8" x="221.046875" y="457.101563"/>
<use xlink:href="#glyph-0-26" x="227.796875" y="457.101563"/>
</g>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 147.796875 -431.695312 C 147.796875 -423.984375 147.796875 -414.710938 147.796875 -406.113281 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 151.296875 -406.105469 L 147.796875 -396.105469 L 144.296875 -406.105469 Z M 151.296875 -406.105469 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(66.27451%, 80%, 66.27451%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 343.675781 -162 C 343.675781 -152.058594 320 -144 290.796875 -144 C 261.589844 -144 237.914062 -152.058594 237.914062 -162 C 237.914062 -171.941406 261.589844 -180 290.796875 -180 C 320 -180 343.675781 -171.941406 343.675781 -162 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-12" x="259.796875" y="673.101562"/>
<use xlink:href="#glyph-0-8" x="271.046875" y="673.101562"/>
<use xlink:href="#glyph-0-9" x="277.796875" y="673.101562"/>
<use xlink:href="#glyph-0-23" x="282.296875" y="673.101562"/>
<use xlink:href="#glyph-0-8" x="289.796875" y="673.101562"/>
<use xlink:href="#glyph-0-11" x="296.546875" y="673.101562"/>
<use xlink:href="#glyph-0-29" x="299.546875" y="673.101562"/>
<use xlink:href="#glyph-0-13" x="305.546875" y="673.101562"/>
<use xlink:href="#glyph-0-21" x="312.296875" y="673.101562"/>
<use xlink:href="#glyph-0-10" x="318.296875" y="673.101562"/>
<use xlink:href="#glyph-0-26" x="322.796875" y="673.101562"/>
</g>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 291.546875 -215.695312 C 291.4375 -207.984375 291.304688 -198.710938 291.183594 -190.113281 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 294.683594 -190.054688 L 291.039062 -180.105469 L 287.683594 -190.152344 Z M 294.683594 -190.054688 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(66.27451%, 80%, 66.27451%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 247.160156 -306 C 247.160156 -296.058594 208.492188 -288 160.796875 -288 C 113.097656 -288 74.429688 -296.058594 74.429688 -306 C 74.429688 -315.941406 113.097656 -324 160.796875 -324 C 208.492188 -324 247.160156 -315.941406 247.160156 -306 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-4" x="102.796875" y="529.101562"/>
<use xlink:href="#glyph-0-5" x="110.296875" y="529.101562"/>
<use xlink:href="#glyph-0-6" x="117.796875" y="529.101562"/>
<use xlink:href="#glyph-0-26" x="125.296875" y="529.101562"/>
<use xlink:href="#glyph-0-5" x="131.296875" y="529.101562"/>
<use xlink:href="#glyph-0-20" x="138.796875" y="529.101562"/>
<use xlink:href="#glyph-0-32" x="141.796875" y="529.101562"/>
<use xlink:href="#glyph-0-15" x="144.796875" y="529.101562"/>
<use xlink:href="#glyph-0-13" x="152.296875" y="529.101562"/>
<use xlink:href="#glyph-0-10" x="159.046875" y="529.101562"/>
<use xlink:href="#glyph-0-8" x="163.546875" y="529.101562"/>
<use xlink:href="#glyph-0-11" x="170.296875" y="529.101562"/>
<use xlink:href="#glyph-0-22" x="173.296875" y="529.101562"/>
<use xlink:href="#glyph-0-6" x="182.296875" y="529.101562"/>
<use xlink:href="#glyph-0-10" x="189.796875" y="529.101562"/>
<use xlink:href="#glyph-0-5" x="194.296875" y="529.101562"/>
<use xlink:href="#glyph-0-20" x="201.796875" y="529.101562"/>
<use xlink:href="#glyph-0-5" x="204.796875" y="529.101562"/>
<use xlink:href="#glyph-0-23" x="212.296875" y="529.101562"/>
<use xlink:href="#glyph-0-24" x="219.796875" y="529.101562"/>
</g>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 151.007812 -359.695312 C 152.441406 -351.984375 154.164062 -342.710938 155.761719 -334.113281 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 159.234375 -334.574219 L 157.617188 -324.105469 L 152.351562 -333.296875 Z M 159.234375 -334.574219 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-dasharray="6" stroke-miterlimit="10" d="M 190.847656 -288.941406 C 209.976562 -278.71875 234.875 -265.414062 255.160156 -254.578125 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 256.945312 -257.589844 L 264.117188 -249.789062 L 253.648438 -251.417969 Z M 256.945312 -257.589844 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(66.27451%, 80%, 66.27451%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 264.089844 -90 C 264.089844 -80.058594 246.496094 -72 224.796875 -72 C 203.09375 -72 185.5 -80.058594 185.5 -90 C 185.5 -99.941406 203.09375 -108 224.796875 -108 C 246.496094 -108 264.089844 -99.941406 264.089844 -90 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="204.796875" y="745.101562"/>
<use xlink:href="#glyph-0-8" x="211.546875" y="745.101562"/>
<use xlink:href="#glyph-0-9" x="218.296875" y="745.101562"/>
<use xlink:href="#glyph-0-32" x="223.546875" y="745.101562"/>
<use xlink:href="#glyph-0-13" x="226.546875" y="745.101562"/>
<use xlink:href="#glyph-0-20" x="233.296875" y="745.101562"/>
<use xlink:href="#glyph-0-32" x="236.296875" y="745.101562"/>
<use xlink:href="#glyph-0-33" x="239.296875" y="745.101562"/>
<use xlink:href="#glyph-0-8" x="245.296875" y="745.101562"/>
</g>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-dasharray="6" stroke-miterlimit="10" d="M 165.925781 -287.847656 C 177.046875 -250.660156 203.449219 -162.375 216.789062 -117.773438 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 220.21875 -118.519531 L 219.730469 -107.933594 L 213.511719 -116.511719 Z M 220.21875 -118.519531 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(100%, 85.882353%, 60%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 251.796875 -18 C 251.796875 -8.058594 239.707031 0 224.796875 0 C 209.882812 0 197.796875 -8.058594 197.796875 -18 C 197.796875 -27.941406 209.882812 -36 224.796875 -36 C 239.707031 -36 251.796875 -27.941406 251.796875 -18 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-34" x="216.296875" y="817.101562"/>
<use xlink:href="#glyph-0-30" x="223.046875" y="817.101562"/>
<use xlink:href="#glyph-0-35" x="232.046875" y="817.101562"/>
</g>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 224.796875 -71.695312 C 224.796875 -63.984375 224.796875 -54.710938 224.796875 -46.113281 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 228.296875 -46.105469 L 224.796875 -36.105469 L 221.296875 -46.105469 Z M 228.296875 -46.105469 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 275.488281 -144.765625 C 266.992188 -135.753906 256.273438 -124.386719 246.882812 -114.425781 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 249.425781 -112.023438 L 240.019531 -107.148438 L 244.332031 -116.824219 Z M 249.425781 -112.023438 " transform="matrix(1, 0, 0, 1, 4, 832)"/>
</svg>

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96">
<defs>
<style>
@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@700');
.icon-stroke { stroke: #BE5103; stroke-width: 4; fill: none; }
.text { font: bold 44px 'Open Sans', sans-serif; fill: #293241; }
</style>
</defs>
<g transform="translate(0 0)">
<circle cx="65" cy="32" r="15" fill="none" stroke-width="4" stroke="#8b1f6b" />
<circle cx="22" cy="44" r="8" fill="none" stroke-width="4" stroke="#8b1f6b" />
<circle cx="63" cy="73" r="8" fill="none" stroke-width="4" stroke="#8b1f6b" />
<line x1="30" y1="39" x2="49" y2="33" stroke-width="3" stroke="#8b1f6b" stroke-linecap="round" />
<line x1="31" y1="45" x2="51" y2="39" stroke-width="3" stroke="#8b1f6b" stroke-linecap="round" />
<line x1="64" y1="48" x2="63" y2="64" stroke-width="4" stroke="#8b1f6b" stroke-linecap="round" />
</g>
<!-- <text x="85" y="60" class="text">GraphCast</text>-->
</svg>

After

Width:  |  Height:  |  Size: 991 B

View File

@@ -0,0 +1,81 @@
# Contributing to Suthing
We welcome contributions to Suthing! This document provides guidelines and instructions for contributing to the project.
## Getting Started
1. Fork the repository on GitHub
2. Clone your fork locally
3. Install the development dependencies:
```bash
uv sync --all-groups --extra doc-processing
```
4. Install pre-commit hooks:
```bash
pre-commit install
```
## Development Workflow
1. Create a new branch for your feature or bugfix:
```bash
git checkout -b feature/your-feature-name
```
2. Make your changes and ensure tests pass:
```bash
pytest test
```
3. Commit your changes with a descriptive message:
```bash
git commit -m "Add feature: your feature description"
```
4. Push your branch to your fork:
```bash
git push origin feature/your-feature-name
```
5. Create a Pull Request on GitHub
## Code Style
- Follow [PEP 8](https://www.python.org/dev/peps/pep-0008/) style guidelines
- Use type hints for all function parameters and return values
- Write docstrings following the Google style
- Keep functions focused and small
- Add tests for new features
## Documentation
- Update relevant documentation when adding new features
- Add docstrings to all new functions and classes
- Include examples in docstrings where appropriate
- Update the changelog for significant changes
## Testing
- Write tests for all new features
- Ensure all tests pass before submitting a PR
- Add tests for bug fixes
- Maintain or improve test coverage
## Pull Request Process
1. Ensure your PR description clearly describes the problem and solution
2. Include relevant tests
3. Update documentation as needed
4. Ensure all CI checks pass
5. Request review from maintainers
## Reporting Issues
When reporting issues, please include:
- Python version
- Suthing version
- Steps to reproduce
- Expected behavior
- Actual behavior
- Any relevant error messages

View File

@@ -0,0 +1,26 @@
from pathlib import Path
import mkdocs_gen_files
nav = mkdocs_gen_files.Nav()
pname = "ontocast"
for path in sorted(Path(pname).rglob("*.py")):
module_path = path.relative_to(pname).with_suffix("")
doc_path = path.relative_to(pname).with_suffix(".md")
full_doc_path = Path("reference", doc_path)
parts = list(module_path.parts)
if parts[-1] == "__init__":
parts = parts[:-1]
if not parts:
continue
parts_str: tuple[str, ...] = tuple(parts)
nav[parts_str] = str(full_doc_path)
with mkdocs_gen_files.open(full_doc_path, "w") as f:
ident = ".".join([pname] + parts)
f.write(f"# `{ident}`\n\n::: {ident}\n")
mkdocs_gen_files.set_edit_path(full_doc_path, path)

View File

@@ -0,0 +1,28 @@
# Installation
This guide will help you install OntoCast and its dependencies.
## System Requirements
- Python 3.12 or higher
- uv (Python package installer)
## Installation Steps
```bash
uv add ontocast
```
or
```bash
pip install ontocast
```
## Next Steps
After installation, you can:
1. Read the [Quick Start](quickstart.md) guide
3. Check the [API Reference](../reference/onto.md) for detailed documentation

View File

@@ -0,0 +1,169 @@
# Quick Start
This guide will help you get started with OntoCast quickly. We'll walk through a simple example of processing a document and viewing the results.
## Prerequisites
- OntoCast installed (see [Installation](installation.md))
- A sample document to process (e.g., a pdf or a markdown file)
## Basic Example
### Query the Server
```bash
curl -X POST http://url:port/process -F "file=@sample.pdf"
curl -X POST http://url:port/process -F "file=@sample.json"
```
`url` would be `localhost` for a locally running server, default port is 8999
### Running a Server
To start an OntoCast server:
```bash
# Backend automatically detected from .env configuration
ontocast --env-path .env
# Process specific file
ontocast --env-path .env --input-path ./document.pdf
# Process with chunk limit (for testing)
ontocast --env-path .env --head-chunks 5
```
- Backend selection is **fully automatic** based on available configuration
- No explicit backend flags needed - just provide the required credentials/paths in .env
- All paths and directories are configured via .env file
### Configuration
OntoCast uses a hierarchical configuration system with environment variables. Create a `.env` file in your project directory:
```bash
# Domain configuration (used for URI generation)
CURRENT_DOMAIN=https://example.com
PORT=8999
LLM_TEMPERATURE=0.0
# LLM Configuration
LLM_PROVIDER=openai
LLM_API_KEY=your-api-key-here
LLM_MODEL_NAME=gpt-4o-mini
# Server Configuration
MAX_VISITS=3
BASE_RECURSION_LIMIT=1000
ESTIMATED_CHUNKS=30
RENDER_MODE=ontology_and_facts
ONTOLOGY_MAX_TRIPLES=50000
PARALLEL_WORKERS=4
PARALLEL_FACTS_RETRIES=3
PARALLEL_ONTOLOGY_RETRIES=3
ENABLE_ONTOLOGY_CONSOLIDATION=false
# Backend Configuration (auto-detected)
FUSEKI_URI=http://localhost:3032/test
FUSEKI_AUTH=admin:password
ONTOCAST_WORKING_DIRECTORY=/path/to/working
# Path Configuration (required for filesystem backends)
ONTOCAST_WORKING_DIRECTORY=/path/to/working/directory
ONTOCAST_ONTOLOGY_DIRECTORY=/path/to/ontology/files
ONTOCAST_CACHE_DIR=/path/to/cache/directory
# Triple Store Configuration (optional)
# For Neo4j
NEO4J_URI=bolt://localhost:7687
NEO4J_AUTH=username:password
# For Fuseki
FUSEKI_URI=http://localhost:3030
FUSEKI_AUTH=username:password
FUSEKI_DATASET=dataset_name
FUSEKI_ONTOLOGIES_DATASET=ontologies
# Optional aggregation controls
AGG_EMBEDDING_MODEL=paraphrase-multilingual-MiniLM-L12-v2
AGG_SIMILARITY_THRESHOLD=0.80
# Optional web-search grounding
WEB_SEARCH_ENABLED=false
WEB_SEARCH_PROVIDER=duckduckgo
WEB_SEARCH_TOP_K=3
```
#### Alternative: Ollama Configuration
```bash
# For Ollama
LLM_PROVIDER=ollama
LLM_BASE_URL=http://localhost:11434
LLM_MODEL_NAME=granite3.3
```
### CLI Parameters
You can use these CLI parameters:
```bash
# Use custom .env file
ontocast --env-path /path/to/custom.env
# Process specific input file
ontocast --env-path .env --input-path /path/to/document.pdf
# Process only first 5 chunks (for testing)
ontocast --env-path .env --head-chunks 5
```
**Note:** All paths and directories are configured via the `.env` file - no CLI overrides needed.
### Receive Results
After processing, the ontology and the facts graph are returned in turtle format
```json
{
"data": {
"facts": "# facts in turtle format",
"ontology": "# ontology in turtle format"
}
...
}
```
## Configuration System
OntoCast uses a hierarchical configuration system:
- **ToolConfig**: Configuration for tools (LLM, triple stores, paths)
- **ServerConfig**: Configuration for server behavior
- **Environment Variables**: Override defaults via `.env` file or environment
### Key Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `LLM_API_KEY` | API key for LLM provider | Required |
| `LLM_PROVIDER` | LLM provider (openai, ollama) | openai |
| `LLM_MODEL_NAME` | Model name | gpt-4o-mini |
| `FUSEKI_URI` + `FUSEKI_AUTH` | Use Fuseki as main triple store | Auto-detected |
| `NEO4J_URI` + `NEO4J_AUTH` | Use Neo4j as main triple store | Auto-detected |
| `ONTOCAST_WORKING_DIRECTORY` + `ONTOCAST_ONTOLOGY_DIRECTORY` | Use filesystem as main triple store | Auto-detected |
| `ONTOCAST_ONTOLOGY_DIRECTORY` | Ontology files directory | Provide seed ontologies |
| `MAX_VISITS` | Maximum visits per node | 3 |
| `BASE_RECURSION_LIMIT` | Base recursion limit for workflow | 1000 |
| `ONTOLOGY_MAX_TRIPLES` | Maximum triples allowed in ontology graph | 50000 |
| `ENABLE_ONTOLOGY_CONSOLIDATION` | Run ontology consolidation pass | false |
## Next Steps
Now that you've processed your first document, you can:
1. Try processing different types of documents (PDF, Word)
2. Configure triple stores (Neo4j, Fuseki) for persistent storage
3. Check the [API Reference](../reference/onto.md) for more details
4. Explore the [User Guide](../user_guide/concepts.md) for advanced usage

View File

@@ -0,0 +1,279 @@
# OntoCast <img src="https://raw.githubusercontent.com/growgraph/ontocast/refs/heads/main/docs/assets/favicon.ico" alt="Agentic Ontology Triplecast logo" style="height: 32px; width:32px;"/>
### Agentic ontology-assisted framework for semantic triple extraction
![Python](https://img.shields.io/badge/python-3.12-blue.svg)
[![PyPI version](https://badge.fury.io/py/ontocast.svg)](https://badge.fury.io/py/ontocast)
[![PyPI Downloads](https://static.pepy.tech/badge/ontocast)](https://pepy.tech/projects/ontocast)
[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
[![pre-commit](https://github.com/growgraph/ontocast/actions/workflows/pre-commit.yml/badge.svg)](https://github.com/growgraph/ontocast/actions/workflows/pre-commit.yml)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.17796467.svg)](https://doi.org/10.5281/zenodo.17796467)
---
## Overview
OntoCast is a framework for extracting semantic triples (creating a Knowledge Graph) from documents using an agentic, ontology-driven approach. It combines ontology management, natural language processing, and knowledge graph serialization to turn unstructured text into structured, queryable data.
---
## Key Features
- **Ontology-Guided Extraction**: Ensures semantic consistency and co-evolves ontologies
- **Entity Disambiguation**: Resolves references across document chunks
- **Multi-Format Support**: Handles text, JSON, PDF, and Markdown
- **Semantic Chunking**: Splits text based on semantic similarity
- **MCP Compatibility**: Implements Model Control Protocol endpoints
- **RDF Output**: Produces standardized RDF/Turtle
- **Triple Store Integration**: Supports Neo4j (n10s) and Apache Fuseki
- **Automatic LLM Caching**: Built-in response caching for improved performance and cost reduction
- **GraphUpdate Operations**: Token-efficient SPARQL-based updates instead of full graph regeneration
- **Budget Tracking**: Comprehensive tracking of LLM usage and triple generation metrics
- **Ontology Versioning**: Automatic semantic versioning with hash-based lineage tracking
---
## Applications
OntoCast can be used for:
- **Knowledge Graph Construction**: Build domain-specific or general-purpose knowledge graphs from documents
- **Semantic Search**: Power search and retrieval with structured triples
- **GraphRAG**: Enable retrieval-augmented generation over knowledge graphs (e.g., with LLMs)
- **Ontology Management**: Automate ontology creation, validation, and refinement
- **Data Integration**: Unify data from diverse sources into a semantic graph
---
## Installation
```sh
uv add ontocast
# or
pip install ontocast
```
---
## Configuration
## Documentation
- [Quick Start Guide](getting_started/quickstart.md) - Get started quickly
- [Configuration System](user_guide/configuration.md) - Detailed configuration guide
- [LLM Caching](user_guide/llm_caching.md) - Automatic response caching
- [Triple Store Setup](user_guide/triple_stores.md) - Triple store configuration
- [User Guide](user_guide/concepts.md) - Core concepts and workflow
- [API Reference](reference/onto.md) - Detailed API documentation
### Environment Variables
Copy the example file and edit as needed:
```bash
cp .env.example .env
# Edit with your values
```
**Main options:**
```bash
# LLM Configuration
# common
LLM_PROVIDER=openai # or ollama
LLM_MODEL_NAME=gpt-4o-mini # ollama model
LLM_TEMPERATURE=0.0
# openai
LLM_API_KEY=your_openai_api_key_here
# ollama
LLM_BASE_URL=
# Server
PORT=8999
BASE_RECURSION_LIMIT=1000
ESTIMATED_CHUNKS=30
MAX_VISITS=3
RENDER_MODE=ontology_and_facts
ONTOLOGY_MAX_TRIPLES=50000
PARALLEL_WORKERS=4
PARALLEL_FACTS_RETRIES=3
PARALLEL_ONTOLOGY_RETRIES=3
ENABLE_ONTOLOGY_CONSOLIDATION=false
# Backend Configuration (auto-detected)
FUSEKI_URI=http://localhost:3032/test
FUSEKI_AUTH=admin:password
ONTOCAST_WORKING_DIRECTORY=/path/to/working
# Optional: Triple Store Configuration (Fuseki preferred over Neo4j)
FUSEKI_URI=http://localhost:3032/test
FUSEKI_AUTH=admin/abc123-qwe
FUSEKI_DATASET=dataset_name
FUSEKI_ONTOLOGIES_DATASET=ontologies
NEO4J_URI=bolt://localhost:7689
NEO4J_AUTH=neo4j/test!passfortesting
# Aggregation controls
AGG_EMBEDDING_MODEL=paraphrase-multilingual-MiniLM-L12-v2
AGG_SIMILARITY_THRESHOLD=0.80
# Optional web grounding
WEB_SEARCH_ENABLED=false
WEB_SEARCH_PROVIDER=duckduckgo
```
---
## Triple Store Setup
OntoCast supports multiple triple store backends. When both Fuseki and Neo4j are configured, **Fuseki is preferred**.
- See [Triple Store Setup](user_guide/triple_stores.md) for detailed Docker Compose instructions and sample `.env.example` files.
- Quick summary: copy and edit the provided `.env.example` in `docker/fuseki` or `docker/neo4j`, then run `docker compose --env-file .env <service> up -d` in the respective directory.
---
## Running OntoCast Server
```bash
# Backend automatically detected from .env configuration
ontocast --env-path .env
# Process specific file
ontocast --env-path .env --input-path ./document.pdf
# Process with chunk limit (for testing)
ontocast --env-path .env --head-chunks 5
```
- Backend selection is **fully automatic** based on available configuration
- No explicit backend flags needed - just provide the required credentials/paths in .env
- All paths and directories are configured via .env file
---
## API Usage
- **POST /process**: Accepts `application/json` or file uploads (`multipart/form-data`).
- Returns: JSON with extracted facts (Turtle), ontology (Turtle), and processing metadata. Triples are also serialized to the configured triple store.
**Example:**
```bash
curl -X POST http://localhost:8999/process \
-H "Content-Type: application/json" \
-d '{"text": "Your document text here"}'
# Process a PDF file
curl -X POST http://url:port/process -F "file=@data/pdf/sample.pdf"
# Process a json file
curl -X POST http://url:port/process -F "file=@test2/sample.json"
```
---
## MCP Endpoints
- `GET /health`: Health check
- `GET /info`: Service info
- `POST /process`: Document processing
- `POST /flush`: Flush/clean triple store data (optional `dataset` query parameter for Fuseki)
---
## Filesystem Mode
If no triple store is configured, OntoCast stores ontologies and facts as Turtle files in the working directory.
---
## Notes
- JSON documents must contain a `text` field, e.g.:
```json
{ "text": "abc" }
```
- `recursion_limit` is calculated as `max_visits * estimated_chunks` (default 30, or set via `.env`)
- Default port: 8999
---
## Docker
To build the OntoCast Docker image:
```sh
docker buildx build -t growgraph/ontocast:0.1.4 . 2>&1 | tee build.log
```
---
## Project Structure
```
ontocast/
├── agent/ # Agent workflow and orchestration
├── cli/ # CLI utilities and server
├── prompt/ # LLM prompt templates
├── stategraph/ # State graph logic
├── tool/ # Triple store, chunking, and ontology tools
├── toolbox.py # Toolbox for agent tools
├── onto.py # Ontology and RDF graph handling
├── util.py # Utilities
```
Other directories:
- `docker/` Docker Compose and .env.example files for triple stores
- `data/` Example data, ontologies, and test files
- `docs/` Documentation and user guides
- `test/` Test suite
---
## Workflow
The extraction follows a multi-stage workflow:
<img src="https://github.com/growgraph/ontocast/blob/main/docs/assets/graph.png?raw=true" alt="Workflow diagram" width="350" style="float: right; margin-left: 20px;"/>
1. **Document Preparation**
- [Optional] Convert to Markdown
- Text chunking
2. **Ontology Processing**
- Ontology selection
- Text to ontology triples
- Ontology critique
3. **Fact Extraction**
- Text to facts
- Facts critique
- Ontology sublimation
4. **Chunk Normalization**
- Chunk KG aggregation
- Entity/Property Disambiguation
5. **Storage**
- Triple/KG serialization
---
## Roadmap
- [x] Add Jena Fuseki triple store for triple serialization
- [x] Add Neo4j n10s for triple serialization
- [ ] Replace triple prompting with a tool for local graph retrieval
---
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
---
## Acknowledgments
- Uses RDFlib for semantic triple management
- Uses docling for pdf/pptx conversion
- Uses OpenAI language models / open models served via Ollama for fact extraction
- Uses langchain/langgraph

View File

@@ -0,0 +1,3 @@
# `ontocast.agent`
::: ontocast.agent

View File

@@ -0,0 +1,3 @@
# `ontocast.agent.chunk_text`
::: ontocast.agent.chunk_text

View File

@@ -0,0 +1,3 @@
# `ontocast.agent.common`
::: ontocast.agent.common

View File

@@ -0,0 +1,3 @@
# `ontocast.agent.convert_document`
::: ontocast.agent.convert_document

View File

@@ -0,0 +1,3 @@
# `ontocast.agent.criticise_facts`
::: ontocast.agent.criticise_facts

View File

@@ -0,0 +1,3 @@
# `ontocast.agent.criticise_ontology`
::: ontocast.agent.criticise_ontology

View File

@@ -0,0 +1,3 @@
# `ontocast.agent.external_evidence`
::: ontocast.agent.external_evidence

View File

@@ -0,0 +1,3 @@
# `ontocast.agent.normalize_ontology`
::: ontocast.agent.normalize_ontology

View File

@@ -0,0 +1,3 @@
# `ontocast.agent.render_facts`
::: ontocast.agent.render_facts

View File

@@ -0,0 +1,3 @@
# `ontocast.agent.render_ontology`
::: ontocast.agent.render_ontology

View File

@@ -0,0 +1,3 @@
# `ontocast.agent.select_ontology`
::: ontocast.agent.select_ontology

View File

@@ -0,0 +1,3 @@
# `ontocast.agent.serialize`
::: ontocast.agent.serialize

View File

@@ -0,0 +1,3 @@
# `ontocast.agent.sublimate_ontology`
::: ontocast.agent.sublimate_ontology

View File

@@ -0,0 +1,3 @@
# `ontocast.cli`
::: ontocast.cli

View File

@@ -0,0 +1,3 @@
# `ontocast.cli.batch_process`
::: ontocast.cli.batch_process

View File

@@ -0,0 +1,3 @@
# `ontocast.cli.cmp_states`
::: ontocast.cli.cmp_states

View File

@@ -0,0 +1,3 @@
# `ontocast.cli.merge_ontologies`
::: ontocast.cli.merge_ontologies

View File

@@ -0,0 +1,3 @@
# `ontocast.cli.pdfs_to_markdown`
::: ontocast.cli.pdfs_to_markdown

View File

@@ -0,0 +1,3 @@
# `ontocast.cli.plot_graph`
::: ontocast.cli.plot_graph

View File

@@ -0,0 +1,3 @@
# `ontocast.cli.serve`
::: ontocast.cli.serve

View File

@@ -0,0 +1,3 @@
# `ontocast.cli.split_chunks`
::: ontocast.cli.split_chunks

View File

@@ -0,0 +1,3 @@
# `ontocast.cli.test_api`
::: ontocast.cli.test_api

View File

@@ -0,0 +1,3 @@
# `ontocast.cli.util`
::: ontocast.cli.util

View File

@@ -0,0 +1,3 @@
# `ontocast.config`
::: ontocast.config

View File

@@ -0,0 +1,3 @@
# `ontocast.onto`
::: ontocast.onto

View File

@@ -0,0 +1,3 @@
# `ontocast.onto`
::: ontocast.onto

View File

@@ -0,0 +1,3 @@
# `ontocast.onto.constants`
::: ontocast.onto.constants

View File

@@ -0,0 +1,3 @@
# `ontocast.onto.content_unit`
::: ontocast.onto.content_unit

View File

@@ -0,0 +1,3 @@
# `ontocast.onto.context`
::: ontocast.onto.context

View File

@@ -0,0 +1,3 @@
# `ontocast.onto.enum`
::: ontocast.onto.enum

View File

@@ -0,0 +1,3 @@
# `ontocast.onto.model`
::: ontocast.onto.model

View File

@@ -0,0 +1,3 @@
# `ontocast.onto.null`
::: ontocast.onto.null

View File

@@ -0,0 +1,3 @@
# `ontocast.onto.ontology`
::: ontocast.onto.ontology

View File

@@ -0,0 +1,3 @@
# `ontocast.onto.ontology_operations`
::: ontocast.onto.ontology_operations

View File

@@ -0,0 +1,3 @@
# `ontocast.onto.rdfgraph`
::: ontocast.onto.rdfgraph

View File

@@ -0,0 +1,3 @@
# `ontocast.onto.sparql_models`
::: ontocast.onto.sparql_models

View File

@@ -0,0 +1,3 @@
# `ontocast.onto.state`
::: ontocast.onto.state

View File

@@ -0,0 +1,3 @@
# `ontocast.onto.unit_states`
::: ontocast.onto.unit_states

View File

@@ -0,0 +1,3 @@
# `ontocast.onto.util`
::: ontocast.onto.util

View File

@@ -0,0 +1,3 @@
# `ontocast.prompt`
::: ontocast.prompt

View File

@@ -0,0 +1,3 @@
# `ontocast.prompt.common`
::: ontocast.prompt.common

View File

@@ -0,0 +1,3 @@
# `ontocast.prompt.criticise_facts`
::: ontocast.prompt.criticise_facts

View File

@@ -0,0 +1,3 @@
# `ontocast.prompt.criticise_ontology`
::: ontocast.prompt.criticise_ontology

View File

@@ -0,0 +1,3 @@
# `ontocast.prompt.render_facts`
::: ontocast.prompt.render_facts

View File

@@ -0,0 +1,3 @@
# `ontocast.prompt.render_ontology`
::: ontocast.prompt.render_ontology

View File

@@ -0,0 +1,3 @@
# `ontocast.prompt.select_ontology`
::: ontocast.prompt.select_ontology

View File

@@ -0,0 +1,3 @@
# `ontocast.stategraph`
::: ontocast.stategraph

View File

@@ -0,0 +1,3 @@
# `ontocast.stategraph.atomic`
::: ontocast.stategraph.atomic

View File

@@ -0,0 +1,3 @@
# `ontocast.stategraph.create`
::: ontocast.stategraph.create

View File

@@ -0,0 +1,3 @@
# `ontocast.stategraph.helpers`
::: ontocast.stategraph.helpers

View File

@@ -0,0 +1,3 @@
# `ontocast.stategraph.node_factories`
::: ontocast.stategraph.node_factories

View File

@@ -0,0 +1,3 @@
# `ontocast.stategraph.routing`
::: ontocast.stategraph.routing

View File

@@ -0,0 +1,3 @@
# `ontocast.stategraph.util`
::: ontocast.stategraph.util

View File

@@ -0,0 +1,3 @@
# `ontocast.tool`
::: ontocast.tool

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.agg`
::: ontocast.tool.agg

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.agg.aggregate`
::: ontocast.tool.agg.aggregate

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.agg.clustering`
::: ontocast.tool.agg.clustering

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.agg.normalizer`
::: ontocast.tool.agg.normalizer

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.agg.promoter`
::: ontocast.tool.agg.promoter

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.agg.rewriter`
::: ontocast.tool.agg.rewriter

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.agg.uri_builder`
::: ontocast.tool.agg.uri_builder

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.aggregate`
::: ontocast.tool.aggregate

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.atomic`
::: ontocast.tool.atomic

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.cache`
::: ontocast.tool.cache

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.chunk`
::: ontocast.tool.chunk

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.chunk.chunker`
::: ontocast.tool.chunk.chunker

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.chunk.util`
::: ontocast.tool.chunk.util

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.converter`
::: ontocast.tool.converter

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.graph_diff`
::: ontocast.tool.graph_diff

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.graph_version_manager`
::: ontocast.tool.graph_version_manager

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.llm`
::: ontocast.tool.llm

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.onto`
::: ontocast.tool.onto

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.ontology_manager`
::: ontocast.tool.ontology_manager

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.sparql`
::: ontocast.tool.sparql

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.structured_sparql`
::: ontocast.tool.structured_sparql

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.triple_manager`
::: ontocast.tool.triple_manager

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.triple_manager.core`
::: ontocast.tool.triple_manager.core

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.triple_manager.filesystem_manager`
::: ontocast.tool.triple_manager.filesystem_manager

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.triple_manager.fuseki`
::: ontocast.tool.triple_manager.fuseki

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.triple_manager.mock`
::: ontocast.tool.triple_manager.mock

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.triple_manager.neo4j`
::: ontocast.tool.triple_manager.neo4j

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.validate`
::: ontocast.tool.validate

View File

@@ -0,0 +1,3 @@
# `ontocast.tool.web_search`
::: ontocast.tool.web_search

View File

@@ -0,0 +1,3 @@
# `ontocast.toolbox`
::: ontocast.toolbox

View File

@@ -0,0 +1,3 @@
# `ontocast.util`
::: ontocast.util

View File

@@ -0,0 +1,61 @@
# Concepts
Here we introduce the main concepts of OntoCast, a framework for transforming data into semantic triples.
## Ontology Management
OntoCast manages ontologies with automatic versioning and timestamp tracking:
- **Semantic Versioning**: Automatic version increments (MAJOR/MINOR/PATCH) based on change analysis
- **Hash-Based Lineage**: Git-style versioning with parent hashes for tracking ontology evolution
- **Multiple Versions**: Versions stored as separate named graphs in Fuseki triple stores
- **Timestamp Tracking**: `updated_at` field tracks when ontology was last modified
- **Smart Analysis**: Analyzes ontology changes (classes, properties, instances) to determine appropriate version bump:
- **MAJOR**: Substantial breaking changes (deletions of classes/properties)
- **MINOR**: New features (new classes/properties) or any deletions
- **PATCH**: Updates to existing structures (instances, descriptions, small changes)
- **Property Syncing**: Version and timestamp are synced to the RDF graph as `owl:versionInfo` and `dcterms:modified`
- **Versioned IRIs**: Each version gets a unique IRI with hash fragment for storage organization
## GraphUpdate System
OntoCast uses a token-efficient GraphUpdate system for incremental graph modifications:
- **Structured Operations**: LLM outputs `GraphUpdate` objects containing `TripleOp` operations (insert/delete) instead of full TTL graphs
- **Token Efficiency**: Only changes are generated, dramatically reducing LLM token usage compared to full graph regeneration
- **SPARQL Generation**: Operations are automatically converted to executable SPARQL queries
- **Incremental Updates**: Graph updates are applied incrementally, allowing for precise modifications
- **Operation Types**: Supports both `insert` and `delete` operations with explicit prefix declarations
- **Custom Queries**: Also supports `GenericSparqlQuery` for complex custom SPARQL operations
### How GraphUpdate Saves Tokens
Instead of generating the entire graph in Turtle format (which can be thousands of tokens), the LLM now outputs only the changes:
- **Before**: Full TTL graph with all triples (e.g., 5000 tokens)
- **After**: Structured operations with only changes (e.g., 200 tokens)
- **Savings**: Typically 80-95% reduction in output tokens
## Budget Tracking
OntoCast provides comprehensive budget tracking for LLM usage and triple generation:
- **LLM Statistics**: Tracks API calls, characters sent/received for cost monitoring
- **Triple Metrics**: Tracks ontology and facts triples generated per operation
- **Operation Counts**: Tracks number of update operations for both ontology and facts
- **Summary Reports**: Budget summaries logged at end of processing with format:
```
LLM: X calls, Y sent, Z received | Triples: A ontology, B facts
```
- **Integrated Tracking**: Budget tracker integrated into AgentState for clean dependency injection
- **Automatic Updates**: Budget tracker automatically updated when LLM calls are made or triples are generated
## Key Components
- **Ontology**: RDF graph with properties (id, title, description, version, timestamp, hash, parent_hashes)
- **AgentState**: Central state management with budget tracking and GraphUpdate operations
- **ToolBox**: Collection of tools for processing and caching
- **Triple Stores**: Support for filesystem, Fuseki, and Neo4j storage
- **GraphUpdate**: Structured representation of graph modifications as SPARQL operations
- **BudgetTracker**: Lightweight tracker for LLM usage and triple generation statistics

View File

@@ -0,0 +1,149 @@
# Configuration System
OntoCast configuration is powered by Pydantic `BaseSettings` and is loaded from environment variables (typically via `.env`).
## Overview
- Typed config sections with defaults
- Environment variable parsing (including lists and booleans)
- Validation for provider/model compatibility
- Unified `Config` object shared across tools and server
## Configuration Shape
```python
Config
tool_config: ToolConfig
llm_config: LLMConfig
chunk_config: ChunkConfig
path_config: PathConfig
neo4j: Neo4jConfig
fuseki: FusekiConfig
domain: DomainConfig
web_search: WebSearchConfig
aggregation: AggregationConfig
server: ServerConfig
```
## Environment Variables
### LLM
```bash
LLM_PROVIDER=openai # openai | ollama
LLM_MODEL_NAME=gpt-4o-mini
LLM_TEMPERATURE=0.0
LLM_API_KEY=your_openai_api_key_here # required for openai provider
LLM_BASE_URL=http://localhost:11434 # optional (mainly for ollama)
```
### Server
```bash
PORT=8999
BASE_RECURSION_LIMIT=1000
ESTIMATED_CHUNKS=30
MAX_VISITS=3 # alias for max_visits_per_node
RENDER_MODE=ontology_and_facts # ontology | facts | ontology_and_facts
ONTOLOGY_MAX_TRIPLES=50000 # empty/unset for unlimited
PARALLEL_WORKERS=4
PARALLEL_FACTS_RETRIES=3
PARALLEL_ONTOLOGY_RETRIES=3
ENABLE_ONTOLOGY_CONSOLIDATION=false
```
### Chunking
```bash
CHUNK_BREAKPOINT_THRESHOLD_TYPE=percentile # percentile | standard_deviation | interquartile | gradient
CHUNK_BREAKPOINT_THRESHOLD_AMOUNT=95.0
CHUNK_MIN_SIZE=3000
CHUNK_MAX_SIZE=12000
```
### Triple Stores
```bash
# Fuseki
FUSEKI_URI=http://localhost:3030/test
FUSEKI_AUTH=admin/admin
FUSEKI_DATASET=dataset_name
FUSEKI_ONTOLOGIES_DATASET=ontologies
# Neo4j
NEO4J_URI=bolt://localhost:7687
NEO4J_AUTH=neo4j/test
NEO4J_PORT=7476
NEO4J_BOLT_PORT=7689
```
### Paths and Domain
```bash
CURRENT_DOMAIN=https://example.com
ONTOCAST_WORKING_DIRECTORY=/path/to/working/directory
ONTOCAST_ONTOLOGY_DIRECTORY=/path/to/ontology/files
ONTOCAST_CACHE_DIR=/path/to/cache/directory
```
### Aggregation
```bash
AGG_EMBEDDING_MODEL=paraphrase-multilingual-MiniLM-L12-v2
AGG_SIMILARITY_THRESHOLD=0.80
```
### Web Search
```bash
WEB_SEARCH_ENABLED=false
WEB_SEARCH_PROVIDER=duckduckgo
WEB_SEARCH_TOP_K=3
WEB_SEARCH_TIMEOUT_SECONDS=8.0
WEB_SEARCH_MAX_SNIPPET_CHARS=400
WEB_SEARCH_MAX_TOTAL_CHARS=1800
WEB_SEARCH_ONTOLOGY_RENDER_ENABLED=true
WEB_SEARCH_ONTOLOGY_CRITIC_ENABLED=true
WEB_SEARCH_FACTS_RENDER_ENABLED=false
WEB_SEARCH_FACTS_CRITIC_ENABLED=false
WEB_SEARCH_PLANNER_ENABLED=true
WEB_SEARCH_PLANNER_MAX_QUERIES=3
WEB_SEARCH_PLANNER_MIN_QUERY_CHARS=12
WEB_SEARCH_PLANNER_MIN_CONFIDENCE=0.35
WEB_SEARCH_REUSE_EVIDENCE_ACROSS_ATTEMPT=true
WEB_SEARCH_MIN_SNIPPET_CHARS=40
WEB_SEARCH_ALLOWED_DOMAINS= # comma-separated
WEB_SEARCH_BLOCKED_DOMAINS= # comma-separated
WEB_SEARCH_REGION=wt-wt
WEB_SEARCH_SAFESEARCH=moderate
```
Search is "search-later": nodes run without search first, and only request external evidence when needed.
## Usage
```python
from ontocast.config import Config
config = Config()
tool_config = config.get_tool_config()
print(config.server.port)
print(config.server.max_visits_per_node)
print(tool_config.llm_config.provider)
print(tool_config.path_config.cache_dir)
```
## Validation Notes
- `LLM_PROVIDER=openai` requires `LLM_API_KEY`.
- `LLM_MODEL_NAME` must match the selected provider family.
- `MAX_VISITS` is supported as an alias for `max_visits_per_node`.
- `WEB_SEARCH_ALLOWED_DOMAINS` and `WEB_SEARCH_BLOCKED_DOMAINS` accept comma-separated values.
## Recommended Workflow
1. Copy `.env.example` to `.env`.
2. Fill in LLM credentials and backend settings.
3. Start with defaults for chunking/search/aggregation.
4. Tune only after inspecting extraction quality and runtime.

Some files were not shown because too many files have changed in this diff Show More