packages feed

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 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 ) )