acts (empty) → 0.1.0.0
raw patch · 9 files changed
+2789/−0 lines, 9 filesdep +actsdep +basedep +deepseq
Dependencies added: acts, base, deepseq, finite-typelits, generic-data
Files
- acts.cabal +95/−0
- changelog.md +5/−0
- examples/Acts/Examples/MusicalIntervals.hs +332/−0
- img/coerce.svg +723/−0
- img/intertwiner.svg +480/−0
- img/transport.svg +518/−0
- src/Data/Act.hs +210/−0
- src/Data/Group.hs +251/−0
- src/Data/Group/Cyclic.hs +175/−0
+ acts.cabal view
@@ -0,0 +1,95 @@+cabal-version: 2.4 +name: acts +version: 0.1.0.0 +synopsis: Semigroup actions, groups, and torsors. +category: Algebra, Math +license: BSD-3-Clause +build-type: Simple +author: Sam Derbyshire +maintainer: Sam Derbyshire +homepage: https://github.com/sheaf/acts +bug-reports: https://github.com/sheaf/acts/issues +extra-source-files: + changelog.md +extra-doc-files: + img/*.svg +description: + Acts and torsors model types which can be transformed under the action of another type. + . + A prototypical example is affine space, which has an action by translation: + given any two points in affine space, there is a unique translation that brings one to the other. + . + This can be useful in a library keeping track of time: on top of needing to keep track + of units, one also needs to distinguish between absolute time (time stamps) and relative time + (time differences). + The operations one expects in this situation are: + . + * Addition and subtraction of time differences: time differences form a (commutative) group. + * Translation of an absolute time by a time difference: there is an action of relative time on absolute time. + * Given two absolute times, one can obtain the time difference between them: absolute time is a torsor under relative time. + . + This library provides a convenient framework which helps to avoid mixing up these two different notions. + . + . + A fleshed out example is available at "Acts.Examples.MusicalIntervals", + which showcases the use of actions and torsors in the context of musical intervals and harmony. + It also demonstrates common usage patterns of this library, such as how to automatically derive instances. + . + See also the [project readme](https://github.com/sheaf/acts), + which includes a simple example with 2D affine space. + +source-repository head + type: git + location: git://github.com/sheaf/acts.git + +common common + + build-depends: + base + >= 4.12 && < 4.15 + , deepseq + ^>= 1.4.4.0 + , finite-typelits + ^>= 0.1.4.2 + , generic-data + >= 0.6.0.1 && < 0.7.0.0 + + default-language: + Haskell2010 + + ghc-options: + -O2 + -Wall + -Wcompat + -fwarn-missing-local-signatures + -fwarn-incomplete-uni-patterns + -fwarn-missing-deriving-strategies + + +library + + import: + common + + hs-source-dirs: + src + + exposed-modules: + Data.Act + , Data.Group + , Data.Group.Cyclic + + +library acts-examples + + import: + common + + hs-source-dirs: + examples + + exposed-modules: + Acts.Examples.MusicalIntervals + + build-depends: + acts
+ changelog.md view
@@ -0,0 +1,5 @@+# Changelog for package `acts` + +## 0.1.0.0 ( February 2020 ) + +* Initial release.
+ examples/Acts/Examples/MusicalIntervals.hs view
@@ -0,0 +1,332 @@+{-# LANGUAGE + DataKinds + , DeriveGeneric + , DerivingVia + , MultiParamTypeClasses + , PatternSynonyms + , TupleSections + , TypeApplications + , ViewPatterns +#-} + +{-# OPTIONS_HADDOCK ignore-exports #-} + +{-| +Module: Acts.MusicalIntervals + +Illustrative usage of 'Group', 'Act' and 'Torsor': manipulation of musical intervals. + + +The musical distance between two musical notes is a musical interval. + +Intervals can be compounded and inverted, so they form a 'Group'. + +Notes can be translated by a given interval, which is an 'Act' of intervals on notes. + +There's a unique musical interval taking any note to any other given one, so notes are a torsor under intervals. + + +This functionality is useful in providing enharmonically correct voicings of chords. +-} + +module Acts.Examples.MusicalIntervals where + +-- base +import Data.Monoid + ( Sum(..) ) + +-- acts +import Data.Act +import Data.Group +import Data.Group.Cyclic + +----------------------------------------------------------------- +-- * Musical notes +-- +-- $notenames +-- We begin by defining note names, which are acted upon by the cyclic group of order 7. + +-- | Musical note names. +-- +-- The enumeration starts with @C@ to conform with scientific pitch notation. +data NoteName = C | D | E | F | G | A | B + deriving stock ( Eq, Ord, Show, Enum, Bounded ) + deriving ( Act ( C 7 ), Torsor ( C 7 ) ) + via CyclicEnum NoteName + +-- $deriving1 +-- In this case we used @DerivingVia@ to derive the action of @C 7@, +-- using the 'CyclicEnum' newtype created for this exact purpose. + +-- | Alterations, i.e. sharps and flats. +-- +-- Pattern synonyms such as 'Sharp' and 'Flat' are also bundled. +newtype Alteration = Alteration { getAlteration :: Int } + deriving ( Semigroup, Monoid, Group ) + via Sum Int + +-- $deriving2 +-- Note the use of @DerivingVia@ to transfer algebraic operations from @Sum Int@. +-- +-- For non-newtypes, one can use generics, for example: +-- +-- > data Klein4 = Klein4 ( C 2 ) ( C 2 ) +-- > deriving stock Generic +-- > deriving ( Semigroup, Monoid, Group ) +-- > via Generically Klein4 +-- +-- This uses the 'Generically' newtype from the @generic-data@ library. + +-- | Note names such as @A4@ or @C#6@: note name, alteration, and octave (scientific pitch notation). +data Note = Note { name :: NoteName, alteration :: Alteration, octave :: Int } + +----------------------------------------------------------------- +-- * Musical intervals +-- +-- $intervals +-- An interval is represented as a number of scale steps to take (relative to the major scale), +-- together with an additional alteration to apply. +-- +-- For instance, a major third is two steps up (diatonic steps relative to the root in a major scale): +-- +-- > > Steps ( Sum 2 ) Natural +-- > major 3rd up +-- +-- A minor sixth is 5 steps up, and then a flat: +-- +-- > > Steps ( Sum 5 ) Flat +-- > minor 6th up +-- +-- The smart constructor 'Interval' is also provided that is more intuitive to use: +-- +-- > > Interval 3 Natural +-- > major 3rd up +-- +-- > > Interval 7 Flat +-- > minor 7th up +-- +-- Note that the @Semigroup@/@Group@ operations on intervals are __not__ the obvious ones, e.g.: +-- +-- > > Steps ( Sum 2 ) Natural +-- > major 3rd up +-- +-- > > Steps ( Sum (-2) ) Natural +-- > minor 3rd down +-- +-- > > inverse ( Steps ( Sum 2 ) Natural ) +-- > Steps ( Sum (-2) ) Flat +-- > major 3rd down + +-- | Musical interval: steps (relative to the root in a major scale) and additional alteration. +data Interval = Steps { intervalSteps :: Sum Int, intervalAlteration :: Alteration } + +-- | Compute the number of semitones in an interval, using the reference of the C major scale. +semitones :: Interval -> Int +semitones ival = case act ival ( Note C Natural 0 ) of + Note n a o -> 12 * o + getAlteration a + majorValue + where + majorValue = let i = fromEnum n in 2 * i - fromEnum ( i >= 3 ) + +-- $interval_operations +-- To define algebraic operations on intervals, +-- we use an equivariant bijection to the product group @( Sum Int, Sum Int )@. +-- +-- Note that @( Sum Int, Sum Int )@ is automatically a 'Semigroup', 'Monoid' and 'Group' +-- using the product structure. + +-- | Forward part of the bijection. +straighten :: Interval -> ( Sum Int, Sum Int ) +straighten ival@( Steps steps _ ) = ( steps, Sum $ semitones ival ) +-- | Back part of the bijection. +twist :: ( Sum Int, Sum Int ) -> Interval +twist ( i, Sum a ) = Steps i ( Alteration ( semitones ( Steps i mempty ) ) --> Alteration a ) + +instance Semigroup Interval where + iv1 <> iv2 = twist ( straighten iv1 <> straighten iv2 ) +instance Monoid Interval where + mempty = Steps mempty mempty +instance Group Interval where + inverse = twist . inverse . straighten + +-- | Intervallically correct action of intervals on notes. +-- +-- * minor third up from @C@: @Eb@ +-- * minor third up from @A@: @C@. +instance Act Interval Note where + act ( Steps ( Sum steps ) a ) ( Note C a' o ) = Note ( act ( Cyclic @7 r ) C ) ( a <> a' ) ( q + o ) + where + ( q, r ) = steps `divMod` 7 + act ival note = act ( ival <> ( Note C Natural 0 --> note ) ) ( Note C Natural 0 ) + +-- | Computes the interval between two notes. +-- +-- > > Note C Natural 5 --> Note A Natural 4 +-- > minor 3rd down +-- +-- > > Note E Flat 4 --> Note A Natural 5 +-- > augmented 11th up +instance Torsor Interval Note where + Note C a o --> Note n a' o' = Steps ( Sum $ fromEnum n + 7 * (o' - o) ) ( a --> a' ) + note1 --> note2 = ( Note C Natural 0 --> note1 :: Interval ) --> ( Note C Natural 0 --> note2 :: Interval ) + +----------------------------------------------------------------- +-- * Illustration of the functionality + +-- ** Chords + +-- | Major triad: major third, perfect fifth. +majorTriad :: [ Interval ] +majorTriad = [ mempty, Interval 3 Natural, Interval 5 Natural ] + +-- | Diminished seventh chord: minor third, diminished fifth, diminished seventh. +diminished7th :: [ Interval ] +diminished7th = [ mempty, Interval 3 Flat, Interval 5 Flat, Interval 7 DoubleFlat ] + +-- | Minor 11th chord (Kenny Barron voicing). +minor11th :: [ Interval ] +minor11th = [ mempty, Interval 5 Natural, Interval 9 Natural + , Interval 10 Flat, Interval 14 Flat, Interval 18 Natural + ] + +-- $chords +-- Example chords: +-- +-- > > majorTriad <&> ( • Note C Natural 4 ) +-- > [C4,E4,G4] +-- +-- > > diminished7th <&> ( • Note G Sharp 3 ) +-- > [G#3,B3,D4,F4] +-- +-- > > minor11th <&> ( • Note D Natural 3 ) +-- > [D3,A3,E4,F4,C5,G5] + +-- ** Scales + +-- | Modes of C major. +mode :: NoteName -> [ Interval ] +mode root = + map + ( \ ( n, i ) -> Note root Natural 0 --> Note n Natural i ) + ( map ( , 0 ) [ root .. maxBound ] ++ map ( , 1 ) [ minBound .. root ] ) + +-- | Phrygian scale. +phrygian :: [ Interval ] +phrygian = mode E + +-- | Lydian scale. +lydian :: [ Interval ] +lydian = mode F + +-- | Whole tone scale. +wholeTone :: [ Interval ] +wholeTone = scanl (<>) mempty + [ Interval 2 Natural, Interval 2 Natural, Interval 2 Natural, Interval 3 DoubleFlat, Interval 2 Natural ] + +-- $scales +-- Example scales: +-- +-- > > phrygian <&> ( • Note E Natural 3 ) +-- > [E3,F3,G3,A3,B3,C4,D4,E4] +-- +-- > > phrygian <&> ( • Note C Sharp 3 ) +-- > [C#3,D3,E3,F#3,G#3,A3,B3,C#4] +-- +-- > > lydian <&> ( • Note C Natural 4 ) +-- > [C4,D4,E4,F#4,G4,A4,B4,C5] +-- +-- > > wholeTone <&> ( • Note G Natural 5 ) +-- > [G5,A5,B5,C#6,Eb6,F6] + +--------------------------------------------------- +-- * Helper code +-- $end +-- End of main example code. +-- +-- Follows: helper code for reading/showing musical notes and intervals. + +pattern Natural :: Alteration +pattern Natural = Alteration 0 +pattern Flat :: Alteration +pattern Flat = Alteration (-1) +pattern DoubleFlat :: Alteration +pattern DoubleFlat = Alteration (-2) +pattern Sharp :: Alteration +pattern Sharp = Alteration 1 +pattern DoubleSharp :: Alteration +pattern DoubleSharp = Alteration 2 + +instance Show Alteration where + show ( Alteration i ) = replicate ( abs i ) accidental + where + accidental :: Char + accidental + | i >= 0 = '#' + | otherwise = 'b' + +instance Show Note where + show ( Note n alt oct ) = show n <> show alt <> show oct + +pattern Interval :: Int -> Alteration -> Interval +pattern Interval i a <- + ( ( \ ( Steps ( Sum steps ) alt ) -> ( if steps >= 0 then steps + 1 else steps - 1, alt ) ) + -> (i, a) + ) + where + Interval i a = if i < 0 then Steps ( Sum (i+1) ) a else Steps ( Sum (i-1) ) a + +instance Show Interval where + show ival@( Steps ( Sum i ) _ ) + | i == 0 || i == 7 || i == -7 + , let + ivalName = case compare i 0 of + LT -> "octave down" + GT -> "octave up" + EQ -> "unison" + = if quality ival == "perfect" + then ivalName + else quality ival <> " " <> ivalName + | i < 0 + = quality ( inverse ival ) <> " " <> showOrdinal (-i+1) <> " down" + | otherwise + = quality ival <> " " <> showOrdinal (i+1) <> " up" + +quality :: Interval -> String +quality ( Steps ( Sum i ) ( Alteration a ) ) + | ( i `mod` 7 ) `elem` [ 0, 3, 4 ] + = case a of + 0 -> "perfect" + _ -> + if a > 0 + then multiplicity a <> "augmented" + else multiplicity (-a) <> "diminished" + | otherwise + = case a of + 0 -> "major" + (-1) -> "minor" + _ -> + if a > 0 + then multiplicity a <> "augmented" + else multiplicity (-a-1) <> "diminished" + +showOrdinal :: Int -> String +showOrdinal i + | i < 0 + = "-" <> showOrdinal ( abs i ) + | i `mod` 10 == 1 && i `mod` 100 /= 11 + = show i <> "st" + | i `mod` 10 == 2 && i `mod` 100 /= 12 + = show i <> "nd" + | i `mod` 10 == 3 && i `mod` 100 /= 13 + = show i <> "rd" + | otherwise + = show i <> "th" + +multiplicity :: Int -> String +multiplicity 1 = "" +multiplicity 2 = "doubly " +multiplicity 3 = "triply " +multiplicity 4 = "quadruply " +multiplicity 5 = "quintuply " +multiplicity 6 = "sextuply " +multiplicity 7 = "heptuply " +multiplicity n = show n <> "-tuply "
+ img/coerce.svg view
@@ -0,0 +1,723 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="120.74491mm"+ height="46.545536mm"+ viewBox="0 0 120.74491 46.545536"+ version="1.1"+ id="svg1049"+ sodipodi:docname="coerce.svg"+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)">+ <defs+ id="defs1043">+ <g+ id="g1956">+ <symbol+ id="glyph0-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1923"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1926"+ d="M 1.78125,-1.140625 C 1.390625,-0.484375 1,-0.34375 0.5625,-0.3125 0.4375,-0.296875 0.34375,-0.296875 0.34375,-0.109375 0.34375,-0.046875 0.40625,0 0.484375,0 0.75,0 1.0625,-0.03125 1.328125,-0.03125 c 0.34375,0 0.6875,0.03125 1,0.03125 0.0625,0 0.1875,0 0.1875,-0.1875 0,-0.109375 -0.078125,-0.125 -0.15625,-0.125 -0.21875,-0.015625 -0.46875,-0.09375 -0.46875,-0.34375 0,-0.125 0.0625,-0.234375 0.140625,-0.375 l 0.765625,-1.265625 h 2.5 c 0.015625,0.203125 0.15625,1.5625 0.15625,1.65625 0,0.296875 -0.515625,0.328125 -0.71875,0.328125 C 4.59375,-0.3125 4.5,-0.3125 4.5,-0.109375 4.5,0 4.609375,0 4.640625,0 5.046875,0 5.46875,-0.03125 5.875,-0.03125 6.125,-0.03125 6.765625,0 7.015625,0 7.0625,0 7.1875,0 7.1875,-0.203125 7.1875,-0.3125 7.09375,-0.3125 6.953125,-0.3125 6.34375,-0.3125 6.34375,-0.375 6.3125,-0.671875 l -0.609375,-6.21875 c -0.015625,-0.203125 -0.015625,-0.25 -0.1875,-0.25 -0.15625,0 -0.203125,0.078125 -0.265625,0.171875 z M 2.984375,-2.609375 4.9375,-5.90625 5.265625,-2.609375 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1929"+ d="M 1.59375,-0.78125 C 1.5,-0.390625 1.46875,-0.3125 0.6875,-0.3125 c -0.171875,0 -0.265625,0 -0.265625,0.203125 C 0.421875,0 0.515625,0 0.6875,0 H 4.25 C 5.828125,0 7,-1.171875 7,-2.15625 7,-2.875 6.421875,-3.453125 5.453125,-3.5625 6.484375,-3.75 7.53125,-4.484375 7.53125,-5.4375 c 0,-0.734375 -0.65625,-1.375 -1.84375,-1.375 H 2.328125 c -0.1875,0 -0.28125,0 -0.28125,0.203125 0,0.109375 0.09375,0.109375 0.28125,0.109375 0.015625,0 0.203125,0 0.375,0.015625 0.171875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 -0.015625,0.0625 -0.03125,0.1875 z m 1.5,-2.875 0.625,-2.46875 C 3.8125,-6.46875 3.828125,-6.5 4.25,-6.5 h 1.296875 c 0.875,0 1.078125,0.59375 1.078125,1.03125 0,0.875 -0.859375,1.8125 -2.0625,1.8125 z m -0.4375,3.34375 c -0.140625,0 -0.15625,0 -0.21875,0 -0.109375,-0.015625 -0.140625,-0.03125 -0.140625,-0.109375 0,-0.03125 0,-0.046875 0.0625,-0.21875 l 0.6875,-2.78125 h 1.875 c 0.953125,0 1.15625,0.734375 1.15625,1.15625 C 6.078125,-1.28125 5.1875,-0.3125 4,-0.3125 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1932"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1935"+ d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1938"+ d="m 3.703125,-2.578125 c 0.03125,-0.09375 0.03125,-0.125 0.03125,-0.140625 0,-0.15625 -0.125,-0.21875 -0.234375,-0.21875 -0.15625,0 -0.296875,0.125 -0.328125,0.265625 -0.109375,-0.1875 -0.34375,-0.40625 -0.71875,-0.40625 -0.859375,0 -1.78125,0.9375 -1.78125,1.9375 0,0.71875 0.484375,1.140625 1.0625,1.140625 0.328125,0 0.625,-0.15625 0.875,-0.375 L 2.453125,0.25 C 2.375,0.546875 2.328125,0.734375 2.0625,0.96875 c -0.3125,0.25 -0.609375,0.25 -0.78125,0.25 -0.3125,0 -0.40625,-0.015625 -0.53125,-0.046875 0.171875,-0.078125 0.21875,-0.25 0.21875,-0.34375 0,-0.171875 -0.125,-0.25 -0.265625,-0.25 C 0.5,0.578125 0.296875,0.734375 0.296875,1 c 0,0.421875 0.609375,0.421875 1,0.421875 1.09375,0 1.546875,-0.5625 1.65625,-0.953125 z M 2.75,-0.921875 c -0.03125,0.09375 -0.03125,0.109375 -0.15625,0.25 C 2.359375,-0.375 2.015625,-0.1875 1.75,-0.1875 c -0.34375,0 -0.515625,-0.3125 -0.515625,-0.671875 0,-0.296875 0.1875,-1.078125 0.375,-1.390625 0.28125,-0.484375 0.609375,-0.625 0.84375,-0.625 0.5,0 0.625,0.515625 0.625,0.59375 0,0.015625 0,0.015625 -0.015625,0.09375 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1941"+ d="m 2.1875,-4.625 c 0,-0.015625 0.015625,-0.109375 0.015625,-0.109375 0,-0.046875 -0.015625,-0.109375 -0.109375,-0.109375 -0.140625,0 -0.71875,0.0625 -0.890625,0.078125 -0.046875,0 -0.15625,0.015625 -0.15625,0.15625 0,0.09375 0.109375,0.09375 0.1875,0.09375 0.328125,0 0.328125,0.0625 0.328125,0.109375 0,0.046875 -0.015625,0.09375 -0.015625,0.15625 L 0.5625,-0.3125 c -0.046875,0.125 -0.046875,0.140625 -0.046875,0.15625 0,0.109375 0.09375,0.21875 0.25,0.21875 0.078125,0 0.203125,-0.03125 0.28125,-0.171875 C 1.0625,-0.15625 1.125,-0.40625 1.15625,-0.546875 l 0.171875,-0.625 C 1.34375,-1.28125 1.421875,-1.546875 1.4375,-1.640625 1.5,-1.90625 1.5,-1.921875 1.640625,-2.140625 1.875,-2.484375 2.21875,-2.875 2.765625,-2.875 c 0.390625,0 0.40625,0.3125 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.3125,0.59375 0.65625,0.59375 0.703125,0 1.015625,-0.953125 1.015625,-1.0625 0,-0.09375 -0.09375,-0.09375 -0.125,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 -0.15625,0.5625 -0.46875,0.84375 -0.734375,0.84375 -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 C 3.40625,-1.15625 3.6875,-1.890625 3.6875,-2.28125 c 0,-0.109375 0,-0.40625 -0.25,-0.609375 -0.125,-0.078125 -0.328125,-0.1875 -0.65625,-0.1875 -0.5,0 -0.875,0.28125 -1.125,0.578125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1944"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1947"+ d="M 1.578125,-1.734375 C 1.578125,-2 1.375,-2.140625 1.1875,-2.140625 c -0.234375,0 -0.40625,0.1875 -0.40625,0.390625 0,0.25 0.203125,0.40625 0.390625,0.40625 0.234375,0 0.40625,-0.1875 0.40625,-0.390625 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1950"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1953"+ d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ </g>+ <g+ id="g6475">+ <symbol+ id="glyph0-0-9"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6424"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-1-8"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6427"+ d="M 1.78125,-1.140625 C 1.390625,-0.484375 1,-0.34375 0.5625,-0.3125 0.4375,-0.296875 0.34375,-0.296875 0.34375,-0.109375 0.34375,-0.046875 0.40625,0 0.484375,0 0.75,0 1.0625,-0.03125 1.328125,-0.03125 c 0.34375,0 0.6875,0.03125 1,0.03125 0.0625,0 0.1875,0 0.1875,-0.1875 0,-0.109375 -0.078125,-0.125 -0.15625,-0.125 -0.21875,-0.015625 -0.46875,-0.09375 -0.46875,-0.34375 0,-0.125 0.0625,-0.234375 0.140625,-0.375 l 0.765625,-1.265625 h 2.5 c 0.015625,0.203125 0.15625,1.5625 0.15625,1.65625 0,0.296875 -0.515625,0.328125 -0.71875,0.328125 C 4.59375,-0.3125 4.5,-0.3125 4.5,-0.109375 4.5,0 4.609375,0 4.640625,0 5.046875,0 5.46875,-0.03125 5.875,-0.03125 6.125,-0.03125 6.765625,0 7.015625,0 7.0625,0 7.1875,0 7.1875,-0.203125 7.1875,-0.3125 7.09375,-0.3125 6.953125,-0.3125 6.34375,-0.3125 6.34375,-0.375 6.3125,-0.671875 l -0.609375,-6.21875 c -0.015625,-0.203125 -0.015625,-0.25 -0.1875,-0.25 -0.15625,0 -0.203125,0.078125 -0.265625,0.171875 z M 2.984375,-2.609375 4.9375,-5.90625 5.265625,-2.609375 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-2-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6430"+ d="M 1.59375,-0.78125 C 1.5,-0.390625 1.46875,-0.3125 0.6875,-0.3125 c -0.171875,0 -0.265625,0 -0.265625,0.203125 C 0.421875,0 0.515625,0 0.6875,0 H 4.25 C 5.828125,0 7,-1.171875 7,-2.15625 7,-2.875 6.421875,-3.453125 5.453125,-3.5625 6.484375,-3.75 7.53125,-4.484375 7.53125,-5.4375 c 0,-0.734375 -0.65625,-1.375 -1.84375,-1.375 H 2.328125 c -0.1875,0 -0.28125,0 -0.28125,0.203125 0,0.109375 0.09375,0.109375 0.28125,0.109375 0.015625,0 0.203125,0 0.375,0.015625 0.171875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 -0.015625,0.0625 -0.03125,0.1875 z m 1.5,-2.875 0.625,-2.46875 C 3.8125,-6.46875 3.828125,-6.5 4.25,-6.5 h 1.296875 c 0.875,0 1.078125,0.59375 1.078125,1.03125 0,0.875 -0.859375,1.8125 -2.0625,1.8125 z m -0.4375,3.34375 c -0.140625,0 -0.15625,0 -0.21875,0 -0.109375,-0.015625 -0.140625,-0.03125 -0.140625,-0.109375 0,-0.03125 0,-0.046875 0.0625,-0.21875 l 0.6875,-2.78125 h 1.875 c 0.953125,0 1.15625,0.734375 1.15625,1.15625 C 6.078125,-1.28125 5.1875,-0.3125 4,-0.3125 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-0-4"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6433"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-1-6"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6436"+ d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-2-5"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6439"+ d="m 3.703125,-2.578125 c 0.03125,-0.09375 0.03125,-0.125 0.03125,-0.140625 0,-0.15625 -0.125,-0.21875 -0.234375,-0.21875 -0.15625,0 -0.296875,0.125 -0.328125,0.265625 -0.109375,-0.1875 -0.34375,-0.40625 -0.71875,-0.40625 -0.859375,0 -1.78125,0.9375 -1.78125,1.9375 0,0.71875 0.484375,1.140625 1.0625,1.140625 0.328125,0 0.625,-0.15625 0.875,-0.375 L 2.453125,0.25 C 2.375,0.546875 2.328125,0.734375 2.0625,0.96875 c -0.3125,0.25 -0.609375,0.25 -0.78125,0.25 -0.3125,0 -0.40625,-0.015625 -0.53125,-0.046875 0.171875,-0.078125 0.21875,-0.25 0.21875,-0.34375 0,-0.171875 -0.125,-0.25 -0.265625,-0.25 C 0.5,0.578125 0.296875,0.734375 0.296875,1 c 0,0.421875 0.609375,0.421875 1,0.421875 1.09375,0 1.546875,-0.5625 1.65625,-0.953125 z M 2.75,-0.921875 c -0.03125,0.09375 -0.03125,0.109375 -0.15625,0.25 C 2.359375,-0.375 2.015625,-0.1875 1.75,-0.1875 c -0.34375,0 -0.515625,-0.3125 -0.515625,-0.671875 0,-0.296875 0.1875,-1.078125 0.375,-1.390625 0.28125,-0.484375 0.609375,-0.625 0.84375,-0.625 0.5,0 0.625,0.515625 0.625,0.59375 0,0.015625 0,0.015625 -0.015625,0.09375 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-3-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6442"+ d="m 2.1875,-4.625 c 0,-0.015625 0.015625,-0.109375 0.015625,-0.109375 0,-0.046875 -0.015625,-0.109375 -0.109375,-0.109375 -0.140625,0 -0.71875,0.0625 -0.890625,0.078125 -0.046875,0 -0.15625,0.015625 -0.15625,0.15625 0,0.09375 0.109375,0.09375 0.1875,0.09375 0.328125,0 0.328125,0.0625 0.328125,0.109375 0,0.046875 -0.015625,0.09375 -0.015625,0.15625 L 0.5625,-0.3125 c -0.046875,0.125 -0.046875,0.140625 -0.046875,0.15625 0,0.109375 0.09375,0.21875 0.25,0.21875 0.078125,0 0.203125,-0.03125 0.28125,-0.171875 C 1.0625,-0.15625 1.125,-0.40625 1.15625,-0.546875 l 0.171875,-0.625 C 1.34375,-1.28125 1.421875,-1.546875 1.4375,-1.640625 1.5,-1.90625 1.5,-1.921875 1.640625,-2.140625 1.875,-2.484375 2.21875,-2.875 2.765625,-2.875 c 0.390625,0 0.40625,0.3125 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.3125,0.59375 0.65625,0.59375 0.703125,0 1.015625,-0.953125 1.015625,-1.0625 0,-0.09375 -0.09375,-0.09375 -0.125,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 -0.15625,0.5625 -0.46875,0.84375 -0.734375,0.84375 -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 C 3.40625,-1.15625 3.6875,-1.890625 3.6875,-2.28125 c 0,-0.109375 0,-0.40625 -0.25,-0.609375 -0.125,-0.078125 -0.328125,-0.1875 -0.65625,-0.1875 -0.5,0 -0.875,0.28125 -1.125,0.578125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-0-7"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6445"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-1-5"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6448"+ d="M 1.578125,-1.734375 C 1.578125,-2 1.375,-2.140625 1.1875,-2.140625 c -0.234375,0 -0.40625,0.1875 -0.40625,0.390625 0,0.25 0.203125,0.40625 0.390625,0.40625 0.234375,0 0.40625,-0.1875 0.40625,-0.390625 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-0-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6451"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-1-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6454"+ d="M 1.40625,-2.75 H 2.484375 V -3 H 1.40625 v -1.28125 h -0.25 c 0,0.625 -0.28125,1.3125 -0.953125,1.328125 V -2.75 H 0.84375 v 1.875 c 0,0.78125 0.59375,0.9375 0.984375,0.9375 0.46875,0 0.78125,-0.390625 0.78125,-0.9375 V -1.265625 H 2.375 v 0.375 c 0,0.484375 -0.21875,0.734375 -0.5,0.734375 -0.46875,0 -0.46875,-0.578125 -0.46875,-0.703125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6457"+ d="m 3.6875,-1.484375 c 0,-0.875 -0.75,-1.625 -1.703125,-1.625 -0.96875,0 -1.71875,0.75 -1.71875,1.625 0,0.859375 0.765625,1.546875 1.71875,1.546875 0.9375,0 1.703125,-0.6875 1.703125,-1.546875 z M 1.984375,-0.15625 c -0.265625,0 -0.640625,-0.078125 -0.875,-0.421875 -0.1875,-0.28125 -0.203125,-0.640625 -0.203125,-0.96875 0,-0.296875 0,-0.71875 0.25,-1.015625 0.171875,-0.203125 0.46875,-0.34375 0.828125,-0.34375 0.40625,0 0.703125,0.1875 0.859375,0.40625 0.1875,0.265625 0.203125,0.625 0.203125,0.953125 0,0.328125 -0.015625,0.703125 -0.21875,0.984375 -0.1875,0.265625 -0.5,0.40625 -0.84375,0.40625 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6460"+ d="m 1.4375,-2.75 h 0.875 V -3 H 1.40625 v -0.78125 c 0,-0.640625 0.375,-0.921875 0.671875,-0.921875 0.0625,0 0.140625,0 0.203125,0.03125 C 2.1875,-4.625 2.125,-4.515625 2.125,-4.390625 c 0,0.1875 0.140625,0.3125 0.328125,0.3125 0.1875,0 0.328125,-0.125 0.328125,-0.3125 0,-0.3125 -0.3125,-0.515625 -0.6875,-0.515625 -0.546875,0 -1.1875,0.390625 -1.1875,1.125 V -3 H 0.3125 v 0.25 h 0.59375 v 2.203125 C 0.90625,-0.25 0.84375,-0.25 0.390625,-0.25 V 0 C 0.421875,0 0.90625,-0.03125 1.1875,-0.03125 1.484375,-0.03125 1.796875,-0.015625 2.09375,0 V -0.25 H 1.953125 C 1.4375,-0.25 1.4375,-0.328125 1.4375,-0.5625 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-4"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6463"+ d="m 1.390625,-1.59375 c 0,-0.578125 0.265625,-1.28125 0.9375,-1.28125 -0.0625,0.046875 -0.125,0.140625 -0.125,0.25 0,0.234375 0.1875,0.3125 0.3125,0.3125 0.171875,0 0.328125,-0.109375 0.328125,-0.3125 0,-0.234375 -0.234375,-0.453125 -0.5625,-0.453125 -0.34375,0 -0.734375,0.21875 -0.9375,0.75 v -0.75 L 0.34375,-3 v 0.25 c 0.46875,0 0.515625,0.046875 0.515625,0.390625 v 1.8125 C 0.859375,-0.25 0.796875,-0.25 0.34375,-0.25 V 0 c 0.03125,0 0.5,-0.03125 0.796875,-0.03125 0.296875,0 0.59375,0.015625 0.90625,0.03125 V -0.25 H 1.90625 c -0.515625,0 -0.515625,-0.078125 -0.515625,-0.3125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-5"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6466"+ d="m 5.734375,-2.109375 c 0,-0.609375 -0.3125,-0.96875 -1.046875,-0.96875 -0.5625,0 -0.9375,0.296875 -1.125,0.65625 -0.140625,-0.5 -0.515625,-0.65625 -1.015625,-0.65625 -0.578125,0 -0.9375,0.3125 -1.140625,0.6875 v -0.6875 L 0.375,-3 v 0.25 c 0.46875,0 0.53125,0.046875 0.53125,0.390625 v 1.8125 C 0.90625,-0.25 0.828125,-0.25 0.375,-0.25 V 0 C 0.390625,0 0.875,-0.03125 1.171875,-0.03125 1.421875,-0.03125 1.90625,0 1.96875,0 v -0.25 c -0.453125,0 -0.515625,0 -0.515625,-0.296875 V -1.8125 c 0,-0.71875 0.578125,-1.0625 1.03125,-1.0625 0.484375,0 0.546875,0.375 0.546875,0.734375 v 1.59375 C 3.03125,-0.25 2.96875,-0.25 2.515625,-0.25 V 0 C 2.53125,0 3.015625,-0.03125 3.3125,-0.03125 3.5625,-0.03125 4.046875,0 4.109375,0 v -0.25 c -0.453125,0 -0.515625,0 -0.515625,-0.296875 V -1.8125 c 0,-0.71875 0.578125,-1.0625 1.03125,-1.0625 0.484375,0 0.546875,0.375 0.546875,0.734375 v 1.59375 C 5.171875,-0.25 5.109375,-0.25 4.65625,-0.25 V 0 c 0.015625,0 0.5,-0.03125 0.796875,-0.03125 C 5.703125,-0.03125 6.1875,0 6.25,0 v -0.25 c -0.453125,0 -0.515625,0 -0.515625,-0.296875 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph4-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6469"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph4-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6472"+ d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ </g>+ <g+ id="g7148">+ <symbol+ id="glyph0-0-6"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7085"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-1-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7088"+ d="M 1.78125,-1.140625 C 1.390625,-0.484375 1,-0.34375 0.5625,-0.3125 0.4375,-0.296875 0.34375,-0.296875 0.34375,-0.109375 0.34375,-0.046875 0.40625,0 0.484375,0 0.75,0 1.0625,-0.03125 1.328125,-0.03125 c 0.34375,0 0.6875,0.03125 1,0.03125 0.0625,0 0.1875,0 0.1875,-0.1875 0,-0.109375 -0.078125,-0.125 -0.15625,-0.125 -0.21875,-0.015625 -0.46875,-0.09375 -0.46875,-0.34375 0,-0.125 0.0625,-0.234375 0.140625,-0.375 l 0.765625,-1.265625 h 2.5 c 0.015625,0.203125 0.15625,1.5625 0.15625,1.65625 0,0.296875 -0.515625,0.328125 -0.71875,0.328125 C 4.59375,-0.3125 4.5,-0.3125 4.5,-0.109375 4.5,0 4.609375,0 4.640625,0 5.046875,0 5.46875,-0.03125 5.875,-0.03125 6.125,-0.03125 6.765625,0 7.015625,0 7.0625,0 7.1875,0 7.1875,-0.203125 7.1875,-0.3125 7.09375,-0.3125 6.953125,-0.3125 6.34375,-0.3125 6.34375,-0.375 6.3125,-0.671875 l -0.609375,-6.21875 c -0.015625,-0.203125 -0.015625,-0.25 -0.1875,-0.25 -0.15625,0 -0.203125,0.078125 -0.265625,0.171875 z M 2.984375,-2.609375 4.9375,-5.90625 5.265625,-2.609375 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-2-7"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7091"+ d="M 1.59375,-0.78125 C 1.5,-0.390625 1.46875,-0.3125 0.6875,-0.3125 c -0.171875,0 -0.265625,0 -0.265625,0.203125 C 0.421875,0 0.515625,0 0.6875,0 H 4.25 C 5.828125,0 7,-1.171875 7,-2.15625 7,-2.875 6.421875,-3.453125 5.453125,-3.5625 6.484375,-3.75 7.53125,-4.484375 7.53125,-5.4375 c 0,-0.734375 -0.65625,-1.375 -1.84375,-1.375 H 2.328125 c -0.1875,0 -0.28125,0 -0.28125,0.203125 0,0.109375 0.09375,0.109375 0.28125,0.109375 0.015625,0 0.203125,0 0.375,0.015625 0.171875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 -0.015625,0.0625 -0.03125,0.1875 z m 1.5,-2.875 0.625,-2.46875 C 3.8125,-6.46875 3.828125,-6.5 4.25,-6.5 h 1.296875 c 0.875,0 1.078125,0.59375 1.078125,1.03125 0,0.875 -0.859375,1.8125 -2.0625,1.8125 z m -0.4375,3.34375 c -0.140625,0 -0.15625,0 -0.21875,0 -0.109375,-0.015625 -0.140625,-0.03125 -0.140625,-0.109375 0,-0.03125 0,-0.046875 0.0625,-0.21875 l 0.6875,-2.78125 h 1.875 c 0.953125,0 1.15625,0.734375 1.15625,1.15625 C 6.078125,-1.28125 5.1875,-0.3125 4,-0.3125 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7094"+ d="m 7.578125,-6.921875 c 0,-0.03125 -0.015625,-0.109375 -0.109375,-0.109375 -0.03125,0 -0.046875,0.015625 -0.15625,0.125 L 6.625,-6.140625 C 6.53125,-6.28125 6.078125,-7.03125 4.96875,-7.03125 2.734375,-7.03125 0.5,-4.828125 0.5,-2.515625 c 0,1.59375 1.109375,2.734375 2.71875,2.734375 0.4375,0 0.890625,-0.09375 1.25,-0.234375 0.5,-0.203125 0.6875,-0.40625 0.859375,-0.609375 0.09375,0.25 0.359375,0.609375 0.453125,0.609375 0.046875,0 0.078125,-0.03125 0.078125,-0.03125 C 5.875,-0.0625 5.96875,-0.453125 6.015625,-0.65625 l 0.1875,-0.765625 C 6.25,-1.59375 6.296875,-1.765625 6.34375,-1.9375 c 0.109375,-0.4375 0.109375,-0.46875 0.6875,-0.46875 0.046875,0 0.15625,-0.015625 0.15625,-0.203125 0,-0.078125 -0.046875,-0.109375 -0.125,-0.109375 -0.234375,0 -0.828125,0.03125 -1.046875,0.03125 -0.3125,0 -1.09375,-0.03125 -1.40625,-0.03125 -0.078125,0 -0.203125,0 -0.203125,0.203125 0,0.109375 0.078125,0.109375 0.296875,0.109375 0.015625,0 0.296875,0 0.53125,0.015625 0.265625,0.03125 0.3125,0.0625 0.3125,0.1875 0,0.09375 -0.109375,0.53125 -0.21875,0.90625 -0.28125,1.09375 -1.5625,1.203125 -1.921875,1.203125 -0.953125,0 -2,-0.5625 -2,-2.09375 0,-0.3125 0.09375,-1.953125 1.140625,-3.25 0.546875,-0.671875 1.515625,-1.28125 2.5,-1.28125 1.015625,0 1.609375,0.765625 1.609375,1.921875 0,0.40625 -0.03125,0.40625 -0.03125,0.515625 0,0.09375 0.109375,0.09375 0.140625,0.09375 0.125,0 0.125,-0.015625 0.1875,-0.203125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-0-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7097"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-1-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7100"+ d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-2-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7103"+ d="m 3.703125,-2.578125 c 0.03125,-0.09375 0.03125,-0.125 0.03125,-0.140625 0,-0.15625 -0.125,-0.21875 -0.234375,-0.21875 -0.15625,0 -0.296875,0.125 -0.328125,0.265625 -0.109375,-0.1875 -0.34375,-0.40625 -0.71875,-0.40625 -0.859375,0 -1.78125,0.9375 -1.78125,1.9375 0,0.71875 0.484375,1.140625 1.0625,1.140625 0.328125,0 0.625,-0.15625 0.875,-0.375 L 2.453125,0.25 C 2.375,0.546875 2.328125,0.734375 2.0625,0.96875 c -0.3125,0.25 -0.609375,0.25 -0.78125,0.25 -0.3125,0 -0.40625,-0.015625 -0.53125,-0.046875 0.171875,-0.078125 0.21875,-0.25 0.21875,-0.34375 0,-0.171875 -0.125,-0.25 -0.265625,-0.25 C 0.5,0.578125 0.296875,0.734375 0.296875,1 c 0,0.421875 0.609375,0.421875 1,0.421875 1.09375,0 1.546875,-0.5625 1.65625,-0.953125 z M 2.75,-0.921875 c -0.03125,0.09375 -0.03125,0.109375 -0.15625,0.25 C 2.359375,-0.375 2.015625,-0.1875 1.75,-0.1875 c -0.34375,0 -0.515625,-0.3125 -0.515625,-0.671875 0,-0.296875 0.1875,-1.078125 0.375,-1.390625 0.28125,-0.484375 0.609375,-0.625 0.84375,-0.625 0.5,0 0.625,0.515625 0.625,0.59375 0,0.015625 0,0.015625 -0.015625,0.09375 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-3-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7106"+ d="m 2.1875,-4.625 c 0,-0.015625 0.015625,-0.109375 0.015625,-0.109375 0,-0.046875 -0.015625,-0.109375 -0.109375,-0.109375 -0.140625,0 -0.71875,0.0625 -0.890625,0.078125 -0.046875,0 -0.15625,0.015625 -0.15625,0.15625 0,0.09375 0.109375,0.09375 0.1875,0.09375 0.328125,0 0.328125,0.0625 0.328125,0.109375 0,0.046875 -0.015625,0.09375 -0.015625,0.15625 L 0.5625,-0.3125 c -0.046875,0.125 -0.046875,0.140625 -0.046875,0.15625 0,0.109375 0.09375,0.21875 0.25,0.21875 0.078125,0 0.203125,-0.03125 0.28125,-0.171875 C 1.0625,-0.15625 1.125,-0.40625 1.15625,-0.546875 l 0.171875,-0.625 C 1.34375,-1.28125 1.421875,-1.546875 1.4375,-1.640625 1.5,-1.90625 1.5,-1.921875 1.640625,-2.140625 1.875,-2.484375 2.21875,-2.875 2.765625,-2.875 c 0.390625,0 0.40625,0.3125 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.3125,0.59375 0.65625,0.59375 0.703125,0 1.015625,-0.953125 1.015625,-1.0625 0,-0.09375 -0.09375,-0.09375 -0.125,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 -0.15625,0.5625 -0.46875,0.84375 -0.734375,0.84375 -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 C 3.40625,-1.15625 3.6875,-1.890625 3.6875,-2.28125 c 0,-0.109375 0,-0.40625 -0.25,-0.609375 -0.125,-0.078125 -0.328125,-0.1875 -0.65625,-0.1875 -0.5,0 -0.875,0.28125 -1.125,0.578125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-0-9"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7109"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-1-6"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7112"+ d="M 1.578125,-1.734375 C 1.578125,-2 1.375,-2.140625 1.1875,-2.140625 c -0.234375,0 -0.40625,0.1875 -0.40625,0.390625 0,0.25 0.203125,0.40625 0.390625,0.40625 0.234375,0 0.40625,-0.1875 0.40625,-0.390625 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7115"+ d="m 5.671875,-2.390625 c 0,-0.265625 -0.09375,-0.28125 -0.109375,-0.28125 -0.109375,0 -0.125,0.203125 -0.125,0.28125 -0.015625,0.515625 -0.40625,1.09375 -1.046875,1.09375 -0.5,0 -0.84375,-0.3125 -1.234375,-0.671875 -0.375,-0.328125 -0.78125,-0.703125 -1.328125,-0.703125 -0.796875,0 -1.296875,0.8125 -1.296875,1.578125 0,0.265625 0.109375,0.28125 0.125,0.28125 0.109375,0 0.109375,-0.1875 0.125,-0.28125 0.015625,-0.515625 0.390625,-1.09375 1.046875,-1.09375 0.5,0 0.84375,0.3125 1.234375,0.671875 0.359375,0.328125 0.78125,0.703125 1.328125,0.703125 0.796875,0 1.28125,-0.8125 1.28125,-1.578125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-0-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7118"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-1-35"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7121"+ d="M 1.40625,-2.75 H 2.484375 V -3 H 1.40625 v -1.28125 h -0.25 c 0,0.625 -0.28125,1.3125 -0.953125,1.328125 V -2.75 H 0.84375 v 1.875 c 0,0.78125 0.59375,0.9375 0.984375,0.9375 0.46875,0 0.78125,-0.390625 0.78125,-0.9375 V -1.265625 H 2.375 v 0.375 c 0,0.484375 -0.21875,0.734375 -0.5,0.734375 -0.46875,0 -0.46875,-0.578125 -0.46875,-0.703125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-2-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7124"+ d="m 3.6875,-1.484375 c 0,-0.875 -0.75,-1.625 -1.703125,-1.625 -0.96875,0 -1.71875,0.75 -1.71875,1.625 0,0.859375 0.765625,1.546875 1.71875,1.546875 0.9375,0 1.703125,-0.6875 1.703125,-1.546875 z M 1.984375,-0.15625 c -0.265625,0 -0.640625,-0.078125 -0.875,-0.421875 -0.1875,-0.28125 -0.203125,-0.640625 -0.203125,-0.96875 0,-0.296875 0,-0.71875 0.25,-1.015625 0.171875,-0.203125 0.46875,-0.34375 0.828125,-0.34375 0.40625,0 0.703125,0.1875 0.859375,0.40625 0.1875,0.265625 0.203125,0.625 0.203125,0.953125 0,0.328125 -0.015625,0.703125 -0.21875,0.984375 -0.1875,0.265625 -0.5,0.40625 -0.84375,0.40625 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-3-4"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7127"+ d="m 1.4375,-2.75 h 0.875 V -3 H 1.40625 v -0.78125 c 0,-0.640625 0.375,-0.921875 0.671875,-0.921875 0.0625,0 0.140625,0 0.203125,0.03125 C 2.1875,-4.625 2.125,-4.515625 2.125,-4.390625 c 0,0.1875 0.140625,0.3125 0.328125,0.3125 0.1875,0 0.328125,-0.125 0.328125,-0.3125 0,-0.3125 -0.3125,-0.515625 -0.6875,-0.515625 -0.546875,0 -1.1875,0.390625 -1.1875,1.125 V -3 H 0.3125 v 0.25 h 0.59375 v 2.203125 C 0.90625,-0.25 0.84375,-0.25 0.390625,-0.25 V 0 C 0.421875,0 0.90625,-0.03125 1.1875,-0.03125 1.484375,-0.03125 1.796875,-0.015625 2.09375,0 V -0.25 H 1.953125 C 1.4375,-0.25 1.4375,-0.328125 1.4375,-0.5625 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-4-6"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7130"+ d="m 1.390625,-1.59375 c 0,-0.578125 0.265625,-1.28125 0.9375,-1.28125 -0.0625,0.046875 -0.125,0.140625 -0.125,0.25 0,0.234375 0.1875,0.3125 0.3125,0.3125 0.171875,0 0.328125,-0.109375 0.328125,-0.3125 0,-0.234375 -0.234375,-0.453125 -0.5625,-0.453125 -0.34375,0 -0.734375,0.21875 -0.9375,0.75 v -0.75 L 0.34375,-3 v 0.25 c 0.46875,0 0.515625,0.046875 0.515625,0.390625 v 1.8125 C 0.859375,-0.25 0.796875,-0.25 0.34375,-0.25 V 0 c 0.03125,0 0.5,-0.03125 0.796875,-0.03125 0.296875,0 0.59375,0.015625 0.90625,0.03125 V -0.25 H 1.90625 c -0.515625,0 -0.515625,-0.078125 -0.515625,-0.3125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-5-8"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7133"+ d="m 5.734375,-2.109375 c 0,-0.609375 -0.3125,-0.96875 -1.046875,-0.96875 -0.5625,0 -0.9375,0.296875 -1.125,0.65625 -0.140625,-0.5 -0.515625,-0.65625 -1.015625,-0.65625 -0.578125,0 -0.9375,0.3125 -1.140625,0.6875 v -0.6875 L 0.375,-3 v 0.25 c 0.46875,0 0.53125,0.046875 0.53125,0.390625 v 1.8125 C 0.90625,-0.25 0.828125,-0.25 0.375,-0.25 V 0 C 0.390625,0 0.875,-0.03125 1.171875,-0.03125 1.421875,-0.03125 1.90625,0 1.96875,0 v -0.25 c -0.453125,0 -0.515625,0 -0.515625,-0.296875 V -1.8125 c 0,-0.71875 0.578125,-1.0625 1.03125,-1.0625 0.484375,0 0.546875,0.375 0.546875,0.734375 v 1.59375 C 3.03125,-0.25 2.96875,-0.25 2.515625,-0.25 V 0 C 2.53125,0 3.015625,-0.03125 3.3125,-0.03125 3.5625,-0.03125 4.046875,0 4.109375,0 v -0.25 c -0.453125,0 -0.515625,0 -0.515625,-0.296875 V -1.8125 c 0,-0.71875 0.578125,-1.0625 1.03125,-1.0625 0.484375,0 0.546875,0.375 0.546875,0.734375 v 1.59375 C 5.171875,-0.25 5.109375,-0.25 4.65625,-0.25 V 0 c 0.015625,0 0.5,-0.03125 0.796875,-0.03125 C 5.703125,-0.03125 6.1875,0 6.25,0 v -0.25 c -0.453125,0 -0.515625,0 -0.515625,-0.296875 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-6"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7136"+ d="m 2.703125,-2.78125 c -0.125,0.0625 -0.1875,0.171875 -0.1875,0.3125 0,0.1875 0.125,0.328125 0.328125,0.328125 0.1875,0 0.328125,-0.125 0.328125,-0.34375 0,-0.625 -0.96875,-0.625 -1.15625,-0.625 -1.046875,0 -1.6875,0.796875 -1.6875,1.609375 0,0.875 0.734375,1.5625 1.65625,1.5625 1.03125,0 1.28125,-0.8125 1.28125,-0.90625 0,-0.078125 -0.09375,-0.078125 -0.125,-0.078125 -0.09375,0 -0.09375,0.015625 -0.125,0.125 C 2.859375,-0.375 2.484375,-0.15625 2.0625,-0.15625 c -0.484375,0 -1.109375,-0.359375 -1.109375,-1.359375 0,-0.875 0.4375,-1.375 1.078125,-1.375 0.09375,0 0.421875,0 0.671875,0.109375 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-7"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7139"+ d="m 3.0625,-1.59375 c 0.15625,0 0.203125,0 0.203125,-0.140625 0,-0.625 -0.34375,-1.375 -1.390625,-1.375 -0.90625,0 -1.609375,0.71875 -1.609375,1.578125 0,0.890625 0.78125,1.59375 1.703125,1.59375 0.9375,0 1.296875,-0.75 1.296875,-0.90625 0,-0.015625 -0.015625,-0.09375 -0.125,-0.09375 -0.09375,0 -0.109375,0.046875 -0.125,0.109375 -0.21875,0.5625 -0.75,0.671875 -1,0.671875 C 1.6875,-0.15625 1.375,-0.296875 1.171875,-0.5625 0.90625,-0.890625 0.90625,-1.3125 0.90625,-1.59375 Z M 0.90625,-1.765625 C 0.984375,-2.75 1.609375,-2.90625 1.875,-2.90625 c 0.859375,0 0.890625,0.96875 0.90625,1.140625 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph4-0-7"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7142"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph4-1-4"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path7145"+ d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ </g>+ </defs>+ <sodipodi:namedview+ id="base"+ pagecolor="#ffffff"+ bordercolor="#666666"+ borderopacity="1.0"+ inkscape:pageopacity="0.0"+ inkscape:pageshadow="2"+ inkscape:zoom="1.979899"+ inkscape:cx="205.30681"+ inkscape:cy="54.433358"+ inkscape:document-units="mm"+ inkscape:current-layer="g7570"+ showgrid="false"+ inkscape:window-width="2560"+ inkscape:window-height="1377"+ inkscape:window-x="1912"+ inkscape:window-y="-8"+ inkscape:window-maximized="1"+ scale-x="1"+ fit-margin-top="0"+ fit-margin-left="0"+ fit-margin-right="0"+ fit-margin-bottom="0"+ showguides="false"+ inkscape:snap-global="false" />+ <metadata+ id="metadata1046">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ <dc:title></dc:title>+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <g+ inkscape:label="Layer 1"+ inkscape:groupmode="layer"+ id="layer1"+ transform="translate(-70.017142,-38.883438)">+ <g+ id="g7570"+ transform="matrix(2.8970627,0,0,2.8970627,-311.20236,20.025273)">+ <rect+ style="fill:#dee8ff;fill-opacity:1;stroke:#000000;stroke-width:0.17958751;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"+ id="rect7587"+ width="39.100163"+ height="12.788579"+ x="132.87738"+ y="8.1483479"+ rx="0.35856605" />+ <g+ id="g7628"+ transform="translate(-1.6277699e-6)">+ <use+ transform="matrix(0.35277778,0,0,0.35277778,81.361612,-66.562491)"+ id="use7264"+ y="232.45799"+ x="177.795"+ xlink:href="#glyph0-1-3"+ width="100%"+ height="100%"+ style="fill:#000000;fill-opacity:1" />+ <use+ transform="matrix(0.35277778,0,0,0.35277778,81.361612,-66.562491)"+ id="use7268"+ y="232.45799"+ x="217.756"+ xlink:href="#glyph0-3"+ width="100%"+ height="100%"+ style="fill:#000000;fill-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ style="fill:none;stroke:#000000;stroke-width:0.14057489;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="m 148.30258,14.565374 h 8.29441"+ id="path7272" />+ <use+ transform="matrix(0.27051176,0,0,0.27051176,97.941283,-47.96218)"+ id="use7274"+ y="227.623"+ x="190.77699"+ xlink:href="#glyph3-6"+ width="100%"+ height="100%"+ style="fill:#000000;fill-opacity:1" />+ <use+ transform="matrix(0.27051176,0,0,0.27051176,97.941283,-47.96218)"+ id="use7276"+ y="227.623"+ x="194.319"+ xlink:href="#glyph3-2-2"+ width="100%"+ height="100%"+ style="fill:#000000;fill-opacity:1" />+ <use+ transform="matrix(0.27051176,0,0,0.27051176,97.941283,-47.96218)"+ id="use7280"+ y="227.623"+ x="198.50676"+ xlink:href="#glyph3-7"+ width="100%"+ height="100%"+ style="fill:#000000;fill-opacity:1" />+ <use+ transform="matrix(0.27051176,0,0,0.27051176,97.941283,-47.96218)"+ id="use7282"+ y="227.623"+ x="202.04875"+ xlink:href="#glyph3-4-6"+ width="100%"+ height="100%"+ style="fill:#000000;fill-opacity:1" />+ <use+ transform="matrix(0.27051176,0,0,0.27051176,97.941283,-47.96218)"+ id="use7284"+ y="227.623"+ x="205.16185"+ xlink:href="#glyph3-6"+ width="100%"+ height="100%"+ style="fill:#000000;fill-opacity:1" />+ <use+ transform="matrix(0.27051176,0,0,0.27051176,97.941283,-47.96218)"+ id="use7286"+ y="227.623"+ x="208.70386"+ xlink:href="#glyph3-7"+ width="100%"+ height="100%"+ style="fill:#000000;fill-opacity:1" />+ <use+ transform="matrix(0.35277778,0,0,0.35277778,81.361612,-66.562491)"+ id="use7290"+ y="234.99001"+ x="198.39799"+ xlink:href="#glyph2-2"+ width="100%"+ height="100%"+ style="fill:#000000;fill-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ style="fill:none;stroke:#000000;stroke-width:0.2043449;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:1.43044, 0.81739501;stroke-dashoffset:0;stroke-opacity:1"+ d="m 142.68232,12.534146 c -5.75745,-4.0335176 -5.75745,8.094597 -0.11438,4.143761"+ id="path7294" />+ <path+ inkscape:connector-curvature="0"+ style="fill:none;stroke:#000000;stroke-width:0.20366174;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"+ d="m 141.54268,16.365092 c 0.39963,0.337619 0.77997,0.363802 1.08314,0.271473 -0.19017,0.253559 -0.29628,0.618739 -0.11576,1.110699"+ id="path7296" />+ <use+ transform="matrix(0.35277778,0,0,0.35277778,81.361612,-66.562491)"+ id="use7298"+ y="230.912"+ x="150.85699"+ xlink:href="#glyph1-2-1"+ width="100%"+ height="100%"+ style="fill:#000000;fill-opacity:1" />+ <use+ transform="matrix(0.35277778,0,0,0.35277778,81.178956,-66.379835)"+ id="use7302"+ y="230.912"+ x="156.355"+ xlink:href="#glyph2-1-6"+ width="100%"+ height="100%"+ style="fill:#000000;fill-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ style="fill:none;stroke:#000000;stroke-width:0.14057489;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ d="m 162.52806,16.6407 c 5.75745,4.03214 5.75745,-8.1841688 0.11576,-4.233334"+ id="path7306" />+ <path+ inkscape:connector-curvature="0"+ style="fill:none;stroke:#000000;stroke-width:0.14057218;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1"+ d="m 163.6677,12.720181 c -0.39963,-0.338997 -0.77997,-0.363802 -1.08176,-0.271473 0.18879,-0.253559 0.29628,-0.620118 0.11438,-1.110699"+ id="path7308" />+ <use+ transform="matrix(0.35277778,0,0,0.35277778,81.361612,-66.562491)"+ id="use7310"+ y="230.912"+ x="244.66299"+ xlink:href="#glyph1-2-1"+ width="100%"+ height="100%"+ style="fill:#000000;fill-opacity:1" />+ <use+ transform="matrix(0.35277778,0,0,0.35277778,81.178956,-66.379835)"+ id="use7314"+ y="230.912"+ x="250.161"+ xlink:href="#glyph2-1-6"+ width="100%"+ height="100%"+ style="fill:#000000;fill-opacity:1" />+ </g>+ </g>+ </g>+</svg>
+ img/intertwiner.svg view
@@ -0,0 +1,480 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="84.069908mm"+ height="70.023918mm"+ viewBox="0 0 84.069907 70.023918"+ version="1.1"+ id="svg1049"+ sodipodi:docname="intertwiner.svg"+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)">+ <defs+ id="defs1043">+ <g+ id="g1956">+ <symbol+ id="glyph0-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1923"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1926"+ d="M 1.78125,-1.140625 C 1.390625,-0.484375 1,-0.34375 0.5625,-0.3125 0.4375,-0.296875 0.34375,-0.296875 0.34375,-0.109375 0.34375,-0.046875 0.40625,0 0.484375,0 0.75,0 1.0625,-0.03125 1.328125,-0.03125 c 0.34375,0 0.6875,0.03125 1,0.03125 0.0625,0 0.1875,0 0.1875,-0.1875 0,-0.109375 -0.078125,-0.125 -0.15625,-0.125 -0.21875,-0.015625 -0.46875,-0.09375 -0.46875,-0.34375 0,-0.125 0.0625,-0.234375 0.140625,-0.375 l 0.765625,-1.265625 h 2.5 c 0.015625,0.203125 0.15625,1.5625 0.15625,1.65625 0,0.296875 -0.515625,0.328125 -0.71875,0.328125 C 4.59375,-0.3125 4.5,-0.3125 4.5,-0.109375 4.5,0 4.609375,0 4.640625,0 5.046875,0 5.46875,-0.03125 5.875,-0.03125 6.125,-0.03125 6.765625,0 7.015625,0 7.0625,0 7.1875,0 7.1875,-0.203125 7.1875,-0.3125 7.09375,-0.3125 6.953125,-0.3125 6.34375,-0.3125 6.34375,-0.375 6.3125,-0.671875 l -0.609375,-6.21875 c -0.015625,-0.203125 -0.015625,-0.25 -0.1875,-0.25 -0.15625,0 -0.203125,0.078125 -0.265625,0.171875 z M 2.984375,-2.609375 4.9375,-5.90625 5.265625,-2.609375 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1929"+ d="M 1.59375,-0.78125 C 1.5,-0.390625 1.46875,-0.3125 0.6875,-0.3125 c -0.171875,0 -0.265625,0 -0.265625,0.203125 C 0.421875,0 0.515625,0 0.6875,0 H 4.25 C 5.828125,0 7,-1.171875 7,-2.15625 7,-2.875 6.421875,-3.453125 5.453125,-3.5625 6.484375,-3.75 7.53125,-4.484375 7.53125,-5.4375 c 0,-0.734375 -0.65625,-1.375 -1.84375,-1.375 H 2.328125 c -0.1875,0 -0.28125,0 -0.28125,0.203125 0,0.109375 0.09375,0.109375 0.28125,0.109375 0.015625,0 0.203125,0 0.375,0.015625 0.171875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 -0.015625,0.0625 -0.03125,0.1875 z m 1.5,-2.875 0.625,-2.46875 C 3.8125,-6.46875 3.828125,-6.5 4.25,-6.5 h 1.296875 c 0.875,0 1.078125,0.59375 1.078125,1.03125 0,0.875 -0.859375,1.8125 -2.0625,1.8125 z m -0.4375,3.34375 c -0.140625,0 -0.15625,0 -0.21875,0 -0.109375,-0.015625 -0.140625,-0.03125 -0.140625,-0.109375 0,-0.03125 0,-0.046875 0.0625,-0.21875 l 0.6875,-2.78125 h 1.875 c 0.953125,0 1.15625,0.734375 1.15625,1.15625 C 6.078125,-1.28125 5.1875,-0.3125 4,-0.3125 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1932"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1935"+ d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1938"+ d="m 3.703125,-2.578125 c 0.03125,-0.09375 0.03125,-0.125 0.03125,-0.140625 0,-0.15625 -0.125,-0.21875 -0.234375,-0.21875 -0.15625,0 -0.296875,0.125 -0.328125,0.265625 -0.109375,-0.1875 -0.34375,-0.40625 -0.71875,-0.40625 -0.859375,0 -1.78125,0.9375 -1.78125,1.9375 0,0.71875 0.484375,1.140625 1.0625,1.140625 0.328125,0 0.625,-0.15625 0.875,-0.375 L 2.453125,0.25 C 2.375,0.546875 2.328125,0.734375 2.0625,0.96875 c -0.3125,0.25 -0.609375,0.25 -0.78125,0.25 -0.3125,0 -0.40625,-0.015625 -0.53125,-0.046875 0.171875,-0.078125 0.21875,-0.25 0.21875,-0.34375 0,-0.171875 -0.125,-0.25 -0.265625,-0.25 C 0.5,0.578125 0.296875,0.734375 0.296875,1 c 0,0.421875 0.609375,0.421875 1,0.421875 1.09375,0 1.546875,-0.5625 1.65625,-0.953125 z M 2.75,-0.921875 c -0.03125,0.09375 -0.03125,0.109375 -0.15625,0.25 C 2.359375,-0.375 2.015625,-0.1875 1.75,-0.1875 c -0.34375,0 -0.515625,-0.3125 -0.515625,-0.671875 0,-0.296875 0.1875,-1.078125 0.375,-1.390625 0.28125,-0.484375 0.609375,-0.625 0.84375,-0.625 0.5,0 0.625,0.515625 0.625,0.59375 0,0.015625 0,0.015625 -0.015625,0.09375 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1941"+ d="m 2.1875,-4.625 c 0,-0.015625 0.015625,-0.109375 0.015625,-0.109375 0,-0.046875 -0.015625,-0.109375 -0.109375,-0.109375 -0.140625,0 -0.71875,0.0625 -0.890625,0.078125 -0.046875,0 -0.15625,0.015625 -0.15625,0.15625 0,0.09375 0.109375,0.09375 0.1875,0.09375 0.328125,0 0.328125,0.0625 0.328125,0.109375 0,0.046875 -0.015625,0.09375 -0.015625,0.15625 L 0.5625,-0.3125 c -0.046875,0.125 -0.046875,0.140625 -0.046875,0.15625 0,0.109375 0.09375,0.21875 0.25,0.21875 0.078125,0 0.203125,-0.03125 0.28125,-0.171875 C 1.0625,-0.15625 1.125,-0.40625 1.15625,-0.546875 l 0.171875,-0.625 C 1.34375,-1.28125 1.421875,-1.546875 1.4375,-1.640625 1.5,-1.90625 1.5,-1.921875 1.640625,-2.140625 1.875,-2.484375 2.21875,-2.875 2.765625,-2.875 c 0.390625,0 0.40625,0.3125 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.3125,0.59375 0.65625,0.59375 0.703125,0 1.015625,-0.953125 1.015625,-1.0625 0,-0.09375 -0.09375,-0.09375 -0.125,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 -0.15625,0.5625 -0.46875,0.84375 -0.734375,0.84375 -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 C 3.40625,-1.15625 3.6875,-1.890625 3.6875,-2.28125 c 0,-0.109375 0,-0.40625 -0.25,-0.609375 -0.125,-0.078125 -0.328125,-0.1875 -0.65625,-0.1875 -0.5,0 -0.875,0.28125 -1.125,0.578125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1944"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1947"+ d="M 1.578125,-1.734375 C 1.578125,-2 1.375,-2.140625 1.1875,-2.140625 c -0.234375,0 -0.40625,0.1875 -0.40625,0.390625 0,0.25 0.203125,0.40625 0.390625,0.40625 0.234375,0 0.40625,-0.1875 0.40625,-0.390625 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1950"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1953"+ d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ </g>+ <g+ id="g6475">+ <symbol+ id="glyph0-0-9"+ overflow="visible">+ <path+ id="path6424"+ d=""+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph0-1-8"+ overflow="visible">+ <path+ id="path6427"+ d="M 1.78125 -1.140625 C 1.390625 -0.484375 1 -0.34375 0.5625 -0.3125 C 0.4375 -0.296875 0.34375 -0.296875 0.34375 -0.109375 C 0.34375 -0.046875 0.40625 0 0.484375 0 C 0.75 0 1.0625 -0.03125 1.328125 -0.03125 C 1.671875 -0.03125 2.015625 0 2.328125 0 C 2.390625 0 2.515625 0 2.515625 -0.1875 C 2.515625 -0.296875 2.4375 -0.3125 2.359375 -0.3125 C 2.140625 -0.328125 1.890625 -0.40625 1.890625 -0.65625 C 1.890625 -0.78125 1.953125 -0.890625 2.03125 -1.03125 L 2.796875 -2.296875 L 5.296875 -2.296875 C 5.3125 -2.09375 5.453125 -0.734375 5.453125 -0.640625 C 5.453125 -0.34375 4.9375 -0.3125 4.734375 -0.3125 C 4.59375 -0.3125 4.5 -0.3125 4.5 -0.109375 C 4.5 0 4.609375 0 4.640625 0 C 5.046875 0 5.46875 -0.03125 5.875 -0.03125 C 6.125 -0.03125 6.765625 0 7.015625 0 C 7.0625 0 7.1875 0 7.1875 -0.203125 C 7.1875 -0.3125 7.09375 -0.3125 6.953125 -0.3125 C 6.34375 -0.3125 6.34375 -0.375 6.3125 -0.671875 L 5.703125 -6.890625 C 5.6875 -7.09375 5.6875 -7.140625 5.515625 -7.140625 C 5.359375 -7.140625 5.3125 -7.0625 5.25 -6.96875 Z M 2.984375 -2.609375 L 4.9375 -5.90625 L 5.265625 -2.609375 Z M 2.984375 -2.609375 "+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph0-2-1"+ overflow="visible">+ <path+ id="path6430"+ d="M 1.59375 -0.78125 C 1.5 -0.390625 1.46875 -0.3125 0.6875 -0.3125 C 0.515625 -0.3125 0.421875 -0.3125 0.421875 -0.109375 C 0.421875 0 0.515625 0 0.6875 0 L 4.25 0 C 5.828125 0 7 -1.171875 7 -2.15625 C 7 -2.875 6.421875 -3.453125 5.453125 -3.5625 C 6.484375 -3.75 7.53125 -4.484375 7.53125 -5.4375 C 7.53125 -6.171875 6.875 -6.8125 5.6875 -6.8125 L 2.328125 -6.8125 C 2.140625 -6.8125 2.046875 -6.8125 2.046875 -6.609375 C 2.046875 -6.5 2.140625 -6.5 2.328125 -6.5 C 2.34375 -6.5 2.53125 -6.5 2.703125 -6.484375 C 2.875 -6.453125 2.96875 -6.453125 2.96875 -6.3125 C 2.96875 -6.28125 2.953125 -6.25 2.9375 -6.125 Z M 3.09375 -3.65625 L 3.71875 -6.125 C 3.8125 -6.46875 3.828125 -6.5 4.25 -6.5 L 5.546875 -6.5 C 6.421875 -6.5 6.625 -5.90625 6.625 -5.46875 C 6.625 -4.59375 5.765625 -3.65625 4.5625 -3.65625 Z M 2.65625 -0.3125 C 2.515625 -0.3125 2.5 -0.3125 2.4375 -0.3125 C 2.328125 -0.328125 2.296875 -0.34375 2.296875 -0.421875 C 2.296875 -0.453125 2.296875 -0.46875 2.359375 -0.640625 L 3.046875 -3.421875 L 4.921875 -3.421875 C 5.875 -3.421875 6.078125 -2.6875 6.078125 -2.265625 C 6.078125 -1.28125 5.1875 -0.3125 4 -0.3125 Z M 2.65625 -0.3125 "+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph1-0-4"+ overflow="visible">+ <path+ id="path6433"+ d=""+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph1-1-6"+ overflow="visible">+ <path+ id="path6436"+ d="M 0.515625 0.84375 C 0.46875 1.046875 0.453125 1.09375 0.1875 1.09375 C 0.09375 1.09375 0 1.09375 0 1.25 C 0 1.328125 0.0625 1.359375 0.09375 1.359375 C 0.265625 1.359375 0.5 1.328125 0.6875 1.328125 C 0.921875 1.328125 1.1875 1.359375 1.421875 1.359375 C 1.484375 1.359375 1.5625 1.328125 1.5625 1.203125 C 1.5625 1.09375 1.46875 1.09375 1.375 1.09375 C 1.21875 1.09375 1.03125 1.09375 1.03125 1.015625 C 1.03125 0.984375 1.09375 0.796875 1.109375 0.703125 C 1.203125 0.328125 1.296875 -0.046875 1.375 -0.34375 C 1.453125 -0.203125 1.671875 0.0625 2.09375 0.0625 C 2.9375 0.0625 3.875 -0.875 3.875 -1.90625 C 3.875 -2.71875 3.3125 -3.078125 2.84375 -3.078125 C 2.40625 -3.078125 2.03125 -2.78125 1.84375 -2.578125 C 1.734375 -2.984375 1.34375 -3.078125 1.125 -3.078125 C 0.859375 -3.078125 0.6875 -2.890625 0.578125 -2.703125 C 0.4375 -2.46875 0.328125 -2.046875 0.328125 -2 C 0.328125 -1.921875 0.421875 -1.921875 0.453125 -1.921875 C 0.546875 -1.921875 0.546875 -1.9375 0.59375 -2.125 C 0.703125 -2.53125 0.84375 -2.875 1.109375 -2.875 C 1.296875 -2.875 1.34375 -2.71875 1.34375 -2.53125 C 1.34375 -2.453125 1.328125 -2.375 1.3125 -2.328125 Z M 1.84375 -2.234375 C 2.25 -2.78125 2.59375 -2.875 2.8125 -2.875 C 3.09375 -2.875 3.328125 -2.671875 3.328125 -2.203125 C 3.328125 -1.921875 3.171875 -1.203125 2.96875 -0.796875 C 2.78125 -0.453125 2.453125 -0.125 2.09375 -0.125 C 1.59375 -0.125 1.46875 -0.65625 1.46875 -0.734375 C 1.46875 -0.765625 1.484375 -0.8125 1.484375 -0.84375 Z M 1.84375 -2.234375 "+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph1-2-5"+ overflow="visible">+ <path+ id="path6439"+ d="M 3.703125 -2.578125 C 3.734375 -2.671875 3.734375 -2.703125 3.734375 -2.71875 C 3.734375 -2.875 3.609375 -2.9375 3.5 -2.9375 C 3.34375 -2.9375 3.203125 -2.8125 3.171875 -2.671875 C 3.0625 -2.859375 2.828125 -3.078125 2.453125 -3.078125 C 1.59375 -3.078125 0.671875 -2.140625 0.671875 -1.140625 C 0.671875 -0.421875 1.15625 0 1.734375 0 C 2.0625 0 2.359375 -0.15625 2.609375 -0.375 L 2.453125 0.25 C 2.375 0.546875 2.328125 0.734375 2.0625 0.96875 C 1.75 1.21875 1.453125 1.21875 1.28125 1.21875 C 0.96875 1.21875 0.875 1.203125 0.75 1.171875 C 0.921875 1.09375 0.96875 0.921875 0.96875 0.828125 C 0.96875 0.65625 0.84375 0.578125 0.703125 0.578125 C 0.5 0.578125 0.296875 0.734375 0.296875 1 C 0.296875 1.421875 0.90625 1.421875 1.296875 1.421875 C 2.390625 1.421875 2.84375 0.859375 2.953125 0.46875 Z M 2.75 -0.921875 C 2.71875 -0.828125 2.71875 -0.8125 2.59375 -0.671875 C 2.359375 -0.375 2.015625 -0.1875 1.75 -0.1875 C 1.40625 -0.1875 1.234375 -0.5 1.234375 -0.859375 C 1.234375 -1.15625 1.421875 -1.9375 1.609375 -2.25 C 1.890625 -2.734375 2.21875 -2.875 2.453125 -2.875 C 2.953125 -2.875 3.078125 -2.359375 3.078125 -2.28125 C 3.078125 -2.265625 3.078125 -2.265625 3.0625 -2.1875 Z M 2.75 -0.921875 "+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph1-3-1"+ overflow="visible">+ <path+ id="path6442"+ d="M 2.1875 -4.625 C 2.1875 -4.640625 2.203125 -4.734375 2.203125 -4.734375 C 2.203125 -4.78125 2.1875 -4.84375 2.09375 -4.84375 C 1.953125 -4.84375 1.375 -4.78125 1.203125 -4.765625 C 1.15625 -4.765625 1.046875 -4.75 1.046875 -4.609375 C 1.046875 -4.515625 1.15625 -4.515625 1.234375 -4.515625 C 1.5625 -4.515625 1.5625 -4.453125 1.5625 -4.40625 C 1.5625 -4.359375 1.546875 -4.3125 1.546875 -4.25 L 0.5625 -0.3125 C 0.515625 -0.1875 0.515625 -0.171875 0.515625 -0.15625 C 0.515625 -0.046875 0.609375 0.0625 0.765625 0.0625 C 0.84375 0.0625 0.96875 0.03125 1.046875 -0.109375 C 1.0625 -0.15625 1.125 -0.40625 1.15625 -0.546875 L 1.328125 -1.171875 C 1.34375 -1.28125 1.421875 -1.546875 1.4375 -1.640625 C 1.5 -1.90625 1.5 -1.921875 1.640625 -2.140625 C 1.875 -2.484375 2.21875 -2.875 2.765625 -2.875 C 3.15625 -2.875 3.171875 -2.5625 3.171875 -2.390625 C 3.171875 -1.96875 2.875 -1.203125 2.765625 -0.90625 C 2.6875 -0.703125 2.65625 -0.640625 2.65625 -0.53125 C 2.65625 -0.15625 2.96875 0.0625 3.3125 0.0625 C 4.015625 0.0625 4.328125 -0.890625 4.328125 -1 C 4.328125 -1.09375 4.234375 -1.09375 4.203125 -1.09375 C 4.109375 -1.09375 4.109375 -1.046875 4.078125 -0.96875 C 3.921875 -0.40625 3.609375 -0.125 3.34375 -0.125 C 3.1875 -0.125 3.15625 -0.21875 3.15625 -0.375 C 3.15625 -0.53125 3.203125 -0.625 3.328125 -0.9375 C 3.40625 -1.15625 3.6875 -1.890625 3.6875 -2.28125 C 3.6875 -2.390625 3.6875 -2.6875 3.4375 -2.890625 C 3.3125 -2.96875 3.109375 -3.078125 2.78125 -3.078125 C 2.28125 -3.078125 1.90625 -2.796875 1.65625 -2.5 Z M 2.1875 -4.625 "+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph2-0-7"+ overflow="visible">+ <path+ id="path6445"+ d=""+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph2-1-5"+ overflow="visible">+ <path+ id="path6448"+ d="M 1.578125 -1.734375 C 1.578125 -2 1.375 -2.140625 1.1875 -2.140625 C 0.953125 -2.140625 0.78125 -1.953125 0.78125 -1.75 C 0.78125 -1.5 0.984375 -1.34375 1.171875 -1.34375 C 1.40625 -1.34375 1.578125 -1.53125 1.578125 -1.734375 Z M 1.578125 -1.734375 "+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph3-0-2"+ overflow="visible">+ <path+ id="path6451"+ d=""+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph3-1-3"+ overflow="visible">+ <path+ id="path6454"+ d="M 1.40625 -2.75 L 2.484375 -2.75 L 2.484375 -3 L 1.40625 -3 L 1.40625 -4.28125 L 1.15625 -4.28125 C 1.15625 -3.65625 0.875 -2.96875 0.203125 -2.953125 L 0.203125 -2.75 L 0.84375 -2.75 L 0.84375 -0.875 C 0.84375 -0.09375 1.4375 0.0625 1.828125 0.0625 C 2.296875 0.0625 2.609375 -0.328125 2.609375 -0.875 L 2.609375 -1.265625 L 2.375 -1.265625 L 2.375 -0.890625 C 2.375 -0.40625 2.15625 -0.15625 1.875 -0.15625 C 1.40625 -0.15625 1.40625 -0.734375 1.40625 -0.859375 Z M 1.40625 -2.75 "+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph3-2"+ overflow="visible">+ <path+ id="path6457"+ d="M 3.6875 -1.484375 C 3.6875 -2.359375 2.9375 -3.109375 1.984375 -3.109375 C 1.015625 -3.109375 0.265625 -2.359375 0.265625 -1.484375 C 0.265625 -0.625 1.03125 0.0625 1.984375 0.0625 C 2.921875 0.0625 3.6875 -0.625 3.6875 -1.484375 Z M 1.984375 -0.15625 C 1.71875 -0.15625 1.34375 -0.234375 1.109375 -0.578125 C 0.921875 -0.859375 0.90625 -1.21875 0.90625 -1.546875 C 0.90625 -1.84375 0.90625 -2.265625 1.15625 -2.5625 C 1.328125 -2.765625 1.625 -2.90625 1.984375 -2.90625 C 2.390625 -2.90625 2.6875 -2.71875 2.84375 -2.5 C 3.03125 -2.234375 3.046875 -1.875 3.046875 -1.546875 C 3.046875 -1.21875 3.03125 -0.84375 2.828125 -0.5625 C 2.640625 -0.296875 2.328125 -0.15625 1.984375 -0.15625 Z M 1.984375 -0.15625 "+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph3-3"+ overflow="visible">+ <path+ id="path6460"+ d="M 1.4375 -2.75 L 2.3125 -2.75 L 2.3125 -3 L 1.40625 -3 L 1.40625 -3.78125 C 1.40625 -4.421875 1.78125 -4.703125 2.078125 -4.703125 C 2.140625 -4.703125 2.21875 -4.703125 2.28125 -4.671875 C 2.1875 -4.625 2.125 -4.515625 2.125 -4.390625 C 2.125 -4.203125 2.265625 -4.078125 2.453125 -4.078125 C 2.640625 -4.078125 2.78125 -4.203125 2.78125 -4.390625 C 2.78125 -4.703125 2.46875 -4.90625 2.09375 -4.90625 C 1.546875 -4.90625 0.90625 -4.515625 0.90625 -3.78125 L 0.90625 -3 L 0.3125 -3 L 0.3125 -2.75 L 0.90625 -2.75 L 0.90625 -0.546875 C 0.90625 -0.25 0.84375 -0.25 0.390625 -0.25 L 0.390625 0 C 0.421875 0 0.90625 -0.03125 1.1875 -0.03125 C 1.484375 -0.03125 1.796875 -0.015625 2.09375 0 L 2.09375 -0.25 L 1.953125 -0.25 C 1.4375 -0.25 1.4375 -0.328125 1.4375 -0.5625 Z M 1.4375 -2.75 "+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph3-4"+ overflow="visible">+ <path+ id="path6463"+ d="M 1.390625 -1.59375 C 1.390625 -2.171875 1.65625 -2.875 2.328125 -2.875 C 2.265625 -2.828125 2.203125 -2.734375 2.203125 -2.625 C 2.203125 -2.390625 2.390625 -2.3125 2.515625 -2.3125 C 2.6875 -2.3125 2.84375 -2.421875 2.84375 -2.625 C 2.84375 -2.859375 2.609375 -3.078125 2.28125 -3.078125 C 1.9375 -3.078125 1.546875 -2.859375 1.34375 -2.328125 L 1.34375 -3.078125 L 0.34375 -3 L 0.34375 -2.75 C 0.8125 -2.75 0.859375 -2.703125 0.859375 -2.359375 L 0.859375 -0.546875 C 0.859375 -0.25 0.796875 -0.25 0.34375 -0.25 L 0.34375 0 C 0.375 0 0.84375 -0.03125 1.140625 -0.03125 C 1.4375 -0.03125 1.734375 -0.015625 2.046875 0 L 2.046875 -0.25 L 1.90625 -0.25 C 1.390625 -0.25 1.390625 -0.328125 1.390625 -0.5625 Z M 1.390625 -1.59375 "+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph3-5"+ overflow="visible">+ <path+ id="path6466"+ d="M 5.734375 -2.109375 C 5.734375 -2.71875 5.421875 -3.078125 4.6875 -3.078125 C 4.125 -3.078125 3.75 -2.78125 3.5625 -2.421875 C 3.421875 -2.921875 3.046875 -3.078125 2.546875 -3.078125 C 1.96875 -3.078125 1.609375 -2.765625 1.40625 -2.390625 L 1.40625 -3.078125 L 0.375 -3 L 0.375 -2.75 C 0.84375 -2.75 0.90625 -2.703125 0.90625 -2.359375 L 0.90625 -0.546875 C 0.90625 -0.25 0.828125 -0.25 0.375 -0.25 L 0.375 0 C 0.390625 0 0.875 -0.03125 1.171875 -0.03125 C 1.421875 -0.03125 1.90625 0 1.96875 0 L 1.96875 -0.25 C 1.515625 -0.25 1.453125 -0.25 1.453125 -0.546875 L 1.453125 -1.8125 C 1.453125 -2.53125 2.03125 -2.875 2.484375 -2.875 C 2.96875 -2.875 3.03125 -2.5 3.03125 -2.140625 L 3.03125 -0.546875 C 3.03125 -0.25 2.96875 -0.25 2.515625 -0.25 L 2.515625 0 C 2.53125 0 3.015625 -0.03125 3.3125 -0.03125 C 3.5625 -0.03125 4.046875 0 4.109375 0 L 4.109375 -0.25 C 3.65625 -0.25 3.59375 -0.25 3.59375 -0.546875 L 3.59375 -1.8125 C 3.59375 -2.53125 4.171875 -2.875 4.625 -2.875 C 5.109375 -2.875 5.171875 -2.5 5.171875 -2.140625 L 5.171875 -0.546875 C 5.171875 -0.25 5.109375 -0.25 4.65625 -0.25 L 4.65625 0 C 4.671875 0 5.15625 -0.03125 5.453125 -0.03125 C 5.703125 -0.03125 6.1875 0 6.25 0 L 6.25 -0.25 C 5.796875 -0.25 5.734375 -0.25 5.734375 -0.546875 Z M 5.734375 -2.109375 "+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph4-0"+ overflow="visible">+ <path+ id="path6469"+ d=""+ style="stroke:none;" />+ </symbol>+ <symbol+ id="glyph4-1"+ overflow="visible">+ <path+ id="path6472"+ d="M 2.9375 -6.375 C 2.9375 -6.625 2.9375 -6.640625 2.703125 -6.640625 C 2.078125 -6 1.203125 -6 0.890625 -6 L 0.890625 -5.6875 C 1.09375 -5.6875 1.671875 -5.6875 2.1875 -5.953125 L 2.1875 -0.78125 C 2.1875 -0.421875 2.15625 -0.3125 1.265625 -0.3125 L 0.953125 -0.3125 L 0.953125 0 C 1.296875 -0.03125 2.15625 -0.03125 2.5625 -0.03125 C 2.953125 -0.03125 3.828125 -0.03125 4.171875 0 L 4.171875 -0.3125 L 3.859375 -0.3125 C 2.953125 -0.3125 2.9375 -0.421875 2.9375 -0.78125 Z M 2.9375 -6.375 "+ style="stroke:none;" />+ </symbol>+ </g>+ </defs>+ <sodipodi:namedview+ id="base"+ pagecolor="#ffffff"+ bordercolor="#666666"+ borderopacity="1.0"+ inkscape:pageopacity="0.0"+ inkscape:pageshadow="2"+ inkscape:zoom="0.98994949"+ inkscape:cx="95.233701"+ inkscape:cy="118.35011"+ inkscape:document-units="mm"+ inkscape:current-layer="layer1"+ showgrid="false"+ inkscape:window-width="2560"+ inkscape:window-height="1377"+ inkscape:window-x="1912"+ inkscape:window-y="-8"+ inkscape:window-maximized="1"+ scale-x="1"+ fit-margin-top="0"+ fit-margin-left="0"+ fit-margin-right="0"+ fit-margin-bottom="0" />+ <metadata+ id="metadata1046">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ <dc:title></dc:title>+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <g+ inkscape:label="Layer 1"+ inkscape:groupmode="layer"+ id="layer1"+ transform="translate(-88.792046,-12.311137)">+ <g+ id="g2139"+ transform="matrix(3.1917579,0,0,3.1917579,-278.5311,-100.94807)">+ <g+ transform="matrix(0.35277778,0,0,0.35277778,65.649038,-6.5129672)"+ id="g1962"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use1960"+ y="136.382"+ x="153.57201"+ xlink:href="#glyph0-1"+ width="100%"+ height="100%" />+ </g>+ <g+ transform="matrix(0.35277778,0,0,0.35277778,65.649038,-6.5129672)"+ id="g1966"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use1964"+ y="136.382"+ x="194.118"+ xlink:href="#glyph0-1"+ width="100%"+ height="100%" />+ </g>+ <g+ transform="matrix(0.35277778,0,0,0.35277778,65.649038,-6.5129672)"+ id="g1970"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use1968"+ y="168.41499"+ x="153.28"+ xlink:href="#glyph0-2"+ width="100%"+ height="100%" />+ </g>+ <g+ transform="matrix(0.35277778,0,0,0.35277778,65.649038,-6.5129672)"+ id="g1974"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use1972"+ y="168.41499"+ x="193.826"+ xlink:href="#glyph0-2"+ width="100%"+ height="100%" />+ </g>+ <path+ id="path1976"+ d="m 121.14402,42.955848 v 6.045454"+ style="fill:none;stroke:#000000;stroke-width:0.14057489;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <path+ id="path1978"+ d="m 121.98737,48.341222 c -0.50574,0.13367 -0.74552,0.431326 -0.84336,0.73036 -0.0992,-0.299034 -0.33762,-0.59669 -0.84336,-0.73036"+ style="fill:none;stroke:#000000;stroke-width:0.14057489;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ transform="matrix(0.35277778,0,0,0.35277778,65.649038,-6.5129672)"+ id="g1982"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use1980"+ y="149.81799"+ x="150.85699"+ xlink:href="#glyph1-1"+ width="100%"+ height="100%" />+ </g>+ <path+ id="path1984"+ d="m 124.04479,40.72067 h 8.36055"+ style="fill:none;stroke:#000000;stroke-width:0.14057489;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <path+ id="path1986"+ d="m 131.74527,39.87731 c 0.13367,0.505741 0.43132,0.745519 0.73036,0.84336 -0.29904,0.09922 -0.59669,0.337619 -0.73036,0.843359"+ style="fill:none;stroke:#000000;stroke-width:0.14057489;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ transform="matrix(0.35277778,0,0,0.35277778,65.649038,-6.5129672)"+ id="g1990"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use1988"+ y="130.192"+ x="172.66901"+ xlink:href="#glyph1-2"+ width="100%"+ height="100%" />+ </g>+ <g+ transform="matrix(0.35277778,0,0,0.35277778,65.649038,-6.5129672)"+ id="g1994"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use1992"+ y="130.192"+ x="180.127"+ xlink:href="#glyph2-1"+ width="100%"+ height="100%" />+ </g>+ <path+ id="path1996"+ d="m 135.44805,42.955848 v 6.045454"+ style="fill:none;stroke:#000000;stroke-width:0.14057489;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <path+ id="path1998"+ d="m 136.29141,48.341222 c -0.50711,0.13367 -0.74551,0.431326 -0.84335,0.73036 -0.0992,-0.299034 -0.33762,-0.59669 -0.84336,-0.73036"+ style="fill:none;stroke:#000000;stroke-width:0.14057489;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ transform="matrix(0.35277778,0,0,0.35277778,65.649038,-6.5129672)"+ id="g2002"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use2000"+ y="149.81799"+ x="200.198"+ xlink:href="#glyph1-1"+ width="100%"+ height="100%" />+ </g>+ <path+ id="path2004"+ d="m 124.14814,52.021961 h 8.15385"+ style="fill:none;stroke:#000000;stroke-width:0.14057489;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:0.98404187, 0.56231014;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <path+ id="path2006"+ d="m 131.6419,51.178602 c 0.13367,0.50574 0.43133,0.74414 0.73037,0.843359 -0.29904,0.09784 -0.5967,0.33762 -0.73037,0.84336"+ style="fill:none;stroke:#000000;stroke-width:0.14057489;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ transform="matrix(0.35277778,0,0,0.35277778,65.649038,-6.5129672)"+ id="g2010"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use2008"+ y="173.11099"+ x="172.405"+ xlink:href="#glyph1-3"+ width="100%"+ height="100%" />+ </g>+ <g+ transform="matrix(0.35277778,0,0,0.35277778,65.649038,-6.5129672)"+ id="g2014"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use2012"+ y="173.11099"+ x="180.39"+ xlink:href="#glyph2-1"+ width="100%"+ height="100%" />+ </g>+ </g>+ </g>+</svg>
+ img/transport.svg view
@@ -0,0 +1,518 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ width="129.92967mm"+ height="74.033661mm"+ viewBox="0 0 129.92967 74.033661"+ version="1.1"+ id="svg1049"+ sodipodi:docname="transport.svg"+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)">+ <defs+ id="defs1043">+ <g+ id="g1956">+ <symbol+ id="glyph0-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1923"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1926"+ d="M 1.78125,-1.140625 C 1.390625,-0.484375 1,-0.34375 0.5625,-0.3125 0.4375,-0.296875 0.34375,-0.296875 0.34375,-0.109375 0.34375,-0.046875 0.40625,0 0.484375,0 0.75,0 1.0625,-0.03125 1.328125,-0.03125 c 0.34375,0 0.6875,0.03125 1,0.03125 0.0625,0 0.1875,0 0.1875,-0.1875 0,-0.109375 -0.078125,-0.125 -0.15625,-0.125 -0.21875,-0.015625 -0.46875,-0.09375 -0.46875,-0.34375 0,-0.125 0.0625,-0.234375 0.140625,-0.375 l 0.765625,-1.265625 h 2.5 c 0.015625,0.203125 0.15625,1.5625 0.15625,1.65625 0,0.296875 -0.515625,0.328125 -0.71875,0.328125 C 4.59375,-0.3125 4.5,-0.3125 4.5,-0.109375 4.5,0 4.609375,0 4.640625,0 5.046875,0 5.46875,-0.03125 5.875,-0.03125 6.125,-0.03125 6.765625,0 7.015625,0 7.0625,0 7.1875,0 7.1875,-0.203125 7.1875,-0.3125 7.09375,-0.3125 6.953125,-0.3125 6.34375,-0.3125 6.34375,-0.375 6.3125,-0.671875 l -0.609375,-6.21875 c -0.015625,-0.203125 -0.015625,-0.25 -0.1875,-0.25 -0.15625,0 -0.203125,0.078125 -0.265625,0.171875 z M 2.984375,-2.609375 4.9375,-5.90625 5.265625,-2.609375 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1929"+ d="M 1.59375,-0.78125 C 1.5,-0.390625 1.46875,-0.3125 0.6875,-0.3125 c -0.171875,0 -0.265625,0 -0.265625,0.203125 C 0.421875,0 0.515625,0 0.6875,0 H 4.25 C 5.828125,0 7,-1.171875 7,-2.15625 7,-2.875 6.421875,-3.453125 5.453125,-3.5625 6.484375,-3.75 7.53125,-4.484375 7.53125,-5.4375 c 0,-0.734375 -0.65625,-1.375 -1.84375,-1.375 H 2.328125 c -0.1875,0 -0.28125,0 -0.28125,0.203125 0,0.109375 0.09375,0.109375 0.28125,0.109375 0.015625,0 0.203125,0 0.375,0.015625 0.171875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 -0.015625,0.0625 -0.03125,0.1875 z m 1.5,-2.875 0.625,-2.46875 C 3.8125,-6.46875 3.828125,-6.5 4.25,-6.5 h 1.296875 c 0.875,0 1.078125,0.59375 1.078125,1.03125 0,0.875 -0.859375,1.8125 -2.0625,1.8125 z m -0.4375,3.34375 c -0.140625,0 -0.15625,0 -0.21875,0 -0.109375,-0.015625 -0.140625,-0.03125 -0.140625,-0.109375 0,-0.03125 0,-0.046875 0.0625,-0.21875 l 0.6875,-2.78125 h 1.875 c 0.953125,0 1.15625,0.734375 1.15625,1.15625 C 6.078125,-1.28125 5.1875,-0.3125 4,-0.3125 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1932"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1935"+ d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1938"+ d="m 3.703125,-2.578125 c 0.03125,-0.09375 0.03125,-0.125 0.03125,-0.140625 0,-0.15625 -0.125,-0.21875 -0.234375,-0.21875 -0.15625,0 -0.296875,0.125 -0.328125,0.265625 -0.109375,-0.1875 -0.34375,-0.40625 -0.71875,-0.40625 -0.859375,0 -1.78125,0.9375 -1.78125,1.9375 0,0.71875 0.484375,1.140625 1.0625,1.140625 0.328125,0 0.625,-0.15625 0.875,-0.375 L 2.453125,0.25 C 2.375,0.546875 2.328125,0.734375 2.0625,0.96875 c -0.3125,0.25 -0.609375,0.25 -0.78125,0.25 -0.3125,0 -0.40625,-0.015625 -0.53125,-0.046875 0.171875,-0.078125 0.21875,-0.25 0.21875,-0.34375 0,-0.171875 -0.125,-0.25 -0.265625,-0.25 C 0.5,0.578125 0.296875,0.734375 0.296875,1 c 0,0.421875 0.609375,0.421875 1,0.421875 1.09375,0 1.546875,-0.5625 1.65625,-0.953125 z M 2.75,-0.921875 c -0.03125,0.09375 -0.03125,0.109375 -0.15625,0.25 C 2.359375,-0.375 2.015625,-0.1875 1.75,-0.1875 c -0.34375,0 -0.515625,-0.3125 -0.515625,-0.671875 0,-0.296875 0.1875,-1.078125 0.375,-1.390625 0.28125,-0.484375 0.609375,-0.625 0.84375,-0.625 0.5,0 0.625,0.515625 0.625,0.59375 0,0.015625 0,0.015625 -0.015625,0.09375 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1941"+ d="m 2.1875,-4.625 c 0,-0.015625 0.015625,-0.109375 0.015625,-0.109375 0,-0.046875 -0.015625,-0.109375 -0.109375,-0.109375 -0.140625,0 -0.71875,0.0625 -0.890625,0.078125 -0.046875,0 -0.15625,0.015625 -0.15625,0.15625 0,0.09375 0.109375,0.09375 0.1875,0.09375 0.328125,0 0.328125,0.0625 0.328125,0.109375 0,0.046875 -0.015625,0.09375 -0.015625,0.15625 L 0.5625,-0.3125 c -0.046875,0.125 -0.046875,0.140625 -0.046875,0.15625 0,0.109375 0.09375,0.21875 0.25,0.21875 0.078125,0 0.203125,-0.03125 0.28125,-0.171875 C 1.0625,-0.15625 1.125,-0.40625 1.15625,-0.546875 l 0.171875,-0.625 C 1.34375,-1.28125 1.421875,-1.546875 1.4375,-1.640625 1.5,-1.90625 1.5,-1.921875 1.640625,-2.140625 1.875,-2.484375 2.21875,-2.875 2.765625,-2.875 c 0.390625,0 0.40625,0.3125 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.3125,0.59375 0.65625,0.59375 0.703125,0 1.015625,-0.953125 1.015625,-1.0625 0,-0.09375 -0.09375,-0.09375 -0.125,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 -0.15625,0.5625 -0.46875,0.84375 -0.734375,0.84375 -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 C 3.40625,-1.15625 3.6875,-1.890625 3.6875,-2.28125 c 0,-0.109375 0,-0.40625 -0.25,-0.609375 -0.125,-0.078125 -0.328125,-0.1875 -0.65625,-0.1875 -0.5,0 -0.875,0.28125 -1.125,0.578125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1944"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1947"+ d="M 1.578125,-1.734375 C 1.578125,-2 1.375,-2.140625 1.1875,-2.140625 c -0.234375,0 -0.40625,0.1875 -0.40625,0.390625 0,0.25 0.203125,0.40625 0.390625,0.40625 0.234375,0 0.40625,-0.1875 0.40625,-0.390625 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1950"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path1953"+ d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ </g>+ <g+ id="g6475">+ <symbol+ id="glyph0-0-9"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6424"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-1-8"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6427"+ d="M 1.78125,-1.140625 C 1.390625,-0.484375 1,-0.34375 0.5625,-0.3125 0.4375,-0.296875 0.34375,-0.296875 0.34375,-0.109375 0.34375,-0.046875 0.40625,0 0.484375,0 0.75,0 1.0625,-0.03125 1.328125,-0.03125 c 0.34375,0 0.6875,0.03125 1,0.03125 0.0625,0 0.1875,0 0.1875,-0.1875 0,-0.109375 -0.078125,-0.125 -0.15625,-0.125 -0.21875,-0.015625 -0.46875,-0.09375 -0.46875,-0.34375 0,-0.125 0.0625,-0.234375 0.140625,-0.375 l 0.765625,-1.265625 h 2.5 c 0.015625,0.203125 0.15625,1.5625 0.15625,1.65625 0,0.296875 -0.515625,0.328125 -0.71875,0.328125 C 4.59375,-0.3125 4.5,-0.3125 4.5,-0.109375 4.5,0 4.609375,0 4.640625,0 5.046875,0 5.46875,-0.03125 5.875,-0.03125 6.125,-0.03125 6.765625,0 7.015625,0 7.0625,0 7.1875,0 7.1875,-0.203125 7.1875,-0.3125 7.09375,-0.3125 6.953125,-0.3125 6.34375,-0.3125 6.34375,-0.375 6.3125,-0.671875 l -0.609375,-6.21875 c -0.015625,-0.203125 -0.015625,-0.25 -0.1875,-0.25 -0.15625,0 -0.203125,0.078125 -0.265625,0.171875 z M 2.984375,-2.609375 4.9375,-5.90625 5.265625,-2.609375 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph0-2-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6430"+ d="M 1.59375,-0.78125 C 1.5,-0.390625 1.46875,-0.3125 0.6875,-0.3125 c -0.171875,0 -0.265625,0 -0.265625,0.203125 C 0.421875,0 0.515625,0 0.6875,0 H 4.25 C 5.828125,0 7,-1.171875 7,-2.15625 7,-2.875 6.421875,-3.453125 5.453125,-3.5625 6.484375,-3.75 7.53125,-4.484375 7.53125,-5.4375 c 0,-0.734375 -0.65625,-1.375 -1.84375,-1.375 H 2.328125 c -0.1875,0 -0.28125,0 -0.28125,0.203125 0,0.109375 0.09375,0.109375 0.28125,0.109375 0.015625,0 0.203125,0 0.375,0.015625 0.171875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 -0.015625,0.0625 -0.03125,0.1875 z m 1.5,-2.875 0.625,-2.46875 C 3.8125,-6.46875 3.828125,-6.5 4.25,-6.5 h 1.296875 c 0.875,0 1.078125,0.59375 1.078125,1.03125 0,0.875 -0.859375,1.8125 -2.0625,1.8125 z m -0.4375,3.34375 c -0.140625,0 -0.15625,0 -0.21875,0 -0.109375,-0.015625 -0.140625,-0.03125 -0.140625,-0.109375 0,-0.03125 0,-0.046875 0.0625,-0.21875 l 0.6875,-2.78125 h 1.875 c 0.953125,0 1.15625,0.734375 1.15625,1.15625 C 6.078125,-1.28125 5.1875,-0.3125 4,-0.3125 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-0-4"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6433"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-1-6"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6436"+ d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-2-5"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6439"+ d="m 3.703125,-2.578125 c 0.03125,-0.09375 0.03125,-0.125 0.03125,-0.140625 0,-0.15625 -0.125,-0.21875 -0.234375,-0.21875 -0.15625,0 -0.296875,0.125 -0.328125,0.265625 -0.109375,-0.1875 -0.34375,-0.40625 -0.71875,-0.40625 -0.859375,0 -1.78125,0.9375 -1.78125,1.9375 0,0.71875 0.484375,1.140625 1.0625,1.140625 0.328125,0 0.625,-0.15625 0.875,-0.375 L 2.453125,0.25 C 2.375,0.546875 2.328125,0.734375 2.0625,0.96875 c -0.3125,0.25 -0.609375,0.25 -0.78125,0.25 -0.3125,0 -0.40625,-0.015625 -0.53125,-0.046875 0.171875,-0.078125 0.21875,-0.25 0.21875,-0.34375 0,-0.171875 -0.125,-0.25 -0.265625,-0.25 C 0.5,0.578125 0.296875,0.734375 0.296875,1 c 0,0.421875 0.609375,0.421875 1,0.421875 1.09375,0 1.546875,-0.5625 1.65625,-0.953125 z M 2.75,-0.921875 c -0.03125,0.09375 -0.03125,0.109375 -0.15625,0.25 C 2.359375,-0.375 2.015625,-0.1875 1.75,-0.1875 c -0.34375,0 -0.515625,-0.3125 -0.515625,-0.671875 0,-0.296875 0.1875,-1.078125 0.375,-1.390625 0.28125,-0.484375 0.609375,-0.625 0.84375,-0.625 0.5,0 0.625,0.515625 0.625,0.59375 0,0.015625 0,0.015625 -0.015625,0.09375 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph1-3-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6442"+ d="m 2.1875,-4.625 c 0,-0.015625 0.015625,-0.109375 0.015625,-0.109375 0,-0.046875 -0.015625,-0.109375 -0.109375,-0.109375 -0.140625,0 -0.71875,0.0625 -0.890625,0.078125 -0.046875,0 -0.15625,0.015625 -0.15625,0.15625 0,0.09375 0.109375,0.09375 0.1875,0.09375 0.328125,0 0.328125,0.0625 0.328125,0.109375 0,0.046875 -0.015625,0.09375 -0.015625,0.15625 L 0.5625,-0.3125 c -0.046875,0.125 -0.046875,0.140625 -0.046875,0.15625 0,0.109375 0.09375,0.21875 0.25,0.21875 0.078125,0 0.203125,-0.03125 0.28125,-0.171875 C 1.0625,-0.15625 1.125,-0.40625 1.15625,-0.546875 l 0.171875,-0.625 C 1.34375,-1.28125 1.421875,-1.546875 1.4375,-1.640625 1.5,-1.90625 1.5,-1.921875 1.640625,-2.140625 1.875,-2.484375 2.21875,-2.875 2.765625,-2.875 c 0.390625,0 0.40625,0.3125 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.3125,0.59375 0.65625,0.59375 0.703125,0 1.015625,-0.953125 1.015625,-1.0625 0,-0.09375 -0.09375,-0.09375 -0.125,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 -0.15625,0.5625 -0.46875,0.84375 -0.734375,0.84375 -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 C 3.40625,-1.15625 3.6875,-1.890625 3.6875,-2.28125 c 0,-0.109375 0,-0.40625 -0.25,-0.609375 -0.125,-0.078125 -0.328125,-0.1875 -0.65625,-0.1875 -0.5,0 -0.875,0.28125 -1.125,0.578125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-0-7"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6445"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph2-1-5"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6448"+ d="M 1.578125,-1.734375 C 1.578125,-2 1.375,-2.140625 1.1875,-2.140625 c -0.234375,0 -0.40625,0.1875 -0.40625,0.390625 0,0.25 0.203125,0.40625 0.390625,0.40625 0.234375,0 0.40625,-0.1875 0.40625,-0.390625 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-0-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6451"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-1-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6454"+ d="M 1.40625,-2.75 H 2.484375 V -3 H 1.40625 v -1.28125 h -0.25 c 0,0.625 -0.28125,1.3125 -0.953125,1.328125 V -2.75 H 0.84375 v 1.875 c 0,0.78125 0.59375,0.9375 0.984375,0.9375 0.46875,0 0.78125,-0.390625 0.78125,-0.9375 V -1.265625 H 2.375 v 0.375 c 0,0.484375 -0.21875,0.734375 -0.5,0.734375 -0.46875,0 -0.46875,-0.578125 -0.46875,-0.703125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-2"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6457"+ d="m 3.6875,-1.484375 c 0,-0.875 -0.75,-1.625 -1.703125,-1.625 -0.96875,0 -1.71875,0.75 -1.71875,1.625 0,0.859375 0.765625,1.546875 1.71875,1.546875 0.9375,0 1.703125,-0.6875 1.703125,-1.546875 z M 1.984375,-0.15625 c -0.265625,0 -0.640625,-0.078125 -0.875,-0.421875 -0.1875,-0.28125 -0.203125,-0.640625 -0.203125,-0.96875 0,-0.296875 0,-0.71875 0.25,-1.015625 0.171875,-0.203125 0.46875,-0.34375 0.828125,-0.34375 0.40625,0 0.703125,0.1875 0.859375,0.40625 0.1875,0.265625 0.203125,0.625 0.203125,0.953125 0,0.328125 -0.015625,0.703125 -0.21875,0.984375 -0.1875,0.265625 -0.5,0.40625 -0.84375,0.40625 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-3"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6460"+ d="m 1.4375,-2.75 h 0.875 V -3 H 1.40625 v -0.78125 c 0,-0.640625 0.375,-0.921875 0.671875,-0.921875 0.0625,0 0.140625,0 0.203125,0.03125 C 2.1875,-4.625 2.125,-4.515625 2.125,-4.390625 c 0,0.1875 0.140625,0.3125 0.328125,0.3125 0.1875,0 0.328125,-0.125 0.328125,-0.3125 0,-0.3125 -0.3125,-0.515625 -0.6875,-0.515625 -0.546875,0 -1.1875,0.390625 -1.1875,1.125 V -3 H 0.3125 v 0.25 h 0.59375 v 2.203125 C 0.90625,-0.25 0.84375,-0.25 0.390625,-0.25 V 0 C 0.421875,0 0.90625,-0.03125 1.1875,-0.03125 1.484375,-0.03125 1.796875,-0.015625 2.09375,0 V -0.25 H 1.953125 C 1.4375,-0.25 1.4375,-0.328125 1.4375,-0.5625 Z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-4"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6463"+ d="m 1.390625,-1.59375 c 0,-0.578125 0.265625,-1.28125 0.9375,-1.28125 -0.0625,0.046875 -0.125,0.140625 -0.125,0.25 0,0.234375 0.1875,0.3125 0.3125,0.3125 0.171875,0 0.328125,-0.109375 0.328125,-0.3125 0,-0.234375 -0.234375,-0.453125 -0.5625,-0.453125 -0.34375,0 -0.734375,0.21875 -0.9375,0.75 v -0.75 L 0.34375,-3 v 0.25 c 0.46875,0 0.515625,0.046875 0.515625,0.390625 v 1.8125 C 0.859375,-0.25 0.796875,-0.25 0.34375,-0.25 V 0 c 0.03125,0 0.5,-0.03125 0.796875,-0.03125 0.296875,0 0.59375,0.015625 0.90625,0.03125 V -0.25 H 1.90625 c -0.515625,0 -0.515625,-0.078125 -0.515625,-0.3125 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph3-5"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6466"+ d="m 5.734375,-2.109375 c 0,-0.609375 -0.3125,-0.96875 -1.046875,-0.96875 -0.5625,0 -0.9375,0.296875 -1.125,0.65625 -0.140625,-0.5 -0.515625,-0.65625 -1.015625,-0.65625 -0.578125,0 -0.9375,0.3125 -1.140625,0.6875 v -0.6875 L 0.375,-3 v 0.25 c 0.46875,0 0.53125,0.046875 0.53125,0.390625 v 1.8125 C 0.90625,-0.25 0.828125,-0.25 0.375,-0.25 V 0 C 0.390625,0 0.875,-0.03125 1.171875,-0.03125 1.421875,-0.03125 1.90625,0 1.96875,0 v -0.25 c -0.453125,0 -0.515625,0 -0.515625,-0.296875 V -1.8125 c 0,-0.71875 0.578125,-1.0625 1.03125,-1.0625 0.484375,0 0.546875,0.375 0.546875,0.734375 v 1.59375 C 3.03125,-0.25 2.96875,-0.25 2.515625,-0.25 V 0 C 2.53125,0 3.015625,-0.03125 3.3125,-0.03125 3.5625,-0.03125 4.046875,0 4.109375,0 v -0.25 c -0.453125,0 -0.515625,0 -0.515625,-0.296875 V -1.8125 c 0,-0.71875 0.578125,-1.0625 1.03125,-1.0625 0.484375,0 0.546875,0.375 0.546875,0.734375 v 1.59375 C 5.171875,-0.25 5.109375,-0.25 4.65625,-0.25 V 0 c 0.015625,0 0.5,-0.03125 0.796875,-0.03125 C 5.703125,-0.03125 6.1875,0 6.25,0 v -0.25 c -0.453125,0 -0.515625,0 -0.515625,-0.296875 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph4-0"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6469"+ d=""+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ <symbol+ id="glyph4-1"+ overflow="visible"+ style="overflow:visible">+ <path+ id="path6472"+ d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0"+ style="stroke:none"+ inkscape:connector-curvature="0" />+ </symbol>+ </g>+ </defs>+ <sodipodi:namedview+ id="base"+ pagecolor="#ffffff"+ bordercolor="#666666"+ borderopacity="1.0"+ inkscape:pageopacity="0.0"+ inkscape:pageshadow="2"+ inkscape:zoom="1.979899"+ inkscape:cx="294.1143"+ inkscape:cy="157.75308"+ inkscape:document-units="mm"+ inkscape:current-layer="layer1"+ showgrid="false"+ inkscape:window-width="2560"+ inkscape:window-height="1377"+ inkscape:window-x="1912"+ inkscape:window-y="-8"+ inkscape:window-maximized="1"+ scale-x="1"+ fit-margin-top="0"+ fit-margin-left="0"+ fit-margin-right="0"+ fit-margin-bottom="0" />+ <metadata+ id="metadata1046">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ <dc:title></dc:title>+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <g+ inkscape:label="Layer 1"+ inkscape:groupmode="layer"+ id="layer1"+ transform="translate(-65.424706,-25.139374)">+ <g+ id="g7079"+ transform="matrix(0.90819672,0,0,0.90819672,77.753524,-37.044205)">+ <g+ transform="matrix(1.1307079,0,0,1.1307079,-169.9466,-110.30598)"+ id="g6537"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use6535"+ y="196.33501"+ x="177.795"+ xlink:href="#glyph0-1-8"+ width="100%"+ height="100%" />+ </g>+ <g+ transform="matrix(1.1307079,0,0,1.1307079,-169.9466,-110.30598)"+ id="g6541"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use6539"+ y="196.33501"+ x="217.756"+ xlink:href="#glyph0-2-1"+ width="100%"+ height="100%" />+ </g>+ <path+ id="path6543"+ d="M 26.010385,102.36428 C 7.556879,89.440645 7.556879,128.30873 25.643789,115.64568"+ style="fill:none;stroke:#000000;stroke-width:0.4505645;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:3.15400797, 1.80229188;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <path+ id="path6545"+ d="m 22.357661,114.64748 c 1.28088,1.08212 2.499924,1.16163 3.471627,0.87012 -0.609522,0.80828 -0.949619,1.98315 -0.371013,3.55554"+ style="fill:none;stroke:#000000;stroke-width:0.4505558;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ transform="matrix(1.1307079,0,0,1.1307079,-169.9466,-110.30598)"+ id="g6549"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use6547"+ y="194.789"+ x="150.85699"+ xlink:href="#glyph1-2-5"+ width="100%"+ height="100%" />+ </g>+ <g+ transform="matrix(1.1307079,0,0,1.1307079,-169.9466,-110.30598)"+ id="g6553"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use6551"+ y="194.789"+ x="156.355"+ xlink:href="#glyph2-1-5"+ width="100%"+ height="100%" />+ </g>+ <path+ id="path6555"+ d="m 44.609644,103.50824 c 8.979422,-5.269275 17.539225,-5.33111 26.196208,-0.41076"+ style="fill:none;stroke:#000000;stroke-width:0.4505645;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <path+ id="path6557"+ d="m 70.297911,99.700936 c -0.428425,1.620974 0.02206,2.756104 0.702265,3.506964 -0.989359,-0.20318 -2.199565,-0.004 -3.370032,1.19254"+ style="fill:none;stroke:#000000;stroke-width:0.45054168;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ transform="matrix(0.99520934,0,0,0.99520934,-142.65098,-85.766022)"+ id="g6563"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use6559"+ y="183.218"+ x="197.944"+ xlink:href="#glyph3-1-3"+ width="100%"+ height="100%" />+ <use+ id="use6561"+ y="183.218"+ x="201.0571"+ xlink:href="#glyph3-2"+ width="100%"+ height="100%" />+ </g>+ <path+ id="path6565"+ d="m 90.456321,115.61918 c 18.457929,12.92364 18.457929,-26.408209 0.371021,-13.74516"+ style="fill:none;stroke:#000000;stroke-width:0.4505645;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <path+ id="path6567"+ d="m 94.113445,102.87222 c -1.280881,-1.08212 -2.50434,-1.16163 -3.471641,-0.87012 0.605121,-0.80828 0.949618,-1.98315 0.371021,-3.55996"+ style="fill:none;stroke:#000000;stroke-width:0.4505558;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ transform="matrix(1.1307079,0,0,1.1307079,-169.9466,-110.30598)"+ id="g6571"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use6569"+ y="194.78799"+ x="244.88699"+ xlink:href="#glyph1-2-5"+ width="100%"+ height="100%" />+ </g>+ <g+ transform="matrix(1.1307079,0,0,1.1307079,-169.9466,-110.30598)"+ id="g6575"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use6573"+ y="194.78799"+ x="250.384"+ xlink:href="#glyph2-1-5"+ width="100%"+ height="100%" />+ </g>+ <path+ id="path6577"+ d="m 71.198948,114.43106 c -9.050079,5.14118 -17.609882,5.07935 -26.200619,0.0397"+ style="fill:none;stroke:#000000;stroke-width:0.4505645;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <path+ id="path6579"+ d="m 45.457671,117.87176 c 0.4505,-1.61214 0.01823,-2.7561 -0.653703,-3.51579 0.989377,0.21642 2.199583,0.0353 3.392126,-1.14396"+ style="fill:none;stroke:#000000;stroke-width:0.45054132;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1"+ inkscape:connector-curvature="0" />+ <g+ transform="matrix(0.95302582,0,0,0.95302582,-134.14443,-73.545135)"+ id="g6589"+ style="fill:#000000;fill-opacity:1">+ <use+ id="use6581"+ y="209.313"+ x="193.437"+ xlink:href="#glyph3-3"+ width="100%"+ height="100%" />+ <use+ id="use6583"+ y="209.313"+ x="195.90712"+ xlink:href="#glyph3-4"+ width="100%"+ height="100%" />+ <use+ id="use6585"+ y="209.313"+ x="199.02022"+ xlink:href="#glyph3-2"+ width="100%"+ height="100%" />+ <use+ id="use6587"+ y="209.313"+ x="202.99181"+ xlink:href="#glyph3-5"+ width="100%"+ height="100%" />+ </g>+ </g>+ </g>+</svg>
+ src/Data/Act.hs view
@@ -0,0 +1,210 @@+{-# LANGUAGE + DeriveGeneric + , DeriveDataTypeable + , DerivingVia + , FlexibleContexts + , FlexibleInstances + , GeneralizedNewtypeDeriving + , MultiParamTypeClasses + , ScopedTypeVariables + , StandaloneDeriving + , UndecidableInstances +#-} + +{-| +Module: Data.Act + +An "Act" of a semigroup \( S \) on a type \( X \) gives a way to transform terms of type \( X \) by terms of type \( S \), +in a way that is compatible with the semigroup operation on \( S \). + +In the special case that there is a unique way of going from one term of type \( X \) to another +through a transformation by a term of type \( S \), we say that \( X \) is a torsor under \( S \). + +For example, the plane has an action by translations. Given any two points, there is a unique translation +that takes the first point to the second. Note that an unmarked plane (like a blank piece of paper) +has no designated origin or reference point, whereas the set of translations is a plane with a given origin +(the zero translation). This is the distinction between an affine space (an unmarked plane) and a vector space. +Enforcing this distinction in the types can help to avoid confusing absolute points with translation vectors. + + +Simple 'Act' and 'Torsor' instances can be derived through self-actions: + +> > newtype Seconds = Seconds { getSeconds :: Double } +> > deriving ( Act TimeDelta, Torsor TimeDelta ) +> > via TimeDelta +> > newtype TimeDelta = TimeDelta { timeDeltaInSeconds :: Seconds } +> > deriving ( Semigroup, Monoid, Group ) +> > via Sum Double + +-} + +module Data.Act + ( Act(..) + , transportAction + , Trivial(..) + , Torsor(..) + , intertwiner + ) + where + +-- base +import Data.Coerce + ( coerce ) +import Data.Data + ( Data ) +import Data.Functor.Const + ( Const(..) ) +import Data.Functor.Contravariant + ( Op(..) ) +import Data.Monoid + ( Any(..), All(..) + , Sum(..), Product(..) + , Ap(..), Endo(..) + ) +import Data.Semigroup + ( Max(..), Min(..), Dual(..) ) +import GHC.Generics + ( Generic, Generic1 ) + +-- deepseq +import Control.DeepSeq + ( NFData ) + +-- acts +import Data.Group + ( Group(..) ) + +----------------------------------------------------------------- + +-- | A left __act__ (or left __semigroup action__) of a semigroup @s@ on @x@ consists of an operation +-- +-- @(•) :: s -> x -> x@ +-- +-- such that: +-- +-- @a • ( b • x ) = ( a <> b ) • x@ +-- +-- In case @s@ is also a 'Monoid', we additionally require: +-- +-- @mempty • x = x@ +-- +-- The synonym @ act = (•) @ is also provided. +class Semigroup s => Act s x where + {-# MINIMAL (•) | act #-} + -- | Left action of a semigroup. + (•), act :: s -> x -> x + (•) = act + act = (•) + +infixr 5 • +infixr 5 `act` + +-- | Transport an act: +-- +-- <<img/transport.svg>> +transportAction :: ( a -> b ) -> ( b -> a ) -> ( g -> b -> b ) -> ( g -> a -> a ) +transportAction to from actBy g = from . actBy g . to + +-- | Natural left action of a semigroup on itself. +instance Semigroup s => Act s s where + (•) = (<>) + +-- | Trivial act of a semigroup on any type (acting by the identity). +newtype Trivial a = Trivial { getTrivial :: a } + deriving stock ( Show, Read, Data, Generic, Generic1 ) + deriving newtype ( Eq, Ord, Enum, Bounded, NFData ) +instance Semigroup s => Act s ( Trivial a ) where + act _ = id + +deriving via Any instance Act Any Bool +deriving via All instance Act All Bool +deriving via ( Sum a ) instance Num a => Act ( Sum a ) a +deriving via ( Product a ) instance Num a => Act ( Product a ) a +deriving via ( Max a ) instance Ord a => Act ( Max a ) a +deriving via ( Min a ) instance Ord a => Act ( Min a ) a + +instance {-# OVERLAPPING #-} Act () x where + act _ = id +instance ( Act s1 x1, Act s2 x2 ) + => Act ( s1, s2 ) ( x1,x2 ) where + act ( s1, s2 ) ( x1, x2 ) = + ( act s1 x1, act s2 x2 ) +instance ( Act s1 x1, Act s2 x2, Act s3 x3 ) + => Act ( s1, s2, s3 ) ( x1, x2, x3 ) where + act ( s1, s2, s3 ) ( x1, x2, x3 ) = + ( act s1 x1, act s2 x2, act s3 x3 ) +instance ( Act s1 x1, Act s2 x2, Act s3 x3, Act s4 x4 ) + => Act ( s1, s2, s3, s4 ) ( x1, x2, x3, x4 ) where + act ( s1, s2, s3, s4 ) ( x1, x2, x3, x4 ) = + ( act s1 x1, act s2 x2, act s3 x3, act s4 x4 ) +instance ( Act s1 x1, Act s2 x2, Act s3 x3, Act s4 x4, Act s5 x5 ) + => Act ( s1, s2, s3, s4, s5 ) ( x1, x2, x3, x4, x5 ) where + act ( s1, s2, s3, s4, s5 ) ( x1, x2, x3, x4, x5 ) = + ( act s1 x1, act s2 x2, act s3 x3, act s4 x4, act s5 x5 ) + +deriving newtype instance Act s a => Act s ( Const a b ) + +-- | Acting through a functor using @fmap@. +instance ( Act s x, Functor f ) => Act s ( Ap f x ) where + act s = coerce ( fmap ( act s ) :: f x -> f x ) + +-- | Acting through the contravariant function arrow functor. +instance ( Semigroup s, Act s a ) => Act ( Dual s ) ( Op b a ) where + act ( Dual s ) = coerce ( ( . act s ) :: ( a -> b ) -> ( a -> b ) ) + +-- | Acting through a function arrow: both covariant and contravariant actions. +instance ( Semigroup s, Act s a, Act t b ) => Act ( Dual s, t ) ( a -> b ) where + act ( Dual s, t ) p = act t . p . act s + +-- | Action of an opposite group using inverses. +instance {-# OVERLAPPABLE #-} ( Act g x, Group g ) => Act ( Dual g ) x where + act ( Dual g ) = act ( inverse g ) + +-- | Action of a group on endomorphisms. +instance ( Group g, Act g a ) => Act g ( Endo a ) where + act g = coerce ( act ( Dual g, g ) :: ( a -> a ) -> ( a -> a ) ) + +----------------------------------------------------------------- + +-- | A left __torsor__ consists of a /free/ and /transitive/ left action of a group on an inhabited type. +-- +-- This precisely means that for any two terms @x@, @y@, there exists a /unique/ group element @g@ taking @x@ to @y@, +-- which is denoted @ y <-- x @ (or @ x --> y @, but the left-pointing arrow is more natural when working with left actions). +-- +-- That is @ y <-- x @ is the /unique/ element satisfying: +-- +-- @( y <-- x ) • x = y@ +-- +-- +-- Note the order of composition of @<--@ and @-->@ with respect to @<>@: +-- +-- > ( z <-- y ) <> ( y <-- x ) = z <-- x +-- +-- > ( y --> z ) <> ( x --> y ) = x --> z +class ( Group g, Act g x ) => Torsor g x where + {-# MINIMAL (-->) | (<--) #-} + -- | Unique group element effecting the given transition + (<--), (-->) :: x -> x -> g + (-->) = flip (<--) + (<--) = flip (-->) + +infix 7 --> +infix 7 <-- + +-- | Any group is a torsor under its own natural left action. +instance Group g => Torsor g g where + h <-- g = h <> inverse g + +deriving via ( Sum a ) instance Num a => Torsor ( Sum a ) a + +-- | Given +-- +-- * \( g \in G \) acting on \( A \), +-- * \( B \) a torsor under \( H \), +-- * a map \( p \colon A \to B \), +-- +-- this function returns the unique element \( h \in H \) making the following diagram commute: +-- +-- <<img/intertwiner.svg>> +intertwiner :: forall h g a b. ( Act g a, Torsor h b ) => g -> ( a -> b ) -> a -> h +intertwiner g p a = p a --> p ( g • a )
+ src/Data/Group.hs view
@@ -0,0 +1,251 @@+{-# LANGUAGE + DataKinds + , DeriveAnyClass + , DeriveDataTypeable + , DeriveGeneric + , DerivingVia + , GeneralizedNewtypeDeriving + , KindSignatures + , ScopedTypeVariables + , StandaloneDeriving + , TypeApplications + , TypeOperators + , UndecidableInstances +#-} + +{-| +Module: Data.Group + +A 'Group' is a 'Monoid' for which the monoid operation can be undone. + +That is, \( G \) is a group if each \( g \in G \) has an inverse element \( g^{ -1 } \) such that + +\[ g^{ -1 } < \! > g = \text{mempty} = g < \! > g^{ -1 } \] + +Such inverses are necessarily unique. + + +In Haskell, groups are mostly useful to describe objects possessing certain symmetries (such as translation or rotation). + +To automatically derive 'Group' instances, you can: + +- Use @DerivingVia@ to coerce an existing instance: + +> > newtype Seconds = Seconds { getSeconds :: Double } +> > newtype TimeDelta = TimeDelta { timeDeltaInSeconds :: Seconds } +> > deriving ( Semigroup, Monoid, Group ) +> > via Sum Double + +- Use 'Generic' and 'Generic.Data.Generically': + +> > data MyRecord +> > = MyRecord +> > { field1 :: Sum Double +> > , field2 :: Product Double +> > , field3 :: Ap [] ( Sum Int, Sum Int ) +> > } +> > deriving Generic +> > deriving ( Semigroup, Monoid, Group ) +> > via Generically MyRecord +-} + + +module Data.Group + ( Group(..) + , Isom(..) + ) + where + +-- base +import Control.Monad.ST + ( ST ) +import Data.Data + ( Data ) +import Data.Functor.Const + ( Const(..) ) +import Data.Functor.Contravariant + ( Op(..) ) +import Data.Functor.Identity + ( Identity(..) ) +import Data.Monoid + ( Ap(..), Sum(..), Product(..) ) +import Data.Ord + ( Down(..) ) +import Data.Semigroup + ( Semigroup(..), Dual(..) ) +import Data.Proxy + ( Proxy(..) ) +import GHC.Generics + ( Generic, Generic1 + , U1(..), Rec1(..), M1(..), K1(..), Par1(..), (:*:)(..) + , V1, (:+:) + ) +import qualified GHC.Generics as Generic + ( Generic(..) ) +import GHC.TypeLits + ( TypeError, ErrorMessage(Text) ) + +-- deepseq +import Control.DeepSeq + ( NFData ) + +-- generic-data +import Generic.Data + ( Generically(..) ) + +----------------------------------------------------------------------- + +-- | A 'Group' is a 'Monoid' with inverses: +-- +-- * @ inverse g <> g = g <> inverse g = mempty @ +-- +-- * @ inverse (g <> h) = inverse h <> inverse g @ +class Monoid g => Group g where + {-# MINIMAL inverse | gtimes #-} + -- | Group inversion anti-homomorphism. + inverse :: g -> g + inverse = gtimes ( (-1) :: Int ) + + -- | Take the @n@-th power of an element. + gtimes :: Integral n => n -> g -> g + gtimes n = case compare n 0 of + EQ -> const mempty + GT -> stimes n + LT -> stimes ( negate n ) . inverse + +----------------------------------------------------------------------- +-- Instances. + +-- | Trivial group. +instance Group () where + inverse _ = () + gtimes _ _ = () + +-- | Additive groups (via 'Num'). +instance Num a => Group ( Sum a ) where + inverse ( Sum a ) = Sum ( negate a ) + gtimes n ( Sum a ) = Sum ( fromIntegral n * a ) + +-- | Multiplicative group (via 'Num'). +instance Fractional a => Group ( Product a ) where + inverse ( Product a ) = Product ( recip a ) + gtimes n ( Product a ) = Product ( a ^^ toInteger n ) + +-- | Opposite group. +instance Group a => Group ( Dual a ) where + inverse ( Dual a ) = Dual ( inverse a ) + gtimes n ( Dual a ) = Dual ( gtimes n a ) + +-- | Lifting group operations through an applicative functor. +instance ( Group a, Applicative f ) => Group ( Ap f a ) where + inverse = fmap inverse + gtimes n = fmap ( gtimes n ) + +deriving via Ap ((->) r) a instance Group a => Group ( r -> a ) +deriving via Ap IO a instance Group a => Group ( IO a ) +deriving via Ap (ST s) a instance Group a => Group ( ST s a ) + +deriving newtype instance Group a => Group ( Down a ) +deriving newtype instance Group a => Group ( Identity a ) +deriving newtype instance Group a => Group ( Const a b ) +deriving newtype instance Group a => Group ( Op a b ) + +instance Group ( Proxy p ) where + inverse _ = Proxy + gtimes _ _ = Proxy + +instance ( Group g1, Group g2 ) + => Group ( g1, g2 ) where + inverse ( g1, g2 ) = + ( inverse g1, inverse g2 ) + gtimes n ( g1, g2 ) = + ( gtimes n g1, gtimes n g2 ) + +instance ( Group g1, Group g2, Group g3 ) + => Group ( g1, g2, g3 ) where + inverse ( g1, g2, g3 ) = + ( inverse g1, inverse g2, inverse g3 ) + gtimes n ( g1, g2, g3 ) = + ( gtimes n g1, gtimes n g2, gtimes n g3 ) + +instance ( Group g1, Group g2, Group g3, Group g4 ) + => Group ( g1, g2, g3, g4 ) where + inverse ( g1, g2, g3, g4 ) = + ( inverse g1, inverse g2, inverse g3, inverse g4 ) + gtimes n ( g1, g2, g3, g4 ) = + ( gtimes n g1, gtimes n g2, gtimes n g3, gtimes n g4 ) + +instance ( Group g1, Group g2, Group g3, Group g4, Group g5 ) + => Group ( g1, g2, g3, g4, g5 ) where + inverse ( g1, g2, g3, g4, g5 ) = + ( inverse g1, inverse g2, inverse g3, inverse g4, inverse g5 ) + gtimes n ( g1, g2, g3, g4, g5 ) = + ( gtimes n g1, gtimes n g2, gtimes n g3, gtimes n g4, gtimes n g5 ) + +infix 7 :|: +-- | Data type to keep track of a pair of inverse elements. +data Isom a = (:|:) { to :: a, from :: Dual a } + deriving stock ( Show, Read, Data, Generic, Generic1 ) + deriving anyclass NFData +instance Semigroup a => Semigroup ( Isom a ) where + ( p1 :|: q1 ) <> ( p2 :|: q2 ) = ( p1 <> p2 ) :|: ( q1 <> q2 ) +instance Monoid a => Monoid ( Isom a ) where + mempty = mempty :|: mempty +instance Monoid a => Group ( Isom a ) where + inverse ( p :|: q ) = getDual q :|: Dual p + +-- Generics. + +instance Group ( U1 p ) where + inverse _ = U1 + gtimes _ _ = U1 + +deriving newtype instance Group ( f p ) => Group ( Rec1 f p ) +deriving newtype instance Group ( f p ) => Group ( M1 i c f p ) +deriving newtype instance Group g => Group ( K1 i g p ) +deriving newtype instance Group g => Group ( Par1 g ) + +instance ( Group ( f1 p ), Group ( f2 p ) ) => Group ( (f1 :*: f2) p ) where + inverse ( g1 :*: g2 ) = ( inverse g1 :*: inverse g2 ) + gtimes n ( g1 :*: g2 ) = ( gtimes n g1 :*: gtimes n g2 ) + +instance + ( Generic g + , Monoid ( Generic.Rep g () ) + , GGroup ( Generic.Rep g ) + ) + => Group ( Generically g ) where + inverse = Generically . Generic.to . ginverse . Generic.from . unGenerically + gtimes n = Generically . Generic.to . ggtimes n . Generic.from . unGenerically + +-- | Type class used for deriving 'Group' instances generically. +class GGroup f where + ginverse :: f p -> f p + ggtimes :: Integral n => n -> f p -> f p + +instance GGroup U1 where + ginverse _ = U1 + ggtimes _ _ = U1 + +deriving newtype instance GGroup f => GGroup ( Rec1 f ) +deriving newtype instance GGroup f => GGroup ( M1 i c f ) + +instance Group g => GGroup ( K1 i g ) where + ginverse ( K1 g ) = K1 ( inverse g ) + ggtimes n ( K1 g ) = K1 ( gtimes n g ) + +instance ( GGroup f1, GGroup f2 ) => GGroup ( f1 :*: f2 ) where + ginverse ( g1 :*: g2 ) = ( ginverse g1 :*: ginverse g2 ) + ggtimes n ( g1 :*: g2 ) = ( ggtimes n g1 :*: ggtimes n g2 ) + +instance + TypeError ( 'Text "No 'Group' instance for empty generic representation." ) + => GGroup V1 where + ginverse _ = error "unreachable" + ggtimes _ _ = error "unreachable" + +instance + TypeError ( 'Text "No 'Group' instance for generic sum type." ) + => GGroup ( f1 :+: f2 ) where + ginverse _ = error "unreachable" + ggtimes _ _ = error "unreachable"
+ src/Data/Group/Cyclic.hs view
@@ -0,0 +1,175 @@+{-# LANGUAGE + DataKinds + , DeriveDataTypeable + , DeriveGeneric + , DerivingVia + , FlexibleContexts + , FlexibleInstances + , GADTs + , GeneralizedNewtypeDeriving + , MultiParamTypeClasses + , PatternSynonyms + , PolyKinds + , ScopedTypeVariables + , StandaloneDeriving + , TypeApplications + , TypeFamilies + , TypeOperators + , ViewPatterns +#-} + +{-| +Module: Data.Group.Cyclic + +Cyclic groups: integers modulo @n@ (clock arithmetic). +-} + +module Data.Group.Cyclic + ( Cyclic(Cyclic), getCyclic + , C, Z + , CyclicEnum(..) + , pattern Involution, involution + , rootOfUnity + ) + where + +-- base +import Data.Coerce + ( coerce ) +import Data.Complex + ( Complex(..), conjugate, mkPolar ) +import Data.Data + ( Data ) +import Data.Monoid + ( Sum(..), Product(..) ) +import Data.Proxy + ( Proxy(..) ) +import GHC.Generics + ( Generic, Generic1 ) +import GHC.TypeNats + ( Nat, KnownNat, natVal + , type (<=) + ) + +-- deepseq +import Control.DeepSeq + ( NFData ) + +-- finite-typelits +import Data.Finite + ( Finite, getFinite ) + +-- acts +import Data.Act + ( Act(..), Torsor(..) ) +import Data.Group + ( Group(..) ) + +----------------------------------------------------------------- + +-- | Cyclic group of order @n@: integers with addition modulo @n@. +newtype Cyclic n = MkCyclic { runCyclic :: Finite n } + deriving stock ( Show, Generic, Generic1 ) + deriving newtype ( Eq, Ord, Enum, Bounded, NFData ) +deriving via ( Sum ( Finite n ) ) instance KnownNat n => Semigroup ( Cyclic n ) +deriving via ( Sum ( Finite n ) ) instance ( KnownNat n, 1 <= n ) => Monoid ( Cyclic n ) +deriving via ( Sum ( Finite n ) ) instance ( KnownNat n, 1 <= n ) => Group ( Cyclic n ) + +{-# COMPLETE Cyclic #-} +-- | Smart pattern and constructor for elements of cyclic groups. +pattern Cyclic :: forall n. KnownNat n => Int -> Cyclic n +pattern Cyclic i <- ( fromIntegral . getFinite . runCyclic -> i ) + where + Cyclic i = MkCyclic ( fromIntegral ( i `mod` ( fromIntegral ( natVal ( Proxy @n ) ) ) ) ) + +-- | Obtain a representative in the range \( [0, n[ \). +getCyclic :: forall n. KnownNat n => Cyclic n -> Int +getCyclic ( Cyclic i ) = i + +-- | Synonym for finite cyclic group. +type C ( n :: Nat ) = Cyclic n +-- | Synonym for infinite cyclic group. +type Z = Sum Int + +instance KnownNat n => Act ( Cyclic n ) Int where + act ( Cyclic f ) j + | r + i >= n + = ( i - n ) + j + | otherwise + = i + j + where + i, n, r :: Int + i = fromIntegral f + n = fromIntegral ( natVal ( Proxy @n ) ) + r = j `mod` n + +-- | Nontrivial element of cyclic group of order 2. +pattern Involution :: Cyclic 2 +pattern Involution = Cyclic 1 + +-- | Act by an involution. +involution :: Act ( Cyclic 2 ) x => x -> x +involution = act Involution + +instance Act ( Cyclic 2 ) Bool where + act Involution = not + act _ = id + +instance Num i => Act ( Cyclic 2 ) ( Sum i ) where + act Involution = coerce ( negate :: i -> i ) + act _ = id + +instance Fractional i => Act ( Cyclic 2 ) ( Product i ) where + act Involution = coerce ( recip :: i -> i ) + act _ = id + +instance Num a => Act ( Cyclic 2 ) ( Complex a ) where + act Involution = conjugate + act _ = id + +-- | Natural complex representations of finite cyclic groups as roots of unity. +rootOfUnity :: forall a n. ( KnownNat n, Floating a ) => Cyclic n -> Complex a +rootOfUnity ( Cyclic f ) = mkPolar 1 ( 2 * pi * i / n ) + where + i, n :: a + i = fromIntegral f + n = fromIntegral ( natVal ( Proxy @n ) ) + +-- | Newtype for cycling through elements in a finite enumeration. +-- +-- > data ABCD = A | B | C | D +-- > deriving stock ( Enum, Bounded ) +-- > deriving ( Act ( Cyclic 4 ), Torsor ( Cyclic 4 ) ) +-- > via CyclicEnum ABCD +-- +-- > > act ( Cyclic 2 ) C +-- > A +-- +-- > > act ( Cyclic (-1) ) A +-- > D +-- +-- > > ( C --> B :: Cyclic 4 ) +-- > Cyclic 3 +-- +-- __Warning__ +-- It is unfortunately not checked that the size of the group +-- matches the size of the finite enumeration. +-- Please manually ensure this condition. +newtype CyclicEnum a = CyclicEnum { getCyclicEnum :: a } + deriving stock ( Show, Data, Generic, Generic1 ) + deriving newtype ( Eq, Ord, Enum, Bounded, NFData ) + +instance ( Enum a, Bounded a, KnownNat n ) => Act ( Cyclic n ) ( CyclicEnum a ) where + act ( Cyclic f ) a = toEnum j + where + b_min, b_max, i, j :: Int + b_min = fromEnum ( minBound @a ) + b_max = fromEnum ( maxBound @a ) + i = fromIntegral f + j = b_min + ( fromEnum a + i - b_min ) `mod` ( 1 + b_max - b_min ) + -- Assumes n ~ ( 1 + b_max - b_min ). +instance ( Enum a, Bounded a, KnownNat n, 1 <= n ) => Torsor ( Cyclic n ) ( CyclicEnum a ) where + a --> b = Cyclic . fromIntegral . ( `mod` n ) $ fromEnum b - fromEnum a + where + n :: Int + n = fromIntegral ( natVal ( Proxy @n ) )