-- | Inspired by https://hackage.haskell.org/package/VectorFont
module Brillo.Internals.Rendering.VectorFont (
  VectorFont,
  VFWidth,
  VFPoint,
  VFStroke,
  VFGlyph,
  render,
  renderSafe,
  optimizeStrokes,
  canvastextFont,
) where

import Control.Monad (replicateM, (>=>))
import Data.Either (partitionEithers)
import Data.List (minimumBy, permutations)
import Data.Map (Map, findWithDefault, fromList, lookup)
import Data.Ord (comparing)


type VFWidth = Double
type VFPoint = (Double, Double)


-- | @VFStroke@ is a series of points joined by straight lines.
type VFStroke = [VFPoint]


-- | @VFGlyph@ is the symbol's width, plus the strokes needed to draw it
type VFGlyph = (VFWidth, [VFStroke])


dist :: VFPoint -> VFPoint -> Double
dist :: VFPoint -> VFPoint -> Double
dist (Double
xa, Double
ya) (Double
xb, Double
yb) =
  Double -> Double
forall a. Floating a => a -> a
sqrt (Double -> Double) -> Double -> Double
forall a b. (a -> b) -> a -> b
$ (Double
xa Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
xb) Double -> Int -> Double
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
2 :: Int) Double -> Double -> Double
forall a. Num a => a -> a -> a
+ (Double
ya Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
yb) Double -> Int -> Double
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
2 :: Int)


-- | @VectorFont@ is a map from @Char@ to @VFGlyph@
newtype VectorFont = VectorFont (Map Char VFGlyph)


{-| Given a @VectorFont@ and a @String@, return
  * @Right@ strokes if the @String@ can be rendered.
  * @Left@ error otherwise.
-}
render :: VectorFont -> String -> Either String [VFStroke]
render :: VectorFont -> String -> Either String [VFStroke]
render VectorFont
f =
  VectorFont -> String -> Either String [VFGlyph]
getGlyphs VectorFont
f (String -> Either String [VFGlyph])
-> ([VFGlyph] -> Either String [VFStroke])
-> String
-> Either String [VFStroke]
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> ([VFStroke] -> Either String [VFStroke]
forall a b. b -> Either a b
Right ([VFStroke] -> Either String [VFStroke])
-> ([VFGlyph] -> [VFStroke])
-> [VFGlyph]
-> Either String [VFStroke]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> [VFGlyph] -> [VFStroke]
renderLine Double
0)


getGlyphs :: VectorFont -> String -> Either String [VFGlyph]
getGlyphs :: VectorFont -> String -> Either String [VFGlyph]
getGlyphs VectorFont
f =
  Either String [VFGlyph] -> Either String [VFGlyph]
forall a. Either String a -> Either String a
addErrorMsg (Either String [VFGlyph] -> Either String [VFGlyph])
-> (String -> Either String [VFGlyph])
-> String
-> Either String [VFGlyph]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Either Char VFGlyph] -> Either String [VFGlyph]
forall a b. [Either a b] -> Either [a] [b]
leftsOrRights ([Either Char VFGlyph] -> Either String [VFGlyph])
-> (String -> [Either Char VFGlyph])
-> String
-> Either String [VFGlyph]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Either Char VFGlyph) -> String -> [Either Char VFGlyph]
forall a b. (a -> b) -> [a] -> [b]
map (VectorFont -> Char -> Either Char VFGlyph
getGlyph VectorFont
f)


addErrorMsg :: Either String a -> Either String a
addErrorMsg :: forall a. Either String a -> Either String a
addErrorMsg (Left String
a) = String -> Either String a
forall a b. a -> Either a b
Left (String -> Either String a) -> String -> Either String a
forall a b. (a -> b) -> a -> b
$ String
"Missing chars: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
a
addErrorMsg Either String a
a = Either String a
a


-- | Like @T.sequence@ but gives all the @Left@s if any exist
leftsOrRights :: [Either a b] -> Either [a] [b]
leftsOrRights :: forall a b. [Either a b] -> Either [a] [b]
leftsOrRights = do
  let
    pick :: ([a], b) -> Either [a] b
pick ([], b
bs) = b -> Either [a] b
forall a b. b -> Either a b
Right b
bs
    pick ([a]
as, b
_) = [a] -> Either [a] b
forall a b. a -> Either a b
Left [a]
as
  ([a], [b]) -> Either [a] [b]
forall {a} {b}. ([a], b) -> Either [a] b
pick (([a], [b]) -> Either [a] [b])
-> ([Either a b] -> ([a], [b])) -> [Either a b] -> Either [a] [b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Either a b] -> ([a], [b])
forall a b. [Either a b] -> ([a], [b])
partitionEithers


getGlyph :: VectorFont -> Char -> Either Char VFGlyph
getGlyph :: VectorFont -> Char -> Either Char VFGlyph
getGlyph (VectorFont Map Char VFGlyph
m) Char
c =
  Either Char VFGlyph
-> (VFGlyph -> Either Char VFGlyph)
-> Maybe VFGlyph
-> Either Char VFGlyph
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Char -> Either Char VFGlyph
forall a b. a -> Either a b
Left Char
c) VFGlyph -> Either Char VFGlyph
forall a b. b -> Either a b
Right (Maybe VFGlyph -> Either Char VFGlyph)
-> Maybe VFGlyph -> Either Char VFGlyph
forall a b. (a -> b) -> a -> b
$ Char
c Char -> Map Char VFGlyph -> Maybe VFGlyph
forall k a. Ord k => k -> Map k a -> Maybe a
`Data.Map.lookup` Map Char VFGlyph
m


{-| Like @render@, but replaces unknown characters with a question mark.

It is guaranteed to render something, and thus
useful if you want to ignore the possibility of errors e.g.
because you're manually checking the output.
-}
renderSafe :: VectorFont -> String -> [VFStroke]
renderSafe :: VectorFont -> String -> [VFStroke]
renderSafe VectorFont
f =
  Double -> [VFGlyph] -> [VFStroke]
renderLine Double
0 ([VFGlyph] -> [VFStroke])
-> (String -> [VFGlyph]) -> String -> [VFStroke]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> VFGlyph) -> String -> [VFGlyph]
forall a b. (a -> b) -> [a] -> [b]
map (VectorFont -> Char -> VFGlyph
getGlyphSafe VectorFont
f)


getGlyphSafe :: VectorFont -> Char -> VFGlyph
getGlyphSafe :: VectorFont -> Char -> VFGlyph
getGlyphSafe (VectorFont Map Char VFGlyph
m) Char
c =
  VFGlyph -> Char -> Map Char VFGlyph -> VFGlyph
forall k a. Ord k => a -> k -> Map k a -> a
findWithDefault VFGlyph
fallbackGlyph Char
c Map Char VFGlyph
m


{-| This is the `?` from @canvastextFont@,
duplicated here to avoid constraining @canvastextFont@ to contain `?`
-}
fallbackGlyph :: VFGlyph
fallbackGlyph :: VFGlyph
fallbackGlyph =
  ( Double
18
  , [VFStroke] -> [VFStroke]
optimizeStrokes
      [
        [ (Double
3, Double
16)
        , (Double
3, Double
17)
        , (Double
4, Double
19)
        , (Double
5, Double
20)
        , (Double
7, Double
21)
        , (Double
11, Double
21)
        , (Double
13, Double
20)
        , (Double
14, Double
19)
        , (Double
15, Double
17)
        , (Double
15, Double
15)
        , (Double
14, Double
13)
        , (Double
13, Double
12)
        , (Double
9, Double
10)
        , (Double
9, Double
7)
        ]
      , [(Double
9, Double
2), (Double
8, Double
1), (Double
9, Double
0), (Double
10, Double
1), (Double
9, Double
2)]
      ]
  )


renderLine :: VFWidth -> [VFGlyph] -> [VFStroke]
renderLine :: Double -> [VFGlyph] -> [VFStroke]
renderLine Double
_ [] = []
renderLine Double
dx ((Double
w, [VFStroke]
ss) : [VFGlyph]
sss) = do
  let offset :: [[(Double, b)]] -> [[(Double, b)]]
offset = (([(Double, b)] -> [(Double, b)])
-> [[(Double, b)]] -> [[(Double, b)]]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (([(Double, b)] -> [(Double, b)])
 -> [[(Double, b)]] -> [[(Double, b)]])
-> (((Double, b) -> (Double, b)) -> [(Double, b)] -> [(Double, b)])
-> ((Double, b) -> (Double, b))
-> [[(Double, b)]]
-> [[(Double, b)]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Double, b) -> (Double, b)) -> [(Double, b)] -> [(Double, b)]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap) (\(Double
x, b
y) -> (Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
dx, b
y))
  [VFStroke] -> [VFStroke]
forall {b}. [[(Double, b)]] -> [[(Double, b)]]
offset [VFStroke]
ss [VFStroke] -> [VFStroke] -> [VFStroke]
forall a. [a] -> [a] -> [a]
++ Double -> [VFGlyph] -> [VFStroke]
renderLine (Double
dx Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
w) [VFGlyph]
sss


{-| Given a set of strokes, try to optimize their order and direction:
* Fewer strokes
* Smaller gaps between strokes
* Left-most starting position
* Bottom-most starting position

This improves the fonts where no thought has been given to this.
However, hand-tweaking is still better.
-}
optimizeStrokes :: [VFStroke] -> [VFStroke]
optimizeStrokes :: [VFStroke] -> [VFStroke]
optimizeStrokes = do
  let pickBest :: [[VFStroke]] -> [VFStroke]
pickBest = ([VFStroke] -> [VFStroke] -> Ordering)
-> [[VFStroke]] -> [VFStroke]
forall (t :: * -> *) a.
Foldable t =>
(a -> a -> Ordering) -> t a -> a
minimumBy (([VFStroke] -> (Int, Double, VFPoint))
-> [VFStroke] -> [VFStroke] -> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing [VFStroke] -> (Int, Double, VFPoint)
score)
  [[VFStroke]] -> [VFStroke]
pickBest ([[VFStroke]] -> [VFStroke])
-> ([VFStroke] -> [[VFStroke]]) -> [VFStroke] -> [VFStroke]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([VFStroke] -> [VFStroke]) -> [[VFStroke]] -> [[VFStroke]]
forall a b. (a -> b) -> [a] -> [b]
map [VFStroke] -> [VFStroke]
forall a. Eq a => [[a]] -> [[a]]
joinStrokes ([[VFStroke]] -> [[VFStroke]])
-> ([VFStroke] -> [[VFStroke]]) -> [VFStroke] -> [[VFStroke]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [VFStroke] -> [[VFStroke]]
forall a. [[a]] -> [[[a]]]
allArrangements ([VFStroke] -> [[VFStroke]])
-> ([VFStroke] -> [VFStroke]) -> [VFStroke] -> [[VFStroke]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (VFStroke -> Bool) -> [VFStroke] -> [VFStroke]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (VFStroke -> Bool) -> VFStroke -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VFStroke -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null)


allArrangements :: [[a]] -> [[[a]]]
allArrangements :: forall a. [[a]] -> [[[a]]]
allArrangements =
  ([[a]] -> [[[a]]]) -> [[[a]]] -> [[[a]]]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap [[a]] -> [[[a]]]
forall a. [[a]] -> [[[a]]]
allDirs ([[[a]]] -> [[[a]]]) -> ([[a]] -> [[[a]]]) -> [[a]] -> [[[a]]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[a]] -> [[[a]]]
forall a. [a] -> [[a]]
permutations


allDirs :: [[a]] -> [[[a]]]
allDirs :: forall a. [[a]] -> [[[a]]]
allDirs [[a]]
strokes = do
  let opss :: [[[a] -> [a]]]
opss = Int -> [[a] -> [a]] -> [[[a] -> [a]]]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM ([[a]] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [[a]]
strokes) [[a] -> [a]
forall a. a -> a
id, [a] -> [a]
forall a. [a] -> [a]
reverse]
  [(([a] -> [a]) -> [a] -> [a]) -> [[a] -> [a]] -> [[a]] -> [[a]]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
($) [[a] -> [a]]
ops [[a]]
strokes | [[a] -> [a]]
ops <- [[[a] -> [a]]]
forall {a}. [[[a] -> [a]]]
opss]


-- given an arrangement of strokes, return a score (lower better),
-- preferring (in order):
score :: [VFStroke] -> (Int, Double, VFPoint)
score :: [VFStroke] -> (Int, Double, VFPoint)
score [VFStroke]
ss | [VFStroke] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [VFStroke]
ss Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
2 = ([VFStroke] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [VFStroke]
ss, Double
0.0, (Double
0.0, Double
0.0))
score [VFStroke]
ss = do
  let
    skips :: [Double]
skips = (VFStroke -> VFStroke -> Double)
-> [VFStroke] -> [VFStroke] -> [Double]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\VFStroke
as VFStroke
bs -> VFPoint -> VFPoint -> Double
dist (VFStroke -> VFPoint
forall a. HasCallStack => [a] -> a
last VFStroke
as) (VFStroke -> VFPoint
forall a. HasCallStack => [a] -> a
head VFStroke
bs)) [VFStroke]
ss ([VFStroke] -> [VFStroke]
forall a. HasCallStack => [a] -> [a]
tail [VFStroke]
ss)
    firstPoint :: VFPoint
firstPoint = VFStroke -> VFPoint
forall a. HasCallStack => [a] -> a
head (VFStroke -> VFPoint) -> VFStroke -> VFPoint
forall a b. (a -> b) -> a -> b
$ [VFStroke] -> VFStroke
forall a. HasCallStack => [a] -> a
head [VFStroke]
ss
  ([VFStroke] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [VFStroke]
ss, [Double] -> Double
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [Double]
skips, VFPoint
firstPoint)


joinStrokes :: (Eq a) => [[a]] -> [[a]]
joinStrokes :: forall a. Eq a => [[a]] -> [[a]]
joinStrokes ([a]
s0 : [a]
s1 : [[a]]
ss)
  | [a] -> a
forall a. HasCallStack => [a] -> a
last [a]
s0 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== [a] -> a
forall a. HasCallStack => [a] -> a
head [a]
s1 = [[a]] -> [[a]]
forall a. Eq a => [[a]] -> [[a]]
joinStrokes ([[a]] -> [[a]]) -> [[a]] -> [[a]]
forall a b. (a -> b) -> a -> b
$ ([a]
s0 [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a] -> [a]
forall a. HasCallStack => [a] -> [a]
tail [a]
s1) [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [[a]]
ss
  | Bool
otherwise = [a]
s0 [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [[a]] -> [[a]]
forall a. Eq a => [[a]] -> [[a]]
joinStrokes ([a]
s1 [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [[a]]
ss)
joinStrokes [[a]]
ss = [[a]]
ss

{- FOURMOLU_DISABLE -}
-- | Based on Hershey font and includes following characters:
-- @!\"#$%&()*+,-.\/0123456789:;\<=>?\@ABCDEFGHIJKLMNOPQRSTUVWXYZ
-- []^_\`abcdefghijklmnopqrstuvwxyz{|}~@
canvastextFont :: VectorFont
canvastextFont :: VectorFont
canvastextFont = Map Char VFGlyph -> VectorFont
VectorFont (Map Char VFGlyph -> VectorFont) -> Map Char VFGlyph -> VectorFont
forall a b. (a -> b) -> a -> b
$ [(Char, VFGlyph)] -> Map Char VFGlyph
forall k a. Ord k => [(k, a)] -> Map k a
fromList
  [ (Char
' ',(Double
12,[]))
  , (Char
'!',(Double
6,[[(Double
5,Double
2),(Double
4,Double
1),(Double
5,Double
0),(Double
6,Double
1),(Double
5,Double
2)],[(Double
5,Double
7),(Double
5,Double
21)]]))
  , (Char
'"',(Double
6,[[(Double
4,Double
15),(Double
5,Double
16),(Double
6,Double
18),(Double
6,Double
20),(Double
5,Double
21),(Double
4,Double
20),(Double
5,Double
19)]]))
  , (Char
'#',(Double
17,[[(Double
10,-Double
7),(Double
17,Double
25)],[(Double
11,Double
25),(Double
4,-Double
7)]
      ,[(Double
3,Double
6),(Double
17,Double
6)],[(Double
18,Double
12),(Double
4,Double
12)]]))
  , (Char
'$',(Double
16,[[(Double
3,Double
3),(Double
5,Double
1),(Double
8,Double
0),(Double
12,Double
0),(Double
15,Double
1),(Double
17,Double
3),(Double
17,Double
6),(Double
16,Double
8),(Double
15,Double
9)
      ,(Double
13,Double
10),(Double
7,Double
12),(Double
5,Double
13),(Double
4,Double
14),(Double
3,Double
16),(Double
3,Double
18),(Double
5,Double
20),(Double
8,Double
21),(Double
12,Double
21)
      ,(Double
15,Double
20),(Double
17,Double
18)],[(Double
12,Double
25),(Double
12,-Double
4)],[(Double
8,-Double
4),(Double
8,Double
25)]]))
  , (Char
'%',(Double
20,[[(Double
8,Double
21),(Double
10,Double
19),(Double
10,Double
17),(Double
9,Double
15),(Double
7,Double
14),(Double
5,Double
14),(Double
3,Double
16),(Double
3,Double
18)
      ,(Double
4,Double
20),(Double
6,Double
21),(Double
8,Double
21),(Double
10,Double
20),(Double
13,Double
19),(Double
16,Double
19),(Double
19,Double
20),(Double
21,Double
21),(Double
3,Double
0)]
      ,[(Double
17,Double
7),(Double
15,Double
6),(Double
14,Double
4),(Double
14,Double
2),(Double
16,Double
0)
      ,(Double
18,Double
0),(Double
20,Double
1),(Double
21,Double
3),(Double
21,Double
5),(Double
19,Double
7),(Double
17,Double
7)]]))
  , (Char
'&',(Double
22,[[(Double
23,Double
2),(Double
23,Double
1),(Double
22,Double
0),(Double
20,Double
0),(Double
18,Double
1),(Double
16,Double
3),(Double
11,Double
10),(Double
9,Double
13)
      ,(Double
8,Double
16),(Double
8,Double
18),(Double
9,Double
20),(Double
11,Double
21),(Double
13,Double
20),(Double
14,Double
18),(Double
14,Double
16),(Double
13,Double
14),(Double
12,Double
13)
      ,(Double
5,Double
9),(Double
4,Double
8),(Double
3,Double
6),(Double
3,Double
4),(Double
4,Double
2),(Double
5,Double
1),(Double
7,Double
0),(Double
11,Double
0),(Double
13,Double
1),(Double
15,Double
3),(Double
17,Double
6)
      ,(Double
19,Double
11),(Double
20,Double
13),(Double
21,Double
14),(Double
22,Double
14),(Double
23,Double
13),(Double
23,Double
12)]]))
  , (Char
'(',(Double
10,[[(Double
11,-Double
7),(Double
9,-Double
5),(Double
7,-Double
2),(Double
5,Double
2)
      ,(Double
4,Double
7),(Double
4,Double
11),(Double
5,Double
16),(Double
7,Double
20),(Double
9,Double
23),(Double
11,Double
25)]]))
  , (Char
')',(Double
10,[[(Double
3,-Double
7),(Double
5,-Double
5),(Double
7,-Double
2),(Double
9,Double
2)
      ,(Double
10,Double
7),(Double
10,Double
11),(Double
9,Double
16),(Double
7,Double
20),(Double
5,Double
23),(Double
3,Double
25)]]))
  , (Char
'*',(Double
12,[[(Double
3,Double
12),(Double
13,Double
18)],[(Double
8,Double
21),(Double
8,Double
9)],[(Double
13,Double
12),(Double
3,Double
18)]]))
  , (Char
'+',(Double
22,[[(Double
4,Double
9),(Double
22,Double
9)],[(Double
13,Double
0),(Double
13,Double
18)]]))
  , (Char
',',(Double
6,[[(Double
4,-Double
4),(Double
5,-Double
3),(Double
6,-Double
1),(Double
6,Double
1),(Double
5,Double
2),(Double
4,Double
1),(Double
5,Double
0),(Double
6,Double
1)]]))
  , (Char
'-',(Double
22,[[(Double
4,Double
9),(Double
22,Double
9)]]))
  , (Char
'.',(Double
6,[[(Double
5,Double
2),(Double
4,Double
1),(Double
5,Double
0),(Double
6,Double
1),(Double
5,Double
2)]]))
  , (Char
'/',(Double
18,[[(Double
2,-Double
7),(Double
20,Double
25)]]))
  , (Char
'0',(Double
16,[[(Double
9,Double
21),(Double
6,Double
20),(Double
4,Double
17),(Double
3,Double
12),(Double
3,Double
9),(Double
4,Double
4),(Double
6,Double
1),(Double
9,Double
0),(Double
11,Double
0)
      ,(Double
14,Double
1),(Double
16,Double
4),(Double
17,Double
9),(Double
17,Double
12),(Double
16,Double
17),(Double
14,Double
20),(Double
11,Double
21),(Double
9,Double
21)]]))
  , (Char
'1',(Double
16,[[(Double
6,Double
17),(Double
8,Double
18),(Double
11,Double
21),(Double
11,Double
0)]]))
  , (Char
'2',(Double
16,[[(Double
4,Double
16),(Double
4,Double
17),(Double
5,Double
19),(Double
6,Double
20),(Double
8,Double
21),(Double
12,Double
21),(Double
14,Double
20),(Double
15,Double
19)
      ,(Double
16,Double
17),(Double
16,Double
15),(Double
15,Double
13),(Double
13,Double
10),(Double
3,Double
0),(Double
17,Double
0)]]))
  , (Char
'3',(Double
16,[[(Double
3,Double
4),(Double
4,Double
2),(Double
5,Double
1),(Double
8,Double
0),(Double
11,Double
0),(Double
14,Double
1),(Double
16,Double
3),(Double
17,Double
6),(Double
17,Double
8)
      ,(Double
16,Double
11),(Double
15,Double
12),(Double
13,Double
13),(Double
10,Double
13),(Double
16,Double
21),(Double
5,Double
21)]]))
  , (Char
'4',(Double
16,[[(Double
13,Double
0),(Double
13,Double
21),(Double
3,Double
7),(Double
18,Double
7)]]))
  , (Char
'5',(Double
16,[[(Double
3,Double
4),(Double
4,Double
2),(Double
5,Double
1),(Double
8,Double
0),(Double
11,Double
0),(Double
14,Double
1),(Double
16,Double
3),(Double
17,Double
6),(Double
17,Double
8)
      ,(Double
16,Double
11),(Double
14,Double
13),(Double
11,Double
14),(Double
8,Double
14),(Double
5,Double
13),(Double
4,Double
12),(Double
5,Double
21),(Double
15,Double
21)]]))
  , (Char
'6',(Double
16,[[(Double
4,Double
7),(Double
5,Double
10),(Double
7,Double
12),(Double
10,Double
13),(Double
11,Double
13),(Double
14,Double
12),(Double
16,Double
10),(Double
17,Double
7)
      ,(Double
17,Double
6),(Double
16,Double
3),(Double
14,Double
1),(Double
11,Double
0),(Double
10,Double
0),(Double
7,Double
1),(Double
5,Double
3)
      ,(Double
4,Double
7),(Double
4,Double
12),(Double
5,Double
17),(Double
7,Double
20),(Double
10,Double
21),(Double
12,Double
21),(Double
15,Double
20),(Double
16,Double
18)]]))
  , (Char
'7',(Double
16,[[(Double
3,Double
21),(Double
17,Double
21),(Double
7,Double
0)]]))
  , (Char
'8',(Double
16,[[(Double
8,Double
21),(Double
5,Double
20),(Double
4,Double
18),(Double
4,Double
16),(Double
5,Double
14),(Double
7,Double
13),(Double
11,Double
12),(Double
14,Double
11),(Double
16,Double
9)
      ,(Double
17,Double
7),(Double
17,Double
4),(Double
16,Double
2),(Double
15,Double
1),(Double
12,Double
0),(Double
8,Double
0),(Double
5,Double
1),(Double
4,Double
2),(Double
3,Double
4),(Double
3,Double
7),(Double
4,Double
9)
      ,(Double
6,Double
11),(Double
9,Double
12),(Double
13,Double
13),(Double
15,Double
14),(Double
16,Double
16),(Double
16,Double
18),(Double
15,Double
20),(Double
12,Double
21),(Double
8,Double
21)]]))
  , (Char
'9',(Double
16,[[(Double
4,Double
3),(Double
5,Double
1),(Double
8,Double
0),(Double
10,Double
0),(Double
13,Double
1),(Double
15,Double
4),(Double
16,Double
9),(Double
16,Double
14),(Double
15,Double
18)
      ,(Double
13,Double
20),(Double
10,Double
21),(Double
9,Double
21),(Double
6,Double
20),(Double
4,Double
18),(Double
3,Double
15),(Double
3,Double
14),(Double
4,Double
11),(Double
6,Double
9),(Double
9,Double
8)
      ,(Double
10,Double
8),(Double
13,Double
9),(Double
15,Double
11),(Double
16,Double
14)]]))
  , (Char
':',(Double
6,[[(Double
5,Double
2),(Double
4,Double
1),(Double
5,Double
0),(Double
6,Double
1),(Double
5,Double
2)]
      ,[(Double
5,Double
14),(Double
4,Double
13),(Double
5,Double
12),(Double
6,Double
13),(Double
5,Double
14)]]))
  , (Char
';',(Double
6,[[(Double
4,-Double
4),(Double
5,-Double
3),(Double
6,-Double
1),(Double
6,Double
1),(Double
5,Double
2),(Double
4,Double
1),(Double
5,Double
0),(Double
6,Double
1)]
      ,[(Double
5,Double
14),(Double
4,Double
13),(Double
5,Double
12),(Double
6,Double
13),(Double
5,Double
14)]]))
  , (Char
'<',(Double
20,[[(Double
20,Double
0),(Double
4,Double
9),(Double
20,Double
18)]]))
  , (Char
'=',(Double
22,[[(Double
4,Double
6),(Double
22,Double
6)],[(Double
22,Double
12),(Double
4,Double
12)]]))
  , (Char
'>',(Double
20,[[(Double
4,Double
0),(Double
20,Double
9),(Double
4,Double
18)]]))
  , (Char
'?',(Double
14,[[(Double
3,Double
16),(Double
3,Double
17),(Double
4,Double
19),(Double
5,Double
20),(Double
7,Double
21),(Double
11,Double
21),(Double
13,Double
20),(Double
14,Double
19)
      ,(Double
15,Double
17),(Double
15,Double
15),(Double
14,Double
13),(Double
13,Double
12),(Double
9,Double
10),(Double
9,Double
7)]
      ,[(Double
9,Double
2),(Double
8,Double
1),(Double
9,Double
0),(Double
10,Double
1),(Double
9,Double
2)]]))
  , (Char
'@',(Double
23,[[(Double
11,Double
5),(Double
10,Double
6),(Double
9,Double
8),(Double
9,Double
11),(Double
10,Double
14),(Double
12,Double
16)],[(Double
18,Double
13),(Double
17,Double
15)
      ,(Double
15,Double
16),(Double
12,Double
16),(Double
10,Double
15),(Double
9,Double
14),(Double
8,Double
11),(Double
8,Double
8),(Double
9,Double
6),(Double
11,Double
5),(Double
14,Double
5),(Double
16,Double
6)
      ,(Double
17,Double
8)],[(Double
19,Double
5),(Double
18,Double
6),(Double
18,Double
8),(Double
19,Double
16)],[(Double
18,Double
16),(Double
17,Double
8),(Double
17,Double
6),(Double
19,Double
5)
      ,(Double
21,Double
5),(Double
23,Double
7),(Double
24,Double
10),(Double
24,Double
12),(Double
23,Double
15),(Double
22,Double
17),(Double
20,Double
19),(Double
18,Double
20),(Double
15,Double
21)
      ,(Double
12,Double
21),(Double
9,Double
20),(Double
7,Double
19),(Double
5,Double
17),(Double
4,Double
15),(Double
3,Double
12),(Double
3,Double
9),(Double
4,Double
6),(Double
5,Double
4),(Double
7,Double
2)
      ,(Double
9,Double
1),(Double
12,Double
0),(Double
15,Double
0),(Double
18,Double
1),(Double
20,Double
2),(Double
21,Double
3)]]))
  , (Char
'A',(Double
14,[[(Double
1,Double
0),(Double
9,Double
21),(Double
17,Double
0)],[(Double
14,Double
7),(Double
4,Double
7)]]))
  , (Char
'B',(Double
17,[[(Double
4,Double
11),(Double
13,Double
11),(Double
16,Double
10),(Double
17,Double
9),(Double
18,Double
7),(Double
18,Double
4),(Double
17,Double
2),(Double
16,Double
1)
      ,(Double
13,Double
0),(Double
4,Double
0),(Double
4,Double
21),(Double
13,Double
21),(Double
16,Double
20),(Double
17,Double
19)
      ,(Double
18,Double
17),(Double
18,Double
15),(Double
17,Double
13),(Double
16,Double
12),(Double
13,Double
11)]]))
  , (Char
'C',(Double
17,[[(Double
18,Double
5),(Double
17,Double
3),(Double
15,Double
1),(Double
13,Double
0),(Double
9,Double
0),(Double
7,Double
1),(Double
5,Double
3),(Double
4,Double
5),(Double
3,Double
8),(Double
3,Double
13)
      ,(Double
4,Double
16),(Double
5,Double
18),(Double
7,Double
20),(Double
9,Double
21),(Double
13,Double
21),(Double
15,Double
20),(Double
17,Double
18),(Double
18,Double
16)]]))
  , (Char
'D',(Double
17,[[(Double
4,Double
0),(Double
4,Double
21),(Double
11,Double
21),(Double
14,Double
20),(Double
16,Double
18),(Double
17,Double
16),(Double
18,Double
13),(Double
18,Double
8)
      ,(Double
17,Double
5),(Double
16,Double
3),(Double
14,Double
1),(Double
11,Double
0),(Double
4,Double
0)]]))
  , (Char
'E',(Double
15,[[(Double
4,Double
11),(Double
12,Double
11)],[(Double
17,Double
21),(Double
4,Double
21),(Double
4,Double
0),(Double
17,Double
0)]]))
  , (Char
'F',(Double
14,[[(Double
12,Double
11),(Double
4,Double
11)],[(Double
4,Double
0),(Double
4,Double
21),(Double
17,Double
21)]]))
  , (Char
'G',(Double
17,[[(Double
13,Double
8),(Double
18,Double
8),(Double
18,Double
5),(Double
17,Double
3),(Double
15,Double
1),(Double
13,Double
0),(Double
9,Double
0),(Double
7,Double
1),(Double
5,Double
3)
      ,(Double
4,Double
5),(Double
3,Double
8),(Double
3,Double
13),(Double
4,Double
16),(Double
5,Double
18),(Double
7,Double
20)
      ,(Double
9,Double
21),(Double
13,Double
21),(Double
15,Double
20),(Double
17,Double
18),(Double
18,Double
16)]]))
  , (Char
'H',(Double
16,[[(Double
4,Double
0),(Double
4,Double
21)],[(Double
4,Double
11),(Double
16,Double
11)],[(Double
16,Double
21),(Double
16,Double
0)]]))
  , (Char
'I',(Double
6,[[(Double
4,Double
0),(Double
4,Double
21)]]))
  , (Char
'J',(Double
12,[[(Double
2,Double
7),(Double
2,Double
5),(Double
3,Double
2),(Double
4,Double
1)
      ,(Double
6,Double
0),(Double
8,Double
0),(Double
10,Double
1),(Double
11,Double
2),(Double
12,Double
5),(Double
12,Double
21)]]))
  , (Char
'K',(Double
17,[[(Double
18,Double
0),(Double
9,Double
12)],[(Double
4,Double
21),(Double
4,Double
0)],[(Double
4,Double
7),(Double
18,Double
21)]]))
  , (Char
'L',(Double
13,[[(Double
4,Double
21),(Double
4,Double
0),(Double
16,Double
0)]]))
  , (Char
'M',(Double
20,[[(Double
4,Double
0),(Double
4,Double
21),(Double
12,Double
0),(Double
20,Double
21),(Double
20,Double
0)]]))
  , (Char
'N',(Double
18,[[(Double
4,Double
0),(Double
4,Double
21),(Double
18,Double
0),(Double
18,Double
21)]]))
  , (Char
'O',(Double
18,[[(Double
9,Double
21),(Double
7,Double
20),(Double
5,Double
18),(Double
4,Double
16),(Double
3,Double
13),(Double
3,Double
8),(Double
4,Double
5),(Double
5,Double
3),(Double
7,Double
1),(Double
9,Double
0)
      ,(Double
13,Double
0),(Double
15,Double
1),(Double
17,Double
3),(Double
18,Double
5),(Double
19,Double
8)
      ,(Double
19,Double
13),(Double
18,Double
16),(Double
17,Double
18),(Double
15,Double
20),(Double
13,Double
21),(Double
9,Double
21)]]))
  , (Char
'P',(Double
17,[[(Double
4,Double
0),(Double
4,Double
21),(Double
13,Double
21),(Double
16,Double
20),(Double
17,Double
19)
      ,(Double
18,Double
17),(Double
18,Double
14),(Double
17,Double
12),(Double
16,Double
11),(Double
13,Double
10),(Double
4,Double
10)]]))
  , (Char
'Q',(Double
18,[[(Double
9,Double
21),(Double
7,Double
20),(Double
5,Double
18),(Double
4,Double
16),(Double
3,Double
13),(Double
3,Double
8),(Double
4,Double
5),(Double
5,Double
3),(Double
7,Double
1),(Double
9,Double
0)
      ,(Double
13,Double
0),(Double
15,Double
1),(Double
17,Double
3),(Double
18,Double
5),(Double
19,Double
8),(Double
19,Double
13),(Double
18,Double
16)
      ,(Double
17,Double
18),(Double
15,Double
20),(Double
13,Double
21),(Double
9,Double
21)],[(Double
12,Double
4),(Double
18,-Double
2)]]))
  , (Char
'R',(Double
17,[[(Double
4,Double
0),(Double
4,Double
21),(Double
13,Double
21),(Double
16,Double
20),(Double
17,Double
19),(Double
18,Double
17),(Double
18,Double
15),(Double
17,Double
13)
      ,(Double
16,Double
12),(Double
13,Double
11),(Double
4,Double
11)],[(Double
11,Double
11),(Double
18,Double
0)]]))
  , (Char
'S',(Double
16,[[(Double
3,Double
3),(Double
5,Double
1),(Double
8,Double
0),(Double
12,Double
0),(Double
15,Double
1),(Double
17,Double
3),(Double
17,Double
6),(Double
16,Double
8),(Double
15,Double
9)
      ,(Double
13,Double
10),(Double
7,Double
12),(Double
5,Double
13),(Double
4,Double
14),(Double
3,Double
16),(Double
3,Double
18)
      ,(Double
5,Double
20),(Double
8,Double
21),(Double
12,Double
21),(Double
15,Double
20),(Double
17,Double
18)]]))
  , (Char
'T',(Double
12,[[(Double
1,Double
21),(Double
15,Double
21)],[(Double
8,Double
21),(Double
8,Double
0)]]))
  , (Char
'U',(Double
18,[[(Double
4,Double
21),(Double
4,Double
6),(Double
5,Double
3),(Double
7,Double
1)
      ,(Double
10,Double
0),(Double
12,Double
0),(Double
15,Double
1),(Double
17,Double
3),(Double
18,Double
6),(Double
18,Double
21)]]))
  , (Char
'V',(Double
14,[[(Double
1,Double
21),(Double
9,Double
0),(Double
17,Double
21)]]))
  , (Char
'W',(Double
20,[[(Double
2,Double
21),(Double
7,Double
0),(Double
12,Double
15),(Double
17,Double
0),(Double
22,Double
21)]]))
  , (Char
'X',(Double
16,[[(Double
3,Double
0),(Double
17,Double
21)],[(Double
3,Double
21),(Double
17,Double
0)]]))
  , (Char
'Y',(Double
14,[[(Double
1,Double
21),(Double
9,Double
11),(Double
9,Double
0)],[(Double
9,Double
11),(Double
17,Double
21)]]))
  , (Char
'Z',(Double
16,[[(Double
3,Double
21),(Double
17,Double
21),(Double
3,Double
0),(Double
17,Double
0)]]))
  , (Char
'[',(Double
10,[[(Double
5,-Double
7),(Double
5,Double
25)],[(Double
11,Double
25),(Double
4,Double
25),(Double
4,-Double
7),(Double
11,-Double
7)]]))
  , (Char
']',(Double
10,[[(Double
3,-Double
7),(Double
10,-Double
7),(Double
10,Double
25),(Double
3,Double
25)],[(Double
9,Double
25),(Double
9,-Double
7)]]))
  , (Char
'^',(Double
12,[[(Double
2,Double
12),(Double
8,Double
18),(Double
14,Double
12)],[(Double
11,Double
15),(Double
8,Double
19),(Double
5,Double
15)]]))
  , (Char
'_',(Double
12,[[(Double
0,-Double
2),(Double
16,-Double
2)]]))
  , (Char
'`',(Double
6,[[(Double
5,Double
17),(Double
6,Double
16),(Double
5,Double
15),(Double
4,Double
16),(Double
4,Double
18),(Double
5,Double
20),(Double
6,Double
21)]]))
  , (Char
'a',(Double
15,[[(Double
15,Double
0),(Double
15,Double
14)],[(Double
15,Double
11),(Double
13,Double
13),(Double
11,Double
14),(Double
8,Double
14),(Double
6,Double
13),(Double
4,Double
11)
      ,(Double
3,Double
8),(Double
3,Double
6),(Double
4,Double
3),(Double
6,Double
1),(Double
8,Double
0),(Double
11,Double
0),(Double
13,Double
1),(Double
15,Double
3)]]))
  , (Char
'b',(Double
15,[[(Double
4,Double
11),(Double
6,Double
13),(Double
8,Double
14),(Double
11,Double
14),(Double
13,Double
13),(Double
15,Double
11),(Double
16,Double
8),(Double
16,Double
6),(Double
15,Double
3)
      ,(Double
13,Double
1),(Double
11,Double
0),(Double
8,Double
0),(Double
6,Double
1),(Double
4,Double
3)],[(Double
4,Double
0),(Double
4,Double
21)]]))
  , (Char
'c',(Double
14,[[(Double
15,Double
3),(Double
13,Double
1),(Double
11,Double
0),(Double
8,Double
0),(Double
6,Double
1),(Double
4,Double
3),(Double
3,Double
6),(Double
3,Double
8),(Double
4,Double
11),(Double
6,Double
13)
      ,(Double
8,Double
14),(Double
11,Double
14),(Double
13,Double
13),(Double
15,Double
11)]]))
  , (Char
'd',(Double
14,[[(Double
12,Double
11),(Double
10,Double
13),(Double
8,Double
14),(Double
6,Double
14),(Double
4,Double
13),(Double
2,Double
11),(Double
1,Double
8),(Double
1,Double
6),(Double
2,Double
3)
      ,(Double
4,Double
1),(Double
6,Double
0),(Double
8,Double
0),(Double
10,Double
1),(Double
12,Double
3)],[(Double
12,Double
0),(Double
12,Double
21)]]))
  , (Char
'e',(Double
14,[[(Double
3,Double
8),(Double
14,Double
8),(Double
14,Double
10),(Double
13,Double
12),(Double
12,Double
13),(Double
10,Double
14),(Double
8,Double
14),(Double
6,Double
13),(Double
4,Double
11)
      ,(Double
3,Double
8),(Double
3,Double
6),(Double
4,Double
3),(Double
6,Double
1),(Double
8,Double
0),(Double
10,Double
0),(Double
12,Double
1),(Double
14,Double
3)]]))
  , (Char
'f',(Double
8,[[(Double
2,Double
14),(Double
9,Double
14)],[(Double
10,Double
21),(Double
8,Double
21),(Double
6,Double
20),(Double
5,Double
17),(Double
5,Double
0)]]))
  , (Char
'g',(Double
15,[[(Double
6,-Double
6),(Double
8,-Double
7),(Double
11,-Double
7),(Double
13,-Double
6),(Double
14,-Double
5),(Double
15,-Double
2),(Double
15,Double
14)],[(Double
15,Double
11)
      ,(Double
13,Double
13),(Double
11,Double
14),(Double
8,Double
14),(Double
6,Double
13),(Double
4,Double
11),(Double
3,Double
8)
      ,(Double
3,Double
6),(Double
4,Double
3),(Double
6,Double
1),(Double
8,Double
0),(Double
11,Double
0),(Double
13,Double
1),(Double
15,Double
3)]]))
  , (Char
'h',(Double
15,[[(Double
4,Double
21),(Double
4,Double
0)],[(Double
4,Double
10),(Double
7,Double
13)
      ,(Double
9,Double
14),(Double
12,Double
14),(Double
14,Double
13),(Double
15,Double
10),(Double
15,Double
0)]]))
  , (Char
'i',(Double
6,[[(Double
3,Double
21),(Double
4,Double
20),(Double
5,Double
21),(Double
4,Double
22),(Double
3,Double
21)],[(Double
4,Double
14),(Double
4,Double
0)]]))
  , (Char
'j',(Double
6,[[(Double
1,-Double
7),(Double
3,-Double
7),(Double
5,-Double
6),(Double
6,-Double
3),(Double
6,Double
14)]
      ,[(Double
5,Double
21),(Double
6,Double
20),(Double
7,Double
21),(Double
6,Double
22),(Double
5,Double
21)]]))
  , (Char
'k',(Double
13,[[(Double
4,Double
21),(Double
4,Double
0)],[(Double
4,Double
4),(Double
14,Double
14)],[(Double
8,Double
8),(Double
15,Double
0)]]))
  , (Char
'l',(Double
6,[[(Double
3,Double
0),(Double
3,Double
21)]]))
  , (Char
'm',(Double
26,[[(Double
4,Double
0),(Double
4,Double
14)]
      ,[(Double
4,Double
10),(Double
7,Double
13),(Double
9,Double
14),(Double
12,Double
14),(Double
14,Double
13),(Double
15,Double
10),(Double
15,Double
0)]
      ,[(Double
15,Double
10),(Double
18,Double
13),(Double
20,Double
14),(Double
23,Double
14),(Double
25,Double
13),(Double
26,Double
10),(Double
26,Double
0)]]))
  , (Char
'n',(Double
15,[[(Double
4,Double
0),(Double
4,Double
14)]
      ,[(Double
4,Double
10),(Double
7,Double
13),(Double
9,Double
14),(Double
12,Double
14),(Double
14,Double
13),(Double
15,Double
10),(Double
15,Double
0)]]))
  , (Char
'o',(Double
14,[[(Double
11,Double
3),(Double
10,Double
1),(Double
8,Double
0),(Double
6,Double
0),(Double
4,Double
1),(Double
3,Double
3),(Double
2,Double
5),(Double
2,Double
7),(Double
2,Double
9),(Double
3,Double
11)
      ,(Double
4,Double
13),(Double
6,Double
14),(Double
8,Double
14),(Double
10,Double
13),(Double
11,Double
11),(Double
12,Double
9),(Double
12,Double
7),(Double
12,Double
5),(Double
11,Double
3)]]))
  , (Char
'p',(Double
15,[[(Double
4,-Double
7),(Double
4,Double
14)],[(Double
4,Double
11),(Double
6,Double
13),(Double
8,Double
14),(Double
11,Double
14),(Double
13,Double
13),(Double
15,Double
11)
      ,(Double
16,Double
8),(Double
16,Double
6),(Double
15,Double
3),(Double
13,Double
1),(Double
11,Double
0),(Double
8,Double
0),(Double
6,Double
1),(Double
4,Double
3)]]))
  , (Char
'q',(Double
15,[[(Double
15,-Double
7),(Double
15,Double
14)],[(Double
15,Double
11),(Double
13,Double
13),(Double
11,Double
14),(Double
8,Double
14),(Double
6,Double
13),(Double
4,Double
11)
      ,(Double
3,Double
8),(Double
3,Double
6),(Double
4,Double
3),(Double
6,Double
1),(Double
8,Double
0),(Double
11,Double
0),(Double
13,Double
1),(Double
15,Double
3)]]))
  , (Char
'r',(Double
9,[[(Double
3,Double
0),(Double
3,Double
14)],[(Double
3,Double
8),(Double
4,Double
11),(Double
6,Double
13),(Double
8,Double
14),(Double
10,Double
14)]]))
  , (Char
's',(Double
13,[[(Double
3,Double
3),(Double
4,Double
1),(Double
7,Double
0),(Double
10,Double
0),(Double
13,Double
1),(Double
14,Double
3),(Double
14,Double
4),(Double
13,Double
6),(Double
11,Double
7),(Double
6,Double
8)
      ,(Double
4,Double
9),(Double
3,Double
11),(Double
4,Double
13),(Double
7,Double
14),(Double
10,Double
14),(Double
13,Double
13),(Double
14,Double
11)]]))
  , (Char
't',(Double
8,[[(Double
9,Double
14),(Double
2,Double
14)],[(Double
5,Double
21),(Double
5,Double
4),(Double
6,Double
1),(Double
8,Double
0),(Double
10,Double
0)]]))
  , (Char
'u',(Double
15,[[(Double
4,Double
14),(Double
4,Double
4),(Double
5,Double
1),(Double
7,Double
0),(Double
10,Double
0),(Double
12,Double
1),(Double
15,Double
4)]
      ,[(Double
15,Double
0),(Double
15,Double
14)]]))
  , (Char
'v',(Double
12,[[(Double
2,Double
14),(Double
8,Double
0),(Double
14,Double
14)]]))
  , (Char
'w',(Double
18,[[(Double
3,Double
14),(Double
7,Double
0),(Double
11,Double
14),(Double
15,Double
0),(Double
19,Double
14)]]))
  , (Char
'x',(Double
13,[[(Double
3,Double
0),(Double
14,Double
14)],[(Double
3,Double
14),(Double
14,Double
0)]]))
  , (Char
'y',(Double
12,[[(Double
2,Double
14),(Double
8,Double
0)],[(Double
1,-Double
7),(Double
2,-Double
7),(Double
4,-Double
6),(Double
6,-Double
4),(Double
8,Double
0),(Double
14,Double
14)]]))
  , (Char
'z',(Double
13,[[(Double
3,Double
14),(Double
14,Double
14),(Double
3,Double
0),(Double
14,Double
0)]]))
  , (Char
'{',(Double
10,[[(Double
7,-Double
6),(Double
6,-Double
4),(Double
6,-Double
2),(Double
7,Double
0),(Double
8,Double
1),(Double
9,Double
3),(Double
9,Double
5),(Double
8,Double
7),(Double
4,Double
9),(Double
8,Double
11)
      ,(Double
9,Double
13),(Double
9,Double
15),(Double
8,Double
17),(Double
7,Double
18),(Double
6,Double
20),(Double
6,Double
22),(Double
7,Double
24)],[(Double
9,Double
25),(Double
7,Double
24),(Double
6,Double
23)
      ,(Double
5,Double
21),(Double
5,Double
19),(Double
6,Double
17),(Double
7,Double
16),(Double
8,Double
14),(Double
8,Double
12),(Double
6,Double
10)],[(Double
6,Double
8),(Double
8,Double
6),(Double
8,Double
4)
      ,(Double
7,Double
2),(Double
6,Double
1),(Double
5,-Double
1),(Double
5,-Double
3),(Double
6,-Double
5),(Double
7,-Double
6),(Double
9,-Double
7)]]))
  , (Char
'|',(Double
6,[[(Double
4,-Double
7),(Double
4,Double
25)]]))
  , (Char
'}',(Double
10,[[(Double
5,-Double
7),(Double
7,-Double
6),(Double
8,-Double
5),(Double
9,-Double
3),(Double
9,-Double
1),(Double
8,Double
1),(Double
7,Double
2),(Double
6,Double
4),(Double
6,Double
6),(Double
8,Double
8)]
      ,[(Double
8,Double
10),(Double
6,Double
12),(Double
6,Double
14),(Double
7,Double
16),(Double
8,Double
17),(Double
9,Double
19),(Double
9,Double
21),(Double
8,Double
23),(Double
7,Double
24),(Double
5,Double
25)]
      ,[(Double
7,Double
24),(Double
8,Double
22),(Double
8,Double
20),(Double
7,Double
18),(Double
6,Double
17),(Double
5,Double
15),(Double
5,Double
13),(Double
6,Double
11),(Double
10,Double
9),(Double
6,Double
7)
      ,(Double
5,Double
5),(Double
5,Double
3),(Double
6,Double
1),(Double
7,Double
0),(Double
8,-Double
2),(Double
8,-Double
4),(Double
7,-Double
6)]]))
  , (Char
'~',(Double
20
      ,[[(Double
3,Double
6),(Double
3,Double
8),(Double
4,Double
11),(Double
6,Double
12),(Double
8,Double
12),(Double
10,Double
11)
      ,(Double
14,Double
8),(Double
16,Double
7),(Double
18,Double
7),(Double
20,Double
8),(Double
21,Double
10)]
      ,[(Double
21,Double
12),(Double
21,Double
10),(Double
20,Double
7),(Double
18,Double
6),(Double
16,Double
6),(Double
14,Double
7)
      ,(Double
10,Double
10),(Double
8,Double
11),(Double
6,Double
11),(Double
4,Double
10),(Double
3,Double
8)]]))
  ]
{- FOURMOLU_ENABLE -}