1
0

Added presentation

This commit is contained in:
Matthias Veigel 2025-07-22 15:20:41 +02:00
parent 13c76fe59b
commit 5ebdf19915
Signed by: root
GPG Key ID: 2437494E09F13876
6 changed files with 893 additions and 3 deletions

View File

@ -8,10 +8,11 @@ jobs:
container:
archlinux:latest
steps:
- run: pacman -Sy --noconfirm nodejs git typst fontconfig ttf-linux-libertine ttf-inconsolata
- run: pacman -Sy --noconfirm nodejs git typst fontconfig ttf-linux-libertine ttf-inconsolata ttf-fira-code ttf-fira-sans
- uses: actions/checkout@v3
- run: typst c main.typ
- run: typst c presentation.typ
- uses: actions/upload-artifact@v3
with:
name: main.pdf
path: main.pdf
name: pdfs
path: *.pdf

View File

@ -6,6 +6,7 @@
"Regionalized",
"RVSDG",
"subexpression",
"Veigel",
"Verilog",
"VHDL",
"Xplore"

282
fancyuulm.typ Normal file
View File

@ -0,0 +1,282 @@
// This theme is adapted from https://github.com/touying-typ/touying/blob/main/themes/simple.typ by OrangeX4
#import "@preview/touying:0.6.1": *
/// Default slide function for the presentation.
///
/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For more several configurations, you can use `utils.merge-dicts` to merge them.
///
/// - repeat (int, auto): The number of subslides. Default is `auto`, which means touying will automatically calculate the number of subslides.
///
//// The `repeat` argument is necessary when you use `#slide(repeat: 3, self => [ .. ])` style code to create a slide. The callback-style `uncover` and `only` cannot be detected by touying automatically.
///
/// - setting (function): The setting of the slide. You can use it to add some set/show rules for the slide.
///
/// - composer (function): The composer of the slide. You can use it to set the layout of the slide.
///
/// For example, `#slide(composer: (1fr, 2fr, 1fr))[A][B][C]` to split the slide into three parts. The first and the last parts will take 1/4 of the slide, and the second part will take 1/2 of the slide.
///
/// If you pass a non-function value like `(1fr, 2fr, 1fr)`, it will be assumed to be the first argument of the `components.side-by-side` function.
///
/// The `components.side-by-side` function is a simple wrapper of the `grid` function. It means you can use the `grid.cell(colspan: 2, ..)` to make the cell take 2 columns.
///
/// For example, `#slide(composer: 2)[A][B][#grid.cell(colspan: 2)[Footer]]` will make the `Footer` cell take 2 columns.
///
/// If you want to customize the composer, you can pass a function to the `composer` argument. The function should receive the contents of the slide and return the content of the slide, like `#slide(composer: grid.with(columns: 2))[A][B]`.
///
/// - bodies (array): The contents of the slide. You can call the `slide` function with syntax like `#slide[A][B][C]` to create a slide.
#let slide(
config: (:),
repeat: auto,
setting: body => body,
composer: auto,
..bodies,
) = touying-slide-wrapper(self => {
let header(self) = utils.call-or-display(self, self.store.header)
let footer(self) = {
text(size: 0.5em, fill: self.colors.neutral-lightest, grid(
align: (left + horizon, center + horizon, right + horizon),
fill: self.colors.secondary,
columns: (1fr, 4.5fr, 1fr),
// gutter: 0em,
// stroke: (x: self.colors.secondary + 0.5em),
rows: 100%,
box(inset: (left: self.page.margin.x / 2), utils.call-or-display(self, self.store.footer-left)),
utils.call-or-display(self, self.store.footer),
box(fill: self.colors.primary, height: 100%, inset: (x: self.page.margin.x / 2), align(center, utils.call-or-display(self, self.store.footer-right))),
)
)
}
let self = utils.merge-dicts(
self,
config-page(
header: header,
footer: footer,
),
config-common(subslide-preamble: self.store.subslide-preamble),
)
touying-slide(self: self, config: config, repeat: repeat, setting: setting, composer: composer, ..bodies)
})
/// Centered slide for the presentation.
///
/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For several configurations, you can use `utils.merge-dicts` to merge them.
#let centered-slide(config: (:), ..args) = touying-slide-wrapper(self => {
touying-slide(self: self, ..args.named(), config: config, align(center + horizon, args.pos().sum(default: none)))
})
/// Title slide for the presentation.
///
/// Example: `#title-slide(title-image: "assets/title-image.png")`
///
/// - content (content | none): The content of the title slide, typically an image. The content will be displayed centered above the title and subtitle.
///
/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For several configurations, you can use `utils.merge-dicts` to merge them.
#let title-slide(content, config: (:), ..args) = touying-slide-wrapper(self => {
let body = {
set block(spacing: 0em)
// show text: it => align(right + horizon, it)
set text(fill: self.colors.neutral-lightest)
block(
inset: (x: self.page.margin.x * 2/3, y: 0.5cm),
width: 100%,
height: 1fr,
content
)
block(
fill: self.colors.primary,
width: 100%,
height: 2.2cm,
inset: (x: self.page.margin.x * 2/3),
align(right + horizon, text(size: 1.4em, weight: "bold", self.info.title))
)
let secondary-info = (self.info.subtitle, self.info.author, self.info.date.display("[month repr:long] [day], [year]")).filter(it => it != none).join(" | ")
block(
fill: self.colors.secondary,
width: 100%,
height: 1.1cm,
inset: (x: self.page.margin.x * 2/3),
align(right + horizon, text(size: 0.9em, secondary-info))
)
block(
width: 100%,
height: 2.2cm,
inset: (x: self.page.margin.x * 2/3, y: 0.35cm),
box(image(self.info.institute-logo, height: 1fr)) + h(1fr) + box(image(self.info.university-logo, height: 1fr))
)
}
let self = utils.merge-dicts(
self,
config-common(freeze-slide-counter: true),
config-page(margin: 0em)
)
touying-slide(self: self, ..args.named(), config: config, body)
})
/// New section slide for the presentation. You can update it by updating the `new-section-slide-fn` argument for `config-common` function.
///
/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For more several configurations, you can use `utils.merge-dicts` to merge them.
#let new-section-slide(config: (:), body) = centered-slide(config: config, [
#text(1.2em, weight: "bold", utils.display-current-heading(level: 1))
#body
])
/// Focus on some content.
///
/// Example: `#focus-slide[Wake up!]`
///
/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For more several configurations, you can use `utils.merge-dicts` to merge them.
///
/// - background (color, auto): The background color of the slide. Default is `auto`, which means the primary color of the slides.
///
/// - foreground (color): The foreground color of the slide. Default is `white`.
#let focus-slide(config: (:), background: auto, foreground: white, body) = touying-slide-wrapper(self => {
self = utils.merge-dicts(
self,
config-common(freeze-slide-counter: true),
config-page(fill: if background == auto {
self.colors.primary
} else {
background
}),
)
set text(fill: foreground, size: 1.5em)
touying-slide(self: self, config: config, align(center + horizon, body))
})
/// Fancy Ulm University theme (Institute of Software Engineering and Programming Languages).
///
/// Example:
///
/// ```typst
/// #show: fancyuulm.with(aspect-ratio: "16-9", config-colors(primary: blue))`
/// ```
///
/// The default colors:
///
/// ```typst
/// config-colors(
/// neutral-light: gray,
/// neutral-lightest: rgb("#ffffff"),
/// neutral-darkest: rgb("#000000"),
/// primary: rgb("#A32638"),
/// secondary: rgb("#A9A28D"),
/// )
/// ```
///
/// - aspect-ratio (string): The aspect ratio of the slides. Default is `16-9`.
///
/// - header (function): The header of the slides. Default is `self => utils.display-current-heading(setting: utils.fit-to-width.with(grow: false, 100%), depth: self.slide-level)`.
///
/// - footer-left (function): The left part of the footer. Default is `self => self.info.author`.
///
/// - footer (function): The footer of the slides. Default is `self => self.info.title`.
///
/// - footer-right (content): The right part of the footer. Default is `context utils.slide-counter.display()`.
///
/// - primary (color): The primary color of the slides. Default is `rgb("#A32638")`.
///
/// - secondary (color): The secondary color of the slides. Default is `rgb("#A9A28D")`.
///
/// - subslide-preamble (content): The preamble of the subslides. Default is `block(below: 1.5em, text(1.2em, weight: "bold", utils.display-current-heading(level: 2)))`.
///
/// - include-new-section-slides (bool): Whether to include slides for introducing new sections. Default is `false`.
#let fancyuulm(
aspect-ratio: "16-9",
header: self => [],//utils.display-current-heading(
// setting: utils.fit-to-width.with(grow: false, 100%),
// level: 1,
// depth: self.slide-level,
// ),
footer-left: self => self.info.author,
footer: self => [#self.info.title -- #self.info.subtitle -- #utils.display-current-heading(level: 1)],
footer-right: context utils.slide-counter.display(),
primary: rgb("#A32638"),
secondary: rgb("#A9A28D"),
subslide-preamble: block(
below: 1.3cm,
text(1.5em, weight: "bold", utils.display-current-heading(level: 2)),
),
include-new-section-slides: false,
..args,
body,
) = {
show: touying-slides.with(
config-page(
paper: "presentation-" + aspect-ratio,
margin: (x: 2cm, top: 1.5cm, bottom: 2cm),
footer-descent: 1.2cm,
),
config-common(
slide-fn: slide,
new-section-slide-fn: if include-new-section-slides { new-section-slide },
zero-margin-header: false,
zero-margin-footer: true,
),
config-methods(
init: (self: none, body) => {
set text(size: 18pt, number-width: "tabular", font: "Fira Sans")
show raw: set text(font: "Fira Code")
show math.equation: set text(font: "Noto Sans Math")
set par(spacing: 1cm)
set footnote.entry(indent: 0cm, clearance: 0.3cm)
show footnote.entry: set text(size: 8pt)
show footnote.entry: set cite(form: "full")
show footnote.entry: box.with(width: 62.5%)
// set list(spacing: 1cm)
// show list: it => {
// show list: set list(spacing: 0.75cm)
// it
// }
// show raw.where(block: false): box
// show raw.where(block: false): set box(
// fill: self.colors.neutral-lighter,
// inset: (x: 5pt, y: 0pt),
// outset: (y: 5pt),
// radius: 3pt,
// )
// set table(inset: 9pt, stroke: (0.5pt + self.colors.neutral-light))
// show table: table => {
// show raw.where(block: false): set box(
// fill: none,
// inset: (x: 1pt),
// outset: 0pt
// )
// table
// }
body
},
alert: utils.alert-with-primary-color,
),
config-colors(
neutral-light: luma(200),
neutral-lighter: luma(250),
neutral-lightest: rgb("#ffffff"),
neutral-darkest: rgb("#000000"),
primary: primary,
secondary: secondary,
),
// Save the variables for later use
config-store(
header: header,
footer-left: footer-left,
footer: footer,
footer-right: footer-right,
subslide-preamble: subslide-preamble,
),
..args,
)
body
}

227
logos/sp.svg Normal file
View File

@ -0,0 +1,227 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg1"
width="1186.7734"
height="190"
viewBox="0 0 1186.7734 190"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<g
id="g1">
<path
id="path1"
d="M 33.75,127.5 C 15.242,127.5 0,112.258 0,93.75 0,75.242 15.242,60 33.75,60 h 7.5 C 47.598,60 52.5,55.098 52.5,48.75 52.5,42.402 47.598,37.5 41.25,37.5 H 0 V 15 H 41.25 C 59.758,15 75,30.242 75,48.75 75,67.258 59.758,82.5 41.25,82.5 h -7.5 c -6.348,0 -11.25,4.902 -11.25,11.25 0,6.348 4.902,11.25 11.25,11.25 H 75 v 22.5 z"
style="fill:#850000;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path2"
d="M 82.5,127.5 V 105 h 41.25 C 130.098,105 135,100.098 135,93.75 135,87.402 130.098,82.5 123.75,82.5 H 82.5 V 15 H 105 v 45 h 18.75 c 18.508,0 33.75,15.242 33.75,33.75 0,18.508 -15.242,33.75 -33.75,33.75 z"
style="fill:#850000;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path3"
d="m 187.5,142.5 h 3 V 0 h -3 z"
style="fill:#aaaaaa;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path4"
d="m 238.02,103.066 c -4.825,1.387 -8.34,3.086 -10.547,5.098 -2.188,2.031 -3.282,4.531 -3.282,7.5 0,3.359 1.336,6.133 4.016,8.32 2.691,2.207 6.188,3.309 10.484,3.309 2.934,0 5.539,-0.566 7.825,-1.699 2.304,-1.133 4.082,-2.696 5.332,-4.688 1.269,-1.992 1.906,-4.168 1.906,-6.531 h -5.656 c 0,2.578 -0.821,4.598 -2.461,6.063 -1.641,1.484 -3.957,2.226 -6.946,2.226 -2.769,0 -4.937,-0.613 -6.5,-1.844 -1.543,-1.211 -2.316,-2.902 -2.316,-5.07 0,-1.738 0.734,-3.211 2.199,-4.422 1.485,-1.191 3.992,-2.285 7.528,-3.281 3.554,-0.996 6.328,-2.102 8.32,-3.313 2.012,-1.191 3.496,-2.586 4.453,-4.187 0.977,-1.602 1.465,-3.488 1.465,-5.656 0,-3.457 -1.348,-6.231 -4.043,-8.321 -2.695,-2.07 -6.301,-3.105 -10.809,-3.105 -2.933,0 -5.668,0.558 -8.203,1.672 -2.543,1.133 -4.504,2.675 -5.89,4.629 -1.368,1.953 -2.051,4.168 -2.051,6.648 h 5.652 c 0,-2.578 0.949,-4.617 2.844,-6.121 1.914,-1.484 4.465,-2.227 7.648,-2.227 2.969,0 5.242,0.606 6.824,1.817 1.583,1.211 2.372,2.859 2.372,4.949 0,2.09 -0.731,3.703 -2.196,4.836 -1.465,1.152 -4.121,2.285 -7.968,3.398 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path5"
d="m 258.793,100.195 c 0,3.106 0.605,5.899 1.812,8.379 1.231,2.481 2.934,4.395 5.102,5.742 2.188,1.348 4.676,2.02 7.469,2.02 4.316,0 7.804,-1.492 10.461,-4.481 2.675,-2.988 4.011,-6.964 4.011,-11.925 v -0.379 c 0,-3.086 -0.593,-5.86 -1.785,-8.321 -1.172,-2.441 -2.863,-4.347 -5.07,-5.714 -2.188,-1.368 -4.707,-2.051 -7.559,-2.051 -4.296,0 -7.781,1.496 -10.457,4.484 -2.656,2.989 -3.984,6.942 -3.984,11.863 z m 5.445,-0.644 c 0,-3.516 0.813,-6.34 2.434,-8.469 1.64,-2.129 3.828,-3.191 6.562,-3.191 2.754,0 4.942,1.074 6.563,3.222 1.621,2.168 2.433,5.196 2.433,9.082 0,3.477 -0.832,6.289 -2.492,8.438 -1.64,2.168 -3.828,3.25 -6.562,3.25 -2.676,0 -4.836,-1.063 -6.477,-3.192 -1.64,-2.129 -2.461,-5.175 -2.461,-9.14 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path6"
d="m 297.113,84.051 v 27.511 h -5.011 v 4.188 h 5.011 v 3.254 c 0,3.398 0.907,6.023 2.723,7.879 1.816,1.855 4.383,2.785 7.707,2.785 1.25,0 2.488,-0.168 3.719,-0.5 l -0.293,-4.395 c -0.918,0.176 -1.895,0.266 -2.93,0.266 -1.758,0 -3.117,-0.519 -4.074,-1.555 -0.957,-1.015 -1.434,-2.48 -1.434,-4.394 v -3.34 h 6.77 v -4.188 h -6.77 V 84.051 Z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path7"
d="m 322.66,123.426 v -7.676 h 5.914 v -4.188 h -5.914 v -19.66 c 0,-1.269 0.262,-2.226 0.789,-2.871 0.528,-0.625 1.426,-0.937 2.696,-0.937 0.625,0 1.484,0.117 2.578,0.351 v -4.394 c -1.426,-0.391 -2.813,-0.586 -4.161,-0.586 -2.421,0 -4.25,0.734 -5.48,2.199 -1.23,1.465 -1.844,3.543 -1.844,6.238 v 19.66 h -5.773 v 4.188 h 5.773 v 7.676 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path8"
d="m 362.941,91.523 6.094,24.227 h 5.422 l -9.23,-31.699 h -4.395 l -7.703,24.023 -7.5,-24.023 h -4.399 l -9.195,31.699 h 5.391 l 6.238,-23.73 7.383,23.73 h 4.363 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path9"
d="m 399.562,84.051 c -0.312,0.625 -0.566,1.738 -0.761,3.34 -2.52,-2.618 -5.528,-3.926 -9.024,-3.926 -3.125,0 -5.695,0.879 -7.703,2.637 -1.996,1.777 -2.992,4.023 -2.992,6.738 0,3.301 1.25,5.859 3.75,7.676 2.52,1.836 6.055,2.754 10.609,2.754 h 5.274 v 2.492 c 0,1.894 -0.567,3.398 -1.703,4.511 -1.129,1.133 -2.801,1.7 -5.008,1.7 -1.934,0 -3.555,-0.489 -4.863,-1.465 -1.309,-0.977 -1.965,-2.16 -1.965,-3.547 h -5.446 c 0,1.582 0.555,3.105 1.668,4.57 1.133,1.485 2.657,2.657 4.571,3.516 1.933,0.859 4.054,1.289 6.355,1.289 3.653,0 6.516,-0.918 8.586,-2.754 2.07,-1.816 3.145,-4.324 3.223,-7.527 v -14.59 c 0,-2.91 0.371,-5.227 1.113,-6.945 v -0.469 z m -8.996,4.133 c 1.7,0 3.313,0.437 4.836,1.316 1.524,0.879 2.629,2.023 3.313,3.43 v 6.504 h -4.25 c -6.641,0 -9.961,-1.946 -9.961,-5.832 0,-1.7 0.566,-3.028 1.699,-3.985 1.133,-0.957 2.586,-1.433 4.363,-1.433 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path10"
d="m 428.012,110.887 c -0.824,0.136 -1.711,0.207 -2.668,0.207 -3.555,0 -5.969,-1.516 -7.239,-4.543 v -22.5 h -5.417 v 31.699 h 5.273 l 0.09,-3.66 c 1.773,2.832 4.293,4.246 7.554,4.246 1.059,0 1.86,-0.137 2.407,-0.41 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path11"
d="m 445.527,83.465 c -4.297,0 -7.793,1.406 -10.484,4.219 -2.699,2.832 -4.047,6.613 -4.047,11.339 v 0.997 c 0,3.144 0.598,5.945 1.789,8.406 1.211,2.48 2.891,4.414 5.039,5.801 2.168,1.406 4.512,2.109 7.031,2.109 4.122,0 7.325,-1.356 9.61,-4.07 2.285,-2.715 3.43,-6.602 3.43,-11.661 v -2.257 h -21.477 c 0.078,-3.125 0.984,-5.653 2.727,-7.586 1.753,-1.914 3.98,-2.871 6.679,-2.871 1.91,0 3.531,0.39 4.86,1.171 1.328,0.782 2.492,1.817 3.488,3.106 l 3.308,-2.578 c -2.656,-4.082 -6.64,-6.125 -11.953,-6.125 z m -0.672,28.418 c -2.187,0 -4.023,-0.801 -5.507,-2.403 -1.485,-1.582 -2.403,-3.808 -2.754,-6.679 h 15.879 v 0.41 c -0.157,2.754 -0.899,4.883 -2.227,6.387 -1.328,1.523 -3.125,2.285 -5.391,2.285 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path12"
d="M 503.977,103.77 H 485.488 V 88.652 h 21.477 v -4.601 h -27.102 v 42.656 h 26.809 v -4.629 h -21.184 v -13.711 h 18.489 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path13"
d="m 518.246,115.75 0.172,-3.984 c 2.422,3.046 5.586,4.57 9.492,4.57 6.699,0 10.082,-3.777 10.141,-11.336 V 84.051 h -5.422 v 20.976 c -0.02,2.285 -0.547,3.977 -1.582,5.071 -1.016,1.093 -2.609,1.64 -4.777,1.64 -1.754,0 -3.297,-0.468 -4.625,-1.406 -1.329,-0.937 -2.364,-2.168 -3.11,-3.691 v -22.59 h -5.418 v 31.699 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path14"
d="m 544.992,100.164 c 0,4.941 1.141,8.867 3.426,11.777 2.285,2.93 5.312,4.395 9.086,4.395 3.863,0 6.883,-1.367 9.051,-4.102 l 0.261,3.516 h 4.954 V 84.812 c 0,-4.101 -1.223,-7.332 -3.665,-9.695 -2.421,-2.363 -5.683,-3.547 -9.781,-3.547 -2.289,0 -4.523,0.489 -6.711,1.465 -2.187,0.977 -3.859,2.317 -5.008,4.016 l 2.813,3.25 c 2.32,-2.871 5.164,-4.305 8.523,-4.305 2.637,0 4.688,0.742 6.153,2.227 1.484,1.484 2.226,3.574 2.226,6.269 v 2.723 c -2.168,-2.5 -5.129,-3.75 -8.879,-3.75 -3.707,0 -6.714,1.496 -9.023,4.484 -2.285,2.989 -3.426,7.059 -3.426,12.215 z m 5.449,-0.613 c 0,-3.574 0.731,-6.387 2.196,-8.438 1.465,-2.031 3.519,-3.047 6.156,-3.047 3.414,0 5.926,1.551 7.527,4.657 v 14.472 c -1.66,3.028 -4.148,4.543 -7.472,4.543 -2.637,0 -4.696,-1.027 -6.18,-3.078 -1.484,-2.051 -2.227,-5.086 -2.227,-9.109 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path15"
d="m 585.801,84.051 h -5.418 v 31.699 h 5.418 z m -5.86,40.109 c 0,0.879 0.266,1.621 0.793,2.227 0.547,0.605 1.348,0.906 2.403,0.906 1.054,0 1.855,-0.301 2.402,-0.906 0.547,-0.606 0.82,-1.348 0.82,-2.227 0,-0.879 -0.273,-1.613 -0.82,-2.199 -0.547,-0.586 -1.348,-0.879 -2.402,-0.879 -1.055,0 -1.856,0.293 -2.403,0.879 -0.527,0.586 -0.793,1.32 -0.793,2.199 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path16"
d="m 599.574,115.75 0.172,-3.984 c 2.422,3.046 5.586,4.57 9.492,4.57 6.7,0 10.082,-3.777 10.141,-11.336 V 84.051 h -5.422 v 20.976 c -0.019,2.285 -0.547,3.977 -1.582,5.071 -1.016,1.093 -2.609,1.64 -4.777,1.64 -1.754,0 -3.297,-0.468 -4.625,-1.406 -1.328,-0.937 -2.364,-2.168 -3.11,-3.691 v -22.59 h -5.418 v 31.699 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path17"
d="m 640.762,83.465 c -4.297,0 -7.793,1.406 -10.485,4.219 -2.699,2.832 -4.047,6.613 -4.047,11.339 v 0.997 c 0,3.144 0.598,5.945 1.79,8.406 1.21,2.48 2.89,4.414 5.039,5.801 2.168,1.406 4.511,2.109 7.031,2.109 4.121,0 7.324,-1.356 9.609,-4.07 2.285,-2.715 3.43,-6.602 3.43,-11.661 v -2.257 h -21.477 c 0.078,-3.125 0.985,-5.653 2.727,-7.586 1.754,-1.914 3.98,-2.871 6.68,-2.871 1.91,0 3.531,0.39 4.859,1.171 1.328,0.782 2.492,1.817 3.488,3.106 l 3.309,-2.578 c -2.656,-4.082 -6.641,-6.125 -11.953,-6.125 z m -0.672,28.418 c -2.188,0 -4.024,-0.801 -5.508,-2.403 -1.484,-1.582 -2.402,-3.808 -2.754,-6.679 h 15.879 v 0.41 c -0.156,2.754 -0.898,4.883 -2.227,6.387 -1.328,1.523 -3.125,2.285 -5.39,2.285 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path18"
d="m 672.52,83.465 c -4.297,0 -7.793,1.406 -10.485,4.219 -2.699,2.832 -4.047,6.613 -4.047,11.339 v 0.997 c 0,3.144 0.598,5.945 1.789,8.406 1.211,2.48 2.891,4.414 5.039,5.801 2.168,1.406 4.512,2.109 7.032,2.109 4.121,0 7.324,-1.356 9.609,-4.07 2.285,-2.715 3.43,-6.602 3.43,-11.661 V 98.348 H 663.41 c 0.078,-3.125 0.985,-5.653 2.727,-7.586 1.754,-1.914 3.98,-2.871 6.679,-2.871 1.911,0 3.532,0.39 4.86,1.171 1.328,0.782 2.492,1.817 3.488,3.106 l 3.309,-2.578 c -2.657,-4.082 -6.641,-6.125 -11.953,-6.125 z m -0.672,28.418 c -2.188,0 -4.024,-0.801 -5.508,-2.403 -1.485,-1.582 -2.402,-3.808 -2.754,-6.679 h 15.879 v 0.41 c -0.156,2.754 -0.899,4.883 -2.227,6.387 -1.328,1.523 -3.125,2.285 -5.39,2.285 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path19"
d="m 706.449,110.887 c -0.824,0.136 -1.711,0.207 -2.668,0.207 -3.554,0 -5.969,-1.516 -7.238,-4.543 v -22.5 h -5.418 v 31.699 h 5.273 l 0.09,-3.66 c 1.774,2.832 4.293,4.246 7.555,4.246 1.059,0 1.859,-0.137 2.406,-0.41 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path20"
d="m 717.285,84.051 h -5.418 v 31.699 h 5.418 z m -5.859,40.109 c 0,0.879 0.265,1.621 0.793,2.227 0.547,0.605 1.347,0.906 2.402,0.906 1.055,0 1.856,-0.301 2.402,-0.906 0.547,-0.606 0.821,-1.348 0.821,-2.227 0,-0.879 -0.274,-1.613 -0.821,-2.199 -0.546,-0.586 -1.347,-0.879 -2.402,-0.879 -1.055,0 -1.855,0.293 -2.402,0.879 -0.528,0.586 -0.793,1.32 -0.793,2.199 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path21"
d="m 731.059,115.75 0.171,-3.984 c 2.422,3.046 5.586,4.57 9.493,4.57 6.699,0 10.078,-3.777 10.136,-11.336 V 84.051 h -5.418 v 20.976 c -0.019,2.285 -0.546,3.977 -1.582,5.071 -1.015,1.093 -2.609,1.64 -4.777,1.64 -1.754,0 -3.297,-0.468 -4.625,-1.406 -1.328,-0.937 -2.363,-2.168 -3.109,-3.691 v -22.59 h -5.418 v 31.699 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path22"
d="m 757.805,100.164 c 0,4.941 1.14,8.867 3.429,11.777 2.286,2.93 5.313,4.395 9.078,4.395 3.868,0 6.887,-1.367 9.055,-4.102 l 0.262,3.516 h 4.953 V 84.812 c 0,-4.101 -1.219,-7.332 -3.66,-9.695 -2.422,-2.363 -5.688,-3.547 -9.785,-3.547 -2.285,0 -4.524,0.489 -6.711,1.465 -2.188,0.977 -3.856,2.317 -5.008,4.016 l 2.812,3.25 c 2.321,-2.871 5.165,-4.305 8.524,-4.305 2.637,0 4.687,0.742 6.152,2.227 1.485,1.484 2.227,3.574 2.227,6.269 v 2.723 c -2.168,-2.5 -5.129,-3.75 -8.879,-3.75 -3.711,0 -6.719,1.496 -9.02,4.484 -2.289,2.989 -3.429,7.059 -3.429,12.215 z m 5.449,-0.613 c 0,-3.574 0.734,-6.387 2.199,-8.438 1.461,-2.031 3.512,-3.047 6.152,-3.047 3.415,0 5.926,1.551 7.528,4.657 v 14.472 c -1.66,3.028 -4.153,4.543 -7.473,4.543 -2.633,0 -4.695,-1.027 -6.18,-3.078 -1.484,-2.051 -2.226,-5.086 -2.226,-9.109 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path23"
d="M 231.074,31.699 V 15 h -5.625 v 42.656 h 15.735 c 4.668,0 8.32,-1.191 10.957,-3.574 2.656,-2.383 3.984,-5.535 3.984,-9.461 0,-4.141 -1.297,-7.336 -3.895,-9.582 -2.578,-2.227 -6.281,-3.34 -11.105,-3.34 z m 0,4.602 h 10.11 c 3.007,0 5.312,0.703 6.914,2.109 1.601,1.426 2.402,3.473 2.402,6.149 0,2.543 -0.801,4.574 -2.402,6.093 -1.602,1.524 -3.801,2.317 -6.594,2.375 h -10.43 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path24"
d="m 277.777,41.836 c -0.824,0.137 -1.711,0.207 -2.668,0.207 -3.554,0 -5.968,-1.516 -7.238,-4.543 V 15 h -5.418 v 31.699 h 5.274 l 0.089,-3.664 c 1.774,2.832 4.293,4.25 7.555,4.25 1.059,0 1.859,-0.137 2.406,-0.41 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path25"
d="m 280.707,31.145 c 0,3.101 0.605,5.894 1.813,8.375 1.23,2.48 2.933,4.394 5.101,5.742 2.188,1.347 4.676,2.023 7.469,2.023 4.316,0 7.805,-1.496 10.461,-4.484 2.676,-2.989 4.011,-6.961 4.011,-11.922 v -0.383 c 0,-3.082 -0.593,-5.855 -1.785,-8.32 -1.172,-2.442 -2.863,-4.344 -5.07,-5.711 -2.187,-1.367 -4.707,-2.051 -7.559,-2.051 -4.296,0 -7.781,1.492 -10.457,4.481 -2.656,2.992 -3.984,6.945 -3.984,11.867 z m 5.445,-0.649 c 0,-3.516 0.813,-6.336 2.434,-8.465 1.641,-2.129 3.828,-3.191 6.562,-3.191 2.754,0 4.942,1.074 6.563,3.219 1.621,2.168 2.434,5.199 2.434,9.086 0,3.472 -0.833,6.285 -2.493,8.437 -1.64,2.164 -3.828,3.25 -6.562,3.25 -2.676,0 -4.836,-1.066 -6.477,-3.195 -1.64,-2.129 -2.461,-5.176 -2.461,-9.141 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path26"
d="m 315.07,31.113 c 0,4.942 1.141,8.867 3.426,11.778 2.285,2.929 5.313,4.394 9.086,4.394 3.863,0 6.883,-1.367 9.051,-4.101 l 0.262,3.515 h 4.953 V 15.762 c 0,-4.102 -1.223,-7.332 -3.664,-9.696 -2.422,-2.363 -5.684,-3.546 -9.782,-3.546 -2.289,0 -4.523,0.488 -6.711,1.464 -2.187,0.977 -3.859,2.317 -5.007,4.012 l 2.812,3.254 c 2.32,-2.871 5.164,-4.309 8.524,-4.309 2.636,0 4.687,0.743 6.152,2.227 1.484,1.484 2.226,3.574 2.226,6.273 v 2.723 c -2.168,-2.5 -5.128,-3.75 -8.878,-3.75 -3.708,0 -6.715,1.492 -9.024,4.481 -2.285,2.992 -3.426,7.062 -3.426,12.218 z m 5.45,-0.617 c 0,-3.57 0.73,-6.383 2.195,-8.437 1.465,-2.032 3.519,-3.047 6.156,-3.047 3.414,0 5.926,1.554 7.527,4.66 v 14.473 c -1.66,3.027 -4.148,4.539 -7.472,4.539 -2.637,0 -4.696,-1.024 -6.18,-3.075 -1.484,-2.05 -2.226,-5.086 -2.226,-9.113 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path27"
d="m 365.316,41.836 c -0.824,0.137 -1.711,0.207 -2.668,0.207 -3.554,0 -5.968,-1.516 -7.238,-4.543 V 15 h -5.418 v 31.699 h 5.274 l 0.089,-3.664 c 1.774,2.832 4.293,4.25 7.555,4.25 1.059,0 1.86,-0.137 2.406,-0.41 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path28"
d="m 388.664,15 c -0.312,0.625 -0.566,1.738 -0.762,3.34 -2.519,-2.617 -5.527,-3.926 -9.023,-3.926 -3.125,0 -5.695,0.879 -7.703,2.637 -1.996,1.777 -2.992,4.023 -2.992,6.738 0,3.301 1.25,5.859 3.75,7.676 2.519,1.836 6.054,2.754 10.609,2.754 h 5.273 v 2.488 c 0,1.895 -0.566,3.398 -1.703,4.516 -1.129,1.129 -2.801,1.695 -5.008,1.695 -1.933,0 -3.554,-0.488 -4.863,-1.461 -1.308,-0.98 -1.965,-2.16 -1.965,-3.547 h -5.445 c 0,1.582 0.555,3.106 1.668,4.57 1.133,1.485 2.656,2.657 4.57,3.516 1.934,0.859 4.055,1.289 6.356,1.289 3.652,0 6.515,-0.918 8.586,-2.754 2.07,-1.816 3.144,-4.324 3.222,-7.527 V 22.41 c 0,-2.91 0.371,-5.222 1.114,-6.941 V 15 Z m -8.996,4.129 c 1.699,0 3.312,0.441 4.836,1.32 1.523,0.879 2.629,2.024 3.312,3.43 v 6.5 h -4.25 c -6.64,0 -9.961,-1.941 -9.961,-5.828 0,-1.699 0.567,-3.028 1.7,-3.985 1.133,-0.957 2.586,-1.437 4.363,-1.437 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path29"
d="m 406.887,46.699 0.148,-3.515 c 2.32,2.734 5.457,4.101 9.403,4.101 4.433,0 7.453,-1.699 9.05,-5.097 1.059,1.523 2.426,2.753 4.102,3.691 1.699,0.937 3.703,1.406 6.008,1.406 6.953,0 10.488,-3.683 10.605,-11.047 V 15 h -5.418 v 20.918 c 0,2.266 -0.519,3.953 -1.555,5.07 -1.035,1.129 -2.773,1.696 -5.214,1.696 -2.012,0 -3.684,-0.606 -5.012,-1.813 -1.328,-1.195 -2.098,-2.805 -2.313,-4.836 V 15 h -5.449 v 20.77 c 0,4.609 -2.258,6.914 -6.769,6.914 -3.551,0 -5.985,-1.512 -7.293,-4.539 V 15 h -5.418 v 31.699 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path30"
d="m 459.504,46.699 0.148,-3.515 c 2.321,2.734 5.457,4.101 9.403,4.101 4.433,0 7.453,-1.699 9.05,-5.097 1.059,1.523 2.426,2.753 4.102,3.691 1.699,0.937 3.703,1.406 6.008,1.406 6.953,0 10.488,-3.683 10.605,-11.047 V 15 h -5.418 v 20.918 c 0,2.266 -0.519,3.953 -1.554,5.07 -1.036,1.129 -2.774,1.696 -5.215,1.696 -2.012,0 -3.684,-0.606 -5.012,-1.813 -1.328,-1.195 -2.098,-2.805 -2.312,-4.836 V 15 h -5.45 v 20.77 c 0,4.609 -2.257,6.914 -6.769,6.914 -3.551,0 -5.985,-1.512 -7.293,-4.539 V 15 h -5.418 v 31.699 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path31"
d="m 512.91,15 h -5.418 v 31.699 h 5.418 z m -5.859,40.109 c 0,0.879 0.265,1.621 0.793,2.227 0.547,0.605 1.347,0.906 2.402,0.906 1.055,0 1.856,-0.301 2.402,-0.906 0.547,-0.606 0.821,-1.348 0.821,-2.227 0,-0.879 -0.274,-1.613 -0.821,-2.199 -0.546,-0.586 -1.347,-0.879 -2.402,-0.879 -1.055,0 -1.855,0.293 -2.402,0.879 -0.528,0.586 -0.793,1.32 -0.793,2.199 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path32"
d="m 526.684,46.699 0.171,-3.984 c 2.422,3.047 5.586,4.57 9.493,4.57 6.699,0 10.082,-3.781 10.14,-11.336 V 15 h -5.422 v 20.977 c -0.019,2.285 -0.546,3.972 -1.582,5.066 -1.015,1.094 -2.609,1.641 -4.777,1.641 -1.754,0 -3.297,-0.469 -4.625,-1.407 -1.328,-0.937 -2.363,-2.168 -3.109,-3.687 V 15 h -5.418 v 31.699 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path33"
d="m 553.43,31.113 c 0,4.942 1.14,8.867 3.425,11.778 2.286,2.929 5.313,4.394 9.086,4.394 3.864,0 6.883,-1.367 9.051,-4.101 l 0.262,3.515 h 4.953 V 15.762 c 0,-4.102 -1.223,-7.332 -3.664,-9.696 -2.422,-2.363 -5.684,-3.546 -9.781,-3.546 -2.289,0 -4.524,0.488 -6.711,1.464 -2.188,0.977 -3.86,2.317 -5.008,4.012 l 2.812,3.254 c 2.321,-2.871 5.165,-4.309 8.524,-4.309 2.637,0 4.687,0.743 6.152,2.227 1.485,1.484 2.227,3.574 2.227,6.273 v 2.723 c -2.168,-2.5 -5.129,-3.75 -8.879,-3.75 -3.707,0 -6.715,1.492 -9.024,4.481 -2.285,2.992 -3.425,7.062 -3.425,12.218 z m 5.449,-0.617 c 0,-3.57 0.73,-6.383 2.195,-8.437 1.465,-2.032 3.52,-3.047 6.156,-3.047 3.415,0 5.926,1.554 7.528,4.66 v 14.473 c -1.66,3.027 -4.149,4.539 -7.473,4.539 -2.637,0 -4.695,-1.024 -6.18,-3.075 -1.484,-2.05 -2.226,-5.086 -2.226,-9.113 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path34"
d="m 609.738,19.598 h 20.215 V 15 h -25.871 v 42.656 h 5.656 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path35"
d="m 655.148,15 c -0.312,0.625 -0.566,1.738 -0.761,3.34 -2.52,-2.617 -5.528,-3.926 -9.024,-3.926 -3.125,0 -5.695,0.879 -7.703,2.637 -1.996,1.777 -2.992,4.023 -2.992,6.738 0,3.301 1.25,5.859 3.75,7.676 2.52,1.836 6.055,2.754 10.609,2.754 h 5.274 v 2.488 c 0,1.895 -0.567,3.398 -1.703,4.516 -1.129,1.129 -2.801,1.695 -5.008,1.695 -1.934,0 -3.555,-0.488 -4.863,-1.461 -1.309,-0.98 -1.965,-2.16 -1.965,-3.547 h -5.446 c 0,1.582 0.555,3.106 1.668,4.57 1.133,1.485 2.657,2.657 4.571,3.516 1.933,0.859 4.054,1.289 6.355,1.289 3.652,0 6.516,-0.918 8.586,-2.754 2.07,-1.816 3.145,-4.324 3.223,-7.527 V 22.41 c 0,-2.91 0.371,-5.222 1.113,-6.941 V 15 Z m -8.996,4.129 c 1.7,0 3.313,0.441 4.836,1.32 1.524,0.879 2.629,2.024 3.313,3.43 v 6.5 h -4.25 c -6.641,0 -9.961,-1.941 -9.961,-5.828 0,-1.699 0.566,-3.028 1.699,-3.985 1.133,-0.957 2.586,-1.437 4.363,-1.437 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path36"
d="m 673.402,46.699 0.172,-3.984 c 2.422,3.047 5.586,4.57 9.492,4.57 6.7,0 10.082,-3.781 10.141,-11.336 V 15 h -5.422 v 20.977 c -0.019,2.285 -0.547,3.972 -1.582,5.066 -1.015,1.094 -2.609,1.641 -4.777,1.641 -1.754,0 -3.297,-0.469 -4.625,-1.407 -1.328,-0.937 -2.363,-2.168 -3.11,-3.687 V 15 h -5.418 v 31.699 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path37"
d="m 700.148,31.113 c 0,4.942 1.141,8.867 3.426,11.778 2.285,2.929 5.313,4.394 9.086,4.394 3.863,0 6.883,-1.367 9.051,-4.101 l 0.262,3.515 h 4.953 V 15.762 c 0,-4.102 -1.223,-7.332 -3.664,-9.696 -2.422,-2.363 -5.684,-3.546 -9.782,-3.546 -2.289,0 -4.523,0.488 -6.71,1.464 -2.188,0.977 -3.86,2.317 -5.008,4.012 l 2.812,3.254 c 2.321,-2.871 5.164,-4.309 8.524,-4.309 2.636,0 4.687,0.743 6.152,2.227 1.484,1.484 2.227,3.574 2.227,6.273 v 2.723 c -2.168,-2.5 -5.129,-3.75 -8.879,-3.75 -3.707,0 -6.715,1.492 -9.024,4.481 -2.285,2.992 -3.426,7.062 -3.426,12.218 z m 5.45,-0.617 c 0,-3.57 0.73,-6.383 2.195,-8.437 1.465,-2.032 3.519,-3.047 6.156,-3.047 3.414,0 5.926,1.554 7.528,4.66 v 14.473 c -1.661,3.027 -4.149,4.539 -7.473,4.539 -2.637,0 -4.695,-1.024 -6.18,-3.075 -1.484,-2.05 -2.226,-5.086 -2.226,-9.113 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path38"
d="m 754.641,18.137 c -2.11,-2.481 -5.207,-3.723 -9.286,-3.723 -3.382,0 -5.96,0.977 -7.734,2.93 -1.762,1.972 -2.648,4.883 -2.668,8.73 v 20.625 h 5.418 V 26.223 c 0,-4.809 1.953,-7.211 5.859,-7.211 4.141,0 6.895,1.543 8.266,4.633 v 23.054 h 5.418 V 15 h -5.156 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path39"
d="m 787.688,15 c -0.313,0.625 -0.567,1.738 -0.762,3.34 -2.52,-2.617 -5.528,-3.926 -9.024,-3.926 -3.125,0 -5.695,0.879 -7.703,2.637 -1.996,1.777 -2.992,4.023 -2.992,6.738 0,3.301 1.25,5.859 3.75,7.676 2.523,1.836 6.059,2.754 10.605,2.754 h 5.278 v 2.488 c 0,1.895 -0.567,3.398 -1.699,4.516 -1.137,1.129 -2.805,1.695 -5.012,1.695 -1.934,0 -3.555,-0.488 -4.863,-1.461 -1.309,-0.98 -1.965,-2.16 -1.965,-3.547 h -5.446 c 0,1.582 0.555,3.106 1.668,4.57 1.133,1.485 2.657,2.657 4.571,3.516 1.933,0.859 4.054,1.289 6.359,1.289 3.652,0 6.512,-0.918 8.582,-2.754 2.07,-1.816 3.145,-4.324 3.223,-7.527 V 22.41 c 0,-2.91 0.371,-5.222 1.113,-6.941 V 15 Z m -8.997,4.129 c 1.704,0 3.313,0.441 4.836,1.32 1.524,0.879 2.629,2.024 3.313,3.43 v 6.5 h -4.25 c -6.641,0 -9.961,-1.941 -9.961,-5.828 0,-1.699 0.566,-3.028 1.699,-3.985 1.133,-0.957 2.586,-1.437 4.363,-1.437 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path40"
d="m 799.523,31.113 c 0,4.942 1.145,8.867 3.43,11.778 2.285,2.929 5.313,4.394 9.078,4.394 3.867,0 6.887,-1.367 9.055,-4.101 l 0.262,3.515 h 4.953 V 15.762 c 0,-4.102 -1.219,-7.332 -3.66,-9.696 -2.422,-2.363 -5.688,-3.546 -9.786,-3.546 -2.285,0 -4.523,0.488 -6.71,1.464 -2.188,0.977 -3.856,2.317 -5.008,4.012 l 2.812,3.254 c 2.321,-2.871 5.164,-4.309 8.524,-4.309 2.636,0 4.687,0.743 6.152,2.227 1.484,1.484 2.227,3.574 2.227,6.273 v 2.723 c -2.168,-2.5 -5.129,-3.75 -8.879,-3.75 -3.711,0 -6.719,1.492 -9.02,4.481 -2.285,2.992 -3.43,7.062 -3.43,12.218 z m 5.45,-0.617 c 0,-3.57 0.734,-6.383 2.199,-8.437 1.465,-2.032 3.516,-3.047 6.152,-3.047 3.414,0 5.926,1.554 7.528,4.66 v 14.473 c -1.661,3.027 -4.153,4.539 -7.473,4.539 -2.633,0 -4.695,-1.024 -6.18,-3.075 -1.484,-2.05 -2.226,-5.086 -2.226,-9.113 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path41"
d="m 847.598,14.414 c -4.293,0 -7.789,1.406 -10.489,4.219 -2.695,2.832 -4.043,6.609 -4.043,11.34 v 0.992 c 0,3.144 0.598,5.949 1.789,8.41 1.211,2.48 2.891,4.414 5.04,5.801 2.167,1.406 4.511,2.109 7.031,2.109 4.121,0 7.324,-1.359 9.609,-4.07 2.285,-2.715 3.43,-6.606 3.43,-11.664 v -2.254 h -21.477 c 0.078,-3.125 0.985,-5.656 2.727,-7.59 1.754,-1.91 3.98,-2.867 6.676,-2.867 1.918,0 3.539,0.39 4.863,1.172 1.332,0.781 2.492,1.816 3.488,3.101 l 3.309,-2.578 c -2.656,-4.082 -6.641,-6.121 -11.953,-6.121 z m -0.672,28.418 c -2.188,0 -4.024,-0.801 -5.508,-2.402 -1.484,-1.582 -2.402,-3.809 -2.754,-6.68 h 15.879 v 0.41 c -0.156,2.754 -0.898,4.883 -2.227,6.387 -1.328,1.523 -3.125,2.285 -5.39,2.285 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
<path
id="path42"
d="m 884.66,23.41 c 0,1.465 -0.555,2.598 -1.672,3.399 -1.093,0.816 -3.015,1.519 -5.769,2.109 -2.735,0.582 -4.91,1.285 -6.531,2.109 -1.606,0.817 -2.797,1.793 -3.579,2.93 -0.761,1.129 -1.14,2.477 -1.14,4.039 0,2.598 1.093,4.797 3.281,6.594 2.207,1.797 5.02,2.695 8.438,2.695 3.593,0 6.503,-0.93 8.73,-2.781 2.246,-1.856 3.367,-4.231 3.367,-7.121 h -5.445 c 0,1.484 -0.637,2.765 -1.906,3.84 -1.25,1.07 -2.832,1.609 -4.746,1.609 -1.973,0 -3.516,-0.43 -4.629,-1.289 -1.114,-0.859 -1.668,-1.984 -1.668,-3.367 0,-1.309 0.515,-2.297 1.55,-2.961 1.036,-0.664 2.903,-1.301 5.594,-1.906 2.715,-0.606 4.914,-1.329 6.594,-2.164 1.68,-0.84 2.922,-1.856 3.719,-3.047 0.82,-1.172 1.23,-2.61 1.23,-4.309 0,-2.832 -1.133,-5.105 -3.394,-6.824 -2.27,-1.699 -5.207,-2.551 -8.821,-2.551 -2.539,0 -4.785,0.449 -6.738,1.348 -1.953,0.898 -3.484,2.148 -4.598,3.75 -1.093,1.621 -1.64,3.367 -1.64,5.242 h 5.418 c 0.097,-1.816 0.82,-3.262 2.168,-4.336 1.367,-1.051 3.164,-1.578 5.39,-1.578 2.051,0 3.692,0.41 4.922,1.226 1.25,0.84 1.875,1.957 1.875,3.344 z"
style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none"
transform="matrix(1.3333333,0,0,-1.3333333,0,190)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 28 KiB

177
logos/uulm.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 24 KiB

202
presentation.typ Normal file
View File

@ -0,0 +1,202 @@
// cSpell:ignore fancyuulm uulm
#import "fancyuulm.typ": fancyuulm, slide, centered-slide, title-slide, config-info, pause
#import "@preview/codly:1.3.0": codly-init, codly
#show: codly-init.with()
#codly(zebra-fill: none, display-icon: false, display-name: false, stroke: none, radius: 0mm, inset: 0.3em)
#show: fancyuulm.with(
config-info(
title: [Dataflow Analysis for Compiler Optimization],
subtitle: [Institute of Software Engineering and Programming Languages],
author: [Matthias Veigel],
date: datetime(year: 2025, month: 7, day: 23),
institution: [University Ulm],
institute-logo: "logos/sp.svg",
university-logo: "logos/uulm.svg"
)
)
#show figure.caption: it => { v(5mm); it.body }
#title-slide[
Dataflow Analysis for Compiler Optimization
]
// Hi
// Will talk about the background, method, results
= Background
#slide[
#set list(spacing: 1.5em)
- Looks how data flows through the program during execution
- Either performed forward or backward
- Forward looks how data is used by later execution
- Backward looks what data is still used at a point
- Performed either on source or immediate representation
- Used for optimizations, warnings, correctness analysis
]
#v(0mm, weak: true)
#figure( // ssa_form_example
caption: [C code and respective control flow graph in SSA form, adapted from Fig. 1 in the work of Reissmann, Meyer and Soffa],
kind: "raw",
supplement: "",
grid(
columns: (1fr, 1.25fr),
```C
int x = 2 * 2 + 4;
x = x - 2;
if (x < 4)
x = 10;
else
x = 12;
int y = x * 2;
```,
image("ssa-example.svg", height: 16em)
)
)
// what is it
// where is it used
// works based on what
// LLVM
// Talk about how used in JIT
= Methodology
- RQ1 -- What are the advantages and disadvantages of using dataflow analysis for compiler optimization?
#pause
- RQ2 -- How is dataflow analysis used in current compilers?
#pause
#v(1em)
- Total inspected publications: 571
- Publications included: 15
- Publications ranging from 1973 to 2024
- Use a multitude of languages, $1/3$ use LLVM IR
- Most focused research areas:
- Algorithms and techniques
- Analysis speed improvement
- Custom IR for analysis
= Analysis performance
#slide[
#set list(spacing: 1.25em)
- Except for JIT, DFA is done at compile-time
- Parallelization approaches include: per SSA-node, per function
- SSA clusterization approach for avoiding overhead
- Pipelining function analysis as other approach
#pause
#figure(
caption: [Example function for pipelining analysis, taken from fig. 4 of the work by Shi and Zhang],
kind: "raw",
supplement: "",
```C
int* foo() {
int* p = bar(null);
int* q = p;
int* r = q;
return r;
}
```
)
]
// research done, some things possible
// most still sequentially dependent -> not much speedup
= Optimizations
#slide[
- Constant folding and propagation
- `int a = 1; int b = a + 2;` #h(1em) #sym.arrow #h(1em) `int a = 1; int b = 3;`
#pause
- Copy propagation
- `int a; int b = a; int c = b + 1;` #h(1em) #sym.arrow #h(1em) `int a; int c = a + 1;`
#pause
- Conditional/Dead branch elimination
- ` if (false) {...} int a = 4; if (a > 10) {...}` #h(1em) #sym.arrow #h(1em) `int a = 4;`
#pause
- Common subexpression elimination
- `int b = (a + 2) * (a + 2);` #h(1em) #sym.arrow #h(1em) `int temp = a + 2; int b = temp * temp;`
#pause
- Dead code elimination
- `return; int a = 10;` #h(1em) #sym.arrow #h(1em) `return;`
]
#v(0mm, weak: true)
#figure(
caption: [Example of how RVSDG looks, taken from Fig. 1 of the work by Reissmann, Meyer, Bahmann and Själander],
grid(
columns: (1.35fr, 1fr, 1fr),
column-gutter: 0.5em,
[
#set text(size: 15pt)
#codly(inset: 0.165em)
```C
int f(int a, int b, int c, int d) {
int li1, li2;
int cse, epr;
do {
li1 = b+c;
li2 = d-b;
a = a*li1;
int down = a%c;
int dead = a+d;
if (a > d) {
int acopy = a;
a = 3+down;
cse = acopy<<b;
} else {
cse = a<<b;
}
epr = a<<b;
} while(a > cse);
return li2+epr;
}
```
#align(center, text(size: 8.25pt, "(a) Code"))
],
image("rvsdg_3_uir.svg", height: 85%),
image("rvsdg_4_oir.svg", height: 85%),
)
)
= Problems with DFA
// global vars
// pointers
// multithreaded
- Global variables
- Analysis of every function depends on it
- Adds complex connections between functions
#pause
- Pointer
- Points-to analysis
#pause
- Multithreaded applications
- Requires well synchronized code
- Can be handled by build graph of possible concurrent accesses
= Conclusion
#slide[
- RQ1 -- What are the advantages and disadvantages of using dataflow analysis for compiler optimization?
]
#slide[
- RQ1 -- What are the advantages and disadvantages of using dataflow analysis for compiler optimization?
- Trades compilation performance for runtime performance
- Allows complex optimization across branch and function boundaries
- Allows writing generic code, which will then be optimized based on the usage in an application
]
#slide[
- RQ1 -- What are the advantages and disadvantages of using dataflow analysis for compiler optimization?
- Trades compilation performance for runtime performance
- Allows complex optimization across branch and function boundaries
- Allows writing generic code, which will then be optimized based on the usage in an application
- RQ2 -- How is dataflow analysis used in current compilers?
]
#slide[
- RQ1 -- What are the advantages and disadvantages of using dataflow analysis for compiler optimization?
- Trades compilation performance for runtime performance
- Allows complex optimization across branch and function boundaries
- Allows writing generic code, which will then be optimized based on the usage in an application
- RQ2 -- How is dataflow analysis used in current compilers?
- Already extensively used by popular compilers
- Many different optimizations implemented, some listed previously
- Still working on improving speed and optimization possibilities
]