Added presentation
This commit is contained in:
		@@ -8,10 +8,11 @@ jobs:
 | 
				
			|||||||
    container:
 | 
					    container:
 | 
				
			||||||
      archlinux:latest
 | 
					      archlinux:latest
 | 
				
			||||||
    steps:
 | 
					    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
 | 
					      - uses: actions/checkout@v3
 | 
				
			||||||
      - run: typst c main.typ
 | 
					      - run: typst c main.typ
 | 
				
			||||||
 | 
					      - run: typst c presentation.typ
 | 
				
			||||||
      - uses: actions/upload-artifact@v3
 | 
					      - uses: actions/upload-artifact@v3
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          name: main.pdf
 | 
					          name: pdfs
 | 
				
			||||||
          path: main.pdf
 | 
					          path: *.pdf
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							@@ -6,6 +6,7 @@
 | 
				
			|||||||
        "Regionalized",
 | 
					        "Regionalized",
 | 
				
			||||||
        "RVSDG",
 | 
					        "RVSDG",
 | 
				
			||||||
        "subexpression",
 | 
					        "subexpression",
 | 
				
			||||||
 | 
					        "Veigel",
 | 
				
			||||||
        "Verilog",
 | 
					        "Verilog",
 | 
				
			||||||
        "VHDL",
 | 
					        "VHDL",
 | 
				
			||||||
        "Xplore"
 | 
					        "Xplore"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										282
									
								
								fancyuulm.typ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										282
									
								
								fancyuulm.typ
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										227
									
								
								logos/sp.svg
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										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
									
								
							
							
						
						
									
										202
									
								
								presentation.typ
									
									
									
									
									
										Normal 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
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
		Reference in New Issue
	
	Block a user